Forth (programovací jazyk)

základní datová struktura Forth je „slovník“, který mapuje „slova“ na spustitelný kód nebo pojmenované datové struktury. Slovník je stanoven v paměti jako strom propojených seznamů s odkazy vycházeje z nejnovější (poslední) definované slovo nejstarší, dokud sentinel hodnota, obvykle NULOVÝ ukazatel, je nalezen. Kontextový přepínač způsobí, že vyhledávání seznamu začne na jiném listu. Hledání propojeného seznamu pokračuje, když se větev sloučí do hlavního kmene, což nakonec vede zpět k Sentinelu, kořenu.Může existovat několik slovníků. Ve vzácných případech, jako je meta-kompilace, může být slovník izolovaný a samostatný.Efekt se podobá efektu vnořených jmenných prostorů a může přetížit klíčová slova v závislosti na kontextu.

definované slovo se obvykle skládá z hlavy a těla s hlavou se skládá z názvu pole (NF) a do pole odkaz (LF), a tělo se skládá z kódu oblasti (CF) a parametr pole (PF).

Hlava A tělo položky slovníku jsou zpracovány odděleně, protože nemusí být přilehlé. Například, když Tam je program překompilovat pro novou platformu, hlava může zůstat na sestavování počítače, zatímco tělo přejde na novou platformu. V některých prostředích (jako jsou vestavěné systémy) hlavy zbytečně zabírají paměť. Nicméně, některé křížové kompilátory mohou dát hlavy do cíle, pokud se očekává, že samotný cíl bude podporovat interaktivní Forth.

Dictionary entryEdit

přesný formát záznamu slovníku není předepsán a implementace se liší. Některé komponenty jsou však téměř vždy přítomny, i když přesná velikost a pořadí se mohou lišit. Popsán jako struktura, slovník vstup může vypadat takhle:

 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

pole název začíná prefixem dávat délka slova je jméno (obvykle až 32 bajtů), a několik bitů pro vlajky. Znaková reprezentace názvu slova pak následuje předponu. V závislosti na konkrétní implementaci Forth může být pro zarovnání jeden nebo více nul (‚\0‘) bajtů.

pole odkazu obsahuje ukazatel na dříve definované slovo. Ukazatel může být relativní posunutí nebo absolutní adresa, která ukazuje na dalšího nejstaršího sourozence.

ukazatel kódového pole bude buď adresa slova, které provede kód nebo data v poli parametrů, nebo začátek strojového kódu, který procesor provede přímo. U slov definovaných dvojtečkou ukazuje ukazatel pole kódu na slovo, které uloží aktuální ukazatel instrukce (IP) na Návratový zásobník a načte IP s novou adresou, ze které bude pokračovat v provádění slov. To je stejné jako to, co procesor volání/návrat instrukce dělat.

struktura kompilátorueditovat

kompilátor sám o sobě není monolitický program. Skládá se ze slov viditelných pro systém a použitelných programátorem. To umožňuje programátorovi změnit slova kompilátoru pro zvláštní účely.

příznak „čas kompilace“ v poli Název je nastaven pro slova s chováním“ čas kompilace“. Většina jednoduchých slov spustit stejný kód, zda jsou zadány na příkazovém řádku, nebo vložené do kódu. Při jejich kompilaci kompilátor jednoduše umístí kód nebo závitový ukazatel do aplikace word.

klasickými příklady slov v době kompilace jsou řídicí struktury jako IF a WHILE. Téměř všechny řídící struktury Forthu a téměř všechny jeho kompilátory jsou implementovány jako slova v čase kompilace. Na rozdíl od některých zřídka používá řízení toku slov nalézt pouze v několika implementacích, jako je podmíněný návrat, všichni Zpět je řízení toku slov jsou provedeny během kompilace sestavit různé kombinace primitivních slov spolu s jejich pobočkové adresy. Například IFWHILE, a slova, která odpovídají s těmi, nastavit BRANCH (bezpodmínečné větev) a ?BRANCH (pop hodnotu ze zásobníku, a větev, pokud je false). Počítané smyčky řízení toku slova fungují podobně, ale nastavit kombinace primitivních slov, které pracují s počítadlem, a tak dále. Během kompilace se datový zásobník používá k podpoře vyvažování struktury řízení, vnoření a zpětné opravy adres větví. Úryvek:

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

by být sestaven tak, aby následující sekvence uvnitř definice:

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

čísla BRANCH představují relativní skok adresy. LIT je primitivní slovo pro vložení „doslovného“ čísla do datového zásobníku.

Kompilace státu a výklad stateEdit

slovo : (tlustého střeva) analyzuje jméno jako parametr, vytvoří položku slovníku (dvojtečka definice) a vstupuje kompilace státu. Interpret pokračuje ve čtení slov oddělených mezerami ze vstupního zařízení uživatele. Pokud je slovo nalezeno, interpret provede kompilační sémantiku spojenou se slovem, místo interpretační sémantiky. Výchozí kompilační sémantika slova má připojit jeho interpretační sémantiku k aktuální definici.

slovo ; (semi-colon) dokončí aktuální definici a vrátí se do stavu interpretace. Je to příklad slova, jehož kompilační sémantika se liší od výchozího. Výklad sémantiky ; (semi-colon), většina řízení toku slov, a několik dalších slov jsou nedefinované v ANS Forth, což znamená, že musí být použit pouze uvnitř definice a ne na interaktivní příkazový řádek.

stav tlumočníka lze změnit ručně pomocí slov (pravá závorka), která zadávají stav interpretace nebo stav kompilace. Tato slova mohou být použita se slovem LITERAL pro výpočet hodnoty během kompilace a vložení vypočtené hodnoty do aktuální definice dvojtečky. LITERAL má kompilace sémantiku, aby se objekt z datového zásobníku a připojit sémantika současné tlustého střeva definice na místě, že objekt na datovém zásobníku.

V ANS Forth, současný stav interpretu lze číst z vlajky STATE, který obsahuje hodnotu true, když při sestavování státu, a false jinak. To umožňuje implementaci tzv. state-smart slov s chováním, které se mění podle aktuálního stavu tlumočníka.

Okamžité wordsEdit

slovo IMMEDIATE značky nejnovější tlustého střeva definice jako bezprostřední slovo, účinně nahradí jeho sestavování sémantika s jeho výklad sémantiky. Okamžitá slova se obvykle provádějí během kompilace, nejsou kompilována, ale programátor je může přepsat v obou stavech. ; je příkladem okamžitého slova. V ANS Forth má slovo POSTPONE název jako parametr a připojí kompilační sémantiku pojmenovaného slova k aktuální definici, i když bylo slovo označeno okamžitě. Forth-83 definovaná samostatná slova COMPILE a vynutit kompilaci bezprostředních a bezprostředních slov.

Nejmenovaný slova a provedení tokensEdit

V ANS Forth, nejmenovaný slova mohou být definovány s slovo :NONAME, který zpracovává následující slova až do další ; (semi-colon) a listy poprava token na zásobník dat. Execution token poskytuje neprůhledný popisovač pro kompilovanou sémantiku, podobně jako ukazatele funkcí programovacího jazyka C.

execution tokeny mohou být uloženy v proměnných. Slovo EXECUTE vezme Token provádění ze zásobníku dat a provede přidruženou sémantiku. Slovo COMPILE, (compile-comma) vezme Token spuštění ze zásobníku dat a připojí přidruženou sémantiku k aktuální definici.

slovo ' (zaškrtnout) má název slovo jako parametr a vrátí provedení token spojené s tímto slovem na datovém zásobníku. V interpretačním stavu je ' RANDOM-WORD EXECUTE ekvivalentní RANDOM-WORD.

Upravit

slova : (tlustého střeva), POSTPONE' (zaškrtnout) jsou příklady rozebrat slova, která si jejich argumenty z uživatelského vstupního zařízení se místo údaje zásobníku. Dalším příkladem je slovo ( (paren), které čte a ignoruje následující slova až do následující pravé závorky včetně a používá se k umístění komentářů do definice dvojtečky. Podobně slovo \ (zpětné lomítko) se používá pro komentáře, které pokračují až do konce aktuálního řádku. Být analyzovány správně, ( (závorka) a \ (zpětné lomítko) musí být oddělena mezerou od následující text komentáře.

struktura kódu

ve většině systémů se tělo definice kódu skládá buď ze strojového jazyka, nebo z nějaké formy závitového kódu. Původní Forth, který následuje neformální standard obr (Forth zájmová skupina), je TIL (závitem interpretační jazyk). Tomu se také říká nepřímý závitový kód, ale v moderní době se také staly populární pevnosti s přímým závitem a podprogramem. Nejrychlejší moderní Forths, jako je SwiftForth, VFX Forth, a iForth, kompilovat dále do nativního strojového kódu.

Data objectsEdit

Když slovo je proměnná nebo jiných dat objektu, VIZ body runtime kód, spojené s definováním slovo, že ho vytvořil. Rozhodující slovo má charakteristickou „definování chování“ (vytvoření slovníku vstupní plus případně přidělování a inicializace datového prostoru) a také určuje chování instance třídy slov postavené tomto vymezení slovo. Příklady zahrnují:

VARIABLEpojmenuje neinicializované jednobuněčné paměťové místo. Chování InstanceVARIABLEvrací svou adresu na zásobníku.CONSTANTpojmenuje hodnotu (zadanou jako argument proCONSTANT). Chování Instance vrací hodnotu.CREATEJména místo; prostor může být přiděleno na tomto místě, nebo to lze nastavit tak, aby obsahovat řetězec nebo jiné inicializován hodnotu. Chování Instance vrací adresu začátku tohoto prostoru.

Forth také poskytuje zařízení, pomocí kterého může programátor definovat nová definující slova specifická pro aplikaci a specifikovat jak vlastní definující chování,tak chování instance. Některé příklady zahrnují kruhové vyrovnávací paměti, pojmenované bity na I / o portu a automaticky indexovaná pole.

datové objekty definované těmito a podobnými slovy mají globální rozsah. Funkce poskytovaná lokálními proměnnými v jiných jazycích je poskytována datovým zásobníkem ve Forth (I když Forth má také skutečné lokální proměnné). Forth programovací styl používá velmi málo pojmenovaných datových objektů ve srovnání s jinými jazyky; typicky se tyto datové objekty používají k tomu, aby obsahovaly data, která jsou používána několika slovy nebo úkoly (v multitasked implementaci).

Forth nevynucuje konzistenci použití datového typu; je odpovědností programátora používat vhodné operátory pro načítání a ukládání hodnot nebo provádění jiných operací s daty.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.