OHJ-4500 Lausekielten toteutustekniikka, 2012-2013



29.10.12 palautusympäristöksi muutettu korppi.cs.tut.fi (ennen haikara)


Opinto-opas
tut.ot.lktt
Pääsivu
Harjoitustyöt
   abba
   ilmoittautuminen
   FAQ
   SVN
   LLVM
   minikaantaja
   Bonusta
Luennot
Materiaali
Lisämateriaalia
vanhaa

Tulostusversio
Sivukartta


Ohjelmistotekniikan opinnot.

Harjoitustyöt

Esivaatimukset

Huolehdi, että nämä ovat kunnossa hyvissä ajoin ennen ensimmäisen harjoitustyön palautusta.

Oletukset tekemästänne työstä

  1. Lähdekoodi ja dokumentaatio sijaitsevat Subversion-tietokannassa.
  2. Harjoitustyön lähdekoodissa on selkeästi eroteltu (esim. omiin alihakemistoihinsa) ryhmän itse tekemä koodi, automaattisesti tuotettu koodi ja käytetyt valmiit kirjastot.
  3. Harjoitustyön palautettu lähdekoodi kääntyy Lintulassa (korppi.cs.tut.fi) komennolla
    gmake PREFIX=/tmp/foobar
    ja asentuu käytettäväksi komennolla:
    gmake PREFIX=/tmp/foobar install
  4. Totetuskieli on C tai C++.
  5. Käytössä on lex+yacc työkalut tai GNU-vastineet flex+bison.
  6. Kääntäjä tuottaa koodia LLVM assemblerin avulla suoritusympäristön (lintula) binääriksi

Näistä ehdoista 1-3 ovat ehdottomia. Lopuista voidaan neuvotella korvaavia vaihtoehtoja, mutta kaikki muutokset täytyy hyväksyttää Jykellä (etukäteen ennen palautusta).

Kääntämiskomennon mukana annettava PREFIX tarkoittaa sitä, että ohjelmanne osaa asentaa kyseiseen hakemistoon kaikki suorittamiseen tarvittavat kirjastot, asetustiedostot, yms. Kääntäjäänne voi siis ajaa ko. asennuksen avulla vaikka kääntämiseen tarvitut lähdekoodit olisi jo tuhottu. Kääntäjän täytyy myös toimia vaikka se olisi käynnistetty ko. hakemiston ulkopuolelta (eli tämä siksi, että tarkastajan testejä ajetaan tyyliin: cd testiaineisto; /tmp/PREFIX/koodibinaari *.testikoodi).

Jos make:n käyttö on ruosteessa, niin sitä voi kerrata tästä OHJ:n dokumentista. PREFIX:n käytöstä on myös kurssin oma esimerkki (ZIP-tiedosto).

Palautuksen tekeminen

  1. Talleta palautusversiosi subversion-tietokantaan (svn commit). Älä taltioi binäärejä (exe tai objektit).
  2. Keksi palautuksellesi nimi ja merkitse sillä tietokantaan tiedostojesi palautusversio tags-haaraan. Esimerkiksi svn copy https://kurssisvn.cs.tut.fi:8011/ryhmat/ryhmaX/trunk https://kurssisvn.cs.tut.fi:8011/ryhmat/ryhmaX/tags/pal1_ver1
  3. Testaa palautusversiosi toimivuus!. Luo Lintulassa (korppi.cs.tut.fi) tyhjä hakemisto ja hae sinne palautusversiosi koodi komennolla svn checkout https://kurssisvn.cs.tut.fi:8011/ryhmat/ryhmaX/tags/pal1_ver1, tarkista että koodi kääntyy gmake:lla ja toimii omilla testeillänne. Jos palautusversio ei olekaan toimiva, niin tehkää tarvittavat muutokset ja merkitkää palautus jollain toisella tag-nimellä (esimerkissä vaikkapa pal1_ver2). Lintulassa (korppi.cs.tut.fi) toimimaton palautus lasketaan bumerangiksi vaikka se kuinka toimisi kotikoneella - toiminnan varmistaminen tarkastusympäristössä on ryhmän eikä tarkastajan vastuulla.
  4. Lähetä palautuksena ryhmänne tiedot ja palautuksenne tag-merkkijono sähköpostilla Jykelle (ajoissa oleva palautus on sellainen, jossa tag-komento on ajettu ja sähköposti lähetetty ennen määriteltyä viimeistä palautushetkeä). Esimerkki palautussähköpostista: ryhmä42: Jaska Jokunen, 85471 ja Bitti https://kurssisvn.cs.tut.fi:8011/ryhmat/ryhmaX/tags/pal1_ver42

Palautusten ajankohdat ja minimivaatimukset

Palautus 1 (viimeistään 18.11.2012)

Toteuta Minikääntäjä. Tässä verryttelyosuudessa on tarkoitus lähinnä tutustua kokonaisuuteen, jossa syöte jäsennetään työkaluilla lex ja yacc ja tuotetaan toimiva ohjelma .

Yhteiset vaatimukset palautuksille 2-5

  • Palautuksen mukana täytyy olla vähintään kymmenen (10) kappaletta testiohjelmia, joista näkyy miten ryhmä on itse testannut palautustaan.
  • Ryhmiä varten on perustettu svn-tietokanta, johon kaikki voivat laittaa näkyville omia testejään. Tietokannan url on https://kurssisvn.cs.tut.fi:8011/ryhmat/hiekkalaatikko/trunk ja siihen on kaikilla kurssin ryhmillä luku- ja kirjoitusoikeudet.

Palautus 2 (viimeistään 16.12.2012)

XYZZY-kielen toteutus. Kääntäjän on tunnistettava lailliset ja laittomat ohjelmat (lex+yacc).

Läpipääsyn vaatimukset:

  • Syntaksi on kerrottu yacc/bison:lle siten, että automaattia generoitaessa ei tule (dokumentoimattomia) virheilmoituksia.
  • Kääntäjä rakentaa jäsennyksen yhteydessä jäsennyspuun luetusta ohjelmasta. Tämä puurakenne tulostetaan käännöksen lopuksi, jos vastaan ei tullut syntaksivirheitä.
  • Puun ei tarvitse olla tarkka syntaksipuu vaan sitä on saanut jo muokata jatkokäsittelyä varten (AST). Tulostuksessa on kuitenkin oltava näkyvillä myös tunnistettujen alkioiden mahdolliset arvot eikä pelkästään puun solmujen nimiä. Pseudokoodista: MODULE Test; VAR i : INTEGER; BEGIN k := 42; END Test; tulostettaisiin esimerkiksi tällainen puurakenne: module ident (Test) declaration-part variable-declaration ident-list ident (i) type ident (INTEGER) statement-sequence statement assignment lside ident (k) rside expression term factor number (42)
  • import-lause toimii (siten, että se lukee export-moduulin esittelyn import-rivillä nimetyn moduulin esittelytiedostosta.)
  • Syntaksia vahditaan tarkasti kielen speksin mukaisesti. Esim. jos syntaksi sallii rakenteen if "merkkijono" then, niin se hyväksytään syntaksitarkastuksessa ja jätetään semantiikka-analyysin huoleksi onko lauseessa järkeä.
  • Virhetilanteessa ohjelmanne osaa kertoa millä syötetiedoston rivillä syntaksivirhe havaittiin. Suorituksen saa lopettaa ensimmäisen havaitun virheen jälkeen.
  • Määrittelydokumentin komentorivikäyttöliittymä on käytössä (parametrien ei tarvitse toimia, mutta käsiteltäväksi voi antaa useamman lähdekooditiedoston).
  • Ohjelmanne toimii julkisella testiaineistolla ja tarkastajan valitsemilla etukäteen julkaisemattomilla testeillä.

Palautus 3 (viimeistään 3.2.2013)

Kääntäjä tuottaa jokaisesta moduulista esittelytiedoston (moduulinimi.def).

Kääntäjän on tehtävä semantiikkatarkastukset. Semantiikkaa on määriteltynä kielen määrittelydokumentissa, näillä www-sivuilla ja luennoilla. Huomioi ainakin seuraavat asiat:

  • Tarkistetaan nimien käyttö. Tämä tarkoittaa mm.
    • Kutsuttavat aliohjelmat ovat esiteltyjä joko käännösyksikössä, import-moduulissa tai ne ovat kielen sisäisiä (Funktio ja proseduuri on esiteltynä oman koodilohkonsa sisällä eli se voi kutsua rekursiivisesti itseään).
    • Käytetyt tyyppinimet ovat esiteltyjä.
    • Kaikki nimet (qualident) viittaavat tunnettuihin rakenteisiin.
    • Nimien näkyvyydet tarkastetaan (aliohjelmien paikalliset muuttujat ja parametrit näkyvät vain aliohjelmassa).
    • Kielen varatut sanat esiintyvät vain syntaksin määrittelemässä merkityksessä.
  • Tietotyyppejä käytetään oikein.
    • Jokaisella lausekkeella on kielen ymmärtämä tietotyyppi.
    • Lausekkeessa ei tapahdu automaattisia tyyppimuunnoksia.
    • Tietotyyppien yhteensopivuus (ekvivalenssi) tarkastetaan kaikissa käyttöpaikoissa (mm. sijoitukset ja parametrienvälitys).
    • Aliohjelmien kutsuissa parametrien tietotyypit ovat oikein.
    • Kuormitetut aliohjelmat tunnistetaan.
  • const ja in muuttujia ei esiinny lvalue:na (niitä ei saa muuttaa).
  • Virhetilanteissa kerrotaan mahdollisimman selkeästi minkälainen virhe havaittiin ja millä rivillä lähdekoodia. Semantiikkavirheen havaitsemisen jälkeen ei lopeteta kääntämistä vaan jatketaan käsittelyä eteenpäin.
  • Ohjelmanne toimii julkisella testiaineistolla ja tarkastajan valitsemilla etukäteen julkaisemattomilla testeillä.

Palautus 4 (viimeistään 17.3.2013)

Minimiominaisuudet toteuttava kääntäjä. Seuraavien ominaisuuksien on toimittava:

  • Tietotyypeistä integer, string ja boolean sekä niihin viittaavista type-määrittelyistä tuotetaan toimivaa koodia lausekkeissa, muuttujissa ja aliohjelmakutsuissa (myös kielen sisäiset).
  • Moduuleista (alustuksineen), funktioista ja proseduureista tuotetaan toimivaa koodia.
  • Aliohjelmien parametrinvälitys arvonvälityksenä toimii (ja on yhteensopiva C-kielen käyttämän kutsutavan kanssa em. tietotyypeillä). out-parametrit ovat lisäominaisuus.
  • Kielen lauseet (2.3.2) toimivat.
  • Kaikista syntaktisista rakenteista, joista ei osata tuottaa ohjelmakoodia, kääntäjä antaa virheilmoituksen.

Toisin sanoen kääntäjänne pitää osata tuottaa toimiva binääri pienistä kokonaislukuja ja merkkijonoja käsittelevistä ja tulostavista ohjelmista.

Palautus 5 (viimeistään 21.4.2013)

Kääntäjän lopullinen versio dokumentoiduilla lisäominaisuuksilla.

HUOM! Palautus 4 on minimi eli kurssin läpipääsyvaatimus. Jos haluatte ykköstä paremman arvosanan, niin kääntäjän on osattava tehdä enemmän. Töiden lopullinen tarkastus menee seuraavan algoritmin mukaisesti:

  1. Lähdekoodi haetaan svn-palvelimelta.
  2. Ajetaan gmake.
  3. Ajetaan testitapauksia minimivaatimukset täyttävällä aineistolla.
  4. Päätetään riittääkö työ minimiin vai tuleeko bumerangi.
  5. Luetaan mukana toimitettu dokumentaatio.
  6. Tutkitaan tarkemmin dokumentaation kertomat ryhmän kääntäjän erityispiirteet käyttäen hyväksi ryhmän tekemää testiaineistoa (joka tulee palautuksen mukana).
  7. Kääntäjän lähdekoodia ja tuotettua assembler-koodia katselmoidaan pistokokeina sieltä & täältä.
  8. Päätetään kokonaisuuden pohjalta arvosana työstä.

Arvosteluun siis ihan oikeasti lasketaan mukaan vain erityis/lisäominaisuudet, jotka on dokumentoitu. Mikä tahansa kääntäjän piirre, jota dokumentaatio ei mainosta tarkastajalle ei ole mukana arvostelussa. Kirjoittakaa siis mukaan hyvä mainostus kääntäjänne ominaisuuksista - olivatpa ne mitä tahansa. (Mielellään ascii-tekstitiedostona tai PDF-tiedostona). Dokumentaation lisäksi laittakaa mukaan testiohjelmia, joissa tekemänne erityispiirre tulee esille.

Tehdyn lisäominaisuuden mutkikkuus vaikuttaa tietysti sen vaikutukseen arvostelussa.

Ehdotuksia siitä, mitä kääntäjän lisäominaisuudet voisivat olla.


Päivitetty viimeksi 29.10.2012 14:31 - lktt-kurssitunnus