Эзотерический язык программирования
Эзотерический язык программирования (иногда сокращается до esolang ) — это язык программирования , предназначенный для проверки границ дизайна языка компьютерного программирования, в качестве доказательства концепции , в качестве искусства программного обеспечения , в качестве хакерского интерфейса к другому языку (особенно функциональному программированию или процедурного программирования) языкам . ), или в шутку . Использование слова «эзотерический» отличает их от языков, которые действующие разработчики используют для написания программного обеспечения. Создатели большинства эсолангов не планируют использовать их для массового программирования, хотя некоторые эзотерические функции, такие как зрительно-пространственный синтаксис , [1] вдохновили на практическое применение в искусстве. Такие языки часто популярны среди хакеров и любителей. [ нужна ссылка ]
Удобство использования редко является целью разработчиков эзотерических языков программирования; часто их конструкция приводит совершенно к обратному. Их обычная цель — удалить или заменить традиционные функции языка, сохраняя при этом язык, полный по Тьюрингу , или даже язык, для которого вычислительный класс неизвестен.
История
[ редактировать ]Самый ранний и до сих пор канонический пример эзотерического языка программирования — INTERCAL . [2] разработанный в 1972 году Доном Вудсом и Джеймсом М. Лайоном, которые заявили, что их намерением было создать язык программирования, непохожий ни на один из тех, с которыми они были знакомы. [3] [4] Он пародировал элементы признанных языков программирования того времени, таких как Fortran , COBOL и язык ассемблера .
На протяжении многих лет компания INTERCAL была представлена только бумажными копиями руководства INTERCAL. Его возрождение в 1990 году в виде реализации на C под Unix стимулировало волну интереса к целенаправленному проектированию эзотерических компьютерных языков.
В 1993 году Воутер ван Оортмерссен создал FALSE, небольшой стек-ориентированный язык программирования с синтаксисом, предназначенным для того, чтобы сделать код запутанным, запутанным и нечитаемым. Размер его компилятора составляет всего 1024 байта. [5] Это вдохновило Урбана Мюллера на создание еще меньшего языка, ныне печально известного Brainfuck , состоящего всего из восьми признанных символов. Криса Пресси Наряду с Befunge (аналог FALSE, но с двумерным указателем инструкций), Brainfuck сейчас является одним из наиболее поддерживаемых эзотерических языков программирования, с каноническими примерами минимальных тьюринговских задержек и излишне запутанными языковыми функциями. Brainfuck относится к P'' семейству машин Тьюринга .
Общие особенности
[ редактировать ]Хотя эзотерические языки программирования во многом различаются, есть некоторые общие черты, характеризующие многие языки, такие как пародия, минимализм и цель усложнить программирование. [6] Многие эзотерические языки программирования, такие как Brainfuck и подобные, используют в качестве команд отдельные символы, однако языки нередко читают построчно, как обычные языки программирования .
Уникальные представления данных
[ редактировать ]Обычные императивные языки программирования обычно позволяют хранить данные в переменных, но эзотерические языки могут использовать другие методы хранения данных и доступа к ним. Такие языки, как Brainfuck и Malbolge, позволяют читать данные только с помощью одного указателя , который необходимо переместить в интересующее место перед чтением данных. Другие, такие как Befunge и Shakespeare , используют один или несколько стеков для хранения данных, что приводит к способу выполнения, похожему на обратную польскую нотацию . Наконец, существуют языки, которые исследуют альтернативные формы представления чисел: вариант Brainfuck Boolfuck допускает операции только с отдельными битами, тогда как Malbolge и вариант INTERCAL TriINTERCAL полностью заменяют биты на троичную систему с основанием 3. [7]
Уникальные представления инструкций
[ редактировать ]Эзотерические языки также демонстрируют уникальные способы представления программных инструкций. Некоторые языки, такие как Befunge и Piet , представляют программы в двух или более измерениях, при этом управление программой перемещается в нескольких возможных направлениях по программе. [8] [ нужна страница ] Это отличается от обычных языков, в которых программа представляет собой набор инструкций, обычно встречающихся последовательно. Другие языки изменяют инструкции, придавая им необычную форму, часто такую, которая может быть прочитана людьми, с альтернативным значением основных инструкций. Шекспир достигает этого, делая все программы похожими на пьесы Шекспира. Chef достигает того же, превращая все программы в рецепты. [7] Chef особенно примечателен тем, что некоторые из них создали программы, которые успешно функционируют и как программа, и как рецепт, демонстрируя способность языка создавать это двойное значение. [9]
Трудно читать и писать
[ редактировать ]Многие эзотерические языки программирования созданы для создания глубоко запутанного кода , что затрудняет его чтение и написание. [10] Целью этого может быть создание интересной головоломки или задачи для авторов программ: Malbolge например, был явно спроектирован как сложная задача, поэтому у него есть такие функции, как самомодифицирующийся код и крайне нелогичные операции. [10] С другой стороны, некоторые эзотерические языки становится труднее писать из-за других вариантов дизайна. Brainfuck придерживается идеи минималистского набора команд, поэтому, хотя его инструкции в принципе просты, возникающий код труден для чтения человеком. Трудности с INTERCAL возникают в результате решения избегать операций, используемых в любом другом языке программирования, что связано с его происхождением как пародия на другие языки. [10]
Пародия и пародия
[ редактировать ]Одна из целей эзотерических языков программирования — пародировать или подделывать существующие языки и тенденции в области программирования. [10] Например, первый эзотерический язык INTERCAL возник как пародия на языки, использовавшиеся в 1960-х годах, такие как APL , Fortran и COBOL . Правила INTERCAL кажутся обратными правилам других языков. [11] Однако предметом пародии не всегда является другой устоявшийся язык программирования. Например, Шекспира можно рассматривать как подделку структуры шекспировских пьес. Язык Ок! — это пародия на Brainfuck , где восемь команд Brainfuck заменены различными звуками орангутанга, например «Ок. Ок?» [7]
Примеры
[ редактировать ]Бефунге
[ редактировать ]Befunge позволяет указателю инструкции перемещаться по коду в нескольких измерениях. Например, следующая программа отображает «Hello World», помещая символы в стек в обратном порядке, а затем печатая символы в цикле, который циркулирует по часовой стрелке по инструкциям. >
, :
, v
, _
, ,
, и ^
.
"dlroW olleH">:v
^,_@
Существует множество версий Befunge, наиболее распространенной из которых является Befunge-93, названная так потому, что она была выпущена в 1993 году. [12]
Бинарное лямбда-исчисление
[ редактировать ]Бинарное лямбда-исчисление разработано с точки зрения алгоритмической теории информации , чтобы обеспечить максимально плотный код с минимальными средствами, включая 29-байтовый самоинтерпретатор, 21-байтовое сито простых чисел и 112-байтовый интерпретатор Brainfuck. [13]
Трах мозгов
[ редактировать ]Brainfuck разработан с учетом крайнего минимализма и приводит к запутанному коду, в котором программы содержат только восемь различных символов. Следующая программа выводит «Hello, world!»: [14]
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.
Все персонажи, кроме +-<>,.[]
игнорируются.
Курица
[ редактировать ]У курицы всего три токена: слово «курица», « » (символ пробела) и символ новой строки. Компилятор интерпретирует количество «цыплят» в строке как инструкцию кода операции, которую он использует для манипулирования данными в стеке. Простая программа для курицы может содержать десятки строк, в которых нет ничего, кроме слова «курица», повторяющегося бесчисленное количество раз. [15] Курицу изобрел Торбьорн Седерстедт, который черпал вдохновение для создания языка из пародии на научную диссертацию. [16] [17] [18]
Шеф-повар
[ редактировать ]Chef — это стек-ориентированный язык программирования, созданный Дэвидом Морганом-Маром и предназначенный для того, чтобы программы выглядели как кулинарные рецепты . [19] Программы состоят из заголовка, списка переменных и их значений данных, а также списка инструкций по работе со стеком. [20] Шуткий принцип проектирования гласит, что «рецепты программ должны не только генерировать достоверные результаты, но и быть простыми в приготовлении и вкусными», и Морган-Мар отмечает, что пример «Hello, World!» Программа с «101 яйцом» и «111 чашками масла» позволит производить «много еды на одного человека». [20] [21]
ФРАКТРАН
[ редактировать ]Программа FRACTRAN представляет собой упорядоченный список положительных дробей вместе с исходным входным положительным целым числом. . Программа запускается путем умножения целого числа по первой дроби в списке для которого является целым числом. Целое число затем заменяется на и правило повторяется. Если ни одна дробь в списке не дает целое число при умножении на , программа останавливается. FRACTRAN был изобретен математиком Джоном Конвеем . [22]
Гольфскрипт
[ редактировать ]Программы на GolfScript, языке, созданном для кода гольфа , состоят из списков элементов, каждый из которых помещается в стек по мере обнаружения, за исключением переменных, которые имеют в качестве значения блоки кода, и в этом случае код выполняется. . [23]
ИНТЕРКАЛ
[ редактировать ]INTERCAL , сокращение от «Язык компилятора без произносимого акронима», был создан в 1972 году как пародия на высмеивание аспектов различных языков программирования того времени. [4]
JSFuck
[ редактировать ]JSFuck — это эзотерический стиль программирования JavaScript , в котором код пишется с использованием всего шести символов: [
, ]
, (
, )
, !
, и +
.
В отличие от Brainfuck, для которого требуется собственный компилятор или интерпретатор, JSFuck представляет собой действительный код JavaScript, а это означает, что программы JSFuck можно запускать в любом веб-браузере или движке, интерпретирующем JavaScript. [24] [25] Он использовался в ряде атак с использованием межсайтового сценария (XSS) на такие веб-сайты, как eBay, из-за его способности обходить фильтры обнаружения межсайтового сценария. [26]
ЛОЛКОД
[ редактировать ]LOLCODE напоминает речь лолкотов . Ниже приведен пример «Hello World»:
HAI CAN HAS STDIO? VISIBLE "HAI WORLD!" KTHXBYE
Хотя семантика LOLCODE не является чем-то необычным, его синтаксис описывается как лингвистическое явление, представляющее собой необычный пример неформальной речи и интернет-сленга в программировании. [27]
Мальбольге
[ редактировать ]Malbolge (названный в честь 8-го круга ада ) был задуман как самый сложный и эзотерический язык программирования. Помимо других особенностей, код является самомодифицирующимся, и эффект инструкции зависит от ее адреса в памяти. [28]
Пит
[ редактировать ]Piet — язык, разработанный Дэвидом Морган-Маром , чьи программы представляют собой растровые изображения , похожие на абстрактное искусство . [29] Выполнением управляет «указатель», который перемещается по изображению от одной непрерывно окрашенной области к другой. Процедуры выполняются, когда указатель выходит из региона.
Имеется 20 цветов, для которых задано поведение: 18 «красочных» цветов, которые упорядочены по 6-ступенчатому циклу оттенка и 3-ступенчатому циклу яркости; и черно-белые, которые не заказываются. При выходе из «красочного» цвета и вводе другого выполняемая процедура определяется количеством ступеней изменения оттенка и яркости. В черный нельзя войти; когда указатель пытается войти в черную область, вместо этого изменяются правила выбора следующего блока. Если испробованы все возможные правила, программа завершается. Области за пределами изображения также считаются черными. Белый не выполняет операций, но позволяет указателю «пройти». Поведение цветов, отличных от указанных 20, остается на усмотрение компилятора или интерпретатора. [29] [ нужен неосновной источник ]
Переменные хранятся в памяти как целые числа со знаком в одном стеке . Большинство определенных процедур имеют дело с операциями в этом стеке, тогда как другие имеют дело с вводом/выводом и с правилами, по которым перемещается указатель компиляции. [30]
Пит был назван в честь голландского художника Пита Мондриана . [31] Первоначальное предполагаемое имя, Mondrian , уже было использовано системой визуализации статистических данных с открытым исходным кодом . [29]
Шекспир
[ редактировать ]Шекспир создан для того, чтобы программы выглядели как пьесы Шекспира . Например, следующий оператор объявляет точку в программе, к которой можно добраться с помощью оператора типа GOTO: [ нужна ссылка ]
Act I: Hamlet's insults and flattery.
Унлямбда
[ редактировать ]Unlambda — минималистичный функциональный язык программирования, основанный на исчислении SKI , но в сочетании с первоклассными продолжениями и императивным вводом-выводом (при этом ввод обычно требует использования продолжений). [32]
Пробелы
[ редактировать ]В пробелах используются только пробельные символы (пробел, табуляция и возврат), игнорируя все остальные символы, которые, следовательно, могут использоваться для комментариев. Это противоположность многим традиционным языкам, которые не различают разные символы пробелов, рассматривая табуляцию и пробел одинаково. Это также позволяет скрывать программы с пробелами в исходном коде программ на таких языках, как C. [ нужна ссылка ]
Культурный контекст
[ редактировать ]Культурный контекст эсолангов изучал Джефф Кокс, который пишет, что эсоланги «перемещают внимание от командования и контроля к культурному самовыражению и отказу». [33] похожее на кодовое искусство и кодовую поэзию, например, Mez Breeze мезангеле рассматривая эсоланги как нечто , убеждение, разделяемое другими в этой области. [34] Дэниел Темкин описывает Brainfuck как «отказывающую ослабить границу между человеческим выражением и ассемблерным кодом и тем самым отправляющую нас в нелепое логическое путешествие». [35] разоблачение внутреннего конфликта между человеческим мышлением и компьютерной логикой путем деконструкции их взаимоотношений. Он связывает программирование внутри эсоланга с выполнением оценки событий, например, событий движения Флюксус , где воспроизведение нерегулярных правил логики в коде проясняет точку зрения языка. [36]
Ссылки
[ редактировать ]- ^ Маклин А., Гриффитс Д., Коллинз Н. и Виггинс Г. (2010). «Визуализация живого кода». В электронной визуализации и искусстве , Лондон: 2010.
- ^ Мэтью Фуллер, Исследования программного обеспечения , MIT Press, 2008 г.
- ^ Эрик С. Рэймонд (1996). Новый словарь хакера . МТИ Пресс. п. 258. ИСБН 978-0-262-68092-9 .
- ^ Jump up to: а б Вудс, Дональд Р.; Лайон, Джеймс М. (1973), Справочное руководство по языку программирования INTERCAL , Muppetlabs.com , получено 1 мая 2023 г.
- ^ «Интервью с Воутером ван Оортмерсеном» . Эзотерические.коды . 1 июля 2015 года . Проверено 1 мая 2023 г.
- ^ Фуллер, Мэтью (2008). Программное обеспечение: лексикон . С Прессой. ISBN 978-0-262-06274-9 . OCLC 1156851190 .
- ^ Jump up to: а б с Морр, Себастьян. «Эзотерические языки программирования». (2015).
- ^ Кокс 2013 .
- ^ Майк (31 марта 2013 г.). «Выпечка торта «Привет, мир»» . Продукты разума Майка . Проверено 1 мая 2023 г.
- ^ Jump up to: а б с д Матеас М. и Монфор Н. Бокс, Мрачно: запутывание, странные языки и эстетика кода. В «Цифровом искусстве и культуре: Цифровой опыт: дизайн, эстетика, практика» (DAC 2005) , Копенгаген, Дания, 2005.
- ^ Габури, Джейкоб (2018). «Критическое разрушение: к странным вычислениям». В Джентери Сэйерс (ред.). Routledge Companion по медиа-исследованиям и цифровым гуманитарным наукам . Нью-Йорк: Рутледж. стр. 483–491. дои : 10.4324/9781315730479-50 . ISBN 978-1-315-73047-9 .
- ^ «Языки» .
- ^ Джон Тромп. «Самый функциональный» . Международный конкурс запутанного кода C.
- ^ "Эль Брейнфак" . копировать.sh . Проверено 30 ноября 2022 г.
- ^ « Привет, мир» на эзотерических языках программирования? (Эсоланги)» . Сообщество разработчиков 👩💻👨💻 . 25 июля 2020 г. Проверено 4 декабря 2022 г.
- ^ «Самые странные языки программирования | Программирование» . www.omnesgroup.com . 8 августа 2018 года . Проверено 4 декабря 2022 г.
- ^ «8 глупых языков программирования» . 27 апреля 2022 г.
- ^ Hongkiat.com (8 сентября 2021 г.). «10 самых странных языков программирования, том 2» . Хонкиат . Проверено 4 декабря 2022 г.
- ^ Козенс, Саймон (2005). Продвинутое программирование на Perl . О'Рейли Медиа. п. 269. ИСБН 978-0-596-00456-9 .
Последнее любопытство Acme и одно из моих любимых — это Acme::Chef, реализация языка программирования Chef Дэвида Моргана-Мара. В Chef программы выражены в виде рецептов:...
- ^ Jump up to: а б Морган-Мар, Дэвид (24 марта 2011 г.). «Шеф» . Эзотерические языки программирования DM . Самостоятельно опубликовано . Проверено 1 мая 2023 г.
- ^ Морган-Мар, Дэвид (28 июня 2014 г.). «Шеф – Привет, мир» . Эзотерические языки программирования DM . Самостоятельно опубликовано . Проверено 1 мая 2023 г.
- ^ Кнейзель, Рональд (2022). Странный код: эзотерические языки, которые снова делают программирование увлекательным . Нет крахмального пресса. п. 217. ИСБН 978-1718502406 .
- ^ Смит, Даррен (2007). «Учебник по гольф-скрипту» .
- ^ Бейли, Джейн (29 февраля 2016 г.). «Торги на безопасность» . Ежедневный WTF . Проверено 2 марта 2020 г.
- ^ «Изучение JSF*ck» . аллигатор.io . Проверено 2 марта 2020 г.
- ^ Дэн Гудин (3 февраля 2016 г.). «eBay не планирует исправлять «серьезную» ошибку, позволяющую распространять вредоносное ПО [обновлено]» . Арс Техника .
- ^ Забенков А.А.; Морел Морель, окружной прокурор (2014). «Эзотерические языки программирования как современное семиотическое направление» . Experientia Est Optima Magistra: Собрание произведений искусства . 3 . Белгородский государственный университет: 170.
- ^ Темкин, Дэниел (3 ноября 2014 г.). «Интервью с Беном Олмстедом» . эзотерические.коды . Проверено 7 января 2021 г.
- ^ Jump up to: а б с Морган-Мар, Дэвид (25 января 2008 г.). «Пит» . Проверено 1 мая 2023 г.
- ^ Кнейзель, Рональд (2022). Странный код: эзотерические языки, которые снова делают программирование увлекательным . Нет крахмального пресса. стр. 246–247. ISBN 978-1718502406 .
- ^ Кокс 2013 , с. 6
- ^ Чу-Кэрролл, Марк К. (11 августа 2006 г.). «Пятничное патологическое программирование: Унлямбда, или Программирование без переменных» . Хорошая математика, плохая математика (блог) . Научные блоги.
- ^ Кокс 2013 , с. 5
- ^ «Истинный смысл эзотерических языков программирования» . Апифоника . Проверено 30 ноября 2023 г.
- ^ Темкин, Дэниел (15 января 2014 г.). «Сбой и взаимодействие человека и компьютера» . НООАРТ: Журнал беспредметного искусства (1).
- ^ Темкин, Даниил (8 мая 2013 г.). "травка мозгов" . Журнал «Медиа-Н» (весна 2013) . Проверено 1 мая 2023 г.
Библиография
[ редактировать ]- Палок-Берже, Камилла (2009). «Эзотерические языки». Поэтика кодов компьютерной сети . Современные архивы. ISBN 978-2-914610-70-4 .
- Кокс, Джефф (2013). Разговорный код: кодирование как эстетическое и политическое выражение . МТИ Пресс. ISBN 978-0-262-01836-4 .
- Кнейзель, Рональд (2022). Странный код: эзотерические языки, которые снова делают программирование увлекательным . Нет крахмального пресса. ISBN 978-1718502406 .
Внешние ссылки
[ редактировать ]- Эсоланг, вики по эзотерическим языкам программирования
- Обфусцированные языки программирования в Curlie