2007年10月26日金曜日

C++/CLIって何気に凄くない?

ようやく今日論文を提出しました。おかげで多少は楽になる・・・と、いいな。まぁ、まだ発表当日の資料作成とかが残っているので楽にはなりそうにないけれどOrz
それはそれとして、シミュレーションプログラムにて、条件を変えてのシミュレーションが増えてきました。で、毎度パラメータを書き換えてビルドし直すのも手間なので、パラメータは外部から与えられるようにしようかなと画策中。
その変更自体はどうってことないのですが、どうせやるならコマンドラインではなくGUIで変えたいところ。デフォルト値とか設定しておけるしね。
で、GUI作るなら.NETが楽でいいじゃろーと思って、C#で組もうかと思ったのですが、内部のルーチンはネイティブのC++で動かさないと遅いわけで、はてどうしようかと。
MSとしては、高速に動作させたい部分はネイティブのC++で、GUIは.NETでと考えているらしいです。で、その橋渡しをするのがC++/CLIというわけらしい。C++/CLIならマネージドな部分とアンマネージドな部分を混在できます。
と、一応知っては居たのですが実際どんな風に記述して、どういった挙動を取るのか分からなかったので、こないださわりだけやってみました。
いや、あれすっごく面白いですね。VC++2005EEにて、Win32で作っていたプロジェクトのプロパティの
「共有ランタイムを使用しない」となっている箇所を
「共有ランタイムを使用(/clr)」
に変更する(文言は間違ってるかも。うろ覚え)。たったこれだけ。
ソースコードに何ら変更を行うことなく、CLRでのコンパイルが通りました。実行も問題なし。速度の劣化もありませんでした。
なので、これがホントにCLRなの?とか思って、疑問に感じたのでできあがったバイナリをLinuxのMonoを使って動かしてみました。
その結果、ある意味実行成功。FFTWのDLLを使用しているため、Linuxでそのまま動くわけはありません。ですので、実行が失敗するのは予想通り。ただ、ちゃんと実行可能なバイナリとしてMonoが認識していました。つまり、CLRとして認識されていたと言うことですね。すげー!
これでネイティブC++からC++/CLIへ変換できたので、プロジェクトにWindowsフォームを追加して表示だけさせてみました。これまたあっけなく成功。
ただ、コンソールアプリのプロジェクトだったので、フォームを表示した次の瞬間にプログラムが終了してしまい、フォームが表示しきる前に固まってました^^; Disposeしてないからかも。今のプロジェクトにフォームを追加するより、GUIアプリのプロジェクトを作って、今のシミュレーションプログラムのソースとかをコピーして追加してやる方がよさげやな。ま、それはすぐできると思われます。
ここまではとんとんと進んだのですが、まだ理解できてない部分もちらほら。アンマネージドな配列データなどをマネージドな配列に渡すにはどうしたらよいのか、その辺がよく分かってなかったりします。
ぢつはNPlotのライブラリを使ってグラフでも表示できたらおもすれーよなーと思ってやろうとしたんですよ。けど、

System::Int32 a[] = {1, 2, 3, 4};
plot2Dsurf.DataSource = a; // ここでコンパイルエラー

と言うようなコードを書いたところ、
「^System::Int32型をSystem::Object型にキャストできません」
みたいなエラーが出たんですよね。訳分からん・・・。ここいらがキモになりそう。マネージドな部分とアンマネージドな部分とのデータのやりとりというか、変換処理の仕方が分かったら、C++だけでGUIも作れそうだ。
いやー、こう考えたらC++/CLIのポテンシャルってすっげー高いよなと思う。高速な部分は今まで通りのC++で書けばいいし、GUIの部分はマネージドなライブラリを利用してささっと書けばいい。
こりゃちょっと、勉強して使えるようになっておこうかしら。今のところC++/CLIに対応したコンパイラはMSしか出してないけれど、標準規格とするみたいだからコンパイラは自由に作れるようだし、Linuxでも使えるときが来るかも知れない。
いずれにせよ、面白い言語だわ。俄然興味がわいて来ましたよ^^