當咱們寫完HelloWorld.java文件後,計算機怎麼知道咱們要幹什麼?那就須要說下編譯了(可見文章:JIT編譯),這裏也簡單補充點:前端
1.編程語言:java
編程語言分爲高級語言和低級語言:C、C++、Java等屬於高級語言;機器語言和彙編語言屬於低級語言。那和編譯有什麼關係呢?程序員
簡而言之,編譯就是把程序員認識的高級語言轉換成機器認識的低級語言的過程,可用命令javac進行編譯;相對的,也會存在反編譯,把機器看得懂的轉成程序員看的懂的,理論上是把class文件轉成java文件,但其實是轉成了咱們能夠看的懂的字節碼,要想分析程序運行的背後原理,反編譯必不可少。編程
2.編譯後端
再來講下編譯,編譯可分爲前端編譯和後端編譯,前者與語言有關,目標機器無關;後者與目標機器有關,語言無關。放在Java中,把.java文件編譯成.class文件稱爲前端編譯;把.class文件編譯成機器語言稱爲後端編譯。緩存
前端編譯成的.class文件中的字節碼是一種中間代碼,其有兩點重要性質:易於生成;能輕鬆的翻譯成目標機器上的語言。編程語言
後端編譯,會將字節碼解釋成機器指令,爲了提升性能和效率,引入了JIT技術,將「熱點代碼」翻譯成機器指令,優化並緩存起來,以備下次使用。詳見:JIT編譯文章性能
3.反編譯優化
咱們對本地代碼進行反編譯,來體會一下它的用處。spa
咱們有沒有想過枚舉類是個什麼類?enum是什麼意思?這時就須要反編譯了:
反編譯前:
反編譯後:
通過反編譯可知,enum類是一個被final修飾的class並繼承了lang包下的Enum類,這樣咱們就知道它是怎麼回事兒了。
再好比:
上面兩張圖是switch結構的兩種數據類型,那有什麼不同呢?看是看不出來的,反編譯後就知道了:
經過反編譯可知,整型的直接比較數值;char類型的比較ascii碼,會轉成int型,那問題來了,String類型呢?經過反編譯將會知道,String類型是經過equals()和hashCode()方法來實現。因此,Switch只支持一種數據類型,那就是整型,其餘數據類型都會進行轉換。
4.Java 10的本地變量類型推斷
3月21日 Java 10發佈,簡單說一下其本地變量類型的推斷。
反編譯後獲得:
兩張圖一對比就一目瞭然,它是個什麼樣子了。如今都慢慢的換上Java 8了,因此10就先了解這些吧。咱們下期再見!
參考資料:http://www.hollischuang.com/