Re: [问题] JIT 问题

楼主: carylorrk (carylorrk)   2014-08-12 23:16:47
※ 引述《gn00618777 (非常念旧)》之铭言:
: 我查询了网络上以及书本
: 版本1: JIT是将source code 转换成 byte code之后,在程式执行期间
: 再将byte code编译成机械码。
: 版本2: 拥有JIT表示Dalvik将APP的byte code转换成二进制组合指令,那将
: 以原生方式执行在目标的CPU上,而不是由VM一次解译一条指令。
: 这两者,哪种比较对阿.....版本1说得好像就是执行期间,需要才编译成机械码。
: 这和版本2是直接说"不是由VM一次解译一条指令"好像有点抵触,希望能为我解惑,
: 谢谢。版本2出自于O'REILY翻译的书,我个人觉得翻译的好烂,前因后果要自己兜起来。
基本上两种说法并不相冲
第一点说的是
一般编译式语言会利用 compiler 把 source code compile 成 native code
执行时 CPU 直接执行 native code (其实会先有 OS 分析档案结构啦)
但是像 Java 或 C# 这类半直译式的语言则不同
他们首先会将 source code 编译成 intermediate languate (IL)
通常会是类似一种抽象机器的组语,以 Java 来说就是 byte code
当你要执行 IL 档,就需要 dynamic binary translation (DBT)
将 IL 在 runtime 转换成 native code, 这就是 JVM 要做的事。
DBT 的方式有很多种,最简单的就是最古老的 interpreter
他会把指令一个一个读进来,每次翻译一个指令,执行完读下一个指令
非常的直觉,基本上没有什么问题
但是这样的坏处是很多编译器的最佳化都无法实作
而且如果一个指令做了很多次,每次都需要翻译一次很没效率
所以现在的 translation 通常会有两种技术
一是 translation block, 顾名思义就是一次翻译一个 block
像是以 jmp 指令为边界或是一个 method
二是 code cache, 也就是把翻译过的 block 存起来
以后遇到需要执行这个 block 就直接执行 cache 里翻完的 code
这就是第二点说的不是一条一条翻译。
DBT 其实还可以做很多优化,像是把常一起执行的 block 串联起来之类的
还有根据不同的时间热门程式区块不同而改变程式 binary layout
另外一提, JIT 有可能一开始先用类似原始 interpreter 的方式
等到发现热区才实作上面的最佳化
也有可能一开始就是翻译一个区块
最佳化的程度会影响 start up 的时间
如果花老半天做最佳化,结果只执行一次就亏大了
由于我不清楚 dalvik 的实作,所以不知道是哪种
上一位大大的说法看起来像是先一行一行之后再翻译 block
至于 ART,上面的大大有提到了
AOT是类似 static binary translation (SBT)
不过由于有其限制,所以其实现在任何 SBT 的技术
都很难将一个复杂的系统完全 static 翻译成 native code
通常还是有 dyanmic 的成分在
我也没有去读 ART 的资料和 code,不好说

Links booklink

Contact Us: admin [ a t ] ucptt.com