Forth (programozási nyelv)

a Forth alapadatszerkezete a “szótár”, amely a “szavakat” futtatható kódra vagy megnevezett adatstruktúrákra térképezi fel. A szótár a memóriában összekapcsolt listák fájaként van elrendezve, a linkek a legfrissebb (Legutóbb) definiált szótól a legrégebbiig terjednek, amíg egy sentinel értéket, általában NULL mutatót nem találnak. A kontextuskapcsoló hatására a listakeresés egy másik levélről indul. A linkelt listakeresés folytatódik, amikor az ág beolvad a fő törzsbe, amely végül visszatér az őrszemhez, a gyökérhez.Több szótár is lehet. Ritka esetekben, mint például a meta-összeállítás, a szótár elkülöníthető és önálló lehet.A hatás hasonlít a névterek beágyazására, és a kontextustól függően túlterhelheti a kulcsszavakat.

egy meghatározott szó általában fejből és testből áll, a fej a névmezőből (NF) és a linkmezőből (LF), a test pedig a kódmezőből (CF) és a paramétermezőből (PF) áll.

a szótárbejegyzés fejét és törzsét külön kezeljük, mert nem lehetnek egybefüggőek. Például, amikor egy Forth programot újrafordítanak egy új platformra, a fej a fordító számítógépen maradhat, míg a test az új platformra megy. Bizonyos környezetekben (például beágyazott rendszerekben) a fejek feleslegesen foglalják el a memóriát. Néhány keresztfordító azonban fejeket helyezhet a célba, ha maga a cél várhatóan támogatja az interaktív Forth-t.

Dictionary entryEdit

a szótárbejegyzés pontos formátuma nincs előírva, és a megvalósítások eltérőek. Bizonyos összetevők azonban szinte mindig jelen vannak, bár a pontos méret és sorrend változhat. Struktúraként leírva egy szótárbejegyzés így nézhet ki:

 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

a név mező egy előtaggal kezdődik, amely megadja a szó nevének hosszát (általában legfeljebb 32 bájt), és több bitet a zászlók számára. A szó nevének karakterábrázolása ezután követi az előtagot. A Forth konkrét megvalósításától függően lehet egy vagy több nul (‘\0’) bájt az igazításhoz.

a hivatkozás mező tartalmaz egy mutatót a korábban definiált szóra. A mutató lehet relatív elmozdulás vagy abszolút cím, amely a következő legidősebb testvérre mutat.

a kódmező mutató vagy annak a szónak a címe lesz, amely végrehajtja a kódot vagy az adatokat a paraméter mezőben, vagy a gépi kód kezdete, amelyet a processzor közvetlenül hajt végre. Kettőspont által definiált szavak esetén a kódmező mutató arra a szóra mutat, amely az aktuális Forth utasításmutatót (IP) menti a visszatérési veremben, és betölti az IP-t azzal az új címmel, ahonnan folytatni kívánja a szavak végrehajtását. Ez ugyanaz, mint amit a processzor hívás/visszatérési utasításai tesznek.

a fordító Szerkezeteszerkesztés

maga a fordító nem monolitikus program. A rendszer számára látható és a programozó által használható negyedik szavakból áll. Ez lehetővé teszi a programozó számára, hogy speciális célokra megváltoztassa a fordító szavait.

a Név mezőben a “fordítási idő” jelző a “fordítási idő” viselkedésű szavakra van beállítva. A legtöbb egyszerű szó ugyanazt a kódot hajtja végre, függetlenül attól, hogy parancssorba van-e gépelve, vagy kódba van-e ágyazva. Ezek összeállításakor a fordító egyszerűen kódot vagy menetes mutatót helyez a szóra.

a fordítási idejű szavak klasszikus példái a vezérlő struktúrák, mint például IF és WHILE. Szinte az összes Forth vezérlési struktúrája és majdnem az összes fordítója fordítási idejű szavakként valósul meg. Néhány ritkán használt vezérlőáramú szó kivételével, amelyek csak néhány megvalósításban találhatók meg, mint például a feltételes visszatérés, az összes Forth vezérlőáramú szó a fordítás során végrehajtásra kerül, hogy a primitív szavak különböző kombinációit összeállítsák az elágazási címekkel együtt. Például, IF és WHILE, és a szavak, amelyek megfelelnek ezeknek, létre BRANCH (feltétel nélküli ág) és ?BRANCH (pop egy értéket ki a verem, és ág, ha hamis). A számított hurokvezérlő áramlási szavak hasonlóan működnek, de primitív szavak kombinációit állítják be, amelyek számlálóval működnek stb. A fordítás során az adathalmaz a vezérlőszerkezet kiegyensúlyozásának, fészkelésének és az ágcímek vissza-javításának támogatására szolgál. A kódrészlet:

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

a definíción belül a következő sorrendbe kell összeállítani:

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

a BRANCH utáni számok relatív ugrási címeket képviselnek. LIT az a primitív szó, amely egy” szó szerinti ” számot nyom az adathalmazra.

fordítási állapot és értelmezési állapotszerkesztés

a: (kettőspont) szó paraméterként elemez egy nevet, létrehoz egy szótárbejegyzést (kettőspont definíciót) és beírja a fordítási állapotot. A tolmács továbbra is szóközzel határolt szavakat olvas a felhasználói beviteli eszközről. Ha talál egy szót, a tolmács az értelmezési szemantika helyett a szóhoz társított fordítási szemantikát hajtja végre. A szó alapértelmezett fordítási szemantikája az értelmezési szemantika hozzáfűzése az aktuális definícióhoz.

a ; (fél kettőspont) szó befejezi az aktuális definíciót és visszatér az értelmezési állapotba. Ez egy példa egy szóra, amelynek összeállítási szemantikája eltér az alapértelmezetttől. A ; (félig kettőspont) értelmezési szemantikája, a legtöbb vezérlőáramú szó és számos más szó nincs definiálva az ANS Forth-ban, ami azt jelenti, hogy csak a definíciókon belül szabad használni, az interaktív parancssorban nem.

a tolmács állapota manuálisan módosítható a (jobb oldali zárójel) szavakkal, amelyek értelmezési állapotba vagy fordítási állapotba kerülnek. Ezeket a szavakat a LITERAL szóval lehet használni egy érték kiszámításához egy összeállítás során, valamint a számított érték beillesztéséhez az aktuális kettőspont definícióba. LITERAL rendelkezik a fordítási szemantikával, hogy kivegyen egy objektumot az adathalmazból, és hozzáfűzze a szemantikát az aktuális kettőspont-definícióhoz, hogy az objektumot az adathalmazra helyezze.

az ANS Forth-ban a tolmács aktuális állapota a STATE jelzőből olvasható, amely a true értéket tartalmazza fordítási állapotban és false egyébként. Ez lehetővé teszi az úgynevezett állam-intelligens szavak végrehajtását olyan viselkedéssel, amely a tolmács jelenlegi állapotának megfelelően változik.

azonnali wordsEdit

a IMMEDIATE szó a legutóbbi kettőspont-meghatározást azonnali szóként jelöli, hatékonyan helyettesítve az összeállítási szemantikát az értelmezési szemantikával. Az azonnali szavakat általában a fordítás során hajtják végre, nem fordítják le, de ezt a programozó bármelyik állapotban felülírhatja. ; egy példa egy azonnali szóra. Az ANS Forth-ban a POSTPONE szó egy nevet vesz fel paraméterként, és a megnevezett szó fordítási szemantikáját az aktuális definícióhoz fűzi, még akkor is, ha a szót azonnal megjelölték. Forth-83 meghatározott külön szavak COMPILE és a nem azonnali, illetve az azonnali szavak összeállításának kényszerítésére.

névtelen szavak és végrehajtási tokensEdit

az ANS Forth-ban a meg nem nevezett szavak a :NONAMEszóval definiálhatók, amely a következő szavakat fordítja a következő ; (fél kettőspont) értékre, és végrehajtási tokent hagy az adathalmazon. A végrehajtási token átlátszatlan fogantyút biztosít az összeállított szemantikához, hasonlóan a C programozási nyelv funkciómutatóihoz.

végrehajtási tokenek tárolhatók változókban. A EXECUTE szó végrehajtási tokent vesz az adathalmazból, és végrehajtja a kapcsolódó szemantikát. A COMPILE, (compile-comma) szó egy végrehajtási tokent vesz az adathalmazból, és a hozzá tartozó szemantikát az aktuális definícióhoz fűzi.

a ' (tick) szó egy szó nevét veszi paraméterként, és visszaadja az adott szóhoz társított végrehajtási tokent az adatkötegben. Értelmezési állapotban a ' RANDOM-WORD EXECUTE egyenértékű a RANDOM-WORDértékkel.

Edit

a szavak : (kettőspont), POSTPONE' (tick) példák olyan szavak elemzésére, amelyek argumentumaikat a felhasználói beviteli eszközről veszik az adathalmaz helyett. Egy másik példa a ( (paren) szó, amely elolvassa és figyelmen kívül hagyja a következő szavakat a következő jobb zárójelig, és a megjegyzéseket kettőspont definícióba helyezi. Hasonlóképpen, a \ (backslash) szót használják az aktuális sor végéig folytatódó megjegyzésekhez. A helyes értelmezéshez ( (paren) és \ (backslash) szóközökkel kell elválasztani a következő megjegyzés szövegétől.

A codeEdit felépítése

a legtöbb Forth rendszerben a kóddefiníció törzse vagy gépi nyelvből, vagy valamilyen menetes kódból áll. Az eredeti Forth, amely követi az informális FIG szabványt (Forth érdekcsoport), egy TIL (menetes értelmező nyelv). Ezt közvetett menetes kódnak is nevezik, de a közvetlen menetes és szubrutin menetes erődök a modern időkben is népszerűvé váltak. A leggyorsabb modern forth-ok, mint például a SwiftForth, a VFX Forth és az iForth, a Forth-ot natív gépi kódra fordítják.

Data objectsEdit

amikor egy szó változó vagy más adatobjektum, a CF az azt létrehozó meghatározó szóhoz társított futásidejű kódra mutat. A meghatározó szónak van egy jellegzetes “meghatározó viselkedése” (szótárbejegyzés létrehozása plusz esetleg az adattér kiosztása és inicializálása), valamint meghatározza az e meghatározó szó által felépített szavak osztályának egy példányának viselkedését is. Példák a következőkre:

VARIABLEmegnevez egy inicializálatlan, egycellás memóriahelyet. AVARIABLEpéldány viselkedése visszaadja a verem címét.CONSTANTmegnevez egy értéket (aCONSTANTargumentumaként megadva). A példány viselkedése visszaadja az értéket.CREATEmegnevez egy helyet; ezen a helyen helyet lehet kiosztani, vagy beállítható, hogy karakterláncot vagy más inicializált értéket tartalmazzon. A példány viselkedése ennek a helynek az elejének címét adja vissza. a

Forth egy olyan lehetőséget is biztosít, amellyel a programozó új alkalmazásspecifikus meghatározó szavakat definiálhat, meghatározva mind az egyéni meghatározó viselkedést, mind a példány viselkedését. Néhány példa kör alakú pufferek, elnevezett bitek egy I / O porton, és automatikusan indexelt tömbök.

az ezekkel és hasonló szavakkal definiált adatobjektumok globális hatókörűek. A helyi változók által más nyelveken biztosított funkciót a Forth-I adathalmaz biztosítja (bár Forth-nak is vannak valós helyi változói). Forth programozási stílus nagyon kevés megnevezett adatobjektumot használ más nyelvekhez képest; az ilyen adatobjektumokat általában olyan adatok tárolására használják, amelyeket számos szó vagy feladat használ (többfeladatos megvalósításban).a

Forth nem érvényesíti az adattípusok használatának következetességét; a programozó felelőssége, hogy megfelelő operátorokat használjon értékek lekérésére és tárolására, vagy más műveleteket hajtson végre az adatokon.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.