看板 Soft_Job 關於我們 聯絡資訊
※ 引述《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,還是要怎麼做那再看 -- Linux is the bone of my world. Kernel is mybody, and initramfs is myblood, have created over a thousand Distros. Unknown to impossibility. Nor known to limitation. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.167.181 ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1525792422.A.055.html
redhessainnz: 這篇正解 05/09 07:04
rio35: 好像稍微能理解了 @@ 05/09 08:03
accessdenied: 為何要先背景揭露呢? 05/09 08:48
jojojen: 推 05/09 09:53
Ekmund: 這篇直接看應該會爆炸 科普一下LLVM和JVM會比較好懂 05/09 10:39
nfsong: 推 05/10 15:56