Введение

Эзотерический язык программирования (иногда сокращенно esolang) — это язык программирования, разработанный для проверки границ проектирования языков программирования, в качестве доказательства концепции, как форма программного искусства, как интерфейс для взлома другого языка (особенно функционального или процедурного программирования), или как шутка. Использование термина "эзотерический" отличает их от языков, используемых разработчиками для написания программного обеспечения. Создатели большинства эзолангов не планируют их использование для основного программирования, хотя некоторые эзотерические особенности, такие как визуально-пространственный синтаксис, вдохновили на практическое применение в искусстве. Такие языки часто популярны среди хакеров и энтузиастов. Удобство использования редко является целью для создателей эзотерических языков программирования; зачастую их конструкция приводит к обратному результату. Их обычная задача — удалить или заменить стандартные языковые конструкции, при этом сохранив язык, являющийся Тьюринг-полным, или даже язык, для которого класс вычислительной сложности неизвестен.

История

Самым ранним и по-прежнему каноническим примером эзотерического языка программирования является INTERCAL, разработанный в 1972 году Доном Вудсом и Джеймсом М. Лионом, которые заявили, что их целью было создание языка программирования, не похожего ни на один из известных им. Он пародировал элементы распространённых языков программирования того времени, таких как Fortran, COBOL и язык ассемблера. На протяжении многих лет INTERCAL существовал лишь в виде бумажных копий руководства INTERCAL. Его возрождение в 1990 году в виде реализации на C под Unix стимулировало всплеск интереса к намеренному проектированию эзотерических компьютерных языков. В 1993 году Вутэр ван Оортмерсен создал FALSE, небольшой стеко-ориентированный язык программирования с синтаксисом, разработанным таким образом, чтобы код был изначально затемнённым, запутанным и трудночитаемым. Его компилятор имеет размер всего 1024 байта. Это вдохновило Урбана Мюллера на создание ещё более компактного языка, теперь печально известного Brainfuck, который состоит всего из восьми допустимых символов. Вместе с Befunge Криса Пресси (подобно FALSE, но с двумерным указателем команд), Brainfuck сейчас является одним из наиболее поддерживаемых эзотерических языков программирования, представляя собой канонические примеры минимальных Тьюринг-полных систем и излишне затемнённых языковых конструкций. Brainfuck связан с семейством машин Тьюринга P′′.

Общие черты

Хотя эзотерические языки программирования различаются во многом, существуют общие черты, характерные для многих из них, такие как пародия, минимализм и стремление усложнить процесс программирования. Многие эзотерические языки программирования, например brainfuck и подобные, используют отдельные символы в качестве команд, однако для некоторых языков также характерно построчное чтение, как и в традиционных языках программирования.

Уникальные представления данных

Обычные императивные языки программирования обычно позволяют хранить данные в переменных, но эзотерические языки могут использовать иные методы хранения и доступа к данным. Языки вроде Brainfuck и Malbolge допускают чтение данных только через единственный указатель, который необходимо переместить в нужную ячейку перед чтением. Другие, такие как Befunge и Shakespeare, используют один или несколько стеков для хранения данных, что приводит к стилю исполнения, напоминающему обратную польскую нотацию. Наконец, существуют языки, исследующие альтернативные формы представления чисел: вариант Brainfuck Boolfuck оперирует только с отдельными битами, а Malbolge и вариант INTERCAL TriINTERCAL полностью заменяют биты троичной системой счисления с основанием 3.

Уникальные представления инструкций

Эзотерические языки также демонстрируют уникальные способы представления программных инструкций. Некоторые языки, такие как Befunge и Piet, представляют программы в двух или более измерениях, при этом управление программой перемещается в нескольких возможных направлениях по программе. Это отличается от традиционных языков, в которых программа представляет собой набор инструкций, обычно выполняемых последовательно. Другие языки изменяют инструкции, придавая им необычный вид, часто такой, который может быть интерпретирован человеком как имеющий альтернативный смысл, отличный от лежащих в основе инструкций. Shakespeare достигает этого, оформляя все программы в виде пьес Шекспира. Chef добивается того же, представляя все программы в виде рецептов.

Трудности с чтением и письмом

Многие эзотерические языки программирования созданы для генерации кода, который глубоко затемнён, что затрудняет его чтение и написание. Это может быть сделано для того, чтобы предоставить программистам интересную головоломку или задачу: например, Malbolge был специально разработан сложным, и поэтому включает в себя самомодифицирующийся код и крайне неинтуитивные операции. Однако, объектом пародии не всегда является другой существующий язык программирования. Шекспир, например, можно рассматривать как пародию на структуру пьес Шекспира. Язык Ook! является пародией на Brainfuck, где восемь команд Brainfuck заменены различными звуками орангутанга, такими как "Ook. Ook?".

Бинарный лямбда-калькус

Бинарный лямбда-исчисление разработано с позиций алгоритмической теории информации для обеспечения максимально плотной кодировки с использованием минимальных средств, включая самоинтерпретатор размером 29 байт, сито Эратосфена для простых чисел размером 21 байт и интерпретатор Brainfuck размером 112 байт.

- Бредредред .

Brainfuck разработан для крайней степени минимализма и приводит к обфусцированному коду, с программами, содержащими только восемь различных символов. Следующая программа выводит "Hello, world!": ++++++++++[>+++++++>++++++++++>+++<<<]>++.>+.++++++++++.>++.<<+++++++++++++++.>.+++. .>+. Все символы, кроме пробелов, игнорируются.

Курица

В языке Chicken всего три токена: слово "chicken", " " (пробел) и символ новой строки. Компилятор интерпретирует количество слов "chicken" в строке как инструкцию опкода, которую он использует для манипулирования данными в стеке. Простая программа на Chicken может содержать десятки строк, состоящих из многократного повторения слова "chicken". Chicken был изобретен Торбьёрном Содерштедтом, который вдохновлялся при создании языка пародией на научную диссертацию.

Шеф-повар

Chef — это стеково-ориентированный язык программирования, созданный Дэвидом Морганом Маром, разработанный таким образом, чтобы программы напоминали рецепты приготовления блюд. Программы состоят из заголовка, списка переменных и их значений, а также списка инструкций для работы со стеком. Один из принципов разработки, сформулированный в шутливой форме, гласит, что "программные рецепты должны не только выдавать корректный результат, но и быть простыми в исполнении и приятными на вкус", а Морган Мар отмечает, что пример программы "Hello, World!" с "101 яйцом" и "111 чашками масла" произведет "очень много еды для одного человека".

ФРАКТРАН

Программа FRACTRAN представляет собой упорядоченный список положительных дробей вместе с начальным положительным целым числом в качестве входных данных. Программа выполняется путем умножения этого числа на первую дробь в списке, которая при умножении дает целое число. Затем число заменяется на результат, и правило повторяется. Если ни одна дробь в списке не дает целое число при умножении на текущее число, программа останавливается. FRACTRAN был изобретен математиком Джоном Конвеем.

ГольфСкрипт

Программы в GolfScript, языке, созданном для code golf, состоят из списков элементов, каждый из которых помещается в стек при его обнаружении, за исключением переменных, значением которых являются блоки кода, в этом случае код выполняется.

Интеркал

INTERCAL, сокращение от "Compiler Language With No Pronounceable Acronym", был создан в 1972 году как пародия, чтобы высмеять особенности различных языков программирования того времени. Он использовался в ряде атак межсайтового скриптинга (XSS) на веб-сайтах, таких как eBay, благодаря своей способности обходить фильтры обнаружения межсайтового скриптинга.

Мальболж

Мальболж (названный в честь восьмого круга ада) был разработан как самый сложный и эзотерический язык программирования. Код самомодифицируется по замыслу, и эффект инструкции зависит от её адреса в памяти.

Пиет

Piet – это язык, разработанный Дэвидом Морганом Маром, чьи программы представляют собой растровые изображения, напоминающие абстрактное искусство. Выполнение программы управляется "указателем", который перемещается по изображению, от одной сплошной цветной области к следующей. Процедуры выполняются при выходе указателя из области. Определено поведение для 20 цветов: 18 "цветных" цветов, упорядоченных по 6-шаговому циклу цветового тона и 3-шаговому циклу яркости, а также чёрный и белый, которые не упорядочены. При выходе из "цветной" области и входе в другую, выполняемая процедура определяется количеством шагов изменения цветового тона и яркости. Войти в чёрный цвет невозможно; когда указатель пытается войти в чёрную область, вместо этого изменяются правила выбора следующего блока. Если все возможные правила будут опробованы, программа завершается. Области за пределами изображения также рассматриваются как чёрные. Белый цвет не выполняет никаких операций, но позволяет указателю "проходить" сквозь него. Поведение цветов, отличных от указанных 20, определяется компилятором или интерпретатором. Язык Piet назван в честь голландского художника Пита Мондриана. Изначально планировалось назвать его Mondrian, но это имя уже было занято системой статистической визуализации данных с открытым исходным кодом.

Шекспир

Шекспир разработан для того, чтобы программы выглядели как пьесы Шекспира. Например, следующее выражение определяет точку в программе, до которой можно добраться с помощью оператора типа GOTO:

Акт I: Оскорбления и лесть Гамлета.

Рассказчик

Storyteller — это язык программирования, разработанный для того, чтобы программы выглядели как насыщенные, эмоциональные истории.

Unlambda (неограниченная)

Unlambda — это минималистичный функциональный язык программирования, основанный на SKI-исчислении, но дополненный продолжениями первого класса и императивным вводом-выводом (при этом ввод обычно требует использования продолжений).

Белые пространства

В Whitespace используются только символы пробела (пробел, табуляция и перевод строки), игнорируя все остальные символы, которые, таким образом, могут использоваться для комментариев. Это обратное тому, как устроены многие традиционные языки, которые не различают различные символы пробела, считая табуляцию и пробел эквивалентными. Это также позволяет скрывать программы на Whitespace в исходном коде программ, написанных на языках вроде C.

Культурный контекст

Культурный контекст эзолангов изучался Джеффом Коксом, который пишет, что эзоланги "смещают внимание с командно-контрольной парадигмы к культурному выражению и отрицанию", рассматривая эзоланги как нечто схожее с искусством кода и кодовой поэзией, например, mezangelle Мез Бриз, что разделяют и другие специалисты в этой области. Дэниел Темкин описывает Brainfuck как "отказ смягчать границу между человеческим выражением и ассемблерным кодом, тем самым отправляя нас в абсурдное путешествие логики", обнажая присущий конфликт между человеческим мышлением и компьютерной логикой посредством деконструкции их взаимосвязи. Он проводит параллель между программированием на эзоланге и исполнением событийной партитуры, подобной тем, что использовались в движении Fluxus, где воспроизведение нерегулярных правил логики в коде проясняет позицию языка.