ことりんと一緒 - 1. Hello, World!

## 説明
最近、Kotlin がかわいくて仕方がなくなってきたので、Kolin について自分自身の頭の整理も兼ねてまとめていこうかと思います。
今回は基本中の基本の Hello, World! ができるところまでです。

これを目にしている人達なら当然読めていると思いますが、Kotlin = 「ことりん」です。
ことりんと言ってもμ'sはあまり関係ないです。
でも、ことりんと聞くと、ことりんぱな、と反応する人にオススメの言語だったりなかったり:smiley:


## 前提
Kotlin を動かす環境はいろいろと作れますが、ここでは次の環境を前提としています。

|項目|内容|
|---|---|
|OS|MacOS|
||Homebrew が使えること|
|JDK|Java8|

ちなみにJDK はJava6以上なら大丈夫です。
 
## 手順
### 1. Kotlin インストール
#### 1.1. Homebrew でインストール
```
$ brew install kotlin
```

インストール作業はこれだけです。

#### 1.2. インストール確認
```
$ kotlin -version
Kotlin version 1.2.0 (JRE 1.8.0_152-b16)
```

Kotlin 1.2.0 が入っていることが確認できます。

### 2. Kotlin 動作確認 - Hello,World!
#### 2.1. Kotlin ファイルの作成
基本に忠実に、Hello,World!を出力してみます。
まず、Kotlin のコードを書くためのファイルを作成します。

```
$ vim HelloKotlin.kt
```

Kotlin ファイルの拡張子は、**kt** とします。

#### 2.2. 関数の作成
作成した HelloKotlin.kt に以下のコードを記述します。

```kotlin
fun main(args: Array<String>) {
  println("Hello, Kotlin!")
}
```

##### 2.2.1. 関数について
Java に慣れ親しんでいると、いきなり関数だけを作成することに違和感を感じる人もいるかもしれません。Java だと必ずファイ毎にクラスを作成して、クラスの中にメソッドを作成していました。

Kotlin は、関数だけでも成立する言語だということをまずは覚えておきましょう。

##### 2.2.2. fun について
main 関数ですが、**fun** から書き始めています。
この fun が関数を定義するための記述方法です。

```
fun 関数名(パラメータ: パラメータの型): 戻り値の型 {処理内容}
```

今回の main 関数の中では、標準出力を行っているのみで、戻り値がありません。Java でいうところの void 型です。Kotlinでは、**Unit** 型と呼びます。
これは省略可能なので、今回は省略しています。

### 3. コンパイル＆実行
#### 3.1. コンパイルして JAR の作成
kotlinc コマンドを使ってコンパイルを行います。
以下のようにオプションをつけてコンパイルして JARを作ってみます。

```
$ kotlinc HelloKotlin.kt -include-runtime -d HelloKotlin.jar
```

```
$ ls -l
total 1808
-rw-r--r--  1 shinyay  staff  918546 12  7 08:52 HelloKotlin.jar
-rw-r--r--  1 shinyay  staff      62 12  7 08:33 HelloKotlin.kt
```

JAR ファイルが作成されたことが確認できます。

#### 3.2. 実行
作成されたJARファイルを実行してみます。

```
$ java -jar HelloKotlin.jar
Hello, Kotlin!
```

動作していることが確認できました。

#### 3.3. include-runtime について
ところで、コンパイルするときに **include-runtime** をつけていました。これを外してコンパイルするとどうなるか試してみます。

```
$ kotlinc HelloKotlin.kt -d HelloKotlin.jar
```

```
$ ls -l
total 16
-rw-r--r--  1 shinyay  staff  1160 12  7 09:01 HelloKotlin.jar
-rw-r--r--  1 shinyay  staff    62 12  7 08:33 HelloKotlin.kt
```

```
$ java -jar HelloKotlin.jar
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
        at HelloKotlinKt.main(HelloKotlin.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:338)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 1 more
```

include-runtime オプションをつけずに作成したJARファイルでは、ClassNotFoundException が発生します。

Kotlin のランタイムライブラリが見つかっていないのです。

文字通り、include-runtime オプションは、Kotlin のランタイムライブラリをJARに含めるオプションなのです。


include-runtime オプションをつけて作成したJARの中身を見てみます。

```
$ jar tvf HelloKotlin.jar
    82 Thu Dec 07 09:05:20 JST 2017 META-INF/MANIFEST.MF
   988 Thu Dec 07 09:05:20 JST 2017 HelloKotlinKt.class
    35 Thu Dec 07 09:05:20 JST 2017 META-INF/main.kotlin_module
   483 Mon Nov 27 15:49:42 JST 2017 org/jetbrains/annotations/Mutable.class
   546 Mon Nov 27 15:49:42 JST 2017 org/jetbrains/annotations/NotNull.class
   548 Mon Nov 27 15:49:42 JST 2017 org/jetbrains/annotations/Nullable.class
   485 Mon Nov 27 15:49:42 JST 2017 org/jetbrains/annotations/ReadOnly.class
   898 Mon Nov 27 15:49:10 JST 2017 kotlin/jvm/internal/CallableReference$NoReceiver.class
  3317 Mon Nov 27 15:49:10 JST 2017 kotlin/jvm/internal/CallableReference.class
  2625 Mon Nov 27 15:49:10 JST 2017 kotlin/jvm/internal/CollectionToArray.class
   337 Mon Nov 27 15:49:10 JST 2017 kotlin/jvm/internal/DefaultConstructorMarker.class
   201 Mon Nov 27 15:49:10 JST 2017 kotlin/jvm/internal/FunctionBase.class
    :
    :
    :
```

Kotlin に関するライブラリが入っている事が確認できます。

## まとめ
Kolinのインストールから、Hello, World! がでるところまでできました。
どこまで続くか分からないですが、今後 少しずつ Kotlin をまとめていこうかなと思います。