Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlin言語仕様書へ招待 〜コード「なぜ」を読み解く〜

Kotlin言語仕様書へ招待 〜コード「なぜ」を読み解く〜

「Kotlin Fest 2025」の登壇資料です。
https://2025.kotlinfest.dev/

Avatar for LINE Digital Frontier  - TECH

LINE Digital Frontier - TECH

November 01, 2025
Tweet

More Decks by LINE Digital Frontier - TECH

Other Decks in Technology

Transcript

  1. ▼ 名前 
 3 本田 雄亮
 ▼ 所属企業  
 LINE Digital

    Frontier株式会社
 ▼ Xアカウント  
 @yyh_gl

  2. 1. Kotlin言語仕様書の概要 2. 言語仕様書の読み方 3. 仕様解説 a. Type System &

    Built-in types b. Overload resolution 4. 「へぇ〜」な仕様紹介 5. まとめ 6 アジェンダ

  3. 本発表の資料作成にあたり
 貴重なアドバイスをいただいたJetBrains社のMarat Akhin氏、
 ならびに発表練習にお付き合いいただいたLINE Digital Frontier社の
 同僚の皆様に心より感謝申し上げます。
 (犬の絵を描いてくれた妻にも)
 
 


    I would like to thank Marat Akhin of JetBrains for his valuable advice
 for this presentation and my colleagues at LINE Digital Frontier
 for their support with the presentation practice.
 (Also, my wife for drawing the dog illustrations.)
 7 謝辞|Acknowledgments

  4. Kotlin/kotlin-specリポジトリのREADMEに以下の記述がある。 
 原文:
 > This repository contains the specification of

    the Kotlin programming language, 
 > which describes how parts of the language should function in more detail, 
 > as compared to a more traditional user documentation on the Kotlin Website. 
 日本語訳:
 > このリポジトリにはプログラミング言語 Kotlinの仕様が含まれており、 
 > Kotlinの公式サイトにある従来のユーザードキュメントと比較して、 
 > 言語の各部分がどのように機能するかをより詳細に説明しています。 
 13 他ドキュメントとの違い
 言語仕様書はより詳細な仕様を知るさいに参照すべきドキュメント 

  5. 原文:
 > It would be most useful to those who

    are interested 
 > in how Kotlin works on a finer level and how its features interoperate, 
 > e.g., language enthusiasts, compiler writers and Kotlin power-users. 
 > However, if you are simply wondering, 
 > why some code you wrote works the way it does, 
 > this specification might help you get an answer to that. 
 日本語訳:
 > 言語仕様書は、Kotlinの詳細な動作や機能の相互運用に興味がある人々、 
 > 例えば、言語愛好家、コンパイラの開発者、Kotlinの上級ユーザーにとって最も有用です。 
 > しかし、単に自分が書いたコードがなぜそのように動作するのか疑問に思っている場合、 
 > この仕様書がその答えを見つけるのに役立つかもしれません。 
 14 みんなに読んでほしい言語仕様書

  6. 原文:
 > It would be most useful to those who

    are interested 
 > in how Kotlin works on a finer level and how its features interoperate, 
 > e.g., language enthusiasts, compiler writers and Kotlin power-users. 
 > However, if you are simply wondering, 
 > why some code you wrote works the way it does, 
 > this specification might help you get an answer to that. 
 日本語訳:
 > 言語仕様書は、Kotlinの詳細な動作や機能の相互運用に興味がある人々、 
 > 例えば、言語愛好家、コンパイラの開発者、Kotlinの上級ユーザーにとって最も有用です。 
 > しかし、単に自分が書いたコードがなぜそのように動作するのか疑問に思っている場合、 
 > この仕様書がその答えを見つけるのに役立つかもしれません。 
 15 みんなに読んでほしい言語仕様書
 プログラミング言語が好き、 Kotlinが好きという方は 一度読んでみることをおすすめします! 「こんな書き方できたんだ」 「こんな機能があったんだ」 新しい発見にきっと繋がるはずです
  7. プラットフォームによっては仕様書と異なる実装が存在するので注意が必要。 
 16.1 Catching exceptionsには以下の記述がある。
 > the applicability check is

    subject to Kotlin runtime type information limitations and
 > may be dependent on the platform implementation of runtime type information, 
 > as well as the implementation of exception classes .
 > 適用性チェックはKotlinのランタイム型情報の制限の影響を受ける可能性があり、
 > プラットフォームのランタイム型情報の実装や例外クラスの実装に依存する場合があります 。
 
 
 本発表でサンプルコードを示すときは、
 基本的にJVMプラットフォームの仕様に準拠したコードを記載する。
 19 Kotlin言語仕様書の注意点②

  8. 24 for文の表記法を読み解く
 • {NL}:改行が0回以上繰り返される
 • {annotation}:アノテーションが0回以上繰り返される
 • (variableDeclaration | multiVariableDeclaration):


      variableDeclarationまたはmultiVariableDeclarationのどちらか
 ◦ variableDeclaration:変数宣言 
 ◦ multiVariableDeclaration:複数変数宣言 
 • expression:式
 • [controlStructureBody]:
   制御構造の本体が
   0個または1個

  9. 仕様は数学的表現を使って説明されている。
 例えば、数学記号で言うと以下のものが登場する。
 • ∀(全称記号)
 ◦ 「すべての」という意味 
 ◦ e.g. ∀x:P(x)

    は「すべてのxについてP(x)が真である」という意味 
 • ∃(存在記号)
 ◦ 「少なくともひとつは存在する」という意味 
 ◦ e.g. ∃x:x²=4 は「x²=4が成り立つxが少なくともひとつは存在する」という意味 
 • ∈(属する)
 ◦ 「属する」という意味
 ◦ e.g. x∈A は「xはAに属する」という意味 
 数学が苦手でも生成AIのサポートを受けながら読めば結構理解できる。
 29 あると良い知識

  10. 関数呼び出し時にデフォルト引数が使用されていない引数について
 "型がX₁~Xₙである関数F₁"および"Y₁~Yₙである関数F₂"を対象に
 • Xₖ <: Yₖという制約を設定
 ◦ A <: B:「AはBのサブタイプである」という意味

    
 ◦ 型XおよびYがbuilt-in integer types の場合は特別な制約が適用される 
 ◦ 型パラメータに対する処理も別途あるが簡素化のため省略 
 • 拡張関数については拡張対象(レシーバー)も引数として考え型制約に追加
 • 宣言されている型制約を追加
 46 型制約の構築

  11. • 「1. F₁はF₂よりも具体的な関数である」場合: 
 ◦ 2つの候補に関して、より具体的な関数が見つかったので追加の手順はない 
 
 • 「2.

    F₁もF₂も他方より具体的な関数ではない」場合: 
 ◦ 型パラメータを持たない関数の方がより具体的であると判断 
 
 • 「3. F₁もF₂も他方より具体的な関数である」場合: 
 ◦ 型パラメータを持たない関数の方がより具体的であると判断 
 ◦ 各候補について関数呼び出し時にデフォルト引数が使われている数をカウントし 
 カウント数が少ない候補をより具体的であると判断 
 ◦ 可変長引数を持たない候補はより具体的であると判断 
 
 • それでも最終候補が決まらない場合: 
 ◦ ラムダ式の戻り値型を使用して絞り込む 
 ◦ それでも最終候補が決まらなければ「オーバーロードの曖昧性」として 
 コンパイルエラーとする
 48 オーバーロード候補を絞り込む追加の手順

  12. 50 F₁およびF₂について構築される制約
 • 󰢏 Boolean <: Any
 • 󰢏 String

    <: String
 • 󰢏 Int <: Number
 • 󰢏 T <: K ▶ 制約の検証結果:すべての制約を満たせる 
 • 󰢏 T <: Comparable<T> (KはAnyとみなすことができる)
 最も具体的な関数の選択 例1

  13. 関数呼び出し時にデフォルト引数が使用されていない引数について
 "型がX₁~Xₙである関数F₁"および"Y₁~Yₙである関数F₂"を対象に
 • Xₖ <: Yₖという制約を設定
 ◦ A <: B:「AはBのサブタイプである」という意味

    
 ◦ 型XおよびYがbuilt-in integer types の場合は特別な制約が適用される 
 ◦ 型パラメータに対する処理も別途あるが簡素化のため省略 
 • 拡張関数については拡張対象(レシーバー)も引数として考え型制約に追加
 • 宣言されている型制約を追加
 51 最も具体的な関数の選択 例1

  14. F₁とF₂を入れ替えて構築される制約
 • 󰢃 Any <: Boolean
 • 󰢏 String <:

    String
 • 󰢃 Number <: Int
 • 󰢃 K <: T
 • 󰢏 T <: Comparable<T> ▶ 制約の検証結果:すべての制約を満たせない 
 52 最も具体的な関数の選択 例1

  15. F₁およびF₂について構築される制約
 • 󰢏 String <: T
 • 󰢃 Any <:

    String
 ▶ 制約の検証結果:すべての制約を満たせない 
 55 最も具体的な関数の選択 例2

  16. 関数呼び出し時にデフォルト引数が使用されていない引数について
 "型がX₁~Xₙである関数F₁"および"Y₁~Yₙである関数F₂"を対象に
 • Xₖ <: Yₖという制約を設定
 ◦ A <: B:「AはBのサブタイプである」という意味

    
 ◦ 型XおよびYがbuilt-in integer types の場合は特別な制約が適用される 
 ◦ 型パラメータに対する処理も別途あるが簡素化のため省略 
 • 拡張関数については拡張対象(レシーバー)も引数として考え型制約に追加
 • 宣言されている型制約を追加
 56 最も具体的な関数の選択 例2

  17. F₁とF₂を入れ替えて構築される制約
 • 󰢃 T <: String
 • 󰢏 String <:

    Any
 ▶ 制約の検証結果:すべての制約を満たせない 
 57 最も具体的な関数の選択 例2

  18. 関数呼び出し時にデフォルト引数が使用されていない引数について
 "型がX₁~Xₙである関数F₁"および"Y₁~Yₙである関数F₂"を対象に
 • Xₖ <: Yₖという制約を設定
 ◦ A <: B:「AはBのサブタイプである」という意味

    
 ◦ 型XおよびYがbuilt-in integer types の場合は特別な制約が適用される 
 ◦ 型パラメータに対する処理も別途あるが簡素化のため省略 
 • 拡張関数については拡張対象(レシーバー)も引数として考え型制約に追加
 • 宣言されている型制約を追加
 61 最も具体的な関数の選択 例3

  19. 本日の振り返り
 71 • Kotlin言語仕様書を紹介 ◦ 詳細な仕様が記載されている ◦ EBNFベースの表記法で文法を定義 ◦ 数学的表現で仕様を説明

    • Kotlinの仕様をいくつか紹介 &解説 ◦ 型システム & 組み込み型 ◦ オーバーロード解決 ◦ 「へぇ〜」な仕様たち
  20. Kotlinにおける関数はfirst-class functionであり、変数として扱ったり 
 他関数の引数として渡したりできる。 
 first-class functionを表現するためにKotlinでは関数型が用意されている。 
 関数型FTは以下の通り表現できる。 


    FT(A₁,...,Aₙ) → R
 • Aᵢ:引数の型
 • R:戻り値の型
 レシーバ付き関数型もある。 
 FTR(RT,A₁,...,Aₙ) → R
 • RT:レシーバの型
 • Aᵢ:引数の型
 • R:戻り値の型
 75 関数型とは