среда, 28 июля 2010 г.

[prog.flame] Так вот об изобретении новых языков программирования

В понедельник я опубликовал заметку “Прям бум языкостроения какой-то :)”, в конце которой нелицеприятно высказался о разработчиках новых языков программирования. Нужно пояснить, почему я так сделал.

Сразу обозначу свою колокольню – я занимаюсь разработкой важного для компании софта, который должен иметь как можно меньше багов, который живет и развивается долго (основной проект был запущен в эксплуатацию в 2002-м). Это означает, что я не могу сегодня написать один проект на D, внедрить его и забыть, чтобы завтра второй проект написать на OCaml, а послезавтра в третьем проекте использовать AliceML. Мне, по большому счету, нужен один универсальный, компилируемый, статически-типизированный язык. Который будет достаточно распространенным к моменту начала его использования мной, и который не загнется сам в ближайшие пять лет, и библиотеки для которого будут жить и развиваться. Да и самих библиотек должно быть много и разных, и очень хорошего качества.

В мою молодость в программистских кругах ходил такой афоризм: настоящий программист должен написать собственный текстовый редактор, собственный компилятор и собственную операционную систему. Очень точный сказано. NIH-синдром у программистов – это весьма распространенное заболевание. Я и сам его носитель :) Поэтому я могу понять, что толкает людей на разработку новых языков программирования.

Тем не менее, попытка создания своего языка программирования – это как попытка вывести новый продукт на рынок. Языкам общего назначения, как и операционным системам для персональных компьютеров, приходится конкурировать между собой за пользователей на весьма узком пространстве. Где, по определению, победителей не может быть много. Значит, шансы на успех у нового языка программирования изначально небольшие.

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

А это значит, что вход нового игрока на рынок десктопных ОС чрезвычайно дорог – стоимость обеспечения новой ОС софтом и драйверами многократно превышает стоимость самой ОС. Поэтому-то мы не видим на рынке десктопных ОС никаких значимых новых игроков – все те же лица: Windows, Linux, MacOS. По большому счету и все.

В точности тоже самое, но в иных масштабах, происходит и с языками программирования общего назначения. Сам по себе язык не столь уж и важен. Зато огромное значение имеют готовые прикладные библиотеки и инструменты для разработки (IDE, профайлеры, анализаторы кода и т.д.).

Но все это меркнет по сравнению с еще одним фактором – унаследованным кодом, который нужно сопровождать и развивать. Поэтому новый язык, который не обеспечивает простую, дешевую и безопасную интеграцию с унаследованным кодом, сейчас мало кому может потребоваться.

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

Следствие из этого – сейчас язык программирования становится всего лишь некой синтаксической приправой к уже существующей платформе. Платформ этих, грубо говоря, можно насчитать всего три: нативный код на C/C++, JVM и .NET. Отдельными островками можно назвать Perl, Python, Ruby, Tcl/Tk (эти все за счет своего далеко не молодого возраста – у них было время обрасти “мясом”), а так же модные в последнее время Objective-C (за счет выстреливших Apple-вских игрушек) и Haskell-я с Erlang-ом (за счет интереса к ФП, да и, опять же, далеко не молодого возраста обоих).

Следовательно, для меня лично новый язык программирования, который не совместим с какой-либо из упомянутых выше платформ, совершенно бесполезен. Ну, допустим, появится какой-нибудь EasyHaskell, сочетающий в себе мощь Haskell-я с простотой и читабельностью Pascal-я. Но без собственных библиотек (не успели еще написать) и с проблемами интеграции с библиотеками на других языках (за счет совсем другого подхода к программированию). И будет этот EasyHaskell бесполезной для меня вещью.

Поэтому, из чисто практических соображений, новые языки должны создаваться для уже существующих мейнстримовых платформ. Как раз по этому пути идут Groovy, Scala, Clojure, F#. Наличие готовых библиотек и возможность простой интеграции с основным языком целевой платформы резко повышают их шансы.

Однако, тут возникает другой вопрос. А какой смысл пользователю отказываться от основного, уже привычного и знакомого ему основного языка платформы в пользу чего-то нового?

В принципе, если какая-то компания занимается чем-то специфическим (например, хитрым способом рассчитывает рискованность ценных бумаг или автоматическим доказательством теорем для статического анализа С-шного кода), то какая-то конкретная фишка языка (удобная запись лямбда-функций, как было у меня с Ruby) может дать очень серьезный выигрыш. Однако в других компаниях, где нужно делать GUI с сотнями элементов, перелопачивать сотни гигабайт сырых данных, развивать нагруженный сервера и т.д., ситуация может быть совсем другая – у нового языка может не быть вообще никаких преимуществ перед старым.

И другая сторона медали. Вот есть Java, которую сейчас можно рассматривать в качестве основного клея для разработки на JVM. Если вы пишете на Java, то ваш код будет доступен и из Scala, и из Groovy, и из JRuby, и из Clojure. А вот если вы пишете на Scala, то для Groovy программиста ваши разработки могут оказаться просто недоступными. Ну или сильно урезанными из-за необходимости прокладывания мостиков из Scala в Java, а затем в Groovy.

Означает ли это, что у новых языков нет вообще шансов? ;)

Есть, конечно. Поскольку существует такой серьезный фактор как моральное устаревание. Скажем, C++ сейчас – это старый уродец. Когда за плечами по 15-20 лет программирования на C++, хочется хоть на старости лет попрограммировать на чем-нибудь более простом, предсказуемом и приятном. (С++ спокойно можно заменить на Java, а лет через пять-семь и на C#) Плюс подрастает новое поколение, для которого какой-нибудь C++ или Java – как Фортран и Бейсик во времена моей молодости. Не есть рулез и все ;)

Прогресс не стоит на месте, его плоды должны попадать в мейнстрим. Очевидно, что старые языки не могут безболезненно эволюционизировать до бесконечности. Предел по впитыванию новых возможностей достигается очень быстро. Потом останется только перейти на новый язык.

Но опять же... Сегодня новый язык программирования должен обязательно быть бесплатным. Но при этом обладать первоклассными инструментами и широкой поддержкой. Это возможно только, если в язык вложится какой-нибудь крупный игрок. Вот, например, Scala. Живет за счет ETH. F# разрабатывается в MS Research. Разработчики JRuby были наняты тогда еще Sun-ом на фултайм. Go появился на свет в Google. Только один бренд, который стоит за этими языками, дает им такие преимущества, которых никогда не будет у мега-языка от Васи Пупкина из Урюпинска.

В общем, если бы у меня спросили, при каких условиях стоит начинать разработку нового языка программирования, я бы ответил так:

  • только, если язык будет нацелен на одну из трех больших платформ (C/C++, JVM, .NET) и
  • только, если язык будет спонсироваться очень крупным игроком на IT-рынке.

Сюда бы я добавил еще одно условие (хотя оно, как видно на примере Scala и F#, необязательное): только если язык будет использоваться в серьезных разработках крупным игроком IT-рынка (смотрим на примеры Erlang и Go).

Все остальное, на мой взгляд, не лишает шансов создать новый мейнстримовый язык. Но, однозначно, увеличивает время выхода в мейнстрим в разы. Достаточно вспомнить, сколько потребовалось для этого Ruby.

Тем не менее, большинство из представленных на Emerging Languages Camp языков как раз не удовлетворяют хотя бы одному из упомянутых условий. Т.е. они обречены на годы безвестности и ограниченного использования группкой энтузиастов. Т.е. их разрабочикам важен не столько результат – создание мейнстримового языка программирования, сколько сам процесс языкостроительства. Собственно, как и собаке важны не столько чистые яйца, сколько сам процесс их вылизывания :)

Напоследок подчеркну еще раз, что речь шла именно об языках общего назначения. Специализированные языки, как и специализированные операционки – это совсем другой коленкор. Там другая специфика, другие масштабы, другая конкуренция, совсем другие шансы на выживание. Аналогично и с экспериментальными языками, разрабатываемыми в исследовательских лабораториях. Вроде Spec# от MS – захотели проверить идею, выпустили язык, оценили результаты и опубликовали их. Язык свое дело сделал. Его будущее, по большому счету, уже никому не важно. Зато что-то из Spec# может со временем проникнуть в C# или куда-то еще. Собственно, в этом и была цель – эксперимент, а не продукт.

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

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

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

Из островков упустил Lisp и Smalltalk.

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

Не то, чтобы упустил. Я думаю, что Lisp и Smalltalk -- это целая куча островков-диалектов от разных производителей, не совместимых между собой.

Еще есть отдельные островки Delphi, COBOL, Ada, Fortran и даже Modula-2+Oberon. Но они, как и Lisp со Smalltalk-ом, живут в параллельной для меня вселенной.

Alexey Romanov комментирует...

> Платформ этих, грубо говоря, можно насчитать всего три: нативный код на C/C++, JVM и .NET

В перспективе я бы добавил LLVM.

> Т.е. их разрабочикам важен не столько результат – создание мейнстримового языка программирования

С равным успехом можно предположить, что для их целей мэйнстримовость не обязательна (хотя они бы вряд ли возражали :)). А достаточно сделать язык, удобный для них самих. (Яркие представители с Emerging Languages Camp -- Factor, Newspeak. Думаю, некоторые другие тоже.)

> у нового языка может не быть вообще никаких преимуществ перед старым

Может не быть. А может и быть :)

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

@Alexey Romanov

>В перспективе я бы добавил LLVM.

В перспективе - да. Пока же я отнес LLVM к плаформе C/C++.

> А достаточно сделать язык, удобный для них самих. (Яркие представители с Emerging Languages Camp -- Factor, Newspeak. Думаю, некоторые другие тоже.)

Предположим, что есть коллектив, который решает некоторые свои специфические задачи. Если для этого они делают какой-то специализированный язык (вроде PostScript или VHDL), то это еще куда ни шло. Но если они делают язык общего назначения, то это не есть правильно, имхо. Поскольку в случае сопровождения такого проекта сопровождать придется не только сам проект, но еще и язык со средствами разработки.

>Может не быть. А может и быть :)

Было бы странно, если бы авторы языка считали, что у их творения нет преимуществ перед старым языком. :)
А вот будут ли так считать остальные программисты -- это еще вопрос :)

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

В Эрискон тоже делали специализированный язык, практически DSL для маршрутизаторов, в результате получилась гораздо более универсальная вещь :)

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

@Rustam:

>в результате получилась гораздо более универсальная вещь :)

Но сколько бабла ушло у Ericsson-а на развитие этой универсальной вещи? ;)

Да и времени на признание Erlang-а ушло немало.

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

Вот, скажем, для для конечного пользователя
Уберите одно "для".
Нужно, во-первых, обеспечить поддержку унаследованного кода. И, во-вторых, обрасти как можно большим количеством языков и библиотек.
Насколько мне известно, многие языки поддерживают интеграцию с C/C++ (например, с помощью написания модулей). При этом, как правило, чистый C поддерживается полностью, а для C++ есть различные ограничения.

перелопачивать сотни гигабайт сырых данных, развивать нагруженный сервера и т.д., ситуация может быть совсем другая – у нового языка может не быть вообще никаких преимуществ перед старым.
Вот поэтому кобол еще жив, несмотря на пессимистичные прогнозы злопыхателей. Недавно обнаружил, что и Clipper (популярный в эпоху dBase) тоже развивается, вот два проекта:
1. http://www.harbour-project.org/
2. http://www.xharbour.org/index.asp?page=product/thirdparty (дополнительные приложения)

Плюс подрастает новое поколение, для которого какой-нибудь C++ или Java – как Фортран и Бейсик во времена моей молодости. Не есть рулез и все ;)
Не смотрите Вы на это поколение, у них один Crysis и Сталкер на уме:-)
Вы ведь язык не для хвастовства перед пацанами из соседнего двора выбираете?

Это возможно только, если в язык вложится какой-нибудь крупный игрок.
PHP был создан одним человеком в эпоху пиара Java, Lua был создан одним человеком, за СУБД PostgreSQL никаких серьезных сил также не замечено.
Зато что-то из Spec# может со временем проникнуть в C#
Если речь идет о контрактах, то они проникли в C#:
http://habrahabr.ru/blogs/net/91243/

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

@Quaker:

>Уберите одно "для".

Спасибо, исправил.

>При этом, как правило, чистый C поддерживается полностью, а для C++ есть различные ограничения.

Так-то оно так, да вот если мне потребуется задействовать ACE-овские таймера или Boost-овский ASIO из какого-нибудь Ruby или Lua, то я забабахаюсь выделять интеграционный слой на чистом C.

Тогда как в той же JVM или .NET интеграция более-менее сложных объектных моделей в разных языках достигается более просто.

>Не смотрите Вы на это поколение, у них один Crysis и Сталкер на уме:-)

Это нормально. У нас был Lode Runner ;)

>Вы ведь язык не для хвастовства перед пацанами из соседнего двора выбираете?

Нет, но я помню, с каким презрением мы относились к Fortran-у и Basic-у в свое время. И искрене не понимали, почему некоторые наши преподаватели ностальгирую по Fortran-у и не могут нормально освоить C++.

>PHP был создан одним человеком в эпоху пиара Java, Lua был создан одним человеком, за СУБД PostgreSQL никаких серьезных сил также не замечено.

Со времен создания PHP много воды утекло. Тогда и Ruby был разработан одним человеком. Да и Perl чуть раньше... Сейчас время уже другое.

Lua, все таки, я бы отнес к специализированным языкам.

А PostgeSQL появился не на пустом месте, если не ошибаюсь.

4ybaka комментирует...

Не хочу показаться троллем, но все-таки еще раз заступлюсь за D :)
Во-первых, в предыдущем посте было сказано, что мало каких-либо анонсов программ/библиотек для D1. Вот на первый взгляд -
1. Парсер для D1/D2 http://www.digitalmars.com/d/archives/digitalmars/D/announce/Goldie_v0.3_Release_Parser_Library_and_Tools_19028.html
2. Библиотека для сериализации D1/D2 - http://www.digitalmars.com/d/archives/digitalmars/D/announce/Orange_-_a_serialization_library_19030.html
3. IDE для D http://d-dev-ide.blogspot.com/2010/07/ddev-progress-july-2010.html
4. Коммерческая IDE для D http://bitprox.com/en/products_bde_index.html

И это все только за июль.

Во-вторых, D абсолютно совместим с С. Так что наработки не пропадут. С С++ вроде есть какие-то проблемы, но я пока с ними не сталкивался.

В-третьих, Александреску участвует в разработке языка. Это конечно не крупная IT компания, но громкие имена тоже делают свое дело :)

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

>Во-первых, в предыдущем посте было сказано, что мало каких-либо анонсов программ/библиотек для D1. Вот на первый взгляд

Четыре анонса за месяц для языка с десятилетней историей :( Тем более, что два проекта их них из разряда "а вот и мой лисапед на D" :/

Года три-четыре назад у меня у самого был подобный энтузиазм по отношению к D. Но со временем он улетучился. Искренне желаю, чтобы с вами такое не случилось.