Как уже сложилось в «Берлоге инженера», в пятницу предлагается «тема для раздумий». Сегодня хочу поделиться с вами некоторыми своими соображениями по поводу языков программирования. Давайте попробуем взглянуть на множество языков как бы сверху, прикинуть направления развития, вспомнить прошлое и немного пофантазировать о будущем…

Собственно, к теме меня подтолкнула статья моего молодого (почти) коллеги Криса Касперски. Языки, которые мы потеряли. Давненько я задумываюсь о языках программирования. И периодически «вопросы познания» этих языков всплывают у меня с прочтением подобных статей.

Ровно три года назад я написал небольшую статью на эту тему: Рейтинг языков программирования. Теория и практика, где формально, с помощью цифр, тестов, рейтингов и статистики отмечал, что практикующие специалисты-программисты используют в массе своей далеко не самые эффективные языки!

Вот и в приведённой статье Криса отмечается то же самое. Только немного в плоскости анализа семантики языков. Приведу ряд полезных цитат.


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


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

Но ведь это же неправильно! Появление ракет должно перевернуть наше мышление! Поэтому — строим киоск за орбитой Плутона и каждому даем по ракете, чтобы туда летать, а горючее покупаем за деньги, вырученные от строительства космодромов и продаж ракет. Кто не может строить ракеты — пусть учит других, как на них летать. Сколько создается новых рабочих мест и главное, что все в бизнесе. Вот тут уж действительно, возврата в прошлое нет… Сигареты стоят миллиарды долларов, и деньги в индустрию вращаются просто огромные. Кто же захочет от них отказываться?! Напротив, ракеты будут стремительно «совершенствоваться», чтобы за сигаретами можно было летать даже на Альфу Центавра.

Говорите, что это нелогично и невозможно? Но ведь именно такая ситуация сложилась с Си++. Судите сами — реализация компиляторов языка Си++ очень сложная и дорогостоящая задача, а сам язык настолько обширен и объемен, что его изучение требует невероятных усилий. Чтобы окупить средства, вложенные в разработку компиляторов, фирмы вынуждены «подсаживать» на него миллионы программистов, которые, пройдя длительный (и ужасно мучительный) путь обучения Си++, просто не могут признаться себе в том, что напрасно убили десять лет своей жизни (данной человеку лишь однажды!) и что стоящие перед ними задачи с ничуть не меньшей эффективностью реализуются на чистом Си и других процедурных языках, легко осваиваемых на ходу без отрыва от производства. Вот они и начинают убеждать остальных, что процедурные языки давно мертвы. Сложность ради сложности.

Как-то так получилось, что в работе своей я частенько сталкиваюсь с различными языками/диалектами. Когда-то пытался посчитать. Насчитал более десятка. И вроде бы для каждого конкретного случая (например, программирование ПЛИС или контроллера) можно подобрать C/Cpp-подобный язык, я всё равно программировал на языке, более близком к конкретной платформе или задаче. Пытался применять C/C++! Но ничего путёвого это не приносило. Всё равно наработки сложно переносить из проекта в проект (да и бессмысленно порой, такая у меня специфика), а эффективность С/C++ на некоторых платформах бывает «ниже плинтуса» по объёму кода, по скорости, и даже по эффективности/скорости разработки!

Нет, я не сбрасываю со щитов достоинств современных популярнейших компиляторов и систем/подходов к программированию! Они себя оправдывают, вполне оправдывают. Но получается так, что по сути оправдывают больше не себя и не процесс разработки и творчества, а рыночную ситуацию. Как сказал Крис, «Сложность ради сложности». Жаль, но по сути так и получается.

***

Появляются новые платформы, усложняются процессоры (становятся многоядерными). И появляются новые клоны «популярного» С++ с новыми «граблями», «заплатками» и прочей требухой, позволяющей хоть как-то обеспечить требуемую функциональность.

«Узкие» профессионалы в своих областях продолжают работать на более эффективных паскале-, ассемблеро-, лиспоподобных языках, а армия «поклонников» упорно трудится над сборкой компиляторов и кросскомпиляторов, чтобы оправдать «убитые годы жизни».


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

И, к сожалению, новое чаще появляется не путём модификации старого, а путём приписывания/дописывания:


Если программу, написанную на процедурном языке, можно переписывать по частям, исправляя ее структуру путем декомпозиции, то с Си++ этот номер так просто не пройдет. Иерархия классов жестко задается на этапе проектирования и закладывается в программу точно железобетонный каркас, расширяемый только в одном направлении – в направлении наслаивания нового кода.

Появление более эффективного «железа», на мой взгляд, осложняется именно сложившейся ситуацией с языками программирования. Ведь ещё лет десять назад производители микроконтроллеров говорили о «С-совместимости ядер». Оно неплохо. Но это не позволяет сделать революцию, принципиальный скачок вперёд!

Задумайтесь к примеру, если забыть о всех «граблях» С++ и даже С, то легко ли будет на этих языках реализовать параллельные вычисления на каком-нибудь 4-ядерном «пне» последней конструкции? Вот сесть и накидать программку за часик, которая честно использовала бы ресурсы всех четырёх ядер? Нет, не получится. И мы это перекладываем не на программиста (кому как не ему знать о том, как более эффективно раскидать-распараллелить задачу!), а на ОС. Вот и получается, «как придётся»… Вот мы и покупаем более дорогие и производительные компьютеры, а работа более эффективной не становится…

***

Хочу задать вам, уважаемые читатели, вопрос. Как же и куда же нам двигаться в такой ситуации?
Продолжать изучать «популярные языки»?
Придумывать что-то своё?
Изучать узкую область и быть в ней ассом, но профаном в других областях?

В раздумьях и размышлениях вам могут помочь:
Рейтинг языков программирования
Эффективность языков программирования
Перлы программирования и алгоритмизации