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
Операція є аналогом побітових операцій — вона застосовується до двох відповідних цифр.
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 пляшок пива» з використанням справжніх циклів. Написав Хісасі Ідзава.[6]
- Робочий квайн написано 3 грудня 2012 року, через 14 років після створення самої мови.
Примітки
- Temkin, Daniel (3 листопада 2014). Interview with Ben Olmstead. esoteric.codes. Процитовано 7 січня 2021.
- Опис алгоритму пошуку на сайті Andrew Cooke. Архів оригіналу за 18 жовтня 2010. Процитовано 25 жовтня 2010.
- Повідомлення в блозі Ентоні, присвячене мові Malbolge
- Scheffer, Lou (17 квітня 2015). Introduction to Malbolge. Процитовано 9 червня 2017.
- Palaiologos (4 березня 2021). kspalaiologos/hello.mb. Процитовано 23 березня 2021.
- Language Malbolge. 99 Bottles of Beer. 29 грудня 2005. Архів оригіналу за 14 травня 2020. Процитовано 19 листопада 2020.