Hlavní navigace

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

18. 1. 2005
Doba čtení: 9 minut

Sdílet

Ve druhém pokračování seriálu o programovacím jazyku Forth si popíšeme, ve kterých oblastech probíhalo první nasazení Forthu, způsob vzniku jména tohoto nevšedního programovacího jazyka a některé z důvodů, proč není Forth mezi programátory více rozšířen.

Obsah

1. Historie vzniku jména Forth
2. Forth na mikropočítačích
3. Forth na osmibitových mikroprocesorech
4. Forth a osmibitové domácí počítače
5. Příčiny neoblíbenosti Forthu
6. Zápis matematických operací v postfixové notaci
7. Syndrom jednoho programovacího jazyka
8. Obsah dalšího pokračování
 

1. Historie vzniku jména Forth

Charles Moore svůj programovací jazyk považoval za představitele nové, čtvrté, generace programovacích jazyků (v té době bylo módou používat slovo generace, takže se například počítače rozdělovaly na generace, podobně jako tehdejší procesory apod.). Proto jazyk pojmenoval jednoduše Fourth, ale vzhledem k tomu, že operační systém, na kterém v té době pracoval, podporoval pouze pět znaků ve jméně souborů (ne, nebyl to MS-DOS, ten podporuje revolučních 8 znaků :-), zkrátil se název vyjmutím jedné samohlásky, což je v počítačové angličtině běžné, na Forth.

Jedná se o název, který autoři různých verzí tohoto jazyka komolí, takže existuje například dialekt Forthu, který se jmenuje 4th (nutno vyslovovat anglicky).

2. Forth na mikropočítačích

Jedny z prvních verzí Forthu byly, tehdy ještě ve formě maker určených pro assembler, vytvořeny v National Radio Astronomy Observatory na počátku sedmdesátých let. Tyto prvotiny však v žádném případě nebylo možné nasadit v reálném provozu mimo observatoř, protože Forthznali v té době maximálně dva lidé :-).

První skutečné, tj. reálně použitelné systémy založené na Forthu byly vytvořeny teprve v roce 1970. Tyto systémy obsahovaly jádro (nucleus) o velikosti typicky 4 kB. V tomto jádře byly naprogramovány základní nezbytné věci jako přístup k disku nebo pásce, rozhraní k terminálům a vytvoření a přístup ke slovníku slov/funkcí (dictionary – viz další díly tohoto seriálu).

Toto jádro se používalo k překladu a následnému spuštění vlastního vývojového prostředí, které obsahovalo assembler, textový editor, podporu pro více uživatelů a několik desítek až stovek základních příkazů ve slovníku – slov (words). Bootování systému a překlad prostředí zabralo na tehdejších mikropočítačích řádově několik sekund. Při použití dnešních mikroprocesorů by se jednalo pouze o několik desítek milisekund, což je pro většinu aplikací zanedbatelná doba.

Ve Forthu byl naprogramován mimo jiné také metacompiler, pomocí kterého se jádro překládalo. Zdrojové kódy metacompileru byly dlouhé cca 40 vytištěných stran. Bližší údaje nemám k dispozici, ale lze se domnívat, že na jedné straně bylo natištěno cca 60 řádků, celý zdrojový kód tedy měl přibližně 2500 řádků. Zdrojové kódy algoritmů jsou však ve Forthu kratší než v jiných programovacích jazycích, zvláště při použití preferovaného stylu programování, tj. vytváření krátkých slov a jejich vzájemného kombinování do „vět“.

První systémy založené na Forthu byly vytvořeny tak, že nepotřebovaly žádnou podporu ze strany operačního systému – ve skutečnosti se operační systém vůbec nenahrával do operační paměti. V dalších letech se to pro některé aplikace ukázalo jako velká výhoda, zejména se projevil rychlejší přístup na disky a velmi rychlé přepínání kontextu běžících procesů.

3. Forth na osmibitových mikroprocesorech

V roce 1976 byla firma FORTH Inc. (jejím zakladatelem byl kdo jiný než Chuck Moore) požádána, aby Forth portovala na mikroprocesor CDP-1802 (mimochodem, tento procesor, určený pro vojenské a kosmické aplikace, měl velmi zajímavý instrukční soubor – viz například stránku Great Microprocessors of the Past and Present). Nový produkt byl nazván microFORTH a v dalších letech byl portován na celou skupinu vzájemně odlišných mikroprocesorů, zejména Intel 8080, Motorola 6800, MOS 6502 a Zilog Z80. Systém microFORTH byl s úspěchem použit pro vytváření průmyslových a řídících aplikací, které využívaly právě tyto osmibitové mikroprocesory. Mnohé tyto systémy prý pracují až do dnešní doby (tomu ostatně po zhlédnutí historických sdělovacích a zabezpečovacích zařízení v některých našich [polo]státních podnicích ochotně věřím – on také nebývá důvod měnit fungující zařízení).

Všechny výše zmíněné mikroprocesory jsou osmibitové a v průmyslových aplikacích byly osazeny operační pamětí o typické kapacitě 16 kB. Tyto aplikace byly spouštěny většinou z pamětí EPROM nebo PROM, protože disky se používaly pouze v minipočítačích. Ostatní firmy pro tyto mikroprocesory dodávaly buď pouze assembler, nebo jazyk PL/M (raději na něj zapomeňte), ostatní jazyky byly buď příliš náročné na systémové prostředky (C, Pascal), nebo nevhodné pro programování složitějších aplikací (Basic). V této „konkurenci“ je jasné, že se Forth velmi dobře prosazoval, zejména jako náhradaassemble­ru.

Jádro systému microFORTH mělo velikost pouze 1 kB. V tomto jádru byly definovány základní aritmetické operace (slova) pro datový typ integer a řídící cykly. Vývojové prostředí umožňovalo zápis a testování programů, stejně jako ladění jádra. Na těchto systémech však nebyly podporovány databázové funkce a také podpora multiprocessingu byla zprvu odstraněna (po několika letech však byla opět přidána).

Zajímavé je, že firma FORTH Inc. prodávala microFORTH prostřednictvím normální pošty. To v té době nebylo typické, protože bylo zvykem, že se minipočítače instalovaly zákazníkovi až spolu s potřebným softwarem. V případě microFORTHu stačilo poslat objednávku a po několika dnech přišla osmipalcová disketa s aplikací :-)

Firma FORTH Inc. však nikdy neuvolnila metakompiler, který používala pro překlad microFORTHu, což je na jednu stranu velká škoda, protože šlo o velmi dobrý systém, na druhou stranu to pozitivně podnítilo vývoj dalších verzí Forthu, zejména budoucího FIG Forthu a ANS Forthu.

4. Forth a osmibitové domácí počítače

Programovací jazyk Forth byl s poměrně velkým úspěchem použit i na osmibitových domácích počítačích. Zde se významně projevila schopnost Forthu generovat krátký kód, který bylo možné zpracovat velmi jednoduchým interpreterem. Ten byl dlouhý pouze několik strojových instrukcí.

Jednou z prvních aplikací Forthu v oblasti osmibitových počítačů byly některé systémové rutiny uložené v paměti ROM počítače ZX-81. Jednalo se o operace s hodnotami uloženými v pohyblivé řádové čárce. Pomocí Forthu byl vytvořen velmi krátký kód hojně používající smyčky a iterace. Běh rutin byl díky tomu pomalý, proto byl v dalších počítačích firmySinclair Research použit kód psaný přímo v assembleru, který však byl delší.

Osmibitový počítač ZX-81
Obrázek 1: Osmibitový počítač ZX-81

Firma Level 9 Computing vyvinula vlastní verzi Forthu, ve které potom vytvářela velké množství her typu adventure, tj. textovek s obrázky. I u těchto her bylo patrné, že se použil velmi kompaktní zápis programového kódu. Byl využit dokonce primitivní multithreading, kdy se vektorové (!) obrázky vykreslovaly současně s výpisem textu, což bylo velmi efektní, protože příkazy do her bylo možné psát ještě před vykreslením kompletních obrázků.

Screenshot hry Jewels of Darkness běžící na osmibitovém počítači Atari 800XL
Obrázek 2: Screenshot hry Jewels of Darkness běžící na osmibitovém počítači Atari 800XL

Screenshot hry Jewels of Darkness běžící na osmibitovém počítači Commodore C64
Obrázek 3: Screenshot hry Jewels of Darkness běžící na osmibitovém počítači Commodore C64

Screenshot hry Jewels of Darkness běžící na osmibitovém počítači ZX Spectrum
Obrázek 4: Screenshot hry Jewels of Darkness běžící na osmibitovém počítači ZX Spectrum

Tatáž hra, tentokrát na PC
Obrázek 5: Tatáž hra, tentokrát na PC

Vedlejším efektem použití Forthu byla i snadná přenositelnost vytvořených her – viz přiložené obrázky rozšířené verze původní slavné hry Adventure. V dnešní době multiplatformních knihoven a jazyků to sice vypadá obyčejně, ale v době největšího rozmachu osmibitových domácích počítačů byl kód ve Forthu patrně nejlépe přenositelný na další platformy, protože jiné „přenositelné“ jazyky buď vůbec neexistovaly (Java, C++, Perl), nebo nebyly pro osmibitové počítače ideální (Common Lisp, SmallTalk, C).

Osmibitové počítače ještě v době svého největšího rozmachu zažily vznik oblíbeného FIG Forthu, jehož autoři si kladli za cíl vytvořit standard mezi různými dialekty Forthu.

5. Příčiny neoblíbenosti Forthu

Forth není mezi programátory příliš oblíbený (i když podle údajů uvedených na stránce home.earthlin­k.net/~mrob/p­ub/lang_srom.htmlto není tak špatné). Důvodů je více, ale ten hlavní tkví ve způsobu zápisu výrazů a příkazů. Další důvod tkví v takzvaném „syndromu jednoho programovacího jazyka“. Oba důvody si zkusíme v dalších odstavcích blíže vysvětlit.

6. Zápis matematických operací v postfixové notaci

If you're a frequent calculator user, you owe it to yourself to investigate the advantages of RPN. RPN stands for Reverse Polish Notation. Reverse Polish Notation was developed in 1920 by Jan Lukasiewicz as a way to write a mathematical expression without using parentheses and brackets. Hewlett-Packard Co., realizing that Lukasiewicz's met­hod was superior to standard algebraic expressions when using calculators and computers, adapted RPN for its first hand-held scientific calculator, the HP35, in 1972.
Hewlett-Packard Development Company The RPN Method: An Overview and History

Programátor, který zná některý z dnes používaných procedurálních nebo objektově orientovaných jazyků (C, C++, Java,Perl, Ruby, Python, Visual Basic), je většinou překvapen, pokud poprvé uvidí program napsaný v jazyce Forth. Toto překvapení (spíš zmatení :-) je způsobeno zejména tzv. postfixovou notací zápisu aritmetických a logických operací.

Například výraz pro součet dvou čísel, který se ve většině programovacích jazyků píše ve formě:

a+b

se ve Forthu zapíše jako:

a b +

Zjednodušeně řečeno to znamená, že se v postfixové notaci nejprve zapisují operandy a teprve poté operátory. Postfixová notace se označuje také jako RPN – Reverse Polish Notation (obrácená polská notace) a používají ji mimo jiné i některé kalkulačky od firmy Hewlett-Packard (viz motto uvedené na začátku této kapitoly).

Způsobu zápisu programu ve Forthu se budeme věnovat někdy příště (spolu s vysvětlením výhod RPN), už z výše uvedeného příkladu je však zřejmé, že na člověka uvyklého běžné infixové notaci musí zápis v RPN působit zmateně.

7. Syndrom jednoho programovacího jazyka

Začnu poněkud obšírně. Většina programátorů ví, že programovat na nejnižší úrovni, tj. přímo ve strojovém kódu, není efektivní. Proto si většina z nich volí prostředek na vyšší úrovni, minimálně assembler nebo vyšší programovací jazyk, jako je například C.

Pokud programátor zná nějaký jazyk na vyšší úrovni, může ho z hlediska svých dosavadních znalostí porovnávat s jazykem na stejné či nižší úrovni. Například C-čkar může porovnávat svůj oblíbený jazyk s Pascalem, Algolem, Modulou nebo níže s assemblerem.

Vyšší jazyky porovnávat dost dobře nemůže, protože přemýšlí právě v paradigmatu toho svého jazyka. Proto je také přechod například z Pascalu do C mnohem jednodušší než (opravdový přechod) z C do C++. Na první pohled je to právě naopak, musíme však porovnávat vzniklé programy, nikoli syntaktickou podobnost.

Sám si živě pamatuji na své první programy v Pascalu, na který jsem přešel z Basicu a assembleru – často jsem používal globální proměnné a skoky, než jsem se naučil rozumně strukturované funkce smyčky. Prostě assembler a Basic vyžaduje k tvorbě programů jiný přístup než strukturované nebo (ještě hůře) OOP jazyky.

Přechod z Pascalu do C nebyl zas tak náročný, stačilo si osvojit odlišný způsob zápisu funkcí a datových typů, zápis operátorů a rozšířenou práci s ukazateli. Jinak jsou si Pascal a C (Modula, Algol, Fortran…) velmi podobné, zejména v porovnání s logickými a funkcionálními jazyky.

Objektově orientované jazyky vyžadují odlišný přístup k řešení problémů, i když je samozřejmě možné i v C++ a Javě psát pouze strukturovaně – stačí celý kód obalit do jedné třídy, protože v rámci třídy jsou metody totéž co funkce a atributy totéž co proměnné. Samozřejmě, že tento přístup není ideální, pouze má upozornit na to, že každé paradigma programování vyžaduje jiný přístup k algoritmizaci.

Stejný syndrom nastává při použití Forthu. Pokud programátor přímo s Forthem nezačíná (takový programátor dnes snad ani neexistuje), musí některé své návyky opustit a jiné se naučit, protože jinak se bude snažit tento velmi specifický jazyk „ohnout“, což pouze povede ke zklamání, chybám a k neefektivním programům.

root_podpora

Poznámka: možná je škoda, že v Javě sice existuje rezervované slovo goto, ale nelze ho použít jako klíčové slovo se zřejmým významem. Teprve poté bychom se od některých takyprogramátorů dočkali krásných začmodrchaných kódů :-) Dneska je nejlepší si přečíst nějaký komerční program napsaný ve Visual Basicu – většinou jsou všechny proměnné typu Variant a místo smyček se mnohdy vesele skáče. Z toho vyplývá, že efektivitu programování neurčuje pouze programovací ja­zyk.

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

V dalším pokračování si řekneme zajímavé informace a drby o duchovním otci Forthu – Charlesi Moorovi. Zejména je zajímavý jeho poněkud kontraverzní pohled na programovací techniky a nástroje i na budoucnost vývoje informačních technologií. Kromě toho budou popsána některá dostupná vývojová prostředí Forthu, zejména s ohledem na operační systém Linux.

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.