2

私は、objective-c プログラムを実行するには、objective-c ランタイムが必要であることを読みました。

私の知る限り、どちらの C/C++ プログラムもランタイム環境を実行する必要はありません。生成されたバイナリ コードは、基盤となる OS によって直接実行されるためです。

これは、Objective-c プログラムを実行するには冗長レイヤーが必要であることを意味しますね。もしそうなら、このレイヤーは Java VM と .net ランタイムのように見えますか、それとも Qt ランタイムのように見えますか?

EDIT: いくつか読んだ後、objcコンパイラーは、生成されたコンパイル済みコードに、メソッドの受け渡しなどの多くのことを担当する追加の情報を生成することがわかりました(objc_sendMsg()introspectionおよびその他)

ありがとう。

4

1 に答える 1

5

コンパイルされたコードはネイティブですが、すべてのオブジェクトとメッセージの処理 (ルックアップ、呼び出しなど) を行う追加のライブラリ (ランタイム) が必要です。関連する仮想マシンはありません。つまり、Java ランタイムというよりも QT に似ています。

[アップデート]

C++ メッセージ バインディングの動作は、より動的な OO 言語 (例: Objective-C や Smalltalk) のプログラマー (私のように) には明らかではないためvirtual、メソッドの選択に対するキーワードの影響を示す小さな C++ テスト アプリを作成しました。電話。

#include <iostream>

class Test1 {
public:
    Test1();
    void test1();
    void test2();
};

class Test2 : Test1 {
public:
    Test2();
    void test1();
    void test2();
};

Test1::Test1() {}
void Test1::test1() { std::cout << "T1:t1" << std::endl; }
void Test1::test2() { std::cout << "T1:t2" << std::endl; }

Test2::Test2() {}
void Test2::test1() { std::cout << "T2:t1" << std::endl; }
void Test2::test2() { std::cout << "T2:t2" << std::endl; }

int main(int argc, char **argv)
{
    Test1 *t11 = new Test1();
    Test1 *t12 = (Test1 *)(new Test2());
    Test2 *t2 = new Test2();

    t11->test1();
    t11->test2();

    t12->test1();
    t12->test2();

    t2->test1();
    t2->test2();

    return 0;
}

Objective-C プログラマは、次の出力を期待します。

T1:t1
T1:t2
T2:t1
T2:t2
T2:t1
T2:t2

なぜなら、t12実際にTest2は にキャストされたTest1です。実際の出力は

T1:t1
T1:t2
T1:t1
T2:t2
T2:t1
T2:t2

C++(デフォルトでは、つまりなし)は、コンパイル時に知っている型に基づいてvirtual呼び出しを静的にバインドするためです(キャストによる)。test1Test1

于 2011-09-09T12:27:08.290 に答える