Эволюционно нынешние 'главные языки' ушли бесконечно далеко от машинных кодов. Накопление парадигм и подходов (а равно и снижение актуальности 'простой модели компьютера', которая лежит в основе императивного программирования) практически исчерпало потенциал 'классического', структурно- императивного взгляда на программирование, который в сегодняшних компонентных приложениях узнается с трудом. Что придет ему на смену? - этот вопрос мы пытаемся рассмотреть в заключительной статье темы.
Следует упомянуть и еще несколько языковых проектов, вполне классицистических, вполне успешных, но стоящих слегка на отшибе от 'главного исторического вектора'.
Во-первых, это юниксовский sh и его производные (bash, ksh, csh и далее со всеми остановками). Первые оболочки *nix-систем ведут свой род от Алгола; юниксовский подход к объединению маленьких самостоятельных утилит считается одним из первых примеров компонентно-ориентированного программирования. Среди отдаленных потомков sh - как постмодернистский Perl (о нем мы еще поговорим), так и безусловно классицистический Tcl (а о нем не будем).
Во-вторых, язык веб-программирования PHP - тоже вполне популярен и вполне классицистичен. Его часто называют среди наследников Perl, но от последнего PHP перенял в основном способ именования переменных и область применения; в остальном первые PHP - это почти чистый C (вплоть до имен библиотечных функций). Небывалый успех PHP - это успех не языка программирования (часто критикуемого за концептуальную уродливость), а успех утилиты для легкой разработки веб-приложений. Так и повелось.
Хроники чистого разума
Императивная парадигма программирования ('сделай то; потом сделай это; если А, сделай Б') не только наиболее естественна для современного компьютера, но и легко воспринимается человеком: простые программы на языках вроде Паскаля без труда пишут и читают пятиклассники. Но такая 'естественность' совершенно не значит, что императивный способ - единственно возможный.
Любая большая система на C или Fortran содержит медленную, плохо продуманную, с кучей ошибок реализацию половины Common Lisp.
…включая сам Common Lisp.
Практически во всех областях человеческого знания существует некий 'естественный', 'самоочевидный' подход (от уже неоднократно помянутого литературного классицизма до летательного аппарата, машущего крыльями). Но по мере развития и взросления человеческого подхода к этой области появлялись альтернативные варианты 'как это делать', жертвующие 'естественностью и понятностью' ради 'чистого искусства', или 'идеологической стройности', или 'практической необходимости'. Зачастую новые подходы оказывались даже единственно верными ('аппарат, летающий как птица' так и не был построен, а 'противоестественные' самолеты, вертолеты и дирижабли - пожалуйста).
Если смотреть на голую идею программы-как-текста и программирования-как-творчества, отвлекаясь от того печального факта, что 'все это надо как-то превратить в машинные коды', то можно прийти к нескольким разным ментальным моделям разной степени абстрактности. Любая из них имеет право на жизнь и, будучи воспринятой, зачастую 'открывает новые горизонты восприятия'. Неудивительно, что языков программирования, исходящих из таких вот 'абстрактных моделей' и оттого совсем не похожих и друг на друга, и на линейку Fortran-C-Java, - вагон и маленькая тележка.
Появление таких языков часто порождает целые новые течения в 'программировании-как- искусстве' - соратников, ненавистников, эпигонов и экспериментаторов; но до поры до времени эти течения оставались далеки от 'широких масс'. Дальше мы пройдемся с широкой сетью по самым заметным из них.
Так много дурацких скобок [Lot of silly parenthesis - 'куча глупых скобок' - старинная шуточная расшифровка названия языка Lisp]
Lisp (1958) построен вокруг идеи 'всё есть список'. Всё - здесь действительно значит всё, в том числе и сама программа: Lisp заложил основы восприятия кода программы как данных, которые сама же программа может изменить. Отсюда - бесконечно гибкий синтаксис, превращаемый во что угодно с помощью синтаксических макросов, в свою очередь породивший идею 'языков внутри языка' (удобных нотаций для конкретных задач) и способствующий развитию у лисперов взгляда свысока - 'что такое может ваш язык программирования, что мы на макросах не сделаем?'. Отсюда же, из Лиспа, тянется ниточка (целый канат) к идеям функционального программирования (см. ниже).
Глобальность идеи и легкость реализации Лиспа способствовало образованию многочисленного сообщества 'фанатов', использовавших любимый язык где ни попадя. В качестве внутреннего макроязыка разновидности Lisp встроены в Emacs и AutoCAD; одно из первых серьезных веб-приложений (viaweb) было написано на нем. За сорок лет споры о деталях и особенностях, практичности и чистоте привели к появлению бесчисленного множества диалектов, главные - Scheme (более изящный, используется в основном в учебе [До недавнего времени знаменитый курс MIT 'Структура и интерпретация компьютерных программ' использовал именно Scheme. Месяц назад Scheme вроде бы заменили на Python. Times, they are changing]) и Common Lisp (в каком-то смысле более практичный, но и менее стройный), есть и 'более экстремистские', вроде маленького-практичного newLISP или сверх-концептуально-чистого Qi.
Бывает так: сначала ты 'снаружи', вокруг все очень обычное, очень знакомое и скучное. А потом мимо проносится Белый Кролик, при часах и при жилете. Дальше известно что: погоня, несколько минут свободного падения вниз по кроличьей норе - и ты уже 'внутри', а из привычного и знакомого остался только ты сам, да и это ненадолго. Такие переживания - когда за поворотом вдруг распахивается целый