Kapitel 3: Übersetzung <strong>von</strong> objektorientierten <strong>Sprachen</strong>Verschiebung verstanden werden, da die ursprünglich bei null startendeMethodentabelle <strong>von</strong> B2 um die Anzahl der B1+C Methodentabelle verschoben wird[WM97, S. 193; BH98, S. 110].Sehr viel aufwändiger wird die Übersetzung, wenn das Diamantproblem besteht, d.h.wenn wie in Abbildung 6 dargestellt, eine abhängige mehrfache Vererbung besteht unddie Methoden <strong>von</strong> A nur einfach instanziiert in C eingeht. In diesem Fall muss dieMethodentabelle neu generiert werden, da die Methodentabellen <strong>von</strong> B1 und B2aufgrund der einfachen Instanziierung ungeeignet sind, da sich B1 und B2 eine Instanzteilen, und nicht, wie in den eigenen Methodentabellen vermerkt, jeweils eine eigeneInstanz haben. Dies erfordert, analog zu den Methodentabellen, Indextabellen zugenerieren, die Offsets für die jeweils gültigen Kontexte enthalten. Eine weitereVertiefung dieser Übersetzung kann aus Platzgründen an dieser Stelle nicht erfolgenund kann in der entsprechenden Fachliteratur nachgelesen werden [WM97, S. 200-210].Um die vorgestellten Probleme zu umgehen, wird in vielen Programmiersprachen, u.a.bei Java und C#, auf echte Mehrfachvererbung verzichtet und als Ersatz hierfür dieImplementierung <strong>von</strong> Schnittstellen ermöglicht (Vgl. Kapitel 2.2.2). Dieser Ansatzschließt Mehrdeutigkeiten und Namensprobleme aus, erfordert bei der Übersetzungjedoch auch die Überwindung einer Schwierigkeit. Sofern die Klasse A und B einMethode M des Interfaces I implementieren, kann nicht garantiert werden, dass dieseMethode in den beiden Klasse A und B die gleiche Relativadresse hat. Die Lösung ist,je Klasse, die ein Interface implementiert, eine Hash-Tabelle h H zu pflegen, die diegültige Codeadressen für die durch A implementierten Methoden des Interfaces Ispeichert [WS07, S. 175 f]. In Java werden verschiedene Ansätze für dieImplementierung <strong>von</strong> Interfaces verfolgt, u.a. Searched ITables, Directly Index ITablesund interface method tables (IMT). Eine ausführliche Vorstellung der Ansätze kannunter [ACFG01] nachgelesen werden.3.4 Übersetzung <strong>von</strong> ParametrisierungIn Kapitel 2.2.3 wurde bereits das Konzept der Parametrisierung vorgestellt, das dazudient, Operationen zu definieren, die auf verschiedenen Datentypen arbeiten können.Obwohl streng typisierte <strong>Sprachen</strong> mit einer Typprüfung bereits durch den Übersetzereinen Sicherheits- und Effizienzvorteil haben, hat diese dynamische Typprüfung auch16
Kapitel 3: Übersetzung <strong>von</strong> objektorientierten <strong>Sprachen</strong>Vorteile, da ein und derselbe Algorithmus nicht für jeden Datentyp implementiertwerden muss.In den verschiedenen Programmiersprachen gibt es zwei unterschiedlicheÜbersetzungsvarianten für Parametrisierung. Einerseits die heterogene, bzw. homogeneKopiervariante [OW97, S. 2] und andererseits die echte generische Variante [BH98, S.112].3.4.1 KopiervarianteBei der heterogenen Kopiervariante wird die generische Definition als Muster mitPlatzhalter für den Datentyp verstanden. Bei Bedarf, d.h. bei Instanziierung, erfolgt ingewisser Weise eine Spezialisierung des Musters, in dem dieses expandiert wird[WH97, S. 215]. Der Platzhalter wird dabei vom Übersetzer durch den richtigenDatentyp ersetzt und die Klassendefinition angelegt. Letztendlich nimmt hierbei derÜbersetzter dem Programmierer die eintönige Arbeit ab, mit Hilfe <strong>von</strong> Copy & Paste,die verschiedenen Implementierungen zu erzeugen und insbesondere auf die korrekteBenennung der Funktions- und Klassennamen zu achten. Dieser Ansatz findet u.a. beiC++ mit Hilfe <strong>von</strong> templates Verwendung und ermöglicht eine Parametrisierung <strong>von</strong>Klassen und Funktionen [WH97, S. 213]. Listing 8 zeigt ein Beispiel für die templatesFunktion <strong>von</strong> C++.// Templatetemplate void vertausche(T &v1, T &v2){T h;..h = v1; v1 = v2; v2 = h;}// Erzeugte Kopien bei der Übersetzungvoid vertausche(int &v1, int &v2){int h;h = v1; v1 = v2; v2 = h;}void vertausche(string &v1, string &v2){string h;h = v1; v1 = v2; v2 = h;}Listing 8: Heterogene Übersetzung [BH98, S. 113]Der Vorteil dieser Vorgehensweise liegt darin, dass für jeden Datentyp eine auf denDatentyp optimierte Kopie des Programmcodes angelegt wird, der sehr schnellausgeführt werden kann. Daraus resultiert letztendlich jedoch der Nachteil dieses17