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