のーずいだんぷ

主に自分用メモですが、もしかしたら誰かの役に立つかもしれません

Kotlinの開発環境を構築&実行方法とか

はじめに

所要でAndroidアプリを作る方法を知らねばならなくなったので、ここ最近のトレンドであるKotlinで書こうと思い、まずは遊ぶための準備をしてみた。

JDKをインストールする

まずJDKをインストール(JREではだめかもしれない) 終わったらKotlinのcompilerをgithubからインストールする。 上で言えば、compiler-1.3-31.zip という名前のもの。 が、実はKotlinをインストールする方法は色々あり、homebrewからでもインストールできたりするが、今の所は以下に示すSDK manを使用することがベストだと思う。 SDKmanはJDK関連のパッケージマネージャと言えると思う。他にもScalaやJDKのようなJVM系言語のコンパイラ、またJVM系言語のビルドツールであるgradleやsbtなどもこのツールで管理ができるようだ。

SDK manをインストールする

SDKman 自体はcurlからインストールできる。以下のコマンドをターミナルから実行することでインストール自体は完了する。

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

補完も使用したいので、以下のコマンドで補完機能を有効にする。

$ source "$HOME/.sdkman/bin/sdkman-init.sh"

インストール後は、sdkでエイリアスがはられているので、sdkコマンドでkotlinをインストールできる。

sdk install kotlin [version]

バージョンは指定できるが、しなくてもよい。(たしか安定版がインストールされるはず)

バージョン確認

~ $ kotlin -version
Kotlin version 1.3.31-release-197 (JRE 1.8.0_222-b10)

KotlinでHello World

ktファイルの作成

hello.ktを作成し、以下のようにスクリプトを書く。

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

なんとなくJavaっぽいので読めると思うが、これがKotlinにおける関数(エントリポイント)となる。

ktファイルの実行

以下のようにjarファイルを生成し、javaコマンドで実行する。

 $ kotlinc src/hello.kt -include-runtime -d jar/hello.jar
 $ java -jar jar/hello.jar 
Hello, World

とりあえず出力はできた。

Kotlinはclass定義が必要ない?

kotlinはjava,scalaと異なりclass定義をせずに動作するようだ… 何が起きているのかJVMバイトコードから探ってみる。 *.ktと同一のフォルダに移動してcompileを実行し、classファイルを作成する。

$ kotolinc hello.kt
$ ls
HelloKt.class  hello.kt

以下のコマンドでclassファイルを覗けるようなので覗いてみる。

$ javap -c HelloKt.class 
Compiled from "hello.kt"
public final class HelloKt {
  public static final void main(java.lang.String[]);
    Code:
       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: iconst_0
      10: istore_2
      11: getstatic     #23                 // Field java/lang/System.out:Ljava/io/PrintStream;
      14: aload_1
      15: invokevirtual #29                 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      18: return
}

結果、JVMで実行できる形にcompileされているのはわかるが、やはりktファイルそのままでは互換性がない。 kotlinのランタイムをincludeするのもこれが理由らしい。 なお、kotlin専用にライブラリを使用する場合はわざわざincludeする必要はない。

ktファイルをスクリプトとして実行する

前節でjavaとの互換性を考慮する必要がないのであればkotlinランタイムをincludeする必要がないと記載したように、jarファイルを生成せずにそのまま実行することも可能である。

例えばhello.ktsでファイルを作成し、kotlinc -script hello.ktsでスクリプト言語みたく簡単に実行が可能。

KotlinのREPLを使用する

REPLを使ってみる。kotlinc-jvmで簡単に使うことができる。 一応-cpオプションでクラスパスを指定した状態で実行することも可能例えば以下のような感じ。

$ kotlinc-jvm -cp joda-time-2.9.4/joda-time-2.9.4.jar
Welcome to Kotlin version 1.1-M04 (JRE 1.8.0_66-internal-b17)Type :help for help, :quit for quit
>>> import org.joda.time.DateTime
>>> DateTime.now()2016-08-25T22:53:41.017+01:00

終わりに

ひとまず基本のランタイムの使い方はわかった。 今後は文法の勉強をScalaと並行して実施していきたい。(この際Javaについてもちゃんと学びなおしたほうが色々と得られるものがあるかもしれない。)

参考

sdkman.io

Learn Kotlin Programming: A comprehensive guide to OOP, functions, concurrency, and coroutines in Kotlin 1.3, 2nd Edition

Learn Kotlin Programming: A comprehensive guide to OOP, functions, concurrency, and coroutines in Kotlin 1.3, 2nd Edition