В недавних обсуждениях появилось несколько комментариев, которые достойны того, чтобы поговорить о них отдельно. Особенно в свете появления новостей о языке Go от Google (документацию о котором я изучаю, чтобы затем высказать свои впечатления).
Комментарий ув.тов.breezsea:
Думаю, что языкам программирования уделяют слишком много внимания. С ужасом наблюдаю, как на форумах/в блогах и т.д. начинаются священные войны/многостраничные срачи и т.д. в попытках найти несуществующий идеал. Еще более смешным выглядит объявление о создании еще одного нового и никому не нужного языка программирования (последний пример - Zimbu от Брана Мулинара). Проблема в том, что в языках программирования всё уже придумано. Изобрести что-то действительно новое и полезное крайне трудно. Меня всегда интересовал и интересует вопрос: какими соображениями руководствуются очередные велосипедисты при создании своих поделок?
Комментарий ув.тов.Quaker:
Я считаю, что в языках программирования гораздо важнее даже не сам язык, а большое количество готовых библиотек, кроссплатформенность, полноценная IDE с графическим интерфейсом, интеграцией с CVS/SVN и т.д. В общем, вспомогательные вещи, не имеющие к синтаксису языка прямого отношения.
Оба комментария, на мой взгляд, затрагивают один важный вопрос: “Поскольку сами по себе фичи языка и его синтаксис не столь уж и важны, но почему же появляется такое количество новых языков программирования?” Но интересен не только этот вопрос, но и его логическое продолжение: “Что ждет новые языки?” или, в более интересной для программиста формулировке, “Какой из них станет Next Big Language?” Однако, пойдем по порядку.
Насколько я понимаю, новые языки программирования делятся на две категории. Первая категория – это экспериментальные языки, которые создаются своими авторами для проверки каких-то идей. Например, таковыми языками были Pizza и Funnel, на которых обкатывались идеи, впоследствии реализованные в Java и Scala. Вторая категория – это языки, которые создаются своими авторами как рабочие инструменты. Например, языки C, C++, Eiffel, Perl, Java, Python, Ruby, C#.
Полезность языков из первой категории, по-моему, очевидна. Это прототипы для обкатки новых идей или новых сочетаний ранее известных вещей. Такие языки не претендуют на переход в разряд “рабочих лошадок”, их авторы не заботятся разработкой большой стандартной библиотеки, необходимых разработчику инструментов (редакторов, отладчиков, профайлеров и пр.), им не важен размер сообщества пользователей языка.
Единственная опасность, связанная с экспериментальными языками – это горячие головы, которые решают продвигать экспериментальный инструмент в качестве рабочего. Собственно, это не проблема языка. Это проблема тех, кто попадается на такую удочку.
Полезность языков из второй категории должна была быть очевидной. По идее должна быть. Ведь рабочий язык предназначен для того, чтобы было легче, дешевле и быстрее решать какие-то практические задачи, стоящие перед обычными программистами. Понадобился эффективный язык, уровнем повыше ассемблера – появился C. Понадобился еще чуть более высокоуровневый язык, чем C – появился C++. Потребовался безопасный C++ – появился язык Java. Потребовалась заточенный под Windows вариант Java – появился C#. И т.д.
Казалось бы, все здорово, больше языков – хороших и разных! Однако, если появление новых экспериментальных языков – это действительно хорошо, то появление новых рабочих языков, особенно универсальных языков общего назначения – это штука неоднозначная.
С одной стороны, существующие рабочие языки не идеальны. В каждом из них есть изъяны, которые хотелось бы устранить, но нельзя этого сделать, т.к. нельзя терять совместимость. А вот новый рабочий язык мог бы взять лучшие качества из уже существующих, но оказаться лишенным их недостатков. Вот тот же Zimbu – когда читаешь мотивацию принятия тех или иных решений, то все получается складно. Zimbu мог бы стать вполне хорошей заменой C, C++ и D. Мог бы, если бы не одно но.
Очень большое “но”, которое является обратной стороной новых рабочих языков программирования. Рабочему языку нужны инструменты (начиная от библиотек, заканчивая различными анализаторами и “украшателями” исходного кода), нужны информационные ресурсы, нужно большое и живое сообщество. Все это не возникает просто так. На создание библиотек и инструментов нужны огромные ресурсы и время. На создание сообщества нужно время и еще что-то. И все это при том, что в языке будет что-то, что зацепит пользователей (что бывает очень далеко не всегда).
В современных условиях создание нового рабочего языка, для которого стандартная библиотека будет разрабатываться с нуля, для которого будут писаться новые IDE, новые отладчики, новые профайлеры и т.п. – это утопия. Слишком много всего нужно иметь современному разработчику “здесь и сейчас”. Не будет никакого толку от языка, защищающего от обращения по нулевым указателям и гарантирующим не выход индексов за пределы массивов, если для этого языка нет Regexp-ов или средств построения GUI.
Такой язык может стать флагом какой-то группки энтузиастов, для которых целью является использование именного этого языка, а не какого-то другого. Или же язык может занять какую-то узкую нишу, где его качества будут решающим преимуществом, а маленькая стандартная библиотека не будет проблемой (как сейчас происходит с Modula-2, Ada и Eiffel). Но мейнстримом он не станет. А посему, лично для меня такой язык представляет чисто академический интерес – пролистать документацию и посмотреть примеры интересно, но использовать я его не буду.
Совсем другое дело, когда новый рабочий язык позволяет бескровно и бесплатно использовать уже существующие библиотеки и средства разработки для других языков. Например, как C++ в свое время позволил использовать C-шные библиотеки. Как Scala сейчас позволяет использовать JVM, как Nemerle позволяет использовать .NET Framework. Тогда для нового языка все не так плохо. Тогда разработчик действительно может получить выгоды и от тщательно отобранных языковых возможностей, и от унаследованного кода.
Но! Такой новый рабочий язык должен дать разработчику что-то такое, что действительно оправдает переход на него с мейнстримового языка. Например, был интересный язык Nice, который предоставил возможности обобщенного программирования и мультиметоды для JVM еще до того, как в Java появились generic-и. Но Nice не выстрелил. Даже не смотря на очень простую интеграцию с Java. Видимо, преимущества языка не оправдывали отказа от Java. Тогда как Scala потихонечку набирает популярность. Поскольку функциональные возможности Scala, имхо, оправдывают переход на Scala.
Еще один фактор: новые рабочие языки не могут появляться слишком часто. Существует мнение, что мейнстримовый язык меняется раз в десять лет. Поэтому, если новый рабочий язык для какой-то платформы (JVM или .NET) появляется, когда основной язык этой платформы “на коне”, то шансов привлечь к себе внимание и пользователей у него не много. Ведь основной язык пока справляется со своими задачами, его недостатки пока не набили оскомину, у многих пользователей еще не прошло восхищение неофитов. Тем более, что в это время сам язык еще активно развивается и пополняется новыми возможностями. Опять можно вспомнить Nice, который появился в начале 2000-х, как раз когда Java был близок к своему пику. И вскоре после рождения Nice в Java были добавлены generic-и. Совсем другая ситуация сейчас для Scala.
Так вот, пора подводить итог. На мой взгляд, у новых рабочих языков, которые не привязаны к какой-то платформе, нет шансов стать хоть сколько-нибудь заметными игроками. Если только какая-нибудь мегакорпорация не захочет вбухать N сотен миллионов долларов в создание большой стандартной библиотеки и инструментов для разработки (что маловероятно).
Значит, новые рабочие языки должны появляться для распространенных сейчас платформ. К коим можно отнести, в первую очередь JVM и .NET. Но не только. Не следует списывать со счетов C/C++ наследие – т.е. потенциально возможно(?) создать “улучшеный С++”, который сможет использовать мегатонны уже существующего С/C++ кода (что-то типа D или Vala). Так же, наверное, не исключено создание новых языков и для Erlang VM (например, Reia). А может быть, и для Ruby или Python (хотя смысла в этом я не вижу), или даже для OCaml с Haskell-ем :)
Итого: языки типа Zimbu и Go обречены оставаться экзотикой. Языки типа Scala или Fan, или Cobra – вполне могут стать широковостребованными рабочими лошадками (может и не вытеснят основные языки Java/C#, но свое место под солнцем отвоевать смогут). Другой вопрос – нужно ли использовать их? Scala вместо Java я бы рискнул попробовать. Но тут уж каждому предстоит решать самому.