Hlavní navigace

Programovací jazyk Forth a zásobníkové procesory (3)

25. 1. 2005
Doba čtení: 10 minut

Sdílet

V dnešním pokračování seriálu o programovacím jazyku Forth si řekneme zajímavé informace o duchovním otci Forthu - Chucku Moorovi, zejména o jeho přístupu k programovacím technikám a celkovému designu výpočetních systémů. Kromě toho budou popsána některá dostupná vývojová prostředí Forthu, zejména s ohledem na operační systém Linux.

Obsah

1. Charles Moore a programovací jazyk Forth

    1.1 Prvotiny Forthu
    1.2 Styl práce
    1.3 Filozofie návrhu systémů
    1.4 Modulární, strukturované a objektově orientované programování
2. Dostupná vývojová prostředí a implementace Forthu
    2.1 GNU Forth
    2.2 kForth
    2.3 4th
    2.4 atlast
    2.5 Color Forth
3. Obsah dalšího pokračování
 

1. Charles Moore a programovací jazyk Forth

1.1 Prvotiny Forthu

Jak jsme si již uvedli v předchozích dvou dílech, byly první verze Forthu, tehdy ještě ve formě maker pro assembler, vytvořeny v National Radio Astronomy Observatory na počátku sedmdesátých let minulého století. Tyto „prvotiny“ byly vytvářeny tak, aby splňovaly pouze požadavky svého programátora, čemuž také odpovídá minimalistická koncepce celého jazyka.

Duchovní otec Forthu a také první programátor, který tento jazyk v praxi využíval (to mnohdy není totéž!), se jmenuje Charles Moore. Jeho osobní stránku naleznete na adrese www.colorforth­.com, kde také uvádí odkaz na své nejnovější minimalistické dílko ColorForth. Tento zajímavý dialekt Forthu si zevrubně popíšeme v následující kapitole.

Moore je rozený minimalista, což se projevuje ve všech programech a systémech, který vytvořil (a není jich málo). Moore je také spoluzakladatelem firmy FORTH, Inc., později však tuto firmu opustil a živil se jako nezávislý konzultant a programátor při vývoji vestavěných (embedded) systémů a systémů pro zpracování obrazu (image processing).

Charles Moore v NRAO
Obrázek 1: Charles Moore sedící u NRAO

1.2 Styl práce

Když Moore pracoval pro firmu FORTH, Inc., propagoval poněkud zvláštní postup při zpracování zakázky. Před vlastním vývojem zakázky pro zákazníka totiž vždy osobně na jeho počítač (pokaždé se mohlo jednat o zcela novou platformu) nainstaloval Forth, který předtím přeložil cross-platformovým překladačem.

S postupem času však tato praxe přestala být uplatňována, zejména kvůli rostoucímu počtu zakázek a také zvyšujícímu se počtu počítačů, na kterých zákazníkovy programy měly pracovat. (Dovedete si představit, že by tímto způsobem pracovali například Linus Torvalds či dokonce Bill Gates? :-)

Moore si s sebou na mikrofiších neustále nosil výpisy programů z předchozích zakázek včetně všech driverů a obslužných rutin periferních zařízení. V průběhu vývoje dalších systémů pro zákazníky Moore vývojové prostředí Forthu i jeho knihovny neustále zlepšoval a upravoval. Často používaná slova (funkce) se v případě úspěšného otestování dostala do rodícího se standardu Forhu. Moore často u zákazníků celý systém i s jeho základy upravoval.

I dnes není nic neobvyklého na tom, že se v průběhu zpracování zakázky zlepšují programové knihovny, které jsou použity v další zakázce. Moore tento postup také často využíval, a tak neustále inovoval už nainstalované knihovny, což však přispívalo ke zmatkům, protože vedle sebe pracovaly různé verze knihoven.

To se samozřejmě moc nelíbilo vedení firmy ani jeho spolupracovníkům, protože takto v podstatě neexistovaly dvě stejné instalace Forthu. Říká se, že Moorovi spolupracovníci museli každý večer celý systém zkontrolovat a zjistit, jestli se chová tak, jak má (resp. tak, jak se choval předchozí den). V důsledku těchto neshod pravděpodobně došlo i k jeho odchodu z firmy.

1.3 Filozofie návrhu systémů

Moorova filozofie při návrhu systému se dá shrnout do věty: počet možných vylepšení či nových vlastností vytvářeného systému je nekonečný, proto je pravděpodobnost jejich skutečné potřeby nulová. To znamená, že každá funkce i jednotlivá instrukce použitá ve vyvíjeném programu musí programátora nejdříve přesvědčit o své prospěšnosti, jelikož v opačném případě je odstraněna.

Moore tuto svou filozofii uplatnil nejenom při vývoji programových systémů, ale také při návrhu mikroprocesorů. V některém s dalších pokračování tohoto seriálu si popíšeme i jeho minimalistický dvouzásobníkový mikroprocesor F21, který používá pouze pětibitový instrukční kód (tj. maximální počet instrukcí je roven třiceti dvěma, ne všechny instrukční kódy jsou však využity).

1.4 Modulární, strukturované a objektově orientované programování

Charles Moore také nezávisle na ostatních vytvořil a používal modulární a strukturované programování. Když se seznámil se slavným Dijkstrovým článkem o strukturovaném programování, řekl prý pouze:

„It just seems like good programming practise to me.“

V pozdějších dobách při vývoji systému pro zpracování obrazu (viz další díly tohoto seriálu) dokonce vyvinul principy OOP, opět nezávisle na tehdejších akademických pracích.

Poznámka: Zmíněný Dijkstrův článek o strukturovaném programování byl mnoha pozdějšími autory překroucen do nařízení ve stylu: zákaz používání příkazu goto. To je samozřejmě nesmysl, protože strukturovaně lze psát v každém imperativním jazyku, a to dokonce pouze s příkazy goto a if. Strukturované (ale i objektové) programování není determinováno pouze programovacím jazykem, ale především způsobem psaní programů.

2. Dostupná vývojová prostředí a implementace Forthu

Programovací jazyk Forth dosáhl vrcholu své popularity v polovině osmdesátých let minulého století. V té době pro něj již existovalo velké množství vývojových prostředí dodávaných různými firmami. Tato vývojová prostředí se však nepodobala dnešním rozsáhlým IDE – většinou se jednalo o celoobrazovkové (z dnešního pohledu však velmi jednoduché až primitivní) editory se zabudovaným interpreterem či překladačem jazyka Forth.

Některá komerčně dostupná vývojová prostředí se prodávají i dnes (například SwiftForth), my se však zaměříme zejména na systémy, které jsou volně dostupné. Ideální jsou samozřejmě systémy licencované pomocí GPL či podobné licence. Tyto forthovské systémy jsou buď přímo vytvářeny pro Linux, nebo jsou na Linux jednoduše portovatelné.

2.1 GNU Forth

Velká a stále rostoucí skupina vývojových aplikací šířených pod GNU licencí obsahuje i interpreter jazyka Forth. Tento interpreter se jmenuje Gforth, což je zkrácenina z plného názvu GNU Forth. Tvůrci této verze Forthu si vytkli tři cíle:

  1. Gforth by měl dodržovat stávající standardy, tj. v tomto případě ANS Forth. Dodržování standardů je jednou z nejpříjemnějších věcí, které aplikace pod GNU licencí nabízejí, a v tomto případě je to velmi podstatné, protože vznik dalšího nestandardního dialektu Forthu by byl kontraproduktivní.
  2. Gforth by měl být také modelem, tj. měl by přesně vymezit implementačně závislé detaily. Jedná se také o důležitou věc, jejíž význam se projeví až při použití aplikace napsané ve Forthu na více platformách.
  3. Gforth by měl být standardem, což se mu však, vzhledem k poněkud ne-Forthovské filozofii, nedaří. Tato implementace totiž při práci neposkytuje pravý Forth-feel, takže si na něj ortodoxní programátoři ve Forthu nechtějí zvyknout.

Gforth je napsaný v programovacím jazyku GNU C (jsou použita některá rozšíření GNU C, běžné C-čko nelze pro překlad použít), čímž je zajištěna přenositelnost interpreteru na prakticky všechny významné platformy, protože GNU C je dnes portované prakticky kamkoliv. Jak je u slušných programů pod GNU licencí zvykem, je dodávána i dokumentace v .info formátu, která v dnešní době obsahuje cca 270 kB textů, takže se jedná o poměrně dlouhé počtení.

Kromě dodržení standardu ANS Forth obsahuje Gforth i četná rozšíření, z nichž nejzajímavější je podpora aritmetických operací s čísly uloženými ve formátu plovoucí čárky a snadná práce s lokálními proměnnými, jejichž použitím lze eliminovat mnoho operací nad zásobníkem operandů.

Také matematické operace jsou rozšířeny o další funkce (slova). Příjemné je zejména slovo pro bezpečné dělení nulou a slovo /mod, které provádí dělení a současně operaci modulo. Výsledky obou těchto operací jsou uloženy na zásobník operandů.

Gforth lze použít buď jako klasický interpreter (ala Perl), nebo lze načíst a spustit obraz přeloženého programu (podobné Javě). Poslední možností je integrovat Gforth do jiné aplikace a použít ho tak jako skriptovací jazyk. Pro tento účel je však v mnoha případech výhodnější použít menší atlast, který je popsán v podkapitole 2.4.

2.2 kForth

Implementace Forthu od firmy Creative Consulting for Research and Education, jež je nazvaná kForth, je vytvořena taktéž pod GNU licencí. Vytvořený jazyk odpovídá ve většině oblastí normě ANS Forth s tím, že některá implementačně závislá slova mají v kForthu jiný význam než v normě.

kForthje naprogramován ve třech jazycích: C++, C a assembleru. V assembleru je vytvořena pouze časově kritická část – některá základní slova a část virtuálního stroje. Vlastní interaktivní prostředí je vytvořeno v C++.

kForth lze opět použít buď jako interpreter, nebo jako vestavěný skriptovací jazyk. Příkladem vestavění kForthu do jiné aplikace může být program XYPLOT.

Jako perličku na závěr uvedu dialog uživatele s kForthem tak, jak je vypsán v dokumentaci (sudé řádky píše uživatel, liché systém):

Ready!
3 4 + .
7  ok
bye
Goodbye.

2.3 4th

„If you can use fopen(), you can write a compiler.“,
„If you can do BASIC, you can do 4tH.“ 

4tHje překladač i interpreter Forthu, který sice přesně neodpovídá jeho ANSI specifikaci, ale většina starších programů by v něm měla jít přeložit. Výjimku tvoří pouze programy určené pro systémy se šestnáctibitovými operacemi, které 4tH nepodporuje. Jedná se o systém novější generace, který je naprogramovaný v jazyce C (starší Forthy jsou psány, jak již víme, v assembleru).

Přenositelnost tohoto systému je zaručena především použitým překladačem a stylem programování. V současné době jsou k dispozici jak zdrojové soubory, tak i binární verze pro Linux, MS-DOS a MS Windows.

Z dostupných zdrojových kódů systému 4tH lze vytvořit jak klasický překladač, tak i knihovnu, kterou lze přilinkovat k jiné aplikaci, a Forth tak používat jako skriptovací jazyk. Při skriptování je však zapotřebí nejdříve zdrojový kód ve Forthu přeložit do takzvaného H-kódu, a teprve tento kód interpretovat:

// překlad kódu ve Forthu
// (je uložený v C-čkovém řetězci)
object=comp_4th(source);

// interpretace přeloženého kódu
ReturnVal=exec_4th(object, argc, argv, 3, Var1, Var2, Var3); 

2.4 atlast

„Some people like to use Forth as scripting language for applications that are otherwise written in C, C++, or some other language.“

Velmi zajímavým jazykem, který je založený na Forthu, je vybaven projekt atlast. Jedná se o interpretr jazyka, který se až na několik maličkostí rovná Forthu, tj. jde o jazyk založený na zásobníku operandů a zásobníku návratových adres, který využívá stejné syntaxe jako Forth a taktéž nabízí téměř stejný repertoár zabudovaných slov.

Autor projektu atlast dříve pracoval pro firmu Autodesk, kde byl tento projekt používán. Autorova profesní minulost je patrná i z příkladů, ve kterých porovnává programy napsané v C-čku, Lispu a atlastu.

Lisp, resp. jeho dialekt AutoLISP, je používán například v programu AutoCAD, a právě díky spojení CAD systému a programovacího skriptovacího jazyka se AutoCAD stal velmi populární, protože se v něm daly jednoduše psát i složité nadstavby.

Autor atlastu také prosazuje názor, že všechny aplikace by měly být programovatelné, resp. skriptovatelné, neboť to zvyšuje jejich použitelnost. S tím lze pouze souhlasit, stačí se podívat, kolik složitých nadstavbových aplikací je vytvořeno například nad AutoCADem, Microsoft Office, Lotus Notesem nebo Emacsem. Ale i pomocí jednoduchého skriptovacího jazyka a menšího množství funkcí se možnosti aplikací rozšiřují, příkladem budiž vim nebo hra Abusenaskripto­vaná v Lispu.

Odlišnosti projektu atlast od Forthu vycházejí z toho, že se jedná o interpretr, který je určen pro zabudování do dalších aplikací. Poměrně jednoduchým způsobem (podrobně popsaným v dokumentaci) lze interpreter spojit s vyvíjenou aplikací, zaregistrovat důležité funkce vytvořené v aplikaci a potom z interpreteru tyto funkce jednoduše volat.

Parametry se předávají, jak jinak, na zásobníku operandů. Samotný interpret se od většiny jiných implementací Forthu odlišuje v tom, že základním datovým typem je 32bitový integer (ostatní Forthy se většinou konzervativně drží 16bitové reprezentace) a dalším přímo podporovaným typem je datový typ double.

Spojení atlastu s vyví­jenou aplikací je tak jednoduché, že vytvoření základního interaktivního prostředí se zabudovaným interpreterem je otázkou cca deseti řádků v C-čku. Takto vytvořená aplikace má po slinkování velikost pouhých cca 50 kB, přičemž v sobě obsahuje i zabudované knihovní funkce pro vstup/výstup, matematiku apod. Z toho je patrné, že zabudovaný interpreter zvyšuje celkové systémové nároky aplikace pouze nepatrně, na rozdíl od jiných vestavných interpreterů, např. Pythonu, Perlu či Lispu.

2.5 Color Forth

Jelikož je Forth velmi snadno implementovatelný, existuje několik systémů určených převážně pro experimentování. Tyto systémy se nehodí pro širší využití, protože za jejich vývojem nestojí žádná silná firma ani silná vývojářská komunita.

Jednou z velmi zajímavých experimentálních implementací Forthu je ColorForth. ColorForth nevytvořil nikdo jiný než Charles Moore. Jedná se o minimalistický dialekt Forthu, který pro svůj běh nepotřebuje dokonce ani operační systém! Veškerá data jsou uložena pouze na několika prvních sektorech diskety, systém se tedy spouští podobným způsobem jako například známý MemTest nebo jádro systému uložené na disketě bez systému souborů.

ColorForthem se budu podrobněji zabývat v některém z dalších pokračování tohoto seriálu.

root_podpora

Charles Moore propaguje Color Forth
Obrázek 2: Charles Moore propaguje Color Forth

3. Obsah dalšího pokračování

V dalším pokračování tohoto seriálu si už konečně popíšeme základy práce s Forthem, zejména si vysvětlíme funkci jeho dvou zásobníků a postfixovou notaci při zápisu výrazů a příkazů.

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.