Kotlin編譯器及反編譯分析 | 熱門編程語言-Kotlin(一)

一、Kotlin編譯器

  可以運行Kotlin代碼的IDE有IDEA,Android Studio和Eclipse,而且官方還提供了獨立的編譯器,方便我們在命令行編譯執行(類似Java)
1.安裝Kotlin的獨立編譯器(僅演示Linux環境下的步驟,其他系統的可以看文末提供的鏈接)
  安裝SDKMAN

curl -s https://get.sdkman.io | bash

  使用SDKMAN來安裝Kotlin編譯器

sdk install kotlin

  使用以下步驟查看安裝的Kotlin編譯器主要包含什麼指令。

which kotlin #尋找該指令的位置
#打印內容爲:/root/.sdkman/candidates/kotlin/current/bin/kotlin
cd /root/.sdkman/candidates/kotlin/current/bin/ 
ls #查看所有操作指令

  所有指令顯示如下:
在這裏插入圖片描述
  其中除了面向JVM的編譯指令,還是面向JS的編譯指令,下面我們主要演示kotlinc和kotlin兩個指令的用法。
2.演示kotlinc和kotlin命令
(1) 寫一段最簡單的HelloKotlin代碼 ,保存爲HelloKotlin.kt文件。

fun main(args:Array<String>){
	println("Hello Kotlin")
}

(2) 使用kotlinc指令將HelloKotlin.kt編譯成字節碼文件

kotlinc HelloKotlin.kt

  執行完後,查看當前目錄,可以看到生成的HelloKotlinKt.class字節碼文件。
(3) 使用kotlin指令執行HelloKotlinKt.class

kotlin HelloKotlin

  可以看到屏幕打印出的“Hello Kotlin”,執行對這兩個指令的作用已經很明顯,其實使用過java編譯和執行指令的同學就會發現其實這兩個指令和javac和java很類似,功能也類似,這更證明可Kotlin和java的緊密聯繫。

二、Kotlin的反編譯分析

  在第一部分中,後綴爲.kt的文件經過kotlinc編譯命令編譯後生成了.class文件,該.class文件是用於在JVM上執行的字節碼文件。
  但是字節碼文件的要求是函數或方法不能脫離類,但是從我們寫的HelloKotlin代碼可以看出,我們並沒有在.kt文件中寫入任何關於類的代碼,而僅僅包含main方法。所以我們可以猜想在執行kotlinc編譯指令時,可能對我們的.kt文件做了轉換,使之生成的字節碼文件符合要求。接下來,讓我們來驗證我們的猜想
  我們可以使用javap這個反編譯指令來反編譯生成的字節碼文件,看看該字節碼反編譯後的結果。

javap HelloKotlinKt.class 

  反編譯後的結果如下所示:
在這裏插入圖片描述
  因爲我們是採用Java的反編譯指令來反編譯該字節碼文件,所以生成的也就是Java代碼。結合上圖,可以看出縮寫的fun main()代碼其實就是相當於HelloKotlinKt類中的main方法,所以在執行kotlinc是會自動生成類來包含.kt文件中的main方法,再將其編譯成字節碼文件。這樣我們雖然沒有自己動手在Kotlin中寫出一個類包含方法或者函數,但是編譯後的代碼依然可以在JVM上運行。

三、簡單將kotlin代碼打包成jar包

1.將kotlin代碼打包成jar包

kotlinc HelloKotlin.kt -include-runtime -d HelloKotlin.jar

  同樣使用的還是編譯指令kotlinc,但是後面多加了-include-runtime,但參數表示在打包成jar包時,將Kotlin本身的庫也打包進去。
  對生成的HelloKotlin.jar進行解壓縮可以看到jar中除了包含HelloKotlin編譯後的字節碼文件,還有一個文件夾包含了Kotlin的庫的字節碼文件。
2.執行jar包

java -jar HelloKotlin.jar

  可以看到屏幕打印出來的"Hello Kotlin"。

點擊查看其它操作系統如何安裝Kotlin編譯器(有時候可能需要科學上網)

  • 關注我的公衆號,跟着我一起學習Kotlin、Rust和TypeScript,獲取更多的實戰教程
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章