型推論

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。Loxyplst (会話 | 投稿記録) による 2012年1月4日 (水) 00:33個人設定で未設定ならUTC)時点の版 (C++0x → C++11)であり、現在の版とは大きく異なる場合があります。

型推論(かたすいろん)とはプログラミング言語の機能の1つで、静的な型付けを持つ言語において、変数関数を宣言しなくてもそれを導くのに使われた関数の型シグネチャなどから自動的に型を決定する機構のこと。主に関数型言語で用いられる。

推論に失敗するとその時点でエラーを報告できるため、少なくとも誤った型を用いる事によるバグは回避できる。また、記述をアルゴリズムに集中できるのでプログラムの抽象度が上がるというメリットもある。

代表的な型推論アルゴリズムとして、Hindley/Milner 型推論アルゴリズムがある。各々著名なコンピュータ科学者の名前からつけられた名前であるが、Hidley は論理学者として型推論システムを先に開発した。

型推論を持つ言語としてはHaskellMLValaC#ScalaObjective CamlD言語Concurrent CleanC++11などがある。Javaでも導入が検討されている。静的型付け関数型言語のほとんどが型推論の機能を持っている。

非技術的な説明

ほとんどの言語においては、関数仮引数および戻り値ローカル変数等は、それらがもつデータの種類を表すをもつ。実行時にならないと型がわからない言語を動的型付けの言語という。一方、コンパイル時に型がわかる言語を静的型付けの言語という。静的型付けの言語において、関数の仮引数および戻り値の型やローカル変数の型は、通常は明示的に表記する必要がある。例えば、次はC言語の例である。

int addone(int x) {
    int result;

    result = x+1;
    return result;
}

関数定義の最初の行int addone(int x)では、addoneは整数一つを入力としてとり、整数を結果として出力する、と宣言している。int result;の行では、ローカル変数resultが整数型であることを宣言している。

型推論の機能がある言語では、例えば次のように書くことができるだろう。

addone(x) {
    var result;

    result = x+1;
    return result;
}

この書き方は動的型付けの言語に非常によく似ているが、しかしながらすべての型はコンパイル時に定められる。この仮想的な例では、+演算子は常に二つの整数を一つの整数に変換する。これから、x+1の値が整数であることが型推論によって推論される。故にresultの型は整数であり、addoneの返り値が整数であることがわかる。同様に+演算子が入力として整数をとることからxが整数であることがわかり、addoneの引数の型が整数であることがわかる。

動的型言語における型推論

動的に型付けを行う言語の場合、文法的には型付けが行われず、あらゆる型の可能性を考慮して処理を進める必要があるため、処理が遅くなる原因となる[1]JITコンパイラによって高速化を図る場合、型推論によりあるデータを「特定の型」として扱うことが可能であれば、その型に合わせた処理だけをすることで高速化が行える[1]

とりわけ、高速化が特に求められている[2]WebブラウザJavaScript分野では、2011年12月20日にリリースされたFirefox 9で型推論技術を採用している[3]

脚注

  1. ^ a b Type Inference brings JS improvements to Firefox Beta Brian Hackett, 2011年11月10日(2011年12月24日閲覧)。
    型推論により Firefox Beta の JavaScript が高速化しました(上の記事の和訳)、2011年12月24日閲覧。
  2. ^ 一色政彦 (2011年4月22日). “Internet Explorer 9正式版レビュー”. @IT. 2011年12月24日閲覧。
  3. ^ Mozilla、「Firefox 9」の正式版をリリース 「型推論」技術で45%高速に”. ITmedia (2011年12月21日). 2011年12月24日閲覧。