История, порезанная тонкими ломтиками: Языки программирования. Вдоль и поперек
АрхивВсю историю компьютерной индустрии и компьютерных наук с определенной точки зрения можно представить как историю развития языков программирования.
Всю историю компьютерной индустрии и компьютерных наук с определенной точки зрения можно представить как историю развития языков программирования. Меняются времена, усложняются задачи, то, что раньше требовало человеко-лет, нынче энтузиасты делают на коленке за несколько недель; накоплена огромная масса типовых решений, типовых библиотек и типовых программистов. А создание, развитие и изменение языков программирования идет полным ходом.
Если бы "язык программирования" был всего лишь инструментом, вроде столярного, то очевидно, что за столь долгий срок (история развития языков программирования, если считать, к примеру, от первого Fortran’а, насчитывает больше полувека) должны бы возникнуть какие-то устоявшиеся "формы инструментов на каждый день" - по одной-две для каждой задачи (молоток, пила, отвертка), и дальнейшее развитие было бы лишь непринципиальным осовремениванием этих инструментов (бензопила, электропила, отвертка с моторчиком).
Но программисты - люди странные. Как правило, язык программирования они воспринимают именно как язык - в первую очередь средство для мышления и выражения мыслей, а потом уже все остальное [Классическая работа на эту тему - "Notation as a Tool of Thought" ("Нотация как способ мышления", 1979) - лекция, прочитанная автором языков APL и J Кеннетом Айверсоном при получении Тьюринговской премии]. Отсюда - великое множество языков, "языковые войны", любовь и ненависть, страх и отвращение…
И все же, несмотря на то что существуют тысячи [Если кому-то оценка "тысячи" покажется преувеличенной, порекомендуем ему посетить сайт "Энциклопедии языков программирования" http://hopl.murdoch.edu.au, где на момент написания статьи любовно каталогизированы 8512 языков программирования] языков программирования, и десятки, если не сотни из них активно использовались и используются для написания софта и обучения, - в любой период времени существует всего несколько (три-пять) языков "общеизвестных" и "используемых буквально всеми"; эту группу принято называть мэйнстримом, основным направлением и главной тенденцией индустрии. В разное время и в разных отраслях мэйнстримом считались (считаются) Fortran, C, C++, Java, C#, PHP…
Интересное свойство всех или почти всех мэйнстримовых языков - они находятся в русле одной традиции, которую можно проследить вплоть до ассемблера и машинных кодов (выполнение инструкций по порядку, оперирование с именованными ячейками памяти - то, что называется императивным программированием). Такой способ написания программ естественным образом вытекает из самой фон-неймановской архитектуры - как литературный классицизм, построенный на "стройности и логичности самого мироздания", строго блюдущий традиции, зародившиеся еще в античности.
В оппозиции к "классицистическим" языкам всегда находились языки программирования, авторы которых основывались на собственных концепциях, не желая ограничиваться "естественными для компьютера" условиями; зачастую (но не всегда) идеологическая стройность ставилась выше практичности и вообще применимости к реальным задачам. Такие, условно говоря, "модернистские" языки (Smalltalk, Lisp, Haskell, Prolog) выглядят непривычно для "традиционного" программиста, их изучение требует определенных усилий [Интересно, кстати, что существует довольно распространенное среди программистов мнение: "профессиональный программист легко и быстро освоит любой новый язык, потому что все языки, в общем-то, похожи". Как правило, к этому мнению склонны именно программисты "классицистической" школы, и в ее рамках оно действительно верно; в противоположность этому изучение совершенно незнакомого модернистского языка обычно требует немалых усилий и времени], но и значительно расширяет кругозор и заставляет изменить взгляд на программирование как таковое. "Модернистский" подход предлагает "взгляд на программирование с другой стороны" - который, как предполагается, дает программисту возможности совершенно иного уровня. Благодаря своей непривычности и концептуальной новизне, "модернистские" языки участвуют в "общем прогрессе индустрии" опосредованно: в мэйнстрим, как правило, проникают не сами языки, а их отдельные концепции и подходы.
Диффузия идей модернистских языков в программистское сообщество происходит с двух направлений - через постепенное изменение "классицистических" языков и через появление языков абсолютно новых, которые можно назвать постмодернистскими [Мы не станем дальше углубляться в искусствоведческую метафору: определения программистского рококо, романтизма, экспрессионизма, кубизма и абстракционизма оставим в качестве развлечения для читателя] (OCaml, Python, Ruby, Scala). "Постмодернистские" языки выходят за рамки стилей и парадигм, смешивая старые и новые идеи в разных пропорциях; зачастую жертвуют концептуальной целостностью ради выразительности и поливариантности возможностей. На уровне отдельных "фраз" многие из постмодернистских языков выглядят просто и понятно любому программисту, отчего их проникновение в мэйнстрим идет куда легче, чем у "более идейных" предшественников. А тем временем и сами мэйнстримовые языки стремительно впитывают новые идеи: подобно миру искусства, в мире программирования широкое наступление постмодернизма характеризуется смешением стилей и парадигм до их полной неразделимости.
Объект исследования темы этого номера - языки программирования, которые в разное время и в разных условиях предлагались и предлагаются как альтернатива привычному, мэйнстримовому, и общепринятому; их судьба, свойства и шансы. В первой обзорной статье вкратце описывается история самого мэйнстрима - без понимания перипетий смены одного языка другим рассмотрение "альтернативы" бессмысленно. Вторая статья посвящена языкам модернистским, а третья - постмодернистским. Каждая из трех частей отслеживает развитие соответствующей ветки истории; таким образом, должна получиться некая общая картина сегодняшнего состояния дел (возможно, несколько перекошенная, и наверняка неполная).
И последнее. В соответствии с главным принципом киберпанка "будущее уже здесь, просто оно неравномерно распределено" - разные течения в программировании очень трудно разделить хронологически; первый модернистский язык программирования - Lisp - один из старейших (1958 год, из общеизвестных старше только Fortran), да и очевидно постмодернистский Perl скоро справит двадцатилетний юбилей. Поэтому деление языков программирования (и темы номера) на "классицизм", "модернизм" и "постмодернизм" происходит скорее "вдоль" истории, нежели "поперек".
С этим и начнем.