Здравствуйте, mogadanez, Вы писали:
VD>>Понимаеш ли. Твои слова про сложность С++ — это не правда. Как язык C# значительно сложнее. Он обладает куда большим объемом кострукций не говоря уже о их применении.
VD>>Сам С++ относительно простой язык. Сложно же в нем обходить грабли. Вот тут действительно нужно выроботать привычку использовать только безопасные паттерны. Ну, и сложно следить за теми самыми мелочами. Однако сложность использования и сложность продукта не коррелирую между собой. К примеру, телевизор очень не простой продукт, то использовать его может трех-летний ребенок.
M>мне кажется — количество конструкций языка не говорит о его сложности.
синтаксически-одинаковые конструкции могут быть семантически разными. Поэтому я бы подсчитывал число семантических конструкций. По этому показателю С++ сложнее того же C#. (взять хотя бы разнообразные способы объявления переменных и создания экземпляров как на стеке, так и в хипе, т.е. на каждую конструкцию в C# мы получаем минимум 2-3 конструкции в С++. Учитывая forward-declarations и макросы — и того больше.
Конструкции типа lock и using в С++ не нужны принципиально, из-за механизма детерминированного разрушения стековых объектов.
Эти конструкции были введены в C# для обеспечения детерменированности наиболее встречающихся сценариев.
Конструкция fixed — вообще относится к тонкостям работы с GC.
unsafe — объявляет класс/метод/блок кода, где возможна адресная арифметика, очень похожая на С++-ную.
Что действительно понравилось в C# — это возможность явного управления иерархиями виртуальных ф-ий. С++ в этом плане немного жестче и не столь очевиден.
M>Сложность языка — это наскольно сложно на нем писать КАЧЕСТВЕННЫЙ КОД.
И тут я бы уточнил. Сложность С++ заключается в большом количестве материала, который остается за кулисами. Например правила приведения типов, адресной арифметики, выведения аргументов шаблонов, видимость namespace там же и т.д.
Т.е. я бы оценил сложность языка еще в объеме материала, которым нужно владеть для адекватного кодирования на нем.
Но и тут следует уточнять. Мне, например, потребовалось переварить совсем немного материала, чтобы изучить ВСЕ конструкции языка C#, включая синтаксис применения аттрибутов (assembly:, return: ). Однако, относительно C#, чтобы писать на нем, нужно скорее знать не столько язык, сколько особенности и важнейшие типы (и аттрибуты) самой платформы. А их много.
Соответственно, специалистом в C# невозможно быть не будучи специалистом по самой .Net.
И кстати, гуру C# — это именно гуру .Net со всеми прибабахами, начиная от философии решения типовых задач (и не только типовых), заканчивая безопасностью, рефлекшеном и т.д. и т.п..
Здравствуйте, VladD2, Вы писали:
ГВ>>И что это доказывает? Привлекательность "направления .NET/C#" для... для кого? Или попросту то, что те, для кого привлекателен C# чаще заглядывают в "голосования"?
VD>Это пказывает, что даже С++-программисты (которые как раз значительно чаще заглядывают в голосования, как показывает практика) и сами осознают большую перспективность дотнета нежели нэйтив-С++-а. Ну, или то что относительная популярность дотнета ростет.
Или то, что ссылка на голосование лежала не в том форуме. Сейчас там 50/50 результат
Здравствуйте, VladD2, Вы писали:
VD>foreach — это синтаксический сахар позволяющий быть менее многословным для выражения паттерна перебора. Абстракцией он не является. Абстракцией является интерфейс IEnumerable и IEnumerable<T>. Они кстати, я взык не вмонтированы.
Кстати — это вообще прикольный аспект. Класс Exception тоже в язык не вмонтирован, но мы можем выбросить только его наследника. foreach — вмонтированная конструкция, однако, занимается перебором невмонтированного IEnumerable.
В этой ветке много говорилось о достоинствах Lisp-а как языка для метапрограммирования. А недавно набрел на ссылоку, где разсказывается про возможности метапрограммирования на Ruby.
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++.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Павел Кузнецов, Вы писали:
ПК>>Интересно, как можно не вызвать деструктор базового класса?..
VD>Ты только деструкторы вызывашь? Или виртуальные методы не приходилось перегружать?
Похоже, надо возвращаться к началу.
Деструктор базового класса за меня вызовет компилятор. Т.е. освобождение ресурсов гарантирует мне компилятор. Ведь паттерн вроде для этого?
Здравствуйте, Павел Кузнецов, Вы писали:
>> как выглядит максимально изящное библиотечное решение?
ПК>Ну, "максимально изящное" -- не знаю, тут долго можно спорить, т.к. понятия об изящном у всех свои... Но достаточно близкий по количеству писанины к встроенному в язык: ПК> ... ПК>Mожет быть, например, таким:
Павел, ты не мог бы подсказать ссылку на цитируемое тобой библиотечное решение?
Здравствуйте, eao197, Вы писали:
E>В этой ветке много говорилось о достоинствах Lisp-а как языка для метапрограммирования. А недавно набрел на ссылоку, где разсказывается про возможности метапрограммирования на Ruby.
E>Metaprogramming Ruby, Domain-Specific Languages for Programmers
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++.
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>