Re[13]: Metaprogramming et al
От: vdimas Россия  
Дата: 05.08.05 13:18
Оценка: 9 (1)
Здравствуйте, mogadanez, Вы писали:

VD>>Понимаеш ли. Твои слова про сложность С++ — это не правда. Как язык C# значительно сложнее. Он обладает куда большим объемом кострукций не говоря уже о их применении.


VD>>Сам С++ относительно простой язык. Сложно же в нем обходить грабли. Вот тут действительно нужно выроботать привычку использовать только безопасные паттерны. Ну, и сложно следить за теми самыми мелочами. Однако сложность использования и сложность продукта не коррелирую между собой. К примеру, телевизор очень не простой продукт, то использовать его может трех-летний ребенок.



M>мне кажется — количество конструкций языка не говорит о его сложности.


синтаксически-одинаковые конструкции могут быть семантически разными. Поэтому я бы подсчитывал число семантических конструкций. По этому показателю С++ сложнее того же C#. (взять хотя бы разнообразные способы объявления переменных и создания экземпляров как на стеке, так и в хипе, т.е. на каждую конструкцию в C# мы получаем минимум 2-3 конструкции в С++. Учитывая forward-declarations и макросы — и того больше.

Конструкции типа lock и using в С++ не нужны принципиально, из-за механизма детерминированного разрушения стековых объектов.

Скажем, консрукцию lock() можно выразить так:

struct Sync {
    void Lock();
    void Release();
};

struct Locker {
    Locker(Sync& obj_) : obj(obj_) { obj.Lock(); }
    ~Locker() { obj.Release(); }
    Sync& obj;
};

#define LOCK(x)\
Locker locker_##__FILE__##__LINE__(x);


пользовать так:
{
    LOCK(s);
    std::out << s.SayHelloWorld();
}


Эти конструкции были введены в C# для обеспечения детерменированности наиболее встречающихся сценариев.

Конструкция fixed — вообще относится к тонкостям работы с GC.
unsafe — объявляет класс/метод/блок кода, где возможна адресная арифметика, очень похожая на С++-ную.

Что действительно понравилось в C# — это возможность явного управления иерархиями виртуальных ф-ий. С++ в этом плане немного жестче и не столь очевиден.


M>Сложность языка — это наскольно сложно на нем писать КАЧЕСТВЕННЫЙ КОД.


И тут я бы уточнил. Сложность С++ заключается в большом количестве материала, который остается за кулисами. Например правила приведения типов, адресной арифметики, выведения аргументов шаблонов, видимость namespace там же и т.д.

Т.е. я бы оценил сложность языка еще в объеме материала, которым нужно владеть для адекватного кодирования на нем.
Но и тут следует уточнять. Мне, например, потребовалось переварить совсем немного материала, чтобы изучить ВСЕ конструкции языка C#, включая синтаксис применения аттрибутов (assembly:, return: ). Однако, относительно C#, чтобы писать на нем, нужно скорее знать не столько язык, сколько особенности и важнейшие типы (и аттрибуты) самой платформы. А их много.
Соответственно, специалистом в C# невозможно быть не будучи специалистом по самой .Net.

И кстати, гуру C# — это именно гуру .Net со всеми прибабахами, начиная от философии решения типовых задач (и не только типовых), заканчивая безопасностью, рефлекшеном и т.д. и т.п..
Re[10]: Metaprogramming et al
От: vdimas Россия  
Дата: 05.08.05 13:21
Оценка: :)
Здравствуйте, VladD2, Вы писали:

ГВ>>И что это доказывает? Привлекательность "направления .NET/C#" для... для кого? Или попросту то, что те, для кого привлекателен C# чаще заглядывают в "голосования"?


VD>Это пказывает, что даже С++-программисты (которые как раз значительно чаще заглядывают в голосования, как показывает практика) и сами осознают большую перспективность дотнета нежели нэйтив-С++-а. Ну, или то что относительная популярность дотнета ростет.


Или то, что ссылка на голосование лежала не в том форуме. Сейчас там 50/50 результат
Re[10]: Metaprogramming et al
От: vdimas Россия  
Дата: 05.08.05 13:25
Оценка: 2 (2) +3
Здравствуйте, VladD2, Вы писали:

VD>foreach — это синтаксический сахар позволяющий быть менее многословным для выражения паттерна перебора. Абстракцией он не является. Абстракцией является интерфейс IEnumerable и IEnumerable<T>. Они кстати, я взык не вмонтированы.


Кстати — это вообще прикольный аспект. Класс Exception тоже в язык не вмонтирован, но мы можем выбросить только его наследника. foreach — вмонтированная конструкция, однако, занимается перебором невмонтированного IEnumerable.
Re: Metaprogramming et al: Ruby?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 10.08.05 07:45
Оценка: 2 (2)
Добрый, день.

В этой ветке много говорилось о достоинствах Lisp-а как языка для метапрограммирования. А недавно набрел на ссылоку, где разсказывается про возможности метапрограммирования на Ruby.

Metaprogramming Ruby, Domain-Specific Languages for Programmers

Особенно понравилось вот это:

Lisp
• Metaprogramming seems to have originated in Lisp.
Lisp is a programmable programming language.
—John Foderaro

In Lisp, you don’t just write your program down toward the language, you also build the language up toward your program.
—Paul Graham

• Lisp isn’t the only programmable language.

Ruby
• Rubyists have been rediscovering metaprogramming.
• Ruby style and idioms are still changing and adapting.
• Rails leverages metaprogramming heavily.
• To great effect!
• Ruby is a natural for metaprogramming.

и, чуть дальше

How To Think About Metaprogramming
• Defining new constructs for your programming language.
• OK, but … constructs to do what?
• Whatever your domain-specific language (DSL) needs to do.

Another Way To Think About Metaprogramming
• A new set of conceptual tools for eliminating duplication (and other smells) from your code.

... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[20]: Metaprogramming et al
От: vdimas Россия  
Дата: 10.08.05 16:46
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Павел Кузнецов, Вы писали:


ПК>>Интересно, как можно не вызвать деструктор базового класса?..


VD>Ты только деструкторы вызывашь? Или виртуальные методы не приходилось перегружать?


Похоже, надо возвращаться к началу.

Деструктор базового класса за меня вызовет компилятор. Т.е. освобождение ресурсов гарантирует мне компилятор. Ведь паттерн вроде для этого?
Re[21]: Metaprogramming et al
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 15.08.05 10:31
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

>> как выглядит максимально изящное библиотечное решение?


ПК>Ну, "максимально изящное" -- не знаю, тут долго можно спорить, т.к. понятия об изящном у всех свои... Но достаточно близкий по количеству писанины к встроенному в язык:

ПК> ...
ПК>Mожет быть, например, таким:

Павел, ты не мог бы подсказать ссылку на цитируемое тобой библиотечное решение?
Re[2]: Metaprogramming et al: Ruby?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 19.08.05 14:56
Оценка: 2 (2)
Здравствуйте, eao197, Вы писали:

E>В этой ветке много говорилось о достоинствах Lisp-а как языка для метапрограммирования. А недавно набрел на ссылоку, где разсказывается про возможности метапрограммирования на Ruby.


E>Metaprogramming Ruby, Domain-Specific Languages for Programmers


А вот еще: Using the Rake Build Language -- разсказ Мартина Фаулера об аналоге make (ant, nant) на Ruby и о том, как он перешел с ant-а на rake.

Небольшая цитата:

Domain Specific Language for Builds

All my three build languages share another characteristic — they are all examples of a Domain Specific Language (DSL). However they are different kinds of DSL. In the terminology I've used before:
* make is an external DSL using a custom syntax
* ant (and nant) is an external DSL using an XML based syntax
* rake is an internal DSL using Ruby.

The fact that rake is an internal DSL for a general purpose language is a very important difference between it and the other two. It essentially allows me to use the full power of ruby any time I need it, at the cost of having to do a few odd looking things to ensure the rake scripts are valid ruby. Since ruby is a unobtrusive language, there's not much in the way of syntactic oddities. Furthermore since ruby is a full blown language, I don't need to drop out of the DSL to do interesting things — which has been a regular frustration using make and ant. Indeed I've come to view that a build language is really ideally suited to an internal DSL because you do need that full language power just often enough to make it worthwhile — and you don't get many non-programmers writing build scripts.

... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[2]: Metaprogramming et al: Ruby?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 18.10.05 12:24
Оценка: 49 (3)
Прошу прощения за то, что снова поднимаю эту ветку, но в сети появились некоторые материалы с конференции RubyConf2005. Среди прочих там есть еще одна интересная презентация о создании DSL на Ruby: Jim Weirich: Creating Domain Specific Languages in Ruby (432Kb).

Вот, например, некоторые цитаты:


Единицы измерения

event_queue "airspace" do
  generate_event_every 5.minutes + 26.seconds
  collision_radius 197.feet + 6.inches
end




Генерация XML

builder = SimpleBuilder.new
builder.entry { |x|
  x.name me.name
  x.email me.email
}

результат
<entry><name>Jim</name><email>jim@fakemail.com</email></entry>




DSL вместо явного написания SQL

route "Problems" do
  step "Problem Resolution"
end

route "EMail Order" do
  step "Validate Customer"
  step "Assemble Order"
  step "Charge Credit Card" do
    on "invalid", :route => "Problems", :step => "Problem Resolution"
  end
  step "Ship"
end
  
generate_sql

вместо
INSERT INTO queues(id, name) VALUES (1, 'Validate Customer');
INSERT INTO queues(id, name) VALUES (2, 'Validate Books');
INSERT INTO queues(id, name) VALUES (3, 'Charge Credit Card');
INSERT INTO queues(id, name) VALUES (4, 'Ship Order');
INSERT INTO queues(id, name) VALUES (5, 'Problem Resolution');

INSERT INTO routes(id, name) VALUES (1, 'EMail Book Orders');
INSERT INTO routes(id, name) VALUES (2, 'Problems');

INSERT INTO steps(id, route_id, queue_id) VALUES(1, 1, 1);
INSERT INTO steps(id, route_id, queue_id) VALUES(2, 1, 2);
INSERT INTO steps(id, route_id, queue_id) VALUES(3, 1, 3);
INSERT INTO steps(id, route_id, queue_id) VALUES(4, 1, 4);
INSERT INTO steps(id, route_id, queue_id) VALUES(5, 2, 5);

INSERT INTO alternatives(id, step_id, code, next_step_id)
  VALUES (1, 3, 'invalid', 5);
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[3]: Metaprogramming et al: Ruby?
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 18.10.05 13:22
Оценка: 33 (3)
Здравствуйте, eao197, Вы писали:

Не противопоставления ради, а для дополнения:

E>Единицы измерения


E>
E>event_queue "airspace" do
E>  generate_event_every 5.minutes + 26.seconds
E>  collision_radius 197.feet + 6.inches
E>end
E>


Algebra:
(2 * #orange) + (3 * #apple) "= 2orange+3apple"
0.65s * #US * 100 "= 65.00US"

Второй вариант: Measurements:
4 ~> 'kg'    "makes 4 kilograms"
5 as: 'cd.m/hr2'    "makes 5 meter-candelas per hour squared"
1 ~> 'm' ~> 'cm'    "makes 1 meter, and converts it into 100 centimeters"
4 mL "makes 4 milliliters"


E>

E>Генерация XML

E>
E>builder = SimpleBuilder.new
E>builder.entry { |x|
E>  x.name me.name
E>  x.email me.email
E>}
E>

E>результат
E>
E><entry><name>Jim</name><email>jim@fakemail.com</email></entry>
E>


VW ST:
aBuilder entry: [:entry |
    entry name: self name.
    entry email: [:email |
        item title: 'This is my email'.
        item description: 'This is the description of the e-mail']].


Такая метода — стандартный способ генерации XHTML в seaside.

E>

E>DSL вместо явного написания SQL

E>
E>route "Problems" do
E>  step "Problem Resolution"
E>end

E>route "EMail Order" do
E>  step "Validate Customer"
E>  step "Assemble Order"
E>  step "Charge Credit Card" do
E>    on "invalid", :route => "Problems", :step => "Problem Resolution"
E>  end
E>  step "Ship"
E>end
  
E>generate_sql
E>

E>вместо
E>
E>INSERT INTO queues(id, name) VALUES (1, 'Validate Customer');
E>INSERT INTO queues(id, name) VALUES (2, 'Validate Books');
E>INSERT INTO queues(id, name) VALUES (3, 'Charge Credit Card');
E>INSERT INTO queues(id, name) VALUES (4, 'Ship Order');
E>INSERT INTO queues(id, name) VALUES (5, 'Problem Resolution');

E>INSERT INTO routes(id, name) VALUES (1, 'EMail Book Orders');
E>INSERT INTO routes(id, name) VALUES (2, 'Problems');

E>INSERT INTO steps(id, route_id, queue_id) VALUES(1, 1, 1);
E>INSERT INTO steps(id, route_id, queue_id) VALUES(2, 1, 2);
E>INSERT INTO steps(id, route_id, queue_id) VALUES(3, 1, 3);
E>INSERT INTO steps(id, route_id, queue_id) VALUES(4, 1, 4);
E>INSERT INTO steps(id, route_id, queue_id) VALUES(5, 2, 5);

E>INSERT INTO alternatives(id, step_id, code, next_step_id)
E>  VALUES (1, 3, 'invalid', 5);
E>


ROE:
courseTitlesForProfessorNamed: aString
  |courses|
  courses := (professors * courses
       select: [[:ea | (ea lastName = aString) & (ea id = ea professorID)].
  ^ (courses project: #title) copyFrom: 1 to: 10.


SELECT title 
    FROM Professor, Course 
    WHERE Professor.lastName = 'Foo' AND Professor.id = Course.professorID LIMIT 10
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.