ИНТЕРКАЛ - INTERCAL
В Язык компилятора без произносимого акронима (ИНТЕРКАЛ) является эзотерический язык программирования который был создан как пародия к Дон Вудс и Джеймс М. Лайон, два Университет Принстона студентов, в 1972 году. Он высмеивает аспекты различных языков программирования того времени,[1] а также распространение предложенных языковых конструкций и обозначений в 1960-х годах.
Существуют две поддерживаемые реализации диалектов INTERCAL: C-INTERCAL, поддерживаемые Эрик С. Раймонд,[2] и CLC-INTERCAL, поддерживаемый Клаудио Кальвелли.[3] По состоянию на май 2020 г.[Обновить], обе реализации были доступны в Debian Архив программного обеспечения.[4]
История
Согласно оригинальному руководству авторов,[5]
Полное название компилятора - «Язык компилятора без произносимого акронима», что по понятным причинам сокращается до «ИНТЕРКАЛ».
Исходная реализация Princeton использовала перфокарты и EBCDIC набор символов. Чтобы разрешить INTERCAL работать на компьютерах, использующих ASCII необходимо было произвести замену двух символов: $ заменил ¢ как смешиваться оператор, «представляющий растущую стоимость программного обеспечения по сравнению с оборудованием», и? был заменен на ⊻ как унарный Эксклюзивный или оператор, чтобы «правильно выразить реакцию среднего человека при первом столкновении с исключающим ИЛИ».[5] В последних версиях C-INTERCAL старые операторы поддерживаются в качестве альтернативы; Программы INTERCAL теперь можно кодировать в ASCII, Latin-1, или же UTF-8.[6]
Номера версий
C-INTERCAL меняет местами старший и младший номера версий, по сравнению с традицией, ИСТОРИЯ[7] файл, показывающий выпуски, начиная с версии 0.3 и по состоянию на май 2020 г.[Обновить] увеличилось до 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:
ДЕЛАТЬ :1 <- #0¢#256любой здравомыслящий программист сказал бы, что это абсурд. Поскольку это действительно самый простой метод, программист будет выглядеть глупо перед своим боссом, который, конечно, случайно появится, как это делают боссы. Если бы программист был прав, эффект был бы не менее разрушительным.
У INTERCAL есть много других функций, разработанных, чтобы сделать его еще более эстетичным для программиста: он использует такие операторы, как «ЗАЧИТАЙТЕ», «ИГНОРИРОВАТЬ», «ЗАБЫТЬ» и модификаторы, такие как «PLEASE». Последнее ключевое слово дает две причины отклонения программы компилятором: если "PLEASE" не появляется достаточно часто, программа считается недостаточно вежливой, и об этом говорится в сообщении об ошибке; если слишком часто, программа может быть отклонена как чрезмерно вежливая. Хотя эта функция существовала в исходном компиляторе INTERCAL, она не была документирована.[9]
Несмотря на намеренно тупой и многословный синтаксис языка, INTERCAL тем не менее Полный по Тьюрингу: при наличии достаточного объема памяти INTERCAL может решить любую проблему, Универсальная машина Тьюринга может решить. Однако большинство реализаций INTERCAL делают это очень медленно. А Сито Эратосфена тест, вычисляющий все простые числа меньше 65536, был протестирован на солнце SPARCstation 1. В C это заняло менее полсекунды; та же программа в INTERCAL заняла более семнадцати часов.[10]
Документация
Справочное руководство INTERCAL содержит множество парадоксальных, бессмысленных или юмористических инструкций:
Осторожность! Ни при каких обстоятельствах не путайте сетку с оператором чередования, за исключением запутанных обстоятельств!
В руководстве также есть "миндалина ", как поясняется в этой сноске:" 4) Поскольку все другие справочные руководства имеют приложения, было решено, что руководство INTERCAL должно содержать какой-либо другой тип съемного органа ".[5]
Руководство INTERCAL дает необычные имена всем не буквенно-цифровым ASCII символы: одинарные и двойные кавычки означают «искры» и «кроличьи уши» соответственно. (Исключение составляет амперсанд: как Файл жаргона утверждает: «Что может быть глупее?») Оператор присваивания, представленный знаком равенства («половинная сетка» INTERCAL) во многих других языках программирования, в INTERCAL является стрелкой влево, <-
, состоящий из «угла» и «червяка», что, очевидно, читается как «получает».
Синтаксис
Ввод (с помощью НАПИСАТЬ В
инструкция) и вывод (с помощью ЗАЧИТАТЬ
инструкция) не используйте обычные форматы; в INTERCAL-72 функция WRITE IN вводит число, записанное цифрами на английском языке (например, ШЕСТЬ ПЯТЬ ПЯТЬ ТРИ ПЯТЬ), а READ OUT выводит его в виде «разделенных» римские цифры.[5] Более свежие версии имеют свои собственные системы ввода-вывода.[3][9]
Комментарии могут быть получены с помощью инвертированных идентификаторов операторов, включающих NOT или N'T; это приводит к тому, что строки изначально воздерживаются, так что они не имеют никакого эффекта.[5] (От строки можно ВОЗДЕРЖАТЬСЯ, даже если она не имеет допустимого синтаксиса; синтаксические ошибки возникают во время выполнения, и только тогда, когда строка не ВОЗДЕРЖАЕТСЯ.)[5]
Структуры данных
ИНТЕРКАЛ-72 (исходная версия ИНТЕРКАЛ) имел всего четыре типы данных: 16-кусочек целое число (представлен .
, называемое "пятном"), 32-битное целое число (:
, «двойка»), множество 16-битных целых чисел (,
, «хвост») и массив 32-битных целых чисел (;
, «гибрид»). Доступно 65535 переменных каждого типа, пронумерованных от .1
к .65535
например, для 16-битных целых чисел. Однако каждая из этих переменных имеет свои собственные куча на который его можно нажимать и извлекать (STASHed и RETRIEVEd, в терминологии INTERCAL), увеличивая возможную сложность структур данных.[5] Более современные версии INTERCAL в целом сохранили те же структуры данных с соответствующими изменениями; TriINTERCAL, который изменяет основание с какими числами представлены, можно использовать 10-трость тип, а не 16-битный тип,[9] а CLC-INTERCAL реализует многие собственные структуры данных, такие как «классы и лекции», заставляя основные типы данных хранить больше информации, а не добавлять новые типы.[3] Размеры массивов присваиваются, как если бы они были скаляр Переменная. Также можно использовать константы, они представлены #
("сетка"), за которым следует сама константа, записанная как десятичный номер; поддерживаются только целочисленные константы от 0 до 65535.[5]
Операторы
В ИНТЕРКАЛ-72 всего пять операторов. Реализации различаются тем, какие символы представляют какую операцию, и многие принимают более одного символа, поэтому для многих операторов предоставляется более одной возможности.
Оператор | INTERCAL-72 символа | Символы C-INTERCAL | CLC-INTERCAL символы |
---|---|---|---|
ПЕРЕМЕЩЕНИЕ / СМЕШЕНИЕ | c Backspace / | ¢ , $ , c Backspace / | ¢ |
ВЫБРАТЬ | ~ | ~ | ~ |
И | & | & | & |
ИЛИ ЖЕ | V | V | V |
XOR | V Backspace - | V Backspace - , ? , ∀ | V Backspace - , ¥ |
В отличие от большинства других языков, AND, OR и XOR являются унарный операторы, которые работают с последовательными битами своего аргумента; то старший бит результата - оператор, применяемый к младшему и старшему значащим битам ввода, второй по старшинству бит результата - это оператор, применяемый к старшему и второму по старшинству битам, третий по старшинству бит результатом является оператор, применяемый к второму и третьему битам и т. д. Оператор помещается между знаком препинания, указывающим имя переменной или константу, и числом, указывающим, какая это переменная, или просто внутри меток группировки (т.е. на один символ позже, чем в языках программирования, таких как C.) SELECT и INTERLEAVE (также известные как MINGLE) являются инфиксными бинарными операторами; SELECT берет биты своего первого операнда, которые соответствуют битам «1» его второго операнда, и удаляет биты, соответствующие битам «0», сдвигаясь к младшему значащему биту и заполняя его нулями (так что 51 (110011 в двоичном формате) SELECT 21 (10101 в двоичном формате) равно 5 (101 в двоичном формате)); MINGLE чередует биты своего первого и второго операндов (таким образом, что наименее значимый бит его второго операнда является наименее значимым битом результата). Нет приоритета оператора; знаки группировки должны использоваться для устранения неоднозначности приоритета, если в противном случае он был бы неоднозначным (доступные знаки группировки '
("искра"), что соответствует другой искре, и "
(«кроличьи уши»), что соответствует ушам другого кролика; программист несет ответственность за их использование таким образом, чтобы выражение было однозначным).[5]
Структуры управления
Все операторы INTERCAL начинаются с «идентификатора оператора»; в ИНТЕРКАЛ-72 это может быть ДЕЛАТЬ
, ПОЖАЛУЙСТА
, или же ПОЖАЛУЙСТА, СДЕЛАЙ
, все из которых означают одно и то же для программы (но использование одного из них слишком сильно приводит к отклонению программы, недокументированная особенность в INTERCAL-72, упомянутом в руководстве C-INTERCAL),[9] или перевернутая форма (с НЕТ
или же N'T
добавляется к идентификатору).[5] Обратный поиск INTERCAL, современный вариант, также позволяет использовать варианты МОЖЕТ БЫТЬ
(возможно, в сочетании с PLEASE или DO) в качестве идентификатора оператора, который вводит точку выбора.[11] Перед идентификатором можно указать необязательный номер строки (целое число в скобках); после идентификатора процентную вероятность выполнения строки можно указать в формате %50
, который по умолчанию равен 100%.[5]
В INTERCAL-72 основными управляющими структурами являются NEXT, RESUME и FORGET. ДЕЛАТЬ (линия) СЛЕДУЮЩИЙ
выполняет переход к указанной строке, запоминая следующую строку, которая была бы выполнена, если бы не NEXT в стеке вызовов (в любом операторе можно использовать другие идентификаторы, кроме DO, DO приведен в качестве примера); ЗАБЫТЬ выражение
удаляет выражение записи из вершины стека вызовов (это полезно, чтобы избежать ошибки, которая в противном случае произошла бы при наличии более 80 записей), и ВОЗОБНОВИТЬ выражение
удаляет выражение записи из стека вызовов и переход к последней запомненной строке.[5]
C-INTERCAL также предоставляет РОДОМ ИЗ инструкция, письменная ПРИХОДИТЕ ОТ (линия)
; CLC-INTERCAL и самые последние версии C-INTERCAL также предоставляют вычисленные COME FROM (ПРИХОДИТЕ ОТ выражение)
и NEXT FROM, что похоже на COME FROM, но также сохраняет адрес возврата в NEXT STACK.[3]
Альтернативные способы повлиять на выполнение программы, изначально доступные в INTERCAL-72, заключаются в использовании инструкций IGNORE и REMEMBER для переменных (которые заставляют записи в переменную незаметно игнорироваться и снова вступать в силу, так что инструкции могут быть отключены, вызывая их чтобы не иметь эффекта), а также инструкции ABSTAIN и REINSTATE в строках или в типах операторов, в результате чего строки не действуют или снова начинают действовать соответственно.[5]
Привет, мир
Традиционный "Привет, мир!" программа демонстрирует, чем INTERCAL отличается от стандартных языков программирования. В C, это могло быть следующим образом:
#включают <stdio.h>int главный(пустота) { printf("Привет, мир!"); возвращаться 0;}
Эквивалентная программа в C-INTERCAL длиннее и сложнее для чтения:
ДЕЛАТЬ,1<-#13ПОЖАЛУЙСТАДЕЛАТЬ,1SUB#1<-#238ДЕЛАТЬ,1SUB#2<-#108ДЕЛАТЬ,1SUB#3<-#112ДЕЛАТЬ,1SUB#4<-#0ДЕЛАТЬ,1SUB#5<-#64ДЕЛАТЬ,1SUB#6<-#194ДЕЛАТЬ,1SUB#7<-#48ПОЖАЛУЙСТАДЕЛАТЬ,1SUB#8<-#22ДЕЛАТЬ,1SUB#9<-#248ДЕЛАТЬ,1SUB#10<-#168ДЕЛАТЬ,1SUB#11<-#24ДЕЛАТЬ,1SUB#12<-#16ДЕЛАТЬ,1SUB#13<-#162ПОЖАЛУЙСТАЧИТАТЬИЗ,1ПОЖАЛУЙСТАДАЙТЕВВЕРХ
Диалекты
Оригинальный Woods-Lyon INTERCAL был очень ограничен в своем ввод, вывод возможности: единственным допустимым вводом были числа с записанными цифрами, а единственным выходом была расширенная версия римские цифры.
Повторная реализация C-INTERCAL, доступная в Интернете, сделала этот язык более популярным среди приверженцев эзотерических языков программирования.[12] Диалект C-INTERCAL имеет несколько отличий от оригинального INTERCAL и представил несколько новых функций, таких как РОДОМ ИЗ оператор и средства выполнения текстового ввода-вывода на основе текстовой модели Тьюринга.[9]
Авторы C-INTERCAL также создали вариант TriINTERCAL, основанный на Троичная система счисления и обобщение набора операторов INTERCAL.[9]
Более свежий вариант - это Threaded Intercal, который расширяет функциональность COME FROM для поддержки многопоточность.[13]
CLC-INTERCAL имеет библиотеку под названием INTERNET для сетевых функций, в том числе в качестве сервера INTERCAL, а также включает такие функции, как Quantum Intercal, который позволяет выполнять многозначные вычисления таким образом, который якобы готов для первых квантовые компьютеры.
В начале 2017 года реализация .NET, ориентированная на .NET Framework появился на GitHub. Эта реализация поддерживает создание автономных двоичных библиотек и взаимодействие с другими языками программирования. [14]
Воздействие и обсуждение
В статье «Коробка, мрачно: запутывание, странные языки и эстетика кода»,[12] INTERCAL описывается под заголовком «Оставьте всякое здравомыслие, входящие сюда: INTERCAL». Компилятор и стратегия комментирования относятся к числу описанных "странных" функций:
Компилятор с подходящим названием ick продолжает пародию. Все, что компилятор не может понять, что на нормальном языке привело бы к ошибке компиляции, просто пропускается. Эта «снисходительная» функция очень затрудняет поиск ошибок; также представлена уникальная система добавления комментариев к программе. Программист просто вставляет некомпилируемый текст в любом месте программы, стараясь случайно не встроить немного действительного кода в середину своего комментария.
В «Техномазохизме»[15] Лев Братишенко характеризует компилятор INTERCAL как доминанту:
Если ПОЖАЛУЙСТА встречается недостаточно часто, программа будет отклонена; то есть игнорируется компилятором без объяснения причин. Слишком часто его все равно отвергают, на этот раз из-за хныканья. В сочетании с другими словами, которые редко используются в языках программирования, но появляются в виде операторов в INTERCAL, код читается как мольба.
Популярная культура
Nitrome Enjoyment System, вымышленная игровая консоль, созданная британским разработчиком инди-игр. Нитром, есть игры, которые запрограммированы в INTERCAL.
Рекомендации
- ^ «Азбука языков программирования: ИНТЕРКАЛ». Techworld. 2008-07-04. Получено 2012-03-10.
- ^ "Страница ресурсов INTERCAL". Catb.org. Получено 2012-03-10.
- ^ а б c d е «Клк-Интеркал». Clc-Intercal. 2010-04-01. Архивировано из оригинал на 2012-12-24. Получено 2012-03-10.
- ^ https://packages.debian.org/search?keywords=intercal. Отсутствует или пусто
| название =
(помощь) - ^ а б c d е ж грамм час я j k л м п о «Справочное руководство INTERCAL». Архивировано из оригинал на 2011-07-16. Получено 2012-03-10.
- ^ «Синтаксис Princeton и Atari - обновленное руководство по эксплуатации C-INTERCAL 0.27». Архивировано из оригинал на 2012-12-24. Получено 2012-11-12.
- ^ "ИСТОРИЯ файл для C-INTERCAL". Архивировано из оригинал на 2020-05-05. Получено 2020-05-05.
- ^ "README файл для CLC-INTERCAL". Архивировано из оригинал на 2020-05-05. Получено 2020-05-05.
- ^ а б c d е ж грамм «Дополнительное справочное руководство по C-INTERCAL». Архивировано из оригинал на 23 февраля 2008 г.
- ^ Стросс, Чарльз (Сентябрь 1992 г.). «Интеркал - язык из ада». Computer Shopper (Великобритания).
- ^ "Возврат в интеркале". Cse.unsw.edu.au. 2006-04-11. Получено 2012-03-10.
- ^ а б Матеас, Майкл; Ник Монфор. "Мрачный ящик: обфускация, странные языки и эстетика кода" (PDF). Материалы 6-й конференции по цифровому искусству и культуре, ИТ-университет Копенгагена, 1–3 декабря 2005 г.. С. 144–153.
- ^ «Резьбовой интеркал». Cse.unsw.edu.au. 2004-06-09. Получено 2012-03-10.
- ^ «Официальный сайт Simple Component Intercal для .NET».
- ^ Братишенко, Лев (зима 2009 г.). «Техномазохизм». Кабинет (36). Получено 2014-05-27.