Архивы: по дате | по разделам | по авторам

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

Архив
автор : Зверёк Харьковский   31.03.2005

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

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

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

Мозги

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

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

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

BrainFuck [Справедливости ради, следует заметить, что язык False с компилятором в 1024 байта и престранным синтаксисом появился раньше BrainFuck’а. Впрочем, особой известности он не получил — хотя создатель, Wouter van Oortmerssen, утверждает, что именно False вдохновил и Urban’а Muller’а на BrainFuck, и Chris Pressey на Befunge (речь о котором ниже)] породил семейство продолжтаелей-подражателей-улучшателей, в той или иной мере концептуальных. «Ентузазисты» создали Brainfork (многозадачный), F*ckF*ck (каждая инструкция — неподцензурное словцо со звездочкой)[Отзыв благодарного пользователя: «С тех пор как я начал использовать f*ckf*ck, мне уже не нужно изливать мою агрессию на техсаппорт!»], DoubleFuck (вся сила — в названии); BrainFuck’офилы наплодили среды разработки программ (IDE); BrainFuck’оманы сконструировали BrainFuck-компьютер, в котором восемь инструкций языка выполняются самим процессором...

В последующие годы варианты и эпигоны классического BF расцветали один другого краше и скоро дошли до логического финала — краше было уже некуда (хотя «некуда» казался еще BrainFuck): состоящий из одних пробелов, символов табуляции и перевода строки Whitespace.

Глаза

Крис Пресси (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-мерных. На данный момент есть три языка, полностью соответствующих этому стандарту: Unefunge, Befunge, Trefunge — соответственно одно-, двух- и трехмерный языки. Клифф Биффл (Cliff L. Biffle) сотворил четырехмерный язык 4DL, «требующий некоторых усилий для визуализации».

Наследниками идеи «программирования стрелочками» стало целое семейство языков под общим названием «фунгеоидов» (fungeoid).

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

Helloworld и другие звери

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

Дуглас Адамс, «Путеводитель
Автостопщика по Галактике»


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

Сегодня трудно сказать, откуда взялась идея, что «первой программой» на новом языке всенепременно должен быть пресловутый «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 известен тем, что его интерпретатор, на нем же и написанный, занимает пятнадцать строк).
 

Мысли

На следующем витке углубления потаенного знания в моду вошла эстетика чистого охренения. На языках той поры писать было невозможно — по определению; они стали крайним проявлением недружелюбности к программисту. Принцип, заявленный еще при разработке INTERCAL’а («чтобы все вас уважали, надо заниматься тем, что никому не понятно») здесь был не просто поставлен во главу угла — возведен в идеал. На переднем крае — язык Malbolge. Такое название для языка программирования [Malbolge, «Злые Щели» (в переводе Державина) — восьмой круг Дантева Ада (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. Три последних (за авторством уже известного нам Криса Пресси) замечательны тем, что довольно вычурная идея самомодификации кода положена в основу любого действия: единственный способ управления выполнением (вместо всяких там циклов-условий-переходов) — скопировать свой собственный код «вперед», чтобы он выполнился еще раз. Писать такие программы мучительно неприятно; зато для раздвижения границ сознания концепция Сметаны или Туэ — похлеще диэтиламида лизергиновой кислоты.

Уши

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

Но на этом развлечения, как можно понять, не закончились — а продолжились и углубились. В жанре чистого фарса возникает язык Whenever, инструкции которого выполняются в случайном порядке, а не в том, в котором записаны («Это программа рано или поздно выведет таки 30 первых чисел Фибоначчи»).

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

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

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

Еда

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

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

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

Ну и, наконец, пальму первенства, некоторое время назад выданную господину Zussman, мы у него отберем — дабы вручить ее языку Haifu [Автор языка утверждает, что в названии — неочевидный каламбур: оно звучит почти так же, как Haiku (хокку), при этом на мандаринском диалекте Haifu означает «вижу утку». (А что я, что я? сам удивляюсь!)]. Это великолепно продуманная система написания программ-хокку: пять типов переменных (дерево-вода-огонь-земля-металл) со сложными отношениями между ними (дерево создает огонь, огонь разрушает металл, металл любит землю, земля боится дерева). К сожалению, ни одного «работающего» хокку на этом выдающемся языке до сих пор не создано.

Язык

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

Кроме var’aq, в природе существуют и другие «нечеловеческие» языки программирования: Ook![«Язык программирования для орангутангов», создателей которого вдохновил орангутанг-библиотекарь из книги Пратчетта (библиотекарь был превращен в орангутанга и так прижился в этом образе, что отказался «разпревращаться», когда возникла такая возможность; единственное слово, которым он владеет — У-ук, «Ook» в английской записи);]  и COW. Первый — все программы: комбинации трех высказываний «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/UISC/MISC — One-/Uni-/Minimalistic Instruсtion Set Computer).

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

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

Полный Тьюринг и его смоляная яма

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

Дуглас Адамс, «Путеводитель
Автостопщика по Галактике»

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

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

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

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

© ООО "Компьютерра-Онлайн", 1997-2018
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.