Статьи

Откройте для себя тайный мир эзотерических языков программирования

Эзотерический язык программирования — это язык программирования, разработанный для того, чтобы бросить вызов нормам языкового дизайна. Это язык, разработанный, чтобы подчеркнуть . Смысл может быть любым: сама задача создания чего-то необычного, создания сложной шутки, создания языка как художественного выражения, тестирования многообещающих идей для программирования и т. Д.

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

Некоторые полезные понятия

Тьюринг Тарпит

Тартинг Тьюринга — это язык программирования, полный по Тьюрингу, но практически непригодный для использования. Полный по Тьюрингу язык может симулировать любую машину Тьюринга. С практической точки зрения, вы можете написать любую программу с ним. Таким образом, теоретически все такие языки одинаково мощны, но те, которые также являются тарпитом Тьюринга, делают невероятно трудным написание любой программы. Обычный способ сделать это — уменьшить количество доступных символов: попробуйте написать даже программу Hello World, содержащую всего 8 символов.

Куайн

Quine — это программа, которая выдает на выходе копию своего исходного кода. Программа не может быть пустой, даже если пустая программа является допустимой программой на определенном языке. Чтение исходного кода с диска или из памяти также считается обманом. Название «quine» было придумано Дугласом Хофштадтером в его книге « Гедель, Эшер, Бах: вечная золотая коса» в честь философа Уилларда Ван Ормана Куайна. Таким образом, концепция квина не уникальна для эзотерических языков программирования, но, тем не менее, является типичной первой проблемой, которую необходимо преодолеть при написании.

Код Гольф

Кодовый гольф — это тип соревнования, в котором цель состоит в том, чтобы написать максимально короткую программу, которая реализует определенный алгоритм. В этом контексте самый короткий означает наличие самого короткого исходного кода. Это не означает меньший размер исполняемого двоичного кода. Игра в гольф-код называется «скриптинг в гольфе». Есть также все другие виды соревнований, связанных с программированием, которые, учитывая аудиторию, часто поощряют творческий обман. Вообще говоря, вызов является мотивирующим фактором для многих эзотерических языков программирования.

затемнение

Понятие запутывания, то есть, чтобы скрыть реальное значение сообщения, очевидно, не является исключительным для эзотерических языков программирования или даже для программирования в целом. Но это имеет большое значение во многих эзотерических языках программирования. Особенно, если вы намереваетесь сделать это в более широком смысле, вводя в заблуждение или вводя в заблуждение получателя. Вы не скрываете сообщение, потому что само сообщение важно, а потому, что скрытая форма сама по себе является целью. Типичным способом достижения этого является минимизация количества символов языка, но вы также можете замаскировать язык программирования в виде обычного текста или изображения.

Недетерминизм

В этом более широком значении вводить в заблуждение или вводить в заблуждение аудиторию недетерминизм также может использоваться для достижения той же цели. Недетерминированный язык — это язык, для которого, учитывая текущее состояние программы, не всегда можно предсказать следующее состояние. Эта концепция находит некоторое применение в обычных языках программирования, в основном из-за непредсказуемых условий во время выполнения. Но это дошло до крайности некоторыми эзотерическими языками программирования, путем рандомизации переменных или даже рандомизации самих команд.

Группы эзотерических языков программирования

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

  • Языки с объективным значением , хотя это значение не обязательно является внешним или типичным. Базовым примером является язык, предназначенный для победы в соревнованиях по коду для гольфа: его ценность можно измерить, но он не имеет значения вне сообщества эзотерических языков программирования. Но более полезными являются те, которые предназначены для достижения нестандартных целей, таких как обход мер безопасности (см. JSFuck ) или для определения языков Type-0 иерархии Хомского (см. Thue ).
  • Неиспользуемые языки . Это языки, которые очень сложно использовать. Это может быть явной целью дизайнера или просто случайностью самого дизайна. Пользователь может даже найти удовольствие использовать их в течение некоторого времени. Типичный способ достичь непригодного языка, как по замыслу, так и по случайности, — это минимализм (см. Brainfuck ). Но если вы хотите что-то, что почти невозможно использовать, вам нужно что-то вроде языка, который использует троичную систему и целенаправленно самоизменяет себя, среди прочего (см. Malbolge ).
  • Языки для проверки идеи или доказательства чего-либо . Это языки, которые могут не приносить пользы, но они являются хорошим полигоном для тестирования новой концепции или того, чтобы что-то доказать. Например, язык, на котором программы расположены в двумерной сетке (см. Befunge ) или почти чистый функциональный язык (см. Unlambda )
  • Художественные языки . Это языки, разработанные с целью придания художественной ценности. Можно утверждать, что они фактически являются частью группы языков тестирования или языков с объективной ценностью. Мы относим их в другую категорию, потому что они не похожи на программирование, но они, как правило, выглядят интересно, даже если вы не хотите их использовать. Например, они выглядят как абстрактное искусство (см. Пита ) или как пьеса Шекспира (см. Шекспир ).
  • Анекдоты на языки . Это языки, придуманные людьми со странным чувством юмора. Как человек, который говорит: «Вы хотите услышать шутку? — тогда он читает «Война и мир», прежде чем заключить: «Вся наша жизнь — шутка!». Примером является сатирический язык, где даже справочное руководство — шутка (см. INTERCAL )

Некоторые известные эзотерические языки

Конечно, это не исчерпывающий список известных эзотерических языков программирования, а более скромный список немногих, известных своим успехом или особенностью.

Befunge

Основная эзотерическая особенность Befunge заключается в том, что программы расположены в двумерной сетке. Это также основанный на стеке и рефлексивный язык, поэтому он позволяет программе изменять себя. Основная цель заключалась в разработке языка, для которого было максимально сложно создать компилятор.

Первоначальная версия, которая теперь называется Befunge-93, не является завершенной по Тьюрингу, поскольку она ограничивает размер сетки 80 × 25. Но новая версия, названная Befunge-98, снимает этот предел, и он должен быть завершен по Тьюрингу. Befunge породил целый класс многомерных языков, называемый Fungeoid .

В Befunge есть команды, которые управляют направлением вверх, вниз, влево, вправо и, таким образом, могут также создавать цикл вместе с более традиционными командами для вывода, двоичных операций и т. Д.

Программа Hello Word выглядит следующим образом.

1
2
3
4
5
>              v
v  ,,,,,"Hello"<
>48*,          v
v,,,,,,"World!"<
>25*,@

Brainfuck

Вероятно, самый известный из всех эзотерических языков программирования, он отличается своим экстремальным минимализмом. Как по количеству доступных команд, так и по наличию очень маленького компилятора. Фактически, второе условие является причиной первого, потому что автор хотел создать язык с наименьшим возможным компилятором. Автор создал компилятор, который использовал только 240 байт, а иногда позже кто-то создал его всего с 100 байтами. Естественным следствием этой цели является то, что язык сложен в использовании, хотя он завершен по Тьюрингу. Короче говоря, это тарпинг Тьюринга.

Это иногда упоминается с цензурированным написанием, таким как Brainf * ck или многими другими изменениями.

Язык состоит из восьми различных команд, которые манипулируют указателем данных и двумя потоками байтов для ввода и вывода. Он также поддерживает петли. Другие символы, кроме тех, которые представляют команды, считаются комментариями и игнорируются компилятором.

Это пример того, как работает язык (взято из Esolangs wiki ).

01
02
03
04
05
06
07
08
09
10
Code:   Pseudo code:
>>      Move the pointer to cell2
[-]     Set cell2 to 0
<<      Move the pointer back to cell0
[       While cell0 is not 0
  -       Subtract 1 from cell0
  >>      Move the pointer to cell2
  +       Add 1 to cell2
  <<      Move the pointer back to cell0
]       End while

Программа Hello World выглядит следующим образом.

1
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

Если вы хотите узнать больше, вы можете увидеть на соответствующей странице Википедии или на странице Esolangs.

INTERCAL

INTERCAL, возможно, не был первым эзотерическим языком программирования , но, безусловно, первым известным. Сколько этому лет? Он был создан в 1972 году, и первая реализация была сделана с перфокартами. Язык задумывался как пародия, но также и для создания чего-то совершенно нового, чуждого миру программирования. Название не является аббревиатурой, по мнению авторов:

Полное название компилятора — «Язык компилятора без произнесенной аббревиатуры», которое по понятным причинам сокращено до «INTERCAL».

Остальная часть справочного руководства INTERCAL (формат PS) также полна бессмысленных или юмористических высказываний. Это как для языка, который они описывают, так и для того, как они это делают. Например, это раздел о переменных

INTERCAL допускает только 2 различных типа переменных: 16-разрядное целое и 32-разрядное целое число. Эти
представлены точкой (.) или двумя точками (:) соответственно, за которыми следует любое число от 1 до 65535,
включительно. Эти переменные могут содержать только неотрицательные числа; таким образом, они имеют соответствующие диапазоны
значения: от 0 до 65535 и от 0 до 4294967295. Примечание: .123 и: 123 — две разные переменные. С другой стороны,
.1 и .0001 идентичны. Кроме того, последний не может быть записан как 1E-3.

Язык также позволяет использовать модификатор PLEASE. Однако это также требует использования соответствующего количества этого ключевого слова. Он не может быть использован слишком мало или слишком много, то есть вам нужно показать правильное количество вежливости. Действительно несмешной частью является то, что это была недокументированная функция в оригинальном руководстве. Руководство по шутке для руководства по шутке может быть в порядке, но то, что оно неполное, недопустимо.

Это Hello World в версии INTERCAL, реализованной с помощью C: C-INTERCAL.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
DO ,1 <- #13
PLEASE DO ,1 SUB #1 <- #238
DO ,1 SUB #2 <- #108
DO ,1 SUB #3 <- #112
DO ,1 SUB #4 <- #0
DO ,1 SUB #5 <- #64
DO ,1 SUB #6 <- #194
DO ,1 SUB #7 <- #48
PLEASE DO ,1 SUB #8 <- #22
DO ,1 SUB #9 <- #248
DO ,1 SUB #10 <- #168
DO ,1 SUB #11 <- #24
DO ,1 SUB #12 <- #16
DO ,1 SUB #13 <- #162
PLEASE READ OUT ,1
PLEASE GIVE UP

Короче говоря, INTERCAL — очень сложная шутка. Такая шутка, которая может заставить вас восхищаться его создателем за его настойчивость или сомневаться в его разумности, или, может быть, и в том, и в другом.

JSFuck

Успех Brainfuck стимулирует создание многих производных языков , слишком много, чтобы упоминать их все. Но самый известный из них — JSFuck .

JSFuck не является подходящим языком, но это скорее эзотерический стиль программирования Javascript, который требует использования только 6 символов. Получающиеся программы являются действительными программами JavaScript, и фактически они были изобретены для обхода таких методов безопасности, как обнаружение вредоносных программ. Его свойства сделали его также полезным для запутывания кода.

Это работает, потому что вы можете оценить любое выражение в Javascript как любой тип. Таким образом, [] представляет и пустой массив, но, добавив к нему + вы можете заставить его оценивать как число 0. Чтобы получить букву, такую a вы можете манипулировать значением false и т. Д. Конечный результат — чрезвычайно многословный язык: эквивалент alert("Hello World!") имеет длину 22948 символов.

Malbolge

Malbolge — это язык, специально разработанный для того, чтобы его было практически невозможно использовать: «с помощью нелогичной« сумасшедшей операции », арифметики основы три и самоизменяющегося кода», по словам своего создателя. На самом деле даже автор никогда не писал рабочую программу с ним. Первая программа была сгенерирована другой программой, в которой реализован эвристический алгоритм поиска. Этот язык не является полным по Тьюрингу, и он также основан на неправильном написании Малебольга , восьмого круга ада в «Адском фильме» Данте Алигьери. Так что это действительно не имеет никакого качества выкупа.

Я не буду пытаться описать это, потому что все это явно упражнение в разочаровании. Однако стоит упомянуть «сумасшедшую операцию», которую стоит упомянуть: шифрование. Язык должен работать на троичной виртуальной машине и имеет три регистра, один из которых содержит указатель на текущую инструкцию и называется , После выполнения инструкции по модулю 94 значения в заменяет все, что есть в затем результат шифруется в соответствии с таблицей шифрования. Добро пожаловать в ад, действительно.

Какая-то храбрая душа создала программу Hello World.

1
(=<`#9]~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc

болтушка

Пит — это язык, на котором программы представлены в виде картин абстрактного искусства в стиле Пита Мондриана. Он основан на стеке и завершен по Тьюрингу.

Есть 18 цветов, упорядоченных по оттенку и яркости, а также черный и белый. Последние два имеют особое значение и используются для управления потоком. При выполнении программы используются два «указателя»: указатель направления и средство выбора цветового блока. DP может указывать вверх, вниз, влево и вправо, в то время как CC может указывать только влево и вправо. Комбинация этих двух указателей управляет выполнением программы: в основном, какой блок цвета выполняется следующим. Размер блока цвета представляет собой целое число. Когда программа выполняет переход между разными блоками цвета, их различие в оттенках и яркости определяет тип выполняемой команды. Это обычные команды, такие как вывод значения, умножение и т. Д.

У программы Hello World есть определенная красота.

Hello World in Piet от Томаса Шоха

Шекспир

Шекспир — это язык, созданный так: « красивый исходный код, похожий на пьесы Шекспира ». В языке мало команд, и он функционально похож на язык ассемблера, но неудивительно, что он довольно многословен.

Переменные должны быть объявлены в начальном разделе, а их имена должны быть действительными шекспировскими символами, такими как Ромео или Джульетта. Эти переменные являются стеками, над которыми позже будут выполняться такие операции, как pop, push и input / output. Название действий и сцен работает как метки goto и назначение определенных условных операторов. Символы, то есть переменные, должны вызываться на сцене для манипулирования, и на сцене может быть только два персонажа одновременно.

Линии обычно представляют числовые константы: некоторые существительные и прилагательные преобразуются в числовые значения.

1
2
3
4
5
Hamlet:
 You lying stupid fatherless big smelly half-witted coward!
  
Juliet:
 You are as villainous as the square root of Romeo!

Специальные слова, такие как «Помни», или их комбинации, такие как «Говори своим умом», выполняют команды. Это обычные команды, такие как вставка значений в символ стека, вывод значения текущей переменной или соответствующего символа ASCII.

Условное утверждение представлено вопросом от одного символа и ответом от другого символа, который определяет, куда идти, если условие вопроса оценивается как истинное.

1
2
3
4
5
Juliet:
 Am I better than you?
  
Hamlet:
 If so, let us proceed to scene III.

Привет Мир так же длинен и продуктивен, как пьеса Шекспира.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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]
  
                    Scene II: The praising of Juliet.
  
[Enter Juliet]
  
Hamlet:
 Thou art as sweet as the sum of the sum of Romeo and his horse and his
 black cat! Speak thy mind!
  
[Exit Juliet]
  
                    Scene III: The praising of Ophelia.
  
[Enter Ophelia]
  
Hamlet:
 Thou art as lovely as the product of a large rural town and my amazing
 bottomless embroidered purse. Speak thy mind!
  
 Thou art as loving as the product of the bluest clearest sweetest sky
 and the sum of a squirrel and a white horse. Thou art as beautiful as
 the difference between Juliet and thyself. Speak thy mind!
  
[Exeunt Ophelia and Hamlet]
  
  
                    Act II: Behind Hamlet's back.
  
                    Scene I: Romeo and Juliet's conversation.
  
[Enter Romeo and Juliet]
  
Romeo:
 Speak your mind. You are as worried as the sum of yourself and the
 difference between my small smooth hamster and my nose. Speak your
 mind!
  
Juliet:
 Speak YOUR mind! You are as bad as Hamlet! You are as small as the
 difference between the square of the difference between my little pony
 and your big hairy hound and the cube of your sorry little
 codpiece. Speak your mind!
  
[Exit Romeo]
  
                    Scene II: Juliet and Ophelia's conversation.
  
[Enter Ophelia]
  
Juliet:
 Thou art as good as the quotient between Romeo and the sum of a small
 furry animal and a leech. Speak your mind!
  
Ophelia:
 Thou art as disgusting as the quotient between Romeo and twice the
 difference between a mistletoe and an oozing infected blister! Speak
 your mind!
  
[Exeunt]

Thue

Thue — это язык программирования, основанный на системе переписывания строк, называемой системой полу-Thue. Он недетерминирован и следует парадигме программирования ограничений. Это означает, что переменные определены в терминах ограничения (например, что-то имеет значение true или false). Это тарпинг Тьюринга.

В случае с Thue цены затрат представлены списком правил замещения в форме:

1
<string>::=<replacement>

Специальные форматы этой формы представляют ввод, вывод или окончание списка правил.

Недетерминированная природа языка может быть показана указанием двух возможных замен одной и той же строки. Например:

  • вы пишете правило, которое говорит, что строку a можно заменить на stupid
  • вы также пишете правило, которое гласит, что строка a может быть заменена на you are

Когда программа выполняется, строка a может быть заменена любым из двух вариантов.

За списком правил следует строка, представляющая начальное состояние.

Хотя написание полезной программы может быть трудным, типичный Hello World довольно прост и понятен, по крайней мере, по стандарту эзотерических языков программирования.

1
2
3
a::=~Hello World!
::=
a

Unlambda

Unlambda — это (почти) чисто функциональный язык, предназначенный для демонстрации чисто функционального языка (и, возможно, насколько это непрактично). Он основан на комбинаторной логике . Это полный Тьюринга и первый функциональный брезент Тьюринга. Он опирается на несколько функций, оператор применения ` (символ обратной кавычки), а также поддерживает ввод / вывод. Технически это работает только для функций с одним аргументом, но функции с несколькими аргументами могут быть преобразованы в последовательность функций .

Программа Hello World выглядит почти читабельно.

1
r```````````.H.e.l.l.o. .w.o.r.l.di

Другие интересные эзотерические языки

Fugue — это язык, который использует MIDI-файлы в качестве исходного кода. Интервалы между каждой нотой переводятся в конкретные традиционные команды, такие как ввод / вывод или сложение.

Beatnik — это стековый язык, состоящий из серии английских слов; пробелы и знаки препинания игнорируются. Слова преобразуются в традиционные команды в соответствии с их значением в игре Scrabble.

Пробел — это язык шуток, в котором допустимы только пробельные символы, такие как символы табуляции и пробелы, а любые другие символы игнорируются. Это, конечно, обратное обычному поведению компиляторов, которые игнорируют пробелы. Учитывая эти характеристики, его можно использовать в программе Polyglot, то есть в программе, которая подходит для нескольких языков. Пока другой язык не является Python, или любой другой язык, где пробелы имеют значение.

GolfScript — это конкатенирующий язык программирования, предназначенный для победы в соревнованиях по коду-гольфу, который также является полным по Тьюрингу.

Снежинка — это обратимый самоизменяющийся язык, в котором интерпретатор и программа модифицируются при каждом запуске.

FRACTRAN — это язык, на котором программы представляют собой список дробей и начальный номер. Я не уверен, что он делает, но он что-то делает, поскольку у него есть страница в Википедии.

Йота и Йот — это два официальных языка, каждый из которых предназначен для простейшей формальной системы. По своей природе они также могут считаться одинаково минималистскими, тьюринговскими тарпитами, языками программирования. Оба используют только два символа и выполняют две операции. Преемник, называемый Zot, также поддерживает ввод / вывод.

Энтропия — очень точно названный язык программирования, разработанный, чтобы принять идею отказа от контроля. Любые выходные данные программы будут аппроксимированы, и каждый раз, когда к данным обращаются, они произвольно изменяются. Язык не изменяет исходную программу, поэтому при каждом запуске вывод будет отличаться, но исходное состояние будет сохраняться. Любопытным побочным эффектом рандомизации данных является Drunk Eliza , веб-версия классической программы Eliza, в которой психотерапевт кажется пьяным.

Моничелли — это шутка языка по мотивам комедийного фильма « Мои друзья» . Типичная программа выглядит как серия бессмысленных итальянских фраз. Удивительно, но это имеет смысл, поскольку фильм, используемый в качестве вдохновения, также содержит бессмысленные фразы. Это круг безумия.

Резюме

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

Если вы хотите узнать больше или принять участие в этом сообществе, я предлагаю взглянуть на Esolangs . Этот веб-сайт вместе с Википедией является источником большинства примеров, представленных в этой статье. Там вы также можете найти вдохновение в списке идей для эзотерического языка программирования .

Вы также можете найти интересный блог Марка Чу-Кэрролла в его многочисленных воплощениях за эти годы. Как следует из названия « Хорошая математика», «плохая математика» в основном посвящена математике. Тем не менее, он также имеет много анализов эзотерических языков программирования в серии под названием патологическое программирование (язык). Вы можете увидеть, например, тот, который посвящен наименьшему языку программирования .

Ссылка: Откройте для себя тайный мир эзотерических языков программирования от нашего партнера по JCG