Tere tulemast AKT kursusele!
Meie soov on, et peale kursuse läbimist oleks Sul sügavam arusaamine arvutiprogrammide tähendusest ja seetõttu oskad paremini programmeerida. Ü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, oleme sunnitud sellest keelest päriselt aru saama ja oskame paremini ka oma lauseid moodustada.
Selles dokumendis kirjeldame õppekorraldust ja anname 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)
Need punktid liidame kokku ja hindamisskaala on lõpuks selline, et >50 on E, >60 on D, ..., >90 on A. Teooriat hindame Moodle'i kordamistestidega ja loenguküsimustega. Iga loengutesti eest on võimalik saada kuni 1 punkt. Teste teeme igas loengus, aga arvesse lähevad ainult 10 parimat sooritust.
Kodutööde korraldusest
Aines on kokku 10 põhilist kodutööd. Neile lisaks on väga palju teisi huvitavaid ülesandeid, mida saab lisaks teha, kui tahad veelgi targemaks saada. Laseme Sul endal otsustada, kui palju aega soovid neisse investeerida. Iga ülesande juures täpsustame selle eesmärgi ning toome eraldi välja ka kodutööd, mis on eksami ettevalmistamiseks olulisemad.
Kodutööde hindamine käib automaattestide alusel. Anname täisarv punkte juba sellise lahenduse eest, mis läbib ainult ühe testi. See on sellepärast, et pöörata rohkem tähelepanu programmi disainile ja julgustada suurema kodutöö puhul lihtsalt alustama! Kodutöödele anname tagasiside järgmiselt:
- Reedeti näitame praktikumis, kuidas meie seda ülesannet lahendaks ja anname üldise tagasiside teie katsetele.
- Konkreetse tagasiside saamiseks tuleb küsida juhendaja käest meie kursuse Fleepis. Anname tagasisidet 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 Arutelu. Räägime teooriast! Enne loengut tuleb vaadata paar lühikest videot ja/või lugeda vastav õpiku peatükk. Selle kohta lahendame loengus ActiveQuiz küsimusi. Kolmapäevaks paneme välja ka järgmise kodutöö ja soovitame sellele juba pilgu peale heita.
- R 14:15 Ühispraktikum. (Kaugõppes asendub videotega!) Selles arutame eelmise nädala kodutööd. Näitame, kuidas meie seda lahendaksime ja miks meie lahendus on teie lahendustest palju parem. Tegelikult on eesmärk anda üldist tagasisidet ja kommenteerida selle ülesande erinevaid lahendusvariante. Tutvustame ka uut kodutööd ja alustame kodutöödega sarnaste ülesannete lahendamist.
- E-T Praktikumid. Jätkame kodutöödega sarnaste ülesannete lahendamist ja vastame teie küsimustele. Palume selleks ajaks kindlasti loengu materjalidega, kodutööga ja kordamistesti küsimustega tutvuda, et oleksid vähemalt kodutööga algust teinud. Seal praktikumis tehakse kodutöö algus igal juhul ära. Ära lase neil Sinult seda õppimisvõimalust röövida!
- T-N Fleep! Kodutööde lahendamisel eeldame, et tekivad probleemid 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.
- N 23:59 Kordamistesti tähtaeg. Kordamistestiga tasub varakult tutvust teha. Seda võib teha nii palju kordi kui vaja, et nädala materjal selgeks saaks. Kordamistesti kohta saab samuti küsimusi küsida Fleepis. Tähtaeg on kodutööga samal ajal, et oleks lihtsam, aga ideaalne oleks seda teha enne järgmise nädala loengut!
- N 23:59 Kodutöö tähtaeg. Tegelikult võiks varem lahendada, et saaks probleemide korral õigeaegselt abi küsida. Moodle'i esitust hoiame lahti kuni neljapäevani. Reedel arutame lahendusi, mistõttu neljapäev on range tähtaeg. Kui tähtaeg on langenud, siis teeme ka lahti eetikatesti.
- N 23:59 Eetikatesti tähtaeg! Eetikatestide tähtaeg on samuti neljapäeviti, aga see on nädal hiljem eelmise nädala teemade kohta. Vaatame eetikatesti üle reedestes loengutes ja parem on see pigem vara ära teha, et saaksid juba edasi liikuda järgmise nädala teemaga.
Kaugõppe ajal asendub reedene loeng enamasti lihtsalt videotega. Kolmapäevane loeng toimub kell 10:15-12:00 ja ainult sellel ajal on võimalik saada ActiveQuiz ülesannete lahendamise eest punkte!
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 teostada.
- Leksiline analüüs. Peame alustama keele sõnade äratundmisega. Programmeerimiskeelte sõnu kirjeldatakse regulaaravaldistega, aga need on ka niisama kasulikud ja 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. Mini AKTK (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. Regex (regulaaravaldised Javas). Loengus defineeritakse regulaaravaldised teoreetilisest vaatenurgast. Kodutöös proovime neid Javas kasutada, aga alustame ka nende uurimist, et saaks ise regulaaravaldisi manipuleerida.
- 3. NFA realiseerimine (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 regulaaravaldisega või mitte. Selleks on vaja, et saaksime 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. Käsitsi lekser. 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. Käsitsi parser. Parseri kirjutamine on oluliselt mõnusam ja tegelikult üks suurepärane harjutus rekursiooni kohta. 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, 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. Nüüd oleme 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! Soovime Sulle edu oma sisemise programmeerija avastamisel ja palume probleemide tekkimisel kohe Fleepis abi küsida!