Доброе время суток, Хабраобщество.
Сегодня я попробую вам рассказать как написать программу на Malbolge.
Ровно две недели назад я узнал о языке Malbolge из сериала «Элементарно». Как раз в этот период мне в Университете поручили написать статью и провести исследование на выбранную мной тему, не задумываясь я выбрал Malbolge (о чем скоро пожалел). Забравшись в интернет я нашел не так много информации, точнее я нашел только описание специфики и историю. Мне пришлось разбираться со всем самому. При многочисленных попытках я нашел довольно много нюансов которыми я хочу поделиться с вами, также я представлю свой код программы.
Информацию и специфику языка вы может найти перейдя по ссылке вики.
Вики дает две программы, которые печатают «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@>
Если попытаться заменить любой символ в программе она перестает работать. Прична скрывается в шифровании, то есть любой символ входящий в программу шифруется с помощью формулы (m [c] + c-33)% 94, эту формулу нам предоставляет вики. Когда прогрма загружается в память, она просматривает каждый символ и если хотя бы один из них не является командой файл отключается. Для примера возьмем фрагмент из первого варианта программы:
(= <`: 9876Z4321UT.-Q + *)
Этот фрагмент равен:
jpp <ppppp <pppp << pp <ppp
Теперь подробнее. На входе в программу строка делится на символы каждый из них соответствует номеру в таблице ASCII, и именно этот номер играет решающую роль в шифровании данных, например: (= 40 (по коду ASCII), так что в формулу передается число 40 (напомню, нумерация всех символ начинается с 0): (40 + 0-33)% 94 = 0,07, остаток от деления используется как индекс в следующей строке:
+ b (29e * j1VMEKLyC}) 8 & m # ~ W> qxdRp0wkrUo [D7, XTcA „lI.v% {gJh4G \ — = O @ 5`_3i <? Z '; FNQuY] szf $! BS / | t: Pn6 ^ Ha
Под индексом 7 находится символ j. Операция шифрования проводится до окончания входного рядка.Дали согласно зашифрованного файла выполняется команда.
Отступление. Не все это вы прочтете в этой статье будет отвечать вики, так как я пишу с своих наблюдений и опыта.
Итак, вернемся к выполнению программы. Если таким методом зашифровать всю строку мы получим следующее:
jpp<ppppp<pppp<<pp<ppp<pppp<ppppp<pp<ioooj/ojji</oiivoooi<ojvpoj/pvojj<j/o*jov/<ojjj*o/jj/oo/oooooopp<pppp<pppp<pp<v
И так мы имеем 2 строки, с которыми в дальнейшем мы будем работать:
Входная программа:
(=<`:9876Z4321UT.-Q+*)M'&%$H“!~}|Bzy?=|{z]KwZY44Eq0/{mlk**hKs_dG5[m_BA{?-Y;;Vb'rR5431M}/.zHGwEDCBA@986543W10/.R,+O<
И зашифрована программа:
jpp<ppppp<pppp<<pp<ppp<pppp<ppppp<pp<ioooj/ojji</oiivoooi<ojvpoj/pvojj<j/o*jov/<ojjj*o/jj/oo/oooooopp<pppp<pppp<pp<v
Выполняем программу:
Первым входным зашифрованным символом является j, соответствующую команде jmp [d + 1], вики говорит что jmp [d] — это не правда, так мы добираемся символа ] входной строки, так как (= 40, а 40 + 1 = 41, 41 символом входной строки является ]. Далее переходим к следующей команды:p — команда операции crz (a, d), в реестре a ничего не находится, т.е. а = 0, реестра d соответствует символ ] = 93, выполняем операцию и получаем Т = 84, значения Т записывается в реестр а = 93. Выполняем следующую команду p: a = crz (a, d) = crz (T, K) = crz (93,75) = H = 72. Таким образом мы получаем первую букву слова „Hello ». Выполняем следующую команду <: эта команда просто печатает символ содержащийся в реестре а есть Н.
По такому принципу работает Malbolge.
Обещанная мной выше программа:
(= <;: ^! 7 [54321654-Q + * N; -, + *) 5 '&% $ # “, -} | {z] rwIoGVlDTBhPlk * <LKf
Печатает „MegU“ — Международный экономико-гуманитарный университет имени академика Степана Демьянчука. Украина, Ровно.
Если возникнут вопросы прошу мне сообщить.
Как построить космический аппарат не выходя из офиса