Kotlinをネイティブコンパイルする

Kotlinをネイティブコンパイルしてみました。

Kotlinのインストール

WindowsのWSLで実行したのでSDKMANを使いました。
https://sdkman.io/

$ curl -s https://get.sdkmain.io | bash


で、ターミナルを起動しなおして

$ sdk install kotlin


Macならbrewで。

$ brew update
$ brew install kotlin

Kotlinコードを書いて普通に実行

こんな感じのKotlinコードを書いてみます。

fun sum(a:Int, b:Int): Int {
  return a + b
}

fun main(args: Array<String>) {
  val s = sum(3, 4)
  println("Hello, $s")
}


コンパイル

$ kotlinc HelloKotlin.kt


helloKotlin.jarができるので実行します

$ java -jar helloKotlin.jar
Hello, 7


Kotlin完全に理解した。

Kotlin/Nativeでネイティブコンパイル

それではKotlin/Nativeでネイティブコンパイルしてみます
まずは、ここからkotlin-native-linux-1.3.10.tar.gzをとってきて解凍します。

$ tar xf kotlin-native-linux-1.3.10.tar.gz


そしたらkotlinc-nativeでコンパイル

$ kotlin-native-linux-1.3.10/bin/kotlinc-native HelloKotlin.kt -o helloKt


helloKt.kexeという実行ファイルができるので、実行してみます。

$ ./helloKt.kexe
Hello, 7


Kotlin/Native完全に理解した。

GraalVMでネイティブコードを作る

GraalVM 1.0RC9をダウンロードします。
http://www.graalvm.org/downloads/


解凍

$ tar xf graalvm-ce-1.0.0-rc9-linux-amd64.tar.gz


そしたら、さきほどのhelloKotlin.jarをネイティブコンパイルします。

$ graalvm-ce-1.0.0-rc9/bin/native-image -jar helloKotlin.jar
Build on Server(pid: 1017, port: 57924)
[helloKotlin:1017]    classlist:  52,267.85 ms
[helloKotlin:1017]        (cap):   1,527.57 ms
[helloKotlin:1017]        setup:   1,795.74 ms
[helloKotlin:1017]   (typeflow):   2,825.42 ms
[helloKotlin:1017]    (objects):   2,007.84 ms
[helloKotlin:1017]   (features):      64.34 ms
[helloKotlin:1017]     analysis:   4,981.88 ms
[helloKotlin:1017]     universe:     229.84 ms
[helloKotlin:1017]      (parse):     418.69 ms
[helloKotlin:1017]     (inline):     789.38 ms
[helloKotlin:1017]    (compile):   1,283.91 ms
[helloKotlin:1017]      compile:   2,786.14 ms
[helloKotlin:1017]        image:     517.86 ms
[helloKotlin:1017]        write:     206.43 ms
[helloKotlin:1017]      [total]:  62,846.33 ms


helloKotlinという実行ファイルができているので実行します。

$ ./helloKotlin
Hello, 7


GraalVM完全に理解した。

比べてみる

実行時間

$ time ./helloKt.kexe
Hello, 7

real    0m0.015s
user    0m0.000s
sys     0m0.016s
$ time ./helloKotlin
Hello, 7

real    0m0.019s
user    0m0.000s
sys     0m0.016s


GraalVMのほうがちょっと遅いかなーというくらいですね。大差なし。


実行サイズ

$ du -h helloKt.kexe
472K    helloKt.kexe
$ du -h helloKotlin
11M     helloKotlin
$ du -h helloKotlin.jar
1.2M    helloKotlin.jar


さすがにGraalVMのネイティブコンパイルVMも含むのででかいですね。Kotlin/Nativeはjarより小さくなっています。
ということで、ネイティブコンパイルで遊んでみました。