tiistai 3. helmikuuta 2009

Demo 3 - kommentit

Väki vähenee ja pidot paranee. Kolmannen demokerran tehtävät löytyvät osoitteesta http://users.jyu.fi/~antkaij/opetus/okp/2009/demot/3.html . Ensimmäinen tehtävä seuraili jo edellisistä demoista tuttua sanaselityskonseptia. Noista kiinnostunut kaivaa määritelmät pikaisesti vaikka Wikipediasta. :)

Toisessa tehtävässä päästiin pohtimaan Jensenin vekotinta. Jonkinmoisena johtopäätöksenä tehtävään liittyen todettakoon, että moderneissa ohjelmointikielissä samaan ja semanttisesti selkeämpään lopputulokseen pääsee esimerkiksi lambdoja käyttäen (lambda kuvaa matemaattisen funktion, mikä Jensenin versiossa seuraa tuota call-by-name ajatusta). Merkitsin sekä ensimmäisen ja toisen tehtävän tehdyiksi. Kolmannen ja neljännen jätin väliin ja niiden sijaan teinkin bonustehtävän.

Yllättäen kolmannen tehtävän oli tehnyt vain yksi demojen osanottaja. Toistaalta "tarkasti laskeminen" on teknistä puuhaa, kuten osoittautui. Neljättä tehtävää ei ollut tehnyt kukaan, joten se jäi ikäänkuin laiskanläksyksi. Toisaalta tehtävänannon pyytämän for-silmukan johtanee jossain määrin whilen määrittelystä. Suurin haaste tuossa lienee iteraatiologiikan sisällyttäminen itse lausekkeeseen jotenkin järkevällä tavalla.

Bonustehtävänä oli tällä kertaa while-kielen denotationaaliseen määritelmään pohjautuvan tulkin kirjoittaminen. Valitettavasti olin ainut, joka oli kyseisen tehtävän tekemään, joten en saanut kyhäelmälleni vertailukohtaa (tosin hieman kuuklaamalla noita varmaan löytyy). Esittämäni versio löytyy osoitteesta http://users.jyu.fi/~jutuveps/interpreter.py .

Kyseessä oli ensimmäinen kirjoittamani tulkki. Siihen nähden tuo meni ihan mukavasti. Toteutin sen interaktiiviseen tyyliin, joten käyttäjä näkee reaaliajassa mitä tulkki oikein puuhailee.

Toisaalta tuossa versiossa on muutamia kohtia joita voisi huomattavasti hioa. Näin jälkikäteen ajatellen olisi kannattanut muutama viikko sitten kirjoittamani AST (Abstract Syntax Tree) luokka naftaliinista ja hoitaa sijoitusoperaatio sen kautta. Mutta meneehän se raa'alla voimallakin. :)

Vertailuoperaattorin kohdalla itse perusajatus on nähdäkseni ihan hyvä. Tosin check_condition funktion toteutusta voisi tiivistää aavistuksen muuttamalla sen taulukkopohjaiseksi ja tekemällä vertailufunktioista lambdoja. Tuo nyt on vain pieni kauneusvirhe mutta jotain mitä tekisin toisin.

Puolipisteen käsittely on jossain määrin karmealla tavalla toteutettu. Tällä hetkellä se toimii vain yksinkertaisimmassa tapauksessaan (esim. a = 5; b = 8). Tuotakin voisi hieman miettiä uudelleen.

Tulkin kirjoittaminen ei ollut läheskään yhtä vaikeaa kuin ennalta odotin. Se sopii mukavaksi ohjelmointiharjoitukseksi, jos sattuu tylsyys yllättämään. Jos oikein aikaa riittää, voi kenties saada aikaan jotain LOLPythonin tapaista.

KTHXBYE

1 kommentti:

  1. Tulkin kirjoittaminen oli ihan pätevä harjoitustehtävä. Oma ratkaisuni on varmasti ihan omassa luokassaan (ensimmäinen tulkki :P). Hyvä vertailukohta löytyy esimerkiksi osoitteesta http://www.jroller.com/languages/entry/python_writing_a_compiler_and .

    Seuraava tulkki syntyykin sitten jo helpommin.

    VastaaPoista