Forthin tietorakenne on ”sanakirja”, joka kartoittaa ”sanat” suoritettavaan koodiin tai nimettyihin tietorakenteisiin. Sanakirja on sijoitettu muistiin linkitettyjen listojen puuksi, jonka linkit etenevät viimeisimmästä (viimeisimmästä) määritellystä sanasta vanhimpaan, kunnes sentinel-arvo, yleensä NOLLAOSOITIN, löytyy. Kontekstikytkin aiheuttaa listahaun käynnistymisen eri lehdeltä. Linkitetty listahaku jatkuu haaran sulautuessa päärunkoon, joka johtaa lopulta takaisin sentineliin, juureen.Sanakirjoja voi olla useita. Harvoissa tapauksissa, kuten metakokonaisuudessa, sanakirja saattaa olla irrallinen ja itsenäinen.Vaikutus muistuttaa pesivien nimiavaruuksien vaikutusta ja voi ylikuormittaa avainsanoja asiayhteydestä riippuen.
määritelty sana koostuu yleensä päästä ja vartalosta, jonka pää koostuu nimikentästä (NF) ja linkkikentästä (LF), sekä vartalosta, joka koostuu koodikentästä (CF) ja parametrikentästä (PF).
sanakirjamerkinnän päätä ja runkoa käsitellään erikseen, koska ne eivät välttämättä ole vierekkäisiä. Esimerkiksi kun Forth-ohjelma käännetään uudelle alustalle, pää voi jäädä kokoavalle tietokoneelle, kun taas keho siirtyy uudelle alustalle. Joissakin ympäristöissä (kuten sulautetuissa järjestelmissä) päät vievät muistia tarpeettomasti. Jotkut ristikääntäjät voivat kuitenkin laittaa päitä kohteeseen, jos itse kohteen odotetaan tukevan vuorovaikutteista Forthia.
Dictionary entryEdit
sanakirjamerkinnän tarkkaa muotoa ei ole määrätty, ja toteutukset vaihtelevat. Tietyt komponentit ovat kuitenkin lähes aina läsnä, vaikka tarkka koko ja järjestys voivat vaihdella. Rakenteeksi kuvattu sanakirjamerkintä saattaa näyttää tältä:
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
nimikenttä alkaa etuliitteellä, joka antaa sanan nimen pituuden (tyypillisesti enintään 32 tavua), sekä useita bittejä lipuille. Tällöin sanan nimen merkistö seuraa etuliitettä. Forthin toteutuksesta riippuen linjauksessa voi olla yksi tai useampi NUL (’\0’) tavu.
linkkikentässä on osoitin aiemmin määriteltyyn sanaan. Osoitin voi olla suhteellinen siirtymä tai absoluuttinen osoite, joka osoittaa seuraavaksi vanhimpaan sisarukseen.
koodikenttäosoitin on joko sen sanan osoite, joka suorittaa koodin tai datan parametrikentässä, tai sen konekoodin alku, jonka prosessori suorittaa suoraan. Kaksoispisteen määritettyjen sanojen osalta koodikenttäosoitin osoittaa sanaan, joka tallentaa nykyisen Forth instruction Pointerin (IP) palautuspinoon ja lataa IP uudella osoitteella, josta sanojen suoritusta voidaan jatkaa. Tämä on sama kuin mitä prosessorin puhelu – /palautusohjeet tekevät.
compilereditin rakenne
itse kääntäjä ei ole monoliittinen ohjelma. Se koostuu neljästoista sanoista, jotka näkyvät järjestelmälle ja joita ohjelmoija voi käyttää. Näin ohjelmoija voi muuttaa kääntäjän sanoja erityistarkoituksiin.
nimikentän ”compile time” – lippu on asetettu sanoille, joilla on ”compile time” – käyttäytyminen. Useimmat yksinkertaiset sanat suorittavat saman koodin riippumatta siitä, kirjoitetaanko ne komentoriville vai upotetaanko ne koodiin. Näitä kootessaan kääntäjä yksinkertaisesti sijoittaa koodin tai kierteisen osoittimen sanaan.
klassisia esimerkkejä käännösajan sanoista ovat ohjausrakenteet, kuten IF
ja WHILE
. Lähes kaikki Forthin ohjausrakenteet ja lähes kaikki sen kääntäjä toteutetaan kääntöaikaisina sanoina. Lukuun ottamatta joitakin harvoin käytettyjä ohjausvirtasanoja, joita esiintyy vain muutamissa toteutuksissa, kuten ehdollisessa palautuksessa, kaikki Forthin ohjausvirtasanat suoritetaan kokoamisen aikana kokoamaan erilaisia alkukantaisten sanojen yhdistelmiä sekä niiden haaraosoitteita. Esimerkiksi IF
ja WHILE
, ja näiden kanssa sopivat sanat muodostavat BRANCH
(ehdoton haara) ja ?BRANCH
(poksauta arvo pinosta, ja haara, jos se on epätosi). Lasketut silmukkaohjauksen virtaussanat toimivat samalla tavalla, mutta asettavat alkeellisten sanojen yhdistelmiä, jotka toimivat laskurilla ja niin edelleen. Kokoamisen aikana datapinoa käytetään tukemaan ohjausrakenteen tasapainottamista, pesintää ja haaraosoitteiden taustapalauttamista. Pätkä:
... DUP 6 < IF DROP 5 ELSE 1 - THEN ...
koottaisiin seuraavaan järjestykseen määritelmän sisällä:
... DUP LIT 6 < ?BRANCH 5 DROP LIT 5 BRANCH 3 LIT 1 - ...
BRANCH
jälkeiset numerot edustavat suhteellisia hyppyosoitteita. LIT
on alkukantainen sana, jolla työnnetään” kirjaimellinen ” luku datapinoon.
Kokoomatilaa ja tulkintatilaa
sana :
(kaksoispiste) jäsentää nimen parametrina, luo sanakirjamerkinnän (kaksoispiste määritelmä) ja siirtyy kokoomatilaan. Tulkki jatkaa tilan rajaamien sanojen lukemista käyttäjän syöttölaitteelta. Jos sana löytyy, tulkitsija toteuttaa sanaan liittyvän kokoamissemantiikan tulkintasemantiikan sijaan. Sanan oletussemantiikka on liittää sen tulkintasemantiikka nykyiseen määritelmään.
sana ;
(puolipiste) päättää nykyisen määritelmän ja palaa tulkintatilaan. Se on esimerkki sanasta, jonka kokoamissemantiikka eroaa oletussemantiikasta. ;
(puolipylväs), useimmat ohjausvirtasanat ja useat muut sanat ovat määrittelemättömiä ANS Forthissa, eli niitä saa käyttää vain määritelmien sisällä eikä interaktiivisella komentorivillä.
tulkintatilaa voidaan muuttaa manuaalisesti sanoilla (right-bracket), jotka tulevat vastaavasti tulkkaustilaan tai kokoamistilaan. Näitä sanoja voidaan käyttää sanan
LITERAL
kanssa laskemaan arvo kokoamisen aikana ja lisäämään laskettu arvo nykyiseen kaksoispisteen määritelmään. LITERAL
sisältää koostesemantiikan, jolla voidaan ottaa objekti datapinosta ja liittää semantiikka nykyiseen kaksoispistemääritelmään, jolloin kyseinen objekti sijoitetaan datapinoon.
tulkin nykytila voidaan lukea Lipusta STATE
, joka sisältää arvon Tosi kun on kokoomatilassa ja epätosi muuten. Näin voidaan toteuttaa niin sanottuja tilaviisaita sanoja, joiden käyttäytyminen muuttuu tulkin nykytilan mukaan.
välitön sanamuoto
sana IMMEDIATE
merkitsee viimeisimmän kaksoispistemääritelmän välittömäksi sanaksi, korvaten tehokkaasti sen koostesemantiikan tulkintasemantiikalla. Välittömät sanat suoritetaan yleensä kokoamisen aikana, ei käännettynä, mutta ohjelmoija voi ohittaa tämän kummassa tahansa tilassa. ;
on esimerkki välittömästä sanasta. ANS Forthissa sana POSTPONE
ottaa parametriksi nimen ja liittää nimetyn sanan kokoamissemantiikan nykyiseen määritelmään, vaikka sana olisi merkitty välittömästi. Forth-83 määritteli erilliset sanat COMPILE
ja pakottamaan ei-välittömien sanojen kokoamisen.
nimeämättömät sanat ja toteutus tokensEdit
in Ans Forth, nimeämättömät sanat voidaan määritellä sanalla :NONAME
, joka kokoaa seuraavat sanat seuraavaan ;
(puolipylväs) ja jättää suoritustunnuksen datapinoon. Suorituspaletti tarjoaa kootuille semantiikoille läpinäkymättömän kahvan, joka muistuttaa C-ohjelmointikielen funktiosoittimia.
Suoritusvarakkeet voidaan tallentaa muuttujiin. Sana EXECUTE
ottaa datapinosta suoritustunnuksen ja suorittaa siihen liittyvät semantiikat. Sana COMPILE,
(compile-pilkku) ottaa suoritustunnuksen datapinosta ja liittää siihen liittyvän semantiikan nykyiseen määritelmään.
sana '
(rasti) ottaa parametriksi sanan nimen ja palauttaa datapinoon kyseiseen sanaan liittyvän suoritustunnuksen. Tulkintatilassa ' RANDOM-WORD EXECUTE
vastaa RANDOM-WORD
.
Edit
sanat :
(kaksoispiste), POSTPONE
'
(tick) ovat esimerkkejä jäsennyssanoista, jotka ottavat argumenttinsa datapinon sijaan käyttäjän syöttölaitteesta. Toinen esimerkki on sana (
(paren), joka lukee ja jättää huomiotta seuraavat sanat aina seuraavaan oikeaan sulkeesiin asti ja sisältää sen, ja jota käytetään kommenttien sijoittamiseen kaksoispisteen määritelmään. Vastaavasti sanaa \
(backslash) käytetään kommenteista, jotka jatkuvat nykyisen rivin loppuun. Jotta teksti jäsennettäisiin oikein, (
(paren) ja \
(backslash) on erotettava välilyönneillä seuraavasta kommenttitekstistä.
Codeeditin rakenne
useimmissa Neljännissä järjestelmissä koodimäärityksen runko koostuu joko konekielestä tai jonkinlaisesta kierteisestä koodista. Alkuperäinen Forth, joka noudattaa epävirallista FIG-standardia (Forth Interest Group), on TIL (kierteitetty Tulkkauskieli). Tätä kutsutaan myös epäsuorakierteiseksi koodiksi, mutta myös suorakierteiset ja alirutiinikierteiset linnakkeet ovat yleistyneet nykyaikana. Nopeimmat Modernit Forthit, kuten SwiftForth, VFX Forth ja iForth, kokoavat Forthin natiivikonekoodiin.
Data objectsEdit
kun sana on muuttuja tai muu tietoobjekti, CF osoittaa runtime-koodia, joka liittyy sen luoneeseen määrittelevään sanaan. Määrittelevällä sanalla on ominaisuus ”määrittelykäyttäytyminen” (sanakirjamerkinnän luominen sekä mahdollisesti tietoavaruuden jakaminen ja alustaminen) ja se määrittää myös tämän määrittelevän sanan rakentaman sanaluokan ilmentymän käyttäytymisen. Esimerkiksi siksi, että:
VARIABLE
nimeää aloittamattoman, yhden solun muistipaikan. Instance behavior of aVARIABLE
palauttaa osoitteensa pinoon.CONSTANT
nimeää arvon (määritelty argumentiksiCONSTANT
). Instanssikäyttäytyminen palauttaa arvon.CREATE
nimeää sijainnin; tälle paikalle voidaan jakaa avaruus tai se voidaan asettaa sisältämään merkkijono tai muu alustusarvo. Instanssikäyttäytyminen palauttaa tämän tilan alun osoitteen.
Forth tarjoaa myös toiminnon, jonka avulla ohjelmoija voi määritellä uusia sovelluskohtaisia määrittelysanoja, määrittäen sekä mukautetun määrittelykäyttäytymisen että instanssikäyttäytymisen. Joitakin esimerkkejä ovat pyöreät Puskurit, nimetyt bitit I / O-portilla ja automaattisesti indeksoidut taulukot.
näillä ja vastaavilla sanoilla määritellyt Tietoobjektit ovat laajuudeltaan globaaleja. Muissa kielissä paikallisten muuttujien tarjoama funktio saadaan Forthin datapinosta (tosin Forthissa on myös reaalisia paikallisia muuttujia). Forth-ohjelmointityyli käyttää hyvin vähän nimettyjä dataobjekteja muihin kieliin verrattuna; tyypillisesti tällaisia tietoobjekteja käytetään sisältämään tietoja, joita käytetään useilla sanoilla tai tehtävillä (moniajetussa toteutuksessa).
Forth ei takaa tietotyypin käytön johdonmukaisuutta; ohjelmoijan vastuulla on käyttää asianmukaisia operaattoreita arvojen noutamiseen ja tallentamiseen tai muiden toimintojen suorittamiseen datalle.