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

Многие из вас и так знают, что из себя представляют PHP с JavaScript. Есть и классики, предпочитающие C++, и приверженцы нью-скула, пишущие на C# или даже Go. А как насчёт экзотики? В этой подборке мы рассмотрим наиболее интересные и необычные с эстетической точки зрения языки программирования.

ZOMBIE

И начнём мы… с нежити!

Да-да, именно так. Ведь первым у нас на очереди язык настоящих некромантов и чернокнижников. Название представляет собой аббревиатуру, расшифровывающуюся как Zombie-Oriented Machine-being Interface Engine. Программисты на нём повелевают мёртвыми телами, призывают души и заставляют их подчиняться своей воле. То есть решать задачи.

Структура

Структурно язык полагается на Сущности. Есть несколько типов:

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

  • Зомби, оживлённые и порабощённые некромантом;
  • Призраки, чьи души так и не были упокоены и остались по обе стороны завесы, дабы свершить мрачное правосудие;
  • Вампиры — вольная нежить, обманувшая саму смерть ради тёмных свершений.

Демоны: вольные и зловещие сущности, обычно населяющие различные параллельные реальности. Их можно призвать и назначить им задания, но необходимо иметь в виду две особенности:

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

Джинны: капризные вольнодумные создания. Становятся подконтрольны заклинателю, если тот владеет некой вещью, привязанной к сущности создания неразрывным соединением. Горе вам, если потеряете контроль над ним, ибо Джинны таят внутри ненависть к тем, кто ими управляет.

Примеры кода

Ритуал «Hello world!»

HelloWorld is a zombie
summon
   task SayHello
           say "Hello World!"
   animate
animate

 

Ритуал «Числа Фибоначчи»

Zombie1 is a zombie
summon
   remember 1
bind


Zombie2 is a zombie
summon
   remember 1
bind


FibonacciZombie is a zombie
summon
   remember 0
   task SayFibonaccis
           shamble
                  say moan Zombie1
                  say moan Zombie2
                  remember Zombie1 moan Zombie1 moan Zombie2
                  remember Zombie2 moan Zombie1 moan Zombie2
                  remember moan 2
           until remembering 100
   animate
animate

Whenever

Этот язык программирования совершенно не понимает, к чему вся эта спешка, и выполняет команды тогда, когда ему это вздумается, в удобной для себя последовательности. Переменные? О чём речь, здесь нет даже контроля потока данных! Структура данных? Да бросьте.

Структура

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

Примеры кода

Hello world!

Постыдно тривиальная задача в списке дел на Whenever:

print("Hello world!");

Числа Фибоначчи

Этот код выведет первые 100 чисел Фибоначчи. Когда-нибудь…

again (1) defer (3 || N(1)<=N(2) || N(7)>99) 2#N(1),3,7;
again (2) defer (3 || N(2)<=N(1) || N(7)>99) 1#N(2),3,7;
defer (5) print(N(1)+N(2));
defer (5) print("1");
4,-3,7;
defer (4) 3;
7;
defer (N(7)<100) -1#N(1),-2#N(2),-7#100,-3;
defer (3 || 6) 1,3;

WASD

Язык, чей создатель вдохновился уже легендарным Brainfuck. Предназначен для написания программ одной рукой, преимущественно левой. А код выглядит так, словно программист заснул на левой части клавиатуры. Правой можно держать кружку с кофе, например. Или подыскивать более стоящее для программиста занятие.

Структура

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

Примеры кода:

Hello world!

Что мы говорили про сон на клавиатуре?

dwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwedwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww       wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwewwwwwwweewwwessssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssseawwwwwwwwwwwwwwwedwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwewwwessssssessssssssessssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssse

Incident

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

Структура

Лексический анализатор Incident работает посредством анализа исходного кода, а не исполнения предопределённых инструкций. Основная суть заключается в том, что токены для каждой отдельно взятой программы — это подстроки, повторяющиеся в ней строго три раза. При этом существуют ограничения:

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

Примеры кода:

Традиционный «Hello world!». По крайней мере, должен быть он…

A1.A2.A3,A4.A5,A6,A7;A8;B1;B2,B3.B4,B5;B6.B7.B8;C1,C2.C3;C4.C5,C6;C7,
C8.D1;D2,D3.D4,D5.D6;D7.D8,E1;E2;E3;E4,E5,E6.E7,E8.F1;F2.F3.F4,F5.F6;
F7.F8;G1,G2;G3,G4;G5.G6.G7.G8;H1.H2;H3.H4.H5.H6,H7;H8;I1,I2.I3;I4,I5.
I6,I7.I8,J1;J2,J3,J4,J5;J6;J7.J8;K1;K2;K3;K4,K5,K6;K7.K8,L1;L2,L3;L4,
L5;L6;L7,L8,M1.M2.M3.M4,M5,M6,M7,M8,N1.N2;N3,N4.N5;N6,N7.N8,Z4;a1,a1.
Z3.A1,a1;a2,a2,A1,A2.a2,a3.a3.A2,A3,a3.a5,a5,A3;A5.a5,a6,a6.A5;A6.a6.
a8.a8.A6;A8.a8;b2,b2.A8;B2.b2,b4.b4,B2,B4;b4.b5;b5;B4;B5;b5.b8.b8,B5.
B8.b8.c1;c1,B8,C1;c1,c2,c2;C1;C2,c2.c5,c5;C2,C5,c5.c8.c8,C5;C8;c8,d1;
d1.C8,D1;d1.d2;d2.D1.D2.d2.d5,d5,D2.D5.d5.d8,d8;D5;D8.d8,e5.e5.D8;E5,
e5,e8,e8,E5,E8;e8,f1.f1.E8.F1;f1;f2,f2;F1.F2.f2;f5.f5;F2;F5,f5;f7;f7.
F5,F7,f7;f8.f8;F7.F8,f8,g1;g1.F8;G1.g1,g2;g2.G1,G2,g2,g3;g3;G2,G3;g3,
g4,g4.G3;G4.g4.g5.g5,G4,G5.g5;g7;g7.G5;G7,g7,g8;g8.G7,G8;g8;h4.h4,G8;
H4,h4;h8,h8,H4.H8,h8.i5.i5;H8;I5;i5.i8;i8.I5,I8,i8.j1;j1;I8,J1;j1.j3.
j3;J1,J3;j3;j4,j4.J3,J4.j4,j8,j8.J4;J8,j8.k1.k1.J8.K1,k1,k2.k2;K1,K2;
k2.k5;k5;K2,K5.k5,k8;k8,K5.K8,k8;l1,l1;K8;L1;l1,Z1;Z2;Z2,Z3.Z2;Z1.Z1,
l2;l2;L1;L2,l2;l4.l4.L2.L4;l4.l5.l5.L4;L5;l5.l8.l8,L5.L8;l8;m2;m2.L8;
M2.m2,m3,m3,M2,M3,m3;m4.m4.M3;M4.m4,m5.m5.M4,M5,m5;m7,m7.M5.M7;m7.m8.
m8,M7,M8,m8,n1;n1.M8,N1;n1.n3,n3;N1;N3,n3.n5,n5;N3,N5;n5,n6.n6.N5.N6.
n6,n7;n7;N6.N7;n7.n8,n8;N7,N8;n8,a4,a4;Z3;A4,a4;a7.a7.A4.A7;a7,b1.b1;
A7;B1,b1;b3;b3,B1,B3.b3,b6.b6;B3;B6,b6;b7;b7,B6,B7,b7;c3,c3.B7,C3,c3.
c4.c4,C3,C4.c4;c6.c6,C4,C6.c6;c7,c7;C6.C7,c7.d3;d3.C7,D3,d3;d4;d4.D3,
D4,d4;d6,d6,D4,D6.d6;d7,d7,D6,D7.d7,e1,e1;D7,E1.e1,e2,e2;E1;E2,e2.e3;
e3,E2,E3,e3.e4;e4.E3.E4;e4,e6;e6;E4,E6,e6.e7.e7;E6.E7.e7,f3,f3.E7,F3;
f3.f4;f4,F3;F4,f4;f6;f6.F4.F6,f6,g6.g6;F6.G6.g6.h1;h1;G6;H1,h1.h2;h2.
H1;H2,h2.h3,h3,H2,H3,h3.h5.h5;H3,H5;h5;h6;h6;H5.H6.h6,h7.h7.H6,H7.h7;
i1,i1,H7.I1,i1.i2;i2;I1;I2,i2,i3.i3,I2,I3.i3;i4;i4;I3,I4,i4.i6,i6,I4.
I6,i6.i7.i7,I6;I7;i7.j2;j2;I7.J2;j2,j5;j5.J2.J5;j5.j6,j6.J5,J6,j6;j7;
j7;J6,J7.j7;k3,k3;J7.K3.k3.k4.k4,K3.K4;k4,k6;k6,K4.K6;k6,k7.k7;K6,K7.
k7,l3.l3.K7;L3;l3.l6;l6,L3;L6,l6;l7,l7,L6;L7.l7,m1.m1,L7;M1;m1,m6;m6,
M1;M6,m6;n2;n2;M6,N2,n2;n4.n4,N2;N4,n4.N8.N4,Z4,Z4

А это «кошка». Все любят кошек.

    |\ /|
    /"^"\
    (0 0)
    \_*_/_________
      (          _^^,
      (_________) ( )
cat    |||   |||   "
       ||^   ||^
       ^^    ^^

Libertas

Надоели баги? От одной мысли о том, что придётся прочёсывать полторы тысячи строк кода в поисках пропущенной точки с запятой, волосы начинают седеть целыми прядями? Хватит это терпеть! Даёшь свободу от дебажного рабства! Libertas!

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

Примеры кода

Вот код, выводящий традиционный «Hello world!»:

toScreen "Hello World"

if Date:Day:Set = "Monday" toScreen "Have a great monday"

А вот похожий код:

toScren "Hello World"

if Date:Day:Set = "Monday" toScreen "Have a great monday"

Смутил метод toScren? А вот Libertas всё равно. Он просто продолжит выполнять следующий код. А toScren  просто будет хранить в качестве значения два самых главных слова. Пропустили закрывающие кавычки в первой строке? Тоже мне проблема, просто строка в переменной превратится в «Hello World if Date:Day:Set =».

MarioLANG

Пришло время вспомнить далёкое детство… Нет, речь не про BASIC, хотя сегодня он и считается практически реликвией. У всех или почти всех ведь была «Денди»? И принцессу искали, и монетки собирали, и по трубам лазили… Встречайте новое амплуа итальянского водопроводчика в мире программирования.

Структура

Исходный код на этом языке действительно напоминает мир игр серии Super Mario. В качестве условных операторов используются символы, выступающие строительным материалом для локаций, а также указания для усатого сантехника. Всё, что не распознаётся как команда, является комментарием.

Примеры кода:

++++:       >       >  +:+:+:+:+:+:+:::::
====+      >^===    """==================
    +:-):(:^=   =                       !
    =========    =                      #
                  = !             .+.,:-<
                   =###           ======"

В результате выполнения кода выводится последовательность чисел: 4 6 0 5 6 7 8 9 10 11 12 12 12 12 12 11. После этого пользователь должен ввести букву, и программа выведет её и следующую в алфавите.

++++:
====

Эта программа выводит цифру 4. Двоеточие в конце означает, что Марио останавливается и выполняет вывод.

BiTrax

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

Структура

Сам исходный код представляет собой точечный рисунок, где пиксели играют роль операторов:

  • Белый (FFFFFF): не делает ничего;
  • Жёлтый (FFFF00): бит ввода сохраняется в текущей ячейке;
  • Чёрный (000000): текущая ячейка предназначена для вывода;
  • Серый (808080): меняет текущую ячейку;
  • Зелёный (00FF00): перемещает указатель в текущем направлении на одну ячейку;
  • Красный (FF0000): перемещает указатель в обратном направлении на одну ячейку;
  • Синий (0000FF): меняет порядок выполнения команд в зависимости от значения текущей ячейки;
  • Все остальные цвета генерируют ошибки выполнения при достижении их ячейки.

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

Примеры кода:

Данная программа вводит четырёхзначное число, прибавляет к нему один, а затем выводит уже пятизначное (чтобы обработать возможное переполнение). Для работы с более простыми числами просто увеличьте части с вводом и выводом.

Ну и куда без «Hello world!»?

Velato

Вам когда-нибудь хотелось создать шедевр? Написать симфонию? Ведь программирование — это искусство! Ах, этот оркестр потоков, увертюра из инициализаций, крещендо растущих логов!..

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

Структура

Velato использует в качестве исходного кода MIDI-файлы. В качестве условных операторов язык использует ноты, чьё назначение зависит от тональности. Первой идёт «корневая» нота. Все интервалы отсчитываются от неё до следующей «корневой» ноты, которую можно менять между выражениями. Также можно играть аккорды, в которых команды выполняются в порядке представления внутри MIDI-файла, несмотря на отсутствие интервала между ними.

Примеры кода:

Сами-знаете-какая программа. Ах, эта музыка!..

Заключение


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

Подобрали два теста для вас:
— А здесь можно применить блокчейн?
Серверы для котиков: выберите лучшее решение для проекта и проверьте себя.