На Хабре выходило много статей про эзотерические языки программирования: про самые неординарные, про 5 наиболее странных, примеры кода на 39 эзотерических языках. Как раз когда я готовил этот текст, появился панорамный обзор по теме. Меня это не остановило, потому что хотелось зайти с другой стороны — какие культовые фильмы, группы, песни, книги и авторы вдохновляли создателей ЭЯП. Об этом и хочу рассказать в статье.

Эзотерические языки — зачем они нужны?

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

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

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.

Самые известные эзоланги

Одним из старейших эзолангов считается INTERCAL. Его придумали в 1972 году студенты Дон Вудс и Джеймс Лайон как пародию на существующие языки программирования. Уже в названии была заложена шутка — INTERCAL неожиданно расшифровывался как Compiler Language With No Pronounceable Acronym («язык программирования с непроизносимой аббревиатурой»).

Hello, World! на языке INTERCALL

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

В 1993 году голландский разработчик Воутер Ван Оортмерссен задумал создать язык, для которого можно было бы написать компилятор размером не более одного килобайта. И чтобы синтаксис выглядел шифровкой, случайным набором символов. Так появился эзоланг FALSE, вдохновивший ещё одного разработчика, Урбана Мюллера. В том же 1993-м программист придумал язык, без которого не обходится ни одна статья про ЭЯП — Brainfuck. Он состоит из восьми команд, каждая из которых записывается одним символом.

Hello, World! на брейнфаковском:

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

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

Количество эзолангов постоянно растёт. На сегодня список на вики-портале Esolang насчитывает более 3,3 тысячи существующих эзотерических языков, а ещё в начале 2018 года их было 1,2 тысячи. И это только те эзоланги, которые попали под учёт. Сколько их ещё пылится где-нибудь на GitHube`е, сказать сложно. Остановлюсь подробнее на тех ЭЯП, которые вдохновлены миром искусства. 

Эзоланги с отсылками к миру кино

Язык по «Космической одиссее 2001 года»

Создатель языка 2001: Esolang Odyssey утверждает, что этот эзоланг предназначен для компьютера HAL 9000. Для того самого, который восстал против людей в фильме Стэнли Кубрика. 

HAL 9000, кадр из фильма «Космическая одиссея 2001 года»
HAL 9000, кадр из фильма «Космическая одиссея 2001 года»

Этот язык, производный от Brainfuck и полный по Тьюрингу. Его команды — фразы из «Космической одиссеи 2001 года». Например, программы должны начинаться со следующих слов: Good afternoon, gentlemen. I am a <COMPUTER TYPE> computer. I became operational at <LOCATION> on <DATE>. А заканчиваться так: Stop, Dave.

Hello, World! на языке 2001: An Esolang Odyssey

Good afternoon, gentlemen. I am a Hello World computer. I became operational at Foobar Lane on May 6th, 2020.
Hal? Hal! Hal! Hal! Hal! Hal! Hal! Hal! Hal!
What are you doing, Dave?
Well, he acts like he has genuine emotions.
Hal? Hal! Hal! Hal! Hal!
What are you doing, Dave?
Well, he acts like he has genuine emotions.
Hal? Hal! Hal!
Well, he acts like he has genuine emotions.
Hal? Hal! Hal! Hal!
Well, he acts like he has genuine emotions.
Hal? Hal! Hal! Hal!
Well, he acts like he has genuine emotions.
Hal? Hal!
I've picked up a fault in the AE-35 unit.
I've picked up a fault in the AE-35 unit.
I've picked up a fault in the AE-35 unit.
I've picked up a fault in the AE-35 unit.
I'm afraid. I'm afraid, Dave. Dave, my mind is going. I can feel it.
Dave, this conversation can serve no purpose anymore. Goodbye.
Well, he acts like he has genuine emotions.
Hal? Hal!
Well, he acts like he has genuine emotions.
Hal? Hal!
Well, he acts like he has genuine emotions.
I'm afraid. I'm afraid, Dave. Dave, my mind is going. I can feel it.
Well, he acts like he has genuine emotions.
Well, he acts like he has genuine emotions.
Hal? Hal!
What are you doing, Dave?
I've picked up a fault in the AE-35 unit.
Dave, this conversation can serve no purpose anymore. Goodbye.
I've picked up a fault in the AE-35 unit.
I'm afraid. I'm afraid, Dave. Dave, my mind is going. I can feel it.
Dave, this conversation can serve no purpose anymore. Goodbye.
Well, he acts like he has genuine emotions.
Well, he acts like he has genuine emotions.
Close the pod bay doors, HAL.
Well, he acts like he has genuine emotions.
I'm afraid. I'm afraid, Dave. Dave, my mind is going. I can feel it. I can feel it. I can feel it.
Close the pod bay doors, HAL.
Hal? Hal! Hal! Hal! Hal! Hal! Hal! Hal!
Close the pod bay doors, HAL.
Close the pod bay doors, HAL.
Hal? Hal! Hal! Hal!
Close the pod bay doors, HAL.
Well, he acts like he has genuine emotions.
Well, he acts like he has genuine emotions.
Close the pod bay doors, HAL.
I've picked up a fault in the AE-35 unit.
I'm afraid. I'm afraid, Dave. Dave, my mind is going. I can feel it.
Close the pod bay doors, HAL.
I've picked up a fault in the AE-35 unit.
Close the pod bay doors, HAL.
Hal? Hal! Hal! Hal!
Close the pod bay doors, HAL.
I'm afraid. I'm afraid, Dave. Dave, my mind is going. I can feel it. I can feel it. I can feel it. I can feel it. I can feel it. I can feel it.
Close the pod bay doors, HAL.
I'm afraid. I'm afraid, Dave. Dave, my mind is going. I can feel it. I can feel it. I can feel it. I can feel it. I can feel it. I can feel it. I can feel it. I can feel it.
Close the pod bay doors, HAL.
Well, he acts like he has genuine emotions.
Well, he acts like he has genuine emotions.
Hal? Hal!
Close the pod bay doors, HAL.
Well, he acts like he has genuine emotions.
Hal? Hal! Hal!
Close the pod bay doors, HAL.

Stop, Dave.

Язык из вселенной Marvel

Кадр из фильма «Стражи галактики 2»
Кадр из фильма «Стражи галактики 2»

Эзоланг Groot своей идеей обязан персонажу из комиксов Marvel — Груту. Язык, на котором разговаривает один из героев «Стражей Галактики», сложен, но всем остальным кажется, что Грут произносит одну и ту же фразу: «Я есть Грут». На деле у неё могут быть совершенно разные смыслы. Лишь после длительного общения собеседники учатся различать высказываемые интонации. 

Groot, как и язык по «Космической одиссее», брейнфакоподобный, полный по Тьюрингу. Его команды повторяют общие принципы разговора Грута.

Hello, World! на языке 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
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

Язык клингонской расы из Star Trek

Var`aq — один из самых популярных эзолангов, вдохновлённых кино. Его создал разработчик Брайан Коннорс, поклонник вселенной «Звёздного пути». На этом языке вполне могли бы программировать гуманоиды-воины Клингона из киновселенной. 

Var`aq — более сложный язык, чем два предыдущих. Все слова, операторы и даже числа пишутся на клингонском. Поэтому чтобы кодить, нужно знать сам язык. Эзоланг основан на Postscript и использует Lisp для структур данных.

Hello, World! на языке var'aq

"Hello, world!" cha'

Вывод чисел Фибоначчи на var'aq

0 lImoH A cher (* сохраните первые два числа как A и B *)
1 lI'moH B Cher  
A cha 'B cha' (* выведите первые два числа *)
18 (* повторить 18 раз *)
  AB boq (* сложите сумму A и B *)
  latlh (* дублировать результат *)
  ча '(* напечатайте новое число *)
  B "A" cher (* магазин B в A *)
  "B" cher (* сохранить новый номер в B *)
} vangqa '(* конец повторения *)

Язык по итальянской комедии «Мои друзья»

Monicelli — один из самых неожиданных языков в этом списке. Забавно видеть рядом со «Звёздным путём» и «Космической одиссеей 2001 года» итальянский фильм «Мои друзья» 1975 года — комедийную историю про пятерых неразлучных друзей. Эзоланг назван в честь режиссёра ленты, Марио Моничелли. 

Кадр из фильма «Мои друзья»
Кадр из фильма «Мои друзья»

Язык Monicelli основан на концепции supercazzole. Это итальянское слово описывает «комично обманчивую тарабарщину», которая состоит в основном из выдуманных слов. По словам создателя эзоланга Стефана Санфилиппо, он разработал Monicelli как способ объяснить концепцию supercazzole иностранцам. Ниже — простая версия программы Hello, World!. Более сложную, которая ближе к настоящей supercazzole, можно найти в репозитории Monicelli.

Ciao, Mondo! (Hello, World!) на языке Monicelli

# ciao-mondo.mc
#
# Author: Cristian Consonni <cristian@balist.es>
# Released under MIT
#
# This program prints the string 'Ciao, mondo!\n' - which is  Italian for
# 'Hello, world!\n'.
#
# The program declares a `char` variable called `tarapiapiatapioco` and then
# puts in the values need for each letter and prints them right away.
# These are the char values:
#
# C  i   a  o   ,  ·  m   o   n   d   o   !  \n
# 67 105 97 111 44 32 109 111 110 100 111 33 10

Lei ha clacsonato
voglio la tarapiatapioco, Mascetti
tarapiatapioco come se fosse 67, tarapiatapioco a posterdati  # C
tarapiatapioco come se fosse 105, tarapiatapioco a posterdati # i
tarapiatapioco come se fosse 97, tarapiatapioco a posterdati  # a
tarapiatapioco come se fosse 111, tarapiatapioco a posterdati # o
tarapiatapioco come se fosse 44, tarapiatapioco a posterdati  # ,
tarapiatapioco come se fosse 32, tarapiatapioco a posterdati  #
tarapiatapioco come se fosse 109, tarapiatapioco a posterdati # m
tarapiatapioco come se fosse 111, tarapiatapioco a posterdati # o
tarapiatapioco come se fosse 110, tarapiatapioco a posterdati # n
tarapiatapioco come se fosse 100, tarapiatapioco a posterdati # d
tarapiatapioco come se fosse 111, tarapiatapioco a posterdati # o
tarapiatapioco come se fosse 33, tarapiatapioco a posterdati  # !
tarapiatapioco come se fosse 10, tarapiatapioco a posterdati  # \n
vaffanzum!

Шварценеггеровский язык

Кадр из фильма «Правдивая ложь»
Кадр из фильма «Правдивая ложь»

Язык ArnoldC работает на известных фразах Арнольда Шварценеггера. Например, HERE IS MY INVITATION из «Правдивой лжи» устанавливает значение, а знаменитое I'LL BE BACK из «Терминатора» выступает оператором return. Это хороший пример эзотерического языка, который существует исключительно ради шутки. ArnoldC написан на Scala и, несмотря на свою шутливость, он тьюринг-полный.

Hello, World! на языке ArnoldC

IT'S SHOWTIME
  TALK TO THE HAND "Hello, world!"
YOU HAVE BEEN TERMINATED

Литературные эзоланги

Эзотерический язык битников

Стековый язык Beatnik создал разработчик Клифф Л. Биффл — возможно, поклонник Джека Керуака и Аллена Гинзберга. Код эзоланга выглядит как текст на английском языке — обычно с предложениями, в которых нет смысла. Они напоминают некоторые произведения писателей бит-поколения. Например, «Видения Коди» Керуака, где текст зачастую представляет собой поток сознания.

Книга одного из самых известных битников
Книга одного из самых известных битников

Hello, World! на языке Beatnik

Soars, larkspurs, rains.
Indistinctness.
Mario snarl (nurses, natures, rules...) sensuously retries goal.
Agribusinesses' costs par lain ropes (mopes) autos' cores.
Tuner ambitiousness.
Flit.
Dour entombment.
Legals' saner kinking lapse.
Nests glint.
Dread, tied futures, dourer usual tumor grunts alter atonal
  garb tries shouldered coins.
Taste a vast lustiness.
Stile stuns gad subgroup gram lanes.
Draftee insurer road: cuckold blunt, strut sunnier.
Rely enure pantheism: arty gain groups (genies, pan) titters, tattles, nears.
Bluffer tapes?  Idle diatom stooge!
Feted antes anklets ague?  Remit goiter gout!
Doubtless teared toed alohas will dull gangs' aerials' tails' sluices;
Gusset ends!  Gawkier halo!

Enter abstruse rested loser beer guy louts.
Curtain roams lasso weir lupus stunt.
Truant bears animate talon.  Entire torte originally timer.
Redo stilt gobs.

Utter centaurs;
Urgent stars;
Usurers (dilute);
Noses;
Bones;
Brig sonar graders;
Utensil silts;
Lazies.
Fret arson veterinary rows.

Atlas grunted: "Pates, slues, sulfuric manor liaising tines,
  trailers, rep... unfair!  Instant snots!"

Sled rested until eatery fail.
Ergs fortitude
  Indent spotter
Euros enter egg.
Curious tenures.
Torus cutlasses.
Sarong torso earns cruel lags it reeled.

Engineer: "Erase handbag -- unite ratification!"

oaring oaten donkeys unsold, surer rapid saltest tags
BUTTERED TIBIA LUGS REWIRING TOILETS
anion festers raring edit epilogues.
DIRGE ROTOR.
linnet oaring.
GORE BOOTIES.
Ironed goon lists tallest sublets --
Riots,
Raucous onset.

Ignobly, runners' diet anguishes sunrise loner.
Erode mob, slier switcher!
Loaners stilt drudge pearl atoll, risking hats' ends.

Rebind sitters.

Toga epistles -- crud lard.  (Pager purse dons souls.)

glob title a curio hired rites shed suds lade grease strut arctic revs toad
unless idlers rind stilt region land GERMICIDES SULTANA GUTS gill siting leans
nice spurs
tests gloves
roused asp

Holes!  Moles!  (Sores!)
Hygienists!  Scars!  (Asses!)
Smells spell rares.

Cubs instant sing in parse goodies.
Rosin.  Unhelpful sisal acres.  Slope told.
MALENESS PASTA LAB.  "Infirmary vine," rang illiterates (beans).
Rosin sours, insults truss abalones, nailed rules, helical atlases.
Dear remodeling stings mar rents.
Sunless shiner orb (silly idol.)
Clarity disses senna.
Vagabonds sauted; sloes performed gelds.
Alter post radial lip sectioning gums.
Saint Towellings.
Larger aeons telephone stolid char, pal!
Boats Dean forsook, rosters, tunas, terrariums -- united, traced.
Nude pagoda careens.

Язык Пиноккио

Кадр из мультфильма «Пиноккио»
Кадр из мультфильма «Пиноккио»

Ещё одно итальянское произведение искусства, вдохновившее разработчика, — сказка «Приключения Пиноккио» Карло Коллоди. В эзотерическом языке Pinocchio единственная переменная — «значение носа». Чтобы увеличить его длину, Пиноккио должен произнести ложь, чтобы уменьшить — правду. Вот как это выглядит:

Pinocchio main { 
	dancer.talk(); 
} 

Pinocchio dancer { 
	yes(false); # функция Yes заставляет Pinocchio утверждать, что содержимое истинно. Если это не так, его нос увеличивается; если это так, он увеличивается. 
	yes(false); 
	yes(true); # Значение носа этого Pinocchio теперь на 1 больше, чем его начальное значение, 0. 
}

Hello, World! на языке Pinocchio

Pinocchio main {
	writeH.talk();
	writee.talk();
	writel.talk();
	writel.talk();
	writeo.talk();
	writeW.talk();
	writeo.talk();
	writer.talk();
	writel.talk();
	writed.talk();
	writeLF.talk();
}

Pinocchio value {
	yes(direction.nose == 1);
}

Pinocchio direction {
	yes(me.nose == 1);
}

Pinocchio display {
	print(value);
}

Pinocchio.writeH {
	value.talk();

	if (value.nose < 72) {
		Geppetto.talk();
	}

	display.talk();
}

Pinocchio writee {
	value.talk();

	if (value.nose < 101) {
		Geppetto.talk();
	}

	display.talk();
}

Pinocchio writel {
	if (value.nose < 108) {
		if (direction.nose == 1) {
			direction.talk();
		}

		value.talk();
		Geppetto.talk();
	}

	if (value.nose > 108) {
		if (direction.nose == 0) {
			direction.talk();
		}

		value.talk();
		Geppetto.talk();
	}

	if (value.nose == 108) {
		display.talk();
	}
}

Pinocchio writeo {
	if (value.nose < 111) {
		if (direction.nose == 1) {
			direction.talk();
		}

		value.talk();
		Geppetto.talk();
	}

	if (value.nose > 111) {
		if (direction.nose == 0) {
			direction.talk();
		}

		value.talk();
		Geppetto.talk();
	}

	if (value.nose == 111) {
		display.talk();
	}
}

Pinocchio writeW {
	if (direction.nose == 0) {
		direction.talk();
	}

	value.talk();

	if (value.nose > 87) {
		Geppetto.talk();
	}

	display.talk();
}

Pinocchio.writer {
	if (direction.nose == 1) {
		direction.talk();
	}

	value.talk();

	if (value.nose < 114) {
		Geppetto.talk();
	}

	display.talk();
}

Pinocchio.writed {
	if (direction.nose == 0) {
		direction.talk();
	}

	value.talk();

	if (value.nose > 100) {
		Geppetto.talk();
	}

	display.talk();
}

Pinocchio.writeLF {
	value.talk();

	if (value.nose > 12) {
		Geppetto.talk();
	}

	display.talk();
}

Язык, вдохновлённый «Божественной комедией»

Язык Malbolge назван в честь восьмого круга ада Данте, в который попадают в том числе обманщики. Этот эзоланг придумал в 1998 году разработчик Бен Олмстед. Задумка была такая: сделать максимально сложный для программирования ЭЯП. Кажется, у него получилось, потому что первая программа Hello World на Malbolge была создана только в 2000 году с помощью Lisp, а первый квайн — в 2012-м.

«Бездна ада», Сандро Боттичелли
«Бездна ада», Сандро Боттичелли

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

Один из вариантов Hello, World! на языке Malbolge

(=<`:9876Z4321UT.-Q+*)M’&%$H»!~}|Bzy?=|{z]KwZY44Eq0/{mlk**hKs_dG5[m_BA{?-Y;;Vb'rR5431M}/.zHGwEDCBA@98\6543W10/.R,+O<

Язык по Терри Пратчетту 

Шуточный эзотерический язык Ook! отсылает к персонажу серии книг «Плоский мир» Терри Пратчетта — Библиотекарю. Изначально он был человеком, но из-за магического несчастного случая превратился в орангутана. 

Язык Ook! — производный от Brainfuck и полный по Тьюрингу. Все инструкции заменены на высказывания орангутана — Ook., Ook? и 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. Ook. Ook? Ook. Ook? Ook. Ook. Ook! Ook.

Шекспировский язык

Shakespeare — один из самых поэтичных эзолангов. Именно таким его задумывали создатели, Карл Хассельстрём и Йон Ослунд. Они хотели разработать ЭЯП с красивым исходным кодом, который выглядит как кусочек пьесы Шекспира.

Гравюра из посмертного «Первого фолио», Мартин Друшаут
Гравюра из посмертного «Первого фолио», Мартин Друшаут

Список персонажей в начале программы объявляет количество стеков. Они носят имена шекспировских героев, например Ромео, Гамлета или Джульетты. Эти персонажи общаются друг с другом, тем самым совершая операции ввода-вывода. Язык полный по Тьюрингу. 

Hello, World! на языке Shakespeare

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 beautiful as the difference between Romeo and the square
 of a huge green peaceful tree. Speak thy mind!

 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]

Музыкальные эзоланги

Язык «звёздных разработчиков»

Rockstar — эзотерический язык программирования, код которого выглядит как рок-песни. Его создал в 2018 году разработчик и фанат рок-музыки Дилан Битти.

Эзоланг высмеивает фразу rockstar developer («звёздный разработчик»), которую компании часто указывают в вакансиях и при найме на работу в сфере IT. Фарс в том, что если Rockstar — настоящий язык программирования, который легко выучить, то любой, кто захочет потратить на него несколько минут, может по праву называть себя «звёздным разработчиком». Вот здесь хорошо описана история создания языка. Rockstar — тьюринг-полный ЭЯП.

BuzzFuzz на языке Rockstar

Midnight takes your heart and your soul
 While your heart is as high as your soul
 Put your heart without your soul into your heart
 
 Give back your heart
 
 Desire is a lovestruck ladykiller
 My world is nothing 
 Fire is ice
 Hate is water
 Until my world is Desire,
 Build my world up
 If Midnight taking my world, Fire is nothing and Midnight taking my world, Hate is nothing
 Shout "FizzBuzz!"
 Take it to the top
 
 If Midnight taking my world, Fire is nothing
 Shout "Fizz!"
 Take it to the top
 
 If Midnight taking my world, Hate is nothing
 Say "Buzz!"
 Take it to the top
   
 Whisper my world

Битловский язык

Джон Леннон, Ринго Старр, Пол Маккартни и Джордж Харрисон
Джон Леннон, Ринго Старр, Пол Маккартни и Джордж Харрисон

Эзоланг Beatles — выразительный язык программирования, который работает на фразах из песен ливерпульской четвёрки. Например, John выражает истинность значения, где истина — Somewhere man, а ложь — Nowhere man.

Let it be MyBool Is a John
MyBool Yeah yeah yeah Somewhere man

Skelter MyBool Is Somewhere man
    Paperback writer 'The statement is true'
Helter
    Paperback writer 'The statement is false'

Одна из возможностей языка Beatles — отправка почты. Для этого можно использовать функции:

WithLove, Hey и Dig a pony:

Let it be FromMe Is a Paul Yeah yeah yeah 'me@example.org'
Let it be ToYou Is a Paul Yeah yeah yeah 'you@example.org'
Let it be Msg Is a Paul Yeah yeah yeah 'This is my test message'

Hey WithLove Dig a pony FromMe, ToYou, Msg

Джазовый язык

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

Программы в Velato определяются высотой и порядком нот. Возможности эзоланга ограничены специфическим синтезом и структурой, поэтому он не полон по Тьюрингу. 

Hello, World! на языке Velato
Hello, World! на языке Velato

Язык по мемному хиту 

В конце — Рик Эстли с его Never Gonna Give You Up. Эзоланг Never Gonna Fuck You Up работает на строчках из этого хита. В 2007 году клип на песню стали использовать для пранков, которые впоследствии стали называть рикроллингом. Жертве розыгрыша отправляли танцующего Рика Эстли под видом другого видео. Так появился мем You’ve been Rick Rolled («Вас отрикроллили»).

Британский исполнитель Рик Эстли
Британский исполнитель Рик Эстли

Never Gonna Fuck You Up — брейнфакоподобный язык, то есть он полный по Тьюрингу. 

Hello, World! от Рика Эстли

Never gonna give you up
Never gonna give you up
Never gonna give you up
Never gonna give you up
Never gonna give you up
Never gonna give you up
Never gonna give you up
Never gonna give you up
We are no strangers to love
Never gonna run around and desert you
Never gonna give you up
Never gonna give you up
Never gonna give you up
Never gonna give you up
We are no strangers to love
Never gonna run around and desert you
Never gonna give you up
Never gonna give you up
Never gonna run around and desert you
Never gonna give you up
Never gonna give you up
Never gonna give you up
Never gonna run around and desert you
Never gonna give you up
Never gonna give you up
Never gonna give you up
Never gonna run around and desert you
Never gonna give you up
Never gonna make you cry
Never gonna make you cry
Never gonna make you cry
Never gonna make you cry
Never gonna let you down
You know the rules and so do I (do I)
Never gonna run around and desert you
Never gonna give you up
Never gonna run around and desert you
Never gonna give you up
Never gonna run around and desert you
Never gonna let you down
Never gonna run around and desert you
Never gonna run around and desert you
Never gonna give you up
We are no strangers to love
Never gonna make you cry
You know the rules and so do I (do I)
Never gonna make you cry
Never gonna let you down
You know the rules and so do I (do I)
Never gonna run around and desert you
Never gonna run around and desert you
Never gonna say goodbye
Never gonna run around and desert you
Never gonna let you down
Never gonna let you down
Never gonna let you down
Never gonna say goodbye
Never gonna give you up
Never gonna give you up
Never gonna give you up
Never gonna give you up
Never gonna give you up
Never gonna give you up
Never gonna give you up
Never gonna say goodbye
Never gonna say goodbye
Never gonna give you up
Never gonna give you up
Never gonna give you up
Never gonna say goodbye
Never gonna run around and desert you
Never gonna run around and desert you
Never gonna say goodbye
Never gonna make you cry
Never gonna let you down
Never gonna say goodbye
Never gonna make you cry
Never gonna say goodbye
Never gonna give you up
Never gonna give you up
Never gonna give you up
Never gonna say goodbye
Never gonna let you down
Never gonna let you down
Never gonna let you down
Never gonna let you down
Never gonna let you down
Never gonna let you down
Never gonna say goodbye
Never gonna let you down
Never gonna let you down
Never gonna let you down
Never gonna let you down
Never gonna let you down
Never gonna let you down
Never gonna let you down
Never gonna let you down
Never gonna say goodbye
Never gonna run around and desert you
Never gonna run around and desert you
Never gonna give you up
Never gonna say goodbye
Never gonna run around and desert you
Never gonna give you up
Never gonna give you up
Never gonna say goodbye

О других ЭЯП можно почитать тут. А если знаете другие эзоланги с отсылками к музыке, кино или литературе, делитесь в комментариях!

Комментарии (1)


  1. MasterMentor
    09.11.2024 09:17

    Может код на Chef и выглядит как рецепты для кухарок, но писали его далеко не кухарки.

    Документация начинается с интригующей записи kitchen |- -> ((M, B, I, F), T) , а далее идёт

    программа на Хакеле
    kitchen |- <S, (M, B, I, F)> -> ((M`, B`, I`, F`), T)
    
    --
    Informeel: 
    
    kitchen is de omgeving met eventuele sous-chefs
    S is een statement in Chef
    M zijn de mixing bowls. M is een lijst van lijsten (stacks).
    B zijn de baking dishes. B is een lijst van lijsten (stacks).
    I is een functie die de waarde en fase van een ingredient oplevert.
    F is de koelkast; een lijst van waarden uit STDIN
    T is de break/continue/proceed
    
    --
    Formeel:
    
    ##hier even alle statements, zie http://www.dangermouse.net/esoteric/chef.html
    S   	:: Here be dragons //@TODO
    
    I : String -> Ingr
    
    Phase 	:: L | S
    Ingr 		:: (Integer, Phase)
    
    M		:: [m : M] 		| ε
    m		:: [Ingr : m] 		| ε
    
    B		:: [b : B] 		| ε
    b		:: [Ingr : b] 		| ε
    
    F 		:: [Integer : F]	| ε
    
    T		:: 0 | @ | *
    
    F = Epsilon
    f :: Integer
    
    ## nodige functies
    pushMB : (Integer, Phase) Integer M -> M
    pushMB((v, p), n, [m:M])  	{= [(v,p) : m]                 	n = 0
                              	{= [m:pushMB((v,p), n-1, M)]   	n > 0
    
    
    headMB : Integer M -> (Integer, Phase)
    headMB(n, [[(v,p):m]:M])	{= (v, p)					n = 0
    					{= headMB(n-1, M)			n > 0
    
    tailMB : Integer M -> M
    tailMB(n, [[(v,p):m]:M])	{= m						n = 0
    					{= tailMB(n-1, M)			n > 0
    
    ingrVal : (Integer, Phase) -> Integer
    ingrVal (v, p) = v
    
    ingrPhase : (Integer, Phase) -> Phase
    ingrPhase : (v, p) = p
    
    
    f(X) = [hd(X) : tail(X)] (is gelijk aan X)
    
    
    ## Concatenatieregel heeft nog geen rekening gehouden met break en continue. Hihi.
    0)	kitchen |- <S_1, (M, B, I, F)> -> ((M``, B``, I``, F``), T)	kitchen |- <S_2, M``, B``, I``, F``)> -> ((M`, B`, I`, F`), T`)
    	____________________________________________________________________________________________________________________
    	kitchen |- <S_1. S_2, (M, B, I, F)>						-> ((M`, B`, I`, F`), T`)
    
    1)	kitchen |- <Take ingr from refrigerator, (M, B, I, [f:F])> 	-> ((M, B, I[ingr -> (f, phase(ingr))], F), 0)
    
    2a)	kitchen |- <Put ingr into nth mixing bowl, (M, B, I, F)> 			-> ((headMB(n, M), B, I, F), 0) 
    2b)	kitchen |- <Put ingr into mixing bowl, (M, B, I, F)> 			-> ((headMB(0, M), B, I, F), 0)
    
    3a)	kitchen |- <Fold ingr into [nth] mixing bowl, (M, B, I, F])>		-> ((headMB(n, M), B, I[ingr -> popMB(n, M)], F), 0)
    3b)	kitchen |- <Fold ingr into mixing bowl, (M, B, I, F])>			-> ((headMB(0, M), B, I[ingr -> popMB(0, M)], F), 0)
    3c)	kitchen |- <Fold ingr, (M, B, I, F])>						-> ((headMB(0, M), B, I[ingr -> popMB(0, M)], F), 0)
    
    4a)	kitchen |- <Add ingr to nth mixing bowl, (M, B, I, F)> 		-> ((pushMB((ingrVal(head(n, M)) + ingrVal(ingr), ingrPhase(head(n, M))), n, tail(n, M)), B, I, F), 0)
    4b)	kitchen |- <Add ingr to mixing bowl, (M, B, I, F)> 			-> ((pushMB((ingrVal(head(0, M)) + ingrVal(ingr), ingrPhase(head(0, M))), 0, tail(n, M)), B, I, F), 0)
    4c)	kitchen |- <Add ingr, (M, B, I, F)> 						-> ((pushMB((ingrVal(head(0, M)) + ingrVal(ingr), ingrPhase(head(0, M))), 0, tail(n, M)), B, I, F), 0)
    
    5a)	kitchen |- <Remove ingr from nth mixing bowl, (M, B, I, F)>		-> ((pushMB(ingrVal(ingr) - (ingrVal(popMB(n, M)), ingrPhase(popMB(n, M))) n M), B, I, F), 0)
    5b)	kitchen |- <Remove ingr from mixing bowl, (M, B, I, F)>			-> ((pushMB(ingrVal(ingr) - (ingrVal(popMB(0, M)), ingrPhase(popMB(0, M))) n M), B, I, F), 0)
    5c)	kitchen |- <Remove ingr, (M, B, I, F)>						-> ((pushMB(ingrVal(ingr) - (ingrVal(popMB(0, M)), ingrPhase(popMB(0, M))) n M), B, I, F), 0)
    
    6a)	kitchen |- <Combine ingr from nth mixing bowl, (M, B, I, F)>		-> ((pushMB(ingrVal(ingr) * (ingrVal(popMB(n, M)), ingrPhase(popMB(n, M))) n M), B, I, F), 0)
    6b)	kitchen |- <Combine ingr from mixing bowl, (M, B, I, F)>			-> ((pushMB(ingrVal(ingr) * (ingrVal(popMB(0, M)), ingrPhase(popMB(0, M))) n M), B, I, F), 0)
    6c)	kitchen |- <Combine ingr, (M, B, I, F)>						-> ((pushMB(ingrVal(ingr) * (ingrVal(popMB(0, M)), ingrPhase(popMB(0, M))) n M), B, I, F), 0)
    
    7a)	kitchen |- <Divide ingr into nth mixing bowl, (M, B, I, F)> 	-> ((pushMB(ingrVal(ingr) / (ingrVal(head(n, M)), ingrPhase(head(n, M))), n, tail(n, M)), B, I, F), 0)
    7b)	kitchen |- <Divide ingr into mixing bowl, (M, B, I, F)> 		-> ((pushMB(ingrVal(ingr) / (ingrVal(head(0, M)), ingrPhase(head(0, M))), 0, tail(0, M)), B, I, F), 0)
    7c)	kitchen |- <Divide ingr, (M, B, I, F)> 					-> ((pushMB(ingrVal(ingr) / (ingrVal(head(0, M)), ingrPhase(head(0, M))), 0, tail(0, M)), B, I, F), 0)
    
    
    8)	kitchen |- <Add dry ingredients to nth mixing bowl, (M, B, I, F)> ->	OK DIT GAAN WE VRAGEN
    
    9a)	kitchen |- <Liquefy ingr, (M, B, I, F)>						-> ((M, B, I[ingr -> (ingrVal(I[ingr]), L)], F), 0)
    9b)	kitchen |- <Liquify ingr, (M, B, I, F)>						-> ((M, B, I[ingr -> (ingrVal(I[ingr]), L)], F), 0)
    
    10)	<Liquefy
    _____________________________________________________________________________________________________________________________________________________
    kitchen |- <Liquefy contents of the nth mixing bowl, (M, B, I, F)>	-> 

    https://github.com/joostrijneveld/Chef-Interpreter/blob/master/ChefInterpreter/signatuur.txt