Re: [请益] 想不通直译器vs编译器vs机器码的问题

楼主: snaketsai (さいでんし)   2018-05-08 23:13:29
※ 引述《dragoncfe168 (梅长苏)》之铭言:
: 请问一下
: 为何直译器将source code转译成机器码,
: 不会产生不同电脑的机器语言不同 而无法执行的问题???
: 反观同样把source code转译成机器码的编译器
: 却会有此类问题呢???
背景揭露:失业
刚刚跟朋友吃完饭,燃烧一下血糖科普一下......
现在的直译器基本上不会是直接高阶语言程式直译
而是会先翻译成一个专属于自己的bytecode
然后进行一些优化
接下来才执行
然而,这样的bytecode是不是跨平台的不一定
LLVM的bitcode虽然有直译器lli,但是bitcode其实有平台相依的特性
不过那不是我们今天想讨论的议题
先假设,设计该种bytecode的人有作到平台不相依的话
单纯在bytecode层级能做的优化往往还不够好
所以像JVM这类的虚拟机
一个很重要的功能叫做即时编译(Just-In-Time Compiling)
会把bytecode再次翻译成执行平台的binary
直译的部份很少在用
Microsoft的MSIL,也多半是先JIT成target binary
虽然本身在CoreCLR也有直译器:
https://github.com/dotnet/coreclr/blob/master/src/vm/interpreter.cpp
但几乎只有在某平台一开始没有对应的JIT backend才会打开
还一个很有名的就是虚拟机qemu,
它也有一套自己的机制叫做TCG (Tiny Code Generator)
虽然多数状况下会透过TCG把client code翻译成一段段host的code cache
(因为跑起来比较快)
但是也有一套叫做TCI (Tiny Code Interpreter)的机制:
https://github.com/qemu/qemu/tree/master/tcg/tci
可以作为新平台的initial support
然而,有个鸡蛋问题
那就是跑在执行平台的直译器本身也好、JIT backend自身也罢
都也是host binary,他是怎么来的?
基本上多半要靠跨平台编译器(cross-compiler),
先在其他平台编出可以在执行平台上跑的直译器
后面看是可以自己self bootstrap,还是要怎么做那再看
作者: redhessainnz (Moomin)   2018-05-09 07:04:00
这篇正解
作者: rio35 (rio)   2018-05-09 08:03:00
好像稍微能理解了 @@
作者: accessdenied (存取违规)   2018-05-09 08:48:00
为何要先背景揭露呢?
作者: jojojen (JJJ)   2018-05-09 09:53:00
作者: Ekmund (是一只小叔)   2018-05-09 10:39:00
这篇直接看应该会爆炸 科普一下LLVM和JVM会比较好懂
作者: nfsong (圖書館我來了)   2018-05-10 15:56:00

Links booklink

Contact Us: admin [ a t ] ucptt.com