Flutter框架使用Dart语言开发,Dart有着很好的可移植性,这得益于Dart语言的AOT技术,本文介绍AOT和JIT编译。
AOT与JIT编译
AOT(Ahead of Time)即运行前编译,与之对应的是JIT(Just in Time)即运行时编译。
众所周知,编程语言基本上都是人类可读的,但程序的源码并不能够被处理器直接执行,所以编译器或者解释器就需要将源代码转变为 CPU可以操作的指令。比如一个加法函数最终需要执行 addl 汇编指令对应的机器码。对于转变为机器码的时机,不同的语言有着不同的选择,有的是完全转变为机器码后才运行,有的在运行时才转变为机器码。AOT指的就是运行前转为机器码,而JIT指的就是运行时转为机器码。
优劣
使用JIT即时编译在运行前并不是没有做任何工作,它们会将源码转为中间代码。在中间代码执行时,再将中间代码编译为本机运行的机器代码,但这仍然可能会降低应用程序的性能。AOT提前编译就是在执行之前,而不是在执行期间编译。
JIT优点
- 可以根据当前硬件情况实时编译生成最优机器指令(ps. AOT也可以做到,在用户使用是使用字节码根据机器情况在做一次编译)
- 可以根据当前程序的运行情况生成最优的机器指令序列
- 当程序需要支持动态链接时,只能使用JIT
- 可以根据进程中内存的实际情况调整代码,使内存能够更充分的利用
JIT缺点
- 编译需要占用运行时资源,会导致进程卡顿
- 由于编译时间需要占用运行时间,对于某些代码的编译优化不能完全支持,需要在程序流畅和编译时间之间做权衡
- 在编译准备和识别频繁使用的方法需要占用时间,使得初始编译不能达到最高性能
AOT优点
- 在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗
- 可以在程序运行初期就达到最高性能
- 可以显著的加快程序的启动
AOT缺点
- 在程序运行前编译会使程序安装的时间增加
- 牺牲Java的一致性
- 将提前编译的内容保存会占用更多的内存