Forth jsem v tom výčtu jazyků, se kterými jsem se setkal, zapomněl uvést. Ne, že bych v něm něco psal, ale trochu jsem si ho prošel. Ano, je rozhodně zajímavý - a k seznámení s ním mě vedly JASNĚ UVEDENÉ výhody oproti jiným jazykům: brutální minimalismus, jednoduchý koncept, dostatečná vyjadřovací schopnost. Mimo to znám forthovský bootloader z FreeBSD a musím říct, že to je moc hezká věc. Jinými slovy, milovníci Forthu mi jasně předvedli, k čemu se ten jazyk hodí víc než jiné a neotravovali mě kecy o tom, že jedině oni jsou ti správní real men, protože si pomocí nářadí vyrábí nářadí...
No vida - tak tedy Forth uznáváš. Ale jak bylo řečeno - Forth má s Lispem řadu věcí společnou:
- je minimalistický
- má neobvyklou syntaxi
- je neomezeně rozšiřitelný
- je interpretovaný, resp. "částečně kompilovaný"
- je "čistý" (to plyne z toho minimalismu)
Forth je ryze procedurální jazyk: základní lexikální jednotkou jsou tu slova, jež nevracejí žádné hodnoty, pouze operují (převážně) nad zásobníkem; teoretický základ: dvouzásobníkové automaty
Lisp je funkcionálně orientovaný jazyk: základní lexikální jednotkou jsou tu funkce, jež vždycky vracejí nějakou hodnotu; teoretický základ: lambda počet
Základní strukturou, kol níž se všechno točí, je ve Forthu zásobník. Zásobník návratových adres, zásobník parametrů a slovník, který lze považovat za třetí zásobník - zásobník slov. Zásobníky tedy ve Forthu slouží jak k ukládání dat, tak k ukládání programu.
Základní strukturou, kol níž se všechno točí v Lispu, je seznam. Slouží k ukládání dat a díky vlastnosti zvané homoikoničnost také k ukládání programu - program není nic jiného než seznam seznamů jmen funkcí a jejich parametrů.
Syntaxe obou jazyků je přímým důsledkem trvání na základním principu chápání a manipulace s daty a kódem: v případě Forthu postfixová notace přirozená pro zásobníkové operace (oddělené bílým znakem), v případě Lispu prefixová notace přirozená pro seznamy (v Lispu zapisovaných do závorek).
Forth i Lisp svou vyjadřovací sílu získávají díky zobecněním, jež lze provést díky důslednému dodržování základního (zásobníkového/seznamového) konceptu: Forth díky definujícím slovům a přímým slovům, Lisp díky makrům. Důsledkem toho je většina Forthu napsána ve Forthu a většina Lispu v Lispu a důsledkem toho jsou překladače Forthu i Lispu velmi jednoduché a efektivní.
ALE:
Zatímco Forth je nízkoúrovňový jazyk, Lisp je jazyk vysokoúrovňový.
Ve Forthu se příjemně programují a ladí embedded zařízení, ale kámen úrazu je, potřebujeme-li něco abstraktnějšího. Forth je beztypovým jazykem; samozřejmě že je možné si dodefinovat datové typy a slova, jež dokáží s těmito datovými typy pracovat - ať už staticky nebo dynamicky a provádět nějakou typovou kontrolu a implicitní konverze. Ale o co vyšší úroveň se budeme pokoušet, tím víc to bude zastiňovat hlavní výhody Forthu: rychlost a miniaturnost. Jinými slovy - existují vhodnější nástroje k těmto účelům, než je Forth. Například Lisp, který tento handicap Forthu odstraňuje. Je stejně dobře rozšiřitelný, ale neoperuje s tak nízkoúrovńovými věcmi, stojí v abstrakci výše. Lisp operuje s poměrně obecnými objekty, jako jsou CDR a CAR (zjednodušeně řečeno ukazatel na data uzlu a ukazatel na další uzel), zatímco Forth operuje se zásobníkem tvořeným buňkami, přičemž buňka není nic jiného než n-tice bitů (obvykle 16 nebo 32) a nic víc. Forth je prostě standardizovaný zásobníkový "hypermakroassembler". Pokud se pokusíme zabstraktnit Forth už na této úrovni, začne dost rychle jeho elegance a jednoduchost mizet - příkladem takového pokusu je jazyk Factor.
Pokud se ptáš k čemu jsou v Lispu makra a kdo to kdy potřebuje a že se podobného efektu dá docílit i jinak, měl by ses u Forthu ptát úplně stejně - proč by někdo měl mít potřebu definovat si vlastní definující slova, k čemu by měla být dobrá immediate-slova (neboli direktivy) atp.
Lisp je prostě jazyk, který umožňuje při programování uvažovat podobným "meta-stylem", jako Forth, ale stojí na vyšší úrovni. Ve Forthu DUP prostě zduplikuje buňku tvořící tos, 2DUP zduplikuje 2 buňky tvořící tos. Pokud bychom měli na tos strukturu nebo pole, DUPem to nezduplikujeme. Budeme potřebovat vlastní DUP nebo DUP úplně přepsat s tím, že součástí každé položky bude i informace o její velikosti, případně další informace o zacházení s ní, a už se nebude chovat tak, jako ten "normální DUP". Tohle se v Lispu už neřeší. Když chci zkopírovat seznam, tak je jedno, čím je tvořen. Když chci odebrat poslední prvek, je jedno, jestli tím prvkem je reálné číslo, celé číslo nebo třeba binární strom.
Výhody, jež Forth nabízí nad úrovní Assembleru, nabízí Lisp nad úrovní srovnatelnou např. s Pascalem.