Existierende Systeme: Fujaba, FermaT, RECODER und Eclipse Seminar Transformationen Torben Hildebrandt 03.02.2006 Überblick Motivation/Abgrenzung Fragestellungen/Anforderungen an Tools Tools: Fujaba FermaT RECODER Eclipse Bewertung Fazit/Relevanz für Arte-Fakt 1 Motivation/Abgrenzung Fujaba: Grafisches UML-Tool / Java FermaT: Formales Transformationssystem RECODER: Klassisches Transformationstool / Java Eclipse: IDE mit Refactorings / Java 2 Fragestellungen Wie sehen die Daten-/Berechnungsmodelle dieser Werkzeuge aus? Worin ähneln/unterscheiden sie sich? Anwendungen? 3 Anforderung an Refactoring-Tools Zuverlässigkeit Automatisierung der atomaren Schritte des Refactorings Korrektheit der automatisierten Schritte Nachvollziehbarkeit 4 Fujaba From UML to Java And Back Again Aktuell: Version 4.3.1 (03/2005) UML CASE Tool (open source) 1997 Universität Paderborn Unterstützt: Klassen-, Aktivitäts-, Zustands-, Use-Caseund Kollaborationsdiagramme Visuelle Programmiersprache Grundlage: PROGRES Abstrakter Syntaxgraph Basis: Graphtransformation, UML, SDM und Java (1.5) Refactorings als Plugins http://www.fujaba.de 5 Fujaba: Motivation Lernumgebung Visuelle Programmiersprache Round-Trip-Engineering UML-Modell → vollständiger Quellcode (Top-Down) Forward: Quellcode → vollständiges UML-Modell (Bottom-Up) Reverse: 6 Fujaba: Story Driven Modeling Entwickelt von Uni Paderborn Kombiniert Graph-Ersetzung & Programmierung: visuelle Modellierungssprache Beruht auf Story-Diagramme: Aktivitätsdiagramme mit eingebundenen Kollaborationsdiagrammen; sonst keine Kontroll- und Steuerfluss darstellbar Dynamische Systemanteile modellieren Abstrakte Analysetechniken (Use-Cases) & formale Spezifikationen (Klassendiagramme) Automatische Quellcode-Generierung 7 Fujaba: Quellcodegenerierung public int sizeOfLevels() { //here can be inserted any java code if ( this.levels == null ) { return (0); } else { return (this.levels.size ()); } } public void m1(int p1) { while ( p1>0 ) { p1--; } return; } 8 Fujaba: Oberfläche ToDo 9 Fujaba: Nulltransformation D 10 Fujaba: Transformation D 11 Software Reengineering “about as easy as reconstructing a pig from a sausage”* * A. Eastwood, “It’s a hard sell - and hard work too. (software reengineering),” Computing Canada 18 (1992), 35. 12 Software Reengineering Damals: Eingeschränkte Ressourcen, Assembler Heute: Aufwand Assembler gegenüber C: Funktion ca. 3x LOC Höhere Kosten (Function point: Assembler = 70 €* / C = 31 €*) Assembler: hochperformante Systeme, mächtige Compiler Objektorientierung schwierig; teuer in der Wartung wenig Flexibilität Software Reengineering: Migration von Assembler * SML Software Migrations Limited 13 Assembler extrn extrn extrn extrn dsaft adtn1 hrfft oldgs C :abs :word :abs :byte no_pick: mov dx,dsaft mov bx,adtn1 call far ptr tstbt jnz htst_irf_ret mov bx,adtn1 mov dx,hrfft call far ptr tstbt jz htst_irf mov oldgs,0 call far ptr hwal jnz htst_irf_ret jmp htst_irf htst_irf_ret: ret D void no_pick() { if ((adtn1->dsaft == 0 && adtn1->hrfft == 0)) { htst_irf(); } else if (adtn1->dsaft == 0) { oldgs = 0; hwal_zf = hwal(); if (hwal_zf != 0) { htst_irf(); } } return; } 14 FermaT Transformationssystem GPL; kostenlos Aktuell: Version 3 (03/2004) Kommerziell: Software Migrations Limited FermaT Workbench 1990 an Durham University entwickelt (Martin Ward) Formale Grundlage, Paradigma imperativ Regeln: WSL (Wide Spectrum Language) / MetaWSL AST Benötigt Perl 5.6.1 / C-Compiler (z.B. GCC) http://www.dur.ac.uk/martin.ward/fermat.html 15 FermaT: Migration 16 FermaT: WSL Definiert Regeln Basis: Logik; eindeutige Syntax; regulär, formal definierte Semantik, Korrekt Erweiterung: MetaWSL (z.B. foreach: AST bottom-up, ifmatch) low-level Programmierkonstrukte high-level abstrakte Spezifikationen Vorteil: Spezifikation & Implementierung in einer Sprache (reflexiv) FermaT interpretiert / kompiliert WSL-Programme Beinhaltet: WSL-zu-Scheme-Compiler (LISP-Dialekt) & Scheme-zu-C-Compiler Eingaben: WSL-Syntax-Datei (*.wsl), WSL-Scheme-Datei (*.scm), Patch-Datei (*.tr) 17 FermaT: WSL-Beispiel Expandieren eines IF-Statements If-Statement: if B then S1 else S2 fi; S Transformation: if B then S1; S else S2; S fi 18 FermaT: Transformation MW_PROC @Reverse_All_Ifs_Test() == @Pass .; MW_PROC @Reverse_All_Ifs_Code(Data) == FOREACH Statement DO IF @Trans?(TR_Reverse_If) THEN @Trans(TR_Reverse_If, "") FI OD.; SKIP ;;; Scheme translation of WSL code (define (/foreach-reverse_all_ifs-1 //Depth //A/S_/Type) (cond ((@Trans? //T/R_/Reverse_/If) (@Trans //T/R_/Reverse_/If "")))) (define (@Reverse_All_Ifs_Test) (@Pass)) (define (@Reverse_All_Ifs_Code //Data) (@Foreach_Statement /foreach-reverse_all_ifs-1 0 (@AS_Type) 0) (cond ((null? (@Program)) (@New_Program (@Skips))))) #t (display-list "Reading patch.tr") (define //T/R_/Reverse_/If '()) (load "reverse_if.scm") (load "reverse_if_d.scm") (define //T/R_/Reverse_/All_/Ifs '()) (load "reverse_all_ifs.scm") (load "reverse_all_ifs_d.scm") 19 Metaprogrammierung Analyse / Änderung eines Programms durch anderes (Metaprogramm) Programmiersprache muss Mechanismen bieten Metaschichten: 20 RECODER Java-Framework Statisches Metaprogrammieren Aktuell: Version 0.75Beta (04/2005) 1998 an Uni Karlsruhe entwickelt Abstrakter attributierter Syntaxbaum Generiert aus Java-Quelltext einen Strukturbaum http://recoder.sourceforge.net 21 RECODER: Konzept (1) Metaprogrammierbibliothek: Stellt das entsprechende Metamodell eines Programms zur Verfügung 22 RECODER: Konzept (2) Metamodell aus Entitäten von: Modell: alle syntaktischen Eigenschaften des analysierten Programms Strukturbaum: zusätzliche Informationen Position der Elemente in der Quelldatei Verweise zwischen Variablendeklaration und Variablenbenutzung Namensanalyse, dadurch zusätzliche Semantik Java-Quelltext Java-Bytecode Type-of Refers-to Pretty Printer: Strukturbaum wieder in Quelltext (Formatierung bleibt erhalten) 23 RECODER: Transformationsablauf Java-Quelldateien einlesen, RECODERAST aufbauen, Transformation einleiten, Quelltext schreiben 24 Refactorings Klasse/Methode/Attribut/Variable umbenennen Klasse in ein anderes Package verschieben Methode/Attribut in die Superklasse verschieben statische Methode in eine andere Klasse verschieben Methode extrahieren Methodensignatur ändern Superklasse/Interface extrahieren Attribut einkapseln … 25 Eclipse Java-IDE Aktuell: Version 3.1.2 (1/2006) Public License; kostenlos Entwickelt von IBM; 2001 Eclipse Foundation Refactorings in Java Development Tools (JDT) Seit 3.1 Language-Toolkit-Schicht (LTK) Refactorings als eigenständige API in Eclipse-Plattform Unabhängig von Java-Unterstützung Portabel zu anderen Plug-Ins („Refactoring Participants“) Plug-in: org.eclipse.ltk.core.refactoring Plug-in: org.eclipse.ltk.ui.refactoring Objektmodell AST für alle Sprachelemente (Klassen, Felder, Methoden, Bibliotheken) http://www.eclipse.org 26 Eclipse: Refactorings Automatisiert Bereits enthalten (29 / Fowler 93*) Anwendbar auf: Java-Projekte, -Klassen, -Felder und -Methoden Funktionalität sicherstellen: JUnit-Tests Undo-Funktion IDE aktualisiert während Refactoring internes Modell (Incremental Java Compiler) Anpassung an Java-Entwicklung * Martin Fowlers Refactoring-Liste: http://www.refactoring.com/catalog/index.html 27 Eclipse: Refactoring-Oberfläche ToDo 28 Eclipse: Refactoring-Lifecycle 29 Bewertung der Tools + Alle Tools kostenlos + Forschungsprojekte, Wettbewerb - Keine Refactorings implementiert (Ausnahme Eclipse) Fujaba: FermaT: + Alle Features als Plug-Ins, viele Exportformate + Korrektheit beweisbar + Intuitiv bedienbar + erfolgreiche Projekte: 544.000 LOC x86 zu effizienten C-Code - Keine Undo-Funktion - fehlende Quelltextähnlichkeit, Kompatibilität + hohe Performanz - Fehler bei Codegenerierung (Switch, - schlechte Handhabbarkeit (subjektiv) Mehrfachvererbung…) - Aufwand; große Transformationen? - Hoher Speicherbedarf; schlechte Performanz - wenig Beispiele beim Parsen RECODER: + API verfügbar + Schnittstelle zur dynamischen Metaprogrammierung (InjectJ…) - Beta-Stadium - wenig Beispiele Eclipse: + Schnittstelle (RECODER, Fujaba) + Weiterentwicklung von Refactorings (Anpassung an Java) + Refactorings ohne Zeitverlust erreichbar, gute Bedienung, Undo - Keine zusammengesetzten Transformationen 30 Relevanz für Arte-Fakt Erkenntnisse: Anderer Kontext (Java-Programmierung/ Migration) Tools bieten keine Architektur-Refactorings Fujaba-Abstraktionsansatz interessant, aber Codegenerierung anderer Kontext Diskussionsvorschlag: Darstellung IML als UML sinnvoll? Ansatz von RECODER für 1. Arte-Fakt-Ausbaustufe Ausblick: Konzepte der Tools für spätere Ausbaustufen (Regeldefinition, GUI …) 31 Vielen Dank für Eure Aufmerksamkeit!