Kotlin単語

20件
コトリン
6.9千文字の記事
  • 0
  • 0pt
掲示板へ

もしかして? → 音無小鳥

Kotlinとは、プログラミング言語の一つである。

概要

KotlinとはJava仮想マシン上で動作するプログラム制作できるプログラミング言語である。いわゆるJVM言語であるが、どちらかというとAndroidアプリ開発に重きが置かれている。バージョン1.1(2017年3月1日リリース)からはJavascriptへのトランスパイル公式サポートするようになった。

開発元はIntelliJ Ideaなどの各種言統合開発環境開発会社として知られるJetBrains社。

2016年2月17日バージョン1.0がリリースされた。2012年2月14日からオープンソース化されている。

Java(とJava仮想マシン)のリリースサイクルが半年ごとに変更されたか、2021年バージョン1.5から半年ごとexitローリングリリース方式になった。

命名の由来

JetBrains社はチェコ共和国に本社を置く企業だが、開発拠点をロシアサンクトペテルブルクにも有している。Kotlinはその拠点で開発されたので、サンクトペテルブルクの近くにあるKotlinにちなんで命名された。

"kotlin"自体はフィンランド語で「やかん」のこと[1][2]であり、日本語称っぽく聞こえるのはただの偶然である。

特徴

長所

JavaやScalaの反省を活かした言語仕様

デフォルトnullの回避を強制できる言仕様が最大の特徴だが、nullの回避方法などの文法がSwiftとかぶるとか言われたりする。

静的型付けJVM言語である点がScalaとかぶるが、言仕様が複雑になり過ぎないように「実用性を重視してバランスをとった」という点で差別化されており、JavaだけでなくScalaでの反省も踏まえた後発言ならではの設計になっている。

他のJVM言語同様、Javaライブラリシーレスに相互利用できる。記号だけのメソッド名がない分、ScalaよりもJavaからの呼び出しがやりやすい。

統合開発環境が使える

Kotlinレベルマイナーでは開発環境テキストエディタコマンドラインのみということもしくないが、JetBrains社が開発している言だけに、同社が開発しているAndroid StudioIntelliJ IDEAサポートされている。

短所

Android開発に引きずられた仕様

Android開発(Java6ベース)を念頭に置いてきた経緯があるため、標準ライブラリではAPIJava6ベースになっているところがある。たとえばPathやjava.timeのようなJava7以降に入ってきたものはkotlin標準ライブラリでは使われていない。Android開発環境Java7に対応したのも遅かった(2014年)し、Java8対応が始まったのはKotlinバージョン1.0のリリースよりも後なので仕方のないことかもしれない。

Java8のライブラリ普通に使用できるのでそれほど問題ないとはいえ、今後もAndroid開発への対応が足を引っることはあるかもしれない。

Javascriptへのトランスパイルネイティブコードへのコンパイルサポートする方針とのことだが、この仕様が足をひっぱったり、さらにはいつの間にかなくなっていたり(Scalaは初期に.Netへのコンパイルサポートしていたが、いつの間にかなくなった)するかもしれない。

他のIDEは事実上選べない

JetBrains社謹製のEclipseプラグインもあるが、2017年現在アルファ版で実用には耐えない。おまけAndroid公式採用が決まった2017年半ばからはほぼ開発が止まっている。まるでGoogleに採用してもらうアピールのために開発をしていたから用済みになったかのようだ。Android StudioIntelliJ IDEAを手がけるJetBrains社が、競合製品であるEclipseを送るわけにはいかないことを考えると、IDEの垣根を越えて普及できるのか疑問に残るところはある。

用途

Javaが "write onece, run anywhere" で徴されるような、同じコードで全ての環境に対応に対応可という方針をとっているのに対し、Kotlinは"(コードをそのまま使うことは出来ないが)Kotlinの文法さえ知っていれば、どの分野でも対応したコードが作成可"といったレベルしているようだ(Kotlin1.2のリリースあたりからその方針が特に明確になった)。

Android開発

Android開発の標準IDEであるAndroid Studioサポートされている。最もサポートが手厚く、成功しているといえる分野。2017年5月17日Android OS開発元であるGoogleもKotlinをAndroid公式開発の一つとして採用すると発表した(Javaの採用を止したわけではない)。

2019年5月7日にはGoogleがKotlinをAndroidの推奨開発に格上げした。

Kotlin/JVM

traitのようなJavaにない概念があるScalaと異なり、単一継承であるclassと、実装を持たないことがある抽クラスinterfaceという切り分け方はJavaと同じである(ベータ時代にはtraitがあったが、正式版になる前に止された)。

また、メソッド名への記号使用を原則禁止しているためScalaのような記号演算子をJava側でどう対応させるかという問題もほとんど生じない。

こういったことにより、JavaとKotlinはクラスインターフェイスメソッドが一対一に対応しており、両者を混在させて開発することすら可となっている。

また、Android StudioIntelliJ IDEAにはJavaコードをKotlinのコードに変換する機がある(ただし、nullの扱いが悪いとなかなか手直しなしでは動かないらしい)。

Kotlin script

.ktが標準の拡張子だが、.ktsという拡張子にしてスクリプトとして実行することも可である。

Gradle

ソースコードを実行ファイルにする過程をビルドというが、JavaビルツールAnt, Mavenについで普及してきたものにGradleがある。

GradleのビルスクリプトGroovyという別のJVM言語で記述されてきたのだが、2016年8月からGroovy以外にKotlinスクリプトで記述することも可になった。

初期にはIDEなどの支援がなかったため、Kotlinでビルスクリプト書かれることはほとんどなかったが、2018年11月26日リリースGradle 5.0からはKotlin DSLが実験的扱いから正式にバージョン1.0となり、使用例も増えつつある。

Kotlin/JS

前述のようにJavascriptトランスパイルすることができるので、Webアプリ開発に用いることもバージョン1.1以降は視野に入ってくると思われる。

ただ、この分野ではTypescriptに大きくをあけられており、いらない子になる可性も否定できない

Kotlin/Native

バイトコードでもJavascriptでもなく、Java仮想マシンなしでも動くネイティブコード(通常のバイナリ)を生成するプロジェクトコンパイルにはLLVMを用いている。

JVM用のKotlinのコードJava仮想マシンなしで動かすことは目標としておらずexitJavaライブラリも使えない。

ターゲットiOSアプリ開発らしい。これが実現すればJVMが動くデスクトップOSWindows, Mac, Linuxに加え、モバイルOSAndroid, iOS、さらにはJavascriptトランスパイルによるWebブラウザ上での動作と、ほぼ全てのプラットフォームをカバーすることになる。

2017年5月12日バージョン0.2が出た後もバージョンアップを重ねていたが、Kotlin本体のバージョンが1.3になったのに伴い、Kotlin/Nativeのバージョンも1.3に引き上げられた。しかし製品開発に耐えるとされるProduction Readyの表示は2019年10月の段階でもまだなされていないようである。

Webフレームワーク

Springexit: Javaで実績のあるフレームワークだが、Kotlinもサポートするようになった。

Ktorexit: Kotlin公式プロジェクトではないが、Kotlin開発元のJetBrains社公式プロジェクトれてしまったWasabiKaraといったフレームワークに代わってサーバーサイドプログラミングしているらしい。

サンプルコード

Hello World

fun main() = println("Hello, World!")

FizzBuzz

KotlinでFizzBuzz

パズルゲームのソルバ

ロボットにこころを」というパズルゲームの解法探索プログラムこちら(ネタバレ注意)

Kotlin/JS

ニコニコ大百科:グラフ機能にはKotlin/JSを用いている → バージョン1.0のソースコードこちら

関連動画

関連商品

右上の本はKotlinの言開発メンバーが著者(なので「プログラミング言語Kotlin」的な位置づけ)らしい。

外部リンク

関連項目

細かい長所と短所

静的型付けJVM言語ということでJavaScalaとの較になるが、細かい特色を挙げていく。「〜できない」という点は便宜上短所に分類した場合が多いが、見方次第で長所にも短所にもなるのはどの言でもいえることである。

Kotlin独自のもの

長所 短所
デフォルトnull安全。 ただし、Javaから持ち込まれたクラスメソッドについてはnull安全の保なし。
継承に頼らないdelegateを文法でサポート クラスメソッドデフォルトでは継承不可。
クラスの外(トップレベル)で関数定義が可main()トップレベル関数 this省略すると、トップレベル関数なのかメソッドなのか、見ただけではわかりにくい。
関数で、クラスメソッドが追加されたかのように扱うことが可 関数は演算子のオーバーロードには使えない。
また、クラスAPIドキュメントを読んでもクラス外に定義された拡関数情報は見落とすおそれあり。
関数により柔軟なDSL構築と、そのDSLによる構造化された記述が可 DSLのネストが深くなると、省略したthisが意図しないレベルthisしていても気づけない。
関数リテラルの書き方にラムダ式関数の2種類があり、returnの挙動などが同一ではないため、使い分けることを強いられているんだ!
並列処理はスレッドより軽量なコルーチンが使える。 kotlinx.coroutinesライブラリが別途必要。

Scalaと似ているがやや異なるもの

長所 短所
プリミティブはないので、ジェネリクスなどでも全てオブジェクトとして統一的に扱える。 Javaプリミティブ配列のために専用のクラスがある。
反復処理できるものに、ArrayとListとSequenceとRangeがあり、お互いは継承関係にないため、せっかくintIntegerの区別がなくなったのに、関係がより複雑になっている。
高階関数による柔軟なプログラミング apply, let, runとか、fold, foldIndexed, foldRight, reduceとか、似たような機をもつ関数が多数あって紛らわしい。
行末のセミコロン省略Pythonなどのようなインデント改行の制限もほとんどない。 その代わり、ラムダ式などに括弧省略できないところが多い。
演算子は四則演算・較などだったもののみ定義
不便に見えるが、Scalaのように一見して何に使うかわからない記号メソッドが溢れかえることはない。
独自の記号演算子は定義できない。
黙示の変換は行われないので、コードを見ていてが分からなくなることは少ない。 BigIntegerやBigDecimalのリテラルがない上に、黙示の変換もないので、せっかく演算子は記号で短く表現できても、数値はBigInteger(3)といった冗長な表記をしなければならない。
バージョン1.1からエイリアスが導入された。 各自が勝手にの別名を導入すると、コードを見ていてが分からなくなるおそれがある。
ヒアドキュメント(raw string)方式でエスケープ処理なしで文字列が書ける。それでも、変数の埋め込みが可 ヒアドキュメント方式でも変数埋め込みを許可したため、'$'だけはエスケープ処理が必要という中途半端な仕様になっている。
PairやTripleがあり、複数の値を返すことは可 タプルはないので、4つ以上の数の値を返す場合にはdata定義することになる。ただし、定義は1行で済ませることもでき、Javaのようにクラスを作るよりは大分手軽である。
ブロックの最終行の値を返すreturnが文脈によって必須だったり不要だったりしてややこしい(Javaは一貫して必須、Scalaは一貫して省略)。
Scalaのtraitはないが、Java8同様interfaceデフォルト実装を持てるので、それほど大きな違いはない。
公式Javascriptへのトランスパイルサポート(Scala.jsexitJSweetexit非公式) APIドキュメントJVM向けとJavascript向けの情報が混在してカオス

Scalaとかぶるもの

長所 短所
プロパティによりgetterやsetterが不要。
変数の宣言にvar(変更可)とval(変更不可)があり、ListなどのCollectionもデフォルトではイミュータブル。(Scalaと同じ) Listがイミュータブルなのはいいが、MutableListがListを継承しているために、List変数のところにMutableListを代入できてしまう。(Scalaとはやや異なる)
ちなみに、非JVM言語を含めて要言チェック例外があるのは後にも先にもJavaだけらしい。 例外は全て非チェック例外なので、Javaの安全機構をスルーする可性がある。
tailrecをつければ末尾再帰最適化が可 えっ? 最適化ってコンパイラ仕事じゃないの?
inlineで関数などをインライン展開して最適化が可 えっ? 最適化って(ry

ちなみに、かつては公式サイト(英語)に「Scalaとの較」というページがあり「もしScala幸せなら、あなたにKotlinは不要である」と書かれていたが、Kotlin 1.1のリリース前後にページごと消えてしまった。

スコープ関数早見表

Kotlinには、関数(メソッド)を引数に取り、オブジェクトメソッドを適用して、値を返す拡関数定義されている。スコープ関数と呼ばれるこれらの関数は、用途によりalso, apply, let, run, use, withと細かく分かれている。区別して覚えられないから一本化してもらえないだろうか。拡関数関数の継承関係とかを使えばできそうな気がするのだが。

これらの高階関数自体が高階関数引数になったりとか、これでメソッドを数珠つなぎにして適用したりとか。

戻り値 引数に取る関数メソッド
関数ラムダ式 メソッド・拡関数
オブジェクト自身[3] T.also() T.apply()
オブジェクト関数(メソッド)を
適用した戻り値[4]
T.let()
T.use()[5]
T.run()
with(T)
引数をとらない関数の戻り値 run() -[6]

"T."で始まるものは拡関数。そうでないものは通常関数

脚注

  1. *実際を上から見るとやかんのような形exitをしている。
  2. *Google翻訳によるとフィンランド語で「やかん」は"kattila"となっており、また、「Kotlin(ロシア領)」がロシア名で、フィンランド語ではKotlinをレトゥサーリと呼んでいることから考えると、"kotlin"はロシア側の領土になる13世紀より前の古いフィンランド語なのかもしれない。
  3. *引数に取った関数戻り値は捨てていることになる。JavaのList.add(戻り値はリストに要素の追加が成功したらtrue失敗したfalse)のように、戻り値は利用せずに副作用などを的とした関数引数にするのがな用途ということになる。
  4. *戻り値がUnitというのもアリ
  5. *Java7のtry-with-resourcesに相当。
  6. *そもそもオブジェクト自身すら引数にとらないメソッドや拡関数定義することはできない。

【スポンサーリンク】

  • 0
  • 0pt
記事編集 編集履歴を閲覧

ニコニ広告で宣伝された記事

この記事の掲示板に最近描かれたお絵カキコ

お絵カキコがありません

この記事の掲示板に最近投稿されたピコカキコ

ピコカキコがありません

Kotlin

1 ななしのよっしん
2018/08/31(金) 10:08:38 ID: Ont5YF4i/L
ちょっとでも手間を削りたい系プログラマー布教して個人的プログラム組むのに使ってるっぽいな。
個人的には、地味い共和製なのがポイント高い。
👍
高評価
0
👎
低評価
0
2 ななしのよっしん
2019/02/03(日) 18:54:00 ID: AjZyjMyoiz
よくも悪くもAndroidアプリ開発特化言で、Java駄に面倒なところをいかに回避するかみたいな特性。言としてはそれ程すごいわけじゃないが、Android+Javaという環境自体がアレ過ぎるので救世主になれる感。
👍
高評価
0
👎
低評価
0
3 名無し
2020/01/12(日) 00:47:57 ID: r61Y00B0qd
新規実装Kotlinを使ってる。
慣れると既存のJava領域触るのが凄く億劫でイライラするし仕事もテキトーになる魔の言
👍
高評価
0
👎
低評価
0
4 ななしのよっしん
2020/01/15(水) 21:54:16 ID: FQtULNAjRO
普及が進んでいる気がしないのは何故だ
👍
高評価
0
👎
低評価
0
5 ななしのよっしん
2021/05/25(火) 00:13:41 ID: C/1EaX7IGd
Android世界の外にいるから?
👍
高評価
0
👎
低評価
0