Jump to content

ИНТЕРКАЛ

Дон Вудс , один из авторов INTERCAL, 2010 г.
Джим Лайон, другой автор INTERCAL, 2005 г.

Язык компилятора без произносимой аббревиатуры ( INTERCAL ) — это эзотерический язык программирования , который был создан как пародия Доном Вудсом и Джеймсом М. Лайоном [ ru ] , двумя студентами Принстонского университета , в 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 г. достигнув 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, якобы объясняющая работу оператора «выбрать».

Справочное руководство 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 всего пять операторов. Реализации различаются тем, какие символы представляют какую операцию, и многие из них принимают более одного символа, поэтому для многих операторов предоставляется более одной возможности.

Операторы ИНТЕРКАЛ [4] [5] [9]
Оператор ИНТЕРКАЛ-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.

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

  1. ^ «А-Я языков программирования: INTERCAL» . Техмир. 04 июля 2008 г. Проверено 10 марта 2012 г.
  2. ^ «Страница ресурсов INTERCAL» . Catb.org . Проверено 10 марта 2012 г.
  3. ^ «Биография Алекса Смита» . wolframscience.com .
  4. Перейти обратно: Перейти обратно: а б с д и «Клк-Интеркал» . Clc-Интеркал. 01.04.2010. Архивировано из оригинала 24 декабря 2012 г. Проверено 10 марта 2012 г.
  5. Перейти обратно: Перейти обратно: а б с д и ж г час я дж к л м н тот «Справочное руководство ИНТЕРКАЛ» . Архивировано из оригинала 16 июля 2011 г. Проверено 10 марта 2012 г.
  6. ^ «Синтаксис Princeton и Atari — обновленное руководство по эксплуатации C-INTERCAL 0.27» . Архивировано из оригинала 24 декабря 2012 г. Проверено 12 ноября 2012 г.
  7. ^ «Файл ИСТОРИИ для C-INTERCAL» . 12 июня 2019 г. Архивировано из оригинала 05 мая 2020 г. Проверено 5 мая 2020 г.
  8. ^ «Файл README для CLC-INTERCAL» . Архивировано из оригинала 5 мая 2020 г. Проверено 5 мая 2020 г.
  9. Перейти обратно: Перейти обратно: а б с д и ж г «Дополнительное справочное руководство C-INTERCAL» . Архивировано из оригинала 23 февраля 2008 г.
  10. ^ Стросс, Чарльз (сентябрь 1992 г.). «Интеркал — язык ада» . Компьютерный покупатель (Великобритания) .
  11. ^ «Откат в Интеркале» . Cse.unsw.edu.au. 11 апреля 2006 г. Проверено 10 марта 2012 г.
  12. Перейти обратно: Перейти обратно: а б Матеас, Майкл; Ник Монфор. «Темная коробка: обфускация, странные языки и эстетика кода» (PDF) . Материалы 6-й конференции по цифровому искусству и культуре, Копенгагенский университет информационных технологий, 1–3 декабря 2005 г. стр. 144–153.
  13. ^ «Резьбовой интеркал» . Cse.unsw.edu.au. 9 июня 2004 г. Проверено 10 марта 2012 г.
  14. ^ «Официальный дом Simple Component Intercal для .NET» . Гитхаб . 30 сентября 2021 г.
  15. ^ Братишенко, Лев (зима 2009 г.). «Техномазохизм» . Кабинет (36) . Проверено 27 мая 2014 г.

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

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: be0d8a797c8acb4a551e1dfbcb55de82__1716278340
URL1:https://arc.ask3.ru/arc/aa/be/82/be0d8a797c8acb4a551e1dfbcb55de82.html
Заголовок, (Title) документа по адресу, URL1:
INTERCAL - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)