Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску
Дон Вудс , один из авторов ИНТЕРКАЛ, в 2010 г.
Джим Лайон, другой автор INTERCAL, в 2005 г.

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

Существуют две поддерживаемые реализации диалектов INTERCAL: C-INTERCAL (создан в 1990 г.), поддерживаемый Эриком С. Раймондом [2] и Алексом Смитом [3], и CLC-INTERCAL, поддерживаемый Клаудио Калвелли. [4] По состоянию на май 2020 года обе реализации были доступны в архиве программного обеспечения Debian . [5]

История [ править ]

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

Полное название компилятора - «Язык компилятора без произносимого акронима», которое по понятным причинам сокращается до «ИНТЕРКАЛ».

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

Номера версий [ править ]

C-INTERCAL меняет местами старший и младший номера версий по сравнению с традицией. В файле HISTORY [8] показаны выпуски, начиная с версии 0.3 и по состоянию на май 2020 года, которые продвинулись до 0.31, но содержат 1.26 между 0.26 и 0.27.

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

* Термин "версия" заменен на "извращение" для корректности

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

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

Подробности [ править ]

INTERCAL должен был полностью отличаться от всех других компьютерных языков. Общие операции на других языках имеют загадочный и избыточный синтаксис в INTERCAL. Из справочного руководства INTERCAL: [6]

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

ДО  : 1  <-  # 0 ¢ # 256

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

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

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

Документация [ править ]

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

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

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

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

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

Синтаксис [ править ]

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

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

Структуры данных [ править ]

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

Операторы [ править ]

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

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

Структуры управления [ править ]

Все операторы INTERCAL начинаются с «идентификатора оператора»; в INTERCAL-72 это может быть DO, PLEASEили PLEASE DO, все из которых означают одно и то же для программы (но использование одного из них слишком сильно приводит к отклонению программы, недокументированная функция в INTERCAL-72, которая была упомянута в C- INTERCAL manual), [10] или в перевернутой форме (с идентификатором NOTили N'Tдобавленным к нему). [6] Обратное отслеживание INTERCAL, современный вариант, также позволяет использовать варианты MAYBE(возможно, в сочетании с PLEASE или DO) в качестве идентификатора оператора, который вводит точку выбора. [12]Перед идентификатором может быть указан необязательный номер строки (целое число в круглых скобках); после идентификатора можно указать процентную вероятность выполнения строки в формате %50, который по умолчанию равен 100%. [6]

В INTERCAL-72 основными управляющими структурами являются NEXT, RESUME и FORGET. выполняет переход к указанной строке, запоминая следующую строку, которая была бы выполнена, если бы не NEXT в стеке вызовов (другие идентификаторы, кроме DO, могут использоваться в любом операторе, DO приведен в качестве примера); удаляет записи выражений из вершины стека вызовов (это полезно, чтобы избежать ошибки, которая в противном случае возникает при наличии более 80 записей), а также удаляет записи выражений из стека вызовов и переходит к последней запомненной строке. [6]DO (line) NEXTDO FORGET expressionDO RESUME expression

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

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

Привет, мир [ править ]

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

#include  <stdio.h>int  main ( void )  {  printf ( "Привет, мир! \ n " ); возврат  0 ; }

Эквивалентная программа в C-INTERCAL длиннее и сложнее для чтения:

DO , 1 <- # 13 ПОЖАЛУЙСТА, DO , 1 SUB # 1 <- # 238 DO , 1 SUB # 2 <- # 108 DO , 1 SUB # 3 <- # 112 DO , 1 SUB # 4 <- # 0 DO , 1 ПОД 5 <- # 64 ДО , 1 ПОД 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 ПОЖАЛУЙСТА ЧТЕНИЕ OUT , 1 ПОЖАЛУЙСТА ДАЙТЕ ВВЕРХ          

Диалекты [ править ]

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

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

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

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

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

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

Воздействие и обсуждение [ править ]

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

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

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

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

Популярная культура [ править ]

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

Ссылки [ править ]

  1. ^ "Азия языков программирования: ИНТЕРКАЛ" . Techworld. 2008-07-04 . Проверено 10 марта 2012 .
  2. ^ "Страница ресурсов INTERCAL" . Catb.org . Проверено 10 марта 2012 .
  3. ^ «Биография Алекса Смита» . wolframscience.com .
  4. ^ a b c d e "Clc-Intercal" . Clc-Intercal. 2010-04-01. Архивировано из оригинала на 2012-12-24 . Проверено 10 марта 2012 .
  5. ^ https://packages.debian.org/search?keywords=intercal . Отсутствует или пусто |title=( справка )
  6. ^ a b c d e f g h i j k l m n o "Справочное руководство INTERCAL" . Архивировано из оригинала на 2011-07-16 . Проверено 10 марта 2012 .
  7. ^ «Синтаксис Princeton и Atari - Обновленное руководство по эксплуатации C-INTERCAL 0.27» . Архивировано из оригинала на 2012-12-24 . Проверено 12 ноября 2012 .
  8. ^ "ИСТОРИЯ файл для C-INTERCAL" . Архивировано из оригинала на 2020-05-05 . Проверено 5 мая 2020 .
  9. ^ "Файл README для CLC-INTERCAL" . Архивировано из оригинала на 2020-05-05 . Проверено 5 мая 2020 .
  10. ^ a b c d e f g "Дополнительное справочное руководство по C-INTERCAL" . Архивировано из оригинала на 2008-02-23.
  11. ^ Стросс, Чарльз (сентябрь 1992 г.). «Интеркал - язык из ада» . Computer Shopper (Великобритания) .
  12. ^ "Возврат в интеркале" . Cse.unsw.edu.au. 2006-04-11 . Проверено 10 марта 2012 .
  13. ^ a b Матеас, Майкл; Ник Монфор. «Мрачный ящик: обфускация, странные языки и эстетика кода» (PDF) . Труды 6 - го цифрового искусства и культуры конференции, IT Копенгагенский университет, 1-3 декабря 2005 . С. 144–153.
  14. ^ "Резьбовой интеркал" . Cse.unsw.edu.au. 2004-06-09 . Проверено 10 марта 2012 .
  15. ^ «Официальный сайт Simple Component Intercal для .NET» .
  16. ^ Bratishenko, Лев (зима 2009). «Техномазохизм» . Кабинет (36) . Проверено 27 мая 2014 .

Внешние ссылки [ править ]

  • Официальный сайт C-INTERCAL
  • Ресурсы INTERCAL в Интернете , включая несколько реализаций
  • Computerworld Интервью с Доном Вудсом на INTERCAL
  • Статья об абстракции и модульности в INTERCAL