Есть много способов реализовать что-то, в чем можно реализовать машину Тьюринга.
Когда вы смотрите на процессоры, наиболее подходящим является, вероятно, модель регистрационной машины . Простейшим из них (с точки зрения символов) является двухсимвольный двухсимвольный символ ( mark
и blank
). Если вы выбираете что-то не совсем эзотерическое, то inc(r)
, dec(r)
и jz(r,z)
(переход, если регистр r
равен нулю для инструкции z
) или clr(r)
(сброс r
) inc
, je(i,j,z)
(переход, если регистр i и j равны инструкции z).
Я видел упоминание о машине регистрации, которая:
- inc (i, m) - увеличить регистр i и перейти к строке m
- jzdec (i, m1, m2) - если регистр i равен 0, перейти к строке m, иначе уменьшить i и перейти к строке m2
который также завершен по Тьюрингу - это машина регистра Минского, хотя у него есть другие ограничения на данные на ленте (это должен быть номер Геделя, хранящий состояние, а не отдельные регистры)
Это оно. Ничего больше.
Так почему же не используются эти ультрарисковые процессоры? Это большая боль - написать для них компилятор, и вы отказываетесь от множества других вещей, которые может делать процессор. Это действительно приятно иметь побитовый and
, add
а не пытаться делать все с помощью увеличения регистров и циклов. Это основа любимого языка программирования под названием Brainfuck, который имеет 8 инструкций.
>
увеличить указатель данных
<
уменьшить указатель данных
+
увеличивать данные в указателе данных
-
уменьшить данные в указателе данных
.
вывод данных на указатель данных
,
читать ввод, сохраняя данные в указателе данных
[
если данные в указателе равны нулю, вместо перемещения указателя инструкции вперед на один, переходите к команде после соответствующей ]
команды
]
если данные в указателе отличны от нуля, вместо перемещения указателя инструкции вперед перейдите к команде после соответствующей ]
команды
Можно найти компиляторы для Brainfuck, хотя делать в них даже простые вещи не очень интересно. Если вы не наслаждаетесь разочарованием, которое является целью языка.
Связанное чтение: