「Objective-CはC ++より厳密にCのスーパーセットです」とはどういう意味ですか?


87

私が読んだところから:なぜObjective-CはAppleコミュニティの外ではあまり人気がないのですか?

Objective-CはCのスーパーセット(実際にはC ++よりも厳密)なので、下位互換性の問題は発生しません。Cで実行できることはすべてObjective-Cで実行できます。

スーパーセットであることは、妊娠しているようにバイナリです。Obj-CはCのスーパーセットですが、C ++はそうではありません。

スーパーセットとはどういう意味ですか?どのようにして、objective-CはCにより近い//後方互換性を持つでしょうか?Objective-Cは、C ++よりもCの哲学にどのように準拠していますか?

目的のCコンパイラ(100%互換)を使用して、Cプログラムを変更せずにコンパイルできますか?

これは、どちらが優れているかという戦争よりも、プログラミング言語の設計と互換性についての質問です。

回答:


134

簡単な図を用意しました。それはあまりきれいではありませんが、うまくいけば全体のポイントを取得します:

  • 赤: C、C ++、およびObjective-Cで有効なすべてのプログラムのセット(比較的小さい)
  • 緑: CおよびObjective-Cでは有効ですが、C ++では無効なすべてのプログラムのセット(さらに小さい)
  • 灰色: Objective CおよびC ++では有効であるが、Cでは無効であるすべてのプログラムのセット(私の知る限り、空)
  • 青: Objective Cでのみ有効なすべてのプログラムのセット(比較的大きい)
  • 黄色: C ++でのみ有効なすべてのプログラムのセット(最大)

有効なCプログラムのセット(赤と緑)は、有効なObjective Cプログラムのセット(青)の厳密なサブセットです。

ここに画像の説明を入力してください


14
客観的なC ++はどうですか?
user1115057 2013年


19
ここでは、黄色が青よりも「大きい」とはどの程度だと思いますか。直感は、両方のセットが数え切れないほど無限であることを私に教えています。
2013年

4
@wim:そして、どちらもR ^ 2の数え切れないほどのサブセットとして表されます;)これは、同じサイズ(ただし、NはQの厳密なサブセット)であるにもかかわらず、Q内にNを表示するのと同じトリックです。
Maciej Piechotka 2013年

3
私はそれについてもう少し考えていて、ObjC ++セットが実際にはこれのすべてを取り囲むわけではないことに気付きました。これはC ++のスーパーセットですが、ObjCの厳密なスーパーセットではありません。正当なCと同じプログラムですが、不正なC ++(緑の領域)は不正なObjC ++です。
Rob Napier

62
  1. スーパーセットとはどういう意味ですか?

    厳密なスーパーセットを意味します。有効なCプログラムはすべて、Objective-Cコンパイラでコンパイルされます。一部の有効なCプログラムは、C ++コンパイラーでコンパイルできません。

  2. どのようにして、objective-CはCにより近い//後方互換性を持つでしょうか?

    以下に簡単な例を示します。

    int *foo = malloc(12);

    CおよびObjective-Cでコンパイルしますが、C ++ではコンパイルしません。もちろん、他の例もあります。

  3. Objective-Cは、C ++よりもCの哲学にどのように準拠していますか?

    すべて-Objective-CはCの厳密なスーパーセットです。

  4. 目的のCコンパイラ(100%互換)を使用して、Cプログラムを変更せずにコンパイルできますか?

    はい。


2
はい、それで結構です。おそらく、使用する低レベルのランタイム関数を理解するつもりであれば、GUIにObjective-Cも必要ありません。
Carl Norum 2013年

3
主に哲学的。
Carl Norum、2013年

2
+1すばらしい説明。「Cの哲学」の質問は少しあいまいですが、ほとんどの観察者はCの「目標」とObjCの「目標」が異なることに同意するでしょう。Cの目的はハードウェアに非常に近く、いくつかの有用な移植性の抽象化を提供することですが、ObjCの目標はSmallTalkアプローチをCに導入することです。Cocoaは近年ObjCに不可欠になっているため、この相違はさらに強くなります。C-arrayとNSArrayの「哲学」(設計アプローチ)は確かに大きく異なります。
Rob Napier

2
それは完全にプログラムに依存します。おそらく、Objective-Cプログラムでは、あまり多くのCスタイルのことを行わないでしょう。では、なぜObjective-Cを使用するのでしょうか。
Carl Norum 2013年

1
@ user1115057:物事がどのように考慮されるかについてあまり気にする必要はありません。Cとしてコンパイルする(または少なくともCのように見える)C ++コードの記述には2つの問題があります。1つは、C ++の利点がまったく得られないことですが、それは呼び出しです。重要なのは、実際にはCではない、壊れたCの方言で書いているということです。代わりに、CコードをCコンパイラでコンパイルして、C ++コードにリンクする必要があります。後者の懸念は、Cとしてコンパイルは、この目的-Cのサブセットであるため、Objective-Cのでは適用されない C.
スティーブジェソップ

31

最初から、C ++は「より優れたC」として設計されており、C ++の作成者が言語を通過するにつれて、現実と知覚の両方の設計漏れを修正しました。この設計上の決定の結果X、有効なCプログラムであることはX、C ++コンパイラーで処理された場合に、コンパイルはもちろん、実行も保証されないという結果になりました。変更は、文字列リテラル(それらはになったconst char*)、voidポインタの割り当て、enumsと整数型間の変換、複合代入演算子のセマンティクスなどの基本的な構成に影響を与えました。

さらに、C99が登場すると、更新されたC標準に組み込まれた機能は、更新されたC ++標準から除外されました。繰り返しになりますが、非常に重要な言語機能は省略されました-特に、指定された初期化子と可変サイズの配列。

対照的に、Objective CはCのスーパーセットとして位置付けられており、すべての有効なCプログラムをObjective Cコンパイラーでコンパイルできるようにする必要があります。


4
「スーパーセット」とは何か知っているのでこの質問に答えましたが、Objective-Cについては何も知りません。別のSOの質問で、有効なCコードスニペットint nil = 0; nil++;がObjective-Cとしてコンパイルされないという主張を見ました。そこの問題は何ですか?Objective-Cがヘッダーを利用できるようにすることは明らかですが、ヘッダーが含まれると、Cヘッダーとまったく同じようにコードが壊れる可能性があります。そのため、そのスニペットの作成者はそれらを含めるべきではありませんでした。
スティーブジェソップ2013年

2
「nil」は実際にはキーワードではなく#defineです。objc / objc.hが含まれているため、問題が発生しています。これは、YESという変数を作成しようとした場合に発生する問題に似ています。(Xcodeは、そのように考える方がはるかに簡単であるため、実際にはキーワードであるかのようにこれらを強調していますが、単純なCコードとして実装されています。)
Rob Napier

4
ところで、Cの上でObjCがどのように機能しているかに興味がある場合は、objc.haを少し覗いてみる価値があります。 、および定義します。純粋なCで手動でメッセージパッシングを実装することもできます。絶対にしないでください。:Dしかしできます。github.com/iosptl/ios6ptl/blob/master/ch28/Runtime/MyMsgSend.c
Rob Napier

2
@DanNeely:Rob Napierは、リンクされたファイルについての解説として「絶対にしないでください」と述べました。リンクされたファイルはありません、ショーメッセージング方法のいくつかは実際に動作することだけ迅速ハックで、Objective-Cランタイム。
ディートリッヒエップ2013年

1
リンクされたファイルは、ObjCメッセージパッシングがいかに複雑であるかを示していませんでした。これは、ランタイムがCから利用可能であり、ObjCコードを純粋なCに原則的に変換できることを示しています。しかし、これは、ビルドするのと同じくらい遅いです。それは、メソッドの戻り値の型を知っていることに依存しており(一部の戻り値型については、おそらくプロセッサーの型を知る必要があるでしょう)、パラメーターを取らないメソッドを慎重に選択しました。完全なソリューションには多くの微妙なトリックがあります(パーツはスタックフレームでチートするため、パーツはアセンブラーにある必要があります)。決して再構築しないでください。
Rob Napier

12

「Objective-CはCのスーパーセット」とは、すべての有効なCプログラムが有効なObjective-Cプログラム(同じ意味)であることを意味します。

それはさ、時にはないC ++はCでこれのスーパーセットであることをC ++の専門家では、あなたの二重引用符は2を比較大したことをしている理由である、正確ではありませんが、言いました。


9

Objective Cは、Cに対する下位互換性のある拡張機能のセットです。これは、Objective Cの機能が2つの非常に単純な方法で区切られているために可能です。

  • キャラクターの使用@。この文字は現在C言語では使用されていません。
  • メソッドを呼び出すための単純な構文拡張[obj method:argument]。Cでは、角括弧は配列の添え字に非常に特殊な方法で使用されているため、これは無効なC構文です。無効な構文に基づいて構築される拡張機能は、ホスト言語で有効なものの意味を変更しません。

Objective C拡張を使用するプログラムは、どれほど単純であっても、厳密に準拠するISO Cプログラムにはなり得ないことが簡単にわかります。さらに、すべてのISO Cプログラムは、定義により、有効なObjective Cプログラムであると宣言できます。Objective Cは、C99やC11のような開発を容易に追跡できます。

一方、C ++は単なるCの拡張ではありません。これは、Cの一部の構文の意味を変更する別の言語です。C++とCは別々に維持されるため、それらの関係は時間とともに変化します。たとえば、CはC ++にはまったくない新機能を取得しており、C99可変長配列など、C ++には組み込まれない可能性が非常に高いです。C ++は、新しいC機能を簡単に取得できません。

移植可能なCプログラムを作成する場合、それは同時にObjective Cプログラムでなければなりません。ただし、これも同じ意味のC ++プログラムになるように、さらに注意が必要です。(この慣習は前代未聞ではなく、必要な方言は非公式に「クリーンC」として知られています)。

C ++として扱われると壊れるCプログラムの簡単な例は、classまたはなどの識別子としてC ++キーワードを使用するCプログラムvirtualです。目的Cでは、予約済みキーワードは導入されていません。の@ようなキャラクターによって導入される新しいキーワードがあり@interfaceます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.