計算機不能直接理解高級語言,只能直接理解機器語言,所以必須要把高級語言翻譯成機器語言,計算機才能執行高級語言編寫的程序。
1、利用編譯程序從源語言編寫的源程序產生目標程序的過程。
2、用編譯程序產生目標程序的動作。
通俗來講,編譯就是把高級語言變成計算機可以識別的二進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成二進制的。
因為翻譯只做了一次,運行時不需要翻譯,所以編譯型語言的程序執行效率高,但也不能一概而論,部分解釋型語言的解釋器通過在運行時動態優化代碼,甚至能夠使解釋型語言的性能超過編譯型語言。
編譯型與解釋型,兩者各有利弊。前者由於程序執行速度快,同等條件下對系統要求較低,因此像開發操作系統、大型應用程序、數據庫系統時都采用它,像C/C++、Pascal/Object Pascal(Delphi)等都是編譯語言,而一些網頁腳本、服務器腳本及輔助開發接口這樣的對速度要求不高、對不同系統平台間的兼容性有一定要求的程序則通常使用解釋性語言,如JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等。
但隨着硬件的升級和設計思想的變革,編譯型和解釋型語言越來越籠統,主要體現在一些新興的高級語言上,而解釋型語言的自身特點也使得編譯器廠商願意花費更多成本來優化解釋器,解釋型語言性能超過編譯型語言也是必然的。
java運行步驟:
.java文件->編譯->.class文件,編譯成.class字節碼,.class需要jvm解釋,然后解釋執行。Java很特殊,Java程序需要編譯但是沒有直接編譯成機器語言,即二進制語言,而是編譯成字節碼(.class)再用解釋方式執行。java程序編譯以后的class屬於中間代碼,並不是可執行程序exe,不是二進制文件,所以在執行的時候需要一個中介來解釋中間代碼,這既是java解釋器,也就是所謂的java虛擬機(JVM),也叫JDK。
因為java解釋器采用生成與系統無關的字節代碼指令技術。也就是說,在任何不同的操作系統上,只要正確安裝了java運行系統,就有了編寫調試java程序的平台,在分布式應用中,java的這個特點使同一個java程序能在不同的系統上運行,從而提高了軟件生產效率。可移植性是跨平台特性的一個延伸,即具有了跨平台性,就保證了可移植性。java程序、java類庫、java編譯器、java系統都具有可移植性。
說了這么多,讓我們回頭看一下java到底是編譯型的還是解釋型的。首先,java需要編譯,解釋型語言不需要編譯,然而java編譯的結果又不是和其他編譯型語言一樣的二進制文件,而是class文件。從這一點上來看,java介於二者中間;java編譯完成以后,操作系統不能直接運行,而是需要java虛擬機解釋執行class字節碼文件。因此虛擬機將字節碼程序與操作系統及硬件分開,使得java程序能在異構平台上執行,從這一點上來看,java又屬於解釋型語言。如果嚴格來說,java確實屬於半編譯半解釋型語言,如果只從最后的執行步驟來看,java屬於解釋型語言。至於它到底屬於什么類型的語言,還是仁者見仁智者見智的。