Feature-Komposition auf Bytecode-Ebene

Ähnliche Dokumente
Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Algorithmen und Datenstrukturen

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Algorithmen und Datenstrukturen

II.4.5 Generische Datentypen - 1 -

Tag 8 Repetitorium Informatik (Java)

Einführung in die Programmiersprache Java II

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

4. Vererbung Die Klasse Object. Die Klasse Object

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

12 Abstrakte Klassen, finale Klassen und Interfaces

Modularisierung in Java: Pakete Software Entwicklung 1

Überschreiben von Methoden

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Vererbung, Polymorphie

Einstieg in die Informatik mit Java

Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen. J. W. v. Goethe.

Listing 1: Cowboy. Listing 2: Woody

Einstieg in die Informatik mit Java

Remote Method Invocation

Programmieren 2 Java Überblick

Tafelübung 07 Algorithmen und Datenstrukturen

! 1. Rekursive Algorithmen.! 2. Rekursive (dynamische) Datenstrukturen. II.3.2 Rekursive Datenstrukturen - 1 -

Repetitorium Informatik (Java)

Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn. Testen. Tutorial im Rahmen des Software(technik)praktikums SS 2012

II.4.4 Exceptions - 1 -

Info B VL 14: Java Collections/Reflections

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

Vererbung. Martin Wirsing. Ziele. Vererbung

2 Eine einfache Programmiersprache

2 Eine einfache Programmiersprache

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Programmieren in Java -Eingangstest-

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Programmieren in Java

1 Polymorphie (Vielgestaltigkeit)

Praktikum Datenbanksysteme. Ho Ngoc Duc IFIS - Universität zu Lübeck

Info B VL 11: Innere Klassen/Collections

Algorithmen und Programmierung III

1 Klassen anlegen und Objekte erzeugen

1 Klassen anlegen und Objekte erzeugen

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Programmieren in C++

Probeklausur: Programmierung WS04/05

Objektorientierung (OO)

Programmiermethodik 3. Klausur Lösung

Selbststudium OOP7 & ALG2 Auftrag

Überblick. Class-Objekte. Bietet die Möglichkeit das Laufzeitverhalten von Applikationen zu analysieren und es gegebenenfalls sogar zu beeinflussen

Überblick. Beispiel: get()-methodenaufruf am VSBoard aus Übungsaufgabe 1. Analyse einer Methode: java.lang.reflect.method

Java I Vorlesung Generics und Packages

Programmiermethodik 1. Klausur

2.13 Vererbung. Rainer Feldmann Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/ Article

Interfaces und Vererbung

Praktikum zu Einführung in die Informatik für LogWings und WiMas Wintersemester 2013/14

Erzeugungsmuster. Kapselung der Objekt-Erzeugung

Durch die Teil-von-Beziehung soll ausgedrückt werden, dass ein Objekt A als (physikalischer) Teil eines Objekts B angesehen wird. Insbesondere kann ei

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Interfaces

Software Entwicklung 1

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete! 4. Ausnahmen (Exceptions) II.4.

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Objektorientierte Sprachen

Probeklausur: Programmierung WS04/05

Objektorientierte Programmierung Studiengang Medieninformatik

Objektorientierte Programmierung Studiengang Medieninformatik

Typumwandlungen bei Referenztypen

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Java I Vorlesung 6 Referenz-Datentypen

Repetitorium Informatik (Java)

JAVA für Nichtinformatiker - Probeklausur -

6. Globalübung (zu Übungsblatt 8)

Non-null Types in an Object-Oriented Language

Software-Engineering Software-Management

Java Einführung Abstrakte Klassen und Interfaces

Universität Karlsruhe (TH)

Programmieren in Java

II.4.2 Abstrakte Klassen und Interfaces - 1 -

JUnit. Unit testing unter Java

UML / Fujaba. Generierung von Java-Quellcode aus UML-Diagrammen. Marcel Friedrich

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Vorkurs Informatik WiSe 17/18

System.out.println("TEXT");

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Kapitel 5: Interfaces

Java: Kapitel 1. Überblick. Programmentwicklung WS 2008/2009. Holger Röder Holger Röder

Innere Klassen. Innere Klassen. Page 1. Lernziele: innere Klassen, statische geschachtelte Klassen, anonyme Klassen.

Systemprogrammierung. Projekt: Java RMI. Wintersemester 2006 / 2007

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Objektorientierte Programmierung Studiengang Medieninformatik

Software Entwicklung 1. Rekursion. Beispiel: Fibonacci-Folge I. Motivation. Annette Bieniusa / Arnd Poetzsch-Heffter

Javassist. Java-API zum Ändern von Java Bytecode

Gebundene Typparameter

Die Schnittstelle Comparable

Vererbung und Traits

5.6 Vererbung. Vererbung

Programmentwicklung ohne BlueJ

1 Abstrakte Klassen, finale Klassen und Interfaces

Remote Method Invocation

Transkript:

Feature-Komposition auf Bytecode-Ebene Claus Hunsen Sergiy Kolesnikov Sven Apel FOSD-Treffen 2012

Feature-Komposition Quellcode-Komposition Feature-Module (Quellcode) ➊ Komposition Variante (Quellcode) ➋ Übersetzung Variante (Bytecode) Bytecode-Komposition Feature-Module (Quellcode) ➊ Übersetzung Feature-Module (Bytecode) ➋ Komposition Variante (Bytecode) ➊ Komposition FeatureHouse (AST-Superimposition, ähnlich AHEAD Tool Suite) ➋ Übersetzung Standard-Java-Compiler ➊ Übersetzung Feature-Stubber und Fuji (Feature-orientierter Java-Compiler) ➋ Komposition auf Bytecode-Ebene FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 2/19

Ziel Zu erreichende Punkte separate Übersetzung und Prüfung von Feature-Modulen gewünscht (z.b. Type Checking und Model Checking) Hürden bei Java Kompilieren von Java kontextabhängig stark typisierte Sprache (strenge Typüberprüfung beim Kompilieren) Features sind keine selbstständig kompilierbaren Einheiten. Stub-Generierung für das fehlerlose Kompilieren nötig! Stubs Rumpf-Klassen, die genau soviel Informationen bereitstellen, sodass ein Feature separat kompiliert werden kann FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 3/19

Ablauf Feature-Module (Quellcode) Feature-Stubber Feature-Module + Stubs (Quellcode) Fuji Feature-Module (Bytecode) Bytecode-Komposition Variante (Bytecode) FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 4/19

Ablauf Feature-Module (Quellcode) Feature-Stubber Feature-Module + Stubs (Quellcode) Fuji Feature-Module (Bytecode) Bytecode-Komposition Variante (Bytecode) FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 5/19

Stub-Generierung Feature-Stubber Generierung der Stubs auf Grundlage von globalem Wissen gesamte Produktlinie ist bekannt Referenzen werden ausgewertet Feature-Module zusammen mit Stubs kompilierbar! FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 6/19

Stub-Generierung Beispiel feature1/a.java class A { static int getresult () {return B.calculate(); static String getinput () {return input ; static void flush () {... feature2/b.java class B { static void print () {System. out. println (A.getInput()); static int calculate () {return 27; static void doit () {... Stubs feature1 stubfix/b.java class B { @Stub static int calculate () {return 0; feature2 stubfix/a.java class A { @Stub static String getinput () {return null; FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 7/19

Ablauf Feature-Module (Quellcode) Feature-Stubber Feature-Module + Stubs (Quellcode) Fuji Feature-Module (Bytecode) Bytecode-Komposition Variante (Bytecode) FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 8/19

Übersetzung mit Fuji Ablauf Komposition der einzelnen Feature-Module mit den dazugehörigen Stubs feature1 und feature1 stubfix Übersetzung des Ergebnisses feature1 stubfix classes FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 9/19

Ablauf Feature-Module (Quellcode) Feature-Stubber Feature-Module + Stubs (Quellcode) Fuji Feature-Module (Bytecode) Bytecode-Komposition Variante (Bytecode) FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 10/19

Bytecode?! Wie soll mit Bytecode umgegangen werden? Nutzung des Bytecode-Frameworks ASM http://asm.ow2.org/ Bytecode muss nicht selbst angefasst werden! FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 11/19

Komposition Ablauf 1 Einlesen der Struktur der Produktlinie 2 Komposition der Klassen Erkennung von Stubs (Annotation @Stub) Komposition von Methoden und Feldern Entfernung der Stubs 3 Verifizierung der komponierten Klassen mit ASM (optional) Algorithmen Feature für Feature wird mit der Basis zusammengeführt Basisklasse ist fest eingelesen. Klassenverfeinerung wird mittels Visitor-Pattern untersucht. Kompositionsregeln entsprechend der Superimposition von FeatureHouse FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 12/19

Bytecode-Eigenheiten I Innere und anonyme Klassen Innere und anonyme Klassen haben eigene Dateien für ihren Bytecode. (bspw. A$1.class und A$Inner.class) Benannte innere Klassen werden komponiert wie äußere. Anonyme Klassen feature1/a$1.class und feature2/a$1.class müssen nicht identisch sein! Anonyme Klassen müssen umbenannt werden! feature1/a$1.class feature1/a$feature1 1.class feature2/a$1.class feature2/a$feature2 1.class FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 13/19

Bytecode-Eigenheiten II Zusammenführung von Konstruktoren Jeder Konstruktor enthält einen super()-aufruf im Bytecode, der explizit den Namen der Superklasse enthält. Ein Aufruf muss entfernt werden! Änderung der Superklasse Der Name der Superklasse steht auch im Konstruktor (super()-aufruf) und muss auch dort geändert werden! FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 14/19

Laufzeitvergleich Bytecode-Komposition FeatureHouse 1750 1500 Laufzeit [ms] 1250 1000 750 500 250 0 Testsuite EPL GPL Notepad Violet BK mit Verifizierung BK ohne Verifizierung FeatureHouse FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 15/19

Anmerkungen und Vorteile Der Vergleich hinkt! Annahme: Wir wollen alle Varianten der Produktlinie generieren. Quellcode-Komposition:(2 n t sourcecode-comp )+(2 n t compile-product ) Bytecode-Komposition: (n t compile-feature )+(2 n t bytecode-comp ) Weitere Vorteile besser für feature-basierte Analysen Type Checking Model Checking statische Analyse... FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 16/19

Ausblick Gegenwart: Closed World Stub-Generierung auf Grundlage von globalem Wissen Zukunft: Open World Erzeugung von polymorphem Bytecode [vgl. Ancona et al., POPL 05] Polymorpher Bytecode: Kompositionelle Übersetzung nicht mehr kontextabhängig Typvariablen und dazugehörige Beschränkungen im Bytecode nicht trivial, aber umsetzbar! FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 17/19

Polymorpher Bytecode - Beispiel class Client { JFrame getframe() { return this. frame ; class Client { JFrame frame = new JFrame(); getfield Client.frame:JFrame class Client { SpecialFrame frame = new SpecialFrame(); // SpecialFrame extends JFrame getfield Client.frame:SpecialFrame FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 18/19

Polymorpher Bytecode - Beispiel class Client { JFrame getframe() { return this. frame ; Polymorpher Bytecode für das Feature GUI getfield Client.frame:α {α JFrame FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 18/19

Diskussion Claus Hunsen hunsen@fim.uni-passau.de FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 19/19

Implementierung (Auszug) ComposingClassVisitor für Klassen visit untersucht u.a. die Superklasse visitfield untersucht jedes Feld des Features einzeln visitmethod untersucht jede Methode des Features einzeln (auch Konstruktoren) StubDetector für Methoden und Felder visitannotation überprüft auf die Annotation @Stub isstub gibt das Ergebnis zurück MethodAdapter für Methoden StubDetector-Implementierung visitmethodinsn nimmt original-umbenennungen vor FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 20

Feature-Komposition mit FeatureHouse Beispiel // Basis class Client { void doit () { System. out. println ( I did it. ); // Feature class Client extends JFrame { void doit () { original(); System. out. println (... some other way. ); // Komposition class Client extends JFrame { void $ Basis $ doit () { System. out. println ( I did it. ); void doit () { $ Basis $ doit(); System. out. println (... some other way. ); = FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 21

Implementierung public MethodVisitor visitmethod ( int access, String name, String desc, String signature, String [] exceptions ) { // representative object for current feature method MethodNode featmethod = new MethodNode(access,name, desc, signature, exceptions ); // get corresponding base method if existing MethodNode basemethod = t h i s. getbasemethodforfeaturemethod( featmethod ); // obtain the method visitor so far MethodVisitor mv = this. cv. visitmethod (access,name, desc, signature, exceptions ); // change SUPER CALL in constructor if super class was changed... // CONSTRUCTOR if (featmethod. isconstructor ()) { mv = new ConstructorMergeAdapter(mv, featmethod, basemethod ); // NORMAL METHODS: stub detection, original call renaming and overwriting else { mv = new MethodAdapter(mv, featmethod); // return method visitor return mv; FOSD-Treffen 2012 Feature-Komposition auf Bytecode-Ebene 22