Malbolge: программа, которая переписывает свой код

В большинстве языков текст программы остаётся неизменным, пока компьютер его выполняет. В Malbolge всё устроено иначе: после выполнения команды её ячейка памяти преобразуется. Поэтому следующий запуск той же области памяти может встретить уже другую инструкцию. Это и называют самомодифицирующимся кодом.

Такое изменение не означает, что программа сама «придумывает» новые действия. Правила преобразования заданы заранее: компьютер применяет их к содержимому ячейки. Но программисту приходится учитывать не только то, какую команду выполнить сейчас, а ещё и то, во что эта команда превратится после исполнения.

Почему код трудно писать напрямую

Malbolge использует необычное представление команд и памяти. Значение ячейки влияет на то, как трактуется инструкция, а выполнение меняет её содержимое. Получается цепочка зависимостей: чтобы добиться нужного действия на следующем шаге, нужно заранее рассчитать, как изменится текущий код и куда перейдёт исполнение.

Из-за этого обычный подход — написать понятный текст программы и исправлять его по мере проверки — почти не помогает. Даже короткая последовательность действий требует тщательно подбирать исходные значения памяти. Язык устроен так, что чтение и ручное составление программ становятся особенно сложными.

Зачем понадобился другой компьютер

Первая рабочая программа для Malbolge появилась не как привычно написанный вручную исходник: её пришлось подготовить с помощью программы на другой машине. Это практический выход из замкнутого круга. Если инструкции трудно подбирать вручную, можно поручить компьютеру перебрать или вычислить подходящую последовательность, а затем запустить полученный код в самой Malbolge.

Так язык превращает программирование в задачу о поведении кода во времени: важно не только, что записано в памяти, но и как запись меняется после каждого шага. Именно поэтому один и тот же участок программы здесь способен стать частью совершенно другой инструкции ещё до того, как выполнение дойдёт до него снова.