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[править | править код]

Операция является аналогом побитовых операций — она применяется к двум соответствующим цифрам.

Операция 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&

Примеры[править | править код]

Примечания[править | править код]

  1. Описание алгоритма поиска на сайте Andrew Cooke. Дата обращения: 25 октября 2010. Архивировано из оригинала 18 октября 2010 года.
  2. Пост в блоге Энтони, посвященный языку Malbolge