als eine PDF-Datei (schwarz-weiÃ) - IPD Goos
als eine PDF-Datei (schwarz-weiÃ) - IPD Goos
als eine PDF-Datei (schwarz-weiÃ) - IPD Goos
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 1<br />
Software aus Komponenten<br />
Prof. Dr. Gerhard <strong>Goos</strong><br />
Fakultät für Informatik<br />
Universität Karlsruhe<br />
Karlsruhe, Germany 2002<br />
c○ Gerhard <strong>Goos</strong> 2003<br />
http://www.info.uni-karlsruhe.de/
Organisation<br />
• Vorlesung:<br />
◮ dienstags 1400 - 1530, HS -101, wöchentlich<br />
◮ mittwochs 1400 - 1530, HS -101, vierzehntägig<br />
• Übungen:<br />
◮ mittwochs 1400 - 1530, HS -101, vierzehntägig, erstm<strong>als</strong> 30.4.<br />
• Übungsleiter: Dirk Heuzeroth<br />
• Adressen:<br />
◮ Allgem<strong>eine</strong>s Verfügungsgebäude, 2. OG<br />
◮ ggoos@ipd.info.uni-karlsruhe.de<br />
◮ heuzer@ipd.info.uni-karlsruhe.de<br />
• Sprechstunden:<br />
◮ <strong>Goos</strong>: montags 14.00-15.00 Uhr<br />
◮ Heuzeroth: mittwochs 16:00 - 17:00 Uhr<br />
• Vorlesungsseite:<br />
http://www.info.uni-karlsruhe.de/~i44www/lehre/swk/2003SS/<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 2
Inhalt<br />
1 Einleitung, Überblick, Konzepte<br />
• Ziele, Probleme und Aufgaben<br />
• Komponentenbegriffe<br />
• Überblick über<br />
◮ Klassische Ansätze<br />
◮ Produktlinien <strong>als</strong> Beispiel erfolgreicher Wiederverwendung mit<br />
Merkm<strong>als</strong>analyse <strong>als</strong> Hilfsmittel<br />
◮ Industrielle Lösungen<br />
◮ Akademische Ansätze<br />
2 Industrielle Lösungen<br />
• Ziele und Modell<br />
• CORBA<br />
• Enterprise JavaBeans (EJBs)<br />
• (D)COM, .NET<br />
3 Akademische Ansätze<br />
• Architektursysteme<br />
• Aspektorientiertes Programmieren<br />
• Metaprogrammierung und Invasive Komposition<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 3
Literatur (1)<br />
• K. Czarnecki, U. W. Eisenecker: Generative Programming.<br />
Addison-Wesley. Umfassender Überblick.<br />
• U. Aßmann: Invasive Software Composition. Springer-Verlag 2003<br />
• Kiczales et al: Aspect-oriented Programming. LNCS ECOOP 1997<br />
• C. Szyperski. Component software. Beyond object-oriented computing.<br />
Addison-Wesley. Guter Überblick.<br />
• Software - Concepts and Tools. Vol. 19(1), 1998. Springer.<br />
Viele gute Artikel, besonders derjenige von Michael Stal.<br />
• W. Beer, D. Birngruber, H. Mössenböck, A. Wöß: Die .NET-Technologie.<br />
dpunkt.verlag 2003<br />
• Mono Projekt, Open Source Implementierung des .NET Rahmensystems<br />
http://www.go-mono.com/, V 0.23, 2003<br />
• R. Orfali, D. Harkey: Client/Server Programming with Java and Corba.<br />
Wiley & Sons. Leicht zu lesen.<br />
• Jon Siegel: CORBA 3 Fundament<strong>als</strong> and Programming, John Wiley, 2000.<br />
• Sametinger: Software Reengineering with Reusable Components. Springer<br />
1998. Überblick, aber mehr auf abstraktem Niveau<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 4
Literatur (2)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 5<br />
• Gamma et al: Entwurfsmuster. Addison-Wesley.<br />
Das unentbehrliche Handwerkszeug des Softwareklempners.<br />
• W. Pree: Metapatterns. ECOOP’94. Strukturierung von Entwurfsmustern.<br />
• Charles F. Goldfarb, Paul Prescod: The XML Handbook - Fourth Edition.<br />
Prentice Hall, 2001.<br />
• Wiebke Möhr und Ingrid Schmidt (Hrsg.): SGML und XML, Anwendungen<br />
und Perspektiven. Springer Verlag, 1999.<br />
• William Pardi: XML in Action. Microsoft Press, 1999.<br />
• Oliver Pott und Gunter Wielage: XML, Praxis und Referenz. Markt &<br />
Technik Buch- und Software-Verlag, 1999.<br />
Weitere Literatur auf der WWW-Seite<br />
http:<br />
//www.info.uni-karlsruhe.de/~i44www/lehre/swk/2003SS/literatur.html
Standards<br />
• Common Object Request Broker Architecture (CORBA). OMG spec,<br />
http://www.omg.org/technology/documents/corba_spec_catalog.htm, speziell:<br />
http://www.omg.org/technology/documents/formal/corba_iiop.htm 2002.<br />
• The Component Object Model Specification. Microsoft,<br />
http://www.microsoft.com/com/resources/comdocs.asp, 1999.<br />
• Enterprise JavaBeans. Sun, http://java.sun.com/products/ejb/, 2003.<br />
• Extensible Markup Language (XML) 1.0. W3C Recommendation,<br />
http://www.w3.org/TR/REC-xml, 2000.<br />
• Extensible Markup Language (XML) 1.1. W3C Candidate<br />
Recommendation, http://www.w3.org/TR/xml11/, 2002.<br />
• Simple Object Access Protocol (SOAP) 1.1. W3C Note,<br />
http://www.w3.org/TR/SOAP/, 2000.<br />
• Web Services Description Language (WSDL) 1.1, W3C Note,<br />
http://www.w3.org/TR/wsdl, 2001.<br />
• Universal Description, Discovery and Integration (UDDI)<br />
http://www.uddi.org/specification.html, 2000–2002.<br />
• C# Language Specification (Standard ECMA-334)<br />
http://www.ecma-international.org/publications/standards/ECMA-334.HTM, 2002<br />
• Common Language Infrastructure (Standard ECMA-335)<br />
http://www.ecma-international.org/publications/standards/ECMA-335.HTM, 2002<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 6
Aufgaben, Visionen und Ziele<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 7
I.1.1 - Ziele<br />
• Doug McIlroy’s Traum, 1968:<br />
◮ Wiederverwendung erfolgreicher ‘‘massenproduzierter’’ Teillösungen<br />
◮ Doug’s wichtigste Erfindung: UNIX pipes<br />
• erfinde das Rad nicht ständig neu:<br />
◮ erhöht die Produktivität<br />
◮ steigert die Verläßlichkeit<br />
⇒ evolutionäre Softwareentwicklung<br />
• nicht bauen, anpassen:<br />
◮ Familien von Systemen mit Varianten, Versionen<br />
◮ Konfiguration anstelle von Bau<br />
• kaufen statt bauen<br />
◮ COTS: components-off-the-shelf<br />
• sei ein Ingenieur: Baue Software wie andere Elektrogeräte, Maschinen<br />
oder Gebäude<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 8
Probleme<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 9<br />
• Produktivität in der Software-Produktion zu gering<br />
• Qualität des Ergebnisses (Korrektheit, Benutzernutzen, . . . ) zu gering<br />
• zu viel Kunst, zu wenig engineering<br />
• zu wenig Wiederverwendung vorhandener Teillösungen<br />
• Programmieren auf der Anweisungsebene, ”<br />
Programmieren-im-Kl<strong>eine</strong>n“,<br />
statt Zusammensetzen aus größeren Einheiten,<br />
” Programmieren-im-Großen“<br />
• Hauptprobleme des Zusammensetzens:<br />
◮ Finden, was existiert<br />
◮ Anpassungsprobleme<br />
◮ Berücksichtigung nicht-funktionaler Eigenschaften<br />
◮ Inkonsistenz der Lösungs- und Implementierungsansätze verschiedener<br />
Komponenten, d. h. Inkompatibilität der Software-Architekturen der<br />
beteiligten Komponenten (Stilbruch, architectural mismatch, Garlan et<br />
al. 1995)
Aufgaben<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 10<br />
• Kennenlernen der vorhandenen, hauptsächlich industriellen Lösungsansätze<br />
• Systematik der Anforderungsermittlung<br />
• Methodik der Anpassung von Software-Teilsystemen<br />
Vision: Software-Konstruktion teilen in<br />
• Komponenten konstruieren (mit herkömmlicher Programmierung)<br />
• Komponenten zusammensetzen auf der Basis <strong>eine</strong>s Bauplans<br />
( ”<br />
Konfigurationsprogramm“)
Beispiel: Kostenreduktion<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 11<br />
Wiederverwendungsgrad 0% 25% 50%<br />
Aufwand [AM] 81.5 45 32<br />
# Entwickler 8 6 5<br />
Kosten/loc [Euro] 36 19 15<br />
Zeilen/AM 165 263 370<br />
Einsparung [Euro] - 200,000 290,000<br />
Einsparung - 45% 60%<br />
Aus: C.Jones, The Impact of Reusable Modules and Functions,<br />
in Programming Productivity , Mc Graw Hill, 1986.<br />
• Größe von Klassenbibliotheken<br />
◮ JDK 1.1: circa 1.650 Klassen<br />
◮ JDK 1.4: circa 2.750 Klassen<br />
• Je mächtiger, desto höher die Einarbeitungszeit
Weitere Ziele<br />
• bessere Produktqualität<br />
◮ Grundlösung ist gegeben, Augenmerk auf Optimierungen<br />
◮ höhere Verläßlichkeit (aber wer haftet?)<br />
◮ längere Software-Lebensdauer<br />
◮ größere Flexibilität<br />
• besserer Softwareprozeß<br />
◮ höhere Produktivität<br />
◮ ‘‘Rapid’’ Prototyping<br />
◮ frühe Simulation von Systemarchitekturen<br />
• bessere Dokumentation<br />
◮ Standardstrukturen für Systeme<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 12
Exkurs Produktqualität: Inspektionen (1)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 13<br />
Quelle: Freimut et al (Allianz), ESCOM 2000
Exkurs Produktqualität: Inspektionen (2)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 14<br />
Quelle: Freimut et al (Allianz), ESCOM 2000
Exkurs: Kosten-Nutzen-Rechnung für Inspektionen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 15<br />
Inspektionskosten Geschätzte Ersparnisse<br />
Projekt A 52 Personentage 89 Personentage<br />
Projekt B 44 Personentage 102 Personentage<br />
Quelle: Freimut et al (Allianz), ESCOM 2000
Exkurs: Einfluß von Inspektionen auf den Aufwand (1)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 16<br />
Quelle: Freimut et al (Allianz), ESCOM 2000
Exkurs: Einfluß von Inspektionen auf den Aufwand (2)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 17<br />
Quelle: Freimut et al (Allianz), ESCOM 2000
Was dämpft die Euphorie?<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 18<br />
Aufwand für das Finden, Erlernen der Schnittstellen und Adaptieren von<br />
Komponenten ist zu hoch.<br />
Daher ist der mögliche Markt für Komponenten bis heute nicht richtig<br />
zustandegekommen.<br />
Beispiel: Wer hat <strong>eine</strong> vollständige Übersicht der Klassen in der jdk?<br />
Es kostet 5 - 10 mal mehr <strong>eine</strong> Komponente für Wiederverwendung<br />
aufzubereiten, <strong>als</strong> sie nur für ein einzelnes Projekt zu entwickeln<br />
pragmatische Positionen:<br />
• Butler Lampson: ein System kann nur 3-4, allerdings sehr große<br />
wiederverwendbare Komponenten enthalten (Linux/Windows,<br />
Oracle/DB2, . . . ); alles andere kostet zu hohen Lernaufwand und führt zu<br />
inkonsistenten Systemarchitekturen<br />
• Produktlinien-Ansatz: viele Komponenten aus <strong>eine</strong>m umgrenzten<br />
Anwendungsbereich, die alle im Haus entwickelt sind; daher ist das<br />
know-how der Komponentenentwickler verfügbar, um das Finden,<br />
Erlernen und Adaptieren zu erleichtern. Entwicklung wiederverwendbarer<br />
Komponenten kostet 2 -3 mal mehr <strong>als</strong> Entwicklung <strong>eine</strong>r Kompontente<br />
für ein einzelnes Projekt.<br />
• der akademische Ansatz: ein Grundbestand an Komponenten und damit<br />
konsistenten Systemarchitekturen muß im Studium erlernt werden und<br />
kann dann angereichert und wiederverwendet werden.
Grundlagen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 19
Reale Komponentensysteme<br />
Real Component Systems<br />
LEGO<br />
bricks<br />
• LEGO<br />
IC<br />
• Hohlblöcke<br />
• ICs<br />
Real Component Systems<br />
LEGO<br />
bricks<br />
IC<br />
• Hardware-Busse Hardware-Bus<br />
Hardware-Bus<br />
• Was unterscheidet Difference to siesoftware von Methoden construction? der Software-Konstruktion?<br />
Difference to software construction?<br />
Gerhard <strong>Goos</strong>, Software from Components, Overview 9<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten<br />
Gerhard <strong>Goos</strong>, Software from Components, Overview<br />
20
Reale Komponentensysteme<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 21<br />
System Schnittstellen Komposition Anpassung<br />
LEGO Noppen Zusammen- -<br />
stecken<br />
Ziegel Form, Profil Mörtel Stücke abbrechen<br />
ICs, Bus Anschluß-Signal- Zusammen- Signale konvertieren,<br />
Spezifikation stecken, Löten filtern, puffern, . . .<br />
Software Signaturen Aufruf Daten, Funktionen,<br />
Protokolle Umwickeln Protokolle, ...
Komponenten, Komposition und Adaption<br />
• Entwurf nach Geheimnisprinzip (information hiding)<br />
◮ explizite Spezifikation von Schnittstellen<br />
◮ Implementierung bleibt verborgen<br />
• Komposition<br />
◮ Zusammensetzen von Komponenten nach lokalen Entwurfsprinzipien,<br />
die globale funktionale und nichtfunktionale Eigenschaften zusichern<br />
◮ Adaption von Komponenten, wenn nötig<br />
interne Adaption von Komponenten an ihren<br />
Wiederverwendungskontext<br />
externe Adaption: Anpassung der Schnittstellen für die<br />
Zusammenarbeit<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 22
I.1.2 - Definition von Komponenten<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 23<br />
• A software component<br />
is a unit of composition with contractually specified interfaces and explicit<br />
context dependencies only. It can be deployed independently and is<br />
subject to composition by third parties.<br />
Szyperski (ECOOP Workshop WCOP 1997)<br />
• A reusable software component<br />
is a logically cohesive, loosely coupled module that denotes a single<br />
abstraction.<br />
Booch<br />
• A software component<br />
is a static abstraction with plugs.<br />
Nierstrasz/Dami
Andere Definitionen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 24<br />
• Software components<br />
are defined as prefabricated, pretested, self-contained, reusable software<br />
modules - bundles of data and procedures - that perform specific<br />
functions.<br />
MetaGroup (OpenDoc)<br />
• Reusable software components<br />
are self-contained, clearly identifiable pieces that describe and/or perform<br />
specific functions, have clear interfaces, appropriate documentation, and a<br />
defined reuse status.<br />
Sametinger
Komponenten - Unsere Definition<br />
• Programmeinheiten mit standardisierter Basiskommunikation<br />
◮ Abstrakt (nur Schnittstelle), generisch oder<br />
konkret (mit Implementierung)<br />
Klassen und Module sind Komponenten, Objekte nicht!<br />
• Entworfen mit standardisierten Verträgen zur Komposition:<br />
◮ Export-Schnittstelle sichert semantische Eigenschaften zu<br />
◮ Import-Schnittstelle definiert Voraussetzungen dafür<br />
Explizit oder<br />
Implizit (Parameter von Konstruktoren oder Methoden)<br />
◮ Kein implizites Wissen<br />
• Komponenten sind wiederverwendbar<br />
• Komponenten können aus Komponenten zusammengesetzt sein<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 25
Eigenschaften von Komponenten<br />
• Können aus Spezifikation generiert werden<br />
(generische Komponenten)<br />
• Unterscheidung funktionaler und nicht-funktionaler Aspekte<br />
◮ Funktion und Daten,<br />
◮ Kommunikation und Synchronisation,<br />
◮ Verteilung,<br />
◮ Persistenz, usw.<br />
• Können dynamisch geladen und ersetzt werden<br />
◮ Programme können Komponenten mit Reflektion betrachten und deren<br />
Dienste feststellen<br />
◮ Ignorieren unbekannter funktionaler Aspekte<br />
Reflektion: Die Fähigkeit <strong>eine</strong>s Programmes, s<strong>eine</strong>n Zustand zur<br />
Laufzeit zu inspizieren und s<strong>eine</strong> Funktionalität zu bestimmen.<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 26
Komposition<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 27<br />
• Ausfalten generischer Komponenten (homogen/heterogen)<br />
• Zusammensetzen von Komponenten gemäß Verträgen:<br />
◮ über Funktionen und Daten<br />
◮ üer Kommunikation, Synchronisation und Protokolle<br />
◮ Problem der globalen Lebendigkeit?<br />
◮ Wie gehen nichtfunktionale Eigenschaften ein?<br />
• Mangelnde Passung erfordert Adaption (Anpassung) der Komponenten:<br />
◮ Externe Adaption durch ”<br />
Klebecode“ (glue code)<br />
◮ Interne Adaption:<br />
Offenes Einsetzen<br />
Invasiver Austausch nicht-funktionaler Aspekte (z.B.<br />
Basiskommunikation tauschen, Synchronisation einfügen usw.)
Exkurs: Generische Komponenten<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 28<br />
• Beispiel: Auf <strong>eine</strong>m Graphen mit Adjazenzmatix A = (a ij ),<br />
betrachte folgende Probleme für i ≠ j:<br />
◮ Existiert ein Pfad von i nach j?<br />
◮ Länge des kürzesten Pfades von i nach j?<br />
◮ Maximaler Fluß von i nach j?<br />
(die Kapazitäten sind durch a ij gegeben)<br />
• Der generische Floyd-Warshall-Algorithmus löst alle drei Probleme<br />
◮ ∀k ∈ [1, n] : a kk := c<br />
∀k ∈ [1, n]:<br />
∀i ∈ [1, n]:<br />
∀j ∈ [1, n]:<br />
a ij := a ij σ (a ik τ a kj )<br />
• Übung: Bestimme die Konstante c und die Operationen σ, τ für alle<br />
Probleme. Welche algebraischen Eigenschaften müssen σ, τ aufweisen?<br />
• Übung: Schreibe <strong>eine</strong> Schablone (template) in C++, die mit<br />
entsprechenden Parametern die Probleme löst.<br />
◮ Bemerkung: Dieses Beispiel ist nicht OO-spezifisch. Können Sie es in Pascal oder C<br />
lösen?
Exkurs: Generische Komponenten II<br />
• Verallgem<strong>eine</strong>rung und Schlußfolgerungen:<br />
◮ Eine generische Komponente besteht aus (<strong>eine</strong>r oder mehreren)<br />
‘‘generischen’’ Klassen, die durch Datentypen, Operationen,<br />
Implementierungen , . . . parametrisierbar ist<br />
◮ Die generische Klasse wird ausgefaltet, indem sie mit Exemplaren der<br />
Parameter versorgt wird.<br />
◮ Beispiele<br />
Schablonen in C++ (zu allgemein, unsystematisch definiert)<br />
Generische Pakete in Ada<br />
Generische Klassen in Eiffel, Sather, ..., (Pizza, generic Java)<br />
◮ Hauptanwendung: Behälter (Stacks, Listen, ...)<br />
◮ Problem: Viele Operationen der generischen Klasse werden auf<br />
Parameter angewendet. Wie kann man sicherstellen, daß sie alle<br />
existieren?<br />
Lösung: Begrenzte Polymorphie (bounded polymorphism)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 29
Wiederholung: Entwurf mit Verträgen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 30<br />
• Problem: Programmeinheiten (Klassen, Methoden, . . . ) kommunizieren<br />
◮ Schnittstellen müssen passen<br />
• Lösung: Einführen von Zusicherungen (i.A. Formeln im Prädikatenkalkül),<br />
die die benötigten Eigenschaften beschreiben<br />
◮ Vorbedingung: muß vom Aufrufer erfüllt werden, damit der Aufruf<br />
funktionieren kann<br />
◮ Nachbedingung: kann der Aufrufer nach der Rückkehr verwenden<br />
(sofern die Vorbedingung erfüllt war)<br />
◮ Klasseninvariante: Zusicherung über den Zustand <strong>eine</strong>r Datenstruktur<br />
vor und nach jeder Manipulation.
Wiederholung: Entwurf mit Verträgen II<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 31<br />
• Solche Zusicherungen heißen Verträge (contracts, Bertrand Meyer, Eiffel)<br />
zwischen Aufrufer und Aufgerufenen<br />
• Grundlegende OO-Entwurfstechnik: Zunächst nur Verträge zwischen<br />
Klassen und ihren Methoden definieren<br />
• Deckt nur funktionale Eigenschaften ab<br />
• Wendet Standardtechniken der Verifikation (‘‘Hoare logic’’) auf<br />
Programmieren im Großen an<br />
◮ Amüsant: ”<br />
Entwurf mit Verträgen“ wird von Praktikern geschätzt und<br />
großflächig eingesetzt, aber ‘‘Verifikation’’ gilt <strong>als</strong> nicht praktikabel;<br />
allein der Namenswechsel machte den Unterschied.
Wiederholung: Entwurf mit Verträgen III<br />
• Beschränkungen: Allgemeinheit vs. Spezialfälle<br />
◮ Ein Programm erfüllt s<strong>eine</strong> Verträge, wenn die Zusicherungen für alle<br />
gültigen Eingaben erfüllt werden<br />
(ebenfalls durch Zusicherungen geregelt)<br />
◮ Aber: Jeder Test <strong>eine</strong>r Zusicherung zur Laufzeit sichert die<br />
Vertragserfüllung nur für diesen speziellen Aufruf<br />
◮ Also: Verträge müssen statisch (von Hand) geprüft werden<br />
◮ Tests zur Laufzeit prüfen nur Spezialfälle<br />
inakzeptabel für verläßliche Systeme<br />
akzeptabel, wenn ein Fehlschlag k<strong>eine</strong> Schäden anrichtet<br />
(abgesehen von Verzögerungen)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 32
Einige Kommunikationsarten<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 33<br />
• Normaler Prozeduraufruf<br />
• Rückruf (callback) und Ereignisse<br />
• Fernaufruf (remote procedure call, remote method invocation)<br />
◮ Einpacken der Objekte in Byte-Strom, Verschicken, Auspacken<br />
◮ Kann in heterogenen Systemen eingesetzt werden<br />
Z.B. Java RMI, CORBA usw.<br />
• Gemeinsamer Speicher (synchronisiert mit Semaphoren, . . . )<br />
• Uni- oder bidirektionale FIFOs (z.B. pipes, sockets)<br />
• Anschlagtafeln (blackboards, strukturierte Anschlagtafeln (Linda<br />
Tupelraum)<br />
• Transaktionsdienste (Datenbank)<br />
• Migration von Code (z.B. Java Applets)
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 34<br />
Beispiel: Rückruf und Ereignisse: Konzepte<br />
Example: Callbacks and Events I<br />
abstract solution<br />
goal: communication client-server whenever a situation<br />
(event, state change) arises at the server requiring action<br />
• Ziel: Kommunikation zwischen Dienstnehmer und Dienstgeber, wenn <strong>eine</strong><br />
Situation by the client (Ereignis, Zustandsübergang) im Dienstgeber Aktivität des<br />
Dienstnehmers erfordert<br />
abstract solution: introduce event server between client and<br />
• Abstrakte Lösung: Ereignisdienst <strong>als</strong> Zwischenschicht einführen<br />
server<br />
event<br />
client<br />
server<br />
server<br />
◮ Dienstnehmer abonniert relevante Ereignisse beim Dienstgeber<br />
client notifies event server in advance about all events of interest<br />
‘‘relevant’’ durch Nebenbedingungen weiter einschränkbar<br />
◮ Dienstgeber “interest” may benachrichtigt constraint by Dienstnehmer mentioning additional über conditions Ereignisse (mit<br />
Nutzdaten)<br />
server notifies event server about all incoming events (state<br />
changes) including additional information<br />
◮ Ereignis kann k<strong>eine</strong>n, <strong>eine</strong>n, oder beliebig viele Dienstnehmer erreichen<br />
event server may notify zero, one or several clients about the event<br />
◮ Synchrone oder asynchrone Benachrichtigung<br />
notification by event server may be synchronous or asynchronous<br />
◮ Ereignisdienst oft im Dienstgeber integriert (Ereignisschleife)<br />
event server often integrated into the server (“event loop”)<br />
Gerhard <strong>Goos</strong>, Software from Components, Overview 22
Beispiel: Rückruf und Ereignisse II<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 35<br />
• Aufrufer übergibt Prozedurvariable oder Verweis auf Objekte (anonyme<br />
Klasse in Java, Rückruf-Dienst in Corba, delegate in C#, Dotnet)<br />
◮ Rückruf durch Rahmensystem, Bibliothek oder Dienstgeber<br />
◮ Zuerst eingesetzt zur Anbindung von Programm und<br />
Benutzerschnittstelle<br />
• Ereignisse zur asynchronen Kommunikation<br />
◮ technisch über Rückruf gelöst<br />
◮ Reihenfolge meist nicht zugesichert<br />
• dynamisch variierbarer Empfänger<br />
• Ereignisquellen sind meist Dienste<br />
• Z.B. in Java Beans, Corba Event Service
Echtzeitbedingungen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 36<br />
Vorlesung betrachtet o.B.d.A. k<strong>eine</strong> Echtzeitsysteme<br />
• Echtzeitbedingungen lassen sich in <strong>eine</strong>m Automaten separat zu den<br />
Zustandsübergängen (funktionaler Automat) des betrachteten Systems<br />
spezifizieren und mit diesem bei Bedarf zusammenfügen (Dissertation<br />
Lötzbeyer).<br />
⇒ Zeitbedingungen lassen sich in die Komponentenschnittstelle<br />
aufnehmen.<br />
• Wichtig für die Analyse: Scharfe Unterscheidung zwischen Eingabewerten,<br />
Ausgabewerten und lokalen Variablen in <strong>eine</strong>r Komponente, d. h.<br />
transiente Parameter nicht zugelassen<br />
⇒ Komponente kann zu <strong>eine</strong>r Menge von Zuweisungen<br />
ausgabeparameter := f(eingabewert)<br />
abstrahiert werden.
I.1.3 Klassische Konzepte<br />
◮ UNIX<br />
◮ XML - Lösungen<br />
◮ Module<br />
◮ Klassen und Vererbung<br />
◮ Rahmensysteme (framework)<br />
• betrachtet <strong>als</strong> Komponentensysteme<br />
mit Diskussion der Probleme<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 37
UNIX<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 38<br />
• Basiskommunikation: Byte-Ströme von Quelle zu Senke<br />
◮ Einfach und flexibel<br />
◮ In <strong>eine</strong>m Rechner: Pipes<br />
◮ In Rechnernetzen: Sockets<br />
• Komponenten sind eigenständige Programme<br />
◮ Schnittstellen: Standardeingabe, Standardausgabe<br />
◮ Generierung: durch make usw.<br />
• Komposition mit Pipes in Shells und Skriptsprachen<br />
• Adaption:<br />
◮ externe Adaption durch eigenständige Komponenten, meist<br />
programmierbare Filter (awk, cut, grep, sed, usw.)<br />
◮ interne Adaption nicht unterstützt
Probleme<br />
• Komponenten haben jeweils nur <strong>eine</strong>n Ein- und Ausgang<br />
• Einschränkung auf Ketten von Filtern (Pipelines)<br />
◮ Allgem<strong>eine</strong>rer Einsatz von Pipes und Sockets möglich.<br />
◮ Programme in C/C++ können so außerhalb des Modells agieren.<br />
◮ Komposition mit Werkzeugen wie Shells, Skripte dort unmöglich.<br />
• Einschränkung auf asynchrone Protokolle ohne Rückkanal<br />
• Adaption schwierig<br />
◮ Formale Modellierung der Daten fehlt<br />
◮ Standardwerkzeuge beherrschen maximal reguläre Muster<br />
• Allgem<strong>eine</strong> Probleme mit Skripten:<br />
◮ Schlecht skalierbar<br />
◮ Schlecht wartbar<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 39
Einsatz von XML<br />
• Allgem<strong>eine</strong> Idee:<br />
◮ Ersetze UNIX’ Byteströme durch strukturierte Daten (Bäume)<br />
◮ Lasse mehrere benannte Ein- und Ausgaben zu<br />
◮ Erlaube syntaktische und semantische Datentransformationen<br />
• Komponenten sind eigenständige Programme oder Teile davon<br />
• XML <strong>als</strong> Austauschformat<br />
• XSLT für Datenanpassungen<br />
◮ Pfadsprache zur Musterbeschreibung, regelbasierte Ersetzung<br />
◮ andere Graphersetzungssysteme denkbar, nicht Standard<br />
• SOAP (Simple Object Access Protocol) <strong>als</strong> Basiskommunikation<br />
◮ Transport meist über HTTP<br />
• UNIX <strong>als</strong> Komponentensystem kann subsumiert werden<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 40
Module (à la Parnas)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 41<br />
Every module hides an important design decision behind a well-defined<br />
interface which does not change when the decision changes.<br />
David Parnas<br />
• Eigenschaften<br />
◮ Feste Schnittstellen<br />
◮ Kapselung, Geheimnisprinzip (information hiding)<br />
◮ Statische Bindung: K<strong>eine</strong> dynamische Erzeugung<br />
• Durchdringt viele moderne Sprachen (Modula, Ada, Java, C/C++ usw.)<br />
• Betrachtung <strong>als</strong> Komponentensystem:<br />
◮ Basiskommunikation: Prozeduraufruf<br />
◮ Schnittstellen: Prozeduren mit Parametern, globale Variable<br />
◮ Generierung: sprachspezifisch für generische Module<br />
◮ Adaption explizit und manuell
Probleme<br />
• Sprachabhängigkeit der<br />
◮ Basiskommunikation<br />
◮ Spezifikation von Daten und Prozeduren<br />
◮ Synchronisation<br />
• Protokolle nicht spezifiziert<br />
• Fehlende Werkzeuge für<br />
◮ Komposition<br />
◮ Adaption<br />
◮ Verteilung<br />
• Heterogene, verteilte Lösungen erfordern viel Handarbeit!<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 42
Objektorientierte Klassensysteme<br />
• Klassen sind Module<br />
◮ können mehrere zur Laufzeit erzeugte Objekte haben<br />
◮ Objekte haben Zustände (evtl. persistent)<br />
• Vererbung und Untertypbeziehungen<br />
◮ Polymorphie<br />
◮ Späte Bindung von Aufrufen ( ”<br />
faule Auswertung“)<br />
• Betrachtung <strong>als</strong> Komponentensystem:<br />
◮ Basiskommunikation: (Polymorphe) Methodenaufrufe, Variable<br />
◮ Schnittstellen: Polymorphe Methoden, Objekt- und Klassenvariable<br />
◮ Generierung: sprachspezifisch, oft mit generischen Klassen<br />
◮ Adaption: durch Vererbung oder Delegation<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 43
Generische oder Abstrakte Klassen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 44<br />
generic/abstract class<br />
instance<br />
system<br />
implementation
Probleme<br />
• Sprachabhängigkeit der<br />
◮ Basiskommunikation<br />
◮ Spezifikation von Daten und Prozeduren<br />
◮ Synchronisation<br />
• Protokolle nicht spezifiziert<br />
• Adaption durch Spracheigenschaften eingeschränkt<br />
(Kontravarianz oder Kovarianz bei Vererbung)<br />
• Fehlende Werkzeuge zur Verteilung<br />
• Heterogene, verteilte Lösungen erfordern viel Handarbeit!<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 45
Rahmensysteme (Frameworks)<br />
• Rahmensysteme sind Klassensysteme mit ”<br />
Rahmen“<br />
◮ Der Rahmen bestimmt, welche zusätzlichen Klassen mit welchen<br />
Eigenschaften hinzugefügt werden müssen, um ein lauffähiges System<br />
zu erhalten.<br />
◮ Der Rahmen spezifiziert <strong>als</strong>o auch <strong>eine</strong>n Bauplan für das Gesamtsystem<br />
• Das Rahmensystem bestimmt Ablauf und Kommunikation <strong>eine</strong>r<br />
Anwendung<br />
• Parametrisierung durch Klassen<br />
• Rahmensysteme <strong>als</strong> Komponentensysteme:<br />
◮ Basiskommunikation: Methodenaufrufe<br />
◮ Schnittstellen: Brennpunkte (hot spot) — Mengen von polymorphen<br />
Methoden<br />
◮ Generierung: Instantiierung der Parameterklassen oder Implementierung<br />
der abstrakten Klassen gemäß den Einschränkungen des Rahmens<br />
◮ Adaption: durch Vererbung oder Delegation<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 46
Rahmensysteme<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 47<br />
parameter classes<br />
instances<br />
system<br />
implementation<br />
implementation
Probleme<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 48<br />
• Oft sprachabhängig<br />
• K<strong>eine</strong> Wiederverwendung in fremdem Kontext<br />
(Grund: zu starke Standardisierung)<br />
• Rahmen legt Möglichkeiten im voraus fest:<br />
◮ Adaption<br />
◮ Verteilung<br />
◮ Art der Kommunikation<br />
◮ Heterogene Lösungen
Modellieren mit UML Komponenten-Diagrammen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 49<br />
Billing.exe<br />
Billing<br />
System<br />
Register.exe<br />
Course.dll<br />
Course<br />
People.dll<br />
User<br />
Student<br />
Professor<br />
Course<br />
Course<br />
Offering<br />
Copyright © 1997 by Rational Software<br />
Corporation
Probleme<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 50<br />
• Semantik sehr flexibel<br />
• Nichts ist definiert, <strong>als</strong>o k<strong>eine</strong> Anpassung nötig<br />
• Problem der Implementierung<br />
• Probleme je nach Implementierungssprache oder -system
I.1.4 Kommerzielle Komponentensysteme<br />
• Komponentensystem (Plattform, Rahmensystem) definiert Standards für<br />
Komponenten: Schnittstellen, Protokolle, Kommunikations- und<br />
Implementierungsbasis<br />
• stellt Grundvoraussetzungen für Einsatz der Komponenten sicher<br />
• reguliert Interaktionen zwischen den Komponenten<br />
• Beispiele:<br />
◮ Corba<br />
◮ (D)COM, .Net<br />
◮ (Enterprise) JavaBeans<br />
◮ IBM SOM<br />
◮ OpenDoc<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 51
(D)COM, DotNet, CORBA und JavaBeans<br />
• Basiskommunikation:<br />
◮ Normale Prozeduraufrufe an Kommunikationssystem<br />
◮ Weiterleitung über normale Aufrufe und Fernaufrufe<br />
• Standardisierte Schnittstellen<br />
◮ set/get Properties,<br />
◮ IUnknown (COM), QueryInterface (Corba)<br />
◮ Namensdienste usw.<br />
• Generierung: aus Klassen und Definitionssprachen<br />
• Nur externe Adaption:<br />
◮ Für verteilte Systeme (Weiterleiten von Aufrufen über Fernaufrufe,<br />
marshaling)<br />
◮ Für gemischtsprachliche Systeme (IDL)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 52
Komponenten in kommerziellen Systemen<br />
Components in Commercial<br />
Systems<br />
• Objects Objekte, to be die plugged in <strong>eine</strong>n into Softwarebus a softwarebus gesteckt werden können<br />
• bus Mit + set demof standardized Bus und <strong>eine</strong>r interface Menge implementations von standardisierten + objectsSchnittstellen bilden<br />
result sie ein a Komponentensystem component (platform) (Plattform)<br />
softwarebus<br />
Prof. Dr. G. <strong>Goos</strong> Gerhard <strong>Goos</strong>, Software Software from Components, aus Komponenten Overview 40 53
CORBA<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 54<br />
CORBA<br />
• Offener Standard, siehe http://www.corba.org<br />
• Unabhängig von Sprache und Verteilung<br />
open standard, see http://www.corba.org<br />
• Schnittstellendefinitionssprache (interface definition language IDL<br />
independent from programming language and distribution<br />
• Komponenten <strong>als</strong> Quellcode oder binär<br />
interface definition language IDL<br />
source code or binary components<br />
client<br />
Java<br />
IDL stub<br />
client<br />
C<br />
IDL stub<br />
server<br />
C++<br />
IDL skeleton<br />
object adapter<br />
Object Request Broker (ORB), Trader, Services
(D)COM<br />
(D)COM<br />
• Microsoft proprietär, siehe http://www.activex.org<br />
Microsoft proprietary, see http://www.activex.org<br />
• Ähnelt CORBA, aber einige Einschränkungen<br />
similar to CORBA<br />
• Rein binärer Standard<br />
only binary standard<br />
client<br />
VBasic<br />
COM stub<br />
client<br />
C++<br />
COM stub<br />
server<br />
C++<br />
COM skeleton<br />
monikers, registry<br />
Gerhard <strong>Goos</strong>, Software from Components, Overview 42<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 55
JavaBeans<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 56<br />
JavaBeans<br />
• Offener Standard, siehe http://www.javasoft.com<br />
• Sprachabhängig: nur Java<br />
open standard, see http://www.javasoft.com<br />
• Unabhängig von Verteilung (durch RMI)<br />
•<br />
language<br />
Quellcode<br />
dependent:<br />
oder Bytecode<br />
Java only<br />
independent from distribution (by RMI)<br />
components in source or byte code<br />
Java<br />
Bean<br />
Java<br />
Bean<br />
Java<br />
Bean<br />
Bean Container<br />
Event InfoBus, RMI
DotNet<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 57<br />
• Alle Komponenten abgebildet auf Zwischensprache CLR (common<br />
language runtime)<br />
• Kommt dem Bild des Softwarebus am nächsten<br />
• Sprachunabhängig (aber Verweis-Arithmetik verboten)<br />
• Viele Elemente durch ECMA-Norm festgelegt<br />
Aber<br />
◮ auf Verwendung von Windows zugeschnitten<br />
◮ unter Kontrolle von Microsoft<br />
⇒ Weiterentwicklung von den Geschäftsinteressen von Microsoft, nicht<br />
von denen der Kunden, abhängig
Probleme<br />
• Unterschiedliche Basiskommunikation der Systeme,<br />
◮ z.B. können Corba Komponenten nicht direkt COM Komponenten<br />
verwenden<br />
◮ Wrapping mit zusätzlicher Indirektion oder<br />
◮ Invasive Änderung der Komponente nötig (unmöglich bei Binärlösung)<br />
• K<strong>eine</strong> formale Definition von Protokollen<br />
◮ Komponenten mit gleichen Schnittstellen i.a. nicht wiederverwendbar<br />
◮ Lösung Standardisierung:<br />
Schnittstellenidentifikation ist eindeutig (COM)<br />
Reflektion<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 58
I.1.5 Programmfamilien und Produktlinien<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 59<br />
We consider a set of programs to constitute a family whenever it is<br />
worthwhile to study programs from the set by first studying the common<br />
properties of the set and then determining the special properties of the<br />
individual family members. (Parnas, 1976)<br />
A software product line is a set of software-intensive systems sharing a<br />
common, managed set of features that satisfy the specific needs of a<br />
particular market segment or mission and that are developed from a common<br />
set of core assets in a prescribed way (Clements, 2002)
Produktlinien <strong>als</strong> Beispiel erfolgreicher Wiederverwendung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 60<br />
Produktlinien:<br />
• Fest definierte Anwendungsdomäne<br />
⇒ ermöglicht umfassende Domänenanalyse:<br />
◮ Merkm<strong>als</strong>analyse liefert Gemeinsamkeiten und Variabilitäten der<br />
Mitglieder der Produktlinie.<br />
⇒ ◮ Menge geeigneter Komponenten<br />
◮ Generische Architektur: Beschreibung der Zusammensetzung aller<br />
Mitglieder der Produktlinie durch Variabilitäten,<br />
d. h. Menge der Komponenten, die ein konkretes Mitglied bilden,<br />
wird nach fest vorgegebenem Verfahren anhand konkreter Werte<br />
gebildet.<br />
Eine Architektur gibt <strong>als</strong>o die Menge der Komponenten und deren<br />
Zusammensetzung zu <strong>eine</strong>m konkreten System an.<br />
⇒ Vermeidung von Paßfehlern<br />
• Erfordert präzise Planung, um Variabilitäten zu erfassen.<br />
• Erfordert Konfiguration, um Variabilitäten passend zu belegen.
Produktfamilien<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 61<br />
Quelle: Lars Geyer, Universität Kaiserslautern
Der Entwicklungsprozeß<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 62<br />
Quelle: Lars Geyer, Universität Kaiserslautern
Prozeßschritte<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 63<br />
Quelle: Lars Geyer, Universität Kaiserslautern
Konstruktion <strong>eine</strong>s Mitglieds <strong>eine</strong>r Produktlinie<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 64<br />
Quelle: Lars Geyer, Universität Kaiserslautern
Merkm<strong>als</strong>diagramm mit Korrelation<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 65<br />
Quelle: Lars Geyer, Universität Kaiserslautern
Einschränkungen<br />
• Funktioniert nicht oder nur teilweise mit COTS:<br />
◮ COTS passen i. a. nicht in generische Architektur, weil COTS nicht aus<br />
der Domänenanalyse hervorgehen. (vgl. Architekturinkompatibilität)<br />
• Merkmale beschreiben hauptsächlich funktionales Verhalten<br />
⇒ Interaktionsverhalten ist schlecht oder überhaupt nicht durch Merkmale<br />
faßbar und damit nicht konfigurierbar<br />
⇒ Architektur sollte konfigurierbar sein<br />
• Evolution bzgl. neuer Anforderungen ist sehr aufwendig:<br />
◮ Anpassung der Produktlinienarchitektur statt einzelner Produkte<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 66
Konsequenzen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 67<br />
• Wiederverwendung funktioniert im Falle von Produktlinien<br />
• Die Einschränkung bzgl. COTS ist praktisch irrelevant,<br />
denn nach (Lampson, 2003) funktionieren COTS ohnehin nicht<br />
(vgl. Beginn der Vorlesung).<br />
• Interaktionsanpassungen erfordern Architekturevolution:<br />
Änderung der Interaktion zwischen Komponenten bedeutet im allgem<strong>eine</strong>n<br />
<strong>eine</strong> Änderung der Zusammensetzung des Systems oder beeinflußt diese.<br />
⇒ Änderung von Interaktionsbeziehung impliziert Änderung der<br />
Architektur.<br />
• Neue Anforderungen erfordern komplette Überarbeitung der Produktlinie
Architektur<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 68<br />
Bewerkstelligung von Interaktionsanpassungen:<br />
• Man muß Abstraktionen finden für:<br />
◮ Schnittstellenkonsistenz<br />
◮ Protokollkonsistenz<br />
◮ Architekturkompatibilität<br />
• Die gesuchte Abstraktion heißt ein Konnektor (Garlan et al, 1993): Ein<br />
Konnektor kapselt die Interaktion zwischen Komponenten.
Architektur: Probleme<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 69<br />
Problem: Explizite Konnektoren zur Laufzeit<br />
verringern meist die Systemleistung.<br />
Lösung: Eliminiere explizite Konnektoren, wenn möglich.<br />
Beispiel: Interaktion zwischen Symbolentschlüsseler und Zerteiler in <strong>eine</strong>m<br />
Übersetzer.<br />
Ausgangssituation: Symbolentschlüßler produziert Symbolstrom.<br />
Symbolstrom ist <strong>eine</strong> Datenstruktur, auf die der Zerteiler zugreift.<br />
Der Symbolstrom ist damit ein expliziter Konnektor.<br />
Konnektorelimination: Zerteiler ruft direkt den Symbolentschlüßler auf,<br />
um sich jeweils das nächste Symbol liefern zu lassen. Die Daten werden<br />
somit nach Bedarf des Zerteilers vom Symbolentschlüßler erzeugt.
Architekturevolution<br />
• Architekturevolution =<br />
◮ Austausch von Konnektoren<br />
◮ Erweiterung um neue Konnektoren und Komponenten<br />
• Aber: Komponenten müssen zum Architekturstil passen<br />
⇒ Bei COTS invasive Anpassung an vorherrschenden Architekturstil<br />
notwendig.<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 70
Software-Evolution<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 71<br />
Beliebige unvorhergesehene Änderung <strong>eine</strong>r Anforderung<br />
⇒ Beliebige invasive Änderung muß möglich sein.<br />
⇒ Im allgem<strong>eine</strong>n k<strong>eine</strong> Vorkehrung möglich.<br />
Lösungsansätze im nächsten Abschnitt.
I.1.6 Akademische Konzepte<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 72<br />
• Architektursysteme<br />
• Aspektorientiertes Programmieren<br />
• Metaprogrammieren und invasive Programmadaptation <strong>als</strong> Technik zur<br />
Komposition<br />
• ‘‘Akademisch’’: Noch nicht großflächig und systematisch von der Industrie<br />
eingesetzt
Architektursysteme<br />
• Z.B. Unicon, Darwin<br />
• Basiskommunikation:<br />
◮ Prozeduraufrufe an Tore (communication ports)<br />
◮ Art der Kommunikation ist transparent<br />
• Schnittstellen:<br />
◮ Tore, an denen Konnektoren angreifen<br />
◮ Expliziter Gebrauch von Konnektoren bei jeder Kommunikation<br />
(in objektorientierten Systemen wird Kommunikation gemeinsam durch<br />
Vererbung verändert)<br />
◮ Schnittstellen bleiben zur Laufzeit erhalten<br />
• Interne Adaption: durch Vererbung<br />
• Externe Adaption: Klebe- oder Umwickelcode durch Konnektoren<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 73
Architektursysteme<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 74<br />
Tor<br />
Tor<br />
Komponente<br />
Komponente<br />
Tor<br />
Tor<br />
Kon−<br />
nek−<br />
tor<br />
Kon−<br />
nek−<br />
tor<br />
Kon−<br />
nek−<br />
tor<br />
Tor<br />
Tor<br />
Komponente<br />
Tor<br />
Komponente<br />
Tor<br />
Tor<br />
Tor<br />
Konnektoren trennen die Kommunikation von den Komponenten
Probleme<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 75<br />
• K<strong>eine</strong> Standardisierung<br />
• Künstliche Unterscheidung von Konnektoren und Komponenten<br />
• K<strong>eine</strong> Wiederverwendung von Konnektoren<br />
• Schnittstellen von Komponenten und Konnektoren im laufenden Code
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 76<br />
Aspekttrennung & Komposition<br />
paration of Aspects &<br />
mposition<br />
walls<br />
electric<br />
water<br />
gas<br />
separate the<br />
designs for<br />
different Trenne aspects, die Pläne für verschiedene<br />
Aspekte weave them und webe sie zu <strong>eine</strong>m System<br />
together zusammen to obtain<br />
one system<br />
exchange Austausch and development der Aspekte of aspects unabhängig voneinander<br />
(mostly) independent from each other<br />
Gerhard <strong>Goos</strong>, Software from Components, Overview 49
Aspekt-orientiertes Programmieren (AOP)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 77<br />
• Aspekt (aspect, concern): logisch abgrenzbare Teilaufgabe, die in der<br />
Lösung mit anderen Aspekten verzahnt werden muß (überschneidender<br />
cross-cutting concern)<br />
• Beispiele: anwendungsspezifische Funktionalität (der Kernaspekt),<br />
Kommunikation, Synchronisation, Verteilung, Persistenz<br />
• Spezialfall Architektursystem: die ersten beiden Aspekte<br />
• Grundprinzip: Aspekte bestehen aus (mehreren) Programmfragmenten.<br />
Diese werden durch <strong>eine</strong>n Weber zusammengewoben (ereignisgesteuert,<br />
. . . , oder statisch)<br />
• Transparenz durch getrennte Beschreibung der Aspekte<br />
• Basiskommunikation: ein Aspekt<br />
• Generierung: Weben aus Aspektspezifikationen<br />
• Schnittstellen: Webepunkte (Haken), an denen verwoben wird<br />
• Adaption:<br />
◮ interne Adaption: Einfügen oder Austausch von Aspekten<br />
◮ externe Adaption: Weben von Klebecode um Komponenten
Dynamisches und statisches Weben<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 78<br />
Aspekte<br />
Aspekt<br />
1<br />
Ereignis<br />
dynamisches statisches<br />
Weben<br />
Webe−<br />
Punkt<br />
Aspekt<br />
1<br />
1<br />
2<br />
Aspekt<br />
2<br />
Ereignis<br />
gefüllt<br />
von<br />
Aspekt<br />
2<br />
1<br />
2<br />
Weber
Aspekte <strong>eine</strong>s Programms (Algorithmus und Animation)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 79<br />
/** The black code is the algorithmic aspect */<br />
import java.io.*;<br />
public class Hanoi {<br />
public Hanoi() {<br />
// ...<br />
}<br />
protected void<br />
compute(int n, String s, String t, String h) {<br />
if(n > 1){<br />
compute( n - 1, s, h, t );<br />
}<br />
}<br />
transfer(s,t);<br />
if(n > 1){<br />
compute( n - 1, h, t, s );<br />
}<br />
/** The black code is the algorithmic aspect */<br />
/* The red code is the animation aspect. */<br />
import java.io.*;<br />
public class Hanoi extends java.util.Observable<br />
implements java.util.Observer {<br />
public Hanoi() {<br />
addObserver( new PrintObserver() );<br />
}<br />
protected void<br />
compute(int n, String s, String t, String h) {<br />
if(n > 1){<br />
compute( n - 1, s, h, t );<br />
}<br />
transfer(s,t);<br />
setChanged();<br />
notifyObservers( new displayPack( s, t ) );<br />
if(n > 1){<br />
compute( n - 1, h, t, s );<br />
}<br />
}
Aspekte <strong>als</strong> Sichten<br />
Aspects as Views<br />
aspect 1 aspect 2 aspect 3<br />
instantiation<br />
=<br />
weaving<br />
abstraction<br />
=<br />
aspect<br />
system<br />
Gerhard <strong>Goos</strong>, Software from Components, Overview 53<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 80
Probleme<br />
• Orthogonale Aspekte<br />
◮ K<strong>eine</strong> Interaktionen zwischen den Aspekten<br />
◮ Weben einfach<br />
• Nicht-orthogonale Aspekte (überschneidende, crosscutting Aspekte)<br />
◮ Z.B. Funktionalität und Synchronisation, Funktionalität und<br />
Verteilung, Protokolle und Synchronisation usw.<br />
◮ Getrennte Spezifikation unmöglich<br />
◮ Weben unklar<br />
• Aspekt <strong>als</strong> Sicht<br />
◮ Abstraktion von Systemeigenschaften<br />
◮ Umkehrungsfunktion nicht immer<br />
Eindeutig<br />
Widerspruchsfrei mit anderen Aspekten<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 81
Merkmalanalyse<br />
• Arten der Variation<br />
◮ Innerhalb <strong>eine</strong>s Systems zur Laufzeit<br />
◮ Zwischen einzelnen Läufen <strong>eine</strong>s Systems<br />
◮ Zwischen Mitgliedern der Systemfamilie<br />
• Merkmalanalyse (Feature Analysis) modelliert Systemfamilien<br />
◮ Identifiziere Variationspunkte<br />
◮ Zähle Alternativen auf<br />
◮ Bilde Hierarchien (momentan starr)<br />
• Darstellung <strong>als</strong> Merkmaldiagramme (Feature Diagrams)<br />
◮ Untermenge regulärer Ausdrücke (kein Kleene’scher Stern)<br />
◮ Graphische Darstellung <strong>als</strong> Baum<br />
◮ Redundante Repräsentation → Normalformen<br />
• Abbildung auf Sprachmechanismen<br />
• Abgrenzung zu Aspekten?<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 82
Invasive Komposition<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 83<br />
• Webepunkte: statisch eindeutig berechenbare Programmstellen<br />
• Komponenten kapseln Entwurfsentscheidungen hinter<br />
Kompositionsschnittstellen mit wohldefinierten Webepunkten<br />
• Programmtransformatoren (auch Kompositionsoperatoren) erkennen und<br />
transformieren Webepunkte <strong>eine</strong>r Kompositionsschnittstelle.<br />
• Klassifikation:<br />
◮ Kein Komponentensystem!<br />
◮ Technik zur Komposition beliebiger Systeme
Invasive Komposition<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 84<br />
Invasive Composition<br />
standard weaving points, e.g. for wrapping: method.begin<br />
and method.end<br />
method.begi<br />
n<br />
method m<br />
(){<br />
• Standard-Webepunkte, z.B. für<br />
wrapping: method.begin abc.. und<br />
method.end cde..<br />
method m<br />
method.begin<br />
method.end<br />
}<br />
return;<br />
Gerhard <strong>Goos</strong>, Software from Components, Overview 56
Transformation <strong>eine</strong>s Webepunktes<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 85<br />
• Einfügen <strong>eine</strong>s Test-Aspekts<br />
method m (){<br />
}<br />
abc..<br />
cde..<br />
return;<br />
method m (){<br />
print("enter m")<br />
abc..<br />
cde..<br />
print("exit m")<br />
return;<br />
}
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 86<br />
Mehrfache Bindung <strong>eine</strong>s Webepunktes<br />
Binding a weaving point<br />
repeatedly<br />
method.begin<br />
method m<br />
method.end<br />
print aspect<br />
transaction<br />
aspect<br />
Gerhard <strong>Goos</strong>, Software from Components, Overview 58
Deklarierte Webepunkte<br />
Declared Weaving Points<br />
• Z.B. Kommunikationstore:<br />
use of port objects<br />
Ansprache von Torobjekten (port objects)<br />
method m (){<br />
e.g. communication ports:<br />
method m (){<br />
portOut.out<br />
}<br />
OUT port<br />
portOut.out(d);<br />
portIn.in(e);<br />
IN }<br />
portOut.out(d);<br />
portIn.in(e);<br />
method m<br />
portIn.in<br />
Prof. Dr. G. <strong>Goos</strong> Gerhard <strong>Goos</strong>, Software from ausComponents, Komponenten Overview 59 87
Transformationen für Tore<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 88<br />
m (){<br />
m (){<br />
...<br />
portOut.out(d);<br />
portIn.in(e);<br />
...<br />
}<br />
}<br />
/** ports */<br />
e = x(d);<br />
m (){<br />
/** ports */<br />
setChanged(d);<br />
notifyObservers(d);<br />
listen_to(e);<br />
}
Einfache Bindung von Toren<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 89<br />
Simple Binding of Ports<br />
portOut.out<br />
call<br />
method m<br />
portIn.in<br />
call<br />
method x<br />
Gerhard <strong>Goos</strong>, Software from Components, Overview 61
Transformation mit Kompositoren<br />
• Ein Kompositor ist ein Metaprogramm:<br />
◮ Programmtransformator<br />
◮ Bindet ungebundene Webepunkte an Code<br />
• Aufgaben<br />
◮ Erkennen von Webepunkten<br />
◮ Transformation durch Manipulation von Webepunkten<br />
(Binden der Webepunkte, Weben, weaving)<br />
◮ Codegenerierung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 90
Vergleich der Komponentensysteme<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 91<br />
System Kommunik. Schnittstellen Generierung Adaption<br />
Module Aufrufe Prozeduren Je nach Je nach<br />
Sprache Sprache<br />
Frameworks Polymorphe Methoden Generische Vererbung,<br />
Aufrufe Klassen Delegation<br />
CORBA RMI Methoden - Wrapper<br />
& Co.<br />
(nach IDL)<br />
Architektur- Aufrufe Tore - Konnektoren<br />
systeme an Tore<br />
AOP Aspekt Join points Weben Weben<br />
(beliebig) Webepunkte
Historische Ansätze<br />
• Netscape ONE:<br />
◮ HTML, Java, JavaScript<br />
◮ Internet foundation classes (Java Klassen für Netzwerk)<br />
◮ Internet inter-ORB protocol (IIOP, Konnektoren basierend auf<br />
CORBA)<br />
◮ Transport und applikationsspezifischer Protokolle<br />
• IBM Visual Age und ComponentBroker<br />
◮ Entwicklungsumgebung auf VisualAge-Basis<br />
◮ CBToolkit (Komponenten auf CORBA IDL basierend)<br />
◮ CBConnector (Verknüpfung und Management)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 92
Weitere historische Ansätze<br />
• IBM System Object Model (SOM)<br />
◮ Sprachunabhängiges Binärformat mit Versionen<br />
◮ Binäre Aufwärtskompatibilität (‘‘release order’’, Erhalt alter Offsets in<br />
Komponenten)<br />
◮ Unterstützung von Metadaten (Reflexion, Introspektion, Intercession):<br />
wie in Smalltalk können Klassen über Klassen nachdenken und Code<br />
transformieren<br />
◮ Mehrfachvererbung von Code<br />
• Apple OpenDoc: Aktive strukturierte Dokumente (setzt auf IBM SOM<br />
auf)<br />
◮ ‘‘compound document’’, ‘‘document parts’’<br />
◮ Teile: ‘‘native data’’ / andere Teile<br />
◮ Open Scripting Architecture basierend auf AppleScript<br />
◮ Structured files mit Bento (ähnlich zu Microsofts COM/OLE)<br />
Dokument-Versionen von Dokumentbäumen mit Deltatechnik<br />
Flexibles Speichermodell für Datenströme und Einzeldateien<br />
Annotationen für Modifikationen an <strong>Datei</strong>en<br />
◮ Mittlerweile in Corba integriert<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 93
Probleme der bisherigen Systeme<br />
• Fehlen von Standards für Anwendungsbereiche:<br />
◮ Verbindungsstandards nicht genug<br />
◮ Wie <strong>eine</strong>n Standard erreichen?<br />
Marktmacht Microsoft, Corba Facilities, ...<br />
• Höhere Sicherheitsansprüche an Komponenten<br />
◮ erweiterte Verträge: Protokolle (Corba IIOP),<br />
◮ Spezifikation nicht-funktionaler Eigenschaften<br />
• Dienstvermittlung:<br />
◮ Semantikerkennung unmöglich<br />
◮ Standardisierung, aber Versionen zerstören Konsistenz<br />
• Technische Probleme<br />
◮ Speicherbereinigung (garbage collection)<br />
◮ Problem der fragilen Basisklassen: bei Versionsänderungen<br />
◮ Persistenzprobleme: müssen bereits ausgelieferte Komponenten<br />
nachübersetzt werden<br />
◮ Austauschformate: Standard oder XML Lösungen<br />
◮ Objekt-Mobilität, -Migration:<br />
Senden kl<strong>eine</strong>r Objekte statt Referenzen<br />
• Wasserkopfprobleme (besonders bei Corba deutlich)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 94
Probleme des Systementwurfs<br />
• Produktlinien vs. COTS (vgl. Lampson 2003)<br />
• Alte Entwurfskonzepte nicht auf Komponenten übertragbar<br />
◮ Top-down Entwurf bei vorgegebenen Komponenten?<br />
◮ Verf<strong>eine</strong>rung unvollständig spezifizierter Komponenten<br />
Aspekte fehlen<br />
generische Komponenten<br />
Komponenten vor invasiver Kopplung<br />
◮ unabhängige Erweiterungen, viele Quellen<br />
◮ Globale Lebendigkeit<br />
◮ Anpassungsprobleme<br />
Daten<br />
Schnittstellen<br />
Protokolle<br />
Architektur (Basiskommunikation, etc.)<br />
• Managementprobleme<br />
◮ Qualitätssicherung bei anzupassenden Komponenten<br />
◮ Softwareprozeß<br />
• Rechtliche Probleme<br />
◮ Urheberrecht an Komponenten<br />
◮ Haftung bei Fehlern<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 95
Gliederung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 96<br />
1. Einführung<br />
◮ Motivation<br />
◮ Definition,<br />
◮ Konzepte für Komponenten (klassische, kommerzielle, akademische)<br />
2. Industrielle Komponentensysteme der 1. Generation<br />
1. Ziele und Modell<br />
2. CORBA<br />
3. Enterprise JavaBeans<br />
4. (D)COM, .Net<br />
3. Anpassungsprobleme<br />
◮ Daten und Funktion<br />
◮ Interaktion<br />
Kommunikation<br />
Synchronisation<br />
Protokolle<br />
◮ Lebendigkeit<br />
4. Akademische Ansätze<br />
◮ Architektursysteme<br />
◮ Aspektorientiertes Programmieren<br />
◮ Metaprogrammierung und Invasive Komposition
Komponentenbegriffe<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 97<br />
• Drei Ebenen<br />
1. Eine Komponente ist <strong>eine</strong> Kollektion von Programmfragmenten mit<br />
<strong>eine</strong>m Bauplan, um für <strong>eine</strong> bestimmte Aufgabe <strong>eine</strong> ausführbare<br />
Programmeinheit zu erzeugen.<br />
2. Eine Komponente ist ein Modul. Es gibt jeweils genau <strong>eine</strong> davon.<br />
3. Eine Komponente ist ein großes, in sich abgeschlossenes Teilsystem,<br />
welches <strong>eine</strong> bestimmte Aufgabe erledigt.<br />
• Beobachtung<br />
◮ Ursprüngliche Definition deckt sich mit 1.<br />
◮ 2. und 3. sind technisch äquivalent<br />
◮ Aber: Allein 3. garantiert ökonomische Skalierbarkeit.
Motivation, Vertreter, Probleme<br />
• Pragmatisch motiviert<br />
◮ Wie baue ich große Systeme in <strong>eine</strong>r heterogenen Welt?<br />
• Grad der Umsetzung ist unterschiedlich<br />
◮ Mustergültig: CORBA<br />
◮ Sprachgebunden: JavaBeans, EJB<br />
◮ Plattformgebunden: COM, DCOM, .NET<br />
• Zunächst: Ziele, Ansätze und Umsetzungen im Modell<br />
◮ Sprachtransparenz<br />
◮ Ortstransparenz<br />
◮ Reflektion<br />
◮ Dienste<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 98
Ziele industrieller Systeme<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 99<br />
Aufgaben kommerzieller Systeme<br />
(Corba, (D)COM, EJB)<br />
A vision of software components working smoothly together, without regard<br />
to details Daten- of any component’s und Interface-Beschreibung<br />
location, platform, operating system,<br />
programming language, or network hardware and software.<br />
Referenz- und Wertesemantik<br />
Jon Siegel, Object Management Group (OMG), 1989<br />
Kommunikation (Nachrichten und RMI)<br />
Verteilung, Persistenz, Heterogenität<br />
• Busse garantieren Hardware-Interoperabilität<br />
• Komponentensysteme liefern Äquivalent für Software:<br />
Softwarebus<br />
Dr. Welf Löwe und Markus Noga 2
Motivation, Vertreter, Probleme<br />
• Pragmatisch motiviert<br />
◮ Wie baue ich große Systeme in <strong>eine</strong>r heterogenen Welt?<br />
• Grad der Umsetzung ist unterschiedlich<br />
◮ Mustergültig: CORBA<br />
◮ Sprachgebunden: JavaBeans, EJB<br />
◮ Plattformgebunden: COM, DCOM, .NET<br />
• Zunächst: Ziele, Ansätze und Umsetzungen im Modell<br />
◮ Sprachtransparenz<br />
◮ Ortstransparenz<br />
◮ Reflektion<br />
◮ Dienste<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 100
Sprachtransparenz: Ziel<br />
• Ein Komponentensystem ist sprachtransparent, wenn für die Verwendung<br />
<strong>eine</strong>r Komponente belanglos ist, in welcher Sprache sie implementiert ist.<br />
• Problem: Heterogenität mehrsprachiger Systeme<br />
◮ Aufrufkonzept<br />
Prozedur, Koroutine, Nachrichten<br />
◮ Aufrufrepräsentation<br />
Übergabekonventionen: Register, Stapel, ...<br />
Wer alloziert, wer räumt ab?<br />
◮ Datentypen<br />
Werte, Referenzen<br />
Arrays, Unions, Records<br />
Ko-/kontravariante Vererbung<br />
◮ Datenrepräsentation<br />
Breite und Kodierung primitiver Typen<br />
Layout zusammengesetzter Typen<br />
◮ Laufzeitumgebung<br />
Speicherverwaltung, Lebenszyklus<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 101
Sprachtransparenz: Ansatz<br />
• Allgem<strong>eine</strong> Alternativen:<br />
◮ Direktes Anpassen:<br />
Konvertierung von jeder Sprache in jede andere<br />
⇒ Aufwand O(n 2 ) bei n Sprachen<br />
◮ Anpassen an Austauschformat:<br />
Bei n Sprachen n Abbildungen auf ein Austauschformat<br />
⇒ Aufwand O(n)<br />
◮ Standardisieren: K<strong>eine</strong> Anpassung, aber restriktiv.<br />
Aufwand O(1) für Erstellung des Standards.<br />
• In industrielle Komponentensystemen:<br />
◮ Aufrufkonzept<br />
Standardisiert auf Prozedur (Fernaufruf)<br />
◮ Aufrufrepräsentation<br />
Standardisiert auf C<br />
◮ Datentypen<br />
Anpassung an Austauschformat (IDL)<br />
◮ Datenrepräsentation<br />
Anpassung an Austauschformat (IDL)<br />
◮ Laufzeitumgebung<br />
Standardisiert <strong>als</strong> Dienste<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 102
Sprachtransparenz: Umsetzung<br />
• Interface Definition Language (IDL)<br />
◮ Sprachunabhängiges Typsystem<br />
◮ Obermenge gängiger Sprachen<br />
◮ Beschreibt Daten und Schnittstellen von Komponenten<br />
• Standardisierte Sprachbindungen (language bindings)<br />
◮ Umsetzung von IDL-Konzepten mit Sprachmitteln<br />
◮ Werkzeug: sprachspezifische IDL-Übersetzer<br />
• Vorgehen zum Bau <strong>eine</strong>r Komponente:<br />
◮ Beschreibe Schnittstellen in IDL<br />
◮ Erzeuge Gerüst in gewünschter Sprache mit IDL-Übersetzer<br />
◮ Fülle Gerüst mit Implementierung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 103
Beispiel für Sprachtransparenz: JavaIDL<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 104<br />
IDL Typ<br />
Java Typ<br />
module<br />
package<br />
boolean<br />
boolean<br />
char, wchar<br />
char<br />
octet<br />
byte<br />
string, wstring<br />
java.lang.String<br />
short, unsigned short<br />
short<br />
long, unsigned long<br />
int<br />
long long, unsigned long long<br />
long<br />
float<br />
float<br />
double<br />
double<br />
fixed<br />
java.math.BigDecimal<br />
enum, struct, union<br />
class<br />
sequence, array<br />
array<br />
signature interface and an operations interface,<br />
interface (non-abstract)<br />
helper class, holder class<br />
interface (abstract)<br />
signature interface, helper class, holder class<br />
constant (not within an interface) public interface<br />
fields in the Java signature interface for nonabstract,<br />
or the sole Java interface for abstract<br />
constant (within an interface)<br />
exception<br />
class<br />
Any<br />
org.omg.CORBA.Any<br />
type declarations nested within interfaces “scoped” package<br />
typedef<br />
helper classes<br />
pseudo objects<br />
pseudo interface<br />
readonly attribute<br />
accessor method<br />
readwrite attribute<br />
accessor and modifer methods<br />
operation<br />
method
Ortstransparenz: Ziel<br />
• Ein Komponentensystem ist ortstransparent, wenn für die Verwendung<br />
<strong>eine</strong>r Komponente belanglos ist, wo sie sich befindet.<br />
• Problem: Heterogenität verteilter Systeme<br />
◮ Werte weitgehend unproblematisch<br />
◮ Gültigkeitsbereiche von Referenzen<br />
Thread / Prozeß,<br />
Rechner<br />
Kommunikationspartner<br />
Netz<br />
Zeitschranken (Speicherbereinigung, garbage collection)<br />
◮ Zugriffsarten auf Referenzen<br />
Speicherzugriff auf Felder<br />
Lokale Aufrufe<br />
Fernaufrufe<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 105
Ortstransparenz: Ansatz<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 106<br />
• Weltweit eindeutige Referenzen (GUUID, URI, etc.)<br />
◮ Z.B. Rechneradresse + lokale Referenz<br />
◮ Umsetzungstabelle für lokale Referenzen<br />
K<strong>eine</strong> lokale Freigabe extern bekannter Komponenten<br />
Konsistente Änderung lokaler Adressen extern unsichtbar<br />
• Fernzugriff über transparente Stellvertreter (Proxies)<br />
◮ Implementiert alle Schnittstellen der Komponente<br />
◮ Aufrufe an Stellvertreter stets lokal<br />
◮ Weitergeleitet an Komponente durch Fernaufrufe<br />
Daher: Feldzugriffe nur über Zugriffsfunktionen<br />
Rechner 1 Rechner 2<br />
Komponente<br />
Objekt<br />
?<br />
Komponente<br />
Skelett<br />
RPC<br />
Stell−<br />
vertreter<br />
Konnektor
Ortstransparenz: Umsetzung I<br />
• Erzeuge Stellvertreter aus IDL<br />
◮ stub: eigentlicher Stellvertreter<br />
Leitet lokale Aufrufe <strong>als</strong> Byteströme über das Netz<br />
◮ skeleton: macht Komponente für Fernaufrufe zugänglich<br />
Dekodiert Byteströme und setzt sie in lokale Aufrufe um<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 107
Ortstransparenz: Umsetzung II<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 108<br />
• Komponentenbehälter: Zentraler Eintrittspunkt (pro Rechner)<br />
◮ Allgem<strong>eine</strong> Infrastruktur für Fernaufrufe<br />
Kommunikationsprotokoll<br />
Authentifizierung (wer ist X?)<br />
Autorisierung (was darf X?)<br />
Lebenszyklus von Komponenten<br />
Elementare Dienste<br />
• Weiterleitung von Aufrufen:<br />
Local<br />
Remote<br />
Client XStub<br />
Container Container<br />
XSkeleton<br />
X
Reflektion: Probleme, Ansatz, Umsetzung<br />
• Mit Reflektion können die Schnittstellen <strong>eine</strong>r (unbekannten) Komponente<br />
zur Laufzeit ermittelt und verwendet werden.<br />
• Motivation<br />
◮ Automatische Konfiguration<br />
◮ Einsatz in Entwicklungsumgebungen<br />
• Probleme<br />
◮ Inkompatibilitäten: bereits duch Sprachtransparenz ausgeräumt<br />
◮ Noch offen: Standardisierter Zugriff auf Schnittstellen<br />
• Ansatz<br />
◮ IDL ist bereits standardisiert<br />
◮ Standardisiere Laufzeitrepräsentation<br />
◮ Standardisiere Zugriff darauf<br />
• Umsetzung<br />
◮ Beschreibe abstrakten Syntaxbaum für IDL in IDL<br />
◮ Mache Definitionstabelle im Behälter zugänglich<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 109
Dienste<br />
• Dienste sind die Grundfunktionalität des Laufzeitsystems. Sie stellen die<br />
von Komponenten allgemein benötigte Funktionalität bereit und sind<br />
selbst Komponenten.<br />
• Motivation<br />
◮ Standardisierung<br />
◮ Wiederverwendung<br />
• Beispiele<br />
◮ Namensauflösung<br />
◮ Vermittler (Makler, Trader )<br />
◮ Synchronisation und Transaktionsschutz<br />
◮ Drucker, EMail, ...<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 110
Beispiel: Namensdienst<br />
• Henne-Ei-Problem:<br />
◮ Woher kennt <strong>eine</strong> Komponente andere Komponenten?<br />
◮ Durch vom Aufrufer übergebene Referenzen.<br />
◮ Woher kennt der Aufrufer die Komponente?<br />
• Lösung<br />
◮ Führe (menschenlesbare) Namen für Komponenten ein<br />
◮ Stelle Dienst zur Namensauflösung bereit<br />
Auffinden des Namensdienstes ist Behälterfunktion<br />
Komponenten registrieren sich mit Name und Referenz<br />
Auffinden weiterer Komponenten über Namen<br />
Component<br />
NameService<br />
+resolve(in name : string(idl)) : Component<br />
+register(in comp : Component, in name : string(idl))<br />
X<br />
Container<br />
+getNameService() : Component<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 111
Beispiel: Vermittler<br />
• Erweitere das Auffindungsproblem:<br />
◮ Name unbekannt<br />
◮ Eigenschaften bekannt<br />
• Lösung<br />
◮ Stelle Dienst zur Vermittlung bereit<br />
Auffinden des Vermittlers über Namensdienst<br />
Komponenten registrieren sich mit Eigenschaften und Referenz<br />
Auffinden weiterer Komponenten über Vermittler<br />
◮ Standardisiere Eigenschaften (Terminologie, Ontologie)<br />
Funktionale Eigenschaften: Domänenmodell<br />
Nichtfunktionale Eigenschaften: Dienstgüte, ...<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 112
Beispiel: Persistenz<br />
• Verändere das Auffindungsproblem:<br />
◮ Eigenschaften bekannt<br />
◮ Instanz möglicherweise passiviert (Datenbank)<br />
• Lösung<br />
◮ Stelle Dienst zur Vermittlung bereit<br />
Auffinden der Instanz über Schlüssel<br />
Bei Bedarf aktivieren (Objekt erzeugen)<br />
Bei Nutzungsende erneut passivieren<br />
◮ Nutzen<br />
Alle Objekte ersch<strong>eine</strong>n permanent lebendig<br />
Handhabung des Objektlebenszyklus vereinfacht<br />
• Alternative<br />
◮ Auch denkbar: verallgem<strong>eine</strong>rte Referenzen<br />
◮ Aber: erfordert Änderungen der Basisplattform<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 113
Zusammenfassung der Aufgaben<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 114<br />
Gesamtaufgabe: Zusammenspiel von Komponenten in <strong>eine</strong>r heterogenen Welt<br />
organisieren, den ”<br />
Softwarebus“ realisieren<br />
• Sprachtransparenz<br />
• Ortstransparenz<br />
• Dienste: Namensdienste, Makler, Persistenz, Behälterdienste, DB-Zugriff,<br />
Drucken, . . .<br />
• Reflektion beim dynamischen Zusammenbinden von Komponenten
Konkrete industrielle Systeme<br />
• Modell<br />
◮ Mechanismen zur Transparenz von<br />
Sprachen (IDL),<br />
Plattformen,<br />
Betriebssystemen,<br />
Ausführungsort (Eindeutige Referenz, stub/skeleton).<br />
◮ Wiederverwendbare Dienste, u.a.<br />
Namen<br />
Makler<br />
Persistenz<br />
• Jetzt: Ausprägung in<br />
◮ Corba<br />
◮ COM/DCOM/.NET<br />
◮ JavaBeans / Enterprise JavaBeans<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 115
Corba<br />
• Common Object Request Broker Architecture<br />
• Gründung der OMG (object management group) 1989.<br />
• Ziele:<br />
◮ Plug-and-play components everywhere (siehe Zitat im Modell)<br />
◮ Unterstützung für domänenspezifische Entwicklung<br />
Für Medizin, Finanzwirtschaft, Maschinenbau, etc.<br />
Geschichtete Dienste (layered services)<br />
• Entwicklung<br />
◮ Corba 1.1 1991 (IDL, ORB, BOA)<br />
◮ ODMG-93 (Standard für oo-Datenbanken)<br />
◮ Corba 2.0 1995<br />
◮ Corba 3.0 1999 (Java/EJB, Scripting, QoS)<br />
Aktuell: Version 3.0.2 aus 12/2002<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 116
Corba: Literatur<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 117<br />
• R. Orfali, D. Harkey: Client/Server Programming with Java and Corba.<br />
Wiley&Sons. Leicht zu lesen.<br />
• R. Orfali, D. Harkey, J. Edwards: Instant Corba. Addison-Wesley.<br />
Deutsch. Leicht zu lesen, aber einige konzeptionelle Übersetzungsfehler<br />
• CORBA. Communications of the ACM, Oct. 1998. Neueste<br />
Corba-Entwicklungen.<br />
• Jens-Peter Redlich, CORBA 2.0 / Praktische Einführung für C++ und<br />
Java. Verlag: Addison-Wesley, 1996. ISBN: 3-8273-1060-1, 59.90DM<br />
• Corba 3 Specification. OMG. http://www.omg.org, speziell<br />
http://www.omg.org/technology/documents/corba_spec_catalog.htm<br />
• Jon Siegel, CORBA 3 Fundament<strong>als</strong> and Programming, Wiley & Sons.<br />
• Vorträge aus dem Web (OMG):<br />
◮ Java Portability and CORBA Integration, Dr. Richard Soley, CEO,<br />
OMG, April, 1999<br />
◮ Application Server Market Summary. Paul Harmon, Editor, Component<br />
Development Strategies Newsletter
Corba-Jargon für Einsteiger: OMA<br />
• Object Management Architecture<br />
◮ Objekt-Anfrage-Vermittler, Object Request Broker (ORB)<br />
Management für verteilte Objekte<br />
Kommunikation zwischen Objekten<br />
◮ General Service Interfaces (Object Services)<br />
Objekterzeugung, -zugriff, -verschiebung (relocation)<br />
Generische Laufzeitumgebung für Objekte<br />
◮ Common Facilities<br />
Standarddienste: Druckdienste, Datenbankzugriff, e-mail etc.<br />
◮ Non-Standard Application Specific Interfaces<br />
Anbieterspezifische Dienste<br />
Nicht standardisiert durch die OMG<br />
◮ Vertical Domain Specific Interface<br />
Kombinieren Object Services und Common Facilities<br />
Markt- oder industriespezifische Dienste<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 118
Corba-Jargon für Einsteiger: Modell (1)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 119<br />
• Ein Objekt ist <strong>eine</strong> identifizierbare, gekapselte Entität, die <strong>eine</strong>n oder<br />
mehrere Dienste anbietet, die von Klienten angefragt weren können.<br />
CORBA-Objekte sind <strong>als</strong>o Komponenten.<br />
• Ein Klient stellt Anfragen.<br />
• Damit ein Klient <strong>eine</strong>n Dienst <strong>eine</strong>s Dienstgebers anfragen kann, muß er<br />
die entsprechende Schnittstelle kennen.<br />
Eine Schnittstelle deklariert <strong>eine</strong> Menge von Operationen, Ausnahmen und<br />
Attributen.<br />
Jede Operation hat <strong>eine</strong> Signatur, die ihren Namen, ihre Parameter, ihr<br />
Ergebnis und ihre Ausnahmen definiert.<br />
Die Schnittstelle wird mit der Schnittstellenbeschreibungssprache<br />
CORBA-IDL beschrieben.<br />
• Eine Ausnahme (engl. exception) ist ein IDL-Konstrukt, das <strong>eine</strong><br />
Ausnahmesituation repräsentiert, die <strong>als</strong> Antwort <strong>eine</strong>s Aufrufs<br />
zurückgeliefert werden kann. Die Ausnahmebehandlung selbst ist nicht in<br />
CORBA spezifiziert, sondern Angelegenheit der jeweiligen<br />
Programmiersprache.
Corba-Jargon für Einsteiger: Modell (2)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 120<br />
• Eine Objektreferenz ist ein Konstrukt, das die Informationen enthält, die<br />
man benötigt, um ein Objekt über den ORB zu identifizieren. Eine<br />
undurchsichtige (engl. opaque) Objektreferenz identifziert immer dasselbe<br />
CORBA-Objekt.<br />
• Ein Pseudoobjekt ist wie ein gewöhnliches CORBA-Objekt in IDL<br />
spezifiziert, aber kann nicht durch <strong>eine</strong> Objektreferenz herumgeschickt<br />
werden. Man kann es auch nicht auf <strong>eine</strong>n bestimmten Typ anpassen oder<br />
<strong>eine</strong> Zeichenkettendarstellung von ihm erhalten. Pseudoobjekte sind <strong>als</strong>o<br />
Objekte im lokalen Namensraum. Beispiele von Pseudoobjekten sind die<br />
Schnittstellenablage und die dynamische Aufrufschnittstelle.<br />
• Eine Objektimplementierung ist <strong>eine</strong> konkrete Klasse, die das Verhalten<br />
aller Operationen und Attribute der IDL-Schnittstelle, die sie unterstützt,<br />
definiert <strong>als</strong>o implementiert. Zu <strong>eine</strong>r Schnittstelle kann es mehrere<br />
Objektimplementierungen geben.<br />
• Ein ”<br />
Servantobjekt“ ist <strong>eine</strong> Instanz <strong>eine</strong>r Objektimplementierung <strong>eine</strong>r<br />
IDL-Schnittstelle. Das Servantobjekt ist beim ORB registriert, damit der<br />
ORB Aufrufe an es weiterleiten kann. Das Servantobjekt führt letztlich die<br />
Operationen aus, die ein Klient bei <strong>eine</strong>m CORBA-Objekt anfragt.<br />
• Ein Server ist ein Programm, das die Implementierungsobjekte von<br />
IDL-Schnittstellen enthält und diese beim ORB registriert.
Kernproblem: Wasserkopf<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 121<br />
• Wasserkopf technisch und sprachlich aufgeblasener Probleme, der<br />
eigentlich nötig ist:<br />
◮ Corba bietet saubere Detaillösungen<br />
• Wasserkopf eher soziologisch bedingt:<br />
◮ Die OMG ist extrem heterogen<br />
◮ Standard deckt sehr breites Spektrum ab<br />
◮ Teilweise Folgen mangelnder Einigkeit sichtbar<br />
• Wasserkopf eher linguistisch und didaktisch bedingt:<br />
◮ Die Corba-Community spricht ihre eigene Sprache<br />
◮ Ballung von Akronymen oft unverständlich<br />
◮ Erweckt Eindruck höherer Komplexität<br />
• Hier: Vereinfachung durch Rückführung auf Modell
Sprachtransparenz in Corba<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 122<br />
Interface Definition Language<br />
Typen<br />
Typen<br />
• Im Modell: IDL<br />
• In Corba: Corba IDL<br />
◮ Standard: ISO 14750<br />
◮ Viele standardisierte<br />
Sprachanbindungen<br />
(C/C++, COBOL,<br />
Java, . . . )<br />
• Reichhaltiges Typsystem<br />
Referenz-<br />
Referenz-<br />
Objekte<br />
Objekte<br />
Any<br />
Any<br />
Objekte<br />
Objekte<br />
Wertobjekte<br />
Wertobjekte<br />
Basistypen<br />
Basistypen<br />
Ints (short,..)<br />
Ints (short,..)<br />
Re<strong>als</strong> Typen (float..)<br />
Re<strong>als</strong> Typen (float..)<br />
Nicht-Objekte<br />
Nicht-Objekte<br />
Konstruktoren<br />
Konstruktoren<br />
Struct<br />
Struct<br />
Sequence<br />
Sequence<br />
Bool<br />
Bool<br />
Char, string,<br />
Char, string,<br />
Union<br />
Union<br />
Enum<br />
Enum<br />
octet<br />
octet<br />
Array<br />
Array<br />
Dr. Welf Löwe und Markus Noga 14
Beispiel für <strong>eine</strong>n Typ: Das Corba-Objekt<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 123<br />
Das Corba-Objekt<br />
CORBA::Object<br />
- get_implementation<br />
- get_interface<br />
- is_nil<br />
- create_request<br />
- is_a<br />
- duplicate<br />
- release<br />
- ....<br />
Das Corba Objekt vererbt sich <strong>als</strong><br />
Klasse auf • CORBA::Objekt alle Corba-Objekte istund<br />
Komponente in<br />
Programmelemente. unserem Sinne<br />
get_interface • Vererbt liefert <strong>eine</strong> sichReferenz<br />
auf alle Corba-Objekte<br />
auf den Eintrag und im Programmelemente<br />
interface<br />
repository. • get_interface liefert <strong>eine</strong> Referenz<br />
get_implementation auf die <strong>eine</strong> Schnittstellenbeschreibung<br />
Referenz<br />
auf die Implementierung<br />
im interface repository<br />
• get_implementation liefert <strong>eine</strong> Referenz<br />
auf die Implementierung<br />
Dr. Welf Löwe und Markus Noga 22
Ortstransparenz in Corba<br />
• Im Modell:<br />
◮ Stellvertreter aus IDL erzeugen (stub/skeleton)<br />
◮ Behälter (Zugriff, Verbindungen, Sicherheit)<br />
◮ Eindeutige Referenzen<br />
• In Corba:<br />
◮ Stellvertreter aus Corba IDL erzeugen (stub/skeleton)<br />
◮ Object Request Broker (ORB)<br />
Grundlegender Zugriff über Basic Object Adapter (BOA)<br />
Dynamische Aufrufe über Dynamic Invocation Interface (DII)<br />
Nicht die r<strong>eine</strong> Lehre: ORB hat auch Dienstcharakter<br />
◮ Interoperable Object Reference (IOR)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 124
IDL-Codegenerierung: Ablauf<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 125<br />
Ablauf IDL-Codegenerierung<br />
IDL<br />
IDL<br />
Interface<br />
Interface<br />
IDL-<br />
IDL-<br />
Compiler<br />
Compiler<br />
Server<br />
Server<br />
Implementation<br />
Implementation<br />
Server<br />
Server<br />
Skeleton<br />
Skeleton<br />
Client<br />
Client<br />
Stub<br />
Stub<br />
Client<br />
Client<br />
Implementation<br />
Implementation<br />
Implementation<br />
Repository<br />
Compiler<br />
Compiler<br />
Objektadapter/<br />
Objektadapter/<br />
BOA<br />
BOA<br />
Server<br />
Server<br />
Client<br />
Client<br />
Dr. Welf Löwe und Markus Noga 15
Der (Basis-)Objektadapter BOA<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 126<br />
Der (Basis-)Objektadapter BOA<br />
CORBA::BOA<br />
- Create<br />
- change_implementation<br />
- get_id<br />
- dispose<br />
- set_exception<br />
- impl_is_ready<br />
- obj_is_ready<br />
- deactivate_impl<br />
- deactivate_obj<br />
• Kapselt<br />
Gaukelt dem Klienten ein ständig<br />
◮ Aktivierung (Start, Stop, Dispose),<br />
lebendes Objekt vor.<br />
◮<br />
Kapselt<br />
Persistenzaspekte<br />
– Aktivierung • Muß in(Start, jedem Stop), ORB vorhanden sein,<br />
– Persistenzaspekte<br />
um <strong>eine</strong>n minimalen Service zu<br />
Muss in gewährleisten<br />
jedem ORB vorhanden<br />
sein, • um Verwaltet <strong>eine</strong>n minimalen das Implementation Service Repository<br />
(Registry ).<br />
zu gewährleisten<br />
Verwaltet das Implementation<br />
Repository • Unterstützt (Registry). auch nicht-oo Code<br />
Unterstützt • Aufgerufen auch nicht-oo von Client Code (über ORB Kern)<br />
Aufgerufen und von Server Client (direkt) (über ORB<br />
Kern) und Server (direkt)<br />
Dr. Welf Löwe und Markus Noga 16
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 127<br />
BOA: Serverseite<br />
Serverseite<br />
Server / Object Implementation<br />
impl_is_<br />
ready<br />
object_is_<br />
ready<br />
deactivate_<br />
obj<br />
deactivate_<br />
impl<br />
BOA<br />
IDL<br />
Skeleton<br />
ORB Kern<br />
Dr. Welf Löwe und Markus Noga 17
ORB<br />
ORB<br />
• Object request broker (entspricht Behälter im Modell)<br />
Client<br />
Server/Object Implementation<br />
Dynamic<br />
Invocation<br />
IDL<br />
Stub<br />
ORB<br />
Interface<br />
IDL<br />
Skeleton<br />
Dynamic<br />
Skeleton<br />
Object<br />
Adapter<br />
ORB-abhängig<br />
Standardisiert<br />
Objekttyp-abhängig<br />
ORB Kern<br />
Dr. Welf Löwe und Markus Noga 11<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 128
ORB: Verf<strong>eine</strong>rte Sicht<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 129<br />
ORB Verf<strong>eine</strong>rte Sicht<br />
Dr. Welf Löwe und Markus Noga 12
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 130<br />
Der Objektanfrage-Vermittler ORB<br />
Der Objektanfragen-Vermittler ORB<br />
CORBA::ORB<br />
- object_to_string<br />
- string_to_object<br />
- create_list<br />
- create_operation_list<br />
- get_default_context<br />
- create_environment<br />
- BOA_init<br />
- list_initial_services<br />
- resolve_initial_references<br />
- ....<br />
Der ORB ist ein Vermittler<br />
(Entwurfsmuster) • Der ORB zwischen ist Client ein Vermittler (Entwurfsmuster)<br />
zwischen Client und<br />
und Server.<br />
Er verbirgt die<br />
Server.<br />
Umgebung vor dem<br />
Klienten.<br />
• Er verbirgt die Umgebung vor dem<br />
Er sucht für dynamische Aufrufe<br />
Klienten.<br />
Dienstgeber.<br />
• Er sucht für dynamische Aufrufe<br />
Er kann andere ORBs ansprechen,<br />
insbesondere<br />
Dienstgeber.<br />
solche auf dem Web.<br />
• Er kann andere ORBs ansprechen,<br />
insbesondere solche auf dem Web.<br />
Dr. Welf Löwe und Markus Noga 23
ORB-Aktivierung auf dem Klienten<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 131<br />
Objekt CORBA ORB<br />
ORB_init<br />
BOA_init<br />
Initialisiert den Vermittler<br />
Initialisiert den Server-BOA<br />
List_initial_services<br />
resolve_initial_references<br />
Liefert Strings<br />
Liefert Objektreferenzen
Umsetzung: Verschiedene Servermodelle<br />
• Gemeinsamer Serverprozeß (shared server )<br />
◮ Mehrere Objekte in <strong>eine</strong>m Prozeß auf dem Server<br />
◮ BOA initialisiert sie <strong>als</strong> nebenläufige Fäden (threads) mit<br />
gemeinsamem Adreßraum (gemeinsames Apartment)<br />
◮ BOA Funktionen deactivate_impl, impl_is_ready, obj_is_ready<br />
abgebildet auf thread-Funktionen<br />
• Separater Serverprozeß (unshared server )<br />
◮ Für jedes Objekt ein eigener Prozeß auf dem Server<br />
• Methoden-Prozeß (per-method server )<br />
◮ Jeder Methodenaufruf erzeugt <strong>eine</strong>n neuen Prozeß<br />
• Persistenter Server<br />
◮ Fremdanwendung startet Objekte (z.B. Datenbank)<br />
◮ BOA reicht die Anfragen nur durch<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 132
Objektaktivierung auf dem Server<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 133<br />
Objektaktivierung auf dem Server<br />
Server Objekt1 Objekt2 CORBA::BOA<br />
Impl_is_ready<br />
Create<br />
obj_is_ready<br />
get_id<br />
obj_is_ready<br />
deactivate_obj<br />
deactivate_obj<br />
deactivate_impl<br />
Dr. Welf Löwe und Markus Noga 19
CORBA Kommunikation: Übersicht<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 134<br />
• Statischer Methodenaufruf<br />
• Dynamischer Aufruf<br />
• Global eindeutige Referenzen (interoperable object reference, IOR)<br />
• Sprachbindung<br />
• CORBA Dienste: Häufig benötigte (Basis-)Dienste<br />
• CORBA Facilities: Horizontale und vertikale (bereichsspezifische) Dienste<br />
• Metaebene: Meta Object Facility / XMI
Bestandteile von Corba<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 135<br />
Bestandteile von Corba<br />
Basisdienste<br />
Interoperabilität<br />
IDL, RPC, ORB<br />
Erweiterte<br />
Interoperabilität<br />
DII, Trading<br />
Protokolle<br />
GIOP IIOP<br />
MOF<br />
(reflection)<br />
Facilities<br />
Services<br />
Scriptsprachen<br />
Geschäfts<br />
objecte<br />
(business<br />
objects)<br />
Komponenten<br />
CorbaBeans<br />
Dr. Welf Löwe und Markus Noga 63
Statische Aufträge (Methodenaufrufe)<br />
• Methoden der Teilnehmer sind statisch bekannt, dynamisch nur<br />
Verbindungsaufbau durch Anmeldung erforderlich.<br />
◮ Aufruf durch Stummel und Skelette,<br />
◮ K<strong>eine</strong> Suche nach Diensten (in der Ablage),<br />
◮ K<strong>eine</strong> Suche nach Dienstobjekten,<br />
◮ Schnell<br />
• Statische Typprüfung durch Übersetzer möglich<br />
• Da der Aufruf an die Skelette durch den Objekt-Adapter geht, erscheint<br />
dem Klienten das Dienstobjekt durchgängig lebendig (transparentes<br />
Leben)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 136
Dynamischer Aufruf (Request Broking)<br />
• Dynamischer Aufruf (dynamische Abfrage)<br />
◮ Komponenten dynamisch ausgetauscht oder nachträglich eingebracht<br />
◮ Neuübersetzung entfällt<br />
◮ Beispiel: Plugins für Browser, Zeichenprogramme etc.<br />
• Beschreibung der Komponentensemantik zur Suche<br />
◮ Object Interface<br />
◮ Informationen<br />
Metadaten (beschreibende Daten)<br />
Schnittstellendaten<br />
Verzeichnisse von Komponenten (interface repository ,<br />
implementation repository )<br />
• Such-Vermittler - ORB interface<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 137
IOR (interoperable object reference)<br />
• Verbirgt Objektreferenzen der Programmiersprachen<br />
• Pro Programmiersprache eindeutig abgebildet (für alle ORBs)<br />
• Transient (verschwindet mit Server) oder persistent (lebt weiter)<br />
• Bestandteile<br />
◮ Typnamen (type code), d.h. Zeiger in das Interface Repository<br />
◮ Protokoll und Adreßinformation (z.B. beim IIOP TCP/IP port, host<br />
name),<br />
auch für verschiedene zugleich unterstützte Protokolle<br />
◮ Objektschlüssel (object key).<br />
Name des Objektadapters (für den BOA)<br />
Gekapseltes Datum (nur vom erzeugenden ORB lesbar)<br />
Interface<br />
Repository<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 138
Beispiel: IOR<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 139
Sprachbindung (language binding)<br />
• Bijektive Abbildung: Corba IDL ↔ spezielles Typsystem<br />
• Vorgehen: Strukturelle Induktion<br />
◮ Definiere Abbildung für alle primitiven Typen<br />
◮ Definiere Abbildung für alle Typkonstruktoren<br />
◮ Fertig<br />
• Leistet Transparenz von<br />
◮ byte order<br />
◮ Wortbreiten<br />
◮ Speicherlayout<br />
◮ Speicherverwaltung<br />
◮ Referenzen<br />
• Wo nötig Anpasser erzeugen (Kopien minimieren)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 140
Ausführliches Beispiel: Zeitdienst<br />
• Aufruf liefert aktuelle Uhrzeit<br />
• Bestandteile<br />
◮ Schnittstellenbeschreibung mit IDL<br />
◮ Eigentlicher Dienst<br />
◮ Server (für dieses Beispiel)<br />
Startet ORB<br />
Initialisiert Dienst<br />
Gibt IOR dem Menschen bekannt<br />
◮ Client<br />
Nimmt IOR vom Menschen entgegen<br />
Dienstaufruf<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 141
Beispiel: IDL<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 142<br />
//TestTimeServer.idl<br />
module TestTimeServer{<br />
interface ObjTimeServer{<br />
string getTime();<br />
};<br />
};
Beispiel: Dienst<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 143<br />
//TestTimeServerImpl.java<br />
import CORBA.*;<br />
class ObjTestTimeServerImpl extends<br />
TestTimeServer.ObjTimeServer_Skeleton { //generated from IDL<br />
//Variables<br />
//Constructor<br />
//Method (Service) Implementation<br />
public String getTime() throws CORBA.SystemException{<br />
return "Time: "+currentTime;<br />
}<br />
};
Beispiel: Server<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 144<br />
// TimeServer_Server.java<br />
import CORBA.*;<br />
public class TimeServer_Server{<br />
public static void main(String[] argv){<br />
try{<br />
CORBA.ORB orb = CORBA.ORB.init();<br />
...<br />
ObjTestTimeServerImpl obj =<br />
new ObjTestTimeServerImpl(...);<br />
...<br />
System.out.println(orb.object_to_string(obj));<br />
}<br />
catch (CORBA.SystemException e){<br />
System.err.println(e);<br />
}<br />
}<br />
};
Beispiel: Client<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 145<br />
//TimeServer_Client.java<br />
import CORBA.*;<br />
public class TimeServer_Client{<br />
public static void main(String[] argv){<br />
try{<br />
CORBA.ORB orb= CORBA.ORB.init();<br />
...<br />
CORBA.object obj = orb.string_to_object(argv[0]);<br />
...<br />
TestTimeServer.ObjTimeServer timeServer=<br />
TestTimeServerImpl.ObjTimeServer_var.narrow(obj);<br />
...<br />
System.out.println(timeServer.getTime());<br />
}<br />
catch (CORBA.SystemException e){<br />
System.err.println(e);<br />
}<br />
}<br />
};
Beispiel: Ausführung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 146<br />
C:\><br />
java TimeServer_Server<br />
IOR:00000000000122342435 ...<br />
C:\> java TimeServer_Client IOR:00000000000122342435 ...<br />
Time: 14:35:44
I.2.1.2 Corba Dienste (Corba services)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 147<br />
• OMG. CORBAservices: Common Object Service Specifications. Version<br />
vom Dez. 98.<br />
http://www.omg.org/technology/documents/formal/corbaservices.htm<br />
oder<br />
http://www.omg.org/technology/documents/corbaservices_spec_catalog.htm
Überblick Corba Dienste (services)<br />
• Wiederverwendbare Bibilotheken oft benötigter Funktionen<br />
• Dienst ist Komponente<br />
(im Corba-Jargon: Objekt, definiert in IDL)<br />
• Eingeteilt in<br />
◮ Objektdienste<br />
Verwalten Komponenten (im Corba-Jargon: Objekte)<br />
◮ Zusammenarbeitsdienste<br />
Unterstützen die Zusammenarbeit von Komponenten<br />
◮ Geschäftsprozeßdienste<br />
Funktionalität für Geschäftsanwendungen<br />
• Umsetzung<br />
◮ Nicht jeder ORB-Anbieter unterstützt alle Dienste<br />
◮ http://www.cetus-links.org/oo_object_request_brokers.html<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 148
Objektdienste<br />
• Namen (directory service)<br />
◮ Das <strong>Datei</strong>system (directory tree) ist eigentlich ein Namensdienst.<br />
◮ Auf beliebige Internet-Objekte ausdehnbar.<br />
• Allokation (lifecycle service)<br />
◮ k<strong>eine</strong> Semantik bei Deallocation<br />
◮ k<strong>eine</strong> Destruktoren<br />
• Eigenschaften für Objekte (property service)<br />
• Persistenz<br />
◮ Objektzustand bleibt über Programmaufrufe erhalten<br />
• Serialisierung in Ströme (externalization)<br />
• Relationen (relationship service)<br />
◮ Relationen, Rollen, Kanten sind Objekte<br />
◮ Standardrelationen reference, containment<br />
◮ Standardrollen references, referenced, contains, containedIn<br />
• Behälter (collections)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 149
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 150<br />
Wiederholung: Rückruf und Ereignisse<br />
Example: Callbacks and Events I<br />
abstract solution<br />
goal: communication client-server whenever a situation<br />
(event, state change) arises at the server requiring action<br />
• Ziel: Kommunikation zwischen Dienstnehmer und Dienstgeber, wenn <strong>eine</strong><br />
Situation by the client (Ereignis, Zustandsübergang) im Dienstgeber Aktivität des<br />
Dienstnehmers erfordert<br />
abstract solution: introduce event server between client and<br />
• Abstrakte Lösung: Ereignisdienst <strong>als</strong> Zwischenschicht einführen<br />
server<br />
event<br />
client<br />
server<br />
server<br />
◮ Dienstnehmer abonniert relevante Ereignisse beim Dienstgeber<br />
◮ ‘‘relevant’’<br />
client notifies<br />
durch<br />
event<br />
Nebenbedingungen<br />
server in advance about<br />
weiter<br />
all events<br />
einschränkbar<br />
of interest<br />
◮ Dienstgeber “interest” may benachrichtigt constraint by Dienstnehmer mentioning additional über conditions Ereignisse (mit<br />
Nutzdaten)<br />
server notifies event server about all incoming events (state<br />
changes) including additional information<br />
◮ Ereignis kann k<strong>eine</strong>n, <strong>eine</strong>n, oder beliebig viele Dienstnehmer erreichen<br />
event server may notify zero, one or several clients about the event<br />
◮ Synchrone oder asynchrone Benachrichtigung<br />
notification by event server may be synchronous or asynchronous<br />
◮ Ereignisdienst oft im Dienstgeber integriert (Ereignisschleife)<br />
event server often integrated into the server (“event loop”)<br />
Gerhard <strong>Goos</strong>, Software from Components, Overview 22
Zusammenarbeitsdienste<br />
• Kommunikation<br />
◮ Rückrufservice (callbacks)<br />
◮ Ereignisse über entsprechende Kanäle<br />
Rollen von Komponenten auf Kanälen<br />
· Schiebt Ereignisse in den Kanal (push)<br />
· Zieht Ereignisse aus dem Kanal (pull)<br />
• Parallelität<br />
◮ Sperren (concurreny service)<br />
Einzelne oder Mengen von Sperren<br />
Innerhalb von oder ohne Transaktionen<br />
◮ Transaktionen (object transaction service, OTS)<br />
Flache und geschachtelte Transaktionen über Objektgraphen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 151
Geschäftsprozeßdienste<br />
• Makler (Händler, trading service)<br />
◮ Gelbe Seiten<br />
◮ Lokalisierung von Diensten mittels Dienstbeschreibungen<br />
• Abfrage (query )<br />
◮ Suchen von Komponenten<br />
◮ Mit Attributen und OQL, SQL (ODMG-93)<br />
• Lizenzierung von Komponenten<br />
◮ license managers, license service<br />
• Sicherheit<br />
◮ Einsatz von SSL und anderen Basisdiensten<br />
◮ Alle ORBs arbeiten zusammen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 152
Abhängigkeiten zwischen den Diensten<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 153<br />
Abhängigkeiten zwischen den Diensten<br />
Transaktionen<br />
Makler<br />
Query<br />
Lizenzen<br />
Persistenz<br />
Serialisierung<br />
Sicherheit<br />
Container<br />
Allokation<br />
Sperren<br />
Rückruf<br />
Eigenschaften<br />
Namen<br />
Relationen<br />
Ereignisse<br />
Dr. Welf Löwe und Markus Noga 38
Entwurfsprinzipien für Dienste<br />
• Normiert: funktionale Schnittstelle<br />
• Offen: nichtfunktionale Eigenschaften (QoS, . . . )<br />
• Orthogonalität von Diensten<br />
◮ Selbstanspruch des Standards<br />
◮ KISS (keep it simple, stupid)<br />
• Arbeit auf Komponenten (CORBA::Object)<br />
◮ Prinzipiell: Beliebige Komponenten<br />
◮ Dienstdefinition schränkt evtl. ein.<br />
◮ Reflektion über Komponenten möglich<br />
• Verschiedene Sichten auf <strong>eine</strong>n Dienst<br />
• Prinzipien für Schnittstellendefinition<br />
◮ Ausnahmebehandlung wird benutzt<br />
◮ Operationen sind explizit (nicht durch Flags parametrisiert)<br />
◮ Mehrfachvererbung von Schnittstellen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 154
Objektdienste: Namen<br />
• Bindet Namen an Komponenten<br />
• Namen sind k<strong>eine</strong> Komponenten (Corba-Jargon: Pseudoobjekte)<br />
• Bindung erfolgt in <strong>eine</strong>m Namensraum (scope, naming context)<br />
◮ Komponente, die <strong>eine</strong> Menge von Bindungen enthält.<br />
◮ Wechselseitige Bezüge möglich (Namensgraphen)<br />
• Corba definiert eigenes Namensschema<br />
◮ Not invented here: k<strong>eine</strong> Wiederverwendung von URLs etc.<br />
◮ Angestrebt: transparente Umsetzung möglich<br />
◮ Bibiliothek zur Manipulation von Namen (Entwurfsmuster Fabrik)<br />
◮ Name ist Tupel (id, type)<br />
id: eigentlicher Name<br />
type: Repräsentation (z.B. c_source, object_code, . . . )<br />
· Nur von der Anwendung manipuliert<br />
• Ein <strong>Datei</strong>system bildet <strong>eine</strong>n einfachen Namensraum<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 155
Namensdienst<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 156<br />
Namensdienst<br />
CosNaming::NamingContext<br />
-bind(in Name n, in Object obj)<br />
-rebind(in Name n, in Object obj)<br />
-bind_context<br />
-rebind_context<br />
-Object resolve<br />
-unbind(in Name n)<br />
-NamingContext new_context;<br />
-NamingContext bind_new_context(in Name n)<br />
-void destroy<br />
-list<br />
Dr. Welf Löwe und Markus Noga 41
IDL Namensdienst<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 157<br />
module CosNaming{<br />
typedef string Istring;<br />
struct NameComponent {<br />
Istring id;<br />
Istring kind;<br />
};<br />
typedef sequence Name;<br />
enum BindingType { nobject, ncontext };<br />
struct Binding {<br />
Name binding_name;<br />
BindingType binding_type;<br />
};<br />
typedef sequence BindingList;<br />
interface BindingIterator;<br />
interface NamingContext;<br />
}<br />
interface BindingIterator {<br />
boolean next_one(out Binding b);<br />
boolean next_n(in unsigned long how_many,<br />
out BindingList bl);<br />
void destroy();<br />
};<br />
interface NamingContext {<br />
enum NotFoundReason { missing_node,<br />
not_context, not_object<br />
};<br />
exception NotFound {<br />
NotFoundReason why;<br />
Name rest_of_name;<br />
};<br />
exception CannotProceed {<br />
NamingContext cxt;<br />
Name rest_of_name;<br />
};<br />
exception InvalidName {};<br />
exception AlreadyBound {};<br />
exception NotEmpty {};<br />
// continued on next page
IDL Namensdienst<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 158<br />
void bind(in Name n, in Object obj)<br />
raises( NotFound, CannotProceed, InvalidName,<br />
AlreadyBound );<br />
void rebind(in Name n, in Object obj)<br />
raises( NotFound, CannotProceed, InvalidName );<br />
void bind_context(in Name n, in NamingContext nc)<br />
raises( NotFound, CannotProceed, InvalidName,<br />
AlreadyBound );<br />
void rebind_context(in Name n, in NamingContext nc)<br />
raises( NotFound, CannotProceed, InvalidName );<br />
Object resolve(in Name n)<br />
raises( NotFound, CannotProceed, InvalidName );<br />
void unbind(in Name n)<br />
raises( NotFound, CannotProceed, InvalidName );<br />
NamingContext new_context();<br />
NamingContext bind_new_context(in Name n)<br />
raises( NotFound, AlreadyBound, CannotProceed, InvalidName );<br />
void destroy()<br />
raises( NotEmpty );<br />
void list(in unsigned long how_many,<br />
out BindingList bl, out BindingIterator bi );<br />
};<br />
};
Erzeugen von Namen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 159<br />
Systemabhängiger<br />
Name<br />
Erzeuge Name<br />
Suche / Erzeuge<br />
Namensraum<br />
Corba-Name<br />
Corba-<br />
Namensraum<br />
Binde<br />
Komponente<br />
(Corba-Objekt)<br />
Suche Name
Namensdienst: Beispiel<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 160<br />
// Quelle: Redlich, Calculator example<br />
class MyNaming extends CosNaming {<br />
// ...<br />
}<br />
public class Client extends Frame {<br />
private Calc5.calc.Ref calc;<br />
private TextField inR, inI;<br />
private Button setB, addB, multB,<br />
divB, quitB, zeroB;<br />
public static void main(String argv[]) {<br />
CosNaming.NamingContext.Ref cxt;<br />
Calc5.calc_factory.Ref cf;<br />
Frame f;<br />
}<br />
try {<br />
cxt= NamingContext._narrow(MyNaming.<br />
resolve_initial_references(<br />
MyNaming.NameService));<br />
cf=Calc5.calc_factory._narrow(<br />
cxt.resolve(MyNaming.mk_name(<br />
"calcfac")));<br />
f= new client(cf.create_new_calc());<br />
f.pack();<br />
f.show();<br />
} catch (Exception ex) {<br />
System.out.println("Calc-5/Init:"+<br />
ex.toString());<br />
}
Naming<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 161<br />
public class MyNaming {<br />
public static final String NameService = "NameService";<br />
public static IE.Iona.Orbix2.CORBA.Object.Ref<br />
resolve_initial_references(String id) {<br />
ORB orb = _CORBA.Orbix;<br />
if(id.compareTo(NameService)!=0)<br />
return NamingContext._nil();<br />
try {<br />
File inputFile = new File("/tmp/coss-naming/root");<br />
FileInputStream fis = new FileInputStream(inputFile);<br />
DataInputStream dis = new DataInputStream(fis);<br />
...<br />
return orb.string_to_object(obj_ref);<br />
} catch(Exception ex) {<br />
System.out.println("CosNaming:Init:" + ex.toString());<br />
}<br />
return NamingContext._nil();<br />
}<br />
public static Name mk_name(String str) {<br />
int last, k, i= 0;<br />
...<br />
return name;<br />
}<br />
}
Objektdienste: Eigenschaftsdienst<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 162<br />
• Mechanismus für dynamische Erweiterungen<br />
• Eigenschaften (properties) sind Tupel von Strings (name, value)<br />
• Dienst verwaltet Eigenschaften von Komponenten<br />
komponente1: ("makelbar" , "ja")<br />
("kategorie", "geschäftsdienst")<br />
• Konzept bekannt:<br />
◮ assoziative Arrays<br />
◮ LISP property lists<br />
◮ Java property classes<br />
• Iteratoren für Eigenschaftswerte<br />
• Verf<strong>eine</strong>rung PropertySetDef<br />
◮ Definierte Semantik für: readonly, fixed_readonly, . . .<br />
• Schnittstelle: define_property, define_properties, get_property_value,<br />
get_properties, delete_property, . . .
Objektdienste: Persistenz<br />
• persistent object identifier PID<br />
◮ Identifiziert persistente Komponente auf Speichermedium<br />
• Persistenzdienst<br />
◮ Zuordnung IOR ↔ PID<br />
◮ Protokoll zum Speichern auf/Laden von Speichermedium<br />
• Operationen connect, disconnect, store, restore, delete<br />
• Anbindung beliebiger Speicherwerkzeuge möglich<br />
◮ Relationale Datenbanken<br />
◮ <strong>Datei</strong>system<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 163
Zusammenarbeitsdienste: Ereignisse<br />
• Ausprägung der Nutzerrollen Producer und Consumer<br />
◮ push: Ablegen aktiv / Auslieferung automatisch<br />
◮ pull: Ablegen auf Anfrage / Auslieferung auf Anfrage<br />
• Ereigniskanal-Komponenten <strong>als</strong> optionale Zwischeninstanzen<br />
◮ puffern, vermitteln, replizieren, filtern Ereignisse<br />
◮ Anpassung von push und pull<br />
◮ Optionale Typisierung mit IDL (separate Schnittstellen)<br />
• Vorteile:<br />
◮ Asynchrones Arbeiten möglich (IIOP, dynamischer Aufruf)<br />
◮ Einfache Anbindung: Java (seit 1.2), Altsysteme . . .<br />
• Nachteile:<br />
◮ Untypisierte Schnittstelle zu allgemein<br />
◮ Jede typisierte Schnittstelle separat (Mehraufwand)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 164
Zusammenarbeitsdienste: Transaktionen<br />
• Standard-Datenbanktechnik<br />
◮ Einfache Transaktionen<br />
begin<br />
rollback<br />
commit (two-phase-commit)<br />
◮ Geschachtelte Transaktionen<br />
Zusätzliche Hierarchie<br />
• Beispiele<br />
◮ Bankkonten <strong>als</strong> Komponenten<br />
Operationen Abheben, Einzahlen<br />
Überweisung ist Transaktion über zwei Komponenten<br />
◮ Webseiten<br />
Bidirektionale Verweise<br />
Wie erziele ich Konsistenz?<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 165
Geschäftsprozeßdienste: Lizenzen<br />
• Lizenzmodelle für kommerzielle Komponenten<br />
◮ Einzelnutzung (one-time license)<br />
◮ Einzelplatzlizenzen<br />
◮ Übertragbare Lizenzen (floating licenses)<br />
◮ Netz-/Campuslizenzen<br />
• Dienst: Abstrakte Fabrik für Lizenzmanager<br />
◮ Ermöglicht individuelle Modelle für beliebige Komponenten<br />
◮ Flexibilität ohne Änderung der Anwendung<br />
• Feingranulare Lizenzen<br />
◮ Bezahlung durch ORB-Anfragen<br />
◮ Nutzungsart unterscheidbar (kommerziell, private)<br />
◮ Micropayments für Komponenten möglich<br />
(nicht allgemein etabliert)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 166
Geschäftsprozeßdienste: Makler<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 167<br />
Geschäftsprozessdienste: Makler<br />
Makler handeln mit<br />
Diensten (services,<br />
service types)<br />
Makler<br />
Vermittlermuster<br />
Exportiere<br />
Funktionalität<br />
Importiere<br />
Funktionalität<br />
Dienst<br />
Interagiere<br />
Kunde<br />
Dr. Welf Löwe und Markus Noga 55
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 168<br />
Ersetzen von Diensten (Konformität)?<br />
Wann ein Dienst gegen anderen ersetzen<br />
(Konformität)?<br />
gleiche Schnittstelle oder abgeleitete Schnittstelle<br />
alle Sucheigenschaften identisch definiert<br />
• gleiche Schnittstelle – k<strong>eine</strong> Properties oder abgeleitete vom Corba Schnittstelle Dienst Properties<br />
• alle Sucheigenschaften identisch definiert<br />
◮ k<strong>eine</strong> Properties vom Corba Dienst Properties<br />
• alle Modi der Eigenschaften stärker oder gleich<br />
alle Modi der Eigenschaften stärker oder gleich<br />
Mandatory, readonly<br />
Mandatory<br />
readonly<br />
(normal)<br />
Dr. Welf Löwe und Markus Noga 56
Makler: Dienstangebote<br />
• Dienstangebot: Paar aus IOR und Eigenschaften<br />
• Eigenschaften<br />
◮ von Maklern genutzt für Anfragen nach Diensten<br />
◮ Dynamische Eigenschaften (!)<br />
• Zum Vergleich spezielle Anfragesprache<br />
(standard constraint language)<br />
◮ boolesche Ausdrücke über Eigenschaften<br />
◮ numerische und Stringvergleiche<br />
• Findet ein Makler k<strong>eine</strong>n passenden Dienst<br />
◮ kann er Nachbarn beauftragen (Entwurfsmuster Zuständigkeitskette,<br />
chain of responsibility )<br />
◮ Dazu ist ein Graph aus Maklern aufgebaut<br />
◮ Filtern beim Weitergeben der Dienstsuchanfrage<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 169
Dienst-Hüpfen (hopping)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 170<br />
Dienst-Hüpfen (hopping)<br />
Makler 1<br />
Fluß der<br />
Eigenschaften<br />
der Dienstanfrage<br />
Angebote der Makler<br />
Policies, die die Werte<br />
der Eigenschaften der<br />
Dienstanfrage verändern<br />
Makler 2<br />
Makler 4<br />
Makler 3<br />
Dr. Welf Löwe und Markus Noga 58
Suche nach Diensten<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 171<br />
Suche nach Diensten<br />
• policy : Parametrisierung von der Maklern Dienstgüte und Links durch sog. policies.<br />
policies beeinflussen verschiedene Phasen von Suche und Weitergabe, z.B.<br />
• Bei Maklern: Anwendung auf Suche und Weitergabe<br />
– max_search_card: Obergrenze für zu suchende Angebote<br />
◮ max_search_card: Obergrenze für durchsuchte Angebote<br />
– max_match_card: Obergrenze für Rückgabe passender Angebote<br />
◮ max_match_card: – max_hop_count: Obergrenze Obergrenze zurückzugebender für Suchtiefe über Makler Ergebnisse<br />
◮ max_hop_count: Obergrenze für Suchtiefe über Makler<br />
Mögliche<br />
Angebote<br />
Kardinalitäten<br />
für Suche<br />
Betrachtete<br />
Angebote<br />
Kardinalitäten<br />
für Matchen<br />
Gefundene<br />
Angebote<br />
Angebote<br />
Kardinalitäten<br />
für Rückgabe<br />
Mögliche<br />
Angebote<br />
Dr. Welf Löwe und Markus Noga 59
Makler: Schnittstellen<br />
• Schnittstellen<br />
◮ Lookup (Anfragen stellen)<br />
◮ Offer Iterator<br />
◮ Register (zum Export und Zurückziehen von Diensten)<br />
◮ Link (Aufbau des Maklernetzes)<br />
◮ Proxy (Stellvertreter-Objekte, die Makler vertreten)<br />
Stellvertretung für andere Makler<br />
Erlaubt Kapselung von Altsystemen<br />
◮ Admin (Eigenschaften von Dienste)<br />
Lookup.Query(<br />
in ServiceTypeName,in Constraint, in PolicySeq,<br />
in SpecifiedProps, in howMany,<br />
out OfferSequence, out offerIterator<br />
)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 172
Maklerarten<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 173<br />
Maklerarten<br />
Lookup<br />
Lookup<br />
Register<br />
LookupRegister Admin<br />
Anfragemakler<br />
(query trader)<br />
Einfacher<br />
Makler<br />
(simple trader)<br />
Selbständiger<br />
Makler<br />
(standalone<br />
trader)<br />
Lookup Register Admin<br />
Lookup Register Admin<br />
Lookup Register Admin<br />
Sozialer Makler<br />
(linked trader)<br />
Stellvertreter<br />
Makler<br />
(proxy trader)<br />
Komplett-<br />
Makler<br />
(full-service<br />
trader)<br />
Link<br />
Proxy<br />
Link<br />
Proxy<br />
Dr. Welf Löwe und Markus Noga 61
I.2.1.3 Corba facilities<br />
• Horizontale (general) facilities<br />
◮ Dienste, Werkzeuge<br />
◮ Unabhängig von Anwendungsbereich<br />
◮ Spezifikation durch OMG<br />
◮ Kenntnis nützlich<br />
◮ Abgrenzung zu Corba services unklar<br />
• Vertikale (domain-specific) facilities<br />
◮ Rahmensysteme, Schnittstellen<br />
◮ Spezifisch für <strong>eine</strong>n Anwendungsbereich<br />
◮ Spezifikation durch Industriegremien<br />
Domain Technology Committee (DTC) gründet<br />
Domain Task Forces (DTF), die spezifizieren<br />
◮ Bei Bedarf nachschlagen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 174
Einige Beispiele<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 175<br />
Einige Beispiele<br />
Vertikal<br />
Electronic<br />
Commerce<br />
Telecom Manufacturing Utility<br />
Financial Transportation Simulation Life Sciences<br />
Horizontal<br />
MOF XMI Data<br />
Warehouse<br />
Business<br />
Objects<br />
Dr. Welf Löwe und Markus Noga 66
Beispiele für general facilities<br />
• Benutzerschnittstellen<br />
◮ Drucken<br />
◮ email<br />
◮ Verbunddokumente: Seit 1996 OpenDoc. Source Code ist frei. Tot?<br />
◮ Scripting: ab Corba 3.0<br />
• Informationsmanagement<br />
◮ strukturierter Speicher Bento<br />
◮ Metadaten (meta object facility, MOF)<br />
◮ Datentransfer: text- und strombasiertes Austauschformat (XMI)<br />
• Systemmanagement (Instrumentierung, Monitoring)<br />
• Task management (Workflow, Regeln, Agenten)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 176
Metaobject Facility (MOF)<br />
• Problem: IDL für viele Anwendungen unbekannt<br />
◮ Annahme: Beschreibung vorhanden (UML, OMT, . . . )<br />
◮ Ansatz: Auffassen <strong>als</strong> Typsystem, IDL erzeugen<br />
◮ Nötig: Beschreibungssprache für Typsysteme<br />
• CORBA-Lösung: MOF<br />
◮ Meta-Typsystem<br />
◮ Beschreibt IDL und andere Typsysteme<br />
◮ Standardisiert November 1997<br />
• Neue Möglichkeiten<br />
◮ Erzeugen allgem<strong>eine</strong>r Anpasser<br />
◮ Zusammenarbeit heterogener CASE-Werkzeuge<br />
◮ Einbindung weiterer Typsysteme in Corba<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 177
Metadaten<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 178<br />
Metadaten<br />
Meta: griech. darüber, jenseits<br />
Metadaten: Daten über Daten<br />
• Meta: griech. – Datenbeschreibung<br />
darüber, jenseits<br />
• Metadaten: – Modellierung Daten über Daten<br />
◮ Datenbeschreibung<br />
– Können reflexiv sein<br />
◮ Modellierung Reflektion: Programm greift auf<br />
◮ Können Metadaten reflexivzusein<br />
• Reflektion: Selbstmodifikation Programm greift (intercession)<br />
auf Metadaten kann Erkenntnisse zu nutzen<br />
• Selbstmodifikation kann<br />
Erkenntnisse nutzen<br />
Metadaten<br />
Metadaten<br />
Beschreiben<br />
Daten,<br />
Daten,<br />
Code<br />
Code<br />
Ändern<br />
Zugriff<br />
Metaebene<br />
(Konzeptebene)<br />
Realität<br />
Dr. Welf Löwe und Markus Noga 69
Beschreibungsebenen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 179<br />
• Hierarchie von Beschreibungsebenen<br />
• Reale Objekte (Akte, Ordner etc)<br />
• Programmobjekte (CORBA Objekte)<br />
• Typen (int, char, zusammengesetzte IDL Typen etc)<br />
• Typsysteme (IDL oder UML)<br />
• MOF beschreibt Typsysteme
Reflektion und Selbstmodifikation<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 180<br />
Reflektion:<br />
for all c in self.classes do<br />
generate_class_start(c);<br />
for all a in c.attributes do<br />
generate_attribute(a);<br />
done;<br />
generate_class_end(c);<br />
done;<br />
Selbstmodifikation:<br />
for all c in self.classes do<br />
helpClass = makeClass(c.name+"help");<br />
for all a in c.attributes do<br />
helpClass.addAttribute(copyAttribute(a));<br />
done;<br />
self.addClass(helpClass);<br />
done;<br />
Reflektion bietet Zugriff auf Typinformationen<br />
für ein Programm. Es wird<br />
dabei nicht geändert.<br />
Selbstmodifikation ändert das laufende Programm<br />
anhand reflektierter Information.
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 181<br />
Ausspähen (Introspection)<br />
Ausspähen (Introspection)<br />
• F<strong>als</strong>cher Sprachgebrauch: gemeint ist inspection<br />
• Spezialfall der Reflektion: über fremde Komponenten<br />
• Bestimmen Bestimmen semantikbehafteter semantikbehafteter Eigenschaften Eigenschaften<br />
• Wichtig für den Web-Komponenten-Supermarkt<br />
Spezialfall der Reflektion: über fremde Komponenten<br />
Wichtig für den Web-Komponenten-Supermarkt.<br />
Metadaten<br />
Metadaten<br />
Metaebene<br />
(Konzeptebene)<br />
Zugriff<br />
Beschreiben<br />
Realität<br />
Daten,<br />
Daten,<br />
Code<br />
Code<br />
Daten,<br />
Daten,<br />
Code<br />
Code<br />
Ändern
Zusammenfassung MOF<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 182<br />
• Unterstützt beliebige Typsysteme<br />
• Hinzufügen neuer, komponieren oder erweitern alter Typsysteme<br />
• Beziehungen innerhalb und zwischen Typsystemen<br />
• Interoperabilität zwischen Typsystemen und -repositorien<br />
• Automatische Generierung von IDL<br />
• Reflektion/Inspektion unterstützt<br />
• Anwendung auf Arbeitsflüsse (workflows), Datenbanken, Groupware,<br />
Geschäftsprozesse, data warehouses wird untersucht<br />
• http://www.dstc.edu.au/MOF<br />
• Unklar: Reflektion auf IDL möglich, warum Metaebene?<br />
◮ IDL vollständig → MOF überflüssig<br />
◮ IDL unvollständig → IDL erweitern
XMI<br />
• Problem: Austausch von Metadaten zwischen Werkzeugen<br />
◮ Eigentlich durch MOF gelöst<br />
◮ Format nicht zumutbar?<br />
• Lösung: Abbildung auf grundlegenderen Standard<br />
◮ XML Metadata Interchange (XMI)<br />
◮ Typsystem in MOF → XML 1.0 DTD oder XML Schema (XMI<br />
Schema)<br />
◮ Typen im Typsystem → DTD- oder Schema-konformes XML<br />
◮ Anpassungen möglich, da alle Typsysteme auf MOF beruhen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 183
Vorteil von XMI<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 184<br />
Design<br />
Software<br />
Assets<br />
App1<br />
App2<br />
Development<br />
Tools<br />
XMI<br />
Repository<br />
App6<br />
App3<br />
Database<br />
Schema<br />
Reports<br />
App5<br />
App4<br />
6 Brücken von 6 Herstellern N*N-N = 30 Brücken
Überblick XMI<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 185<br />
Überblick XMI<br />
MOF<br />
MOF<br />
MetametaModell<br />
MetametaModell<br />
Metadata Definitionen<br />
Metadata Definitionen<br />
& Management<br />
& Management<br />
UML<br />
UML Instanz<br />
CWM<br />
UML Instanz<br />
MOF<br />
UML Instanz<br />
XML Austauschströme (Modelle)<br />
XML Austauschströme (Modelle)<br />
UML<br />
UML<br />
Metamodell<br />
Metamodell<br />
Analysis & Design<br />
Analysis & Design<br />
X<br />
X<br />
M<br />
M<br />
I<br />
I<br />
UML 1.1<br />
DTD<br />
CWM<br />
DTD<br />
MOF<br />
1.1<br />
DTD<br />
XML<br />
XML<br />
Syntax<br />
Syntax<br />
XML DTD (MetaModels)<br />
XML DTD (MetaModels)<br />
(spezifisch pro Typsystem)<br />
(spezifisch pro Typsystem)<br />
Dr. Welf Löwe und Markus Noga 80
XMI <strong>als</strong> Zwischenrepräsentation<br />
`<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 186<br />
XMI <strong>als</strong> Zwischenrepräsentation<br />
MOF<br />
MOF<br />
CaseTool<br />
CaseTool<br />
CaseTool-<br />
CaseTool-<br />
DTD<br />
DTD<br />
UML-DTD<br />
UML-DTD<br />
UML<br />
UML<br />
UML-<br />
UML-<br />
Spezifikation<br />
Spezifikation<br />
(in UML)<br />
(in UML)<br />
CaseTool-<br />
CaseTool-<br />
Spez.<br />
Spez.<br />
in XML<br />
in XML<br />
Abfrage/Navigatin<br />
Abfrage/Navigation<br />
n<br />
durch WebQL,<br />
durch WebQL,<br />
XML-QL<br />
XML-QL<br />
Umwandlung<br />
Umwandlung<br />
durch<br />
durch<br />
XML-<br />
XML-<br />
Leser/Schreiber<br />
Leser/Schreiber<br />
Darstellung mit<br />
Darstellung mit<br />
Style Sheets<br />
Style Sheets<br />
in Browsern<br />
in Browsern<br />
CaseTool-<br />
CaseTool-<br />
Spezifikation<br />
Spezifikation<br />
Umwandlung<br />
Umwandlung<br />
durch<br />
durch<br />
XML-<br />
XML-<br />
Leser/Schreiber<br />
Leser/Schreiber<br />
UML-Spez.<br />
UML-Spez.<br />
In XML<br />
In XML<br />
(Seite)<br />
(Seite)
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 187<br />
Ein reales Austauschszenario<br />
Ein reales Austauschszenario<br />
Web<br />
Sphere<br />
Rose<br />
Team<br />
Connection<br />
DTD<br />
Gen<br />
VA<br />
Java<br />
Oracle<br />
XMI<br />
IBM<br />
VisualAge<br />
XMI<br />
Repository<br />
XMI<br />
XMI<br />
Select<br />
XMI<br />
Oracle<br />
Designer<br />
XMI<br />
Rational<br />
Rose<br />
Unisys<br />
UREP<br />
XMI<br />
MOF<br />
DTDGen<br />
XMI<br />
Select<br />
Enterprise<br />
XMI<br />
Enterprise<br />
Aus: S. Brodsky, OMG XMI Briefing,<br />
Feb 5, 1999
Literatur<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 188<br />
• Orfali, Harkey: Client-Server Programming with Java and Corba. Wiley.<br />
Schön zu lesen. Empfehlenswert zur Prüfungsvorbereitung.<br />
• Orfali, Harkey: Instant Corba. Addison-Wesley. Nachttisch-Lektüre.<br />
Empfehlenswert zur Prüfungsvorbereitung.<br />
• OMG: CORBAfacilities: Common Object Facilities<br />
Specifications.http://www.omg.org/<br />
• XMI - The Value of Interchange. Dr. Stephen A. Brodsky, IBM, Vortrag<br />
am 5.2. 1999, OMG XMI Briefing<br />
• Overview of XMI. Sridhar Iyengar, Unisys Corporation, 5.2.99, OMG XMI<br />
Briefing,<br />
• XML Metadata Interchange (XMI) Proposal to the OMG RFP3:<br />
Stream-based Model Interchange Format SMIF. OMG, 20.10.98<br />
http://www.omg.org/
Gliederung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 189<br />
1. Einführung<br />
◮ Motivation<br />
◮ Definition,<br />
◮ Konzepte für Komponenten (klassische, kommerzielle, akademische)<br />
2. Industrielle Komponentensysteme der 1. Generation<br />
1. Ziele und Modell<br />
2. CORBA<br />
3. Enterprise JavaBeans<br />
4. (D)COM, .Net<br />
3. Anpassungsprobleme<br />
◮ Daten und Funktion<br />
◮ Interaktion<br />
Kommunikation<br />
Synchronisation<br />
Protokolle<br />
◮ Lebendigkeit<br />
4. Akademische Ansätze<br />
◮ Architektursysteme<br />
◮ Aspektorientiertes Programmieren<br />
◮ Metaprogrammierung und Invasive Komposition
Java und Enterprise Java Beans<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 190<br />
• Arnold, Gosling. Java Language Specification, 2. Auflage, 2000. Privat<br />
einmal ausdruckbar. http://java.sun.com/docs/books/jls/index.html<br />
• JavaSoft. Java Beans Specification. www.javasoft.com. Gut lesbar, schöne<br />
Einführung zu den Konzepten.<br />
• JavaSoft. Enterprise Java Beans Specification 2.0. www.javasoft.com. Der<br />
Standard. v2.2 ist Proposed Public Draft.<br />
• Richard Monson-Haefel. Enterprise JavaBeans. O’Reilly, 1999. Leicht<br />
zugängliche Einführung.
Geschichte von Java<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 191<br />
• Ursprung: Eingebettete Systeme für Hausgeräte<br />
◮ Neue Sprache an C++ angelehnt<br />
◮ Reduktion der Komplexität<br />
◮ Exakt und sauber spezifiziert<br />
• Verbreitung durch Java-Applets in Netscape (1994)<br />
◮ Java benutzt das Web <strong>als</strong> Zugpferd, so wie C UNIX<br />
◮ Write once, run anywhere (WORA) durch Virtual Machine<br />
◮ Frei nutzbar, doch feste Schnittstellen (Lizenzvertrag)<br />
• Klassenbibliotheken:<br />
◮ AWT, Swing (GUI)<br />
◮ Java Beans (1997)<br />
◮ Enterprise Java Beans (1998/99)
Spracheigenschaften<br />
• Objektorientiert<br />
• Mehrfachvererbung von Schnittstellen<br />
• Einfachvererbung von Code<br />
• Automatische Speicherbereinigung<br />
◮ Speicher ist uniforme Halde<br />
◮ Benutzerdefinierte Verwaltung unmöglich<br />
• K<strong>eine</strong> Zeiger, nur Referenzen<br />
◮ K<strong>eine</strong> Funktionsparameter<br />
◮ Callbacks durch Hilfsklassen möglich<br />
• Synchronisation mit Monitoren<br />
• Einfaches, hierarchisches Paketkonzept<br />
◮ Entspricht Namensräumen<br />
• K<strong>eine</strong> Generizität<br />
• Extraktion von Dokumentation (javadoc)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 192
Laufzeitumgebung<br />
• Java Virtual Machine<br />
◮ Abstraktion von konkreter Maschine und Plattform<br />
◮ prinzipiell sprachunabhängig<br />
◮ Übersetzer für andere Sprachen, z.B.<br />
ADA, COBOL, ECMAscript, Eiffel, Scheme, . . .<br />
• Java Bytecode<br />
◮ Stapelorientiert (Interpretation durch Java Virtual Machine)<br />
◮ Plattformunabhängig<br />
◮ Volle Typinformation<br />
◮ Sicherheit durch bytecode verifier prüfbar<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 193
Klassen und <strong>Datei</strong>en<br />
• Einbettung in <strong>Datei</strong>system<br />
◮ Eine öffentliche Klasse pro <strong>Datei</strong><br />
◮ Pakete entsprechen Verzeichnissen<br />
◮ Auffindung: Suchpfad CLASSPATH<br />
Definiert Abbildung von Namen auf Klassen<br />
Primitive Registrierdatenbank<br />
Pendant zu CORBA interface/implementation repositories<br />
Eintragen von Klassen durch Kopieren im <strong>Datei</strong>system<br />
• Java Archive Format (JAR)<br />
◮ Im Prinzip ZIP<br />
◮ Klassendateien<br />
◮ Serialisierte Objekte<br />
◮ Dokumentation<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 194
Dienste der Bibliothek<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 195<br />
• Parallelität mit java.lang.Thread<br />
• Ereignisse mit EventListener<br />
• Persistenz durch Serialisierung mit java.io.ObjectOutputStream<br />
• Verteilung mit Java RMI<br />
• Makeln mit Java Intelligent Network Infrastructure (JINI)<br />
• Anbindung fremder Sprachen über Java Native Interface (JNI)<br />
• Enterprise APIs: normierte Schnittstellen zu (Fremd-)Diensten<br />
◮ Namen über Java Naming Directory Interface (JNDI)<br />
◮ Datenbankzugriff über Java Database Connection (JDBC)<br />
◮ Transaktionen mit Java Transaction Server (JTS)<br />
• Java Spaces (Tuple space à la LINDA, typisierte Whiteboards)<br />
• Reflektion mit Klassenobjekten java.lang.Class<br />
◮ Zugriff auf Felder mit java.lang.Field<br />
◮ Zugriff auf Methoden mit java.lang.Method
Kardinalproblem Leistung<br />
• Sprache teilweise überdefiniert<br />
◮ Reihenfolge der Operanden- und Parameterberechnung<br />
◮ Reihenfolge von Ausnahmen<br />
• Bytecode ist Kellerarchitektur<br />
◮ gut interpretierbar<br />
◮ schlecht auf reale Maschinen abzubilden<br />
Registerzuteilung<br />
Superskalarität<br />
Codeauswahl<br />
• Nur primitive Skalare <strong>als</strong> Wertetypen / primitive Typen nicht <strong>als</strong><br />
Objekttypen<br />
◮ Objektidentität ist Overhead (Objekte min. 32 Byte)<br />
◮ Objekterzeugung ist teuerste Operation<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 196
Standardisierung<br />
• Java gehört Sun Microsystems<br />
◮ Definition von Schnittstellen in <strong>eine</strong>m öffentlichen Prozess<br />
◮ Jeder kann Vorschläge einbringen<br />
◮ Java Community Process, Java Developer Connection<br />
◮ Ziel: Abwenden von Zersplitterung durch Konkurrenten<br />
• Ob Java ein ISO-Standard wird, ist fraglich<br />
◮ Standard eingereicht, dann zurückgezogen<br />
• Was passiert, wenn ein proprietäres Java den Markt dominiert?<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 197
Einordnung von Java in unser Komponentenmodell<br />
• Sprachtransparenz<br />
◮ Nein (daher IDL unnötig)<br />
• Plattformtransparenz<br />
◮ Ja (durch Java VM)<br />
• Ortstransparenz<br />
◮ Teils (Java RMI vorhanden, uniforme Referenz fehlt)<br />
• Reflektion<br />
◮ Dynamisch (mit java.lang.Class)<br />
• Dienste<br />
◮ Namen, Datenbanken, . . .<br />
◮ K<strong>eine</strong> typisierten Behälterdatentypen<br />
• Also: beinahe ein Komponentensystem<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 198
JavaBeans<br />
• Erste Komponentenarchitektur für Java (1997)<br />
• Ziel: Visuelle Komposition in Entwicklungsumgebungen (IDE)<br />
◮ motiviert durch Borland/Inprise Delphi<br />
• Problem: Schnittstellen benutzerdefinierter Komponenten<br />
◮ Java Reflection findet alle öffentlichen Methoden und Felder<br />
◮ Viele sind nicht Teil der GUI-Schnittstelle<br />
• Problem: Große Systeme brauchen statische Typprüfung<br />
◮ Reflection → dynamische Typprüfung<br />
• Ansatz:<br />
◮ Konventionen für benutzerdefinierte Schnittstellen<br />
◮ Metainformationen speichern<br />
◮ Codeerzeugung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 199
Bean und BeanInfo<br />
• Bean<br />
◮ Enthält Funktionalität<br />
◮ Standardisierte Namensgebung<br />
set/getXXX für Attribute<br />
add/RemoveXXXListener für Ereignisse<br />
◮ Unterstützung für Ereignisadapter<br />
• BeanInfo<br />
◮ Enthält Metainformation über Attribute, Ereignisse<br />
◮ Erlaubt Reflektion über Beans<br />
• Problem: Annotation schwach<br />
◮ Nichtfunktionale Eigenschaften nur über Namensgebung<br />
◮ Nicht zur Laufzeit erweiterbar<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 200
XML Beans<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 201<br />
• Lösung: BeanInfo in erweiterbarem Format kodieren<br />
• IBM Bean Markup Language nutzt XML<br />
<br />
<br />
<br />
<br />
• Auch Komposition, Referenzen auf Beans<br />
• Serialisierung von Java-Objekten <strong>als</strong> XML-Daten<br />
• BML Compiler komponiert statisch<br />
• Siehe www.alphaworks.ibm.com
Zusammenfassung: Java Beans<br />
• Sprachtransparenz<br />
◮ Nein (daher IDL unnötig)<br />
• Plattformtransparenz<br />
◮ Ja (durch Java VM)<br />
• Ortstransparenz<br />
◮ Nein (Java RMI nicht genutzt)<br />
• Reflektion<br />
◮ Dynamisch und statisch<br />
• Dienste<br />
◮ Grundlegende GUI-Komponenten<br />
◮ K<strong>eine</strong> Namen, Datenbanken, . . .<br />
• Also: eher ein Rückschritt gegenüber Java in unserem Modell<br />
• Heute hauptsächlich <strong>als</strong> Grundlage von enterprise beans und von<br />
historischem Interesse<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 202
Enterprise JavaBeans (EJBs)<br />
• Ziel: Industrielles Komponentenmodell für Java<br />
◮ Sprachspezifisch<br />
◮ Plattformtransparent<br />
◮ Ortstransparent<br />
◮ Dienste: Namen, Persistenz, Transaktionen, Ressourcen, . . .<br />
• Weitere Vorgaben<br />
◮ Dynamische Dienstanbindung: Komposition ohne Übersetzen<br />
◮ Offene Anbindung fremder Komponenten und Werkzeuge<br />
Normierte Schnittstellen zu Fremdlösungen (z.B. JNDI, JDBC)<br />
Anbindung an CORBA<br />
• Gemeinsamkeiten mit einfachen JavaBeans<br />
◮ Name<br />
◮ Namensgebung der Schnittstellen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 203
EJBs, Behälter und Deskriptoren<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 204<br />
• EJBs sind Komponenten, die ein EJB Interface implementieren. Sie<br />
bestehen aus bestimmten Klassen, für<br />
◮ Lebenszyklus<br />
◮ Geschäftsfunktionalität<br />
◮ entfernte oder lokale Zugriffe<br />
◮ Beschreibung durch XML Deployment Descriptors<br />
• Verpackt <strong>als</strong> EJB JAR<br />
◮ Klassenbytecode<br />
◮ Deployment Descriptor<br />
• Behälter (Bean Container ) enthalten Komponenten<br />
◮ Auffindung<br />
◮ Stellt Ausführungskontext bereit, z.B. thread<br />
◮ Kontrolle aller Außenkontakte<br />
◮ Verwaltet Lebenszyklus, Persistenz von Zuständen<br />
◮ Sicherheits- und Transaktionsverwaltung<br />
• Server (Bean Server ) enthalten Container<br />
◮ Verwalten und koordinieren Ressourcenzuteilung<br />
◮ Zugriff auf Systemdienste
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 205<br />
Szenario<br />
Szenario<br />
EJB<br />
Aardvark<br />
Lohnbuch<br />
Jar<br />
Assembling<br />
Berdvark<br />
Dienst<br />
Berdvark<br />
Datensatz<br />
Aardvark<br />
Lohnbuch<br />
Jar mit Kompositionsanweisungen<br />
Deployment<br />
Web<br />
Server<br />
Berdvark<br />
Dienst<br />
Cerdvark<br />
FIBU<br />
Berdvark<br />
Datensatz<br />
Aardvark<br />
Lohnbuch<br />
Datenbank<br />
Formulare<br />
Angewendete EJB<br />
Cerdvark EJB Container<br />
Cerdvark EJB Server<br />
Altsysteme
Drei Sorten EJBs<br />
• Zustandslose Session Beans<br />
◮ Träger von Geschäftslogik<br />
◮ gebunden an <strong>eine</strong> Benutzersitzung<br />
◮ Klasse, kein Objekt, daher ununterscheidbar<br />
• Zustandsbehaftete Session Beans<br />
◮ wie oben, nur mit Zustand und damit unterscheidbar<br />
• Entity Beans<br />
◮ Träger von Geschäftsdaten<br />
◮ persistent<br />
◮ entsprechen meist <strong>eine</strong>m Datenbankeintrag<br />
◮ Persistenz selbst oder durch Container verwaltet<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 206
EnterpriseBeans aus Kundensicht<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 207<br />
Beans aus Kundensicht<br />
Dr. Welf Löwe und Markus Noga 16
Die Kundenschnittstelle (client view)<br />
• Invariant bezüglich Server und Container<br />
• Heimatschnittstelle (erbt von javax.ejb.EJBHome)<br />
◮ Standardisiert<br />
◮ Auffinden von Beans mit JNDI<br />
◮ Erzeugen, Löschen<br />
◮ evtl. globale Identifikatoren mit getPrimaryKey()<br />
• Entfernte Schnittstelle (erbt von javax.ejb.EJBObject)<br />
◮ Definiert durch Anbieter der EJB<br />
◮ Bietet Geschäftsfunktionalität<br />
• Ab EJB 2.0:<br />
◮ Lokale Heimatschnittstelle: Finden und Erzeugen von Beans im selben<br />
Container.<br />
◮ Lokale Version der entfernten Schnittstelle: Funktionsaufrufe statt RMI<br />
◮ Behälter (Container) unterstützen auch behälterverwaltete<br />
Assoziationen<br />
• Metadaten (erbt von javax.ejb.Metadata)<br />
◮ zur Reflektion über die Bean<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 208
Die Container-Komponenten-Schnittstelle<br />
• Entspricht CORBA BOA<br />
• Schnittstellen für Container und Komponente<br />
◮ SessionBean-Schnittstellen javax.ejb.SessionBean<br />
◮ EntityBean-Schnittstelle javax.ejb.EntityBean<br />
◮ Container-verwaltete Persistenz<br />
◮ Session-Kontext-Schnittstelle<br />
◮ JNDI-Namenskontext<br />
◮ Transaktionsverwaltung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 209
Deployment descriptor<br />
• EJB Eigenschaften<br />
◮ Namen: Name, Klasse, Name der Heimatschnittstelle, Name der<br />
Remote-Schnittstelle, Klasse des primären Schlüssels<br />
◮ Typ (session, entity )<br />
◮ Zustand<br />
◮ Persistenzverwaltung<br />
◮ Referenzen auf andere EJB<br />
• Zusatzinformation für Anwendungsersteller<br />
◮ Name, Umgebungswerte, Beschreibungsfelder<br />
◮ Einbettung in Transaktionen<br />
• Deskriptor ist XML-Dokument zu spezieller DTD<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 210
Beispiel: deployment descriptor<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 211<br />
<br />
<br />
This is an EJB<br />
<br />
Session bean 1 here <br />
EmployeeService<br />
com-wombat.empl.EmployeeServiceHome<br />
com.wombat.empl.EmployeeService<br />
com.wombat.empl.EmployeeServiceBean<br />
ejb-EmplRecords ...<br />
<br />
...<br />
... ...<br />
<br />
<br />
....<br />
...<br />
...<br />
<br />
Anpassungen in der Deployment Phase<br />
• Erzeugung von Klassen<br />
◮ Implementierung des remote interface (Stub)<br />
◮ Lokale Handles und Klebecode (Skeleton)<br />
◮ Metadaten<br />
• Generierte Anpassungen<br />
◮ Anpassung Bean / Container<br />
analog zu CORBA BOA<br />
◮ Einweben von Aspekten aus dem deployment descriptor<br />
Persistenz<br />
Transaktionsverwaltung<br />
Komposition<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 212
Entwicklerrollen bei EJB<br />
• Komponentenersteller (bean provider )<br />
◮ Anwendungsexperte<br />
◮ Baut EJBs mit fachspezifischen Methoden<br />
• Anwendungsersteller (application assembler )<br />
◮ Anwendungsexperte<br />
◮ Komponiert EJBs zu grösseren EJBs (Anwendungseinheiten)<br />
◮ Erweitert die Deployment-Deskriptoren<br />
• Einsetzer (deployer )<br />
◮ Setzt die EJB in <strong>eine</strong> Umgebung ein<br />
◮ Umgebung = EJB Server und Container<br />
• EJB-Container-Hersteller (container provider )<br />
◮ Spezialist für Konfiguration, Klebecode, Persistenz, . . .<br />
• EJB-Server-Hersteller (server provider )<br />
◮ Spezialist für Systemdienste<br />
(oft identisch mit container provider )<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 213
Sitzungsbohnen (session beans)<br />
• Transient oder halb-transient<br />
• Ausgeführt auf Anfrage <strong>eine</strong>s einzelnen Kunden<br />
(möglicherweise in Transaktion)<br />
• Stirbt mit dem Bohnen-Container<br />
• Zustandsbehaftet oder auch nicht<br />
• Passivierung bedeutet<br />
◮ Serialisierung aller Objekte, die transitiv von nicht-transienten<br />
Attributen aus erreichbar sind<br />
• Aktivierung bedeutet Deserialisierung.<br />
• Session-Kontext hält den jeweiligen Zustand fest<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 214
Erzeugen von Sitzungsbohnen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 215<br />
Erzeugen von Sitzungsbohnen<br />
Kunde<br />
EJB<br />
Heimat<br />
EJB<br />
Objekt<br />
Sitzungs-<br />
Kontext<br />
Instanz<br />
Create<br />
New<br />
New<br />
New<br />
SetSessionContext<br />
ejbCreate(args)<br />
Das ist nur <strong>eine</strong><br />
von sehr vielen<br />
Protokollspezifikationen<br />
der EJB Standardkomponenten.<br />
Die Protok<br />
definieren zusätzlich zum<br />
Typcheck verschärfte<br />
Zusammensetzbarkeitskriterien.<br />
Dr. Welf Löwe und Markus Noga 25
Dauerbohnen (entity beans)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 216<br />
• persistent<br />
• mehrbenutzerfähig, transaktionsorientiert<br />
• globaler Identifikator (analog GUID, IOR)<br />
• ähnlich zu Corba-Objekten (und Monikers unter DCOM)
Szenario<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 217<br />
Context initialContext = new InitialContext();<br />
CartHome cartHome = (CartHome)javax.rmi.PortableRemoteObject.narrow(<br />
initialContext.lookup("applications/mail/freds-carts"),<br />
CartHome.class);<br />
Cart cart = cartHome.create(...); // EJB spezifisch, vom Bohnenbauer spezifiziert<br />
cart.addItem(66);<br />
cart.addItem(44);<br />
// Speichere die Sitzungsbohne<br />
Handle cartHandle = cart.getHandle();<br />
// ... serialisiere in <strong>Datei</strong><br />
Handle cartHandle = .. deserialisiere von <strong>Datei</strong><br />
Cart cart = (Cart)javax.rmi.PortableRemoteObject.narrow(<br />
cartHandle.getEJBObject(), Cart.class);<br />
cart.purchase();<br />
cart.remove();
Zusammenfassung: Enterprise JavaBeans<br />
• Sprachtransparenz<br />
◮ Nein (daher IDL unnötig)<br />
• Plattformtransparenz<br />
◮ Ja (durch Java VM)<br />
• Ortstransparenz<br />
◮ Ja (durch remote interface)<br />
• Reflektion<br />
◮ Dynamisch und statisch<br />
• Dienste<br />
◮ Namen, Transaktionen, Datenbanken, . . .<br />
• Industriell sehr bedeutsames Komponentensystem<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 218
JINI<br />
• Java intelligent network interface (JINI)<br />
◮ Dynamischer Aufruf, Dienstvermittlung<br />
◮ Dienstbeschreibung: Schnittstellen, Eigenschaften (properties)<br />
◮ Erzeuge Stellvertreter für Dienst auf Kundenseite<br />
◮ Nutzt RMI, JNDI, Migration<br />
◮ Verschickt Klassen im Bytecode<br />
• Makler suchen Dienste im Netz (lookup service LUS)<br />
◮ Verschiedene Suchprotokolle<br />
• Leases-Schnittstelle erlaubt Miete von Diensten<br />
• Organisation von Diensten in Gruppen<br />
◮ Ein Drucker kann sich der Hardware-, Drucker- oder Raum111-Gruppe<br />
zuordnen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 219
JINI - Generelles Schema<br />
• Anbieten<br />
◮ Suchen des Maklers (discovery )<br />
◮ Anbieten beim Makler (join)<br />
◮ Dienst wird nur zeitbegrenzt angeboten (leasing)<br />
• Finden<br />
◮ Suche nach Makler (discovery )<br />
◮ Suche nach Dienst (lookup)<br />
◮ Benutzung (use)<br />
• Also: nichts Neues unter der Sonne<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 220
Zusammenfassung<br />
• Neu oder anders gegenüber CORBA:<br />
◮ Deployment Phase<br />
◮ Unterscheidung zwischen Sitzungs- und Dauerbohnen<br />
◮ Behälter statt ORB. Menge der Behälter kann man <strong>als</strong> ORB<br />
interpretieren.<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 221
Gliederung: Industrielle Systeme<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 222<br />
1. Einführung<br />
◮ Motivation<br />
◮ Definition,<br />
◮ Konzepte für Komponenten (klassische, kommerzielle, akademische)<br />
2. Industrielle Komponentensysteme der 1. Generation<br />
1. Ziele und Modell<br />
2. CORBA<br />
3. Enterprise JavaBeans<br />
4. (D)COM, .Net<br />
3. Anpassungsprobleme<br />
◮ Daten und Funktion<br />
◮ Interaktion<br />
Kommunikation<br />
Synchronisation<br />
Protokolle<br />
◮ Lebendigkeit<br />
4. Akademische Ansätze<br />
◮ Architektursysteme<br />
◮ Aspektorientiertes Programmieren<br />
◮ Metaprogrammierung und Invasive Komposition
Literatur<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 223<br />
• Es scheint k<strong>eine</strong> guten COM Bücher zu geben.<br />
• Don Box. Essential COM. Addison-Wesley. 1998. Viel zu detailliert, zu<br />
wenig abstrakte Konzepte. Eher ein Hacker Buch.<br />
• Plasil, F, Stal, M. An architectural view of distributed objects and<br />
components in CORBA, Java RMI, and COM/DCOM. Software -<br />
Concepts and Tools, 19: 14-28. Technischer Überblick. Recht knapp und<br />
gut. Empfohlen zur Prüfungsvorbereitung.
Wiederholung: Modell<br />
• Komponentenbegriff<br />
1. Eine Komponente ist <strong>eine</strong> Kollektion von Programmfragmenten mit<br />
<strong>eine</strong>m Bauplan, um für <strong>eine</strong> bestimmte Aufgabe <strong>eine</strong> ausführbare<br />
Programmeinheit zu erzeugen.<br />
• Sprachtransparenz<br />
◮ Schnittstellen mit IDL beschreiben<br />
• Plattformtransparenz<br />
◮ Plattformunabhängiges Typsystem in IDL<br />
• Ortstransparenz<br />
◮ Erzeugen von stubs und skeletons aus IDL<br />
• Reflexion<br />
◮ Ermitteln von Metadaten<br />
◮ Dynamischer Aufruf, Dynamische Erzeugung<br />
• Dienste<br />
◮ Namen, Lebenszyklus, Transaktionen, Datenbanken, . . .<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 224
DCOM: Entwicklung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 225<br />
• DCE (distributed computing environment)<br />
• OLE (object linking and embedding)<br />
◮ ActiveX (OLE-Erweiterung)<br />
• COM (component object model)<br />
• DCOM (distributed COM)<br />
Grenzen fließend!
DCE<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 226<br />
• Ursprung: OSF (open software foundation)<br />
◮ ähnlich Corba OMG<br />
◮ nicht dominiert durch Microsoft<br />
• Verteiltes Betriebssystem<br />
• Plattformunabhängig<br />
• Basiskommunikation via RPC<br />
• Konzept <strong>eine</strong>r IDL<br />
• Generierte stubs, skeletons
COM<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten Dr. Welf Löwe und Markus Noga 8 227<br />
• COM (component object model)<br />
• Komponentenarchitektur für Microsoft Windows (1993)<br />
• Schnittstellenbeschreibungen mit MIDL (Microsoft IDL),<br />
Wiederverwendete Technologie<br />
◮ aus DCE (distributed computing environment) abgeleitet<br />
◮ ähnlich CORBA IDL<br />
Object-<br />
Oriented<br />
Model<br />
Client/Server<br />
Model<br />
Dynamic<br />
Linking<br />
Component Object Model (COM)
OLE/ActiveX<br />
• OLE (object linking and embedding)<br />
• Ursprung: Microsoft Office, 1980er Jahre<br />
• Kernidee: Verbunddokumente<br />
◮ Primitive Dokumente<br />
(Spreadsheet, Graphik, Text, . . . )<br />
◮ Werkzeuge zur Bearbeitung<br />
◮ Registratur speichert Werkzeuge<br />
◮ Einbettung von Dokumenten / Werkzeugen<br />
• Controls<br />
◮ Wiederverwendbare GUI-Komponenten<br />
◮ Zunächst lokal, mit ActiveX aus Internet geladen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 228
Ursprüngliche Trennung OLE und COM<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 229<br />
Ursprüngliche Trennung OLE und COM<br />
OLE<br />
application<br />
services<br />
Basis<br />
COM ist Basiskomponentenarchitektur für aufgesetzte Dienste<br />
Dr. Welf Löwe und Markus Noga 7
Entwurfsziele für (D)COM<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 230<br />
• Aufrufe zwischen Komponenten<br />
◮ Sprachtransparent<br />
◮ Plattformabhängig (Windows)<br />
◮ Ortstransparent<br />
• Reflexion<br />
• Dynamisches Nachladen von Komponenten<br />
• Versionierung von Komponenten und Schnittstellen
Grundideen von (D)COM<br />
• Komponente implementiert Menge von Schnittstellen<br />
◮ Verwirrend: COM Object = Komponente, nicht Instanz!<br />
• Schnittstellen (interfaces) sind Mengen von Signaturen, die <strong>eine</strong><br />
Komponente anbietet<br />
◮ Nur schwach typisiert, nicht statisch typsicher.<br />
◮ Mehrfachvererbung möglich<br />
◮ Jede Schnittstelle erbt transitiv IUnknown<br />
Schnittstellen abfragen (dynamische Reflexion)<br />
Lebenszyklus von Instanzen überwachen (Referenzen zählen)<br />
◮ Standardisierte Komponentenfabriken IClassFactory<br />
◮ Konventionen zur Namensgebung: Ungarische Notation (Simonyi)<br />
• Eindeutige IDs für Komponenten und Schnittstellen (general unique ID,<br />
GUID)<br />
◮ Ursprung DCE UUID (universal unique ID)<br />
◮ 128-bit ID mit expliziter Zuordnung menschenlesbarer Namen<br />
◮ eindeutig in Raum und Zeit<br />
• Binärstandard<br />
◮ Funktionsaufruf über vtables, Layout durch MS-C-Übersetzer<br />
◮ Plattformabhängig<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 231
Komponentenmodell<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 232<br />
Komponentenmodell<br />
MyComponent (DLL or EXE)<br />
IUnknown<br />
IUnknown<br />
IViewer<br />
(COM Interface)<br />
CoViewer<br />
(COM Object)<br />
ILoveCom<br />
IHateCom<br />
CoPersonality<br />
IUnknown<br />
ISecure<br />
IPersist<br />
CoSecure<br />
• Unterschied Komponente, Instanz <strong>eine</strong>r Komponente!<br />
Dr. Welf Löwe und Markus Noga 10
GUIDs und Versionen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 233<br />
• Klassen-ID (CLSID) bestimmt Komponente eindeutig<br />
• Schnittstellen-ID (IID) bestimmt Schnittstelle eindeutig<br />
• Was bedeutet Versionierung?<br />
◮ Neue Versionen von Komponenten<br />
◮ Neue Versionen von Schnittstellen<br />
• Neue Implementierungen <strong>eine</strong>r Schnittstelle verwenden<br />
◮ Entkoppele Erzeugung von Komponenten durch Fabriken<br />
◮ Aufruf von Funktionen über bekannte vtable<br />
◮ Auch bekannt <strong>als</strong>: Polymorphie<br />
• Neue Versionen <strong>eine</strong>r Schnittstelle verwenden<br />
◮ Fehlender Zusammenhang zwischen IIDs<br />
◮ In (D)COM ungelöst<br />
• Also: angebliche automatische Versionierung ist kein Hexenwerk
GUIDs: Vorteile und Nachteile<br />
• Vorteile<br />
◮ Sprachtransparenz<br />
◮ K<strong>eine</strong> Namenskollisionen<br />
◮ K<strong>eine</strong> fragile base classes<br />
◮ Verwenden der neuesten Implementierung einfach<br />
• Nachteile<br />
◮ Viele ähnliche Schnittstellen<br />
◮ Zusammenführen von Entwicklungen sehr schwer<br />
◮ Zusammenhänge zwischen Schnittstellen bleiben unklar<br />
◮ Verwenden der neuesten Schnittstellen schwer<br />
Wiederholung: zerbrechliche Oberklasse: Unterklassen sollen nicht immer neu<br />
übersetzt werden, nur weil sich die Oberklasse ändert<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 234
Interface IUnknown<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 235<br />
• Geerbt von allen COM Schnittstellen<br />
• Implementiert von allen COM Komponenten<br />
• Funktionalität<br />
◮ Schnittstellen <strong>eine</strong>r Instanz abfragen<br />
◮ Referenzzählen für <strong>eine</strong> Instanz<br />
interface IUnknown {<br />
virtual HRESULT QueryInterface(IID& iid, void** ppvObj) = 0;<br />
virtual ULONG AddRef() = 0;<br />
virtual ULONG Release() = 0;<br />
}
QueryInterface<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 236<br />
• Prüft ob <strong>eine</strong> Instanz <strong>eine</strong> Schnittstelle unterstützt<br />
• Liefert Zeiger auf <strong>eine</strong> Schnittstelleninstanz<br />
LPLOOKUP *pLookup;<br />
TCHAR szNumber[64];<br />
HRESULT hRes;<br />
// Call QueryInterface on the component object<br />
// PhoneBook, asking for a pointer to the ILookup<br />
// interface identified by a unique interface ID.<br />
hRes = pPhoneBook->QueryInterface(IID_ILOOKUP, &pLookup);<br />
if( SUCCEEDED( hRes ) ) {<br />
// use Ilookup interface pointer<br />
pLookup->LookupByName("Daffy Duck", &szNumber);<br />
// finished using the IPhoneBook interface pointer<br />
pLookup->Release();<br />
}
QueryInterface: Interpretation<br />
• Was passiert da?<br />
if(p instanceof L) {<br />
L l=(L) p;<br />
l.lookupByName(...);<br />
l.release();<br />
}<br />
• Typsysteme unterscheiden<br />
◮ Statischer Typ (Typ des Behälters), ändert sich durch Casts<br />
◮ Dynamischer Typ (Typ der Instanz), invariant<br />
• In COM nur Behältertyp, insbesondere p≠l!<br />
◮ Schnittstelleninstanz ≠ Komponenteninstanz<br />
◮ Verschlimmert aliasing<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 237
Referenzzähler und Lebenszyklus<br />
• Schnittstelle<br />
◮ AddRef: Neue Referenz auf Komponenteninstanz anmelden<br />
◮ Release: Bestehende Referenz freigeben<br />
Letzte Freigabe → Löschen der Komponenteninstanz<br />
• Einfach umsetzbar<br />
void AddRef () { refCount++; }<br />
void Release() { if(!(--refCount)) finalize(); }<br />
• Extrem fehlerträchtig<br />
◮ F<strong>als</strong>ches AddRef → floating garbage<br />
◮ F<strong>als</strong>ches Release → dangling reference<br />
◮ Kann k<strong>eine</strong> zirkulären Referenzen erkennen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 238
Interface IClassFactory<br />
• Allgem<strong>eine</strong> Fabrik für Komponenteninstanzen<br />
• Eine Instanz der Fabrik pro Rechner<br />
◮ CreateInstance: Neue Komponenteninstanz erzeugen<br />
◮ LockServer: Schnellere Erzeugung (nichtfunktional)<br />
• Problem: CreateInstance liefert IUnknown<br />
• Daher nicht statisch typsicher<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 239
COM Bibliothek<br />
• Implementiert Standard-Funktionen für Kommunikation<br />
• Selbst <strong>eine</strong> (System-)Komponente<br />
◮ Laufzeitunterstützung von COM<br />
◮ Dynamische Bibliotheken<br />
◮ COMPOBJ.DLL, OLE32.DLL<br />
• Verantwortlich<br />
◮ Erzeugung von Instanzen<br />
◮ Herstellen und Koordinieren von Verbindungen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 240
Registratur (registry)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 241<br />
• Übernommen aus COM<br />
• Verwaltet Schnittstellen, Implementierungen von Klassen<br />
◮ registry in NT 4.0 und Nachfolgern: hierarchische Datenbank<br />
◮ Entspricht CORBA interface/implementation repositories<br />
◮ Schlüssel: CLSID<br />
• service control manager (SCM) kapselt registry<br />
◮ findet Klassen und ihren Code in der Registratur<br />
◮ aktiviert Fabrik <strong>eine</strong>m Prozeß<br />
◮ erzeugt Objekte aktiver Fabriken
Einträge<br />
Einträge<br />
Servertyp<br />
Pathname of server EXE<br />
(local, out-of-process)<br />
CLSID<br />
12345678-ABCD-1234-5678-9ABCDEF00000<br />
Server Code<br />
LocalServer32 = C:\MyDir\MyServer.exe<br />
12345678-ABCD-1234-5678-9ABCDEF00012<br />
InprocServer32 = C:\object\textrend.dll<br />
Pathname of server DLL<br />
(in-process)<br />
Dr. Welf Löwe und Markus Noga 29<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 242
Reihenfolge der Suche<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 243<br />
Reihenfolge der Suche<br />
Client<br />
1<br />
3<br />
SCM<br />
COM Cache<br />
...<br />
2<br />
4<br />
5<br />
Registry<br />
InprocServer<br />
LocalService<br />
LocalServer<br />
Dr. Welf Löwe und Markus Noga 33
Zugriff <strong>eine</strong>r Komponente<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 244<br />
Zugriff <strong>eine</strong>r Komponente<br />
Client<br />
Client<br />
Application<br />
(1) Anfrage mit<br />
CLSID<br />
(5) Aufruf<br />
Object<br />
Interface<br />
(4)<br />
Objekt Interface<br />
Zeiger an Klienten<br />
Server<br />
Object<br />
(3) Finde (Objekt-)<br />
Implementierung,<br />
Lade server code<br />
COM<br />
Bibliothek<br />
Registry<br />
CLSID<br />
Server<br />
Code<br />
(2) Nachschlagen<br />
in der Registry
Erzeugen des Objekts<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 245<br />
Erzeugen des Objekts<br />
Client<br />
Server<br />
(7)<br />
Client<br />
Application<br />
(6)<br />
IClassFactory<br />
Object<br />
(5) Erzeuge Objekt<br />
Fabrik<br />
(1) CoCreateInstance<br />
(4)<br />
(3)<br />
SCM<br />
(2)<br />
Registry<br />
Dr. Welf Löwe und Markus Noga 30
Erzeugen der Fabrik<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 246<br />
Erzeugen der Fabrik<br />
Client<br />
Server<br />
Client<br />
Application<br />
(5) CreateInstance<br />
IClassFactory<br />
Object Object<br />
Fabrik<br />
(5‘) Erzeuge Objekt<br />
(1) CoGetClassObject<br />
(6)<br />
(4)<br />
(3)<br />
SCM<br />
(2)<br />
Registry<br />
Dr. Welf Löwe und Markus Noga 31
DCOM: verteiltes COM<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 247<br />
COM<br />
Standard für<br />
Interoperabität<br />
zwischen<br />
Adreßräumen auf<br />
<strong>eine</strong>m Rechner<br />
−→<br />
DCOM<br />
Standard für<br />
Interoperabität<br />
zwischen<br />
Rechnern<br />
• Lokale Transparenz<br />
• Fernaktivierung<br />
• Fernaufruf<br />
• Management für Nebenläufigkeit<br />
• Management für Sicherheit<br />
• Alles bereits im Design von COM vorbereitet
Transparenz<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 248<br />
Transparenz<br />
Gleicher<br />
Prozess<br />
Client<br />
Component<br />
Gleiche<br />
Maschine<br />
Client Process<br />
Client<br />
COM<br />
Server Process<br />
Component<br />
Über<br />
Rechner-<br />
grenze<br />
Client<br />
Client Machine<br />
COM<br />
DCE<br />
RPC<br />
Server Machine<br />
COM<br />
Component
DCOM Aufruf<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 249<br />
DCOM Aufruf<br />
Basiert auf DCE (RPC)<br />
Objektorientierter RPC (ORPC)<br />
• Basiert auf DCE (RPC)<br />
• Objektorientierter – RPC + Dispatch RPC (ORPC)<br />
◮ RPC Plattformneutral, + Dispatch integriert in Windows<br />
• im Prinzip plattformneutral, integriert in Windows<br />
COM<br />
Machine A<br />
Distributed COM<br />
DCE RPC<br />
ORPC<br />
RPC<br />
Machine B<br />
Distributed COM<br />
DCE RPC<br />
COM<br />
Dr. Welf Löwe und Markus Noga 37
Distributed Computing Environment (DCE)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 250<br />
Distributed Computing Environment (DCE)<br />
Distributed Applications<br />
Time<br />
Service<br />
Cell /<br />
Global<br />
Directory<br />
Service<br />
Security<br />
Service<br />
Distributed<br />
File<br />
System<br />
Diskless<br />
Support<br />
Remote Procedure Call<br />
Thread Service<br />
Local OS and Transportation Services<br />
Dr. Welf Löwe und Markus Noga 38
Kommunikation in DCE<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 251<br />
Communikation in DCE<br />
Client<br />
(Application<br />
program)<br />
virtual<br />
Connection<br />
Server<br />
(Application<br />
program)<br />
RPC - Interface<br />
Client<br />
Stub<br />
Server<br />
Stub<br />
Runtime<br />
Interface<br />
Transport<br />
Interface<br />
RPC Runtime<br />
Services<br />
Transport<br />
Services<br />
Remote Call<br />
Return<br />
RPC Runtime<br />
Services<br />
Transport<br />
Services<br />
Dr. Welf Löwe und Markus Noga 39
Kommt uns bekannt vor...<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 252<br />
Kommt bekannt vor...<br />
IDL-File<br />
idl<br />
Client Stub<br />
Header File<br />
Server Stub<br />
RPC<br />
Runtime<br />
Client Appl.<br />
#include<br />
Server Appl.<br />
RPC<br />
Runtime<br />
Link<br />
Link<br />
Client<br />
Server<br />
Dr. Welf Löwe und Markus Noga 40
Interface Definition<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 253<br />
• Microsoft Interface Definition Language (MIDL)<br />
• Erweiterung von DCE IDL<br />
• Erzeugung von nutzerdefinierten Schnittstellen<br />
• Nicht neu, aber anders!
Transparenz<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 254<br />
Transparenz<br />
Client<br />
Process<br />
Client<br />
App<br />
DLL<br />
In-<br />
Process<br />
Object<br />
In-Process<br />
Server<br />
Local<br />
Object<br />
Proxy<br />
Remote<br />
Object<br />
Proxy<br />
COM<br />
lightweight<br />
RPC<br />
(local)<br />
RPC RPC<br />
(network)<br />
Local Server Process<br />
Stub<br />
COM<br />
Stub<br />
COM<br />
EXE<br />
Local<br />
Object<br />
Local<br />
Server<br />
Remote Server<br />
Machine<br />
Remote Server<br />
Process<br />
Remote<br />
Object<br />
Remote<br />
Server<br />
Dr. Welf Löwe und Markus Noga 42
Fernzugriff in DCOM<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 255<br />
Fernzugriff in DCOM<br />
Client<br />
1<br />
SCM<br />
7<br />
1<br />
SCM<br />
3<br />
3<br />
COM<br />
Cache...<br />
2<br />
4<br />
5<br />
6<br />
Registry<br />
InprocServer<br />
NTService<br />
LocalServer<br />
RemoteServer<br />
COM<br />
Cache...<br />
2<br />
4<br />
5<br />
6<br />
Registry<br />
NTService<br />
LocalServer<br />
RemoteServer<br />
DLLSurrogate<br />
Dr. Welf Löwe und Markus Noga 43
Wie CORBA<br />
• Marshalling<br />
◮ Übermittlung von Daten in verteilten Systemen mittels<br />
Serialisierung/Deserialisierung<br />
◮ generiert aus IDL-Spezifikationen<br />
• Statischer und dynamischer Aufruf über Makler möglich<br />
• Objekte auf dem Server können sequentiell oder mehrfädig sein<br />
◮ ein Faden im Adreßraum (Apartment, apartment model)<br />
◮ vielfädiger Adreßraum (free threading model)<br />
• Jedes Objekt unterstützt die Schnittstelle IUnknown zur Reflexion<br />
• Jedes Objekt trägt eindeutigen Identifikator OBJREF bestehend aus:<br />
◮ OXID (Object Exporter Identifier ), Bezeichner für Adreßraum<br />
(Apartment)<br />
◮ OID (Object Identifier ), Objekt im Adreßraum<br />
◮ IPID (Interface Pointer Identifier ), Schnittstelle in <strong>eine</strong>m Adreßraum<br />
• Persistenzdienste<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 256
Persistente Objekte<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 257<br />
Spitznamen (Moniker ) kapseln Persistenz von Objekten<br />
• entsprechen CORBA-Objektadaptern (BOAs) auf Serverseite<br />
• Wie Stellvertreterobjekte<br />
◮ Einer pro Objekt<br />
◮ Nicht <strong>eine</strong>r pro Servicekomponente<br />
• Namensraum beliebig (meist URL)<br />
◮ können hierarchisch strukturiert sein
Vermitteln in DCOM (broking)<br />
• Broker nicht explizit ansprechbar (kein ORB-Konzept)<br />
◮ Statt dessen werden Stellvertreterobjekte, die das entfernte Objekt in<br />
der eigenen Komponente vertreten (proxy-Objekte), angesprochen.<br />
• Standardfall: dynamischer Aufruf flüchtiger, nicht-persistenter Objekte<br />
◮ Klasse finden und aktivieren, dann Objekte erzeugt<br />
◮ Allokation von Objekten mit abstrakter Fabrik auf Server, die die<br />
Verteilung verbirgt (IClassFactory ist Objektfabrik)<br />
◮ Ansprechen der entfernten Objekte per OBJREF oder per Stellvertreter<br />
◮ Entferntes, dynamisch aufgerufenes Objekt muß die Schnittstelle<br />
IDispatch (indirekte Aufrufschnittstelle invoke(method,args)) selbst<br />
implementieren (k<strong>eine</strong> Unterstützung durch Broker)<br />
• Statischer Aufruf, wenn Stellvertreter und Objekt identisch<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 258
Fassadenkomponenten<br />
• Zusammengesetzte Komponenten, die Fassadenobjekte enthalten<br />
◮ Mehrere Schnittstellen pro Komponente werden auf verschiedene<br />
interne Objekte mithilfe <strong>eine</strong>s Fassadenobjektes delegiert<br />
◮ Mächtiger aber langsamer <strong>als</strong> Mehrfachvererbung, denn<br />
Mehrfachvererbung ersetzt Delegation durch zusammenhängendes<br />
Speicherlayout <strong>eine</strong>s Objektes<br />
Delegation und Aggregation: Indirektion aber k<strong>eine</strong> Layout- und<br />
Namenskonflikte<br />
• Schnittstellen bei Allokation festgelegt<br />
◮ Abhängig von Zusammensetzung der Komponente<br />
◮ Evtl. statisch nicht sichtbar (Rekursion)<br />
◮ Nicht dynamisch um neue Dienste erweiterbar<br />
Fassadenobjekt: Objekt, das mehrere Schnittstellen <strong>als</strong> <strong>eine</strong> ersch<strong>eine</strong>n läßt.<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 259
Komponentenkategorien<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 260<br />
Komponenten, die die gleiche Menge von Schnittstellen erfüllen, gehören zur<br />
gleichen Kategorie (Schlüssel CATID)<br />
• Ersatz für Vererbung von Eigenschaftsschnittstellen<br />
• Eine Kategorie beschreibt Merkmale<br />
• Verwaltet durch den Kategorien-Manager<br />
CLSID_StdComponentCategoriesMgr<br />
• Registrierung und Abmeldung von Kategorien in der Registratur
Dienste in DCOM<br />
• Vorhandene Dienste: (services)<br />
◮ Alle Microsoft-Werkzeuge (Word, Excel, Powerpoint, Access, . . . ),<br />
aber Funktionen nicht standardisiert!<br />
◮ Referenzzählende Speicherbereinigung<br />
◮ Microsoft Transaction Server (MTS) ermöglicht flache und<br />
geschachtelte Transaktionen<br />
◮ Ereignisdienst (publisher/subscriber pattern):<br />
Schnittstelle registrieren<br />
Aufruf bei Auslösung des Ereignisses (outgoing interface)<br />
Schnittstelle durch connection point Objekt repräsentiert.<br />
Publisher erfüllen IconnectionPointContainer<br />
K<strong>eine</strong> eigenständigen Ereignisobjekte.<br />
• Fehlende Dienste<br />
◮ Makler<br />
◮ Lizenzierung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 261
Diskussion<br />
• Kein offener, sondern ein proprietärer Standard<br />
◮ K<strong>eine</strong> standardisierten Dienste<br />
◮ Änderungen jederzeit möglich und schon öfters durchgeführt<br />
• Sprachen und Plattformen<br />
◮ Ursprünglich C++ / Windows<br />
◮ Jetzt Brücken für andere Sprachen (VisualBasic, MS Java).<br />
◮ Erzeugen das Aufrufformat des Microsoft C++-Übersetzers<br />
◮ EntireX DCOM für Unix (Software AG)<br />
• Probleme mit der Sicherheit<br />
◮ kein Behälterkonzept, das Sicherheit prüfen könnte<br />
◮ DCOM ist binärer Standard - Binärcodes (Viren)<br />
◮ I love you virus: ein VDB script wird ausgeführt und wirft die<br />
Mailerkomponente an, die lawinenartig Mails verschickt<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 262
Die Konkurrenz<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 263<br />
• DCOM ist wegen der Marktdominanz von Microsoft nicht mehr aus dem<br />
Komponentenmarkt wegzudenken.<br />
• Es gibt Brücken<br />
◮ von Corba nach DCOM,<br />
◮ von Java nach DCOM,<br />
◮ von Java nach Corba,<br />
◮ Nebeneinander der Ansätze möglich.<br />
• Java (EJB) - härtester DCOM-Konkurrent.
.NET: Ziele<br />
• Ziele:<br />
◮ Sprachtransparenz<br />
◮ Plattformabhängigkeit,<br />
weil .NET auf Windows am besten unterstützt wird.<br />
◮ Ortstransparenz: Web-Dienste<br />
◮ Reflexion<br />
◮ Versionierung<br />
◮ Dynamisches Laden: Es gibt genau <strong>eine</strong>n Klassenlader<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 264
.NET - Literatur<br />
• W. Beer, D. Birngruber, H. Mössenböck, A. Wöß: Die .NET-Technologie.<br />
dpunkt.verlag 2003<br />
• Michael Stal: C#- und .NET-Tutorial, iX 12/2001 - 02/2002.<br />
• J. Gough: Stacking Them Up: A Comparison of Virtual Machines. ACSAC<br />
2001.<br />
• J. Gough: Compiling for the .NET Commmon Language Runtime (CLR).<br />
Prentice-Hall, 2002.<br />
• Mono Projekt, Open Source Implementierung des .NET Rahmensystems<br />
http://www.go-mono.com/, V 0.23, 2003<br />
• Portable .NET, Freie Implementierung von .NET und C#<br />
http://www.southern-storm.com.au/portable_net.html<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 265
.NET: Sprachtransparenz<br />
• Plattform zur Integration vieler Programmiersprachen durch<br />
◮ Umfangreiches Typsystem (Common Type System, CTS)<br />
Minimales Teilsystem von Typen für Interoperabilität<br />
(Common Language Specification, CLS)<br />
◮ Laufzeitumgebung (Common Language Runtime, CLR)<br />
Kellermaschine<br />
(Zwischensprache: CIL = Common Intermediate Language,<br />
Synonym: MSIL = Microsoft Intermediate Language)<br />
automatische Speicherbereinigung<br />
Versionierung ohne DLL-Hell<br />
Sicherheitsmechanismen<br />
◮ objektorientierte Klassenbibliothek für<br />
graphische Benutzeroberflächen (Windows Forms)<br />
Web-Oberflächen (Web Forms)<br />
Datenbankanschluß (ADO.NET)<br />
Behälterklassen (Collections)<br />
Parallele Ausführungsfäden (Threads)<br />
Reflexion<br />
etc.<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 266
Sprachunabhängiges Objektmodell I (CTS)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 267<br />
• Objektmodell heißt Common Type System (CTS):<br />
◮ Menge der Typen, die <strong>eine</strong> beliebige .NET-Programmiersprache<br />
verwenden darf: Kein Minim<strong>als</strong>ystem<br />
◮ Alle Datentypen sind Objekte (k<strong>eine</strong> Zweiklassengesellschaft)<br />
◮ Unterscheidung von<br />
Werttypen (value types): Datentypen, Aufzählungstypen (enum) und<br />
benutzerdefinierte Werttypen (struct)<br />
Referenztypen (reference types): Reihungen, Klassen, getypte<br />
Funktionszeiger (Delegates), Zeiger<br />
◮ Boxing: Konvertierung <strong>eine</strong>s Wertobjekts in ein Referenzobjekt<br />
◮ Unboxing: Konvertierung <strong>eine</strong>s Referenzobjekts in ein Wertobjekt
Sprachunabhängiges Objektmodell II (CLS)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 268<br />
• CLS (Common Language Specification) = minimales Typsystem<br />
• Zweck: Interoperabilität der .NET-Sprachen<br />
◮ Untermenge der CTS-Eigenschaften und -Typen, die jeder Übersetzer<br />
<strong>eine</strong>r .NET-Sprache unterstützen muß, wenn die Sprache mit Typen<br />
aus anderen CLS-konformen Sprachen arbeiten will.<br />
◮ Alle exportierten Typen und Schnittstellen müssen die (41)<br />
CLS-Richtlinien einhalten, z. B.:<br />
CLS-Regel 15: Die Typen von Reihungselementen müssen<br />
CLS-konform sein. Reihungen müssen <strong>eine</strong> fixe Anzahl von<br />
Dimensionen haben und ihr Index muß bei 0 beginnen. . . .
Datentypen des CTS<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 269<br />
CIL abgebildet auf Beschreibung<br />
Systembibliothek<br />
bool System.Boolean 1 Byte, 0 = . f<strong>als</strong>e, ≠ 0 = . true<br />
char System.Char 16-Bit Unicode Zeichen<br />
string System.String Unicode-Text<br />
object System.Object verwalteter Verweis auf Halde<br />
typedref System.TypedReference Paar (Verweis, Typ)<br />
float32 System.Single IEEE-Gleitpunktzahl 32 Bit<br />
float64 System.Double IEEE-Gleitpunktzahl 64 Bit<br />
int8 System.SByte 2 Komplement Zahl: 8Bit<br />
int16 System.Int16 2 Komplement Zahl: 16Bit<br />
int32 System.Int32 2 Komplement Zahl: 32Bit<br />
int64 System.Int64 2 Komplement Zahl: 64Bit<br />
unsigned int8 System.Byte vorzeichenlose Zahl: 8Bit<br />
unsigned int16 System.UInt16 vorzeichenlose Zahl: 16Bit<br />
unsigned int32 System.UInt32 vorzeichenlose Zahl: 32Bit<br />
unsigned int64 System.UInt64 vorzeichenlose Zahl: 64Bit<br />
native int System.IntPtr maschinenabhängig m. Vorz.<br />
native unsigned int System.UIntPtr maschinenabhängig o. Vorz.<br />
nicht in CLS: typedref, int8, unsigned int16, unsigned int32, unsigned int64,<br />
native unsigned int
CLR<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 270<br />
CLR<br />
• ist Laufzeitumgebung für .NET-Anwendungen (Ähnlichkeit zu Java) und<br />
• basiert auf abstrakter Kellermaschine, die ausschließlich Anweisungen des<br />
Zwischencodes CIL verarbeitet.
CIL Beispiel<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 271<br />
public static Point operator+(Point op1, Point op2) {<br />
return new Point(op1.x+op2.x,op1.y+op2.y);<br />
}<br />
→<br />
.method public hidebysig specialname static<br />
valuetype ComplexNumbers.Point op_Addition(valuetype ComplexNumbers.Point op1,<br />
valuetype ComplexNumbers.Point op2) cil managed<br />
{<br />
// Code size 40 (0x28)<br />
.maxstack 4<br />
.loc<strong>als</strong> ([0] valuetype ComplexNumbers.Point CS$00000003$00000000)<br />
IL_0000: ldarga.s op1<br />
IL_0002: call instance float64 ComplexNumbers.Point::get_x()<br />
IL_0007: ldarga.s op2<br />
IL_0009: call instance float64 ComplexNumbers.Point::get_x()<br />
IL_000e: add<br />
IL_000f: ldarga.s op1<br />
IL_0011: call instance float64 ComplexNumbers.Point::get_y()<br />
IL_0016: ldarga.s op2<br />
IL_0018: call instance float64 ComplexNumbers.Point::get_y()<br />
IL_001d: add<br />
IL_001e: newobj instance void ComplexNumbers.Point::.ctor(float64,<br />
float64)<br />
IL_0023: stloc.0<br />
IL_0024: br.s IL_0026<br />
IL_0026: ldloc.0<br />
IL_0027: ret<br />
} // end of method Point::op_Addition
Vergleich zu Java(-Bytecode)<br />
public static Point plus(Point p1, Point p2) {<br />
return new Point(p1.getX() + p2.getX(), p1.getY() + p2.getY());<br />
}<br />
→<br />
public static Point plus(Point arg0, Point arg1)<br />
Code(max_stack = 8, max_loc<strong>als</strong> = 2, code_length = 26)<br />
0: new (9)<br />
3: dup<br />
4: aload_0<br />
5: invokevirtual Point.getX ()D (10)<br />
8: aload_1<br />
9: invokevirtual Point.getX ()D (10)<br />
12: dadd<br />
13: aload_0<br />
14: invokevirtual Point.getY ()D (11)<br />
17: aload_1<br />
18: invokevirtual Point.getY ()D (11)<br />
21: dadd<br />
22: invokespecial Point. (DD)V (12)<br />
25: areturn<br />
Man beachte:<br />
• Java Bytecode enthält getypte Operatoren (dadd), weil der Bytecode<br />
interpretiert wird (werden kann)<br />
• CIL Operatoren sind typfrei (add), weil CIL nicht interpretiert wird<br />
(werden kann), sondern immer in Maschinensprache übersetzt wird.<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 272
.NET-Laufzeitsystem<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 273<br />
• CIL-Code wird nicht interpretiert, sondern vom VES (virtual execution<br />
system) in Maschinencode übersetzt, entweder vor der<br />
Programmausführung oder währenddessen.<br />
• .NET-Laufzeitumgebung enthält<br />
◮ Just-in-time Übersetzer (JIT)<br />
◮ Speicherbereiniger (Garbage Collector)<br />
◮ Klassenlader (Class Loader): Dynamisches Laden von Päckchen<br />
◮ Codeinspektor (Verifier): Prüft CIL-Programme auf Typsicherheit.
Code- und Datenverwaltung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 274<br />
• Verwalteter Code (Managed Code): Ausführung erfolgt unter Aufsicht der<br />
.NET-Laufzeitumgebung.<br />
• Nicht-verwalteter Code (Unmanaged Code): sonstiger Code<br />
• Interoperabilität zwischen ”<br />
managed“ und ”<br />
unmanaged“ Code:<br />
◮ Einbinden von existierenden DLLs mit P/Invoke (Platform Invoke)<br />
◮ COM/COM+-Anbindung über die COM-Interop-Abbildung<br />
• Verwaltete Daten (Managed Data): Vom Speicherbereiniger verwaltete,<br />
nicht persistente Daten.<br />
• Nicht-verwaltete Daten (Unmanaged Data (Unsafe Code)): Manuell vom<br />
Programmierer allozierte und deallozierte Daten.<br />
• Achtung: In verwaltetem Code darf der Programmierer sowohl verwaltete<br />
<strong>als</strong> auch nicht-verwaltete Daten verwenden.
Codeprüfung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 275<br />
• Problem: Unsafe Code, insbesondere Zeigerarithmetik<br />
⇒ Codeprüfung durch Verifizierer und Klassenlader<br />
◮ Verifizierer prüft konservativ vor Übersetzung in Maschinencode, ob<br />
sich das Programm an alle Regeln bezüglich Speicherzugriffen hält:<br />
Das Programm greift nur auf Speicherbereiche zu, die für es<br />
eingerichtet wurden.<br />
Das Programm verwendet Objekte nur über deren Schnittstelle.<br />
◮ Klassenlader prüft, ob alle Eingangswerte die vorgeschrieben<br />
Typsignatur aufweisen.<br />
• Verifizierer abschaltbar: Verwendung von Zeigerarithmetik oder<br />
Funktionszeigern möglich<br />
⇒ Unterstützung von ANSI C, Mehrfachvererbung
Päckchen (Assemblies)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 276<br />
Päckchen = .NET-Komponente:<br />
• Logische Einheit ähnlich DLL oder EXE<br />
• Atomare Einheit bzgl. Installation, Konfiguration, Sicherheit,<br />
Versionierung und Laufzeitmanagement<br />
• Beim Laden des Päckchens aktiviert das VES <strong>eine</strong>n so genannten Runtime<br />
Host, der die Kontrolle über Übersetzung und Ausführung übernimmt.
Päckchen: Inhalt<br />
Päckchen enthält:<br />
• Ein oder mehrere Module (Program Executables, PE): ausführbarer Code<br />
für die bereitgestellten Typen des Moduls<br />
• Versionsnummer (strong name) spezifiziert durch .assembly:<br />
◮ Name<br />
◮ Version: (Major.Minor.Build.Revision)<br />
◮ Sprache (en-US, de-DE, . . . )<br />
◮ Öffentlicher Schlüssel des Produzenten<br />
• Manifest-Information, die innerhalb <strong>eine</strong>s Moduls oder global im Päckchen<br />
sein kann:<br />
◮ Identifiziert die zum Päckchen gehörenden Module und Ressourcen<br />
◮ Bedarfsschnittstelle: detaillierte Information über Referenzen auf<br />
importierte Päckchen<br />
◮ Angebotsschnittstelle: exportierte Typen und Ressourcen<br />
• Kennzeichnung der CLR-Version mit der das Päckchen ausgeführt werden<br />
will.<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 277
Päckchen: Reflexion und Verwaltung (Versionierung)<br />
• Metadaten sind explizit im Päckchen vorhanden (generiert).<br />
• Metadaten sind<br />
◮ Defintionstabellen: Beschreiben Elemente, die in dem Modul selbst<br />
definiert sind.<br />
◮ Referenztabellen: Beschreiben Elemente, die im Modul nicht definiert<br />
sind, aber verwendet werden.<br />
◮ Manifest(tabellen)<br />
• dynamische Abfrage mit Reflexionsmechanismen<br />
• Metadaten + Reflexionsmechanismen<br />
⇒<br />
◮ k<strong>eine</strong> IDL mehr<br />
◮ k<strong>eine</strong> Registratur von Päckchen (k<strong>eine</strong> Registry ) mehr:<br />
Ablage von Päckchen im <strong>Datei</strong>system<br />
private Päckchen liegen im lokalen Verzeichnisbaum der Anwendung<br />
gemeinsame Päckchen liegen meist in globalem Verzeichnis (Global<br />
Assembly Cache):<br />
Installation erfordert Signieren mit privatem Schlüssel<br />
· Vermeidung von Namenskollisionen durch strong name<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 278
Versionierung und Nebeneinanderausführung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 279<br />
• Versionierung:<br />
⇒ Nebeneinanderausführung verschiedener Versionen <strong>eine</strong>s Programms.<br />
⇒ Gleichzeitige Ausführung verschiedener Versionen <strong>eine</strong>r Komponente in<br />
demselben Prozeß.<br />
• Abschirmung: Einteilung des CLR-Prozesses in abgeschirmte Bereiche<br />
(Application Domains) für auszuführende Applikationen
C#<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 280<br />
Man nehme Java . . . und füge hinzu/ändere:<br />
• Werttypen, z.B. Verbundtypen (Wertklassen, die auch Methoden<br />
enthalten können)<br />
• Aufzählungstypen<br />
• Parameterübergabe: Wert-, Referenz- oder Ergebnisaufruf<br />
• vernünftige Reihungen<br />
• Überladen von Operatoren<br />
• foreach-Schleife mit indexer : Strom über collections, Reihungen, Texte,<br />
aber nur ein Strom pro Objekt<br />
• weitergehende Reflektion <strong>als</strong> Java<br />
• delegates (Variable, die Mengen von Methoden enthalten können, die alle<br />
zugleich aufgerufen werden)<br />
• Attribute: Objekte, die mit Klassen, Methoden, Päckchen assoziiert sind<br />
• properties: Attribute mit expliziten set/get-Methoden (auch in<br />
Schnittstellenklassen!)<br />
• events: spezielle, nur lokal sichtbare delegates<br />
• geschachtelte Referenz- und Werteklassen<br />
• unsichere Klassen/Methoden (unsafe); sie erlauben Adreßarithmetik<br />
Hauptunterschied: für die CIL gibt es k<strong>eine</strong>n Interpretierer; es wird alles in<br />
Maschinencode übersetzt
C#: Attribute<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 281<br />
• Attribute sind Objekte <strong>eine</strong>r Unterklasse der Klasse System.Attribute.<br />
• Attribute werden automatisch mit <strong>eine</strong>r Klasse, Methode, <strong>eine</strong>m<br />
Parameter oder <strong>eine</strong>m Päckchen assoziiert, indem man vor deren<br />
Vereinbarung in eckigen Klammern <strong>eine</strong>n Konstruktor angibt:<br />
[Serializable] class Liste { ...}<br />
• Die Existenz, Merkmale und Methoden des Attributs kann man zur<br />
Laufzeit abfragen bzw. aufrufen.<br />
• Auch mehrere Attribute können gleichzeitig hinzugefügt werden.<br />
• Eigentlich ist das ein beschränkter Ersatz für Mehrfachvererbung<br />
• (Die Existenz von Attributen kann von Präprozessorkommandos abhängig<br />
sein.)<br />
• Attribute sind <strong>als</strong>o benutzerdefinierte Metainformationen.
C#-Attribute: Beispiel<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 282<br />
Attribut zur Kennzeichnung des Autors des Codes:<br />
[AuthorIs("Gerhard")]<br />
class MyClass {<br />
...<br />
}<br />
Definition des AuthorIs-Attributs:<br />
[AttributeUsage(AttributeTargets.All)]<br />
public class AuthorIsAttribute : Attribute {<br />
private string m_Name;<br />
public AuthorIsAttribute(string name) {<br />
m_Name = name; }<br />
}<br />
• Die Attributklasse ist selbst rekursiv mit <strong>eine</strong>m Attribut deklariert, das<br />
spezifiziert, daß AuthorIs für beliebige Elemente anwendbar sein soll<br />
(AttributeTargets.All).<br />
• Alternative: Beschränkung des Attributs auf Klassen mit<br />
AttributeTargets.Class
C#-Attribute: Zugriff<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 283<br />
class MainClass {<br />
public static void Main() {<br />
foreach (object attribute in<br />
typeof(MyClass).getCustomAttributes(AuthorIsAttribute,f<strong>als</strong>e)) {<br />
Console.WriteLine(attribute);<br />
}<br />
}<br />
}
C#: Properties<br />
public struct Point {<br />
private double m_x;<br />
private double m_y;<br />
...<br />
public double x {<br />
set { m_x = value; }<br />
get { return m_x; }<br />
}<br />
}<br />
Zugriff auf obige Eigenschaft:<br />
Point q = new Point();<br />
q.x = 20;<br />
// set-Methode wird implizit aufgerufen<br />
Console.WriteLine(q.x); // get-Methode wird implizit aufgerufen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 284
C#: Properties, Spezialfall: Indexer<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 285<br />
public double this[CoordinateKind which] {<br />
get { if (which == CoordinateKind.X) return m_x;<br />
else return m_y; }<br />
set { if (which == CoordinateKind.X) m_x = value;<br />
else m_y = value; }<br />
}<br />
Zugriff:<br />
p[Point.CoordinateKind.X] = 22;<br />
p[Point.CoordinateKind.Y] = 33;
Gültigkeitsbereiche und Vererbung in C#<br />
• Blockschachtelungsregelungen wie üblich<br />
• Parameter gehören zum Gültigkeitsbereich des Prozedurrumpfs<br />
• Die for-Schleife definiert ihren Zähler <strong>als</strong> neue, schleifenlokale Variable<br />
• internal: Ein so vereinbarter Name ist in allen in <strong>eine</strong>m Päckchen<br />
zusammengefaßten Programmeinheiten bekannt<br />
• Vererbung:<br />
◮ private und public wie üblich; Grundannahme ohne Spezifikation ist<br />
private<br />
◮ protected: nur in der eigenen und in Unterklassen sichtbar<br />
◮ virtual, override: für polymorphen Zugriff muß <strong>eine</strong> Methode in der<br />
Oberklasse <strong>als</strong> virtuell vereinbart sein; sie kann dann in der Unterklasse<br />
überschrieben werden<br />
◮ virtual, new: virtual nicht zwingend erforderlich; die Unterklasse<br />
verdeckt die Vereinbarung in der Oberklasse, k<strong>eine</strong> Polymorphie möglich<br />
◮ Für Überschreiben und Verdecken ist identische Signatur nötig, sonst<br />
liegt Überladen vor.<br />
◮ Eine Klasse, von der nicht mehr geerbt werden kann, heißt in C#<br />
sealed<br />
◮ Vererben von Wertklassen ist verboten; aber diese können von<br />
Schnittstellenklassen erben<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 286
C#: Namensräume<br />
• Hierarchische Namensräume: Java-ähnliches Paketkonzept, können<br />
Klassen, Aufzählungstypen, Delegierte und andere Namensräume<br />
enthalten:<br />
namespace MyNameSpace { ... }<br />
• k<strong>eine</strong> Abbildung auf gleichnamige Verzeichnishierarchien und <strong>Datei</strong>namen<br />
• Klassen außerhalb <strong>eine</strong>s expliziten Namensraums gehören zu <strong>eine</strong>m<br />
anonymen Namensraum<br />
• Namensräume können auf mehrere Quelldateien verteilt sein<br />
• Alle Bezeichner der zu <strong>eine</strong>m Namensraum gehörigen Einheiten sind im<br />
gesamten Namensraum sichtbar<br />
• Angabe einzubindender existierender Pakete durch Übersetzerschalter:<br />
/reference <br />
• Verwendung von Typen aus anderen Namensräumen:<br />
◮ vollqualifizierte Punktnotation, z. B. System.Console.WriteLine<br />
◮ Abkürzung durch using-Anweisung, ähnlich import in Java.<br />
◮ Bezeichner aus anderen Namensräumen müssen dort mit public oder<br />
internal vereinbart sein.<br />
• .NET-Päckchen können mehrere öffentliche Klassen enthalten,<br />
• auch mehrere Klassen mit <strong>eine</strong>r statischen Main-Methode: Man muß dem<br />
Übersetzer dann mitteilen, welchen Einstiegspunkt er konkret verwenden<br />
soll.<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 287
C#-Beispiel<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 288<br />
• HelloWorld.cs:<br />
using System;<br />
namespace MyNameSpace<br />
{<br />
public class MyFirstExample<br />
{<br />
public static void Main(string[] args)<br />
{<br />
Console.WriteLine("Hallo {0} im Jahr 1", "<strong>IPD</strong>", 2003);<br />
}<br />
}<br />
}
Implementierungen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 289<br />
Es gibt mindestens drei Implementierungen:<br />
• sscli: die offizielle Implementierung von Microsoft für win und FreeBSD,<br />
die zentrale Laufzeitumgebung heißt ”<br />
rotor“<br />
• sscli linux 20020821: Adaption von sscli an Linux<br />
unter Redhat 7.3 und 8.0 einwandfrei installiert<br />
◮ aber Vorsicht: sscli linux belegt samt Doku > 1,1GB und übersetzt<br />
selbst auf Gigahertz-Maschinen mehr <strong>als</strong> <strong>eine</strong> halbe Stunde!<br />
• mono-0.16: open source Implementierung der ECMA-Standards (von<br />
XIMIAN)<br />
• pnet: <strong>eine</strong> australische open source Implementierung,<br />
noch nicht ausprobiert, enthält <strong>eine</strong>n C → CLR Übersetzer<br />
Wegen der Lizenzbedingungen sollte man k<strong>eine</strong>n sscli-Code von MS im<br />
Zusammenhang mit eigenen Entwicklungen lesen! Auch der<br />
Leistungsvergleich sscli vs. andere CLR-Implementierung ist verboten!
Ortstransparenz: .NET-Remoting<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 290<br />
• Transparenter Fernaufruf:
Entferntes Objekt<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 291<br />
using System;<br />
namespace RemoteObject<br />
public class Grid : System.MarshalByRefObject {<br />
const int LENGTH = 10;<br />
double [,] matrix = new double[LENGTH,LENGTH];<br />
public Grid() { Console.WriteLine("Ready!"); }<br />
~Grid() { Console.WriteLine("Destroyed!"); }<br />
public int Length { get { return LENGTH; } }<br />
public double this[int i1, int i2] {<br />
set {<br />
if (OutOfBounds(i1,i2)) throw new ArgumentException();<br />
else matrix[i1,i2] = value;<br />
}<br />
get {<br />
if (OutOfBounds(i1,i2)) throw new ArgumentException();<br />
else return matrix[i1,i2];<br />
}<br />
}<br />
}<br />
}<br />
bool OutOfBounds(int i1, int i2) {<br />
return (i1 < 0) || (i1 >= LENGTH) ||<br />
(i2 < 0) || (i2 >= LENGTH) ? true : f<strong>als</strong>e;<br />
}
Server<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 292<br />
using System;<br />
using RemoteObject;<br />
using System.Runtime.Remoting.Channels.Tcp;<br />
using System.Runtime.Remoting.Channels;<br />
using System.Runtime.Remoting;<br />
namespace ServerDomain {<br />
class Server {<br />
static void Main(string[] args) {<br />
TcpServerChannel ch = new TcpServerChannel(8888);<br />
ChannelServices.RegisterChannel(ch);<br />
RemotingConfiguration.RegisterWellKnownServiceType(<br />
typeof(Grid), "Grid", WellKnownObjectMode.Singleton);<br />
Console.WriteLine("Waiting forever");<br />
while(true);<br />
}<br />
}<br />
}
Kunde<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 293<br />
using System;<br />
using System.Runtime.Remoting.Channels;<br />
using System.Runtime.Remoting.Channels.Tcp;<br />
using RemoteObject;<br />
namespace GridClient {<br />
class Client {<br />
static void Main(string[] args) {<br />
ChannelServices.RegisterChannel(new TcpClientChannel());<br />
Grid myGrid = (Grid)Activator.GetObject<br />
(typeof(Grid), "tcp://localhost:8888/Grid");<br />
if (myGrid == null) {<br />
Console.WriteLine("Could not connect!");<br />
return;<br />
}<br />
for (int i = 0; i < myGrid.Length; i++) {<br />
for (int j = 0; j < myGrid.Length; j++) {<br />
myGrid[i,j] = (double)(i*10 + j);<br />
Console.WriteLine(myGrid[i,j]);<br />
}<br />
}<br />
}<br />
}<br />
}
Ortstransparenz: Webdienste in .NET<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 294
Ortstransparenz: Webdienste in .NET<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 295<br />
• Offene Standards (W3C) <strong>als</strong> Schnittstelle zum Web<br />
• Werkzeuge vereinfachen Anbindung an .NET<br />
• Ebenen laut Microsoft:<br />
Ebenen<br />
Standard<br />
Datenformat<br />
XML<br />
Nachrichtenformat<br />
SOAP<br />
Dienstbeschreibung<br />
WSDL<br />
Auffindung von Diensten auf Servern ?<br />
Auffindung von Servern<br />
UDDI<br />
• Problematische Unterscheidungen<br />
◮ Datenformat - Nachrichtenformat<br />
◮ Ebenen des Auffindens<br />
• Funktionalität steht im Vordergrund, nicht Performanz.
Webdienst: Beispiel<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 296<br />
<br />
using System.Web;<br />
using System.Web.Services;<br />
public class TimeService : WebService {<br />
[WebMethod(Description="Returns the current time.")]<br />
public string GetTime() {<br />
return System.DateTime.Now.ToLongTimeString();<br />
}<br />
}
Simple Object Access Protocol (SOAP)<br />
• XML-basiertes Nachrichtenformat<br />
• Nachricht ist Umschlag mit Kopf und Körper<br />
◮ Kopf enthält Adressaten und Verarbeitungsinformation<br />
◮ Körper enthält Nutzdaten oder Fehlercodes<br />
• Wirre Mechanismen zur Typdefinition<br />
◮ Reihungen<br />
◮ sonst Rückgriff auf Namensräume (implizit <strong>als</strong>o Schemata)<br />
• Transport ist transparent, vordefinierte Kanäle<br />
◮ HTTP (mit Rückkanal)<br />
◮ SMTP (Simple Mail Transport Protokoll)<br />
◮ TCP (mit Rückkanal)<br />
• Problem: Beliebigkeit wegen zu vieler nicht standardisierter Eigenschaften<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 297
Was ist WSDL?<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 298<br />
WSDL beantwortet folgende Fragen:<br />
• Welche Dienste bieten welche Methoden an?<br />
• Über welche Ports, Protokolle und Nachrichten können die Methoden<br />
aufgerufen werden?<br />
• Welche Namen und welche Parameter hat <strong>eine</strong> Nachricht?<br />
• Wie sehen die verwendeten Datentypen aus?
WSDL-Aufbau<br />
Eine WSDL besteht aus 5 hierarchisch aufeinander aufbauenden Abschnitten:<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Protokollinfo <br />
<br />
<br />
<br />
<br />
<br />
<br />
• abstakter Teil: , , <br />
• konkreter Teil: , <br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 299
Web Services Description Language (WSDL)<br />
• XML-basierte Beschreibungssprache für Webdienste<br />
• Gegenstand: Mengen von Funktionen<br />
◮ Strukturiertes Programmieren<br />
◮ K<strong>eine</strong> Objektorientierung - k<strong>eine</strong> Vererbung<br />
• Modellierung von Parametern<br />
◮ XML Schema oder beliebige andere Beschreibungssprachen<br />
◮ Referenzen (auf Dienste) nicht explizit unterstützt<br />
• Abbildung auf konkrete Schnittstellen<br />
◮ SOAP<br />
◮ MIME (Multi-Purpose Internet Mail Extensions) für SMTP<br />
• Probleme: Beliebigkeit, fehlende Objektorientierung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 300
Uniform Description, Discovery and Integration (UDDI)<br />
• Beschreibt Dienste auf Geschäftsebene<br />
• Registrierung ist XML Deskriptor<br />
◮ White Page: Adresse, Erreichbarkeit<br />
◮ Yellow Page: Semantik (basiert auf Standard-Taxonomie)<br />
◮ Green Page: Technische Spezifikation (URL, WSDL, etc.)<br />
• Logisch zentralisierte, physisch verteilte Datenbank<br />
• UDDI ist kein Makler oder Marktplatz<br />
◮ K<strong>eine</strong> geographischen Anfragen<br />
◮ K<strong>eine</strong> Preisanfragen<br />
◮ K<strong>eine</strong> Zeitanfragen<br />
• Also: Wie DNS oder JINI, nur komplexere Felder<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 301
.NET myServices<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 302<br />
.NET myServices (HailStorm) is the user-centric architecture and set of<br />
services for .NET that deliver personally relevant information through the<br />
Internet to a user, to software running on the user’s behalf, or to devices<br />
working for the user.<br />
Microsoft<br />
• Kurz: Dienste für personenbezogene Daten unter .NET<br />
• Einordnung in CORBA: service oder facility<br />
• Kern standardisiert durch Microsoft<br />
• Weitere Definitionen durch Microsoft Open Process
Die heilige Privatsphäre<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 303<br />
• .NET myServices verwaltet private Daten<br />
• Sicherheit entscheidet über Akzeptanz<br />
• Große Kundenstämme <strong>als</strong> Referenzen<br />
◮ MSN<br />
◮ Hotmail (zugekauft)<br />
◮ Passport (zugekauft): Sicherheitsprobleme<br />
• Beteiligung an Privatsphäre-Initiativen<br />
◮ TRUSTe<br />
◮ Code of fair information practices<br />
• Kodex: K<strong>eine</strong> Werbung, kein Mining, k<strong>eine</strong> Weitergabe
Motivation für .NET myServices<br />
• Was Microsoft sagt<br />
◮ Heute: Anwendungen und ihre Daten leben nebeneinander her<br />
◮ Beispiel: Integration Flugbuchungssystem - Terminkalender<br />
◮ Morgen: Verteilung, Vielzahl von Geräten führt ins Chaos<br />
◮ Ausweg: Standardisierung mit .NET myServices<br />
persönliche Daten<br />
Verwaltung, Zugriffe, Austausch<br />
• Was Microsoft will<br />
◮ Den Zugang zu Netzdiensten kontrollieren<br />
◮ Offene Standards in .NET sind Feigenblatt<br />
◮ Kontinuierliche Zahlungsströme von<br />
Endbenutzern für Verwaltung und Transaktionen<br />
Dienstanbietern für Infrastruktur und nötige Zertifikate<br />
Entwicklern für Werkzeuge etc.<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 304
Die üblichen Tricks<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 305<br />
• Wer die Schnittstelle beherrscht, beherrscht das Geschäft:<br />
Microsoft will electronically and physically secure data managed by<br />
.NET myServices to prevent unauthorized access or use.<br />
• Implementierungen austauschbar<br />
◮ PCs (DOS, Windows)<br />
◮ SEGA Dreamcast (Windows CE, Direct-X)<br />
◮ Webdienste? (.NET, .NET myServices)<br />
• Nutzung von Marktmacht<br />
◮ Bekannt: Bündelung von Windows 9x und Internet Explorer<br />
◮ Ebenso: Bündelung von Windows XP und Media Player 8<br />
◮ Variante: Integration von XP- und .NET myServices-Anmeldung<br />
Integration in Office, Spiele, Xbox (Spielekonsole),<br />
Stinger (SmartPhone), ...
Fazit<br />
• Ziele von .NET ähnlich wie CORBA: Vereinheitlichung <strong>eine</strong>r heterogenen<br />
Welt, aber<br />
◮ Monopolisierungsabsicht.<br />
◮ Mittelfristig oder langfristig Plattformabhängigkeit<br />
◮ Kellercode nicht ausführbar<br />
◮ Verifizierer nicht validiert und außerdem abschaltbar<br />
◮ praktische Tauglichkeit noch nicht nachgewiesen<br />
◮ manche Eigenschaften noch nicht ausreichend klar:<br />
Mehrfachvererbung, mehrfädige Programmierung<br />
◮ deutliche Ausrichtung auf web-Dienste<br />
• technisch:<br />
◮ im Vergleich zu CORBA und EJB der bisher systematischste Ansatz<br />
◮ wesentlich bessere Unterstützung von Versionierung<br />
◮ sowohl für sequentielle <strong>als</strong> auch für verteilte Systeme<br />
◮ explizite Bereitstellung von Übersetzungsdaten in Päckchen stellt die<br />
Metaprogrammierung auf <strong>eine</strong> durchsichtige Grundlage<br />
◮ der (seit 40 Jahren) überzeugendste Ansatz zur Lösung des<br />
UNCOL-Problems<br />
◮ Konzept des managed code könnte erhebliche Auswirkungen auf den<br />
künftigen Gebrauch von C und C++ haben.<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 306
Komponentensysteme im Vergleich<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 307
Komponenten: erwünschte Eigenschaften<br />
• Programmeinheiten mit standardisierter Basiskommunikation<br />
◮ abstrakt (nur Schnittstelle), generisch oder konkret (mit<br />
Implementierung)<br />
◮ Klassen und Module sind Komponenten<br />
• entworfen mit standardisierten Verträgen zur Komposition:<br />
◮ Export-Schnittstelle sichert semantische Eigenschaften zu<br />
◮ Import-Schnittstelle definiert Voraussetzungen zur ihrer Garantie<br />
explizit oder<br />
implizit (<strong>als</strong> Parameter von Konstruktoren oder anderen Methoden)<br />
◮ kein verstecktes Wissen<br />
• Komponenten sind wiederverwendbar<br />
• Komponenten können aus Komponenten zusammengesetzt sein<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 308
Komposition<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 309<br />
• Generische Komponenten ausprägen (mit Argumenten für generische<br />
Parameter)<br />
• Zusammensetzen von Komponenten laut Verträgen:<br />
◮ über Funktionen und Daten<br />
◮ über Kommunikation, Synchronisation und Protokolle<br />
◮ Problem der globalen Lebendigkeit?<br />
◮ Wie erreicht man nicht-funktionale Eigenschaften?<br />
• Mangelnde Passung erfordert Adaption der Komponenten:<br />
◮ Externe Adaption durch Umwickeln<br />
◮ Interne Adaption:<br />
Offenes Einsetzen<br />
Invasiver Austausch nicht-funktionaler Aspekte (z.B.<br />
Basiskommunikation tauschen, Synchronisation einfügen etc.)
Vergleichskriterien<br />
• Komponenten<br />
◮ Generische Komponenten<br />
◮ Abstrakte Komponenten (Schnittstellen)<br />
◮ Konkrete Komponenten (Implementierungen)<br />
◮ Zusammengesetzte Komponenten<br />
◮ Basiskommunikation<br />
• Wiederverwendbarkeit<br />
• Anpassung (extern und intern) von<br />
◮ Funktionen und Daten<br />
◮ Kommunikation, Synchronisation und Protokolle<br />
◮ Problem der globalen Lebendigkeit?<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 310
Generische Komponenten - Spezifikationen<br />
• Corba<br />
◮ Schnittstellen werden aus IDL generiert<br />
◮ kein ähnliches Konzept für Implementierungen<br />
• EJB<br />
◮ Deployment entsprechend Descriptor<br />
• DCOM<br />
Generierung von Stummeln und Skeletten wie aus IDL,<br />
Anpassungen an Behälter,<br />
Einweben von Persistenz, Transaktion, ...<br />
◮ Schnittstellenklassen und Stellvertreter werden aus MIDL generiert<br />
◮ Kein ähnliches Konzept für Implementierungen<br />
• .NET<br />
◮ Metadaten pro Päckchen, ersetzt IDL<br />
◮ für Webdienste Generieren von Schnittstellen (WSDL) und<br />
Stellvertretern aus Implementierung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 311
Abstrakte Komponenten - Schnittstellen<br />
• Corba<br />
◮ Schnittstellen werden aus IDL generiert<br />
◮ Stummel und Skelette<br />
◮ Mehrfachvererbung<br />
• EJB<br />
◮ Generierung bei Deployment,<br />
◮ Mehrfachvererbung<br />
• DCOM<br />
◮ Schnittstellen werden aus MIDL generiert<br />
◮ Schnittstellenobjekte<br />
◮ Mehrfachvererbung<br />
◮ Unveränderliche Schnittstellen (immer und überall)<br />
• .NET<br />
◮ Schnittstellen sind Typen, vermerkt in den Metadaten <strong>eine</strong>s Päckchens<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 312
Konkrete Komponenten - Implementierungen<br />
• Corba<br />
◮ Mit Transaktionskonzept / Persistenzkonzept<br />
◮ Sprach- / Plattformunabhängig<br />
◮ Vererbungskonzept der jeweiligen Sprache<br />
• EJB<br />
◮ Mit Transaktionskonzept / Persistenzkonzept<br />
◮ Java / Plattformunabhängig<br />
◮ Einfachvererbung<br />
• DCOM<br />
◮ Mit Transaktionskonzept / Persistenzkonzept<br />
◮ Sprachunabhängig (aber de facto MS C-Compilerabhängig) /<br />
Plattformunabhängig (aber de facto Windows)<br />
◮ Vererbungskonzept der jeweiligen Sprache<br />
• .NET<br />
◮ Mit Transaktionskonzept / Persistenzkonzept<br />
◮ ”<br />
Plattformunabhängig“<br />
◮ Einfachvererbung, Mehrfachvererbung von Schnittstellen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 313
Zusammengesetzte Komponenten<br />
• Corba<br />
◮ Aufruf über ORB<br />
◮ Aggregation über Entwurfsmuster Fassade (auch dynamisch) seit<br />
Corba 3.0<br />
• EJB<br />
◮ Aufruf über Behälter<br />
◮ Java Sprachkonzepte zur Delegation<br />
• DCOM<br />
◮ Aufruf über (D)COM Bibliothek und Stellvertreter<br />
◮ Delegation in Komponenten über Umwickler<br />
◮ Aggregation von Klassen über Entwurfsmuster Fassade (nur statisch)<br />
◮ Aggregation von Schnittstellen<br />
• .NET<br />
◮ Aggregation von Moduln in Päckchen, (logische, k<strong>eine</strong> physische)<br />
Schachtelung von Päckchen<br />
◮ Delegation<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 314
Basiskommunikation<br />
• Corba<br />
◮ Erzeugung und Fernaufruf über ORB (Object Request Broker )<br />
◮ Zentrale Vermittlung über ORB<br />
◮ Fernaufruf GIOP/IIOP (General/Internet Inter ORB Protokoll)<br />
• EJB<br />
◮ Erzeugung und RMI (Remote Message Invocation) über Container<br />
◮ Anbindung an Corba<br />
◮ Zentrale Vermittlung über Behälter<br />
◮ Migration von Javacode<br />
• DCOM<br />
◮ Erzeugung (Fabrik) über lokale Bibliotheksdienste<br />
◮ Objekterzeugung ist Fabrikmethodenaufruf<br />
◮ Objektorientierter Fernaufruf basierend auf DCE über Stellvertreter<br />
(proxies)<br />
◮ Dezentrale Vermittlung<br />
• .NET<br />
◮ Fernaufruf über Stellvertreter (.NET-Remoting-Rahmensystem)<br />
◮ Webdienste<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 315
Wiederverwendung<br />
• Corba<br />
◮ Vordefinierte Facilities und Services<br />
◮ Vertical Facilities (Fachkomponenten) schwach<br />
• EJB<br />
◮ K<strong>eine</strong> Standardisierungen von Beans<br />
◮ AWT und Swing (JavaBeans) meistverwendete Java Bibliothek<br />
◮ Industriestandards: SanFrancisco gescheitert, Fiscus-Projekt?<br />
◮ Derzeit wird eher die Architektur wiederverwendet, um firmenintern<br />
Komponenten wiederzuverwenden<br />
• DCOM<br />
◮ K<strong>eine</strong> Standardisierungen von DCOM Objekten (Klassen)<br />
◮ Industriestandard: Microsoft Anwendungen stark<br />
• .NET<br />
◮ Umfangreiche Bibliothek<br />
◮ Vordefinierte Dienste (schwach, Datenschutz?)<br />
◮ Webdienste (aufkommend)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 316
Generierung aus Spezifikationen<br />
• Corba<br />
◮ Stummel-Skelett-Generierung aus IDL<br />
• EJB<br />
◮ Klare Trennung von Entwicklung und Einpassung (deployment)<br />
◮ Unterschiedliche Rollen im Entwurf<br />
◮ Ausbaufähiges Konzept zur Entwicklung von Komponentensystemen<br />
durch Trennung von<br />
Entwurfsentscheidungen aus Komponentensicht<br />
(Implementierungsdetails)<br />
Entwurfsentscheidungen aus Kontextsicht (Transaktion, Persistenz,<br />
aber auch verteilte Protokolle zur Diensterfüllung)<br />
◮ Schnittstellen-Stellvertreter Generierung<br />
• DCOM<br />
◮ Schnittstellen-Stellvertreter Generierung aus MIDL<br />
• .NET<br />
◮ Generierung von Spezifikationen aus Implementierungen (Webdienste)<br />
◮ Generierung der Stellvertreter aus generierten Spezifikationen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 317
Anpassungen (Corba, EJB, DCOM, .NET)<br />
• Aspekttrennung schafft Voraussetzungen<br />
◮ Trennung von Schnittstellen und Implementierungen<br />
◮ Mehrere Schnittstellen pro Komponente<br />
◮ Trennung von Persistenz-, Transaktions-, Verteilungsaspekt<br />
• Reflexion erlaubt das Erkennen der Notwendigkeit<br />
• Kommunikationsanpassung — Brücken zwischen den Welten<br />
◮ EJB - Corba<br />
◮ Java - DCOM<br />
◮ Corba - DCOM<br />
• Konzepte zur Anpassung<br />
◮ Explizites Adaptieren und Delegieren<br />
◮ IDL Generatoren erzeugen Code für Sprach- und<br />
Verteilungsanpassungen<br />
◮ siehe Konzepte zur Komposition<br />
• .NET: Vereinheitlichung<br />
◮ Brücke zu (D)COM<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 318
Weitere Anpassungen mit Corba MOF<br />
• Meta Object Facility (MOF)<br />
◮ Beschreibung mit gleicher Sprache<br />
◮ zur Anpassung verschiedener Typsysteme (z.B. IDL und UML)<br />
• XMI, um automatisch Stromformate von Werkzeugen ineinander<br />
umzusetzen<br />
• Anpassung der Metadaten (Datenbeschreibungen) und nicht der Daten<br />
selber<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 319
Weitere Anpassungen EJB Deployment<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 320<br />
• Komposition entsprechend Bean Descriptor<br />
• Einweben von Aspekten aus Bean Descriptor<br />
◮ Persistenz<br />
◮ Transaktionsverwaltung<br />
• Interne Adaption dieser Aspekte<br />
• Hier weitere (automatische) Anpassungen denkbar<br />
◮ Forschungsgegenstand<br />
◮ Architektur vorhanden
Fehlende Anpassungen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 321<br />
• Daten, Funktionen, Kommunikation werden explizit und extern angepaßt<br />
• Synchronisation und Protokollanpassungen entsprechen Anpassungen von<br />
Transaktionen und Sessions (siehe vorige Folien)<br />
• K<strong>eine</strong> Konzepte zur globalen Lebendigkeit<br />
◮ Synchronisationskonzepte unter Komposition<br />
◮ Lebendigkeitstests
Fazit Corba<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 322<br />
• Die Corba-Schnittstellen sind sehr flexibel, funktionieren und können in<br />
der Praxis eingesetzt werden - aber auch komplex und umfangreich,<br />
vielleicht zu flexibel für die Praxis<br />
• Corba ist ein offener Standard.<br />
• Geht normiert über den Verdrahtungsstandard hinaus (facilities, services)<br />
• MOF/XMI zur Integration von Typsystemen von Programmiersprachen,<br />
Entwurfs- und Entwicklungssystemen, Datenbankschemata etc.<br />
• Freie ORBs beflügeln Corba<br />
• Java für neue Software, Corba für gemischte Alt-Neu-Systeme
Fazit EJB<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 323<br />
• Die Java-Schnittstellen sind sehr flexibel, funktionieren und können in der<br />
Praxis eingesetzt werden<br />
• Standard in Firmenhand Sun Microsystems - kann die gleichen Probleme<br />
bereiten wie bei Microsoft<br />
• Java/Beans/EJB wird die Basis für Geschäftsobjekte<br />
• Die Definition von Beans und EJB <strong>als</strong> Standardkomponenten erhöht den<br />
Grad der Modularisierung und Wiederverwendung, bislang aber noch k<strong>eine</strong><br />
Komponenten von der Stange am Markt<br />
• Die Dokumentation ist gut<br />
• Deployment in EJB gehen weiter <strong>als</strong> andere Konzepte, da Anpassungen<br />
generiert werden (das kann Corba/DCOM nur für Verteilung)
Fazit DCOM<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 324<br />
• Vorwiegend Verdrahtungsstandard<br />
• Dezentrale Kommunikationsvermittlung über Stellvertreter<br />
• Kein offener Standard - bei bekannter Firmenpolitik von Microsoft<br />
besonders kritisch<br />
• Anstelle der Facilities und Services Microsoft Anwendungen<br />
◮ Office ist Quasistandard (Formate von allen Konkurrenten unterstützt)<br />
◮ Weitere Verbreitung <strong>als</strong> Corba<br />
◮ Schnittstellen / Formate können durch Microsoft geändert werden<br />
• Windows <strong>als</strong> Plattform vorausgesetzt (auch wenn EntireX von Software<br />
AG auf Linux existiert)
Fazit .NET<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 325<br />
• Technisch guter Ansatz zur Vereinheitlichung<br />
• ECMA-Standard<br />
• Umfangreiche Bibliothek<br />
• Ortstransparenz durch .NET-Remoting und Webdienste über Stellvertreter<br />
• Volle Reflexion durch Metainformationen in Päckchen, damit weder IDL<br />
noch Registratur nötig<br />
• ABER:<br />
◮ Verifizierer nicht validiert und außerdem abschaltbar.<br />
◮ Mittelfristig oder langfristig Plattformabhängigkeit.<br />
◮ Praktische Tauglichkeit noch nicht nachgewiesen.<br />
◮ K<strong>eine</strong> Anpassungskonzepte.
Fazit kommerzielle Komponentensysteme<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 326<br />
+ Komponenten- und Verdrahtungsstandard<br />
+ Transparenz bzgl. Verteilung, Sprache, Plattform, Persistenz<br />
+ Transaktionskonzepte<br />
+ Vordefinierte Dienste, Komponenten, Anwendungen<br />
− Komplex, hoher Einarbeitungsaufwand<br />
− hoher Kommunikationsaufwand, da (außer COM, .NET) für verteilte<br />
Anwendungen vorgesehen<br />
− Flexibilität führt zur hoher Komplexität auch im Produktionscode<br />
(Laufzeitprobleme)<br />
− Objektorientierte Entwurfskonzepte nicht auf Komponentenebene<br />
umgesetzt<br />
− Kaum Unterstützung für Anpassungen der Komponenten
Gliederung<br />
1. Einführung<br />
◮ Motivation<br />
◮ Definition,<br />
◮ Konzepte für Komponenten (klassische, kommerzielle, akademische)<br />
2. Industrielle Komponentensysteme der 1. Generation<br />
1. Ziele und Modell<br />
2. CORBA<br />
3. Enterprise JavaBeans<br />
4. (D)COM, .NET<br />
3. Schnittstellen- und Datenanpassung mit XML<br />
4. Akademische Ansätze<br />
◮ Architektursysteme<br />
◮ Aspektorientiertes Programmieren<br />
◮ Metaprogrammierung und Invasive Komposition<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 327
Ziel<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 328<br />
Spezifikation und Anpassung von Komponenten:<br />
Schnittstellen und Datenformate
Datenformate: Historie<br />
• Cobol<br />
◮ Grundprinzip: alle Ausgaben <strong>als</strong> Text (Serialisierung)<br />
◮ Textelemente typisiert<br />
• Unix<br />
◮ alle Ausgaben serielle (Text-)<strong>Datei</strong>en<br />
◮ typfrei: Typisierung der Systemdateien nicht explizit codiert<br />
daher alle Systemdateien einheitlich mit Texteditor bearbeitbar, falls<br />
der Benutzer das Format (Typ) kennt<br />
Unterschied zu Windows und neueren Ansätzen unter Linux<br />
• SGML - Standard Generalized Markup Language<br />
◮ Ziel: einheitliche Beschreibungssprache für Textformatierung<br />
◮ Definieren eigener Unterformate (Typen) möglich<br />
◮ syntaktisch sehr flexibel<br />
• HTML - Hypertext Markup Language<br />
◮ Ein Unterformat von SGML<br />
◮ K<strong>eine</strong> eigenen Unterformate möglich<br />
◮ Siegeszug mit dem WWW<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 329
eXtensible Markup Language (XML)<br />
• Problem:<br />
◮ Datenaustausch zwischen Programmen, nicht nur Textformatierung<br />
◮ aus SGML entwickelt, aber erweitertes Aufgabengebiet<br />
◮ HTML zu spezifisch, nur für Hypertext<br />
• Lösung: Datenaustauschformat, allgem<strong>eine</strong> Sprachen zur<br />
◮ Beschreibung von attributierten Termen/Bäumen<br />
◮ Typdefinition für attributierte Terme/Bäume<br />
◮ Querverweise durch Attribute<br />
◮ Untermenge von SGML<br />
◮ Syntax an HTML angelehnt<br />
• Umsetzung: XML<br />
◮ Standard des WWW Konsortiums (W3C): http://w3c.org<br />
◮ kritische Masse erreicht<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 330
XML Beispiel<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 331<br />
<br />
<br />
<br />
<br />
1234-A<br />
2001-01-30<br />
No complications.<br />
<br />
<br />
XML Standards<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 332<br />
benutzt<br />
Wohlgeformtes<br />
XML<br />
benutzt<br />
benutzt<br />
ersetzt<br />
DOM<br />
Gültiges<br />
XML<br />
benutzt<br />
DTD<br />
ersetzt<br />
ersetzt<br />
DOM2<br />
Schema-gültiges<br />
XML<br />
benutzt<br />
XML Schema<br />
benutzt<br />
benutzt<br />
XPath<br />
benutzt<br />
XML Namespaces<br />
benutzt<br />
XSLT
XML <strong>als</strong> Format<br />
• Leichter zerteilbar <strong>als</strong> allgem<strong>eine</strong> kontextfreie Sprachen<br />
◮ Elemente durch Separatoren "" ausgezeichnet<br />
◮ Explizite Schachtelung von Elementen (schließende Klammern)<br />
◮ Grammatik für Kinderelemente ist regulär<br />
• Einschränkung<br />
◮ Format ist auf Unicode definiert<br />
◮ Konvertierung in Bytestrom (Serialisierung) nicht in Grammatik<br />
festgelegt<br />
Unicode UTF-8 oder UTF-16<br />
ISO-8859-1, -15, . . .<br />
• Formen der Korrektheit<br />
◮ Wohlgeformtes (well-formed) XML:<br />
Korrekte Syntax und Klammerung<br />
◮ Gültiges (valid) XML:<br />
Wohlgeformt und konform zu <strong>eine</strong>r DTD<br />
◮ Schema-gültiges (schema-valid) XML:<br />
Wohlgeformt und konform zu <strong>eine</strong>m XML Schema<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 333
Namensräume<br />
• Problem: Heterogene Systeme<br />
◮ Wieviele Definitionen von z.B. Behandlung gibt es?<br />
◮ Wie vermeide ich Probleme beim Zusammenführen?<br />
• Ansatz: Einführen von Namensräumen<br />
◮ Name ist Paar (Namensraum, lokaler Name)<br />
◮ international eindeutige Bezeichner für Namensräume (?)<br />
• Umsetzung in XML<br />
◮ Lange Bezeichner für Namensräume, lokale Platzhalter im Dokument<br />
◮ URIs <strong>als</strong> Bezeichner <strong>eine</strong>s Namensraums (aber nicht vorgeschrieben)<br />
◮ <br />
<br />
<br />
• leider ein technisch nicht ausgereifter Standard:<br />
◮ Gültigkeitsbereich <strong>eine</strong>s Namensraum-Bezeichners: XML-Element mit<br />
Kindern (wie Variable) einschl. Elementname, vorangehende Attribute!<br />
◮ Daher nicht LL(k) wie der Rest von XML<br />
◮ Pässe:<br />
Zerteile wohlgeformtes XML, löse Namensräume auf, prüfe Typen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 334
Document Type Description (DTD)<br />
• Typbeschreibung für XML-Dokumente (kontextfreie Grammatik)<br />
• Selbst kein XML-Dokument<br />
• Basisdatentypen für Elemente<br />
◮ Zeichenkette (PCDATA)<br />
• Typkonstruktoren für Elemente<br />
◮ Iteration<br />
◮ Sequenz<br />
◮ Alternative<br />
◮ Schachtelungen davon<br />
• Basisdatentypen für Attribute<br />
◮ Zeichenkette (CDATA)<br />
◮ Schlüssel und Bezüge (ID, IDREF)<br />
◮ . . .<br />
• Typkonstruktoren für Attribute<br />
◮ Aufzählung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 335
DTD Beispiel<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 336<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 337<br />
Typkonstruktoren und reguläre Ausdrücke<br />
Abbildung von Typkonstruktoren auf<br />
reguläre Ausdrücke<br />
Datentyp<br />
Ausdruck<br />
ARRAY OF X<br />
(X)*<br />
RECORD X, Y, ..., Z<br />
(X, Y, ..., Z)<br />
UNION<br />
X, Y, ..., Z<br />
(X |Y |... |Z)<br />
Dr. Welf Löwe und Markus Noga 18
Probleme mit DTDs<br />
• selbst kein XML (Problem bei boot-strapping)<br />
• sehr eingeschränktes Typsystem<br />
◮ k<strong>eine</strong> Basistypen außer Zeichenketten<br />
◮ k<strong>eine</strong> festen Reihungen<br />
◮ k<strong>eine</strong> Vererbung<br />
• mehrdeutige Ableitungsbäume<br />
◮ Ursache: Schachtelung von Konstruktoren<br />
◮ Beispiel:<br />
DTD-Fragment <br />
Ableitung von ist nicht eindeutig<br />
• Namensräume nicht integriert<br />
• langsame Verarbeitung wegen Interpretation<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 338
XML Schemata<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 339<br />
die (nachträglich erfundene) Verallgem<strong>eine</strong>rung von DTDs<br />
• Zweck: Beschreibung der Struktur und Einschränkung des Inhalts von<br />
XML-Dokumenten<br />
• XML Schema ist selbst XML-Dokument<br />
• W3C Standard<br />
• Typsystem<br />
◮ übliche Basistypen: String, Integer, . . .<br />
◮ unübliche Basistypen: Date, Time<br />
◮ Einschränkungen darauf möglich<br />
◮ Feste Reihungen durch Einschränkung des Sequenzenkonstruktors<br />
◮ Kovariante und kontravariante Vererbung<br />
• Namensräume integriert<br />
• langsame Verarbeitung wegen Interpretation<br />
• mehrdeutige Ableitungsbäume
XML-Schema: Bestandteile<br />
Bestandteile von XML-Schema:<br />
• Primäre Komponenten, die <strong>eine</strong>n Namen haben können (Typdefinitionen)<br />
oder müssen (Element und Attributdeklarationen):<br />
◮ Einfache Typdefinitionen<br />
◮ Komplexe Typdefinitionen<br />
◮ Attributdeklarationen<br />
◮ Elementdeklarationen<br />
• Sekundäre Komponenten, die Namen haben müssen:<br />
◮ Attributgruppendefinitionen<br />
◮ Identity-constraint-Definitionen<br />
◮ Modellgruppendefinitionen<br />
◮ Notationsdeklarationen<br />
• Hilfskomponenten:<br />
◮ Annotationen<br />
◮ Modellgruppen<br />
◮ Partikel<br />
◮ Wildcards<br />
◮ Attributverwendungen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 340
XML-Schema: Elemente<br />
• Definition <strong>eine</strong>s Elements:<br />
◮ Zuordnung <strong>eine</strong>s Typs zu <strong>eine</strong>m Namen<br />
◮ Gültigkeitsbereich ist der umgebende Typ<br />
• Typ durch Attribut zuordnen:<br />
<br />
• Typ explizit angeben:<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 341
Typen in DTDs und XML Schemata<br />
• DTD<br />
◮ Typ kein eigenständiges Konzept<br />
◮ Definition <strong>eine</strong>s XML-Elements<br />
definiert den zugehörigen Typ<br />
mit globalem Gültigkeitsbereich<br />
• XML Schema<br />
◮ Typ ist eigenständiges Konzept<br />
Konstruktoren für benutzerdefinierte Typen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 342
XML Schema - einfache Typen - Beispiel<br />
• Konstruktoren<br />
◮ Einschränkung<br />
◮ Vereinigung<br />
◮ Iteration<br />
• Hier nur Einschränkung<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 343
XML Schema - komplexe Typen - Beispiel<br />
• Konstruktoren<br />
◮ Einschränkung<br />
◮ Erweiterung<br />
• Hier nur Einschränkung<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 344
XML Schema - Attribute - Beispiel<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 345<br />
• Attribute werden innerhalb komplexer Typen definiert<br />
• Definition bindet einfachen Typ an Namen<br />
• Unterschiedliche Syntax: Bezug auf Typ, Inline-Definition<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Datentypen in XML Schema<br />
Programmiersprachen<br />
• Basisdatentypen<br />
◮ unterschiedliche Integers,<br />
Floats, usw.<br />
• Reihungen<br />
◮ statisch<br />
◮ dynamisch<br />
◮ flexibel<br />
XML Schema<br />
• Basisdatentypen<br />
◮ erweitert um URL, Datum, Zeit,<br />
etc.<br />
◮ Standardtypen mit beliebigen<br />
Einschränkungen auf Wertebereiche<br />
und Literale<br />
• Reihungen durch Attribute<br />
◮ dynamische Grenzen (min=max<br />
→ statisch)<br />
minOccurs=’X’ maxOccurs=’Y’<br />
◮ dynamische und flexible Reihungen<br />
werden nicht unterschieden<br />
maxOccurs=’unbounded’<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 346
Datentypen in XML Schema<br />
Programmiersprachen<br />
• Verbunde<br />
◮ Zugriff über Namen<br />
• Verbunde mit Varianten<br />
◮ Verbunde mit/ohne Typkennung<br />
◮ Zugriff auf Variante, die in Typkennung<br />
codiert ist<br />
◮ typsicher, wenn kein Variantenwechsel<br />
bei ein und demselben<br />
Objekt möglich ist<br />
XML Schema<br />
• Verbunde<br />
◮ Struktur von XML (Schema ist<br />
XML)<br />
◮ Zugriff über Namen von Unterelementen<br />
und/oder Position<br />
• Verbunde mit Varianten durch Elemente<br />
mit Auswahl<br />
◮ Auswahl <br />
◮ aktuelle Variante i. a. nicht erkennbar,<br />
da nicht eindeutig<br />
◮ nicht typsicher<br />
◮ typsicher, wenn Auswahl nur unter<br />
Elementen (siehe Beispiel auf<br />
nächster Folie)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 347
Beispiel: Verbunde mit Varianten<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 348<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Ableitung für ?<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
hier sicher, z.B.
Deterministische Inhaltsmodelle<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 349<br />
• Inhalt von Elementen (Kinder) jeweils durch regulären Ausdruck<br />
beschrieben<br />
⇒ Typsicherheit, wenn regulärer Ausdruck deterministsich: Beim Zerteilen<br />
<strong>eine</strong>s Satzes ist jedem Symbol ohne Vorschau das entsprechende Symbol<br />
im Ausdruck zuzuordnen.<br />
◮ Nicht deterministisch: Satz “aaaaaab“ und Ausdruck “a*b|a*c“<br />
• Eindeutigkeit der regulären Ausdrücke herstellbar<br />
◮ Transformation in Automaten<br />
◮ deterministisch machen<br />
(Teilmengenkonstruktion, exponentiell)<br />
◮ minimieren (Klassenbildung)<br />
• deterministisches Zerteilen möglich<br />
• nicht jeder deterministische Automat hat deterministischen Ausdruck<br />
• deterministisches Interpretieren i.a. unmöglich
Beschreibung von Schnittstellen: Daten und Funktionen<br />
Programmiersprachen<br />
• Klassen<br />
◮ Verbunde mit Daten und<br />
Funktionen<br />
◮ Vererbung<br />
◮ Polymorphie<br />
XML Schema<br />
• Klassen<br />
◮ Verbunde wie besprochen<br />
◮ Referentielle Transparenz:<br />
k<strong>eine</strong> Unterscheidung zwischen<br />
0-stelligen Funktionen und Daten<br />
◮ K<strong>eine</strong> Entsprechung für<br />
allgem<strong>eine</strong> Funktionen<br />
• Beschreibung von Funktionen erfordert<br />
Erweiterungen<br />
◮ Standard: WSDL<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 350
Web Services Description Language (WSDL)<br />
• Im Kontext von .NET besprochen<br />
• Beschreibt Mengen von Funktionen<br />
• Modellierung von Parametern<br />
◮ XML Schema (oder beliebige andere Sprachen ;-)<br />
• Probleme<br />
◮ Referenzen (auf Dienste) nicht explizit unterstützt<br />
◮ Strukturiertes Programmieren - k<strong>eine</strong> Objektorientierung<br />
◮ K<strong>eine</strong> Vererbung, k<strong>eine</strong> Polymorphie<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 351
Wiederholung: Web Services Description Language (WSDL)<br />
• XML-basierte Beschreibungssprache für Webdienste<br />
• Gegenstand: Mengen von Funktionen<br />
◮ Strukturiertes Programmieren<br />
◮ K<strong>eine</strong> Objektorientierung - k<strong>eine</strong> Vererbung<br />
• Modellierung von Parametern<br />
◮ XML Schema oder beliebige andere Beschreibungssprachen<br />
◮ Referenzen (auf Dienste) nicht explizit unterstützt<br />
• Abbildung auf konkrete Schnittstellen<br />
◮ SOAP<br />
◮ MIME (Multi-Purpose Internet Mail Extensions) für SMTP<br />
• Probleme: Beliebigkeit, fehlende Objektorientierung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 352
Beispiel WSDL<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 353<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Datentypen in XML Schemata<br />
Programmiersprachen<br />
• Klassenvererbung<br />
◮ Spezialisierung<br />
(Kovarianz)<br />
◮ Konformität<br />
(Kontravarianz)<br />
• Referenzen<br />
◮ typisiert oder untypisiert<br />
◮ auf beliebige Werteobjekte<br />
XML Schema<br />
• Ableitung von Verbundtypen<br />
◮ Einschränkung entspricht Spezialisierung<br />
◮ Erweiterung entspricht Konformität<br />
• Referenzen durch Attribute<br />
◮ ID und IDREF Typen<br />
◮ Untypisiert<br />
◮ Identifikation von Objekten mit<br />
Schlüsselwerten<br />
◮ K<strong>eine</strong> Referenzen auf WSDL-<br />
Dienste<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 354
Wertung<br />
XML erlaubt die Spezifikation von Daten und der Parametrisierung von<br />
Diensten in Schnittstellen.<br />
• Vorteile<br />
◮ standardisierte Syntax<br />
◮ standardisierte Transformation<br />
• Nachteile<br />
◮ nur Wertesemantik<br />
◮ nur Verbunde, k<strong>eine</strong> Klassen<br />
◮ kein Vererbungskonzept<br />
• Es besteht <strong>als</strong>o noch Verbesserungsbedarf, um Komponenten speziell<br />
objektorientierte mit XML zu spezifizieren.<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 355
XML und IDL<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 356<br />
• beide sollen Typen definieren<br />
• Anpassungen auf Datenebene anwendungsspezifisch<br />
• Anpassungen auf Beschreibungsebene (Metaebene)-<br />
Meta Object Facility (MOF) bietet Lösung<br />
• Abbildung über MOF technisch problemlos
IDL und XML Schema<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 357<br />
IDL und XML Schema<br />
MOF<br />
MOF<br />
IDL<br />
IDL<br />
XML<br />
XML<br />
Schema<br />
Schema<br />
Abfrage/<br />
Abfrage/<br />
Navigation<br />
Navigation<br />
IDL-<br />
IDL-<br />
Spezifikation<br />
Spezifikation<br />
Umwandlungsroutinen<br />
Umwandlungsroutinen<br />
Schema-<br />
Schema-<br />
Spezifikation<br />
Spezifikation<br />
Daten-<br />
Daten-<br />
Instanz<br />
Instanz<br />
Daten-<br />
Daten-<br />
Instanz<br />
Instanz<br />
Dr. Welf Löwe und Markus Noga 26
Verarbeiten von XML-Dokumenten<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 358<br />
Verarbeitung von XML-Dokumenten: Zugriff auf Baumstruktur notwendig<br />
• Document Object Model (DOM)<br />
◮ Ziel: Navigieren in <strong>eine</strong>m XML-Baum ermöglichen<br />
(zur Implementierung von (Datenbank-)Abfragen)<br />
◮ Baumstruktur implizit durch Navigation gegeben.<br />
◮ W3C Standard<br />
◮ Elemente und Attribute<br />
alle gleichen Typs<br />
sind explizite Objekte (unterschieden durch Namen)<br />
◮ Zugriffe<br />
Iteratoren über Kindelemente und Attribute<br />
i-tes Kindelement, erstes Kindelement mit Namen x<br />
Attributwert über Attributnamen<br />
◮ alles explizit, daher langsam, umständlich, kein Stromformat<br />
◮ Typinformation geht verloren<br />
• SAX: push- statt pull-Modus.<br />
• DOM 2:<br />
◮ integriert Namensräume<br />
◮ typisierte Syntaxbäume (generiert aus DTD oder Schema)<br />
◮ Schlüsselzugriffe z.B. für ID und IDREF<br />
◮ Persistente Formate (Anbindung an Datenbanken, Persistent DOM)<br />
◮ Binäres Kodierungsformat (Wahlfreier Zugriff)
DOM: Lesende Methoden<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 359<br />
String getNodeName ();<br />
String getNodeValue ();<br />
short getNodeType ();<br />
Node getParentNode ();<br />
NodeList getChildNodes ();<br />
Node getFirstChild ();<br />
Node getLastChild ();<br />
Node<br />
child (int i);<br />
Node getPreviousSibling ();<br />
Node getNextSibling ();<br />
NamedNodeMap getAttributes ();<br />
Document getOwnerDocument ();
Anpassungen: Transformation von XML-Dokumenten<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 360<br />
• Schnittstellen und Daten durch XML-Dokumente beschrieben<br />
⇒ Transformation der XML-Dokumente zur Beseitigung von<br />
Inkompatibilitäten zwischen Komponenten und damit Anpassung der<br />
Schnittstellen oder Nachrichten (inkl. Prozeduraufrufen)
Transformation von XML-Dokumenten<br />
• bislang:<br />
◮ Daten beschrieben mit Typbeschreibung<br />
◮ Interne Darstellung der Daten<br />
• nun:<br />
◮ Transformation <strong>eine</strong>s XML-Dokuments in ein anderes oder in<br />
Nicht-XML-Form<br />
• Vorgehen:<br />
◮ Transformator ausprogrammieren<br />
◮ XSLT (entsprechender XML Standard dafür) benutzen<br />
◮ deskriptiver Ansatz<br />
beschreibe Ergebnis der Transformation<br />
nicht die nötigen Operationen!<br />
◮ Term- bzw. Graphersetzer (Techniken aus dem Übersetzerbau)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 361
Verarbeitung mit Standard XML Techniken<br />
• Zerteiler liest Dokument und DTD/Schema<br />
• Dokument wird gegen Grammatik validiert<br />
• DOM wird aufgebaut<br />
• Transformation/Filterung auf dem DOM<br />
◮ Transformation definiert durch XSLT Spezifikation<br />
◮ Ausgabe nicht notwendig XML<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 362
XSLT<br />
• eXtensible Stylesheet Language Transformation (XSLT)<br />
• W3C Standard<br />
• XML Syntax<br />
◮ XML Schema für XSLT<br />
◮ DTD Beschreibung der Syntax nicht möglich wegen beliebiger Ausgabe<br />
• Navigation auf DOM<br />
◮ Mischung zwischen deklarativer Notation und imperativen Anweisungen<br />
• Mustererkennung auf DOM<br />
◮ Menge von Pfadausdrücken (XPATH)<br />
◮ Achtung: K<strong>eine</strong> Baum- oder Graphmuster!<br />
• Erzeugung von XML-Dokumenten oder anderen Texten<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 363
Beispiel - Regeln<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 364<br />
<br />
<br />
<br />
<br />
<br />
<br />
Patient Nummer: <br />
<br />
<br />
...
Beispiel - Ausgabe<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 365<br />
<br />
<br />
<br />
<br />
Patient Nummer: 0503760072<br />
...<br />
<br />
Pfadausdrücke (XPATH)<br />
• Pfad bildet (DOM-) Eckenmengen zur Weiterverarbeitung<br />
◮ Folge von Schritten schritt1/schritt2/.../schrittN<br />
• Schritt bildet neue Eckenmenge aus <strong>eine</strong>r bestehenden<br />
◮ Folge: achse::auswahl[prädikat1][prädikat2]...[prädikatM]<br />
• Achsen bilden neue Eckenmenge aus <strong>eine</strong>r bestehenden<br />
◮ Sprünge zu Eltern, Kinder, Nachbarn (Vor / Nachfolger in<br />
Pre-Ordnung)<br />
◮ Entsprechende Zugriffe im DOM zur Berechnung der Kontextknoten<br />
◮ Beispiel: ancestors::<br />
• Auswahl filtert bestehende Eckenmenge<br />
◮ Joker für Elementnamen: *<br />
◮ Joker für Attributnamen: @*<br />
◮ Wurzel des Dokuments: /<br />
◮ Text, Kommentar, Verarbeitungsanweisungen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 366
Prädikate<br />
• Prädikate filtern bestehende Eckenmenge<br />
◮ Ausdruckssyntax<br />
• Beispiele:<br />
◮ Ist Attribut definiert?<br />
element[@attribut]<br />
◮ Hat Attribut bestimmten Wert (immer String)?<br />
element[@attribut=wert]<br />
◮ Steht element an Position x (immer int)?<br />
element[position()=x]<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 367
Einbettung von XPATH in XSLT<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 368<br />
• XSLT ist Menge von Schablonen bestehend aus<br />
◮ Muster (XPATH Ausdruck)<br />
◮ Anweisungen (Ausgaben, rekursive Aufrufe etc.)<br />
• initial enthält die Kontextknotenliste den Wurzelknoten<br />
• Auswahl des passenden Musters<br />
◮ Ausführung der Anweisungen in der Schablone<br />
◮ bei Rekursion (apply-templates Anweisung):<br />
Aufbau neuer Kontextmengen<br />
• Einschränkungen mittels<br />
◮ Select (XPATH Ausdruck)<br />
◮ Regelmodi und -namen
Beispiel Kopierer<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 369<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Weitere Möglichkeiten von XSLT<br />
• Klassische Funktionsaufrufe mit Parametern<br />
• Rekursion<br />
• Fallunterscheidung<br />
• Variable mit statischer Einmalzuweisung<br />
• Schnitte von Eckenmengen<br />
• Anbindung an Skriptsprachen<br />
◮ möglicher Indikator für mangelnde Mächtigkeit von XSLT<br />
◮ bisher kaum genutzt<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 370
Beispiel mit Rekursion: XML → HTML<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 371<br />
Beispiel XML nach HTML<br />
document<br />
section<br />
entry<br />
entry<br />
entry<br />
section<br />
entry<br />
entry<br />
table<br />
tr<br />
tr<br />
tr<br />
tr<br />
th<br />
th<br />
td<br />
td<br />
td<br />
td<br />
td<br />
td<br />
Dr. Welf Löwe und Markus Noga 40
Beispiel<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 372<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
|\\<br />
<br />
<br />
<br />
<br />
<br />
<br />
Beispiel fortgesetzt<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 373<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Wertung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 374<br />
• XSLT ist turingmächtig<br />
◮ Bedingungen<br />
◮ Rekursionen<br />
• deskriptiv in den Pfadausdrücken<br />
• Rest ist funktionales Programm<br />
• Standardisierung ohne Verständnis der Standardtechnologie:<br />
◮ Mustererkennungsgeneratoren<br />
◮ Termersetzungsgeneratoren<br />
◮ Graphersetzungsgeneratoren
Probleme mit XSLT<br />
• unschön weil nicht deskriptiv<br />
• Ineffiziente Implementierung<br />
◮ Standardwerkzuge interpretieren Skripte online<br />
• inhärent ineffizient<br />
◮ Kontextinformation zur Anwendbarkeit <strong>eine</strong>r Transformation muß u.U.<br />
immer wieder neu berechnet werden<br />
◮ Aufwand O(n 2 ), obwohl Problem eigentlich O(n) . . .<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 375
Alternativen<br />
• Nachteil aller Alternativen: Transformationsspezifikation ist kein<br />
XML-Dokument.<br />
• Dafür: Saubere, mächtige Spezifikations- und Transformationskonzepte:<br />
◮ Termersetzungssysteme (TES)<br />
Eingabe: (XML)Term, Muster, Ersetzung<br />
Ausgabe: minimaler Fixpunkt nach iterativem Ersetzen<br />
◮ Graphersetzungssysteme (GES)<br />
Eingabe: (XML)Term (über Namen und Referenzen eigentlich ein<br />
Graph), Match, Ersetzung<br />
Ausgabe: minimaler Fixpunkt nach iterativem Ersetzen<br />
Systeme: Optimix (<strong>IPD</strong>) oder Progress (RWTH Achen)<br />
◮ Durchmustern kann durch Prioritäten gesteuert werden<br />
◮ Generatoransatz:<br />
erzeugt Term- oder Graphersetzungssystem aus Term-(Graph) Typ<br />
(DTD oder XML Schema) und Match-, Ersetzungsregeln<br />
eigentliche Ersetzung durch generiertes Programm<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 376
Beispiel Termersetzung für XML → HTML<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 377<br />
PATTERNDEF { document < sections:section* > } MyDoc;<br />
PATTERNDEF { section < entries:entry* > } Section;<br />
PATTERNDEF { tr } TableRow;<br />
PATTERNDEF { td } TableData;<br />
PATTERNDEF { html < head body > } HTMLRoot;<br />
PROCEDURE transform<br />
{<br />
WITH d
DOM kritisch betrachtet<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 378<br />
• Generatoren brauchen explizite Typ- und Strukturinformation in den<br />
AST-Ecken<br />
◮ DOM hat beides nicht<br />
• DOM unterstellt, daß der komplette XML-Baum (alle Ecken) aufgebaut<br />
wird<br />
• Transformation filtert Ecken, solche Ecken müssten gar nicht erst erzeugt<br />
werden<br />
◮ Standard Übersetzerbautechnik<br />
◮ Übergang vom konkreten zum abstrakten Strukturbaum (AST)<br />
• XSLT ist an DOM aufgehängt, nicht an XML-Schema<br />
⇒ ◮ Übertragung der Probleme von DOM<br />
◮ Umständliche Spezifikation der Transformationen und deren Steuerung.
Beobachtung<br />
• Anpassungen fallen in der Entwurfsphase auf<br />
◮ DTDs/Schemata bekannt<br />
◮ =⇒ Transformation kann ausprogrammiert werden<br />
• sowohl das vorhandene Format <strong>als</strong> auch das gewünschte Format sind dann<br />
fest<br />
◮ in unterschiedlichen Kontexten der Komponente unterschiedlich<br />
◮ ändern sich mit der Evolution der Komponente oder des<br />
Komponentenkontexts<br />
◮ =⇒ Transformation muß automatisch generiert werden<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 379
Generierte Transformationen<br />
Schema<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 380<br />
Generierte Transformationen<br />
DTD<br />
Generator<br />
XSLT<br />
Generator<br />
Generator<br />
XML<br />
Zerteiler<br />
Transformation<br />
XML<br />
Dr. Welf Löwe und Markus Noga 49
Generatortechnik<br />
• aXMLelerate Werkzeugkasten<br />
◮ Zerteilergeneratoren für C und Java Zerteiler<br />
(DTD und XML Schema)<br />
◮ Transformationsgenerator für Java (XSL-T)<br />
◮ Transformationsgenerator für C (Graphgrammatik)<br />
• Laufzeiten der generierten Zerteiler in C<br />
◮ 3-4×10 6 Zeilen pro Sekunde<br />
◮ 12 MB / sec auf Intel Pentium III mit 500 MHz<br />
◮ 15 MB / sec auf Athlon mit 800 MHz<br />
• Web Compiler<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 381
Web Compiler<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 382<br />
Dr. Welf Löwe und Markus Noga 51
Potential generierte Zerteilung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 383<br />
Potential generierte Zerteilung<br />
Dr. Welf Löwe und Markus Noga 62
Potential Transformation XSLT<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 384<br />
Potential Transformation<br />
Dr. Welf Löwe und Markus Noga 63
Potential Transformation GES<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 385<br />
Potential Transformation GES<br />
Dr. Welf Löwe und Markus Noga 54
Potential generierte Zerteilung - Java<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 386<br />
• Objekterzeugung für Zwischenstrukturen dominiert die Laufzeit<br />
• Für große <strong>Datei</strong>en: Analyse der DTD vernachlässigbar<br />
◮ 15% Gewinn bei 5MByte Dokument<br />
◮ 1,5% Gewinn bei 50MByte Dokument<br />
• Standard-Zerteilung ist hinreichend schnell
Weitere Optimierungen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 387<br />
• Serialisierer und AST-Aufbauer filtern die Daten<br />
• Abstrakte Interpretation der XSLT Skripte oder der<br />
Graphersetzungsbechreibungen<br />
• Bottom-Up Rewrite Systems (BEG)<br />
◮ Alternative lokale Ersetzungen<br />
◮ Kostenmaße<br />
◮ Globale Optimierung<br />
• Einweben der Serialisierer in Senderkomponente<br />
• Einweben der Zerteiler und Transformatoren in Empfängerkomponente<br />
• Studien- und Diplomarbeiten ;-)
Datenanpassungen mit XML<br />
• Komponentenbauer beschreibt gelieferte Datenformate in IDL<br />
• Automatische Transformation in XML Schema mit Hilfe von MOF<br />
• Komponenten-Deployer beschreibt<br />
◮ geforderte Formate in IDL oder XML Schema<br />
◮ Transformation in XSLT oder durch GES-Beschreibung<br />
• Deploymentphase<br />
◮ Erzeugung von Parsern, Zwischenstrukturen, Transformatoren<br />
◮ Optimierungen möglich<br />
◮ Entsprechender Code wird in die Stubs/Proxies/RemoteInterfaces<br />
eingewoben<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 388
Ausblick<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 389<br />
• Datenanpassung geleistet<br />
• Offene Anpassungen<br />
◮ Funktionalität<br />
◮ Kommunikation<br />
◮ Synchronisation<br />
◮ Protokolle<br />
◮ Globale Korrektheit<br />
• Zuvor XML Standards für Kommunikation zwischen Komponenten, deren<br />
Schnittstellen etc.<br />
◮ Im Kontext von .NET besprochen<br />
◮ Allgem<strong>eine</strong> Standards
Gliederung<br />
1. Einführung<br />
◮ Motivation<br />
◮ Definition,<br />
◮ Konzepte für Komponenten (klassische, kommerzielle, akademische)<br />
2. Industrielle Komponentensysteme der 1. Generation<br />
1. Ziele und Modell<br />
2. CORBA<br />
3. Enterprise JavaBeans<br />
4. (D)COM, .NET<br />
3. Schnittstellen- und Datenanpassung mit XML<br />
4. Akademische Ansätze<br />
◮ Architektursysteme<br />
◮ Aspektorientiertes Programmieren<br />
◮ Metaprogrammierung und invasive Komposition<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 390
Softwarekomposition und Metaprogrammierung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 391
Literatur<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 392<br />
• SOP: http://www.research.ibm.com/sop/sophome.htm<br />
• LambdaN: Dami, Laurent. Software Composition. Dissertation Universität<br />
Genf. 1997<br />
• Mulet, P., Malenfant, J., Cointe, P. Towards a Methodology for Explicit<br />
Composition of MetaObjects. OOPSLA 98.<br />
• Aksit, M., Bergmans, L., Vural, S. An object-oriented language-database<br />
integration model: The composition-filters approach. ECOOP 92. LNCS<br />
615, Springer.<br />
• Template Metaprogramming: K. Czarnecki, U.W. Eisenecker: Generative<br />
Programming - Methods, Tools, and Applications. Addison-Wesley, 2000<br />
• GenVoca: Batory, Don. Subjectivity and GenVoca Generators.<br />
In Sitaraman, M. (ed.). Proceedings of the Fourth Int. Conference on<br />
Software Reuse, April 23-26, 1996, Orlando Florida. IEEE Computer<br />
Society Press, pages 166-175<br />
• <strong>IPD</strong>-Literatur am Ende der Folien
Aufgaben und Ziele: Rückblick<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 393<br />
Komponentenbegriff: Modul, Klasse, Menge von Klassen (k<strong>eine</strong> oo-Objekte!)<br />
CORBA, EJB, DCOM, .NET:<br />
• Schnittstellenbeschreibung mit IDL,<br />
• Verknüpfung durch Prozedur- bzw. Fernaufruf (RMI, . . . )<br />
• geeignet für nebenläufige und verteilte Systeme<br />
• Serialisierung der Aufrufargumente, . . .<br />
• Aufrufe teils direkt, teils über Behälter, teils über Makler<br />
• Anpassung von Argumenten (und deren Typ), Argumentreihenfolge,<br />
. . . limitiert<br />
• Anpassung während Komponentenentwicklung, Systemkonfiguration<br />
(deployment), Laufzeit
Aufgaben und Ziele: Rückblick II<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 394<br />
Komponentenbegriff: Modul, Klasse, Menge von Klassen (k<strong>eine</strong> oo-Objekte!)<br />
CORBA, EJB, DCOM, .NET:<br />
• Aktivierung/Deaktivierung von Objekten, Persistenz unterstützt<br />
• dynamische Auswahl der aufzurufenden Komponenten durch<br />
Makler/Namensdienste möglich<br />
• Hilfsdienste: Synchronisation, Transaktionsmanagement, . . .<br />
• führt zu dreischichtiger Architektur:<br />
Anwendungskomponenten<br />
Vermittlungsschicht<br />
(ORB, Behälter,. . . )<br />
Datenbasis<br />
(Datenbank, Dienstverzeichnisse, . . . )<br />
Mit <strong>eine</strong>m Wort: Komponentenkomposition ist Mittel zum Verfügbarmachen<br />
von Diensten, vorzugsweise mit normierten Schnittstellen
Kritik<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 395<br />
• allgemein akzeptierte Standardisierung von Schnittstellen nicht möglich<br />
(ein Lern- und ein Aufwandsproblem, geht aber vermutlich prinzipiell<br />
nicht)<br />
• mangelhafte Anpassungsmöglichkeiten für Schnittstellen<br />
• großer Verwaltungsaufwand zur Laufzeit<br />
• Konzentration auf Nebenläufigkeit/Verteilung (außer COM)<br />
• Kopplung von Komponenten dynamisch, mangelhafte statische<br />
Integrationsmöglichkeit<br />
• ungeeignet für lokale Kopplung unter hohen Effizienzanforderungen<br />
• ungeeignet zur Integration von Programmfragmenten unterhalb der<br />
Modul/Klassen-Ebene
Aufgaben und Ziele<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 396<br />
Komponentenbegriff: Modul, Klasse, Menge von Klassen (k<strong>eine</strong> oo-Objekte!),<br />
allgemein: Kollektion von Programmfragmenten<br />
• effiziente Kopplung von Komponenten, möglichst ohne Laufzeitaufwand<br />
• Integration von Programmfragmenten <strong>als</strong> Komponenten<br />
(geht nur statisch, wird aber dynamisch spezifiziert)<br />
• flexible Anpassung von Schnittstellen<br />
• Unterstützung überschneidender Belange (crosscutting concern), d. h. der<br />
Integration von Aspekten, die Änderungen in mehreren Komponenten an<br />
mehreren Stellen gleichzeitig erfordern<br />
Im folgenden und zunächst hauptsächlich Konzentration auf Komposition<br />
sequentieller Systeme
Der Kompositionsprozeß I<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 397<br />
1. Problemlösung:<br />
a Systemidentifikation: Bestimmung der verlangten funktionalen und<br />
nicht-funktionalen Eigenschaften des Gesamtsystems<br />
b Klassifikation dieser Eigenschaften (feature analysis)<br />
c Auswahl (oder Generierung oder Programmierung) der Komponenten<br />
zu diesen Eigenschaften<br />
d Resultat: Sammlung von Komponenten und Spezifikation, wie diese<br />
statisch/dynamisch zusammenwirken<br />
e Validierung des Resultats<br />
erwünschte Nebenbedingungen:<br />
• Prozeß nach Modifikation des Anwendungsproblems leicht wiederholbar<br />
einschl. Validierung (Software-Evolution, Wartung, Konstruktion von<br />
Produktfamilien)<br />
• Komponenten wiederverwendbar (evtl. nach Parametrisierung)
Der Kompositionsprozeß II<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 398<br />
2. Komposition:<br />
• ereignisgesteuerte dynamische Komposition (dynamisches Weben,<br />
Modellvorstellung, in der Implementierung möglichst vermeiden)<br />
• nicht-invasive Komposition: Komponenten (Module/Klassen) <strong>als</strong><br />
<strong>schwarz</strong>e Kästen, Verknüpfung direkt oder mit Klebecode<br />
(Entwurfsmuster Umschlag, Delegation, . . . ), Weben (Klebecode)<br />
statisch oder statisch vorbereitet<br />
• invasive Komposition: Komponenten beliebig, Weben durch Integration<br />
von Programmfragmenten, Weben statisch oder statisch vorbereitet<br />
• Resultat: Spezifikation von Haken und Kompositionsoperationen
Dynamisches und statisches Weben<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 399<br />
Aspekte<br />
Aspekt<br />
1<br />
Ereignis<br />
dynamisches statisches<br />
Weben<br />
Webe−<br />
Punkt<br />
Aspekt<br />
1<br />
1<br />
2<br />
Aspekt<br />
2<br />
Ereignis<br />
gefüllt<br />
von<br />
Aspekt<br />
2<br />
1<br />
2<br />
Weber
Der Kompositionsprozeß III<br />
3. Implementierung der Komposition:<br />
• von Hand: Inspektion der Quellen, Änderungen explizit programmieren<br />
◮ fehleranfällig, nicht reproduzierbar, für größere Systeme nicht<br />
durchführbar<br />
• generativ: Komponenten oder Komponentengruppen automatisch<br />
erzeugt, z. B. durch Spezialisierung generischer Komponenten,<br />
Ergebnisse direkt verknüpfbar (generatives Programmieren)<br />
• statisches Metaprogrammieren: Analyse der Komponenten zum<br />
Zeitpunkt der Komponentenkonstruktion oder Systemkonfiguration,<br />
darauf aufbauend Transformation der Komponenten bzw. automatische<br />
Erzeugung von Klebecode<br />
• dynamisches Metaprogrammieren: Analyse der Komponenten zur<br />
Laufzeit (Reflexion) und automatische, dynamische Anpassung von<br />
Schnittstellen<br />
◮ allgem<strong>eine</strong> Modellvorstellung, praktisch nur in Verbindung mit<br />
statischer Metaprogrammierung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 400
Terminologie, Validierungsbedingungen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 401<br />
• Belang, Merkmal, (System-)Eigenschaft:<br />
◮ in der feature analysis: concept, feature<br />
◮ in AOP: concern, aspect<br />
• überschneidender Belang (crosscutting concern): ein Belang, der<br />
gleichzeitig Änderungen in mehreren Komponenten verlangt<br />
Validierungs- bzw. Korrektheitsbedingungen:<br />
• Problemlösung: Ist das (Anwendungs-)Problem durch die Konmponentenund<br />
Verknüpfungsspezifikationen richtig gelöst?<br />
• Komposition: Ist die Verknüpfungsspezifikation durch die resultierenden<br />
Kompositionsoperationen korrekt implementiert?<br />
• Implementierung der Komposition: ist jede einzelne<br />
Kompositionsoperation korrekt implementiert?<br />
Vorsicht: Die Literatur über AOP, SOP, adaptives Programmieren, usw.<br />
behandelt alle drei Schritte des Kompositionsprozesses integriert und<br />
unterscheidet die verschiedenen Validierungsbedingungen meist nicht!
Trennung der Belange (separation of concerns)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 402<br />
Belang: Systemeigenschaft (funktional/nicht-funktional)<br />
unterscheide<br />
• Problem-Belang: Eigenschaft, die aus der Aufgabe herrührt<br />
• Lösungs-Belang: Eigenschaft, die aus der Lösungstechnik resultiert<br />
Das Wort concern kommt erstm<strong>als</strong> in E.W. Dijkstra: A Discipline of<br />
Programming 1976 vor
Trennung der Belange: Aufgabe<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 403<br />
beschreibe die problem- und lösungsspezifischen Belange so, daß<br />
• sie kanonisch sind: Auch bei unterschiedlichen Lösungsansätzen treten sie<br />
immer auf (allgemeinste Form wählen, Komplexität reduzieren, von<br />
Einzelheiten abstrahieren)<br />
• sie komponierbar sind: C = C 1 ⊕ C 2 liefert Belang C komponiert aus<br />
Belangen C 1 , C 2 mit Kompositionsoperator ⊕. Kompositionszeitpunkt:<br />
Übersetzungszeit, Bindezeit, Programmstart, Objektkonstruktion, Laufzeit<br />
◮ Problem: überschneidende Belange, z. B. Synchronisation, lassen sich<br />
nicht so trennen, daß sie komponierbar werden<br />
• sie implementierbar ist: Belang <strong>als</strong> Code repräsentieren<br />
• sie abgeschlossen sind: Fortgesetzte Komposition C = C 1 ⊕ C 2 , C ′ = C ⊕ · · ·<br />
liefert das Gesamtsystem mit einzeln ersetzbaren<br />
Belang-Implementierungen<br />
• sie validierbar sind: Qualitätskontrolle der funktionalen und<br />
nicht-funktionalen Belange und ihrer Komposition gewährleisten
Vorhandene Ansätze zur Komposition<br />
• Architektursysteme: Funktionale Komposition und Kapselung des<br />
Interaktionsaspekts<br />
• Externe Adaption:<br />
◮ Erweiterungen des objekt-orientierten Paradigmas (composition filters)<br />
• Invasive Komposition:<br />
◮ Generative Ansätze:<br />
Generatives Programmieren in C++<br />
(am Beispiel. Template Metaprogramming/GenVoca)<br />
Kalküle für Komponentensysteme (λN-Kalkül)<br />
Metaobjekt-Komposition<br />
Subjekt-orientiertes Programmieren SOP<br />
◮ Modifizierende Ansätze:<br />
Konzepte: Haken (Webepunkte), Kompositionsschnittstelle<br />
Anwendungsbeispiele<br />
Werkzeuge und Architekturen (AspectJ, RECODER, InjectJ)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 404
Architektursysteme<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 405<br />
• Formalisierung von Blockdiagrammen:<br />
◮ Block = Komponente<br />
◮ Linie = Konnektor<br />
• Detaillierung der Verbindungen: Linien werden auch zu Blöcken<br />
⇒ Kapselung des Interaktionsaspekts in Konnektoren (Adapter)<br />
• Sprache zur Spezifikation der Systemzusammensetzung (Komponenten<br />
und Konnektoren)
Konnektoren<br />
• Elementare Konnektoren:<br />
◮ Voraussetzung: Tore passen zusammen.<br />
◮ Realisiert durch:<br />
Kommunikation über gemeinsamen Speicher<br />
Kanäle<br />
Prozeduraufruf<br />
Nachrichtaustausch<br />
Ereigniskommunikation<br />
• Aufgaben komplexer Konnektoren:<br />
◮ Schnittstellenanpassung<br />
◮ Datenanpassung<br />
◮ Protokollanpassung<br />
◮ Überbrücken von Systemgrenzen (Adreßräume, Verteilung): Fernaufruf<br />
(Marshalling: Serialisierung, Deserialisierung)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 406
Architekturstile<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 407<br />
• Wenn <strong>eine</strong> Architektur nur <strong>eine</strong> bestimmte Art von Konnektoren<br />
verwendet, sagt man, sie hält sich an <strong>eine</strong>n Architekturstil.<br />
• Ein Architekturstil ist <strong>eine</strong> Abstraktion über <strong>eine</strong> Menge von<br />
Software-Architekturen. Er definiert ein Vokabular von Komponenten- und<br />
Konnektortypen sowie <strong>eine</strong> Menge von Regeln nach denen man<br />
Komponenten und Konnektoren legal kombinieren darf.<br />
• Ein Architekturstil sagt nichts über die Protokolle der Interaktion<br />
zwischen Komponenten aus.<br />
• Eine erste Klassifikation von Architekturstilen findet sich in<br />
[Shaw,Clements1996]<br />
• Beispiele für Architekturstile sind:<br />
Datenfluß: Datenflußkonnektoren verbinden die Komponenten zu <strong>eine</strong>m<br />
Datenflußgraph.<br />
Aufruf: Funktionsaufrufe verbinden die Komponenten zu modularen<br />
Systemen, abstrakte Datentypen, objektorientierten Systemen oder<br />
Dienstleistungssystemen (speziell Client-Server-Systeme).
Systemkonstruktion mit Architektursystemen<br />
• Vorgehen: Gegeben <strong>eine</strong> Menge von Komponenten und Konnektoren.<br />
◮ Anordnen zu <strong>eine</strong>m Gesamtsystem<br />
◮ Prüfen der Zweckmäßigkeit<br />
◮ Simulation<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 408
Standardarchitekturen I: Fließband<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 409<br />
Fließband (engl. pipeline): Konnektoren beschreiben den Datenfluß und die<br />
Synchronisation zwischen den einzelnen Teilen des Fließbandes. Steuerund<br />
Datenfluß müssen nicht der gleichen Richtung folgen.
Standardarchitekturen II: Client/Server<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 410<br />
Dienstnehmer/Dienstgeber (engl. client/server):
Standardarchitekturen III: Ablage<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 411<br />
Ablage (engl. repository oder blackboard): Gemeinsam genutzte<br />
Datenverwaltungskomponente.<br />
Unterscheide:<br />
1. Ablage ist Datenbank:<br />
• Datenproduzenten legen Daten ab.<br />
• Datenkonsumenten haben bestimmte Aufgabe, wissen, welche Daten<br />
sie bei der Datenbank abfragen.
Standardarchitekturen III: Ablage (Fortsetzung)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 412<br />
2. Ablage verwaltet Aufträge<br />
• Es werden Aufträge abgelegt bzw. abgeholt.<br />
⇒ Workflowsystem<br />
3. Verteilung der Datenverwaltungskomponente
Standardarchitekturen IV: Schichten<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 413<br />
Schichten: Jede Schicht bietet der darüber liegenden <strong>eine</strong> gewisse<br />
Funktionalität an, stellt sich dieser <strong>als</strong>o <strong>als</strong> virtuelle Maschine dar.
Architektursysteme: Konzepte und Anwendung<br />
• Binden von Toren an interne Dienste<br />
• Komposition <strong>als</strong> parallele, hierarchische Komposition von Prozessen.<br />
Speziell in Darwin: Dienste sind Tore.<br />
◮ Unterscheidung zwischen Import- und Exportschnittstelle.<br />
◮ Explizites Verbinden von exportierten und importierten Toren<br />
(Diensten)<br />
• Trennung von Schnittstelle (Spezifikation) und Implementierung von<br />
Komponenten<br />
• Spezifikation durch Ereignisse und Protokolle<br />
⇒ Simulation möglich<br />
◮ Implementierung ebenfalls durch Simulation<br />
• Große Menge an vorgegebenen Konnektoren (UniCon)<br />
• Benutzerdefinierte Konnektoren möglich<br />
• Bearbeiten der Architekturrepräsentation mit Werkzeugen<br />
⇒ Austauschformat für Architekturbeschreibungen notwendig<br />
◮ Format der Community“: ACME<br />
”<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 414
Modellierung des Bindens von Toren: Darwin (1)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 415<br />
• Beispiel: Systembeschreibung für ein einfaches<br />
Erzeuger-Verbraucher-System in Darwin, Implementierung offen:<br />
#include <br />
#include <br />
struct producer: public process {<br />
portref output;<br />
producer {<br />
for (int i=1; 100; i++)<br />
output.out(char i);<br />
exit(0);<br />
}<br />
}<br />
component producer<br />
{ require output; }<br />
component consumer<br />
{ provide input; }<br />
component producer-consumer {<br />
inst<br />
p : producer@"charles";<br />
c : consumer@"babbage";<br />
bind<br />
p.output -- c.input;<br />
}
Exkurs: Modellierung mit dem π-Kalkül<br />
• Prinzip: Alles wird mit Prozessen modelliert.<br />
• Prozesse kommunizieren über Kanäle durch Ein- und Ausgabeaktionen.<br />
Kanäle sind durch ihren Namen identifiziert.<br />
• Aktionen von Prozessen sind:<br />
• Prozeß:<br />
α ::= āx Ausgabe von x auf Kanal a<br />
a(x) Einlesen von x von Kanal a<br />
τ Stille Aktion<br />
P ::= 0 Leerer Prozeß: k<strong>eine</strong> Aktion, terminiert sofort<br />
α.P Präfix: Ausführen der Aktion α, dann weiter mit P<br />
P + P Indeterministische Auswahl<br />
P | P Parallele Komposition<br />
[x = y]P P falls x = y, [x ≠ y]P P falls x ≠ y<br />
(νx)P Einschränkung: Kanal x ist nur in P bekannt<br />
!P unendliche Replikation von P<br />
A(y 1 , . . . , y n ) Definition <strong>eine</strong>s Prozeßnamens<br />
• Kommunikation kommt bei passenden Ein- und Ausgabepräfixen zwischen<br />
τ<br />
Prozessen zustande: (ȳx.P | y(z).Q) −→ (P | Q{x/z})<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 416
Modellierung des Bindens von Toren: Darwin (2)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 417<br />
Modellierung mit dem π-Kalkül<br />
• Anbieten <strong>eine</strong>s Dienstes s an dem Tor p (provide p;) ist modelliert durch<br />
den Prozeß:<br />
Prov(p, s)<br />
def = !(p(x).¯xs)<br />
s = Referenz auf den angebotenen Dienst,<br />
x = Stelle, an der der Dienst benötigt wird.<br />
• Verlangen nach <strong>eine</strong>m Dienst an der Benutzt-Schnittstelle r (require r;)<br />
ist modelliert durch den Prozeß:<br />
Req(r, l)<br />
def = r(y).ȳl<br />
l = Stelle an der der Dienst benötigt wird,<br />
y = Name des Dienstanbieters (des entsprechenden Tores).<br />
• Binden von Diensten (bind r -- p) ist modelliert durch den Prozeß:<br />
Bind(r, p)<br />
def = ¯rp
Darwin (3): Herstellen <strong>eine</strong>r Bindung<br />
• Herstellen <strong>eine</strong>r Bindung = parallele Komposition der Prozesse Prov, Req<br />
und Bind:<br />
Req(r, l) | Bind(r, p) | Prov(p, s)<br />
≡ r(y).ȳl | ¯rp | !(p(x).¯xs)<br />
≡ ¯pl | !(p(x).¯xs)<br />
≡ ¯ls | !(p(x).¯xs)<br />
Die Referenz auf den Dienst s wird korrekt zum Ort l transportiert, an der<br />
der Dienst benötigt wird.<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 418
Systemsimulation: Rapide (1)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 419<br />
• Simulation durch Modellierung mit Ereignissen möglich.<br />
• Beispiel: System von Num Anwendungen und Num von den Anwendungen<br />
genutzten Ressourcenverwaltern, die über parametrisierte Ereignisse<br />
miteinander kommunizieren.<br />
type Application is interface<br />
extern action Request(p : params);<br />
public action Results(p : params);<br />
end Application;<br />
type Resource is interface<br />
public action Receive(Msg : String);<br />
extern action Results(Msg : String);<br />
constraint<br />
match<br />
((?S in String)(Receive(?S) -> Results(?S)))^(*~);<br />
end Resource;<br />
architecture AP-RM-Only(Num : Integer)<br />
return X/Open is<br />
P : array(Integer) of Application;<br />
Q : array(Integer) of Resource;<br />
connect<br />
for i : Integer in 1..Num generate<br />
(?M in String)<br />
P(i).Request(?M) to Q(i).Receive(?M);<br />
end generate<br />
end AP-RM-Only
Modellierung mit Ereignissen: Rapide (2)<br />
• Legende<br />
◮ -> spezifiziert die kausale Abhängigkeit von Ereignissen,<br />
◮ ? ist der Existenzquantor,<br />
◮ ~ bedeutet Disjunktheit,<br />
◮ * mindestens <strong>eine</strong> bis beliebig viele wiederholte Anwendungen des<br />
folgenden Operators auf alle links davon stehenden Ereignismuster.<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 420
Protokolle: Wright<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 421<br />
• definiert die Semantik von Toren, Konnektoren und Rollen formal im<br />
Prozeßkalkül CSP <strong>als</strong> Prozesse, die Interaktionsprotokolle spezifizieren.<br />
• Die Semantik <strong>eine</strong>s Konnektors ist die parallele Komposition der Prozesse,<br />
die s<strong>eine</strong> Rollen und s<strong>eine</strong>n Kleber (engl. glue) repräsentieren.<br />
• Das System sieht die statische Prüfung von Protokollen durch<br />
Modellprüfung vor.<br />
• Benutzerdefinierte Komponenten- und Konnektortypen möglich.<br />
• Es lassen sich aber nur statische Konfigurationen beschreiben.
Wright: Beispiel<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 422<br />
• Dienstleistungssystem:<br />
System SimpleExample<br />
component Server =<br />
port provide [provide protocol]<br />
spec [Server specification]<br />
component Client =<br />
port request [request protocol]<br />
spec [Client specification]<br />
connector C-S-connector =<br />
role client = (request!x → result?y → client) ⊓ $<br />
role server = (invoke?x → return!y → server) ✷ $<br />
glue (client.request?x → server.invoke!x →<br />
server.return?y → client.result!y → glue) ✷ $<br />
spec = ...<br />
Instances<br />
s : Server<br />
c : Client<br />
cs : C-S-connector<br />
Attachements<br />
s.provide as cs.server;<br />
c.request as cs.client<br />
end SimpleExample
Wright: Beispiel<br />
• Legende<br />
◮ $ = Prozeß, der das Erfolgsereignis akzeptiert und dann terminiert,<br />
◮ ⊓ (interne Auswahl):<br />
bedeutet nicht-deterministische Auswahl <strong>eine</strong>s der verbundenen<br />
Prozesse, wobei der zusammengesetzte Prozeß selbst die Auswahl<br />
trifft,<br />
Interne Auswahl beschreibt verfügbares Verhalten<br />
◮ ✷ bedeutet externe Auswahl.<br />
Externe Auswahl beschreibt notwendig erforderliches Verhalten.<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 423
Austauschformat ACME<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 424<br />
System simple-client-server = {<br />
Component client = {<br />
Port send-request;<br />
Properties { source-code : external = "CODE-LIB/client.c" }<br />
}<br />
Component server = {<br />
Port receive-request;<br />
Properties { idempotence : boolean = true;<br />
max-concurrent-clients : integer = 1;<br />
source-code : external = "CODE-LIB/server.c"<br />
}<br />
}<br />
Connector rpc = {<br />
Roles { caller, callee }<br />
Properties { synchronous : boolean = true;<br />
max-roles : integer = 2;<br />
protocol : Wright = "..."<br />
}<br />
}<br />
}<br />
Attachements : {<br />
client.send-request to rpc.caller;<br />
server.receive-request to rpc.callee<br />
}
Parametrisierung in ACME (1)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 425<br />
Style client-server = {<br />
Component Template client(rpc-call-ports : Ports) = {<br />
Ports rpc-call-ports;<br />
Properties { source-code : external = "CODE-LIB/client.c" }<br />
}<br />
Component Template server(rpc-receive-ports : Ports) = {<br />
Ports rpc-receive-ports;<br />
Properties { source-code : external = "CODE-LIB/server.c" }<br />
}<br />
Template rpc(caller-port, callee-port : Port)<br />
defining (conn : Connector) = {<br />
}<br />
}<br />
conn = Connector {<br />
Roles { caller, callee }<br />
Properties { synchronous : boolean = true;<br />
max-roles : integer = 2;<br />
protocol : Wright = "..."<br />
}<br />
}<br />
Attachements { conn.caller to caller-port;<br />
conn.callee to callee-port<br />
}
Parametrisierung in ACME (2): Anwendung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 426<br />
System complex-client-server : client-server = {<br />
c1 = client(send-request); c2 = client(send-request);<br />
c3 = client(send-request);<br />
s1 = server(receive-request); s2 = server(receive-request);<br />
}<br />
rpc(c1.send-request, s1.receive-request);<br />
rpc(c2.send-request, s1,receive-request);<br />
rpc(c3.send-request, s2,receive-request);
Architektursysteme: Beurteilung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 427<br />
• Kapselung des Interaktionsaspekts<br />
• Anpassungen durch Konnektoren<br />
• Systemrekonfiguration = Austauschen von Konnektoren.<br />
• Nicht-invasive Anpassung<br />
• Komponentenbegriff: Modul/Klasse (rekursiv)<br />
• ABER:<br />
◮ Tore müssen bereits in den Komponenten gekennzeichnet sein (meist<br />
manueller Prozeß)<br />
◮ Nachträgliches Hinzufügen von Toren nur manuell möglich.<br />
◮ Eingeschränkte Adaptionsmöglichkeiten: Z.B. k<strong>eine</strong> Anpassung von<br />
Komponenten bzgl. angebotener Dienste<br />
◮ Viele verschiedene Sprachen und Formalismen, jeweils für bestimmten<br />
Zweck.<br />
+ Formalisierung von Blockdiagrammen<br />
+ Integration von Protokollen<br />
– Geringe Akzeptanz, weil neue Sprachen erfunden wurden oder die<br />
Formalismen nicht in die (Basis-)Programmiersprachen integriert sind:<br />
andere Syntax und Semantik.<br />
– Manuelles Abgleichen der Abstraktion und des Quelltextes notwendig<br />
⇒ Inkonsistenzen möglich (vgl. Model Driven Architecture)
Kompositionsfilter (composition filters, CF)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 428<br />
Hauptentwickler: Mehmed Aksit et al., U Twente<br />
• Ältester Ansatz (seit 1992)<br />
• Idee: Botschaften zwischen Objekten werden gefiltert
Kompositionsfilter: Beispiele<br />
• Beispiele für Filter<br />
◮ Botschaften verschlucken<br />
◮ Botschaften delegieren (Vererbung, Delegation)<br />
◮ Botschaften verzögert weiterleiten<br />
◮ mit anderen Objekten synchronisieren (Synchronisationsprotokolle)<br />
◮ Objekt(e) modifizieren (Anpassung)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 429
Kompositionsfilter: Umsetzung (1)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 430<br />
eingehende Botschaften<br />
Eingangs−<br />
filter<br />
• Umwicklen <strong>eine</strong>s Objekts mit Schnittstellenobjekt,<br />
das die Filter enthält.<br />
◮ Botschaft: Methodenaufruf + Absender<br />
+ Empfänger<br />
◮ Kernobjekt: das Objekt, dessen<br />
Ein/Ausgang gefiltert wird.<br />
◮ Eingangsbotschaften durchlaufen alle<br />
Filter, bevor sie (eventuell) an das<br />
Kernobjekt gehen, Ausgangsbotschaften<br />
analog<br />
externe Objekte<br />
interne Objekte<br />
Kern−<br />
objekt<br />
Schnittstellenobjekt<br />
Ausgangs−<br />
filter<br />
ausgehende Botschaften
Kompositionsfilter: Umsetzung (2)<br />
• Implementierung:<br />
◮ Sicherstellen, daß Kommunikation immer Schnittstellenobjekte trifft<br />
und nicht direkt das umwickelte Objekt. Das Umgehen der Filter darf<br />
nicht möglich sein!<br />
◮ Problem: Selbstreferenzen (Objektschizophrenie)<br />
Kernobjekt identifiziert durch Pseudovariable inner.<br />
Kernobjekt + Schnittstellenobjekt identifiziert durch Pseudovariable<br />
self. self wird nicht dynamisch gebunden.<br />
Pseudovariable server entspricht dynamisch gebundener<br />
Selbstreferenz: Objekt an das die ursprüngliche Nachricht ging.<br />
• Auslegung der Filter <strong>als</strong> Objekte<br />
⇒ Dynamische Anpassung durch Filtertausch möglich<br />
• Konsequenz: Sehr mächtiges Konzept, besonders zur Anpassung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 431
CF: Sandkasten<br />
• Fängt alle Botschaften von und an Komponente ab<br />
• Technik bekannt aus EJB Container<br />
◮ Dort k<strong>eine</strong> echte Delegation<br />
◮ In Methoden des Kernobjekts ist this das Kernobjekt<br />
◮ Direkte Aufrufe an eigene Methoden<br />
◮ Weitergabe von Referenzen auf this möglich<br />
(wird nur bei Fernaufrufen auf stub umgesetzt)<br />
• Echte Delegation einfach in nachrichtenbasierten Sprachen (z.B.<br />
Smalltalk)<br />
• In aufrufbasierten Sprachen<br />
◮ Korrektheitsannahme: Komponente kann sich selbst ohne Filter nutzen<br />
◮ Granularitätsannahme: es gibt nur Komponenten, alles unter dieser<br />
Ebene ist uninteressant<br />
◮ Also sind Eingangs- und Rückgabefilter hinreichend<br />
◮ Biege dort alle Referenzen auf Kernobjekte zu den Filterobjekten um<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 432
CF: Beispiele Eingangsfilter<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 433<br />
• Ausnahme: Aufruf abweisen (argument-/absender-/zeitabhängig)<br />
• Delegation: Aufruf an anderes Objekt weiterleiten<br />
• Warten: Aufruf zwischenpuffern (Kommunikationsprotokoll einhalten)<br />
• Anpassen: andere Methode aufrufen, Argumente umordnen, Werte oder<br />
Typen ändern, Argumente ergänzen<br />
• Zusatz: zusätzlichen Aufruf (auch <strong>eine</strong>s anderen Objekts) einfügen<br />
Filter können von Bedingungen über den Zustand des Schnittstellen-, des<br />
Kernobjekts oder anderer Objekte abhängen
CF: überschneidende Belange<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 434<br />
Methodik (Überlagern von Filtern, superimposition of concerns):<br />
• Filtermethode verallgem<strong>eine</strong>rn zu Methode <strong>eine</strong>s eigenständigen<br />
Filterobjekts<br />
• Folge der Filter <strong>eine</strong>s Schnittstellenobjekts zur Laufzeit änderbar<br />
• Filterobjekt bestimmt bei Initialisierung (oder später) die<br />
Schnittstellenobjekte, bei denen es Filter hinzufügt (oder zurückzieht)<br />
Beispiel Zugriffssynchronisation:<br />
• Zugriffe auf ein Objekt müssen warten, wenn Objekt gesperrt<br />
• Bei Freigabe wird wartender Zugriff reaktiviert
CF: Implementierung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 435<br />
• derzeit Implementierung von Hand<br />
• Spezifikationssprache zur deklarativen Beschreibung von<br />
Schnittstellenobjekten und Filtern vorhanden<br />
• aus Beschreibungssprache generierte Implementierung in Arbeit<br />
(CompositionJ-System)<br />
Einzelheiten unter http://trese.cs.utwente.nl/aksit/aksit_trese.htm
CF: Beispiel (1)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 436<br />
Vererbung durch Delegation: Bestimmte Methoden der Oberklasse<br />
(ClaimDocument) dürfen nur in bestimmten Objektzuständen aufgerufen<br />
werden.<br />
concern ProtectedClaimDocument begin<br />
filterinterface documentWithViews begin<br />
intern<strong>als</strong><br />
document: ClaimDocument; // Verweis auf Objekt der Oberklasse<br />
extern<strong>als</strong> // k<strong>eine</strong> externen Objekte notwendig<br />
// Seiteneffektfreie Methoden zum Abfragen des<br />
// Objektzustands, der bei der Auswertung der Filter benötigt wird.<br />
conditions<br />
inactiveRequestHandler; inactiveRequestDispatcher;<br />
inactiveMedicalCheck; inactivePayment; inactiveOutputHandler;<br />
methods // aufrufbare, gewöhnliche Methoden<br />
activeTask();
CF: Beispiel (2): Eingabefilter<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 437<br />
inputfilters<br />
// Filter ::= Filtername: Filtertyp = Menge von Filterelementen<br />
// Filterelement ::= Bedingung => Nachrichtenausdruck<br />
// d.h. bei erfüllter Bedingung werden die Nachrichten im<br />
// Nachrichtenausdruck akzeptiert.<br />
//<br />
// Filterelement ::= Bedingung ~> Nachrichtenausdruck<br />
// d.h. bei erfüllter Bedingung werden alle Nachrichten<br />
// akzeptiert, außer den im Nachrichtenausdruck angegebenen<br />
//<br />
viewP: Error = { inactivePayment ~><br />
{putApprovedClaim, approvedClaim} };<br />
viewMC: Error = { inactiveMedicalCheck ~><br />
{putMedicalCheckData, medicalCheckData}};<br />
// etc.<br />
// Delegation der Aufrufe zur Realisierung von Vererbung:<br />
// inner verweist auf das Kernimplementierungsobjekt<br />
inh: Dispatch = { inner.*, document.* };<br />
end filterinterfaceDocumentWithViews
CF: Beispiel (3): Implementierung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 438<br />
implementation in Java // beispielsweise<br />
class ProtectedClaimDocument {<br />
boolean inactiveRequestHandler() { ... }<br />
boolean inactiveRequestDispatcher() { ... }<br />
boolean inactiveMedicalCheck() { ... }<br />
boolean inactivePayment() { ... }<br />
boolean inactiveOutputHandler() { ... }<br />
String activeTask() { ... }<br />
}<br />
end implementation<br />
end concern ProtectedClaimDocument
CF: Beispiel (4): Superimposition (Aspektweben)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 439<br />
concern Locking begin // Synchronisation<br />
filterinterface lockBehavior begin<br />
intern<strong>als</strong><br />
lockState : boolean; // wahr, falls gesperrt<br />
methods<br />
lock();<br />
unlock();<br />
conditions<br />
Unlocked();<br />
inputfilters<br />
// unlock geht immer, alles andere nur im Zustand Unlocked:<br />
//<br />
lockAll: Wait = { unlock, Unlocked => * };<br />
disp: Dispatch = { lock, unlock };<br />
end filterinterface lockBehavior;<br />
superimposition begin // abstrakter Belang<br />
end superimposition<br />
implementation in Java;<br />
class LockingSupport {<br />
void lock() { lockstate = true; }<br />
void unlock() { lockstate = f<strong>als</strong>e; }<br />
boolean Unlocked() { return !lockstate; }<br />
}<br />
end implementation<br />
end concern Locking;
CF: Beispiel (5): Superimposition Anwendung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 440<br />
// Anwendung des Locking-Belangs auf die Workflow-Applikation<br />
concern WorkflowLocking begin<br />
superimposition begin<br />
selectors<br />
// Belang anwenden auf Unterklassen von Document und<br />
// TaskProcessor:<br />
//<br />
applObjects = { *:Document, *:TaskProcessor};<br />
methods // Einzuwebende Methoden<br />
applObjects
CF: Beurteilung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 441<br />
• nicht-invasive Komposition<br />
• Komponentenbegriff: Klasse/Gruppe von Klassen<br />
• Filterobjektklassen <strong>als</strong> Komponenten auffaßbar ( ”<br />
Konnektorklasse“)<br />
+ sehr mächtiges Verfahren: CORBA usw lassen sich <strong>als</strong> Spezialfälle<br />
darstellen<br />
• Verallgem<strong>eine</strong>rung der Idee der UNIX-pipe<br />
+ sequentiell und verteilt benutzbar<br />
+ Spezifikationsverfahren vorhanden<br />
+ bei kl<strong>eine</strong>n Systemen sehr einfach von Hand implementierbar<br />
− für große Systeme fehlt bislang Werkzeugunterstützung<br />
− Validierungsmethodik angedacht, aber noch nicht ausgearbeitet<br />
± mittlere Effizienz: u. U. zahlreiche zusätzliche Methodenaufrufe
Übersicht<br />
• Architektursysteme: Funktionale Komposition und Kapselung des<br />
Interaktionsaspekts<br />
• Externe Adaption:<br />
◮ Erweiterungen des objekt-orientierten Paradigmas (composition filters)<br />
• Invasive Komposition:<br />
◮ Generative Ansätze:<br />
Kalküle für Komponentensysteme (λN-Kalkül)<br />
Metaobjekt-Komposition<br />
Generatives Programmieren in C++<br />
(am Beispiel. Template Metaprogramming/GenVoca)<br />
Subjekt-orientiertes Programmieren SOP<br />
◮ Modifizierende Ansätze:<br />
Konzepte: Haken (Webepunkte), Kompositionsschnittstelle<br />
Anwendungsbeispiele<br />
Werkzeuge und Architekturen (AspectJ, RECODER, InjectJ)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 442
LambdaN-Kalkül (λN)<br />
• Erster Kalkül zur Codekomposition<br />
• Erweiterung des Lambda-Kalküls<br />
◮ Benannte Argumente<br />
◮ Namensabhängige Reduktionsregeln<br />
• Zweck<br />
◮ Mehrfachdefinition von Funktionen<br />
◮ Einfache Vereinigung ihres Codes<br />
• Prinzip: Elimination von Konnektoren, indem man von <strong>eine</strong>m Aufrufer<br />
durch Integration des Codes direkt zum Ziel umschaltet (Vereinigung<br />
zweier Komponenten).<br />
• Realisierung: Mischregeln<br />
◮ Umbenennung von Parametern<br />
◮ Vereinigung von Ausdrücken<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 443
Beispiel<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 444<br />
f = lambda x y z .<br />
let r = x+z in<br />
let s = y*x in<br />
record(r+s)<br />
.<br />
↓<br />
Vereinigung (union) ←<br />
↓<br />
f = lambda x y z a b .<br />
let r = x+z in<br />
let s = y*x in<br />
let t = a+b in<br />
record(r+s,t)<br />
.<br />
f = lambda a b .<br />
let x = a+b in<br />
record(x)<br />
.<br />
↓<br />
Umbenennung (rename)<br />
↓<br />
f = lambda a b .<br />
let t = a+b in<br />
record(t)<br />
.<br />
λN-vereinigte datenunabhängige Slices<br />
f(x=1,y=2,z=3) f(a=1,b=2)<br />
↓<br />
↓<br />
f(x=1,y=2,z=3,a=1,b=2)
Metaobjektkomposition: Hintergrund<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 445<br />
• Erweiterung von LISP um Objektorientierung<br />
→ Zwei Systeme: Flavors und CLOS (Common LSIP Object System)<br />
• Problem: Beide Systeme unterscheiden sich bzgl. der Semantik von<br />
Vererbung, Polymorphie und des Zugriffs auf Oberklassen<br />
⇒ Integration von CLOS- und Flavors-Programmen erfordert umfangreiche<br />
manuelle Anpassungen<br />
• Beobachtung: LISP wird interpretiert<br />
⇒ Semantik der Operationen wird im Interpreter festgelegt und kann dort<br />
abhängig von der Herkunft des Objekts (Flavors oder CLOS)<br />
entsprechend eingestellt werden.<br />
⇒ Man muß Objekten ihre Herkunft (im Beispiel Flavors oder CLOS)<br />
ansehen können.<br />
⇒ Kennzeichnung der Objekte auf Metaebene durch Metaobjekte
Metaobjekt-Komposition<br />
• Ziel: Separate Realisierung von Belangen mit anschließendem<br />
Zusammenmischen für konkrete Anwendung (Klassen).<br />
• Realisierung:<br />
◮ Klasseneigenschaften <strong>als</strong> Metaobjekt darstellen<br />
(tracing, counting, verbose, persistent,..)<br />
◮ Kombination durch Aggregation auf Metaebene<br />
◮ Der eigentliche Code <strong>eine</strong>r Klasse ergibt sich aus<br />
den Methoden<br />
dem Code der Metaobjekte<br />
(auf irgend<strong>eine</strong> Weise komponiert;<br />
de facto beschränkt auf Prozedurein-/ausgang)<br />
• Simulation mit LambdaN möglich<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 446
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 447<br />
Beispiel<br />
Beispiel<br />
Class c {<br />
Procedure p() {<br />
fetch_from_db(self);<br />
print("enter p");<br />
Normale<br />
Klasse<br />
Metaobjekt-Klassen<br />
persistence<br />
composing<br />
Metaobjekt-<br />
Methoden<br />
precode<br />
postcode<br />
p_counter++;<br />
/* algorithm */<br />
c<br />
verbosity<br />
precode<br />
postcode<br />
// counting: nothing<br />
print("exit p");<br />
counting<br />
precode<br />
postcode<br />
}<br />
}<br />
store_to_db(self);<br />
p<br />
Algorithmus<br />
• K<strong>eine</strong> Aussage über Reihenfolge des Einwebens!<br />
• Aspektinteraktion ist noch offene Forschungsfrage<br />
Dr. Welf Löwe und Markus Noga 15
Generatives Programmieren: Prinzip<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 448<br />
• Nicht mehr jede einzelne Komponente in der Komponentenbibliothek<br />
vorrätig, sondern nur Schablonen, die durch Spezialisierung <strong>eine</strong> Gruppe<br />
von Komponenten erzeugen können.<br />
• Interpretation am Beispiel yacc/bison:<br />
1 Generator<br />
2 Instantiierung <strong>eine</strong>s Rahmensystems:<br />
Eingabe: Kontextfreie Grammatik + Versatzstücke, die Code an<br />
Anknüpfungspunkten darstellen.<br />
3 Sammlung von Klassen, die zusammen <strong>eine</strong> generische Komponente<br />
darstellen. yacc/bison sind der Bauplan, der er es uns ermöglicht<br />
zusätzliche Informationen und Versatzstücke zu nehmen und<br />
zusammenzubinden.<br />
→ algorithmischer Bauplan
Generatives Programmieren in C++<br />
am Beispiel Template Metaprogramming/GenVoca<br />
• Templates in C++<br />
◮ Parametrisierte Typausdrücke<br />
◮ Auswertung bei Übersetzung<br />
• Idee: Nutze Templates zur Komposition<br />
• Nachteil: Unlesbare Programme (Zweckentfremdung!)<br />
• Umsetzung auch denkbar mit<br />
◮ statisch ausgewertetem Lambda-Kalkül<br />
◮ offener Programmiersprache (z.B. OpenC++): Spracherweiterung über<br />
Metaobjektprotokoll, z.B. Abbildung neuer Syntax auf vorhandene.<br />
• GenVoca (Batory)<br />
◮ Mehrfach-Parametrisierung mit geschachtelten Template-Parametern<br />
(Konfiguration in mehreren Dimensionen)<br />
◮ Hauptsächlich für innere Anpassung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 449
GP am Beispiel STL<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 450
Kontrollstrukturen mit Schablonen in C++<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 451<br />
// Statisch ausgewerteter SWITCH <strong>als</strong> Typ<br />
template struct SWITCH {<br />
typedef aCase::next nextCase;<br />
// Statische Berechnung bei Übersetzung<br />
enum { tag = aCase::tag,<br />
nextTag = nextCase::tag,<br />
found = (tag == Tag || tag == DEFAULT) };<br />
// Statische Auswertung bei Übersetzung<br />
typedef IF ::RET nextSwitch;<br />
typedef IF::RET RET;<br />
};
Generische Klassen und Rahmensysteme<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 452<br />
Generische Klassen (templates) und<br />
Rahmenwerke (frameworks)<br />
Formale<br />
Parameterklasse Parameterklasseninstanz<br />
Template<br />
Template<br />
class<br />
class<br />
Hook<br />
Hook<br />
class<br />
class<br />
Dr. Welf Löwe und Markus Noga 19
enVoca: Komposition durch Schachtelung generischer Klassen<br />
GenVoca: Komposition durch<br />
Schachtelung von generischen Klassen<br />
Template T< T1< T2 ,T4 > ><br />
T2<br />
T3<br />
T<br />
T1<br />
T4<br />
T5<br />
Alle Ti sind unabhängig voneinander austauschbar, d.h. konfigurierbar!<br />
Alle Ti sind unabhängig (statische voneinander Komposition) austauschbar, d.h. konfigurierbar!<br />
(statische Komposition)<br />
Dr. Welf Löwe und Markus Noga 20<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 453
Komponentensicht<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 454<br />
Komponentensicht<br />
T3<br />
T3<br />
T5<br />
T5<br />
T1<br />
T2<br />
T4<br />
T<br />
Komponenten werden intern adaptierbar, da innere Einheiten unabhängig von<br />
Komponenten werden intern adaptierbar, da innere Einheiten unabhängig vo<br />
äußeren ausgetauscht werden können.<br />
äusseren ausgetauscht werden können<br />
Dr. Welf Löwe und Markus Noga 21
Subjekt-orientiertes Programmieren (SOP)<br />
Hauptentwickler: Ossher, Harrison (IBM research)<br />
• Idee: Klassen fassen verschiedene subjektive Sichten auf Objekte<br />
zusammen. Ein Subjekt ist <strong>eine</strong> solche Sicht. Also:<br />
◮ Teile von Klassen <strong>als</strong> Subjekte beschreiben<br />
◮ Subjekte durch Mischregeln zu Klassen zusammenführen<br />
• Subjekte umfassen<br />
◮ Operationen (generische Methoden)<br />
◮ Klassen- und Objektvariable<br />
◮ Umsetzung der Operationen in konkreten Klassen<br />
(Realisierung mittels Generator)<br />
◮ Beschreibung mit eingebettetem C++<br />
• Mischregeln<br />
◮ Beschreibung mit einfacher Operatorsprache<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 455
Beispiel<br />
• Ein einfaches Subjekt<br />
Subject: PAYROLL<br />
Operations: print()<br />
Classes : Employee()<br />
with InstanceVariables: _emplName;<br />
Mapping : Class Employee, Operation Print()<br />
implemented by<br />
&Employee::Print()<br />
// others...<br />
• Mischen nach Regeln<br />
◮ Zielklassen erhalten Operationen der beteiligten Subjekte<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 456
Mischregeln in SOP<br />
• Komposition mit fest vorgegebenen Operatoren<br />
◮ Bindungen zwischen Subjekt und Implementierung<br />
equate (Zuweisung)<br />
correspond (Delegation)<br />
◮ Kombination verschiedener Subjekte<br />
replace (Überschreiben)<br />
join (Verbinden von Subjektteilen)<br />
◮ Mischformen von Bindung und Kombination<br />
merge = join; equate<br />
override<br />
• Anwendungen aus C++ leicht erweiterbar<br />
• Mischmodell dank fester Regeln kaum erweiterbar!<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 457
Weiterentwicklungen von SOP<br />
• subject-oriented design (SOD)<br />
◮ Schritt von der Programmiertechnik zum Entwurfsverfahren<br />
◮ Im wesentlichen: SOP auf UML-Diagrammen<br />
• multidimensional separation of concerns<br />
◮ Subjekte heißen jetzt hyperslices<br />
Neuerung: Explizite Importschnittstelle:<br />
Deklaration aller verwendeten fremden Felder und Methoden<br />
◮ hyperspace<br />
Boolesche Matrix der Belange und umsetzenden hyperslices<br />
Strukturiert die Komposition<br />
◮ hypermodules<br />
Menge von hyperslices<br />
Kompositionsoperatoren wie in SOP<br />
◮ Werkzeug HyperJ: http://www.alphaworks.ibm.com/tech/hyperj<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 458
Übersicht<br />
• Architektursysteme: Funktionale Komposition und Kapselung des<br />
Interaktionsaspekts<br />
• Externe Adaption:<br />
◮ Erweiterungen des objekt-orientierten Paradigmas (composition filters)<br />
• Invasive Komposition:<br />
◮ Generative Ansätze:<br />
Generatives Programmieren in C++<br />
(am Beispiel. Template Metaprogramming/GenVoca)<br />
Kalküle für Komponentensysteme (λN-Kalkül)<br />
Metaobjekt-Komposition<br />
Subjekt-orientiertes Programmieren SOP<br />
◮ Modifizierende Ansätze:<br />
Konzepte: Haken (Webepunkte), Kompositionsschnittstelle<br />
Anwendungsbeispiele<br />
Werkzeuge und Architekturen (AspectJ, RECODER, InjectJ)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 459
Invasive Softwarekomposition<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 460<br />
• Invasive Komposition adaptiert und erweitert Komponenten an Haken<br />
durch Programmtransformation<br />
• Allgem<strong>eine</strong>r Mechanismus<br />
• Anwendungsgebiete<br />
◮ Anpassung<br />
◮ sichtenorientierte Entwicklung (u. a. SOP)<br />
◮ Aspektorientierte Entwicklung<br />
• Haken sind Ansatzpunkte für Adaption und Erweiterung<br />
◮ implizit (durch Sprachsyntax definiert)<br />
◮ vereinbart (explizit <strong>als</strong> Kompositionsschnittstelle ausgewiesen)<br />
• Bemerkung: Sichten sind orthogonale Aspekte
Terminologie<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 461<br />
• Komponentenbegriff: Kollektion von Programmfragmenten<br />
• Haken, Webepunkt, Anknüpfungspunkt (join point): Programmstelle, an<br />
der ein Programmfragment eingesetzt wird<br />
• Tor (port): Kommunikationsschnittstelle <strong>eine</strong>r Komponente, an der<br />
Konnektoren ansetzen.<br />
Tore werden alternativ durch Haken ersetzt oder bleiben bestehen, weil<br />
wir invasive und nicht-invasive Komposition mischen.<br />
• Konnektor (Kanal, Filter, . . . ): Programmeinheit, die Komponenten<br />
verbindet (und ev. bei invasiver Komposition aufgelöst wird)<br />
Unterscheide:<br />
• (funktionale) Schnittstelle: gegeben durch Signatur <strong>eine</strong>r Klasse<br />
• Kompositionsschnittstelle: Verzeichnis der Haken und Tore, an denen<br />
invasive oder nicht-invasive Komposition ansetzt<br />
Beide Begriffe sind nicht deckungsgleich:<br />
• Kompositionsschnittstelle umfaßt immer die funktionale Schnittstelle.<br />
• Tore gehören immer auch zur funktionalen Schnittstelle.
Haken<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 462<br />
• durch Sprachsyntax definiert: Methodenanfang/Ende, Vereinbarungen, . . .<br />
• Beispiel: Methodeneintritt/austritt für Umwicklung (wrapping), z.B. zum<br />
Umwickeln Beispiel: <strong>eine</strong>s Test-Aspekts<br />
Methodeneintritt/austritt für Umwicklung<br />
• Haken in(wrapping), AspectJ (Kiczales):<br />
z.B. zum<br />
vor<br />
Umwickeln<br />
und nach<strong>eine</strong>s Methodenaufrufen<br />
Test-Aspektsoder<br />
Zugriffen auf Attribute.<br />
m(...) {<br />
// Method.entry<br />
abc(); Method.entry<br />
// ...<br />
cde();<br />
// Method.exit Method.exit<br />
return<br />
}<br />
Implizite Webepunkte<br />
m (){<br />
}<br />
abc..<br />
cde..<br />
Method.entry<br />
Method.exit<br />
Dr. Welf Löwe und Markus Noga 23
Haken in COMPOST<br />
Deklarierte Webepunkte<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 463<br />
Die Kompositionsschnittstelle <strong>eine</strong>r Komponente besteht aus ihren<br />
explizit deklarierten Webepunkten<br />
Deklarationen<br />
Vereinbarung von Haken durch explizite Kennzeichnung von<br />
Deklaration von Programmstellen Webepunkten durch <strong>als</strong>Spracherweiterungen Tore, z. B. durch oder z.B.<br />
– Standardisierte Namenspräfixe<br />
◮ Spracherweiterung<br />
– Vererbungsbeziehungen<br />
◮ standardisierte Namenspräfixe<br />
– Standardisierte Kommentar-Marken<br />
◮ Vererbungsbeziehungen<br />
◮ standardisierte Kommentar-Marken<br />
Dr. Welf Löwe und Markus Noga 24<br />
◮ standardisierte Methodenaufrufe
Haken für Kommunikation (Tore)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 464<br />
m (){<br />
}<br />
• Deklaration durch Aufruf abstrakter Kommunikationsmethoden<br />
m (){<br />
// Aufruf<br />
e = p(d);<br />
}<br />
out(d); // Ausgangstor<br />
in(e); // Eingangstor<br />
m (){<br />
// Ereignis<br />
notifyObservers(d);<br />
e = listen_to();<br />
}<br />
⇒ Verallgem<strong>eine</strong>rung des Entwurfsmusters Schablonenmethode
Beispiel Kunde/Buchhandlung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 465<br />
• Kunde<br />
import Buchhandlung;<br />
• Buchhandlung<br />
public class Buchhandlung {<br />
public class Kunde {<br />
public bestelle(String server) {<br />
// allocate new server<br />
Buchhandlung bh=<br />
holeBuchhandlung(server);<br />
}<br />
// call the services<br />
bh.sucheAus();<br />
bh.kaufe();<br />
}<br />
}<br />
public Buchhandlung() {...}<br />
public void sucheAus() {<br />
System.out.println(<br />
"suche aus.." );<br />
}<br />
public void kaufe() {<br />
System.out.println(<br />
"kaufe" );<br />
}
Invasive Anpassung an CORBA<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 466<br />
• Den Haken bh.sucheAus kann man invasiv auch durch <strong>eine</strong>n anderen Aufruf<br />
ersetzen, falls in der Schnittstelle der Buchhandlung die gesuchte Methode<br />
beispielsweise choose heißt. Gleiches gilt für den Haken bh.kaufe.
Systematik der Komposition<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 467<br />
gegeben: mehrere Programmeinheiten (Komponenten, Aspekte, . . . ), die<br />
verknüpft werden sollen, um bestimmte Ziele (Kontrakte) Z zu erreichen<br />
1 bestimme Kompositionsstrategie (CF, invasiv, . . . )<br />
2 bestimme Kompositionsschnittstelle (vereinbare bei Bedarf Haken)<br />
3 löse die Verknüpfung auf in <strong>eine</strong> Menge einzelner Verknüpfungsschritte,<br />
die zusammengenommen (!) die gewünschte Verknüpfung ergeben<br />
4 prüfe die Korrektheit von Schritt 3 mit Bezug auf Z<br />
5 identifiziere die Haken (Kompositionsschnittstelle)<br />
6 prüfe die Anwendungsbedingungen der einzelnen Verknüpfungsschritte<br />
7 führe die Verknüpfungsschritte aus<br />
Jeder Verknüpfungsschritt ist <strong>eine</strong> Programmtransformation, die Anwendung<br />
<strong>eine</strong>s Kompositors
Invasive Komposition mit Kompositoren<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 468<br />
Invasive Komposition mit Kompositoren<br />
• Kompositoren werden realisiert durch Transformatoren, Optimierer,<br />
Übersetzer, Metaoperatoren, Metaprogramme<br />
Kompositoren sind Transformatoren, Optimierer,<br />
Übersetzer, Metaoperatoren, Metaprogramme<br />
Kompositor<br />
Kompositor<br />
Erkennen (ungebundener)<br />
Webepunkte<br />
Konsistentes<br />
Transformieren<br />
zu gebundenen<br />
Webepunkten<br />
Invasiv transformierter Code<br />
Dr. Welf Löwe und Markus Noga 26
Geheimnisprinzip der invasiven Komposition<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 469<br />
• Komposition verwendet nur syntaktische und semantische Eigenschaften<br />
der Kompositionsschnittstelle, der Rest der Komponente bleibt unberührt.<br />
⇒ die Kompositionsschnittstelle kapselt die Komponente<br />
• Austausch gegen <strong>eine</strong> Variante wird möglich<br />
• Entspricht dem Geheimnisprinzip in<br />
◮ Moduln<br />
◮ Rahmensystemen<br />
◮ Architektursprachen<br />
◮ Aspect/J<br />
• aber wesentlich flexibler
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 470<br />
Vererbung und Delegation sind Kompositoren<br />
Vererbung und Delegation sind Kompositoren<br />
K<br />
Passe<br />
Passe<br />
invasiv an<br />
invasiv an<br />
Vererbe<br />
Vererbe<br />
Delegiere<br />
Delegiere<br />
K<br />
K-Unterklasse<br />
K<br />
K-privat<br />
Prinzip:<br />
• Vererbung = statische Komposition<br />
• Delegation = dynamische Komposition<br />
Dr. Welf Löwe und Markus Noga 34
Erweiterungsoperatoren für Klassen sind Kompositoren<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 471<br />
Anwendung auf SOP:<br />
Erweiterungsoperatoren für Klassen<br />
(z.B. SOP) sind Kompositoren<br />
K<br />
+ +<br />
K<br />
Physikalische Sicht <strong>als</strong><br />
Verschmelzung der<br />
logischen Sichten<br />
K<br />
+ +<br />
Jede Komponente<br />
behält ihre logische<br />
Sicht<br />
Dr. Welf Löwe und Markus Noga 35
Ziele invasiver Modifikation<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 472<br />
• seiteneffektfreie konsistente Komposition (Technik: Vererbung)<br />
• dynamischer Austausch (Technik: Delegation)<br />
• Erweiterungen um Sichten (Sichtenkonzept)<br />
• aspektorientierte Entwicklung (invasives Einmischen wie in AOP)<br />
• transparenter Komponentenwechsel<br />
Bemerkung: Vererbung und Delegation sind Spezialfälle invasiver<br />
Komposition. Beide Kompositoren kann man auch nicht invasiv einsetzen.
Wie implementiert man Kompositoren?<br />
• Weben und invasives Komponieren.<br />
◮ Wie webt man Aspektcode?<br />
◮ Wie komponiert man invasiv?<br />
◮ Antwort: Durch Metaprogrammieren auf der Grundlage konventioneller<br />
Übersetzertechnik.<br />
• Ein Programm verarbeitet Daten.<br />
Ein Programm ist ein Datum. (→ Strukturgraph)<br />
• Ein Metaprogramm verarbeitet Programme.<br />
Ein Metaprogramm ist ein Programm.<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 473
Dynamisches und statisches Komponieren<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 474<br />
• Kompositoren arbeiten dynamisch (vgl. Veranschaulichung von AOP,<br />
Folie 0): Sie beeinflussen Abläufe.<br />
• Kompositoren müssen statisch vorbereitet werden. Dabei kann der<br />
Kompositor selbst bereits eliminiert werden.<br />
⇒<br />
• Arbeitseinheiten der Komposition sind Module, Funktionsvereinbarungen,<br />
Anweisungsfolgen, Ausdrücke, . . .<br />
• Solche Programmfragmente entsprechen dynamisch gesehen Abläufen,<br />
oder Mengen von Abläufen<br />
• Einfügen neuer Zustände oder Zustandsübergänge<br />
◮ dynamisch zur Laufzeit.<br />
◮ statisch durch Einfügen neuer Variablen oder Anweisungen.<br />
• Ein Programm enthält neben Berechnungsschritten auch Schnittstellen,<br />
die der Gliederung und Konsistenzsicherung dienen.
Idee: Komposition <strong>als</strong> Programmtransformation<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 475<br />
Programmtransformation ist Elementartechnik.<br />
• Bekanntes Beispiel: Funktionsrumpf einsetzen (Substitution, offener<br />
Einbau)<br />
f(x) { A(x) } wird zu f(x) { A(x) }<br />
... f(z) ... ... A(x)[z/x] ...<br />
Anwendungsbedingung: f nicht rekursiv.<br />
• Beispiel für Schnittstellentransformation: Partielle Klassenabstraktion<br />
(fügt <strong>eine</strong> polymorphe Variationsstelle ein)<br />
class A { abstract class AA {<br />
R f(int x) { ... } wird zu abstract R f(int x) { ... }<br />
} }<br />
class A extends AA { ...}<br />
... A z = new A() ... ... AA z = new A() ...<br />
• Hier <strong>als</strong> Quell-zu-Quell-Transformation notiert:<br />
◮ verständliche Darstellung<br />
◮ geeignet zur Weiterverarbeitung<br />
(Softwareevolution, -sanierung)
Was heißt ”<br />
verhaltensbewahrend“ bei Komposition?<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 476<br />
• Programmtransformationen sind üblicherweise unär<br />
t : P → P ′<br />
⇒ t ist bedeutungserhaltend, wenn P und P ′ das gleiche beobachtbare<br />
Ausführungsverhalten zeigen.<br />
• Kompositionsoperationen sind mehrstellig<br />
t : P 1 , . . . , P n → P ′<br />
⇒ t ist bedeutungserhaltend, wenn t wohldefiniert ist und P 1 , . . . , P n<br />
zusammen mit der Kompositionsvorschrift t das gleiche beobachtbare<br />
Ausführungsverhalten zeigen wie P ′ .
Programmtransformationen zum Programmieren im Kl<strong>eine</strong>n<br />
• Transformieren mit Erhaltung des beobachtbaren Verhaltens <strong>eine</strong>s<br />
Programms<br />
• Basistransformationen:<br />
◮ (Einseitiges) Vertauschen von Abfragen<br />
◮ Vertauschen von Anweisungen<br />
◮ Erzeugen von Funktionsvereinbarungen<br />
◮ Einsetzen von Funktionsrümpfen<br />
◮ Falten von Funktionsrümpfen (u. a. partielle Auswertung)<br />
◮ Konstantenfaltung<br />
◮ Funktionen verallgem<strong>eine</strong>rn<br />
• Zusammengesetzte Anwendungen:<br />
◮ Parameterübergabe durch offenen Einbau (Einsetzen und Falten)<br />
◮ Entrekursivierung von Programmen<br />
Funktionsumkehr<br />
Operandenvertauschung<br />
Umklammern<br />
◮ Optimierung von Programmen<br />
(z.B. Schleifentransformationen)<br />
◮ Programmverf<strong>eine</strong>rung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 477
Angewandte Programmtransformationen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 478<br />
• bisher für funktionale, applikative Sprachen.<br />
• Wie geht das beim Programmieren im Großen?<br />
◮ Zustandsbehandlung bei imperativen Sprachen?<br />
Schwierigkeit: Ausdrücke mit Nebenwirkungen<br />
◮ Umgang mit hierarchischen Namensräumen?<br />
Schwierigkeit: überlappende Verdeckungsregeln<br />
(Importe, Überladung, Vererbung, Schachtelung)<br />
· Auflösung von Zuordnungen<br />
· Nebenbedingungen bei Vereinbarungen
Programmtransformationen (2)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 479<br />
• Basistransformationen für die Anwendung Komposition / Dekomposition<br />
Basistransformation Typ benutzt<br />
T1 Anweisungsfolge einfügen IK –<br />
T1.1 . . . zu Methodenvereinbarungen IK –<br />
T1.1.1 . . . beim Eintritt IK –<br />
T1.1.2 . . . vor Austritt IK H1<br />
T1.2 . . . zu Variablenvereinbarungen IK –<br />
T1.2.1 . . . vor Initialisierung IK H1<br />
T1.2.2 . . . nach Initialisierung IK –<br />
T1.3 . . . zu Methodenaufrufen IK –<br />
T1.3.1 . . . vor Aufruf IK H1<br />
T1.3.2 . . . nach Aufruf IK H1<br />
T1.4 . . . zu Variablenzugriffen IK –<br />
T1.4.1 . . . vor Zugriff IK H1<br />
T1.4.2 . . . nach Zugriff IK H1<br />
T2 Merkm<strong>als</strong>vereinbarung einführen var –<br />
T2.1 Methodenvereinbarung einführen MK –<br />
T2.1.1 Methode falten IK –<br />
T2.1.1.1 Zugriffsmethode einfügen IK –<br />
T2.1.2 Methode verallgem<strong>eine</strong>rn MK –<br />
T2.2 Variablenvereinbarung einführen MK –<br />
T2.2.1 Parametervereinbarung einführen MK –<br />
T2.2.2 Lokale Variablenvereinbarung einführen MK –<br />
T2.2.3 Klassenattributsvereinbarung einführen MK –<br />
T2.3 Klassenvereinbarung einführen MK –<br />
T2.3.1 Klassenabstraktion einführen MK H2.2.2<br />
T2.3.2 Trampolinklasse einführen MK –<br />
T3 Merkm<strong>als</strong>vereinbarung entfernen var –<br />
T3.1 Methodenvereinbarung entfernen MD –<br />
T3.1.1 Methode offen einbauen R –<br />
T3.2 Variablenvereinbarung entfernen var –<br />
T3.2.1 Parametervereinbarung entfernen ID –<br />
T3.2.1.1 Parameter bündeln ID T2.3<br />
T3.2.2 Lokale Variablenvereinbarung entfernen ID –<br />
T3.2.3 Klassenattributsvereinbarung entfernen MD –<br />
T3.3 Klassenvereinbarung entfernen MD –
Programmtransformationen (3)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 480<br />
Basistransformation Typ benutzt<br />
T4 Merkm<strong>als</strong>gruppe verschieben R T5<br />
T4.1 . . . entlang der Schachtelungshierarchie R T5<br />
T4.2 . . . entlang der Vererbungshierarchie R T5<br />
T4.2 . . . zwischen beliebigen Klassen R T5<br />
T5 Merkm<strong>als</strong>vereinbarung verschieben R T2/3<br />
T5.1 Methodenvereinbarung verschieben R –<br />
T5.1.1 . . . entlang der Schachtelungshierarchie R H3.1<br />
T5.1.2 . . . entlang der Vererbungshierarchie R –<br />
T5.1.3 . . . zwischen beliebigen Kontexten R H3.1<br />
T5.2 Variablenvereinbarung verschieben R –<br />
T5.2.1 Parametervereinbarung verschieben R –<br />
T5.2.1.1 . . . innerhalb der Signatur R –<br />
T5.2.1.2 . . . <strong>als</strong> Klassenattribut nach außen R H3.2<br />
T5.2.1.3 . . . <strong>als</strong> lokale Variable nach innen R –<br />
T5.2.2 Lokale Variablenvereinbarung verschieben R –<br />
T5.2.2.1 . . . <strong>als</strong> Parameter nach außen R –<br />
T5.2.2.2 . . . <strong>als</strong> Klassenattribut nach außen R H3.2<br />
T5.2.3 Klassenattributsvereinbarung verschieben R –<br />
T5.2.3.1 . . . innerhalb der Klasse R –<br />
T5.2.3.2 . . . <strong>als</strong> Parameter nach innen R H3.2<br />
T5.2.3.3 . . . <strong>als</strong> lokale Variable nach innen R –<br />
T5.2.3.4 . . . entlang der Schachtelungshierarchie R H3.2<br />
T5.2.3.5 . . . entlang der Vererbungshierarchie R –<br />
T5.2.3.6 . . . zwischen beliebigen Klassen R H3.2<br />
T5.3 Klassenvereinbarung verschieben R –<br />
T5.3.1 . . . entlang der Schachtelungshierarchie R H3.3<br />
T5.3.2 . . . entlang der Vererbungshierarchie R –<br />
T5.3.3 . . . zwischen beliebigen Klassen R H3.3<br />
T5.3.4 . . . zwischen Paketen R H3.3
Programmtransformationen (4)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 481<br />
Basistransformation Typ benutzt<br />
H1 Ausdruck abflachen R T2.2.2<br />
H2 Typisierung ändern R –<br />
H2.1 Vererbungsbeziehungen ändern R –<br />
H2.1.1 Neue Vererbungsbeziehung einführen IK –<br />
H2.1.2 Vererbungsbeziehung entfernen ID –<br />
H2.2 Variablentypen ändern R –<br />
H2.2.1 Variablentypen verf<strong>eine</strong>rn R –<br />
H2.2.1.1 Parametertyp verf<strong>eine</strong>rn R –<br />
H2.2.1.2 Lokalen Variablentyp verf<strong>eine</strong>rn R –<br />
H2.2.1.3 Klassenattributstyp verf<strong>eine</strong>rn R –<br />
H2.2.2 Variablentypen verallgem<strong>eine</strong>rn R –<br />
H2.2.2.1 Parametertyp verallgem<strong>eine</strong>rn R –<br />
H2.2.2.2 Lokalen Variablentyp verallgem<strong>eine</strong>rn R –<br />
H2.2.2.3 Klassenattributstyp verallgem<strong>eine</strong>rn R –<br />
H3 Merkmal umbenennen R –<br />
H3.1 Methode umbenennen R –<br />
H3.2 Variable umbenennen R –<br />
H3.3 Klasse umbenennen R –<br />
H3.4 Paket umbenennen R –<br />
• IK = invasive Komposition<br />
• MK = modulare Komposition<br />
• ID = invasive Dekomposition<br />
• MD = modulare Dekomposition<br />
• R = Restrukturierung
Charakterisierung invasiver Komposition<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 482<br />
• Programmfragmente haben Vor- und Nachbedingungen bezüglich ihrer<br />
Umgebung, ihre funktionale Schnittstelle.<br />
• Programmfragmente haben <strong>eine</strong> Menge von Haken (Anknüpfungspunkte,<br />
Webepunkte, hot spots, generische Parameter, ...), die ebenfalls Vor- und<br />
Nachbedingungen unterliegen: die Kompositionsschnittstelle.<br />
• modulare Komposition spezialisiert die Nach- bzw. Vorbedingung bzgl. der<br />
Umgebung der beteiligten Fragmente.<br />
◮ Beispiel: Anweisungen {P A } A {Q A }, {P B } B {Q B } lassen sich sequentiell<br />
komponieren zu {P A } A; B {Q B }, wenn Q A ⇒ P B .<br />
• invasive Komposition spezialisiert <strong>eine</strong>n Haken des äußeren Fragments.
Wiederholung: Typische Haken<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 483<br />
• syntaktisch implizit vorhanden:<br />
◮ Vererbungsliste<br />
◮ Anweisungsblock<br />
◮ Klassenvereinbarung, . . .<br />
• syntaktisch explizit zu diesem Zweck vorbereitet:<br />
◮ Sprungmarken<br />
◮ Bezeichner mit speziellem Namensbestandteil<br />
◮ generische Parameter, . . .<br />
• berechenbar:<br />
◮ Methodeneintritt/-austritt<br />
◮ Zugriffe auf <strong>eine</strong> Variable, . . .
Übersicht: Technische Umsetzung<br />
• Programmrepräsentation<br />
◮ Auf welchen Datenstrukturen transformieren wir?<br />
◮ Wie baut man diese auf?<br />
• Welche Spracheigenschaften sind vorteilhaft?<br />
• Grundlegenden Operationen<br />
• Metaprogramme<br />
• Steuerung von Metaprogrammen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 484
Einsatz klassischer Übersetzerbautechnik<br />
• Programmrepräsentationen: Text, Symbole, AST, Steuerflußgraph,<br />
Datenflußgraph, etc.<br />
• Programmanalyse zur Prüfung von Vorbedingungen (Anwendbarkeit von<br />
Transformationen)<br />
◮ attributierte Grammatiken<br />
◮ Typprüfungen<br />
◮ Datenflußanalyse<br />
◮ abstrakte Interpretation<br />
• Programmtransformation<br />
◮ globale Musterersetzung (Ersetzungssysteme)<br />
◮ lokale Musterersetzung<br />
◮ Elimination<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 485
Programmrepräsentation Quelltext<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 486<br />
package example;<br />
/** this is a dummy class format **/<br />
public class A extends Element {<br />
private int s = -1;<br />
}<br />
public void format(Stream s) {<br />
s.write("\n");<br />
}<br />
• primäres Kommunikationsmittel mit dem Entwickler.<br />
• das Programm ist vollständig wiedergegeben.<br />
• wie unterscheiden wir zwischen Schlüsselwort, Kommentar, Zeichenreihe?
Programmrepräsentation Quelltext (2)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 487<br />
#define MYCONFIG<br />
using System.IO;<br />
namespace example {<br />
// this is a dummy class format<br />
public class A : Element {<br />
#ifdef MYCONFIG<br />
private int s = -1;<br />
#else<br />
private double s = 3.1415;<br />
#endif<br />
public void format(TextWriter s) {<br />
s.WriteLine("",this.s);<br />
}<br />
}<br />
} // end namespace<br />
• Problem: Abhängigkeit vom Präprozessor
Programmrepräsentation Symbolfolge<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 488<br />
PACKAGE IDENTIFIER["example"] SEMICOLON COMMENT[...] PUBLIC<br />
CLASS IDENTIFIER["A"] EXTENDS IDENTIFIER["Element"]<br />
LBRACE PRIVATE INT IDENTIFIER["s"] ASSIGN MINUS<br />
INTLITERAL["-1"] SEMICOLON PUBLIC VOID IDENTIFIER["format"]<br />
LPAREN IDENTIFIER["Stream"] IDENTIFIER["s"] RPAREN LBRACE<br />
IDENTIFIER["s"] DOT IDENTIFIER["write"] LPAREN<br />
STRLITERAL["\n"] RPAREN SEMICOLON RBRACE RBRACE<br />
• Ergebnis der Symbolentschlüsselung<br />
• es ist klar, was was ist, aber wie ordnen wir die Symbole einander zu?
Programmrepräsentation Syntaxbaum<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 489<br />
• Ergebnis der syntaktischen Analyse (Zerteilung), in LISP explizit <strong>als</strong><br />
Datenstruktur<br />
• die logische Struktur ist klar, aber was bedeuten die Namen?<br />
• immerhin: Programme sind Terme und Programmtransformationen sind<br />
Termersetzungen
Programmrepräsentation Strukturgraph: attributierter Baum<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 490<br />
• Ergebnis der Namensanalyse<br />
• wir kennen die kontextabhängigen Zuordnungen im Programm und<br />
können die Semantik unmittelbar ablesen<br />
• Namensanalyse ist für statisch formulierbare Aufgaben ausreichend!<br />
• Einsicht: Programme sind Graphen und Programmtransformationen sind<br />
Graphersetzungen.
Weitere mögliche Programmrepräsentationen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 491<br />
• Maschinencode<br />
• Objektcode<br />
• Tupelfolge mit Maschinenbefehlen<br />
• SSA-Graphen<br />
• Datenflußgraphen<br />
• . . .<br />
SSA- und Datenflußgraphen sind für viele Programmanalysen vorteilhaft!
Die für Komposition ideale Programmiersprache hat. . .<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 492<br />
• k<strong>eine</strong> Präprozessoranweisungen<br />
• strenge Typisierung und statische Typsicherheit.<br />
• k<strong>eine</strong> Zeigerarithmetik.<br />
• k<strong>eine</strong> ”<br />
beliebigen“ Sprünge.<br />
• k<strong>eine</strong> Mechanismen der Kompositionsebene in der Sprache, wie Reflexion<br />
oder typeof.<br />
◮ Extremfall: Ein Programm, das über Reflexion s<strong>eine</strong>n eigenen Quelltext<br />
ausgibt, zeigt nach jeder Transformation anderes Verhalten.<br />
• mögliche Folgerung: Trenne Basissprache und Kompositionssprache? Wie<br />
geht dann rekursive Komposition?
Syntax und Semantik von Transformationen<br />
• Alle Programmtransformationen ändern syntaktisch den Strukturbaum<br />
• Grundoperationen:<br />
◮ stutze(x, Vater(x)): beseitige Unterbaum x<br />
◮ propfe(y, Vater(y)): setze Unterbaum y ein<br />
◮ ersetze(x, y) = stutze(x, Vater(x)); pfropfe(y, Vater(x))<br />
• stutze und pfropfe sind<br />
◮ ein vollständiges Grundsystem<br />
◮ atomar<br />
◮ invertierbar<br />
stutze = pfropfe −1<br />
• Syntaktische Transformationen garantieren k<strong>eine</strong> Programmeigenschaften!<br />
• Solche Garantien sind Aufgabe der semantischen Steuerung der<br />
Transformationen.<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 493
Metaprogramme<br />
• Ein Programm verarbeitet Daten.<br />
Ein Programm ist ein Datum. (→ Strukturgraph)<br />
• Ein Metaprogramm verarbeitet Programme.<br />
Ein Metaprogramm ist ein Programm.<br />
• Bekannte Beispiele<br />
◮ Übersetzer<br />
◮ Generatoren (z.B. IDL-basierte)<br />
◮ . . .<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 494
Metaprogrammarten<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 495<br />
• Als Teil <strong>eine</strong>s Übersetzers (z.B. Optimierer, Codegenerator)<br />
• Als Quell-zu-Quelltransformation (z.B. manche Präprozessoren,<br />
Softwareentwicklungswerkzeuge)<br />
• der Binder (einschl. Binden dynamischer Bibliotheken)<br />
• Zur Laufzeit ausgeführt (z.B. Lader)<br />
◮ Reflexion: Zugriff auf <strong>eine</strong> Programmrepräsentation zur Laufzeit<br />
◮ Selbstmodifizierende Programme sind schwer handhabbar
Speicherungsart von Objektattributen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 496<br />
• Beispiel für die Umsetzung <strong>eine</strong>s Aspekts<br />
• Je nach Zugriffshäufigkeit, -art und Belegung sind für logische<br />
Objektattribute (“Properties”) verschiedene Speicherungsarten sinnvoll.<br />
◮ lokal : <strong>als</strong> Feld des Objekts<br />
◮ global : in <strong>eine</strong>r assoziativen Reihung<br />
• Aspektdefinition, um die Attributierung für <strong>eine</strong> Klasse festzulegen:<br />
Sichtbarkeit, Speicherungsart, Typ, Name, Vorgabebelegung.<br />
properties p.A {<br />
public local X x = null;<br />
public global Y y = Y.DEFAULT;<br />
}
Metaprogramme <strong>als</strong> Weber<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 497<br />
• Ein einfaches Metaprogramm webt den Aspekt in p.A ein:<br />
package p;<br />
public class A {<br />
/* ASPECT public local X x = null; */<br />
private X x;<br />
public X getX() { return x; }<br />
public void setX(X x) { this.x = x; }<br />
{ setX(null); } // Object initializer<br />
}<br />
/* ASPECT public global Y y = Y.DEFAULT; */<br />
private static Map ymap = new IdentityHashMap();<br />
public Y getY() { return ymap.get(this); }<br />
public void setY(Y y) { ymap.put(this, y); }<br />
{ setY(Y.DEFAULT); } // Object initializer<br />
...
Das Metaprogramm näher betrachtet<br />
• Was muß das Metaprogramm tun?<br />
◮ Lokalisiere die Klassenvereinbarungen und die genannten Attribute.<br />
◮ Erzeuge den Code für die Attribute, entweder lokale Variable oder <strong>eine</strong><br />
globale assoziative Reihung, mit Zugriffsmethoden und<br />
Initialisierungsblöcken.<br />
◮ Füge die erzeugten Vereinbarungen und Anweisungsblöcke in die<br />
Klassenvereinbarung ein.<br />
• Was ist dazu notwendig?<br />
◮ Namensanalyse (Ergebnisse im Strukturgraph enthalten)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 498
Aspect/J (http://aspectj.org)<br />
• Präprozessor für<br />
◮ Java-Quellen<br />
◮ Aspektdefinitionen (proprietär)<br />
• Weben: Code an Haken einfügen<br />
• Mögliche Haken<br />
◮ Methodeneintritt<br />
◮ Methodenausgänge<br />
◮ Methodenaufruf<br />
◮ Attributzugriff<br />
• Auffinden von Signaturen mit regulären Mustern<br />
• Bietet vorgefertigte Aspektsprachen zur Instrumentierung<br />
◮ Synchronisation<br />
◮ Protokollierung<br />
◮ Profiling<br />
◮ Zusicherung von Verträgen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 499
Aspect/J: Beispiel<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 500<br />
class Point implements FigureElement {<br />
private int x = 0, y = 0;<br />
int getX() { return x; }<br />
int getY() { return y; }<br />
void setX(int x) { this.x = x; }<br />
void setY(int y) { this.y = y; }<br />
}<br />
void moveBy(int dx, int dy) {<br />
...<br />
}<br />
aspect DisplayUpdating {<br />
pointcut move(FigureElement figElt):<br />
target(figElt) &&<br />
(call(void FigureElement.moveBy(int, int)) ||<br />
call(void Line.setP1(Point)) ||<br />
call(void Line.setP2(Point)) ||<br />
call(void Point.setX(int)) ||<br />
call(void Point.setY(int))<br />
);<br />
}<br />
after(FigureElement fe) returning: move(fe) {<br />
Display.update(fe);<br />
}
Aspect/J AOP<br />
• Deklarativ, aber unklare Semantik: Steuerflußgraph <strong>als</strong> zugrundeliegendes<br />
Modell<br />
◮ Weben in imperativen Sprachen hat Nebenwirkungen<br />
◮ Ist operationale Beschreibung günstiger?<br />
• Die unterstützten Aspekte sind eher trivial.<br />
• K<strong>eine</strong> benutzerdefinierten<br />
◮ Navigationspfade<br />
◮ Analysen<br />
◮ Haken<br />
◮ Einmischoperationen<br />
• Kein Modell für Abhängigkeiten zwischen Aspekten<br />
◮ Wird erst synchronisiert oder erst protokolliert?<br />
◮ Wenn sich der funktionale Code ändert,<br />
welche Aspekte müssen angepaßt werden?<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 501
RECODER (http://recoder.sf.net)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 502<br />
• Rahmensystem für Metaprogramme in Java, für Java (demnächst auch für<br />
C, C#).<br />
• arbeitet auf quelltextnaher Programmrepräsentation<br />
◮ Strukturgraph enthält Querverweise<br />
(erfordert abgeschlossene Welt)<br />
◮ Detaillierte Strukturbäume erhalten Kommentare, Leerräume<br />
• Inkrementelle Aktualisierung nach Änderungen<br />
(effiziente Nachberechnung ist nächster Meilenstein)<br />
• Enthält Bibliothek von Transformationen und Analysen<br />
(noch unvollständig)
RECODER: Prinzipieller Ablauf<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 503
RECODER: Programmodell<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 504
RECODER: Dienstkonfigurationen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 505
RECODER: Dienstkopplung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 506<br />
• Verwaltung von Modifikationen durch die Klasse ChangeHistory.<br />
• Aktualisierung des Programmodells nur bei Anfragen: Meldung an alle bei<br />
der ChangeHistory angemeldeten Dienste.
Recoder-Benutzung (1): Zerteilen <strong>eine</strong>r <strong>Datei</strong><br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 507<br />
// Zuerst Dienstkonfiguration anlegen:<br />
ServiceConfiguration serviceConfig = new DefaultServiceConfiguration();<br />
// <strong>Datei</strong>verwaltungsdienst besorgen:<br />
SourceFileRepository sfr = serviceConfig.getSourceFileRepository();<br />
try { // <strong>Datei</strong> zerteilen<br />
CompilationUnit cu = sfr.getCompilationUnitFromFile(filename);<br />
// filename ist vom Typ String<br />
} catch (ParserException pe) {<br />
// do something<br />
}
Recoder-Benutzung (2): Besuchen von Syntaxknoten<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 508<br />
• Tiefensuche im pull-Modus:<br />
// cu ist damit Wurzel des zu traversierenden Baumes<br />
TreeWalker walker = new TreeWalker(cu);<br />
while (walker.next()) {<br />
visit(walker.getProgramElement());<br />
}<br />
• Die Methode visit ist nicht vordefiniert, sondern dient <strong>als</strong> Beispiel.
Recoder-Benutzung (3): Besuchen von Syntaxknoten<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 509<br />
• Tiefensuche im push-Modus:<br />
class TreeIteratorListener extends ASTIteratorAdapter {<br />
public void enteringNode(ASTIterator it, ProgramElement node) {<br />
// Auszuführende Aktionen beim ersten Besuch des Knotens node<br />
}<br />
}<br />
public void leavingNode(ASTIterator it, ProgramElement node) {<br />
// Auszuführende Aktionen beim letzten Besuch des Knotens node<br />
}<br />
TreeIteratorListener til = new TreeIteratorListener();<br />
ASTIterator ai = new ASTIterator(til);<br />
ai.iterate(cu); // Start des Iterierens
Recoder-Benutzung (4): AST-Modifikation<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 510<br />
• Einfügen <strong>eine</strong>r Typdeklaration d in <strong>eine</strong> Übersetzungseinheit cu:<br />
TypeDeclarationMutableList list = cu.getDeclarations();<br />
if (list == null) {<br />
list = new TypeDeclarationArrayList();<br />
cu.setDeclarations(list);<br />
}<br />
list.add(d);<br />
d.setParent(cu); // Doppelverkettung<br />
• Die Knoten des AST sind doppelt verkettet: Jeder AST-Knoten kennt<br />
s<strong>eine</strong> Kinder und s<strong>eine</strong>n Vater!
Recoder-Benutzung (5): Ausgabe<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 511<br />
• Ausgeben der Übersetzungseinheit cu<br />
ProgramFactory pf = serviceConfig.getProgramFactory();<br />
PrettyPrinter pp = pf.getPrettyPrinter(new PrintWriter(System.out));<br />
cu.accept(pp);<br />
oder kurz:<br />
System.out.println(cu.toSource());
Graphische Oberfläche<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 512<br />
Kontextinformation<br />
Strukturbaum<br />
Quelltext
Operationen der Metaprogrammierbibliothek<br />
• Auflistung in den Tabellen von Seite 0 bis 0.<br />
• Hier: Konkretisierung:<br />
• Füge Vereinbarung x in Kontext y ein<br />
◮ Teste, ob und welche Randbedingungen verletzt sind<br />
(mehr <strong>als</strong> ein Dutzend solcher Fälle sind möglich)<br />
◮ Suche geeignete Einfügeposition (gemäß Konventionen)<br />
◮ Setze Vereinbarung syntaktisch ein<br />
• Benenne Merkmal x um (z.B. zur Konfliktauflösung)<br />
• Verschiebe Vereinbarung x von Kontext y nach Kontext z<br />
◮ Es gibt in Java ca. 25 sinnvolle und logisch verschiedene<br />
Kombinationen für x, y und z.<br />
◮ Die Komplexität schwankt stark: Verschiebungen entlang der<br />
Vererbungshierarchie (gleiches Objekt!) sind einfacher <strong>als</strong><br />
Querverschiebungen (verschiedene Objekte)<br />
• . . .<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 513
Beispiel: Umbenennen der Methode B.f (1/4)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 514<br />
• Welche Methodenvereinbarungen müssen umbenannt werden?
Beispiel: Umbenennen der Methode B.f (2/4)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 515<br />
• Auswirkung auf andere Oberklassen
Beispiel: Umbenennen der Methode B.f (3/4)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 516<br />
• Auswirkung auf Schwippschwager & Co.
Beispiel: Umbenennen der Methode B.f (4/4)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 517<br />
• Wollen Sie das wirklich von Hand machen?
Steuerung von Metaprogrammen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 518<br />
• eingebettet<br />
(Präprozessor interpretiert und entfernt Meta-Anweisungen)<br />
• interaktiv<br />
(Entwicklungswerkzeuge mit Assistenten)<br />
• skriptgesteuert<br />
(Metaprogrammiersprache)<br />
• automatisiert<br />
(Expertensystem)
Inject/J (http://injectj.fzi.de)<br />
• Operationale Skriptsprache zur invasiven Komposition.<br />
◮ Iteration über Elemente <strong>eine</strong>s vereinfachten Strukturgraphen.<br />
◮ Steuert Analysen und Transformationen von RECODER.<br />
• Benutzerdefinierte<br />
◮ Navigationspfade<br />
◮ Haken<br />
• K<strong>eine</strong> benutzerdefinierten<br />
◮ Analysen<br />
◮ Einmischoperationen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 519
Inject/J: Operationen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 520<br />
• Navigation:<br />
foreach class ´*´ do {<br />
foreach method ’*(*)’ do {<br />
foreach access ’methodName(*)’ <br />
to subclass ’SomeSuperClass’ do {<br />
}<br />
}<br />
}<br />
• Transformation:<br />
before$ $<br />
• Kontrollstrukturen:<br />
if (introduceThrows) do {<br />
add to throws ${ ResourceAccessException }$;<br />
}<br />
• Benutzerinteraktion:<br />
ask("Please choose an name for a \ temporary variable", name);
Inject/J-Anwendungsbeispiel<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 521<br />
Einmischen von Kontrollanweisungen in alle Ausprägungen <strong>eine</strong>s Kellers<br />
(java.util.Stack):<br />
aspect StackChecker {<br />
// Visit all classes in namespace<br />
foreach class ’*’ do {<br />
// Visit all Methods in this class<br />
foreach method ’*(*)’ do {<br />
// Visit all calls of method peek() on objects<br />
// of static type (or subtype) java.util.Stack<br />
foreach access ’peek()’ to subclass ’java.util.Stack’ do {<br />
//Insert the following code before each call to peek()<br />
before${<br />
if (.empty())<br />
System.out.println("Can’t peek stack, stack is empty.");<br />
}$;<br />
}<br />
// Visit all calls of method pop() ... analogously ...<br />
} } }
Inject/J: Oberfläche<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 522
Weitere Anwendungen mit Inject/J und RECODER<br />
• Erzeugen von Entwurfsmustern<br />
◮ Erzeugen von Fabrikmethoden (abstrakte Fabrik)<br />
◮ Einmischen von Besuchsanweisungen (Besucher)<br />
◮ Einfügen von Beobachtungspunkten (Beobachter)<br />
• Refaktorisierungen und allgem<strong>eine</strong>re Transformationen<br />
◮ Attribute durch Zugriffsmethoden kapseln<br />
(Enterprise JavaBeans Architekturstil)<br />
◮ Methodensignaturen modifizieren<br />
(z.B. Parameter in ein Objekt bündeln)<br />
◮ Klassen ausfaktorisieren<br />
(Gemeinsamkeiten in Oberklassen auslagern)<br />
◮ Kommunikationsmechanismen austauschen<br />
(→ Konnektoren)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 523
Fortschritte<br />
• Invasive Komposition ist<br />
◮ sprachunabhängig<br />
◮ zur Aufarbeitung von Altsystemen geeignet<br />
◮ zur Produktion von Produktfamilien geeignet<br />
◮ die Basis zur Entwicklung abstrakterer und ausdrucksstärkerer<br />
Kompositionssprachen<br />
• Kompositoren bilden die Maschinensprache der Komposition<br />
• Erfolg durch Übertragung von Übersetzerbau-Techniken<br />
◮ Spezifikationstechniken (Graphersetzung, Termersetzung)<br />
◮ Analysetechniken<br />
◮ Generierungstechniken<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 524
Sprachunabhängige Komposition<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 525<br />
Sprachunabhängige Komposition<br />
Generic AST (DOM)<br />
Analyzers<br />
Type description<br />
Transformators<br />
Type description<br />
Java AST<br />
C++ AST<br />
Dr. Welf Löwe und Markus Noga 44
Fortschritte gegenüber...<br />
• objektorientierten Systemen<br />
◮ Kompositoren verallgem<strong>eine</strong>rn<br />
Delegation<br />
Vererbung (spezielle Form der Delegation)<br />
Entwurfsmuster<br />
◮ Invasive Anpassung entfernt die Kompositionsschnittstellen<br />
◮ Erweiterungsmechanismen ermöglichen Sichtenkonzept<br />
• aspekt-orientiertem Programmieren<br />
◮ AOP wird mit invasiver Komposition implementiert<br />
◮ Verallgem<strong>eine</strong>rung von Navigation, Analysen, Webeprozeß<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 526
Zusammenfassung und Ausblick<br />
• Konzepte:<br />
◮ AOP definiert die Problemlösung richtig<br />
◮ Kompositoren definieren das Zusammenfügen richtig<br />
◮ Elementare Programmtransformationen sorgen für syntaktisch korrekte<br />
Ersetzungen<br />
• Implementierung:<br />
◮ Recoder definiert Mechanismus<br />
◮ Inject/J definiert Taktik<br />
◮ Definition der Strategie???<br />
→ Hier gibt es derzeit noch ein Loch!<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 527
<strong>IPD</strong>-Literatur (1)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 528<br />
• Dirk Heuzeroth, Thomas Holl, Gustav Högström, Welf Löwe, Automatic<br />
Design Pattern Detection, 11th Internatinal Workshop on Program<br />
Comprehension, co-located with 25th International Conference on<br />
Software Engineering, Portland, IEEE, May 2003.<br />
• Dirk Heuzeroth, Welf Löwe, Understanding Architecture Through<br />
Structure and Behavior Visualization, Chapter 9 in book:<br />
Software-Visualization - From Theory to Practice, Kluwer, 2003.<br />
• Stefan Schonger, Elke Pulvermüller, Stefan Sarstedt, Aspect-Oriented<br />
Programming and Component Weaving: Using XML Representations of<br />
Abstract Syntax Trees, Proceedings of the 2nd German GI Workshop on<br />
Aspect-Oriented Software Development (In: Technical Report No.<br />
IAI-TR-2002-1), University of Bonn, p. 59 – 64, Rheinische<br />
Friedrich-Wilhelms-Universität Bonn, Institut für Informatik III, February<br />
2002.<br />
• Dirk Heuzeroth, Thomas Holl, Welf Löwe, Combining Static and Dynamic<br />
Analyses to Detect Interaction Patterns, Proceedings of the Sixth<br />
International Conferenceon Integrated Design and Process Technology<br />
(IDPT), Jun 2002.
<strong>IPD</strong>-Literatur (2)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 529<br />
• Welf Löwe, Markus L. Noga, Component Communication and Data<br />
Adaptation, IDPT 2002, Jun 2002.<br />
• Andreas Speck, Elke Pulvermüller, Michael Jerger, Bogdan Franczyk,<br />
Component Composition Validation, International Journal of Applied<br />
Mathematics and Computer Science 12(4), p. 581 – 589, December 2002.<br />
• Elke Pulvermüller, Composition and Correctness, In: SC 2002: Workshop<br />
on Software Composition, Electronic Notes in Theoretical Computer<br />
Science (ENTCS), Elsevier Science Publishers, April 2002.<br />
• Markus L. Noga, Krüper, Content Management System Deployment -<br />
Merging Separate Concerns, LNCS 2487, GPCE 2002, Springer, Oct<br />
2002.<br />
• Markus L. Noga, Welf Löwe, Data Types and XML Schema, Journal of<br />
Markup Languages - Theory and Practice , Mar 2002.<br />
• Welf Löwe, Markus L. Noga, Thilo Gaul, Foundations of Fast<br />
Communication via XML, Ann<strong>als</strong> of Software Engineering 13(1-4), p.<br />
357-379, Jan 2002.<br />
• Welf Löwe, Markus L. Noga, Metaprogramming Applied to Web<br />
Component Deployment, ENTCS 65(4), ETAPS SC 2002, Elsevier, Apr<br />
2002.
<strong>IPD</strong>-Literatur (3)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 530<br />
• Andreas Speck, Elke Pulvermüller, Matthias Clauß, Ragnhild Van Der<br />
Straeten, Ralf Reussner, Model-Based Software Reuse, Universität<br />
Karlsruhe, Fakultät für Informatik, Nr. 2002-4,<br />
http://www.info.uni-karlsruhe.de/˜pulvermu/workshops/ECOOP2002/,<br />
September 2002.<br />
• Welf Löwe, Markus L. Noga, Scenario-Based Connector Optimization -<br />
An XML Approach, LNCS 2370, IFIP/ACM CD 2002, p. 170-184,<br />
Springer, Jun 2002.<br />
• Pascal Costanza, Günter Kniesel, Katharina Mehner, Elke Pulvermüller,<br />
Andreas Speck, Second German Workshop on Aspect-Oriented Software<br />
Development, Rheinische Friedrich-Wilhelms-Universität Bonn, Nr.<br />
IAI-TR-2002-1, http://www.informatik.unibonn.de/III/forschung/publikationen/tr/#2002,<br />
February<br />
2002.<br />
• Andreas Speck, Silva Robak, Elke Pulvermüller, Matthias Clauß,<br />
Version-based Approach for Modelling Software Systems, Proceedings of<br />
the Workshop on Model-based Software Reuse, In Association with the<br />
16th European Conference on Object-Oriented Programming (ECOOP)<br />
2002, p. 15 - 22, Universität Karlsruhe, Fakultät für Informatik, June<br />
2002.
<strong>IPD</strong>-Literatur (4)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 531<br />
• Andreas Speck, Elke Pulvermüller, Matthias Clauß, Versioning in Software<br />
Modeling, Proceedings of the 6th International Conference on Integrated<br />
Design and Process Technology (IDPT 2002), Society for Design and<br />
Process Science (SDPS), June 2002.<br />
• Elke Pulvermüller, Andreas Speck, James O. Coplien, A Version Model for<br />
Aspect Dependency Management, Proceedings of the 3rd International<br />
Symposium on Generative and Component-Based Software Engineering<br />
(GCSE) 2001, Springer, Sep 2001.<br />
• Dirk Heuzeroth, Welf Löwe, Andreas Ludwig, Uwe Assmann,<br />
Aspect-Oriented Configuration and Adaptation of Component<br />
Communication, Jan Bosch (Ed.), Generative and Component-Based<br />
Software-Engineering, Third International Conference, GCSE 2001,<br />
Springer, Sep 2001.<br />
• Katharina Mehner, Mira Mezini, Elke Pulvermüller, Andreas Speck,<br />
Aspektorientierung - Workshop der GI-Fachgruppe 2.1.9 Objektorientierte<br />
Software-Entwicklung, Nr. tr-ri-01-223, May 2001.<br />
• Trent Jaeger, Dirk Heuzeroth, Uwe Assmann, Automating the<br />
Management of Reusable System Components, Proceedings of the 7th<br />
HotOS-Workshop, Jan 2001.<br />
• Dirk Heuzeroth, Thomas Holl, Welf Löwe, Combining Static and Dynamic<br />
Analyses to Detect Interaction Patterns, Dec 2001.
<strong>IPD</strong>-Literatur (5)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 532<br />
• Elke Pulvermüller, Andreas Speck, Maja D’Hondt, Wolfgang DeMeuter,<br />
James O. Coplien, Feature Interaction in Composed Systems, ECOOP<br />
2001 - Proceedings, TR No. 2001-14, Nr. 2001-14, Sep 2001.<br />
• Andreas Speck, Elke Pulvermüller, Feature Modeling, Wolfgang Goerigk<br />
(Ed.), Proceedings of the Joint Workshop of the GI-Fachgruppe 2.1.4<br />
(Programmiersprachen und Rechenkonzepte) and 2.1.9<br />
(Objekt-Orientierte Softwareentwicklung), Christian-Albrechts-Universität<br />
zu Kiel, May 2001.<br />
• Welf Löwe, Andreas Ludwig, Andreas Schwind, Understanding Software -<br />
Static and Dynamic Aspects, 17th International Conference on Advanced<br />
Science and Technology, 2001.<br />
• Andreas Speck, Elke Pulvermüller, Versioning in Software Engineering,<br />
Proceedings of 27th Annual Conference of the IEEE Industrial Electronics<br />
Society (IECON´01), Denver, CO, IEEE Press, Dec 2001.<br />
• Welf Löwe, Alexander Liebrich, VizzScheduler - A Framework for the<br />
Visualization of Scheduling Algorithms, Proc. of the Euro-Par 2001,<br />
Springer, Aug 2001.<br />
• Awais Rashid, Peter Sawyer, Elke Pulvermüller, A Flexible Approach for<br />
Instance Adaptation during Class Versioning, Proceedings of the<br />
Symposium on Objects and Databases (OODB 2000), Co-hosted with<br />
ECOOP 2000, Jun 2000.
<strong>IPD</strong>-Literatur (6)<br />
• Herbert Klaeren, Elke Pulvermüller, Awais Rashid, Andreas Speck, Aspect<br />
Composition applying the Design by Contract Principle, Proceedings of<br />
the GCSE 2000, Second International Symposium on Generative and<br />
Component-Based Software Engineering, 2000, Oct 2000.<br />
• Andreas Speck, Elke Pulvermüller, Component Frameworks for Software<br />
Generators, Proceedings of the 17th Workshop of the GI-FachgSpruppe<br />
2.1.4, Programmiersprachen und Rechnerkonzepte, May 2000.<br />
• Elke Pulvermüller, Andreas Speck, Awais Rashid, Implementing<br />
collaboration-based Designs using Aspect-Oriented Programming,<br />
Proceedings of TOOLS-USA, 2000 (Technology of Object-Oriented<br />
Languages and Systems), p. 95 - 104, IEEE Computer Society Press, Jul<br />
2000.<br />
• Andreas Ludwig, Dirk Heuzeroth, Metaprogramming in the Large, 2nd<br />
International Conference on Generative and Component-based Software<br />
Engineering (GCSE). Also available as LNCS 2177 (c) by Springer,<br />
Springer, Jan 2000.<br />
• Andreas Speck, Elke Pulvermüller, Mira Mezini, Reusability of Concerns,<br />
Proceedings of the Workshop on Aspects and Dimensions of Concerns,<br />
2000, in conjunction with ECOOP 2000, Jun 2000.<br />
• Dirk Heuzeroth, Ralf Reussner, A Meta-protocol and Type System for the<br />
Dynamic Coupling of Binary Components, OORASE’99 -<br />
OOSPLA’99Workshop on Reflection and Software Engineering<br />
(Proceedings) by the University of Milano - Bicocca, Italy, Nov 1999.<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 533
<strong>IPD</strong>-Literatur (7)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 534<br />
• Uwe Assmann, Aspect Weaving by Graph Rewriting, Generative<br />
Component-based Software Engineering(GCSE), p. 24-36, Oct 1999.<br />
• Elke Pulvermüller, Herbert Klaeren, Andreas Speck, Aspects in<br />
Distributed Environments, Proceedings of the GCSE 1999, Sep 1999.<br />
• Uwe Assmann, Andreas Ludwig, Introducing Connections into Classes<br />
with Static Metaprogramming, Coordination 1999, Springer, Apr 1999.<br />
• Publikationen unserer FZI-Gruppe:<br />
http://www.fzi.de/prost/publikationen.php