Que signifie exactement «Objective-C est un sur-ensemble de C plus strictement que C ++»?

87

D'après ce que j'ai lu là-bas: Pourquoi Objective-C n'est-il pas très populaire en dehors de la communauté Apple?

Objective-C est un sur-ensemble de C (beaucoup plus strictement que C ++, en fait) donc le problème de compatibilité descendante ne se pose pas. Tout ce que vous pouvez faire en C, vous pouvez le faire en Objective-C.

Être un surensemble est binaire, comme être enceinte. Obj-C est un sur-ensemble de C, et C ++ ne l'est pas.

Que veulent-ils dire par sur-ensemble? De quelle manière objective-C serait-il plus proche // rétrocompatible de C? De quelle manière objective-C suit-il la philosophie C de plus près que C ++?

Un programme C peut-il être compilé sans modification par un compilateur objective-C (compatibilité à 100%)?

C'est plus une question sur la conception et la compatibilité du langage de programmation qu'une guerre pour savoir lequel est le meilleur.

user1115057
la source

Réponses:

134

J'ai préparé un schéma simple; ce n'est pas très joli, mais j'espère faire passer le message:

  • Rouge: l'ensemble de tous les programmes valides en C, C ++ et Objective-C (relativement petit)
  • Vert: l'ensemble de tous les programmes valides en C et Objective-C, mais invalides en C ++ (encore plus petit)
  • Gris: l'ensemble de tous les programmes valides en Objective C et C ++, mais invalides en C (vide, pour autant que je sache)
  • Bleu: l'ensemble de tous les programmes valables uniquement en Objectif C (relativement grand)
  • Jaune: l'ensemble de tous les programmes valides uniquement en C ++ (le plus grand)

L'ensemble des programmes C valides (en rouge et vert) est un sous-ensemble strict de l'ensemble des programmes Objective C valides (en bleu)

entrez la description de l'image ici

Escualo
la source
14
Qu'en est-il du C ++ objectif?
user1115057
14
Étrange ressemblance ...: justindomke.files.wordpress.com/2008/11/scalaimage11.png
user1115057
19
Dans quelle mesure prétendez-vous que le jaune est "plus grand" que le bleu ici? L'intuition me dit que les deux ensembles seraient infiniment infinis.
wim
4
@wim: Et les deux sont représentés comme des sous-ensembles innombrables de R ^ 2;) C'est la même astuce que vous verrez N à l'intérieur du Q bien qu'ils aient la même taille (et N étant un sous-ensemble strict de Q).
Maciej Piechotka
3
J'y réfléchissais un peu plus et je me rendis compte que l'ensemble ObjC ++ n'entourerait pas réellement tout cela. C'est un sur-ensemble de C ++, mais pas un sur-ensemble strict d'ObjC. Les mêmes programmes qui sont en C légal, mais en C ++ illégal (la zone verte) sont des ObjC ++ illégaux.
Rob Napier
62
  1. Que veulent-ils dire par sur-ensemble?

    Ils signifient un sur-ensemble strict. Tout programme C valide sera compilé avec un compilateur Objective-C. Certains programmes C valides ne seront pas compilés avec un compilateur C ++.

  2. De quelle manière objective-C serait-il plus proche // rétrocompatible de C?

    Voici un exemple simple:

    int *foo = malloc(12);

    Compile en C et Objective-C, mais pas en C ++. Il y a bien sûr d'autres exemples également.

  3. De quelle manière objective-C suit-il la philosophie C de plus près que C ++?

    Tous - Objective-C est un sur-ensemble strict de C.

  4. Un programme C peut-il être compilé sans modification par un compilateur objective-C (compatibilité à 100%)?

    Oui.

Carl Norum
la source
2
Oui ce serait bien. On peut dire que vous n'avez pas non plus besoin d'Objective-C pour l'interface graphique, si vous êtes prêt à comprendre les fonctions d'exécution de bas niveau à utiliser.
Carl Norum
3
Surtout philosophique.
Carl Norum
2
+1 Excellente explication. Je dirais que la question de "la philosophie C" est un peu vague, mais la plupart des observateurs conviendraient probablement que les "buts" de C et les "buts" d'ObjC diffèrent. L'intention de C est d'être très proche du matériel, tout en fournissant des abstractions de portabilité utiles, tandis que l'objectif d'ObjC est d'apporter une approche SmallTalk à C. Comme Cocoa est devenu partie intégrante d'ObjC ces dernières années, cette divergence est encore plus forte. La «philosophie» (approche de conception) d'un C-array et d'un NSArray est certainement très différente.
Rob Napier
2
Cela dépend entièrement du programme. Vous ne feriez probablement pas trop de choses de style C dans un programme Objective-C. Pourquoi utiliser Objective-C alors?
Carl Norum
1
@ user1115057: vous ne devriez pas trop vous soucier de la façon dont les choses sont considérées. Il y a deux problèmes avec l'écriture de code C ++ qui se compile comme (ou du moins ressemble à) C. L'un est que vous n'obtenez aucun des avantages du C ++, mais c'est votre appel. L'important est que vous écrivez dans un dialecte cassé de C qui n'est pas vraiment C. Vous devriez plutôt compiler votre code C avec un compilateur C et le lier à votre code C ++. Cette dernière préoccupation ne s'applique pas avec Objective-C, puisque le sous-ensemble d'Objective-C qui se compile en C, est C.
Steve Jessop
31

Depuis le début, le C ++ a été conçu comme un «meilleur C», corrigeant les omissions de conception, à la fois réelles et perçues, au fur et à mesure que les auteurs de C ++ ont parcouru le langage. Le résultat de cette décision de conception a été Xqu'être un programme C valide ne garantissait pas qu'il Xcompilerait, et encore moins s'exécuterait, lorsqu'il serait traité par le compilateur C ++. Les changements ont touché des constructions de base telles que les littéraux de chaîne (ils sont devenus const char*), l'affectation de voidpointeurs, les conversions entre enumles types s et intégraux, la sémantique des opérateurs d'assignation composés , etc.

De plus, une fois que C99 est arrivé, les fonctionnalités qui en ont fait la norme C mise à jour ont été laissées de côté dans la norme C ++ mise à jour. Encore une fois, des fonctionnalités de langage très importantes ont été laissées de côté, notamment les initialiseurs désignés et les tableaux de taille variable.

En revanche, Objective C a été positionné comme un sur-ensemble de C, exigeant que tous les programmes C valides soient compilables avec un compilateur Objective C.

dasblinkenlight
la source
4
J'ai répondu à cette question parce que je sais ce qu'est un "sur-ensemble", mais je ne sais rien de l'Objective-C. J'ai vu une affirmation dans une autre question SO, selon laquelle l'extrait de code C valide int nil = 0; nil++;ne se compile pas en Objective-C. Quel est le problème, est-ce évident qu'Objective-C met à disposition des en-têtes qui, une fois inclus, peuvent casser votre code exactement comme les en-têtes C le peuvent? Et par conséquent, l'auteur de cet extrait de code n'aurait pas dû les inclure.
Steve Jessop
2
"nil" est en fait un #define plutôt qu'un mot-clé. Vous rencontrez des problèmes car objc / objc.h est inclus. Ceci est similaire aux problèmes que vous verriez si vous essayiez de créer une variable appelée YES. (Xcode les met en évidence comme s'il s'agissait vraiment de mots-clés, car il est beaucoup plus facile d'y penser de cette façon; mais ils sont implémentés comme un simple code C.)
Rob Napier
4
BTW, cela vaut la peine de fouiller dans objc.ha peu si vous êtes intéressé par la façon dont ObjC vit au-dessus de C.Les choses que vous pensez être des mots-clés (id, BOOL, Class, nil, etc.) ne sont que des types simples, des structures , et définit. Vous pouvez même implémenter le passage de messages à la main dans pure-C. Jamais, jamais faire ça. : D Mais vous pouvez. github.com/iosptl/ios6ptl/blob/master/ch28/Runtime/MyMsgSend.c
Rob Napier
2
@DanNeely: Rob Napier a dit "ne jamais, jamais faire ça" comme commentaire sur le fichier lié. Le fichier lié n'est pas le runtime Objective-C, c'est juste un hack rapide qui montre une partie du fonctionnement réel de la messagerie.
Dietrich Epp
1
Le fichier lié ne montrait pas à quel point le passage des messages ObjC était compliqué. Cela démontre que le runtime est disponible à partir de C et que vous pouvez en principe convertir du code ObjC en pur C. MAIS… c'est à peu près aussi lent que vous pourriez le construire. Cela reposait sur ma connaissance du type de retour des méthodes (et pour certains types de retour, j'aurais probablement besoin de connaître le type de processeur), et j'ai soigneusement choisi des méthodes qui ne prennent aucun paramètre. La solution complète comporte de nombreuses astuces subtiles (les pièces doivent être en assembleur car elles trichent avec les cadres de la pile). Vous ne devriez jamais essayer de le reconstruire.
Rob Napier
12

"Objective-C est un sur-ensemble de C" signifie que chaque programme C valide est un programme Objective-C valide (avec la même signification).

On dit parfois , bien que pas par les experts C ++, que C ++ est un sur-ensemble de C. Ce n'est pas exact, c'est pourquoi votre citation fait beaucoup de comparaison entre les deux.

Steve Jessop
la source
9

Objective C est un ensemble d'extensions rétrocompatibles vers C. Cela est possible car les fonctionnalités d'Objective C sont délimitées de deux manières très simples:

  • utilisation du personnage @ . Ce caractère n'est actuellement pas utilisé dans le langage C.
  • une simple extension syntaxique pour invoquer des méthodes, [obj method:argument]. En C, les crochets sont utilisés de manière très spécifique pour l'indexation des tableaux, et il s'agit donc d'une syntaxe C invalide. Les extensions qui reposent sur une syntaxe invalide ne modifient pas la signification de tout ce qui est valide dans la langue hôte.

Il est si facile de voir qu'aucun programme utilisant des extensions Objective C ne peut être un programme ISO C strictement conforme, aussi simple soit-il. De plus, chaque programme ISO C peut être déclaré, par définition, comme un programme Objective C valide. Objective C peut facilement suivre des développements comme C99 et C11.

D'un autre côté, C ++ n'est pas simplement des extensions de C; c'est un langage différent qui change la signification d'une partie de la syntaxe de C. C ++ et C sont maintenus séparément, et donc leur relation change avec le temps. Par exemple, C a acquis de nouvelles fonctionnalités qui sont complètement absentes en C ++, et qui n'iront probablement pas dans C ++, comme les tableaux de longueur variable C99. C ++ ne peut pas facilement saisir de nouvelles fonctionnalités C.

Si vous écrivez un programme C portable, il doit être en même temps un programme Objective C. Mais des précautions supplémentaires seront nécessaires pour qu'il s'agisse également d'un programme C ++ avec la même signification. (Cette pratique n'est pas inconnue, et le dialecte qu'elle nécessite est officieusement connu sous le nom de «C propre»).

Un exemple trivial de programme C qui s'arrête lorsqu'il est traité comme C ++ est tout programme C qui utilise un mot clé C ++ comme identificateur, tel que classou virtual. L'Objectif C n'introduit aucun mot-clé réservé. Il a de nouveaux mots-clés qui sont introduits par le @personnage, comme @interface.

Kaz
la source