Die virtuelle Maschine in der Literatur

Slides:



Advertisements
Ähnliche Präsentationen
Vorlesung Compilertechnik Sommersemester 2009 Zielcodeerzeugung M. Schölzel.
Advertisements

CPI Der einzelne Befehl braucht immer noch 5 Zyklen (stimmt nicht ganz, einige brauchen weniger!) Was verbessert wird, ist der Durchsatz = #Befehle /
Timm Grams Hochschule Fulda Fachbereich Elektrotechnik und Informationstechnik Rekursive Funktionen in C © Timm Grams, Fulda, (korr.: )
16. Modularität und Abstraktion
Suche in Texten (Stringsuche )
12. Iteration und Rekursion
der Universität Oldenburg
FH-Hof Indirekte Adressierung Richard Göbel. FH-Hof Einfache Speicherung von Daten Eine "einfache" Deklaration definiert direkt eine Speicherplatz für.
FH-Hof Formale Sprachen - Maschinenmodelle Richard Göbel.
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
6 Folgen (Teil II - Datenstrukturen und Algorithmen)
Vorlesung 3: Verschiedenes Universität Bielefeld – Technische Fakultät AG Rechnernetze und verteilte Systeme Peter B. Ladkin
Fachgebiet Software Engineering Übersicht © Albert Zündorf, Kassel University Compilerbau und Reverse Engineering m Vorlesung im Wintersemester.
Programmierung 1 - Repetitorium WS 2002/2003 Programmierung 1 - Repetitorium Andreas Augustin und Marc Wagner Homepage:
int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0);
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
1 Vorlesung 3 Verschiedenes Peter B. Ladkin
BIT – Schaßan – WS 02/03 Basisinformationstechnologie HK-Medien Teil 1, 11.Sitzung WS 02/03.
Grundlagen der Informatik 4 Lehrstuhl für Betriebssysteme 1 Wie werden Funktionen realisiert? Beispiel: int maximum(int x, int y) { int j = x; if (y >
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Herbers Excel-Server - der Workshop
Grundlagen Wissenschaftlichen Arbeitens Hilal Tekoglu
DATEISPEICHER in der S P S
2 Datenabstraktion Geheimnisprinzip:
Lehrstuhl für Informatik 3 - D. Fey Vorlesung GRa - SS , Folie 1 Beispiel Stack-Architektur.
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Dr. Wolfram Amme, Semantik funktionaler Programme, Informatik II, FSU Jena, SS Semantik funktionaler Programme.
Pointer. Precompiled Header  Vorübersetzung eingebundener Dateien häufig genutzt, selten geändert  Projekttyp „Win32 Console Application“
Einführung. Ziel der Veranstaltung  Vermittlung von Grundkenntnissen in C++  Solide Basis für anschließende Weiterentwicklung  Fähigkeit, kleine Programme.
FOR Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Strukturen (Eigenschaften) Strukturen dienen zur Zusammenfassung mehrerer Komponenten verschiedener Typen zu einer Einheit, die dann mit gemeinsamen Namen.
Pointer. * und &  Bei der Definition int var1; ○ // „normale“ Variable int *var2; ○ // Zeiger auf einen Integer int *var2 = NULL; ○ // … incl. Initialisierung.
ESP Tutorium Studienassistent: Ewald Moitzi Gruppe 1.
Operatoren, Kontrollstrukturen und Funktionen. Logische Operatoren  zum Vergleich zweier Ausdrücke  ==, !=,, =  Ergebnis ist vom Typ bool  Achtung!
Praktische Informatik 1
Namensliste Teil der semantischen Aktionen
Codegenerierung Code wird nacheinander für jede Prozedur gesondert erzeugt. Code wird innerhalb von Block für statement generiert. Ist der Code für eine.
SAP – Installation auf Windows Server 2008 R2 Enterprise
Objective C Universität zu Köln
Tabellengesteuerte Verfahren
Hello World! Javakurs 2013 Arne Kappen
Datentypen: integer, char, string, boolean
Rekursion – Speicherverwaltung
Programmieren in C Wie speichert C
Java-Kurs - 4. Übung weitere Kontrollstrukturen
oder Womit genau ein Prozessor seine Zeit verbringt
Objective C Universität zu Köln
Parser Der Teil eines Compilers, der prüft, ob die Folge der Token einen gültigen Satz der Sprache bildet. Unterscheidung nach der Strategie in TopDown.
Durchschnitt (verbal)
Referenzen In c kennen wir gewöhnliche Variablen und Pointer.
Vom HW-Automaten zum Prozessor
Rekursionen Erstellt von J. Rudolf im November 2001
Syntax: while ( BEDINGUNG ) { // Anweisungen die so lange immer wieder ausgeführt // werden, wie die Bedingung zutrifft } for (INITIALISIERUNG; BEDINGUNG;
SS 04 Christiane Rauh Christian Hellinger
Arten von Kontrollstrukturen
Einführung in die Programmierung
GRUNDLAGEN WISSENSCHAFTLICHEN ARBEITENS MODULA-2 SONAY SUBAYAZ
«Delegierter» Methoden Schablone Funktionszeiger
Datenstrukturen und Softwareentwicklung
Grundlagen der OO-Programmierung in C#
PGdP Tutorstunde 4 Gerald Mahlknecht Technische Universität München Informatik Divide and Conquer.
3. Die Datenstruktur Graph 3.3 Durchlaufen von Graphen
1. Die rekursive Datenstruktur Liste 1.6 Die Datenstruktur Stapel
Einführung in die Programmierung
Informatik II – Übung 4 Gruppe 3
 Präsentation transkript:

Die virtuelle Maschine in der Literatur Die Wunschmaschine, Paul Maar, Samsgeschichten

Virtuelle Maschine in der Informatik Eine virtuelle Maschine ist ein Rechner, der physisch nicht existiert. Seine Bestandteile werden durch ein Programm realisiert, das alle Bestandteile eines physischen Rechners nachbildet. Register Speicher Steuerschleife Befehlssatz

Dreiadressmaschine Eine beispielsweise arithmetische Operation wird durch einen Befehl mit 3 Parametern realisiert, den beiden Summanden und dem Ziel, auf dem das Ergebnis der Operation abgelegt wird. Zwischenergebnisse komplexer Ausdrücke werden in temporären Variablen abgelegt. Erg ← Op1 + Op2 Erg ← Op1 - Op2 Erg ← Op1 * Op2 Erg ← Op1 / Op2 Erg ← Op1 & Op2 ...

Zweiadressmaschine ähnlich der Dreiadressmaschine, jedoch überschreibt das Ergebnis einen der beiden Operanden, so dass der 3. Parameter entfällt. Op1 ← Op1 + Op2 Op1 ← Op1 - Op2 Op1 ← Op1 * Op2 Op1 ← Op1 / Op2 Op1 ← Op1 & Op2 ...

Einadressmaschine Alle Operationen werden mit einem Akkumulatorregister ausgeführt, dass den jeweils 1. Operanden enthält Load Operand Akkumulator += Operand Akkumulator -= Operand Akkumulator &= Operand …. Store Destination

Nulladressmaschine - Stackmaschine Operanden und Ergebnisse werden auf einem Kellerspeicher abgelegt. Auch die Variablen der Prozeduren werden im Keller angelegt. Sie werden durch eine Relativadresse, die relativ zum Anfang des Variablenbereiches (Adresse der 1. Variablen) gebildet wird, adressiert. Push op1 Push op2 Push op3 Add Mul …. (op1+op2)*op3 Die virtuelle Mascine der LV basiert auf einer Stackmaschine

Befehlssatz Befehle zum Datentransport (push, pop, store) Arithmetische Befehle (add, sub, cmp,...) Sprungbefehle(jmp, call, jnot, …) Befehle zur Programmorganisation (entryproc) I/O-befehle

Arbeitsweise der Stackmaschine Code: Procedure 00000000: 1A EntryProc 001F,0000,0008 00000007: 04 PushAdrVarMain 0004 0000000A: 09 GetVal 0000000B: 04 PushAdrVarMain 0000 0000000E: 01 PushValVarMain 0004 00000011: 06 PushConst 0001 00000014: 0E Mul 00000015: 06 PushConst 0000 00000018: 0C Add 00000019: 07 StoreVal 0000001A: 01 PushValVarMain 0000 0000001D: 08 PutVal 0000001E: 17 ReturnProc Const 0000:0003 Const 0001:0010 PL/0: const c=3; var a,b; begin ?b; a:=B*10+c; !a end .

Datenstrukturen der VM Speicherbereich für den Stack: Wird beim Start angelegt, während der Programmabarbeitung überwacht und bei Bedarf vergrößert. Speicherbereich für den Code und die Konstanten: Wird beim Laden des Zwischencodefiles angelegt. Prozedurtabelle: wird nach dem Laden des Zwischencodefiles angelegt. Sie enthält die Anfangsadressen der Prozeduren sowie ein zunächst leeres Feld für die Anfangsadresse des Variablenbereiches, das durch entryProc beim Aufruf der Prozedur belegt wird. Die Einträge der Prozedurtabelle sind nach Prozedurnummer aufsteigend geordnet, so dass die Prozedurtabelle durch die Prozedurnummer indiziert werden kann.

Register der VM

Prozedurtabelle Enthält für jede Prozedur 2 Einträge (Pointer) Startadresse des Codes (Adresse von EntryProc der Prozedur), wird beim Programmladen eingetragen Adresse des Variablenbereiches der Prozedur (Adresse der Variablen mit Offset 0), wird bei Prozeduraufruf zur Laufzeit eingetragen Tabelle wird durch die Prozedurnummer indiziert pInfProc PCode Proc 0 PVar Proc 0 PCode Proc 1 PVar Proc 1

Die Initialisierung Dateiname angegeben? malloc erfolgreich? Pointer auf Constblock Dateinename aufbereiten malloc für Stack Datei lesen Datei öffnen malloc erfolgreich? malloc für Prozedurtabelle Öffnen erfolgreich? malloc erfolgreich? Nachbildung call main endOfCode Länge ermitteln malloc für Code malloc für Code Prozedurtabelle aufbauen Steuerschleife

if a>=b then Max:=a; if a< b then Max:=b end; ?a;?b; call p1; pCode pC pConst nProc (2) frei (2) entryProc lenCode idxProc =1 lenVar Code der Procedure P1 idxProc =0 main . . . Konstanten pInfProc pVar iCProc=0 pStack &EndOfCode Iproc (0) a Max b Save pVar pS var a,b,Max; procedure p1; begin if a>=b then Max:=a; if a< b then Max:=b end; ?a;?b; call p1; !Max end.

Die Steuerschleife I while (!Ende) { vx[*pC++](); } typedef int (*fx)(void); fx vx[]={ FcpuValVrLocl, FcpuValVrMain, FcpuValVrGlob, FcpuAdrVrLocl, FcpuAdrVrMain, FcpuAdrVrGlob, FcpuConst, FcstoreVal, FcputVal, FcgetVal, FcvzMinus, Fcodd, FcOpAdd, FcOpSub, FcOpMult, FcOpDiv, FccmpEQ, FccmpNE, FccmpLT, FccmpGT, FccmpLE, FccmpGE, Fccall, FcRetProc, Fcjmp, Fcjnot, FcEntryProc, FcputStrg, Fpop, Fswap, FcEndOfCode, Fcput, Fcget }; Die Steuerschleife I while (!Ende) { vx[*pC++](); } Setzt Ende auf true

Steuerschleife II while (!Ende) { switch (*pC++) case puValVrLocl:FcpuValVrLocl(); break; case puValVrMain:FcpuValVrMain(); break; case puValVrGlob:FcpuValVrGlob(); break; case puAdrVrLocl:FcpuAdrVrLocl(); break; case puAdrVrMain:FcpuAdrVrMain(); break; case puAdrVrGlob:FcpuAdrVrGlob(); break; case puConst :FcpuConst(); break; case storeVal :FcstoreVal(); break; case putVal :FcputVal(); break; case getVal :FcgetVal(); break; case vzMinus :FcvzMinus(); break; case odd :Fcodd(); break; case OpAdd :FcOpAdd(); break; case OpSub :FcOpSub(); break; case OpMult :FcOpMult(); break; case OpDiv :FcOpDiv(); break; . . . case pop :Fpop(); break; case swap :Fswap(); break; case EndOfCode :FcEndOfCode(); break; case put :Fcput(); break; case get :Fcget(); break; }

Prozeduraufruf Call PrNr pVar calling Proc IdxProc PC Calling Proc SP Call PrNr Kellern des Zeigers auf Variablenbereich der rufenden Prozedur aus der Prozedurtabelle. Kellern des aktuellen Befehlszählers (zeigt jetzt hinter call) Kellern der Prozedurnr. der rufenden Procedure Ausführen des Sprunges durch eintragen der Adresse des Befehls entyProc der aufzurufenden Prozedur

Nr. der rufenden Prozedur int Fccall(void) { short ProcNr; ProcNr=gtSrtPar(pC);pC+=2; push4((int4_t)(pInfProc[iCProc].pVar)); push4((int4_t)pC); pC=pInfProc[ProcNr].pCode;//Sprung zu entryProc push4(iCProc); return OK; } int FcRetProc(void) pS=pInfProc[iCProc].pVar; iCProc =pop4(); pC =(char*)pop4(); pInfProc[iCProc].pVar=(char*)pop4(); Nr. der rufenden Prozedur

Setzen der aktuellen Prozedur EntryProc Setzen der aktuellen Prozedur Einrichten des Variablenbereiches im Stack Setzen des Zeigers auf Variablenbereich in der Prozedurtabelle Die Verwaltung der Variablenbereiche über dieProzedurtabelle ermöglicht den rekursiven Prozeduraufruf, wobei immer der richtige Satz von Variablen benutzt wird pVar calling Proc IdxProc PC Calling Proc SP Var Dipl 0000 Dipl 0004 Proc i

/*--- Entry Procedure */ int FcEntryProc(void) { short lVar; /* Codelaenge ueberlesen */ PC+=2; /* Prozedurnummer lesen und einstellen */ iCProc=gtSrtPar(pC);pC+=2; /* Variablenlaenge lesen */ lVar =gtSrtPar(pC);pC+=2; /* Zeiger auf Variablenbereich */ pInfProc[iCProc].pVar=pS; /* Neuer Stackpointer */ pS+=lVar; return OK; }

Beispiel Rekursion Rekusion mit globaler Variable var x; procedure r; var a; procedure p; !a; if x<5 then begin x:=x+1; a:=x; call p; call r; call p end; x:=0; call r end. Berechnung der Fakultät var a,fac; Procedure p1; var b,c; begin b := a; a := a-1; c := a; !c; if c>1 then call p1; fac := fac*b; !fac end; ?a; fac := 1; call p1; end.

Fakultät mit Parameter var x,y; procedure facult(a); begin if a-1>1 then call facult(a-1); y:=y*a end; ?x; y:=1; call facult(x); !y; !"\n" end.