Minimaler Befehlssatz für Turing-Vollständigkeit

Gast #3584461
Lesenswert?
• ▲
▼
Moin,
in einer Vorlesung haben wir mal gelernt, dass eine Programmiersprache 
eine sehr geringe Anzahl von Anweisungen braucht, um Turing-vollständig 
zu sein. Ich glaube, dass es sechs Befehle waren. Stimmt das und welche 
Befehle könnten das sein? Zwei waren, soweit ich mich erinnere ein 
Additionsbefehl und ein Sprungbefehl. Dazu kommt noch ein Subtraktions- 
oder ein Negierbefehl.
Ich weiß, dass es mehrere Möglichkeiten gibt, aber welche wären das?
Brainfuсk hat acht Befehle und ist Turing-vollständig, also ist die 
maximale benötigte Anzahl eben acht.
Gast #3585536
Lesenswert?
• ▲
▼
Ok, schonmal danke für die Antworten.
Die sind aber schon eher theoretisch und die erste Antwort überschreitet 
meine mathematischen Kenntnisse ;-) Deshalb stelle ich die Frage mal 
anders: Auf welche Befehle kann man einen 'normalen' 
Assemblerbefehlssatz kürzen, um noch Turing-vollständig zu sein. Um die 
Diskussion über 'normal' zu vermeiden, nenne ich mal den AVR- oder PIC- 
(von mir aus auch X86/X64, wobei der wieder CISC ist) Befehlssatz.
Moderator #3585809
Lesenswert?
• ▲
▼
Naja, den hier

  http://en.wikipedia.org/wiki/One_instruction_set_computer#Subtract_and_branch_if_not_equal_to_zero

beschriebenen SBNZ-Befehl kannst du aus den AVR-Befehlen LD, ST, SUB und
BRNE zusammensetzen. Ein auf diese 4 Befehle abgespeckter AVR wäre damit
Turing-vollständig.

Mit weniger als 4 AVR-Befehlen ist dies vermutlich nicht möglich, da man
mindestens einen Lese- und einen Schreibbefehl für den RAM, dazu noch
einen Arithmetik- und einen bedingten Sprungbefehl benötigt. Da es diese
vier Befehlstypen nicht in Kombination gibt, wird ein Exemplar von jedem
benötigt.
#3588026
Lesenswert?
• ▲
▼
Subtraktion ist nicht notwendig, da sie als Sonderform der Addition 
nachgebildet werden kann.

IMHO ist man bereits Turing vollständig, wenn man kann
* aus dem Speicher lesen und in den Speicher schreiben
* Addition (wobei ein Inkrement bereits genügen müsste)
* Vergleich (auf 0)
* Sprung, bzw. bedingter Sprung.

Ich denke das müsste genügen. Alles andere kann dann darauf aufbauend 
implementiert werden.
#3588110
Lesenswert?
• ▲
▼
Yalu X. schrieb:

> Wie geht das?
>
> Aus Subtraktionen lässt sich relativ leicht eine Addition zaubern, aber
> für die umgekehrte Richtung fällt mir spontan nichts ein. Vielleicht
> habe ich aber auch nur gerade ein Brett vor dem Kopf :)

Ah, richtig. Anders rum.
In Douglas Hpftstters 'Gödel Escher Bach' ist das irgendwo von der Pieke 
auf durchexerziert.
#3588135
Lesenswert?
• ▲
▼
Dussel schrieb:
> Auf welche Befehle kann man einen 'normalen'
> Assemblerbefehlssatz kürzen, um noch Turing-vollständig zu sein. Um die
> Diskussion über 'normal' zu vermeiden, nenne ich mal den AVR- oder PIC-
> (von mir aus auch X86/X64, wobei der wieder CISC ist) Befehlssatz.

MOV (x86) reicht, allgemeiner "Load Constant", "Load Indexed" und "Store 
Indexed". Letztere beide dürfen auch so weit eingeschränkt sein, dass 
man damit nur auf eine gerade Adresse oder ihre ungerade Folgeadresse 
schreiben kann. Wenn man von endlichem Speicher ausgeht und ein Programm 
mit Endlosschleifen schreiben möchte braucht man zudem noch einen 
unbedingten Sprungbefehl.

Paper dazu gibts da: http://www.cl.cam.ac.uk/~sd601/papers/mov.pdf

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren