stringtranslate.com

Машина произвольного доступа

В информатике машина произвольного доступа ( RAM или RA-машина ) — это модель вычислений , описывающая абстрактную машину в общем классе регистровых машин . RA-машина очень похожа на счетную машину , но с добавленной возможностью «косвенной адресации» своих регистров. «Регистры» интуитивно эквивалентны основной памяти обычного компьютера, за исключением дополнительной способности регистров хранить натуральные числа любого размера. Как и машина-счетчик, RA-машина содержит инструкции выполнения в конечной части машины (так называемая Гарвардская архитектура ).

Эквивалент универсальной машины Тьюринга для RA-машины  – с ее программой в регистрах, а также с ее данными – называется машиной с произвольным доступом к хранимой программе или RASP-машиной. Это пример так называемой архитектуры фон Неймана , наиболее близкой к общепринятому понятию компьютера .

Вместе с моделями машины Тьюринга и противомашины для анализа сложности вычислений используются модели RA-машины и RASP-машины . Ван Эмде Боас (1990) называет эти три модели вместе с указательной машиной моделями «последовательных машин», чтобы отличить их от моделей « параллельных машин с произвольным доступом ».

Неофициальное описание

RA-машина состоит из:

Описание похожей концепции, но с юмором, см. в «языке программирования» Branflakes . [1]

Введение в модель

Концепция машины с произвольным доступом (ОЗУ) начинается с самой простой модели, так называемой модели счетчиковой машины . Однако два дополнения отодвигают его от счетчика. Первый расширяет возможности машины, обеспечивая удобство косвенной адресации; второй приближает модель к более традиционному компьютеру на основе аккумулятора с добавлением одного или нескольких вспомогательных (выделенных) регистров, наиболее распространенный из которых называется «аккумулятор».

Формальное определение

Машина с произвольным доступом (ОЗУ) — это абстрактная модель вычислительной машины, идентичная машине с многорегистровым счетчиком, с добавлением косвенной адресации. По усмотрению команды из ТАБЛИЦЫ своего конечного автомата машина получает адрес «целевого» регистра либо (i) непосредственно из самой инструкции, либо (ii) косвенно из содержимого ( например, номера, метки) « указатель», указанный в инструкции.

По определению: Регистр — это место, имеющее как адрес (уникальное, различимое обозначение/указатель, эквивалентный натуральному числу), так и содержимое  — одно натуральное число. Для точности мы будем использовать квазиформальный символизм Булоса-Берджесса-Джеффри (2002), чтобы указать регистр, его содержимое и операцию над регистром:

Пример: [3] +1 → 3; означает «Содержимое регистра-источника с адресом «3» плюс 1 помещается в регистр назначения с адресом «3» (здесь источник и назначение — это одно и то же место). Если [3] = 37, то есть содержимое регистр 3 — это число «37», тогда в регистр 3 будет помещено 37+1 = 38.
Пример: [3] → 5; означает "Содержимое регистра-источника с адресом "3" помещается в регистр назначения с адресом "5". Если [3]=38, то есть содержимым регистра 3 является число 38, то это число будет помещено в регистр 5. Содержимое регистра 3 эта операция не нарушает, поэтому [3] по-прежнему равно 38, теперь то же самое, что и [5].

Определение: Прямая инструкция — это инструкция, которая указывает в самой инструкции адрес регистра источника или назначения, содержимое которого будет предметом инструкции. Определение: Косвенная инструкция — это инструкция, которая определяет «регистр указателя», содержимым которого является адрес «целевого» регистра. Целевой регистр может быть либо источником, либо местом назначения (примерами этого служат различные инструкции COPY). Регистр может обращаться к самому себе косвенно.

Из-за отсутствия стандарта/конвенции в этой статье в качестве параметра (или параметров) в инструкции будет указано «прямое/косвенное», сокращенно «d/i»:
Пример: COPY ( d , A, i , N ) означает прямое получение адреса исходного регистра (регистр «A») из самой инструкции, но косвенно я получаю адрес назначения из регистра-указателя N. Предположим, [N] = 3, тогда регистр 3 является местом назначения, и инструкция выполнит следующее: [A] → 3.

Определение: Содержимое исходного регистра используется инструкцией. Адрес исходного регистра может быть указан либо (i) непосредственно с помощью инструкции, либо (ii) косвенно с помощью регистра-указателя, указанного инструкцией.

Определение: Содержимое регистра указателя представляет собой адрес «целевого» регистра.

Определение: Содержимое регистра-указателя указывает на целевой регистр  – «целевым» может быть регистр источника или регистр назначения.

Определение: Регистр назначения — это место, куда инструкция помещает свой результат. Адрес исходного регистра может быть указан либо (i) непосредственно с помощью инструкции, либо (ii) косвенно с помощью регистра-указателя, указанного инструкцией. Регистры источника и назначения могут быть одними.

Повторный курс: модель противомашины.

Мельзак (1961) дает легкое представление о счетной машине: ее «регистры» представляют собой отверстия в земле, и в этих отверстиях хранятся камешки. По команде в эти отверстия и из них «компьютер» (человек или машина) добавляет (INCrements) или удаляет (DECrements) один камешек. По мере необходимости из бесконечного запаса поступают дополнительные камешки, а лишние камешки возвращаются обратно; если яма слишком мала, чтобы вместить гальку, «компьютер» выкапывает яму большего размера.
Мински (1961) и Хопкрофт-Ульман 1979 (стр. 171) предлагают визуализацию многоленточной машины Тьюринга с таким количеством лент с левым концом, сколько «регистров». Длина каждой ленты не ограничена справа, и каждый квадрат пуст, за исключением левого конца, который отмечен. Расстояние «головы» ленты от ее левого конца, измеряемое в количестве квадратов ленты, представляет собой натуральное число в «регистре» . Чтобы уменьшить количество квадратов, головка ленты перемещается влево; INCrement он перемещается вправо. Нет необходимости печатать или стирать пометки на ленте; единственные условные инструкции - это проверить, находится ли головка на левом конце, проверяя отметку левого конца с помощью инструкции «Перейти, если отмечено».
Следующие инструкции «мнемоника», например «CLR (r)», являются произвольными; никакого стандарта не существует.

Регистровая машина имеет память, внешнюю по отношению к ее конечному автомату, - неограниченный (см. сноску | счетный и неограниченный) набор дискретных и уникально помеченных ячеек с неограниченной емкостью, называемых «регистрами». Эти регистры содержат только натуральные числа (ноль и положительные целые числа). В соответствии со списком последовательных инструкций в ТАБЛИЦЕ конечного автомата, несколько (например, 2) типов примитивных операций оперируют содержимым этих «регистров». Наконец, доступно условное выражение в форме IF-THEN-ELSE для проверки содержимого одного или двух регистров и «разветвления/перехода» конечного автомата из последовательности инструкций по умолчанию.

Базовая модель 1 : модель, наиболее близкая к визуализации Мински (1961) и Ламбека (1961):

Базовая модель 2 : Модель «преемника» (названная в честь функции-преемника аксиом Пеано ):

Базовая модель 3 : использовалась Элготом-Робинсоном (1964) в исследовании ограниченных и неограниченных RASP – модель «преемника» с COPY вместо CLEAR:

Создание «удобных инструкций» из базовых наборов

Три базовых набора 1, 2 или 3, приведенные выше, эквивалентны в том смысле, что можно создать инструкции одного набора, используя инструкции другого набора (интересное упражнение: подсказка Мински (1967) – объявить зарезервированный регистр, например вызов это «0» (или Z для «ноля» или E для «стирания»), чтобы содержать число 0). Выбор модели будет зависеть от того, какую модель автору легче всего использовать для демонстрации, доказательства и т. д.

Более того, из базовых наборов 1, 2 или 3 мы можем создать любую примитивно -рекурсивную функцию (см. Мински (1967), Булос-Берджесс-Джеффри (2002)). (Как расширить сеть, чтобы охватить полные и частичные мю-рекурсивные функции , будет обсуждаться в контексте косвенной адресации). Однако построение примитивно-рекурсивных функций затруднено, поскольку наборы инструкций настолько... примитивны (крошечны). Одним из решений является расширение определенного набора «удобными инструкциями» из другого набора:

Это не будут подпрограммы в общепринятом понимании, а скорее блоки инструкций, созданные из базового набора и снабженные мнемоникой. В формальном смысле, чтобы использовать эти блоки, нам необходимо либо (i) «расширить» их до эквивалентов базовых инструкций – они потребуют использования временных или «вспомогательных» регистров, поэтому модель должна это учитывать, или ( ii) проектируйте наши машины/модели с использованием «встроенных» инструкций.
Пример: Базовый набор 1. Чтобы создать CLR(r), используйте блок инструкций для обратного счета регистра r до нуля. Обратите внимание на использование подсказки, упомянутой выше:
  • CLR (r) = экв.
  • цикл : JZ (r, выход )
  • ДЕК (р)
  • JZ (0, цикл )
  • выход : и т. д.

Опять же, все это только для удобства; ничто из этого не увеличивает внутреннюю мощность модели.

Например: наиболее расширенный набор будет включать каждую уникальную инструкцию из трех наборов плюс безусловный переход J (z), т.е.:

Большинство авторов выбирают тот или иной из условных переходов, например, Шепердсон-Стерджис (1963) использует приведенный выше набор минус JE (чтобы быть совершенно точным, они используют JNZ – Перейти, если не ноль вместо JZ; еще одна возможная удобная инструкция).

«Косвенная» операция

Пример косвенной адресации

В нашей повседневной жизни понятие «косвенной операции» не является чем-то необычным.

Пример: Охота за сокровищами.
В локации «Tom_&_Becky's_cave_in_pirate_chest» мы сможем найти карту, направляющую нас к «сокровищу»:
(1) Идем в локацию «Пещера Тома_&_Бекки...» и копаемся, пока не находим деревянный ящик.
(2) Внутри коробки находится карта расположения сокровищ: «under_Thatcher's_front_porch».
(3) Идем в локацию «под крыльцом Тэтчер», отбойным молотком отбиваем бетон и обнаруживаем «сокровище»: мешок ржавых дверных ручек.

Косвенность указывает место, идентифицированное как пиратский сундук в «Пещере Тома_&_Бекки...», которое действует как указатель на любое другое место (включая его самого): его содержимое (карта сокровищ) предоставляет «адрес» целевого местоположения «под Тэтчер». 's_front_porch", где происходит настоящее действие.

Почему необходима непрямая операция: две основные проблемы противомашинной модели

Далее следует помнить, что эти модели представляют собой абстрактные модели с двумя фундаментальными отличиями от всего физически реального: неограниченное количество регистров, каждый из которых имеет неограниченную емкость. Проблема проявляется наиболее драматично, когда кто-то пытается использовать противомашинную модель для построения RASP, эквивалентного по Тьюрингу , и, таким образом, вычислить любую частичную мю-рекурсивную функцию :

Кук и Рекхоу (1973) говорят об этом наиболее кратко:
Косвенные инструкции необходимы для того, чтобы фиксированная программа могла получить доступ к неограниченному числу регистров при изменении входных данных» (стр. 73).
Иногда константа k создается с помощью CLR ( r ) с последующим повторением INC ( r ) k раз – например, чтобы поместить константу k=3 в регистр r, т.е. 3 → r, поэтому в конце инструкции [r ]=3: CLR (r), INC (r), INC (r), INC (r). Этот трюк упоминается Клини (1952), с. 223. Проблема возникает, когда количество создаваемых инструкций исчерпывает количество инструкций, доступных конечному автомату ; всегда существует большая константа, чем количество инструкций, доступных конечному автомату .
Обратите внимание, что конечный автомат счетчика должен явно (напрямую) вызывать регистр по его имени/номеру: INC (65,356) явно вызывает номер регистра «65,365» . Если количество регистров превышает возможности конечного автомата по их адресу, то регистры за пределами границ будут недоступны. Например, если конечный автомат может достичь только 65 536 = 2 16 регистров, то как он сможет достичь 65 537-го?

Так как же нам обратиться к регистру за пределами конечного автомата? Один из подходов — изменить инструкции программы (те, которые хранятся в регистрах), чтобы они содержали более одной команды. Но и это может быть исчерпано, если только инструкция не имеет (потенциально) неограниченного размера. Так почему бы не использовать всего одну «сверхинструкцию» – одно действительно большое число – которое содержит все закодированные в нем инструкции программы! Вот как Мински решает проблему, но нумерация Гёделя , которую он использует, представляет большие неудобства для модели, и результат совершенно не похож на наше интуитивное представление о «компьютере с хранимой программой».

Элгот и Робинсон (1964) пришли к аналогичному выводу в отношении RASP, который «конечно определен». Действительно, он может получить доступ к неограниченному числу регистров (например, для извлечения из них инструкций), но только если RASP допускает «самомодификацию» своих программных инструкций и закодировал свои «данные» в число Гёделя (рис. 2, стр. 396). ).

В контексте более похожей на компьютер модели, использующей его инструкцию RPT (повторение), Мински (1967) дразнит нас решением проблемы (ср. стр. 214, стр. 259), но не предлагает твердого решения. Он утверждает:

«В общем, операция RPT не может быть инструкцией в конечной части машины... это может исчерпать любой конкретный объем памяти, разрешенный в конечной части компьютера [так в оригинале, его название для его моделей оперативной памяти]. Операции RPT требуют собственных бесконечных регистров». (с. 214).

Он предлагает нам ограниченный RPT, который вместе с CLR(r) и INC(r) может вычислить любую примитивно-рекурсивную функцию , и он предлагает указанный выше неограниченный RPT, играющий роль оператора μ; он вместе с CLR(r) и INC(r) может вычислять рекурсивные функции мю. Но он не обсуждает «косвенность» или модель RAM как таковую.

Из ссылок Хартманиса (1971) следует, что Кук (в своих конспектах лекций в Калифорнийском университете в Беркли, 1970) укрепил идею косвенной адресации. Это становится более ясным в статье Кука и Рекхоу (1973): Кук является руководителем магистерской диссертации Рекхоу. Модель Хартманиса, очень похожая на модель Мелзака (1961), использует сложение и вычитание с двумя и тремя регистрами, а также два копирования параметров; Модель Кука и Рекхоу сокращает количество параметров (регистров, вызываемых в инструкциях программы) до одного вызова за счет использования аккумулятора «AC».

Решение в двух словах: спроектируйте нашу машину/модель с неограниченной косвенностью  – обеспечьте неограниченный «адресный» регистр, который потенциально может назвать (вызвать) любой регистр, независимо от того, сколько их. В общем, чтобы это работало, неограниченный регистр требует возможности очищаться, а затем увеличиваться (и, возможно, уменьшаться) с помощью потенциально бесконечного цикла. В этом смысле решение представляет собой неограниченный оператор μ , который может, при необходимости, искать до бесконечности вдоль неограниченной строки регистров, пока не найдет то, что ищет. Регистр указателя точно такой же, как и любой другой регистр, за одним исключением: в обстоятельствах, называемых «косвенной адресацией», он предоставляет свое содержимое, а не операнд-адрес в ТАБЛИЦЕ конечного автомата, в качестве адреса целевого регистра (включая, возможно, самого себя). !).

Ограниченная косвенность и примитивно-рекурсивные функции

Если мы откажемся от подхода Мински с одним чудовищным числом в одном регистре и укажем, что наша модель машины будет «похожа на компьютер», нам придется столкнуться с этой проблемой косвенности, если мы хотим вычислить рекурсивные функции (также называемые µ- рекурсивными функциями). функции ) – как полные, так и частичные разновидности.

Наша более простая модель противомашины может выполнять «ограниченную» форму косвенности – и тем самым вычислять подкласс примитивно-рекурсивных функций  – используя примитивно-рекурсивный «оператор», называемый «определением по случаям» (определенный в Клини (1952) p). 229 и Булос-Берджесс-Джеффри стр. 74). Такая «ограниченная косвенность» — трудоемкое и утомительное дело. «Определение по регистру» требует, чтобы машина определяла/отличяла содержимое регистра указателя, пытаясь раз за разом до достижения успеха сопоставить это содержимое с числом/именем, которые явно объявляет оператор регистра. Таким образом, определение по случаям начинается, например, с адреса нижней границы и до тошноты продолжается до адреса верхней границы, пытаясь найти совпадение:

Число в регистре N равно 0? Если нет, то равно ли оно 1? 2? 3? ... 65364? Если нет, то мы находимся на последнем номере 65365, и лучше бы это был именно этот номер, иначе у нас проблемы!

«Ограниченная» косвенность не позволит нам вычислять частично рекурсивные функции — для них нам понадобится неограниченная косвенность, известная как оператор μ .

Предположим, мы смогли перейти к номеру 65367, и в этом регистре действительно было то, что мы искали. Тогда мы могли бы успешно завершить наш расчет! Но предположим, что в 65367 нет того, что нам нужно. Как далеко нам следует продолжать идти?

Чтобы быть эквивалентом Тьюринга, счетчиковая машина должна либо использовать неудачный однорегистровый метод чисел Мински-Гёделя , либо быть дополнена возможностью исследовать концы своей строки регистров, до бесконечности, если это необходимо. (Неспособность найти что-то «там» определяет, что означает неспособность алгоритма завершить работу; см. Kleene (1952), стр. 316 и далее, глава XII «Частичные рекурсивные функции» , в частности стр. 323–325.) Дополнительную информацию об этом см. пример ниже.

Неограниченная косвенность и частично рекурсивные функции

Для неограниченной косвенности нам требуется «аппаратное» изменение модели нашей машины. Как только мы внесем это изменение, модель перестанет быть счетчиковой машиной, а станет машиной произвольного доступа.

Теперь, когда, например, указано INC, инструкция конечного автомата должна будет указать, откуда будет взят адрес интересующего регистра. Это может быть либо (i) инструкция конечного автомата, которая предоставляет явную метку , либо (ii) регистр-указатель , содержимым которого является интересующий адрес. Всякий раз, когда инструкция указывает адрес регистра, ей теперь также необходимо будет указать дополнительный параметр «i/d» – «косвенный/прямой». В некотором смысле этот новый параметр «i/d» является «переключателем», который переключает один способ получения прямого адреса, как указано в инструкции, или другой способ получения косвенного адреса из регистра указателя (какой регистр указателя – в некоторых случаях модели каждый регистр может быть регистром-указателем – указано в инструкции). Этот «взаимоисключающий, но исчерпывающий выбор» является еще одним примером «определения по случаям», а арифметический эквивалент, показанный в примере ниже, получен из определения в Kleene (1952), с. 229.

Пример: CPY (косвенный источник , r источник , прямой пункт назначения , r пункт назначения )
Назначьте код для указания прямой адресации как d="0" и косвенной адресации как i="1". Тогда наша машина сможет определить адрес источника следующим образом:
i*[r s ] + (1-i)*r s
Например, предположим, что содержимое регистра 3 равно «5» (т.е. [3]=5), а содержимое регистра 4 — «2» (т.е. [4]=2):
Пример: CPY (1, 3, 0, 4) = CPY (косвенный, регистр 3, прямой, регистр 4)
1*[3] + 0*3 = [3] = адрес исходного регистра 5
0*[4] + 1*4 = 4 = адрес регистра назначения 4
Пример: CPY (0, 3, 0, 4)
0*[3] + 1*3 = 3 = адрес исходного регистра 3
0*[4] + 1*4 = 4 = адрес регистра назначения 4
Пример: CPY (0, 3, 1, 4)
0*[3] + 1*3 = 3 = адрес исходного регистра 3
1*[4] + 0*4 = [4] = адрес регистра назначения 2

Косвенная инструкция COPY

Вероятно, самая полезная из добавленных инструкций — COPY. Действительно, Элгот-Робинсон (1964) снабжает свои модели P 0 и P' 0 инструкциями COPY, а Кук-Рекхау (1973) снабжает свою модель на основе аккумулятора только двумя косвенными инструкциями – КОПИРОВАТЬ в аккумулятор косвенно, КОПИРОВАТЬ из аккумулятора косвенно. .

Множество инструкций : поскольку любая инструкция, действующая на один регистр, может быть дополнена ее косвенным «двойным» (включая условные и безусловные переходы, ср. модель Элгота-Робинсона), включение косвенных инструкций удвоит количество одиночных параметров. инструкции регистра (например, INC (d, r), INC (i, r)). Хуже того, каждая инструкция с двумя параметрами/регистрами будет иметь 4 возможных варианта, например:

CPY (d, r s , d, r d ) = КОПИРОВАТЬ непосредственно из исходного регистра непосредственно в регистр-приемник
CPY (i, r sp , d, r d ) = КОПИРОВАТЬ в регистр назначения косвенно, используя адрес источника, который должен быть найден в регистре указателя источника r sp .
CPY (d, r s , i, r dp ) = КОПИРОВАТЬ содержимое регистра-источника косвенно в регистр, используя адрес назначения, который нужно найти в регистре-указателе назначения r dp .
CPY (i, r sp , i, r dp ) = косвенно КОПИРОВАТЬ содержимое регистра источника с адресом, который нужно найти в регистре указателя источника r sp , в регистр назначения с адресом, который нужно найти в регистре указателя назначения r дп )

Аналогичным образом каждая трехрегистровая команда, включающая два исходных регистра r s1 r s2 и регистр назначения rd , приведет к 8 разновидностям, например, к сложению:

[r s1 ] + [r s2 ] → r d

будет давать:

Если мы назначим один регистр «аккумулятором» (см. ниже) и наложим строгие ограничения на различные разрешенные инструкции, то мы сможем значительно сократить множество прямых и косвенных операций. Однако нужно быть уверенным, что полученного сокращенного набора команд достаточно, и мы должны осознавать, что сокращение будет происходить за счет большего количества инструкций на «значительную» операцию.

Понятие «аккумулятор А».

Историческое соглашение отводит регистр аккумулятору, «арифметическому органу», который буквально накапливает свое число во время последовательности арифметических операций:

«Первая часть нашего арифметического органа... должна быть параллельным органом хранения, который может принимать число и добавлять его к уже находящемуся в нем, который также способен очищать свое содержимое и который может хранить то, что оно содержит. Мы будем назовем такой орган « аккумулятором ». Он в принципе довольно условен в прошлых и нынешних вычислительных машинах самых разных типов, например, настольных умножителях, стандартных счетчиках IBM, более современных релейных машинах, ENIAC» (жирный шрифт в оригинале: Голдстайн и фон Нейман). , 1946; стр. 98 в Bell and Newell 1971).

Однако аккумулятор требует большего количества инструкций на арифметическую «операцию», в частности, в отношении так называемых инструкций «чтение-изменение-запись», таких как «косвенно увеличить содержимое регистра, на который указывает регистр r2». «A» обозначает регистр «аккумулятора» A:

Если мы присвоим аккумулятору определенное имя, например «А», мы можем указать аккумулятор в инструкциях, например:

ВКЛ ( А ) = ИНКА

Однако, когда мы пишем инструкции CPY без вызова аккумулятора, инструкции неоднозначны или должны иметь пустые параметры:

CPY ( d, r2, d, A ) = CPY (d, r2, , )
CPY ( d, A, d, r2 ) = CPY ( , , d, r2)

Исторически сложилось так, что эти две инструкции CPY получили разные имена; однако никакой конвенции не существует. Традиция (например, воображаемый компьютер MIX Кнута (1973) ) использует два названия: ЗАГРУЗКА и ХРАНЕНИЕ. Здесь мы добавляем параметр «i/d»:

LDA ( d/i, r s ) = def CPY ( d/i, r s , d, A )
STA ( d/i, r d ) = def CPY ( d, A, d/i, r d )

В типичной модели на основе аккумулятора все арифметические и константные операции с двумя переменными (например, ADD (A, r), SUB (A, r)) используют (i) содержимое аккумулятора вместе с (ii) содержимым указанного регистра. . Операции с одной переменной (например, INC (A), DEC (A) и CLR (A)) требуют только аккумулятора. Оба типа команд записывают результат (например, сумму, разность, произведение, частное или остаток) в аккумулятор.

Пример: INCA = [A] +1 → A
Пример: ADDA (r s ) = [A] + [r s ] → A
Пример: MULA (rs ) = [A] * [r s ] → A

Если мы захотим, мы можем сократить мнемонику, потому что по крайней мере один исходный регистр и регистр назначения всегда являются аккумулятором A. Таким образом, мы имеем:

{ LDA (i/d, r s ), STA (i/d, r s ), CLRA, INCA, DECA, ADDA (r s ), SUBA (r s ), MULA (r s ), DIVA (r s ) , и т. д.)

Понятие регистра косвенного адреса «N».

Если в нашей модели есть неограниченный аккумулятор, можем ли мы связать все остальные регистры? Не раньше, чем мы обеспечим хотя бы один неограниченный регистр, из которого мы получим наши косвенные адреса.

Минималистский подход заключается в использовании самого себя (это делает Шёнхаге).

Другой подход (Шонхаге тоже делает это) состоит в том, чтобы объявить определенный регистр «регистром косвенного адреса» и ограничить косвенность относительно этого регистра (модель RAM0 Шонхаге использует как регистры A, так и N для косвенных, а также прямых инструкций). Опять же, у нашего нового регистра нет условного имени – возможно, «N» от «iNdex», или «iNdirect», или «Номер адреса».

Для максимальной гибкости, как мы сделали для аккумулятора A, мы будем считать N просто еще одним регистром, который можно увеличивать, уменьшать, очищать, тестировать, напрямую копировать и т. д. Опять же, мы можем сжать инструкцию до одного параметра, который обеспечивает направление и косвенность, например.

LDAN (i/d) = CPY (i/d, N, d, A); Загрузка аккумулятора через регистр iNdirection
STAN (i/d) = CPY (d, A, i/d, N). Аккумулятор STore через регистр iNdirection

Почему это такой интересный подход? Как минимум две причины:

(1) Набор команд без параметров:

Шенхаге делает это, чтобы создать свой набор инструкций RAM0. См. раздел ниже.

(2) Уменьшите ОЗУ до машины Пост-Тьюринга:

Выдавая себя за минималистов, мы сводим все регистры, за исключением аккумулятора A и регистра косвенности N, например, r = { r0, r1, r2, ... }, к неограниченной строке ячеек (очень) ограниченной емкости. Они не будут делать ничего, кроме хранения (очень) ограниченных чисел, например, одиночного бита со значением {0, 1}. Аналогичным образом мы сжимаем аккумулятор до одного бита. Мы ограничиваем любую арифметику регистрами { A, N }, используем косвенные операции для извлечения содержимого регистров в аккумулятор и записи 0 или 1 из аккумулятора в регистр:

{ LDA (i, N), STA (i, N), CLR (A/N), INC (A/N), DEC(N), JZ (A/N, I z ) , JZ (I z ), Ч }

Мы продвигаемся дальше и полностью исключаем A, используя два «постоянных» регистра, называемых «ERASE» и «PRINT»: [ERASE]=0, [PRINT]=1.

{ CPY (d, ERASE, i, N), CPY (d, PRINT, i, N), CLR (N), INC (N), DEC (N), JZ (i, N, I z ), JZ ( я з ), Ч }

Переименуйте инструкции COPY и вызовите INC (N) = RIGHT, DEC (N) = LEFT, и мы получим те же инструкции, что и машина Пост-Тьюринга, плюс дополнительный CLRN:

{ СТЕРЕТЬ, ПЕЧАТЬ, CLRN, ВПРАВО, ВЛЕВО, JZ (i, N, I z ), JZ (I z ), H }

Тьюринговская эквивалентность оперативной памяти с косвенностью

В разделе выше мы неофициально показали, что ОЗУ с неограниченной возможностью косвенности создает машину Пост-Тьюринга . Машина Пост-Тьюринга эквивалентна Тьюрингу, поэтому мы показали, что ОЗУ с косвенностью эквивалентно Тьюрингу.

Мы даем здесь несколько более формальную демонстрацию. Начните с разработки нашей модели с тремя зарезервированными регистрами «E», «P» и «N», а также неограниченным набором регистров 1, 2, ..., n справа. Регистры 1, 2, ..., n будем считать «квадратами ленты». Регистр «N» указывает на «отсканированный квадрат», который в данный момент наблюдает «голова». «Голову» можно рассматривать как находящуюся в условном переходе – обратите внимание, что она использует косвенную адресацию (ср. Элгот-Робинсон, стр. 398). Когда мы уменьшаем или увеличиваем «N», (кажущаяся) голова будет «перемещаться влево» или «вправо» вдоль квадратов. Мы переместим содержимое «E»=0 или «P»=1 в «отсканированный квадрат», на который указывает N, используя косвенный CPY.

Тот факт, что наша лента имеет левый конец, ставит нас перед небольшой проблемой: всякий раз, когда появляется LEFT, нашим инструкциям придется проверять, является ли содержимое «N» нулем; в этом случае нам следует оставить его счетчик равным «0» (это наш выбор как дизайнеров — например, мы можем сделать так, чтобы машина/модель «запускала событие» по нашему выбору).

Набор инструкций 1 (расширенный): { INC (N), DEC (N), CLR (N), CPY (d, r s ,i, N), JZ (i, r, z), HALT }

В следующей таблице определены инструкции Пост-Тьюринга с точки зрения их эквивалентных инструкций в ОЗУ, а также приведен пример их функционирования. (Видимое) расположение головки на ленте регистров r0-r5. . . показан заштрихованным:

Пример: ограниченная косвенность дает машину, которая не является эквивалентом Тьюринга.

На протяжении всей этой демонстрации мы должны помнить, что инструкции в таблице TABLE конечного автомата ограничены , то есть конечны :

«Помимо того, что алгоритм представляет собой просто конечный набор правил , который дает последовательность операций для решения определенного типа задач, алгоритм имеет пять важных особенностей [Конечность, Определенность, Вход, Выход, Эффективность]» (курсив добавлен, Кнут, стр. 4). -7).
Трудность возникает потому, что регистры имеют явные «имена» (номера), и наша машина должна вызывать каждый из них по имени, чтобы «получить» к нему доступ.

Мы построим косвенный CPY (i, q, d, φ) с помощью оператора CASE. Адрес целевого регистра будет определяться содержимым регистра «q»; как только оператор CASE определит это число, CPY напрямую поместит содержимое регистра с этим номером в регистр «φ». Нам понадобится дополнительный регистр, который мы назовем «y» — он выполняет функцию обратного счетчика.

Таким образом, следующее на самом деле является конструктивной демонстрацией или доказательством того, что мы действительно можем моделировать косвенный CPY ( i, q, d, φ ) без «аппаратного» изменения конструкции нашей счетчиковой машины/модели. Однако обратите внимание, что поскольку этот косвенный CPY «ограничен» размером/объемом конечного автомата, RASP, использующий этот косвенный CPY, может вычислять только примитивно- рекурсивные функции , а не полный набор мю-рекурсивных функций .

«Оператор» CASE описан у Клини (1952) (стр. 229) и у Булоса-Берджесса-Джеффри (2002) (стр. 74); последние авторы подчеркивают его полезность. Следующее определение дано Клини, но изменено, чтобы отразить знакомую конструкцию «ЕСЛИ-ТО-ЛИБО».

Оператор CASE «возвращает» натуральное число в φ в зависимости от того, какой «case» удовлетворен, начиная с «case_0» и последовательно проходя через «case_last»; если ни один случай не удовлетворен, то число, называемое «по умолчанию» (также известное как «вупс»), возвращается в φ (здесь x обозначает некоторый выбор параметров, например, регистр q и строку r0, ... rlast )):

Определение по случаям φ( x , y):

  • case_0: ЕСЛИ Q 0 ( x , y) истинно, ТО φ 0 ( x , y) ИНАЧЕ
  • случай_1: ЕСЛИ Q 1 ( x , y) истинно, ТО φ 1 ( x , y) ИНАЧЕ
  • от Case_2 до Case_next_to_last: и т. д. . . . . . . . . ЕЩЕ
  • case_last: ЕСЛИ Q последний ( x , y) истинно, ТО φ последний ( x , y) ELSE
  • по умолчанию: сделать φ по умолчанию ( x , y)

Клини требует, чтобы все «предикаты» Q n , выполняющие тестирование, были взаимоисключающими: «предикаты» — это функции, которые выдают только { true, false } для вывода; Булос-Берджесс-Джеффри добавляют требование о том, чтобы дела были «исчерпывающими».

Мы начинаем с числа в регистре q, которое представляет адрес целевого регистра. Но что это за число? «Предикаты» проверят это, чтобы выяснить это, одно испытание за другим: JE (q, y, z), за которым следует INC (y). Как только число идентифицировано явно, оператор CASE напрямую/явно копирует содержимое этого регистра в φ:

Определение по случаям CPY (i, q, d, φ) = def φ (q, r0, ..., rlast, y) =
  • case_0: IF CLR (y), [q] - [y]=0 THEN CPY ( r0, φ ), J (выход) ELSE
  • case_1: IF INC (y), [q] = [y]=1 THEN CPY ( r1, φ ), J (выход) ELSE
  • от случая_2 до случая n: ЕСЛИ . . . ЗАТЕМ . . . ЕЩЕ
  • case_n: IF INC (y), [q] = [y]=n THEN CPY ( rn, φ ), J (выход) ELSE
  • от случая_n+1 до случая_последний: ЕСЛИ . . . ЗАТЕМ . . . ЕЩЕ
  • case_last: IF INC (y), [q] = [y]="last" THEN CPY ( rlast, φ ), J (выход) ELSE
  • по умолчанию: упс

Case_0 (базовый шаг рекурсии по y) выглядит так:

  • случай_0 :
  • CLR (у); установить регистр y = 0
  • JE (q, y, _φ0 )
  • Дж ( случай_1 )
  • _φ0: CPY (r0, φ)
  • Дж ( выход )
  • случай_1: и т. д.

Case_n (шаг индукции) выглядит следующим образом; помните, что каждый экземпляр "n", "n+1",..., "last" должен быть явным натуральным числом:

  • случай_n :
  • ИНК ( у )
  • JE ( q, y, _φn )
  • J ( case_n+1 )
  • _φn: CPY (rn, φ)
  • Дж ( выход )
  • случай__n+1: и т. д.

Case_last останавливает индукцию и ограничивает оператор CASE (и тем самым ограничивает оператор «косвенного копирования»):

  • случай_последний :
  • ИНК ( у )
  • JE (q, y, _φlast )
  • Джей ( упс )
  • _φlast : CPY (rlast, φ)
  • Дж ( выход )
  • упс: как нам справиться с попыткой выхода за пределы поля?
  • выход: и т. д.

Если бы CASE мог продолжаться до бесконечности, это был бы оператор mu . Но он не может — «регистр состояний» его конечного автомата достиг максимального значения (например, 65365 = 11111111,11111111 2 ) или в его таблице закончились инструкции; в конце концов, это конечная машина.

Примеры моделей

Модель «регистр-регистр» («чтение-изменение-запись») Кука и Рекхау (1973)

Часто встречающаяся модель Кука и Речкова немного похожа на модель Мальцека с троичным регистром (написанную с использованием мнемоники Кнута — в исходных инструкциях не было мнемоники, кроме TRA, Read, Print).

  • LOAD ( C, rd ) ; C → rd, C — любое целое число
Пример: LOAD ( 0, 5 )очистит регистр 5.
  • ADD ( rs1, rs2, rd ) ; [rs1] + [rs2] → rd, регистры могут быть одинаковыми или разными;
Пример: ADD ( 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] положительно; т.е. IF [r] > 0 THEN переход к инструкции z, иначе продолжайте последовательность (Кук и Рекхау называют это: «Перенести управление на строку m, если Xj > 0»)
  • READ ( rd ) ;скопировать «вход» в регистр назначения r d
  • PRINT ( rs ) ;скопируйте содержимое исходного регистра r на «выход».

RAM0 и RAM1 Шёнхаге (1980)

Шёнхаге (1980) описывает очень примитивную атомизированную модель, выбранную для доказательства эквивалентности его модели указателя SMM :

«Чтобы избежать какой-либо явной адресации, RAM0 имеет аккумулятор с содержимым z и дополнительный адресный регистр с текущим содержимым n (первоначально 0)» (стр. 494)

Модель RAM1 : Шёнхаге демонстрирует, как его конструкцию можно использовать для формирования более распространенной и удобной формы оперативной памяти, подобной «преемнику» (используя мнемонику этой статьи):

  • LDA k ; k --> A , k — константа, явное число, например «47».
  • LDA ( d, r ) ; [r] → A ;прямая загрузка А
  • LDA ( i, r ) ; [[r]] → A ;косвенно загрузить A
  • STA ( d, r ) ; [A] → r ;напрямую хранить А
  • STA ( i, r ) ; [A] → [r] ;косвенно сохранить A
  • JEA ( r, z ) ; IF [A] = [r] then Iz else continue
  • 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 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 и т. д.

Таким образом наша модель может «расширять» количество регистров, если необходимо выполнить определенные вычисления. Однако это означает , что любое число, до которого расширяется модель, должно быть конечным  — оно должно индексироваться натуральным числом: ω не является вариантом .

Мы можем обойти это ограничение, предоставив неограниченный регистр для предоставления адреса регистра, указывающего косвенный адрес.

Смотрите также

Внешние ссылки

Рекомендации

  1. Эрди, Герго (6 сентября 2010 г.). «От регистровых машин до Brainfuck, часть 1» . Проверено 7 февраля 2024 г.

За некоторыми исключениями, эти ссылки такие же, как и в Register Machine .

  • Капенгст, Хайнц, Eine Abstrakte programmgesteuerte Rechenmaschine' , Zeitschrift Fur Mathematische Logik und Grundlagen der Mathematik: 5 (1959), 366-379.
  • Ершов А.П. Об операторных алгоритмах , Док. Акад. Наук 122 (1958), 967-970. Английский перевод, Автомат. Экспресс 1 (1959), 20–23.
  • Петер, Rózsa Graphschemata und recursive Funktionen , Dialectica 12 (1958), 373.
  • Гермес, Ганс Die Universalität programmgesteuerter Rechenmaschinen. Матем.-Физ. Семстерберихте (Геттинген) 4 (1954), 42–53.