PDF in Farbe - IPD Goos
PDF in Farbe - IPD Goos
PDF in Farbe - IPD Goos
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 1<br />
Software aus Komponenten<br />
Prof. Dr. Gerhard <strong>Goos</strong><br />
Fakultät für Informatik<br />
Universität Karlsruhe<br />
Karlsruhe, Germany 2004<br />
c○ Gerhard <strong>Goos</strong>, Dirk Heuzeroth,<br />
Elke Pulvermüller, Volker Kuttruff<br />
2004<br />
http://www.<strong>in</strong>fo.uni-karlsruhe.de/
Organisation<br />
• Vorlesung:<br />
◮ 1. Dienstag 14:00 – 15:30, -101, wöchentlich<br />
◮ 2. Mittwoch 14:00 – 15:30, -101, vierzehntägig<br />
• Übungen:<br />
◮ Mittwoch 14:00 – 15:30, -101, vierzehntägig, erstmals 28.04.2004<br />
• Übungsleiter: Dr. Dirk Heuzeroth, Mamdouh Abu-Sakran, Volker Kuttruff<br />
• Adressen:<br />
◮ Allgeme<strong>in</strong>es Verfügungsgebäude, 2. OG<br />
◮ ggoos@ipd.<strong>in</strong>fo.uni-karlsruhe.de<br />
◮ heuzer@ipd.<strong>in</strong>fo.uni-karlsruhe.de, msakran@ipd.<strong>in</strong>fo.uni-karlsruhe.de,<br />
kuttruff@fzi.de<br />
• Sprechstunden:<br />
◮ <strong>Goos</strong>: Dienstags 16:00 – 17:00<br />
◮ Heuzeroth, Abu-Sakran, Kuttruff: Mittwochs 16:00 – 17:00<br />
• Vorlesungsseite:<br />
http://www.<strong>in</strong>fo.uni-karlsruhe.de/lehre/2004SS/swk<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 2
Gliederung<br />
1. E<strong>in</strong>führung<br />
◮ Überblick über Ziele, Probleme und Aufgaben<br />
◮ Komponentenbegriffe<br />
◮ Vorgehensweisen<br />
◮ Überblick über klassische Ansätze, kommerzielle Lösungen und<br />
akademische Ansätze)<br />
◮ Probleme und generelle Lösungen<br />
2. Industrielle Komponentensysteme<br />
1. CORBA<br />
2. (Enterprise) JavaBeans<br />
3. (D)COM, .Net<br />
4. Webdienste, XML<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 218
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 219<br />
2. Konkrete <strong>in</strong>dustrielle Systeme<br />
• Pragmatisch motiviert<br />
◮ Wie baue ich große Systeme <strong>in</strong> e<strong>in</strong>er heterogenen Welt?<br />
• Wie baue ich große Systeme <strong>in</strong> e<strong>in</strong>er heterogenen Welt?<br />
• Man braucht Mechanismen zur Transparenz von<br />
◮ Sprachen (IDL)<br />
◮ Plattformen<br />
◮ Betriebssystemen<br />
◮ Ausführungsort:<br />
Global e<strong>in</strong>deutige Referenz<br />
Stellvertreterobjekte (stub/skeleton)<br />
Wiederverwendbare Dienste zum Ermitteln von Komponenten und<br />
deren Eigenschaften (z.B. für dynamische Komposition):<br />
· Namensdienst<br />
· Makler<br />
· Persistenz (Objekte aus Datenbank holen)<br />
· Reflexion (Schnittstellen erfragen)<br />
Objektverwaltung (Lebenszyklus)<br />
• Jetzt: Ausprägung <strong>in</strong><br />
◮ Corba (Mustergültig)<br />
◮ Java / JavaBeans / EnterpriseJavaBeans (Sprachgebunden)<br />
◮ COM/DCOM/.NET (Plattformgebunden)<br />
◮ Webdienste/XML
DCOM: Entwicklung<br />
• Entwickler: Microsoft<br />
• OLE (object l<strong>in</strong>k<strong>in</strong>g and embedd<strong>in</strong>g)<br />
◮ ActiveX (OLE-Erweiterung)<br />
• COM (component object model)<br />
◮ E<strong>in</strong>führung 1993 als Teil von OLE 2.0 SDK<br />
◮ def<strong>in</strong>iert COM Component Object Model und Laufzeitunterstützung <strong>in</strong><br />
der Component Object Library<br />
◮ re<strong>in</strong> lokale Komponenten<strong>in</strong>teraktion<br />
• DCOM (distributed COM)<br />
◮ E<strong>in</strong>führung 1996 <strong>in</strong>tegriert <strong>in</strong> W<strong>in</strong>dows NT 4.0<br />
◮ verteilte, rechnerübergreifende Kommunikation<br />
Grenzen fließend!<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 220
COM<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten Dr. Welf Löwe und Markus Noga 8 221<br />
• COM (component object model)<br />
• Komponentenarchitektur für Microsoft W<strong>in</strong>dows (1993)<br />
• Schnittstellenbeschreibungen mit MIDL (Microsoft IDL),<br />
Wiederverwendete Technologie<br />
◮ aus DCE (distributed comput<strong>in</strong>g environment) abgeleitet<br />
◮ ähnlich CORBA IDL<br />
Object-<br />
Oriented<br />
Model<br />
Client/Server<br />
Model<br />
Dynamic<br />
L<strong>in</strong>k<strong>in</strong>g<br />
Component Object Model (COM)
OLE/ActiveX<br />
• OLE (object l<strong>in</strong>k<strong>in</strong>g and embedd<strong>in</strong>g)<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 />
◮ E<strong>in</strong>bettung 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 222
Ursprüngliche Trennung OLE und COM<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 223<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
Grundideen des Komponentenmodells von (D)COM<br />
• Komponente implementiert Menge von Schnittstellen<br />
◮ Verwirrend: COM Object = Komponente, nicht Instanz!<br />
◮ Referenz auf Instanz e<strong>in</strong>er Komponente ist stets Referenz auf Instanz<br />
e<strong>in</strong>er Schnittstelle<br />
• Schnittstellen (<strong>in</strong>terfaces) s<strong>in</strong>d Mengen von Signaturen, die e<strong>in</strong>e<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 />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 224
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 225<br />
Komponentenmodell<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 e<strong>in</strong>er Komponente!<br />
Dr. Welf Löwe und Markus Noga 10
Komponentenmodell: Fassadenkomponenten<br />
• Zusammengesetzte Komponenten, die Fassadenobjekte enthalten<br />
◮ Mehrere Schnittstellen pro Komponente werden auf verschiedene<br />
<strong>in</strong>terne Objekte mithilfe e<strong>in</strong>es Fassadenobjektes delegiert<br />
◮ Mächtiger aber langsamer als Mehrfachvererbung, denn<br />
Mehrfachvererbung ersetzt Delegation durch zusammenhängendes<br />
Speicherlayout e<strong>in</strong>es Objektes<br />
Delegation und Aggregation: Indirektion aber ke<strong>in</strong>e 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 als e<strong>in</strong>e ersche<strong>in</strong>en läßt.<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 226
Komponentenmodell: Delegation und Aggregation (1)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 227
Komponentenmodell: Delegation und Aggregation (2)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 228
Komponentenmodell: Delegation und Aggregation (3)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 229<br />
• Wiederverwendung durch Delegation oder Aggregation als Ersatz für<br />
Implementierungsvererbung.<br />
• IUnknown des äusseren Objekts kontrolliert den Lebenszyklus der <strong>in</strong>neren<br />
Objekte<br />
• Aggregation stellt e<strong>in</strong> oder mehrere Schnittstellen der <strong>in</strong>neren Objekte als<br />
se<strong>in</strong>e eigenen direkt nach aussen aus<br />
• Bei Aggregation delegiert das <strong>in</strong>nere Objekt Aufrufe auf IUnknown zum<br />
äusseren Objekt
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 230<br />
Komponente<br />
Sprachtransparenz:<br />
kann mehreren<br />
b<strong>in</strong>ärer<br />
Schnittstellen<br />
Aufrufstandard<br />
genügen<br />
Komponentenreferenz ist immer Referenz auf e<strong>in</strong>e<br />
Schnittstelle<br />
IUnknown<br />
Client<br />
COM<br />
Object<br />
• Wie <strong>in</strong> C++<br />
• Aufruf der Funktionen über vtables<br />
Dr. Welf Löwe und Markus Noga 13<br />
• Möglich <strong>in</strong> Sprachen, die Funktionen über Zeiger aufrufen können (C,<br />
C++, SmallTalk, Ada, Basic, . . . )<br />
• Layout der vtables def<strong>in</strong>iert durch MS-C-Übersetzer<br />
• Plattformabhängigkeit<br />
• zusätzliche Indirektion
Orts- und Entwicklungszeittransparenz: GUIDs und Versionen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 231<br />
• E<strong>in</strong>deutige 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 />
◮ e<strong>in</strong>deutig <strong>in</strong> Raum und Zeit<br />
• Klassen-ID (CLSID) bestimmt Komponente e<strong>in</strong>deutig<br />
• Schnittstellen-ID (IID) bestimmt Schnittstelle e<strong>in</strong>deutig<br />
• Was bedeutet Versionierung?<br />
◮ Neue Versionen von Komponenten<br />
◮ Neue Versionen von Schnittstellen<br />
• Neue Implementierungen e<strong>in</strong>er Schnittstelle verwenden<br />
◮ Entkoppele Erzeugung von Komponenten durch Fabriken<br />
◮ Aufruf von Funktionen über bekannte vtable<br />
◮ Auch bekannt als: Polymorphie<br />
• Neue Versionen e<strong>in</strong>er Schnittstelle verwenden<br />
◮ Fehlender Zusammenhang zwischen IIDs<br />
◮ In (D)COM ungelöst<br />
• “So, <strong>in</strong> a sense, COM solves the version<strong>in</strong>g problem by not support<strong>in</strong>g it”<br />
(Orfali)
GUIDs: Vorteile und Nachteile<br />
• Vorteile<br />
◮ Sprachtransparenz<br />
◮ Ke<strong>in</strong>e Namenskollisionen<br />
◮ Ke<strong>in</strong>e fragile base classes<br />
◮ Verwenden der neuesten Implementierung e<strong>in</strong>fach<br />
• Nachteile<br />
◮ Viele Schnittstellen mit ähnlichen Namen und ähnlicher Funktionalität<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 232
Ortstransparenz: Dienstsuche mit Interface IUnknown (1)<br />
• COM def<strong>in</strong>iert die spezielle Schnittstelle IUnknown<br />
• Jede COM Schnittstelle erbt IUnknown<br />
• Jede COM Komponente muß das IUnknown Interface implementieren<br />
• Funktionalität<br />
◮ Schnittstellen e<strong>in</strong>er Instanz abfragen<br />
◮ Referenzzählen für e<strong>in</strong>e Instanz (Objekt Lebenszyklus)<br />
<strong>in</strong>terface IUnknown {<br />
virtual HRESULT QueryInterface(IID& iid, void** ppvObj) = 0;<br />
virtual ULONG AddRef() = 0;<br />
virtual ULONG Release() = 0;<br />
}<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 233
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 234<br />
Ortstransparenz: Beispiel für Schnittstelle und IUnknown (2)<br />
Beispiel<br />
IUnknown<br />
ILookup<br />
COM<br />
Object<br />
<strong>in</strong>terface ILookup : public IUnknown<br />
{<br />
<strong>in</strong>terface ILookup : public IUnknown<br />
public: {<br />
public:<br />
virtual HRESULT _stdcall<br />
virtual<br />
LookupByName<br />
HRESULT __stdcall LookupByName<br />
(LPTSTR lpName, TCHAR (LPTSTR **lplpNumber) lpName,TCHAR = 0; **lplpNumber) = 0;<br />
virtual HRESULT _stdcall LookupByNumber<br />
virtual HRESULT __stdcall LookupByNumber<br />
(LPTSTR lpNumber, TCHAR **lplpName) = 0;<br />
(LPTSTR lpNumber, TCHAR **lplpName) = 0;<br />
};<br />
};<br />
• Def<strong>in</strong>ition <strong>in</strong> MIDL<br />
• Interface Ermittlung zur Laufzeit<br />
Dr. Welf Löwe und Markus Noga 15
Ortstransparenz: IUnknown / QueryInterface (3)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 235<br />
• Prüft ob e<strong>in</strong>e Instanz e<strong>in</strong>e Schnittstelle unterstützt<br />
• Liefert Zeiger auf e<strong>in</strong>e Schnittstellen<strong>in</strong>stanz<br />
LPLOOKUP *pLookup;<br />
TCHAR szNumber[64];<br />
HRESULT hRes;<br />
// Call QueryInterface on the component object<br />
// PhoneBook, ask<strong>in</strong>g for a po<strong>in</strong>ter to the ILookup<br />
// <strong>in</strong>terface identified by a unique <strong>in</strong>terface ID.<br />
hRes = pPhoneBook->QueryInterface(IID_ILOOKUP, &pLookup);<br />
if( SUCCEEDED( hRes ) ) {<br />
// use Ilookup <strong>in</strong>terface po<strong>in</strong>ter<br />
pLookup->LookupByName("Daffy Duck", &szNumber);<br />
// f<strong>in</strong>ished us<strong>in</strong>g the IPhoneBook <strong>in</strong>terface po<strong>in</strong>ter<br />
pLookup->Release();<br />
}
tstransparenz: IUnknown / QueryInterface: Interpretation (4)<br />
• Was passiert da?<br />
if(p <strong>in</strong>stanceof 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), <strong>in</strong>variant<br />
• In COM nur Behältertyp, <strong>in</strong>sbesondere p≠l!<br />
◮ Schnittstellen<strong>in</strong>stanz ≠ Komponenten<strong>in</strong>stanz<br />
◮ Verschlimmert alias<strong>in</strong>g<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 236
Ortstransparenz: Die COM Bibliothek<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 237<br />
• Implementiert Standard-Funktionen für Kommunikation<br />
• Selbst e<strong>in</strong>e (System-)Komponente<br />
◮ Laufzeitunterstützung von COM<br />
◮ Dynamische Bibliotheken<br />
◮ COMPOBJ.DLL, OLE32.DLL<br />
• Verantwortlich für<br />
◮ Erzeugung von Instanzen<br />
◮ Herstellen und Koord<strong>in</strong>ieren von Verb<strong>in</strong>dungen
Ortstransparenz: Registratur (registry)<br />
• Verwaltet Schnittstellen, Implementierungen von Klassen<br />
◮ registry <strong>in</strong> NT 4.0 und Nachfolgern: hierarchische Datenbank<br />
◮ Entspricht CORBA <strong>in</strong>terface/implementation repositories<br />
◮ Schlüssel: CLSID<br />
• Service Control Manager (SCM) kapselt die Registratur (registry )<br />
◮ f<strong>in</strong>det Klassen und ihren Code <strong>in</strong> der Registratur<br />
◮ aktiviert Fabrik <strong>in</strong> e<strong>in</strong>em Prozeß<br />
◮ erzeugt Objekte aktiver Fabriken<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 238
Ortstransparenz: Registratur<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 239<br />
E<strong>in</strong>trä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 />
(<strong>in</strong>-process)<br />
• Drei Möglichkeiten: <strong>in</strong>-process, cross-process, remote<br />
Dr. Welf Löwe und Markus Noga 29
Ortstransparenz: Server Lokalisation<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 240<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
Ortstransparenz: Zugriff auf e<strong>in</strong>e Komponente<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 241<br />
C l ie n t<br />
C l ie n t<br />
A p p l ic a tio n<br />
(1 )<br />
A n f rage<br />
(A rg u m e n t: C L S ID<br />
d e r C o m p o n e n t<br />
O b ject C lass)<br />
(5 ) A u f ru f d e r M e th o d e n<br />
d e r S c h n itts te l le<br />
O b je k t<br />
S c h n itts te l le<br />
(4 )<br />
R e fe re n z a u f<br />
O b je k tschnitts te l le<br />
z u rü c k a n K l ie n te n<br />
C O M<br />
C o m p o n e n t<br />
O b ject L ib ra ry<br />
R egis t ry<br />
S e rver<br />
O b ject<br />
(2 ) N achschlagen <strong>in</strong><br />
d e r R eg is t ra tu r (a l le<br />
regis t r ie r te n S e rver )<br />
(3 ) F <strong>in</strong> d e (O b je k t)<br />
Im p le m e n tie ru n g ,<br />
L a d e S e rver C o d e<br />
C L S ID<br />
S e rv e r<br />
C o d e<br />
• Alternativen: direkter Objektzugriff mit vorhandener Referenz auf<br />
Objektschnittstelle, Erzeugen e<strong>in</strong>es Objekts mit e<strong>in</strong>er Fabrik, die nicht für<br />
den Klienten sichtbar ist (CoCreateInstance), Erzeugen e<strong>in</strong>es Objekts über<br />
e<strong>in</strong>e Fabrik direkt durch den Klienten (CoGetClassObject + CreateInstance)
Objektdienste: Referenzzähler und Objektlebenszyklus<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 242<br />
• Schnittstelle IUnknown enthält zwei weitere wichtige Methoden<br />
◮ AddRef: Neue Referenz auf Komponenten<strong>in</strong>stanz anmelden<br />
◮ Release: Bestehende Referenz freigeben<br />
Letzte Freigabe → Löschen der Komponenten<strong>in</strong>stanz<br />
• E<strong>in</strong>fach umsetzbar<br />
void AddRef () { refCount++; }<br />
void Release() { if(!(--refCount)) f<strong>in</strong>alize(); }<br />
• Extrem fehlerträchtig<br />
◮ Falsches AddRef → float<strong>in</strong>g garbage<br />
◮ Falsches Release → dangl<strong>in</strong>g reference<br />
◮ Kann ke<strong>in</strong>e zirkulären Referenzen erkennen
Objektdienste: Objektlebenszyklus und Fabrik<br />
• COM Interface IClassFactory<br />
• Allgeme<strong>in</strong>e Fabrik für Komponenten<strong>in</strong>stanzen<br />
• E<strong>in</strong>e Instanz der Fabrik pro Rechner<br />
◮ CreateInstance: Neue Komponenten<strong>in</strong>stanz erzeugen<br />
◮ LockServer: Schnellere Erzeugung (nicht-funktional)<br />
• Problem: CreateInstance liefert IUnknown<br />
• Daher nicht statisch typsicher<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 243
DCOM: verteiltes COM<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 244<br />
COM<br />
Standard für<br />
Interoperabität<br />
zwischen<br />
Adreßräumen auf<br />
e<strong>in</strong>em Rechner<br />
−→<br />
DCOM<br />
Standard für<br />
Interoperabität<br />
zwischen<br />
Rechnern<br />
• Lokale Transparenz<br />
• Fernaktivierung<br />
• Verb<strong>in</strong>dungsmanagement<br />
• Management für Nebenläufigkeit<br />
• Management für Sicherheit<br />
• Alles bereits im Design von COM vorbereitet
Ortstransparenz (<strong>in</strong> DCOM erweitert)<br />
Transparenz<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 245<br />
Gleicher<br />
Prozess<br />
Client<br />
Component<br />
Gleiche<br />
Masch<strong>in</strong>e<br />
Client Process<br />
Client<br />
COM<br />
Server Process<br />
Component<br />
Über<br />
Rechner-<br />
grenze<br />
Client<br />
Client Mach<strong>in</strong>e<br />
COM<br />
DCE<br />
RPC<br />
Server Mach<strong>in</strong>e<br />
COM<br />
Component
Ortstransparenz: DCOM Aufruf<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 246<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 <strong>in</strong>tegriert <strong>in</strong> W<strong>in</strong>dows<br />
• im Pr<strong>in</strong>zip plattformneutral, <strong>in</strong>tegriert <strong>in</strong> W<strong>in</strong>dows<br />
COM<br />
Mach<strong>in</strong>e A<br />
Distributed COM<br />
DCE RPC<br />
ORPC<br />
RPC<br />
Mach<strong>in</strong>e B<br />
Distributed COM<br />
DCE RPC<br />
COM<br />
Dr. Welf Löwe und Markus Noga 37
Ortstransparenz: DCE (Exkurs)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 247<br />
• Ursprung: OSF (open software foundation)<br />
◮ ähnlich Corba OMG<br />
◮ nicht dom<strong>in</strong>iert durch Microsoft<br />
• Verteiltes Betriebssystem<br />
• Plattformunabhängig<br />
• Basiskommunikation via RPC<br />
• Konzept e<strong>in</strong>er IDL<br />
• Generierte stubs, skeletons
Distributed Comput<strong>in</strong>g Environment (DCE)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 248<br />
Distributed Comput<strong>in</strong>g 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 <strong>in</strong> DCE<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 249<br />
Communikation <strong>in</strong> 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 250<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 />
#<strong>in</strong>clude<br />
Server Appl.<br />
RPC<br />
Runtime<br />
L<strong>in</strong>k<br />
L<strong>in</strong>k<br />
Client<br />
Server<br />
Dr. Welf Löwe und Markus Noga 40
Ortstransparenz: Interface Def<strong>in</strong>ition<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 251<br />
• Microsoft Interface Def<strong>in</strong>ition Language (MIDL)<br />
• Erweiterung von DCE IDL<br />
• Erzeugung von nutzerdef<strong>in</strong>ierten Schnittstellen<br />
• Nicht neu, aber anders!
Transparenz<br />
Ortstransparenz<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 252<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 />
Mach<strong>in</strong>e<br />
Remote Server<br />
Process<br />
Remote<br />
Object<br />
Remote<br />
Server<br />
• Ansprechen der entfernten Objekte per OBJREF oder per Stellvertreter<br />
Dr. Welf Löwe und Markus Noga 42<br />
• Statischer Aufruf, falls Stellvertreter und Objekt identisch s<strong>in</strong>d<br />
• Entferntes, dynamisch aufgerufenes Objekt muß die Schnittstelle<br />
IDispatch (<strong>in</strong>direkte Aufrufschnittstelle <strong>in</strong>voke(method,args)) selbst<br />
implementieren (ke<strong>in</strong>e Unterstützung durch Broker)
Ortstransparenz: Fernzugriff <strong>in</strong> DCOM<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 253<br />
Fernzugriff <strong>in</strong> 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
Objektdienste <strong>in</strong> DCOM<br />
• Vorhandene Dienste: (services)<br />
◮ Alle Microsoft-Werkzeuge (Word, Excel, Powerpo<strong>in</strong>t, Access, . . . ),<br />
aber Funktionen nicht standardisiert!<br />
◮ Referenzzählende Speicherbere<strong>in</strong>igung<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 (outgo<strong>in</strong>g <strong>in</strong>terface)<br />
Schnittstelle durch connection po<strong>in</strong>t Objekt repräsentiert.<br />
Publisher erfüllen IconnectionPo<strong>in</strong>tConta<strong>in</strong>er<br />
Ke<strong>in</strong>e eigenständigen Ereignisobjekte.<br />
• Fehlende Dienste<br />
◮ Makler<br />
◮ Lizenzierung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 254
Anpassungen<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 />
• Fehlende Anpassungen<br />
◮ Daten, Funktionen, Kommunikation werden explizit und extern<br />
angepaßt<br />
◮ Synchronisation und Protokollanpassungen entsprechen Anpassungen<br />
von Transaktionen und Sessions (siehe vorige Folien)<br />
◮ Ke<strong>in</strong>e Konzepte zur globalen Lebendigkeit<br />
Synchronisationskonzepte unter Komposition<br />
Lebendigkeitstests<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 255
DCOM Zusammenfassung (1)<br />
• Generische Komponenten:<br />
◮ Schnittstellenklassen und Stellvertreter werden aus MIDL generiert<br />
◮ Ke<strong>in</strong> ähnliches Konzept für Implementierungen<br />
• Abstrakte Komponenten und Schnittstellen:<br />
◮ Schnittstellen werden aus MIDL generiert<br />
◮ Schnittstellenobjekte<br />
◮ Mehrfachvererbung<br />
◮ Unveränderliche Schnittstellen (immer und überall)<br />
• Konkrete Komponenten:<br />
◮ Mit Transaktionskonzept / Persistenzkonzept<br />
◮ Sprachunabhängig (aber de facto MS C-Compilerabhängig) /<br />
Plattformunabhängig (aber de facto W<strong>in</strong>dows)<br />
◮ Vererbungskonzept der jeweiligen Sprache<br />
• Zusammengesetzte Komponenten:<br />
◮ Aufruf über (D)COM Bibliothek und Stellvertreter<br />
◮ Delegation <strong>in</strong> Komponenten über Umwickler<br />
◮ Aggregation von Klassen über Entwurfsmuster Fassade (nur statisch)<br />
◮ Aggregation von Schnittstellen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 256
DCOM Zusammenfassung (2)<br />
• Basiskommunikation:<br />
◮ Erzeugung (Fabrik) über lokale Bibliotheksdienste<br />
◮ Objekterzeugung ist Fabrikmethodenaufruf<br />
◮ Objektorientierter Fernaufruf basierend auf DCE über Stellvertreter<br />
(proxies)<br />
◮ Dezentrale Vermittlung<br />
• Wiederverwendung:<br />
◮ Ke<strong>in</strong>e Standardisierungen von DCOM Objekten (Klassen)<br />
◮ Industriestandard: Microsoft Anwendungen stark<br />
• Generierung aus Spezifikationen:<br />
◮ Schnittstellen-Stellvertreter Generierung aus MIDL<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 257
Bewertung (1)<br />
• Standardisierung:<br />
◮ Office ist Quasistandard (Formate von allen Konkurrenten unterstützt)<br />
◮ Weitere Verbreitung als Corba<br />
◮ Vorwiegend Verdrahtungsstandard<br />
◮ Ke<strong>in</strong> offener, sondern e<strong>in</strong> proprietärer Standard<br />
Ke<strong>in</strong>e standardisierten Dienste<br />
Änderungen jederzeit möglich und schon öfters durchgeführt<br />
• Sprach- und Plattformtransparenz: Je<strong>in</strong><br />
◮ W<strong>in</strong>dows als Plattform vorausgesetzt (auch wenn EntireX von Software<br />
AG auf L<strong>in</strong>ux existiert)<br />
◮ Ursprünglich C++ / W<strong>in</strong>dows<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 />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 258
Bewertung (2)<br />
• Probleme mit der Sicherheit<br />
◮ ke<strong>in</strong> Behälterkonzept, das Sicherheit prüfen könnte<br />
◮ DCOM ist b<strong>in</strong>ärer Standard - B<strong>in</strong>ärcodes (Viren)<br />
◮ I love you virus: e<strong>in</strong> VDB script wird ausgeführt und wirft die<br />
Mailerkomponente an, die law<strong>in</strong>enartig Mails verschickt<br />
• “Versionierung” führt zur Explosion ähnlich benannter Schnittstellen (z.B.<br />
IClassFactory und IClassFactory2)<br />
• Ortstransparenz: Ja<br />
◮ Dezentrale Kommunikationsvermittlung über Stellvertreter<br />
◮ Aber: Ke<strong>in</strong>e uniforme Implementierung lokaler (DLL) und entfernter<br />
(EXE) Komponenten<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 259
Die Konkurrenz<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 260<br />
• DCOM ist wegen der Marktdom<strong>in</strong>anz 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 />
◮ von DCOM nach .NET<br />
◮ Nebene<strong>in</strong>ander der Ansätze möglich.<br />
• Java (EJB) - härtester DCOM-Konkurrent.
.NET: Ziele<br />
• Ziele:<br />
◮ Sprachtransparenz,<br />
aber Fokus auf C#<br />
◮ Plattformabhängigkeit,<br />
weil .NET auf W<strong>in</strong>dows am besten unterstützt wird.<br />
◮ Ortstransparenz: Remot<strong>in</strong>g, Web-Dienste<br />
◮ Reflexion<br />
◮ Versionierung<br />
◮ Dynamisches Laden: Es gibt genau e<strong>in</strong>en Klassenlader<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 261
.NET: Sprachtransparenz<br />
• Plattform zur Integration vieler Programmiersprachen durch<br />
◮ Umfangreiches Typsystem (Common Type System, CTS)<br />
M<strong>in</strong>imales Teilsystem von Typen für Interoperabilität<br />
(Common Language Specification, CLS)<br />
◮ Laufzeitumgebung (Common Language Runtime, CLR)<br />
Kellermasch<strong>in</strong>e<br />
(Zwischensprache: CIL = Common Intermediate Language,<br />
Synonym: MSIL = Microsoft Intermediate Language)<br />
automatische Speicherbere<strong>in</strong>igung<br />
Versionierung ohne DLL-Hell<br />
Sicherheitsmechanismen<br />
◮ objektorientierte Klassenbibliothek für<br />
graphische Benutzeroberflächen (W<strong>in</strong>dows 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 262
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 263<br />
Sprachunabhängiges Objektmodell I (CTS)<br />
• Objektmodell heißt Common Type System (CTS):<br />
◮ Menge der Typen, die e<strong>in</strong>e beliebige .NET-Programmiersprache<br />
verwenden darf: Ke<strong>in</strong> M<strong>in</strong>imalsystem<br />
◮ Alle Datentypen s<strong>in</strong>d Objekte (ke<strong>in</strong>e Zweiklassengesellschaft)<br />
◮ Unterscheidung von<br />
Werttypen (value types): Datentypen, Aufzählungstypen (enum) und<br />
benutzerdef<strong>in</strong>ierte Werttypen (struct)<br />
Referenztypen (reference types): Reihungen, Klassen, getypte<br />
Funktionszeiger (Delegates), Zeiger<br />
◮ Box<strong>in</strong>g: Konvertierung e<strong>in</strong>es Wertobjekts <strong>in</strong> e<strong>in</strong> Referenzobjekt<br />
◮ Unbox<strong>in</strong>g: Konvertierung e<strong>in</strong>es Referenzobjekts <strong>in</strong> e<strong>in</strong> Wertobjekt
Sprachunabhängiges Objektmodell II (CLS)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 264<br />
• CLS (Common Language Specification) = m<strong>in</strong>imales Typsystem<br />
• Zweck: Interoperabilität der .NET-Sprachen<br />
◮ Untermenge der CTS-Eigenschaften und -Typen, die jeder Übersetzer<br />
e<strong>in</strong>er .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-Richtl<strong>in</strong>ien e<strong>in</strong>halten, z. B.:<br />
CLS-Regel 15: Die Typen von Reihungselementen müssen<br />
CLS-konform se<strong>in</strong>. Reihungen müssen e<strong>in</strong>e fixe Anzahl von<br />
Dimensionen haben und ihr Index muß bei 0 beg<strong>in</strong>nen. . . .
Datentypen des CTS<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 265<br />
CIL abgebildet auf Beschreibung<br />
Systembibliothek<br />
bool System.Boolean 1 Byte, 0 = . false, ≠ 0 = . true<br />
char System.Char 16-Bit Unicode Zeichen<br />
str<strong>in</strong>g System.Str<strong>in</strong>g Unicode-Text<br />
object System.Object verwalteter Verweis auf Halde<br />
typedref System.TypedReference Paar (Verweis, Typ)<br />
float32 System.S<strong>in</strong>gle IEEE-Gleitpunktzahl 32 Bit<br />
float64 System.Double IEEE-Gleitpunktzahl 64 Bit<br />
<strong>in</strong>t8 System.SByte 2 Komplement Zahl: 8Bit<br />
<strong>in</strong>t16 System.Int16 2 Komplement Zahl: 16Bit<br />
<strong>in</strong>t32 System.Int32 2 Komplement Zahl: 32Bit<br />
<strong>in</strong>t64 System.Int64 2 Komplement Zahl: 64Bit<br />
unsigned <strong>in</strong>t8 System.Byte vorzeichenlose Zahl: 8Bit<br />
unsigned <strong>in</strong>t16 System.UInt16 vorzeichenlose Zahl: 16Bit<br />
unsigned <strong>in</strong>t32 System.UInt32 vorzeichenlose Zahl: 32Bit<br />
unsigned <strong>in</strong>t64 System.UInt64 vorzeichenlose Zahl: 64Bit<br />
native <strong>in</strong>t System.IntPtr masch<strong>in</strong>enabhängig m. Vorz.<br />
native unsigned <strong>in</strong>t System.UIntPtr masch<strong>in</strong>enabhängig o. Vorz.<br />
nicht <strong>in</strong> CLS: typedref, <strong>in</strong>t8, unsigned <strong>in</strong>t16, unsigned <strong>in</strong>t32, unsigned <strong>in</strong>t64,<br />
native unsigned <strong>in</strong>t
Plattformunabhängigkeit“: CLR<br />
”<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 266<br />
CLR (Common Language Runtime)<br />
• ist Laufzeitumgebung für .NET-Anwendungen (Ähnlichkeit zu Java) und<br />
• basiert auf abstrakter Kellermasch<strong>in</strong>e, die ausschließlich Anweisungen des<br />
Zwischencodes CIL verarbeitet.<br />
• CIL-Code wird nicht <strong>in</strong>terpretiert, sondern immer <strong>in</strong> die Masch<strong>in</strong>ensprache<br />
der Zielmasch<strong>in</strong>e übersetzt
CIL Beispiel<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 267<br />
public static Po<strong>in</strong>t operator+(Po<strong>in</strong>t op1, Po<strong>in</strong>t op2) {<br />
return new Po<strong>in</strong>t(op1.x+op2.x,op1.y+op2.y);<br />
}<br />
→<br />
.method public hidebysig specialname static<br />
valuetype ComplexNumbers.Po<strong>in</strong>t op_Addition(valuetype ComplexNumbers.Po<strong>in</strong>t op1,<br />
valuetype ComplexNumbers.Po<strong>in</strong>t op2) cil managed<br />
{<br />
// Code size 40 (0x28)<br />
.maxstack 4<br />
.locals ([0] valuetype ComplexNumbers.Po<strong>in</strong>t CS$00000003$00000000)<br />
IL_0000: ldarga.s op1<br />
IL_0002: call <strong>in</strong>stance float64 ComplexNumbers.Po<strong>in</strong>t::get_x()<br />
IL_0007: ldarga.s op2<br />
IL_0009: call <strong>in</strong>stance float64 ComplexNumbers.Po<strong>in</strong>t::get_x()<br />
IL_000e: add<br />
IL_000f: ldarga.s op1<br />
IL_0011: call <strong>in</strong>stance float64 ComplexNumbers.Po<strong>in</strong>t::get_y()<br />
IL_0016: ldarga.s op2<br />
IL_0018: call <strong>in</strong>stance float64 ComplexNumbers.Po<strong>in</strong>t::get_y()<br />
IL_001d: add<br />
IL_001e: newobj <strong>in</strong>stance void ComplexNumbers.Po<strong>in</strong>t::.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 Po<strong>in</strong>t::op_Addition
Vergleich zu Java(-Bytecode)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 268<br />
public static Po<strong>in</strong>t plus(Po<strong>in</strong>t p1, Po<strong>in</strong>t p2) {<br />
return new Po<strong>in</strong>t(p1.getX() + p2.getX(), p1.getY() + p2.getY());<br />
}<br />
→<br />
public static Po<strong>in</strong>t plus(Po<strong>in</strong>t arg0, Po<strong>in</strong>t arg1)<br />
Code(max_stack = 8, max_locals = 2, code_length = 26)<br />
0: new (9)<br />
3: dup<br />
4: aload_0<br />
5: <strong>in</strong>vokevirtual Po<strong>in</strong>t.getX ()D (10)<br />
8: aload_1<br />
9: <strong>in</strong>vokevirtual Po<strong>in</strong>t.getX ()D (10)<br />
12: dadd<br />
13: aload_0<br />
14: <strong>in</strong>vokevirtual Po<strong>in</strong>t.getY ()D (11)<br />
17: aload_1<br />
18: <strong>in</strong>vokevirtual Po<strong>in</strong>t.getY ()D (11)<br />
21: dadd<br />
22: <strong>in</strong>vokespecial Po<strong>in</strong>t. (DD)V (12)<br />
25: areturn<br />
Man beachte:<br />
• Java Bytecode enthält getypte Operatoren (dadd), weil der Bytecode<br />
<strong>in</strong>terpretiert wird (werden kann)<br />
• CIL Operatoren s<strong>in</strong>d typfrei (add), weil CIL nicht <strong>in</strong>terpretiert wird<br />
(werden kann), sondern immer <strong>in</strong> Masch<strong>in</strong>ensprache übersetzt wird.
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 269<br />
.NET-Laufzeitsystem<br />
• CIL-Code wird nicht <strong>in</strong>terpretiert, sondern vom VES (virtual execution<br />
system) <strong>in</strong> Masch<strong>in</strong>encode übersetzt, entweder vor der<br />
Programmausführung oder währenddessen.<br />
• .NET-Laufzeitumgebung enthält<br />
◮ Just-<strong>in</strong>-time Übersetzer (JIT)<br />
◮ Speicherbere<strong>in</strong>iger (Garbage Collector)<br />
◮ Klassenlader (Class Loader): Dynamisches Laden von Päckchen<br />
◮ Code<strong>in</strong>spektor (Verifier): Prüft CIL-Programme auf Typsicherheit.
Code- und Datenverwaltung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 270<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 />
◮ E<strong>in</strong>b<strong>in</strong>den von existierenden DLLs mit P/Invoke (Platform Invoke)<br />
◮ COM/COM+-Anb<strong>in</strong>dung über die COM-Interop-Abbildung<br />
• Verwaltete Daten (Managed Data): Vom Speicherbere<strong>in</strong>iger 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 />
als auch nicht-verwaltete Daten verwenden.
Codeprüfung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 271<br />
• Problem: Unsafe Code, <strong>in</strong>sbesondere Zeigerarithmetik<br />
⇒ Codeprüfung durch Verifizierer und Klassenlader<br />
◮ Verifizierer prüft konservativ vor Übersetzung <strong>in</strong> Masch<strong>in</strong>encode, 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 />
e<strong>in</strong>gerichtet wurden.<br />
Das Programm verwendet Objekte nur über deren Schnittstelle.<br />
◮ Klassenlader prüft, ob alle E<strong>in</strong>gangswerte die vorgeschriebene<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 272<br />
Päckchen = .NET-Komponente:<br />
• Logische E<strong>in</strong>heit ähnlich DLL oder EXE<br />
• Atomare E<strong>in</strong>heit bzgl. Installation, Konfiguration, Sicherheit,<br />
Versionierung und Laufzeitmanagement<br />
• Beim Laden des Päckchens aktiviert das VES e<strong>in</strong>en so genannten Runtime<br />
Host, der die Kontrolle über Übersetzung und Ausführung übernimmt.
Päckchen: Inhalt<br />
Päckchen enthält:<br />
• E<strong>in</strong> 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.M<strong>in</strong>or.Build.Revision)<br />
◮ Sprache (en-US, de-DE, . . . )<br />
◮ Öffentlicher Schlüssel des Produzenten<br />
• Manifest-Information, die <strong>in</strong>nerhalb e<strong>in</strong>es Moduls oder global im Päckchen<br />
se<strong>in</strong> 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 273
Päckchen: Reflexion und Verwaltung (Versionierung)<br />
• Metadaten s<strong>in</strong>d explizit im Päckchen vorhanden (generiert).<br />
• Metadaten s<strong>in</strong>d<br />
◮ Def<strong>in</strong>tionstabellen: Beschreiben Elemente, die <strong>in</strong> dem Modul selbst<br />
def<strong>in</strong>iert s<strong>in</strong>d.<br />
◮ Referenztabellen: Beschreiben Elemente, die im Modul nicht def<strong>in</strong>iert<br />
s<strong>in</strong>d, aber verwendet werden.<br />
◮ Manifest(tabellen)<br />
• dynamische Abfrage mit Reflexionsmechanismen<br />
• Metadaten + Reflexionsmechanismen<br />
⇒ Ortstransparenz:<br />
◮ ke<strong>in</strong>e IDL mehr<br />
(Schnittstellenbeschreibung durch Metadaten, Abfrage durch Reflexion)<br />
◮ ke<strong>in</strong>e Registratur von Päckchen (ke<strong>in</strong>e Registry ) mehr:<br />
Ablage von Päckchen im Dateisystem<br />
private Päckchen liegen im lokalen Verzeichnisbaum der Anwendung<br />
geme<strong>in</strong>same Päckchen liegen meist <strong>in</strong> 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 274
Versionierung und Nebene<strong>in</strong>anderausführung<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 275<br />
• Versionierung:<br />
⇒ Nebene<strong>in</strong>anderausführung verschiedener Versionen e<strong>in</strong>es Programms.<br />
⇒ Gleichzeitige Ausführung verschiedener Versionen e<strong>in</strong>er Komponente <strong>in</strong><br />
demselben Prozeß.<br />
• Abschirmung: E<strong>in</strong>teilung des CLR-Prozesses <strong>in</strong> abgeschirmte Bereiche<br />
(Application Doma<strong>in</strong>s) für auszuführende Applikationen
C#<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 276<br />
Man nehme Java . . . und füge h<strong>in</strong>zu/ä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 <strong>in</strong>dexer : Strom über collections, Reihungen, Texte,<br />
aber nur e<strong>in</strong> Strom pro Objekt<br />
• weitergehende Reflektion als 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 s<strong>in</strong>d<br />
• properties: Attribute mit expliziten set/get-Methoden (auch <strong>in</strong><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 ke<strong>in</strong>en Interpretierer; es wird alles <strong>in</strong><br />
Masch<strong>in</strong>encode übersetzt
C#: Attribute<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 277<br />
• Attribute s<strong>in</strong>d Objekte e<strong>in</strong>er Unterklasse der Klasse System.Attribute.<br />
• Attribute werden automatisch mit e<strong>in</strong>er Klasse, Methode, e<strong>in</strong>em<br />
Parameter oder e<strong>in</strong>em Päckchen assoziiert, <strong>in</strong>dem man vor deren<br />
Vere<strong>in</strong>barung <strong>in</strong> eckigen Klammern e<strong>in</strong>en 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 h<strong>in</strong>zugefügt werden.<br />
• Eigentlich ist das e<strong>in</strong> beschränkter Ersatz für Mehrfachvererbung<br />
• (Die Existenz von Attributen kann von Präprozessorkommandos abhängig<br />
se<strong>in</strong>.)<br />
• Attribute s<strong>in</strong>d also benutzerdef<strong>in</strong>ierte Meta<strong>in</strong>formationen.
C#-Attribute: Beispiel<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 278<br />
Attribut zur Kennzeichnung des Autors des Codes:<br />
[AuthorIs("Gerhard")]<br />
class MyClass {<br />
...<br />
}<br />
Def<strong>in</strong>ition des AuthorIs-Attributs:<br />
[AttributeUsage(AttributeTargets.All)]<br />
public class AuthorIsAttribute : Attribute {<br />
private str<strong>in</strong>g m_Name;<br />
public AuthorIsAttribute(str<strong>in</strong>g name) {<br />
m_Name = name; }<br />
}<br />
• Die Attributklasse ist selbst rekursiv mit e<strong>in</strong>em Attribut deklariert, das<br />
spezifiziert, daß AuthorIs für beliebige Elemente anwendbar se<strong>in</strong> 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 279<br />
class Ma<strong>in</strong>Class {<br />
public static void Ma<strong>in</strong>() {<br />
foreach (object attribute <strong>in</strong><br />
typeof(MyClass).getCustomAttributes(AuthorIsAttribute,false)) {<br />
Console.WriteL<strong>in</strong>e(attribute);<br />
}<br />
}<br />
}
C#: Properties<br />
public struct Po<strong>in</strong>t {<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 />
Po<strong>in</strong>t q = new Po<strong>in</strong>t();<br />
q.x = 20;<br />
// set-Methode wird implizit aufgerufen<br />
Console.WriteL<strong>in</strong>e(q.x); // get-Methode wird implizit aufgerufen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 280
C#: Properties, Spezialfall: Indexer<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 281<br />
public double this[Coord<strong>in</strong>ateK<strong>in</strong>d which] {<br />
get { if (which == Coord<strong>in</strong>ateK<strong>in</strong>d.X) return m_x;<br />
else return m_y; }<br />
set { if (which == Coord<strong>in</strong>ateK<strong>in</strong>d.X) m_x = value;<br />
else m_y = value; }<br />
}<br />
Zugriff:<br />
p[Po<strong>in</strong>t.Coord<strong>in</strong>ateK<strong>in</strong>d.X] = 22;<br />
p[Po<strong>in</strong>t.Coord<strong>in</strong>ateK<strong>in</strong>d.Y] = 33;
Gültigkeitsbereiche und Vererbung <strong>in</strong> C#<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 282<br />
• Blockschachtelungsregelungen wie üblich<br />
• Parameter gehören zum Gültigkeitsbereich des Prozedurrumpfs<br />
• Die for-Schleife def<strong>in</strong>iert ihren Zähler als neue, schleifenlokale Variable<br />
• <strong>in</strong>ternal: E<strong>in</strong> so vere<strong>in</strong>barter Name ist <strong>in</strong> allen <strong>in</strong> e<strong>in</strong>em Päckchen<br />
zusammengefaßten Programme<strong>in</strong>heiten bekannt<br />
• Vererbung:<br />
◮ private und public wie üblich; Grundannahme ohne Spezifikation ist<br />
private<br />
◮ protected: nur <strong>in</strong> der eigenen und <strong>in</strong> Unterklassen sichtbar<br />
◮ virtual, override: für polymorphen Zugriff muß e<strong>in</strong>e Methode <strong>in</strong> der<br />
Oberklasse als virtuell vere<strong>in</strong>bart se<strong>in</strong>; sie kann dann <strong>in</strong> der Unterklasse<br />
überschrieben werden<br />
◮ virtual, new: virtual nicht zw<strong>in</strong>gend erforderlich; die Unterklasse<br />
verdeckt die Vere<strong>in</strong>barung <strong>in</strong> der Oberklasse, ke<strong>in</strong>e Polymorphie möglich<br />
◮ Für Überschreiben und Verdecken ist identische Signatur nötig, sonst<br />
liegt Überladen vor.<br />
◮ E<strong>in</strong>e Klasse, von der nicht mehr geerbt werden kann, heißt <strong>in</strong> C#<br />
sealed<br />
◮ Vererben von Wertklassen ist verboten; aber diese können von<br />
Schnittstellenklassen erben
C#: Namensräume<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 283<br />
• Hierarchische Namensräume: Java-ähnliches Paketkonzept, können<br />
Klassen, Aufzählungstypen, Delegierte und andere Namensräume<br />
enthalten:<br />
namespace MyNameSpace { ... }<br />
• ke<strong>in</strong>e Abbildung auf gleichnamige Verzeichnishierarchien und Date<strong>in</strong>amen<br />
• Klassen außerhalb e<strong>in</strong>es expliziten Namensraums gehören zu e<strong>in</strong>em<br />
anonymen Namensraum<br />
• Namensräume können auf mehrere Quelldateien verteilt se<strong>in</strong><br />
• Alle Bezeichner der zu e<strong>in</strong>em Namensraum gehörigen E<strong>in</strong>heiten s<strong>in</strong>d im<br />
gesamten Namensraum sichtbar<br />
• Angabe e<strong>in</strong>zub<strong>in</strong>dender existierender Pakete durch Übersetzerschalter:<br />
/reference <br />
• Verwendung von Typen aus anderen Namensräumen:<br />
◮ vollqualifizierte Punktnotation, z. B. System.Console.WriteL<strong>in</strong>e<br />
◮ Abkürzung durch us<strong>in</strong>g-Anweisung, ähnlich import <strong>in</strong> Java.<br />
◮ Bezeichner aus anderen Namensräumen müssen dort mit public oder<br />
<strong>in</strong>ternal vere<strong>in</strong>bart se<strong>in</strong>.<br />
• .NET-Päckchen können mehrere öffentliche Klassen enthalten,<br />
• auch mehrere Klassen mit e<strong>in</strong>er statischen Ma<strong>in</strong>-Methode: Man muß dem<br />
Übersetzer dann mitteilen, welchen E<strong>in</strong>stiegspunkt er konkret verwenden<br />
soll.
C#-Beispiel<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 284<br />
• HelloWorld.cs:<br />
us<strong>in</strong>g System;<br />
namespace MyNameSpace<br />
{<br />
public class MyFirstExample<br />
{<br />
public static void Ma<strong>in</strong>(str<strong>in</strong>g[] args)<br />
{<br />
Console.WriteL<strong>in</strong>e("Hallo {0} im Jahr 1", "<strong>IPD</strong>", 2004);<br />
}<br />
}<br />
}
Implementierungen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 285<br />
Es gibt m<strong>in</strong>destens drei Implementierungen:<br />
• sscli: die offizielle Implementierung von Microsoft für w<strong>in</strong> und FreeBSD,<br />
die zentrale Laufzeitumgebung heißt ”<br />
rotor“<br />
• sscli l<strong>in</strong>ux 20020821: Adaption von sscli an L<strong>in</strong>ux<br />
unter Redhat 7.3 und 8.0 e<strong>in</strong>wandfrei <strong>in</strong>stalliert<br />
◮ aber Vorsicht: sscli l<strong>in</strong>ux belegt samt Doku > 1,1GB und übersetzt<br />
selbst auf Gigahertz-Masch<strong>in</strong>en mehr als e<strong>in</strong>e halbe Stunde!<br />
• mono-0.16: open source Implementierung der ECMA-Standards (von<br />
XIMIAN)<br />
• pnet: e<strong>in</strong>e australische open source Implementierung,<br />
noch nicht ausprobiert, enthält e<strong>in</strong>en C → CLR Übersetzer<br />
Wegen der Lizenzbed<strong>in</strong>gungen sollte man ke<strong>in</strong>en sscli-Code von MS im<br />
Zusammenhang mit eigenen Entwicklungen lesen! Auch der<br />
Leistungsvergleich sscli vs. andere CLR-Implementierung ist verboten!
Ortstransparenz: .NET-Remot<strong>in</strong>g<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 286<br />
• Transparenter Fernaufruf:
Entferntes Objekt<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 287<br />
us<strong>in</strong>g System;<br />
namespace RemoteObject<br />
public class Grid : System.MarshalByRefObject {<br />
const <strong>in</strong>t LENGTH = 10;<br />
double [,] matrix = new double[LENGTH,LENGTH];<br />
public Grid() { Console.WriteL<strong>in</strong>e("Ready!"); }<br />
~Grid() { Console.WriteL<strong>in</strong>e("Destroyed!"); }<br />
public <strong>in</strong>t Length { get { return LENGTH; } }<br />
public double this[<strong>in</strong>t i1, <strong>in</strong>t 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(<strong>in</strong>t i1, <strong>in</strong>t i2) {<br />
return (i1 < 0) || (i1 >= LENGTH) ||<br />
(i2 < 0) || (i2 >= LENGTH) ? true : false;<br />
}
Server<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 288<br />
us<strong>in</strong>g System;<br />
us<strong>in</strong>g RemoteObject;<br />
us<strong>in</strong>g System.Runtime.Remot<strong>in</strong>g.Channels.Tcp;<br />
us<strong>in</strong>g System.Runtime.Remot<strong>in</strong>g.Channels;<br />
us<strong>in</strong>g System.Runtime.Remot<strong>in</strong>g;<br />
namespace ServerDoma<strong>in</strong> {<br />
class Server {<br />
static void Ma<strong>in</strong>(str<strong>in</strong>g[] args) {<br />
TcpServerChannel ch = new TcpServerChannel(8888);<br />
ChannelServices.RegisterChannel(ch);<br />
Remot<strong>in</strong>gConfiguration.RegisterWellKnownServiceType(<br />
typeof(Grid), "Grid", WellKnownObjectMode.S<strong>in</strong>gleton);<br />
Console.WriteL<strong>in</strong>e("Wait<strong>in</strong>g forever");<br />
while(true);<br />
}<br />
}<br />
}
Kunde<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 289<br />
us<strong>in</strong>g System;<br />
us<strong>in</strong>g System.Runtime.Remot<strong>in</strong>g.Channels;<br />
us<strong>in</strong>g System.Runtime.Remot<strong>in</strong>g.Channels.Tcp;<br />
us<strong>in</strong>g RemoteObject;<br />
namespace GridClient {<br />
class Client {<br />
static void Ma<strong>in</strong>(str<strong>in</strong>g[] 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.WriteL<strong>in</strong>e("Could not connect!");<br />
return;<br />
}<br />
for (<strong>in</strong>t i = 0; i < myGrid.Length; i++) {<br />
for (<strong>in</strong>t j = 0; j < myGrid.Length; j++) {<br />
myGrid[i,j] = (double)(i*10 + j);<br />
Console.WriteL<strong>in</strong>e(myGrid[i,j]);<br />
}<br />
}<br />
}<br />
}<br />
}
Fehlende Anpassungen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 290<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 />
• Ke<strong>in</strong>e Konzepte zur globalen Lebendigkeit<br />
◮ Synchronisationskonzepte unter Komposition<br />
◮ Lebendigkeitstests
.NET Zusammenfassung (1)<br />
• Generische Komponenten:<br />
◮ Metadaten pro Päckchen, ersetzt IDL<br />
◮ für Webdienste Generieren von Schnittstellen (WSDL) und<br />
Stellvertretern aus Implementierung<br />
• Abstrakte Komponenten und Schnittstellen:<br />
◮ Schnittstellen s<strong>in</strong>d Typen, vermerkt <strong>in</strong> den Metadaten e<strong>in</strong>es Päckchens<br />
• Konkrete Komponenten:<br />
◮ Mit Transaktionskonzept / Persistenzkonzept<br />
◮ ”<br />
Plattformunabhängig“<br />
◮ E<strong>in</strong>fachvererbung, Mehrfachvererbung von Schnittstellen<br />
• Zusammengesetzte Komponenten:<br />
◮ Aggregation von Moduln <strong>in</strong> Päckchen, (logische, ke<strong>in</strong>e physische)<br />
Schachtelung von Päckchen<br />
◮ Delegation<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 291
.NET Zusammenfassung (2)<br />
• Basiskommunikation:<br />
◮ Fernaufruf über Stellvertreter (.NET-Remot<strong>in</strong>g-Rahmensystem)<br />
◮ Webdienste<br />
• Wiederverwendung:<br />
◮ Umfangreiche Bibliothek<br />
◮ Vordef<strong>in</strong>ierte Dienste (schwach, Datenschutz?)<br />
◮ Webdienste (aufkommend)<br />
• Generierung aus Spezifikationen:<br />
◮ Generierung von Spezifikationen aus Implementierungen (Webdienste)<br />
◮ Generierung der Stellvertreter aus generierten Spezifikationen<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 292
.NET Bewertung (1)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 293<br />
• Ziele von .NET ähnlich wie CORBA: Vere<strong>in</strong>heitlichung e<strong>in</strong>er heterogenen<br />
Welt<br />
• politische Bewertung:<br />
+ ECMA-Standard<br />
◦ deutliche Ausrichtung auf Web-Dienste<br />
− Monopolisierungsabsicht.<br />
− Mittelfristig oder langfristig Plattformabhängigkeit<br />
− praktische Tauglichkeit noch nicht nachgewiesen<br />
− manche Eigenschaften noch nicht ausreichend klar:<br />
Mehrfachvererbung, mehrfädige Programmierung
.NET Bewertung (2)<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 294<br />
• technisch:<br />
+ im Vergleich zu CORBA und EJB der bisher systematischste Ansatz<br />
zur Vere<strong>in</strong>heitlichung<br />
+ wesentlich bessere Unterstützung von Versionierung<br />
+ sowohl für sequentielle als auch für verteilte Systeme<br />
+ explizite Bereitstellung von Übersetzungsdaten <strong>in</strong> Päckchen stellt die<br />
Metaprogrammierung auf e<strong>in</strong>e durchsichtige Grundlage<br />
+ der (seit 40 Jahren) überzeugendste Ansatz zur Lösung des<br />
UNCOL-Problems<br />
+ Umfangreiche Bibliothek<br />
◦ Konzept des managed code könnte erhebliche Auswirkungen auf den<br />
künftigen Gebrauch von C und C++ haben.<br />
◦ Kellercode nicht ausführbar<br />
− Verifizierer nicht validiert und außerdem abschaltbar<br />
− Ke<strong>in</strong>e Anpassungskonzepte.
.NET Bewertung (3)<br />
• Sprachtransparenz<br />
◮ Ja (CTS, aber Fokus auf C#)<br />
• Plattformtransparenz<br />
◮ Ja (durch CLR/CIL und automatische Übersetzung <strong>in</strong><br />
Masch<strong>in</strong>ensprache der Zielplattform)<br />
• Ortstransparenz<br />
◮ Ja (durch Remot<strong>in</strong>g-Rahmensystem sowie auch die Ausrichtung auf<br />
Web-Dienste)<br />
• Reflexion<br />
◮ Dynamisch und statisch<br />
• Dienste<br />
◮ Transaktionen, Datenbanken, . . .<br />
Prof. Dr. G. <strong>Goos</strong> Software aus Komponenten 295