JAVA的一次編譯,到處運行,你知道多少?

轉自http://blog.csdn.net/wangyongxia921/article/details/28117155

一、對JAVA的迷茫

 

以前只是一味的學習VB.NETc#。現在輪到學習java了。迷惑了?書上說:JAVA是一種跨平臺語言,最大的優勢就是它實現了,一次編譯,到處運行的機制。這是什麼?跟平臺無關?我以前做的VB.NETc#程序也沒有考慮過平臺呀?

學過編譯原理的同學或許都知道“語言處理程序”,其實就是編譯器。java的“一次編譯,到處運行”就跟這個編譯器有關。

在具體說之前,我們先要理清楚幾個概念,以及它們之間的關係。

 

1、編寫階段——程序設計語言

VB.NETc#java等都是程序設計語言,這個不用多說。

 

2、編譯階段——程序處理語言 

程序處理語言包含編譯器,解釋器。它的作用就是把程序設計語言翻譯成目標語言。

以上兩者的關係就是“語言”和“翻譯者”的關係。在使用語言時,我們只能說,使用這種語言去書寫一段程序。編譯器則是能夠將某種語言的源程序進行翻譯,然後生成目標程序。

不同的設計語言有不同的編譯器。我們通常會說,某個編譯器支持了什麼語言,正如一個翻譯者只懂翻譯英語,法語,但是不會日語,所以翻譯不了日語一樣,這個編譯器只識別能識別得語言並翻譯這種語言。

 

3、運行,調試階段——集成開發環境(IDE

在程序的運行階段則是在一個特定的平臺上,由這個平臺來執行編譯生成的程序。編譯器的作用就是溝通源程序和程序的運行平臺。源程序相對於一個運行平臺來說是不可識別的,但當編譯器將源程序編譯成爲這個平臺所能夠識別的目標語言以後,程序就可以在這個平臺上運行了。Java虛擬機是一個平臺,DOS 和 Windows 也是平臺。 

看來以上三個概念,就明瞭了,爲什麼我們編寫程序的時候,我們甚至可以只用一個簡單的記事本就可以搞定,但是要運行的時候,就需要在“vs”或者“vb”等IDE中進行了。 

那麼我們進入正題,JAVA的特殊在哪?


二、一次編譯,到處運行 

上面三個概念中已經指出了程序從源代碼到運行的三個必經階段:編碼——編譯——運行,調試。

所有的高級語言都需要進過這三個階段。

本身JAVA語言的最大特點是面向對象,跟今天的主題無關,不做介紹。JAVA的特殊特殊在哪裏?——在編譯階段。 


1一次編譯是宏觀的一次編譯。


我們來看一下JAVA的編譯過程:

    


分解過程:

第一步:Java源代碼——.CLASS文件字節碼,是java的第一次編譯。生成的這個.class文件就是可以到處運行的文件。


第二步:Java字節碼——到目標機器代碼;執行是由JVM執行引擎來完成,JAVA的第二次編譯。


2、到處運行的隱含條件——這裏的“到處”的前提是“裝有JVM”。 


看完編譯過程在這裏說“到處運行”就毫不費力了。因爲第二次編譯就是在JVM中執行的,也就是在任何一個裝有“JVM”的操作系統中完成的。JAVA提供了各種不同平臺上的虛擬機制,所以可以實現“到處”。

    


注意:java並不是編譯機制,而是解釋機制。 


看過了JAVA的兩次編譯,不要以爲JAVA是編譯機制,在java中有第一次編譯,還有第二次解釋來適應不同平臺;根據不同的平臺進行解釋執行。在JVM中的第二次編譯過程中(從字節碼向機器碼轉換過程中)真正採用的是“解釋”機制。即翻譯一句,執行一句,不產生整個的機器代碼程序。翻譯過程如果不出現錯誤,就一直進行到完畢,否則將在錯誤處停止執行。

同一個程序,如果是解釋執行的,那麼它的運行速度通常比編譯爲可執行的機器代碼的運行速度慢一些。但是,對Java來說,二者的差別不太大

以下是查到的解釋:Java的字節碼經過仔細設計,很容易便能使用JIT 即時編譯方式 編譯技術將字節碼直接轉化成高性能的本地機器碼,Sun 公司在 Java 2發行版中提供了這樣一個字節碼編譯器——JIT(Just InTime),它是Java虛擬機的一部分。Java運行系統在提供JIT的同時仍具有平臺獨立性,因而“高效且跨平臺”對Java來說不再矛盾。如果把 Java的程序比做“漢語”的話,字節碼就相當於“世界語”,世界語不和具體的“國家”關,只要這個“國家”提供了“翻譯”,就可以再快速地把世界語翻譯成本地語言。 


三、總結


1JAVA有這麼的強大的特點,不是僅僅指的是“狹義”的JAVA程序設計語言,而是整個JAVA體制,從編譯器開始發生改革。所以平時我們所說的JAVA特點是一種廣義上的JAVA。開始,迷惑的我,是不清楚這些IDE,這些編譯器,這些開發環境(jdk,運行環境(jre)都被融合在一起,放在了一個繼承環境中(IDE)。這本是一個很好的開發,運行,調試的一條龍服務,可是缺讓我想當然的把程序設計語言,編譯器,等這些單獨的工具給模糊了。只是一味的再使用,卻不知道,這些東西的底層確實這般聯繫。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章