2011-09-09 3 views
2

필자는 객관적인 - c 프로그램을 실행하려면 객관적인 - C 런타임이 필요하다는 것을 읽었습니다.Objective-c 런타임은 직접적인 c/C++ 프로그램보다 추가 레이어를 의미합니까?

AFAIK, 두 C/C++ 프로그램 모두 실행 환경이 필요하지 않습니다. 생성 된 바이너리 코드가 기본 OS에 의해 직접 실행되기 때문입니다.

그래서 Objective-c 프로그램을 실행하려면 중복 레이어가 필요하다는 의미입니까? 그렇다면이 레이어는 Java VM 및 .net 런타임처럼 보이거나 Qt 런타임 (일부 추가 라이브러리의 맛)처럼 보입니까?

EDIT:

어떤 읽은 후, 나는 objc 컴파일러는 방법 ( objc_sendMsg(), introspection 등)

감사를 전달하는 것과 같은 여러 가지의 책임이 생성 된 컴파일 된 코드에 좀 더 많은 정보를 생성하는 것을 발견했다.

+0

[동의율] (http://meta.stackexchange.com/questions/16721/how-does-accept-rate-work)에서 작업 해보십시오. –

답변

5

컴파일 된 코드는 기본이지만 모든 객체 및 메시지 처리 (조회, 호출 등)를 수행하는 추가 라이브러리 (런타임)가 필요합니다. 관련된 가상 머신이 없습니다. 따라서 Java 런타임보다 QT에 가깝습니다.

[업데이트]를 C++ 메시지 바인딩 행동 이후

는보다 동적 객체 지향 언어의 프로그래머 명확하지 않다 (예 : 목표 - C 또는 스몰 토크) - 나 같은 - 나는 작은 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; 
} 

오브젝티브 C 프로그래머는 사람

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

의 출력은 실제로 Test1에 주조 된 Test2 인 기대. C는 ++ (virtual없이, 즉 기본적으로) 정적으로 (인해 주조로) Test1 인 컴파일시 알고 유형에 따라 test1 호출 결합 때문에 실제 출력

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

이다.

+0

따라서 링커는 컴파일 된 -object- 코드를 Objc의 추가 라이브러리와 연결하여 원시 코드를 생성합니다. 같은 방식으로 정확히 C/C++/Qt에서 올바르게 처리됩니까? –

+1

예. 그러나 C++에 대해 언급했듯이 다음과 같이 명확히하고자합니다. C++은 정적 형식의 언어입니다 (C로). 모든 메소드 호출 및 데이터 유형은 컴파일 타임에 해석되며 런타임시 일반 함수 호출 이외의 메소드 호출을 처리하는 데 추가 처리 시간이 필요하지 않습니다. Objective-C는 런타임 라이브러리가 객체를 너무 많이 필요로하고 런타임에 메시지 (기능 수행)에 응답 할 수있는 동적 링크 언어입니다. 또한 객체의 유형은 컴파일 타임에 결정되지 않고 런타임에 결정됩니다. –

+0

그러나'virtual'을 지정하면 런타임에 객체의 유형이 켜지는 동적 바인딩이 결정됩니다. 맞습니까? http://en.wikipedia.org/wiki/Dynamic_dispatch#C.2B.2B_Implementation –