精華區beta AndroidDev 關於我們 聯絡資訊
※ 引述《gn00618777 (非常念舊)》之銘言: : 我查詢了網路上以及書本 : 版本1: JIT是將source code 轉換成 byte code之後,在程式執行期間 : 再將byte code編譯成機械碼。 : 版本2: 擁有JIT表示Dalvik將APP的byte code轉換成二進制組合指令,那將 : 以原生方式執行在目標的CPU上,而不是由VM一次解譯一條指令。 : 這兩者,哪種比較對阿.....版本1說得好像就是執行期間,需要才編譯成機械碼。 : 這和版本2是直接說"不是由VM一次解譯一條指令"好像有點抵觸,希望能為我解惑, : 謝謝。版本2出自於O'REILY翻譯的書,我個人覺得翻譯的好爛,前因後果要自己兜起來。 基本上兩種說法並不相衝 第一點說的是 一般編譯式語言會利用 compiler 把 source code compile 成 native code 執行時 CPU 直接執行 native code (其實會先有 OS 分析檔案結構啦) 但是像 Java 或 C# 這類半直譯式的語言則不同 他們首先會將 source code 編譯成 intermediate languate (IL) 通常會是類似一種抽象機器的組語,以 Java 來說就是 byte code 當你要執行 IL 檔,就需要 dynamic binary translation (DBT) 將 IL 在 runtime 轉換成 native code, 這就是 JVM 要做的事。 DBT 的方式有很多種,最簡單的就是最古老的 interpreter 他會把指令一個一個讀進來,每次翻譯一個指令,執行完讀下一個指令 非常的直覺,基本上沒有什麼問題 但是這樣的壞處是很多編譯器的最佳化都無法實作 而且如果一個指令做了很多次,每次都需要翻譯一次很沒效率 所以現在的 translation 通常會有兩種技術 一是 translation block, 顧名思義就是一次翻譯一個 block 像是以 jmp 指令爲邊界或是一個 method 二是 code cache, 也就是把翻譯過的 block 存起來 以後遇到需要執行這個 block 就直接執行 cache 裏翻完的 code 這就是第二點說的不是一條一條翻譯。 DBT 其實還可以做很多優化,像是把常一起執行的 block 串聯起來之類的 還有根據不同的時間熱門程式區塊不同而改變程式 binary layout 另外一提, JIT 有可能一開始先用類似原始 interpreter 的方式 等到發現熱區才實作上面的最佳化 也有可能一開始就是翻譯一個區塊 最佳化的程度會影響 start up 的時間 如果花老半天做最佳化,結果只執行一次就虧大了 由於我不清楚 dalvik 的實作,所以不知道是哪種 上一位大大的說法看起來像是先一行一行之後再翻譯 block 至於 ART,上面的大大有提到了 AOT是類似 static binary translation (SBT) 不過由於有其限制,所以其實現在任何 SBT 的技術 都很難將一個複雜的系統完全 static 翻譯成 native code 通常還是有 dyanmic 的成分在 我也沒有去讀 ART 的資料和 code,不好說 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.34.244.41 ※ 文章網址: http://www.ptt.cc/bbs/AndroidDev/M.1407856610.A.AF8.html ※ 編輯: carylorrk (1.34.244.41), 08/12/2014 23:43:34