web-dev-qa-db-fra.com

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

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.

87
user1115057

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

  • 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)
  • Gray: 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 dans l'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 (bleu)

enter image description here

133
Escualo
  1. 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++.

  2. 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.

  3. 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.

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

    Oui.

62
Carl Norum

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 enums 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.

31
dasblinkenlight

"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.

12
Steve Jessop

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:

  • utilisation du caractère @. Ce caractère n'est actuellement pas utilisé dans le langage C.
  • une extension syntaxique simple pour invoquer des méthodes, [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.

9
Kaz