В этой статье есть несколько проблем. Помогите улучшить ее или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти сообщения )
|
В информатике машина с произвольным доступом ( RAM или RA-машина ) — это модель вычислений , которая описывает абстрактную машину в общем классе регистровых машин . RA-машина очень похожа на счетчиковую машину , но с дополнительной возможностью «косвенной адресации» ее регистров. «Регистры» интуитивно эквивалентны основной памяти обычного компьютера, за исключением дополнительной способности регистров хранить натуральные числа любого размера. Как и счетчиковая машина, RA-машина содержит инструкции выполнения в конечно-частной части машины (так называемая Гарвардская архитектура ).
Эквивалент универсальной машины Тьюринга в RA-машине – с ее программой в регистрах, а также ее данными – называется машиной с произвольным доступом и хранимой программой или RASP-машиной. Это пример так называемой архитектуры фон Неймана , наиболее близкий к общепринятому представлению о компьютере .
Вместе с моделями машины Тьюринга и контрмашины , модели RA-машины и RASP-машины используются для анализа сложности вычислений . Ван Эмде Боас (1990) называет эти три модели вместе с указателем моделями «последовательной машины», чтобы отличать их от моделей « параллельной машины с произвольным доступом ».
Машина RA состоит из следующих частей:
Описание похожей концепции, но с юмором, см. в эзотерическом языке программирования Brainfuck . [1]
Концепция машины с произвольным доступом (RAM) начинается с самой простой модели из всех, так называемой модели машины-счетчика . Однако два дополнения отдаляют ее от машины-счетчика. Первое дополняет машину удобством косвенной адресации; второе перемещает модель в сторону более традиционного компьютера на основе аккумулятора с добавлением одного или нескольких вспомогательных (выделенных) регистров, наиболее распространенный из которых называется «аккумулятор».
Машина с произвольным доступом (RAM) — это абстрактная модель вычислительной машины, идентичная многорегистровой машине- счетчику с добавлением косвенной адресации. По усмотрению инструкции из ТАБЛИЦЫ своего конечного автомата машина выводит адрес «целевого» регистра либо (i) непосредственно из самой инструкции, либо (ii) косвенно из содержимого ( например, номера, метки) регистра «указателя», указанного в инструкции.
По определению: Регистр — это местоположение с адресом (уникальное, различимое обозначение/локатор, эквивалентное натуральному числу) и содержимым — одним натуральным числом. Для точности мы будем использовать квазиформальную символику из Boolos-Burgess-Jeffrey (2002) для указания регистра, его содержимого и операции над регистром:
Определение: Прямая инструкция — это инструкция, которая указывает в самой инструкции адрес исходного или целевого регистра, содержимое которого будет предметом инструкции. Определение: Косвенная инструкция — это инструкция, которая указывает «регистр указателя», содержимое которого является адресом «целевого» регистра. Целевой регистр может быть как источником, так и местом назначения (различные инструкции COPY дают примеры этого). Регистр может адресовать себя косвенно.
Определение: Содержимое исходного регистра используется инструкцией. Адрес исходного регистра может быть указан либо (i) непосредственно инструкцией, либо (ii) косвенно регистром указателя, указанным инструкцией.
Определение: Содержимое регистра указателя является адресом «целевого» регистра.
Определение: Содержимое регистра указателя указывает на целевой регистр – «целью» может быть как исходный, так и целевой регистр.
Определение: Регистр назначения — это место, куда инструкция помещает свой результат. Адрес исходного регистра может быть указан либо (i) непосредственно инструкцией, либо (ii) косвенно регистром указателя, указанным инструкцией. Исходный и целевой регистры могут быть одним.
Регистровая машина имеет, для памяти, внешней по отношению к ее конечному автомату – неограниченный (ср. сноска|счетные и неограниченные) набор дискретных и уникально помеченных ячеек с неограниченной емкостью, называемых «регистрами». Эти регистры содержат только натуральные числа (ноль и положительные целые числа). Согласно списку последовательных инструкций в ТАБЛИЦЕ конечного автомата, несколько (например, 2) типов примитивных операций работают с содержимым этих «регистров». Наконец, условное выражение в форме IF-THEN-ELSE доступно для проверки содержимого одного или двух регистров и «ветвления/перехода» конечного автомата из последовательности инструкций по умолчанию.
Базовая модель 1 : Модель, наиболее близкая к визуализации Минского (1961) и Ламбека (1961):
Инструкция | Мнемонический | Действие над регистром(ами) "r" | Действие на регистре инструкций конечного автомата, IR |
---|---|---|---|
Прирост | INC ( р ) | [р] + 1 → р | [ИК] + 1 → ИК |
Уменьшение | ДЕК (р) | [р] - 1 → р | [ИК] + 1 → ИК |
Перейти, если ноль | JZ (р, з) | никто | ЕСЛИ [r] = 0 ТО z → IR ИНАЧЕ [IR] + 1 → IR |
Остановить | ЧАС | никто | [ИК] → ИК |
Базовая модель 2 : Модель «преемника» (названная в честь функции преемника аксиом Пеано ):
Инструкция | Мнемонический | Действие над регистром(ами) "r" | Действие на регистре инструкций конечного автомата, IR |
---|---|---|---|
Прозрачный | КЛР (р) | 0 → р | [ИК] + 1 → ИК |
Прирост | INC ( р ) | [р] + 1 → р | [ИК] + 1 → ИК |
Перейти, если равно | JE (r1, r2, z) | никто | ЕСЛИ [r1] = [r2] ТО z → IR ИНАЧЕ [IR] + 1 → IR |
Остановить | ЧАС | никто | [ИК] → ИК |
Базовая модель 3 : использовалась Элготом-Робинсоном (1964) в его исследовании ограниченных и неограниченных RASP – «последующая» модель с COPY вместо CLEAR:
Инструкция | Мнемонический | Действие над регистром(ами) "r" | Действие на регистре инструкций конечного автомата, IR |
---|---|---|---|
КОПИЯ | КОПИРОВАТЬ (r1, r2) | [р1] → р2 | [ИК] + 1 → ИК |
Прирост | INC ( р ) | [р] + 1 → р | [ИК] + 1 → ИК |
Перейти, если равно | JE (r1, r2, z) | никто | ЕСЛИ [r1] = [r2] ТО z → IR ИНАЧЕ [IR] + 1 → IR |
Остановить | ЧАС | никто | [ИК] → ИК |
Три базовых набора 1, 2 или 3, приведенные выше, эквивалентны в том смысле, что можно создать инструкции одного набора, используя инструкции другого набора (интересное упражнение: подсказка от Мински (1967) – объявить зарезервированный регистр, например, назвав его «0» (или Z для «нуля» или E для «стирания»), чтобы он содержал число 0). Выбор модели будет зависеть от того, какую модель автор посчитает проще всего использовать в демонстрации, доказательстве и т. д.
Более того, из базовых наборов 1, 2 или 3 мы можем создать любую из примитивных рекурсивных функций (см. Minsky (1967), Boolos-Burgess-Jeffrey (2002)). (Как расширить сеть, чтобы охватить полные и частичные мю-рекурсивные функции, будет обсуждаться в контексте косвенной адресации). Однако построение примитивных рекурсивных функций затруднено, поскольку наборы инструкций настолько ... примитивны (крошечные). Одним из решений является расширение определенного набора с помощью «удобных инструкций» из другого набора:
Опять же, все это сделано только для удобства; ничто из этого не увеличивает внутреннюю мощность модели.
Например: наиболее расширенный набор будет включать каждую уникальную инструкцию из трех наборов, а также безусловный переход J (z), т.е.:
Большинство авторов выбирают один или другой из условных переходов, например, Шепердсон-Стерджис (1963) использует указанный выше набор за вычетом JE (чтобы быть абсолютно точным, они используют JNZ – Jump if Not Zero вместо JZ; еще одна возможная инструкция для удобства).
В нашей повседневной жизни понятие «непрямая операция» не является чем-то необычным.
Косвенно указывается местоположение, идентифицированное как пиратский сундук в «Пещере_Тома_и_Бекки...», которое действует как указатель на любое другое местоположение (включая само себя): его содержимое (карта сокровищ) предоставляет «адрес» целевого местоположения «под_крыльцом_Тэтчер», где происходят реальные действия.
В дальнейшем следует помнить, что эти модели являются абстрактными моделями с двумя фундаментальными отличиями от чего-либо физически реального: неограниченное количество регистров, каждый с неограниченной емкостью. Проблема проявляется наиболее драматично, когда кто-то пытается использовать модель контрмашины для построения RASP, эквивалентного Тьюрингу , и, таким образом, вычислить любую частичную мю-рекурсивную функцию :
Так как же нам обратиться к регистру за пределами конечного автомата? Одним из подходов было бы изменение программных инструкций (те, что хранятся в регистрах) так, чтобы они содержали более одной команды. Но это тоже может быть исчерпано, если только инструкция не имеет (потенциально) неограниченного размера. Так почему бы не использовать всего одну «убер-инструкцию» — одно действительно очень большое число — которое содержит все программные инструкции, закодированные в нем! Вот как Мински решает проблему, но нумерация Геделя, которую он использует, представляет собой большое неудобство для модели, и результат совсем не похож на наше интуитивное представление о «компьютере с хранимой программой».
Элгот и Робинсон (1964) приходят к аналогичному выводу относительно RASP, который является «конечно определенным». Действительно, он может получить доступ к неограниченному числу регистров (например, для извлечения из них инструкций), но только если RASP допускает «самомодифицирование» своих программных инструкций и закодировал свои «данные» в числе Гёделя (рис. 2, стр. 396).
В контексте более компьютерной модели, использующей его инструкцию RPT (повторить), Минский (1967) дразнит нас решением проблемы (ср. стр. 214, стр. 259), но не предлагает твердого решения. Он утверждает:
Он предлагает нам ограниченный RPT, который вместе с CLR (r) и INC (r) может вычислить любую примитивную рекурсивную функцию , и он предлагает неограниченный RPT, процитированный выше, который играет роль оператора μ; он вместе с CLR (r) и INC (r) может вычислить рекурсивные функции mu. Но он не обсуждает «косвенность» или модель RAM как таковую.
Из ссылок в Hartmanis (1971) следует, что Кук (в своих лекционных заметках во время учебы в Калифорнийском университете в Беркли, 1970) закрепил понятие косвенной адресации. Это становится более ясно в статье Кука и Рекхова (1973) — Кук является руководителем магистерской диссертации Рекхова. Модель Хартманиса — весьма похожая на модель Мелзака (1961) — использует двух- и трехрегистровые сложения и вычитания и два копирования параметров; модель Кука и Рекхова сокращает количество параметров (регистров, вызываемых в инструкциях программы) до одного вызова с помощью аккумулятора «AC».
Решение в двух словах: Разработайте нашу машину/модель с неограниченной косвенной адресацией – предоставьте неограниченный «адресный» регистр, который может потенциально называть (вызывать) любой регистр независимо от того, сколько их. Чтобы это работало, в общем случае неограниченный регистр должен иметь возможность очищаться, а затем увеличиваться (и, возможно, уменьшаться) потенциально бесконечным циклом. В этом смысле решение представляет собой неограниченный оператор μ , который может, при необходимости, охотиться до бесконечности по неограниченной строке регистров, пока не найдет то, что ищет. Регистр указателя точно такой же, как и любой другой регистр, за одним исключением: в обстоятельствах, называемых «косвенной адресацией», он предоставляет свое содержимое, а не адрес-операнд в ТАБЛИЦЕ конечного автомата, в качестве адреса целевого регистра (включая, возможно, себя самого!).
Если мы откажемся от подхода Мински, предполагающего наличие одного числа-монстра в одном регистре, и укажем, что наша модель машины будет «как компьютер», нам придется столкнуться с этой проблемой косвенности, если мы хотим вычислить рекурсивные функции (также называемые μ-рекурсивными функциями ) – как полные, так и частичные разновидности.
Наша более простая модель контрмашины может выполнять «ограниченную» форму косвенности — и тем самым вычислять подкласс примитивных рекурсивных функций — используя примитивный рекурсивный «оператор», называемый «определением по случаям» (определен в Kleene (1952) стр. 229 и Boolos-Burgess-Jeffrey стр. 74). Такая «ограниченная косвенная адресация» — это трудоемкое, утомительное дело. «Определение по случаям» требует, чтобы машина определяла/различала содержимое регистра указателя, пытаясь раз за разом до успеха сопоставить это содержимое с числом/именем, которое оператор case явно объявляет. Таким образом, определение по случаям начинается, например, с нижнего граничного адреса и продолжается до тошноты в направлении верхнего граничного адреса, пытаясь выполнить сопоставление:
«Ограниченная» косвенная адресация не позволит нам вычислить частично рекурсивные функции — для них нам нужна неограниченная косвенная адресация, также известная как оператор μ .
Чтобы быть эквивалентной по Тьюрингу, счетчиковая машина должна либо использовать неудачный метод чисел Мински-Геделя с одним регистром , либо быть дополнена способностью исследовать концы своей регистровой строки, до бесконечности, если это необходимо. (Неспособность найти что-то «там» определяет, что означает для алгоритма неспособность завершиться; см. Kleene (1952) стр. 316 и далее, Глава XII Частично рекурсивные функции , в частности стр. 323-325.) Подробнее об этом см. в примере ниже.
Для неограниченной косвенности нам требуется «аппаратное» изменение в нашей модели машины. Как только мы сделаем это изменение, модель перестанет быть машиной-счетчиком, а станет машиной с произвольным доступом.
Теперь, когда указано, например, INC, инструкция конечного автомата должна будет указать, откуда будет получен адрес интересующего регистра. Это может быть либо (i) инструкция конечного автомата, которая предоставляет явную метку , либо (ii) регистр указателя , содержимое которого является интересующим адресом. Всякий раз, когда инструкция указывает адрес регистра, теперь ей также нужно будет указать дополнительный параметр «i/d» – «косвенный/прямой». В некотором смысле этот новый параметр «i/d» является «переключателем», который переключает один способ получения прямого адреса, как указано в инструкции, или другой способ получения косвенного адреса из регистра указателя (какой регистр указателя – в некоторых моделях каждый регистр может быть регистром указателя – указывается инструкцией). Этот «взаимоисключающий, но исчерпывающий выбор» является еще одним примером «определения по случаям», а арифметический эквивалент, показанный в примере ниже, выведен из определения в Kleene (1952) стр. 229.
Вероятно, наиболее полезной из добавленных инструкций является COPY. Действительно, Элгот-Робинсон (1964) снабжает свои модели P 0 и P' 0 инструкциями COPY, а Кук-Рекхоу (1973) снабжает свою модель на основе аккумулятора только двумя косвенными инструкциями – COPY в аккумулятор косвенно, COPY из аккумулятора косвенно.
Множество инструкций : поскольку любая инструкция, действующая на один регистр, может быть дополнена ее косвенным «дуалом» (включая условные и безусловные переходы, см. модель Элгота-Робинсона), включение косвенных инструкций удвоит количество инструкций с одним параметром/регистром (например, INC (d, r), INC (i, r)). Хуже того, каждая инструкция с двумя параметрами/регистром будет иметь 4 возможных варианта, например:
Аналогичным образом каждая трехрегистровая инструкция, включающая два исходных регистра r s1 r s2 и целевой регистр r d, приведет к 8 разновидностям, например, сложению:
даст:
Если мы назначим один регистр в качестве «аккумулятора» (см. ниже) и наложим строгие ограничения на различные разрешенные инструкции, то мы можем значительно сократить множество прямых и косвенных операций. Однако нужно быть уверенным, что полученный сокращенный набор инструкций достаточен, и мы должны осознавать, что сокращение будет происходить за счет большего количества инструкций на «значимую» операцию.
Исторически сложилось так, что аккумулятору, «арифметическому органу», буквально накапливающему свое число в ходе последовательности арифметических операций, отводится отдельный регистр:
Однако аккумулятор появляется за счет большего количества инструкций на арифметическую «операцию», в частности, в отношении так называемых инструкций «чтение-модификация-запись», таких как «косвенное увеличение содержимого регистра, на который указывает регистр r2». «A» обозначает регистр «аккумулятора» A:
Этикетка | Инструкция | А | р2 | р378,426 | Описание | |
---|---|---|---|---|---|---|
. . . | 378,426 | 17 | ||||
INCi (r2): | CPY (я, р2, д, А) | 17 | 378,426 | 17 | Содержимое r2 указывает на r378,426 с содержимым "17": скопируйте это в A | |
ИНК (А) | 18 | 378,426 | 17 | Увеличение содержания А | ||
CPY ( д, А, я, р2 ) | 18 | 378,426 | 18 | Содержимое r2 указывает на r378,426: скопировать содержимое A в r378,426 |
Если мы придерживаемся определенного имени для аккумулятора, например, «A», мы можем подразумевать аккумулятор в инструкциях, например,
Однако когда мы пишем инструкции CPY без вызова аккумулятора, инструкции становятся неоднозначными или должны иметь пустые параметры:
Исторически сложилось так, что эти две инструкции CPY получили различные названия; однако, никакого соглашения не существует. Традиция (например, воображаемый компьютер MIX Кнута (1973) ) использует два названия: LOAD и STORE. Здесь мы добавляем параметр "i/d":
Типичная модель на основе аккумулятора будет иметь все свои арифметические и константные операции с двумя переменными (например, ADD (A, r), SUB (A, r)) использующие (i) содержимое аккумулятора вместе с (ii) содержимым указанного регистра. Операции с одной переменной (например, INC (A), DEC (A) и CLR (A)) требуют только аккумулятор. Оба типа инструкций помещают результат (например, сумму, разность, произведение, частное или остаток) в аккумулятор.
Если мы того пожелаем, мы можем сократить мнемонику, поскольку по крайней мере один исходный регистр, а регистр назначения всегда является аккумулятором A. Таким образом, мы имеем:
Если в нашей модели есть неограниченный аккумулятор, можем ли мы связать все остальные регистры? Нет, пока мы не предоставим хотя бы один неограниченный регистр, из которого мы получим наши косвенные адреса.
Минималистский подход заключается в использовании самого себя (так делает Schönhage).
Другой подход (Шёнхаге делает это тоже) заключается в объявлении определенного регистра «косвенным адресным регистром» и ограничении косвенности относительно этого регистра (модель RAM0 Шёнхаге использует как регистры A, так и N для косвенных, а также прямых инструкций). И снова наш новый регистр не имеет общепринятого имени – возможно, «N» от «iNdex», или «iNdirect» или «address Number».
Для максимальной гибкости, как мы это сделали для аккумулятора A, мы будем считать N просто еще одним регистром, подлежащим увеличению, уменьшению, очистке, тестированию, прямому копированию и т. д. Опять же, мы можем сократить инструкцию до одного параметра, который обеспечивает, например, направление и косвенность.
Почему это такой интересный подход? По крайней мере, по двум причинам:
(1) Набор инструкций без параметров:
Шёнхаге делает это для создания своего набора инструкций RAM0. См. раздел ниже.
(2) Уменьшить ОЗУ до машины Пост-Тьюринга:
Выдавая себя за минималистов, мы сокращаем все регистры, за исключением аккумулятора A и регистра косвенности N, например r = { r0, r1, r2, ... }, до неограниченной строки ячеек (очень) ограниченной емкости. Они не будут делать ничего, кроме как хранить (очень) ограниченные числа, например, один бит со значением { 0, 1 }. Аналогично мы сокращаем аккумулятор до одного бита. Мы ограничиваем любую арифметику регистрами { A, N }, используем косвенные операции для извлечения содержимого регистров в аккумулятор и записываем 0 или 1 из аккумулятора в регистр:
Мы идем дальше и полностью устраняем A, используя два «константных» регистра, называемых «ERASE» и «PRINT»: [ERASE]=0, [PRINT]=1.
Переименуем инструкции COPY и назовем INC (N) = RIGHT, DEC (N) = LEFT, и у нас будут те же инструкции, что и у машины Пост-Тьюринга, плюс дополнительная CLRN:
В разделе выше мы неформально показали, что RAM с неограниченной возможностью косвенной адресации создает машину Пост-Тьюринга . Машина Пост-Тьюринга эквивалентна машине Тьюринга, поэтому мы показали, что RAM с косвенной адресацией эквивалентна машине Тьюринга.
Мы приводим здесь немного более формальную демонстрацию. Начнем с проектирования нашей модели с тремя зарезервированными регистрами "E", "P" и "N", а также неограниченным набором регистров 1, 2, ..., n справа. Регистры 1, 2, ..., n будут считаться "квадратами ленты". Регистр "N" указывает на "сканируемый квадрат", который в данный момент наблюдает "головка". "Головку" можно рассматривать как находящуюся в условном переходе - обратите внимание, что она использует косвенную адресацию (ср. Elgot-Robinson, стр. 398). Когда мы уменьшаем или увеличиваем "N", (кажущаяся) головка будет "двигаться влево" или "вправо" вдоль квадратов. Мы переместим содержимое "E"=0 или "P"=1 в "сканируемый квадрат", на который указывает N, используя косвенный CPY.
Тот факт, что наша лента имеет левый конец, создает для нас небольшую проблему: всякий раз, когда появляется LEFT, наши инструкции должны будут проверить, равно ли содержимое «N» нулю; если это так, мы должны оставить его счетчик равным «0» (это наш выбор как проектировщиков — например, мы можем заставить машину/модель «вызвать событие» по нашему выбору).
Следующая таблица определяет инструкции Post-Turing в терминах их эквивалентных инструкций RAM и дает пример их функционирования. (Видимое) расположение головки вдоль ленты регистров r0-r5 . . . показано затененным:
Мнемонический | этикетка: | Э | П | Н | р0 | р1 | р2 | р3 | р4 | р5 | и т. д. | Действия по регистрам | Действие на конечном автомате Регистр инструкций IR | |||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
начинать: | 0 | 1 | 3 | 1 | 0 | |||||||||||
Р | верно: | ВКЛ (Н) | 0 | 1 | 4 | 1 | 0 | [Н] +1 → Н | [ИК] +1 → ИК | |||||||
П | печать: | CPY ( д, П, и, Н ) | 0 | 1 | 4 | 1 | 1 | [П]=1 → [Н]=r4 | [ИК] +1 → ИК | |||||||
Э | стереть: | CPY ( д, Э, и, Н ) | 0 | 1 | 4 | 1 | 0 | [Э]=0 → [Н]=r4 | [ИК] +1 → ИК | |||||||
Л | левый: | JZ (i, N, конец) | 0 | 1 | 4 | 1 | 0 | никто | ЕСЛИ N =r4] =0 ТО "конец" → IR иначе [IR]+1 → IR | |||||||
ДЕК (Н) | 0 | 1 | 3 | 1 | 0 | [Н] -1 → Н | ||||||||||
J0 (остановиться) | прыжок_если_пустой: | JZ (i, N, конец) | 0 | 1 | 3 | 1 | 0 | никто | ЕСЛИ N =r3] =0 ТО "конец" → IR иначе [IR]+1 → IR | |||||||
J1 (остановиться) | jump_if_mark: | JZ (i, N, остановись) | 0 | 1 | 3 | 1 | 0 | Н =r3] → А | ЕСЛИ N =r3] =0 ТО "конец" → IR иначе [IR]+1 → IR | |||||||
конец | . . . и т. д. | 0 | 1 | 3 | 1 | 0 | ||||||||||
остановка: | ЧАС | 0 | 1 | 3 | 1 | 0 | никто | [ИК] +1 → ИК |
На протяжении всей этой демонстрации мы должны помнить, что инструкции в таблице конечного автомата ограничены , т.е. конечны :
Мы построим косвенный CPY (i, q, d, φ) с помощью оператора CASE. Адрес целевого регистра будет указан содержимым регистра "q"; как только оператор CASE определит, что это за число, CPY напрямую поместит содержимое регистра с этим числом в регистр "φ". Нам понадобится дополнительный регистр, который мы назовем "y" — он служит в качестве счетчика вверх.
"Оператор" CASE описан в работах Kleene (1952) (стр. 229) и Boolos-Burgess-Jeffrey (2002) (стр. 74); последние авторы подчеркивают его полезность. Следующее определение дано по Клини, но изменено, чтобы отразить знакомую конструкцию "IF-THEN-ELSE".
Оператор CASE «возвращает» натуральное число в φ в зависимости от того, какой «case» выполняется, начиная с «case_0» и последовательно проходя через «case_last»; если ни один случай не выполняется, то число, называемое «default» (также известное как «woops»), возвращается в φ (здесь x обозначает некоторый набор параметров, например, регистр q и строку r0, ... rlast )):
Определение по случаям φ( x , y):
Клини требует, чтобы все «предикаты» Q n , которые выполняют тестирование, были взаимоисключающими – «предикаты» – это функции, которые выдают только { true, false } на выходе; Булос-Берджесс-Джеффри добавляют требование, чтобы случаи были «исчерпывающими».
Мы начинаем с числа в регистре q, которое представляет адрес целевого регистра. Но что это за число? «Предикаты» будут проверять его, чтобы узнать, одно испытание за другим: JE (q, y, z), за которым следует INC (y). Как только число определено явно, оператор CASE напрямую/явно копирует содержимое этого регистра в φ:
Case_0 (базовый шаг рекурсии по y) выглядит так:
Case_n (шаг индукции) выглядит следующим образом; помните, что каждое вхождение «n», «n+1», ..., «last» должно быть явным натуральным числом:
Case_last останавливает индукцию и ограничивает оператор CASE (и тем самым ограничивает оператор «косвенного копирования»):
Если бы CASE мог продолжаться до бесконечности, это был бы оператор mu . Но он не может – «регистр состояний» его конечного автомата достиг своего максимального значения (например, 65365 = 11111111,11111111 2 ) или в его таблице закончились инструкции; в конце концов, это конечный автомат.
Распространенная модель Кука и Речкова немного похожа на модель Малцека с троичным регистром (написанную с использованием мнемоники Кнута — в исходных инструкциях не было мнемоники, за исключением TRA, Read, Print).
LOAD ( C, rd ) ; C → rd
, C — любое целое числоLOAD ( 0, 5 )
очистит регистр 5. ADD ( rs1, rs2, rd ) ; [rs1] + [rs2] → rd
регистры могут быть одинаковыми или разными;ADD ( A, A, A )
удвоит содержимое регистра A. SUB ( rs1, rs2, rd ) ; [rs1] - [rs2] → rd
регистры могут быть одинаковыми или разными:SUB ( 3, 3, 3 )
очистит регистр 3. COPY ( i, rp, d, rd ) ; [[rp] ] → rd
, Косвенно копирует содержимое исходного регистра, на который указывает регистр-указатель r p, в целевой регистр. COPY ( d, rs, i, rp ) ; [rs] → [rp]
. Скопировать содержимое исходного регистра r s в целевой регистр, на который указывает регистр-указатель r p . JNZ ( r, Iz ) ;
Условный переход, если [r] положительно; т.е. ЕСЛИ [r] > 0 ТО перейти к инструкции z, иначе продолжить последовательность (Кук и Рекхоу называют это: «Передать управление строке m, если Xj > 0») READ ( rd ) ;
копировать «вход» в регистр назначения r d PRINT ( rs ) ;
скопировать содержимое исходного регистра r s на «выход».Шёнхаге (1980) описывает очень примитивную, атомизированную модель, выбранную им для доказательства эквивалентности его модели указателя SMM :
Модель RAM1 : Шёнхаге демонстрирует, как его конструкция может быть использована для формирования более общей и удобной формы RAM типа «преемника» (используя мнемонику этой статьи):
LDA k ; k --> A
, k — константа, явное число, например «47» LDA ( d, r ) ; [r] → A ;
прямая загрузка А LDA ( i, r ) ; [[r]] → A ;
косвенно нагружать А STA ( d, r ) ; [A] → r ;
напрямую хранить A STA ( i, r ) ; [A] → [r] ;
косвенно хранить A JEA ( r, z ) ; IF [A] = [r] then Iz else continue
INCA ; [A] + 1 --> A
Модель RAM0 : машина RAM0 Шёнхаге имеет 6 инструкций, обозначенных одной буквой (шестая «C xxx», по-видимому, подразумевает «пропустить следующий параметр»). Шёнхаге обозначил аккумулятор буквой «z», «N» — «n» и т. д. Вместо мнемоники Шёнхаге мы будем использовать мнемонику, разработанную выше.
(Z), CLRA: 0 → A
(A), INCA: [A] +1 → A
(N), CPYAN: [A] → N
(A), LDAA: [[A]] → A
; содержимое A указывает на адрес регистра; поместить содержимое регистра в A(S), STAN: [A] → [N]
; содержимое N указывает на адрес регистра; поместить содержимое A в регистр, на который указывает N(C), JAZ ( z ): [A] = 0 then go to Iz
; неоднозначный в своем обращенииКосвенность происходит (i) от CPYAN (копирование/передача содержимого A в N), работающего с store_A_via_N STAN, и от (ii) особой инструкции косвенности LDAA ( [[A]] → [A] )
.
Факт определения, что любая машина счетчика без неограниченного регистра-"адресного" регистра должна указывать регистр "r" по имени, указывает на то, что модель требует, чтобы "r" было конечным , хотя оно "неограниченно" в том смысле, что модель не подразумевает верхнего предела для количества регистров, необходимых для выполнения ее работы(работ). Например, мы не требуем r < 83 617 563 821 029 283 746, ни r < 2^1 000 001 и т. д.
Мы можем обойти это ограничение, предоставив неограниченный регистр для указания адреса регистра, который указывает косвенный адрес.
За некоторыми исключениями, эти ссылки совпадают со ссылками на Register machine .