..:: Ondra[sej] :: Projekty :: Interpret jazyka LISP ::..
Ondra[sej] Home

[Tady bude nějaké moudro]

TLisp

Interpret jazyka LISP vyvinutý pro skriptování v projektech Trion teamu. Interpret je vyvíjen s důrazem na rychlost a efektivitu v interaktivním prostředí počítačových her.

TLisp :: Úvod

Historie TLispu začala když jsem se na internetu dočetl, že každý hacker by se měl LISP znát, protože po jeho naučení pochopí všechna tajemství vesmíru a nic dalšího ho nepřekvapí. Díky spolužákovi z gymnásia dostal ke staré slovenské knize "Programovanie v jazyku LISP", která navždy ovlivnila můj život...

Jazyky z rodiny LISP jsou pro svoji jednoduchost ideální pro implementaci a zabudování do dalších programů jako skriptovací jazyky. Tak došlo i k tvorbě první verze TLispu...

TLisp :: Verze 1 - TEd a spol.

První verze byla napsaná jako skriptovací jazyk pro ročníkový projekt Trion Text Editor. Šlo o velmi jednoduchou ale funkční implementaci.

Přestože tato verze fungovala pro potřeby textového editoru velmi dobře a již z textového editoru obsahovala relativně velkou knihovnu základních funkcí, pro použití v dalších (zejména herních) projektech se příliš nehodila. Základním problémem pro další použití je její vazba na Borland C++ Builder 3.0 a jeho knihovny.

Další nevýhodou první verze interpretu je nainvní implementace správy paměti s relativně pomalou alokací (pomocí new) a kontrola nedostupných bloků řešená pomocí počítání referencí. Vzhledem k možnosti vzniku cyklických struktur bylo nutné ošetření i takovýchto situací, které v důsledku mohlo při uvolňování referencí vést k častému procházení velkých struktur a tím k nechtěnému zpomalení.

V textovém editoru takové zpomalení vadit nemusí, v počítačové hře by už ale mohlo být znatelné a velmi nepříjemné pro herní zážitek.

TLisp :: Verze 2+ - Herní skriptování

Pro herní projekty Fantasy World (tahová strategie - nedokončeno a asi tak i zůstane) a Projekt 5410 se ukázalo jako nutné začlenění skriptovacího jazyka jako prostředku pro rozšíření palety možných akcí ve hře a pro usnadnění vývoje. Na jedné straně tu byly známé a obecně používané skriptovací jazyky jako je Lua a Python, na druhé straně mi přišlo líto zahodit již hotový TLisp, tak proč toho nevyužít...

Zkusmo jsem oprášil zdrojáky verze 1, ty se ale brzy ukázaly jako nepoužitelné z důvodů popsaných výše. Co mi z nich ale zůstalo byly zkušenosti (ještě o něco rozšířené znalostmi z matfyzáckých přednášek o překladačích) a nadšení pro jazyky typu LISP.

Důležité vlastnosti

První zásadní změnou bylo přeorientování celého zdrojáku na aktuální standardy C++ a nejen na ně a velký důraz na multiplatformnost. Díky tomu mohly být zdrojové kóddy interpretu současně používány v Linuxu k vývoji Fantasy Worldu i ve Windows v Projektu 5410.

Další velkou změnou byla zásadní změna způsobu správy paměti a alokovaných objektů. Pro alokování objektů je použitý vlastní velmi rychlý alokátor pracující s konstantní časovou složitostí (to je koneckonců pro jazyk typu Lisp nutnost) a dealokace je místo okamžitým testem dosažitelnosti instance nahrazena garbage collectorem.

Pro vyhledávání nedosažitelných objektů je použitý generační/ iterativní garbage collector. První (mladší) generace s konstatní velikostí slouží pro nově alokované objekty a při zaplnění je vždy procházena celá. Objekty, které se při průchodu první generací jeví jako stabilní (přežily několik průchodů garbage collectoru první generací) jsou přesunuty do druhé generace. Její velikost roste podle počtu alokovaných objektů a je procházena iterativní metodou.

Délka jedné iterace je volitelná, stejně jako velikost první generace, tak je možné vyladit interpret pro optimální výkon v libovolném typu aplikace.

TLisp :: Závěr

TLisp ve verzi 2+ se při použití v obou projektech jeví jako dobře použitelný a efektivní nástroj a do budoucna s ním počítám pro použití i v dalších herních projektech.