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 la 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 surensemble? De quelle manière l'objectif-C serait-il plus proche // rétrocompatible avec C? En quoi objective-C suit-il la philosophie C de plus près que C++?
Tout programme C peut-il être compilé sans modification par un compilateur objective-C (compatibilité à 100%)?
Il s'agit plus d'une question de conception et de compatibilité d'un langage de programmation que d'une guerre pour laquelle on est meilleur.
J'ai préparé un schéma simple; ce n'est pas très joli, mais j'espère bien faire comprendre:
L'ensemble des programmes C valides (en rouge et vert) est un sous-ensemble strict de l'ensemble des programmes Objective C valides (bleu)
Que veulent-ils dire par surensemble?
Ils signifient un surensemble 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++.
De quelle manière l'objectif-C serait-il plus proche // rétrocompatible avec 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.
En quoi objective-C suit-il la philosophie C de plus près que C++?
Tous - Objective-C est un sur-ensemble strict de C.
Tout programme C peut-il être compilé sans modification par un compilateur objective-C (compatibilité à 100%)?
Oui.
De fond en comble, 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 traversé le langage. Le résultat de cette décision de conception a été que X
étant un programme C valide ne garantissait pas que X
se compilerait, et encore moins s'exécuterait, lorsqu'il serait traité par le compilateur C++. Les changements ont touché des constructions de base comme des littéraux de chaîne (ils sont devenus const char*
), affectation de void
pointeurs, conversions entre enum
s et types intégraux, sémantique des opérateurs d'affectation composés , etc.
De plus, une fois C99 arrivé, les fonctionnalités qui en faisaient la norme C mise à jour ont été omises de la norme C++ mise à jour. Encore une fois, des fonctionnalités de langage très importantes ont été omises - notamment des initialiseurs désignés et des tableaux de taille variable.
En revanche, Objective C a été positionné comme un sur-ensemble de C, nécessitant que tous les programmes C valides soient compilables avec un compilateur Objective C.
"Objective-C est un surensemble de C" signifie que chaque programme C valide est un programme Objective-C valide (avec la même signification).
Il est parfois dit, mais pas par des experts C++, que C++ est un surensemble de C. Ce n'est pas exact, c'est pourquoi votre citation fait beaucoup de comparaison entre les deux.
Objective C est un ensemble d'extensions rétrocompatibles à C. Ceci est possible car les fonctionnalités d'Objective C sont délimitées de deux manières très simples:
@
. Ce caractère n'est actuellement pas utilisé dans le langage C.[obj method:argument]
. En C, les crochets sont utilisés d'une manière très spécifique pour l'indexation des tableaux, et c'est donc une syntaxe C non valide. Les extensions qui s'appuient sur une syntaxe non valide ne changent pas la signification de tout ce qui est valide dans le langage hôte.Si facile à 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 étant un programme Objective C valide. L'objectif C peut facilement suivre des développements comme C99 et C11.
D'un autre côté, C++ n'est pas simplement une extension 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 ne vont probablement pas entrer en C++, comme les tableaux de longueur variable C99. C++ ne peut pas facilement récupérer de nouvelles fonctionnalités C.
Si vous écrivez un programme C portable, ce 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++ ayant la même signification. (Cette pratique n'est pas inconnue, et le dialecte dont elle a besoin est officieusement appelé "Clean C").
Un exemple trivial d'un programme C qui se casse lorsqu'il est traité en C++ est tout programme C qui utilise un mot clé C++ comme identifiant, tel que class
ou virtual
. L'objectif C n'introduit aucun mot clé réservé. Il contient de nouveaux mots clés introduits par le @
caractère, comme @interface
.