Diplomarbeit Abschlussvortrag

Ähnliche Dokumente
Diplomarbeit Antrittsvortrag

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2012 / Vorlesung 9, Dienstag 18.

Haskell auf der Überholspur mit LLVM. Henning Thielemann

Vorlesung Objektorientierte Softwareentwicklung. Kapitel 0. Java-Überblick

Echtzeit-Multitasking

Implementierung der Jikes Research Virtual Machine

Vergleich unterschiedlicher virtueller Maschinen

Nebenläufige Programmierung

Ein Erfahrungsbericht beim Einsatz von generierenden Ansätzen im Vergleich zu generischen Lösungen

Datenstrukturen, Alignment Stack Prozeduraufruf, Parameterübergabe und -rückgabe (Calling Conventions) Leaf procedures

Design and Implementation of a Soft-error Resilient OSEK Real-time Operating System

Kapitel 17 Code-Erzeuger und Laufzeitübersetzer

Programmierung 2. Übersetzer: Das Frontend. Sebastian Hack. Klaas Boesche. Sommersemester

Projekt Systementwicklung

Smalltalk vs. Java c Chris Burkert Smalltalk versus Java

Short Introduction to C# C# (C SHARP) Microsofts Antwort auf Java

Karlsruher Institut für Technologie

Theorie zu Übung 8 Implementierung in Java

Objekt-Funktionale Programmierung. am Beispiel von SCALA. Thorsten Jolitz

Java: Eine Übersicht. Dennis Giffhorn. Lehrstuhl für Programmierparadigmen Universität Karlsruhe

Domänenanalyse Threadverwaltung/Scheduling

THE GO PROGRAMMING LANGUAGE. Michael Karnutsch & Marko Sulejic

Java-Prozessoren. Die Java Virtual Machine spezifiziert... Java Instruktions-Satz. Datentypen. Operanden-Stack. Konstanten-Pool.

Konzepte der Programmiersprachen

NetBeans Rich Client Platform. Anton Epple Göttingen, Source Talk Tage

SOMA Reverse Engineering

Grundlagen zur nebenläufigen Programmierung in Java

Die Integration zukünftiger In-Car Multimedia Systeme unter Verwendung von Virtualisierung und Multi-Core Plattformen

Ein Laufzeitsystem für hochgradig parallele Simulationen

Hardware Virtualisierungs Support für PikeOS

Einführung in Betriebssysteme

Compilerbau mit Phoenix

ARM Cortex-M Prozessoren. Referat von Peter Voser Embedded Development GmbH

Sicheres C Programmieren in Embedded Systemen ARM II (ARM7TMDI [1] ) Wintersemester

Software-basierter Speicherschutz durch spezialisierte Java-VMs auf Mikrocontrollersystemen

Virtual Machines unter der Haube

CLR CIL MCS ECMA-335. Linux.Ne t Albrecht Liebscher, Erlanger Linux Tage

Scheduling for Time-Triggered Network Communication

Betriebssystembau. 7. Übung. Michael Engel Arbeitsgruppe Eingebettete Systemsoftware. Lehrstuhl für Informatik 12 TU Dortmund

Embedded OS für ARM Cortex Microcontroller

Welche Informatik-Kenntnisse bringen Sie mit?

z/architektur von IBM

Tooldemo: Soot. Softwareanalyse SS 2011 Veranstalter: Prof. Dr. Klaus Ostermann Tillmann Rendel, M.Sc. Von Kim Maurice Nuspl

Funktionale Programmierung

Linker: Adreßräume verknüpfen. Informationen über einen Prozeß. Prozeß-Erzeugung: Verwandtschaft

TEIL I: OBJEKTORIENTIERUNG UND GRUNDKURS JAVA GRUNDLAGEN DER PROGRAMMIERUNG... 4

Einführung in die Programmierung mit Java

GridMate The Grid Matlab Extension

Einführung zu den Übungen aus Softwareentwicklung 1

Common Weaknesses of Android Malware Analysis Frameworks. Lars Richter

J.5 Die Java Virtual Machine

Entwurf und Validierung paralleler Systeme

Welche Grundformen der Emulation gibt es? Antwort: Interpretation und binäre Übersetzung.

Compiler und Codegenerierung. Hw-Sw-Co-Design

Cloud Management und Automatisierung mit Open Source Software. Michael Eichenberger Time to Market 24. Mai 2013

Zwischenbericht Projektarbeit

Ausarbeitung des Interpreter Referats

Verteilte Systeme. Verteilte Systeme. 5 Prozeß-Management SS 2016

SEP 325. Notwendigkeit. häufige Situation: Programm funktioniert im Prinzip fehlerfrei, aber nicht mit gewünschter Performanz

JITC Just-In-Time-Compilation

Lua. June 9, Marcus Brenscheidt Marcin Golkowski ( Dynamische Programmiersprachen Lua )

Effiziente Java Programmierung

Assembler - Adressierungsarten

Betriebssysteme I: Speicherverwaltung (Teil A: Adress-Bindung)

Funktionale Programmiersprachen

Assembler - Einleitung

Codesigned Virtual Machines

Java Einführung Programmcode

Compiler für Eingebettete Systeme

Alles außer Java! JVM-Sprachen sagen Happy Birthday

Persönliche Build-Höllen für Jedermann Andreas Hartmann & Dr. Halil-Cem Gürsoy

Schichtung virtueller Maschinen zu Labor- und Lehrinfrastruktur

Systemtheorie 1. Einführung Systemtheorie 1 Formale Systeme 1 # WS 2006/2007 Armin Biere JKU Linz Revision: 1.4

Werner Achte rt DATA BECKER

Einige Grundlagen zu OpenMP

Programmiersprachen. Organisation und Einführung. Berthold Hoffmann. Studiengang Informatik Universität Bremen

AOSTA. Aspects in Operating Systems: Tools and Applications

im Rahmen des Seminars - Programmiersprachen Markus Nestvogel

Funktionale Programmierung

RTOS lernt Scripting dank Lua. - Raphael Zulliger, Indel AG

Beispiel für überladene Methode

Wie groß ist die Page Table?

Shangrila. One Instruction Set Computer

AuD-Tafelübung T-B5b

Java für C++ Programmierer

LabVIEW Real Time Hands on

Verteiltes Debugging. Gemeinsames Debuggen in Saros

RealTime Linux. Paul Seidel Seminar Prozessteuerung und Robotik WS 08/09 Lehrstuhl BS und Middleware Prof. Polze Hasso-Plattner-Institut Potsdam

Instruktionssatz-Architektur

Type Erasure in Java 5. Helmi Jouini Institut für Theoretische Informatik Universität Karlsruhe

Phasen der Codegenerierung

Programmieren I. Die Programmiersprache Java. Institut für Angewandte Informatik

Berner Fachhochschule Hochschule für Technik und Informatik HTI. Kapitel 1. Einstieg in Java. Dr. Elham Firouzi

Einführung in die objektorientierte Programmierung. mit Squeak

Grundlagen der Modellierung und Programmierung, Übung

Compilerbau für die Common Language Runtime

Sequentielle Programm- / Funktionsausführung innerhalb eines Prozesses ( thread = Ausführungsfaden )

Programmieren in Haskell Programmiermethodik

Entwicklungswerkzeuge

Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 11 (Kapitel 12)

Transkript:

Universität des Saarlandes, Lehrstuhl für Programmiersysteme, SFB 378 Diplomarbeit Abschlussvortrag Christian Müller Run-Time Byte Code Compilation, Interpretation and Optimization for Alice Betreuer: Guido Tack Verantwortlicher Prof.: Gert Smolka

Die nächsten 30 Minuten... Was sind Alice und Seam? Bytecode Framework Maschinenmodell und Bytecode einfaches Übersetzungsschema Optimierungen Vergleich: neues/altes System vs. Moscow ML

Alice & SEAM

Was ist Alice? am Lehrstuhl entwickelte Erweiterung von Standard ML Nebenläufigkeit ( lightweight threads ) Laziness, Lazy Linking von Komponenten Verteilte und offene Programmierung Grundlage: plattformunabhängige Repräsentation von Code und Daten Alice Abstract Code (repräsentiert als DAG)

Was ist SEAM? Simple Extensible Abstract Machine am Lehrstuhl entwickeltes Framework zur einfachen Implementierung von Virtuellen Maschinen (VMs) abstraktes Datenmodell Abstract Store abstraktes Ausführungsmodell Scheduler

SEAM Abstract Store Graph Root Set 3 Knotentypen: Block Chunk Integer Werte: Zeiger auf Block/Chunk Integer Hello, world! 12 34 Integer Chunk Block

SEAM Ausführungs-Modell koordiniert Scheduler Kontrolle führt aus thread 1 task 1 Abstract Code Interpreter thread 2 task 2...... Bytecode Interpreter task m thread n Thread Pool Task Stack Task / Stack Frame

Alice SEAM VM Zwei Ansätze existieren: 1. Interpreter für den Abstract Code Jitting einfache, gut zu wartende Struktur plattformunabhängig Aber: naiv und langsam 2. Laufzeit-Übersetzung in Maschinencode just-in-time (JIT) deutlich schneller (genaueres später) Aber: komplexe, kaum zu wartende Struktur Aber: nicht plattformunabhängig

Neuer Ansatz: Bytecode Jitting Erzeuge Bytecode anstelle von Maschinencode Führe Bytecode auf einem Interpreter aus Ziel der Arbeit: wartbares, plattformunabhängiges System mit guter Performanz Struktur der Arbeit: 1. Spezifikation eines Bytecodes für Alice 2. Entwicklung eines Interpreters auf Alice VM 3. Entwicklung eines Bytecode Jitters 4. Optimierung des Jitters und Interpreters

Bytecode Framework

SEAM Ausführungs-Modell koordiniert Scheduler Kontrolle führt aus thread 1 task 1 Abstract Code Interpreter thread 2 task 2...... Bytecode Interpreter task m thread n Thread Pool Task Stack Task / Stack Frame

Maschinenmodell: Registermaschine Bytecode Interpreter Zustand { BP PC IP 3 Bytecode 2 Immediate Environment { Register/ lokale Variablen CP R 1 R 2 4711 Closure 233 Bytecode Task

1. Bytecode Spezifikation eigener Alice Bytecode Bytecode Linearisierung und Spezialisierung des Abstract Codes Registercode instr ::= opcode reg* integer* Beispiel: Tupel (* val p = (x,y) *) new_tup R 1 2 init_tup R 1 R 5 0 init_tup R 1 R 6 1 (* val z = #1 p *) select_tup R 7 R 1 0

2. Bytecode Interpreter implementiert das Maschinenmodell Abarbeitung eines Bytecode Tasks implementiert die Semantik der Instruktionen (ca. 150 Stück)

3. Bytecode JIT-Compiler Alice Code fun hd nil = raise Empty hd (x::_) = x statischer Alice Compiler Abstract Code 0 -> #[] TestTagCompact Local(0) 1 -> #[IdDef(1),Wildcard] Raise Immediate(Empty) Return #[Local(1)] Bytecode Jitter Bytecode ctagtest R 0 l 1 (* case 0 *) l 2 (* case 1 *) l 1 : load_immediate R 1 2 raise R 1 l 2 : load_tagval R 0 R 0 0 return1 R 0

3. Bytecode JIT-Compiler Infrastruktur: Offset-Tabelle zum Linearisieren des Codes Verwalten von Registern Registerallokation für lokale Variablen temporäre Register für Zwischenergebnisse Aufbau der Immediate Environment Code-Alignment

Optimierungen

4. Selektive Übersetzung ursprüngliches Design:Lazy-Übersetzung true p p compile lazy future Bytecode Erweiterung: Selektive Übersetzung c n 1 c+=1 c n 2 c+=1 c>n p 1 c>n compile p 2 p 1 compile 2

4. Umgehen des Schedulers Interpreter i 1 i 1 =i 2 Scheduler i 1 i 2 Interpreter i 2 Maschinencode-Jitters: Test zur Übersetzungszeit Optimierungen funktionieren nicht bei selektiver Übersetzung

4. Umgehen des Schedulers: Bytecode-Interpreter Interpreter i 1 Scheduler i 1 =i 2 i 1 i 2 Interpreter i 2 dynamischer Test rewrite_call f R 3 bci_call f R 3 Umschreiben der Instruktion, sobald f in Bytecode vorliegt

4. Procedure Integration fun do_magic x = x + 1 fun f nil = nil f (x::xr) = do_magic x :: f xr + bessere Performanz schlechtere Abstraktion statisch nicht immer feststellbar fun f nil = nil f (x::xr) = x + 1 :: f xr Bytecode Jitter bettet do_magic automatisch ein

4. Procedure Integration Caller einzubettender Callee Simulation der Parameterübergabe Simulation der Parameterübergabe Registerallokation auf dem Gesamtgraphen Konvertierung globaler Variablen zu Konstanten Spezialisierung

4. Weitere Optimierungen Spezialisierung und Super-Instruktionen Inlining von Primitiven Switch-Intepreter und Direct Threaded Code Code/Instruktions-Layout: Platzverbrauch Ausführungsgeschwindigkeit Selbstrekursion Loophole: load_zero R0, await R0 [, kill R0] Alice Calling Convention : Konvertierungstests vermeiden eingebettete Test-Tabellen Tag-Tests erschöpfend machen relative Sprünge besser als absolute Sprünge (relativ zum Beginn des Bytecode-Chunks) Sharing in der Immediate Environment Konstanten-Propagierung Register Allokation, Scratch Register (Unterschiede zum Maschinencode-Jitter)... Assembler/Disassembler im Rahmen des Entwicklungsprozesses

4. Spezialisierung und Super-Instruktionen Beispiel: val (x,y) = p Basisinstruktion: Spezialisierung: select_tup R 4 R 3 0 select_tup R 5 R 3 1 select_tup0 R 4 R 3 select_tup1 R 5 R 3 Super-Instruktion: get_tup2 R 4 R 5 R 3 Ergebnis: effizientere Implementierung schnellerer Dispatch

Vergleich der Systeme Antrittsvortrag: Jitter 3x schneller als Abstract Code Interpreter Ziel: Bytecode Jitter soll Maschinencode Jitter erreichen

Vergleich der Systeme: Mikro-Benchmarks Zeit in ms fib tak ack reverse Abstract Code 1937 15305 31074 584 Maschinencode 108 1326 914 88 Bytecode 344 2552 3636 121 Moscow ML 109 1755 5990 243 Abstract Code/Maschinencode Faktor 17.5 Bytecode/Maschinencode Faktor 2.6 Zeit in ms Abstract Code Maschinencode Bytecode Moscow ML bubblesort 12313 2823 2168 4081 tree 15305 2471 1186 1155

Vergleich der Systeme: Alice-Applikationen Toplevel-Interpreter Startup: Abstract Code Maschinencode Bytecode ms 4241 1728 1613 Bootstrap: Abstract Code Maschinencode Bytecode min:sec 57:27 20:55 20:35

Zusammenfassung Bytecode-System für Alice Compiler + Interpreter und Optimierungen (frühe Version) in Alice 1.2 integriert effizientes, plattformunabhängiges System für AMD64, PowerPC,... Testumgebung für neue Optimierungen wesentlich einfacher zu handhaben als Maschinencode-Jitter Performanz für reale Applikationen vergleichbar zum Maschinencode- Jitter

Future Work Bytecode-System Strictness-Analyse Bytecode-Debugger (Erweiterung des Disassemblers) genauere Heuristik für Procedure Integration inline Pragma in der Source-Sprache

Literatur Wilhelm, Maurer, Übersetzerbau, Springer 1997 Rossberg et. al., Alice ML Through the Looking Glass, Techreport 2004 Brunklaus, Kornstädt, A Virtual Machine for Multi-Language Execution, 2002 Ralf Scheidhauer, Design, Implementierung und Evaluierung einer virtuellen Maschine für Oz, PhD Thesis, 1998 Poletta und Sakar, Linear Scan Register Allocation, ACM, 1999 Davis, The Case For Virtual Register Machines, 2002 Jones, Secrets of the Glasgow Haskell Compiler Inliner, 1999 Ierusalimschy et. al., The Implementation of Lua 5.0, 2005