В понедельник я опубликовал заметку “Прям бум языкостроения какой-то :)”, в конце которой нелицеприятно высказался о разработчиках новых языков программирования. Нужно пояснить, почему я так сделал.
Сразу обозначу свою колокольню – я занимаюсь разработкой важного для компании софта, который должен иметь как можно меньше багов, который живет и развивается долго (основной проект был запущен в эксплуатацию в 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. Все вышесказанное можно было бы отнести и к разработчикам библиотек. Но разработчики библиотек больше похожи на разработчиков специализированных языков. Там, все-таки, ситуация сильно другая.