Kapitel 5

Werbung
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
Herunterladen