“Java是编译执行的语言”这句话对吗?
現(xiàn)在讓你談?wù)剬?duì)Java平臺(tái)的理解,你是否會(huì)感覺(jué)內(nèi)容過(guò)于龐大?這個(gè)問(wèn)題是比較寬泛的,Java發(fā)展到現(xiàn)在已經(jīng)不僅僅是語(yǔ)言這么簡(jiǎn)單了,Java平臺(tái)涉及的,包括但不僅限于下面提到的這些內(nèi)容:
- Java語(yǔ)言本身,包括基礎(chǔ)的語(yǔ)言特性,面向?qū)ο蟆⒎派洹⒎缎汀ambda等等。
- Java類庫(kù),包括核心類庫(kù)如IO/NIO、網(wǎng)絡(luò)、utils、安全、jdk等,以及在生產(chǎn)環(huán)境中常用的第三方類庫(kù)。
- Java虛擬機(jī),包括java的內(nèi)存管理機(jī)制、垃圾收集器、運(yùn)行時(shí)、動(dòng)態(tài)編譯等
- Java/JVM生態(tài),包括了Java EE、Spring、Hadoop、Spark等等
- Java工具,包括用來(lái)診斷性能如jmap、jstack等、編譯器javac、sjavac、以及輔助工具如jlink、jar等。
這些內(nèi)容無(wú)法在一個(gè)篇幅中都提到。本文從Java等基本特性開(kāi)始,先來(lái)回答一個(gè)問(wèn)題“Java是編譯執(zhí)行語(yǔ)言,這句話對(duì)嗎?”,我們又該如何理解Java的“書(shū)寫(xiě)一次 ,到處執(zhí)行”呢?
Java語(yǔ)言本身最顯著的兩大特性是“書(shū)寫(xiě)一次,到處運(yùn)行(Write Once,run anywhere)“,以及垃圾收集。這兩點(diǎn)都和C++有明顯的區(qū)別。
”書(shū)寫(xiě)一次,到處運(yùn)行“的能力是基于Java 虛擬機(jī)(JVM)的。Java源代碼編譯后生成的.class文件并不是最終的機(jī)器碼,而是一種可以被JVM解析的格式,稱為字節(jié)碼。JVM將字節(jié)碼翻譯成機(jī)器碼后執(zhí)行機(jī)器碼來(lái)運(yùn)行程序。只要在不同的操作系統(tǒng)上安裝好JVM后,.class文件便可以在這些JVM上運(yùn)行。
從這個(gè)過(guò)程來(lái)看,字節(jié)碼是在JVM中被解釋執(zhí)行的,那么“Java是解釋執(zhí)行的語(yǔ)言”這句話正確嗎?這句話不太準(zhǔn)確,常見(jiàn)的JVM,比如我們最經(jīng)常使用的Oracle JDK提供的JVM,都提供了JIT(Just-In-Time)編譯器,也就是通常所說(shuō)的即時(shí)編譯(https://en.wikipedia.org/wiki/Just-in-time_compilation)。為了提高熱點(diǎn)代碼的執(zhí)行效率,在運(yùn)行時(shí),JVM會(huì)把這些代碼編譯成與本地平臺(tái)相關(guān)的機(jī)器碼,并進(jìn)行各種層次的優(yōu)化,這種情況下,熱點(diǎn)代碼就屬于“編譯執(zhí)行”而不是解釋執(zhí)行。JVM提供了不同的參數(shù)來(lái)對(duì)這兩種模式進(jìn)行指定,例如-Xint告訴JVM只進(jìn)行解釋執(zhí)行,不對(duì)代碼進(jìn)行編譯,這種模式就拋棄了JIT帶來(lái)的性能上的優(yōu)化。同時(shí)另一個(gè)參數(shù)-Xcomp則是告訴JVM不要進(jìn)行解釋執(zhí)行,這種模式也叫做“最大優(yōu)化級(jí)別”,但實(shí)際上也并不一定會(huì)高效。
總的來(lái)說(shuō),Java的“編譯”和C/C++的編譯含義是不同的。Java源代碼編譯后生成的.class文件中是字節(jié)碼,而不是可以直接運(yùn)行的機(jī)器碼。JVM通過(guò)類加載器(class-loader)來(lái)加載字節(jié)碼,進(jìn)行解釋執(zhí)行或編譯執(zhí)行。除了上面說(shuō)到的這兩種編譯模式外,還有一種編譯模式稱為AOT(Ahead-of-Time Compilation)(https://en.wikipedia.org/wiki/Ahead-of-time_compilation),AOT可以將字節(jié)碼直接編譯成機(jī)器碼,在JDK 9中便引入了這些特性。更多的細(xì)節(jié)可以參考文檔http://openjdk.java.net/jeps/295。
JVM本身是一個(gè)強(qiáng)大的平臺(tái),它除了使得Java源代碼編譯生成的字節(jié)碼具備”書(shū)寫(xiě)一次,到處運(yùn)行“的能力外,只要符合格式的字節(jié)碼,都可以運(yùn)行在JVM上,所以大量的JVM語(yǔ)言的字節(jié)碼都可以在JVM上運(yùn)行,例如Scala。
關(guān)于Java平臺(tái)的更多內(nèi)容,請(qǐng)看后續(xù)文章。
轉(zhuǎn)載于:https://www.cnblogs.com/QG-whz/p/10386635.html
總結(jié)
以上是生活随笔為你收集整理的“Java是编译执行的语言”这句话对吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Qt实现多国语言(即界面翻译)可实时进行
- 下一篇: 开发进度六