Kotlin

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動
Kotlin
Kotlin ロゴ
Kotlinのロゴ
パラダイム オブジェクト指向
登場時期 2011年 (2011)
設計者 アンドリー・ブレスラフ、ドミトリー・ジェメロフ
最新リリース 1.3.20/ 2019年1月23日(2か月前) (2019-01-23[1]
型付け 静的型付け
影響を受けた言語 JavaGroovyScalaC#JavaScript[2]
プラットフォーム JavaプラットフォームAndroid含む), JavaScript実行環境, FreeBSD, Linux, macOS, Windows, iOS
ライセンス Apache License 2.0
ウェブサイト kotlinlang.org
拡張子 .kt
テンプレートを表示

Kotlin(コトリン)は、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、静的型付けオブジェクト指向プログラミング言語である。

開発経緯[編集]

Kotlin言語は、ロシア連邦レニングラード州都のサンクトペテルブルクにある、ジェットブレインズ社の研究所で生まれた。

ジェットブレインズ社は JavaRubyPython などのプログラミング言語による開発環境などを開発して販売してきた。Kotlin言語は、同社の経験を活かしJava言語をもっと簡潔・安全になるように改良した産業利用向け汎用言語として開発され、2011年7月20日に発表された。

オペレーティング・システムによらずJava仮想マシン上で動く。Java言語で書かれたプログラムと同じほど速くコンパイルされ同じほど速く動作するとしている。

Java言語に望まれている機能であっても互換性を保つために実現できていない機能や、将来のJava言語の仕様で実現が予定されている機能から、有用と思われる機能を採用した。また、Java仮想マシンで動く点で似ているスクリプト言語 Groovy関数型プログラミング言語の要素が強い Scala から、機能や簡易記法(糖衣構文)を採用した。そのほか、ジェネリクスの構文などでC#の影響を受けている部分もある[3]

2012年2月14日KotlinApacheライセンス バージョン2.0に基づいてオープンソース化された[4][5]

アプリケーションプログラミングインタフェース[6]が公開され、ウェブサイト上でのデモンストレーション[7][8] のほか、スタンドアローンコンパイラの形と同社提供の統合開発環境IntelliJ IDEA」上のプラグインの形で、マイルストーン安定版「M1」が2012年4月12日より提供[9]された。

「M2」では言語機能が強化されたほか、Android 上の開発および動作も可能となり、JavaScript へのコンパイルもサポートされた。「M3」では約400件の障害修正を行ない、性能向上、型引数推論の強化などを行った。「M4」で128件の障害修正を行ない、型引数推論の高速化、JDK 7 対応、データクラスの copy メソッド新設などを行った。

2018年10月29日にリリースされたKotlin 1.3の一部として、Kotlinのコードよりネイティブバイナリを生成する「Kotlin/Native」のベータ版がバンドルされた[10]

名称[編集]

コトリン島にちなんで命名された。コトリンは、開発の地サンクトペテルブルクに近いバルト海フィンランド湾にあり、全長約12kmの細長い島である。

もともと Kotlin というのはやかんを表すフィンランド語であり、Kotlin 言語のロゴマークもやかんである。

公式サイトには[11]「この島から名前が付いたコトリン型駆逐艦というのがありますが、Kotlin 言語は別にクラスを駆逐しようというわけではありません」や、Java の由来がコーヒーであることにかけて「この島ではコーヒーなどの外来植物はあまり作っていないと思います」というジョークが掲載されている。

特徴[編集]

Java 言語よりも簡潔に書けることを目指している。

特徴的な機能は以下のとおり[12]

構文規則的な特徴はScalaに近く、文の末尾にセミコロンが不要であり、また「変数名 : 型名」の順序で変数を宣言する。型推論を様々な場面でサポートする。

ほかにも、性能と機能性を保ちながら安全性の確保や簡潔化を図るさまざまな工夫が凝らされている。

静的なNull安全の保証[編集]

Javaでは参照型変数がnullになりうるかどうかが構文上では分からず、NullPointerExceptionを防ぐためのnullチェックコードの記述が冗長になりがちだった。Kotlinでは、変数はデフォルトでnullを許容しない(非Null型: non-null type)[13]。以下のようにnullを代入しようとした場合、コンパイルエラーになる。

var str1: String = "hello!"
str1 = null // コンパイルエラー。
var str2: String = null // コンパイルエラー。

非Null型であれば、静的解析により非Nullが保証され、冗長なnullチェックは不要となる。

fun foo(arg: String) {
    // arg は null でないことが保証される。
    println(arg.length)
}

nullを許容する変数を宣言する場合、以下のように型名の後に?を指定する(Null許容型: nullable type)。

var nstr1: String? = "hello!"
nstr1 = null // コンパイル可能。
var nstr2: String? = null // コンパイル可能。

Null許容型変数に対してnullチェックを書かない場合、直接操作することができない。

fun bar(arg: String?) {
    println(arg.length) // コンパイルエラー。
    if (arg == null) {
        println("null")
    } else {
        println(arg.length) // コンパイル可能。
    }
}

安全呼び出し演算子 (safe call operator) ?.を用いると、変数がnullでなかった場合はメンバーにアクセスし、nullだった場合はnullを返す。

val len : Int? = nstr1?.length

エルビス演算子 (elvis operator) ?:を用いると、左式の評価結果がnullでなかった場合はその結果を返し、nullだった場合は右式の評価結果を返す。

val len : Int = nstr1?.length ?: -1

非Null表明演算子 (not-null assertion operator) !!を用いると、非Null型に強制変換することができる。

val str3 : String = nstr1!! // null だった場合は NullPointerException がスローされる。

演算子オーバーロード[編集]

Java では、数値をもつオブジェクト型変数同士の演算を、プリミティブ型のように「+」「-」「*」「/」などの演算子を用いた記法では行なうことができず、複数の演算を記述するにはメソッド引数に別のメソッドの戻り値を渡したり、メソッドの戻り値を用いて演算を次々とドットでつなぐ「メソッドチェイン記法」を用いたりする必要があったため、記述が長大になり直感性に欠けていた。Kotlinユーザー定義の演算子オーバーロード機能を採用しており、自然な四則演算式で記述できる(例えば、2つのBigDecimal変数についてBigDecimal.add(BigDecimal)メソッドを呼び出す代わりに、オペランドとして「+」でつないで加算できる)。演算子オーバーロードは C++ 言語にもあるが初心者が濫用するとミスを招く諸刃の剣との懸念もあり、Java では要望も強かったが採用されなかった。

import java.math.BigInteger

val b1 = BigInteger(Long.MAX_VALUE.toString())
val b2 = BigInteger(1.toString())
println(b1 + b2)

名前付き引数[編集]

関数には名前付き引数と既定値の機能がある[14]。これにより、関数をひとつ

fun edit(
    number   : Int,
    blankIf0 : Boolean = true,
    comma    : Boolean = true,
    maxSize  : Int = 18) {
    // some work
    ...
}

と定義するだけで、呼び出し側は

edit(number)
edit(number, comma = true, maxSize = 10)
edit(number, maxSize = 10, blankIf0 = true)

などのように、そのとき既定値から変えたい引数だけ選んで指定できる(Kotlin では「blankIf0=true」といった代入式は戻り値を返さないので、代入の戻り値を引数に与えているのかどうかという曖昧性は生じない)。Java では引数を順序で識別するのが基本で、一部のみ使うメソッドがあればオーバーロードで定義する、あるいは呼び出し前に既定値から変更する必要のあるフィールド値を順々にセットするなど、冗長で分かりにくい方法しかなかった。Kotlin では名前付き引数を採用したので、オプションの組合せをもつ機能が簡潔に定義・呼び出しできるようになった。

統合開発環境[編集]

同社提供の統合開発環境 IntelliJ IDEA で利用できる。EclipseNetBeansでもKotlinプラグインを提供している。Android StudioでもKotlinによるAndroidアプリケーション開発を標準でサポートしている(3.0以降)。

関連項目[編集]

脚注[編集]

[ヘルプ]

外部リンク[編集]