В информатике машина с произвольным доступом (RAM) является абстрактная машина в общем классе регистровых машин. ОЗУ очень похоже на счетчик, но с добавленной возможностью «косвенной адресации» его регистров. Подобно машине счетчика, RAM имеет свои инструкции в конечной части машины (так называемая Гарвардская архитектура ).
Эквивалент в ОЗУ универсальной машины Тьюринга - с его программой в регистрах, а также данными - называется с произвольным доступом с сохранением - программная машина или РАСП. Это пример так называемой архитектуры фон Неймана и наиболее близок к общепринятому понятию компьютер.
вместе с машиной Тьюринга и счетчиком. модели машин, модели RAM и RASP используются для анализа вычислительной сложности. Ван Эмде Боас (Van Emde Boas, 1990) называет эти три модели плюс указательная машина «последовательной машиной», чтобы отличить их от моделей «параллельной машины с произвольным доступом ».
Концепция машины с произвольным доступом (RAM) начинается с простейшей из всех моделей, так называемой модели счетчика. Однако два дополнения отодвигают его от счетчика. Первый расширяет возможности машины с помощью косвенной адресации; второй перемещает модель в сторону более обычного компьютера на основе аккумулятора с добавлением одного или нескольких вспомогательных (выделенных) регистров, наиболее распространенный из которых называется «аккумулятор».
Машина с произвольным доступом (RAM) - это абстрактная модель вычислительной машины, идентичная многорегистровой счетной машине с добавлением косвенной адресации. По усмотрению инструкции из ТАБЛИЦЫ своего конечного автомата машина получает адрес "целевого" регистра либо (i) непосредственно из самой инструкции, либо (ii) косвенно из содержимого (например, номер, метка) регистра «указатель», указанного в инструкции.
По определению: регистр - это место, имеющее как адрес (уникальное, различимое обозначение / указатель, эквивалентное натуральному числу), так и содержимое - одно натуральное число. Для точности мы будем использовать квазиформальный символизм из Boolos-Burgess-Jeffrey (2002), чтобы указать регистр, его содержимое и операцию над регистром:
Определение: Прямая инструкция - это инструкция, которая указывает в самой инструкции адрес регистра источника или назначения, содержимое которого будет предметом инструкции. Определение: косвенная инструкция - это инструкция, которая определяет «регистр указателя», содержимым которого является адрес «целевого» регистра. Целевой регистр может быть либо источником, либо местом назначения (различные инструкции COPY предоставляют примеры этого). Регистр может обращаться к себе косвенно.
Определение: Содержимое исходного регистра равно используется инструкцией. Адрес исходного регистра может быть указан либо (i) непосредственно инструкцией, либо (ii) косвенно регистром указателя, заданным инструкцией.
Определение: Содержимое регистра указателя является адресом "целевого" регистра.
Определение: содержимое регистра указателя указывает на целевой регистр - «цель» может быть либо исходным, либо целевым регистром.
Определение: регистр назначения - это место, куда инструкция помещает свой результат. Адрес исходного регистра может быть указан либо (i) непосредственно инструкцией, либо (ii) косвенно регистром указателя, заданным инструкцией. Регистры источника и назначения могут быть одним
Регистровая машина имеет для памяти, внешней по отношению к ее конечному автомату, - неограниченный (ср: сноска | счетное и неограниченное) набор дискретных и однозначно помеченных ячеек с неограниченной емкостью, называемые «регистрами». Эти регистры содержат только натуральные числа (ноль и положительные целые числа). Согласно списку последовательных инструкций в ТАБЛИЦЕ конечного автомата несколько (например, 2) типов примитивных операций работают с содержимым этих «регистров». Наконец, условное выражение в форме IF-THEN-ELSE доступно для проверки содержимого одного или двух регистров и "перехода / перехода" конечного автомата из последовательности инструкций по умолчанию.
Базовая модель 1 : Модель, наиболее близкая к визуализации Мински (1961) и к Ламбеку (1961):
Инструкция | Мнемоника | Действие в регистре (ах) «r» | Действие в регистре команд конечного автомата, IR |
---|---|---|---|
INCrement | INC (r) | [r] + 1 → r | [IR] + 1 → IR |
DECrement | DEC (r) | [r] - 1 → r | [IR] + 1 → IR |
Перейти, если ноль | JZ (r, z) | нет | IF [r] = 0 ТО z → IR ELSE [IR] + 1 → IR |
Halt | H | none | [IR] → IR |
Базовая модель 2 : Модель "преемника" (названная в честь функции-преемника аксиом Пеано ):
Инструкция | Мнемоника | Действие над регистром (ами) «r» | Действие над конечным автоматом Регистр команд, IR |
---|---|---|---|
CLeaR | CLR (r) | 0 → r | [IR] + 1 → IR |
INCrement | INC (r) | [r] + 1 → r | [IR] + 1 → IR |
Перейти, если равно | JE (r1, r2, z) | нет | IF [r1] = [r2] THEN z → IR ELSE [IR] + 1 → IR |
Halt | H | none | [IR] → IR |
Базовая модель 3 : Используется Элгот-Робинсоном (1964) в их исследовании ограниченных и неограниченных RASP - модель «преемника» с КОПИРОВАНИЕМ вместо CLEAR:
Инструкция | Мнемоника | Действие в регистре (ах) "r" | Действие на конечном автомате Регистр команд, IR |
---|---|---|---|
COPY | COPY (r1, r2) | [r1] → r2 | [IR] + 1 → IR |
Приращение | INC (r) | [r] + 1 → r | [IR] + 1 → IR |
Перейти, если равно | JE ( r1, r2, z) | нет | ЕСЛИ [r1] = [r2] ТО z → IR ELSE [IR] + 1 → IR |
Остановить | H | нет | [IR] → IR |
Три базовых набора 1, 2 или 3, указанные выше, эквивалентны в том смысле, что можно создавать инструкции для одного установить, используя инструкции другого набора (интересное упражнение: подсказка Мински (1967) - объявите зарезервированный регистр, например назовите его "0" (или Z для "нуля" или E для "стирания"), чтобы он содержал число 0). Выбор модели будет зависеть от того, какую модель автору легче всего использовать в демонстрации или доказательстве и т. Д.
Более того, из базовых наборов 1, 2 или 3 мы можем создать любой из примитивные рекурсивные функции (см. Мински (1967), Булос-Берджесс-Джеффри (2002)). (Как расширить сеть для захвата полной и частичной рекурсивных функций mu будет обсуждаться в контексте косвенной адресации). Однако создание примитивных рекурсивных функций сложно, потому что наборы инструкций настолько... примитивны (крошечные). Одно из решений - расширить конкретный набор «удобными инструкциями» из другого набора:
Опять же, все это только для удобства; ничто из этого не увеличивает внутреннюю мощность модели.
Например: наиболее расширенный набор будет включать каждую уникальную инструкцию из трех наборов плюс безусловный переход J (z), например:
Большинство авторов выбирают тот или иной условный переход, например Шепердсон-Стерджис (1963) использует вышеуказанный набор минус JE (для большей точности они используют JNZ - Jump if Not Zero вместо JZ; еще одна возможная инструкция для удобства).
В нашей повседневной жизни понятие «косвенная операция» не является необычным.
Косвенное направление указывает место, идентифицированное как пиратский сундук в «Tom _ _ Becky's_cave...», который действует как указатель на любое другое место (включая себя): его содержимое (карта сокровищ) предоставляет «адрес» целевого места «under_Thatcher's_front_porch», где происходит реальное действие.
Далее следует помнить, что эти модели являются абстрактными моделями, имеющими два фундаментальных отличия от всего физически реального: неограниченное количество регистров, каждый с неограниченной емкостью. Проблема проявляется наиболее резко, когда кто-то пытается использовать модель контрмашины для построения RASP, который эквивалент Тьюринга и, таким образом, вычислить любую частичную рекурсивную функцию mu :
Так как же нам адресовать регистр за пределами конечного автомата? Один из подходов - изменить программные инструкции (те, которые хранятся в регистрах), чтобы они содержали более одной команды. Но это тоже может быть исчерпано, если инструкция не имеет (потенциально) неограниченного размера. Так почему бы не использовать только одну «сверхинструкцию» - одно действительно очень большое число, - которое содержит все закодированные в нем программные инструкции! Вот как Мински решает проблему, но используемая им нумерация Гёделя представляет собой большое неудобство для модели, и результат совсем не похож на наше интуитивное понятие «компьютер с хранимой программой».
Элгот и Робинсон (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), стр. 316ff, Глава XII, Частичные рекурсивные функции, в частности, стр. 323-325.) Подробнее об этом см. пример ниже.
Для неограниченного косвенного обращения мы требуем "аппаратного" изменения в нашей модели машины. Как только мы внесем это изменение, модель больше не будет машиной счетчика, а скорее машиной с произвольным доступом.
Теперь, когда, например, Если указан INC, инструкция конечного автомата должна будет указать, откуда будет поступать адрес интересующего регистра. Это может быть либо (i) инструкция конечного автомата, которая предоставляет явную метку, либо (ii) регистр-указатель, содержимое которого является интересующим адресом. Всякий раз, когда в инструкции указывается адрес регистра, теперь также необходимо указать дополнительный параметр «i / d» - «косвенный / прямой». В некотором смысле этот новый параметр «i / d» является «переключателем», который переключает в одну сторону для получения прямого адреса, как указано в инструкции, или в другую сторону для получения косвенного адреса из регистра указателя (который регистр указателя - в некоторых модели каждый регистр может быть регистром-указателем - указывается в инструкции). Этот «взаимоисключающий, но исчерпывающий выбор» является еще одним примером «определения по случаям», а арифметический эквивалент, показанный в приведенном ниже примере, получен из определения в Kleene (1952) p. 229.
Вероятно, самая полезная из добавленных инструкций - это C OPY. Действительно, Элгот-Робинсон (1964) предоставляет свои модели P 0 и P '0 с инструкциями COPY, а Cook-Reckhow (1973) предоставляет свою модель на основе аккумулятора только с двумя косвенные инструкции - КОПИРОВАТЬ в аккумулятор косвенно, КОПИРОВАТЬ из аккумулятора косвенно.
Множество инструкций : Поскольку любая инструкция, действующая в одном регистре, может быть дополнена ее косвенным "двойным" (включая условные и безусловные переходы, см. Модель Элгот-Робинсона), включение косвенных инструкций удвоится. количество команд с одним параметром / регистром (например, INC (d, r), INC (i, r)). Хуже того, каждые две инструкции параметра / регистра будут иметь 4 возможных варианта, например:
. Подобным образом каждая трех регистровая инструкция, которая включает два исходных регистра r s1rs2и a регистр назначения r d приведет к 8 разновидностям, например добавлению:
даст:
Если мы обозначим один регистр как «аккумулятор» (см. ниже) и наложим строгие ограничения на различные разрешенные инструкции, то мы сможем значительно сократить множество прямых и косвенных операций. Однако нужно быть уверенным, что полученного сокращенного набора команд достаточно, и мы должны знать, что сокращение произойдет за счет большего количества инструкций на «значительную» операцию.
Историческое соглашение посвящает регистр аккумулятору, «арифметическому органу», который буквально накапливает свой номер в ходе последовательности арифметических операций:
Однако накопитель требует большего количества инструкций на одну арифметическую «операцию», в частности, в отношении так называемых инструкций «чтение-изменение-запись», таких как « Косвенное увеличение содержимого регистрационной точки отредактировано регистром r2 ". «A» обозначает «накопительный» регистр A:
Метка | Инструкция | A | r2 | r378,426 | Описание | |
---|---|---|---|---|---|---|
... | 378 426 | 17 | ||||
INCi (r2): | CPY (i, r2, d, A) | 17 | 378 426 | 17 | Содержимое r2 указывает на r378,426 с содержанием «17»: скопируйте это в A | |
INC (A) | 18 | 378,426 | 17 | Содержимое цемента A | ||
CPY (d, A, i, r2) | 18 | 378,426 | 18 | Содержимое r2 указывает на r378,426: скопируйте содержимое A в r378,426 |
Если мы придерживаемся определенного имени для аккумулятора, например "A", мы можем подразумевать аккумулятор в инструкциях, например,
Однако, когда мы пишем инструкции CPY без вызванного аккумулятора, инструкции неоднозначны или они должны быть пустыми. параметры:
Исторически сложилось так, что эти две инструкции CPY получили разные имена; однако никакого соглашения не существует. Традиция (например, воображаемый компьютер Кнута (1973) MIX ) использует два имени: LOAD и STORE. Здесь мы добавляем параметр «i / d»:
Типичная модель на основе аккумулятора будет иметь все свои арифметические операции с двумя переменными и константы (например, ADD (A, r), SUB (A, r)) использовать (i) содержимое аккумулятора вместе с (ii) содержимым указанного регистра.. Для операций с одной переменной (например, INC (A), DEC (A) и CLR (A)) требуется только аккумулятор. Оба типа команд хранят результат (например, сумму, разность, произведение, частное или остаток) в аккумуляторе..
Если мы захотим, мы можем сократить мнемонические символы потому что по крайней мере один регистр источника и регистр назначения всегда является аккумулятором A. Таким образом, мы имеем:
Если наша модель имеет неограниченный аккумулятор, можем ли мы связать все остальные регистры? Только когда мы предоставим хотя бы один неограниченный регистр, из которого мы получаем наши косвенные адреса.
Минималистский подход заключается в использовании самого себя (это делает Шёнхаге).
Другой подход (Шёнхаге тоже это делает) - объявить конкретный регистр «регистром косвенного адреса» и ограничить косвенное обращение по отношению к этому регистру (модель Шёнхаге RAM0 использует регистры A и N как для косвенных, так и для прямых инструкций.). Опять же, у нашего нового регистра нет общепринятого имени - возможно, «N» от «iNdex», «iNdirect» или «номер адреса».
Для максимальной гибкости, как мы сделали для аккумулятора 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:
В предыдущем разделе мы неформально показали, что ОЗУ с неограниченной возможностью косвенного обращения создает машину Пост-Тьюринга. Машина Пост-Тьюринга эквивалентна Тьюрингу, поэтому мы показали, что ОЗУ с косвенной адресацией эквивалентно Тьюрингу.
Мы даем здесь несколько более формальную демонстрацию. Начнем с разработки нашей модели с тремя зарезервированными регистрами «E», «P» и «N», а также неограниченным набором регистров 1, 2,..., n справа. Регистры 1, 2,..., n будут считаться «квадратами ленты». Регистр «N» указывает на «сканируемый квадрат», который в данный момент наблюдает «голова». «Голова» может рассматриваться как находящаяся в условном переходе - обратите внимание, что она использует косвенную адресацию (см. Элгот-Робинсон, стр. 398). Когда мы уменьшаем или увеличиваем «N», (кажущаяся) голова будет «перемещаться влево» или «вправо» вдоль квадратов. Мы переместим содержимое «E» = 0 или «P» = 1 в «отсканированный квадрат», как указано N, используя t он косвенный CPY.
Тот факт, что наша лента имеет левый конец, представляет нам небольшую проблему: всякий раз, когда происходит нажатие LEFT, наши инструкции должны будут проверить, является ли содержимое «N» равным нулю; в таком случае мы должны оставить его счетчик равным «0» (это наш выбор как дизайнеров - например, мы могли бы заставить машину / модель «запускать событие» по нашему выбору).
Следующая таблица определяет инструкции Пост-Тьюринга с точки зрения их эквивалентных инструкций в ОЗУ и дает пример их функционирования. (Кажущееся) расположение головки на ленте регистров r0-r5... отображается затененным:
Мнемоника | метка: | E | P | N | r0 | r1 | r2 | r3 | r4 | r5 | и т. Д. | Действие над регистрами | Действие над регистром команд конечного автомата IR | |||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
начало: | 0 | 1 | 3 | 1 | 0 | |||||||||||
R | справа: | INC (N) | 0 | 1 | 4 | 1 | 0 | [N] + 1 → N | [IR] +1 → IR | |||||||
P | печать: | CPY (d, P, i, N) | 0 | 1 | 4 | 1 | 1 | [P] = 1 → [N] = r4 | [IR] +1 → IR | |||||||
E | стереть: | CPY (d, E, i, N) | 0 | 1 | 4 | 1 | 0 | [E] = 0 → [N] = r4 | [IR] +1 → IR | |||||||
L | слева: | JZ (i, N, end) | 0 | 1 | 4 | 1 | 0 | нет | IF N = r4] = 0 ТОГДА "конец" → IR else [IR] +1 → IR | |||||||
DEC (N) | 0 | 1 | 3 | 1 | 0 | [N] -1 → N | ||||||||||
J0 (остановка) | jump_if_blank: | JZ (i, N, end) | 0 | 1 | 3 | 1 | 0 | нет | IF N = r3] = 0 ТОГДА «конец» → IR else [IR] +1 → IR | |||||||
J1 ( остановка) | jump_if_mark: | JZ (i, N, halt) | 0 | 1 | 3 | 1 | 0 | N = r3] → A | IF N = r3] = 0 ТО "конец" → IR else [IR] +1 → IR | |||||||
конец | ... и т.д. | 0 | 1 | 3 | 1 | 0 | ||||||||||
halt: | H | 0 | 1 | 3 | 1 | 0 | none | [IR] +1 → IR |
На протяжении всей этой демонстрации мы имеем иметь в виду, что инструкции в ТАБЛИЦЕ конечного автомата ограничены, то есть конечны:
Мы построим косвенный CPY (i, q, d, φ) с оператором CASE. Адрес целевого регистра будет определяться содержимым регистра «q»; как только оператор CASE определит, что это за номер, CPY напрямую внесет содержимое регистра с этим номером в регистр «φ». Нам понадобится дополнительный регистр, который мы назовем «y» - он служит счетчиком.
«Оператор» CASE описан в Kleene (1952) (стр. 229) и в Boolos-Burgess-Jeffrey (2002) (стр. 74); последние авторы подчеркивают его полезность. Следующее определение дано Клини, но изменено, чтобы отразить знакомую конструкцию «ЕСЛИ-ТО-ИНАЧЕ».
Оператор 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).
НАГРУЗКА (C, r d); C → r d
, C - любое целое числоLOAD (0, 5)
очищает регистр 5.ADD (r s1, r s2, r d); [r s1 ] + [r s2 ] → r d
, регистры могут быть одинаковыми или разными;ADD (A, A, A)
удвоит содержимое регистра A.SUB (r s1, r s2, r d); [r s1 ] - [r s2 ] → r d
, регистры могут быть одинаковыми или разными:SUB (3, 3, 3)
очистит регистр 3.КОПИРОВАТЬ (i, r p, d, r d); [[r p ]] → r d
, Косвенно скопируйте содержимое регистра-источника, на которое указывает регистр-указатель r p, в регистр назначения.КОПИРОВАТЬ (d, r s, i, r p); [r s ] → [r p]
. Скопируйте содержимое исходного регистра r s в регистр-адресат, на который указывает регистр-указатель r p.JNZ (r, I z);
Условный переход, если [r] положительно; т.е. IF [r]>0 THEN перейти к инструкции z, иначе продолжить последовательность (Cook и Reckhow называют это: «Перенести управление на строку m, если Xj>0»)READ (r d);
скопировать «вход» в регистр назначения r dPRINT (r s);
скопировать содержимое исходного регистра r s в «выход».Schönhage (1980) описывает очень примитивную, атомизированную модель, выбранную для его доказательства эквивалентности его SMM указательной машины модели:
Модель RAM1 : Шёнхаге демонстрирует, как его конструкция может использоваться для формирования более распространенной, удобной формы ОЗУ, подобной «преемнику» (используя мнемонику этой статьи):
LDA k; k ->A
, k - константа, явное число, например "47"LDA (d, r); [r] → A;
напрямую загрузить ALDA (i, r); [[r]] → A;
косвенно загрузить ASTA (d, r); [A] → r;
напрямую сохранить ASTA (i, r); [A] → [r];
косвенно сохранить AJEA (r, z); ЕСЛИ [A] = [r], то I z иначе продолжить
INCA; [A] + 1 ->A
Модель RAM0 : машина RAM0 Шёнхаге имеет 6 инструкций, обозначенных одной буквой (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, затем перейдите к I z
; неоднозначно в его трактовкеКосвенное обращение исходит (i) от CPYAN (копирование / перенос содержимого A в N), работающего с store_A_via_N STAN, и от (ii) специфического инструкция косвенного обращения LDAA ([[A]] → [A])
.
Определяющий факт, что любой вид счетной машины без неограниченного регистра - " адрес "регистр должен указывать регистр" r "по имени указывает, что модель требует, чтобы" r "было конечным, хотя он" неограничен "в том смысле, что модель не подразумевает верхнего предела количества регистров, необходимых для выполнения своей работы (s). Например, нам не требуется r < 83,617,563,821,029,283,746 nor r < 2^1,000,001, etc.
Мы можем избежать этого ограничения, предоставив неограниченный регистр для предоставления адреса регистра который указывает косвенный адрес.
С некоторыми за исключением, эти ссылки такие же, как и в Регистрационной машине.
| date =
()