Несмотря на то, что программирование прочно вошло в нашу жизнь, многим оно до сих пор кажется какой-то совершенно непонятной магией. Что уж говорить о прежних временах, когда даже простой процесс хакинга в кино изображали с разными психоделическими спецэффектами, чтобы достичь «вау-эффекта».
Но в IT всегда были люди, которым мало «обычного» хардкорного кода, и они начали изобретать собственные, иногда совершенно безумные и оригинальные эзотерические языки программирования. О них мы сегодня и поговорим.
Кому вообще пришло это в голову?
Как ни удивительно, но первый эзотерический язык программирования, INTERCAL, появился еще в 1972 году, почти одновременно с первым мейнстримовым (Язык C был разработан Деннисом Ритчи в 1969—1973 годах).
Создатели этого странного детища, Дон Вудс и Джеймс М. Лайон заявляли впоследствии, что просто хотели разработать язык, который бы не был похож ни на один из существовавших на тот момент (а их на самом деле было не так много). Некоторые элементы из Fortran, COBOL и ассемблера пародировались в открытую. Балаган начинался уже с названия:
Полное название нашего компилятора [sic] — «Язык Компилирования, Который Нельзя Сократить До Удобной Аббревиатуры» (Compiler Language With No Pronounceable Acronym) или, для удобства, сокращенно INTERCAL.
Дон Вудс и Джеймс М. Лайон
INTERCAL был первым в своем роде, но остался только на бумаге в качестве мануала, который многие воспринимали как шутку. Реально на нем ничего не программировали до начала 1990-х годов, когда Эрик С. Реймонд (автор термина open source) на волне интереса к эзотерическим языкам имплементировал INTERCAL в C и показал, что он на самом деле работает.
Пример базового кода «Hello, World!» на INTERCAL
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
Есть языки-обфускаторы, которые маскируют свой код, соответственно, под пьесы Шекспира (Shakespeare) или под рецепты блюд (Chef). Читается это невероятно увлекательно (особенно когда Офелия начинает ругаться с Джульеттой и забываешь, что все имена — это переменные).
«Hello, World!» на Shakespeare
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.
Prince 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]
«Hello, World!» на Chef
Hello World Cake with Chocolate sauce.
This prints hello world, while being tastier than Hello World Souffle. The main chef makes a " world!" cake, which he puts in the baking dish. When he gets the sous chef to make the "Hello" chocolate sauce, it gets put into the baking dish and then the whole thing is printed when he refrigerates the sauce. When actually cooking, I'm interpreting the chocolate sauce baking dish to be separate from the cake one and Liquify to mean either melt or blend depending on context.
Ingredients.
33 g chocolate chips
100 g butter
54 ml double cream
2 pinches baking powder
114 g sugar
111 ml beaten eggs
119 g flour
32 g cocoa powder
0 g cake mixture
Cooking time: 25 minutes.
Pre-heat oven to 180 degrees Celsius.
Method.
Put chocolate chips into the mixing bowl.
Put butter into the mixing bowl.
Put sugar into the mixing bowl.
Put beaten eggs into the mixing bowl.
Put flour into the mixing bowl.
Put baking powder into the mixing bowl.
Put cocoa powder into the mixing bowl.
Stir the mixing bowl for 1 minute.
Combine double cream into the mixing bowl.
Stir the mixing bowl for 4 minutes.
Liquefy the contents of the mixing bowl.
Pour contents of the mixing bowl into the baking dish.
bake the cake mixture.
Wait until baked.
Serve with chocolate sauce.
chocolate sauce.
Ingredients.
111 g sugar
108 ml hot water
108 ml heated double cream
101 g dark chocolate
72 g milk chocolate
Method.
Clean the mixing bowl.
Put sugar into the mixing bowl.
Put hot water into the mixing bowl.
Put heated double cream into the mixing bowl.
dissolve the sugar.
agitate the sugar until dissolved.
Liquefy the dark chocolate.
Put dark chocolate into the mixing bowl.
Liquefy the milk chocolate.
Put milk chocolate into the mixing bowl.
Liquefy contents of the mixing bowl.
Pour contents of the mixing bowl into the baking dish.
Refrigerate for 1 hour.
Есть очень странные языки, основанные на принципе самокопирования, например изобретенный в 1994 году Крисом Пресси язык SMETANA (Self-Modifying Extremely Tiny AutomatoN Application), работающий на серии шагов с двумя инструкциями. В 2016 году Таннером Светтом была создана его модификация «Сметана до бесконечности» (SMETANA To Infinity!).
Пример синтаксиса «Сметаны»
Smetana ::= Step {".\n" Step} ".".
Step ::= "Step" Integer "." (GoTo | Swap).
GoTo ::= "Go" "to" "step" Integer.
Swap ::= "Swap" "step" Integer "with" "step" Integer.
Integer ::= "0".."9" {"0".."9"}.
Пример синтаксиса «бесконечной Сметаны»
Program ::= {Step "."}
Step ::= "Step" Expression "." (GoTo | Swap | Output | "Stop")
GoTo ::= "Go" "to" "step" Expression
Swap ::= "Swap" "step" Expression "with" "step" Expression
Output ::= "Output" "character" Expression
Expression ::= Number | [Number] "n" ["+" Number]
Что именно происходит
Эзотерический язык программирования — язык программирования, разработанный для исследования границ возможностей разработки языков программирования (спасибо за тавтологию, Википедия). Это в каком-то смысле метаязык, который позволяет исследовать и сам себя и сами возможности исследования.
В случае с эзотерическими языками программирования заново, как в первый раз, программист изучает следующие темы:
— Как устроен язык отдачи команд.
— Как работать не по принципу максимального удобства, а с другими целями (например, чтобы было красиво или максимально зашифрованно).
— Как команды взаимодействуют между собой.
— Как на все это влияет фактор рандома.
— Как достичь простого результата максимально сложными целями.
Создание таких языков требует проницательности и креативности, что позволяет разработчикам лучше осознать собственные когнитивные рамки и привычные паттерны мышления, которые часто ограничивают способность к инновациям. Погружение в мир экзотических языков помогает раскрыть новые способы решения проблем и выход за пределы привычных методик, осознать, что программирование может быть не только функциональным, но и художественным процессом.
Это наверное похоже на изучение второго иностранного языка (причем хардкорного вроде китайского или немецкого), когда основные столбы и несущие балки логических конструкций отрываются от земли и перемешиваются, чтобы составить очень странный, но работающий каркас, в котором все по-другому.
Зачем это нужно?
Во-первых, потому что это весело. Для многих программистов-экспериментаторов fun — сам по себе достаточная мотивация, чтобы создать нечто странное. Во-вторых, потому, что это позволяет раздвинуть рамки и показать, что возможности человеческого креативного гения гораздо шире, чем можно себе представить. В-третьих, потому что это очень весело (да!).
Вот крутое определение от TechInsider:
Основной критерий, который определяет эзотеричность языка программирования довольно субъективен – это уровень доведения до абсурда отдельных идей, свойств или ограничений, что делает такие языки непригодными для массовой продуктовой разработки.
Цели создания ЭЯП напрямую следуют из их определения. Мы знаем ЭЯП, созданные для подтверждения или опровержения концепций, и те, которые были созданы в целях высокого искусства программирования. В таких случаях ЯП выступает средством художественной выразительности, показателем уровня мастерства художника, программиста или разработчика формальных языков.
На самом деле эзотерических языков программирования сейчас уже так много, что глаза разбегаются, и классифицировать это богатство довольно сложно. Можно начать с разделения на две большие группы: тьюринг-полные языки (то есть, «настоящие» языки программирования, на которых теоретически можно написать что угодно, хотя иногда это будет ОЧЕНЬ сложно) и специально ограниченные языки, которые представляют собой скорее пародии или приколы с целью что-то продемонстрировать.
К первой категории относится вышеупомянутый INTERCAL, самый известный из эзотерических языков Brainfuck (о нем подробнее ниже) и ряд других, им подобных структурно.
Ко второй — например, HQ9+, который состоит всего из четырех базовых команд (каждая из них вызывается символом, входящим в название языка): 1) вывод сообщения «Hello, world!»; 2) демонстрация исходного кода программы; 3) вывод на экран текста американской застольной песни «99 Bottles of Beer on the Wall» и 4) увеличение на единицу счетчика (который больше ничего не делает и никак не используется).
У HQ9+ есть, кстати, еще и модификации: в HQ9++ после команды ++ создается некий объект (к которому у пользователя нет доступа), а в HQ9± при использовании оператора «-», в зависимости от его местонахождения, запускается одна из заведомо «катастрофических» операций (например, деление на ноль или бесконечная рекурсия до переполнения стека).
В общем, основная мотивация разработчиков эзотерических языков: чтобы было как можно больше абсурда, веселья и сложности, и желательно, чтобы при этом все еще и реально работало. Поаплодируем этим героям.
Если «нормальные языки» программирования ориентированы на понятность и удобство, то отважные экспериментаторы отвергают подобные плебейские ценности и наоборот — создают языки, на которых максимально неудобно, нелогично и иногда практически невозможно программировать.
Одним словом, полный…
Brainfuck
Несомненно самым ярким (в силу своей меметичности) примером эзотерического языка, можно даже сказать витриной всего движения, следует считать разработанный в 1993 году Урбаном Мюллером язык Brainfuck (переводить, вероятно, не требуется).
В языке всего восемь команд, каждая из которых записывается одним символом. Дополнительный синтаксис отсутствует. Нет копирования значения, промежуточной памяти, операторов, арифметики, нет вообще ничего — хотя все эти ограничения можно обойти очень хитрым способом изнутри самого языка.
Вот как выглядит «Hello, world!» на брейнфаковском:
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.>>>++++++++[<++++>-]
<.>>>++++++++++[<+++++++++>-]<---.<<<<.+++.------.--------.>>+.>++++++++++.
Brainfuck можно назвать классическим примером «тьюринговской трясины» — несмотря на ужас, который вы испытываете при взгляде на этот код, язык вполне рабочий, и на нем можно программировать. Просто это очень долго и сложно и в целом как-то противоестественно.
Хотя, конечно, не так долго, сложно и противоестественно, как в некоторых других эзотерических языках, вдохновленных безумным экспериментом Brainfuck.
Следующие уровни ада
Как насчет «орангутанского» языка Ook!, который на первый взгляд состоит только из одного этого слова?
«Hello, world!» на Ook!
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook. Ook? Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook! Ook? Ook! Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook! Ook.
Или вы предпочитаете «поздороваться с миром» на коровьем (COW)?
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO Moo MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MoO MoO
MoO MoO MoO MoO MoO Moo Moo MoO MoO MoO Moo OOO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MOo
MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo
MOo MOo MOo MOo MOo Moo MOo MOo MOo MOo MOo MOo MOo MOo Moo MoO MoO MoO Moo MOo MOo MOo MOo MOo MOo Moo MOo MOo MOo MOo MOo MOo MOo MOo Moo
OOO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo
Можно постараться дойти вообще до корней и вернуться к двоичному выводу с языком Spoon
1111110010001011111111111101100000110100010100101111111111001000101111111111011000001101
0100101011111110010100010101110010100101111001000101111111111101100000110100010100111110
0100010000000000000011000001101000101001101101101101111100100010111110110000011010001010
0100100010101110010100000000000000000000010100000000000000000000000000010100100101001010
Или, допустим, оставить только точки и тире как в reMorse
— — — ..- ...-.---.;newline
— — — .-. — ..-.- ...-. ---.;!
— — — ...-.. -.---.;d
----... -.---.;l
----.. -...---.;r
----. -...---.;o
----...-.- ..-. ---.;W
(omitted code for «Hello » is similar to the above for «World!»)
-..............;output all characters
Но это все попытки максимально упростить сам код на выводе (при усложнении его программирования).
А кто вообще сказал, что код должен быть легким? Может наоборот сделать его как можно более сложным?!
Пучина
В 1998 году Бен Олмстед придумал Malbolge — самый сложный эзотерический язык программирования в мире. Это чудовище получило название от «Malebolge», восьмого круга ада Данте, и сейчас станет ясно, почему.
Вот Hello, World на Malbolge:
(=<`:9876Z4321UT.-Q+*)M'&%$H"!~}|Bzy?=|{z]KwZY44Eq0/{mlk**hKs_dG5[m_BA{?-Y;;Vb'rR5431M}/.zHGwEDCBA@98\6543W10/.R,+O<
А еще вот:
('&%:9]!~}|z2Vxwv-,POqponl$Hjig%eB@@>}=<M:9wv6WsU2T|nm-,jcL(I&%$#"`CB]V?Tx<uVtT`Rpo3NlF.Jh++FdbCBA@?]!~|4XzyTT43Qsqq(Lnmkj"Fhg${z@>
Или вот:
(=<`#9]~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc
Если вы скажете, что эти три строчки выглядят как совершенно разные, причем рандомные и бессмысленные наборы символов, вас никто не осудит.
Но оно работает. Работающий куайн (самовывод кода) был написан 3 декабря 2012 года, через 14 лет после создания самого языка. Что,как бы само по себе, говорит о многом.
Вот выдержка из одной старой статьи на Хабре о принципах работы Malbolge:
В Malbolge есть три регистра: a, c и d. Регистр c – регистр кода, используемый в качестве указателя на текущую команду. Регистр d – регистр данных, используемый для управления данными. Регистр a – аккумулятор, также используемый некоторыми командами для манипуляции данными.
В Malbolge есть 8 команд. Машина определяет, какую команду выполнять, следующим образом: к значению ячейки с адресом c ([c]) прибавляется значение c, а в качестве команды выступает остаток от деления этого числа на 94, если [C] не входит в диапазон от 33 до 126 включительно.
А вот собственно список команд:
j D = [D] Сдвигает указатель данных в ячейку, на которую указывало его прошлое значение
i C = [C] Сдвигает указатель инструкций в ячейку, на которую указывало его прошлое значение
* A = [D] = ROTATE([D]) Циклически сдвигает значение в ячейке, на которую указывает D, на один трит вправо. Попутно это значение записывается в A.
p A = [D] = CRAZY(A, [D]) Применяет операцию crazy к значению регистра A и ячейки, на которую указывает D.
/ A = INPUT Читает один символ из потока ввода и сохраняет его в A.
< PRINT A Выводит на печать символ с ASCII-кодом A mod 256.
v STOP Завершить выполнение программы.
o NOP Команда, которая не делает ничего (единственная допустимая).
После выполнения каждой инструкции она шифруется операцией Crazy.
Очень сложный и нечитаемый код это победа! Отлично, этого мы достигли.
А может быть… для программирования вообще не нужен видимый код???
Повелители пустоты
Поприветствуем Whitespace, эзотерический язык программирования, в котором вообще нет ни одного символа, кроме пробелов (технически это три разных символа: пробел, табуляция и перевод строки).
Как раз недавно на Хабре была хорошая статья про основы того, как он устроен.
Пример «Hello, World!» на Whitespace (чтобы было хоть что-то понятно, S обозначает место пробела, T — Табуляции и L — перевода строки).
Куда идти еще дальше? Что может быть более пустым, чем файл, открыв который, пользователь ничего увидит?
Например, отсутствие файлов как таковых.
Дэниел Темкин, владелец прекрасного блога https://esoteric.codes/ создал эзотерический язык программирования Folders, вдохновившись Whitespace. По его задумке, программирование в этом языке вообще не требует файлов, нужно лишь дерево папок файловой системы, структура которого и определяет код.
Let that sink in, а пока посмотрите, как выглядит «Hello, World!» на Folders.
Эту картинку я взял из еще одной прекрасной забытой статьи на Хабре.
Там же, кстати, рассказывается и про язык Groot, который, как уже догадались все смотревшие фильмы Marvel, состоит только из вариаций фразы I am Groot.
«Hello, World!» на грутовском
I AM GROOT
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
I'm Groot
I am groot
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
I AM GROOT
I am Groot
We are Groot
I am groot
I AM GROOOT
I AM GROOT
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
I'm Groot
I am groot
i am groot
i am groot
i am groot
i am groot
I AM GROOT
I am Groot
We are Groot
I am groot
i am groot
I AM GROOOT
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
I AM GROOOT
I AM GROOOT
i am groot
i am groot
i am groot
I AM GROOOT
I AM GROOT
I AM GROOT
I AM GROOT
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
I'm Groot
I am groot
i am groot
i am groot
i am groot
i am groot
I AM GROOT
I am Groot
We are Groot
I am groot
I AM GROOOT
I AM GROOT
I AM GROOT
I AM GROOT
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
I'm Groot
I am groot
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
i am groot
I AM GROOT
I am Groot
We are Groot
I am groot
I am Groot
I am Groot
I am Groot
I AM GROOOT
I am groot
I am groot
I am groot
I am groot
I AM GROOOT
i am groot
i am groot
i am groot
I AM GROOOT
I am Groot
I am Groot
I am Groot
I am Groot
I am Groot
I am Groot
I AM GROOOT
I am Groot
I am Groot
I am Groot
I am Groot
I am Groot
I am Groot
I am Groot
I am Groot
I AM GROOOT
I AM GROOT
I AM GROOT
i am groot
I AM GROOOT
А можно, чтобы картиночкой?
Можно.
Есть целая огромная категория графических эзотерических языков (они же two-dimensional languages, осторожно, по ссылке практически бесконечная бездна ада).
Самый известный из них Piet, который превращает своего программиста практически в модернистского художника начала XX века (вот отличная старая статья про язык на Хабре).
Модель языка содержит три элемента: программа является двухмерным изображением, составленных из пикселей. Последние могут быть любого цвета. В программе участвуют только 20.
В Piet есть блоки. Это связные множества пикселей одного цвета. Блок — минимальная часть в построении текста программ. Группы пикселей, которые соответствуют одному блоку при увеличении, — это кодел. Увеличение необходимо для детального рассмотрения и точности.
Память Пита организована в виде стека. Тип данных языка — целые числа. Это единственный тип. Обработка символов происходит в виде их ASCII-кодов.
Вот как выглядит Hello, World! на Piet:
А чтобы только звук?
Можно и со звуком.
Вот язык Velato, в котором программы закодированы в виде MIDI-файла, считываемого компилятором.
И многое, многое другое
Перечислить все эзотерические языки программирования не хватит никакой статьи.
Есть вот шестиугольные соты языка Hexagony. Название происходит от слов «hexagon» (шестиугольник) и «agony» (агония), потому что ха-ха-ха, вы и так догадались уже, наверное, Господь всемогущий, помоги нам:
Кто-то вот окончательно оторвался от бренной земли и двигает код в четырехмерном пространстве (в языке 4DL для представления программы используется четырехмерная решетка с 8 направлениями выполнения):
Есть очень странный язык Bit, который «обрабатывает все данные так же, как язык C обрабатывает строки».
Маленький фрагмент (!) «Hello, World!» на Bit
LINENUMBERZEROCODEPRINTZEROGOTOONELINENUMBERONECODEPRINTONEGOTOONEZEROLINENUMBE
RONEZEROCODEPRINTZEROGOTOONEONELINENUMBERONEONECODEPRINTZEROGOTOONEZEROZEROLINE
NUMBERONEZEROZEROCODEPRINTONEGOTOONEZEROONELINENUMBERONEZEROONECODEPRINTZEROGOT
OONEONEZEROLINENUMBERONEONEZEROCODEPRINTZEROGOTOONEONEONELINENUMBERONEONEONECOD
EPRINTZEROGOTOONEZEROZEROZEROLINENUMBERONEZEROZEROZEROCODEPRINTZEROGOTOONEZEROZ
EROONELINENUMBERONEZEROZEROONECODEPRINTONEGOTOONEZEROONEZEROLINENUMBERONEZEROON
EZEROCODEPRINTONEGOTOONEZEROONEONELINENUMBERONEZEROONEONECODEPRINTZEROGOTOONEON
EZEROZEROLINENUMBERONEONEZEROZEROCODEPRINTZEROGOTOONEONEZEROONELINENUMBERONEONE
ZEROONECODEPRINTONEGOTOONEONEONEZEROLINENUMBERONEONEONEZEROCODEPRINTZEROGOTOONE
ONEONEONELINENUMBERONEONEONEONECODEPRINTONEGOTOONEZEROZEROZEROZEROLINENUMBERONE
ZEROZEROZEROZEROCODEPRINTZEROGOTOONEZEROZEROZEROONELINENUMBERONEZEROZEROZEROONE
CODEPRINTONEGOTOONEZEROZEROONEZEROLINENUMBERONEZEROZEROONEZEROCODEPRINTONEGOTOO
Кто-то из хабровцев придумывает свои собственные странные языки, например, вдохновившись узелковым письмом индейцев кипу (интересно, как сейчас дела у его автора?):
Пример Quipu
a: a.
'H <<
'e
'l
'l
'o
'
'W
'o
'r
'l
'd
'!
\n
Вот здесь же, на Хабре, старая и явно заслуживающая внимания статья с примерами 39 кодов на 39 ЭЯП (некоторые из них мы уже упоминали выше).
Зачем все это надо
Хороший вопрос. Ну, во-первых (как уже было много раз сказано), это весело. Даже сама попытка разобраться в совершенно новой программной логике, не говоря уже про ее разработку, весьма сильно расширяет когнитивные навыки.
Да, для приземленных практических задач, эзотерические языки, как правило заведомо бесполезны — зачем делать что-то долго и сложно, если можно сделать это быстро и просто, правда? Но ведь в качестве протеста против подобной бизнес-логики многие из ЭЯП и создавались — чтобы можно было оглядеться по сторонам и вспомнить, что эффективность и скорость, несмотря на то, что они делают хороший KPI — не единственное и не самое интересное в жизни.
А что интересное? Ну, например, узнавать и создавать новое, мыслить out of the box. Опять же тренировочный фактор: работа с такими странными языками неплохо прокачивают мозги. А все, что прокачивает наши мозги, это, как известно, хорошо.
Хочется напоследок сказать спасибо авторам всех опубликованных ранее прекрасных статей на Хабре, посвященных теме ЭЯП, которые мы прочитали для вдохновения и информации перед написанием собственной!
Список использованной хабросетературы:
Самые неординарные языки программирования
5 самых странных языков программирования: для чего они нужны и что на них можно написать
Malbolge: Programming from Hell
Примеры кода на 39 эзотерических языках программирования
Quipu — эзотерический язык программирования на основе узелковой письменности Инков
5-минутный гид по эзотерическим языкам программирования: попробуем их классифицировать