16. elokuu 2011, 16:06

Staattiset kielet kiinnostavat

Satuin törmäämään erääseen blogipostaukseen, jossa toteutetaan alkeellinen dmenu OCamlilla hyvin tiiviiseen tahtiin, ja esitellään kyseisen kielen staattisen tyypityksen hienoutta. Muutenkin staattinen tyypitys on kovaa kamaa ns. “pyramidirakentamisessa”. Se on vain niin pahkeisen erilaista dynaamiseen tyypittelyyn nähden, vähän vaikeampaa.

Muistin virkistämiseksi eräs hyvä sitaatti (Alan Perlis) tuohon pyramidirakentamiseen liittyen:

Pascal is for building pyramids – imposing, breathtaking, static structures built by armies pushing heavy blocks into place. Lisp is for building organisms – imposing, breathtaking, dynamic structures built by squads fitting fluctuating myriads of simpler organisms into place.

Ekosysteemit ja organismit ovat kivoja. Mutta mitä vikaa on pyramideissa? Ei mitään—Perlis ei siihen ottanutkaan kantaa. Pyramidit, kuten muutkin rakennelmat, vaativat hyvät piirustukset etukäteen onnistuakseen. Tämä etukäteissuunnittelu on myös pakollista, jos käytetään staattisesti tyypitettyä kieltä. C++ ja Java molemmat vähän vaativat visionäärisiä lahjoja. Haskell myös. Mutta Clojuren kanssa on voinut lähteä niistä pienimmistä palikoista liikkeelle, ja lopulta nousta palikoidensa kanssa kohti isompia kokonaisuuksia. Ei se huono systeemi ole, mutta joskus staattinen tyypitys kiinnostaisi. Se ensinnäkin on enemmän matemaattinen ja elegantimpi ratkaisu.

Ja Ocamlia kohtaan kiinnostukseni taas vähän kohosi tuon blogipostauksen myötä. Kieliperheenä ML herättää jonkin verran kiinnostusta, mutta ei kriittisen paljoa. Siihen olisi ehkä syytä: ML-sarjaa voi harjoittaa monella tasolla, ja viimeisellä tasolla on .NET-kieli F#, josta voi työelämässä olla paljon apua. OCaml tunnetaan myös suhteellisen hyvinkäännettävänä kielenä, jonka suoritusteho on C++:n maastossa. Sekös on aina hyvä idea. Luonnollisesti OCaml sisältää erinomaisen FFI:n C-kielien kanssa. Samoin kuin Haskell.

Hyvä FFI on ehdottomasti tärkeä asia pienille funktionaalikielille. Clojuren valinta Javan puolelle on supererinomainen, mutta se kostautuu sitten kriittisesti noissa käynnistysajoissa. Eihän se iso homma ole, mutta komentorivisoftat teen mieluummin Schemellä, jota olen harjoitellut. Chicken Scheme ei ole yleisimpiä schemejä, mutta se on nopeaa kieltä, ja pystyy kääntämään binääriksi.

Staattisissa kielissä on sitä jotain. Funktioprototyyppien kirjoittaminen muotoihin f : String -> [Int] kertoo jo paljon, mitä kyseinen funktio parsii. Tai vielä paremmin tyypitystä käyttäviä datatyyppejä: parseTimes : String -> [Time]. Haskell on kova tekijä näissä. Olisin kirjoittanut erään parsimisohjelman Haskellilla mieluusti, mutta se alkusuunnittelu ei ottanut tuulta alleen. Siirsin sen projektin sitten Clojuren puolelle, ja projekti onnistui hyvin.

Tageja: ,

---
---

---

Aiheen vierestä