Jednym z modeli obliczeniowych jest maszyna RAM - maszyna o swobodnym dostępie do pamięci; jej schemat funkcjonalny został przedstawiony poniżej.
Ponieważ komputer, na którym działa emulator, ma ograniczenia fizyczne, więc i model maszyny RAM musiał się im poddać. Pojemność rejestrów jest limitowana przez implementację JavaScript, ich liczba została ustalona na 1024, co wydaje się rozsądną liczbą liczba rejestrów jest ograniczona tylko przez zasoby systemowe. Pojemność taśm jest ograniczona przez zasoby systemowe. Wersja konsolowa jest pozbawiona tych ograniczeń.
Maszyna RAM interpretuje 12 instrukcji, dla większości z nich sumator jest domyślnym argumentem.
1 | load | =i | r0 | := i |
load | p | r0 | := rP | |
load | *p | r0 | := r[rP] | |
2 | store | p | rP | := r0 |
store | *p | r[rP] | := r0 | |
3 | add | =i | r0 | := r0 + i |
add | p | r0 | := r0 + rP | |
add | *p | r0 | := r0 + r[rP] | |
4 | sub | =i | r0 | := r0 - i |
sub | p | r0 | := r0 - rP | |
sub | *p | r0 | := r0 - r[rP] | |
5 | mult | =i | r0 | := r0 * i |
mult | p | r0 | := r0 * rP | |
mult | *p | r0 | := r0 * r[rP] | |
6 | div | =i | r0 | := floor(r0 / i) |
div | p | r0 | := floor(r0 / rP) | |
div | *p | r0 | := floor(r0 / r[rP]) | |
7 | read | p | rP | := wartość z taśmy wejściowej |
read | *p | r[rP] | := wartość z taśmy wejściowej | |
8 | write | =i | zapisz na taśmę wyjściową i | |
write | p | zapisz na taśmę wyjściową rP | ||
write | *p | zapisz na taśmę wyjściową r[rP] | ||
9 | jump | etykieta | skocz do etykiety | |
10 | jzero | etykieta | skocz do etykiety gdy r0 = 0 | |
11 | jgtz | etykieta | skocz do etykiety gdy r0 > 0 | |
12 | halt | zatrzymaj program |
Uwagi wstępne:
LOAD 1
to to samo, co load 1
, Load 1
itd.;
Pojedyncza linia programu składa się z następujących elementów:
numer_linii etykieta: instrukcja operand # komentarz
jump
, jzero
, jgtz
). Nazwy etykiet nie mogą się powtarzać.jump etykieta2 # X # pomijany kod etykieta1: # pomijany kod etykieta2: halt # X
1 etykieta: # brak instrukcji 2 load 1 3 ...ale kompilator ją dopuszcza. Automatycznie wstawia instrukcję NOP (ang. No OPeration), czyli nie-rób-nic - precyzyjniej rzecz ujmując, instrukcja NOP zwiększa wskaźnik instrukcji, ale nie wpływa na stan pamięci ani taśm wejściowej i wyjściowej. Dzięki temu zabiegowi kilka etykiet może wskazywać na ten sam fragment kodu.
load 0 store 0 div =1 mult =1 add =0 sub =0
halt
)# r0 = 0, r1 = 333, r2 = 222, r3 = 2 load =777 # r0 = 777 natychmiastowe load 1 # r0 = r1 = 333 bezpośrednie load *3 # r0 = r[r3] = r[2] = 222 pośrednie