strona główna

Emulator maszyny RAM - wersja konsolowa

Emulator maszyny RAM w wersji konsolowej został napisany w języku Python; wersja interpretera na której powstał to 2.2.1, niestety programy nie był testowany na żadnych wcześniejszych wesjach.

Wersja konsolowa, w przeciwieństwie do wersji JavaScript-owej, nie posiada ograniczeń co do ilości rejestrów, ani zakresu liczb przechowywanych w rejestrach.

Kod programu dla maszyny RAM musi zostać zapisany w pliku tekstowym. Podczas wykonywania kodu emulator wypisuje linijkę z pliku (poprzedzając ją numerem) w której znajduje się instrukcja którą wykonał, oraz, w następnej linii, zawartość rejestrów. Wyświetlane są tylko te rejestry, do których choć raz odwołano się w programie; zawsze wyświetalny jest akumulator. Gdy program się zakończy, wypisywana jest zawartość taśm - kolejno - wejściowej i wyjściowej.

Gdy emulator napotka instrukcję read prosi użytkownika o wpisanie wartości, która znajduje się na taśmie wejściowej.

Do działania potrzebne są następujące pliki:

Wywołanie programu jest następujące ($ - znak zachęty interpretera poleceń):

$ python2 main.py --file=źródło programu

Przykładowy wynik pracy programu dla funkcji obliczającej silnię (program znajduje się wśród przykładów).

$ python2 main.py --file=factorial.txt
Parsing factorial.txt file...
16: 	read  1         # r1 = n
read: 4
r0=0 r1=4 
18: 	load =0         #
r0=0 r1=4 
19: 	sub   1         #
r0=-4 r1=4 
20: 	jgtz  negative  # n < 0?
r0=-4 r1=4 
22: 	load =1         # r2 = res = 1
r0=1 r1=4 
23: 	store 2         #
r0=1 r1=4 r2=1 
25: 	load  1
r0=4 r1=4 r2=1 
26: while:
r0=4 r1=4 r2=1 
27: 	jzero endwhile
r0=4 r1=4 r2=1 
28: 	mult  2
r0=4 r1=4 r2=1 
29: 	store 2         # res = res * n
r0=4 r1=4 r2=4 
31: 	load  1
r0=4 r1=4 r2=4 
32: 	sub  =1
r0=3 r1=4 r2=4 
33: 	store 1         # n = n-1
r0=3 r1=3 r2=4 
34: 	jump while
r0=3 r1=3 r2=4 
26: while:
r0=3 r1=3 r2=4 
27: 	jzero endwhile
r0=3 r1=3 r2=4 
28: 	mult  2
r0=12 r1=3 r2=4 
29: 	store 2         # res = res * n
r0=12 r1=3 r2=12 
31: 	load  1
r0=3 r1=3 r2=12 
32: 	sub  =1
r0=2 r1=3 r2=12 
33: 	store 1         # n = n-1
r0=2 r1=2 r2=12 
34: 	jump while
r0=2 r1=2 r2=12 
26: while:
r0=2 r1=2 r2=12 
27: 	jzero endwhile
r0=2 r1=2 r2=12 
28: 	mult  2
r0=24 r1=2 r2=12 
29: 	store 2         # res = res * n
r0=24 r1=2 r2=24 
31: 	load  1
r0=2 r1=2 r2=24 
32: 	sub  =1
r0=1 r1=2 r2=24 
33: 	store 1         # n = n-1
r0=1 r1=1 r2=24 
34: 	jump while
r0=1 r1=1 r2=24 
26: while:
r0=1 r1=1 r2=24 
27: 	jzero endwhile
r0=1 r1=1 r2=24 
28: 	mult  2
r0=24 r1=1 r2=24 
29: 	store 2         # res = res * n
r0=24 r1=1 r2=24 
31: 	load  1
r0=1 r1=1 r2=24 
32: 	sub  =1
r0=0 r1=1 r2=24 
33: 	store 1         # n = n-1
r0=0 r1=0 r2=24 
34: 	jump while
r0=0 r1=0 r2=24 
26: while:
r0=0 r1=0 r2=24 
27: 	jzero endwhile
r0=0 r1=0 r2=24 
36: endwhile:
r0=0 r1=0 r2=24 
37: 	write 2         # return
r0=0 r1=0 r2=24 
38: negative:
r0=0 r1=0 r2=24 
39: 	halt
r0=0 r1=0 r2=24 
input tape : [4]
output tape: [24]