2009-11-28 (土)
最近のJavaVMのJITコンパイラやMSILの実行時最適化ってどの程度やってくれるんでしょう?少し調べたけど,良い資料が見つからなかった.
なんとなく,JITとかだと高度な最適化はしにくいから遅そうというイメージがあるんですが.もしかしたら,実行するCPUに合わせてSSE命令とか駆使してくれるのかもとか,期待したいのですが,実際のJavaや.NETのアプリケーションの動作を見ていると,あんまり期待できない.
ベンチマークレベルではなくて,どんな処理がどのような命令列に変換されているのかまで見ておきたい.間に中間コードがあるので,ソースコードと対応付けるのが面倒だと思ってたけど,VisualStudioは,CLI使っててもアンマネージドなコードまでデバッガで見られるっぽいので暇があったらやってみよう.
*Visual Studio 2010 Beta2
インストールする.Beta1をインストールしてあったんですが,殆ど使う間もなくBeta2が出ていたのでインストールして試してみる.
とりあえず,C++,C#,F#を入れておきました.
まずは自分に一番影響がありそうなC++で様子を見る.
リアルタイムで構文チェックされる
eclipseみたいに,プログラムを書くとその場で構文チェックされます.
赤の波線が出るので,コンパイルしてみるまでもなく,文法エラーが発見できるのは良い.
static_assert
static_assertが使えます.
コンパイル時に静的なチェックを入れられるので結構便利.非対応コンパイラの場合はマクロで無効にするとかが妥当かな.
decltype
decltypeも使えます.
関数の型が欲しくなったときに威力を発揮しそうです.DLLを動的に読み込むときに,GetProcAddressを使うときとか,decltypeがあるととても良さそう.というか,もっと早く欲しかった.
lambda
無名関数も使えます.
ただ,構文が無理やりだなぁ.なるべく現行のコードに影響を与えないようにという配慮だろうけど,ちょっとなぁ.
auto
autoに新しい意味が加わりました.予約語増やしたくないからって,一つの語の意味を増やすのはどうかと.これでイテレータも怖くありません.
ただ,
auto main() -> int{return 0;};
は,エディタ上だとエラーになりますね.コンパイルは通るようですが.なんか,トップレベルでauto使うと怒られるようです.Cのautoを引きずっているのかとも思いましたが,関数内なら,static autoとかやっても大丈夫なので,何か間違っているのかなぁ.
残念なところ
以下のものは期待していたのに使えない.
- using default
- 文字列リテラルの拡張