A LISP programozási nyelv

Bevezetés

A Lisp programozási nyelv (helyesebben nyelvcsalád) hosszú történetre tekint vissza. Eredetileg rekurzív függvények absztrakt ábrázolására tervezték, de hamarosan a mesterséges intelligencia kutatás előszeretettel alkalmazott nyelvévé vált, amikor a 70-es , 80-as években ezen terület a virágkorát élte. Ma a Lisp nyelveket számos területen alkalmazzák, és közkedvelt a számításelmélet oktatásában is.

A Lisp név az angol „List Processing” (listafeldolgozás) kifejezésre vezethető vissza (maga a lisp szó angolul pöszét, pöszítést jelent.) A Lisp nyelvek fő adatstruktúrája ugyanis a láncolt lsita. Az alapvető listakezelő műveletek az összes nyelvjárásban megegyeznek. Emellett közös sajátosság a futásidejű típusosság, a funkcionális programozásra jellemző jegyek, és az, hogy a programkód adatként manipulálható.

Tetszőleges Lisp nyelven írt program azonnal felismerhető a jellegzetes szintaktikájáról. A programkód ugyanis egymásba ágyazott listák, azaz zárójelezett, ún. S-kifejezések (S-expression, sexp) sorozata. Ennek a primitív szintaktikának köszönhetően a Lisp nyelveken írt programokhoz nagyon egyszerű elemzőt (parser-t) és kódot generáló (meta-) programokat írni, ugyanakkor emberi szemmel könnyű elveszni a nyitó- és csukózárójelek erdejében. A könnyű elemezhetőség volt az egyik oka a nyelv népszerűségének a 70-es években, amikor még nem volt elegendő számítási kapacitás összetett, többmenetes fordító- és értelmezőprogramok futtatásához.

Formális specifikációjának első, 1958-ban készített változatával a Lisp a második legöregebb magas szintű programozási nyelv (a FORTRAN után). A megalkotása óta elmúlt közel 50 évben a nyelv sokat változott, és számos nyelvjárással gazdagodott. A ma legelterjedtebb változatai az általános célú Common Lisp és Scheme nyelvek.

Történet

A Lisp nyelvet John McCarthy alkotta meg 1958-ban, mialatt az MIT-n dolgozott. Eredményeit 1960-ban publikálta („Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I.”). Cikkében rámutatott, hogy pár egyszerű operátor és egy függvények ábrázolására alkalmas primitív szintaktika segítségével teljes értékű, általános programozási nyelv alkotható. A matematikában ez a gondolat Alonzo Church újfajta matematikai logikai rendszere, az 1930-as és 40-es években kidolgozott lambda-kalkulus révén már korábban ismert volt.

Az első Lisp értelmezőt Steve Russel készítette egy IBM 704 típusú számítógépre, amelynek két alacsony szintű utasítása a nyelv két legfontosabb, listák felbontására használt függvénye lett: car (Contents of Address Register) és cdr (Contents of Decrement Register). A legtöbb ma létező Lisp nyelvjárás még mindig ezt a két operátort használja listák fejének, azaz első elemének, ill. farkának, azaz az összes többi elemének a lekérdezéséhez.

A Lisp kifejező erejének és rugalmasságának köszönhetően gyorsan népszerűvé vált a mesterséges intelligencia kutatói közösség körében. Számos előnye mellett a Lispnek természetesen megvannak az árnyoldalai: a programok jelentős mennyiségű, részeredményként szolgáló adatot gyártanak, amelyek foglalják a memóriát. Az ilyen rövid időre lefoglalt memóriaterületeket rendszeresen fel kell szabadítani egy ún. hulladékgyűjtő algoritmus (garbage collector) segítségével. Ez komoly problémát jelentett a 70-es évek memóriában és számítási kapacitásban szűkölködő számítógépeinek. Az egyre növekvő felhasználói tábor igényeinek és kormányzati támogatásnak köszönhetően végül megszületett a Lispgép, azaz a célzottan Lisp programok futtatására készített számítógép. Mára a hulladékgyűjtő algoritmusok, a fordító- és értelmezőprogramok fejlődésének, a memória- és számítási kapacitás robbanásszerű növekedésének következtében a Lispgépekhez hasonló dedikált megoldások feleslegessé váltak.

Az 1980-as és 90-es években komoly energiát fordítottak az egyre jobban eltávolodó nyelvjárások egyesítésére, ennek eredménye a Common Lisp, amely magába foglalta a kiváltani kívánt dialektusok összes lényeges tulajdonságát. 1994-ben az Amerikai Szabványügyi Hivatal, az ANSI nyilvánosságra hozta a nyelvjárást specifikáló szabványt (ANSI X3.226-1994). Ekkorra azonban a Lisp használata a 70-es évek virágkorához képest már jelentősen visszaszorult.

A számítógép-programozásban ma alapvető és teljesen általános esetszétválasztásos (ha ..., akkor ..., egyébként ...) vezérlési szerkezetet McCarthy vezette be a Lispben, amelyet aztán az ALGOL átvett és népszerűsített.

Miért válasszuk a Lisp nyelvet?

Nem is olyan rég, ha megkérdeztünk valakit, hogy a Lisp-et hol használják, akkor azt a választ kaptuk, hogy „a mesterséges intelligenciában”. Tulajdonképpen a Lisp és MI szoros kapcsolata, csak egy történelmi véletlen. A Lisp nyelvet John McCarthy fejlesztette ki, akinek a nevéhez fűződik a „mesterséges intelligencia” kifejezés megalkotása is. Diákjai és kollégái Lisp nyelven írták programjaikat és így vált a Lisp az MI első számú nyelvévé.

Szerencsére mára már elterjedt, hogy a Lisp nem csak az MI-re való. Számos előnye megmutatkozik újkeletű hardware és software technológiákban, amik bizonyítják, hogy a Lisp ma is életképes programozási nyelv. A Lispet alkalmazza például a GNU Emacs szövegszerkesztő program, az AutoCAD (a személyi számítógépeken piacvezető, mérnöki tervező szoftver), és az Interleaf, a világ egyik vezető megjelenítő programja. Ezekben a programokban a Lisp használatának módjához semmi köze az MI-hez.

Tehát a Lisp nem az MI nyelve, akkor mi az? Ahelyett, hogy a Lispet az őt birtokló cég alapján ítélnénk meg, vizsgáljuk meg a nyelvet közelebbről. Mit lehet csinálni Lispben, amit nem lehet más nyelvekben? A Lisp talán legjellegzetesebb tulajdonsága a programozhatóság. A Lisp nyelv önmaga is egy Lisp program, egy Lisp program pedig kifejezhető láncolt listákkal, amik Lisp adatstruktúrák. Együtt ez a két alapelv azt eredményezi, hogy bármely felhasználó hozzáadhat operátorokat a Lisphez, amelyek teljesen megkülönbözhetetlenek azoktól, amelyek beépítettek.

Szóval miért is?

Mert a Lisp megadja azt a szabadságot, hogy saját operátorokat definiáljunk, amiket aztán beleolvaszthatunk abba a nyelvbe, amire nekünk szükségünk van. Azaz, ha pl egy szövegszerkesztőt programot szeretnénk írni, akkor a Lisp nyelv egy olyan nyelvvé alakítható, amellyel könnyedén írhatunk szövegszerkesztő programokat stb. És ha nem vagyunk biztosak benne, hogy milyen programot írunk, akkor is érdemes Lispet használni. Bármilyen fajta program is lesz, a Lisp egy olyan nyelvvé fog alakulni, amiben az adott fajtájú programot könnyű programozni.