|
[May. 12th, 2013|07:54 pm] |
Мысли о всеобщей рекурсии и о проблеме епископа Беркли
Беркли думал, как бы понять, что это - реальность или направленное воздействие на органы чувств? Ну как у Лема было в классическом рассказе:
" - Представьте себе, Тихий, что я воздействую на ваш обонятельный нерв точно так же, как душистая гвоздика? Что вы будете чувствовать?
- Запах гвоздики, разумеется, - ответил я"
Тьюринг придумал Универсальную машину Тьюринга, которая потому и универсальная, что на ней, загрузив туда подходящий код, можно сэмулировать любую другую универсальную машину Тьюринга. *
И это позволило поставить аналогичный Берклиевскому вопрос - как выяснить, этот код исполняется на реальной машине или на виртуальной, которая эмулирует реальную? **
Если эти вопросы действительно являются частными формулировками одного и того же вопроса, то как бы это не оказался основной вопрос эпистемологии. Я даже почти не шучу.
===
* Джозеф Вейценбаум (автор программы "Элиза") в своей книжке "Возможности вычислительных машин и человеческий разум", на которую давал ссылку kouzdra, на этой постоянно возникающей рекурсивности неоднократно делал акцент. Чтобы предельно кратко пояснить, о чем он там толковал, я упрощенно перескажу эту его мысль, насколько сам ее понял:
Предельно упростим компьютер (он же универсальная машина) - будем считать, что в нем есть только процессор и память, в памяти код, процессор исполняет код из памяти, может писать в память. Память концептуально одинакова для всех машин, а вот процессоры разные. Разница в том, что у них разный набор кодовых слов машинного кода, то есть одна и та же последовательность байтов, записанная в память, будет для одного процессора валидным кодом, а для другого - кучей мусора. Тьюринг показал, что на одной универсальной машине (так сказать, с одним типом процессора) можно сэмулировать поведение любой другой универсальной машины (практически, превратить одну универсальную машину в другую универсальную машину путем загрузки в первую машину нужного программного кода). Это сейчас кажется очевидным, когда я могу запустить на компьютере с процессором Core 2 эмулятор ZX Spectrum (на котором был процессор Z80), вгрузить в этот эмулятор код старой игры (который такой же байт в байт, как тот код, который я в детстве загружал с кассетного магнитофона в память настоящего ZX Spectrum) и поиграть в эту игру. В LODE RUNNER, допустим, кто помнит. На чем сейчас исполняется ее код? На Z80 ? - да, конечно, ведь это код, который понимает только Z80. На Core 2 ? Да, безусловно, ведь именно Core 2, придавленный массивным радиатором, стоит в моем старом добром системном блоке. Так на чем исполняется код старой игры - на Z80 или на Core 2 ? Сейчас на этот вопрос отвечают как "на эмуляторе Z80, исполняемым на Core2". Вейценбаум сказал бы "эмулятор Z80 для Core2 - это такая программа (такой код), который, будучи запущенным на Core2, как-бы "превращает" его в Z80. Так одна универсальная машина (железный Core2) преобразовывается в другую универсальную машину (виртуальный Z80), и именно потому, что их можно преобразовать одну в другую без потери их универсальности, они и называются универсальными".
Это рассуждение применимо и к языкам программирования, большинство из которых - Тьюринг-полные, в том смысле, что на любом Тьюринг-полном языке программирования можно реализовать любой другой Тьюринг-полный язык программирования (а также и не Тьюринг-полный, но это "менее сильное утверждение", и не так интересно). Это тот же самый концепт, но находящийся на другом уровне абстракции (вроде бы, повыше).
** Имеются, конечно способы и хаки, они не всегда работают, но там обычно когда на железке есть глюк (недокументированное поведение), которое в эмуляторе не предусмотрено - так это значит недоделанный эмулятор. А если эмулятор идеальный, без недостатков - то тоже никак (как и в случае Беркли). Еще есть достаточно общая закономерность - чем виртуальнее, тем медленнее, но изнутри, из кода эту медленность увидеть нельзя - оттуда можно видеть только тики процессора, но их скорость - на быстром процессоре мы исполняемся или на медленном - из кода не будет видно никогда напрямую, а только косвенно. Но зато снаружи видно замечательно. |
|
|