Re: [請益] 想不通直譯器vs編譯器vs機器碼的問題

看板Soft_Job (軟體人)作者 (さいでんし)時間7年前 (2018/05/08 23:13), 編輯推噓4(402)
留言6則, 6人參與, 7年前最新討論串4/9 (看更多)
※ 引述《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

05/09 07:04, 7年前 , 1F
這篇正解
05/09 07:04, 1F

05/09 08:03, 7年前 , 2F
好像稍微能理解了 @@
05/09 08:03, 2F

05/09 08:48, 7年前 , 3F
為何要先背景揭露呢?
05/09 08:48, 3F

05/09 09:53, 7年前 , 4F
05/09 09:53, 4F

05/09 10:39, 7年前 , 5F
這篇直接看應該會爆炸 科普一下LLVM和JVM會比較好懂
05/09 10:39, 5F

05/10 15:56, 7年前 , 6F
05/10 15:56, 6F
文章代碼(AID): #1QyRwc1L (Soft_Job)
討論串 (同標題文章)
文章代碼(AID): #1QyRwc1L (Soft_Job)