Malbolge (Malbolge)
Malbolge — самый сложный эзотерический язык программирования для написания компьютерных программ в мире, что и является целью создания языка, придуманный Беном Олмстедом в 1998 году.
Получил своё название от «Malebolge», восьмого круга ада Данте.
Программирование на Malbolge
[править | править код]Код первой программы, выводящей «Hello World», сгенерировала другая программа на языке Lisp, использовавшая поиск в множестве всех возможных программ, через два года после появления самого языка Malbolge. [1]
24 августа 2000 года Энтони Юхас в своём блоге анонсировал[2] 3 работающих программы на языке Malbolge, выводящих фразы «Hello, world.», «Malbolge sucks.» и «antwon.com rules!».
Позже Лу Шеффер произвел криптоанализ языка.
17 августа 2004 года Томаш Вегжановски написал генератор программ, выводящих заданные строки. Однако программы, полученные этим путём, длиннее программ Юхаса.
Hello world
[править | править код]Эта программа на Malbolge отображает «Hello, world.»:
(=<`:9876Z4321UT.-Q+*)M'&%$H"!~}|Bzy?=|{z]KwZY44Eq0/{mlk**hKs_dG5[m_BA{?-Y;;Vb'rR5431M}/.zHGwEDCBA@98\6543W10/.R,+O<
второй вариант:
('&%:9]!~}|z2Vxwv-,POqponl$Hjig%eB@@>}=<M:9wv6WsU2T|nm-,jcL(I&%$#"`CB]V?Tx<uVtT`Rpo3NlF.Jh++FdbCBA@?]!~|4XzyTT43Qsqq(Lnmkj"Fhg${z@>
третий вариант:
(=<`#9]~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc
Виртуальная машина
[править | править код]Malbolge — это машинный язык для виртуальной машины (интерпретатора), работающей в троичной системе счисления.
Регистры
[править | править код]В виртуальной машине Malbolge есть три регистра: a, c и d. Регистр c — регистр кода, используемый в качестве указателя на текущую команду. Регистр d — регистр данных, используемый для управления данными. Регистр a — аккумулятор, также используемый некоторыми командами для манипуляции данными. При запуске программы все регистры равны нулю.
Память
[править | править код]Размер памяти виртуальной машины — 59049 (310) ячеек с числами из 10 троичных цифр. Все ячейки с адресами от 0 до 59048 имеют значения от 0 до 59048. Все изменения происходят по модулю 59049 (mod 59049). При запуске программы начало памяти заполняется ASCII-кодами символов её исходного текста. Символы пустого пространства (пробелы, табуляция, переносы строк и пр.) игнорируются, а остальные символы должны быть командами Malbolge (см. ниже). Остаток памяти заполняется с использованием операции crazy (см. ниже): [m] = crz [m-2], [m-1].
Команды
[править | править код]В Malbolge есть 8 команд. Виртуальная машина определяет, какую команду выполнять, следующим образом: к значению ячейки с адресом c ([c]) прибавляется значение c, а в качестве команды выступает остаток от деления этого числа на 94 (поскольку во входном алфавите языка 94 символа, ASCII-коды которых с 33-го по 126-й). Таблица действий интерпретатора:
Значение ([c] + c) % 94 |
Инструкция | Пояснение |
---|---|---|
4 | mov c, [d] | Переход к ячейке с номером [d]. |
5 | out a | Вывод значения ASCII-символа с кодом a % 256 на экран. |
23 | in a | Ввод ASCII-символа в a. Разделитель строк имеет код 10. Конец файла — 59048. |
39 | rotr [d] mov a, [d] |
Сдвигает значение [d] на одну троичную цифру вправо (0002111112 превращается в 2000211111). Результат сохраняется в [d] и в a. |
40 | mov d, [d] | Копирование значения из [d] в d. |
62 | crz [d], a mov a, [d] |
Произвести операцию crazy (см. ниже) со значениями [d] и a. Результат сохраняется в [d] и в a. |
68 | nop | Ничего не делает. |
81 | end | Конец программы. |
Любые другие значения ничего не делают. Они не разрешены при загрузке программы, но разрешены после этого. |
После выполнения каждой инструкции она шифруется (см. ниже). После этого значения c и d увеличиваются на 1 и выполнение продолжается со следующей инструкции.
Операция crazy
[править | править код]Операция является аналогом побитовых операций — она применяется к двум соответствующим цифрам.
crz | 2-я цифра | |||
---|---|---|---|---|
0 | 1 | 2 | ||
1-я цифра | 0 | 1 | 0 | 0 |
1 | 1 | 0 | 2 | |
2 | 2 | 2 | 1 |
Шифрование
[править | править код]После того, как очередная инструкция выполнена, инструкция шифруется с помощью следующей таблицы перевода (если она является одним из возможных символов языка):
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ 5z]&gqtyfr$(we4{WP)H-Zn,[%\3dL+Q;>U!pJS72FhOA1CB6v^=I_0/8|jsb9m<.TVac`uY*MK'X~xDl}REokN:#?G"i@
то есть !
становится 5
и т. д.
В популярной культуре
[править | править код]В 10-м эпизоде первого сезона сериала «Элементарно» ключевой уликой в разгадке преступления послужил клочок бумаги, на одной из сторон которого был распечатан код программы на Malbolge (являющийся неточной копией программы «Hello World» выше), а на другой записан заказ кофе.
'&%$#"!~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPlNdibaf_dcbaZ~A]\Uy<XW PtTSRQ3IHMFjDCHA@d'&%$#"!~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMc hgfedcb[`_X|?>=<;:9OTMLQPONMFj-,+*)('CB;@9>=<;4Xyxwvutsrqponmlkjihgfedcba`_^ ]\[ZYXWVUTSRQPONMLKJIHGFEDCB^]\[Z<XWPOTSLpPON0Fj-,+*)('&%$#"!~}|{zyxwvutsrqp onmlkjihgfedcba`_^]\[ZYXWVUTponPfkjihafe^$bD`YX]VzZYXW9UTSLp3OHl/.-,+*)('&%$ #"!~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVlqponmlkjchg`&G]ba`YX|?>=<;:9OTM RQPONMFj-,+*)('&%$#"!~}|{zyxwvutsrqponm+*)('&%$#cb~`=^]sxqputsrqj0hg-NMLKJIH GFEDCBA@?>=YXW9ONSLQPOHlLKDCg*)('&%A#?>7<;:981U5432r*N.-,l$H"'&}C#cy~}vu;s9&
Примеры
[править | править код]- Работающий исходный код Архивная копия от 10 ноября 2020 на Wayback Machine для песни «99 бутылок пива» с использованием настоящих циклов. Написан Хисаси Идзавой.
- Работающий куайн был написан 3 декабря 2012 года, через 14 лет после создания самого языка.
Примечания
[править | править код]- ↑ Описание алгоритма поиска на сайте Andrew Cooke . Дата обращения: 25 октября 2010. Архивировано из оригинала 18 октября 2010 года.
- ↑ Пост в блоге Энтони, посвященный языку Malbolge