Was bedeutet "Objective-C ist eine Obermenge von C strenger als C ++" genau?

87

Nach dem, was ich dort gelesen habe: Warum ist Objective-C außerhalb der Apple-Community nicht sehr beliebt?

Objective-C ist eine Obermenge von C (viel strenger als C ++), sodass das Problem der Abwärtskompatibilität nicht auftritt. Alles, was Sie in C tun können, können Sie in Objective-C tun.

Eine Obermenge zu sein ist binär, wie schwanger zu sein. Obj-C ist eine Obermenge von C und C ++ nicht.

Was meinen sie mit Obermenge? Inwiefern wäre Ziel-C enger // abwärtskompatibel zu C? Inwiefern folgt Objective-C der C-Philosophie genauer als C ++?

Kann ein C-Programm ohne Änderung von einem Objective-C-Compiler kompiliert werden (100% Kompatibilität)?

Dies ist eher eine Frage zum Design und zur Kompatibilität von Programmiersprachen als ein Krieg, um den es besser geht.

user1115057
quelle

Antworten:

134

Ich habe ein einfaches Diagramm erstellt. es ist nicht sehr hübsch, bringt aber hoffentlich den Punkt rüber:

  • Rot: Die Menge aller in C, C ++ und Objective-C gültigen Programme (relativ klein)
  • Grün: Die Menge aller Programme, die in C und Objective-C gültig, in C ++ jedoch ungültig sind (noch kleiner).
  • Grau: Die Menge aller Programme, die in Objective C und C ++ gültig, in C jedoch ungültig sind (soweit ich weiß leer).
  • Blau: Die Menge aller Programme, die nur in Ziel C gültig sind (relativ groß).
  • Gelb: Die Menge aller Programme, die nur in C ++ gültig sind (größte)

Die Menge der gültigen C-Programme (in Rot und Grün) ist eine strikte Teilmenge der Menge der gültigen Ziel-C-Programme (blau).

Geben Sie hier die Bildbeschreibung ein

Escualo
quelle
14
Was ist mit objektivem c ++?
user1115057
14
Seltsame Ähnlichkeit ...: justindomke.files.wordpress.com/2008/11/scalaimage11.png
user1115057
19
Inwiefern ist Gelb hier "größer" als Blau? Die Intuition sagt mir, dass beide Sätze zählbar unendlich wären.
wim
4
@wim: Und beide werden als unzählige Teilmengen von R ^ 2 dargestellt;) Dies ist der gleiche Trick, wie Sie N innerhalb des Q sehen werden, obwohl sie dieselbe Größe haben (und N eine strikte Teilmenge von Q ist).
Maciej Piechotka
3
Ich dachte noch etwas darüber nach und stellte fest, dass das ObjC ++ - Set all dies nicht wirklich umgeben würde. Es ist eine Obermenge von C ++, aber keine strikte Obermenge von ObjC. Dieselben Programme, die legal C, aber illegal C ++ (der grüne Bereich) sind, sind illegal ObjC ++.
Rob Napier
62
  1. Was meinen sie mit Obermenge?

    Sie bedeuten strenge Obermenge. Jedes gültige C-Programm wird mit einem Objective-C-Compiler kompiliert. Einige gültige C-Programme werden nicht mit einem C ++ - Compiler kompiliert.

  2. Inwiefern wäre Ziel-C enger // abwärtskompatibel zu C?

    Hier ist ein einfaches Beispiel:

    int *foo = malloc(12);

    Kompiliert in C und Objective-C, jedoch nicht in C ++. Es gibt natürlich auch andere Beispiele.

  3. Inwiefern folgt Objective-C der C-Philosophie genauer als C ++?

    Alle - Objective-C ist eine strikte Obermenge von C.

  4. Kann ein C-Programm ohne Änderung von einem Objective-C-Compiler kompiliert werden (100% Kompatibilität)?

    Ja.

Carl Norum
quelle
2
Ja, das wäre gut. Wahrscheinlich benötigen Sie Objective-C auch nicht für die GUI, wenn Sie bereit sind, die zu verwendenden Laufzeitfunktionen auf niedriger Ebene herauszufinden.
Carl Norum
3
Meist philosophisch.
Carl Norum
2
+1 Tolle Erklärung. Ich würde vorschlagen, dass die Frage der "C-Philosophie" etwas vage ist, aber die meisten Beobachter würden wahrscheinlich zustimmen, dass sich die "Ziele" von C und die "Ziele" von ObjC unterscheiden. Cs Absicht ist es, sehr nah an der Hardware zu sein und gleichzeitig einige nützliche Portabilitätsabstraktionen bereitzustellen, während ObjCs Ziel darin besteht, einen SmallTalk-Ansatz für C zu entwickeln. Da Kakao in den letzten Jahren ein wesentlicher Bestandteil von ObjC geworden ist, ist diese Divergenz noch größer. Die "Philosophie" (Designansatz) eines C-Arrays und eines NSArray sind sicherlich sehr unterschiedlich.
Rob Napier
2
Das hängt ganz vom Programm ab. Wahrscheinlich würden Sie in einem Objective-C-Programm nicht zu viele Dinge im C-Stil tun. Warum sollten Sie dann Objective-C verwenden?
Carl Norum
1
@ user1115057: Sie sollten sich nicht zu viele Gedanken darüber machen, wie die Dinge betrachtet werden. Es gibt zwei Probleme beim Schreiben von C ++ - Code, der als C kompiliert wird (oder zumindest so aussieht). Zum einen erhalten Sie keinen der Vorteile von C ++, aber das ist Ihr Aufruf. Wichtig ist, dass Sie in einem gebrochenen Dialekt von C schreiben, der nicht wirklich C ist. Sie sollten stattdessen Ihren C-Code mit einem C-Compiler kompilieren und ihn mit Ihrem C ++ - Code verknüpfen. Das letztere Problem gilt nicht für Objective-C, da die Teilmenge von Objective-C, die als C kompiliert wird, C ist .
Steve Jessop
31

Von Grund auf wurde C ++ als "besseres C" konzipiert, um sowohl reale als auch wahrgenommene Designlücken zu schließen, während die Autoren von C ++ die Sprache durchgingen. Das Ergebnis dieser Entwurfsentscheidung war, Xdass ein gültiges C-Programm nicht garantiert, dass Xes kompiliert oder gar ausgeführt wird, wenn es vom C ++ - Compiler verarbeitet wird. Die Änderungen berührten grundlegende Konstrukte wie String-Literale (sie wurden const char*), Zuweisung von voidZeigern, Konvertierungen zwischen enums- und Integraltypen, Semantik von zusammengesetzten Zuweisungsoperatoren usw.

Darüber hinaus wurden nach der Einführung von C99 Funktionen, die es in den aktualisierten C-Standard schafften, aus dem aktualisierten C ++ - Standard weggelassen. Auch hier wurden sehr wichtige Sprachfunktionen ausgelassen - insbesondere bestimmte Initialisierer und Arrays mit variabler Größe.

Im Gegensatz dazu wurde Objective C als Obermenge von C positioniert, sodass alle gültigen C-Programme mit einem Objective C-Compiler kompilierbar sein müssen.

dasblinkenlight
quelle
4
Ich habe diese Frage beantwortet, weil ich weiß, was eine "Obermenge" ist, aber ich weiß nichts über Objective-C. Ich habe in einer anderen SO-Frage die Behauptung gesehen, dass das gültige C-Code-Snippet int nil = 0; nil++;nicht als Objective-C kompiliert wird. Was ist das Problem dort, ist es offensichtlich, dass Objective-C Header zur Verfügung stellt, die, sobald sie enthalten sind, Ihren Code genau wie C-Header beschädigen können? Und daher hätte der Autor dieses Ausschnitts sie nicht aufnehmen sollen.
Steve Jessop
2
"nil" ist eigentlich eher ein #define als ein Schlüsselwort. Sie sehen Probleme, weil objc / objc.h enthalten ist. Dies ähnelt den Problemen, die auftreten würden, wenn Sie versuchen würden, eine Variable mit dem Namen YES zu erstellen. (Xcode hebt diese hervor, als wären sie wirklich Schlüsselwörter, weil es viel einfacher ist, so darüber nachzudenken; aber sie sind als einfacher C-Code implementiert.)
Rob Napier
4
Übrigens, es lohnt sich, sich in objc.ha wenig umzuschauen, wenn Sie daran interessiert sind, wie ObjC über C lebt. Dinge, von denen Sie denken, dass sie Schlüsselwörter sind (id, BOOL, Class, nil usw.), sind nur einfache Typen, Strukturen und definiert. Sie können die manuelle Nachrichtenübergabe sogar in pure-C implementieren. Mach das niemals. : D Aber du kannst. github.com/iosptl/ios6ptl/blob/master/ch28/Runtime/MyMsgSend.c
Rob Napier
2
@ DanNeely: Rob Napier sagte "Mach das niemals" als Kommentar zu der verknüpften Datei. Die verknüpfte Datei ist nicht die Objective-C-Laufzeit, sondern nur ein kurzer Hack, der zeigt, wie Messaging wirklich funktioniert.
Dietrich Epp
1
Die verknüpfte Datei zeigte nicht, wie kompliziert die Weitergabe von ObjC-Nachrichten ist. Es zeigt, dass die Laufzeit von C verfügbar ist und dass Sie ObjC-Code im Prinzip in reines C konvertieren können. ABER… das ist ungefähr so ​​langsam, wie Sie es erstellen könnten. Es beruhte darauf, dass ich den Rückgabetyp der Methoden kannte (und für einige Rückgabetypen müsste ich wahrscheinlich den Prozessortyp kennen), und ich wählte sorgfältig Methoden aus, die keine Parameter annehmen. Die vollständige Lösung hat viele subtile Tricks (Teile müssen im Assembler sein, weil sie mit den Stapelrahmen betrügen). Sie sollten niemals versuchen, es wieder aufzubauen.
Rob Napier
12

"Objective-C ist eine Obermenge von C" bedeutet, dass jedes gültige C-Programm ein gültiges Objective-C-Programm ist (mit derselben Bedeutung).

Es wird manchmal gesagt, obwohl nicht von C ++ - Experten, dass C ++ eine Obermenge von C ist. Dies ist nicht korrekt, weshalb Ihr Zitat einen großen Vergleich zwischen beiden macht.

Steve Jessop
quelle
9

Objective C ist eine Reihe abwärtskompatibler Erweiterungen für C. Dies ist möglich, da die Objective C-Funktionen auf zwei sehr einfache Arten abgegrenzt sind:

  • Verwendung des Charakters @ . Dieses Zeichen wird derzeit in der Sprache C nicht verwendet.
  • eine einfache syntaktische Erweiterung zum Aufrufen von Methoden , [obj method:argument]. In C werden eckige Klammern auf sehr spezielle Weise für die Array-Subskription verwendet. Dies ist also eine ungültige C-Syntax. Erweiterungen, die auf einer ungültigen Syntax aufbauen, ändern nichts an der Bedeutung von Elementen, die in der Hostsprache gültig sind.

So leicht zu erkennen, dass kein Programm, das Objective C-Erweiterungen verwendet, ein streng konformes ISO C-Programm sein kann, egal wie einfach. Darüber hinaus kann jedes ISO C-Programm per Definition als gültiges Objective C-Programm deklariert werden. Ziel C kann Entwicklungen wie C99 und C11 leicht verfolgen.

Andererseits ist C ++ nicht einfach eine Erweiterung von C; Es ist eine andere Sprache, die die Bedeutung einiger Syntax von C ändert. C ++ und C werden separat verwaltet, und daher ändert sich ihre Beziehung im Laufe der Zeit. Zum Beispiel hat C neue Funktionen erworben, die in C ++ vollständig fehlen und wahrscheinlich nicht in C ++ integriert werden, wie z. B. C99-Arrays mit variabler Länge. C ++ kann neue C-Funktionen nicht einfach aufnehmen.

Wenn Sie ein portables C-Programm schreiben, sollte es gleichzeitig ein Objective C-Programm sein. Es ist jedoch zusätzliche Sorgfalt erforderlich, damit es sich auch um ein C ++ - Programm mit derselben Bedeutung handelt. (Diese Praxis ist nicht ungewöhnlich und der erforderliche Dialekt wird informell als "Clean C" bezeichnet.)

Ein triviales Beispiel für ein C-Programm, das bei Behandlung als C ++ unterbrochen wird, ist jedes C-Programm, das ein C ++ - Schlüsselwort als Bezeichner verwendet, z. B. classoder virtual. Ziel C führt keine reservierten Schlüsselwörter ein. Es hat neue Schlüsselwörter, die vom @Charakter eingeführt werden , wie z @interface.

Kaz
quelle