Магия или коды: что такое эзотерические языки программирования и зачем их создают
Эзотерические языки программирования (ЭЯП) — это особая категория языков, которые разработаны не для промышленных целей, а, например, для исследования границ возможностей разработки или проверки, можно ли реализовать некоторую идею. К ЭЯП также относят языки — произведения искусства или «шутки» — по аналогии с «шутками» и «фантазиями» великих композиторов. Например, «Шутка» Баха из Сюиты № 2 написана в легкой и озорной манере: такого Баха средний слушатель практически не знает. Современные композиторы, такие как Майк Олдфилд или Жан-Мишель Жар пошли дальше и фактически исследовали границы искусства, объединяя и сочетая казалось бы несочетаемые вещи: народные, классические и электронные инструменты, свет и цвет (вслед за Скрябиным, конечно). Послушайте, например, ставший культовым альбом Олдфилда Tubular Bells.
Нельзя сказать, что есть «обычные» языки программирования, а есть необычные – эзотерические. Все ЯП могут классифицироваться по-разному: они бывают низкого (Ассемблер) и высокого уровня (Python), или, например, допускающие безопасное и небезопасное управление памятью. Основной критерий, который определяет эзотеричность языка программирования довольно субъективен – это уровень доведения до абсурда отдельных идей, свойств или ограничений, что делает такие языки непригодными для массовой продуктовой разработки.
Цели создания ЭЯП напрямую следуют из их определения. Мы знаем ЭЯП, созданные для подтверждения или опровержения концепций, и те, которые были созданы в целях высокого искусства программирования. В таких случаях ЯП выступает средством художественной выразительности, показателем уровня мастерства художника, программиста или разработчика формальных языков. Например, существует язык Shakespeare, программа на котором выглядит как стихотворное произведение в стиле пьесы Уильяма Шекспира, где команды выражены обращениями одного персонажа к другому.
Программистское суеверие, ставшее традицией – начинать знакомство с языком программирования выводом на печать фразы «Hello, world!». По этой ссылке можно посмотреть, как будет выглядеть подобная программа на десятках самых разных эзотерических ЯП.
Особенно выделим некоторые из них. Во-первых, это еще один поэтический язык — Haifu, программы на котором выглядят как хокку. Он создавался, чтобы обратить внимание на отсутствие восточной философии в широко применяемых языках программирования, таких как С или Java. Этот язык не оперирует стандартными понятиями истины (True) и лжи (False) – вместо их разработчику придется работать с критериями Инь и Ян – при отсутствии их баланса программа просто не будет работать.
Дальше в этот список можно включить знаменитый Brainfuck: скорее всего, без информации об этом языке вам будет сложно поддержать разговор в научно-технической компании. В Brainfuck «Hello, world!» можно вывести на печать двумя способами: кодом в 33 строки, либо магией в одну.
Наиболее забавные программы, конечно, получаются на языках, ставящих задачей минимизировать синтаксис. Существует интересный язык Whitespace, который довел эту идею до абсолютного абсурда – в качестве управляющих конструкций в нем используются непечатаемые символы: пробел, новая строка и табуляция, то есть без выделения человек не может увидеть, что на экране вообще что-то написано.
Из группы графических ЭЯП выделимPiet, названный в честь художника Пита Мондриана. Кстати, этот язык создан тем же человеком, что и язык Haifu – Дэвидом Морган-Маром из Австралии. Программы на Piet выглядят как холсты абстрактных изображений. Так в нем выглядит «Hello, world!».
Иногда языки создаются в практических и научных целях, под задачи проверки концепций математики или теоретической информатики. Пример такого языка –Unlambda. Программирование делится на императивное, где задаются четкие алгоритмы, и декларативное, к которому и относится функциональное программирование в широком смысле, где функции понимаются в математическом смысле, почти как в школе: «зависимость y от x». Язык Unlambda – это «чистый функциональный язык», который построен вокруг единственного типа данных –функции.
Заметим, что эзотеричность языка вовсе не препятствует его полноте или неполноте по Тьюрингу. При своей лаконичности Unlambda полон по Тьюрингу, то есть с его помощью может быть реализована любая вычислимая функция в контексте конкретного формального вычислителя. Сейчас предполагается, что современные ЯП полны по Тьюрингу, что является критерием их отличия от языков запросов и языков разметки. И, например, SQL – полный по Тьюрингу язык, а вот HTML – язык разметки, и понятие полноты по Тьюрингу к нему не применимо.
Наверное, самая важная задача ЭЯП – это заставит программиста выйти за рамки и расширить собственные представления об основном инструменте своей работы. Кажется, что ЭЯП позволяют максимально прочувствовать концепцию и саму концепцию ЯП, а также ключевые посылы теории формальных языков. Теория формальных языков – это фундаментальная база разработки ЯП. То есть это теория того, как сделать ЯП и оттранслировать написанное на нем в машинное представление. С этой точки зрения интересны многомерные ЭЯП, потому что сама идея представить себе многомерные пространства хороша для тех, кто много работает с абстракциями разного уровня. Получается, что использовать многомерный язык можно как тренажер для развития конкретного полезного навыка.
Если бы я создавала ЭЯП, то он бы был литературного направления – я поклонница словесной формы. Например, мне кажется, что язык, позволяющий писать программы стиле русских былин, был бы интересным вариантом. Возможно, что он уже существует, но мне пока не встречался.
Учтите, что если вы хотите написать свой язык, то потребуется овладеть теорией формальных языков и грамматик, а также основами трансляции. До сих пор лучшим введением считается знаменитый труд «Компиляторы: принципы, технологии и инструменты» — классический учебник по теории построения компиляторов под авторством Альфреда В. Ахо, Рави Сетхи и Джеффри Д. Ульмана, известный также как «Книга дракона» (из-за обложки). Еще есть полезный сайт со множеством наработок – все вместе это точно поможет «победить дракона».