Trace- und Zeit-Zusicherungen beim Programmieren mit Vertrag Mark Brörkens Universität Oldenburg, Fachbereich Informatik Email: [email protected] Einleitung ❘ Programmieren mit Vertrag ❘ JPDA ❘ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.1/22 Motivation Idee für diese Diplomarbeit ➠ Aufgabe aus dem Programmieralltag: Importierung von Benutzerdaten in ein neues System ➠ Optimierung durch viele parallele Zugriffe ➠ Die Reihenfolge einzelner Import-Aktionen ist kritisch ➠ Bei zu vielen parallelen Zugriffen dauert jede einzelne Aktion zu lange. Es kommt zu Timeouts. ➧ Einleitung ❘ Programmieren mit Vertrag ❘ JPDA ❘ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.2/22 Einleitung Voraussetzungen für das Prüfen von Trace- und ZeitZusicherungen zur Laufzeit: ➠ Ermittlung einer Trace ➧ Einleitung ❘ Programmieren mit Vertrag ❘ JPDA ❘ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.3/22 Einleitung Voraussetzungen für das Prüfen von Trace- und ZeitZusicherungen zur Laufzeit: ➠ Ermittlung einer Trace ➠ Prüfen der ermittelten Trace ➧ Einleitung ❘ Programmieren mit Vertrag ❘ JPDA ❘ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.3/22 Programmieren mit Vertrag ➠ Eingeführt von Bertrand Meyer als Bestandteil der Programmiersprache Eiffel ➠ Vor- und Nachbedingungen sowie Invarianten ➠ Konzept der Vererbung ➠ Erweiterung: Trace Assertions Einleitung ❘ ➧ Programmieren mit Vertrag ❘ JPDA ❘ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.4/22 Erweiterungen von Java ➠ Direkte Erweiterung der Programmiersprache um weitere Schlüsselworte (JDK 1.4, AspectJ) Einleitung ❘ ➧ Programmieren mit Vertrag ❘ JPDA ❘ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.5/22 Erweiterungen von Java ➠ Direkte Erweiterung der Programmiersprache um weitere Schlüsselworte (JDK 1.4, AspectJ) ➠ Quellcode-Instrumentierung (iContract, Jcontract, JML, Jass) Einleitung ❘ ➧ Programmieren mit Vertrag ❘ JPDA ❘ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.5/22 Erweiterungen von Java ➠ Direkte Erweiterung der Programmiersprache um weitere Schlüsselworte (JDK 1.4, AspectJ) ➠ Quellcode-Instrumentierung (iContract, Jcontract, JML, Jass) ➠ Bytecode-Instrumentierung (jContractor, Handshake, Java-MaC) Einleitung ❘ ➧ Programmieren mit Vertrag ❘ JPDA ❘ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.5/22 Erweiterungen von Java ➠ Direkte Erweiterung der Programmiersprache um weitere Schlüsselworte (JDK 1.4, AspectJ) ➠ Quellcode-Instrumentierung (iContract, Jcontract, JML, Jass) ➠ Bytecode-Instrumentierung (jContractor, Handshake, Java-MaC) ➠ Einsatz von Debuggern (JMSAssert, Lucent Technologies, Query Debugger) Einleitung ❘ ➧ Programmieren mit Vertrag ❘ JPDA ❘ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.5/22 Ermitteln einer Trace ➠ Java Platform Debugger Architecture ➠ Wird von vielen Java Virtual Machines unterstützt ➠ Bietet eine Java API für den Zugriff auf Java-Programme zur Laufzeit Einleitung ❘ Programmieren mit Vertrag ❘ ➧ JPDA ❘ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.6/22 JPDA VM Debuggee JVMDI Back-End CommChannel Front-End Debugger Einleitung ❘ Programmieren mit Vertrag JDWP Java Debug Wire Protocol JDI Java Debug Interface UI ❘ ➧ JPDA ❘ CSPjassda Java Virtual Machine Debug Interface ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.7/22 Einschränkungen des JDI ➠ Rückgabe-Werte von Methoden können nicht ausgelesen werden. Einleitung ❘ Programmieren mit Vertrag ❘ ➧ JPDA ❘ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.8/22 Einschränkungen des JDI ➠ Rückgabe-Werte von Methoden können nicht ausgelesen werden. ➠ Klassen müssen beim Übersetzen mit Debug-Optionen versehen werden. Einleitung ❘ Programmieren mit Vertrag ❘ ➧ JPDA ❘ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.8/22 Prüfen einer Trace ➠ Beschreibung der Trace- und Zeit-Zusicherungen durch den CSP-Dialekt CSPjassda . ➠ Die Trace-Semantik definiert die Menge erlaubter Traces. ➠ Die operationellen Semantik beschreibt, wie ein Process schrittweise verarbeitet werden kann. Einleitung ❘ Programmieren mit Vertrag ❘ JPDA ❘ ➧ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.9/22 CSPjassda BNF-Syntax von CSPjassda : P ::= Einleitung ❘ STOP TERM ANY[A] a -> P P ; Q P [] Q P || Q X Programmieren mit Vertrag ❘ JPDA ❘ ➧ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.10/22 Ereignis type event = jdi − interface clocks − interface Einleitung ❘ Programmieren mit Vertrag ❘ JPDA ❘ ➧ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.11/22 Ereignis event = Einleitung ❘ type jdi − interface clocks − interface virtualmachine thread instance method parameter returnvalue Programmieren mit Vertrag ❘ JPDA ❘ ➧ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.11/22 Unterschiede zu CSP ➠ Abstraktion von konkreten Ereignissen durch Ereignismengen Einleitung ❘ Programmieren mit Vertrag ❘ JPDA ❘ ➧ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.12/22 Unterschiede zu CSP ➠ Abstraktion von konkreten Ereignissen durch Ereignismengen ➠ Nur sichtbare Ereignisse werden berücksichtigt Einleitung ❘ Programmieren mit Vertrag ❘ JPDA ❘ ➧ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.12/22 Unterschiede zu CSP ➠ Abstraktion von konkreten Ereignissen durch Ereignismengen ➠ Nur sichtbare Ereignisse werden berücksichtigt ➠ Quantifizierende Operatoren lassen Aussagen über eine Menge von Threads und Instanzen zu. Einleitung ❘ Programmieren mit Vertrag ❘ JPDA ❘ ➧ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.12/22 Beispiel trace trace1 { eventset helloThread {class="jass.debugger.examples.HelloThread"} eventset run {method="run"} eventset getHello {method="getHello"} hellothread() { ||x:[thread]@ x.helloThread.run.begin -> x.helloThread.getHello.begin -> x.helloThread.run.end -> TERM } } Einleitung ❘ Programmieren mit Vertrag ❘ JPDA ❘ ➧ CSPjassda ❘ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.13/22 Jassda ➠ Jassda is ein Acronym für Java with Assertions Debugger Architecture. ➠ Die Trace eines Java-Programmes wird zur Laufzeit unter Verwendung des JDI ermittelt. ➠ Sie kann in eine Datei protokolliert ➠ oder gegen eine CSPjassda -Spezifikation geprüft werden. Einleitung ❘ Programmieren mit Vertrag ❘ JPDA ❘ CSPjassda ❘ ➧ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.14/22 Architektur GUI TraceChecker ..... Logger Broker Debuggee ..... ❘ Programmieren mit Vertrag debugged Applications Debuggee (n) ❘ Core Registry (1) Einleitung Modules JPDA ❘ CSPjassda ❘ ➧ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.15/22 Trace-Prüfer Trace-Specification Parser CSPInterpreter GUI Events from Broker Einleitung ❘ Programmieren mit Vertrag ❘ JPDA ❘ CSPjassda ❘ ➧ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.16/22 Benchmark ➠ Bubblesort-Algorithmus ➠ zwei Implementierungen für unterschiedliche Anzahl von Methodenaufrufen. ➟ Implementierung 1 benötigt für die Sortierung von 10000 Zahlen einen Methodenaufruf. ➟ Die zweite Implementierung benötigt 10001 Methodenaufrufe. Einleitung ❘ Programmieren mit Vertrag ❘ JPDA ❘ CSPjassda ❘ ➧ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.17/22 Bubblesort (1) void sort1(int[] field) { for(int element = 0; element < field.length; element++) { for(int run = field.length; --run > element; ) { if(field[run-1] > field[run]) { int tmp = field[run-1]; field[run-1] = field[run]; field[run] = tmp; } } } } Einleitung ❘ Programmieren mit Vertrag ❘ JPDA ❘ CSPjassda ❘ ➧ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.18/22 Bubblesort (2) void sort2(int[] field) { for(int element = 0; element < field.length; element++) { exchange(field,element); } } void exchange(int[] field, int element) { for(int run = field.length; --run > element; ) { if(field[run-1] > field[run]) { int tmp = field[run-1]; field[run-1] = field[run]; field[run] = tmp; } } } Einleitung ❘ Programmieren mit Vertrag ❘ JPDA ❘ CSPjassda ❘ ➧ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.19/22 Benchmark (Ergebnisse) hotspot Beschreibung classic 1 2 1 2 Code ohne Debug- 1,302s 1,262s 11,897s 12,067s Code mit Debug- 1,332s 1,252s 11,897s 12,067s nicht optimierter Code ohne Debug- 1,302s 1,252s 11,907s 12,067s 1,342s 1,252s 11,918s 12,057s 13,629s 13,630s 50,983s 51,013s 1,442s 1,372s 12,458s 12,458s 15,031s 2310,393s 56,812s 629,095s optimierter Informationen optimierter Informationen Informationen nicht optimierter Code mit DebugInformationen VM im Debug-Modus VM im Profiling-Modus VM mit Jassda verbunden Einleitung ❘ Programmieren mit Vertrag ❘ JPDA ❘ CSPjassda ❘ ➧ Jassda ❘ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.20/22 Zusammenfassung ➠ Marktanalyse ➠ Technische und theoretische Grundlagen ➠ Entwurf und Implementierung einer Architektur zur Runtime-Validierung von Java-Programmen ➠ Analyse des zeitlichen Verhaltens Einleitung ❘ Programmieren mit Vertrag ❘ JPDA ❘ CSPjassda ❘ Jassda ❘ ➧ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.21/22 Ausblick ➠ Erweiterung von Jassda um weitere Module ➠ Ergänzung von CSPjassda um weitere Operatoren ➠ Einbettung in grafische Benutzungsoberfläche wie NetBeans ➠ Optimierung der Ausführungsgeschwindigkeit Einleitung ❘ Programmieren mit Vertrag ❘ JPDA ❘ CSPjassda ❘ Jassda ❘ ➧ Zusammenfassung Trace- und Zeit- Zusicherungen beim Programmieren mit Vertrag – p.22/22