Objective-C 运行时机制详解(区别于C Langauge、C++ Langauge)

本文探讨了Objective-C作为动态语言的特性,特别是Runtime机制的作用。通过对比C、C++等静态语言,阐述了Runtime如何增强语言灵活性并提高程序健壮性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Objective-C是动态语言, 一直以来都被Runtime这个东西所迷惑,而恰恰这是一个非常重要的概念。从根本来说,如果要实现一个计算机语言,应该如何考虑呢?这就需要从编译的层次思考前面的问题了。
C、C++、Objective-C实现可以分成3种不同的层次:

第一种是传统的面向过程的语言开发,例如C语言。实现C语言编译器很简单,只要按照语法规则实现一个LALR语法分析器就可以了,编译器优化是非常难的话题,不在讨论范围内。实现编译器最基础和原始的目标之一就是把代码里的函数名称,转化成一个相对内存地址,把调用这个函数的语句转换成一个JMP跳转指令。在程序开始运行时候,调用语句可以正确跳转到对应的函数地址。这样很好,也很直白,但是太死板了。(Everything is predetermined.)

希望语言更加灵活,于是便有了第二种改进,开发面向对象的语言,例如C++。 C++在C语言的基础上增加了类的部分。What is the meaning of it?在写C++的编译器要如何考虑呢?其实,就是给编译器提升判断能力,在严格的C编译器上增加一层类处理的机制,把一个函数限制在它处在的Class环境里,每次请求一个函数调用,先找到它的对象, 以及其类型、返回值、参数等等,确定了这些后再JMP跳转到需要的函数。这样增加了程序的灵活性,同个函数调用会根据请求参数和类的环境返回完全不同的结果。增加类机制后,就模拟了现实世界的抽象模式,不同的对象有不同的属性和方法。同样的方法,不同的类有不同的行为! 这里就可以看到作为一个编译器开发者都做了哪些进一步的思考。虽然面相对象语言有所改进,但还是死板, 我们仍然叫C++是Static Language.

希望语言更加灵活!于是需要完全把上述类的实现部分抽象出来,做成一套完整运行阶段的检测环境(Runtime),形成第三种,动态语言。这次再写编译器时,甚至需要保留部分代码里的语法及名称错误检测。Runtime环境注册所有全局的类、函数、变量等等信息,而且可以无限的为这个层增加必要的功能。运行时环境在函数调用前做了比较全面的安全检查,已确保动态语言函数调用不会导致程序Crash,即先从这个运行时环境里检测所有可能的参数再做JMP跳转(运行时环境处理了弱类型、函数存在检查工作,会检测注册列表里是否存在对应的函数,类型是否正确,最后确定下来正确的函数地址,再进行保存寄存器状态,压栈,函数调用等等实际的操作。)。编译器开发起来比上面更加复杂。但是这个层次极大的增加了程序的灵活性,例如当调用某个函数时候,前2种语言,很有可能JMP到了一个非法地址导致程序Crash, 但是在这个层次里面,Runtime就过滤掉了这些可能性。这就是为什么Dynamic Langauge更加强壮,因为编译器和Runtime环境开发人员已经帮忙处理了这些问题。

至于Runtime的负面影响: 1.关于执行效率问题。“静态语言执行效率要比动态语言高”,这句没错。因为一部分CPU计算损耗在了Runtime过程中。静态语言生成的机器指令更简洁。正因为知道这个原因,开发语言者付出很大一部分努力为了保持Runtime小巧上。所以Objecitve-C是C的超集+一个小巧的Runtime环境。 但是,换句话说,从算法角度考虑,这点复杂度不算大2. 另外一个就是安全性。动态语言由于运行时环境的需求,会保留一些源码级别的程序结构。这样就给破解带来的方便之门。一个现成的说明就是,Java,大家都知道Java运行在jre上面。这就是典型的Runtime例子。它的执行文件.class全部可以反编译回近似源代码。所以这里的额外提示就是如果你需要写和安全有关的代码,离Objective-C远点,直接使用C语言。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值