Lisp – programovateľný programovací jazyk. Kde sa vzal a čím je výnimočný?
Tento na prvý pohľad odlišný jazyk je druhý najstarší vysokoúrovňový programovací jazyk (1958), ktorý je stále používaný (len Fortran je starší) a dodnes má čo poskytnúť. Common Lisp je jeho moderný potomok, v skratke ho možno charakterizovať ako prevažne funkcionálny, procedurálny alebo objektovo orientovaný, lexically scoped, silne typovaný, dynamický. Lisp znamená LISt Processing a zoznam (list) je jeho hlavný dátový typ.
Hneď od začiatku spomínam jeho odlišnosť a je to práve preto, že Lisp je tak trochu iný. Paul Graham spísal v deviatich bodoch ako sa Lisp odlíšil od iných jazykov. Niektoré z týchto bodov sú dnes už považované za samozrejmosť, niektoré sú automaticky obsiahnuté v jazykoch mladších než dve dekády a niektoré sú charakteristické len pre jazyky priamo odvodené z Lispu.
Prvé sú podmienky. Toto je už dlhú dobu považované za samozrejmosť, no prvý s tým prišiel autor Lispu – John McCarthy.
Funkcie sa stali objektom prvej triedy, je možné s nimi narábať bez obmedzenia (vytváranie za behu programu, používanie ako argument funkcie, porovnávanie, …).
Lisp prvýkrát priniesol praktické využitie rekurzie v programovaní, vynález dynamického typovania a garbage collection (automatické uvoľňovanie pamäte, na ktorú už program ničím neodkazuje).
Zdrojový kód pozostáva vždy z výrazov (expression), ktoré vracajú hodnotu. Nasledujúce dva zápisy sú preto ekvivalentné (v zmysle ich návratovej hodnoty – ak je foo
pravda, porovná x s číslom 1, inak s číslom 2, a celý výraz bude mať hodnotu tohoto porovnania):
(if foo (= x 1) (= x 2)) (= x (if foo 1 2))
Lisp je zapisovaný priamo ako strom (abstraktný syntaktický strom), hierarchiu udávajú zátvorky (S-expression).
Posledný bod vyplýva zo všetkých predchádzajúcich, je možné vytvárať nové jazyky (DSL, domain specific languages). Lisp nerozlišuje medzi dobou čítania, kompilácie a behu. Z tohoto vyplývajú rôzne výhody a možnosti, ktoré (všetky súčasne) dodnes nemá žiadny iný jazyk mimo derivátov Lispu. Menovite sú to makrá, čítacie makrá, čítanie/vytváranie/spúšťanie/vypisovanie/zmena kódu za behu, …
Tieto všetky vlastnosti charakterizujú Lisp a zatiaľ nikto nenavrhol jazyk, ktorý by bol Lispu ekvivalentný a zároveň by bol iný. Boli pokusy o odstránenie prebytočných zátvoriek, ktoré sú zosmiešňované či nenávidené, no práve tie umožňujú Lispu jeho výnimočné vlastnosti. V Lispe platí, že kód sú dáta (a dáta môžu byť kód). Dnes už bežne dynamické skriptovacie jazyky (Perl, Python, Ruby) dokážu pomocou funkcie eval
vyhodnocovať kód uložený v reťazci, Lisp toto dokáže robiť so zoznamom a narozdiel od iných jazykov nie je nemožné tento kód vďaka jeho jednoduchej syntaxi aj meniť. Ako to súvisí s XML a aké dôsledky to má je pekne vysvetlené v eseji o prirodzenosti Lispu.
Common Lisp implicitne podporuje viaceré paradigmy programovania, na objektovo orientované programovanie sa používa rozšírenie – objektový systém CLOS (Common Lisp Object System), ktorý sa stal súčasťou ANSI štandardu pre Common Lisp. Tento systém je tzv. "multiple dispatch" a je možné definovať rôzne metódy s rovnakým menom v závislosti od argumentov. Toto dáva väčšiu voľnosť než jazyky C++ a Java, ktoré sú tiež silne typované. CLOS zvláda aj viacnásobnú dedičnosť a mixiny.
CLOS vznikol ako knižnica, overil sa prakticky a bol zaradený do štandardu. Táto flexibilita umožňuje Lispu držať krok s novými myšlienkami. Ďalší takýto prípad je knižnica AspectL (aspect-oriented programming).
Common Lisp nepatrí medzi najrozšírenejšie jazyky, ale rozhodne nie je ani mŕtvy. Existujú komerčné implementácie, ktoré nie sú veľmi lacné (Allegro Common Lisp). Existujú veľké komerčné projekty založené na Lispe, jeho korene sú akademické – najmä výskum umelej inteligencie (používa sa napr. vo vesmírnych sondách). Vďaka jeho silnej histórii je rýchly, pretože inak by pred desiatkami rokov nebol vôbec použiteľný a jeho silná pozícia vo výskume umelej inteligencie spojená s financovaním americkou vládou (ako možný dôsledok studenej vojny) k optimalizácii na rýchlosť určite výrazne prispeli. Implementácie Common Lispu používajú mnoho rýchlostných trikov, jeho rýchlosť sa pre väčšinu úloh pohybuje podľa Petra Norviga asi na 20-60 percentách rýchlosti C/C++ a je 1.5 až 4× rýchlejší než Java či 10 až 50× rýchlejší než Python.
Lisp je aj vhodným jazykom na rozšírenie programov, príklad môže byť Emacs. Scheme ako priamy derivát má zastúpenie interpreterom Guile (zamýšľaný ako štandardným "extension language" pre programy GNU) alebo Script-Fu v Gimpe. Tcl, ktorý sa veľmi inšpiroval Lispom sa pokúšal presadiť Sun ako de facto štandard.
Dúfam, že sa mi podarilo navnaďiť na ďalší diel, kde si pripravíme vývojové prostredie a zoznámime sa s ním.
Poctom kniznic sa nemoze porovnavat s takym Perlom, no kniznic je dostatok a byvaju dost kvalitne (aj ked mavaju male "bus number" ;)). http://www.cliki.net/Library
A co myslis pod skratkou OO, co su "OO kniznice"? OpenOffice?
Inac nejaky zoznam s komercnym vyuzitim je na http://wiki.alu.org/Industry_Application
Mohol by si prosim uviest priklad z realneho sveta, kedy sa oplati porovnavat funkcie a na co je to dobre?
V mojom programovacom jazyku som sa s tym doteraz nestretol, tak neviem posudit.
Dik
www.mosi.sk
Takze je to dobre na to aby boli naozaj "first-class citizen" :) Porovnavat ich zrejme nebudes chciet, ale predavat ako parameter, ukladat alebo vytvarat za behu uz asi hej...