揭開Java一次編譯,處處運行的神祕面紗


本篇主要講解java的跨平臺特性—“一次編譯,處處運行”,正是這個核心優勢使得java語言在互聯網大爆發的時候能快速佔領編程領域的頭把交椅。

一、Java簡介

Java是由Sun Microsystems公司於1995年推出的高級編程語言,幾乎可以應用到所有型號和規模的設備上。

Java領域的技術有Java SE、Java EE以及Java ME。其中Java SE是基礎。學習其他技術必須要有Java SE的基礎。

  • Java SE:主要用於桌面程序、控制檯開發
  • Java ME:嵌入式開發、手機、小家電
  • Java EE:企業級開發,網絡開發和基於B/S模式的編程

在這裏插入圖片描述

在當今的軟件開發行業中,Java已經成爲了絕對的主流,其中最重要的原因就是Java的跨平臺性。使用Java語言編寫出來的程序幾乎不需要任何修改就能夠同時在Windows、MacOS、UNIX等平臺運行。

二、Java的跨平臺原理

Java程序一共要經歷三個步驟:編碼、編譯、運行

在這裏插入圖片描述

1、第一步是編碼,這步是基礎,沒什麼好說的。java源程序的後綴名爲.java

2、第一次編譯,源程序編寫完成後,需要一個“翻譯官”來將java源程序“翻譯”成與平臺無關的字節碼文件(bytecode)。而這個翻譯官就是Java編譯器(java compiler),簡稱javac。正是這一特性使一次編譯處處運行成爲可能。

獲取class字節碼文件常用的三種方法

Class clazz = Class.forName("包.類名稱")  //在源文件階段獲取class字節碼文件
Class clazz = 類名.Class  //在編譯階段獲取class字節碼文件
Class clazz = 類對象.getClass() //在運行階段通過生成的對象的來獲取class字節碼文件 
    //這三種方法獲取的類對象是同一個。

第二次"編譯"(運行),將字節碼文件解釋成二進制的機器語言,這一步是由Java虛擬機—JVM(Java Virtual Machine)來完成的。JVM虛擬機是平臺相關的。

JVM是如何完成這一步驟的呢?(以下來源於網絡

1、運行時,ByteCode由JVM逐條送給解釋器,解釋器將翻譯成機器碼運行。

2、運行時,部分ByteCode可能由實時編譯器(Just In Time Compiler,JIT)編譯爲目標機器碼再執行(以method爲翻譯單位,還會保存起來,第二次執行就不用再翻譯爲機器碼了),因爲考慮到有些JVM是採用純JIT編譯方式實現的,其內部沒有解釋器,例如:JRockit、Maxine VM。

3、RTSJ,繼javac之後執行AOT二次編譯,生成靜態的目標平臺碼。

有的時候,可能是以上三種方式同時在使用,至少,1和2是同時使用的,3則需要程序員手工指定。

在這裏插入圖片描述

三、這裏提出一個問題,Java語言時編譯型還是解釋型的呢?

大家都知道,計算機不能直接理解高級語言,只能理解和運行機器語言。必須要把高級語言翻譯成機器語言,計算機才能運行高級語言所編寫的程序。
翻譯的方式有兩種,一個是編譯,一個是解釋

用編譯型語言寫的程序執行之前,需要一個專門的編譯過程,通過編譯系統把高級語言翻譯成機器語言,把源高級程序編譯成爲機器語言文件,以後直接運行而不需要再編譯了,所以一般編譯型語言的程序執行效率高。

解釋型語言在運行的時候才解釋成機器語言,每個語句都是執行時才翻譯。每執行一次就要翻譯一次,效率較低。

二者之間最大的區別就在於是否存下目標機器碼:編譯會把輸入的源程序以某種單位(例如基本塊/函數/方法/trace等)翻譯生成目標機器碼,並存下來(無論是在磁盤上或是內存中)後續執行可以複用;解釋則是把源程序中的指令逐條解釋執行,邊解釋邊執行,不存下目標代碼,後續執行沒有可以複用的信息。

Java 是一種兼具編譯和解釋特性的語言,.java 文件會被編譯成與平臺無關的 .class 文件,但是 .class 字節碼文件無法被計算機直接使用,仍然需要 JVM 將其翻譯成機器語言。
所以嚴格意義上來說,Java 是一種解釋型語言(但其具有編譯特性)。

下面引用一段見解

很多資料說,C/C++等是編譯型語言,而Java、C#、Python、JavaScript都是解釋型語言,是通過解釋器來實現的,其實這麼說很容易引起誤解:語言一般只會定義其抽象語義,而不會強制性要求採用某種實現方式,例如說C一般被認爲是編譯型語言,但C的解釋器也是存在的,例如Ch……所以一般被稱爲“解釋型語言”的是主流實現方式爲解釋器的語言,但並不是說它就無法編譯。

這裏我按自己的理解解讀以下,JVM在將字節碼轉換成機器碼的過程中可能出現編譯,也可能出現解釋模式。但主流或者大多數情況下是解釋型,所以嚴格意義來說Java是一門解釋型的語言。

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