Works by

Ren's blog

@rennnosuke_rk 技術ブログです

【Kotlin】Kotlin CLIでKotlinをJavaバイトコードにコンパイル/実行する

f:id:rennnosukesann:20190106130012p:plain:w500

今日はじめてKotlinを触ってみたのですが、その際に使用したKotlin CLIによるコンパイルと実行のメモです。

Kotlin CLIのインストール

実施環境:Mac OS X Mojave 10. 14.2

brew でインストールできます。

$ brew update
$ brew install kotlin

コンパイル

適当な .kt ファイルを用意します。

hoge.kt
fun main(args: Array<String>) {
    println(args)
}

kotlinc コマンドでコンパイルします(オプションでKotlinランタイムを含めたjarを生成)。

$ kotlinc hoge.kt -include-runtime -d hoge.jar

jar ファイルが生成されるので、Java同様 java コマンドで実行します。

$ ls
hoge.kt hoge.jar
$ java -jar hoge.jar
[Ljava.lang.String;@1b6d3586

コンパイル時に -include-runtime でKotlinランタイムを含めているのは、Kotlinコンパイラコンパイルされて生成されたバイトコードがKotlinランタイムのライブラリに依存しているためです。ランタイムを含めずにそのままコンパイルすると、実行時に kotlin/jvm/internal/Intrinsics クラスが見つからず ClassNotFoundException 例外を送出します。

$ kotlinc hoge.kt
$ kotlinc _hoge.class
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
    at _hoge.main(1_5_1_compile.kt)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

ちなみに kotlinc コマンドを引数なしで実行すると、インタラクティブシェル(REPL)が起動されます。

$ kotlinc
Welcome to Kotlin version 1.3.11 (JRE 1.8.0_131-b11)
Type :help for help, :quit for quit
>>> println("Hello, Kotlin CLI !")
Hello, Kotlin CLI !
>>> :help 
Available commands:
:help                   show this help
:quit                   exit the interpreter
:dump bytecode          dump classes to terminal
:load <file>            load script from specified file

参考文献

kotlinlang.org