概要
- Elixir v1.20 で新しい型システムの開発マイルストーンを達成
- 型推論と漸進的型チェック を型アノテーションなしで実現
- dynamic()型 により既存コードのバグやデッドコードを自動検出
- 型システムの目標 ・dynamic()型の特徴・今後の展望を解説
- コンパイル高速化 や今後の型シグネチャ導入計画も紹介
Elixir型システムの進化とdynamic()型の役割
- 2022年、 set-theoretic types 導入の取り組みを発表
- 2023年6月、 Elixirの型システム設計論文 を発表し、研究から開発フェーズへ移行
- Elixir v1.20 で、型アノテーション不要の型推論と漸進的型チェックを実装
- 既存コードの デッドコード や 検証済みバグ (実行時に確実に失敗する型違反)を自動検出
- 開発者の負担増なし、 極めて低い誤検出率
- dynamic()型 の導入
- 他言語のany()型と異なり、 互換性(compatibility) と 絞り込み(narrowing) の性質を持つ
- 型がdisjoint(交わらない)場合のみ型違反を報告し、 誤検出を最小化
- 型情報を保持しつつ、コードの流れで型を絞り込む ことで、実用的なバグ検出を実現
dynamic()型による型推論とバグ検出
- dynamic()型は 実行時に型が決まる 変数や式に付与される
- 例:
value_or_error = if value > 1, do: value, else: "not well"- 型は
dynamic(integer() or binary()) /演算子やString.upcaseの呼び出し時、型が交わるため違反を報告しない
- 型は
Map.fetch!(value_or_error, :some_key)- 受け入れ型がmap、渡す型がinteger/binaryで disjoint なため型違反を検出
- 型の絞り込み(narrowing)
- 例:
def add_a_and_b(data), do: data.a + data.b- dataは最初dynamic()型だが、フィールドアクセスで
%{..., a: number(), b: number()}型に絞り込み - 誤った記述(
data.a + dataなど)で型違反を適切に検出
- dataは最初dynamic()型だが、フィールドアクセスで
- 例:
- 他言語のgradual type systemと異なり、 dynamic()型でも型情報を保持し続ける ため、精度の高いバグ検出が可能
型ガード・条件分岐・標準ライブラリ関数の型推論
- ガード節 での型推論
when is_list(x) and is_integer(y)→ xはlist、yはintegerwhen is_binary(x) or is_integer(x)→ xはbinaryまたはintegerwhen is_map_key(x, :foo)→ xは:fooキーを持つmapwhen not is_map_key(x, :foo)→ xは:fooキーを持たないmap
- データ構造のサイズ判定
when tuple_size(x) < 3→ xは2要素以下のtuple- listsやmapsも 空判定 に変換し型推論
- case文や条件分岐 での型の絞り込み
- 例:
case System.get_env("SOME_VAR") do ... end- nilとbinary()を適切に分岐し、後続の型違反を防止
- 不要な分岐やデッドコードの検出 にも寄与
- 例:
- 標準ライブラリ関数 (tuples, maps等)も型付けを強化
コンパイル時間の改善と新オプション
- Elixir v1.20 はマルチコア環境での コンパイル速度 をさらに向上
- BEAM系言語で最速レベルのビルドツール
- 新しいコンパイラオプション
:module_definition:compiled(デフォルト)または:interpretedを選択可能- 大規模プロジェクトでの ビルド時間短縮 に寄与
mix.exsでelixirc_options: [module_definition: :interpreted]を設定
今後の展望と型シグネチャ導入への課題
- 型シグネチャ(型注釈)導入は未定
- v1.20の型システム性能に満足できるか
- 再帰型 ・ パラメトリック型 ・ mapのkey-value走査 の効率的実装が前提
- これらの課題解決後、 typed struct定義や型シグネチャ の検討・導入を開始予定
- 最新情報はElixir Forumや公式ニュースで随時発信
まとめ・コミュニティへの呼びかけ
- Elixir v1.20 で型推論・型チェックの新しい体験を提供
- 既存コードのバグ検出・デッドコード排除を 自動化し開発効率を向上
- リリース候補のテスト・フィードバック・ベンチマーク提供にコミュニティへ感謝
- Elixir v1.20を試し、検出されたバグを修正しよう