INTERCAL

редактировать
Эзотерический язык программирования Дон Вудс, один из авторов INTERCAL, в 2010 году Джим Лайон, другой автор INTERCAL, в 2005 г.

Язык компилятора без произносимого акронима (INTERCAL ) - это эзотерический язык программирования, который был создан как пародия на Дона Вудса и Джеймса М. Лайона, двух студентов Принстонского университета, в 1972 году. Она высмеивает аспекты различных языков программирования того времени, а также распространение предлагаемых языковых конструкций и обозначений в 1960-х годах.

Существует две поддерживаемых реализации диалектов INTERCAL: C-INTERCAL, поддерживаемый Эриком С. Реймондом, и CLC-INTERCAL, поддерживаемый Клаудио Калвелли. По состоянию на май 2020 года обе реализации были доступны в Debian Software Archive.

Содержание
  • 1 История
  • 2 Номера версий
  • 3 Подробности
  • 4 Документация
  • 5 Синтаксис
    • 5.1 Структуры данных
    • 5.2 Операторы
    • 5.3 Управляющие структуры
    • 5.4 Привет, мир
  • 6 Диалекты
  • 7 Воздействие и обсуждение
  • 8 Популярная культура
  • 9 Ссылки
  • 10 Внешние ссылки
История

Согласно оригинальному руководству авторов,

Полное название компилятора - «язык компилятора без произносимого акронима», что по понятным причинам сокращено «INTERCAL.»

В исходной реализации Princeton использовались перфокарты и набор символов EBCDIC. Чтобы позволить INTERCAL работать на компьютерах, использующих ASCII, необходимо было произвести замену двух символов: $ заменено на ¢ в качестве оператора смешивания, «что означает рост стоимости программного обеспечения по сравнению с оборудованием», а также ? был заменен на ⊻ как унарный оператор исключающее ИЛИ, чтобы «правильно выразить реакцию среднего человека на первое столкновение с исключающим ИЛИ». В последних версиях C-INTERCAL старые операторы поддерживаются в качестве альтернативы; Программы INTERCAL теперь могут быть закодированы в ASCII, Latin-1 или UTF-8..

Номера версий

C-INTERCAL меняет местами старший и дополнительный номера версий по сравнению с традицией, файл HISTORY показывает выпуски, начинающиеся с версии 0.3, и по состоянию на май 2020 года, достигшие версии 0.31, но содержащие 1,26 от 0,26 до 0,27.

Схема нумерации версий CLC-INTERCAL была традиционной до версии 0.06, когда она изменилась на схему, задокументированную в файле README, в которой говорится:

* Термин «версия» был заменен на «извращение» для корректность

* Номер извращения состоит из числа с плавающей запятой с независимыми знаками для целой и дробной части. Отрицательные дроби указывают на предварительные побеги (таким образом, 1.-94 означает «94 предварительных побега до 1.00». Или вы можете просто сложить числа и получить 0,06, что является полным совпадением, поскольку 0,06 не разрабатывается)

* Дробная часть числа извращения может быть целым или с плавающей запятой, с аналогичным значением для частей. Текущий предварительный побег - 1.-94.-2, что означает «2 предварительных побега до предварительного побега 1.-94».

Подробности

ИНТЕРКАЛ должен был полностью отличаться от всех других компьютерных языков. Общие операции на других языках имеют загадочный и избыточный синтаксис в INTERCAL. Из справочного руководства INTERCAL:

Это хорошо известный и часто демонстрируемый факт, что человек, чья работа непонятна, пользуется большим уважением. Например, если бы кто-то заявил, что самый простой способ сохранить значение 65536 в 32-битной переменной INTERCAL:

DO: 1 <- #0¢#256

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

У INTERCAL есть много других функций, призванных сделать его еще более эстетически неприятным для программиста: он использует такие операторы, как «READ OUT», «IGNORE», «FORGET» ", и модификаторы, такие как" ПОЖАЛУЙСТА ". Последнее ключевое слово дает две причины отклонения программы компилятором: если "PLEASE" появляется недостаточно часто, программа считается недостаточно вежливой, и об этом говорится в сообщении об ошибке; если слишком часто, программа может быть отклонена как чрезмерно вежливая. Хотя эта функция существовала в исходном компиляторе INTERCAL, она не была документирована.

Несмотря на намеренно тупой и многословный синтаксис языка, INTERCAL, тем не менее, по Тьюрингу : при достаточном объеме памяти INTERCAL может решить любые проблема, которую может решить универсальная машина Тьюринга. Однако большинство реализаций INTERCAL делают это очень медленно. Тест Сито Эратосфена, вычисляющий все простые числа меньше 65536, был протестирован на Sun SPARCstation 1. В C это заняло менее полсекунды; та же программа в INTERCAL заняла более семнадцати часов.

Документация
«Принципиальная схема» из Справочного руководства INTERCAL, якобы для объяснения работы оператора «select»

Справочное руководство INTERCAL содержит множество парадоксальных, бессмысленных или юмористических инструкций:

Внимание! Ни при каких обстоятельствах не путайте сетку с оператором чередования, за исключением запутанных обстоятельств!

В руководстве также есть «миндалина », как объясняется в этой сноске: «4) Поскольку все другие справочные руководства имеют приложения, было решено, что руководство INTERCAL должно содержать какой-либо другой тип съемного органа.. "

Руководство INTERCAL дает необычные имена всем не буквенно-цифровым символам ASCII : одинарные и двойные кавычки означают« искры »и« кроличьи уши »соответственно. (Исключением является амперсанд : как говорится в файле жаргона, «что может быть глупее?») Оператор присваивания, представленный в виде знака равенства («половина сетки» INTERCAL) в во многих других языках программирования в INTERCAL есть стрелка влево, <-, состоящая из «угла» и «червя», что, очевидно, читается как «получает».

Синтаксис

Для ввода (с помощью инструкции WRITE IN) и вывода (с помощью инструкции READ OUT) не используются обычные форматы; в INTERCAL-72 команда WRITE IN вводит число, записанное цифрами на английском языке (например, ШЕСТЬ ПЯТЬ ПЯТЬ ТРИ ПЯТЬ), а READ OUT выводит его в виде «вырезанных» римских цифр. Более поздние версии имеют свои собственные системы ввода-вывода.

Комментарии могут быть получены с помощью инвертированных идентификаторов операторов, включающих NOT или N'T; это приводит к тому, что строки изначально воздерживаются, так что они не имеют никакого эффекта. (От строки можно ВОЗДЕРЖАТЬ, даже если она не имеет допустимого синтаксиса; синтаксические ошибки возникают во время выполнения, и только тогда, когда строка не воздерживается.)

Структуры данных

INTERCAL -72 (исходная версия INTERCAL) имел только четыре типа данных : 16- бит целое число (представленное с помощью ., называется "пятно"), 32-битное целое число (:, "двойное пятно"), массив 16-битных целых чисел (,, «хвост») и массив 32-битных целых чисел (;, «гибрид»). Существует 65535 доступных переменных каждого типа, например, пронумерованных от .1до .65535для 16-битных целых чисел. Однако каждая из этих переменных имеет свой собственный стек , в который ее можно вставлять и извлекать (STASHed и RETRIEVEd в терминологии INTERCAL), увеличивая возможную сложность структур данных. Более современные версии INTERCAL в целом сохранили те же структуры данных с соответствующими изменениями; TriINTERCAL, который изменяет radix, с которым представлены числа, может использовать тип 10- trit, а не 16-битный тип, а CLC-INTERCAL реализует многие из своих собственных структур данных, например, «классы и лекции», заставляя основные типы данных хранить больше информации, а не добавлять новые типы. Размеры массивов присваиваются, как если бы они были скалярной переменной. Также можно использовать константы, которые представлены символом #("сетка"), за которым следует сама константа, записанная как десятичное число ; поддерживаются только целочисленные константы от 0 до 65535.

Операторы

В INTERCAL-72 всего пять операторов. Реализации различаются тем, какие символы представляют какую операцию, и многие принимают более одного символа, поэтому для многих операторов предоставляется более одной возможности.

Операторы INTERCAL
ОператорINTERCAL-72 символасимволы C-INTERCALсимволы CLC-INTERCAL
INTERLEAVE / MINGLEcbackspace /¢, $, cbackspace /¢
SELECT~~~
AND
ORVVV
XORVbackspace -Vbackspace -, ?, Vbackspace -, ¥

В отличие от большинства других языков, AND, OR и XOR унарны операторы, которые работают с последовательными битами своего аргумента; старший значащий бит результата - это оператор, применяемый к младшему и старшему значащим битам ввода, второй по старшинству бит результата - это оператор, применяемый к старшему и второму по значимости значащие биты, третий по значимости бит результата - это оператор, применяемый к второму и третьему битам и т. д. Оператор помещается между знаком препинания, указывающим имя переменной или константу, и числом, указывающим, какая это переменная, или просто внутри меток группировки (то есть на один символ позже, чем в языках программирования, таких как C.) SELECT и INTERLEAVE (также известные как MINGLE) - инфиксные бинарные операторы; SELECT берет биты своего первого операнда, которые соответствуют битам «1» его второго операнда, и удаляет биты, соответствующие битам «0», сдвигаясь к младшему значащему биту и заполняя его нулями (так 51 (1 10011в двоичный) SELECT 21 (10101 в двоичном формате) равно 5 (101 в двоичном формате)); MINGLE чередует биты своего первого и второго операндов (таким образом, что наименее значимый бит его второго операнда является наименее значимым битом результата). Нет приоритета оператора; метки группировки должны использоваться для устранения неоднозначности приоритета, если в противном случае он был бы неоднозначным (доступные метки группировки: '("искра"), что соответствует другой искре, и "(" кролик уши "), который соответствует ушам другого кролика; программист несет ответственность за их использование таким образом, чтобы они делали выражение однозначным).

Управляющие структуры

Все операторы INTERCAL начинаются с символа" идентификатор оператора "; в INTERCAL-72 это может быть DO, ПОЖАЛУЙСТАили ПОЖАЛУЙСТА, СДЕЛАЙТЕ, все из которых означают одно и то же для программы (но использование одного из них слишком сильно приводит к тому, что программа для отклонения, недокументированная функция в INTERCAL-72, которая упоминалась в руководстве C-INTERCAL) или перевернутая форма (с NOTили N'T, добавленный к идентификатору). Обратное отслеживание INTERCAL, современный вариант, также допускает варианты, использующие MAYBE(возможно, в сочетании с PLEASE или DO) в качестве идентификатора оператора, который вводит точку выбора. ntifier, необязательный номер строки (целое число, заключенное в круглые скобки); после идентификатора процентная вероятность выполнения строки может быть дана в формате % 50, который по умолчанию равен 100%.

В INTERCAL-72 основными управляющими структурами являются NEXT, ВОЗОБНОВИТЬ и ЗАБЫТЬ. DO (строка) NEXTвыполняет переход к указанной строке, запоминая следующую строку, которая была бы выполнена, если бы не NEXT в стеке вызовов (другие идентификаторы, кроме DO, могут использоваться в любом операторе, DO приведен в качестве примера); Выражение DO FORGETудаляет записи выражения из вершины стека вызовов (это полезно, чтобы избежать ошибки, которая в противном случае происходит, когда имеется более 80 записей), а выражение DO RESUMEудаляет записи выражений из стека вызовов и переход к последней запомненной строке.

C-INTERCAL также предоставляет команду COME FROM, записанную DO COME FROM (строка); CLC-INTERCAL и самые последние версии C-INTERCAL также предоставляют вычисленные COME FROM (выражение DO COME FROM)и NEXT FROM, что аналогично COME FROM, но также сохраняет адрес возврата в NEXT STACK.

Альтернативные способы повлиять на выполнение программы, изначально доступные в INTERCAL-72, заключаются в использовании инструкций IGNORE и REMEMBER для переменных (которые вызывают молчаливое игнорирование записи в переменную и ее повторное выполнение, так что инструкции могут быть отключены, заставляя их не действовать), а также инструкции ABSTAIN и REINSTATE для строк или типов операторов, в результате чего строки не действуют или снова начинают действовать соответственно.

Привет, мир

Традиционное «Привет, мир!» Программа демонстрирует, чем ИНТЕРКАЛ отличается от стандартных языков программирования. В C это может выглядеть следующим образом:

#include int main (void) {printf ("Привет, мир! \ N"); возврат 0; }

Эквивалентная программа в 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
Диалекты

Исходная программа Woods – Lyon INTERCAL была очень ограничена в вводе / Возможности вывода : единственными допустимыми входными данными были числа с прописанными цифрами, а единственным выходом была расширенная версия римских цифр.

. Повторная реализация C-INTERCAL, доступная в Интернете, сделала язык более популярен среди приверженцев эзотерических языков программирования. Диалект C-INTERCAL имеет несколько отличий от оригинального INTERCAL и представил несколько новых функций, таких как оператор COME FROM и средства выполнения ввода-вывода текста на основе текстовой модели Тьюринга.

Авторы C-INTERCAL также создали вариант TriINTERCAL, основанный на троичной системе счисления и обобщающий набор операторов INTERCAL.

Более поздним вариантом является Threaded Intercal, который расширяет функциональность COME FROM для поддержки многопоточности.

CLC-INTERCAL имеет библиотеку под названием INTERNET для сетевых функций, в том числе работу в качестве сервера INTERCAL, а также включает такие функции, как Quantum Intercal, который позволяет выполнять многозначные вычисления таким способом, который предположительно готовы к первым квантовым компьютерам.

В начале 2017 года реализация.NET, ориентированная на .NET Framework, появилась на GitHub. Эта реализация поддерживает создание автономных двоичных библиотек и взаимодействие с другими языками программирования.

Влияние и обсуждение

В статье «Коробка, мрачно: обфускация, странные языки и эстетика кода», ИНТЕРКАЛ описывается под заголовком «Откажитесь от здравого смысла, вы, входящие сюда: ИНТЕРКАЛ ". Компилятор и стратегия комментирования относятся к числу описанных "странных" функций:

Компилятор с соответствующим названием "ick" продолжает пародию. Все, что компилятор не может понять, что на нормальном языке привело бы к ошибке компиляции, просто пропускается. Эта «снисходительная» функция очень затрудняет поиск ошибок; также представлена ​​уникальная система добавления комментариев к программе. Программист просто вставляет некомпилируемый текст в любом месте программы, стараясь случайно не вставить немного действительного кода в середину своего комментария.

В «Техномазохизме» Лев Братишенко характеризует компилятор INTERCAL как доминатрикс:

Если ПОЖАЛУЙСТА, не будет встречаться достаточно часто, программа будет отклонена; то есть игнорируется компилятором без объяснения причин. Слишком часто его все равно отвергают, на этот раз из-за хныканья. В сочетании с другими словами, которые редко используются в языках программирования, но появляются в виде операторов в INTERCAL, код выглядит как мольба.

Популярная культура

The Nitrome Enjoyment System, вымышленная игровая консоль, созданная британской инди Разработчик игр Nitrome, имеет игры, которые программируются в INTERCAL.

Ссылки
Внешние ссылки
Викискладе есть материалы, относящиеся к INTERCAL.
Последняя правка сделана 2021-05-23 07:31:45
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте