Common Lisp (1) - história Lispu

Common Lisp (1) - história Lispu
11.02.2008 13:00 | Články | Adam Sloboda

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.

    • pekny clanok 11.02.2008 | 22:04
      Avatar Matej Krajčovič Ubuntu 8.10  Používateľ
      pekny clanok vela stastia v pokracovani
      You are registered as user #457083 with the Linux Counter.<br/> Given enough eyeballs, all bugs are shallow.<br/>
    • knižnice 14.02.2008 | 22:31
      Avatar Jaroslav Bernát BackTrack 3  Používateľ
      myslím, že bez knižníc je nepoužiteľný. vieš mi povedať aké OO knižnice sa v ňom dajú použiť ?
      ked nevieš, tak nefušuj
      • Re: knižnice 15.02.2008 | 01:59
        autor   Návštevník
        Nepouzitelny pre teba, pre mnozstvo inych ludi prave naopak. To mi pripomina jeden citat.
        Please don't assume Lisp is only useful for Animation and Graphics, AI, Bioinformatics, B2B and E-Commerce, Data Mining, EDA/Semiconductor applications, Expert Systems, Finance, Intelligent Agents, Knowledge Management, Mechanical CAD, Modeling and Simulation, Natural Language, Optimization, Research, Risk Analysis, Scheduling, Telecom, and Web Authoring just because these are the only things they happened to list.

        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?
        • Re: knižnice 19.02.2008 | 13:51
          Avatar Jaroslav Bernát BackTrack 3  Používateľ
          OOP = Objektovo Orientované Programovanie. myslím že si to budeš vedieť vyvodiť :)
          ked nevieš, tak nefušuj
          • Re: knižnice 19.02.2008 | 19:46
            autor   Návštevník
            Neviem ako to suvisi s temou, no to bude asi tym, ze ja nehodnotim kniznice podla paradigmy ale podla toho ako dobre plnia svoj ucel (priklad: netusim aku zasadnu vyhodu by mala regexp kniznica ktora funguje cez objekty, cl-ppcre to proste nepotrebuje).
      • Re: knižnice 23.02.2008 | 11:13
        PF_   Návštevník
        Prakticky všechny větší knihovny v Lispu využívají OOP. Navíc objektový systém Common Lispu je "trošku jiný", do takové míry, že tahle otázka možná postrádá smysl. :-) (Není problém psát metody, které vůbec nevyužívají třídy, například, a doplnit polymorfní objektové rozhraní nad netřídní data - ne neobjektová, v Lispu je objekt všechno.)
    • Nebi sa tak do prs Adam 20.02.2008 | 10:33
      Palo   Návštevník
      ... mimochodom ... moholo si zacat na arclanguage.org :) ak ti to nieco hovori.
      • Re: Nebi sa tak do prs Adam 20.02.2008 | 11:06
        autor   Návštevník
        Vzhladom na to, ze je to o Common Lispe a nie o Arcu, tak som naozaj nemohol. A tiez neviem naco by to bolo, ked CL ma vyladene implementacie s kompilaciou do nativneho kodu (open source SBCL) a Arc je zatial len v plienkach (MzScheme).
      • Re: Nebi sa tak do prs Adam 23.02.2008 | 11:07
        Kyo   Návštevník
        Obávám se, že s Arcem se Paul Graham značně praštil do hlavy... :-/ To už se s větší pravděpodobností Slunce změní v rudého obra, než aby Arc udělal opravdovou díru do světa. Na to obsahuje příliš mnoho koncepčních zhůvěřilostí... Trošku mi to připomíná newLISP, nad ním taky jeho příznivci v diskusích vyloženě onanují, a přitom nevidí, jaký je to bezkoncepční mišmaš.
    • lisp 21.02.2008 | 00:21
      mato   Návštevník
      Vyvojari z Naughty Dog mali naprogramovany svoj herny engine pre PS2 v LISPe.
      • Re: lisp 21.02.2008 | 15:24
        autor   Návštevník
        Take nieco som pocul. Tiez napriklad prvy Computer Algebra System bol napisany v Lispe (Macsyma, dnesna Maxima sa z neho vyvinula) a dalsi CAS je Axiom (oba su dost dobre a dnes uz open source).

        Inac nejaky zoznam s komercnym vyuzitim je na http://wiki.alu.org/Industry_Application
    • porovnavanie funkcii 17.03.2008 | 15:32
      mosi   Návštevník
      Funkcie sa stali objektom prvej triedy, je možné s nimi narábať ... ... porovnávanie, ...

      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
      • Re: porovnavanie funkcii 17.03.2008 | 19:10
        autor   Návštevník
        To je len jedna z vlastnosti, ktora z toho vyplyva (lebo musi).

        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...