web-dev-qa-db-ja.com

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

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

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

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

スーパーセットとはどういう意味ですか? Objective-Cはどのような点でCに近い//後方互換性がありますか? Objective-Cは、C++よりもCの哲学にどのように近いのですか?

Cプログラムは、Objective-Cコンパイラー(100%の互換性)による変更なしでコンパイルできますか?

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

87
user1115057

簡単な図を用意しました。それはあまりきれいではありませんが、うまくいけば次の点を理解できます:

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

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

enter image description here

133
Escualo
  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プログラムは、Objective-Cコンパイラー(100%の互換性)による変更なしでコンパイルできますか?

    はい。

62
Carl Norum

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

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

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

31
dasblinkenlight

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

時々と言われますが、C++の専門家によるものではありませんが、C++はCのスーパーセットです。これは正確ではありません。

12
Steve Jessop

Objective Cは、Cに対する下位互換性のある拡張機能のセットです。ObjectiveCの機能が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++プログラムでもあるように、追加の注意が必要です。 (この慣習は前代未聞ではなく、それが必要とする方言は「Clean C」として非公式に知られています)。

C++として扱われたときに破損するCプログラムの簡単な例は、classvirtualなどのC++キーワードを識別子として使用するCプログラムです。 Objective Cは予約済みのキーワードを導入していません。 @のような@interface文字で導入される新しいキーワードがあります。

9
Kaz