vergil wang


Hi, i'm vergilw, i'm a iOS developer from China, i'm living in Hubei,Wuhan.


iOS Developer

AOT与JIT介绍

Flutter框架使用Dart语言开发,Dart有着很好的可移植性,这得益于Dart语言的AOT技术,本文介绍AOT和JIT编译。

AOT与JIT编译

AOT(Ahead of Time)即运行前编译,与之对应的是JIT(Just in Time)即运行时编译。

众所周知,编程语言基本上都是人类可读的,但程序的源码并不能够被处理器直接执行,所以编译器或者解释器就需要将源代码转变为 CPU可以操作的指令。比如一个加法函数最终需要执行 addl 汇编指令对应的机器码。对于转变为机器码的时机,不同的语言有着不同的选择,有的是完全转变为机器码后才运行,有的在运行时才转变为机器码。AOT指的就是运行前转为机器码,而JIT指的就是运行时转为机器码。

优劣

使用JIT即时编译在运行前并不是没有做任何工作,它们会将源码转为中间代码。在中间代码执行时,再将中间代码编译为本机运行的机器代码,但这仍然可能会降低应用程序的性能。AOT提前编译就是在执行之前,而不是在执行期间编译。

JIT优点

  1. 可以根据当前硬件情况实时编译生成最优机器指令(ps. AOT也可以做到,在用户使用是使用字节码根据机器情况在做一次编译)
  2. 可以根据当前程序的运行情况生成最优的机器指令序列
  3. 当程序需要支持动态链接时,只能使用JIT
  4. 可以根据进程中内存的实际情况调整代码,使内存能够更充分的利用

    JIT缺点

  5. 编译需要占用运行时资源,会导致进程卡顿
  6. 由于编译时间需要占用运行时间,对于某些代码的编译优化不能完全支持,需要在程序流畅和编译时间之间做权衡
  7. 在编译准备和识别频繁使用的方法需要占用时间,使得初始编译不能达到最高性能

    AOT优点

  8. 在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗
  9. 可以在程序运行初期就达到最高性能
  10. 可以显著的加快程序的启动

    AOT缺点

  11. 在程序运行前编译会使程序安装的时间增加
  12. 牺牲Java的一致性
  13. 将提前编译的内容保存会占用更多的内存

参考

  1. AOT Wiki-wikipedia
  2. 软件的变革与 AOT
  3. AOT,JIT区别
最近的文章

CPU架构ARM与X86介绍

做移动端开发的时候,编译器设置里会遇到Architectures配置,使用第三方库的时候也经常会遇到Architectures的报错。所以作为开发者应该了解常用的CPU架构。CPU架构的发展Inter与AMD在IBM发明了PC成为霸主的年代,Inter(英特尔)还只是一个小公司。曾经IBM采购Intel的X86处理器来生产自家PC,但Intel一家无法满足IBM的订单,于是IBM要求Intel找伙伴公司代工生产X86处理器,同时IBM为了规避将来可能出现的采购风险,要求英特尔将x86专...…

继续阅读
更早的文章

Flutter UI开发Widget选型

刚接触Flutter的时候,UI开发常常会遇到选用StatefulWidget还是StatelessWidget的问题。良好的设计能提升开发效率和维护成本,所以Flutter平台下的开发者应该掌握这个知识点。State介绍在选择Stateful和Stateless之前,先要了解清楚State。一个StatefulWidget类会对应一个State类,State表示与其对应的StatefulWidget要维护的状态,State中的保存的状态信息可以: 在widget build时可以被...…

继续阅读