Перейти до вмісту

Malbolge

Матеріал з Вікіпедії — вільної енциклопедії.

Malbolge — езотерична мова програмування, яку вигадав Бен Олмстед 1998 року. Мова розроблена з метою бути максимально складною для написання програм[1].

Назва походить від Malebolge, восьмого кола пекла Данте.

Програмування на Malbolge

[ред. | ред. код]

Код першої програми, яка виводить «Hello World», згенерувала інша програма мовою Lisp, що використовувала пошук у множині всіх можливих програм, через два роки після появи самої мови Malbolge.[2] Сам автор ніколи не писав програм на Malbolge.[1]

24 серпня 2000 Ентоні Юхас у своєму блогу повідомив[3] про 3 робочих програми мовою Malbolge, що виводять фрази «Hello, world.», «Malbolge sucks.» і «antwon.com rules!».

Пізніше Лу Шеффер зробив криптоаналіз мови і продемонстрував програму для копіювання вхідних даних на вихід.[4]

17 серпня 2004 Томаш Вегжановскі написав генератор програм, що виводять задані рядки. Однак програми, отримані цим шляхом, довші за програми Юхаса.

Hello world

[ред. | ред. код]

Ця програма на Malbolge відображає «Hello, world.»:[5]

(=<`: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

[ред. | ред. код]

Операція є аналогом побітових операцій — вона застосовується до двох відповідних цифр.

Операція 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», наведеної вище), а на іншому записано замовлення кави.

Приклад

[ред. | ред. код]

Примітки

[ред. | ред. код]
  1. а б Temkin, Daniel (3 листопада 2014). Interview with Ben Olmstead. esoteric.codes. Архів оригіналу за 7 вересня 2021. Процитовано 7 січня 2021.
  2. Опис алгоритму пошуку на сайті Andrew Cooke. Архів оригіналу за 18 жовтня 2010. Процитовано 25 жовтня 2010. [Архівовано 2010-10-18 у Wayback Machine.]
  3. Повідомлення в блозі Ентоні, присвячене мові Malbolge
  4. Scheffer, Lou (17 квітня 2015). Introduction to Malbolge. Архів оригіналу за 6 травня 2021. Процитовано 9 червня 2017.
  5. Palaiologos (4 березня 2021), kspalaiologos/hello.mb, архів оригіналу за 5 серпня 2021, процитовано 23 березня 2021
  6. Language Malbolge. 99 Bottles of Beer. 29 грудня 2005. Архів оригіналу за 14 травня 2020. Процитовано 19 листопада 2020.