Virtuális gép, FORTH alap

Pixel5 blogja inspirált, hogy egy szemléletes FORTH alap is bemutatásra kerüljön.
Aki nem ismeri a FORTH nyelvet, ennek az alapja hogy

  • ha szám (literál) érkezik, az a verembe lesz berakva
  • ha művelet érkezik, az a veremből kiveszi a szükséges (általában 2) argumentumot és az eredményt a verembe rakja vissza

Fordított lengyel jelölés miatt sorrendi végrehajtás van, zárójelezésre és egyéb precedencia feldolgozásra itt nincs szükség.
A FORTH másik érdekes tulajdonsága, hogy néhány alapvető utasítás után az újabb FORTH kulcsszavak már FORTH nyelven deklarálhatóak.

 

Az alább bemutatott alap még keveset tud, ám ezáltal könnyen áttekinthető. És akkor jöhet a puding próbája.
Vegyünk egy egyszerű FORTH példát.

variable tesztbemenet
variable tesztkimenet

: köb DUP DUP * * ;     \ lehet akár több sorban is írva. A : és a ; a lényeg.
3 köb .
4 köb .
9 1 + 5 köb SWAP / .

5 tesztbemenet !
tesztbemenet @ DUP * tesztkimenet !
3 köb .
tesztkimenet @ .

Ellenőrizzük, hogy tényleg FORTH-e?

$ cat pelda.fs | gforth

Igen, az. És akkor nézzük meg, hogyan fordítja le egy egyszerű FORTH fordító.

Itt látható a compiler, amely az alábbi egyszerű forráskódot bytekóddá konvertálja.
Itt pedig egy egyszerű futtatókörnyezet, amely a FORTH logikájára épülő bytekódot lefuttatja.

$ rustc -O forth-compiler.rs
$ rustc -O forth-runner.rs
$ ./forth-compiler pelda.fs pelda.bin
$ ./forth-runner pelda.bin

Figyelem: ez az implementáció 7 bites számokkal dolgozik.
A valós hardvereknél memóriába ágyazott I/O segítségével kommunikálnak a külvilággal.