30.01.2014 Aufrufe

als eine PDF-Datei (schwarz-weiß) - IPD Goos

als eine PDF-Datei (schwarz-weiß) - IPD Goos

als eine PDF-Datei (schwarz-weiß) - IPD Goos

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!