Pull to refresh

Языки программирования: первая шутка

Programming *
В языках программирования есть свои шутники и свои шутки. Собственно, большинство эзотерических языков программирования задумывались именно как шутки (конечно, если не как вызов общественности, как F*ckf*ck, или как упражнение для ума, как Brainfuck). Но есть один язык, который по праву заслужил почетное звание Первой Шутки. В далеком 1972 году, когда все существующие языки программирования были исключительно целесообразны и убийственно серьезны, ранним утром 26 мая пара шутников раздвинула границы сущего и придумала принципиально новый язык. Они окрестили его «Compiler Language With No Pronounceable Acronym», что по очевидным причинам сократилось до INTERCAL.

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

Прежде всего, справочное руководство. Позднейшие эзотерические языки концентрируют свою необычность в самой сути языка, их руководства ограничиваются сухими фактологическими описаниями команд и особенностей. The INTERCAL Programming Language Reference Manual — уникальное описание языка программирования, с эпиграфами из «Алисы в Стране Чудес» и ехидными комментариями, сказанными совершенно серьезным тоном. Кроме того, специально для этого языка авторы разработали систему эвфемизмов для использующихся служебных символов: ' — искра, " — кроличьи ушки, . — пятно, : — двойное пятно, , — хвост, ; — гибрид (хотя логичнее было бы «пятнистый хвост»), $ — большие деньги, ~ — загогулина и т.д. (полный список прилагается к руководству). Комбинирование кроличьих ушек с пятном для получения кролика запрещено!

Далее, сообщения об ошибках. В порядочных языках сообщения об ошибках информативны и точно указывают на причины произошедшего. В непорядочных — напротив, сообщения либо универсальны, либо подбрасывают неправильные причины ошибки. Ошибки INTERCAL так же ехидны, как и руководство, и без справочника не расшифровываются принципиально. В самом деле, можно догадаться, что E252 «Я забыл, что я собирался сказать» — ошибка переполнения памяти при операциях ввода-вывода, а E182 «Кажется, тебе очень нравится эта метка» — ошибка использования одной и той же метки несколько раз. Но кому в здравом уме и твердой памяти придет в голову, что E405 «Программа отвергнута из соображений психического здоровья» сигнализирует об использовании команд многопоточности или вычислений с откатами без соответствующей опции компилятора, E017 «Что, я правда должен с этим разобраться?» — об использовании констант неправильного диапазона, а E127 «Говорить „абракадабра“ без волшебной палочки совершенно бесполезно» — о том, что стандартная библиотека не подключена?

Некоторые ошибки вообще не имеют аналогов в других языках. Так, пара E079 «Программист недостаточно вежлив» и E099 «Программист слишком вежлив» относятся к количеству идентификаторов команды PLEASE в программе (кстати, никакой другой смысловой нагрузки идентификатор PLEASE не несет). Ошибка E774 «Случайный баг компилятора» полностью соответствует своему названию — возникает случайно и при повторной компиляции обычно пропадает. E995 «Что, я правда должен был это реализовать?» возникает при попытке выполнить код, который еще не написан (только не спрашивайте, как это можно сделать!).

Наконец, сам язык. О нем можно говорить долго, но лучше почитать Revised Reference Manual, сохраняющий стиль оригинального руководства, но использующий современные реализации языка. Вот несколько моих любимых мест:

  • INTERCAL — очень простой для изучения язык, и можно было бы предположить, что он будет хорош для инициации программистов-новичков. На самом деле он скорее подтолкнет программиста к поиску другой работы.
  • Примеры программ, приведенные в предыдущих секциях, могут показаться весьма эзотерическими читателю, незнакомому с языком. Чтобы усилить это впечатление, мы приводим описание языка.
  • В INTERCAL есть 5 операторов — 2 бинарных и 3 унарных. Впрочем, в некотором смысле все операторы бинарны, поскольку все они оперируют с двоичным представлением аргументов, но эта игра слов уводит нас в сторону от изложения.
  • Приоритет операторов определяется следующим образом: (остаток страницы целенаправленно оставлен пустым — не забывайте, что создатели INTERCAL ставили своей целью отсутствие приоритетов).
  • Каждой команде программы можно задать вероятность, с которой она будет выполняться при запуске программы. Кроме того, существуют команды, которые блокируют выполнение последующих команд определенного типа или изменения переменных.
  • Числа выводятся в римской записи, а вводятся словами по одной цифре на любом языке, который поддерживает компилятор. Ввод-вывод символов реализован по-разному в разных компиляторах, и в любом случае слишком ужасен, чтобы описывать его здесь.


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

  • более читабельные имена переменных (в INTERCAL у переменных нет имен, а только номера);
  • точное указание префиксом переменной ее типа (. и : — 16 и 32-битные целые, , и ; — массивы 16 и 32-битных целых);
  • никаких обрезков ногтей (то есть скобок — вместо них в INTERCAL одинарные и двойные кавычки);
  • очень простые правила приоритета операций (что может быть проще их отсутствия?);
  • в INTERCAL встроены вещи, которые в Perl требуют расширений — например, римские числа;
  • ориентация на пользователя, а не на программу (в отличие от большинства языков, ввод выполняется командой WRITE IN, вывод — READ OUT);
  • наконец, сам процесс программирования должен приносить удовольствие; программа, которую на Perl можно написать за 15 минут, на INTERCAL потребует несколько дней — понятно, какой язык лучше ;-)
Tags:
Hubs:
Total votes 71: ↑69 and ↓2 +67
Views 14K
Comments 8
Comments Comments 8