ИНТЕРКАЛ
Язык компилятора без произносимой аббревиатуры ( INTERCAL ) — это эзотерический язык программирования , который был создан как пародия Доном Вудсом и Джеймсом М. Лайоном , двумя студентами Принстонского университета , в 1972 году. Он высмеивает аспекты различных языков программирования на время, [1] а также распространение предлагаемых языковых конструкций и обозначений в 1960-х годах.
Существует две поддерживаемые реализации диалектов INTERCAL: C-INTERCAL (создан в 1990 году), поддерживается Эриком С. Рэймондом. [2] и Алекс Смит, [3] и CLC-INTERCAL, поддерживаемый Клаудио Калвелли. [4]
История [ править ]
Согласно оригинальному руководству авторов, [5]
Полное название компилятора — «Язык компилятора без произносимой аббревиатуры», которое по понятным причинам сокращенно «INTERCAL».
В исходной реализации Принстона использовались перфокарты и набор символов EBCDIC . Чтобы INTERCAL мог работать на компьютерах, использующих ASCII , необходимо было сделать замену двух символов: $
заменен на ¢
как оператор смешивания , «представляет собой растущую стоимость программного обеспечения по сравнению с аппаратным обеспечением», и ?
был заменен на ⊻
как унарный оператор «исключающее-или», чтобы «правильно выразить реакцию обычного человека при первом столкновении с исключающим-или». [5] В последних версиях C-INTERCAL в качестве альтернативы поддерживаются старые операторы; Программы INTERCAL теперь могут быть закодированы в ASCII , Latin-1 или UTF-8 . [6]
Номера версий [ править ]
В C-INTERCAL старший и младший номера версий поменяны местами, по традиции. ИСТОРИЯ [7] файл показывает выпуски, начиная с версии 0.3 и по состоянию на май 2020 г. [update] достигнув 0,31, но содержа 1,26 между 0,26 и 0,27.
Схема нумерации версий CLC-INTERCAL была традиционной до версии 0.06, когда она была изменена на схему, описанную в README. [8] файл, в котором написано:
*Термин «версия» для корректности заменен на «извращение».
* Число извращений представляет собой число с плавающей запятой, независимые знаки целой и дробной части. Отрицательный дроби обозначают предварительные побеги (поэтому 1.-94 означает «94 предварительных побега в идти до 1.00". Или вы можете просто сложить числа и получить 0,06, что является полностью совпадением, поскольку 0,06 не существует. развитый)
* Дробная часть числа извращения может быть целым или плавающим числом. точка, имеющая аналогичное значение для частей. Текущий предварительный побег 1.-94.-2, что означает «2 предварительных побега до предварительного побега 1.-94».
Подробности [ править ]
INTERCAL должен был полностью отличаться от всех других компьютерных языков. Общие операции в других языках имеют в INTERCAL загадочный и избыточный синтаксис. Из справочного руководства INTERCAL: [5]
Хорошо известен и часто доказывается, что человек, чья работа непонятна, пользуется большим уважением. Например, если кто-то скажет, что самый простой способ сохранить значение 65536 в 32-битной переменной INTERCAL:
DO :1 <- #0¢#256любой разумный программист сказал бы, что это абсурд. Поскольку это действительно самый простой метод, программист будет выглядеть глупо перед своим начальником, который, конечно же, появится, как и ожидается от начальников. Эффект был бы не менее разрушительным для программиста, если бы он был прав.
INTERCAL имеет множество других функций, призванных сделать его еще более неприятным с эстетической точки зрения для программиста: он использует такие операторы, как «ЗАЧИТАТЬ», «ИГНОРИРОВАТЬ», «ЗАБЫТЬ», а также модификаторы, такие как «ПОЖАЛУЙСТА». Это последнее ключевое слово обеспечивает две причины отклонения программы компилятором: если «ПОЖАЛУЙСТА» появляется недостаточно часто, программа считается недостаточно вежливой, и об этом говорится в сообщении об ошибке; если оно появляется слишком часто, программу могут отклонить как излишне вежливую. Хотя эта возможность существовала в исходном компиляторе INTERCAL, она не была документирована. [9]
Несмотря на намеренно тупой и многословный синтаксис языка, INTERCAL, тем не менее, является полным по Тьюрингу : при достаточном объеме памяти INTERCAL может решить любую проблему, которую может решить универсальная машина Тьюринга . Однако большинство реализаций INTERCAL делают это очень медленно. Тест «Решето Эратосфена» , вычисляющий все простые числа меньше 65536, был протестирован на Sun SPARCstation 1 в 1992 году. В C это заняло менее полсекунды; та же программа в INTERCAL длилась более семнадцати часов. [10]
Документация [ править ]
Справочное руководство INTERCAL содержит множество парадоксальных, бессмысленных или юмористических инструкций:
Осторожность! Ни при каких обстоятельствах не путайте сетку с оператором чередования, за исключением сбивающих с толку обстоятельств!
В руководстве также есть « миндалина », как поясняется в этой сноске: «4) Поскольку все другие справочные руководства имеют приложения, было решено, что руководство INTERCAL должно содержать какой-либо другой тип съемного органа». [5]
В руководстве INTERCAL всем небуквенно-цифровым символам ASCII даны необычные имена : одинарные и двойные кавычки — это «искры» и «кроличьи уши» соответственно. (Исключением является амперсанд : как говорится в жаргонном файле , «что может быть глупее?») Оператор присваивания, представленный в виде знака равенства («полусетка INTERCAL») во многих других языках программирования, в INTERCAL представляет собой стрелку влево. , <-
, состоящий из «угла» и «червяка», очевидно, читается как «достается».
Синтаксис [ править ]
Ввод (с помощью WRITE IN
инструкцию) и вывод (с помощью команды READ OUT
инструкция) не используйте привычные форматы; в INTERCAL-72 команда WRITE IN вводит число, записанное цифрами на английском языке (например, SIX FIVE FIVE THREE FIVE), а READ OUT выводит его в виде «разрезанных» римских цифр . [5] Более поздние версии имеют собственные системы ввода-вывода. [4] [9]
Комментарии могут быть получены с помощью инвертированных идентификаторов операторов, включающих NOT или N'T; это приводит к тому, что строки изначально воздерживаются от них, чтобы они не имели никакого эффекта. [5] (От строки можно отказаться, даже если она не имеет допустимого синтаксиса; синтаксические ошибки случаются во время выполнения, и только тогда, когда строка не воздержана.) [5]
Структуры данных [ править ]
INTERCAL-72 (исходная версия INTERCAL) имел только четыре типа данных : 16 -битное целое число (представленное символом .
, называемое «пятном»), 32-битное целое число ( :
, «двойная точка»), массив 16-битных целых чисел ( ,
, «хвост») и массив 32-битных целых чисел ( ;
«гибрид»). Доступно 65535 переменных каждого типа, пронумерованных от .1
к .65535
например, для 16-битных целых чисел. Однако каждая из этих переменных имеет свой собственный стек , в который ее можно помещать и извлекать (STASHed и RETRIEVEd в терминологии INTERCAL), что увеличивает возможную сложность структур данных. [5] Более современные версии INTERCAL в целом сохранили те же структуры данных с соответствующими изменениями; TriINTERCAL, который изменяет систему счисления , в которой представлены числа, может использовать 10- битный тип, а не 16-битный тип. [9] а CLC-INTERCAL реализует многие свои собственные структуры данных, такие как «классы и лекции», заставляя базовые типы данных хранить больше информации, а не добавлять новые типы. [4] Размерность массивов определяется путем присвоения им значений, как если бы они были скалярной переменной. Константы также могут использоваться и представлены символом #
(«сетка»), за которым следует сама константа, записанная в виде десятичного числа; поддерживаются только целочисленные константы от 0 до 65535. [5]
Операторы [ править ]
В INTERCAL-72 всего пять операторов. Реализации различаются тем, какие символы представляют какую операцию, и многие из них принимают более одного символа, поэтому для многих операторов предоставляется более одной возможности.
Оператор | ИНТЕРКАЛ-72 символа | Символы C-INTERCAL | Символы CLC-INTERCAL |
---|---|---|---|
чередование/смешивание | c возврат назад /
|
¢ , $ , c возврат назад /
|
¢
|
ВЫБИРАТЬ | ~ |
~ |
~
|
И | & |
& |
&
|
ИЛИ | V |
V |
V
|
БЕСПЛАТНО | V возврат назад -
|
V возврат назад - , ? , ∀
|
V возврат назад - , ¥
|
В отличие от большинства других языков, AND, OR и XOR являются унарными операторами, которые работают с последовательными битами своего аргумента; наиболее значимый бит результата — это оператор, примененный к младшему и наиболее значимому битам входных данных, второй по значимости бит результата — это оператор, примененный к старшему и второму по значимости битам, третий — Самый значимый бит результата — это оператор, применяемый ко второму и третьему битам и так далее. Оператор помещается между знаком препинания, определяющим имя переменной или константу, и числом, определяющим, какая это переменная, или внутри знаков группировки (т. е. на один символ позже, чем в таких языках программирования, как C ). SELECT и INTERLEAVE (которые также известен как MINGLE) — инфиксные бинарные операторы; SELECT берет биты своего первого операнда, соответствующие битам «1» второго операнда, и удаляет биты, соответствующие битам «0», сдвигая в сторону младшего бита и дополняя нулями (так что 51 (1 1 0 0 1 1 в двоичном формате) SELECT 21 (10101 в двоичном формате) равно 5 ( 101 в двоичном формате)); MINGLE чередует биты своего первого и второго операндов (таким образом, что младший бит второго операнда является младшим битом результата). Нет приоритета оператора; знаки группировки должны использоваться для устранения неоднозначности приоритета там, где в противном случае он был бы неоднозначным (доступные знаки группировки: '
(«искра»), что соответствует другой искре, и "
(«уши кролика»), что соответствует ушам другого кролика; программист несет ответственность за их использование таким образом, чтобы выражение было однозначным). [5]
Структуры управления [ править ]
Все операторы INTERCAL начинаются с «идентификатора оператора»; в INTERCAL-72 это может быть DO
, PLEASE
, или PLEASE DO
, все это означает одно и то же для программы (но слишком интенсивное использование одного из них приводит к отклонению программы - недокументированная функция INTERCAL-72, упомянутая в руководстве C-INTERCAL), [9] или перевернутую форму (с NOT
или N'T
добавляется к идентификатору). [5] Откат INTERCAL, современный вариант, также позволяет использовать варианты MAYBE
(возможно, в сочетании с PLEASE или DO) в качестве идентификатора утверждения, который вводит точку выбора. [11] Перед идентификатором может быть указан необязательный номер строки (целое число, заключенное в круглые скобки); после идентификатора можно указать процентную вероятность выполнения строки в формате %50
, который по умолчанию равен 100%. [5]
В INTERCAL-72 основными управляющими структурами являются NEXT, RESUME и FORGET. DO (line) NEXT
переходит к указанной строке, запоминая следующую строку, которая была бы выполнена, если бы в стеке вызовов не было NEXT (другие идентификаторы, кроме DO, могут использоваться в любом операторе, DO приведен в качестве примера); DO FORGET expression
удаляет записи выражений из верхней части стека вызовов (это полезно, чтобы избежать ошибки, которая в противном случае возникает, когда записей более 80), и DO RESUME expression
удаляет записи выражений из стека вызовов и переходит к последней запомненной строке. [5]
C-INTERCAL также предоставляет команду COME FROM , написанную DO COME FROM (line)
; CLC-INTERCAL и самые последние версии C-INTERCAL также предоставляют вычисленные COME FROM ( DO COME FROM expression)
и NEXT FROM, который аналогичен COME FROM, но также сохраняет адрес возврата в NEXT STACK. [4]
Альтернативные способы повлиять на ход программы, первоначально доступные в INTERCAL-72, заключаются в использовании инструкций IGNORE и REMEMBER для переменных (которые приводят к тому, что записи в переменную молча игнорируются и снова вступают в силу, так что инструкции можно отключить, вызвав их не иметь эффекта), а также инструкции ABSTAIN и REINSTATE для строк или типов операторов, в результате чего строки не оказывают никакого эффекта или оказывают эффект снова соответственно. [5]
Привет, мир [ править ]
Традиционное «Привет, мир!» Программа демонстрирует, насколько INTERCAL отличается от стандартных языков программирования. В C это могло бы выглядеть следующим образом:
#include <stdio.h>
int main(void) {
printf("Hello, world!\n");
return 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
Диалекты [ править ]
Первоначальный INTERCAL Вудса-Лайона был очень ограничен в своих возможностях ввода/вывода : единственным приемлемым вводом были числа с прописанными цифрами, а единственным выходом была расширенная версия римских цифр .
Доступная в Интернете повторная реализация C-INTERCAL сделала этот язык более популярным среди любителей эзотерических языков программирования. [12] Диалект C-INTERCAL имеет несколько отличий от исходного INTERCAL и содержит несколько новых функций, таких как оператор COME FROM и средства текстового ввода-вывода на основе текстовой модели Тьюринга. [9]
Авторы C-INTERCAL также создали вариант TriINTERCAL, основанный на троичной системе счисления и обобщающий набор операторов INTERCAL. [9]
Более свежий вариант — Threaded Intercal, который расширяет функциональность COME FROM для поддержки многопоточности . [13]
CLC-INTERCAL имеет библиотеку INTERNET для сетевых функций, включая работу сервера INTERCAL, а также включает такие функции, как Quantum Intercal, который позволяет выполнять многозначные вычисления способом, предположительно готовым для первых квантовых компьютеров .
В начале 2017 года появилась реализация .NET , ориентированная на .NET Framework на GitHub . Эта реализация поддерживает создание автономных двоичных библиотек и взаимодействие с другими языками программирования. [14]
Влияние и обсуждение [ править ]
В статье «Мрачный ящик: обфускация, странные языки и эстетика кода» [12] ИНТЕРКАЛ описан под заголовком «Оставьте всякое здравомыслие, вы, входящие сюда: ИНТЕРКАЛ». Компилятор и стратегия комментирования относятся к числу описанных «странных» функций:
Компилятор, получивший соответствующее название «ick», продолжает пародию. Все, что компилятор не может понять, что в обычном языке привело бы к ошибке компиляции, просто пропускается. Эта «прощающая» функция очень затрудняет поиск ошибок; он также представляет уникальную систему добавления комментариев к программе. Программист просто вставляет некомпилируемый текст в любое место программы, стараясь случайно не вставить немного допустимого кода в середину своего комментария.
В «Техномазохизме» [15] Лев Братишенко характеризует компилятор INTERCAL как доминанту:
Если PLEASE не встречался достаточно часто, программа была бы отклонена; то есть игнорируется компилятором без объяснения причин. Слишком часто его все равно отвергали бы, на этот раз за хныканье. В сочетании с другими словами, которые редко используются в языках программирования, но появляются в виде операторов в INTERCAL, код читается как чья-то мольба.
В популярной культуре [ править ]
Nitrome Enjoyment System, вымышленная игровая консоль, созданная британским разработчиком инди-игр Nitrome , содержит игры, запрограммированные на INTERCAL.
Ссылки [ править ]
- ^ «А-Я языков программирования: INTERCAL» . Техмир. 04 июля 2008 г. Проверено 10 марта 2012 г.
- ^ «Страница ресурсов INTERCAL» . Catb.org . Проверено 10 марта 2012 г.
- ^ «Биография Алекса Смита» . wolframscience.com .
- ↑ Перейти обратно: Перейти обратно: а б с д и «Клк-Интеркал» . Clc-Интеркал. 01.04.2010. Архивировано из оригинала 24 декабря 2012 г. Проверено 10 марта 2012 г.
- ↑ Перейти обратно: Перейти обратно: а б с д и ж г час я дж к л м н тот «Справочное руководство ИНТЕРКАЛ» . Архивировано из оригинала 16 июля 2011 г. Проверено 10 марта 2012 г.
- ^ «Синтаксис Princeton и Atari — обновленное руководство по эксплуатации C-INTERCAL 0.27» . Архивировано из оригинала 24 декабря 2012 г. Проверено 12 ноября 2012 г.
- ^ «Файл ИСТОРИИ для C-INTERCAL» . 12 июня 2019 г. Архивировано из оригинала 05 мая 2020 г. Проверено 5 мая 2020 г.
- ^ «Файл README для CLC-INTERCAL» . Архивировано из оригинала 5 мая 2020 г. Проверено 5 мая 2020 г.
- ↑ Перейти обратно: Перейти обратно: а б с д и ж г «Дополнительное справочное руководство C-INTERCAL» . Архивировано из оригинала 23 февраля 2008 г.
- ^ Стросс, Чарльз (сентябрь 1992 г.). «Интеркал — язык ада» . Компьютерный покупатель (Великобритания) .
- ^ «Откат в Интеркале» . Cse.unsw.edu.au. 11 апреля 2006 г. Проверено 10 марта 2012 г.
- ↑ Перейти обратно: Перейти обратно: а б Матеас, Майкл; Ник Монфор. «Темная коробка: обфускация, странные языки и эстетика кода» (PDF) . Материалы 6-й конференции по цифровому искусству и культуре, Копенгагенский университет информационных технологий, 1–3 декабря 2005 г. стр. 144–153.
- ^ «Резьбовой интеркал» . Cse.unsw.edu.au. 9 июня 2004 г. Проверено 10 марта 2012 г.
- ^ «Официальный дом Simple Component Intercal для .NET» . Гитхаб . 30 сентября 2021 г.
- ^ Братишенко, Лев (зима 2009 г.). «Техномазохизм» . Кабинет (36) . Проверено 27 мая 2014 г.