Ginagigo

Work Hard, Play Hard

Kotlin & Java compilation process

維基百科寫道:

Kotlin是一種在Java虛擬機(JVM)上執行的靜態型別程式語言,它主要是由俄羅斯聖彼得堡的JetBrains開發團隊所發展出來的程式語言,其名稱來自於聖彼得堡附近的科特林島。雖然與Java語法並不相容,但在JVM環境中Kotlin被設計成可以和Java程式碼相互運作,並可以重複使用如Java集合框架等的現有Java參照的函式庫。

Kotlin跟Java的關係:

前提

Java 可以跨平台執行,就是因為有JVM的存在,只要任何平台有JVM,那就可以執行Java!

Kotlin與Java

Kotlin compiler compile後會生成byte code,然後byte code run在Java virtual machine(JVM)時會將byte code轉成machine code。

java的運作也一樣,java compiler將.java檔案轉成byte code,而kotlin則是.kt的檔案,被compiler compile後會產生.class檔案,.class檔案contain byte code。

也正因為會先compile成byte code並執行在JVM,所以Kotlin也支援Multiplatform,像是有:
1. Server side
2. Android / IOS
3. JavaScript
4. Native
5. Data Science

在Android中的Kotlin與Java的關係

最大的不同就是在Android的compile過程中,Android並不是work with JVM,而是work with另外兩種virtual machines:

  1. DVM (Dalvik Virtual Machine)
  2. ART (Android Runtime),在這之前Android 4.4 Kitkat之前,大約是2013年10月左右,runtime environment都是DVM。

DVM vs ART的比較可以去看Reference 4,這篇真的講得很詳細!

Compile的過程,如下圖:


原本的java byte code(.class)檔案,下一層則多了DX (DEX compiler),目的會將java byte ocde轉成Dalvik byte code。

為甚麼Google不使用JVM呢?

因為Android application runtime必須會support不同的手機型號,那application就需要被沙盒化,那什麼是沙盒呢?

沙盒通常嚴格控制其中的程式所能存取的資源,比如,沙盒可以提供用後即回收的磁碟及記憶體空間。在沙盒中,網路存取、對真實系統的存取、對輸入裝置的讀取通常被禁止或是嚴格限制。從這個角度來說,沙盒屬於虛擬化的一種。

沙盒中的所有改動對作業系統不會造成任何損失。通常,這種技術被電腦技術人員廣泛用於測試可能帶毒的程式或是其他的惡意代碼

From 來自維基百科的解釋

但是因為一個virtual machine-based的runtime並不會enable所有的limited processor speed and RAM.

所以Google選擇要捨棄JVM,並且使用Dalbik virtual machine (DVM).

DVM 跟 JVM 的比較圖


圖來自下面的reference 4

Reference

  1. How to Convert Kotlin Code to Java Code in Android Studio?
  2. How kotlin is interoperable with java
  3. kotlin-jvm编译过程(一) & 一些分享的資料
  4. 更詳細的compiler過程-Process of compiling Android app with Java/Kotlin code