5 HLL VM HLL VM ist gleich der Prozess VM. HLL VM nur user‐mode auf einen virtuellen Prozessor: virtuell ISA (V‐ISA). HLL VM unterstützt zahlreiche OS/HW. HLL VM enthält metadata ~ data set architecture <> ISA HLL VM erstellt V‐ISA Code und der VM‐Loader überträgt Host‐ISA kompatibles Images (binary). Konventionelle Compiler erstellt direkt kompat binary! Beispiel: Java (viel Metadaten, wenig low‐lvl inst). Porting compilation, rewriting library, Übersetzung von OS Calls Developed once, lauft Überall dank Emulation des App ISA und OS Calls Guest ISA design für Portabilität HLL VM – V-ISA ist nur für user mode programs (kein echtes Prozessor) V-ISA V-ISA enthaltet Data und instruktionen also metadata Mehr als data set architecture als instruction set architecture Loader konvertiert Kode in Memory image. Distributed in Object Code (binary), eventuelle Optimierung während dem Emulation gemacht. Emulation = Interpretation und/oder binary Translation von Guest V-ISA zu host ISA Pascal use V-ISA (P-code); HLL-VM-Java (viele Metadaten und Low Level byte enkodierte Instruktionen) Aktuelle HLL VM – Common Language Infrastructure ist Teil des Microsoft .NET Framework. 5.1 The Pascal P-Code Virtual Machine Code is a stack orientierte instruction set. Portability: VM-Machine anstatt neue Kompiler Besteht aus: - Emulator - Set of Standard library Routine: z.B. readLn(), writeLn() 5.1.1 Memory Architecture Program Memory Area & Constant Area (Kompiler generierte Werte) Data Area ist in Zellen geteilt. Es gibt ein Marker Point (aktuelle Prozedur) und eine Extreme Point (maximale Grosse die der aktuelle Frame erreichen kann), new Pointer (maximale Extension des Heap). Fixed-size Region: Mark Stack der mit dem MP Point beginnt. Enthält: funcion value, static link, dynamic link (MP Wert für frühere Frame), previous EP (für return), return address (PC Wert wo zurückzukehren). Operand stack (Stack Pointer, EP) 5.1.2 Inst Set Pop, add Werte von stack: adi, adr. 5.1.3 P-Code Summary Ist einfach und hat folgende Teile mit andere HLL VM. stack instruction set Memory cells Memory getrennt in stack und heap. Instruktionen nicht mit Absolute Memory adressiert. Standard libs als interface zu OS (kleinere stand. Lib, weniger I/O Interop., mehr portabilität) Fehlen bei p-Code: Network Interoperabilität und OO Umgebung. 5.2 Object-Oriented High-Level Language Virtual Machines Emulator Compiler der Code für die Host Plattform. Ursprünglich war HLL VM nicht für Porting von Kompiler gedachtet, sondern für Plattform Unabhängigkeit von Applikationssoftware. Mit V-ISA werden Daten Abstrakt referenziert (als Methadata) 1 ‐ Sicherheit und Schutz: Jedes Gastprogramm läuft in sandbox (managed Code in .NET). Implementation und Applikation Software laufen auf eine VM. Fremde Programme werden geladen und laufen in sicherer, Verwalteter Art. ‐ Robust: OO, Component Programmierung ‐ Netzwerkfähig: Sparsamkeit und Effizienz werden vorgeliebt. Start-up profitiert davon. Dichte Instruktion Set. ‐ Leistung, Performance: Techniques von Kap.2-4 Bei Java, kein Unterschied zwischen Maschinen Architektur und Implementierung. Shared-source CLI Java bytecodes. Microsoft intermediate Language (MSIL), CIL, oder IL genannt. JVM und APIs genannat Java platform. Übung 5.1 – Netzwerkbandbreite reduzieren: 1. Reduziere Programmgröße (Dichte Instruktionen dank Metadaten?) 2. Dynamic Loading: Nur benötigte Klassen werden übertragen. 5.2.1 Security and Protection VM muss geschützt werden, die Applikation soll den Zugang haben. Programme müssen habe: 1. Zugang zum Daten (remote), Public Files 2. Zugang Kontrolle zum lokalen Daten 3. Gegen Memory Zugang oder Ausführung externer Kode Applet = sandbox Konkatenation von Internet Adressen für das Zugang von Remote Dateien. Remote Benutzer ist für die Rechte verantwortlich. Java nutzt: secuity, authentication und kriptierungs APIs (Java 2 Standard Edition bietet etwas mehr) Loader und Security Agent (zwei trusted software) für user (app) und system Methods (API, standard lib) sind vertrauenswürdig. Native methods: Teil der trusted library Emulation Engine: trusted Komponente Zugangsanfrage wird von der standard Library gemacht. Appliction load and store dürfen weder an VM adress spaces noch am VM Code zugreifen statische und runtime. Fast immer Sicherheit wird statisch geprüft, dafür werden Metadaten verwendet. Referenzen werden dynamisch gecheckt. Dateien Zugan dafür sorgen trusted library und security Manager VM Schutz statisch check (trusted loader) und dynamic checks 5.2.2 Robustness – Object-Oriented Programming Objecte, Methodes. Instanzen werden at runtime erstellt. Pointer und Referencen um die Objekte beizutreten. Data Portion ist Static (nur eine Kopie erstellt) oder Dynamic (Klassen Definitionen). Inheritance: Extension einer Klasse. Override von Methoden. Wird Polymorphismus geschafft. Interfaces: Klassen ohne Objekten, nur mit Methoden. Classen können privat, public oder protect sein. Beispiel Perimeter is dinamically dispatched bei runtime ( berumte Beispiel des Rectangle/Quadrat). Garbage Collection Objekte werden erstellt, genutzt und gelassen (Überschreibung, löschen von Referenzen). In C++ muss der Entwickler die Objekte loslassen. 5.2.3 Networking Dichtere Programmierung: Spezifizierung wird übermittelt. Stack mit Instruktionen mir unterschiedliche Länge. 1 bit für eine Instruktion, byt definiert den Opcode, der Operand impliziert von Position in der Stack. 2 Zusätzliches Vorteil dynamisches Laden von Programmen 5.2.4 Performance OO hat Vorteile bezüglich C (step above assembly). Ist aber weniger performant. Java: Just-in-Time Compilation: Kode discovery Problem ist minimal. (im HLL VM translation = compilation) Advanced staged emulation strategies: Interpretation mit Profiling hinzufügt. Hot Code wird compiliert. 5.3 The Java Virtual Machine Architecture 5.3.1 Data Types: Primitive Datentypen Int, char, byte, short, float, double, returnAddress (in Java ISA, nicht in Java HLL), Boolean (into der byte) Referenzen (Primitive Datentyp + Referenz) Zu eine Objekt in Memory. Ref kann null sein. ‐ Objects and Arrays Array is intrinsic type of object. Mehrdimensionale Array erlaubt (Array von ref) 5.3.2 Data Storage Global, Lokal, Operand (in Zellen oder Slots immer aufgeteilt) Adress zum logische Memory Zelle) ‐ Global, in Main Memory, verwendet den Heap ‐ Lokal temp, local in der Methode - Operand, var die werden von funktionale Instruktionen bearbeitet. Verwenden den Stack The Stack Für Locale, Operand und Argumente der Procedur. Enthält keine Objekte und Array, nur Referenzen und individuelle Array. Local storage hat eine fixe Grösse. Im Stack brauch man kein Instruktion Field für Register) Global Memory Method Area wird der Code gespeichert Global Storage area objekte und Arrays Global Memory Area wird verwaltet als Heap. Objekte in Heap erstellt mit Referenz gelesen. Ref Rektangle point object rectangle Constant Pool Constant hat eine Range von Länge. Konstante Daten die mit einem Programm verbunden sind. Memory Hierarchiy Objekte und Array in Heap 5.3.3 Java Instruction Set Ist Stack basieret. Instruction Formats Opcode byte und dann 0 oder + Subsequent bytes Bytecode instruction, wide opcode. Expand code kann hinzugefügt werden, um bytecode zu expandieren OpCode kommt zuerst und operand Data_Movement Intruction Alle Funktionen Opcode und Operand mussen zu Stack. 1. Constat wurden gepusht in Stack. Example: icons1, bipush data, sipush data 1 data 2, ldc_w index1 index2 (load from slot to constant pool) 2. Funktionen die den Stack bearbeiten: pop, swap, dup 3. Bewegung von Local storage zu current stack: iload_1, iload index, isore_1, istore index 4. Deal mit Globale Memory Daten (Objecten oder Array): new index1 index2, newarray type 3 Accessing Data: getfield und putfield Bewegt Daten zwischen adressierte Daten und operand stack. Es gibt getStatic, putStatic und also für array. Es gibt checkcast index1 index2 (um den typ zu sehen), mit CheckCastExeption Type Conversion I2f : pop integer und push float zurück. Manchmal paarweise zu nutzen. Functional Instructions: Arithmetic, Logicals, Shifts Funktionen are 1 byte, Operand genommen von Stack und da zurückgeschrieben. Iadd, iand, ishfl Control Flow Instructions Branches und Jumps, path soll in der Methode sein. Ifeq data 1 data2 (compare to 0), if_icmpeq data1 data2. Ifnull data1 data2 return reference von stack. Lookupswitch zwischen el. Im Stack und mehrere Werte der Funktion. Invokevirtual index1 index2: returned value ist nur mit einem Funktion ugänglich. Invokeinterface, invokespecial, invokestatic. Ireturn, return (void return). Switches sind fixed, also bekannt zum load time. Operand stack tracking Unterschiede von HL V-ISA: OpCode muss immer gleiche anzahl und typ von Operanden haben: tiefe kann statisch beim Kompilierung definiert werden Legal: int in Stack, intA oder intB in stack. OpCod zwischen 2 el. der Stack. Illegal: int in Stack, intA oder nichts in Stack (entweder 2 oder 1 el in stack) Int oder reference push in Sack, holt int oder ref auf Stack. Example Program ‐ Operand Stack Tracking 5.3.4 Exceptions und Errors ISA Errors und Benutzer Fehler (thrown). Exceptions müssen handhaben werden, wenn nicht wird der Element aus dem Stack pop sein und lauft die zweite funktion und so weiter bis zum main program. Errors: limitation of VM implementation oder VM Bugs Exceptions: von Programm verursacht wenn er lauft. Static werden nur Missverständnisse und oversigns gefunden. Bespiel ist StackOverflowError (out of VM Memory), internalError. Java: NullPointerException (pointer führt zu keinem Objekt) und ArrayIndexOutOfBoundsExceptions. IncompatibleClassChangeErrror wenn getField zu static field gemacht. Exception Table dient für den exception handler. Felder: from,to,target,type. Eingebaut dank try/catch. Stack wird flushed bei einem error handling, ohne wird nur der erste Stuck el. entfernt. athrow index1 index2: fugt in der constant pool die Beschreibung der Fehler. 5.3.5 Binary Classes Code & Metadata (Data Strukturen und Relationen) = binary class inkludier in class file (module in CLI). Binary class ist der unterstutze Format der VM. Inkrementell Klassen load nach ausführung gespeichert in method Memory Klassen müssen die gleiche grösse haben, oder ist diese mitgegeben. Magic number: identify the Data block als binary File. Contant Pool: wärden typen für die Ausführung check angegeben Access Flags: public, final This_Class and Super_Class: Name, als index zu constant pool angegeben. Da sind als Namen gespeichert. Für Object ist die superclasse Zero. Andere haben immer eine superklasse. Interfaces: Nummer von Referenzen wie diese Klasse zugetreten werden könnwn. Sind als indixes zum constant pool eingegeben. Da sind die Referenzen zum Interfaces 4 Fields: public, private, protected, name index (zum const. pool), Beschreibung index. Methods: Name und Beschreibung, Attribute Tabelle, Kode ist Teil der Att. Tabelle Attributes: detaillierte Informationen, bei HLL VM viele Attribute types. 5.3.6 Java Native Interface JNI: erlaubt Interoperabilität zwischen Java und native Kode (C ) Java kann von andere sprachen kompiliert sein, solange sie standard binary Klassen erstellen. Native kann von jede Sprache die JNI unterstutzt kompiliert werden, in program binaries. Data & Array on Heap Variable im Stack Klassen werden Native definiert. In JNI kann die Kontrolle von Java und Native Methoden übertragen werden. JNI liefert bereits Native methoden wie: GetArrayLength, GetIntArrayElements 5.4 Completing the Platform: APIs Standard libraries: secure Network features, GUIs 5.4.1 Java Platforms ‐ J2SE Standard. JavaBeans ‐ J2EE Enterprise. Für Enterprise Software, Server-side Appliktionen ‐ J2ME Micro. Lighter-weight platform 5.4.2 Java APIs Core API package ‐ Java.lang. Core, mit Object Klass, wrapper Klasse. Charakter und Integer. Low-level runtime und system stati methoden. Class Klasse. Beschreibt die Klassen. Prozess Objekt für die Prozesse zum natvie externe Prozessen. Thread, Security Manager. ‐ Java.util. Fundamental structure op.: Vector, Enumeration, Hastable, zip, jar. ‐ Java.awt (abstract windowing toolkit). ‐ Java.io System I/O - Java.net networking support. Z.B. Socket 5.4.3 Serializability and Reflektion Man will, dass die Objekte übermittelt werden oder persistent gespeichert werden. RMI. Serialisierung: Konvertierung des Objekte in einer Implantation unabhängige Objekt, da wird die Serializable Interface gebraucht. Reflection: Möglichkeit im Objekt zu schauen. Java.lang.reflect API. Genutzt in runtime von Compiler. Basische Programm Komponente: JavaBeans (specific design pattern): getProperty_name, getFields. 5.4.4 Threads Multithreading muss vom OS unterstützt werden und von library aus Java.lang zur Verfügung gestellt. Run() – init von neuen Thread, stop(), suspend(), resume() Synchronisation mit Monitoren: Objekte/Class level lockt, immer nur ein Prozess kann zugreifen (unlock). Realisiert durch counter. Monitorenter() erhöht und akquiriert die Kontrolle, monitorexit() reduzieren. Wenn Classe/Objekt verwendet wird, werden andere Anfragen blockiert und warten. Critical section: ist Kode der nur ein Thread kann ausführen Methoden die für Interaktion zwischen Thread verwendet werden. ‐ wait() – wait(long timeout, int nanos) release the lock und enter the wait. ‐ notify() – notifyAll() wake up thread und lock’s wait set. 5.5 The microsoft Common Language Infrastructure: A Flexible High-Level Language Virtul Machine CLI ist die VM CLR ist die Implementierung von CLI 5.5.1 The Common Language Interface 5 CLI kann mehrere Sprachen kompilieren: schafft Sprachen (auch nicht von loader verifizierbare) und Plattform Unabhängigkeit Code + Metadata in MSIL Auch wenn Programme nicht verifizierbar sind, müssen Valid sein. Verifiable und Valid Unverifiable und Valid In Java nur valid und invalid. Programm könne gemischt werden (legacy nicht verifizierbar) und valide Kode. In Java Packages, in CLI assemblers. PE/COFF Portable Execution, Common Object File Format Constants werden streams genannt. Metadata entfalten Nummer von Header, Definition und Konstanten. Interoperabilität ist nicht implementier, aber unterstutzt CLS (Common Language Specification) 5.5.2 Attributes Um Infos bei runtime zu übermitteln. GetCustomAttributes Beispiel: Metadata um cm von inches unterscheiden, automatische Konvertierung dank Reflektion. Buid in Attibute, bei runtime genutzt: serializable. 5.5.3 Microsoft Intermediate Language MSIL ist Stack orientiert. Ohne contant pool, sondern mit mehrere Metadata Tabellen. Ref. an metadaten tabellen als streams. Method tabellen dank Tocken beigetreten. Ein Token hat 4 byte, 1 für den Stream, 3 für die Position. Vectors (eindimensionale Array in java), dafür gibt es explizite MSIL instruktionen. Mehrdimensional Array: beigetreten dank API routines. Braucht kein type in der Opcode. Laufen nicht als verifizierter Kode. Arithmetic, Logical, shifts können ausgeführt werden auf pointers. localloc: initialisiert Block von untipisierte Memory, cpblk, initblk, calli (für call procedure). 5.5.4 Isolation und AppDomains Isolierte, unabhängige Applikationen. Oft gebraucht von unterschiedliche Benutzer: unterschiedliche Plattformen ist eine Ressourcen intensive Lösung. Java: isolation mit Klass loader. CLI unterstutzt AppDomain: leightweight isolation. Idee: Jedes Programm bekommt seine eigene VM. Problem: Benötigt zu vielen Ressourcen. Lösung (CLI): AppDomains sind isolierte Umgebungen, in der Programme unabhängig voneinander ausgeführt werden können. 5.6 Summary Virtual ISA Features 5.6.1 Metadata Konventionell implizit vorhanden, generiert und wegschmeisst. Permanente Informationen, die nur die V‐ISA enthält. + Security erlauben Kode Verifizierung. + Interoperability + improve emulation performance 5.6.2 Memory Architektur Konventionell: Fixe, lineare oder segmentierte Speicher. Sbrk(), mmap(), granularity visibilität. V‐ISA hat mehr abstrakte non‐fixed logischen Speicher (stack und heap von undefinierte grösse). Limitierung: Implementierte Ressource hat eine bestimmte grosse. 5.6.3 Memory Address Formation Conventional: address computation is restricted. V‐ISA bietet Schutz für freie Adressen 1. Referencen werden verwendet, 2. Type und Operationen Definitionen abgrenzen Aktionen auf der Memory (statisch oder runtime kontrolliert) 5.6.4 Precise Exceptions Bei konventioneller ISA muss der Zustand präzise sein, damit beim Fehler wiederhergestellt werden kann. Kann mask-bit gemacht werden. 6 Bei einer V‐ISA wenige Instruktionen verursachen ein Fehler und der Fehler wird durch die VM (fest implementiert) als Programm gehandelt (Abweichung er Fehler). Kontrolle wird eingebaut durch error handling. 5.6.5 Instruction Set Konventionell: Register und Kondition Kode (komplizieren die Kompilierung) V‐ISA sind meist stack‐orientiert (Kode density). Kondition Kode ist immer noch problematisch und wird vermieden. 5.6.6 Instruction Discovery Data und Code wird getrennt. Beim erstmaligen laden eines Programms ist der Code vollständig vorhanden und kann analysiert werden. Jumps durch methoden oder Procedere, code wird Discovered. Bei konventionellen ISAs muss das nicht der Fall sein (indirekte Jump, variable-length Instruktion, embedded Data). 5.6.7 Self‐Modifying and self-Referencing Code Nicht eingebaut in V-ISA. Wird sehr verwendet von VM, z.B. schreiben JIT kompilierten Kode in cache. 5.6.8 Operating System Dependences HLL VM: least common denominator standard libraries sind höher als OS interface. Mit mehr Flexibilität, ist es einfacher Kompatibilität zu erreichen. 7