К книге
Квантовые вычисления со времен Демокрита5. Палеосложность. Загадка 1 из предыдущей главы
28%
5. Палеосложность. Загадка 1 из предыдущей главы
22

Можем ли мы считать без потери общности что компьютерная программа имеет доступ к собственному тексту? В качестве простого примера зададимся вопросом: существует ли программа, которая на выходе распечатывает сама себя?

Ответ: да, такие программы существуют. Более того, проходят даже конкурсы на то, кто напишет самую короткую самораспечатывающуюся программу. На международном конкурсе IOCCC (International Obfuscated C Code Contest)[28] несколько лет назад победила необычайно короткая программа. Догадайтесь, сколько в ней было символов: 30? 10? 5?

В победившей программе был ровно нуль знаков. (Подумайте об этом!) Правда, пустой файл нельзя все же назвать по-настоящему кошерной программой на языке C, но, судя по всему, некоторые компиляторы готовы скомпилировать его в программу, которая не будет ничего делать.

Хорошо, хорошо, но что если мы хотим получить нетривиальную программу, которая печатает сама себя? В этом случае стандартный фокус состоит в том, чтобы проделать примерно следующее (вы можете самостоятельно перевести это на свой любимый язык программирования):

Напечатать следующее дважды, второй раз в кавычках.

"Напечатать следующее дважды, второй раз в кавычках."

В общем, если вы хотите, чтобы программа имела доступ к собственному исходному коду, фокус в том, чтобы разделить программу на три части: (1) часть, которая на самом деле делает что-то полезное (она не обязательна); (2) «копировщик»; и (3) строка, которая будет копироваться. Строка, которую копируют, должна состоять из полного кода программы, включая копировщик. (Иными словами, она должна состоять из частей (1) и (2).) Тогда, прогнав копировщик дважды, мы получим свеженькую копию частей (1), (2) и (3).

Эту идею придумал фон Нейман в самом начале 1950-х. Вскоре после этого два человека (мне кажется, их звали Крик и Уотсон) нашли физическую систему, которая на самом деле следует этим правилам. Мы с вами, вместе со всеми живыми существами Земли, по существу, представляем собой живые компьютерные программы такого содержания:

Сделать ребенка, который действует по нижеследующей инструкции, а также содержит копию этой инструкции в своих репродуктивных органах.

"Сделать ребенка, который действует по нижеследующей инструкции, а также содержит копию этой инструкции в своих репродуктивных органах."

Предыдущая главаГлава 22 из 78Следующая глава