Можем ли мы считать без потери общности что компьютерная программа имеет доступ к собственному тексту? В качестве простого примера зададимся вопросом: существует ли программа, которая на выходе распечатывает сама себя?
Ответ: да, такие программы существуют. Более того, проходят даже конкурсы на то, кто напишет самую короткую самораспечатывающуюся программу. На международном конкурсе IOCCC (International Obfuscated C Code Contest)[28] несколько лет назад победила необычайно короткая программа. Догадайтесь, сколько в ней было символов: 30? 10? 5?
В победившей программе был ровно нуль знаков. (Подумайте об этом!) Правда, пустой файл нельзя все же назвать по-настоящему кошерной программой на языке C, но, судя по всему, некоторые компиляторы готовы скомпилировать его в программу, которая не будет ничего делать.
Хорошо, хорошо, но что если мы хотим получить нетривиальную программу, которая печатает сама себя? В этом случае стандартный фокус состоит в том, чтобы проделать примерно следующее (вы можете самостоятельно перевести это на свой любимый язык программирования):
Напечатать следующее дважды, второй раз в кавычках.
"Напечатать следующее дважды, второй раз в кавычках."
В общем, если вы хотите, чтобы программа имела доступ к собственному исходному коду, фокус в том, чтобы разделить программу на три части: (1) часть, которая на самом деле делает что-то полезное (она не обязательна); (2) «копировщик»; и (3) строка, которая будет копироваться. Строка, которую копируют, должна состоять из полного кода программы, включая копировщик. (Иными словами, она должна состоять из частей (1) и (2).) Тогда, прогнав копировщик дважды, мы получим свеженькую копию частей (1), (2) и (3).
Эту идею придумал фон Нейман в самом начале 1950-х. Вскоре после этого два человека (мне кажется, их звали Крик и Уотсон) нашли физическую систему, которая на самом деле следует этим правилам. Мы с вами, вместе со всеми живыми существами Земли, по существу, представляем собой живые компьютерные программы такого содержания:
Сделать ребенка, который действует по нижеследующей инструкции, а также содержит копию этой инструкции в своих репродуктивных органах.
"Сделать ребенка, который действует по нижеследующей инструкции, а также содержит копию этой инструкции в своих репродуктивных органах."