昨天有個哥們:寫了這麼篇文章:星期六不談技術->>走出程式員的悲哀。
拋開這些不談,誰能給編譯型和解釋型給下個定義。無一例外,要麼就是某人的部落格,要麼就是搜尋來的網頁,再要麼就是放個闕詞就消失,這些作為論據充分不?
昨天翻了翻龍書,也沒有給這兩個概念下詳細的定義,可見兩個概念是很難下個精確的定義的。
在<<Programming Language Pragmatics>>(by Michaei L. Scott)這本書裡面,我找到了相關的定義和說明,特摘錄如下
Compilation and Interpretation
進階語言裡一個程式的編譯和執行大概是 下面的情況:
編譯器將進階語言從原始碼翻譯成與之等價的目標程式(就相當於從中文翻譯成中文),而後就隱退了。在隨後的某個時刻,使用者啟動目標程式由作業系統執行。
實現進階語言的另外一種方式為解釋:
與編譯不同的是,解譯器在目標程式(其實根本就沒有目標程式,只是與編譯來對比)執行期間,解譯器一直隨之運行。這種執行過程完全由解譯器控制的。
從效果上看,解譯器實現了一台“虛擬電腦”,其“機器語言”就是進階語言,解譯器一次讀入一條或多條語句,按照其自身規定的方式去執行相應的操作。
一般說來,解釋比編譯有著很好的靈活性;編譯一般有著較好的效能。
但是有些語言確是採用了兩者的混合形式:
書中的原文:
”如果初始階段的翻譯器比較簡單,我們就說這個語言是“解釋的”。如果翻譯器很複雜,我們就說這一語言是“編譯的”。
現在兩者的區分變得有些模糊了,因為“簡單”和“複雜”都是修飾性術語,也因為完全可能出現用一個編譯器(複雜的翻譯過程)產生代碼,
而後又由一個複雜的虛擬機器(解譯器)執行。對於最後這種情況,如果翻譯器對程式做了徹底的分析(而不是做某種“機械的”變換),而且有關
的中繼語言程式與來源程式並沒有很強的相似性,我們還是說這個語言是編譯的。這兩種特性----徹底的分析和非平凡的變換-----是刻畫編譯方式的標誌性特徵。“
根據以上標準,首先CSC只是對C#到IL做”機械“的翻譯,而且C#和IL之間有很強的相似性,因為兩者的程式碼幾乎可以100%相互轉換(比如reflector可以將C#反編成IL,也可以將IL反編為C#)。
您認為呢?
PS:再者某些人認為的ngen和cache程式集其實也是支援C#是解釋語言的結論,因為編譯型語言因為效能的天然因素是不需要這些手段的。
也許我是錯的,請您不吝賜教,感激涕零.
本人禁止了不負責任的匿名評論,請大家海涵。
郵件來自scott教授:
> My problem is that: when I reading the example 1.6 Mixing complication
> and interpretation, according this definition in your words: “These
> two characteristics--thorough analysis and nontrivial transformation
> --
> are the hallmarks of compilation.”,
> It confused me that if the C# language is complication language or
> not. As far as I know, the C# first translate C# to IL(Intermediate
> Language), and when the application is executing, the second compiler
> JITTTER will compile the IL to binary code.
> Based on your definition, I think C# is belong to interpretation
> language, because:
> 1. C# to IL is a simple translation process, IL is a high level
> language 2. C# and IL has lots of similar language filters, they can
> be transformed to each other freely
Actually both the translators you mention are real compilers. One compiles from C# to CIL; the other compiles fro CIL to machine code.
Both transformations are nontrivial, and both involve detailed analysis of the source.