Typed Assembly Language Johannes Faltermeier Motivation Assemblersprache Typsysteme Typed Assembly Language Typed Assembly Language Having Fun with Types From System F to TAL 1. CPS Conversion 2. Closure Conversion 3. + 4. Allocation Code Generation Praxis Johannes Faltermeier Java Bytecode TALx86 Zusammenfassung TU-München Sommersemester 2011 Assemblersprache Typed Assembly Language Johannes Faltermeier Motivation Maschinennahe Befehlsfolge Befehlssatz abhängig von Architektur Kein Typsystem Vorteile Assemblersprache Typsysteme Typed Assembly Language From System F to TAL 1. CPS Conversion 2. Closure Conversion 3. + 4. Allocation Code Generation Praxis Performance Optimierter Speicherzugriff Nachteile Nicht portabel Fehleranfälligkeit Java Bytecode TALx86 Zusammenfassung Typsysteme Typed Assembly Language Johannes Faltermeier Motivation Assemblersprache Typsysteme Typed Assembly Language Objekte einer Sprache erhalten einen Typ Typen ordnen Objekte in Kategorien ein Typen können Wertebereich beschränken From System F to TAL 1. CPS Conversion 2. Closure Conversion 3. + 4. Allocation Code Generation Praxis Vorteile Java Bytecode TALx86 Zusammenfassung Korrekte Verwendung der Objekte Typen vorhersagbar Ziel: Vermeidung von Laufzeitfehlern Typed Assembly Language Typed Assembly Language Johannes Faltermeier Motivation Assemblersprache Typsysteme Typed Assembly Language Eine Typed Assembly Language (TAL) ist eine Assemblersprache, die mit einem Typsystem erweitert wurde. Alle Werte, die durch den Code manipuliert werden, erhalten Typannotationen. Vorteile From System F to TAL 1. CPS Conversion 2. Closure Conversion 3. + 4. Allocation Code Generation Praxis Alle Vorteile von Typsystemen Proof-Carrying Code (PCC) Typsicherheit, korrekter Kontrollfluss, Speicherintegrität Sichereres Ausführen von Code aus nicht vertrauenswürdigen Quellen Java Bytecode TALx86 Zusammenfassung Beispiel Typed Assembly Language Johannes Faltermeier int sum ( int n , int buf ) { if ( n <= 0) { return buf ; } else { return sum (n -1 , buf + n ); } } Motivation Assemblersprache Typsysteme Typed Assembly Language From System F to TAL 1. CPS Conversion 2. Closure Conversion 3. + 4. Allocation Code Generation Praxis ; r1 e n t h a e l t n , r2 e n t h a e l t buf ; r3 e n t h a e l t Ruecksprungadresse sum : { r 1 : i n t , r 2 : i n t , r 3 : { r 1 : i n t }} b l e r1 , r e t u r n add r2 , r2 , r 1 sub r1 , r1 , 1 jmp sum r e t u r n : { r 2 : i n t , r 3 : { r 1 : i n t }} mov r1 , r 2 jmp r 3 Java Bytecode TALx86 Zusammenfassung Typed Assembly Language From System F to TAL Johannes Faltermeier Motivation Assemblersprache Typsysteme Typed Assembly Language From System F to TAL 1. CPS Conversion 2. Closure Conversion 3. + 4. Allocation Code Generation Hintergrund: Typinformationen für Optimierungen Typinformationen gehen verloren Praxis Jetzt: Typerhaltende Übersetzung einer höheren Sprache nach TAL λF CPSConversion → λK ClosureConversion → λC Allocation → λA CodeGeneration → TAL Java Bytecode TALx86 Zusammenfassung CPS Conversion Typed Assembly Language Johannes Faltermeier Motivation Assemblersprache Typsysteme Typed Assembly Language From System F to TAL Continuation-Passing Style Keine Werte werden an die aufrufende Funktion zurückgegeben Stattdessen: Nachfolgefunktionen Ziele 1. CPS Conversion 2. Closure Conversion 3. + 4. Allocation Code Generation Praxis Java Bytecode TALx86 Zusammenfassung Kein Kontrollstack mehr nötig Linearer Kontrollfluss Beispiel Typed Assembly Language Johannes Faltermeier Motivation //vor der Umformung function fac(n) { if (n == 0) return 1; else return n * fac(n-1) ; } Assemblersprache Typsysteme Typed Assembly Language From System F to TAL 1. CPS Conversion 2. Closure Conversion 3. + 4. Allocation Code Generation Praxis Java Bytecode TALx86 //nach der Umformung function fac(n,f) { if (n == 0) return f(1) ; else { return fac(n-1, function g(x) { return f(n * x) }) ; } } Zusammenfassung Closure Conversion Typed Assembly Language Johannes Faltermeier Closure Conversion: Trennung von Daten und Code in zwei Schritten 1 2 Alle freien Variablen als zusätzliche Argumente Umgeformte Funktionen verschieben Ziel: Freie Variablen müssen auf dem Heap allokiert werden, Funktionsargumente hingegen können direkt in Registern übergeben werden. Dies steigert die Performance. Beispiel: Motivation Assemblersprache Typsysteme Typed Assembly Language From System F to TAL 1. CPS Conversion 2. Closure Conversion 3. + 4. Allocation Code Generation Praxis Java Bytecode TALx86 // Vor der Umformung function sum(n) { if(n == 1) return 1; else { function f(x) { return n + x;}; return f( sum(n - 1) ); } } Zusammenfassung Beispiel Typed Assembly Language Johannes Faltermeier // 1. Schritt: function sum(n) { if(n == 1) return 1; else { function f(w, x) { return w + x;}; return f( n, sum(n - 1) ); }} // 2. Schritt: function f(w, x) { return w + x;}; function sum(n) { if(n == 1) return 1; else { return f( n, sum(n - 1) ); }} Motivation Assemblersprache Typsysteme Typed Assembly Language From System F to TAL 1. CPS Conversion 2. Closure Conversion 3. + 4. Allocation Code Generation Praxis Java Bytecode TALx86 Zusammenfassung Allocation und Code Generation Typed Assembly Language Johannes Faltermeier Motivation Assemblersprache Typsysteme Typed Assembly Language From System F to TAL Allocation Bisher: atomarer Konstruktor Speicherplatz wird explizit allokiert Code Generation λA enthält alle Typ-, Wert- und Codeabstraktionen Weitestgehend syntaktische Übersetzung 1. CPS Conversion 2. Closure Conversion 3. + 4. Allocation Code Generation Praxis Java Bytecode TALx86 Zusammenfassung Java Bytecode Typed Assembly Language Johannes Faltermeier Motivation Assemblersprache Typsysteme Typed Assembly Language From System F to TAL 1. CPS Conversion 2. Closure Conversion 3. + 4. Allocation Code Generation Praxis Java Bytecode TALx86 Zusammenfassung TALx86 Typed Assembly Language Johannes Faltermeier Motivation Assemblersprache für die Intel 32-Bit-x86-Architektur Syntax des MASM-Assemblers Erweitert mit Typinformationen Interface Informationen Typ-Konstruktor Deklarationen Bedingungen für Code Label Typinformationen für statische Daten Informationen für die Typumwandlung Macros Tools popcorn assembler talc link-verifier Assemblersprache Typsysteme Typed Assembly Language From System F to TAL 1. CPS Conversion 2. Closure Conversion 3. + 4. Allocation Code Generation Praxis Java Bytecode TALx86 Zusammenfassung Beispiel Typed Assembly Language Johannes Faltermeier Motivation Assemblersprache Typsysteme Typed Assembly Language From System F to TAL int sum ( int n ) { int i = n +1; int s = 0; while ( - - i > 0) { s = s + i; } return s ; } 1. CPS Conversion 2. Closure Conversion 3. + 4. Allocation Code Generation Praxis Java Bytecode TALx86 Zusammenfassung Typed Assembly Language Beispiel Johannes Faltermeier Motivation { ecx : B4 , ebp : mov eax , ecx ; i n c eax ; mov ebx , 0 ; jmp t e s t ; body : { eax : B4 , ebx : add ebx , eax ; t e s t : { eax : B4 , ebx : dec eax ; cmp eax , 0 ; jg body ; ; mov eax , ebx ; jmp ebp ; sum : { eax : B4}} i=n i=n+1 s=0 s p r i n g e zu w h i l e (−−i >0) B4 , ebp : { eax : B4}} s=s+1 B4 , ebp : { eax : B4}} −− i i >0 wenn t r u e s p r i n g e in die Schleife v e r s c h i e b e s nach e a x return s Assemblersprache Typsysteme Typed Assembly Language From System F to TAL 1. CPS Conversion 2. Closure Conversion 3. + 4. Allocation Code Generation Praxis Java Bytecode TALx86 Zusammenfassung Zusammenfassung Typed Assembly Language Johannes Faltermeier Motivation Assemblersprache Typsysteme Typed Assembly Language From System F to TAL Assemblercode mit Typsystem Proof-Carrying Code 1. CPS Conversion 2. Closure Conversion 3. + 4. Allocation Code Generation Praxis Java Bytecode TALx86 Zusammenfassung