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@>
Виртуальная машина [править]
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 | Конец программы. |
| Любые другие значения ничего не делают. Они не разрешены при загрузке программы, но разрешены после этого. | ||
После выполнения каждой инструкции она шифруется операцией Crazy. После этого значения 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" выше), а на другой записан заказ кофе.
Примеры [править]
- Работающий исходный код для песни «99 бутылок пива» с использованием настоящих циклов. Написан Хисаси Идзавой.
Примечания [править]
| Основные языки программирования (сравнение • IDE • история • хронология) | |
|---|---|
| Используемые в разработке |
Ада • APL • Язык ассемблера • ActionScript • ABAP/4 • AutoIt • AWK • Бейсик • Си • Кобол • C++ • C# • Cω • Clarion • Clojure • ColdFusion • Common Lisp • D • dBase • Delphi • Eiffel • Erlang • Euphoria • F# • Форт • Фортран • Gambas • Go • Groovy • HAL/S • Haskell • Icon • Java • JavaScript • Limbo • Lua • Модула-3 • Object Pascal • Objective-C • OCaml • Oz • Parser • Паскаль • Компонентный Паскаль • Perl • PHP • PowerBASIC • Python • ПЛ/1 • Пролог • Ruby • Scala • Scheme • Smalltalk • SQL • PL/SQL • Tcl • Vala • Visual Basic (.NET) |
| Академические | |
| IEC 61131-3 |
Instruction List • ST • FBD • Ladder Diagram (LD) • SFC |
| Прочие | |
| Эзотерические | |
| Визуальные | |