HCC!Forth
27 nov 2002


Compilerende woorden

Albert Nijhof
1. Rekenen in Forth
2. Programmeren in Forth
3. Definiėrende woorden
4. Compilerende woorden

Interpreteren en compileren

Als je interactief in Forth aan het werk bent, zit je in een lus die er ongeveer zo uitziet:
: QUIT
  BEGIN Accepteer-input-van-het-toetsenbord
        BEGIN READEVAL
              Is-alle-input-afgehandeld?
        UNTIL
  AGAIN ; 
In een plaatje:

waarin READEVAL er zo uitziet:
: READEVAL
  Pak-het-volgende-woord-uit-de-input
  Zoek-zijn-sleutel
  Gevonden?
  IF   EXECUTE EXIT
  THEN Is-het-misschien-een-getal?
  IF   Zet-het-op-stack EXIT
  THEN ERROR ;
EXIT ( -- ) Verlaat de definitie.

Maar de Forth interpreter is tegelijkertijd de Forth compiler. Forth houdt bij of hij in de interpret toestand (state=0) of in de compiletoestand (state<>0) zit.

: READEVAL
  Pak-het-volgende-woord-uit-de-input
  Zoek-zijn-sleutel
  Gevonden?
  IF   STATE @
       IF   Compileer-het EXIT       \ ***
       THEN EXECUTE EXIT
  THEN Is-het-misschien-een-getal?
  IF   STATE @
       IF   Compileer-het EXIT       \ ***
       THEN Zet-het-op-stack EXIT
  THEN ERROR ;

De QUIT met daarin deze READEVAL vormt de interpreter en compiler van Forth. Dat is dus een heel eenvoudige zaak.

: en ;


Nu wordt ook duidelijk wat «:» zal moeten doen: Een header aanmaken en het systeem in de compileertoestand zetten. Als het nieuwe woord later uitgevoerd wordt, zorgt zijn Doer er op zijn beurt voor dat de gecompileerde lijst achter de header uitgevoerd wordt.
: : CREATE TRUE STATE ! DOES> Voer-de-gecompileerde-woorden-uit ;
Er is nog een probleempje, want hoe is het nu mogelijk om de compileertoestand te verlaten als hij eenmaal aangezet is? Om STATE weer op nul te zetten moet er een woord uitgevoerd worden dat dat doet, maar alle woorden worden gecompileerd, dus dat lukt niet meer.
De oplossing is dat het mogelijk is om woorden te 'merken' met het stempel IMMEDIATE. IMMEDIATE woorden worden altijd uitgevoerd, ook als Forth in de compileertoestand verkeert. READEVAL moet dus nog iets aangepast worden om deze woorden te kunnen herkennen:
: READEVAL
  Pak-het-volgende-woord-uit-de-input
  Zoek-zijn-sleutel
  Gevonden?
  IF   STATE @ Niet-immediate? AND     \ ***
       IF   Compileer-het EXIT
       THEN EXECUTE EXIT
  THEN Is-het-misschien-een-getal?
  IF   STATE @
       IF   Compileer-het EXIT
       THEN Zet-het-op-stack EXIT
  THEN ERROR ;
Nu de punt-komma. Die moet natuurlijk immediate zijn. Hij compileert exit en schakelt terug naar de interactieve toestand:
: ; ( -- )
  Compileer-EXIT
  0 STATE ! ; IMMEDIATE
De punt-komma is een compilerend woord.

1. Rekenen in Forth
2. Programmeren in Forth
3. Definiėrende woorden
4. Compilerende woorden


© 2007 HCC!Forth