Доброе время суток, Хабраобщество.
Страдал я в свое время ерундой, отслеживая появление разных эзотерических языков программирования и попался мне небезызвестный всем нам Malbolge. Вот собственно о нем я и хочу поведать. Ну, начнем-с.
А начнем с того, что пресловутый BrainFuck даже рядом не лежал — такой этот Malbolge крутой и сложный. Первый код на этом языке был написан не людьми, а другой программой, написаной на Lisp, и то только через два года после появления этого языка.
Но поговорим об аде программировании на Malbolgе. Во-первых, он работает в троичной системе счисления, что немаловажно, для разумения того кода, который должен быть вписан в интерпритатор.
В Malbolge есть три регистра: a, c и d. Регистр c – регистр кода, используемый в качестве указателя на текущую команду. Регистр d – регистр данных, используемый для управления данными. Регистр a – аккумулятор, также используемый некоторыми командами для манипуляции данными.
В Malbolge есть 8 команд. Машина определяет, какую команду выполнять, следующим образом: к значению ячейки с адресом c ([c]) прибавляется значение c, а в качестве команды выступает остаток от деления этого числа на 94, если [C] не входит в диапазон от 33 до 126 включительно.
А вот собственно список команд:
- j D = [D] Сдвигает указатель данных в ячейку, на которую указывало его прошлое значение
- i C = [C] Сдвигает указатель инструкций в ячейку, на которую указывало его прошлое значение
- * A = [D] = ROTATE([D]) Циклически сдвигает значение в ячейке, на которую указывает D, на один трит вправо. Попутно это значение записывается в A.
- p A = [D] = CRAZY(A, [D]) Применяет операцию crazy к значению регистра A и ячейки, на которую указывает D.
- / A = INPUT Читает один символ из потока ввода и сохраняет его в A.
- < PRINT A Выводит на печать символ с ASCII-кодом A mod 256.
- v STOP Завершить выполнение программы.
- o NOP Команда, которая не делает ничего (единственная допустимая).
После выполнения каждой инструкции она шифруется операцией 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@
С основами мы с горем пополам разобрались, пришло время писать код.
Но вот тут-то, и получился облом: как бы я не старался, не удавалось мне написать работающую программу на этом языке.
Поэтому привожу примеры крутых хакеров умных людей, которым это удалось.
Эта программа выводит Hello, world:
(=<`:9876Z4321UT.-Q+*)M'&%$H"!~}|Bzy?=|{z]KwZY44Eq0/{mlk**hKs_dG5[m_BA{?-Y;;Vb'rR5431M}/.zHGwEDCBA@986543W10/.R,+O<
и эта тоже:
('&%:9]!~}|z2Vxwv-,POqponl$Hjig%eB@@>}=<M:9wv6WsU2T|nm-,jcL(I&%$#"`CB]V?Tx<uVtT`Rpo3NlF.Jh++FdbCBA@?]!~|4XzyTT43Qsqq(Lnmkj"Fhg${z@>
На этом, собственно, и все. А если вам все же удастся написать хоть что-то на Malbolge обязательно мне сообщите — хочу сфотографироватся вместе с гением.
Автор: samaranin