Abstrakte Programmierung mittels Skripting: Untersuchung von geeigneten Implementierungen dynamischer Sprachen für die HSP Braunschweig, 18. September 2007 Abschlusspräsentation zur Studienarbeit Vitus Lorenz-Meyer Gliederung des Vortrags 1. 2. 3. 4. 5. 6. 7. Motivation Was ist Skripting? Skripting im historischen Überblick Hochsprachen vs. Skriptsprachen Evaluation Fazit, Ausblick Integration in die HSP Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig S.2/21 Motivation • • • Status-quo der Programmierung der HSP: Java-Code (+ grafische Beschreibungssprachen) Ist zu umständlich für kurze Programme oder schnelles Ausprobieren von Funktionalität – Java Programmierung des Xlets – Kompilieren des Xlet in eine .class-Datei Ziel: Vereinfachung der Programmierbarkeit – Beibehaltung des Xlet-Applikationsmodells – Xlet mit zusätzlich integriertem Skript-Interpreter – Muss nicht kompiliert werden, direktes Bearbeiten im Text-Editor und sofortige Neu-Interpretierung möglich – Möglichkeit der Integration mit XML-basierten Beschreibunsgsprachen (SVG) Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig S.3/21 Was macht eine Skriptsprache aus? • Interpretiert statt Kompiliert • Virtuelle Maschine – Plattformunabhängigkeit – Fehlerbehandlung – Speicherverwaltung (Garbage Collection) • Keine strikten Typen (duck typing) – Static vs. dynamic typing (Bezeichnung) – Strong vs. weak typing (Behandlung) • Sigils (“$”) typisch Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig S.4/21 Übersicht 1. Motivation 2. Was ist Skripting? 3. Skripting im historischen Überblick a) b) c) d) 4. 5. 6. 7. Assembler Hochsprachen Virtuelle Maschinen Dynamische Sprachen Hochsprachen vs. Skriptsprachen Evaluation Fazit, Ausblick Integration in die HSP Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig S.5/21 Assembler Lexikalische Analyse, Code generation Code Maschinen Code OpCode generation, Symbol resolving Betriebssystem, Plattform HD CPU • Vorteile – Schnelle Ausführung – Möglichkeit der Optimierung von Hand (volle Kontrolle) • Nachteile – Kennt keine Typen (-> viele Fehler) – Ist kompliziert zu schreiben – Ist plattformabhängig Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig S.6/21 Hoch (Systemlevel-)sprachen Code Lexik., Syntaktische, Semantische Analyse Lexing, Parse tree, Symbol table (OS) Object Code Linker, Optimizer Code generation OS, Plattform Maschinen Code HD CPU • Kompiler übersetzt Quelltext in Maschinencode • Vorteile – Strikte Typisierung erkennt Fehler während der Übersetzung – Schnelle Ausführung, da auf Plattform optimiert • Nachteile – Keine Fehlerbehandlung – Kein automatisches Speichermanagement Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig S.7/21 Virtuelle Maschinen Code Lexik., Syntakt., Semant. Analalyse Lexing, parse tree, symbol table Abstrakte HardwareBeschreibung Zwischen Code JIT, Optimizer VM Code gen. HD OS, Plattform CPU • Virtuelle Maschine: Abstrakte, nicht-reale Hardware-Plattform • Vorteile – Speichermanagement – Fehlererkennung + Behandlung während der Ausführung – Abstrahiert Betriebssystem und Plattform • Nachteile – Zusätzlicher Aufwand – Verschiebung der Code Generation auf Ausführungszeitpunkt – Höherer Speicherverbrauch – Weniger Flexibilität Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig S.8/21 Dynamische (Skript-) Sprachen Code HD Lexik., Syntakt., Semant. Analyse Lexing, parse tree, symbol table Optimizer Code generation OS, Plattform VM CPU • Interpreter: Kompiler und Code Genenerator (Optimierer) kombiniert • Vorteile – Virtuelle Maschine – Lockerer Umgang mit Typen (da genaue Fehlererkennung+Behandlung durch VM) – Einfacher anpassbar, da Skripte als Quelltext ausgeliefert werden • Nachteile – Langsamer, da komplette Übersetzung zum Ausführungszeitpunkt Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig S.9/21 Hochsprachen vs. dynamische Sprachen • Compiler vs. Interpreter ist Merkmal von Implementation – Weder bestimmt durch Spracheigenschaften noch Syntax • Hochsprachen – Größere Kontrolle, mehr Flexibilität erfordert Planung • Dynamische Sprachen – Einfacher dank stärkerer Abstraktion – Mehr Tools (Standardbibliothek, Datenstrukturen) – Rapid Prototyping (“Sketchen in Code”), “Proof-of-Concept” • Edit-interpret-debug cycle vs. edit-compile-run-debug cycle • Resultiert in Verschiebung des Aufwands vom Programmierer zur CPU – Fällt wegen schnellerer CPUs zunehmend weniger ins Gewicht Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig S.10/21 Übersicht 1. 2. 3. 4. 5. Motivation Was ist Skripting? Skripting im historischen Überblick Hochsprachen vs. Skriptsprachen Evaluation a) b) c) d) e) 5 bekannte Skriptsprachen Schritte der Evaluation Evaluierte Sprachen Ergebnisse der Tests Zusammenfassung 6. Fazit, Ausblick 7. Integration in die HSP Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig S.11/21 Die 5 bekanntesten Skriptsprachen 1. Perl: “Practical Extraction and Reporting Language” – 1987, Ersatz für Unixshell Tools, text-processing, “tainting” while (<>){ if (/Perl/){ print }} 2. Python – 1990, starke Typisierung, “Pseudo-code”, Einrückung wichtig, große Standardbibliothek for line in sys.stdin.readlines(): if re.search(“Perl”, line): print line 3. PHP: “PHP Hypertext Preprocessor” – 1994, zuerst HTTP CGI daher <?php … ?>, beliebteste Websprache <?php while ($line = fgets(STDIN)){ if (preg_match(“Perl”, $line)) echo $line; } ?> Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig S.12/21 5 Skriptsprachen (2) 4. Ruby – – 1995, starke Typisierung, Vermeidung von Inkonsistenzen von Perl (chop() vs. chop!()) “Ruby on Rails” ARGF.each { |line| print line if line =~ /Perl/ } 5. JavaScript – 1995 Netscape Navigator (“Mocha”), Client-side Websprache (DHTML, Ajax), standarisiert durch die ECMA var reader = new java.io.BufferedReader(java.lang.System.in); while (var line = reader.readLine()) if (/Perl/.exec(line)) print(line); Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig ECMA: European Computer Manufacturers Association S.13/21 Evaluationsschritte 1. Suche von geeigneten Skriptsprachen-Implementationen – Kriterien: • • Implementiert in Java Vielseitig verwendbar (“general-purpose” Skriptsprache) – Ergebnis: 18 relevante Implementationen 2. Test auf Lauffähigkeit in Java ME CDC – Die HSP ist in Java ME CDC implementiert – Ergebnis: 6 in CDC-Umgebung ausführbar (Häufigster Fehler: Fehlen des Packets java.nio.charset in Java ME) 3. Performance-Tests anhand von 5 Testcases – Auswahl der Tests folgt Beispiel aus der Literatur • • Reine Ladezeit des Interpreters CPU, I/O, Hash, String-Performance 4. Auswahl und Empfehlung – Kriterien: Performance, gute Standardbibliothek, große Community, einfach zu erlernende Syntax Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig S.14/21 Wichtigste Implementierungen 1. 2. 3. 4. JavaScript - Rhino • Interpreter Rhino ist Teil der Mozilla Suite • Standarisiert durch die Ecma als ECMAScript (ECMA-262, ISO/IEC-16262) • Wird in HTML und SVG verwendet BeanShell • JSR-274 (BeanShell) • Kombination von Standard-Java mit “loosely typed” Java Syntax möglich, trotzdem starke Typisierung wie in Java DynamicJava • Ist Teil des Koala-Projekts von ILOG Software (am INRIA/W3C Standort Sophia Antipolis) • Unterstützt auch loosely typed Java Syntax JavaFX Script - OpenJFX (ehemals Sun Projekt “F3”) • Ist Teil der neuen JavaFX-Familie von Sun • Bietet platzsparende “deklarative” Syntax zum Initialisieren großer Objekte Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig JSR: Java Specification Request S.15/21 Geschwindigkeit • Ladezeit des Interpreters – Leeres Skript • Mathematische Simulation – CPU Performance • I/O-Performance – Schreibt Schleifenvariable in Datei • Hash-Performance – Erzeugung eines und Zugriff auf ein assoziatives Array • String-Performance – Dynamische Erzeugung und Durchsuchen eines Strings n = int(sys.argv[1]) f=open(’/tmp/scratch','wb') for i in xrange(n): Pseudo-Code des I/O Skripts in Python: f.write(str(i)) f.close() Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig S.16/21 Standardbibliothek, Community • JavaScript – Genießt eine große Verbreitung durch client-seitig dynamische Webseiten, dadurch viel vorhandener Code • BeanShell – JSR-274 hat den voting Prozess überstanden Möglichkeit der Aufnahme in die Java Language Specification – Verwendet in NetBeans, jEdit, JMeter, EclipseShelll, OpenOffice... • DJava – Hat sehr geringe Verbreitung, wurde für einzelnes Projekt entwickelt • JavaFX Script – Alpha Status, daher noch keine Community – Hat aber den Vorteil der Entwicklung durch Sun Wird in allen JVMs von Sun laufen (Handy bis Set-top Box und PC) Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig S.17/21 Syntax • JavaScript – Prototype Modell, Syntax näher an C als an Java – Native Hash und Regular-Expression Syntax • BeanShell – Untermenge von Java mit Skripting Zusätzen (Klassensyntax anders als Java) – Syntax für einfachen Umgang mit JavaBeans • DynamicJava – Obermenge von Java (kann Java Code mit wenigen Änderungen interpretieren) • JavaFX Script – Deklarative Syntax für schnelles erstellen Grafischer Oberflächen und Animationen – Teilweise nicht-intuitive Syntax Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig S.18/21 Auswahl einer Skripting-Engine für die HSP • Performance 1. 2. 3. 4. – Standardbibliothek – • Besitzt keine der Sprachen, alle verlassen sich auf Java Community – • DynamicJava JavaScript (Rhino) BeanShell JavaFX Script (Open-JFX), ... JavaScript hat einzige nennenswerte Nutzerbasis Syntax – – – – DJava am nächsten an Java, keine zusätzlichen Features BeanShell nahe an Java, einige syntaktische Add-ons JavaScript weist native Syntax für RegEx und Hashes auf JavaFX Script hat “eigenwillige” Syntax Auswahl von JavaScript (Rhino) Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig S.19/21 Fazit, Ausblick • Skriptsprachen werden immer wichtiger – Wird verstärkt durch Zentralisation von Software, die nur noch per Browser-Interface benutzbar ist • Es bestehen 5 Ansätze, Java skripting-freundlicher zu gestalten: – JavaFX Script – BeanShell (JSR-274) – Groovy (JSR-241) – Java Skripting API (JSR-223) – Neuer Bytecode für “loosely typed” Variablen (JSR-292) • Skriptsprachen sind praktisch für schnelles Ausprobieren in Code • Sicherheit und formale Verifikation sind wichtiges Forschungsthema • Die Zukunft gehört Sprachen, die einen Kompromiss zwischen Entwicklungsaufwand und Verifizierbarkeit (Sicherheit) bieten Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig S.20/21 Fragen? Vitus Lorenz-Meyer · Institut für Nachrichtentechnik · Technische Universität Braunschweig S.21/21