Я согласен с Ларсманом и считаю, что аргумент можно уточнить. Во-первых, я должен согласиться с тем, что «нахождение всего кода в заданном двоичном файле» означает в этом контексте наличие единственной вычислимой функции, которая определяет, какие байты во входном двоичном файле соответствуют выполняемым инструкциям.
РЕДАКТИРОВАТЬ: если кто-то не понимает, почему здесь проблема, подумайте о запутанном машинном коде. Дизассемблирование такого кода - нетривиальная задача. Если вы начнете разборку в середине многобайтовой инструкции, вы получите неправильную разборку. Это нарушает не только данную инструкцию, но, как правило, несколько других инструкций. и т. д. посмотрите в это. (например, погуглите "обфускация и разборка").
Набросок стратегии, чтобы сделать это точным:
Во-первых, определите теоретическую модель компьютера / машины, в которой программа закодирована в многобитовых двоичных инструкциях, очень похожих на машинный код на «реальных» компьютерах, но сделана точной (и такой, что она завершена по Тьюрингу). Предположим, что двоичный код кодирует программу и весь ввод. Все это должно быть сделано точно, но предположим, что в языке есть (в двоичном коде) команда остановки, и что программа останавливается тогда и только тогда, когда она выполняет команду остановки.
Во-первых, предположим, что машина не может изменять программный код, но имеет память для работы. (в интересных случаях предполагается бесконечным).
Тогда любой заданный бит будет либо в начале инструкции, которая выполняется во время выполнения программы, либо не будет. (например, он может быть в середине инструкции, или в данных, или в «мусорном коде» - то есть код, который никогда не будет запущен. Обратите внимание, что я не утверждал, что они являются взаимоисключающими, как, например, инструкция перехода может иметь цель, которая находится в середине конкретной инструкции, тем самым создавая другую инструкцию, которая «на первом проходе» не выглядела как выполненная инструкция.).
Определите ins (i, j) как функцию, которая возвращает 1, если двоичный i имеет инструкцию, начинающуюся с битовой позиции j, которая выполняется в прогоне программы, закодированной i. В противном случае определите ins (i, j) равным 0. предположим, что ins (i, j) вычислим.
Пусть halt_candidate (i) будет следующей программой:
for j = 1 to length(i)
if(i(j..j+len('halt')-1) == 'halt')
if(ins(i,j) == 1)
return 1
return 0
Поскольку мы запрещаем самомодифицирующийся код, приведенный выше, единственный способ остановить программу - это выполнить инструкцию «остановки» в некоторой позиции j. По замыслу halt_candidate (i) вычисляет функцию остановки.
Это дает очень грубый набросок одного направления доказательства. т.е. если мы предполагаем, что можем проверить, есть ли в программе i инструкция в позиции j для всех j, то мы можем закодировать функцию остановки.
В другом направлении нужно закодировать эмулятор формальной машины внутри формальной машины. Затем создайте программу плюс входы i и j, которая имитирует программу i, и когда выполняется инструкция с битовой позицией j, она возвращает 1 и останавливается. Когда выполняется любая другая инструкция, она продолжает выполняться, и если симуляция когда-либо имитирует функцию «остановки» в i, эмулятор переходит в бесконечный цикл. Тогда ins (i, j) эквивалентен halt (emulator (i, j)), и поэтому проблема остановки подразумевает проблему поиска кода.
Конечно, нужно предположить, что теоретический компьютер эквивалентен известной неразрешимой проблеме остановки. В противном случае для «настоящего» компьютера проблема остановки разрешима, но неразрешима.
Для системы, допускающей самомодифицирующийся код, аргумент более сложен, но я не ожидаю, что он будет отличаться.
РЕДАКТИРОВАТЬ: Я считаю, что доказательством самомодифицирующегося случая будет реализация эмулятора кода системы плюс самомодифицирующийся в статическом коде плюс система данных выше. Затем остановка с помощью самомодифицирующегося кода, разрешенного для программы i с данными x, такая же, как остановка в системе статический код плюс данные выше с двоичным файлом, содержащим эмулятор, i и x как код плюс данные.
person
fbg00
schedule
22.05.2014