Это блюдо, кажущееся сейчас экзотическим, пожалуй, любому читателю нашей газеты, когда-то было излюбленным лакомством белорусской шляхты. Кто не верит, посмотрите в исторической энциклопедии, можно также почитать роман Владимира Короткевича "Дикая охота короля Стаха", где этот деликатес тоже упоминается.
Однако речь сейчас пойдёт не о кулинарии. Просто об экзотике, но об экзотике компьютерной. А если ещё точнее - об экзотических языках программирования. Хотя вообще-то эти языки называют эзотерическими, но экзотикой от них всё равно пахнет ощутимо.
Итак, эзотерические языки - что это такое? Это языки программирования, которые были придуманы своими авторами не для какого-либо практического применения, а просто чтобы быть придуманными. Чтобы проверить какую-то мысль автора, чтобы оставить след в истории того, что на Западе называется computer science. Поэтому от этих языков не стоит ждать чего-то фантастического. Лучшее, что они могут сделать, это дать представление о полёте программистской мысли и немного развлечь уставшего от однообразия "настоящих" языков программиста.
Как ни странно, эзотерических языков в мире не так уж мало, поэтому рассказать о всех - задача из разряда неосуществимых. Я расскажу вам о самых известных представителях славного племени экзотов.
INTERCAL
Сейчас этот язык сложно назвать самым известным из эзотерических языков программирования, однако хронологически он был первым из них, ставшим широко известным. Сложно сказать, каким образом первоначальное название языка "Compiler Language With No Pronounceable Acronym" (CLWNPA), или, по-русски, "Язык программирования с непроизносимой аббревиатурой" трансформировалось в звучное INTERCAL, но известен этот язык именно под таким далёким от первоначального названием.
Несложно догадаться, что два студента, создавшие этот язык в начале семидесятых, перевернули в нём всё с ног на голову. Операция присваивания, элементарная в любом "настоящем" высокоуровневом языке, стала отнюдь не тривиальной, а каждая вторая управляющая конструкция начинается со слова PLEASE ("пожалуйста"). Ниже приведена программа на INTERCAL, которая читает 32-битные целые числа без знака, после чего рассматривает их как числа со знаком и выводит абсолютные значения (модули) последних чисел.
DO (5) NEXT
(5) DO FORGET #1
PLEASE WRITE IN :1
DO .1 <- 'V-":1~'#32768c/#0'"c/#1'~#3
DO (1) NEXT
DO :1 <- "'V-":1~'#65535c/#0'"c/#65535'
~'#0c/#65535'"c/"'V-":1~'#0c/#65535'"
c/#65535'~'#0c/#65535'"
DO :2 <- #1
PLEASE DO (4) NEXT
(4) DO FORGET #1
DO .1 <- "V-':1~:2'c/#1"~#3
DO :1 <- "'V-":1~'#65535c/#0'"c/":2~'#65535
c/#0'"'~'#0c/#65535'"c/"'V-":1~'#0
c/#65535'"c/":2~'#65535c/#0'"'~'#0c/#65535'"
DO (1) NEXT
DO :2 <- ":2~'#0c/#65535'"
c/"'":2~'#65535c/#0'"c/#0'~'#32767c/#1'"
DO (4) NEXT
(2) DO RESUME .1
(1) PLEASE DO (2) NEXT
PLEASE FORGET #1
DO READ OUT :1
PLEASE DO .1 <- 'V-"':1~:1'~#1"c/#1'~#3
DO (3) NEXT
PLEASE DO (5) NEXT
(3) DO (2) NEXT
PLEASE GIVE UP
Я не буду подробно расписывать суть каждого оператора в приведенном листинге. Все заинтересовавшиеся могут зайти на сайт www.catb.org/~Eesr/intercal, и найти там более подробную информацию об INTERCAL'е.
Brainfuck
Этот язык сейчас можно по праву считать самым известным из эзотерических языков. Во многом своей известностью он обязан, конечно, удачному названию, которое довольно точно отражает сущность языка и при этом привлекает внимание за счёт громкого и в некотором роде хулиганского значения.
Язык этот, хотя его и можно считать высокоуровневым, принципиально отличается от большинства распространённых языков. Предположим, имеется массив из некоторых ячеек с числами (например, массив байтов). Операторы Brainfuck'а позволяют выполнять действия с ними, причём каждый оператор даёт выполнить действия только с одной ячейкой из массива. Команды языка таковы:
> - перейти к следующей ячейке;
< - перейти к предыдущей ячейке;
+ - увеличить значение в текущей ячейке на 1;
- - уменьшить значение в текущей ячейке на 1
. - напечатать (на экране) значение из текущей ячейки;
, - ввести (с клавиатуры) значение и сохранить в текущей ячейке
[ - если значение текущей ячейки нуль, перейти вперёд по тексту программы до оператора "]" (с учётом вложенности этих операторов);
] - если значение текущей ячейки не нуль, перейти назад по тексту программы до оператора "[" (с учётом вложенности).
Как правило, в интерпретаторах Brainfuck используется массив из 30000 байтов, однако теоретически ничто не мешает использовать и иные размерности, в том числе можно в качестве ячеек выбрать массив не с фиксированными, а с плавающими границами.
Программы на Brainfuck смотрятся куда экзотичнее, чем на INTERCAL. Приведенный ниже пример - это любимый всеми программистами "Hello world", т.е. программа, печатающая эту нехитрую фразу на экране.
++++++++++[>+++++++>++++++++++>+++>+<<<<-
]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.
+++.---.----.>+.>.
Что интересно, совершенно искусственный и не имеющий ничего общего с реальными задачами Brainfuck нашёл сферу, в которой он практически применяется. Это различные конкурсы и викторины, проводимые среди программистов. За счёт предельной простоты синтаксиса языка его можно изучить буквально за полчаса, после чего остаётся только напрягать извилины и писать на нём код.
Для тех, кто заинтересовался Brainfuck'ом, дам пару ссылок на ресурсы, посвящённые этому языку. www.muppetlabs.com/~breadbox/bf - официальная страница создателей Brainfuck. www.4mhz.de/bfdev.html - среда разработки (под ОС Windows) для Brainfuck.
Spoon
Spoon - это, по сути дела, тот же Brainfuck, только с другим способом записи тех же восьми команд. Вместо "+" пишем "010", вместо "-" - "011",вместо ">" - "1", вместо "<" пишем "000", "00100" вместо "[", "0011" вместо "]", "0010110" вместо "." и "01010" вместо ",". Запомнить намного сложнее, зато код получается гораздо "умнее" с виду, потому что состоит из нулей и единиц. Как, собственно, природой и положено программному коду. "Hello world" на Spoon выглядит так:
1 1 1 1 1 1 1 1 1 1 00100 010 1 1 1 1 1 1 1 010 1 1 1 1 1 1 1 1 1 1 010 1 1 1 010 1 011 011 011 011 000 0011 010 1 1 001010 010 1 001010 1 1 1 1 1 1 1 001010 001010 1 1 1 001010 010 1 1 001010 011 011 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 001010 010 001010 1 1 1 001010 000 000 000 000 000 000 001010 000 000 000 000 000 000 000 000 001010 010 1 001010 010 001010
AAAAAAAAAAAAAA!!!!
Впрочем, Brainfuck'у со Spoon'ом всё ещё далеко до одного языка программирования, у которого даже название сложно правильно записать с первой попытки, не ошибившись в количестве букв. Все команды в этом языке состоят из четырёх символов - буквы "A", запятой, восклицательного знака и пробела. "Hello world" на этом языке имеет довольно длинный исходный код, поэтому ниже приведён текст программы, печатающей только первые две буквы этой фразы.
AA AAA AA AA, AAA, AAA, AA A AAA, AA A AA A AA A AAA, AA A AA A!
AA AAA AA A, AAA AAAAA A AAAA, AAA!
AA AAAA AA! AAA A AAA AAAA! AAA A AA AAAA AAA, AA A, AAA AAA, AA A AA A AA A,
AAA AAA, AA A AA A! AAAA A AAA!
Whitespace
Если каждый из описанных выше языков, какими бы экзотичными они не были, можно было хотя бы снабдить примером программы на этом языке, то с Whitespace такого не выйдет. Почему? Дело в том, что программы на этом языке, конечно, имеют исходный код, однако в вывернутом наизнанку Whitespace в качестве управляющих используются символы, которые в большинстве языков игнорируются - то есть, пробелы, табуляции и перевод каретки на новую строку. Интересным эффектом такого подхода является то, что текст программы на Whitespace можно скрыть внутри текста на "настоящем" языке.
Несмотря на то, что Whitespace - один из самых молодых эзотерических языков (впервые он был опубликован первого апреля 2003 года), его известность уже практически сравнялась с известностью Brainfuck'а. Вполне возможно, что авторам этого языка удастся на основе своей идеи создать что-то большее, чем программистскую игрушку, потому что скрытие кода одной программы в другой - это действительно интересно. Пока же с результатами их деятельности можно ознакомиться по адресу compsoc.dur.ac.uk/whitespace.
Конечно, эзотерических языков много больше, чем я смог упомянуть в этой статье. Особенно много тех, которые, как Spoon, меняют синтаксис Brainfuck'а, не изменяя при этом самих принципов организации языка. Например, язык Ook! заменяет операторы Brainfuck'а на различные комбинации "Ook" с разными знаками препинания между ними. Есть и такие языки, которые придуманы специально для вывода фразы "Hello, world!" и ни на что другое не способны. Это, например, такие языки, как H или Hello. Более "продвинутый" HQ9+ умеет также печатать текст самой программы и текст песни "99 бутылок пива" (на английском языке, разумеется). Многие эзотерические языки, как и Whitespace, придуманы для маскировки программного кода под что-то другое. Например, Chef маскирует программы под кулинарные рецепты, а Shakespeare - под... пьесы Шекспира. Языки FALSE и Malbolge пошли ещё дальше - они маскируют код программы под случайную последовательность символов, не имеющую никакого смысла. При этом Malbolge знаменит тем, что не существует программ, написанных на нём непосредственно человеком - все программы генерируются другими программами, написанными на языках, доступных пониманию человека. Но самым экзотичным, пожалуй, стоит признать язык Piet, в котором текст программы не пишется, а рисуется из разноцветных прямоугольников (хотя при этом утрачивает смысл само понятие "текст программы").
Вот, собственно, и всё, что я хотел сказать об эзотерических языках программирования. Конечно, вряд ли они сильно пригодятся в повседневной жизни, однако почему бы и не знать о них, верно? Знания такого рода редко бывают лишними.
Вадим СТАНКЕВИЧ
Горячие темы