失效链接处理 |
Android设计思想解读开源框架 PDF 下载
本站整理下载:
相关截图:
主要内容:
第一章、热修复设计 第一节、AOT/JIT & dexopt 与 dex2oat 一、AOT/JIT 一个程序的编译过程可以是步骤迭代式的,即每一轮步骤结束后得到的结果都可 独立运行,比如,先构造 AST 再输出字节码,中间状态 AST 也是可以解释执行 的。由于编译的本质就是代码转换,因此对一个语言可以有多个独立的编译器, 每个负责一轮步骤 AOT Compiler 和 JIT Compiler 就是针对编译形式做的分类: AOT:Ahead Of Time,指在运行前编译,比如普通的静态编译 JIT:Just In Time,指在运行时编译,边运行边编译,比如 java 虚拟机在运行时 就用到 JIT 技术 JIT 可能知道的人多些,AOT 这个名词就相对少见一些了,其实除了 JIT,剩下的 都是 AOT。wiki 上 JIT 的解释也比 AOT 详尽很多,如果按 wiki 上的理解,一般 来说,是从形式上来区分这两个概念,即看编译是不是在“运行时”进行 然而,这两个概念又有模糊性,问题在于这个“运行时”怎么来区分,比方说,从 这个概念来看,python 是用到 JIT 技术的,因为: ... import a ...
当执行到 import a 的时候,当然是运行时,这时候如果只找到了 a.py,则会进 行编译工作,并生成 a.pyc,这就是 python 的 JIT 特性,但是一般来说,认为 python 的 JIT 是 psyco、pypy 之类,并不认为 python 本身的动态性属于 JIT 范 畴,或者说,它的这种“形式上”的 JIT 特性不纳入讨论范围。其他脚本语言,动 态语言也有类似的情况。具体原因我觉得有几点 首先被主流理论认定的 JIT 编译器对于被其编译的语言来说属于附加品,也就是 说,就算去掉 JIT,并不影响语言本身的运行,例如 java,如果关闭 JIT,依然可 以解释执行,而上述 python 的运行时 import 的特性虽然形式上符合 JIT,但这 个机制是语言本身规定的,如果去掉,语言(的主流实现)就不完整了。反过来 说,如果 python 采用源码直接解析执行,则编译为字节码的行为就可以看做是 JIT,因为做不做都不影响解析执行过程 其次,python 的这种编译并非每次执行都会进行,因为一般来说会生成字节码 结果 pyc 文件存在磁盘,它更像是对 java 源代码转 class 文件这一过程的惰性化, 在需要的时候进行 最后,JIT 会消耗运行时资源,可能导致进程卡顿,而 java 等语言之所以引入 JIT, 是因为 JIT 对字节码编译后能以更快的速度运行,卡顿的时间能补救回来,因此 从工程角度讲,JIT 几乎就等于是运行时优化(虽然从概念和形式上并非如此), 而 python 的 import 就只有卡顿,对速度没啥好处 于是,虽然从概念来说,上面的例子的确符合 JIT,但一般来说也不这么认为, 出发角度问题,说 python 自带 JIT 特性或没有 JIT 都算说得通的
|