一、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,获取更多的实战教程