私がそこから読んだものから: なぜ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%の互換性)による変更なしでコンパイルできますか?
これは、どちらが優れているかという戦争よりも、プログラミング言語の設計と互換性に関する問題です。
簡単な図を用意しました。それはあまりきれいではありませんが、うまくいけば次の点を理解できます:
有効なCプログラムのセット(赤と緑)は、有効なObjective Cプログラムのセット(青)の厳密なサブセットです。
スーパーセットとはどういう意味ですか?
厳密なスーパーセットを意味します。有効なCプログラムは、Objective-Cコンパイラでコンパイルされます。有効なCプログラムの中には、C++コンパイラでコンパイルできないものがあります。
Objective-Cはどのような点でCに近い//後方互換性がありますか?
以下に簡単な例を示します。
int *foo = malloc(12);
CおよびObjective-Cでコンパイルしますが、C++ではコンパイルしません。もちろん、他の例もあります。
Objective-Cは、C++よりもCの哲学にどのように忠実ですか?
すべて-Objective-CはCの厳密なスーパーセットです。
Cプログラムは、Objective-Cコンパイラー(100%の互換性)による変更なしでコンパイルできますか?
はい。
C++は最初から「より良いC」として設計されており、C++の作成者が言語を使用する際に、設計の省略を実際と知覚の両方で修正しています。この設計上の決定の結果、有効なCプログラムであるX
は、C++コンパイラーで処理されたときに、X
がコンパイルされることを保証しません。変更は、文字列リテラルなどの基本的な構造に影響を与えました(それらはconst char*
)、void
ポインターの割り当て、enum
sと整数型の間の変換、 複合代入演算子のセマンティクス など。
さらに、C99が登場すると、更新されたC標準に組み込まれた機能は、更新されたC++標準から除外されました。繰り返しますが、非常に重要な言語機能は除外されました。最も顕著なのは、指定された初期化子と可変サイズの配列です。
対照的に、Objective CはCのスーパーセットとして位置付けられており、すべての有効なCプログラムがObjective Cコンパイラーでコンパイル可能である必要があります。
「Objective-CはCのスーパーセット」とは、すべての有効なCプログラムが有効なObjective-Cプログラムであることを意味します(同じ意味を持つ)。
時々と言われますが、C++の専門家によるものではありませんが、C++はCのスーパーセットです。これは正確ではありません。
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プログラムの簡単な例は、class
やvirtual
などのC++キーワードを識別子として使用するCプログラムです。 Objective Cは予約済みのキーワードを導入していません。 @
のような@interface
文字で導入される新しいキーワードがあります。