Dagens tema: Kodegenerering. Versjonskontroll. Variabler, spesielt vektorer Funksjoner, kall og parametre Noen siste gode råd.

Like dokumenter
Dagens tema: Generelt om variable. Kodegenerering. Deklarasjon av array er. Versjonskontroll. Oppslag i array er

Tema for siste forelesning:

Dagens tema: Kodegenerering. Redigeringsverktøy. Versjonskontroll. Array-er Funksjoner og kall Hovedprogrammet Noen siste gode råd.

Tema for siste forelesning:

Dagens tema: Mer av det dere trenger til del 1

Tema for siste forelesning:

Tema for siste forelesning:

Dagens tema: Koding. Høynivåprogrammering, kommentarer og stil Kompilering av store programsystemer Prosjekter, samarbeide og versjoner

Dagens tema: Koding. Programmering i høynivåspråk. Navn. Mitt forslag:

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

Dagens tema: Maskinkode. Litt datamaskinhistorie Hva er maskin- og assemblerkode? x86-prosessoren Programkode og variabler

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

Oversikt Kodegenerering Variabler Setninger Uttrykk While-setningen

Dagens tema: Mer av det dere trenger til del 2

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

En oppsummering (og litt som står igjen)

Oversikt Deklarasjoner Typesjekk Programmering Datamaskinhistorie x86 Kodegenerering

Den siste dagen. Pensumoversikt Hovedtanker i kurset Selvmodifiserende kode Overflyt Veien videre... Eksamen

Pensum Hovedtanker Selvmodifiserende Overflyt Veien videre Eksamen. Oppsummering

2 Parser. 1 Skanner. 4 Kodegenerator. 3 Sjekker. Oversikt Datamaskinhistorie x86 Kodegenerering Setninger Uttrykk.

Løsningsforslag til eksamen i INF2270

Oppbygningen av en datamaskin Det viktigste i en moderne datamaskin er hovedkortet («motherboard»):

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Det viktigste i en moderne datamaskin er hovedkortet («motherboard»):

Det viktigste i en moderne datamaskin er hovedkortet («motherboard»):

Å løse eksamensoppgaver

Det viktigste i en moderne datamaskin er hovedkortet («motherboard»):

UKEOPPGAVER 13: KONFIGURASJONSSTYRING

Dagens tema: Resten av det dere trenger til del 1

Velkommen til INF2100

Bakgrunnen for INF2100. Velkommen til INF2100. Prosjektet. Hva gjør en kompilator?

Programmeringsspråket C

Dagens tema: Semantisk sjekking. Maskinkode. Hvordan finne deklarasjoner? Hvordan programmere sjekking av riktig navnebruk?

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet doble.rusc (kalt kildekoden): Hva er kompilering?

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

Hvordan en prosessor arbeider, del 1

Dagens tema: Resten av det dere trenger til del 1

Versjonskontrol med Subversion. og TortoiseSVN

Fra Python til Java, del 2

Dagens tema INF1070. Bit fikling. Makroer. Blanding av C og assemblerkode. Mer om Core War. Dag Langmyhr,Ifi,UiO: Forelesning 22. mai 2006 Ark 1 av 25

Dagens tema INF1070. Makroer. Sanntidsprogrammering. Avbrudd. Bruker- og supermodus. Blanding av C og assemblerkode. Selvmodifiserende kode

Introduksjon til versjonskontroll av Ola Lie

Intro Rask kode x86-op Optimalisering Inline-kode Konklusjon

Dagens tema: 12 gode råd for en kompilatorskriver

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet (kalt kildekoden): Hva er kompilering?

Dagens tema. Er maskinen big endian? Denne funksjonen tester det: INF1070 INF1070 INF1070 INF1070

Velkommen til INF2100

Dagens tema. Makroer Ofte gjentar man kodelinjer når man skriver assemblerkode. Da kan det lønne seg å definere en makro:

Repetisjon: Statiske språk uten rekursive metoder (C1 og C2) Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

INF5110 Obligatorisk Oppgave 2 del 2. Andreas Svendsen SINTEF. 23. April Oversikt

Dagens tema: 12 gode råd for en kompilatorskriver. Prosjektet. Koblingen mellom grammatikken og klasser. Utifra dette RusC-programmet:

Dagens tema: Mer av det dere trenger til del 1

Velkommen til INF2100

Velkommen til INF2100 Jeg er Dag Langmyhr

2 Om statiske variable/konstanter og statiske metoder.

UNIVERSITETET I OSLO

Dagens tema Programmering av x86 Flytting av data Endring av størrelse

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

Dagens tema: 12 gode råd for en kompilatorskriver. Prosjektet. Modifikasjon av grammatikken. Utifra dette RusC programmet:

Dagens tema. Raskere kode [REB&DRO H kap 5]

Løsningsforslag til eksamen i INF2270

Programmeringsspråket C Del 3

INF225 høsten 2003 Prosjekt del 4: kodegenerering

En oppsummering. Pensumoversikt Hovedtanker i kurset Selvmodifiserende kode Overflyt Eksamen. Programmeringsoppgaver Flervalgsoppgaver

IN 147 Program og maskinvare

Minneområder Det er vanlig å dele opp minnet til en prosess i disse ulike områdene: Fast minne Store og små indianere «align» ing struct er

Programmeringsspråket C Del 3

Dagens tema: Sjekking

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Velkommen til INF2100. Bakgrunnen for INF2100. Hva gjør en kompilator? Prosjektet. Jeg er Dag Langmyhr

Dagens tema: Formålet. Kodegenerering NB! Introduksjon Modulen Code. Enkle variable Noen enkle setninger Uttrykk

Debuggere En «debugger» er et meget nyttig feilsøkingsverktøy. Det kan analysere en program dump, Dagens tema INF1070 INF1070 INF1070 INF1070

Dagens tema INF1070. Vektorer (array er) Tekster (string er) Adresser og pekere. Dynamisk allokering

Vektorer. Dagens tema. Deklarasjon. Bruk

Velkommen til INF2100

Intro Evaluering Rask kode x86-op Optimalisering Inline-kode

Velkommen til INF2100

Eivind Gard Lund. 24. Mars 2009 Foilene bygger på 2009 utgaven av Andreas Svendsen

Dagens tema. Rask-maskinen. Rasko-kode Raskas-kode. Litt datamaskinhistorie Registre og lagre Instruksjoner

En overikt. Dagens tema. Datamaskinenes historie. Rask-maskinen Litt datamaskinhistorie Registre og lagre Instruksjoner. Rasko-kode.

Dagens tema C, adresser og pekere

Ark 3 av 26. printf("i adresse %08x ligger b med verdien %d.\n", &b, b); printf("i adresse %08x ligger a med verdien %d.

Dagens tema. Datamaskinenes historie. De første moderne datamaskiner. Løsning. Menneskene har alltid prøvd å lage maskiner for å løse sine problemer.

Programmeringsspråket C

Dagens tema: INF2100. Utvidelser av Minila array-er. tegn og tekster. Flass- og Flokkode. prosedyrer. Prosjektet struktur. feilhåndtering.

MAT-INF 1100: Obligatorisk oppgave 1

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

Oppgave 1 - Linux kommandolinje (%)

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

Løse reelle problemer

Oversikt Oversettelse Logging Implementasjon Oppsummering

Programmeringsspråket C

Dagens tema: Formålet. Kodegenerering NB! Introduksjon Modulen Code. Enkle variable Noen enkle setninger Uttrykk

Transkript:

Dagens tema Dagens tema: Kodegenerering Variabler, spesielt vektorer Funksjoner, kall og parametre Noen siste gode råd Versjonskontroll CVS og Subversion

Alt om variabler Variabler Variabler forekommer i tre sammenhenger: 1 Deklarasjon: int v; Dette håndteres av GlobalVarDecl.genCode etc. 2 Verdi i uttrykk: v Håndteres av Variable.genCode. 3 Mål for tilordning: v = Kan gjøres på mange måter, for eksempel GlobalVarDecl.genStoreCode: void genstorecode() { Code.genInstr("", "movl", "%eax,"+assemblername, name+" ="); }

Alt om variabler Generelt om variabler I vår kompilator får alle variabler fast plass i minnet. + Det forenkler kodegereringen. + Det gjør det enklere å finne feil. Vi kaster bort en del plass. Lengden av vektorer må være kjent under kompileringen. Vi kan ikke ha rekursive funksjoner.

Vektorer Vektorer Deklarasjon av vektorer Når programmet deklarerer en vektor, må kompilatoren vår sette av plass til det oppgitte antallet elementer. int x; int a[10]; int v;.data.globl x x:.fill 4 # int x;.globl a a:.fill 40 # int a[10];.globl v v:.fill 4 # int v;

Vektorer Oppslag i vektorer Oppslag i vektor (i uttrykk) er enkelt med riktig bruk av registre: a [ e ] Beregn e med svar i %EAX leal a,%edx movl (%edx,%eax,4),%eax

Vektorer Det er like enkelt for tilordning til vektorelementer: a [ e 1 ] = e 2 ; Beregn e 1 med svar i %EAX pushl %eax Beregn e 2 med svar i %EAX leal a,%edx popl %ecx movl %eax,(%edx,%ecx,4)

Vektorer x = 10; v = a[10]; a[x] = -2; movl $10,%eax # 10 movl %eax,x # x = movl $10,%eax # 10 leal a,%edx # a[...] movl (%edx,%eax,4),%eax movl %eax,v # v = movl x,%eax # x pushl %eax movl $-2,%eax # -2 leal a,%edx # a[...] = popl %ecx movl %eax,(%edx,%ecx,4) Legg merke til at vi ikke sjekker om indeksen er lovlig.

Så enkelt som mulig Funksjoner Den enklest mulige funksjonen (og et kall på den) ser slik ut: int f() { } int main () { f(); }.globl f f: pushl %ebp # Start function f movl %esp,%ebp.exit$f: popl %ebp ret # End function f call f # Call f

Så enkelt som mulig Kallet Kallet skjer enkelt ved å generere en call. (Parametre venter vi litt med.)

Faste ledd i en funksjonsdeklarasjon Start av funksjonen Funksjonens navn angis som en vanlig merkelapp. Vi må starte med å initiere %EBP-registeret (etter å ha tatt vare på den gamle verdien):.globl f f: pushl %ebp # Start function f movl %esp,%ebp Siden alle funksjoner er globale, må vi ha med en.globl-spesifikasjon.

Faste ledd i en funksjonsdeklarasjon Avslutning av funksjonen Ved return må vi gjenopprettet %EBP-registeret før retur med en ret-instruksjon:.exit$f: popl ret %ebp # End function f Alle funksjoner får en navnelapp pga return-setningene.

Hva med lokale variable? Lokale variabler Lokale variabler legges i minnet på samme måte som globale variabler. Men samme variabelnavn kan forekomme i flere funksjoner! Derfor må vi gjøre det unikt ved å kombinere det med funksjonsnavnet (se Code.getLocalName): public static String getlocalname(string fname, String vname) { return fname + "$" + vname; }

Hva med lokale variable? Derfor må alle setningene og uttrykkene vite hvilken funksjon de er i. Det er grunnen til parameteren curfunc til parse-metodene: static WhileStatm parse(decllist decls, FuncDecl curfunc)

Parametre Parametre Vi kan gi funksjonen parametre: int fd (int da, int db) { } int main () { fd(1, 2); }

Parametre Konvensjonen sier at parameterens verdi skal overføres på stakken. 1 1 Før kallet må parametrene legges på stakken. NB! Parametrene må legges på stakken i omvendt rekkefølge! 2 Under utførelsen av funksjonen er parametrene som vanlige variable med «navnene» 8(%ebp), 12(%ebp), 16(%ebp) etc. 3 Ved retur skal resultatverdien ligge i %EAX-registeret. 4 Etter retur fra funksjonen må parametrene fjernes fra stakken igjen med popl-instruksjoner. 1 Denne formen for parameteroverføring kalles verdioverføring.

Parametre Stakken etter kallet og initieringen:... 2 12(%ebp) 1 8(%ebp) returadresse gammel %ebp %ebp %esp...

return -setningen return-setningen return skal gjøre følgende: 1 Beregne resultatverdien slik at den ligger i %EAX-registeret. 2 Hoppe (med en jmp-instruksjon) til avslutningen. Navn på funksjonsavslutningen Dette navnet må være unikt og inneholder derfor funksjonsnavnet; se Code.getExitName: public static String getexitname(string fname) { return ".exit$" + fname; }

Et eksempel Et siste eksempel int pot2 (int x) { int p2; p2 = 1; while (p2 < x) { p2 = 2*p2; } return p2; } int main () { putint(pot2(getint())); putchar(10); } Programmet kjøres slik: $ cless demo.cless $./demo 200 256

Et eksempel int pot2 (int x) { int p2; p2 = 1;.globl pot2 pot2: pushl %ebp # Start function pot2 movl %esp,%ebp.data pot2$p2:.fill 4 # int p2;.text movl $1,%eax # 1 movl %eax,pot2$p2 # p2 =

Et eksempel } while (p2 < x) { p2 = 2*p2; } return p2;.l0001: # Start while-statement movl pot2$p2,%eax # p2 pushl %eax movl 8(%ebp),%eax # x popl %ecx cmpl %eax,%ecx movl $1,%eax jl.l0003 # Test < movl $0,%eax.L0003: cmpl $0,%eax je.l0002 movl $2,%eax # 2 pushl %eax movl pot2$p2,%eax # p2 movl %eax,%ecx popl %eax imull %ecx,%eax # Compute * movl %eax,pot2$p2 # p2 = jmp.l0001.l0002: # End while-statement movl pot2$p2,%eax # p2 jmp.exit$pot2 # return-statement.exit$pot2: popl %ebp ret # End function pot2

Et eksempel int main () { putint(pot2(getint())); putchar(10); }.globl main main: pushl %ebp movl %esp,%ebp.exit$main: popl ret # Start function main call getint # Call getint pushl %eax # Push parameter #1 call pot2 # Call pot2 popl %ecx # Pop parameter #1 pushl %eax # Push parameter #1 call putint # Call putint popl %ecx # Pop parameter #1 movl $10,%eax # 10 pushl %eax # Push parameter #1 call putchar # Call putchar popl %ecx # Pop parameter #1 %ebp # End function main

Noen siste gode råd med på veien Noen siste gode råd Basert på egne og andres (til dels bitre) erfaringer mener jeg dere bør: diskutere ideer og løsningsforslag med hverandre. lese kompendiet, ukeoppgavene og plansjene fra forelesningene. utvide programmet i små steg som testes godt før dere går videre. skrive mange små testprogrammer i C<. bruk standard cless som fasit. spørre gruppelærerne. ta det helt rolig om dere blir innkalt til samtale om prosjektet.

Samarbeidsproblemer Når flere samarbeider Når flere jobber sammen, kan man tråkke i beina på hverandre: 1 Per tar en kopi av en kildefil og begynner å rette på den. 2 Kari gjør det samme. 3 Kari blir første ferdig og kopierer filen tilbake. 4 Per blir ferdig og kopierer filen tilbake. Karis endringer går tapt.

Versjonskontrollsystemer Løsningen Et versjonskontrollsystem er løsningen. De fleste slike systemer er utsjekkingssystemer basert på låsing: 1 Per ber om og sjekker ut (dvs får en kopi av) filen og begynner å rette på den. 2 Kari ber om en kopi, men får den ikke fordi den er låst. Først når Per er ferdig og sjekker inn filen, kan Kari få sin kopi.

Versjonskontrollsystemer Fordeler med et slikt utsjekkingssystem: Lettforståelig. Ganske sikkert. (Men hva om Per og Kari begge må rette i to filer? Da kan de starte med hver sin fil, men når de er ferdige med den første filen kan systemet inneholde feil.) Kari bør kunne få en lese-kopi selv om Per jobber med filen. (Mange systemer tillater det, men ikke alle.)

Versjonskontrollsystemer Ulemper: Hva om Per glemmer å legge tilbake filen? Det burde vært lov for Per og Kari å jobbe på ulike deler av filen samtidig.

Innsjekkingssystemer Insjekkingssystemer En bedre løsning er innsjekkingssystemer: Alle kan når som helst sjekke ut en kopi. Ved innsjekking kontrolleres filen mot andre innsjekkinger: Hvis endringene som er gjort ikke er i konflikt med andres endringer, blandes endringene med de tidligere. Ved konflikt får brukeren beskjed om dette og må manuelt klare opp i sakene.

Innsjekkingssystemer Et scenario 1 Per sjekker ut en kopi av en fil. Han begynner å gjøre endringer i slutten av filen. 2 Kari sjekker ut en kopi av den samme filen. Hun endrer bare i begynnelsen av filen. 3 Per sjekker inn sin kopi av filen. 4 Kari sjekker inn sin kopi, og systemet finner ut at de har jobbet på hver sin del. Innsjekkingen godtas.

Innsjekkingssystemer Når man er alene Selv om du jobber alene med et prosjekt, kan det være svært nyttig å bruke et versjonskontrollsystem: Man kan enkelt finne frem tidligere versjoner. Det kan hende man jobber på flere datamaskiner. Noen ganger lager man flere versjoner av et program, for eksempel tilpasset ulike operativsystemer. Men ofte er 90% eller mer av koden felles.

CVS CVS og Subversion Det mest kjente innsjekkingssystemet er CVS («Concurrent Versions System») laget i 1986 av Dick Grune. Det er veldig mye brukt i Unix-miljøer. For å bøte på noen svakheter i CVS laget firmaet CollabNet Subversion i 2000. Gratis implementasjoner finnes for alle vanlige operativsystemer; se http://subversion.apache.org/.

Subversion Nære og fjerne systemer Subversion kan operere på to måter: Alt skjer i det lokale filsystemet. Man kan starte en Subversion-tjener på en maskin og så sjekke inn og ut filer over nettet. Vi skal gjøre det siste og bruke Ifis Subversion-tjener.

Subversion Opprette et repository 1 Gå inn på nettsiden 2 Logg inn. https://wwws.ifi.uio.no/system/svn/ 3 Velg «My repositories» og «Create new repository». (I dette eksemplet heter det Hallo.) (Alle kan lage inntil tre «repositories».) 4 Hvis det er flere på prosjektet, velg «Edit user access».

Subversion Legge inn filer Så kan vi legge inn mapper. La oss lage en gren med mappen Hei-1 som inneholder filen Hello.java: $ cd Hei-1 $ svn import https://sub.ifi.uio.no/repos/users/dag-hallo -m "2100demo" Adding Hei/Hello.java Committed revision 1. Opsjonen -m gir en kort beskrivelse av denne grenen.

Subversion Sjekke ut filer Nå kan vi (for eksempel fra en annen datamaskin) hente ut mappen vår: $ svn co https://sub.ifi.uio.no/repos/users/dag-hallo A dag-hallo/hello.java Checked out revision 1. $ ls -l drwxr-xr-x 3 dag ifi-a 4096 2007-11-13 06:46 dag-hallo $ ls -la dag-hallo total 16 drwxr-xr-x 3 dag ifi-a 4096 2007-11-13 06:46. drwxr-xr-x 3 dag ifi-a 4096 2007-11-13 06:46.. drwxr-xr-x 6 dag ifi-a 4096 2007-11-13 06:46.svn -rw-r--r-- 1 dag ifi-a 500 2007-11-13 06:46 Hello.java

Subversion Sjekke inn filer Etter at filen er endret, kan vi sjekke den inn igjen: $ svn commit -m"enklere kode" Sending Hello.java Transmitting file data. Committed revision 2. Vi behøver ikke nevne hvilke filer som er endret det finner Subversion ut selv. (Etter første utsjekking inneholder mappen skjulte opplysninger om repository-et, så det trenger vi ikke nevne mer.)

Subversion Andre nyttige kommandoer svn update. henter inn eventuelle oppdateringer fra repository. svn info viser informasjon om mappen vår: $ svn info Path:. URL: https://sub.ifi.uio.no/repos/users/dag-hallo Repository Root: https://sub.ifi.uio.no/repos/users/dag-hallo Repository UUID: 8c927215-bc3e-0410-a56f-b2451114731f Revision: 2 Node Kind: directory Schedule: normal Last Changed Author: dag Last Changed Rev: 2 Last Changed Date: 2007-11-13 07:02:16 +0100 (Tue, 13 Nov 2007)

Subversion svn diff viser hvilke endringer som er gjort: $ svn diff -r 1:2 Index: Hello.java =================================================================== --- Hello.java (revision 1) +++ Hello.java (revision 2) @@ -7,10 +7,9 @@ Properties prop = System.getProperties(); String versjon = prop.getproperty("java.version"); // Versjonen String koding = prop.getproperty("file.encoding"); // Koding - String hei; + String hei = "Hallo"; - hei = "Hallo"; - hei = hei + ", alle sammen!"; + hei += ", alle sammen!"; System.out.println(hei); System.out.println("Dette er versjon " + versjon); System.out.println("Kodingen er " + koding);

Veien videre... Om dere likte kurset har dere flere kurs innen samme felt: INF2270 lærer dere om hvordan en datamaskiner er bygget opp og hvordan de programmeres i assemblerkode. INF3110 introduserer dere for mange flere programmeringsspråk (og litt mer om kompilering) INF5110 gir en grundig innføring i hvordan man skriver en ekte kompilator