О языках

2019-11-04

Я перевидал и перепробовал много языков программирования. И ещё о многих читал. И, мне кажется, языки программирования можно поделить на две большие категории. Я называю их «академические» и «инженерные».

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

Академические языки возникли для демонстранции некоей академической концепции. Сугубо теоретической изначально. Но почему-то довольно часто эти языки начинают использовать и в реальных практических задачах.

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

Basic. Создан в середине шестидесятых в Дармутском колледже Джоном Кемени и Томасом Курцем, чтобы обучать своих студентов. Академический.

Pascal. Наследник Алгола. Предок Мо́дулы. Создан Никлаусом Виртом в конце шестидесятых для популяризации хорошего стиля структурного программирования. Aкадемический.

Любопытно, что Modula-2 — это попытка Вирта сделать из Pascal модульный язык для системного программирования.

Последующие Object Pascal, Delphi, Free Pascal — это уже немного совсем другие языки.

C. В начале семидесятых Деннис Ритчи и Кен Томпсон в Bell Labs создали UNIX. Изначально эта ОС писалась на ассемблере PDP-11. Вроде как захотелось перенести ОС на PDP-7, чтобы поиграть с игрушку «Asteroids». Пришлось взять язык B и доработать его, чтобы получилось написать на нём операционную систему. Так и появился C. Инженерная задача. Инженерный.

Когда-то C был довольно низкоуровневым. Он отражал возможности железа того времени, того самого PDP-11. Отсюда и ASCIIZ строки, например. Но современные многоядерные суперскалярные процессоры уже не совсем такие, и даже совсем не такие. И C уже слишком абстрактен, чтобы программировать их эффективно.

С++. В начале восьмидесятых Бьёрн Страуструп, тоже в Bell Labs, обнаружил, что, с одной стороны, ему нужны высокоуровневые возможности (объектно-ориентированного программирования) языка Simula, с другой стороны нужно быстродействие C. Ну он и добавил ООП к C. Эта штука даже поначалу называлась «C with classes». Инженерный.

С C++ (ну точнее с Simula, по всей видимости) пошла величайшая ошибка в реализации ООП в современных языках. ООП — это про передачу сообщений между объектами. Вызов метода — это передача сообщения. А в C++, ради эффективности, решили, что это можно заменить локальным вызовом функции. И эту ошибку потащили за собой все последующие «ООП» языки программирования.

D. Создан в начале двухтысячных Уолтером Брайтом из компании Digital Mars. Позднее к разработке присоединился Андрей Александреску. Это была попытка сделать C++ с человеческим лицом. Несмотря на действительно замечательные новшества, вроде отсутствия отдельного синтаксиса для препроцессора (просто некоторые конструкции на D могут статически обрабатываться на этапе компиляции), встроенной поддержки многопоточности, вывода типов и прочее, и прочее, язык не стал популярным. Жаль. Инженерный.

Java. В середине девяностых Джеймс Гослинг в Sun Microsystems придумывал новый язык для программирования бытовых электронных устройств. Для чайников, да. Отсюда и такая крутая штука, как виртуальная машина, чтобы улучшить переносимость. Инженерный.

С чайниками сложилось не очень. Хотя в тех же чипах современных пластиковых карт таки живёт какая-то Java. Зато сложилось c серверным ПО. Ну и мобилки, со времён Java ME, и, теперь с Android, без Java как-то уже не представимы.

C#. Создан в начале двухтысячных в Microsoft как язык для платформы .NET. Во многом это Java со вкусом Microsoft. За всё время своего развития язык с радостью вбирал все красивые плюшки, появляющиеся в других языках. Может, потому он такой популярный. Инженерный.

Scala. В начале двухтысячных Мартин Одерски в федеральной политехнической школе Лозанны (EPFL) создал новый язык для JVM (и JavaScript). Идея была в том, чтобы скрестить объектно-ориентированное и функциональное программирование, а также получить язык для компонентной масштабируемой разработки (что бы это ни значило). Академический. И, имхо, слишком переусложнённый.

Kotlin. В начале дветысячидесятых компании JetBrains надоело, что Java как-то не очень развивается. И они решили сделать свой язык для JVM, который был бы попроще Scala, но более удобный для разработчиков. Руководит разработкой Андрей Бреслав. Новая Java с человеческим лицом — вполне прагматичная задача. Инженерный.

Kotlin долго не мог самоопределиться. Понятно про JVM и серверную разработку. Но также поначалу они метили в охват всего веб стека и трансляцию Котлина в JavaScript. Но внезапно Kotlin полюбился Google, и они взяли его в качестве основного языка разработки под Android. Так Котлин стал мобильным. Но хочется же охватить и другую самую популярную мобильную платформу. Так появился Kotlin Native. Kotlin подружился с LLVM и теперь может компилироваться в нативный код множества платформ.

JavaScript. В середине девяностых в Netscape решили быстренько слепить язык для внедрения в HTML страницы. И Брендан Эйх, совместно с Марком Андриссеном и Биллом Джоем, сделали такой язык. Вдохновлялись Scheme и Java. Сугубо практическая задача, простенький (на тот момент) язык. Инженерный.

Perl. Создан в конце восьмидесятых Ларри Уоллом. В основном, чтобы шерстить тексты. Как замена sed и awk. Отсюда и встроенные регулярные выражения. Это позднее он оброс модулями и стал более универсальным. Инженерный.

Python. Создан в начале девяностых Гвидо ван Россумом как развитие языка ABC (академический, для обучения программированию) для написания скриптов для ОС Amoeba. Пожалуй, инженерный.

Go. Создан в конце двухтысячных в Google Робертом Гризмером, Робом Пайком и Кеном Томпсоном. Язык был призван решать проблемы в разработке, возникшие в Google. Отсюда модульность, быстрая компиляция, отсутствие виртуальной машины, удобная модель многопоточности. Однозначно инженерный.

Lisp. Сейчас Лиспа, как одного языка, не существует. Он породил целое семейство языков. Но, тем не менее, оригинальный Лисп был создан в конце пятидесятых в MIT Джоном Маккарти. Его сделали для решения задач в области искусственного интеллекта. Это один из первых действительно высокоуровневых языков, да ещё и с автоматичесим управлением памятью и сборкой мусора. Пожалуй, инженерный. Или, всё-таки, академический? Всё же его делали для решения научных задач, а не для эффективного повелевания машинами.

Erlang. Создан в конце восьмидесятых в компании Ericsson Джо Армстронгом, Робертом Вирдингом и Майком Вильямсом. Язык создавался для управления телекоммуникационным оборудованием. У него есть своя виртуальная машина. И он реализует модель акторов и обмена сообщениями. То есть то самое правильное ООП, каким оно должно быть. Инженерный.

Haskell. Появился в начале девяностых как результат работы целого комитета по созданию открытой реализации ML. Как и положено ML, строгий чисто функциональный, со строгой системой типов с выводом типов. ML создавался для автоматического доказательства теорем. А Haskell — это язык общего назначения, построенный по тем же принципам. Академический.

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

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

история