日々常々

ふつうのプログラマがあたりまえにしたいこと。

Kotlinに手を出してみる

Kotlinをはじめてみよう。

と思って、こんなことをした。

  • インストールする
  • はろわをかく
  • javapして眺める
  • Kotlinに依存しない形(javaコマンド)でkotlincでコンパイルしたクラスを動かす

GitHubのほうに同じのをあげてるます。

インストールしてみる

sdkmanでいけるんじゃないかと思って、sdk install kotlinを叩いてみる。

% sdk install kotlin

Downloading: kotlin 1.0.1

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100   601    0   601    0     0    359      0 --:--:--  0:00:01 --:--:--   558
100 19.6M  100 19.6M    0     0   984k      0  0:00:20  0:00:20 --:--:-- 1586k

Installing: kotlin 1.0.1
Done installing!

Do you want kotlin 1.0.1 to be set as default? (Y/n): y

Setting kotlin 1.0.1 as default.

入ったわ。

げってぃんぐすたーてっどを探す

文法もわからんからとりあえずググる

一番上に公式が出てきてくれた時の安心感。

開いたら当然のように「IDEAでやろうぜ!」って言われる。 まあわかるけど、私はとりあえずコマンドラインvimでやりたいんだーと思ったら、それっぽいのがある。

……ん。sdkmanで入れろって書いてる。 いいや。とりあえずはろーわーるど書いてみよう。

はろわ!

書くぜー。

ふむ。 そしてこんぱいr……ん?

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

なんかコマンド長いなーと思った。 まあいいか。実行したらhello.jar ができた。

サイズは80kbくらい、そこそこでかい。 -include-runtimeとかついてるし、実行可能jarなんだろと思って実行。

% java -jar hello.jar
Hello, World!

できたできた。

zip展開してjavap

どうせ hello.class とかあるんだろうと思ってunzipしたら、なんか HelloKt.class ってのが入ってた。

% javap HelloKt
Compiled from "hello.kt"
public final class HelloKt {
    public static final void main(java.lang.String[]);
}

こいつそのまま実行したらいけるんだろうなーと。

% java HelloKt
Hello, World!

いけた。 んー、これだけならクラスだけでも動くのかな。 って思って、クラスだけ移動して実行。

% java HelloKt
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
  at HelloKt.main(hello.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:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

だめか(当たり前だ

mainメソッドの中でクラスロードが入ってる。 なんだろう。

$ javap -v HelloKt
...略
  #15 = Methodref          #11.#14        // kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
...略
public static final void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
    Code:
      stack=2, locals=3, args_size=1
         0: aload_0
         1: ldc           #9                  // String args
         3: invokestatic  #15                 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
         6: ldc           #17                 // String Hello, World!
         8: astore_1
         9: nop
        10: getstatic     #23                 // Field java/lang/System.out:Ljava/io/PrintStream;
        13: aload_1
        14: invokevirtual #29                 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
        17: return
...略

パラメーターのnullチェックをメソッドの先頭でやってるんだなーと。

javap見た感じ、そいつあったら動く気がする。 適当に作ってみる。

そして実行。

% java HelloKt
[Ljava.lang.String;@7852e922
args
Hello, World!

動いた。謎の自己満足。

そんなわけで

Kotlin勉強会の裏で書いてました。

この後は素直にIDEAで触ることにします。