2010-09-14 5 views
15

Jahren zu lösen, ich habe gehört, dass jemand im Begriff war, zu zeigen, dass jedes Computer-Programm mit nur drei Befehlen gelöst werden könnte:Minimal-Befehlssatz vor einem Problem mit einem Computerprogramm

  • Zuordnung
  • Conditional
  • Loop

Bitte ich würde gerne Ihre Meinung hören. Ich meine, jeden Algorithmus als Computerprogramm darzustellen. Stimmst du dem zu?

+0

Was meinst du mit bedingt? Ich nehme an, die Zuweisung behandelt Ganzzahlen? Ich würde denken, wenn Sie Schleifen haben, brauchen Sie nicht wirklich Bedingungen, da Bedingungen nur ein Sonderfall einer Schleife sind. – recursive

+2

Zumindest brauchen Sie auch etwas wie "inc". – sepp2k

+0

@ sepp2k Sie wirklich nicht.Sie könnten ein Konstrukt wie "if (a == 1) a = 2 elseif (a == 2) a = 3 elseif (a == 3) a = 4" usw. erstellen. Dies sind nur Bedingungen und Zuweisungen. –

Antwort

20

Keine Notwendigkeit. Der minimale theoretische Computer benötigt nur eine Anweisung. Sie heißen One Instruction Set Computers (OISC for short, kinda like the ultimate RISC).

Es gibt zwei Arten. Die erste ist eine theoretisch "reine" Befehlsmaschine, in der die Anweisung wirklich wie eine normale Anweisung in normalen CPUs funktioniert. Die Anweisung lautet normalerweise:

subtract and branch if less than zero 

oder Variationen davon. Die wikipedia article haben Beispiele, wie diese einzelne Anweisung verwendet werden kann, um Code zu schreiben, der andere Anweisungen emuliert. Der zweite Typ ist nicht theoretisch rein. Es ist die transfer triggered architecture (Wikipedia wieder, sorry). Diese Architekturfamilie wird auch als Move-Maschine bezeichnet und ich habe sie selbst entworfen und gebaut.

Einige betrachten verschieben Maschinen betrügen, da die Maschine tatsächlich alle regulären Anweisungen haben nur, dass sie Speicher zugeordnet sind, anstatt Teil des Opcodes. Aber Move-Maschinen sind nicht nur theoretisch, sie sind praktisch (wie ich schon sagte, habe ich selbst gebaut). Es gibt sogar eine im Handel erhältliche Familie von CPUs, die von Maxim gebaut wurden: MAXQ. Wenn Sie sich den MAXQ-Befehlssatz anschauen (sie nennen ihn Übertragungssatz, da es wirklich nur einen Befehl gibt, den ich normalerweise als Registersatz bezeichne), werden Sie sehen, dass die MAXQ-Assemblierung eher wie eine standardmäßige akkumulatorbasierte Architektur aussieht.

+3

Obwohl es eine Anweisung ist, sind es semantisch und algorithmisch immer noch 3 Operationen: eine Zuweisung, eine Verzweigungsoperation und eine Bedingung. –

+3

@Vivin stimme ich nicht zu. Es ist eine einzige Anweisung. In ähnlicher Weise ist die Addition eine einzelne Operation, obwohl sie mehrere Teile aufweist (Summe übereinstimmende Bits, Do Übertragungen, Wiederholung bis Ende). Viele Operationen können als aus mehreren kleineren Operationen zusammengesetzt betrachtet werden, aber das ist hier irrelevant. Es ist nicht so, dass es eine Subtraktionsoperation und eine separate Verzweigungsoperation gibt. Sie müssen zusammen durchgeführt werden. –

+0

Vivian und Strilanc, ich denke, das ist ein bisschen wie die Geschichte von dem Ei und der Henne. Ich verstehe euch beide, danke für eure Kommentare. –

3

Der Minimalsatz ist ein einzelner Befehl, aber Sie haben ein passendes ein, zum Beispiel wählen - One instruction set computer

Als ich studierte, wir einen solchen „Computer“ verwendet faktorielles zu berechnen, nur eine einzige Anweisung verwendet:

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

Bedeutung:

if((Memory[A] -= Memory[B]) < 0) goto C 
// (Wikipedia has a slightly different definition) 
+2

Obwohl es eine Anweisung ist, sind es semantisch und algorithmisch immer noch 3 Operationen: eine Zuweisung, eine Verzweigungsoperation und eine Bedingung. –

+0

Mindestens zwei Personen (einschließlich mir) basierten Lösungen zu [Code Golf: Kürzester Turing-Komplett-Interpreter.] (Http://stackoverflow.com/questions/1053931/) auf diese Dinge. – dmckee

5

Dies ist eine Folge der Turing Completeness ist, das ist etwas, das viele Jahrzehnt gegründet wurde s vor.

Alan Turing, der berühmte Computerwissenschaftler, bewies, dass jede berechenbare Funktion mit einem Turing Machine berechnet werden konnte. Eine Turingmaschine ist ein sehr einfaches theoretisches Gerät, das nur wenige Dinge kann. Er kann auf ein Band (dh Speicher) lesen und schreiben, einen internen Zustand beibehalten, der durch den aus dem Speicher gelesenen Inhalt geändert wird, und den internen Zustand und die letzte gelesene Speicherzelle verwenden, um zu bestimmen, in welche Richtung das Band bewegt werden soll Speicherzelle.

Die Operationen Zuweisung, Bedingung und Schleife reichen aus, um eine Turing-Maschine zu simulieren. Das Lesen und Schreiben von Speicher und das Aufrechterhalten des Zustands erfordert eine Zuweisung.Das Ändern der Bandrichtung basierend auf dem Status und dem Speicherinhalt erfordert Bedingungen und Schleifen. "Loops" sind tatsächlich etwas höher als das, was tatsächlich benötigt wird. Alles was wirklich benötigt wird ist, dass der Programmablauf irgendwie zurückspringen kann. Dies bedeutet, dass Sie Schleifen erstellen können, wenn Sie möchten, aber die Sprache muss kein explizites Schleifenkonstrukt haben.

Da diese drei Operationen die Simulation einer Turing-Maschine ermöglichen und eine Turing-Maschine in der Lage ist, jede berechenbare Funktion zu berechnen, ist jede Sprache, die diese Operationen bereitstellt, auch in der Lage, jede berechenbare Funktion zu berechnen.

Edit: Und wie andere Beantworter darauf hingewiesen haben, müssen diese Operationen nicht diskret sein. Sie können eine einzelne Anweisung erstellen, die alle drei dieser Dinge (Zuweisen, Vergleichen und Verzweigen) so ausführt, dass sie eine Turing-Maschine selbst simulieren kann.

0

1964 Bohm und Jacopini veröffentlichten eine paper, in dem sie gezeigt, dass alle Programme im Hinblick auf die nur drei Kontrollstrukturen geschrieben werden könnten: die Sequenzstruktur, die Selektionsstruktur und die Wiederholungsstruktur.

1

Implementations

Diese Antwort auf interessante Implementierungen von einzelnen Befehlssatz CPUs, Compiler und Montierer konzentrieren.

movfuscator

https://github.com/xoreaxeaxeax/movfuscator

Kompiliert Code C nur mov x86-Instruktionen verwenden, in ganz konkret zeigen, dass ein einzelner Befehl genügt.

Die Turing Vollständigkeit scheint in einem Papier bewährt zu haben: https://www.cl.cam.ac.uk/~sd601/papers/mov.pdf

subleq

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

Siehe auch

https://softwareengineering.stackexchange.com/questions/230538/what-is-the-absolute-minimum-set-of-instructions-required-to-build-a-turing-comp/325501

0

Programmierer mit Haskell könnte argumentieren, dass Sie nur die Contional und Schleife, da Zuweisungen benötigen, und wandelbaren Zustand, existieren nicht in Haskell.