Malbolge
Malbolge в эзотерический язык программирования, придуманный Беном Олмстедом в 1998 году. Язык разработан с целью быть максимально сложным для написания программ.
Получил своё название от Malebolge, восьмого круга ада Данте.
Содержание |
[править] Программирование на 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<
[править] Виртуальная машина
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 и т. д.
[править] Примеры
- Работающий исходный код для песни «99 бутылок пива» с использованием настоящих циклов. Написан Хисаси Идзавой.
[править] Примечания
| Основные языки программирования (сравнение IDE история хронология) | |
|---|---|
| Используемые в разработке |
Ада APL Язык ассемблера ActionScript ABAP/4 AutoIt AWK Бейсик Си Кобол C++ C# Cω Clarion Clojure ColdFusion Common Lisp D dBase Delphi Eiffel Erlang Euphoria F# Форт Фортран Gambas Go Groovy HAL/S Haskell Icon Java JavaScript Limbo Lua Object Pascal Objective-C OCaml Oz Parser Паскаль Perl PHP PowerBASIC PureBasic Python ПЛ/1 Пролог Ruby Scala Scheme Smalltalk SQL PL/SQL Tcl Vala Visual Basic (.NET) |
| Академические | |
| IEC 61131-3 | |
| Прочие | |
| Эзотерические | |
| Визуальные | |
| Это заготовка статьи о компьютерных языках. Вы можете помочь проекту, исправив и дополнив её. |