• physis
    #38
    Kedves Vardar.

    A funkcionális programozás történetének leírása talán nem is offtopic: jó példa lehet arra, hogy a maguk idejében elvadultnak tűnő kutatások mára az ipar szerves részévé nőtték ki magukat.

    A történetet ott kezdeném, hogy programozási nyelvek előbb léteztek, mint számítógépek. Elméleti célokra használták őket. A matematika elméleti megalapozására tett kísérletek során számos új kérdés merült föl. Például: mi az egyáltalán, hogy ,,algoritmus'' (matematikai egyértelműséggel megfoglamazva, tehát nem élőszóban)? Lehetségesek önmagukra hivatkozó algoritmusok? (ismert anekdota: a király azt mondja az halálraítéltnek, hogy mondjon egy mondatot, és ha az igaz, akkor főbelövik, ha hazug, akkor meg fölakasztják. Az elitélt azt mondja "fölakasztanak", a király meg kénytelen szabadon engedni. A trükk lényege az így előállt szituáció önhivatkozó mivolta.) Ezek fontosságára talán rávilágít, hogy a Gödel tétel bizonyítása is önhivatkozó állításon alapszik. (A Gödel tétel talán legérdekesebb jelentősége, hogy a matematika végtelen. Soha nem fogják lezárni, és ezt be is lehet bizonyítani.)

    Szóval, formális eszközöket (köztük algoritmusleíró eszközöket) már jóval a gépek előtt használtak a matematikusok (főleg metamatematikai célokra). Ezek egy része lényegében programnyelvnek is tekinthető. 1924-ben már volt ilyen, és már az 1930-as években több ilyen is lett, ezek lényegesen különböztek egymástól, és teljesen más elveken alapultak. (Szóval a programnyelvek bábeli sokasága szintén megelőzte azt, hogy egyáltalán lett volna számítógép.)

    Ezek közül, a ma elterjedt imperatív programnyelvek többségéhez (de méginkább az assemblyhez) talán az ún ,,Turing-gép'' megközelítés hasonlított a legjobban. Belső állapot (kvázi "regiszterek"), végtelen külső tár, ugrások...

    Azonban -- már 1924-ben! -- létezett egy másik megközelítés is. A program: függvény, valami adatokat bevesz, földolgozza őket és kiadja az erdményt. Lényegében a program nem más, mint egy óriási képlet. Értékadások, (globális) változók, ugrások stb. nem szükségesek, helyettük a matematikában az évezredek alatt lecsiszolódott eszkötárat használjuk. A képletek, függévények nemcsak számokat, karaktereket, szóval efféle atomi dolgokat dolgozhatnak föl, de akár más képleteket is. Éppen ezért lehet teljes funkcionális programozás kifejezőereje, mert a "képleteken dolgozó képlet" olyasféle lehetőségeket kínál, mint a hagyományos programnyelveken a metaprogramozás, vagy a szkriptek futtatásának lehetősége (ahol magukat a szkripteket is dinamikusan, programból áll1tjuk elő).

    Az eredetileg a matematika legalapjainak elméleti (esetleg filozófiai) tisztázására föltalált eszköztár azért (is) talált gyakorlati alkalmazási területeket, mert az értékadások, ugrások, változók teljes hiánya miatt a funkcionális programokat könnyű debuggolni, sőt, bizonyos hibák elvileg sem fordulhatnak elő, egyszerűen fogalmilag is elképzelhetetlenek. Úgy tudom, a funkcionális prgramok helyességbizonyítása is könnyebb, de erről a területről szinte semmit nem tudok.

    A ma használatos funkcionális nyelvek lingua franca-ja a Haskell lett, ez szinte azt a szerepet tölti be a funkcionális nyelvek közt, mint a Java az imperatív nyelvek közt, tudósok bizottsága hozta létre, és az iparban is kezd terjedni.
    Mivel a támogatása elég nagy (dokumentáció, implementáció, könyvtárak, eszközök), ezért talán vele érdemes megismerkedni elsőnek a funkcionális világból.