Forth (programming language)

De basisgegevensstructuur van Forth is het “woordenboek” dat “woorden” toewijst aan uitvoerbare code of benoemde datastructuren. Het woordenboek is in het geheugen ingedeeld als een boom van gekoppelde lijsten met de links die gaan van het laatste (meest recente) gedefinieerde woord naar het oudste, totdat een sentinel waarde, meestal een NULL pointer, wordt gevonden. Een contextschakelaar zorgt ervoor dat een lijstzoekopdracht begint bij een ander blad. Een gelinkte lijstzoekactie gaat verder als de branch fuseert met de hoofdstam die uiteindelijk leidt naar de sentinel, de root.Er kunnen verschillende woordenboeken zijn. In zeldzame gevallen, zoals meta-compilatie, kan een woordenboek geïsoleerd en stand-alone zijn.Het effect lijkt op dat van nesting namespaces en kan trefwoorden overbelasten, afhankelijk van de context.

een gedefinieerd woord bestaat over het algemeen uit head en body, waarbij de head bestaat uit het naamveld (NF) en het linkveld (LF), en body bestaat uit het codeveld (CF) en het parameterveld (PF).

Head en body van een woordenboekvermelding worden afzonderlijk behandeld omdat ze mogelijk niet aaneengesloten zijn. Bijvoorbeeld, wanneer een Forth programma opnieuw gecompileerd wordt voor een nieuw platform, kan het hoofd op de compilerende computer blijven, terwijl het lichaam naar het nieuwe platform gaat. In sommige omgevingen (zoals ingebedde systemen) bezetten de hoofden onnodig geheugen. Sommige cross-compilers kunnen echter koppen in het doel plaatsen als het doel zelf naar verwachting een interactieve Forth ondersteunt.

Dictionary entryEdit

het exacte formaat van een dictionary entry is niet voorgeschreven, en implementaties variëren. Echter, bepaalde componenten zijn bijna altijd aanwezig, hoewel de exacte grootte en volgorde kan variëren. Beschreven als een structuur, zou een woordenboekvermelding er zo uit kunnen zien:

 structure byte: flag \ 3bit flags + length of word's name char-array: name \ name's runtime length isn't known at compile time address: previous \ link field, backward ptr to previous word address: codeword \ ptr to the code to execute this word any-array: parameterfield \ unknown length of data, words, or opcodes end-structure forthword

het veld Naam begint met een voorvoegsel dat de lengte van de naam van het woord geeft (meestal tot 32 bytes), en meerdere bits voor vlaggen. De karakterrepresentatie van de naam van het woord volgt dan het voorvoegsel. Afhankelijk van de specifieke implementatie van Forth kunnen er één of meer NUL (‘\0’) bytes zijn voor uitlijning.

het linkveld bevat een verwijzing naar het eerder gedefinieerde woord. De pointer kan een relatieve verplaatsing of een absoluut adres zijn dat naar de volgende oudste broer of zus wijst.

De codeveldwijzer is ofwel het adres van het woord dat de code of gegevens in het parameterveld zal uitvoeren, ofwel het begin van de machinecode die de processor direct zal uitvoeren. Voor dubbele punt gedefinieerde woorden, de code veld pointer wijst naar het woord dat de huidige Forth instructie pointer (IP) zal opslaan op de return stack, en laad het IP met het nieuwe adres van waaruit de uitvoering van woorden voort te zetten. Dit is hetzelfde als wat de call/return instructies van een processor doen.

structuur van de compilerEdit

de compiler zelf is geen monolithisch programma. Het bestaat uit vierde woorden zichtbaar voor het systeem, en bruikbaar door een programmeur. Hierdoor kan een programmeur de woorden van de compiler wijzigen voor speciale doeleinden.

De” compile time ” vlag in het Naam veld is ingesteld voor woorden met “compile time” gedrag. De meeste eenvoudige woorden voeren dezelfde code uit, of ze nu worden getypt op een commandoregel, of ingebed in code. Bij het compileren van deze, plaatst de compiler gewoon code of een threaded pointer naar het woord.

De klassieke voorbeelden van compile-time woorden zijn de besturingsstructuren zoals IF en WHILE. Bijna alle van Forth ‘ s controle structuren en bijna alle van de compiler zijn geïmplementeerd als compilatie-tijd woorden. Afgezien van enkele zelden gebruikte control flow woorden die alleen gevonden worden in een paar implementaties, zoals een voorwaardelijke return, worden alle van Forth ‘ s control flow woorden uitgevoerd tijdens het compileren om verschillende combinaties van primitieve woorden samen met hun branch adressen te compileren. Bijvoorbeeld, IF en WHILE, en de woorden die hiermee overeenkomen, zetten BRANCH (onvoorwaardelijke branch) en ?BRANCH (pop een waarde van de stack, en branch als deze onwaar is). Getelde lus control flow woorden werken op dezelfde manier, maar het opzetten van combinaties van primitieve woorden die werken met een teller, en ga zo maar door. Tijdens het compileren wordt de data stack gebruikt om controlestructuur balanceren, nesting en back-patching van branchadressen te ondersteunen. Het fragment:

 ... DUP 6 < IF DROP 5 ELSE 1 - THEN ...

zou worden gecompileerd met de volgende reeks binnen een definitie:

 ... DUP LIT 6 < ?BRANCH 5 DROP LIT 5 BRANCH 3 LIT 1 - ...

De getallen na BRANCH vertegenwoordigen relatieve sprongadressen. LIT is het primitieve woord voor het pushen van een” letterlijke ” getal op de data stack.

Compilatiestatus en interpretatie stateEdit

het woord : (dubbele punt) ontleedt een naam als parameter, maakt een woordenboekvermelding aan (een dubbele puntdefinitie) en voert de compilatiestatus in. De interpreter blijft door spaties gescheiden woorden lezen van het invoerapparaat van de gebruiker. Als een woord wordt gevonden, voert de interpreter de compilatie-semantiek uit die bij het woord hoort, in plaats van de interpretatiesemantiek. De standaard compilatie-semantiek van een woord is om zijn interpretatie-semantiek toe te voegen aan de huidige definitie.

het woord ; (puntkomma) beëindigt de huidige definitie en keert terug naar interpretatiestatus. Het is een voorbeeld van een woord waarvan de compilatie semantiek verschilt van de standaard. De interpretatiesemantiek van ; (puntkomma), de meeste control flow woorden en een aantal andere woorden zijn niet gedefinieerd in ANS Forth, wat betekent dat ze alleen gebruikt moeten worden binnen de definities en niet op de interactieve commandoregel.

De interpreterstatus kan handmatig worden gewijzigd met de woorden (rechterhaak) die respectievelijk interpretatiestatus of compilatiestatus invoeren. Deze woorden kunnen worden gebruikt met het woord LITERAL om een waarde te berekenen tijdens een compilatie en om de berekende waarde in de huidige dubbele puntdefinitie in te voegen. LITERAL heeft de compilatie-semantiek om een object uit de gegevensstack te halen en om semantiek toe te voegen aan de huidige dubbele puntdefinitie om dat object op de gegevensstack te plaatsen.

in ANS Forth kan de huidige status van de interpreter worden gelezen van de vlag STATE die de waarde true bevat wanneer in compilatiestatus en false anders. Dit maakt de implementatie van zogenaamde state-smart woorden met gedrag dat verandert volgens de huidige status van de interpreter.

onmiddellijke wordsEdit

het woord IMMEDIATE markeert de meest recente colondefinitie als een onmiddellijk woord, waardoor de compilatie-semantiek effectief wordt vervangen door de interpretatiesemantiek. Directe woorden worden normaal gesproken uitgevoerd tijdens het compileren, niet gecompileerd, maar dit kan door de programmeur in beide staten worden overschreven. ; is een voorbeeld van een onmiddellijk woord. In ANS Forth neemt het woord POSTPONE een naam als parameter en voegt de compilatie-semantiek van het benoemde woord toe aan de huidige definitie, zelfs als het woord onmiddellijk gemarkeerd was. Forth-83 gedefinieerde afzonderlijke woorden COMPILE en om de compilatie van respectievelijk niet-onmiddellijke en onmiddellijke woorden te forceren.

naamloze woorden en uitvoeringstokenedit

in ANS vooruit kunnen naamloze woorden worden gedefinieerd met het woord :NONAME die de volgende woorden compileert tot de volgende ; (puntkomma) en een uitvoeringstoken op de gegevensstack achterlaat. Het uitvoeringstoken verstrekt een ondoorzichtig handvat voor gecompileerde semantiek, gelijkend op de functiewijzers van de programmeertaal C.

Uitvoeringstokens kunnen worden opgeslagen in variabelen. Het woord EXECUTE neemt een uitvoeringstoken uit de datastack en voert de bijbehorende semantiek uit. Het woord COMPILE, (compile-komma) neemt een uitvoeringstoken uit de data stack en voegt de bijbehorende semantiek toe aan de huidige definitie.

het woord ' (tick) neemt de naam van een woord als parameter en retourneert het uitvoeringstoken dat aan dat woord is gekoppeld op de data stack. In interpretatietoestand is ' RANDOM-WORD EXECUTE gelijk aan RANDOM-WORD.

Edit

De woorden : (dubbele punt), POSTPONE' (vink aan) zijn voorbeelden van het ontleden van woorden die hun argumenten van het invoerapparaat van de gebruiker nemen in plaats van de gegevensstack. Een ander voorbeeld is het woord ( (paren) dat de volgende woorden leest en negeert tot en met de volgende haakjes en wordt gebruikt om opmerkingen in een dubbele punt definitie te plaatsen. Op dezelfde manier wordt het woord \ (backslash) gebruikt voor opmerkingen die doorgaan tot het einde van de huidige regel. Om correct te worden ontleed, moet ( (Paaren) en \ (backslash) door witruimte worden gescheiden van de volgende commentaartekst.

structuur van codeEdit

in de meeste Forth-systemen bestaat de inhoud van een codedefinitie uit machinetaal of een vorm van code met schroefdraad. De oorspronkelijke Forth die de informele FIG-standaard volgt (Forth Interest Group), is een TIL (Threaded Interpretive Language). Dit wordt ook wel indirect-threaded code, maar direct-threaded en subroutine Threaded Forths zijn ook populair geworden in de moderne tijd. De snelste moderne forten, zoals SwiftForth, VFX Forth en iForth, compileren Forth naar native machine code.

Data objectsEdit

wanneer een woord een variabele of ander data object is, wijst de CF naar de runtime code die geassocieerd is met het definiërende woord dat het heeft gemaakt. Een definiërend woord heeft een karakteristiek “definiërend gedrag” (het creëren van een woordenboekvermelding plus eventueel het toewijzen en initialiseren van gegevensruimte) en specificeert ook het gedrag van een instantie van de klasse woorden die door dit definiërende woord is geconstrueerd. Voorbeelden zijn::

VARIABLEnoemt een niet-geïnitialiseerde geheugenlocatie met één cel. Instance gedrag van eenVARIABLEgeeft zijn adres op de stack terug.CONSTANTgeeft een waarde aan (opgegeven als argument voorCONSTANT). Instantie gedrag retourneert de waarde.CREATEnoemt een locatie; ruimte kan op deze locatie worden toegewezen, of het kan worden ingesteld om een tekenreeks of een andere geïnitialiseerde waarde te bevatten. Instantie gedrag geeft het adres van het begin van deze spatie.

Forth biedt ook een faciliteit waarmee een programmeur nieuwe toepassingsspecifieke definiërende woorden kan definiëren, waarbij zowel een aangepast definiërend gedrag als een instantie gedrag wordt gespecificeerd. Enkele voorbeelden zijn cirkelbuffers, benoemde bits op een I / O-poort en automatisch geïndexeerde arrays.

gegevensobjecten gedefinieerd door deze en soortgelijke woorden hebben een globaal bereik. De functie van lokale variabelen in andere talen wordt geleverd door de data stack in Forth (hoewel Forth ook echte lokale variabelen heeft). Forth programmeerstijl gebruikt zeer weinig benoemde gegevensobjecten in vergelijking met andere talen; meestal worden dergelijke gegevensobjecten gebruikt om gegevens te bevatten die worden gebruikt door een aantal woorden of taken (in een multitasked implementatie).

Forth afdwingt geen consistentie van het gebruik van gegevenstype; het is de verantwoordelijkheid van de programmeur om geschikte operators te gebruiken om waarden op te halen en op te slaan of andere bewerkingen op Gegevens uit te voeren.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.