2012-08-07 12 views
6

Ponieważ Objective-C jest zestawem nadrzędnym C, wszystkie instrukcje specyficzne dla Objective-C są konwertowane na instrukcje C podczas kompilowania pliku .m (przez preprocesor, jak sądzę). Na przykład wyrażenie komunikatu, takie jak [receiver method], jest konwertowane na wywołanie funkcji wiadomości objc_msgSend(receiver, selector).Co to jest interfejs klasy Objective-C 2.0 i implementacja przekonwertowana przez GCC lub Clang

Moje pytanie brzmi: czy mam definicję klasy tak:

@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 

co to jest przekształcony przez kompilator (w wersji 2.0, Objective-C)? Czy jest konwertowane na wywołania funkcji takich jak objc_allocateClassPair(), class_addIvar(), i objc_registerClassPair(), aby utworzyć klasę, dodać jej zmienne instancji, dodać swoje metody i odpowiednio zarejestrować klasę (Tak, aby struktura klas była faktycznie zdefiniowana w środowisku wykonawczym zamiast jest ładowany jako struct z pliku wykonywalnego)?

Odpowiedz

14

Ponieważ Celem-C C rozszerzeniem, obiektywny-C specyficzne stwierdzenia są przekształcane w sprawozdaniu C podczas kompilacji pliku .m (o preprocesor, chyba).

To było w roku 1988. Podczas Objective-C mógłby nadal być zestawiane w tym modzie, nie w długim czasie.

Kompilator analizuje Objective-C, razem z C i-- czasami - C++, i wysyła abstrakcyjne drzewo składniowe [AST], które reprezentuje postprocesorowany wynik. Ta AST zawiera całkiem różne definicje Celu C.

Należy zauważyć, że szczegóły kompilacji GCC i kompilacji LLVM są rozbieżne.

Jeśli spojrzysz na skompilowane dane wyjściowe, zobaczysz, że plik mach-o - plik wykonywalny - zawiera różne sekcje w pliku zawierające metadane Objective-C, w tym definicje klas, tabele selektorów, ivar layout, etc ... Kompilator generuje te metadane do pliku .o, a następnie linker maskuje je wszystkie razem, eliminuje duplikaty informacji (to nie jest duplikat symbolu) i zapisuje mach-o.

Jak ktoś wspomniał w innym pytaniu, możesz użyć programu do przepisywania Objective-C, aby przepisać Objective-C na proste C, ale wynikowy kod jest nieefektywny i całkiem inny niż kompilacja regulacyjna pipeline.

Powiązane problemy