суббота, 26 сентября 2009 г.

[comp.prog.flame] Споры о языках программирования – не могу смолчать

За прошедшую неделю ознакомился с несколькими (почти эпическими) говносрачамисвященными войнами вокруг языков программирования. Если кому-то интересно, то вот ссылки:
Google разрабатывает язык Noop для замены Java
DragonFly BSD 2.4
Хамелеоны быстрые и очень быстрые
Noop - новый язык для JVM
шаблоны С++ и дженерики С#

Ругают, как водится, C/C++ (в основном C++). Доходит до такого:

На С++ без ошибок хрен напишешь.

Но и Java так же перепадает:

Явы не хватает ни для какой задачи, вообще. Если, конечно, имеешь представление о тех же ОКамле с Хаскелем.

Но апофеозом всего этого действа оказалась ссылка на запись в ЖЖ Сергея Зефирова (aka thesz) от 2007-го года:

Языки программирования можно условно разделить на "делаем нужное" и "делаем интересное."
Нужное, обычно, решает какую-то частную проблему, закрывая пластырем ее большую часть и обкладывая заплатками окрестность.
Интересное, обычно, вскрывает целый пласт проблем и дает решение к ним всем, обычно же, без заплаток.
Эрланг, C - это "нужные" языки.
Хаскель, Схема, Камл, Пролог - "интересные."
Нужные языки, безусловно, нужны, но неинтересны. Решив задачу на нужном языке, не проходишь мимо чего-либо интересного.
Интересные языки, безусловно, интересны, но про них существует неправильное мнение, что они не нужны. Типичный вопрос: "Где (как) мне использовать Хаскель?"
А дальше рассуждать мне лень. ;)

Мое отношение ко всему этому: “Я х*ею, дорогая редакция!”

Во-первых, мне интересно, откуда в программистах (не знаю во всех ли или только у гиперактивной их части) такая страсть в обсуждении языков программирования. Даже не столько обсуждения, сколько охаивания. В общем-то, я и сам был этим грешен, хотя и сейчас не могу понять почему. Может быть, из-за того, что язык программирования – это привычный и знакомый всем инструмент? Поэтому каждый мнит себя экспертом и желает отстоять свою точку зрения. А может это вообще свойство человека – хвалить свое, ругать чужое? Вроде бы между владельцами Nikon-ов и Canon-ов (равно как и Mersedes vs BMW) священные войны так же никогда не стихают…

Во-вторых, не понятно, почему столько дерьма выливается на на C++ (а теперь уже и на Java)? Ну да, далеко не образец совершенного дизайна. Но ведь он не один-единственный язык на свете. Были, есть и будут более грамотно спроектированные и красивые языки. Которые почему-то ни фига не используются. Может быть большинство критиков C++ (Java) забывают, что мир вообще не совершенен? И уродливый C++ оказывается к этому миру приспособлен лучше, чем десятки его более “правильных” конкурентов. Не зря все-таки Страуструп сказал, что есть всего два типа языков – те, которые ругают и те, которыми не пользуются. Видимо, ругают именно то, что в жизни оказывается приспособленным к насущным задачам и имеющимся программистам (не нужно забывать, что подавляющее большинство программистов далеко не корифеи в своей области).

В-третьих, не понятно, почему на языках программирования вообще такой акцент делается? Да, одни языки для конкретных задач подходят лучше, чем другие. И постепенное развитие техники все больше и больше позволяет уйти от низкоуровневой оптимизации в сторону высокоуровневых и безопасных языков. Но ведь этот процесс не нов. Еще двадцать лет назад было понятно, что тот же C++ в классе бухгалтерских программ просто ничто по сравнению с Clipper и FoxBase. Так что сейчас-то чего трындеть зазря – выбираете себе язык по вкусу и по задаче – и вперед, на мины! А уж если от C++ (Java, COBOL, …) нет возможности отказаться из-за большой кодовой базы, так опять же, в чем проблема? Если новые языки такие крутые, так чего бы весь этот старый хлам не выбросить? Ан нет, так просто не выбросишь. Потому, что круты не настолько, чтобы раз-раз и переделать все. А раз не переделаешь, зачем катить бочки на то, что было сделано давно и что сейчас дает вам средства на жизнь?

В-четвертых, какое-то странное деление языков на “интересные” и “нужные”. Язык – это инструмент, как молоток. Уместно ли говорить про молотки, что бывают “интересные” и “нужные”?

Так и представляю себе – нужно повесить шкафчик – берем “нужный” молоток. А если блоху подковать, то требуется “интересный”. Наверное, действительно, подковывать блох интереснее.

И, опять же, причем здесь языки? В принципе, можно понять, что тот же thesz оказался в ситуации, где он в одиночку лабает для себя модели процессоров, где у него собственные планы и ограничения. Такой маленький уютный мирок, полностью соответствующий его потребностям. Но есть прорва задач, где т.н. “интересные” языки ни ухом, ни рылом. Поставят вам задачу – сделать систему приема электронных платежей с нагрузкой в 5000 транзакций в секунду и что? Интересные языки здесь будут использованы или нужные C++ с Java?

Наверное сторонникам “интересных” языков такие задачи интересными не кажутся. Ну ёптыть, это же не математические модели на Haskell-е/OCaml-е обсчитывать. Только вот понимают ли они, что в такой задаче язык – это так, один из факторов, далеко не самый важный.

Отдельно я не понимаю утверждения, что нужное решает какую-то частную проблему, обкладывая пластырем общую часть. Например, написанные на C/C++ Web-браузеры (IE, Safari, FireFox, Opera, Chrome) – это все решения частных проблем? А что тогда общая часть?

В-пятых, я не понимаю, почему сейчас так модно стало ругать ООП. Это типа прозрение наступило или просто подрасло новое поколение, для которых ООП – это такая же норма, как структурное программирование в мое время? Или же это вера в серебрянность пули под названием “Функционально программирование”? В прочем, это уже другая история.

Прошу прощение за объем и эмоциональность текста. Наболело.

Таки хотелось бы посмотреть на какой-нибудь большой, полезный и реально эксплуатирующийся проект, который был написан без ошибок… А то сдается мне, что фразу “На C++ без ошибок хрен напишешь” можно адресовать любому языку программирования. А то ведь даже разработчики компилятора Haskell-я ошибки допускают. Куда уж все нам, простым смертным (кстати, не приведи Господь сопровождать тот код, на котором была найдена эта ошибка – пусть это достанется слишком умным товарищам, вроде thesz).

PS. А Java, все-таки must die! ;)

13 комментариев:

Rustam комментирует...

Да ладно до эпических срачи не дотянули. Немерлисты выдохлись, главный хаскелист троллит, другие хаскелисты куда-то пропали :)

Alexander P. комментирует...

Ну как вы правильно сказали, что много используют, то много и ругают.

Мне из одного обсуждения понравилась мысль, что к любому языку при должном старании можно написать N-пунктов негатива.
Понятно, что отношение часто субъективно, и зависит от повседневных задач, которые человек на этом языке решает.

Тут хочется сказать очевидную фразу: "Мы платим за то, что используем". Работаешь с суровым С++? Получай тонну написанного кода и ворох граблей впридачу :).
Используешь элегантный Ruby? Плати памятью и скоростью, скоростью. Ну и.т.д.

Я тут вспомнил про Руби и хочется отступить от темы: по-моему, Руби для большего роста очень не хватает статически-типизируемого компилируемого "аналога" (как Cython, например, для Python) - для написания библиотек/расширений а-ля Ruby On Rails. Как вы думаете?

>PS. А Java, все-таки must die! ;)
Ну вот, видите? :)

eao197 комментирует...

2Rustam: ты, наверное, только RSDN-овские флеймы просмотрел. А первый на LOR-е действительно эпический -- там под 900 сообщений :)

eao197 комментирует...

2Alexander P: ага, за все приходится платить. В C++ за грабли, в Ruby/Python/Erlang за динамическую типизацию и тормоза, в Java за ущербность языка и тонны индуского говнокода, в функциональных языках -- за высокий порог входа, маленькие community, дефицит библиотек...

По поводу Ruby... По мне, так он хорош именно тем, что он динамически типизированный. А в рамках JRuby к нему какую-то компиляцию в байт-код делают. И в рамках проекта Phoenix разрабатывали новую VM для Ruby. Может в конце-концов сделают что-нибудь в духе Self-а -- серьезное ускорение некоторых частей кода на основании статистики его использования. Поживем -- увидим.

Rustam комментирует...

Да я про RSDN, я их не только просмотрел но и чуть поучаствовал :) Правда все совсем кисло, тебя не хватает :)

Alexander P у питона все-таки сила в библиотеках, а они большей частью все-таки на си написаны.

Alexander P. комментирует...

Кстати, Safari говорят (http://steps3d.ixbb.ru/viewtopic.php?id=74#p440) написан на Objective-C. Ну тут уж стандарты Apple - ничего не поделаешь :).

eao197 комментирует...

2Rustam: зато от неучастия в RSDN-овских разборках освобождается приличное количество времени :)

2Alexander P: afaik, Safari начинался с WebKit (http://en.wikipedia.org/wiki/Webkit) -- это C++. Не знаю, насколько сейчас Safari состоит из C++, но раньше его там было прилично :) Тем более, что Objective-C тот еще фрукт :)

Skynin комментирует...

Java, все-таки must die! ;)
И это сказано тем, что начал с "мне интересно, откуда в программистах ... такая страсть в обсуждении языков программирования"
А в зеркало посмотреть? ;)

Просто процитирую ответ из Скорость работы

При программировании на C++ как-то так получается, что я начинаю думать о том, о чём раньше не думал. ... Вот что в джаве хорошо — она очищает голову от подобной ерунды. Программа работает неэффективно? Использует в два раза больше памяти? Тратит на 30% больше процессорного времени? Ну и ладно, потому что программа решает поставленную задачу. В C++, почему-то, так писать не получается.

eao197 комментирует...

> А в зеркало посмотреть? ;)
Ну нельзя же нарушать традицию -- столько лет (непонятно почему) кричал "Java must die!", а теперь вдруг перестал :)

>Просто процитирую ответ из Скорость работы
Просмотрел эту ссылочку. Никогда не был таким C++ником. Меня и раньше не заботила сторость виртуальных вызовов, а сейчас и подавно :) И даже писать на C++, как на Java получается. Только вот не знаю, что тому виной: или старческий пофигизм, или опыт, или развитие нормальных прикладных библиотек для C++ (типа OTL, POCO).

Skynin комментирует...

Ну нельзя же нарушать традицию
...а я тут недавно сел, понадобилась утилитка работающая под "чистой" виндой, от вынь2к и выше, и что-то Си мне разонравился. Такие были хорошие воспоминания, и оказывается, на нем "крупу перебирать" хорошо, а не написать что-то непритязательное и быстро.
Тогда открыл VC++ - и вообще не понял ничего. Пока вывел строку wchar_t на экран... А от хеадеров - сдуреть же можно :)

Вобщем почитал, посмотрел, на D - похоже самое то для моих иногда возникающих задач, требующих .
Так что я бы сказал - "C++ must die", как вы "плюсовики" на нем пишете то? (аналогичный вопрос к перловикам, использовал я perl в своих нуждах. Когда Руби и Питона "не было").

eao197 комментирует...

2Skynin: а еще некоторые граждане с удовольствием слушают группу "Блестящие", а другие граждане -- Рамштайн. Бррр... Как? ;)

Инструмент должен "лежать в руке". Для чего нужно, чтобы он нравился, и практика регулярная была.

Но, вообще-то, некоторые языки действительно не заточенны под быструю разработку. В том числе и C++. Об этом я попробую чуть подробнее в отдельной заметке рассказать.

Skynin комментирует...

Просто удивлялся, смеялся над вопросами в форумах - а как мне влинковать JVM(CLR) чтобы запускалось без инсталяции или копирования на любой машине, и опаньки, в кои веки, самому понадобилось. И оказалось, а таки прошлый век... и вернее ввести понятие java-cast ЯП, к которым отношу и D, потому что c-like уже не отражает ситуации - это java-cast семейство более высокого уровня, с учетом более крутого железа и возможностей ОСи и из которых убрана совместимость и устаревше-сложные конструкции для отображения современных реалий.

Инструмент должен "лежать в руке"
И знаете какое мое субъективное ощущение в нетехнических терминах -
java-cast как гладенькие предметы в руке: биллиардный шар, фарфоровая кружка, а С/С++ - как гаечный ключ в масле и вмятинах от использования, как нечто незашкуренное, царапающее руку.
То есть вместо "более высокого" уровня, более психически точно я бы сказал - более комфортного уровня. И дело вовсе не в сборщике мусора, а в ощущениях от "общего вида".

eao197 комментирует...

2Skynin: как по мне, так в D есть неприятная бомба, так же заложенная из-за интероперабильности с C: указатели и структуры. Из-за этого при использовании D начинается шиза -- где-то ссылки, ссылочные типы и сборщик мусора, а где-то указатели и структуры. Ну это так, к слову.

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

Есть такой анекдот:

Прорвало канализацию. Дерьмище хлещет из канализационного люка. Рядом с люком сидит начинающий сантехник и не знает, что делать. Подходит матерый, старый мастер, смотрит на это дело пару секунд, потом с головой ныряет в люк. Через какое-то время выныривает, говорит начинающему: "Ключ!", начинающий подает ему ключ, мастер ныряет обратно. Вскоре дерьмо затекает обратно -- проблема устранена. Довольный мастер выбирается наверх и говорит начинающему: "Учись студент! А то всю жизнь ключи подавать будешь!"

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

Да и C++ники -- как те сантехники: какие бы красивые и современные здания на новых языках не клепали, коммуникации для стока дерьма все равно кому-то и прокладывать, и обслуживать нужно.