Malbolge

Malbolge — самый сложный эзотерический язык программирования для написания компьютерных программ в мире, что и является целью создания языка, придуманный Беном Олмстедом в 1998 году.

Получил своё название от «Malebolge», восьмого круга ада Данте.

## Содержание

* 1 Программирование на Malbolge
* 1.1 Hello world
* 2 Виртуальная машина
* 2.1 Регистры
* 2.2 Память
* 2.3 Команды
* 2.4 Операция crazy
* 2.5 Шифрование
* 3 В популярной культуре
* 4 Примеры
* 5 Примечания

## Программирование на 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�@@>}=<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&

## Примеры

[править | править код]

* Работающий исходный код Архивная копия от 10 ноября 2020 на Wayback Machine для песни «99 бутылок пива» с использованием настоящих циклов. Написан Хисаси Идзавой.
* Работающий куайн был написан 3 декабря 2012 года, через 14 лет после создания самого языка.

## Примечания

[править | править код]

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

Языки программирования

* История
* Хронология

* 1C
* Ада
* Алгол
* Ассемблер
* APL
* Бейсик
* Си
* C++
* C#
* D
* Delphi
* Кобол
* Erlang
* F#
* Форт
* Фортран
* Go
* Groovy
* Haskell
* Java
* JavaScript
* Julia
* Kotlin
* Лисп
* Lua
* MATLAB
* Оберон
* Objective-C
* OCaml
* Паскаль
* Perl
* PL/SQL
* PHP
* Python
* Ruby
* Rust
* Scala
* UNIX Shell
* Smalltalk
* Swift
* Visual Basic .NET
* Zig