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

    В языках программирования есть свои шутники и свои шутки. Собственно, большинство эзотерических языков программирования задумывались именно как шутки (конечно, если не как вызов общественности, как 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 потребует несколько дней — понятно, какой язык лучше ;-)
    • +67
    • 11.5k
    • 8
    Share post

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 8

      +6
      Эх, не хватает только примера кода на этом чудесном языке!
        +1
        По первой ссылке есть — как на мой взгляд, для такой несерьезной статьи они слишком суровы.
          +2
          Пропустил как-то ссылку, извините.
          Вы правы, я по описанию решил, что там будет что-то более дружелюбное, с учетом слова please.
        +5
        Улыбнуло — не знал о нем раньше :)
        Кстати, некоторым программистам удается и на мейнстримовых языках писать так, что результат не отличить от INTERCAL'ного программирования…
          +4
          А все заработанные деньги они шлют в индию…
          +3
          Напомнило мне старую шутку 90-х о языке си.
          www.kulichki.com/ostrova/bera/CompHumor/texts/C_JOKE.koi
            +3
            Hello World (C-INTERCAL):

            DO ,1 <- #13
            PLEASE DO ,1 SUB #1 <- #238
            DO ,1 SUB #2 <- #108
            DO ,1 SUB #3 <- #112
            DO ,1 SUB #4 <- #0
            DO ,1 SUB #5 <- #64
            DO ,1 SUB #6 <- #194
            DO ,1 SUB #7 <- #48
            PLEASE DO ,1 SUB #8 <- #22
            DO ,1 SUB #9 <- #248
            DO ,1 SUB #10 <- #168
            DO ,1 SUB #11 <- #24
            DO ,1 SUB #12 <- #16
            DO ,1 SUB #13 <- #162
            PLEASE READ OUT ,1
            PLEASE GIVE UP
              +1
              > E405 «Программа отвергнута из соображений психического здоровья»

              Вспомнилось:
              ORA-600 [12235] «Oracle process has no purpose in life !»

              Only users with full accounts can post comments. Log in, please.