Re[58]: C+ vs C#
От: Vermicious Knid  
Дата: 15.02.06 06:47
Оценка: 10 (4) +2
Здравствуйте, alexeiz, Вы писали:

A>Все примены из Nemerle идут лесом. Сравнивать C++ с функциональным языком, это слоны и бегемоты. Подумай тот ли язык программирования ты выбрал, если тебе приходится писать функциональный код. Здесь идет сравнение с C# — основным языком программирования для .NET.


Эти примеры идут скорее дорогой, ровной и прямой. Во-первых Nemerle это не функциональный язык. Это чистой воды императивный язык, имеющий ряд заимствований из современных функциональных языков(главным образом ML). В дизайне C++ тоже есть заимствования из ML(это не мои слова, это Страуструп сказал), это делает его функциональным?

То, что функции поддерживаются в этом языке на более высоком уровне еще не делает его функциональным(скажем в C# 2.0 тоже есть анонимные функции, замыкания и делегаты). Главные отличительные особенности функциональных языков — программа как композиция функций, значение это функция, ссылочная прозрачность, отсутствие переменных.

В Nemerle программа это не композиция функций, значение это не функция, гарантия ссылочной прозрачности даже в элементарных случаях невозможна, переменные есть. Каким боком это функциональный язык, если ни один из принципов ФЯ не соблюден? Он не более функциональный чем скажем C# или например Javascript.

Раз уж мы разговариваем в священных войнах, то не побоюсь сказать — такой вывод ты сделал "благодаря" очень поверхностному знакомству с функциональными языками. Лично я с ними тоже знаком преимущественно поверхностно и мое отношение к ФП можно охарактеризовать как весьма сложное(мои любимые парадигмы скорее метапрограммирование и логическое программирование), но элементарные принципы функциональных языков даже я знаю.

Кё>>Ты можешь сказать, что у тебя таких ситуаций не было. А почему не было? Потому что тебе не приходило в голову, что так можно, исключительно из-за того, что на С++ это делать трудно и результат получается непонятным.


A>Твоё обобщение не имеет смысла. Пока что ты показал, что из C++ трудно сделать функциональный язык. Это так. Но не то, что C++ — не является языком высокого уровня.


C++ не является языком высокого уровня, хочешь ты этого или нет. Семантика самого языка низкоуровневая. Особенно это касается семантики времени исполнения, в частности ООП-возможностей. Как ООП язык C++ себя не оправдал.

В C# есть абстрактные классы, интерфейсы, делегаты, свойства. Что из этого может предложить C++? Правильно, ничего. Вместо всего этого используются костыли на шаблонах. Написание костылей — это наиболее популярное занятие в среде C++. Для многих "С++-героев" это уже давно стало прибыльным бизнесом. В C++ как нигде более был востребован consulting. К сожалению их мир схлопывается на глазах. Один из инструментов самораскрутки(С++ journal) уже закрылся.

A>Опять в том же стиле. Ты не понимаешь о чём речь. Никто не пытается сказать, что всё можно сделать на C++ (легко).


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

От C++ у меня осталось одно яркое воспоминание — книга "C++ Modern Design". В отличие от многих книг по С++ книга написанна хорошим, живым, понятным языком. Код к книге это эталон изящности и читабельности, несмотря на то, что автору постоянно приходится бороться с недостатками и недоработками C++, в том числе и главным — хроническим отсутствием нормальных компиляторов(шутка ли — во время написания книги для Windows не существовало ни одного компилятора кроме весьма специфического Comeau C++, который бы скомпилировал его код). К сожалению ни ему, ни контрибуторам boost так и не удалось окончательно "побороть" С++. У них наверняка другое мнение, но на деле они вышли из этой борьбы проигравшими.

Кё>>Не раз в форуме C++ были темы с безобидной функцией, в которой находили до десятка потенциальных проблем. Проблема как раз в выделенном — трудно сразу сказать, является код ill-formed, или это well-formed с UB, или всё правильно. К примеру:


Кё>>
Кё>>struct A
Кё>>{
Кё>>  T* x, y; 
Кё>>  A() : x (new T), y (new T) {}
Кё>>};
Кё>>


Ну во-первых T * x, * y; Это очередной пример грабель.

A>Никаких проблем. Каждый человек, знакомый с исключениями не по наслышке увидит в этом коде ошибку. Конечно, тот, кто имел дело с C, может такое написать. Но о том и речь. C++ нужно изучать. В изучение входит не только синтаксис языка, но и основные методы программирования на нём.


Ты удивишься, но я подобный код встречал много раз, в самых разных местах, включая некоторые неплохие open source библиотеки. То-ли авторы не знакомы с исключениями, то-ли с языком, но в остальном это был вполне рабочий, качественный код.

Не знаю интересно ли тебе мое мнение, но мне не хотелось бы постоянно обращать внимание на такие пустяки при написании программы. Хорошие программисты на C++ видимо вообще очень замороченные и параноидальные субъекты.

A>А, вот что ты имел ввиду в своем коде. Абсолютно бредовый код, честно говоря. Но C++ — это язык не для новичка. Про новичков вопрос отдельный. C++ в настоящее время больше ориентирован на профессионалов.


A>Более высоком, чем на C#. См название темы. Я не собираюсь обсуждать здесь функциональные языки программирования.


Полный бред. Во-первых реальных приложениях уровень C++ значительно ниже уровня C# 2.0. Для 90% приложений это так. Ты конечно можешь сколько угодно говорить о "мифических профессионалах" на которых рассчитан С++, но в действительности хороших профессионалов, программирующих на C++ не так уж много. Я бы сказал не более 5% от общего числа. Поздравляю тебя с тем, что ты входишь в это число. Собственно чего уж греха таить, для многих людей это едва ли не основной жизненный приоритет, войти в "элитный клуб" С++-профессионалов. Кстати многие люди посредственно знающие С++ как программисты и архитекторы несоизмеримо лучше даже самых крутых C++-профессионалов. При всем уважении к присутствующим и особенно не присутствующим(видимо boost не оставляет свободного времени на форумы) здесь C++-профессионалам из MetaCommunications, мне бы не хотелось работать над их продуктами, ибо это крайне скучно и вообще неинтересно. А вот посредственным контрибуторам Mozilla как-то удается создать очень качественный и крайне увлекательный программный продукт(есть такие примеры и среди коммерческих продуктов).

Многим вообще наплевать на профессиональный и интеллектуальный рост, они просто ремесленники и элементарно зарабатывают на жизнь. Да и большинство серьезных, часто используемых коммерчески, библиотек реализованны с точки зрения C++ как языка мягко говоря неважно(MFC, Qt например). Ну и скажем игроделанье это одна из незыблемых ниш C++, а там профессионализмом обычно и близко не пахнет.

Во-вторых скорее нужно доказывать, что уровень C++ выше уровня C#. Imho это практически невозможно доказать. Есть несколько областей, в которых C++ далеко позади C#, причем и как язык и как runtime среда. Например модульность, ООП возможности, синтаксический сахар. Те же дженерики в определенных случаях гораздо удобнее шаблонов C++.

А если еще отбросить бред про "функциональные языки программирования" и сравнить таки C++ с Nemerle(который семантически является лишь надстройкой над C#), то C++ остается в глубоком пролете.

Тем не менее я считаю, что C++ это достаточно мощный язык и у него еще очень долгое время будет оставаться своя достаточно широкая ниша. Но лично я предпочту держаться от него как можно подальше, хотя знаю его неплохо(действительно неплохо). Это просто напросто экономически неэффективно. Даже если в денежном выражении результат будет выше, то количество затраченных сил будет несоизмеримо выше.

Мой прогноз — C++ протянет еще лет 15-20. Если бы они поторопились с новым стандартом, то этот срок увеличился бы еще лет на пять. А если бы приняли за правило выпускать новый стандарт, то можно было бы еще лет 10 накинуть. Но очевидно, что этого не произойдет.

Я думаю часть рынка C++ мог бы не без успеха занять D, но пока у него есть принципиальные недоработки и проблемы с "комитетом"(в количестве одного человека). Если к версии 1.0 хотя бы половина из них будет исправленна и появится implicit template instantiation, то срок жизни C++ можно смело сокращать еще на пять лет.

А вообще равнение C# и C++ изначально не совсем корректно. Строго говоря они друг другу не конкуренты. Более того они даже не конкурируют за "умы" программистов. На C# или Java переходят только самые прагматичные, циничные и ленивые профессиональные C++-разработчики. Все романтики, крепкие C++-профессионалы и трудоголики останутся на своих местах. А то, что C# привлекает армию индусов и прочих одноклеточных — это не проблема. На таком фоне гораздо проще выделиться.

A>Где?


Кто здесь? А ты хто?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.