220 likes | 395 Views
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. Motivation Was ist Skripting?
E N D
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 • Motivation • Was ist Skripting? • Skripting im historischen Überblick • Hochsprachen vs. Skriptsprachen • Evaluation • Fazit, Ausblick • Integration in die HSP
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)
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
Übersicht • Motivation • Was ist Skripting? • Skripting im historischen Überblick • Assembler • Hochsprachen • Virtuelle Maschinen • Dynamische Sprachen • Hochsprachen vs. Skriptsprachen • Evaluation • Fazit, Ausblick • Integration in die HSP
Assembler Lexikalische Analyse, Code generation Maschinen Code Code • 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 OpCode generation, Symbol resolving Betriebssystem, Plattform CPU HD
Hoch (Systemlevel-)sprachen Lexik., Syntaktische, Semantische Analyse Linker, Optimizer Code Object Code Maschinen Code • 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 Code generation Lexing, Parse tree, Symbol table (OS) CPU OS, Plattform HD
Virtuelle Maschinen Abstrakte Hardware- Beschreibung Lexik., Syntakt., Semant. Analalyse JIT, Optimizer Code Zwischen Code VM Lexing, parse tree, symbol table • 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 Code gen. OS, Plattform CPU HD
Dynamische (Skript-) Sprachen Lexik., Syntakt., Semant. Analyse Optimizer Code VM • 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 Code generation Lexing, parse tree, symbol table CPU HD OS, Plattform
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
Übersicht • Motivation • Was ist Skripting? • Skripting im historischen Überblick • Hochsprachen vs. Skriptsprachen • Evaluation • 5 bekannte Skriptsprachen • Schritte der Evaluation • Evaluierte Sprachen • Ergebnisse der Tests • Zusammenfassung • Fazit, Ausblick • Integration in die HSP
Die 5 bekanntesten Skriptsprachen • Perl: “Practical Extraction and Reporting Language” • 1987, Ersatz für Unixshell Tools, text-processing, “tainting” while (<>){ if (/Perl/){ print }} • 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 • PHP: “PHP Hypertext Preprocessor” • 1994, zuerst HTTPCGI daher <?php … ?>, beliebteste Websprache <?php while ($line = fgets(STDIN)){ if (preg_match(“Perl”, $line)) echo $line; } ?>
5 Skriptsprachen (2) • Ruby • 1995, starke Typisierung, Vermeidung von Inkonsistenzen von Perl (chop() vs. chop!()) • “Ruby on Rails” ARGF.each { |line| print line if line =~ /Perl/ } • 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); ECMA: European Computer Manufacturers Association
Evaluationsschritte • Suche von geeigneten Skriptsprachen-Implementationen • Kriterien: • Implementiert in Java • Vielseitig verwendbar (“general-purpose” Skriptsprache) • Ergebnis:18 relevante Implementationen • 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) • Performance-Tests anhand von 5 Testcases • Auswahl der Tests folgt Beispiel aus der Literatur • Reine Ladezeit des Interpreters • CPU, I/O, Hash, String-Performance • Auswahl und Empfehlung • Kriterien:Performance, gute Standardbibliothek, große Community, einfach zu erlernende Syntax
Wichtigste Implementierungen • 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 JSR: Java Specification Request
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): f.write(str(i)) f.close() Pseudo-Code des I/O Skripts in Python:
Standardbibliothek, Community • JavaScript • Genießt eine große Verbreitung durch client-seitigdynamischeWebseiten, 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)
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
Auswahl einer Skripting-Engine für die HSP • Performance • DynamicJava • JavaScript (Rhino) • BeanShell • JavaFX Script (Open-JFX), ... • Standardbibliothek • Besitzt keine der Sprachen, alle verlassen sich auf Java • Community • 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)
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