30.01.2014 Aufrufe

PDF in Farbe - IPD Goos

PDF in Farbe - IPD Goos

PDF in Farbe - 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 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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!