Obsah
1. Shrnutí výhod a nevýhod Forthu v porovnání s jinými programovacími jazyky
1.1 Postfixová notace
1.2 Testování napsaného kódu
1.3 Vytváření a testování velkých projektů
1.4 Nekompatibilita jednotlivých implementací Forthu
1.5 Assembler
1.6 Interpreter Forthu
2. Současné použití jazyků založených na Forthu
3. Příklady použití Forthu v minulosti
3.1 Správa databáze pro řízení telefonních transakcí
3.2 Systém pro zpracování obrazu
4. Odkazy na české zdroje informací o Forthu
1. Shrnutí výhod a nevýhod Forthu v porovnání s jinými programovacími jazyky
V první kapitole si shrneme základní přednosti a nedostatky programovacího jazyka Forth, zejména se budu snažit porovnat Forth s ostatními programovacími jazyky.
1.1 Postfixová notace
O postfixové notaci, kterou Forth intenzivně používá, jsme se zmiňovali prakticky ve všech předchozích dílech tohoto seriálu. Je to totiž charakteristická část Forthu, bez jejíhož použití by se jednalo o zcela jiný programovací jazyk. Postfixová notace (RPN) je ve Forthu používána velmi důsledně, tj. jak při zápisu matematických a logických výrazů, tak i při zápisu řídicích příkazů. V tomto ohledu je Forth (a jazyky na něm postavené) jedinečný, ostatní programovací jazyky buď používají infixovou notaci (C, C++, Pascal, Delphi, Perl, …), nebo notaci prefixovou (Lisp, Scheme, Guile). Z problémově orientovaných jazyků používá postfixovou notaci například jazyk pro popis stránek PostScript a od něj odvozený formát PDF.
1.2 Testování napsaného kódu
Velmi zajímavé je, že po několikadenním používání Forthu se programátor automaticky naučí jednoduše a rychle testovat napsaná slova (funkce). Je to z toho důvodu, že testování slov je mnohem jednodušší než v jiných programovacích jazycích. Zpravidla stačí zapsat vstupní hodnoty na zásobník, zavolat testované slovo a přečíst si ze zásobníku výsledek. To vše je samozřejmě interaktivní bez nutnosti nějakého překladu nebo přepínání do debuggeru. Podobně jednoduché ladění a testování nabízí pouze několik programovacích jazyků, například Lisp a dnes již částečně obstarožní Basic (plus skriptovací jazyky zakomponované do větších aplikací).
Vzhledem k tomu, že práce se zásobníkem je u delších kódů slov poněkud obtížná (programátor si musí pamatovat, co je kde uloženo, zásobník je dynamický), je programátor nucen k zápisu jednoduchých slov o délce několika instrukcí. Tato slova se pak jednoduše testují, a vzhledem k jejich krátkosti se v nich nemíchají „jablka s hruškami“ (což je případ mnoha funkcí napsaných v programovacích jazycích C a Pascal).
Typická slova vytvořená ve Forthu jsou zapsána na cca dvou až pěti řádcích, zatímco v jiných jazycích je to několikrát více – zejména je to zaviněno obtížným předáváním parametrů, vytvářením lokálních proměnných a mnohdy také snahou o efektivnost, protože volání funkcí je v těchto jazycích, na rozdíl od Forthu, poměrně zdlouhavé, jelikož se musí vytvářet celý zásobníkový rám (stack frame).
1.3 Vytváření a testování velkých projektů
Forth není, a také nikdy nebyl, určen pro práci s velkými projekty, ve skutečnosti pouze málo opravdu velkých projektů bylo ve Forthu vytvořeno a zdárně dokončeno (tj. předáno zákazníkovi a skutečně použito). Veškeré výhody Forthu se projevují zejména v menších aplikacích, v aplikacích větších je kladen důraz především na škálovatelnost, tvorbu dokumentace, OOP přístup, spolupráci více vývojářů atd. Proto se pro větší projekty používají jiné programovací jazyky (dříve se používal C++ a v dnešní době především Java) nebo kombinace více jazyků (obecně vícevrstvá architektura).
1.4 Nekompatibilita jednotlivých implementací Forthu
Jazyk Forth se vyvíjel velmi bouřlivě a byl implementován na mnoha různých (a mnohdy obskurních) procesorech a mikroprocesorech. Nepřekvapí tedy, že existuje velké množství implementací, které mezi sebou nejsou vzájemně kompatibilní. Nejhorší je, že se liší význam některých základních slov z forthovského slovníku, například slova pro vytváření smyček.
Vzájemná nekompatibilita knihoven je také problémem, se kterým se však potýká valná většina programovacích jazyků, nevyjímaje moderní jazyky, jako je Java nebo C++.
Z těchto důvodů vznikl i standard Forthu spolu se sadou knihoven. Implementace tohoto standardu se nazývají ANS Forth. I když ne všechny implementace Forthu splňují tento standard (jmenujme například oblíbený 4th), bývají v dokumentaci rozdíly oproti ANS Forthu zmíněny.
ANS Forth byl vytvořen tak, aby se v něm neopakovaly některé „historické omyly“, které by jazyk do budoucna zbytečně zatěžovaly (v C patří mezi takové zkameněliny například způsob zápisu funkcí podle K&R nebo implicitní návratové hodnoty funkcí). Proto jsou také některé konstrukce známé ze starších Forthů v ANS Forthu nepoužitelné. Obecně je však možné říci, že jednotlivé implementace Forthu mezi sebou nejsou kompatibilní a při přenosu programů mezi různými dialekty se musí provést mnohdy netriviální úpravy.
1.5 Assembler
Většina systémů založených na jazyku Forth obsahuje i výkonný makro assembler. Tento assembler je určený buď přímo pro platformu, na které Forth běží, nebo i pro jinou platformu – potom vlastně Forth pracuje jako crosscompiler pro překlad aplikací na jiný typ procesoru či výpočetního systému.
Kód v assembleru je možné zapisovat pomocí forthovského slova CODE, přičemž je možné vzájemně míchat forthovský kód s assemblerovským. Syntax forthovského assembleru je upravena tak, aby se co nejvíce usnadnil přechod na jiný typ procesoru. Tento stav je tedy podobný situacím, ve kterých se používá například GNU assembler, ovšem s tím rozdílem, že forthovský assembler je čitelnější (GNU assembler je pouze back-end pro GNU C a další překladače, proto je de facto write-only s minimem kontroly chyb).
Forthovský assembler dokonce podporoval strukturované programování, protože nabízel makra jako BEGIN, UNTIL a IF-ELSE-THEN, podobně jako samotný Forth. To znamená, že se ve zdrojovém kódu eliminovaly prakticky veškeré skokové instrukce, které velmi znepřehledňují assemblerovské zdrojové texty. Ve výsledném strojovém kódu se samozřejmě pro implementaci strukturovaných konstrukcí podmíněné a nepodmíněné skoky používaly.
Registry byly označovány čísly, což je pro alespoň teoretickou přenositelnost výhodnější než označení písmeny či skupinami písmen. Jedinou výjimkou je ukazatel na vrchol zásobníku, který je, díky své důležitosti při práci se zásobníkem, označen písmenem S. Vlastní zápis instrukcí se většinou řídil podle originálního assembleru, který byl dodáván přímo výrobcem procesoru.
Obecně je možné říci, že podpora práce s assemblerem je ve Forthu jedna z nejlépe propracovaných, ovšem je nutné říci, že i v některých jiných programovacích jazycích a jejich implementacích se dá s assemblerem pracovat na velmi dobré úrovni, včetně míchání obou kódů, předávání parametrů atd. (jmenujme například Watcom C, Borland Pascal apod.).
1.6 Interpreter Forthu
Forth byl původně vytvořen jako interpretovaný jazyk. Běh programu, napsaného v jazyce Forth a předkompilovaného do zásobníkového kódu, je řízen poměrně krátkou rutinou o velikosti jednotek, maximálně desítek strojových instrukcí. Tato rutina postupně načítá a interpretuje kódy forthových slov, které jsou většinou uloženy ve formě vázaného seznamu s ukazateli na operandy.
Interpret je velmi rychlý, zejména v porovnání s klasickými interpretovanými jazyky, jako je Lisp, Prolog nebo Basic. Rychlost je dokonce vyšší než u javovských interpreterů, a to z toho důvodu, že forthový mezikód (tj. kódy slov) je jednodušší než kódy javovského bytekódu a při interpretaci tohoto kódu se nepoužívají žádné testy na přetečení apod. – vše je v rukou programátora, stejně jako v programovacím jazyku C.
Podobně jako bytekód Javy a Smalltalku je i bytekód Forthu velmi úsporný, protože aritmetické a logické instrukce pracují se zásobníkem – není proto potřeba ukládat adresy operandů. Typicky bývá každé slovo uloženo v jednom či dvou bytech, výjimkou je samozřejmě zápis literálu (tj. konstanty, jež má být uložena na zásobník operandů), který podle bitové šířky čísel zabírá 2, 4 nebo i 8 bytů (poslední údaj je platný pro datové typy double a long int, samozřejmě za předpokladu, že je daná implementace Forthu podporuje).
2. Současné použití jazyků založených na Forthu
Jednou z velmi zdařilých implementací jazyka založeného na Forthu je systém OpenBoot resp. Open Firmware, který vyvinula firma Sun (nejenom) pro svoji platformu Sparc.
Kromě jednotlivých implementací Forthu také vznikají poněkud odlišné jazyky, které si z Forthu vybírají pouze některé jeho vlastnosti. Jednou z význačných vlastností Forthu je způsob předávání a vracení parametrů funkcím.
Všechny parametry se předávají na zásobníku, což není dnes nic neobvyklého (snad kromě Fortranu, který se také stále v určitých oblastech používá). Také výsledky funkcí se však ve Forthu předávají přes zásobník a nikoli v registru. To znamená, že funkce může ve Forthu jednoduše vracet několik hodnot bez složité manipulace s ukazateli a referencemi. Forthovský způsob práce s parametry a návratovými hodnotami funkcí je tak velmi elegantní a nezdržuje vytváření programu (na rozdíl od ostatních jazyků, např. C, kde se musí chvíli přemýšlet a kontrolovat správné naplnění). Způsob práce se zásobníkem přímo převzal a poněkud rozšířil funkcionální programovací jazyk Joy.
Prakticky nejrozšířenějším jazykem založeným na Forthu je však PostScript. S jistou mírou nepřesnosti je možné říct, že prakticky každé PC a každý Macintosh obsahuje na svém disku alespoň jeden program napsaný v PostScriptu, tj. tiskovou stranu či strany uložené v souboru s koncovkou .ps
, .eps
či .pdf
. Každá postscriptová tiskárna obsahuje interpretr PostScriptu, stejně tak jako některé aplikace – GhostScript, Adobe Illustrator, Corel Draw, částečně i aplikace Office apod.
3. Příklady použití Forthu v minulosti
V této kapitole budou popsány některé významné aplikace založené na Forthu.
3.1 Správa databáze pro řízení telefonních transakcí
Jednou z prvních velkých zakázek, jejíž programové zabezpečení bylo vytvořeno ve Forthu, byl systém pro řízení telefonních transakcí. Tento systém, který si objednala firma Cybek Corporation, podporoval až 32 terminálů umožňujících přístup k databázi s 300 MB uložených transakcí. V pozdější době došlo k rozšíření systému – podporoval 64 terminálů a databázi o velikosti 600 MB.
Zatímco při zadání projektu bylo požadováno, aby systém zvládl 40000 transakcí za den, ve skutečnosti bylo dosaženo rychlosti 100000 transakcí denně, tedy 2,5 krát tolik.
Zajímavé bylo, že se nepoužíval žádný operační systém, veškerá funkcionalita vstupně-výstupních operací byla napsána ve Forthu. To bylo umožněno zejména díky tomu, že ve Forthu je velmi snadné pracovat s blokovým souborovým systémem, což je při práci s databází mnohem výhodnější než dnes převážně používaný „streamový“ přístup (samozřejmě za předpokladu, že řádky v tabulce mají stejnou velikost).
Tento systém je prý dodnes prodáván jednou z divizí firmy McDonnell Douglas, ale osobně o jeho dalším vývoji žádné přesnější informace nemám.
3.2 Systém pro zpracování obrazu
Systém pro zpracování obrazu vytvořila firma FORTH Inc. (kterou spoluzakládal Chuck Moore) pro NASA, přesněji pro Greenwich Observatory in England. Systém však byl po dokončení použit na více místech. Při vývoji tohoto systému byl vytvořen nový interpreter Forthu, který používal speciální operace pro celočíselné dělení a také dělení ve formátu pevné řádové tečky (fixed point).
Jedná se pravděpodobně o jeden z nejúspěšnějších projektů, které kdy byly ve Forthu vytvořeny (a o kterých se obecně ví, otázkou samozřejmě je, kolik projektů je neveřejných). Ani ne tak komerčním úspěchem, ale faktem, že se při práci na projektu vyjasnily některé postupy používané v objektově orientovaném programování.
Při zpracování rastrového obrazu je používána sada standardních, neměnných operací, jako je filtrace pomocí konvolučního filtru, aplikace FFT transformace apod. Proto je vytvoření systému pro práci s obrazy v lecčems podobné databázím, kde obrazy odpovídají datům a operace s obrazy operacím s databází. Při práci s obrázky se opět využíval blokově orientovaný souborový systém.
Při vytváření aplikací pro zpracování rastrového obrazu zde firma FORTH Inc. použila některé postupy, které se později staly základem objektově orientovaného programování. Jedná se zejména o:
- zapouzdření – rastrový obrázek je považován za objekt s mnoha parametry a metodami, které na něj lze aplikovat.
- dědičnost – je možné vytvořit nový obraz na základě obrazu stávajícího, přičemž si nový obraz od svého předka převezme všechny vlastnosti, tj. rozlišení, barevnou hloubku, formát pixelů atd.
- polymorfismus – operace (metody) mohou pracovat nad obrazem s rozdílnými parametry, například FFT lze použít jak na černobílý obraz, tak na obraz ve formátu TrueColor.
Moore, který systém z velké části vytvářel, nevěděl nic o akademických výsledcích z oblasti OOP, takže vlastně principy OOP spoluobjevil samostatně – takto ostatně na více místech světa víceméně současně vznikly i další objevy a postupy.
4. Odkazy na české zdroje informací o Forthu
V této podkapitole budou uvedeny odkazy na další zdroje o zásobníkových procesorech a programovacím jazyku Forth, které lze najít na Internetu. Zaměřím se především na informační zdroje dostupné v českém jazyce.
- www.hnilica.cz/book/forth/index.html – rozsáhlá site Radka Hnilici o Forthu, která má přehledný a strukturovaný formát stránek, avšak některé kapitoly nejsou prozatím dokončeny.
- Forth a imperativní paradigma – stránky Petra Erbena a Petra Koňaříka o Forthu.
5. Odkazy na světové zdroje informací o Forthu
V této kapitole budou uvedeny odkazy na zahraniční zdroje informací o Forhu a zásobníkových procesorech:
- www.forth.org/fig.html – stránka mezinárodní neziskové organizace nazvané FIG – Forth Interest Group. Toto sdružení se zaměřuje na rozšiřování informací o programovacím jazyku Forth, popis programovacích nástrojů a volných implementací Forthu na různých platformách a v neposlední řadě i na šíření referenčních materiálů o ANS-Forthu.
- www.fig-uk.org – stránka sdružení FIG UK – The United Kingdom Forth Interest Group. Jedná se o jedno z prvních sdružení FIG, které se zaměřuje na vydávání časopisu ForthWrite (6 čísel za rok) a také na údržbu a rozšiřování rozsáhlé knihovny zaměřené na Forth. Členové tohoto sdružení pochází zejména z Velké Británie, někteří členové jsou však i z USA, Ruska, Japonska apod.
- www.colorforth.com – domácí stránka Chucka Moorea, vynálezce Forthu. Na této stránce jsou k dispozici některé technické detaily o zásobníkových procesorech a zejména popis systému ColorForth spolu s jeho zdrojovými texty napsanými v assembleru.
- zforth.com – takzvaný The Forth Programming Webring, počátek řetězce stránek věnovaných Forthu a příbuzným tématům. Zajímavé je, že tento server je vytvořen pomocí systému zHTTP, který je napsaný v dialektu programovacího jazyka Forth nazvaném zForth.
- www.forth.com – úvodní stránka firmy Forth Inc., která vytváří komerční verze programovacího jazyka Forth spolu s propracovaným vývojovým prostředím, na stránce lze nalézt i odkaz na známý SwiftForth. Spoluzakladatelem této firmy je Chuck Moore – viz také druhý díl tohoto seriálu.
- playground.sun.com/1275/home.html – stránka, na které je popsán Open Firmware, tj. technologie pro systémově nezávislou tvorbu ovladačů. Bližší informace o této velmi zajímavé technologii byly uvedeny v dvanácté části tohoto seriálu.
- www.hp.com/calculators/articles/rpn.html – stránka firmy HP, na které je velmi podrobně popsána obrácená polská notace (RPN – Reverse Polish Notation), která je použita jak u kalkulátorů této firmy, tak i při zápisu výrazů v programovacím jazyku Forth.
- en.wikipedia.org/wiki/Forth_programming_language – stránka Wikipedie o programovacím jazyku Forth.
- en.wikipedia.org/wiki/Chuck_Moore – stránka Wikipedie o Chucku Moorovi, vynálezci Forthu.
- home.earthlink.net/~mrob/pub/lang_srom.html – porovnání programovacích jazyků podle názoru programátorů.
- www.jwdt.com/~paysan/gforth.html – GForth (GNU Forth)
- www.forth.com/resources/evolution/index.html- The Evolution of Forth – velmi dobře zpracovaná historie Forthu.