Arvutiteaduse instituut
  1. Esileht
  2. Automaadid, keeled ja translaatorid
EN
Logi sisse

Automaadid, keeled ja translaatorid

  • Üldinfo
  • Ajakava
  • Eksami näidised
  • Teemad
    • 1. Soojendus
      • Kordamisülesanded
      • Kahendpuu
      • Kordamine*
      • Kodutöö
    • 2. Regulaaravaldised
    • 3. Automaadid
    • 4. Avaldise struktuur
    • 5. Grammatikad ja lekser
    • 6. Käsitsi parsimine
    • 7. ANTLRiga töötamine
    • 8. Interpretaator
    • 9. Kompilaator
    • 10. Edasi!
  • Süvendus
  • Bitbucket
  • Moodle
  • Zulip
  • Zoom

Java ülevaade

  • Java süntaks
  • Oracle Java tutorial, Java keele osa
    • Teemad 1-3 ja 5-6 peaks olema OOP-ist tuttavad (mõned alamteemad välja arvatud). Vaata üle, millised teemad on võõrad!
    • 4. teema, Annotatsioonid, võiks üle vaadata, aga väga tähtsaks me praegu seda ei pea.
    • Viimaseid teemasid, geneerikud ja paketid, käsitleti OOP-is väga põgusalt, aga selles kursuses on need vajalikud.
  • Oracle Java tutorial, Essential classes
    • Siit peaks olema enam-vähem tuttavad "Exceptions" ja "Basic I/O" osad.
  • Oracle Java tutorial, tähtsamat andmestruktuuride liidesed, peaksid olema OOP-ist tuttavad.
  • Java 8 API
    • http://www.allimant.org/javadoc/ -- sama info CHM formaadis
    • http://zealdocs.org/ -- dokumentatsiooni brauser
      • http://kapeli.com/dash -- Mac'i jaoks

Terminoloogia

  • class: klass
  • interface: liides
    • NB! Nii eesti kui inglise keeles on sellel sõnal ka üldisem tähendus: http://en.wikipedia.org/wiki/Interface_%28computing%29
  • type:
    • ühine nimetaja klassi või liidese jaoks
    • (avaldise või muutuja) tüüp
  • subtype
  • subclass
  • overloading: üledefineerimine
    • Küsimus: miks Java toetab üledefineerimist? Mida see annab?
  • overriding: ülekatmine
  • polymorphism: polümorfism ...
  • casting
    • väärtuse teisendus (nt. double x = 2.5; int n = (int)x )
    • tüübi täpsustamine (nt. Object obj = ...; Lammas lammas = (Lammas)obj), öeldakse ka downcasting.
      • Küsimus: miks downcasting? Kas upcasting on võimalik/vajalik?

Geneerikud e. parameetrilised tüübid (ingl generics)

Parameetriliste tüüpide idee on kaunis lihtne, aga selle kombineerimine alamtüüpimisega tekitab palju nüansse, mida vastav osa Oracle Java tutorialist üritab selgitada.

Meil praegu kõiki nüansse tarvis teada pole. Vaja on osata geneerilisi tüüpe tavalistel juhutudel kasutada (enamasti andmestruktuuridena, seda OOP-is käsitleti) ning defineerida (seda OOP-is ei käsitletud).

Iseseisev harjutus: Implementeerida lihtsustatud variant ArrayList-ist

Ei pea realiseerima kogu List liidest. Piisab kui konstruktor teeb alati tühja listi, add meetod lisab ja get meetod võtab indeksi järgi.

Esialgu on soovitav teha lihtsam variant: listi elementide hoidmiseks võib sisemas kasutada mingit olemasolevat List-i implementatsiooni.

Võib võtta šnitti järgmisest klassist:


class Box<T> {
    private T value;

    public Box(T value) {
        this.value = value;
    }

    public T getValue() {
        return this.value;
    }
}

Lõpuks tuleks variant, kus listi elemendid hoitakse massiivis. See ei lähe tõenäoliselt nii libedalt, sest massiividel on geneerikutega oma teema. Enne abi küsimist proovi siiski jõuda ise lahenduseni (guugeldamine on OK).

Paketid (ingl packages)

Vaata üle vastav osa Oracle Java tutorialist.

Kontrollküsimused

  • Kuidas saab vaikepaketis olevas klassis kasutada klassi C1, mis asub paketis a.b.c? (Siin on vähemalt kaks võimalust)
  • Kuidas saab paketis a.b.c olevas klassis kasutada klassi C2, mis asub vaikepaketis?
  • Milliseid järgmistest klassi C1 meetoditest on võimalik kasutada klassis C2, kui mõlemad klassid asuvad paketis a.b.c ja C1 nähtavus on public:
    • private void f1()
    • private String f2()
    • protected String f3()
    • public String f4()
    • String f4()
    • private static void sf1()
    • private static String sf2()
    • protected static String sf3()
    • public static String sf4()
    • String static sf4()
    • Aga kui C1 nähtavus on package private (st. ta on defineeritud ilma nähtavuse modifikaatorita)?

Varargs

Vt. jaotus "Arbitrary number of arguments" lehel http://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html

Java infrastruktuur: JVM, javac, jar, classpath

  • http://docs.oracle.com/javase/tutorial/essential/environment/cmdLineArgs.html
  • http://docs.oracle.com/javase/tutorial/essential/environment/paths.html

Harjutus: Escape HTML

Oletame, et su programmil on vaja küsida kasutajalt mingi lõik teksti ja koostada sellest lihtne HTML lehekülg, kus see tekst on pandud üheks lõiguks, nt. midagi sellist

<html>
<head><title>... kasutaja poolt käsurealt antud pealkiri ...</title></head>
<body>
<h1>... kasutaja poolt käsurealt antud pealkiri ...</h1>
<p>
... kasutaja poolt sisestatud tekst ...
</p>
</body>
</html>

Lihtsal juhul aitaks väikesest sõnekonkatenatsioonist, aga mis siis, kui kasutaja tekstis sisaldub mõni HTML erisümbol, nt. <? Õige oleks need erisümbolid enne escape'ida. Oletame, et selle lahendamiseks meeldib sulle variant, mida pakutakse siin: http://stackoverflow.com/a/6749280/261181

Kuidas edasi? Proovi lahendada see ülesanne, ja käivitada loodud programmi nii läbi IDE kui ka käsurealt. Kuidas käivitada sama programmi nii, et lõigu sisu ei pea mitte sisse tippima vaid selle saab anda ette mingist failist?

Stiil

Java keele spetsifikatsioon ei määra, kuidas tuleb joondada loogelisi sulge, kas klassi nimi peaks olema kuu_eelarve, kuueelarve või Kuu_Eelarve jms. Samas on siiski hea, kui tiimis lepitakse ka sellistes küsimustes kokku. Üks laialt kasutatav stiilijuhis on Google'i oma: https://google.github.io/styleguide/javaguide.html

Java 8

  • Lambda-avaldised

Kust leiab täpsemat infot?

Proovi vastata järgnevatele küsimustele.

  • Kas ühes klassis võivad olla meetodid signatuuridega void f(int x, int y) ja void f(int y, int x)?
  • Aga void f(int x, int y) ja void f(int y, Integer x)?
  • Aga int f() ja String f()?
  • Aga int f(int x) ja String f(float x)?

Nende vastuste peast teadmine pole väga oluline, aga vajadusel peaksid oskama vastuse leida. Kui sa pole kindel keele mingi nüansi osas, siis:

  • Katseta! IDE ja javac teavad Java reegleid päris hästi ;)
  • Guugelda!
  • Uuri järele:
    • Oracle Java tutorial
    • Java Language Specification -- mitte just kõige kergem lugemine, aga sellest võib olla abi ka siis, kui kõigist lausetest aru ei saa.
  • Boonus: mõtle, kuidas see nüanss peaks olema! Võibolla disainid just sina kunagi uue ja parema programmeerimiskeele ;)
  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Tartu Ülikooli arvutiteaduse instituudi kursuste läbiviimist toetavad järgmised programmid:
euroopa sotsiaalfondi logo