Compile、Assembling and Interpreter

Compile‚ Assembling and Interpreter

剛好需要學習到這個差異性,所以特定用了一個頁面來記錄這些程式語言常常看到的關鍵字,以及其差異是什麼。

在高階語言上(high-Level language),須經由轉換的動作,將原始的程式碼「翻譯」成機器看得懂的二進位機器碼,所以一般而言,我們可以因這種轉換的動作的不同,我們分為編譯式語言(Compiled Language)以及直譯式語言(Interpreted Language)

編譯式的語言(Compiled Language)

編譯式的語言是將原始程式碼利用編譯器(compiler)針對原始程式先進行分析(analysis)以及前置處理(preprocess)的動作,並檢查程式中是否存在文法錯誤之後,再將之全部轉換為某種中介的目標語言(target language),稱之為目的檔(object file)。編譯式的語言如 C, FORTRAN, COBOL 等均是。而將原始碼(Source code)轉換成目的檔(Obj)之後,我們還需要一個連結器(Linker)來連結一個或者多個Obj file與外部函式庫(Library),轉換成機器碼(Machine code)以形成可執行檔(Executable file)。

直譯式的語言(Interpreted Language)

直譯式的語言是利用直譯器 (Interpreter) 對原始程式碼一邊讀解,一邊執行。其執行前並不會產生任何目的檔或是可執行檔,而是在執行當中才利用直譯器(interpreter)將執行到的區塊進行解析(parsing),再執行對應的機器碼。因此,其執行效率相較於編譯式語言是比較低的。直譯式的語言如 Basic, ASL-Code 及其他 Script Language 等。

混和型語言(hybrid language)

當然,除了上述以外的類型以外,還有一些屬於混和型語言,例如著名的Jave and C#。

由下圖我們可以觀察,在不同系統之下,我們需要多種Compiler來編譯使得可以應用在不同的系統上,且由於每個平台不同,因此相對的Library也大不相同,所以同樣的程式碼也不見得可以直接透過不同編譯器就可以完整地移植到另外一種平台上,或許程式碼還得做大幅度的更改,才有辦法完成跨平台使用,因此額外花費的時間也是非常可觀的。

Compiler

因此就產生了所謂的混和型語言(Hybrid Language0)Java,以下我們都會用這個當作一個例子來說明。Java也為一個高階語言,要讓電腦執行我們的程式碼之前,也是需要經過編譯,不過Java在編譯時,並不完全翻譯成為了某種平台的0101指令,而是翻譯成中介格式的位元碼(ByteCode)。Java的原始碼副檔名為*.java,而編譯過的會成為*.class的ByteCode,目標平台則需要安裝JVM(Java Virtual Machine)。JVM會將ByteCode翻譯成為平台相依的語言。下圖是我們簡約的流程圖,可以用來跟傳統高階語言做比較。

 JVM

JVM不同的平台必須安裝該平台相依的JVM。這就好比你講中文(*.java),Java編譯器幫你翻譯為英文(*.class)。之後該英文文件,到當地之後,再由當地看得懂英文的人翻譯為當地的語言。

所以JVM所擔任的職責之一,就是當地的翻譯員,將位元碼檔案翻譯為當時作業系統看得懂的0101序列。不過這不是最重要的,基本上如果只是要翻譯員的話,直譯器(Interpreter )就辦得到了。

JVM有個很重要的觀念就是:「對於Java程式而言,其實它只認識一種作業系統(或說是一種機器),這個系統叫作JVM,而對於JVM而言,位元碼檔案就是它的可執行檔案!也就是副檔名為.class的檔案。Java程式理想上,並不用理會真正執行於哪個平台之上,它只要知道如何執行於JVM之上就可以了,至於JVM實際上如何與底層平台作溝通,則是JVM自己的事!」這個觀念非常的重要,對於往後釐清所謂PATH變數與CLASSPATH變數,有非常大的幫助。

下一章節,我們繼續討論相對應的優缺點。部分資料取自於網路各位前輩,如有雷同的部分,還請各位多多包涵,因為是給自己當作筆記使用。

 

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s