2012-07-27 13 views
5

Ich bin hauptsächlich ein C++ Typ. Da C++ keine offizielle ABI enthält, verwende ich immer einen COM-ähnlichen Ansatz für Komponentendesigns, die mehr als einen Compiler unterstützen. KürzlichObjective-C stabil ABI

stieß ich auf die Frage, ob Objective-C als Ersatz für die COM-ähnlichen Ansatz wäre. Damit Objective-C ein Ersatz ist, benötigt man natürlich eine stabile ABI, daher würde ich gerne wissen, ob eine stabile ABI für Objective-C existiert (auf allen wichtigen Betriebssystemen [OSX, GNU/Linux, Windows]) und wie einfach Es wäre Objective-C (++) als "Klebstoff" zwischen Komponenten, die von verschiedenen Compilern erstellt wurden.

EDIT: Als Nikolai Ruhe eine kurze Beschreibung von COM darauf hingewiesen, sehr nützlich sein. COM ist im Wesentlichen ein "binärer Standard", der das Mischen von Binärdateien verschiedener Compiler (und in einer Vielzahl von Sprachen) ermöglicht. Das Vehikel von COM sind Schnittstellen, die Methoden definieren (die auf die virtuellen Funktionen von C++ abbilden). Komponenten implementieren mindestens eine Schnittstelle und werden als DLLs verteilt. Sie können sich irgendwo auf dem System befinden (die Position wird in der Registry angegeben) und können von jedem COM-Client über die ID der von ihnen implementierten Schnittstelle geladen werden.

+2

Sie sprechen offensichtlich Objective-C-Leute an. Es wäre sicherlich hilfreich, wenn Sie den "COM-like approach" ein wenig beschreiben würden. Ich habe keine Ahnung, was das ist. –

+1

@NikolaiRuhe danke, ich habe gerade das, hoffe, es wird erklärt, wie COM (auf einer grundlegenden Ebene) arbeitet – MFH

+0

Im Moment habe ich meine „eigene Version von COM“ - auch sans für Sprachen zu unterstützen, die nicht C++ ^^ ich vielleicht dachte nur etwas wie Objective-C++ wäre ein eleganterer Weg (da alles wie COM scheinbar unelegant zu sein scheint [obwohl ich das über Wrapper in meiner aktuellen Implementierung ausgeblendet habe]). Es ist nicht so, als ob mein aktuelles Design nicht benutzbar wäre - ich erzeuge tatsächlich eine ganze Menge von Dateien [VTABLES, Wrapper, ...] aus einer einfachen Sprache, aber das fügt immer noch den Overhead hinzu, zwei Programme anstelle nur des Compilers zu haben. .. – MFH

Antwort

3

ich nur für Apples Implementierung sprechen kann, da ich keine Erfahrung mit dem GNU oder anderen Ports.

Objective-C beruht auf C ABI zum größten Teil (wie Funktionsaufrufe und Speicherlayout von Strukturen).

Es eigenes ABI unterzog ein paar Änderungen in Apples Implementierung, wie non-fragile instance variables mit den "Modern Runtime" eingeführt, der Einführung von Eigenschaften, schnellerer Ausnahmebehandlung, Müllabfuhr, __weak Unterstützung für ARC.

Einige der Änderungen waren rückwärtskompatibel, andere nicht. Aber da das gesamte System und die Frameworks von Apple bereitgestellt werden und die Änderungen normalerweise mit anderen nicht kompatiblen Änderungen (Wechsel zu Intel und LP64) eingeführt wurden, hatte dies keine Konsequenzen für die Benutzer.

Edit: Eine Sache, die Sie im Auge haben sollte, ist, dass Objective-C nicht nur auf einem festen ABI verlassen, sondern auch auf einem kompatiblen Laufzeit. Das ist ein weiterer Kopfschmerz, um den Sie sich kümmern müssen.

+0

Wie sind Methoden (mehr wie Nachrichten [richtig?]) auf der binären Ebene definiert? Ich bin mir nicht sicher, ob die Laufzeitabhängigkeit im Vergleich zu den C (++) Laufzeiten ein so großes Problem wäre, wie viele gibt es für Objective-C (++) für dasselbe System? – MFH