Problemy lispu
Tato skolicka navazuje na skolicku o zakladech lispu
Za univerzalnost se plati a protoze moje skolicky vyvolaly vlnu odporu
rozhodl jsem se davy uhyckat tim ze napisu o problemech kterymi lisp trpi Jsem
v lispu zacatecnik a mozna nektere problemy ani problemy nejsou ale snad to v
zasade bude dobre
- lisp nejde rozumne kompilovat. Vychazi to ztoho ze kod se muze generovat
za behu dokonce ruzne menit. Proto kompilery lispu zpocivaji v tom ze
zdrojak predkousou tak aby se lepe cetl tedy aby cisla byla cisla apod.
Samozdrejme ze lisp prelozit jde-stejne se nakonec provadi v assembleru
ale nejde v zadnem pripade kompilovat tak optimalne jako treba cecko
uz jenom proto ze + je funkce ne konstrukce kompileru tim nejde
zkompilovat do instrukce add ale musi se volat nejaka rutina. Take
protoze objekty nejsou jenom data ale hodne informaci kolem nejdou
davat promene do registru. Proste kdyz zkompilujete lisp ve vzniklem
exaci je stejne interpretr lispu a nejak predkousany zdrojak. A protoze
zdrojak je tak jednoduchy a interpretace rychla neni kompilace vlastne
vubec treba.
- Je tezke urcit kdy uz objekt neni dale treba drzet v pameti. Pri
kazdem eval se novy objekt vytvori. Ruseni nepotrebnych objektu se
v odborne literature rika garbage collection neboli zbirani smeti.
Profesori co trpe komplexy menecenosti a maji pocit ze by si je mohli
studenti plect z popelari pouzivaji pojem regenerace pameti(storage
regeneration) coz zni jepe ale je to to same. Algoritmu na to je nekolik.
priklad: Ja ve svem interpretru si u kazdeho objektu pamatuju kolik
objektu na nej ukazuje. Pokud cislo klesne na 0 objekt rusim pritom
snizim cislo vsem objektum na ktere ukazuje a tam cely proces opakuju.
Je to rychle a elegantni reseni ale je tezke to v interpretru odladit
obcas na objekt sice zadny bezny objekt neukazuje ale pouziva ho
interpretr-hlavne objekty vznikle po read a eval. Musim tedy to cislo
zvetsit jako kdyby nekdo ukazoval. Take kdyz se objekt zmeni-zacne
ukazovat jinam musim zapracovat. Proste neni to uplne jednoduche.
Treba emacs to resi jinak. To tam objekty vesele nechava a teprve
kdyz ma pocit ze pameti je malo napise garbage collecting a projde
celou strukturu objektu oznaci je a neoznacene smaze. Myslim ze toto
reseni je mnohem pomalejsi narocnejsi na pamet ale jednodusi na
odladeni. Take je nutne si v lispovych programech hlidat promene a
nastavovat jim nil aby se vymazaly z pameti kdyz uz nejsou treba.
Proste uvolnovani pameti po promenych neni tak uplne automaticke
a samozdrejme jako v cecku a je treba se vic hlidat.
- Prefixova matematika je dost neprehledna a setq misto = taky
prehlednosti moc neprida. Je to tim ze lisp nebyl navrzen jako drtic
cisel. Proste lisp oplyva zavorakmi a v editoru ktery neukazuje co
jste prave uzavreli jste ztraceni.
- V lispu neni moc standartu-clisp je moc rozsahly aby kazdy toolkit
ho implementoval. Scheme je zase moc jednoducha a lispari si na
ni nechteji zvyknout. Proto kdyz z clispu prejdete na emacs musite
se ucit novou knihovnu. Je to sice problem na chvili ale situaci
to stezuje.
- Presto ze interpretace lispu je rychla je tu problem z knihovnamy.
Bezny programator lispu pousti jednu knihovni funkci za druhou
a ty uz jsou relativne pomale protoze jsou taky interpretrovane
Proto je nutne nejdulezitejsi zasti knihoven implementovat jako
primitivni funkce v cecku aby se dosahlo rozumne rychlosti.
- Velky pocet objektu z ruznymi daty navic a vsechny dynamicky alokovane
celkem sezere pamet. Proto velke programy v lispu jsou narocnejsi
na pamet(emacs)
No jak vidite lisp ma take sve problemy(I kdyz mene nez uz uvedene
printf). Jsou zpusobene tim ze lisp schovava vetsinu rysu pocitace a je
hodne vysoky jazyk. Proto se nehodi na psani rychlych systemovych nebo
matematickych veci a neleze cecku do zeli. Na druhou stranu cecko leze
do zeli lispovi. Tam kde by se lisp moc hodil se dneska cecko pouziva.
Ja osobne si myslim ze cecko je skvele na:
Psani systemu a podobnych veci.
Psani rychlych jednoucelovych hlavne matematicky zalozenych programu.
Psani kratsich programu u kterych presne vite co chcete udelat-proste do
mesice musis udelat to a to a my ti zaplatime a ze uz nikdy nikdo nebude
program rozsirovat.
Programy co potrebuji rychlost a optimalnost-dema,hry,pakovace,nektera
grafika jako raytracing
Na druhou stranu lisp je skvely na psani programu u kterych presne
nevite co chcete-treba toolkitu na hru kde presne nevite jake hry v nem
budete delat nebo nejaky vyvoj treba umele inteligence kde potrebujete
rychle a jednoduse program ladit a menit. Programy co by mely byt
rozsiritelne.
Ze vsecho nejlepsi je to kombinovat-treba abuse co grafiku,zvuky a
animace dela v cecku a ovladani panacka ostatnich priserek,editor levelu
a podobne veci co se pri dalsi hre zmeni ma udelane v lispovi. Nebo
emacs co ma v cecku opravdu jen kostru a vsechny funkce editoru - treba
pro programovani: barevna syntaxe, doskakovani na zavorky, indentovani
tedy vylepseni upravy zdrojaku, zpousteni kompileru a rozebirani
chyboveho vystupu, interface do debuggeru,spelling chcek apod. Je napsan
v lispovi je tedy ve forme knihovny co muze pouzit jak uzivatel tak
programator co dela interface treba pro novy kompiler. Taky se lisp moc
hodi na odzkouseni ruznych strestenych napadu jako jsou objekty, navrh
noveho jazyka, vyvoj umele inteligence nebo jine zajimave vedevke
projekty.
Proste lisp ma smysl umet stejne jako cecko. Jsou to dva moc dobre
jazyky a kazdy se hodi na neco.
Tim hodlam skolicky o lispu uzavrit a venovat se lispovym jazykum jako
tcl apod.
Tento soubor je soucasti rozsahle sbirky skolicek na
http://www.ucw.cz/~hubicka/skolicky
Take si muzete prohlidnout jeji puvodni textovou podobu
Nebo mi mailnout na
hubicka@ucw.cz
Copyright (C) Jan Hubicka 1995