Минимальный набор инструкций для решения любой проблемы с компьютерной программой - PullRequest
15 голосов
/ 14 сентября 2010

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

  • Назначение
  • Условное
  • Петля

Пожалуйста, я хотел бы услышать ваше мнение.Я имею в виду представление любого алгоритма в виде компьютерной программы.Вы согласны с этим?

Ответы [ 6 ]

20 голосов
/ 14 сентября 2010

Нет необходимости. Минимальный теоретический компьютер требует только одной инструкции. Они называются Компьютеры с одним набором инструкций (сокращенно OISC, вроде как окончательный RISC) .

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

subtract and branch if less than zero

или их варианты. В статье Википедии есть примеры того, как эту единственную инструкцию можно использовать для написания кода, эмулирующего другие инструкции.

Второй тип не теоретически чистый. Это архитектура, запускаемая при передаче (снова извините, википедия). Это семейство архитектур также известно как движущиеся машины, и я сам спроектировал и построил некоторые из них.

Некоторые считают, что перемещение компьютеров обманывает, так как на самом деле все обычные инструкции имеют только то, что они отображены в памяти, а не являются частью кода операции. Но движущиеся машины не просто теоретические, они практичные (как я уже говорил, я сам их создал). Существует даже коммерчески доступное семейство процессоров, созданных Maxim: MAXQ . Если вы посмотрите на набор инструкций MAXQ (они называют его передаточным набором, поскольку на самом деле есть только одна инструкция, я обычно называю это набором регистров), то увидите, что сборка MAXQ выглядит скорее как стандартная архитектура на основе аккумулятора.

5 голосов
/ 14 сентября 2010

Это следствие полноты Тьюринга , которое было установлено много десятилетий назад.

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

Операции присваивания, условия и цикла достаточны для моделирования машины Тьюринга. Чтение и запись памяти и поддержание состояния требует назначения. Изменение направления ленты в зависимости от состояния и содержимого памяти требует условных циклов и циклов. «Петли» на самом деле немного более высокого уровня, чем на самом деле требуется. Все, что действительно требуется, - это то, что поток программы может как-то прыгнуть назад. Это подразумевает, что вы можете создавать циклы, если хотите, но язык не должен иметь явную конструкцию цикла.

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

Редактировать: И, как указывали другие ответчики, эти операции не должны быть дискретными. Вы можете создать одну инструкцию, которая выполняет все эти три вещи (назначать, сравнивать и разветвлять) таким образом, чтобы она сама могла имитировать машину Тьюринга.

3 голосов
/ 14 сентября 2010

Минимальный набор - это одна команда, но вы должны выбрать подходящую, например - Один компьютер набора команд

Когда я учился, мы использовали такой «компьютер» для вычисления факториала, используя только одну инструкцию:

SBN - Subtract and Branch if Negative:
SBN A, B, C

Значение:

if((Memory[A] -= Memory[B]) < 0) goto C  
// (Wikipedia has a slightly different definition)
2 голосов

Известные реализации компьютера с одним набором команд (OSIC)

Этот ответ будет сосредоточен на интересных реализациях процессоров, компиляторов и ассемблеров одного набора команд.

movfuscator

https://github.com/xoreaxeaxeax/movfuscator

Компилирует код C, используя только mov x86 инструкции, показывая очень конкретным образом, что достаточно одной инструкции.

Тьюрингполнота, кажется, была доказана в статье: https://www.cl.cam.ac.uk/~sd601/papers/mov.pdf

subleq

https://esolangs.org/wiki/Subleq:

См. Также

0 голосов
/ 07 мая 2017

Программисты, использующие Haskell, могут утверждать, что вам нужны только Contional и Loop, потому что в Haskell не существует присваиваний и изменяемого состояния.

0 голосов
/ 05 февраля 2016

В 1964 году Бом и Якопини опубликовали статью , в которой они продемонстрировали, что все программы могут быть написаны с точки зрения только трех управляющих структур: структура последовательности, структура выбора и структура повторения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...