2012-08-07 9 views
6

Objective-CはCのスーパーセットであるため、Objective-C固有のすべてのステートメントは.mファイルのコンパイル時にCステートメントに変換されます。プリプロセッサ、私は推測する)。たとえば、[receiver method]のようなメッセージ式は、メッセージング関数objc_msgSend(receiver, selector)の呼び出しに変換されます。Objective-C 2.0クラスのインタフェースと実装はGCCまたはClangによって変換される

私の質問は:私はこのようなクラス定義を持っている場合:

@interface ClassA { 
    int var1; 
    float var2; 
    id var3; 
} 

-(void) method1; 
-(int) method2: (int) num1; 
@end 

@implementation ClassA 
-(void) method1 { 
    // Implementation of the method 
} 

-(int) method2: (int) num1 { 
    // Implementation of the method 
} 

@end 

それは(のObjective-Cの2.0バージョンで)コンパイラによって変換されたもの? objc_allocateClassPair()class_addIvar()class_addMethod()objc_registerClassPair()のような関数の呼び出しに変換されて、クラスを作成し、そのインスタンス変数を追加し、そのメソッドを追加してクラスを登録します(クラス構造体は実際には実行可能ファイルから構造体としてロードされていますか?)

答えて

14

のObjective-CはCのスーパーセットであるため、すべてのObjective-C固有のステートメントが が.Mファイルのコンパイル時にC文に変換される( によってプリプロセッサ、Iは推測)。 Objective-Cのまだそのやり方でコンパイルすることができますが、1988年に本当だった

、それは長い時間ではなかったです。

コンパイラはObjective-CをCおよび - sometimes C++と一緒に解析し、後処理された出力を表す抽象構文ツリー[AST]を出力します。そのASTには、さまざまなObjective-C定義がかなり直接的に含まれています。

GCCのコンパイルとLLVMのコンパイルの詳細は異なっていることに注意してください。

コンパイルされた出力を見ると、実行可能な製品であるmacho-oファイルには、Objective-Cメタデータが含まれているさまざまなセクションがクラス定義、セレクタテーブル、ivarレイアウトなど...コンパイラはこのメタデータを.oファイルに生成し、リンカはそれをまとめてマッシュアップし、重複した情報(重複シンボルではない)を削除し、mach-oを書き込みます。

Objective-Cリライタを使用してObjective-CをストレートCに書き直すことはできますが、結果のコードは非効率で、規制のコンパイルパイプラインとはかなり異なります。

関連する問題