読者です 読者をやめる 読者になる 読者になる

型推論のコスト

.NET

まさたか日記より.

C# 3.0の型推論の実行コストはどの程度か?

コストはゼロだと考えられる。というのも結局、これはコンパイラが型を推論できればよいわけで、コンパイル時の問題だからだ。またコンパイル自体も瞬間的なことで大したコストにはならない。

私は今日読んだのですが。。。先日から話題になっていたヘジルスバーグ来日シリーズの中の一コマ。リフレクションや検索ループが最近のフレームワークの普通量以上はあるMayaaの次のマイナーorメジャーバージョンで、どうしたものか考えています。やっぱり基礎技術として、Javaコンパイル時にフレームワーク都合のリフレクション軽減、異種混合パーサーが先かな。。。コンパイル時の型推論で爆発するかもという懸念は人任せなんですが。。。

聞いてみた張本人です.C# の言語仕様は C++ に比べ IntelliSense Friendly なのが特徴のひとつだと思っているので*1,IntelliSense のパフォーマンスに影響しそうな型推論のコストについてとりあえず聞いてみた,という感じです.(似たような質問をもうひとつしようとして途中で混乱してしまい,大事な時間を浪費してしまって後で激しく後悔したというのは余談というか詳しくは今度書きます)
あの場での Anders からの回答は「ほとんど0」ということだったのですが,後で別の方に「構文上の影響範囲が限られていることと,C#高階関数が無いことを考えると型推論で有意にコストが爆発するということはないだろう」(意訳)という話を伺いました.学部時代なら周りに専門家が沢山居て聞き放題・自転車数分で専門の図書館行き放題だったのが悔やまれます.
個人的な意見としては,ある新機能が言語仕様に追加されるとしても,その機能を十分に活用した結果プロジェクト末期に開発環境の使用感が大きく悪化する,例えば IntelliSense のレスポンスが 50% 程度悪化するようであれば,むしろそういう機能は追加しない方が良いと思っています.これは C++ について,プロジェクト初期に感じたコンパイルコストとプロジェクト末期に感じるコンパイルコストにずいぶん隔たりがあったという経験にも関係しています.
インタビューで何度か登場した関数型言語にしても,例えば「関数型らしく」書いた結果コンパイルに4GBのメモリと30分の時間を消費してしまうのが当たり前ということになれば,いくら生成されたコードがバグがなくて高速に動作しても Visual C#/Basic に取って代わるということは当面あり得ないでしょう.(いわゆる上流工程への導入が先でしょう)

*1:IntelliSense の内部実装については波村さんのこの記事などが参考になります.http://www.users.gr.jp/blogs/daigoh/archive/2004/04/16/2039.aspx