Путеводитель автостопщика по потаенным знаниям

Лекция, непрочитанная автором в Потаенном Институте Несуществующих Стандартов

Автор: Зверёк Харьковский
Источник: Компьютерра №12 - 2005 (584)
Опубликовано: 01.04.2005
Версия текста: 1.0

– Форд! – выговорил он, – там, снаружи, бесконечно много обезьян. 
И они хотят обсудить с нами «Гамлета», который у них получился.
Дуглас Адамс, «Путеводитель Автостопщика по Галактике».

Тяга человека и человечества к потаенному знанию – извечная наша слабость и любовь, что тянет нас от восточного золотого века к западному техногенному раю... (автор задумывается, куда бы выбраться из замысловатой фразы и решает начать заново)

Короче говоря, потаенное знание – это такая штука, перед которой не устоять ни Умберто Эко, ни Берду Киви. Придумать/открыть что-то невиданное, что-то, от чего все ахнут – это соблазн, да. А самое забавное – что техногенной цивилизации от этих тайн (точнее, без них) – никуда. Если бы никто не открывал Тайны Природы, жить было бы существенно неудобнее, а если бы никто не открывал Тайные Общества – тогда скучнее.

В конце-то концов, если бы никто не создал Тайные Языки Программирования – этой лекции вообще могло бы не быть, а это уже, между прочим, вообще ни в какие ворота. Потому что нельзя же все время писать, к примеру, о языке С++ – а все остальные языки, на которых пишут серьезные лохматые граждане программистской национальности либо произошли от сиплюсплюса, либо вообще никому не нужны. Так что будем говорить о языках, на которых серьезные граждане писать не станут. Потому что они о них не знают. (Мы-то знаем, но мы, опять же, не такие серьезные.)

 

Потаенные (англ. esoteric – они же эзотерические, тайные и понятные лишь посвященным) Языки Программирования испокон веков (1972) создавались для раздвижения границ возможного, удивления себе подобных и почесывания левой пяткой правого уха – только не для того, чтобы писать на них программы (да, кстати, я еще не говорил? именно в этом их прелесть).

 

В те дни души были смелыми, ставки – высокими, 
мужчины были настоящими мужчинами,
женщины – настоящими женщинами,
и мохнатые зверюшки с Альфы Центавра –
настоящими мохнатыми зверюшками с Альфы Центавра.
Дуглас Адамс, «Путеводитель Автостопщика по Галактике».

 

История Посвященных начата «26 мая 1972 года, ранним утром» Доном Вудсом и Джеймсом Лионом – людьми совершенно даже несерьезными и, возможно (хотя и вряд ли) даже не особо лохматыми. То раннее утро – день рождения языка, роль которого в компьютерном мире не меньше, чем в общекультурном – роль Бориса Виана и Дугласа Адамса, Терри Пратчетта и Монти Пайтона; всех тех, для кого светлые идеалы глумления над психикой читателя превыше банальной житейской логики. Потаенный Язык Программирования, названный «Compiler Language With No Pronounceable Acronym» (Компьютерный Язык С Непроизносимой Аббревиатурой, сокращенно – для удобства – INTERCAL), был преподробнейшим образом описан в руководстве из 8 частей и оставил неизгладимый след на психике всех, кто когда-либо с ним столкнулся. То был язык, базой для которого не стали Фортран и Бейсик, Алгол и PL/I, Lisp и APL, и даже появившиеся намного позже C, Pascal, Java и Prolog. То был язык, сокровенным смыслом которого стала ни-единой-командой-не-похожесть-ни-на-что (Заметим, что по несчастливой случайности, эта цель так никогда и не была достигнута. Одна команда языка INTERCAL совпала по смыслу с одной из команд советского-социалистического-ордена-ленина-и-трудового-красного-знамени-компьютера БЭСМ-6. Что в очередной раз демонстрирует.). То был язык, в котором иногда к инструкциям надо добавлять ПОЖАЛУЙСТА (PLEASE), команда ПОЖАЛУЙСТА ЗАБУДЬ (PLEASE FORGET) прерывает безусловный переход, а команда ВОЗДЕРЖИСЬ ОТ ПРИПРЯТЫВАНИЯ (DO ABSTAIN FROM STASHING) отключает во всей программе команду ПРИПРЯТАТЬ (STASH) (А уж что делает эта команда! Ууууу... словами такое не передать.).

«1.3. Благодарности. Мы глубоко обязаны Eric M. Van и Daniel J. Warmenhoven, без чьей невольной помощи это руководство все равно было бы написано.»

И то было, наверное, единственное Руководство, в котором символ двойной кавычки именовался «кроличьи уши», знак равенства – «полрешетки» («решеткой» назывался символ «#») а глава «Подробное описание» начиналась бессмертной фразой: «Возможно, программисту, прочитавшему первые примеры программ, язык показался излишне эзотерическим. Чтобы усилить это чувство, написано подробное описание.» Может быть, последующая история Потаенных Языков и принесла более увлекательные экземпляры, но документа, близкого по эпической силе к «Справочному Руководству INTERCAL'а», в ней больше не появится.

 

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

 

…никому так и не удалось воспроизвести обстоятельства 
произошедшего, причем многие экспериментаторы
при этом попали либо в дурацкое положение,
либо на тот свет, либо и туда, и туда одновременно.
Дуглас Адамс, «Путеводитель Автостопщика по Галактике».

...Язык звался BrainFuck (что можно литературно перевести как «Великая Загадка Для Ума, Об Кою Многие Из Мудрейших Сломают Копья») и выглядел так же. Впрочем, в отличие от великолепного INTERCAL'а – BF создавался скорее как «proof-of-concept», нежели чистый стёб. Шутка ли – совершенный, современный, Тьюринг-полный язык – с размером компилятора в 240 байт! Это был технологический прорыв, и даже более того – это было удивительно забавно. Крайнее выражение того, что принято звать «птичий язык», BrainFuck-программа составляется из 8 разных символов-инструкций. Вот эдак:

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

(это, вестимо, «Hello world!» на BrainFuck'е) Главной магией этого странного языка, кажется, стала мысль «ёлки зелёные, а ведь и так можно!» Можно – довести любое свойство языка (например, количество инструкций; позже появятся и другие ориентиры для «концептуальных улучшений») до абсурда, до максимума, до планки – а потом отбежать в сторонку и посмотреть, что получилось. Можно – сделать из языка программирования одновременно анекдот и объект поклонения (а еще – новое слово в компьютерной науке, образец для подражания и головоломку почище кубик-рубика). Можно – раздвигать границы разумного: чегой там у нас за границами? Можно – почти всё.

В 72-ом INTERCAL был знаком того, что и язык программирования может быть шуткой (да время тогда было такое: первохакерам все было – шутка); в 93-ем BrainFuck создал без малого новую отрасль: компьютерную эзотерику, нечто вроде гимнастики на ниве научного креатива – «как бы так извернуться, чтобы все вокруг обалдели».

ПРИМЕЧАНИЕ

Справедливости ради, следует заметить, что язык False с компилятором в 1024 байта и престранным синтаксисом появился раньше BrainFuck'а. Впрочем, особой известности он не получил – хотя создатель, Wouter van Oortmerssen, утверждает, что именно False вдохновил и Urban'а Muller'а на BrainFuck, и Chris Pressey на Befunge (речь о котором ниже).

Окромя этой (весьма наукоемкой) отрасли, BrainFuck породил семейство продолжтаелей-подражателей-улучшателей, в той или иной мере концептуальных. «Ентузазисты» создали Brainfork (многозадачный), F*ckF*ck (каждая инструкция – неподцензурное словцо со звездочкой), DoubleFuck (вся сила – в названии); BrainFuck’офилы наплодили среды разработки программ (IDE); BrainFuck’оманы сконструировали BrainFuck-компьютер, в котором 8 инструкций языка выполняются самим процессором...

ПРИМЕЧАНИЕ

Отзыв благодарного пользователя: «С тех пор как я начал использовать f*ckf*ck, мне уже не нужно изливать мою агрессию на техсаппорт!»

В последующие годы варианты и эпигоны классического BF расцветали один другого краше и скоро дошли до логического финала – краше было уже некуда (хотя «некуда» казался еще BrainFuck): состоящий из одних пробелов, символов табуляции и перевода строки Whitespace; «псевдомашинный» язык вида «единичка-нолик» Spoon... (There is no spoon, Neo! – выкрикивает докладчик, теряя нить рассуждений)


Рисунок 1. Слева – Brainfuck IDE, вид спереди; справа – Brainfuck-компьютер, вид удручающий.

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

 

Крис Пресси (Chris Pressey) – имя ученого, выведшего молодую отрасль на качественно новый уровень: созданный им язык Befunge был двухмерным. Код на Befunge – аккуратненькая решетка 80х25 символов, по которой интерпретатор программы должен перемещаться, следуя символьным стрелочкам (v ^ < > – вверх-вниз-влево-вправо). Вот маленькая программа – генератор случайных чисел:

 vv  <      <
     2
     ^  v<
  v13v4
     ^   ^
 >  >?>  ?>5^
     v   v
  v97v6
     v  v<
     8
  .  >  >   ^
 ^<

Впоследствии Крис признался, что главной его целью было – создать язык, максимально сложный для компиляции; немедленно после создания языка компиляторы Befunge расплодились во множестве. Первый Befunge-93 из-за ограниченности «игрового поля» размерами 80х25 (один экран стандартного терминала) не был Тьюринг-полным (позволял решить лишь ограниченный класс задач); эволюционный процесс и естественный отбор породили стандарт Funge-98, обобщивший принципы для поля любых размеров, а так же для языков n-мерных. На данный момент существует 3 языка, полностью соответствующих этому стандарту: Unefunge, Befunge, Trefunge – соответственно одно-, двух- и трех-мерный языки.

Наследниками идеи «программирования стрелочками» стало целое семейство языков под общим названием «фунгеоидов» (fungeoid): 23 (в узлах сетки расположены символы backspace – код 23), Argh!, Aura, Gammaplex, ZT... Сам Крис Пресси соорудил еще и язык Wierd (его название – «странное написание» английского слова «weird» – «странный»), чьи программы выглядят как «дорожки», выложенные символом *, а команды определяются углами перехода от одной дорожки к другой. Крис уверял, что создал язык для тех, кому Befunge показался сложноват; для тех же, кому хотелось чего-нибудь поэкзотичнее, Клифф Биффл (Cliff L. Biffle) сотворил 4-мерный язык 4DL, «требующий некоторых усилий для визуализации».

Создание программ на фунгеоидах стало пересечением науки компьютерного программирования с искусством абстрактной живописи; крайним выражением идеи «языка-картинки» стал язык имени датского пионера геометрической абстракции Piet Mondrian. Язык Piet вместо приевшихся символов использует цветовое кодирование выражений и данных; 20 базовых цветов и сложные правила создания цветовых блоков делают Piet-программу великолепным образчиком мирного сосуществования тонкого эстетства и изысканного умствования. Анализ Piet-кода стал гвоздем программы студенческой Охоты За Тайнами 2002 года.

ПРИМЕЧАНИЕ

«Охота За Тайнами» («Mystery Hunt») – ежегодный развлекательный конкурс задач-головоломок в MIT, традиционно проходящий во время январских каникул.


Рисунок 2. Слева – дизайн системы на языке ZT; справа – Hello world, Фибоначчи и Ханойские башни на Piet. 

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

 

На следующем витке углубления потаенного знания в моду вошла эстетика чистого охренения. На языках той поры писать было невозможно – по определению; они стали крайним проявлением недружелюбности к программисту. Принцип, заявленный еще при разработке INTERCAL'а («чтобы все вас уважали, надо заниматься тем, что никому не понятно») здесь был не просто поставлен во главу угла – возведен в идеал. На переднем крае – язык Malbolge. Такое название для языка программирования (Malebolge, «Злые Щели» (в переводе Державина) – восьмой круг Дантева Ада (Inferno)) его автор Ben Olmstead объясняет безыскусно: «хотелось сделать максимально адский (Infernal) язык из всех возможных». В общем и целом, это вполне удалось: потребовалось всего два года, чтобы создать первую работающую программу на Malbolge (более того, эта программа была не написана собственноручно программистом, а «найдена» специальной исследовательской программой на языке Lisp). Этой первой программой стал классический «Hello world» – вот такой:

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

Стоит заметить, что Malbolge взял очень важную планку: эзотерические языки программирования стали объектом исследования. «Как написать работающую программу на Malbolge» – это была задачка, об которую очень и очень стоило поломать голову; золотыми буквами в историю языка вписаны имена Энтони Йонаса, опубликовавшего несколько работающих программ, но не раскрывшего секрета их написания, Лу Шеллера, проведшего криптоанализ (sic!) языка, Томаса Вергзановски, создавшего генератор несложных, но работающих программ... (...которые в несколько раз больше аналогичных программ Энтони Йонаса, по сию пору хранящего свои секреты.)

Подобно Malbolge, «вещью в себе», то есть объектом, а не инструментом изучения, стали: язык Thue, основанный на исчислении Thue, созданном одноименным норвежским математиком; ALPACA – язык клеточных автоматов (игру «Жизнь» помните? – натуральный клеточный автомат); линейка языков Smetana-SMITH-Muriel. Три последних (за авторством уже известного нам Криса Пресси) замечательны тем, что довольно вычурная идея самомодификации кода положена в основу любого действия: единственный способ управления выполнением (вместо всяких там циклов-условий-переходов) – скопировать свой собственный код «вперед», чтобы он выполнился еще раз. Писать такие программы мучительно неприятно; зато для раздвижения границ сознания концепция Сметаны или Туэ – похлеще диэтиламида лизергиновой кислоты. Впрочем, все эти «игрушки» меркнут перед «воплощенной сложностью» в лице Malbolge – и в благодарной памяти потомков он остается единственным вечноживущим языком из категории «чистого охренения».

 

Сосиски, подумал он. Нет больше горячих сосисок! 
Артур потерял сознание.
Дуглас Адамс, «Путеводитель Автостопщика по Галактике».

 

(сильно посуровев) Ну да фиг с ними, с исследованиями и концепциями. В конце концов, язык, для которого какой-то «Hello, world!» нужно два года писать – это и забавно (Впрочем, не для пишущего.), но все же попахивает излишней затеоретизированностью; и языкостроители пробуют себя в наилегчайшем жанре пародии и фарса. Несомненная пальма первенства (вместе с кадкой) здесь принадлежит человеку по имени John Unger Zussman, еще в 1982 году опубликовавшему пародийный список «малоизвестных языков». Каждому из языков была выделена всего пара фраз, в которых с убийственной точностью были обгажены все священные коровы того времени: SIMPLE (Одноцелевой Язык Для Абсолютных Идиотов) – в пику BASIC (Многоцелевому Языку Для Начинающих); C- («язык настолько низкоуровневый, что для любой задачи требует больше инструкций, чем язык машинных кодов») – издевательство над «системным» C; SARTRE («инструкции здесь не имеют смысла, они просто существуют ... программисты погружены в депрессию и скуку»), названный в честь экзистенциалиста Сартра, как Pascal – в честь математика Блеза Паскаля; Лишп («примечателен тем, что не имеет буквы 'с' и вынужден заменять ее на 'ш' ... удобен для обработки шпишков») – толстый намек на странноватый синтаксис Лиспа...

В оригинале язык Lithp для обработки lithtth

Спасибо Кодту за уточнение: «Кстати, lithp — это толстый намёк и доведение до логического конца значения слова "lisp" — "шепелявить". И если lisp (про его синтаксис говорят — lots of incredibly silly parenthesis) шепелявит только в названии, то lithp — повшемештно».

Но на этом развлечения, как можно понять, не закончились – а продолжились и углУбились. В жанре чистого фарса возникает язык Whenever, инструкции которого выполняются в случайном порядке, а не в том, в котором записаны. Схожие идеи заложены в остросатирической Java2k – подобно тому, как оригинальная Java от Sun «освобождает память в случайные интервалы времени», программы Java2k имеют несколько альтернатив каждой функции, а какую из альтернатив выполнить – решается случайным образом во время выполнения программы. В той же парадигме «случайного» или «побочного» (incidental) программирования построен FiPL (Fish Programming Language – язык программирования рыбки) – вся работа происходит на изображении рыбки, разделенном на множество частей, случайным образом меняющих свой цвет.

СОВЕТ

Из мануала Whenever: «Это программа рано или поздно выведет таки 30 первых чисел Фибоначчи».


Рисунок 3. Рыбка.

По большому счету, жестокие шутки над модными парадигмами программирования – любимое развлечение доброй половины энтузиастов языкопроизводства; одна из причин такого внимания – дурная привычка «теоретиков от программирования» любую мелкую рекомендацию обзывать малопонятным словом «парадигма». К примеру, отечественная разработка – «Программирование снизу вверх наискосок (свн)» – сокрушительный удар по «структурному», «модульному», «восходящему» и «нисходящему» программированию; а кроме того, неплохо демонстрирует особенности национального характера. Когда новое программистское поветрие сделало парией инструкцию goto, а слову «спагетти» придало новый, сугубо негативный смысл – это поветрие естественным образом принесло с собой языки с говорящими именами: GOTO++ и Spaghetti.

СОВЕТ

Из мануала свн: «Многие западные программисты утверждают, что прежде чем начинать писать программу, необходимо время на обдумывание алгоритма, а некоторые даже призывают вникнуть в суть задачи, которую предстоит решать. Категорически не следует интересоваться постановкой задачи до момента получения готовой программы.»


Рисунок 4. Язык Spaghetti. Рабочий прототип.

Созданный Минобороны США «максимально безопасный» язык Ada получил антипода – язык paranoid, который, как следует из названия, доводит стремление к «безопасному выполнению» до паранойи. Некоторые его конструкции достойны немедленного цитирования (с синхронным переводом):

      //типы данных:
х: сомнительное целое;
а: мало_похоже_на массив [x..y а_может_быть z] каких_нибудь символов;
L: безнадежно_поврежденный список слишком_маленьких целых;
//присвоение значения переменной:
x ТОЧНО3;
x ЧЕСТНОЕ_СЛОВО3;
x МАМОЙ_КЛЯНУСЬ3;
//условия:
ЕСЛИ y ЧТО_ТО_ОКОЛО8 ...
ПРИ_МАЛЕЙШЕМ_ПОДОЗРЕНИИ_ЧТО x < 100...
//вызов процедуры:
СБЕГАЙ_КА_ПОИЩИ имяпроцедуры;

В конце концов, сама тенденция создания все новых и новых языков-пародий – сама стала жертвой пародии: появление языка с лаконичным и запоминающимся названием TMMLPTEALPAITAFNFAL («МногоМиллионный Языковый Проект, Заканчивающий Все Языковые Проекты, А Кстати, Не Кажется Ли Вам, Что Это Неплохое Имя Для Языка Программирования») положило край разгулу пародий. Все поняли: нужно что-то новое, потому что расскажи я про еще одну пародию – все точно заснут.

 

Тем не менее, никто точно не знает, зачем он это делает, 
потому что он неизменно выдает чашку жидкости,
которая почти, но все-таки не совсем, непохожа на чай.
Дуглас Адамс, «Путеводитель Автостопщика по Галактике».

 

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

Бронзовая медаль в категории «Почти, Но Не Совсем» достается языку Chef, каждая программа которого обязана выглядеть как рецепт (в идеале – рецепт чего-нибудь съедобного): имена переменных – овощи-фрукты, значения – количество ингредиентов (в граммах, литрах или щепотках); после описания переменных идет тело программы, состоящей из несложных операций, обозначаемых словами «положить в кастрюлю», «перемешать», «подогреть», «подавать на стол». В целом, из-за очень ограниченного количества операций, записать программу в виде рецепта чего-нибудь по-настоящему съедобного тяжеловато.

Серебряная медаль в этой категории принадлежит языку Shakespeare. Название с очевидностью указывает на необходимость записи алгоритма языком шекспировской пьесы: переменные-«актеры» «общаются» друг с другом, присваивая друг другу значения оператором «ты так же красив, как значение» (или «ты так же туп, как значение»); выводят эти значения оператором «открой свою душу!»; переходят между частями программы, сообщая «Давайте перенесемся в сцену III». Самый цимус языка Шекспира – в способе формирования этих значений; они вовсе не записываются цифрами (как у людей), а формируются комплиментами и ругательствами. Все просто: красивое существительное (скажем, «роза») – это 1, некрасивое («свинья») -1; по той же логике, красивое прилагательное – умножение на два, а некрасивое – деление. Наслаждайтесь!

Ну и, наконец, пальму первенства, пару страниц назад выданную господину Zussman, мы у него отберем – с целью вручить ее языку Haifu. Это великолепно продуманная система написания программ-хокку: пять типов переменных (дерево-вода-огонь-земля-металл) со сложными отношениями между ними (дерево создает огонь, огонь разрушает металл, металл любит землю, земля боится дерева), с логическими значениями Инь и Янь; течением программы управляет Небесная Канцелярия, по команде «Нирвана» прекращающая работу; и еще десятки правил. К сожалению, ни одного «работающего» хокку на этом выдающемся языке до сих пор не создано; не известно также, возможно ли это в принципе. Что ж поделать – искусство требует жертв; в конце концов, искусство создавать «обыкновенные» (читай – непрограммистские) хокку тоже не каждому дано.

ПРИМЕЧАНИЕ

Автор языка утверждает, что в названии – неочевидный каламбур: оно звучит почти так же, как Haiku (хокку), при этом на мандаринском диалекте Haifu означает «вижу утку». (А что я, что я? сам удивляюсь!)

 

...библиотекарь неторопливо произнес: – У-ук.
Терри Пратчетт, «Плоский Мир».

...Новое направление раздвижения границ разумного: языки программирования, в основе которых – нечеловеческая логика. В конце концов, если мы (человечество) не одиноки во Вселенной, отчего бы не предположить, что и мы (программисты) – тоже неодиноки. От этого предположения уже остается один шаг от языка программирования var'aq, который предположительно используется расой Клингонов из культового сериала «Star Trek». Попытка воссоздания этого языка программирования не так анекдотична, как может показаться – ведь лингвистический Klingon Language Institute, занимающийся изучением «повседневного клингонского», существует на полном серьезе – а чем «компьютерный клингонский» хуже? Его воссозданием увлеченно занимается Брайан Коннорс (при поддержке вездесущего эзотерика Криса Пресси).

Кроме var'aq, в природе существуют и другие «нечеловеческие» языки программирования: Ook! и COW. Первый – «язык программирования для орангутангов», создателей которого вдохновил орангутанг-библиотекарь из книги Пратчетта (библиотекарь был превращен в орангутанга и так прижился в этом образе, что отказался «разпревращаться», когда возникла такая возможность; единственное слово, которым он владеет – У-ук, «Ook» в английской записи); все программы – комбинации трех высказываний «Ook?», «Ook!» и «Ook.» Коровий язык COW – по тем же правилам строится из фраз «Moo MOO moO»; оба они – всего лишь разновидности классического BrainFuck'а.

 

...А я на нем программировал!
Валерий Викторович Лаптев о языке Автокод Инженера.

Честное имя эзотерического языка – элитного знания для посвященных (точнее, для тех, кому не лень потратить на это время) – далеко не всегда используется как категория чистой науки. Я вынужден с прискорбием признать, что это светлое имя иногда навешивают как позорное клеймо на неугодные языки. С другой стороны, и здесь есть повод для оптимизма: настоящие ценители заклейменного языка чаще всего принимают обвинения в эзотеричности как заслуженный комплимент. В разные времена и у разных авторов в эзотеричности обвинялись Perl, C++, PL/I. Большинство современных авторов относят к эзотерическим некогда популярные языки обработки текста APL и SNOBOL. Та же участь постигла некоторые странные диалекты известных языков, например Quake C и микрософтово детище MC++. И, наконец, большинство канонических списков эзотерических языков включает «AvtoKod Ingenera for Minsk family of computers».

 

– Короче, – заявил Артур, – много ли вашего времени я сэкономлю, 
если плюну на все, и сойду с ума прямо сейчас?
Дуглас Адамс, «Путеводитель Автостопщика по Галактике».

К сожалению, в единственном докладе невозможно охватить всю отрасль (Возможно, конечно. Берем докладчика без чувства самосохранения...) – мы можем лишь очертить ее границы. За кадром остались отечественный smilescript и зарубежный emoticon (языки, состоящие из одних смайликов); функциональные языки Unlambda, iot и Lazy K; хипповый Beatnik и странноватый []; reMorse – программирование азбукой Морзе, и сотни других. Тема отдельного исследования – эзотерические компьютеры (подобные уже упомянутому BrainFuck-компьютеру), проект эзотерической операционной системы ESO (Справедливости ради, заметим, что в этом последнем самое занимательное – название.) и различные варианты компьютеров с единственной инструкцией (OISC/URISC/MISC – One/Uni-/Minimalistic Instruсtion Set Computer). Но мы надеемся, что чуткий и пытливый наш слушатель нашел в этой короткой лекции пищу для ума; или хотя бы не заснул.

Спасибо за внимание.

(Жидкие аплодисменты, переходящие в изгнание с позором)

[Врезка] Helloworld и другие звери

– Муснараа, – промолвил Форд Префект. 
То было словечко из языка Бетельгейзе,
которое он всегда произносил, когда знал,
что надо что-то сказать, но не мог придумать что.
Дуглас Адамс, «Путеводитель Автостопщика по Галактике».

Сегодня трудно сказать, откуда взялась идея, что «первой программой» на новом языке всенепременно должен быть пресловутый «Hello, world!» Тем не менее, вывод на экран сакраментального приветствия – универсальное начало трудовой деятельности в недружелюбной обстановке. Для эзотерического языка – это почти необходимый минимум. Кстати, есть и исключения: на фунгеоиде BDAMD из-за некоторых технических ограничений максимально возможная программа выведет лишь «HI»; соответствующая программа на var'aq печатает менее дружелюбную фразу «What do you want, universe?» («Че те надо, Вселенная?»), да и ту на Клингонском.

Следующая по сложности программа-тест, с циклами и арифметикой – «99 бутылок пива»: нужно вывести надпись «99 бутылок пива стоят на стене. Одна упала. 98 бутылок пива стоят на стене. Одна упала. 97 бутылок...» Это уже не каждому эзоязыку под силу.

И высший уровень мастерства, требующий немалых усилий даже на «нормальном» языке программировании – так называемый quine. Этот класс программ, названный в честь логика Уилларда Куина (Willard Quine), которые выводят свой собственный текст – от первой и до последней буковки. Решение такой задачи – уже требует специалиста уровня «вах!».

Эта троица тестов породила язык-шутку HQ9+,а состоящего из всего четырех инструкций: H выводит «Hello, world!», Q печатает текст самой программы, 9 – 99-бутылочный тест, а + – увеличивает значение внутренней переменной (без всякого умысла – прочитать это значение все равно нельзя). Таким образом, на языке HQ9+ стандартные тестовые задачи выполняются лаконичнее, нежели на любом другом. К слову сказать, существует и современная версия – объектно-ориентированный HQ9++, в котором новая команда ++ создает объект. В соответствии с принципом сокрытия информации, доступ к этому объекту невозможен.

Заметим, что при всей своей прогрессивности, HQ9+ не позволяет выполнить еще одну классическую тестовую задачу: написание интерпретатора языка на нем самом (к примеру, язык Lisp известен тем, что интерпретатор Лиспа, написанный на Лиспе, занимает 15 строк).

[Врезка] Полный Тьюринг и его смоляная яма

«Нет ничего проще» – говорит Человек, 
и на бис доказывает, что белое – это черное,
после чего на следующем пешеходном
переходе его сбивает машина.
Дуглас Адамс, «Путеводитель Автостопщика по Галактике».

Понятие «Тьюринг-полноты» ведет свое начало от гипотетической универсальной машины Тьюринга, созданной одноименным математиком. Очень грубо говоря, это бесконечная лента, в каждой ячейке которой находится некоторое значение, и считывающая головка на этой ленте. За один «шаг» машина Тьюринга может сместить головку или прочитать/записать значение ячейки.

Ценность этой маловнятной метафоры в том, что любой современный компьютер по вычислительной мощности эквивалентен машине Тьюринга – то есть может выполнять те (и только те) задачи, что и эта машина. Соответственно, языку программирования достаточно быть «Тьюринг-полным» (эквивалентным той же машине) для создания абсолютно любой программы, возможной на современном компьютере.

Языки с очень маленьким количеством инструкций (BrainFuck’ообразные), как правило, являются прямым воплощением машины – то есть их инструкции это как раз «сместиться вперед», «сместиться назад», «прочитать значение», «записать значение». Сленговое название таких языков – «Turing tar-pit» («Тьюрингова смоляная яма») – пошло от известной фразы «Бойтесь смоляной ямы Тьюринга – где все возможно, но ничего интересного просто не сделаешь». И поистине, создание на BrainFuck'е мало-мальски серьезной программы требует почти нечеловеческого напряжения сил.

Интересные факты из истории: «аналитическая машина» Чарльза Бэббиджа была бы Тьюринг-полной, будь она когда-нибудь создана; Z3 Конрада Цузе была таковой – но доказано это было через много лет после создания; первым «сознательно» Тьюринг-полным компьютером стал ENIAC; Тьюринг-полны квантовые компьютеры (а значит, имитируемы на обычных и наоборот). Существует также гипотеза, что Вселенная является Тьюринг-полной системой.

[Врезка] Приют для бездомного эзотерика

Нагляднее всего это продемонстрировали знаменитые 
эксперименты с рыбными сандвичами, проведенные
Зарквон знает сколько тысячелетий назад в МИМБВСЧНЕОВ
(Максимегалонском институте медленного и болезненного
выяснения самых что ни на есть очевидных вещей).
Дуглас Адамс, «Путеводитель Автостопщика по Галактике».

Скептически (или просто сурьезно) настроенный читатель может предположить, что весь этот эзотерический фейерверк никому, в общем, не нужен. «И будет, как всегда, в корне неправ» – как любил утверждать Ильич (по крайней мере, в анекдотах). В мире существует несколько весьма серьезных организаций, принимающих судьбу эзотерики в компьютерных науках близко к сердцу – и немало для оной эзотерики делающих.

Первый среди равных, естественно Потаенный Институт Несуществующих Стандартов (ENSI – альтернатива Американскому Национальному Институту Стандартов ANSI). Цель Института – создавать стандарты, которым НЕ должны соответствовать эзотерические языки. На данный момент Институт состоит из одного существующего члена, 203 несуществующих и еще троих существующих, чье существование Институтом отрицается. Кроме того, все мировые сообщества, состоящие из 0 и менее членов, автоматически входят в состав Института – это правило, кстати, порождает интересную философскую проблему: если Институт когда-либо потеряет своего единственного действительного члена, он будет включать сам себя.

Институт проводит ежегодное награждение Essie Esoteric Awards, в рамках которого награждаются свежесозданные эзотерические языки, новые воплощения старых языков, сложные программы на эзотерических языках и другие схожие проекты. В этом году Essie будет проводиться в пятый раз.

Из общеэзотерических стоит отметить еще ресурс Криса Пресси Cat's Eye (под девизом «Вычисления Должны Быть Интересными»), «Энциклопедию Идиотских Языков» (Stupid Languages Enciclopedie) Георга Крамла и сайт Девида Моргана «Danger Mouse». В конференции alt.lang.intercal обсуждают основные живые эзоязыки: INTECAL, BrainFuck, Befunge и Malbolge – а также и прочие, но существенно реже. И конечно же, любой исследователь не должен забывать о хранилище мирового разума: Google и Wikipedia.

Счастливого плаванья!


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