Является ли среда выполнения Objective-C дополнительным слоем, чем прямые программы на языке Си / Си ++? - PullRequest
2 голосов
/ 09 сентября 2011

Я читал, что для выполнения задач target-c требуется время выполнения target-c.

AFAIK, обе программы на C / C ++ не требуют никаких сред выполнения для запуска. поскольку сгенерированный двоичный код выполняется непосредственно базовой ОС.

Значит, это означает, что для выполнения программ Objective-c требуется избыточный слой, правильно? и если да, то выглядит ли этот уровень как Java VM и .net runtime или как Qt runtime (в духе некоторых дополнительных библиотек)?

EDIT: После некоторого чтения я обнаружил, что компилятор objc генерирует дополнительную информацию в сгенерированном скомпилированном коде, которая отвечает за многие вещи, такие как передача методов (objc_sendMsg(), introspection и другие)

Спасибо.

1 Ответ

5 голосов
/ 09 сентября 2011

Скомпилированный код является нативным, но вам нужна дополнительная библиотека (среда выполнения), которая выполняет всю обработку объектов и сообщений (поиск, вызов и т. Д.).Виртуальная машина не задействована.Так что это больше похоже на QT, чем на среду выполнения Java.

[Update]

Поскольку поведение привязки сообщений C ++ не очевидно для программистов более динамических языков ОО (например:Objective-C или Smalltalk) - как и я - я написал небольшое тестовое приложение C ++, которое демонстрирует влияние ключевого слова virtual на выбор метода для вызова.

#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) статически связывает вызов с test1 на основе типа, который он знает во время компиляции, который равен Test1 (из-заактерский состав).

...