【轉】Java是解釋型語言還是編譯型語言

有人說Java是編譯型的。因爲所有的Java代碼都是要編譯的,.java不經過編譯就無法執行。 也有人說Java是解釋型的。因爲java代碼編譯後不能直接運行,它是解釋運行在JVM上的,所以它是解釋型的。

對於C和C++,它們經過一次編譯之後,可以由操作系統直接執行,所以它們是編譯型語言。而Java不一樣,它首先由編譯器編譯成.class(字節碼)文件,然後再通過JVM從.class文件中讀一行解釋執行一行,所以它是解釋型的語言。也正是由於java對於多種不同的操作系統有不同的JVM,所以實現了真正意義上的跨平臺。

(1)Java語言的編譯–>解釋–>運行過程
(2)JVM

到這裏,大家應該也都明白了。

最後給出編譯型語言和解釋型語言的定義。
定義:
編譯型語言:把做好的源程序全部編譯成二進制代碼的可運行程序。然後,可直接運行這個程序。
解釋型語言:把做好的源程序翻譯一句,然後執行一句,直至結束!

特點:
編譯型語言,執行速度快、效率高;依靠編譯器、跨平臺性差。
解釋型語言,執行速度慢、效率低;依靠解釋器、跨平臺性好。

舉例:
編譯型的語言包括:C、C++、Delphi、Pascal、Fortran
解釋型的語言包括:Java、Basic、javascript

看到了亦淺的文章,覺得寫得很好,轉載過來方便自己複習

關於Java到底是解釋型語言還是編譯型語言還是二者的集合?首先理解一下何爲解釋型語言和編譯型語言

計算機高級語言類型主要有編譯型和解釋型兩種:

編譯型語言:在程序運行之前,有一個單獨的編譯過程,將程序翻譯成機器語言,以後執行這個程序時,就不用再進行翻譯了。

解釋型語言:是在運行的時候將程序翻譯成機器語言,所以運行速度相對於編譯型語言要慢。

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



瞭解Java的運行過程:Java源文件(*.java),通過java編譯器(javac)編譯生成一個ByteCode字節碼文件(*.class),字節碼由java自己設計的一個計算機(即java虛擬機,JVM)解釋執行,虛擬機將每一條要執行的字節碼送給解釋器,解釋器將其翻譯成特定機器上的目標機器碼,然後在特定的機器上運行。

所以說Java的解釋器的優點是比較容易讓用戶實現自己跨平臺的代碼,同一套代碼可以在幾乎所有的操作系統上執行。

(這裏提一下java的跨平臺Write Once,Run Anywhere:java的跨平臺是基於JVM的。JVM是在一臺計算機上由軟件或是硬件模擬的計算機,java程序所有的.class文件都是在JVM上運行的,也就是說.class文件只需認JVM,由JVM去適應各個操作系統,所以不同的操作系統只要安裝符合其類型的JVM,那麼程序無論到哪個OS上都是可以正確執行的JVM for Unix / JVM for Windows / JVM for Other……,因此沒有JVM也就不能跨平臺)

雖然Java的第一道工序是javac編譯,其目標文件是ByteCode,而並非機器語言,但後續可能有三種處理方式:

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

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

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

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

SO,我認爲java是編譯與解釋兩者之間的混合式語言。

And,一個知乎的大牛說的特別有道理:

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

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