Эзотерический язык программирования (иногда сокращается до esolang ) — это язык программирования, разработанный для проверки границ дизайна языков программирования, в качестве доказательства концепции , в качестве программного искусства , в качестве хакерского интерфейса для другого языка (в частности, функционального программирования или процедурных языков программирования) или в качестве шутки . Использование слова «эзотерический» отличает их от языков, которые работающие разработчики используют для написания программного обеспечения. Создатели большинства esolang не предполагают, что они будут использоваться для мейнстримного программирования, хотя некоторые эзотерические особенности, такие как визуально-пространственный синтаксис , [1] вдохновили на практическое применение в искусстве. Такие языки часто популярны среди хакеров и любителей. [ требуется цитата ]
Юзабилити редко является целью разработчиков эзотерических языков программирования; часто их дизайн приводит к совершенно противоположному. Их обычная цель — удалить или заменить традиционные языковые возможности, сохраняя при этом язык, который является полным по Тьюрингу , или даже тот, для которого вычислительный класс неизвестен.
Самым ранним и до сих пор каноническим примером эзотерического языка программирования является INTERCAL [2], разработанный в 1972 году Доном Вудсом и Джеймсом М. Лайоном, которые заявили, что их намерением было создать язык программирования, непохожий ни на один из известных им языков. [3] [4] Он пародировал элементы устоявшихся языков программирования того времени, таких как Fortran , COBOL и язык ассемблера .
В течение многих лет INTERCAL был представлен только бумажными копиями руководства INTERCAL. Его возрождение в 1990 году в виде реализации на языке C под Unix стимулировало волну интереса к преднамеренному проектированию эзотерических компьютерных языков.
В 1993 году Воутер ван Оортмерссен создал FALSE, небольшой стеко-ориентированный язык программирования с синтаксисом, разработанным для того, чтобы сделать код изначально запутанным, запутанным и нечитаемым. Его компилятор имеет размер всего 1024 байта. [5] Это вдохновило Урбана Мюллера на создание еще меньшего языка, ныне печально известного Brainfuck , который состоит всего из восьми распознаваемых символов. Наряду с Befunge Криса Пресси (похожего на FALSE, но с двумерным указателем инструкций), Brainfuck теперь является одним из наиболее поддерживаемых эзотерических языков программирования с каноническими примерами минимальных тарпитов Тьюринга и излишне запутанных языковых функций. Brainfuck связан с семейством машин Тьюринга P′′ .
Хотя эзотерические языки программирования во многом различаются, существуют некоторые общие черты, характерные для многих языков, такие как пародия, минимализм и стремление сделать программирование сложным. [6] Многие эзотерические языки программирования, такие как brainfuck и подобные, используют отдельные символы в качестве команд, однако для языков не редкость читать построчно, как и обычные языки программирования .
Обычные императивные языки программирования обычно позволяют хранить данные в переменных, но эзотерические языки могут использовать различные методы хранения и доступа к данным. Такие языки, как Brainfuck и Malbolge , позволяют считывать данные только через один указатель , который должен быть перемещен в интересующее место перед считыванием данных. Другие, как Befunge и Shakespeare , используют один или несколько стеков для хранения данных, что приводит к способу выполнения, похожему на обратную польскую нотацию . Наконец, существуют языки, которые исследуют альтернативные формы представления чисел: вариант Brainfuck Boolfuck допускает операции только с отдельными битами, в то время как вариант Malbolge и INTERCAL TriINTERCAL полностью заменяют биты троичной системой с основанием 3. [7]
Эзотерические языки также демонстрируют уникальные способы представления инструкций программы. Некоторые языки, такие как Befunge и Piet, представляют программы в двух или более измерениях, при этом управление программой перемещается в нескольких возможных направлениях по программе. [8] [ нужна страница ] Это отличается от обычных языков, в которых программа представляет собой набор инструкций, обычно встречающихся последовательно. Другие языки изменяют инструкции, чтобы они появлялись в необычной форме, часто такой, которую могут читать люди с альтернативным значением по сравнению с лежащими в основе инструкциями. Шекспир достигает этого, делая все программы похожими на пьесы Шекспира. Шеф-повар достигает того же, делая все программы рецептами. [7] Шеф-повар особенно примечателен тем, что некоторые создали программы, которые успешно функционируют и как программа, и как рецепт, демонстрируя способность языка производить это двойное значение. [9]
Многие эзотерические языки программирования разработаны для создания кода, который глубоко запутан , что затрудняет его чтение и написание. [10] Целью этого может быть предоставление интересной головоломки или задачи для авторов программ: например, Malbolge был явно разработан, чтобы быть сложным, и поэтому он имеет такие особенности, как самомодифицирующийся код и крайне контринтуитивные операции. [10] С другой стороны, некоторые эзотерические языки становятся сложными для написания из-за их других дизайнерских решений. Brainfuck привержен идее минималистского набора инструкций, поэтому, хотя его инструкции в принципе просты, возникающий код сложен для чтения человеком. Трудность INTERCAL возникает в результате выбора избегать операций, используемых в любом другом языке программирования, что вытекает из его происхождения как пародии на другие языки. [10]
Одной из целей эзотерических языков программирования является пародия или подделка существующих языков и тенденций в области программирования. [10] Например, первый эзотерический язык INTERCAL начинался как пародия на языки, используемые в 1960-х годах, такие как APL , Fortran и COBOL . Правила INTERCAL кажутся противоположностью правилам в этих других языках. [11] Однако предметом пародии не всегда является другой устоявшийся язык программирования. Например, Шекспира можно рассматривать как подделку структуры шекспировских пьес. Язык Ook! является пародией на Brainfuck , где восемь команд Brainfuck заменены различными звуками орангутанга, такими как «Ook. Ook?» [7]
Befunge позволяет указателю инструкций перемещаться в нескольких измерениях по коду. Например, следующая программа отображает «Hello World» , помещая символы в обратном порядке в стек, а затем печатая символы в цикле, который циркулирует по часовой стрелке через инструкции >
, :
, v
, _
, ,
, и ^
.
"dlroW olleH" > : v ^ , _@
Существует множество версий Befunge, наиболее распространённой из которых является Befunge-93, которая так названа, потому что была выпущена в 1993 году. [12]
Двоичное лямбда-исчисление разработано с точки зрения алгоритмической теории информации , чтобы обеспечить максимально возможную плотность кода с минимальными средствами, включая 29-байтовый самоинтерпретатор, 21-байтовое решето простых чисел и 112-байтовый интерпретатор Brainfuck. [13]
Brainfuck разработан для крайнего минимализма и приводит к запутанному коду, в программах, содержащих только восемь отдельных символов. Следующая программа выводит "Hello, world!": [14]
++++++++++ [ > +++++++ > ++++++++++ > +++ <<< - ] > ++ . > + . +++++++ .. +++ . > ++ . << +++++++++++++++ . > . +++ . ------ . -------- . > + .
Все символы, кроме , игнорируются.+-<>,.[]
Chicken имеет всего три токена: слово «chicken», « » (символ пробела) и символ новой строки. Компилятор интерпретирует количество «chickens» в строке как инструкцию кода операции, которую он использует для манипулирования данными в стеке. Простая программа chicken может содержать десятки строк, в которых нет ничего, кроме слова «chicken», повторяющегося бесчисленное количество раз. [15] Chicken был изобретен Торбьёрном Сёдерстедтом, который черпал вдохновение для языка из пародии на научную диссертацию. [16] [17] [18]
Chef — это стеко-ориентированный язык программирования, созданный Дэвидом Морган-Маром , разработанный для того, чтобы программы выглядели как кулинарные рецепты . [19] Программы состоят из заголовка, списка переменных и их значений данных, а также списка инструкций по манипулированию стеком. [20] Шуточный принцип проектирования гласит, что «рецепты программ должны не только генерировать допустимый вывод, но и быть простыми в приготовлении и вкусными», и Морган-Мар отмечает, что пример программы «Hello, World!» со «101 яйцом» и «111 чашками масла» произведет «много еды для одного человека». [20] [21]
Программа FRACTRAN представляет собой упорядоченный список положительных дробей вместе с начальным положительным целым числом на входе . Программа запускается путем умножения целого числа на первую дробь в списке, для которой является целым числом. Затем целое число заменяется на и правило повторяется. Если ни одна дробь в списке не дает целое число при умножении на , программа останавливается. FRACTRAN был изобретен математиком Джоном Конвеем . [22]
Программы на языке GolfScript, созданном для code golf , состоят из списков элементов, каждый из которых помещается в стек по мере его обнаружения, за исключением переменных, имеющих блоки кода в качестве своего значения; в этом случае код выполняется. [23]
INTERCAL , сокращение от «Compiler Language With No Pronounceable Abconym», был создан в 1972 году как пародия, высмеивающая аспекты различных языков программирования того времени. [4]
JSFuck — это эзотерический стиль программирования JavaScript , в котором код пишется с использованием всего шести символов: [
, ]
, (
, )
, !
, и +
. В отличие от Brainfuck, которому требуется собственный компилятор или интерпретатор, JSFuck — это допустимый код JavaScript, то есть программы JSFuck могут запускаться в любом веб-браузере или движке, которые интерпретируют JavaScript. [24] [25] Он использовался в ряде атак с использованием межсайтового скриптинга (XSS) на такие веб-сайты, как eBay, из-за его способности обходить фильтры обнаружения межсайтового скриптинга. [26]
LOLCODE разработан так, чтобы напоминать речь lolcats . Ниже приведен пример "Hello World":
ХАЙМОЖЕТ ЛИ ИМЕТЬ STDIO?ВИДИМОЕ «ПРИВЕТ, МИР!»ДО СПАСИБО
Хотя семантика LOLCODE не является необычной, его синтаксис описывается как лингвистический феномен, представляющий собой необычный пример неформальной речи и интернет-сленга в программировании. [27]
Malbolge (названный в честь 8-го круга Ада ) был разработан как самый сложный и эзотерический язык программирования. Среди других особенностей, код является самомодифицирующимся по замыслу, а эффект инструкции зависит от ее адреса в памяти. [28]
Piet — это язык, разработанный Дэвидом Морганом-Маром , чьи программы — это растровые изображения , которые выглядят как абстрактное искусство . [29] Выполнение направляется «указателем», который перемещается по изображению, от одной непрерывной цветной области к другой. Процедуры выполняются, когда указатель покидает область.
Существует 20 цветов, для которых указано поведение: 18 «цветных» цветов, которые упорядочены 6-шаговым циклом оттенка и 3-шаговым циклом яркости; а также черный и белый, которые не упорядочены. При выходе из «цветного» цвета и входе в другой, выполняемая процедура определяется количеством шагов изменения оттенка и яркости. Черный цвет не может быть введен; когда указатель пытается ввести черную область, вместо этого изменяются правила выбора следующего блока. Если испробованы все возможные правила, программа завершается. Области за пределами границ изображения также рассматриваются как черные. Белый цвет не выполняет операций, но позволяет указателю «проходить». Поведение цветов, отличных от указанных 20, оставлено на усмотрение компилятора или интерпретатора. [29] [ необходим неосновной источник ]
Переменные хранятся в памяти как целые числа со знаком в одном стеке . Большинство указанных процедур имеют дело с операциями в этом стеке, в то время как другие имеют дело с вводом/выводом и с правилами, по которым перемещается указатель компиляции. [30]
Пит был назван в честь голландского художника Пита Мондриана . [31] Первоначальное предполагаемое имя, Мондриан , уже было занято системой визуализации статистических данных с открытым исходным кодом . [29]
Язык программирования Shakespeare Programming Language (SPL) разработан для того, чтобы программы выглядели как пьесы Шекспира . Например, следующий оператор объявляет точку в программе, которая может быть достигнута с помощью оператора типа GOTO: [ необходима цитата ]
Акт I: Оскорбления и лесть Гамлета.
Unlambda — это минималистский функциональный язык программирования, основанный на исчислении SKI , но в сочетании с первоклассными продолжениями и императивным вводом-выводом (при этом ввод обычно требует использования продолжений). [32]
Пробелы используют только пробельные символы (пробел, табуляция и возврат), игнорируя все остальные символы, которые, следовательно, могут использоваться для комментариев. Это противоположно многим традиционным языкам, которые не различают разные пробельные символы, рассматривая табуляцию и пробел одинаково. Это также позволяет скрывать программы с пробелами в исходном коде программ на таких языках, как C. [ необходима цитата ]
Культурный контекст эсолангов изучал Джефф Кокс, который пишет, что эсоланги «переключают внимание с командования и контроля на культурное выражение и отказ», [33] рассматривая эсоланги как нечто похожее на кодовое искусство и кодовую поэзию, например, mezangelle Mez Breeze , убеждение, разделяемое другими в этой области. [34] Дэниел Темкин описывает Brainfuck как «отказ смягчить границу между человеческим выражением и ассемблерным кодом и тем самым уводя нас в нелепое путешествие логики», [35] обнажая неотъемлемый конфликт между человеческим мышлением и компьютерной логикой, деконструируя их отношения. Он связывает программирование в эсоланге с выполнением партитуры событий, такой как в движении Fluxus , где воспроизведение нерегулярных правил логики в коде делает точку зрения языка ясной. [36]
Последняя диковинка Acme, и одна из моих любимых, это Acme::Chef, реализация языка программирования Chef Дэвида Моргана-Мара. В Chef программы выражаются в форме рецептов: ...