Tere tulemast AKT kursusele!
Meie soov on see, et peale kursuse läbimist oleks Sul sügavam arusaamine arvutiprogrammide tähendusest ja seetõttu oskad paremini programmeerida. Me üritame seda saavutada ühelt poolt programmeerimise harjutustega ja teiselt poolt interpretaatori ja kompilaatori ehitamisega. Kui oleme aru saanud, kuidas programmeerimiskeele käsud täidetakse ja transleeritakse, siis oleme sunnitud sellest keelest päriselt aru saama ja oskame paremini ka oma lauseid moodustada.
Selles dokumendis kirjeldame õppekorraldust ja üritame anda suurema pildi, kuidas kursuse kodutööd on omavahel seotud.
Tegevused ja hindamine
Meil on aine ülesehitatud niimoodi, et semestri jooksul harjutame ja eksamil toimub põhiline hindamine. Semestri jooksul tahame punkte jagada lahkelt õpiprotsessist osalemise eest:
- Harjutamine (30 punkti)
- Programmeerimisharjutused (10 punkti)
- Kordamistestid (10 punkti)
- Eetika ja reflekteerimine (10 punkti)
- Eksam (70 punkti)
- Loengu ActiveQuiz (10 punkti)
Neid punkte liidame kokku ja hindamisskaala on lõpuks selline, et >50 on E, >60 on D, ..., >90 on A. Teooria hindame Moodle'i kordamistestidega ja loenguküsimustega. Iga loengutesti eest on võimalik saada kuni 1 punkt. Me teeme neid teste igas loengus, aga arvesse lähevad ainult 10 parimat sooritust.
Kodutööde korraldusest
Meil on aines kokku 10 põhilist kodutööd. Nendele lisaks on ka väga palju teisi huvitavaid ülesandeid, mida tuleks ainult teha siis, kui tahad targemaks saada. Me laseme Sul endal aga otsustada, kui palju aega soovid nendesse investeerida. Iga ülesanne juures täpsustame selle eesmärk ja eraldi toome välja kodutööd, mis on eksami ettevalmistamiseks olulisemad.
Kodutööde hindamine käib automaattestide alusel. Me anname täisarv punkte juba sellise lahenduse eest, mis läbib ühte testi. See on sellepärast, et pöörata rohkem tähelepanu programmi disainile ja julgustada suurema kodutöö puhul lihtsalt alustada! Kodutöödele anname tagasiside järgmiselt:
- Reedeti näitame praktikumis, kuidas meie seda ülesannet lahendaks ja anname üldine tagasiside teie katsetele.
- Konkreetse tagasiside saamiseks tuleb küsida juhendaja käest meie kursuse Fleepis. Me anname tagasiside siis, kui Sul on küsimusi või avaldad kindlat soovi, et juhendaja võiks kriitilise pilguga üle vaadata.
Nädala kava
Töö korraldus sellel kursusel tiirleb kodutööde ümber. Kuna meil on erinevad praktikumide ajad, siis kodutöid tutvustatakse loengus ning seal seletatakse ka nende lahendamiseks vajalikku teooriat ja programmeerimise soovitusi. Praktikumides eeldame, et olete vähemalt kolmepäevases loengus kohal käinud või loengu salvestust vaadanud.
- K 10:15 Loeng. Räägime teooriast. Enne loengut võiks olla loetud vastav õpiku peatükk. Selle kohta lahendame loengus ActiveQuiz küsimusi. Kolmapäevaks paneme ka järgmise kodutöö välja ja soovitame juba pilk peale heita.
- R 14:15 Ühispraktikum. Selles arutame eelmise nädala kodutöö. Me näitame, kuidas meie seda lahendame ja miks meie lahendus on teie lahendustest palju parem. Tegelikult on eesmärk anda üldine tagaiside ja kommenteerida selle ülesanne lahendusvariante. Me tutvustame ka uut kodutööd ja alustame kodutöödega sarnaste ülesannete lahendamist.
- E-T Praktikumid. Jätkavad kodutöödega sarnaste ülesannete lahendamist ja vastavame teie küsimustele. Palume selleks ajaks loengu materjalidega, kodutööga ja kordamistesti küsimustega tutvuda, et oled vähemalt kodutööle alguse teinud. Seal praktikumis tehakse kodutöö algust ikkagi ära. Ära lase iga kord neil Sinult seda õppimisvõimalust röövida!
- T-N Fleep! Kodutööde lahendamisel me eeldame, et tekkivad probleeme ja mõnedel kodutöödel on vähe selgitusi, kuidas peaks lahendama. See ei tähenda, et ei või küsida täpsustusi ja selgitusi juurde! Selleks on Fleepi abikeskus.
- K 10:00 Kordamistesti tähtaeg. Tasub varakult sellega tutvust teha. Seda võib teha nii palju kordi kui vaja, et nädala materjal saaks selgeks. Kordamistesti kohta saab samuti küsimusi küsida Fleepis.
- N 14:00 Kodutöö tähtaeg. Tegelikult võiks varem lahendada, et probleemide korral saaks õigeaegselt abi küsida. Me hoiame Moodle'i lahti kuni neljapäevani. Reedel arutame lahendusi, mistõttu neljapäev 14:00 on range tähtaeg. Kui tähtaeg on langenud, siis teema ka lahti eetikatesti.
- K 10:00 Eetikatesti tähtaeg! Eetikatestide tähtaeg on samuti kolmapäeviti, aga see on eelmise nädala teemade kohta. Me vaatame eetikatesti üle reedestes loengutes ja parem on seda pigem vara ära teha, et saaksid juba edasi liikuda järgmise nädala teemaga.
Kodutööde plaan
Kursuse lõpuks oled oma käega ühe lihtsa keele jaoks kompilaatori ehitanud, aga enne kui ANTLRiga keelte disainimise juurde läheme, tuleb mõndadest keele spetsifitseerimise koostisosadest põhjalikumalt aru saada ja neid enda käega implementeerida.
- Leksiline analüüs. Me peame alustama keele sõnade äratundmisega. Programmeerimiskeelte sõnu kirjeldatakse regulaaravaldistega, aga need on ka niisama kasulikud ja me peatume nende juures natuke. Meie esimese projekti lõppsiht on implementeerida töövahend nimega grep, mis trükib välja failist kõik sellised read, mis sobituvad etteantud regulaaravaldisega. Kõigepealt aga kordame natuke Javat ja kasutame regulaaravaldisi Javas.
- 1. Soojendus. Enne kui hakata siin mingeid uusi asju õppima, võiks ju proovida oma praeguste oskustega sarnast ülesannet lahendada. Esimene kodutöö ei vaja ühtegi uut mõistet, aga natuke peab muidugi mõtlema, kuidas OOPis õpitu kokku kombineerida.
- 2. Regulaaravaldised Javas. Loengus defineeritakse regulaaravaldised teoreetilisest vaatenurgast. Kodutöös proovime neid Javas kasutada, aga alustame ka nende uurimist, et saaks ise regulaaravaldisi manipuleerida.
- 3. Lõplik automaat. Meie grep töövahendi implementatsiooni idee on teisendada regulaaravaldis mittedeterministlikuks lõplikuks automaadiks. Siis saab iga sõna puhul kiiresti öelda, kas see sobitub regulaaravaldisele või mitte. Selleks on vaja, et me saaks mittedeterministlikke automaate käivitada!
- 4. Grep. Lõpuks teisendame eelmise kodutöö regulaaravaldised automaatideks, mis kokku moodustavad ühe natuke lihtsustatud grepi implementatsiooni.
- Süntaksanalüüs. Järgmisena tuleks sõnadest moodustada laused. Keele süntaks defineeritakse grammatikate abil. Tutvume selle mõistega ja siis proovime käsitsi kirjutada oma süntaksianalüsaatori. Hiljem genereerime seda osa automaatselt, aga alguses on hea teada selle tööriista põhimõtteid.
- 5. Lexer. Käsitsi lekseri kirjutamine on üks suhteliselt tüütu tegevus, aga üks kord elus võiks selle ikkagi proovida läbi teha. Sel ajal võiks ka selle tööpõhimõtte, maximal munch, selgeks saada.
- 6. Parser. Parseri kirjutamine on oluliselt mõnusam ja tegelikult üks suurepärane harjutus rekursiooni kohta. Me harjutame seetõttu ka mingite pisikeste grammatikate teisendamist parseriteks.
- Kompilaator. Nüüd oleme lõpuks valmis kasutama seda maagilist tööriista ANTLR, et defineerida oma keele grammatika ja sealt edasi minna ka interpretaatori ning päris kompilaatorini, mis genereerib Java virtuaalmasina baitkoodi.
- 7. ANTLR. Kui oskame keele süntaksi grammatika abil spetsifitseerida, siis võib sellest automaatselt parseri koodi genereerida. Grammatika defineerib keele süntaksi, aga võib-olla mitte kõige paremini selle keele sisulist struktuuri. Seetõttu annab ANTLRi parser meile automaatselt programmile vastava parsepuu, aga seda tuleks natuke teisendada, et jõuda sisulisema abstraktse süntaksipuuni.
- 8. Interpretaator. Me oleme nüüd valmis etteantud süntaksipuud väärtustama! Selle lahendamisel peame mõtlema ka selle peale, mida me täpselt kirjutame, sest tegelikult võiks meil olla ettekujutus programmi täitmise protsessist. Mida paremini oskad enda peas programmi "interpreteerida", seda paremini oskad ka programmeerida.
- 9. Semantiline analüüs. Mõned analüüsid on vaja teostada programmi vaheesituse peal, et saada selle tähendusest aru. Minimaalselt peame jälgima muutujate skoope ja seostama muutuja kasutust tema definitsiooniga.
- 10. Kompilaator. Lõpuks tõmbame otsad kokku ja genereerime Java virtuaalmasina baitkoodi ASM teegi abil. Nüüd võime ennast pidada tõsiseltvõetavaks programmeerijaks, kes on enda käega kompilaatori ehitanud! Lõpuks tõmbame otsad kokku ja genereerime Java virtuaalmasina baitkoodi abil.
See on üsna ambitsioonikas programm! Me soovime Sulle edu oma sisemise programmeerija avastamisel ja palume probleemide tekkimisel kohe Fleepis abi küsida!