Was genau bedeutet “Objective-C ist eine strengere Obermenge von C als C++”?

Lesezeit: 9 Minuten

Benutzeravatar von user1115057
Benutzer1115057

Von 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 (in der Tat viel strikter als C++), sodass sich das Problem der Abwärtskompatibilität nicht stellt. Alles, was Sie in C tun können, können Sie in Objective-C tun.

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

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

Kann jedes C-Programm ohne Modifikation von einem Ziel-C-Compiler kompiliert werden (100% Kompatibilität)?

Dies ist eher eine Frage zum Design und zur Kompatibilität von Programmiersprachen als ein Krieg darüber, welche besser ist.

Benutzeravatar von Escualo
Escualo

Ich habe ein einfaches Diagramm vorbereitet; es ist nicht sehr hübsch, aber bringt es hoffentlich auf den Punkt:

  • 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, aber in C++ ungültig sind (noch kleiner)
  • Grau: die Menge aller Programme, die in Objective C und C++ gültig, aber in C ungültig sind (leer, soweit ich weiß)
  • 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 gültiger C-Programme (in Rot und Grün) ist eine strenge Teilmenge der Menge gültiger Ziel-C-Programme (blau)

Geben Sie hier die Bildbeschreibung ein

  • Was ist mit objektivem C++?

    – Benutzer1115057

    14. Oktober 2013 um 22:19 Uhr

  • Merkwürdige Ähnlichkeit… : justindomke.files.wordpress.com/2008/11/scalaimage11.png

    – Benutzer1115057

    14. Oktober 2013 um 23:59 Uhr

  • In welchem ​​Maß behaupten Sie, Gelb sei hier “größer” als Blau? Die Intuition sagt mir, dass beide Mengen abzählbar unendlich wären.

    – Wim

    15. Oktober 2013 um 0:26 Uhr

  • @wim: Und beide werden als unzählbare Teilmengen von R ^ 2 dargestellt;) Dies ist der gleiche Trick, da Sie N innerhalb des Q sehen werden, obwohl sie die gleiche Größe haben (und N eine strikte Teilmenge von Q ist).

    – Maciej Piechotka

    15. Oktober 2013 um 0:41 Uhr

  • Ich habe noch etwas darüber nachgedacht und festgestellt, dass das ObjC++-Set all dies nicht wirklich umschließen würde. Es ist eine Obermenge von C++, aber keine strikte Obermenge von ObjC. Die gleichen Programme, die legales C, aber illegales C++ (der grüne Bereich) sind, sind illegales ObjC++.

    – Rob Napier

    15. Oktober 2013 um 13:23 Uhr

Benutzeravatar von Carl Norum
Karl Norum

  1. Was meinen sie mit Supersatz?

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

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

    Hier ist ein einfaches Beispiel:

    int *foo = malloc(12);
    

    Kompiliert in C und Objective-C, aber nicht in C++. Natürlich gibt es auch andere Beispiele.

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

    All – Objective-C ist eine strikte Obermenge von C.

  4. Kann jedes C-Programm ohne Modifikation von einem Ziel-C-Compiler kompiliert werden (100% Kompatibilität)?

    Ja.

  • Ja, das wäre gut. Wahrscheinlich brauchen Sie Objective-C auch nicht für die GUI, wenn Sie bereit sind, die zu verwendenden Low-Level-Laufzeitfunktionen herauszufinden.

    – Karl Norum

    14. Oktober 2013 um 18:03 Uhr


  • Meist philosophisch.

    – Karl Norum

    14. Oktober 2013 um 18:04 Uhr

  • +1 Tolle Erklärung. Ich würde vorschlagen, dass die Frage nach 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. Die Absicht von C ist es, sehr nah an der Hardware zu sein und gleichzeitig einige nützliche Portabilitätsabstraktionen bereitzustellen, während das Ziel von ObjC darin besteht, einen SmallTalk-Ansatz in C einzubringen. Da Cocoa in den letzten Jahren zu einem integralen Bestandteil von ObjC geworden ist, ist diese Divergenz noch stärker. Die “Philosophie” (Designansatz) eines C-Arrays und eines NSArrays sind sicherlich sehr unterschiedlich.

    – Rob Napier

    14. Oktober 2013 um 18:05 Uhr

  • Das hängt ganz vom Programm ab. Wahrscheinlich würden Sie in einem Objective-C-Programm nicht allzu viele Dinge im C-Stil tun. Warum sollten Sie dann Objective-C verwenden?

    – Karl Norum

    14. Oktober 2013 um 18:12 Uhr

  • @ 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). Das eine ist, dass Sie keinen der Vorteile von C++ nutzen, aber das ist Ihre Sache. Wichtig ist, dass Sie in einem kaputten 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. Letzteres gilt nicht für Objective-C, da die Teilmenge von Objective-C, die als C kompiliert wird, ist C.

    – Steve Jessop

    14. Oktober 2013 um 18:13 Uhr


Benutzeravatar von Sergey Kalinichenko
Sergej Kalinitschenko

C++ wurde von Grund auf als „besseres C“ konzipiert, wobei sowohl reale als auch vermeintliche Auslassungen im Design behoben wurden, als die Autoren von C++ die Sprache durchgingen. Das Ergebnis dieser Designentscheidung war das X ein gültiges C-Programm zu sein, garantierte dies nicht X kompilieren, geschweige denn ausführen, wenn es vom C++-Compiler verarbeitet wird. Die Änderungen betrafen solche grundlegenden Konstrukte wie Zeichenfolgenliterale (sie wurden const char*), Zuordnung von void Zeiger, Konvertierungen zwischen enums und ganzzahlige Typen, Semantik zusammengesetzter Zuweisungsoperatoren und so weiter.

Darüber hinaus wurden, als C99 auf den Markt kam, Funktionen, die es in den aktualisierten C-Standard geschafft hatten, aus dem aktualisierten C++-Standard weggelassen. Auch hier wurden sehr wichtige Sprachfeatures ausgelassen – vor allem designierte Initialisierer und Arrays mit variabler Größe.

Im Gegensatz dazu wurde Objective C als Obermenge von C positioniert, was erfordert, dass alle gültigen C-Programme mit einem Objective C-Compiler kompilierbar sind.

  • Ich habe diese Frage beantwortet, weil ich weiß, was ein “Superset” ist, aber ich weiß nichts über Objective-C. Ich habe in einer anderen SO-Frage eine Behauptung gesehen, dass das gültige C-Code-Snippet int nil = 0; nil++; kompiliert nicht als Objective-C. Was ist das Problem, ist es das Offensichtliche, dass Objective-C Header zur Verfügung stellt, die, wenn sie einmal eingefügt 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

    14. Oktober 2013 um 18:09 Uhr


  • „nil“ ist eigentlich eher ein #define als ein Schlüsselwort. Sie sehen Probleme, weil objc/objc.h enthalten ist. Dies ähnelt den Problemen, die Sie sehen würden, wenn Sie versuchen würden, eine Variable namens YES zu erstellen. (Xcode hebt diese hervor, als wären sie wirklich Schlüsselwörter, weil es viel einfacher ist, auf diese Weise darüber nachzudenken; aber sie sind als einfacher C-Code implementiert.)

    – Rob Napier

    14. Oktober 2013 um 18:22 Uhr


  • Übrigens lohnt es sich, ein wenig in objc.ha herumzustöbern, wenn Sie daran interessiert sind, wie ObjC auf C lebt. Dinge, die Sie für Schlüsselwörter halten würden (id, BOOL, Class, nil usw.), sind nur einfache Typen, Strukturen , und definiert. Sie können die Nachrichtenübermittlung sogar manuell in Pure-C implementieren. Tu das niemals, niemals. 😀 Aber du kannst. github.com/iosptl/ios6ptl/blob/master/ch28/Runtime/MyMsgSend.c

    – Rob Napier

    14. Oktober 2013 um 18:29 Uhr


  • @DanNeely: Rob Napier sagte “niemals, niemals” als Kommentar zur verknüpften Datei. Die verlinkte Datei ist nicht die Objective-C-Laufzeit, es ist nur ein schneller Hack, der zeigt, wie Messaging wirklich funktioniert.

    – Dietrich Ep

    14. Oktober 2013 um 22:04 Uhr

  • Die verknüpfte Datei demonstrierte nicht, wie kompliziert die Übermittlung von ObjC-Nachrichten ist. Es zeigt, dass die Laufzeit von C verfügbar ist und dass Sie im Prinzip ObjC-Code in reines C konvertieren können. ABER … das ist ungefähr so ​​​​langsam, wie Sie es erstellen könnten. Es stützte sich 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 in Assembler sein, weil sie mit den Stapelrahmen schummeln). Sie sollten niemals versuchen, es wieder aufzubauen.

    – Rob Napier

    15. Oktober 2013 um 0:20 Uhr


“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 ist manchmal sagte, obwohl nicht von C++-Experten, dass C++ eine Obermenge von C ist. Das ist nicht korrekt, weshalb Ihr Zitat eine große Sache aus dem Vergleich der beiden macht.

Benutzeravatar von Kaz
Kaz

Objective C ist eine Reihe abwärtskompatibler Erweiterungen von C. Dies ist möglich, weil die Objective C-Funktionen auf zwei sehr einfache Arten begrenzt sind:

  • Verwendung des Zeichens @. 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 eine ganz bestimmte Weise zum Subskriptieren von Arrays verwendet, daher ist dies eine ungültige C-Syntax. Erweiterungen, die auf einer ungültigen Syntax aufbauen, ändern nichts, was in der Hostsprache gültig ist.

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

Andererseits ist C++ nicht einfach eine Erweiterung von C; es ist eine andere Sprache, die die Bedeutung eines Teils der Syntax von C ändert. C++ und C werden getrennt verwaltet, und daher ändert sich ihre Beziehung im Laufe der Zeit. Zum Beispiel hat C neue Funktionen erworben, die in C++ völlig fehlen und die höchstwahrscheinlich nicht in C++ aufgenommen werden, wie z. B. C99-Arrays mit variabler Länge. C++ kann neue C-Features 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 unbekannt, und der Dialekt, der dafür erforderlich ist, wird informell als “Clean C” bezeichnet).

Ein triviales Beispiel für ein C-Programm, das abbricht, wenn es als C++ behandelt wird, ist jedes C-Programm, das ein C++-Schlüsselwort als Bezeichner verwendet, wie z class oder virtual. Ziel C führt keine reservierten Schlüsselwörter ein. Es hat neue Schlüsselwörter, die von eingeführt werden @ Charakter, wie @interface.

1419770cookie-checkWas genau bedeutet “Objective-C ist eine strengere Obermenge von C als C++”?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy