Kursopplegg Velkommen til INF2100 Jeg er Dag Langmyhr (dag@ifi.uio.no). Dagens tema: Hva går kurset ut på? Bakgrunn for kurset Hvordan gjennomføres kurset? Hvordan får man det godkjent? Pause (med registrering av fremmøte) Programmeringsspråket Minila En kort oversikt Syntaks Fire eksempler
Bakgrunnen Bakgrunnen for INF2100 I INF1000 20 har dere lært å programmere, men bare små programmer (< 1000 linjer). Hensikten med INF2100 er å gi mer programmeringstrening forstå mekanismene man trenger i større programmer (som objektorientering)
Prosjektet Prosjektet Prosjektet er valgt fordi det har en nytteverdi i seg selv: Skriv en kompilator for programmeringsspråket Minila. Dette gir forståelse for hvordan en kompilator fungerer kjennskap til maskin og assemblerspråk hvordan et programmeringsspråk er definert og bygget opp
En kompilator Hva gjør en kompilator? En kompilator oversetter et program til en annen kode, som maskin eller assemblerkode. C-program if (a == 0) ++a; Kompilator gcc Assemblerspråk IncI Arr* Assembler gas Maskinkode 00101111
Java kompilatoren Noen kompilatorer oversetter til en intern kode som tolkes av en interpret. (Det finnes også Java kompilatorer som lager maskinkode, men de er ikke så vanlige.) Java-program Bil a = new Bil(); Kompilator javac Java byte-kode CAFE BABE 7501 Java-simulator java
Minila systemet Opplegget for Minila ligner mye på Java systemet. Minila-program Kompilator call P with a; INCI var * Flass-kode Flass-assembler Flok-kode Flink-simulator 2 5 17 10 Oppgaven deres er å skrive denne kompilatoren.
Dataspråk Ulike programmeringsspråk I dette kurset skal vi innom flere språk: Java benyttes til all implementasjon. Minila er målet for prosjektet. Flok er maskinkoden til datamaskinen vår Flink. Flass er assemblerspråket til Flok.
Selve kurset Oppbyggingen av kurset Kurset har fem hovedkomponenter: Forelesningnen holdes i utgangspunktet hver uke. Gruppeøvelsene er 2 timer hver uke. Gruppearbeid for å løse oppgavene. Man jobber to og to (eller alene om man vil). Man kan velge partner selv, eller la gruppelæreren plukke ut par. Kompendiet gir en grundig innføring i Minila og prosjektet. Nettsidene er også en viktig informasjonskanal.
Godkjenning Godkjenning av kurset Kurset har ikke karakterer, bare bestått/ikke bestått. Det er tre obligatoriske oppgaver. Når de er godkjent, er kurset godkjent.
Godkjenning Men... Mot slutten av semesteret vil noen bli plukket ut til en samtale om programmet de har laget. Dette kan man stryke på. Siden man normalt jobber i lag, forventes at begge har kjennskap til hovedstrukturen i programmet begge kan identifisere sin del av programmet (som skal være rundt halvparten) der de kan forklare nøye hvorfor koden er blitt slik den er.
Samarbeid Samarbeid og fusk Samarbeid og utveksling av ideer er bra! Kopiering og fusk er ikke bra! Gode råd for samarbeid Snakk gjerne med andre om ideer. Kopier aldri andres kode.
Eksempel 1 one.min prog begprog outint(1) 1; outline; endprog Dette programmet skriver ut tallet 1.
Eksempel 1 one.min Programmet kompileres og kjøres med kommandoene > minilac one.min Dette er Minila kompilatoren (versjon 2005 5b) Analyse: start slutt Kodegenerering: start slutt Kompileringen var vellykket > flink one.flok Dette er Flink (versjon 3.0f) 1 Total execution time: 103
Eksempel 1 Grammatikk Vi kan beskrive grammatikken til Minila med jernbanediagrammer: Program prog ; Deklarasjon begprog ; Setning endprog
Eksempel 1 Setning Tekst Variabel := Uttrykk intext Navn outchar Uttrykk outint ( Tall ) Uttrykk outline outtext Navn Tekst If-setning Repeat-setning While-setning call Navn with Uttrykk into Variabel
Eksempel 1 Uttrykk Konstant Variabel inchar inint + * / Konstant Tall Tegn
Eksempel 1 Grammatikken forteller om et program er korrekt når det gjelder oppsettet (men det kan allikevel ha logiske feil). Dette programmet er ikke korrekt: prog begprog outint 1 endprog;
Eksempel 2 formel.min prog var n; begprog n := inint; outint(10) 2+n*3; outline; endprog Dette programmet leser inn et tallnog regner ut en formel. > flink formel.flok 7 27 Hvorfor er ikke svaret 23?
Eksempel 2 Deklarasjon var Navn [ Tall ], proc Navn in Navn [ ] out Navn Deklarasjon ; begproc ; Setning endproc
Eksempel 2 Uttrykk Konstant Variabel inchar inint + * Lovlige operatorer er +,, * og /. De har samme presedens. Vi har ikke parenteser i uttrykkene. Derfor må vi bruke flere variable enn vi er vant til. /
Eksempel 2 Variabel Navn [ Konstant ] Navn
Eksempel 3 gcd.min prog var a, b; begprog a := inint; b := inint; while a <> b do if a < b then b := b a; else a := a b; endif; endwhile; outint(1) a; outline; endprog
Eksempel 3 Programmet finner største felles divisor: > flink gcd.flok 52 221 13
Eksempel 3 Grammatikk Nytt er tester: If-setning if Betingelse then ; Setning else endif ; Setning
Eksempel 3 Kun veldig enkle betingelser Betingelse er lov: Uttrykk = Uttrykk =/= <> < <= > >=
Eksempel 3 Det finnes to typer løkker: While-setning while Betingelse do ; Setning endwhile Repeat-setning repeat ; Setning until Betingelse
Eksempel 4 Prosedyrer Nest siste utvidelse (foreløbig) er prosedyrer (kjent som metoder i Java) med følgende spesialiteter: Vi kan ha prosedyrer deklarert lokalt inne i andre prosedyrer. Minila prosedyrer kan ha inntil én parameter. Prosedyrene kan ikke kalles rekursivt.
Eksempel 4 Vektorer Vektorer (= array er) er greie å bruke: var a [3]; deklarere a med elementene a[1], a[2] og a[3]. (Dessuten finnes a[0] som alltid inneholder vektorens lengde (her 3).)
Eksempel 4 fak.min, del 1 prog proc fakultet in n out fak; var i; begproc fak := 1; i := 1; while i <= n do fak := fak * i; i := i+1; endwhile; endproc; var farr[15]; proc skrivfak in n; var i; begproc i := 1; while i <= n do outint(5) i; outint(10) farr[i]; outline; i := i+1; endwhile; endproc; var grense, i;
Eksempel 4 fak.min, del 2 begprog grense := inint; if grense > 12 then grense := 12; else if grense < 0 then grense := 0; endif; endif; i := 1; while i <= grense do call fakultet with i into farr[i]; i := i+1; endwhile; call skrivfak with grense; endprog
Eksempel 4 > flink fak.flok 15 1 1 2 2 3 6 4 24 5 120 6 720 7 5040 8 40320 9 362880 10 3628800 11 39916800 12 479001600 Eksekveringstid: 5118
Eksempel 4 Grammatikk, Deklarasjon var Navn [ Tall ] proc Navn in Navn [ ] out Navn Deklarasjon ; begproc ; Setning endproc
Eksempel 4 Variabel Navn [ Konstant ] Navn Legg merke til at indeksen kun kan være en konstant eller en enkel variabel.
Programmering i Minila Oppsummering Minila er et meget enkelt programmeringsspråk. Det bør være enkelt å lære. Ikke alt man forventer, er lov. Sjekk grammatikken!