作者:
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,還是要怎麼做那再看