Turingovy a RAM stroje

Ve snaze definovat algoritmus si vymysleli matematici Turingovy a RAM stroje... Jde o dva různé přístupy (modely) univerzálních počítačů/programovacích jazyků/algoritmů. Jinými slovy těmito stroji lze definovat a provést libovolný algoritmus.

Model Turingova stroje byl popsán dříve, ještě před rozmachem počítačů, proto se od reálného počítače (programování) podstatně liší, na rozdíl od RAM stroje. Turing například pracuje s celou abecedou zatímco RAM (podobně jako počítač) s čísly.

Turingovy stroje

Turingův stroj je podobný konečnému automatu, ale má oboustranně nekonečnou pásku, místo symbolu ε pro prázdné znaky se používá ▢, hlava je čtecí i zapisovací a pohybuje se po pásce v obou směrech.

Turingův stoj definujeme seznamem přechodových funkcí δ, které tvoří instrukce algoritmu. Přechodová funkce má tvar:

δ(stav, znak) = (novy_stav, novy_znak, posun)

Na obrázku vlevo vidíme Turingův stroj realizující algoritmus znázorněný modrým automatem (zapis u hran znamená - čtený_znak, psaný_znak, posunu). Přechodové funkce by vypadaly následovně: δ1(S1,a)=(S1,b,+), δ2(S1,b)=(S1,a,+), δ3(S1,▢) = (S2,▢, 0).

Zobrazeny algoritmus invertuje slovo na pásce. Ve stavu S1, přepisuje 'a' na 'b' a naopak, a posunuje se doprava (+). Jakmile je slovo přečtené (narazí na prázdný znak ▢), přechází do koncového stavu S2 a dál se neposouvá.

 

RAM stroje

RAM stroje už vycházejí ze skutečných počítačů. RAM stroje mají paměť, pracují s přirozenými čísly (1,2,3,...) a   instrukce se podobají klasickýcm příkazům. Buňky paměti jsou oadresovány čísly 0 - ∞, přičemž první registr [0] se bere jako pracovní registr a registr [1] je indexový registr (pouzívá se u příkazu s hvězdičkou).

Na obrázku je znázorněný RAM stroj s vnitřním kodem, pro výpočet průměru ze sekvence čísle ukončených nulou.

Instrukce turingova stroje:

Čísla (operátory) za příkazy mají následující významy:

opvysvětlení
=6

Hodnota 6

6

Hodnota v registru [6]

Pro podmínky (JZERO, JGTZ) a JUMP je to číslo řádku 

*6

Hodnota registru [IR],
kde IR je hodnota indexivého registur [1].

Toho se využívá při procházení poli.

V následující tabulce jsou vypsány instrukce RAM stroje. Je-li za instrukcí op viz předchozí tabulka, r znamená číslo řádku a není li uvedeno nic, používá se příkaz samostatně. 

instrukcevysvětlení
READ

do pracovního registru se načte vstup a hlava se posune

[0]=IN 

WRITE

na vystup se vypíše PR

OUT=[0]

LOAD op

do pracovního registru se načte hodnota dána operátorem

[0]=op

STORE op*

pracovní registr se zapíše do registru daného operátorem =>

* op nemůže být ve tvaru =cislo

op=[0]

ADD op

sčítání - k prac.registru se přičte hodnota dana operatorem

[0]=[0]+op

SUB op

odčítání - od prac.registru se odečte hodnota dana operatorem

[0]=[0]-op

MUL op

násobení - prac.registr se vynásobí hodnotou danou operatorem

[0]=[0]*op

DIV op

celočíselné dělení - prac.registr se vydělí hodnotou danou operatorem

[0]=[0]/op

JUMP r

skok na řádek r

JZERO r

rovno nule - je-li prac.registr. roven nule, pokračuje kod na řádku r

JGTZ r

kladné - je-li prac.registr. větší než nula, pokračuje kod na řádku r

HALT r

korektní ukončení programu

 Pěkná animace RAM stroje.