ASAHIネット(
[URL] )のjouwa/salonから。
---
型推論のことを簡単に。
静的な型付けと、動的型付けくらいは、知っているものとして。
[URL]静的型付け
[URL]動的型付け
静型付けは、強い型付け、コンパイル時型付けともいわれ、コンパイル時に型チェックをやって、型に反するエラーを検出して、バグを減らす考え。大規模開発だと特に有効といわれる。反面、自由度が低いので。実行時にいろいろ変化させたい、メタプログラミング的なことはやりにくい。
動的型付けは、弱い型付け、実行時型付けともいわれ、草分けは、Lispでしょうが、その後、多くのスクリプト言語も動的型付けをやっています。処理系の実装がやりやすいし、インタープリタ系は、大体、動的型付け。メリット・デメリットは、静型付けと逆。
静型付けの言語に、ジェネリスクス(Generics, C++でいえば、テンプレート)を入れると、話がややこしくなる。
たとえば、コンテナや関数宣言に型パラメータが必要になり、記述が複雑化する。
C++で、テンプレートを使ったとき、コンパイルエラーやデバッガで、訳がわからん型が表示されてうんざりした経験は、みんな、あると思います。
複雑な宣言を少なく、あるいはまったく不要にして、プログラマの負担を軽減して、あたかも、動的型付けの言語のように簡単に書けるようにするのが、型推論。
型推論自体は、関数型プログラミング言語で発達してきました。
オブジェクト指向と関数型のいいとこ取りのScalaは、最初から型推論があるので、JavaやC++に比べ、非常に少ない記述で、強力な型チェックがコンパイル時にできます。
最近のJavaやC++などは、ラムダ式といって、Lispでいうクロージャ(あるいは類似物)が書けるようになり、ライブラリの仕様も関数型プログラミングのスタイルを後押しするようになりましたが、その場で、簡単に関数リテラルが書けないとありがたみがありません。
関数リテラルを書くのに、型パラメータを指定してコンテナを書いたり、複雑な記述をしないといけないのでは、使う気が失せます。
使う気にさせるのが、型推論。
[URL]型推論
たとえば、JavaはJava 7から、ダイヤモンド・オペレーターによる型推論が入っていますが、この機能は、BorlandのJBuilderのコンパイラには、10年以上前から入っていたと記憶しています。Java 7でやっと正式対応。Java 8でラムダ式が入ったので、今後も、あれこれ、強化されるでしょう。
C++でも、C++11からラムダ式が入ったので、auto宣言による型推論が入っています。
C#にもありますし、最近の静的型付け言語は、ほとんど装備していると思います。
C++の型推論とautoについては、
Scott Meyers「Effective Modern C++ ―C++11/14プログラムを進化させる42項目」
の第1章、第2章が非常に詳しいです。
[URL]
Effective Modern C++ ―C++11/14プログラムを進化させる42項目
大型本 2015/9/18
Scott Meyers (著), 千住 治郎 (翻訳)
オライリージャパンにある紹介。
[URL]
Effective Modern C++――C++11/14プログラムを進化させる42項目
Scott Meyers 著、千住 治郎 訳
2015年09月 発行
Scott Meyersさんは、古きよきC++時代から、その解説に定評があります。
コンパイラが何をやり、どう推論するかのメカニズムや、型推論機能を最大限に生かして、型安全なプログラムを楽に書くには、どうすべきが詳しく書いてあります。
autoに任せず、自分で型を書いて、うっかりミスをすると、無駄なコードが生成され、実行時に無駄な実行が行なわれてしまう話も出てきます。
セコメントをする