Cosa significa esattamente "Objective-C è un superset di C più strettamente di C ++"?


87

Da quello che ho letto: perché Objective-C non è molto popolare al di fuori della comunità Apple?

Objective-C è un superset di C (molto più strettamente di C ++, infatti) quindi il problema della compatibilità con le versioni precedenti non si pone. Tutto ciò che puoi fare in C lo puoi fare in Objective-C.

Essere un superset è binario, come essere incinta. Obj-C è un superset di C e C ++ non lo è.

Cosa intendono per superserie? In che modo l'obiettivo-C sarebbe più vicino // retrocompatibile con C? In che modo oggettivo-C segue la filosofia C più da vicino di C ++?

Un programma C può essere compilato senza modifiche da un compilatore Object-C (compatibilità al 100%)?

Questa è più una domanda sul design e la compatibilità del linguaggio di programmazione che una guerra su quale sia il migliore.

Risposte:


134

Ho preparato un semplice diagramma; non è molto carino, ma si spera che il punto sia chiaro:

  • Rosso: l'insieme di tutti i programmi validi in C, C ++ e Objective-C (relativamente piccolo)
  • Verde: l'insieme di tutti i programmi validi in C e Objective-C, ma non validi in C ++ (anche più piccoli)
  • Grigio: l'insieme di tutti i programmi validi in Objective C e C ++, ma non validi in C (vuoto, per quanto ne so)
  • Blu: l'insieme di tutti i programmi valido solo nell'Obiettivo C (relativamente grande)
  • Giallo: l'insieme di tutti i programmi valido solo in C ++ (il più grande)

L'insieme di programmi C validi (in rosso e verde) è un sottoinsieme rigoroso dell'insieme di programmi C Objective validi (blu)

inserisci qui la descrizione dell'immagine


14
Che dire dell'obiettivo c ++?
user1115057


19
In che misura asserite che il giallo è "più grande" del blu qui? L'intuizione mi dice che entrambi gli insiemi sarebbero numerabilmente infiniti.
wim

4
@wim: Ed entrambi sono rappresentati come sottoinsiemi non numerabili di R ^ 2;) Questo è lo stesso trucco che vedrai N all'interno della Q nonostante abbiano le stesse dimensioni (e N sia un sottoinsieme rigoroso di Q).
Maciej Piechotka

3
Ci stavo pensando ancora e mi sono reso conto che il set di ObjC ++ non avrebbe effettivamente circondato tutto questo. È un superset di C ++, ma non un superset rigoroso di ObjC. Gli stessi programmi che sono C legale, ma C ++ illegale (l'area verde) sono ObjC ++ illegali.
Rob Napier

62
  1. Cosa intendono per superserie?

    Significano superserie rigorose. Qualsiasi programma C valido verrà compilato con un compilatore Objective-C. Alcuni programmi C validi non verranno compilati con un compilatore C ++.

  2. In che modo l'obiettivo-C sarebbe più vicino // retrocompatibile con C?

    Ecco un semplice esempio:

    int *foo = malloc(12);
    

    Compila in C e Objective-C, ma non in C ++. Naturalmente ci sono anche altri esempi.

  3. In che modo oggettivo-C segue la filosofia C più da vicino di C ++?

    All - Objective-C è un rigoroso superset di C.

  4. Un programma C può essere compilato senza modifiche da un compilatore Object-C (compatibilità al 100%)?

    Sì.


2
Sì, andrebbe bene. Probabilmente non hai bisogno di Objective-C per la GUI, se sei disposto a capire le funzioni di runtime di basso livello da usare.
Carl Norum

3
Per lo più filosofico.
Carl Norum

2
+1 Ottima spiegazione. Suggerirei che la questione della "filosofia C" sia un po 'vaga, ma la maggior parte degli osservatori sarebbe probabilmente d'accordo sul fatto che gli "obiettivi" di C e gli "obiettivi" di ObjC differiscono. L'intento di C è quello di essere molto vicino all'hardware, fornendo al contempo alcune utili astrazioni di portabilità, mentre l'obiettivo di ObjC è di portare un approccio SmallTalk a C. Poiché Cocoa è diventato parte integrante di ObjC negli ultimi anni, questa divergenza è ancora più forte. La "filosofia" (approccio progettuale) di un C-array e di un NSArray sono certamente molto differenti.
Rob Napier

2
Dipende interamente dal programma. Probabilmente non faresti troppe cose in stile C in un programma Objective-C. Perché allora dovresti usare Objective-C?
Carl Norum

1
@ user1115057: non dovresti preoccuparti troppo di come vengono considerate le cose. Ci sono due problemi con la scrittura di codice C ++ che si compila come (o almeno assomiglia a) C. Uno è che non ottieni nessuno dei vantaggi di C ++, ma questa è la tua chiamata. L'importante è che tu stia scrivendo in un dialetto rotto di C che non è realmente C. Dovresti invece compilare il tuo codice C con un compilatore C e collegarlo al tuo codice C ++. Quest'ultima preoccupazione non si applica con Objective-C, poiché il sottoinsieme di Objective-C che si compila come C, è C.
Steve Jessop

31

Da zero, il C ++ è stato progettato come un "C migliore", correggendo le omissioni di progettazione, sia reali che percepite, mentre gli autori del C ++ hanno attraversato il linguaggio. Il risultato di questa decisione progettuale è stato che l' Xessere un programma C valido non garantisce la Xcompilazione, per non parlare dell'esecuzione, quando viene elaborato dal compilatore C ++. Le modifiche hanno toccato costrutti di base come stringhe letterali (divennero const char*), assegnazione di voidpuntatori, conversioni tra se enumtipi integrali, semantica di operatori di assegnazione composti e così via.

Inoltre, una volta che C99 è arrivato, le funzionalità che sono entrate nello standard C aggiornato sono state escluse dallo standard C ++ aggiornato. Ancora una volta, le caratteristiche del linguaggio molto importanti sono state tralasciate, in particolare inizializzatori designati e array di dimensioni variabili.

Al contrario, Objective C è stato posizionato come un superset di C, richiedendo che tutti i programmi C validi siano compilabili con un compilatore Objective C.


4
Ho risposto a questa domanda perché so cos'è un "superset", ma non so nulla di Objective-C. Ho visto un'affermazione in un'altra domanda SO, che lo snippet di codice C valido int nil = 0; nil++;non viene compilato come Objective-C. Qual è il problema, è ovvio che Objective-C rende disponibili intestazioni che, una volta incluse, possono rompere il codice esattamente come fanno le intestazioni C? E quindi l'autore di quello snippet non avrebbe dovuto includerli.
Steve Jessop

2
"nil" è in realtà una #define piuttosto che una parola chiave. Stai riscontrando problemi perché objc / objc.h è incluso. Questo è simile ai problemi che vedresti se provassi a creare una variabile chiamata YES. (Xcode le evidenzia come se fossero davvero parole chiave perché è molto più facile pensarci in questo modo; ma sono implementate come semplice codice C).
Rob Napier

4
A proposito, vale la pena dare un'occhiata a objc. Un po 'se sei interessato a come ObjC vive sopra C. Le cose che penseresti sarebbero parole chiave (id, BOOL, Class, nil, ecc.) Sono solo tipi semplici, strutture e definisce. Puoi anche implementare il passaggio dei messaggi manualmente in C puro. Mai, mai farlo. : D Ma puoi. github.com/iosptl/ios6ptl/blob/master/ch28/Runtime/MyMsgSend.c
Rob Napier

2
@ DanNeely: Rob Napier ha detto "mai, mai farlo" come commento sul file collegato. Il file collegato non è il runtime Objective-C, è solo un rapido trucco che mostra alcuni dei modi in cui funziona davvero la messaggistica.
Dietrich Epp

1
Il file collegato non dimostrava quanto sia complicato il passaggio di messaggi ObjC. Dimostra che il runtime è disponibile da C e che in linea di principio puoi convertire il codice ObjC in puro C. MA ... questo è lento quanto potresti crearlo. Si basava sulla mia conoscenza del tipo di ritorno dei metodi (e per alcuni tipi di ritorno, probabilmente avrei bisogno di conoscere il tipo di processore), e ho scelto con cura metodi che non accettano parametri. La soluzione completa ha molti trucchi sottili (le parti devono essere in assemblatore perché imbrogliano con gli stack frame). Non dovresti mai provare a ricostruirlo.
Rob Napier

12

"Objective-C è un superset di C" significa che ogni programma C valido è un programma Objective-C valido (con lo stesso significato).

A volte si dice, anche se non dagli esperti di C ++, che C ++ è un superset di C. Questo non è accurato, motivo per cui la tua citazione sta facendo un grosso problema nel confrontare i due.


9

Objective C è un insieme di estensioni compatibili con le versioni precedenti di C. Ciò è possibile perché le funzionalità Objective C sono delimitate in due modi molto semplici:

  • uso del personaggio @ . Questo carattere non è attualmente utilizzato nel linguaggio C.
  • una semplice estensione sintattico per invocare metodi [obj method:argument]. In C, le parentesi quadre vengono utilizzate in un modo molto specifico per l'indice degli array, e quindi questa non è una sintassi C non valida. Le estensioni che si basano su una sintassi non valida non cambiano il significato di tutto ciò che è valido nella lingua host.

È così facile vedere che nessun programma che utilizza le estensioni Objective C può essere un programma ISO C strettamente conforme, non importa quanto semplice. Inoltre, ogni programma ISO C può essere dichiarato, per definizione, un programma Objective C valido. L'obiettivo C può seguire facilmente sviluppi come C99 e C11.

D'altra parte, C ++ non è semplicemente un'estensione di C; è un linguaggio diverso che cambia il significato di alcune delle sintassi di C. C ++ e C vengono mantenuti separatamente, e quindi la loro relazione cambia nel tempo. Ad esempio, C ha acquisito nuove funzionalità che sono completamente assenti in C ++ e molto probabilmente non entreranno in C ++, come gli array C99 a lunghezza variabile. Il C ++ non può acquisire facilmente nuove funzionalità C.

Se scrivi un programma C portatile, dovrebbe essere allo stesso tempo un programma Objective C. Ma sarà necessaria ulteriore attenzione in modo che sia anche un programma C ++ con lo stesso significato. (Questa pratica non è inaudita, e il dialetto che richiede è informalmente noto come "Clean C").

Un banale esempio di un programma C che si interrompe se trattato come C ++ è qualsiasi programma C che utilizza una parola chiave C ++ come identificatore, come classo virtual. L'obiettivo C non introduce parole chiave riservate. Ha nuove parole chiave che vengono introdotte dal @personaggio, come @interface.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.