2012-07-27 14 views
5

Sono principalmente un ragazzo C++. Dato che il C++ non ha un ABI ufficiale, io uso sempre un approccio COM-like per i progetti di componenti che supportano più di un compilatore.Objective-C stabile ABI

Recentemente mi sono imbattuto nella questione se l'Objective-C sarebbe un sostituto dell'approccio COM-like. Ovviamente per Objective-C essere un rimpiazzo sarebbe necessario un ABI stabile, quindi mi piacerebbe sapere se esiste un ABI stabile per Objective-C (su tutti i principali sistemi operativi [OSX, GNU/Linux, Windows]) e con quanta facilità sarebbe usare Objective-C (++) come "colla" tra i componenti creati da diversi compilatori.

EDIT: Come Nikolai Ruhe sottolineato una breve descrizione di COM può essere utile. COM è essenzialmente uno "standard binario" che consente di mixare i file di compilatori diversi (e in una varietà di lingue). I veicoli di COM sono interfacce, che definiscono metodi (che mappano le funzioni virtuali di C++). I componenti implementano almeno un'interfaccia e sono distribuiti come DLL. Possono essere posizionati ovunque nel sistema (la posizione è specificata nel Registro di sistema) e possono essere caricati da qualsiasi client COM tramite l'ID dell'interfaccia che implementano.

+2

Si sta ovviamente affrontando le persone Objective-C. Sarebbe sicuramente utile se tu descrivessi "l'approccio COM-like" un po '. Non ho idea di cosa sia. –

+1

@NikolaiRuhe grazie, l'ho appena fatto, spero che spieghi come funziona la COM (a livello base) – MFH

+0

Attualmente ho la mia "propria versione di COM" - ma sans supporto per le lingue che non sono C++ ^^ Ho appena pensato forse qualcosa come Objective-C++ sarebbe un modo più elegante (qualsiasi cosa come la COM sembra essere poco elegante fino ad un certo punto [anche se lo nascondo tramite i wrapper nella mia attuale implementazione]). Non è come se il mio attuale design non fosse utilizzabile - in realtà sto generando un sacco di file [VTABLES, Wrappers, ...] da un linguaggio semplice, ma questo aggiunge ancora il sovraccarico di avere 2 programmi invece del solo compilatore. .. – MFH

risposta

3

Posso solo parlare per l'implementazione di Apple, in quanto non ho esperienza con GNU o altre porte.

Objective-C si basa in gran parte sull'ABI di C (come chiamate di funzione e layout di memoria delle strutture).

di E proprio ABI ha subito un paio di cambiamenti nella implementazione di Apple, come non-fragile instance variables introdotte con la "Modern Runtime", introduzione di proprietà, gestione delle eccezioni più veloce, la raccolta dei rifiuti, __weak supporto per ARC.

Alcune delle modifiche erano retrocompatibili, altre no. Ma dal momento che l'intero sistema e framework sono forniti da Apple e le modifiche sono state introdotte di solito con altre modifiche non compatibili (passa a Intel e LP64) ciò non ha avuto conseguenze per gli utenti.

Modifica: Una cosa che dovresti avere in mente è che Objective-C non si basa solo su un ABI fisso ma anche su un runtime compatibile. Questo è un altro mal di testa di cui preoccuparsi per il tuo scopo.

+0

Come sono definiti i metodi (più come i messaggi [destra?]) a livello binario? Non sono sicuro che la dipendenza di runtime sarebbe un problema, rispetto ai runtime di C (++), quanti sono disponibili per Objective-C (++) per lo stesso sistema? – MFH