Schnelles Prototyping (Rapid Application Development, RAD) Prof. Dr. rer. nat. habil. Uwe Aßmann Lehrstuhl Softwaretechnologie Fakultät für Informatik TU Dresden Softwaretechnologie, Prof. Uwe Aßmann
2 Trends in der Softwareentwicklung Rapid Application Development (RAD) Schneller viel Code schreiben Sehr schnell ein UML-Modell in ausführbaren Code übersetzen Mit Skriptsprachen Perl (Larry Wall etc, www.perl.org) Python (Guido van Rossum, www.python.org) Pike (Frederik Hübinette et al., pike.ida.liu.se) Eigenschaften Oft schwach oder ungetypt (Strings und integer werden unterschieden) Interaktive Umgebungen JIT compiler, die implizit gestartet werden Gute Mustererkennung (string pattern machting) und Stringverarbeitung Mächtige Operationen, die schnell zu schreiben sind Grosse Bibliotheken erhältlich Zeit pike Java Java.5 Zuverlässigkeit Prof. U. Aßmann, Softwaretechnologie 2
Transformation auf Behälterklassen in Java (Wdh.) Ersetzen von * -Assoziationen durch Behälterklassen Bestellung Bestellung kunde: String kunde: String + neueposition(b: Bestellposition) + löscheposition(pos int) +sonderpreis(pos: int, preis: int) + auftragssumme(): int + print() + neueposition(b: Bestellposition) + löscheposition(pos int) +sonderpreis(pos: int, preis: int) + auftragssumme(): int + print() {ordered} {ordered} * Bestellposition Bestellposition <<interface>> Collection anzahl: String preis: int + einzelpreis(): int + einzelpreis(p: int) + positionspreis(): int anzahl: String preis: int + einzelpreis(): int + einzelpreis(p: int) + positionspreis(): int * für * für * Artikel Artikel name: String preis: int name: String preis: int + preis(): int + preis(): int Prof. U. Aßmann, Softwaretechnologie 3
Abbildung von UML-Assoziationen in der Skriptsprache Pike Ersetzen von * -Assoziationen durch Behälterklassen Bestellung kunde: String + neueposition(b: Bestellposition) + löscheposition(pos int) +sonderpreis(pos: int, preis: int) + auftragssumme(): int + print() Bestellung kunde: String + neueposition(b: Bestellposition) + löscheposition(pos int) +sonderpreis(pos: int, preis: int) + auftragssumme(): int + print() {ordered} {ordered} * Bestellposition Bestellposition array multiset mapping anzahl: String preis: int + einzelpreis(): int + einzelpreis(p: int) + positionspreis(): int anzahl: String preis: int + einzelpreis(): int + einzelpreis(p: int) + positionspreis(): int * für * für * Artikel Artikel name: String preis: int name: String preis: int + preis(): int + preis(): int Prof. U. Aßmann, Softwaretechnologie 4
Generische Datentypen in Pike Pike kennt generische Datentypen (array, multiset). Beide Collection- Datentypen können aber auch ungetypt verwendet werden (mixed) // This is pike, not Java class Bestellung { array(bestellposition) positionen; // generic array positionen2; // mixed multiset(bestellposition) positionen3; // generic multiset positionen4; // mixed } Bestellposition b = Bestellposition(); Bestellposition b2 = Bestellposition(); main() { positionen = ({b, b2}); // a typed array positionen2 = ({b, A, 3}); // a mixed array positionen3 = ([b, b2, b2]); // a typed multi-set (bag) positionen4 = ([b, b2, b2, A, A ]); // a mixed multi-set (bag) } Prof. U. Aßmann, Softwaretechnologie 5
Mehr über Arrays in Pike Mächtige Array-Operatoren, die sehr knappe Spezifikation von mächtigen Algorithmen erlauben (gut für RAD) // This is pike, not Java array empty = ({}); // mixed, empty array // An array of arrays of int array(array(int)) p = ({ ({, 3 }), ({ 2, 4, 3 }) }); array(int) a = ({, 3 }); array(int) b = ({ 2, 4, 3 }); array a_sum = a+b; // ({, 3, 2, 4, 3 }) array a_difference = a-b; // ({ }) array a_intersection = a&b;// ({ 3 }) array a_division = b/2.0; // ({ ({2,4}),({3}) }) Erzeugung von 2-d Arrays Prof. U. Aßmann, Softwaretechnologie 6
Mappings (Assoziative Arrays) als allgegenwärtige Datenstruktur Pike hat assoziative Arrays eingebaut (mappings, in Java: Map) Sehr sinnvoll, da mappings als explizit repräsentierte Funktionen in sehr vielen Anwendungen vorkommen Ein mapping ist ein array von (key, value) pairs Zufügen mit +=, Entfernen mit -= // This is pike, not Java mapping empty = ([]); // mixed, empty mapping mapping(string:int) DresdenPhoneBook = ([ Assmann : 072349879, Miller : 08784994 ]) mapping(string:int) GelsenkirchenPhoneBook = ([... ]); mapping(string:mapping(string:int)= GermanPhoneBooks = ([ Dresden : DresdenPhoneBook, Gelsenkirchen : GelsenkirchenPhoneBook,... ]) int assmann_phone = GermanPhoneBooks[ Dresden ][ Assmann ]; // Korregiere Assmanns Nummer DresdenPhoneBook -= ({ Assmann :072349879 }) GelsenkirchenPhoneBook += ({ Assmann :048889879 }) Prof. U. Aßmann, Softwaretechnologie 7
Pike hat Mehrfachvererbung Mehrfachvererbungen aus UML können direkt in Pike eingetippt werden Nationality German Francais // This is pike, not Java class Elsaesser { inherit Francais; inherit German; void eat () { // super call auf Klasse Francais Francais::mange(); }; void talk () { // super call auf Klasse German German::sprechen(); }; } Elsaesser Prof. U. Aßmann, Softwaretechnologie 8
String-Verarbeitung in Pike Die wahre Stärke zeigt das Array-Konzept bei der String-Verarbeitung Anwendungsgebiete der Stringverarbeitung: Web-Programmierung (template processing von html-schablonen) Textverarbeitung Suchanwendungen in Datenbasen Strings sind ähnlich zu Arrays Operatoren sum, intersect, division u.v.m. // This is pike string translatetowindows(string path) { array(string) directories = path / / ; return \\ +directories * \\ ; } translatetowindows( /home/ua/local/papers ); Prof. U. Aßmann, Softwaretechnologie 9
String-Verarbeitung in Pike Die map Funktion wendet eine Funktion auf alle Elemente eines arrays an Der * Operator distributiert ein Zeichen über ein Array von strings // This is pike string countpath(string path) { return (array(string)) map(path / /, sizeof) // ({ 4, 3, 5, 6 }) *, ; // 4,3,5,6 } countpath( /home/ua/local/papers ); Prof. U. Aßmann, Softwaretechnologie 0
String-Verarbeitung: Splicing Splice-Operator wendet eine Operation auf alle Elemente eines Arrays an (ähnlich zu map) // This is pike array(string) currencies = ({ Euro, Dollar, Yen, Pound }); ausgabe(4.32, @currencies); // 4.32 Euro 4.32 Dollar 4.32 Yen 4.32 Pound ausgabe(4.32, Euro, Dollar, Yen, Pound ); // the same output array(float) exchangerates = ({.32,, 4,.6 }); int money = 33; float calc (float rate, int i) { return i*rate; } array(float) moneys = map(exchangerates, calc, money); // accumulate moneys by + operator float int sum = +(0,@moneys); Prof. U. Aßmann, Softwaretechnologie
Vorteil von Pike: Skalisierbare Typisierung Man kann einen Pike Prototyp ohne Typisierung beginnen und die Typen später hinzufügen Um die Programmiersicherheit zu erhöhen Um die Effizienz zu erhöhen Ausserdem kann man Java aufrufen und schrittweise die Anwendung in Java umwandeln Das ist einmalig für eine Skriptsprache und hervorragend für RAD Untypisierter Pike Prototyp Typisierter Pike Prototyp Prof. U. Aßmann, Softwaretechnologie 2
Abbildungsschritte Der Platz von Skriptsprachen ist in der schnellen Prototypentwicklung Pike kann zum Prototyping (RAD) verwendet werden Einfache :-Übersetzung von UML-Assoziationen und Mehrfachvererbung Falls nicht schnell genug, bilde man das UML-Modell schrittweise auf Java ab. Das ist aufwendiger, bringt aber mehr Effizienz und stärkere Typsicherheit. Es ist sogar möglich, vom untypisierten Analysemodell aus zu beginnen Analysemodell in UML Entwurfsmodell in UML Untypisierter Pike Prototyp Typisierter Pike Prototyp Java Produkt Prof. U. Aßmann, Softwaretechnologie 3
Vergleich von Skriptsprachen: Pike vs Perl vs Python Pike hat einen Übersetzer, der schnellen Code erzeugt. Pike ist die momentan schnellste Skriptsprache (pike.ida.liu.se) Skalierbare Typisierung Ideal zur Abbildung von UML-Modellen Python ist voll typisiert, hat aber keine Mehrfachvererbung Schwierige Transformation von UML-Diagrammen Perl hat Mehrfachvererbung, ist aber untypisiert Gute Musterverarbeitung für Strings Grosse Bibliothek Prof. U. Aßmann, Softwaretechnologie 4
Andere Vorteile Einfache Programmierung von GUI durch guten Anschluss von GTK (Gnu Widget TookKit), analog zu AWT/Swing Gute Unterstützung von XML Java kann aus Pike aufgerufen werden Interaktive Umgebung hilfe Einfache Installation auf Windows und Linux Gute Vorbereitung für Web-Programmierung Roxen-Webserver in Pike programmiert Aktive open-source community, die auf Fragen reagiert: probieren Sie es aus! Prof. U. Aßmann, Softwaretechnologie 5
End Prof. U. Aßmann, Softwaretechnologie 6