1.静态语言和动态语言

  • Objective-C 是面向运行时的语言(runtime oriented language)。
  • 就是说它会尽可能的把编译和链接时要执行的逻辑延迟到运行时。
  • 这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等。
  • 这种特性意味着Objective-C不仅需要一个编译器,还需要一个运行时系统来执行编译的代码。
  • Runtime基本是用C和汇编写的。

这就是 Objective-C Runtime 系统存在的意义,它是整个Objc运行框架的一块基石。

如果我们和 C 这样的语言对比。在 C 里,你从 main() 方法开始写然后就是从上到下的写逻辑了并按你写代码的顺序执行程序。一个 C 的结构体不能转发函数执行请求到其他的目标上(other targets)。很可能你的程序是这样的:


#include < stdio.h >
int main(int argc, const char **argv[])
{       
    printf("Hello World!");
    return 0;
}

编译器解析,优化然后把优化后的代码转成汇编:

.text
.align 4,0x90
.globl _main
_main:
Leh_func_begin1:
pushq %rbp
Llabel1:
movq %rsp, %rbp
Llabel2:
subq $16, %rsp
Llabel3:
movq %rsi, %rax
movl %edi, %ecx 
movl %ecx, -8(%rbp)
movq %rax, -16(%rbp) 
xorb %al, %al 
leaq LC(%rip), %rcx 
movq %rcx, %rdi 
call _printf 
movl $0, -4(%rbp) 
movl -4(%rbp), %eax 
addq $16, %rsp 
popq %rbp 
ret
Leh_func_end1: 
.cstring
LC: 
.asciz "Hello World!"

Runtime其实有两个版本:“modern”和 “legacy”。我们现在用的 Objective-C 2.0 采用的是现行(Modern)版的Runtime系统,只能运行在 iOS 和 OS X 10.5 之后的64位程序中。而OS X较老的32位程序仍采用 Objective-C 1中的(早期)Legacy 版本的 Runtime 系统。这两个版本最大的区别在于当你更改一个类的实例变量的布局时,在早期版本中你需要重新编译它的子类,而现行版就不需要。 可见苹果为了动态系统的高效而作出的努力。你可以在这里下到苹果维护的开源代码。苹果和GNU各自维护一个开源的runtime版本,这两个版本之间都在努力的保持一致。

简而言之,Objective-C Runtime是一个将C语言转化为面向对象语言的扩展。 我们将C++和Objective进行对比,虽然C++和Objective-C都是在C的基础上加入面向对象的特性扩充而成的程序设计语言,但二者实现的机制差异很大。C++是基于静态类型,而Objective-C是基于动态运行时类型。也就是说用C++编写的程序编译时就直接编译成了可令机器读懂的机器语言;用Objective-C编写的程序不能直接编译成可令机器读懂的机器语言,而是在程序运行的时候,通过Runtime把程序转为可令机器读懂的机器语言。Runtime是Objective不可缺少的重要一部分。