Forth (programovací jazyk) - Forth (programming language)

Forth
Paradigma Procedurální , orientované na hromádku , reflexní , zřetězené
Navrhl Charles H. Moore
Poprvé se objevil 1970 ; Před 51 lety ( 1970 )
Kázeň při psaní Typeless
Rozšíření názvu souboru .fs, .fth, .forth
Hlavní implementace
SwiftForth (Forth, Inc.)
Gforth (projekt GNU)
VFX Forth (MicroProcessor Engineering)
Ovlivněn
Burroughs velké systémy , Lisp , APL
Ovlivněn
Factor , Joy , PostScript , RPL , REBOL

Forth je procedurální , na sebe orientovaný programovací jazyk a interaktivní prostředí navržené Charlesem H. „Chuckem“ Moorem a poprvé použité jinými programátory v roce 1970. Ačkoli to není zkratka , název jazyka v jeho raných letech byl často napsán velkými písmeny jako FORTH , ale Forth je běžnější.

Forth kombinuje kompilátor s integrovaným příkazovým shellem, kde uživatel interaguje pomocí podprogramů nazývaných slova . Slova lze definovat, testovat, předefinovat a ladit bez překompilování nebo restartování celého programu. Všechny syntaktické prvky, včetně proměnných a základních operátorů, jsou definovány jako slova. K předávání parametrů mezi slovy se používá zásobník , což vede ke stylu reverzní polské notace .

Pro většinu Forthovy existence byla standardní technikou kompilace do závitového kódu , který lze interpretovat rychleji než bytecode . Jednou z prvních výhod Forthu byla velikost: celé vývojové prostředí-včetně kompilátoru, editoru a uživatelských programů-se vešlo do paměti na 8bitovém nebo podobně omezeném systému. Už nejsou omezeny prostorem, existují moderní implementace, které generují optimalizovaný strojový kód jako jiné jazykové překladače.

Forth se používá v zavaděči Open Firmware , ve vesmírných aplikacích, jako je kosmická loď Philae , a v dalších vestavěných systémech, které zahrnují interakci s hardwarem. Relativní jednoduchost vytvoření základního systému Forth vedla k mnoha osobním a proprietárním variantám, jako je například vlastní Forth používaný k implementaci nejprodávanější videohry z roku 1986 Starflight od Electronic Arts . Implementace bezplatného softwaru Gforth je aktivně udržována, stejně jako několik komerčně podporovaných systémů.

Moore později vyvinul řadu mikroprocesorů pro provádění kompilovaného kódu podobného formátu Forth a experimentoval s menšími jazyky založenými na konceptech Forth, včetně cmForth a colorForth .

Využití

Forth má místo v astronomických a vesmírných aplikacích a také historii v integrovaných systémech . The Open Firmware Boot ROM používané Apple , IBM , Sun a OLPC XO-1 obsahuje Forth prostředí.

Forth byl často používán k vyvolání nového hardwaru. Forth byl první rezidentní software na novém čipu Intel 8086 v roce 1978 a MacFORTH byl první rezidentní vývojový systém pro Macintosh 128K v roce 1984.

Atari, Inc. použila propracovanou animovanou ukázku napsanou ve Forthu, aby předvedla schopnosti 400 a 800 počítačů Atari v obchodních domech. Dvě domácí počítačové hry od Electronic Arts , vydané v 80. letech minulého století, byly napsány ve hře Forth: Worms? (1983) a Starflight (1986). Canon Cat (1987) používá Forth pro jeho naprogramování systému.

Společnost Rockwell vyráběla jednočipové mikropočítače s rezidentními jádry Forth: R65F11 a R65F12. ASYST byla expanze Forth pro měření a ovládání na počítačích.

Dějiny

Forth se vyvinul z osobního programovacího systému Charlese H. Moora , který se neustále vyvíjí od roku 1968. Forth byl poprvé vystaven jiným programátorům na začátku 70. let 20. století, počínaje Elizabeth Ratherovou na Národní radioastronomické observatoři USA (NRAO). Po jejich práci v NRAO založili Charles Moore a Elizabeth Rather v roce 1973 společnost FORTH, Inc., v příštím desetiletí rafinovali a přenesli systémy Forth na desítky dalších platforem.

Forth je pojmenován tak, protože v roce 1968 „soubor obsahující tlumočníka byl pro software 4. (další) generace označen FOURTH, ale operační systém IBM 1130 omezil názvy souborů na pět znaků“. Moore viděl Fortha jako nástupce kompilace link-go programovacích jazyků třetí generace nebo softwaru pro hardware „čtvrté generace“.

MicroFORTH společnosti FORTH, Inc. byl vyvinut pro mikroprocesory Intel 8080 , Motorola 6800 , Zilog Z80 a RCA 1802 , počínaje rokem 1976. MicroFORTH později používali fandové ke generování systémů Forth pro jiné architektury, například 6502 v roce 1978. Forth Interest Group byla založena v roce 1978. Propagovala a distribuovala vlastní verzi jazyka FIG-Forth pro většinu značek domácích počítačů.

Forth byl populární na začátku 80. let, protože se dobře hodil pro omezenou paměť mikropočítačů . Snadná implementace jazyka vedla k mnoha implementacím. Britský domácí počítač Jupiter ACE má ve svém operačním systému rezidentní ROM Forth . Insoft GraFORTH je verze Forth s grafickými rozšířeními pro Apple II.

Běžná praxe byla kodifikována v de facto standardech FORTH-79 a FORTH-83 v letech 1979, respektive 1983. Tyto standardy byly sjednoceny ANSI v roce 1994, běžně označované jako ANS Forth.

Od roku 2018 byl obnoven zdroj původní verze 1130 FORTH a nyní se aktualizuje, aby běžel na obnoveném nebo emulovaném systému 1130.

Přehled

Forth klade důraz na používání malých, jednoduchých funkcí zvaných slova . Slova pro větší úkoly vyžadují mnoho menších slov, z nichž každé plní specifický dílčí úkol. Velký program Forth je hierarchie slov. Tato slova, odlišné moduly, které implicitně komunikují prostřednictvím mechanismu zásobníku, lze prototypovat, vytvářet a testovat nezávisle. Nejvyšší úroveň kódu Forth může připomínat anglický popis aplikace. Forth se nazývá jazyk meta aplikací : jazyk, který lze použít k vytváření jazyků orientovaných na problémy .

Forth spoléhá na explicitní použití datového zásobníku a reverzní polskou notaci, která se běžně používá v kalkulačkách od společnosti Hewlett-Packard . V RPN je operátor umístěn po svých operandech, na rozdíl od běžnějšího zápisu infixu, kde je operátor umístěn mezi jeho operandy. Zápis postfixu usnadňuje analýzu a rozšíření jazyka; Forthova flexibilita činí statickou gramatiku BNF nevhodnou a nemá monolitický kompilátor. Rozšíření kompilátoru vyžaduje pouze psaní nového slova, namísto úpravy gramatiky a změny základní implementace.

Pomocí RPN lze získat výsledek matematického výrazu (25 * 10 + 50)tímto způsobem:

 25 10 * 50 + CR .
 300 ok
Stack1.svg

Nejprve se na hromádku položí čísla 25 a 10.

Forthstack1 5.svg


Slovo *vezme první dvě čísla ze zásobníku, znásobí je a vrátí produkt zpět do zásobníku.

Forthstack2.svg

Poté je na hromádku umístěno číslo 50.

Forthstack3.svg


Slovo +přidá první dvě hodnoty a posune součet. CR( návrat vozíku ) spustí výstup na novém řádku. Nakonec . vytiskne výsledek. Jakmile je vše úspěšně dokončeno, systém Forth tiskne OK.

I strukturální funkce společnosti Forth jsou založeny na zásobníku. Například:

 : FLOOR5 ( n -- n' )   DUP 6 < IF DROP 5 ELSE 1 - THEN ;

Dvojtečka označuje začátek nové definice, v tomto případě se nazývá nové slovo (opět slovo je termín používaný pro podprogram) FLOOR5. Text v závorkách je komentář, který radí, že toto slovo očekává číslo v zásobníku a vrátí případně změněné číslo (v zásobníku).

Podprogram používá následující příkazy: DUPduplikuje číslo v zásobníku; 6tlačí 6 na vrchol zásobníku; <porovná první dvě čísla v zásobníku (6 a DUPvstup ed) a nahradí je hodnotou true nebo false; IFvezme hodnotu true nebo false a rozhodne se provést příkazy bezprostředně za ním nebo přeskočit na ELSE; DROPzahodí hodnotu v zásobníku; 5tlačí 5 na vrchol hromádky; a THENkončí podmíněné.

FLOOR5Slovo je ekvivalentní k této funkci psané v programovacím jazyce C s použitím ternární operátor :? '

int floor5(int v) {
  return (v < 6) ? 5 : (v - 1);
}

Tato funkce je stručněji napsána jako:

 : FLOOR5 ( n -- n' ) 1- 5 MAX ;

To lze spustit následujícím způsobem:

 1 FLOOR5 CR .
 5 ok
 8 FLOOR5 CR .
 7 ok

Nejprve se na hromádku vloží číslo (1 nebo 8), které FLOOR5se zavolá, které číslo znovu vyskočí a posune výsledek. CRpřesune výstup na nový řádek (opět je to jen kvůli čitelnosti). Nakonec výzva k .vysunutí výsledku a vytištění.

Zařízení

Gramatika Forth nemá žádnou oficiální specifikaci. Místo toho je definován jednoduchým algoritmem. Tlumočník čte řádek vstupu ze vstupního zařízení uživatele, který je pak analyzován na slovo pomocí mezer jako oddělovače ; některé systémy rozpoznávají další znaky mezer . Když tlumočník najde slovo, vyhledá ho ve slovníku . Pokud je slovo nalezeno, interpret provede kód přidružený ke slovu a poté se vrátí k analýze zbytku vstupního proudu. Pokud slovo není nalezeno, předpokládá se, že je číslem, a pokusí se jej převést na číslo a zatlačit na hromádku; pokud je úspěšný, tlumočník pokračuje v analýze vstupního proudu. V opačném případě, pokud vyhledávání i převod čísel selžou, tlumočník vytiskne slovo následované chybovou zprávou označující, že slovo není rozpoznáno, vyprázdní vstupní proud a čeká na nový vstup uživatele.

Definice nového slova začíná slovem :(dvojtečka) a končí slovem ;(středník). Například,

 : X DUP 1+ . . ;

zkompilová slovo Xa učiní jméno nalezitelným ve slovníku. Po spuštění zadáním 10 Xna konzolu se toto vytiskne 11 10.

Většina systémů Forth obsahuje assembler pro psaní slov pomocí zařízení procesoru. Forth assembleri často používají reverzní polskou syntaxi, ve které parametry instrukce předcházejí instrukci. Typický reverzní polský assembler připraví operandy na zásobníku a mnemotechnická pomůcka zkopíruje celou instrukci do paměti jako poslední krok. Forth assembler je od přírody makro assembler, takže je snadné definovat alias pro registry podle jejich role v systému Forth: např. „Dsp“ pro registr používaný jako ukazatel zásobníku dat.

Operační systém, soubory a multitasking

Většina systémů Forth běží pod hostitelským operačním systémem, jako je Microsoft Windows , Linux nebo verze Unixu, a pro zdrojové a datové soubory používá souborový systém hostitelského operačního systému; norma ANSI Forth popisuje slova používaná pro I/O. Všechny moderní systémy Forth používají jako zdroj normální textové soubory, i když jsou vložené. Integrovaný systém s rezidentním kompilátorem získává svůj zdroj prostřednictvím sériové linky.

Klasické systémy Forth tradičně nepoužívají operační systém ani souborový systém . Místo ukládání kódu do souborů je zdrojový kód uložen v blocích disku zapsaných na adresy fyzických disků. Slovo BLOCKse používá k převodu počtu bloků místa na disku o velikosti 1 kB na adresu vyrovnávací paměti obsahující data, která je automaticky spravována systémem Forth. Od poloviny devadesátých let se používání bloků stalo vzácným. V hostovaném systému jsou tyto bloky v každém případě přiděleny v normálním souboru.

Multitasking , nejčastěji kooperativní rozvrhování každý s každým , je běžně k dispozici (ačkoli slova a podpora více úkolů nejsou pokryta standardem ANSI Forth). Slovo PAUSEse používá k uložení kontextu provádění aktuálního úkolu, k vyhledání dalšího úkolu a obnovení jeho kontextu spuštění. Každý úkol má své vlastní zásobníky, soukromé kopie některých řídicích proměnných a škrábanec. Výměna úkolů je jednoduchá a efektivní; v důsledku toho jsou multitaskery Forth k dispozici i na velmi jednoduchých mikrokontrolérech , jako jsou Intel 8051 , Atmel AVR a TI MSP430 .

Mezi další nestandardní zařízení patří mechanismus pro vydávání hovorů do hostitelského operačního systému nebo okenních systémů a řada z nich poskytuje rozšíření využívající plánování poskytované operačním systémem. Obvykle mají větší a odlišnou sadu slov od samostatného Forthova PAUSEslova pro vytváření úkolů, pozastavení, zničení a úpravu priority.

Vlastní kompilace a křížová kompilace

Plně vybavený systém Forth se všemi zdrojovými kódy se zkompiluje sám, což je technika , kterou programátoři Forthu běžně nazývají meta-kompilace nebo self-hosting (i když termín přesně neodpovídá meta-kompilaci, jak je běžně definován). Obvyklou metodou je předefinovat hrstka slov, která ukládají kompilované bity do paměti. Slova kompilátoru používají speciálně pojmenované verze načítání a ukládání, které lze přesměrovat do oblasti vyrovnávací paměti v paměti. Oblast vyrovnávací paměti simuluje nebo přistupuje k oblasti paměti začínající na jiné adrese, než je vyrovnávací paměť kódu. Takové kompilátory definují slova pro přístup jak k paměti cílového počítače, tak k paměti hostitelského (kompilačního) počítače.

Poté, co jsou operace načítání a ukládání předefinovány pro kódový prostor, kompilátor, assembler atd. Jsou překompilovány pomocí nových definic načtení a uložení. To efektivně znovu použije veškerý kód kompilátoru a tlumočníka. Potom je zkompilován kód systému Forth, ale tato verze je uložena ve vyrovnávací paměti. Vyrovnávací paměť v paměti je zapsána na disk a jsou k dispozici způsoby, jak ji dočasně načíst do paměti pro testování. Když se zdá, že nová verze funguje, přepíše se na předchozí verzi.

Pro různá prostředí existuje řada variací těchto kompilátorů. U vestavěných systémů může být kód místo toho zapsán na jiný počítač, techniku ​​známou jako křížová kompilace , přes sériový port nebo dokonce jeden bit TTL , přičemž názvy slov a další neprovádějící části slovníku budou ponechány v původní kompilaci. počítač. Minimální definice pro takový Forthův kompilátor jsou slova, která načítají a ukládají bajt, a slovo, které přikazuje, aby bylo provedeno Forthovo slovo. Časově nejnáročnější částí psaní vzdáleného portu je často konstrukce počátečního programu pro implementaci načítání, ukládání a spouštění, ale mnoho moderních mikroprocesorů má integrované funkce ladění (například Motorola CPU32 ), které tento úkol eliminují.

Struktura jazyka

Základní datovou strukturou Forthu je „slovník“, který mapuje „slova“ na spustitelný kód nebo pojmenované datové struktury. Slovník je uložen v paměti jako strom propojených seznamů s odkazy postupujícími od nejnovějšího (nejnověji) definovaného slova k nejstaršímu, dokud není nalezena sentinelová hodnota , obvykle NULL ukazatel. Přepnutí kontextu způsobí, že hledání v seznamu začne na jiném listu. Prohledávání propojeného seznamu pokračuje, zatímco větev přechází do hlavního kmene vedoucí nakonec 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á vnoření jmenných prostorů a může přetížit klíčová slova v závislosti na kontextu.

Definované slovo se obecně skládá z hlavy a těla, přičemž hlava se skládá z pole názvu (NF) a pole odkazu (LF) a těla se skládá z pole kódu (CF) a pole parametrů (PF).

Hlava a tělo záznamu ve slovníku jsou zpracovány samostatně, protože nemusí na sebe navazovat. Když je například program Forth překompilován pro novou platformu, hlava může zůstat na kompilačním počítači, zatímco tělo přejde na novou platformu. V některých prostředích (například vestavěných systémech ) hlavy zbytečně zabírají paměť. Některé křížové překladače však mohou do cíle vložit hlavy, pokud se od cíle očekává, že bude podporovat interaktivní Forth.

Záznam ve slovníku

Přesný formát záznamu ve slovníku není předepsán a implementace se liší. Některé součásti jsou však téměř vždy přítomny, ačkoli přesná velikost a pořadí se mohou lišit. Zápis ve slovníku, popsaný jako struktura, může vypadat takto:

 structure
   byte:       flag           \ 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ázvu začíná předponou udávající délku názvu slova. Znaková reprezentace názvu slova pak následuje předponou. V závislosti na konkrétní implementaci Forth může existovat jeden nebo více bajtů NUL ('\ 0') pro zarovnání.

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

Ukazatelem pole kódu 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 Forth (IP) do návratového zásobníku, a načte IP s novou adresou, ze které bude pokračovat provádění slov. To je stejné jako to, co dělají pokyny pro volání/návrat procesoru.

Struktura kompilátoru

Samotný kompilátor není monolitický program. Skládá se ze slov Forth viditelných systémem 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ázvu je nastaven pro slova s ​​chováním „čas kompilace“. Většina jednoduchých slov spouští stejný kód, ať už jsou napsána na příkazovém řádku nebo vložena do kódu. Při jejich kompilaci kompilátor jednoduše umístí kód nebo podprocesový ukazatel na slovo.

Klasickými příklady slov v době kompilace jsou řídicí struktury jako IFa WHILE. Téměř všechny řídicí struktury společnosti Forth a téměř všechny její kompilátory jsou implementovány jako slova v době kompilace. Kromě některých zřídka používaných řídicích slov toku, která se vyskytují pouze v několika implementacích, jako je například podmíněný návrat, jsou všechna slova řízení toku společnosti Forth prováděna během kompilace za účelem kompilace různých kombinací primitivních slov spolu s adresami jejich větví. Například IFa WHILE, a slova, která se s nimi shodují, nastavte BRANCH(bezpodmínečná větev) a ?BRANCH(vysuňte hodnotu ze zásobníku a větev, pokud je nepravdivá). Slova toku počítaných smyček fungují podobně, ale nastavují kombinace primitivních slov, která fungují s čítačem atd. Během kompilace se datový zásobník používá k podpoře vyvažování řídicí struktury, vnořování a zpětného opravování adres poboček. Úryvek:

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

bude zkompilován do následující sekvence uvnitř definice:

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

Čísla za BRANCHpředstavují relativní adresy skoků. LITje primitivní slovo pro tlačení „doslovného“ čísla do datového zásobníku.

Stav kompilace a stav interpretace

Slovo :(dvojtečka) analyzuje název jako parametr, vytvoří položku slovníku ( definice dvojtečky ) a přejde do stavu kompilace. Tlumočník pokračuje ve čtení slov oddělených mezerami ze vstupního zařízení uživatele. Pokud je nalezeno slovo, interpret namísto sémantiky interpretace provede sémantiku kompilace spojenou se slovem . Výchozí sémantika kompilace slova je připojit jeho sémantiku interpretace k aktuální definici.

Slovo ;(středník) dokončí aktuální definici a vrátí se do interpretačního stavu. Je to příklad slova, jehož sémantika kompilace se liší od výchozího. Sémantika interpretace ;(středník), většina řídicích tokových slov a několik dalších slov není v ANS Forth definováno, což znamená, že je lze použít pouze uvnitř definic a ne na interaktivním příkazovém řádku.

Stav tlumočníka lze změnit ručně pomocí slov [(levá závorka) a ](pravá závorka), která vstupují do stavu interpretace nebo stavu kompilace. Tato slova lze se slovem použít LITERALk výpočtu hodnoty během kompilace a k vložení vypočítané hodnoty do aktuální definice dvojtečky. LITERALmá sémantiku kompilace k převzetí objektu ze zásobníku dat a k připojení sémantiky k aktuální definici dvojtečky k umístění tohoto objektu do zásobníku dat.

V ANS Forth lze aktuální stav tlumočníka číst z příznaku, STATE který obsahuje hodnotu true, když je ve stavu kompilace, a false v opačném případě. To umožňuje implementaci takzvaných stavově chytrých slov s chováním, které se mění podle aktuálního stavu tlumočníka.

Okamžitá slova

Slovo IMMEDIATEoznačuje nejnovější definici dvojtečky jako bezprostřední slovo a účinně nahrazuje sémantiku kompilace sémantikou interpretace. Okamžitá slova se obvykle provádějí během kompilace, nikoli kompilace, ale to může být přepsáno programátorem v kterémkoli stavu. ;je příkladem bezprostředního slova. V ANS Forth slovo POSTPONEpřebírá název jako parametr a připojuje sémantiku kompilace pojmenovaného slova k aktuální definici, i když bylo slovo označeno bezprostředně. Forth-83 definoval samostatná slova COMPILEa [COMPILE]vynutil si sestavení slov, která nejsou bezprostřední, a bezprostřední.

Nejmenovaná slova a popravčí tokeny

V ANS Forth lze nejmenovaná slova definovat slovem, :NONAMEkteré kompiluje následující slova až do dalšího ;(středník) a ponechává v datovém zásobníku token provedení . Poprava Token poskytuje neprůhledný rukojeť pro kompilované sémantiky, podobně jako ukazatelů funkcí v C programovací jazyk .

Prováděcí tokeny mohou být uloženy v proměnných. Slovo EXECUTEvezme token provedení ze zásobníku dat a provede související sémantiku. Slovo COMPILE, (kompilace-čárka) přebírá token provedení ze zásobníku dat a připojuje přidruženou sémantiku k aktuální definici.

Slovo '(zaškrtnutí) přebírá jako parametr název slova a vrací token provedení spojený s tímto slovem v datovém zásobníku. Ve interpretačním stavu ' RANDOM-WORD EXECUTEje ekvivalentní RANDOM-WORD.

Analýza slov a komentářů

Slova :(karcinom tlustého střeva), POSTPONE, '(klíště), jsou příklady analýze slova , které se jejich argumenty z uživatelského vstupního zařízení, místo datového 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 slouží k umístění komentářů do definice dvojtečky. Podobně slovo \(zpětné lomítko) se používá pro komentáře, které pokračují na konec aktuálního řádku. Aby byly správně analyzovány, ((paren) a \(zpětné lomítko) musí být od následujícího textu komentáře odděleny mezerami.

Struktura kódu

Ve většině systémů Forth 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ý navazuje na neformální standard FIG (Forth Interest Group), je TIL (Threaded Interpretive Language). Toto se také nazývá kód s nepřímým vláknem, ale Forthy s přímým a podprogramovým vláknem se také staly populární v moderní době. Nejrychlejší moderní Forthy, jako SwiftForth, VFX Forth a iForth, kompilují Forth do nativního strojového kódu.

Datové objekty

Když je slovo proměnnou nebo jiným datovým objektem, CF ukazuje na běhový kód přidružený k definujícímu slovu, které ho vytvořilo. Definující slovo má charakteristické „definující chování“ (vytvoření záznamu ve slovníku plus případně přidělení a inicializace datového prostoru) a také určuje chování instance třídy slov vytvořené tímto definujícím slovem. Mezi příklady patří:

VARIABLE
Pojmenuje neinicializované umístění v jedné buňce paměti. Chování instance a VARIABLEvrací jeho adresu v zásobníku.
CONSTANT
Pojmenuje hodnotu (zadanou jako argument pro CONSTANT). Chování instance vrací hodnotu.
CREATE
Pojmenuje místo; v tomto místě může být přiděleno místo, nebo může být nastaveno tak, aby obsahovalo řetězec nebo jinou inicializovanou hodnotu. Chování instance vrací adresu začátku tohoto prostoru.

Forth také poskytuje nástroj, pomocí kterého může programátor definovat nová definiční slova specifická pro aplikaci, přičemž specifikuje 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 Forthu (ačkoli 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; obvykle se takové datové objekty používají k tomu, aby obsahovaly data, která jsou používána řadou slov nebo úkolů (ve víceúlohové implementaci).

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

Příklady

"Ahoj světe!"

 : HELLO  ( -- )  CR ." Hello, World!" ;
HELLO <cr>
Hello, World!

Slovo CR(Carriage Return) způsobí, že se na novém řádku zobrazí následující výstup. Analyzovací slovo ."(tečka) čte řetězec oddělený uvozovkami a připojí kód k aktuální definici, takže analyzovaný řetězec se zobrazí při spuštění. Znak mezery oddělující slovo ."od řetězce Hello, World!není součástí řetězce. Je to nutné, aby analyzátor rozpoznal ."jako slovo Forth.

Standardní systém Forth je také tlumočník a stejný výstup lze získat zadáním následujícího fragmentu kódu do konzoly Forth:

 CR .( Hello, World!)

.((dot-paren) je okamžité slovo, které analyzuje řetězec oddělený závorkami a zobrazí ho. Stejně jako se slovem ."znak mezery oddělující .(od Hello, World!není součástí řetězce.

Slovo CRpřichází před text, který se má vytisknout. Podle konvence interpret Forth nespustí výstup na novém řádku. Také podle konvence tlumočník čeká na zadání na konci předchozího řádku po okvýzvě. Ve Forthu neexistuje implicitní akce „flush-buffer“ CR, jak tomu někdy v jiných programovacích jazycích je.

Míchání stavů kompilace a interpretace

Zde je definice slova, EMIT-Qkteré při spuštění vydává jeden znak Q:

 : EMIT-Q   81 ( the ASCII value for the character 'Q' ) EMIT ;

Tato definice byla napsána tak, aby přímo používala hodnotu ASCIIQ znaku (81). Text mezi závorkami je komentář a kompilátor ho ignoruje. Slovo EMITvezme hodnotu z datového zásobníku a zobrazí odpovídající znak.

Následující redefinice EMIT-Qpoužívá slova [(levá závorka), ](pravá závorka) CHARa LITERALk dočasnému přepnutí do stavu tlumočníka vypočítá hodnotu ASCII Qznaku, vrátí se do stavu kompilace a připojí vypočítanou hodnotu k aktuální definici dvojtečky:

 : EMIT-Q   [ CHAR Q ]  LITERAL  EMIT ;

Analýza slovo CHARvezme jako parametr slovo oddělené mezerou a umístí hodnotu jeho prvního znaku do datového zásobníku. Toto slovo [CHAR]je bezprostřední verzí CHAR. Pomocí [CHAR]příkladu definici pro EMIT-Qlze přepsat takto:

 : EMIT-Q   [CHAR] Q  EMIT ; \ Emit the single character 'Q'

Tato definice byla použita \(zpětné lomítko) pro popisující komentář.

Oba CHARa [CHAR]jsou předdefinované v ANS Forth. Použití IMMEDIATEa POSTPONE, [CHAR]mohlo být definováno takto:

 : [CHAR]   CHAR  POSTPONE LITERAL ; IMMEDIATE

Kompletní šifrovací program RC4

V roce 1987 vyvinul Ron Rivest šifrovací systém RC4 pro RSA Data Security, Inc. Kód je extrémně jednoduchý a většina programátorů jej může napsat z popisu:

Máme pole 256 bajtů, všechny různé. Při každém použití se pole změní prohozením dvou bajtů. Swapy jsou řízeny čítači i a j , každý zpočátku 0. Chcete -li získat nové i , přidejte 1. Chcete -li získat nové j , přidejte bajt pole do nového i . Vyměňte bajty pole na i a j . Kód je bajt pole na součtu bajtů pole na i a j . Toto je XOR s bajtem prostého textu k šifrování nebo šifrovacím textem k dešifrování. Pole se inicializuje tak, že ho nejprve nastavíte na 0 až 255. Poté jej procházejte pomocí i a j , získáte nové j tak, že do něj přidáte bajt pole na i a klíčový bajt a prohodíte bajty pole na i a j . Nakonec i i j jsou nastaveny na 0. Všechna přidání jsou modulo 256.

Následující verze Standard Forth používá pouze slova Core a Core Extension.

0 value ii        0 value jj
0 value KeyAddr   0 value KeyLen
create SArray   256 allot   \ state array of 256 bytes
: KeyArray      KeyLen mod   KeyAddr ;

: get_byte      + c@ ;
: set_byte      + c! ;
: as_byte       255 and ;
: reset_ij      0 TO ii   0 TO jj ;
: i_update      1 +   as_byte TO ii ;
: j_update      ii SArray get_byte +   as_byte TO jj ;
: swap_s_ij
    jj SArray get_byte
       ii SArray get_byte  jj SArray set_byte
    ii SArray set_byte
;

: rc4_init ( KeyAddr KeyLen -- )
    256 min TO KeyLen   TO KeyAddr
    256 0 DO   i i SArray set_byte   LOOP
    reset_ij
    BEGIN
        ii KeyArray get_byte   jj +  j_update
        swap_s_ij
        ii 255 < WHILE
        ii i_update
    REPEAT
    reset_ij
;
: rc4_byte
    ii i_update   jj j_update
    swap_s_ij
    ii SArray get_byte   jj SArray get_byte +   as_byte SArray get_byte  xor
;

Toto je jeden z mnoha způsobů testování kódu:

hex
create AKey   61 c, 8A c, 63 c, D2 c, FB c,
: test   cr   0 DO  rc4_byte . LOOP  cr ;
AKey 5 rc4_init
2C F9 4C EE DC  5 test   \ output should be: F1 38 29 C9 DE

Implementace

Protože je Forth snadno implementovatelný a nemá standardní referenční implementaci, existuje mnoho verzí jazyka. Kromě podpory standardních variant systémů stolních počítačů ( POSIX , Microsoft Windows , macOS ) se mnoho z těchto systémů Forth zaměřuje také na řadu vestavěných systémů . Zde jsou uvedeny některé z dalších systémů, které vyhovují normě ANS Forth z roku 1994.

  • Gforth , přenosná implementace ANS Forth z projektu GNU
  • Swift Forth, implementace generování strojového kódu od společnosti Forth, Inc.
  • VFX Forth, optimalizace nativního kódu Forth
  • Otevřete firmware , zavaděč a standard firmwaru založený na ANS Forth
  • pForth , přenosný Forth napsaný v C
  • Implementace SP-Forth , ANS Forth od Russian Forth Interest Group (RuFIG)

Viz také

  • RTX2010 , CPU, které běží Forth nativně

Reference

Další čtení