編譯器(compiler) 組譯器(assembler) 直譯器(interpreter) 虛擬機(virtual machine) 介紹

--

我們將透過介紹各個語言的編譯流程來了解上述名詞的含意。

C

C簡易編譯流程

C 語言一開始會先經過編譯器翻譯成組合語言,組合語言最後在被組譯器翻譯成機器語言,機器語言經過 linker (連結器),最後產生出來的形式為執行檔 (executable file),並且執行檔可以在相同 CPU 平台的電腦上執行,這就是編譯器的其中一個優點,不過這邊不多談 linker,所以圖上也沒有畫出來。

組譯器其實也是一種編譯器,只是因為強調是組合語言當作輸入,並且組譯器多半比編譯器還要簡單。

有些編譯器看起來是直接輸出機械語言,其實多半也是先輸出組合語言,再在背後執行組譯器。

常見的 C compiler 叫做 GCC ,各家公司也會實做自己的 C compiler (Visual studio C/C++ …),也有人對 C 語言專門設計一個直譯器,叫做 Ch ,可以嘗試玩看看。

Java

Java 簡易編譯流程

Java 編譯過程比較特別,是先透過 Compiler 轉成 Java byte code (可以把它當成 Java 的組語),最後透過 Virtual Machine (可以看成 Interpreter) 轉成 Machine code,並且 Java 在 JVM 裡面為了加快翻譯速度,還有使用 Just in time complication(JIT) 技術來加快速度,JIT 會幫你最佳化 byte code,像是去除沒用的 code 等。

Java byte code 的實做讓跨平台相當成功,因為 byte code 自己有自訂統一的規格。並且 JVM 其實是一個環境,它把不同 CPU 平台資訊包起來,這樣 Java byte code 可以在各個不同的環境上執行。
JVM有個很重要的觀念就是:「對於Java程式而言,其實它只認識一種作業系統(或說是一種機器),這個系統叫作JVM,而對於JVM而言,位元碼檔案就是它的可執行檔案!也就是副檔名為.class的檔案。Java程式理想上,並不用理會真正執行於哪個平台之上,它只要知道如何執行於JVM之上就可以了,至於JVM實際上如何與底層平台作溝通,則是JVM自己的事!」 — 為什麼需要 JVM?

也就是 vm 跟 compiler 的差別為,vm 是讓程式碼執行在 vm 上, vm 再跟底層溝通,compiler 是幫你翻譯完,你還是執行在底層。

Python

Python簡易編譯流程

基本上跟 Java 類似,甚至有些 Python 的 vm 是用 jvm 實做呢,詳細請看參考文章。

參考文章:Python進階技巧 (5) — Python 到底怎麼被執行?直譯、編譯、字節碼、虛擬機看不懂?Python 的底層架構

直譯器跟編譯器的差別。

Deep Learning compiler

DL 編譯器位不同的 DL 模型作為輸入,生成極度優化的 Machine code,希望能讓速度越快越好。

https://ictjournal.itri.org.tw/xcdoc/cont?xsmsid=0M236556470056558161&qcat=0M236615928976122749&sid=0M250372494032833587

詳情請看上面文章,因為本身不太了解。

--

--

Kola (Yan-Hao Wang)
Kola (Yan-Hao Wang)

Written by Kola (Yan-Hao Wang)

在系統軟體跟資安領域學習的學生

No responses yet