Эзотерические языки программирования (или esolang — сокращение от esoteric language) — это языки, созданные не только для того, чтобы писать код. В одном из наших материалов мы вскользь поднимали эту тему — там описывался язык BANCStar (строго говоря, на 100% «эзотерическим» его назвать нельзя, хотя и хочется).
В этом материале подробнее остановимся на том, как можно классифицировать эзотерические ЯП: что отличает «шуточные» эзотерические языки от «серьезных», какие цели могут преследовать их создатели и что вдохновляет последних.
Фото Markus Spiske PD
Произведение искусства или шутка, головоломка или тайный шифр — все эти определения относятся к эзотерическим языкам программирования. Такие языки создаются с разными целями, однако «разработка удобного инструмента для решения рабочих задач программиста» в их перечень обычно не входит.
По словам архитектора программного обеспечения Федерико Томассетти (Federico Tomassetti), эзотерический язык программирования разрабатывается с целью бросить вызов «нормам» проектирования ЯП. Вызов этот может выражаться по-разному: от простого стремления к чему-то необычному до создания полноценного «художественного произведения». Попробуем разобраться, что это могут быть за вызовы и как в этой связи можно поделить все многообразие эзотерических языков на группы.
Важный момент: авторы многих эзотерических языков стремятся заложить в их синтаксис и структуру как можно больше отличий (от всего, что было создано в этой сфере ранее). Поэтому любая классификация эзотерических ЯП — это, скорее, возможность разобраться в том, как, почему и с какими целями создавались языки, нежели попытка создать строгую и упорядоченную систему.
Наиболее очевидный подход к разделению эзотерических языков на группы — в соответствии с тем, являются ли они тьюринг-полными: можно ли (хотя бы в теории) с помощью языка реализовать любую вычислимую функцию или нет. Одним из Тьюринг-полных языков является, например INTERCAL. На сайте американского программиста, хакера и сооснователя Open Source Initiative Эрика Рэймонда (Eric S. Raymond, ESR), INTERCAL описан как «разработанный с целью добиться полноты по Тьюрингу и максимальной непохожести на существующие языки программирования».
Благодаря этим особенностям INTERCAL, по словам ESR, способен «вызвать слезы (смеха) у сильных мужчин» и является «центром международного сообщества техномазохистов».
Несмотря на свой шуточный характер, INTERCAL оказался не только «жизнеспособным» (если это понятие применимо к эзотерическим языкам), но и стал основой для создания многих других эзотерических ЯП.
С другой стороны, среди эзотерических языков (в силу их особенностей) есть и неполные по Тьюрингу языки. Такие, например, как HQ9+, имеющий всего 4 команды (из них как раз и составлено название языка). Этот шуточный язык позволяет без труда решить все «стандартные» задачи начинающего программиста: от «Hello, world!» (команда H) до вывода квайна (команда Q).
Однако даже полнота по Тьюрингу не означает, что эзотерический язык можно с легкостью использовать в работе. Среди эзотерических языков довольно часто встречаются «тьюринговские трясины» — языки, обладающие полнотой по Тьюрингу, но при этом имеющие ограниченный (и даже бедный) синтаксис и семантику.
В теории они имеют те же возможности, что и любые тьюринг-полные языки (как эзотерические, так и рабочие), однако в связи с ограничениями реализовать некоторые виды программ с их помощью крайне сложно. INTERCAL, кстати, часто относят к «трясинам». Еще один пример — другой не менее популярный эзотерический ЯП Brainfuck. Чтобы представить, насколько сложны могут быть достаточно простые операции с использованием таких языков, вот пример классического «Hello, world!» на Brainfuck (существуют и другие варианты реализации, в том числе более короткие):
Федерико Томассетти выделяет несколько «целевых групп» эзотерических языков. Среди них, например:
1. Языки, призванные решить конкретную задачу
Не всегда эта задача является общепризнанно важной, однако для создателя языка и сообщества его единомышленников она имеет ценность — а значит, ценен и язык, который помогает ее решить. К таким можно отнести Thue (назван в честь норвежского математика Акселя Туэ) — язык, созданный как демонстрация нулевого типа в иерархии Хомского (кстати, он тоже относится к «тьюринговским трясинам»).
2. «Запутывающие языки» или языки-черные ящики
Они призваны сделать код максимально нечитаемым для непосвященных и затруднить написание кода. Наиболее яркая особенность «черных ящиков» — обфускация, то есть намеренное сокрытие истинного значения того или иного участка кода. К таким, например, относится Malbolge (назван в честь восьмого круга ада Данте, куда попадают, в том числе, разного рода обманщики). Свидетельством его сложности может служить хотя бы то, что работающий квайн на Malbolge был написан через 14 лет после создания языка, вторая версия — еще через 3 года.
С другой стороны, есть и более «гуманные» примеры подобных языков. В частности — все тот же BANCStar, который к рабочим языкам программирования можно отнести с большой натяжкой. Как говорит разработчик Джо Логри (Joe Loughry), к 1997 году на этом языке писали программы не более десятка человек по всему миру, а всего на BANCStar было написано порядка 1350 программ — практически эзотерический язык, который, тем не менее, был разработан в коммерческих целях. Одна из этих целей как раз и заключалась в том, чтобы чувствительная банковская информация была под надежной защитой (комментировать код разработчикам было категорически запрещено).
3. Языки, созданные для подтверждения жизнеспособности определенной концепции
Сами по себе эти языки могут быть неудобными и нефункциональными, но тем не менее, они — неопровержимое свидетельство того, что концепция имеет право на существование. К таким языкам можно отнести, например, семейство языков Funges, использующее многомерные представления программ.
Эзотерические языки программирования можно классифицировать в том числе и «по интересам их авторов»: многие из этих интересов и увлечений нашли отражение в синтаксисе и особенностях языков.
1. Кино
Один из наиболее популярных примеров эзотерических языков, вдохновленных кино в целом (и научной фантастикой в частности) является язык var’aq. Он был создан Брайаном Коннорсом (Brian Connors), поклонником вселенной «Звездного пути» и представляет собой «язык, основанный на хакерской культуре расы клингонов».
По словам автора, само название var’aq на клингонском ничего не значит, но язык мог бы быть назван так в честь какого-нибудь популярного клингонского математика (примерно как Pascal). Синтаксис и особенности языка, по замыслу автора, отражают специфический тип мышления и менталитет клингонов.
Среди эзотерических языков программирования популярны и другие кино-примеры. В частности, язык, использующий в качестве синтаксиса фразы Арнольда Шварценеггера, или Groot, названный в честь персонажа «Стражей Галактики» (синтаксис этого языка вполне предсказуем).
2. Литература
Еще один источник вдохновения для создателей эзотерических языков программирования — книги. Наверное, один из наиболее показательных примеров «литературного» синтаксиса в программировании — язык Shakespeare. Авторы языка — Карл Хассельстрем (Karl Hasselström) и Джон Аслунд (Jon Åslund), пишут, что решили создать его в рамках работы по курсу синтаксического анализа. За несколько недель до этого они познакомились с другими эзотерическими языками программирования и придумали совместить задание по курсу, знания об эзотерических языках, а также своеобразный шекспировский стиль.
В итоге появился язык, позволяющий превратить любую программу в драматическое произведение, герои которого выходят на сцену и (преимущественно) наносят друг другу самые разные оскорбления. Каждая программа содержит название и акты, которые, в свою очередь, делятся на сцены (все как в настоящей пьесе). Вот, например, отрывок из драмы «Hello world», акт первый, сцена первая (всего в «Hello World» 2 акта, первый состоит из двух, второй — из трех сцен):
3. Изобразительное искусство
Пожалуй, самый известный пример эзотерического языка, вдохновленного живописью — Piet, названный в честь Пита Мондриана, одного из родоначальников абстрактной живописи. Программный код в Piet выглядит как абстрактный рисунок, составленный из 20 различных цветов — примеры работы программистов на Piet можно посмотреть здесь.
Кстати, некоторые из разработчиков настолько вдохновляются своими творениями, что решают увековечить их на холсте — так, например, сделал Джек Андерсен, нарисовавший свою программу в процессе работы. Подробнее о Piet можно прочесть в этом материале на Хабре.
Еще один язык, использующий цвета и названный в честь художника — Matisse (модификация Brainfuck). Другой «чрезвычайно эзотерический» язык программирования, связанный с искусством, — Magritte. На нем написана только одна программа — в стиле сюрреализма Рене Магритта — из-за чего язык относят к нефункциональным и шуточным (об этой категории чуть ниже).
Иногда «языки-шутки» выделяют в отдельную группу. Вики-портал esolang, посвященный эзотерическим языкам, описывает шуточные языки как «не представляющие интереса — за исключением их юмористической составляющей», а также «совершенно неподходящие для программирования даже в теории, банальные и менее интересные версии существующих эзотерических языков». Тем не менее, один только список шуточных языков на esolang насчитывает более 130 наименований.
С другой стороны, к шуточным языкам иногда относят и более сложные, признанные эзотерические ЯП. Например INTERCAL, весь мануал по которому представляет шутку: во введении, в частности, подчеркивается, что «все совпадения языков программирования, описанных здесь, с другими языками программирования, живыми или мертвыми, случайны».
Как правило, каждый эзотерический язык можно классифицировать сразу несколькими способами — по тьюринг-полноте, целям и задачам (если таковые четко обозначены), по привязке к художественным произведениям и даже по чувству юмора создателей языка. В конце концов, эзотерические языки для того и создаются, чтобы нарушать все правила — в том числе и правила классификации.
Во второй части нашего пятиминутного гида попробуем выяснить, какие эзотерические языки имеют больше всего поклонников среди разработчиков, и зачем вообще они разрабатываются.
В этом материале подробнее остановимся на том, как можно классифицировать эзотерические ЯП: что отличает «шуточные» эзотерические языки от «серьезных», какие цели могут преследовать их создатели и что вдохновляет последних.
Фото Markus Spiske PD
Пара слов об эзотерических ЯП
Произведение искусства или шутка, головоломка или тайный шифр — все эти определения относятся к эзотерическим языкам программирования. Такие языки создаются с разными целями, однако «разработка удобного инструмента для решения рабочих задач программиста» в их перечень обычно не входит.
По словам архитектора программного обеспечения Федерико Томассетти (Federico Tomassetti), эзотерический язык программирования разрабатывается с целью бросить вызов «нормам» проектирования ЯП. Вызов этот может выражаться по-разному: от простого стремления к чему-то необычному до создания полноценного «художественного произведения». Попробуем разобраться, что это могут быть за вызовы и как в этой связи можно поделить все многообразие эзотерических языков на группы.
Важный момент: авторы многих эзотерических языков стремятся заложить в их синтаксис и структуру как можно больше отличий (от всего, что было создано в этой сфере ранее). Поэтому любая классификация эзотерических ЯП — это, скорее, возможность разобраться в том, как, почему и с какими целями создавались языки, нежели попытка создать строгую и упорядоченную систему.
Какие бывают варианты классификации
Полнота по Тьюрингу
Наиболее очевидный подход к разделению эзотерических языков на группы — в соответствии с тем, являются ли они тьюринг-полными: можно ли (хотя бы в теории) с помощью языка реализовать любую вычислимую функцию или нет. Одним из Тьюринг-полных языков является, например INTERCAL. На сайте американского программиста, хакера и сооснователя Open Source Initiative Эрика Рэймонда (Eric S. Raymond, ESR), INTERCAL описан как «разработанный с целью добиться полноты по Тьюрингу и максимальной непохожести на существующие языки программирования».
Благодаря этим особенностям INTERCAL, по словам ESR, способен «вызвать слезы (смеха) у сильных мужчин» и является «центром международного сообщества техномазохистов».
Несмотря на свой шуточный характер, INTERCAL оказался не только «жизнеспособным» (если это понятие применимо к эзотерическим языкам), но и стал основой для создания многих других эзотерических ЯП.
С другой стороны, среди эзотерических языков (в силу их особенностей) есть и неполные по Тьюрингу языки. Такие, например, как HQ9+, имеющий всего 4 команды (из них как раз и составлено название языка). Этот шуточный язык позволяет без труда решить все «стандартные» задачи начинающего программиста: от «Hello, world!» (команда H) до вывода квайна (команда Q).
Однако даже полнота по Тьюрингу не означает, что эзотерический язык можно с легкостью использовать в работе. Среди эзотерических языков довольно часто встречаются «тьюринговские трясины» — языки, обладающие полнотой по Тьюрингу, но при этом имеющие ограниченный (и даже бедный) синтаксис и семантику.
В теории они имеют те же возможности, что и любые тьюринг-полные языки (как эзотерические, так и рабочие), однако в связи с ограничениями реализовать некоторые виды программ с их помощью крайне сложно. INTERCAL, кстати, часто относят к «трясинам». Еще один пример — другой не менее популярный эзотерический ЯП Brainfuck. Чтобы представить, насколько сложны могут быть достаточно простые операции с использованием таких языков, вот пример классического «Hello, world!» на Brainfuck (существуют и другие варианты реализации, в том числе более короткие):
+++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++.+++++++++++++++++
++++++++++++.+++++++..+++.-------------------
---------------------------------------------
---------------.+++++++++++++++++++++++++++++
++++++++++++++++++++++++++.++++++++++++++++++
++++++.+++.------.--------.------------------
---------------------------------------------
----.-----------------------.
Цели создания языка
Федерико Томассетти выделяет несколько «целевых групп» эзотерических языков. Среди них, например:
1. Языки, призванные решить конкретную задачу
Не всегда эта задача является общепризнанно важной, однако для создателя языка и сообщества его единомышленников она имеет ценность — а значит, ценен и язык, который помогает ее решить. К таким можно отнести Thue (назван в честь норвежского математика Акселя Туэ) — язык, созданный как демонстрация нулевого типа в иерархии Хомского (кстати, он тоже относится к «тьюринговским трясинам»).
2. «Запутывающие языки» или языки-черные ящики
Они призваны сделать код максимально нечитаемым для непосвященных и затруднить написание кода. Наиболее яркая особенность «черных ящиков» — обфускация, то есть намеренное сокрытие истинного значения того или иного участка кода. К таким, например, относится Malbolge (назван в честь восьмого круга ада Данте, куда попадают, в том числе, разного рода обманщики). Свидетельством его сложности может служить хотя бы то, что работающий квайн на Malbolge был написан через 14 лет после создания языка, вторая версия — еще через 3 года.
С другой стороны, есть и более «гуманные» примеры подобных языков. В частности — все тот же BANCStar, который к рабочим языкам программирования можно отнести с большой натяжкой. Как говорит разработчик Джо Логри (Joe Loughry), к 1997 году на этом языке писали программы не более десятка человек по всему миру, а всего на BANCStar было написано порядка 1350 программ — практически эзотерический язык, который, тем не менее, был разработан в коммерческих целях. Одна из этих целей как раз и заключалась в том, чтобы чувствительная банковская информация была под надежной защитой (комментировать код разработчикам было категорически запрещено).
3. Языки, созданные для подтверждения жизнеспособности определенной концепции
Сами по себе эти языки могут быть неудобными и нефункциональными, но тем не менее, они — неопровержимое свидетельство того, что концепция имеет право на существование. К таким языкам можно отнести, например, семейство языков Funges, использующее многомерные представления программ.
Источники вдохновения
Эзотерические языки программирования можно классифицировать в том числе и «по интересам их авторов»: многие из этих интересов и увлечений нашли отражение в синтаксисе и особенностях языков.
1. Кино
Один из наиболее популярных примеров эзотерических языков, вдохновленных кино в целом (и научной фантастикой в частности) является язык var’aq. Он был создан Брайаном Коннорсом (Brian Connors), поклонником вселенной «Звездного пути» и представляет собой «язык, основанный на хакерской культуре расы клингонов».
По словам автора, само название var’aq на клингонском ничего не значит, но язык мог бы быть назван так в честь какого-нибудь популярного клингонского математика (примерно как Pascal). Синтаксис и особенности языка, по замыслу автора, отражают специфический тип мышления и менталитет клингонов.
Среди эзотерических языков программирования популярны и другие кино-примеры. В частности, язык, использующий в качестве синтаксиса фразы Арнольда Шварценеггера, или Groot, названный в честь персонажа «Стражей Галактики» (синтаксис этого языка вполне предсказуем).
2. Литература
Еще один источник вдохновения для создателей эзотерических языков программирования — книги. Наверное, один из наиболее показательных примеров «литературного» синтаксиса в программировании — язык Shakespeare. Авторы языка — Карл Хассельстрем (Karl Hasselström) и Джон Аслунд (Jon Åslund), пишут, что решили создать его в рамках работы по курсу синтаксического анализа. За несколько недель до этого они познакомились с другими эзотерическими языками программирования и придумали совместить задание по курсу, знания об эзотерических языках, а также своеобразный шекспировский стиль.
В итоге появился язык, позволяющий превратить любую программу в драматическое произведение, герои которого выходят на сцену и (преимущественно) наносят друг другу самые разные оскорбления. Каждая программа содержит название и акты, которые, в свою очередь, делятся на сцены (все как в настоящей пьесе). Вот, например, отрывок из драмы «Hello world», акт первый, сцена первая (всего в «Hello World» 2 акта, первый состоит из двух, второй — из трех сцен):
The Infamous Hello World Program.
Romeo, a young man with a remarkable patience.
Juliet, a likewise young woman of remarkable grace.
Ophelia, a remarkable woman much in dispute with Hamlet.
Hamlet, the flatterer of Andersen Insulting A/S.
Act I: Hamlet's insults and flattery.
Scene I: The insulting of Romeo.
[Enter Hamlet and Romeo]
Hamlet:
You lying stupid fatherless big smelly half-witted coward!
You are as stupid as the difference between a handsome rich brave
hero and thyself! Speak your mind!
You are as brave as the sum of your fat little stuffed misused dusty
old rotten codpiece and a beautiful fair warm peaceful sunny summer's
day. You are as healthy as the difference between the sum of the
sweetest reddest rose and my father and yourself! Speak your mind!
You are as cowardly as the sum of yourself and the difference
between a big mighty proud kingdom and a horse. Speak your mind.
Speak your mind!
[Exit Romeo]
3. Изобразительное искусство
Пожалуй, самый известный пример эзотерического языка, вдохновленного живописью — Piet, названный в честь Пита Мондриана, одного из родоначальников абстрактной живописи. Программный код в Piet выглядит как абстрактный рисунок, составленный из 20 различных цветов — примеры работы программистов на Piet можно посмотреть здесь.
Кстати, некоторые из разработчиков настолько вдохновляются своими творениями, что решают увековечить их на холсте — так, например, сделал Джек Андерсен, нарисовавший свою программу в процессе работы. Подробнее о Piet можно прочесть в этом материале на Хабре.
Еще один язык, использующий цвета и названный в честь художника — Matisse (модификация Brainfuck). Другой «чрезвычайно эзотерический» язык программирования, связанный с искусством, — Magritte. На нем написана только одна программа — в стиле сюрреализма Рене Магритта — из-за чего язык относят к нефункциональным и шуточным (об этой категории чуть ниже).
Шуточные языки
Иногда «языки-шутки» выделяют в отдельную группу. Вики-портал esolang, посвященный эзотерическим языкам, описывает шуточные языки как «не представляющие интереса — за исключением их юмористической составляющей», а также «совершенно неподходящие для программирования даже в теории, банальные и менее интересные версии существующих эзотерических языков». Тем не менее, один только список шуточных языков на esolang насчитывает более 130 наименований.
С другой стороны, к шуточным языкам иногда относят и более сложные, признанные эзотерические ЯП. Например INTERCAL, весь мануал по которому представляет шутку: во введении, в частности, подчеркивается, что «все совпадения языков программирования, описанных здесь, с другими языками программирования, живыми или мертвыми, случайны».
Как правило, каждый эзотерический язык можно классифицировать сразу несколькими способами — по тьюринг-полноте, целям и задачам (если таковые четко обозначены), по привязке к художественным произведениям и даже по чувству юмора создателей языка. В конце концов, эзотерические языки для того и создаются, чтобы нарушать все правила — в том числе и правила классификации.
Во второй части нашего пятиминутного гида попробуем выяснить, какие эзотерические языки имеют больше всего поклонников среди разработчиков, и зачем вообще они разрабатываются.