(7) トランスレートツールあれこれからの結論
どぅもツールによる移植がうまくいかんなーと。
あちこちのいろんなC#サンプルをVBに変換かけてみたんですけど、ほとんどまともに動作する形になりません。
ってんで、可能な限りいろんなツールを入手、試してみました。
以下、試してみたツール一覧。
- C# to VB.NET Translator (Webページ)
- Convert C# to VB .NET (Webページ)
- CSharp to VB.NET Code Converter (Webページ)
- Instant VB (Windowsアプリ)
- Convert C# to VB.NET (Webページ)
- C-Sharpener For VB (Windowsアプリ)
- Free Code Translation for .NET (Webページ)
- Reflector for .NET (Windowsアプリ)
で。どれひとつ満足にC#→VBをトランスレートしてくれたものなし。がーん。
揃いも揃ってここまで見事に中途半端だと、これはもぅ
いや確かに中には明らかなうっかりバグだろうと思われる動作をするのもあるんですが。
そのうっかりっぷりがあちこちのWebページで見受けられるので、どぅやらこれらのうっかりっぷりな奴らは同じトランスファーエンジンを使っているんではないのか。んでもってこのうっかりエンジンが手軽に自分のサイトに組み込めるってんで普及とかしてしまっているんではないのか。
だからこそその状況を憂いたAlexさんが軽くギブ。→そしてTranslatorで引用したように俺んとこのはうっかりエンジンじゃねぇっ!と叫んだのかとよぅやく納得がいってみたり。
VB→C#のツールもいくつか比較してみたんですが、どうもこちらのほうは平均して質のいいコードを吐くんですよね。
このへんどういうことかというと。
C#はVisualStudioの中で、もっともMSILに対して親和性が高いんです。
CLI/CLSうんぬんと関係ない部分まで親和性が高い。
たとえば、C#(C++もか)で
a = b = c = d;なんて記述があったとして、これはMSILでも数珠繋ぎの代入式として展開されます。
ところがVBではこれは右側から2項ずつの評価式となります。
a = (b = (c = d))「cとdが正しいかを評価して」「その評価結果とbが等しいかを評価して」「その結果をaに代入する」というまったく違う意味になるんですね。
が、上述のツールではいずれもa = b = c = dとしてVBコードが出力されます。
(たしかひとつだけc = dとなりaとbが完全にどこへやら、というのがありましたが。)
逆に、VBの仕様はどのような形にせよ.NET Frameworkの上で実装されてMSILにコンパイルされますので、MSILと親和性が高いC#への変換はかなり高い確度で成功するわけです。
まぁReflector for .NETなどは開発意図として「はじめにMSILありき、VB/C#に置き換えて表示可能」というスタンスを取っているっぽい作りなので、「このMSILコードはVBでは表現できない」みたいなエラーが出るのも致し方ないと思いますが、「C#のコードをVBのコードにできますよー」な部分をウリにしているシェアウェア/商用ソフトなんかは、せめてこのくらいは
c = dと意訳してくれたって罰は当たらんのではないかと。
b = c
a = b
さて本論。
本コンテンツシリーズの元々のテーマ、managed DirectXのサンプルフレームワークはC#製で、どーにも単純にはVBに置き換えることができそうもないということがわかってきました。C#サンプルフレームワークはCLI/CLSにない.NET Framework独自の仕様を多分に含んでいて、C#からでないとまともに使えないコードになってしまっています。
ZManがApril2005版のサンプルフレームワークのVB版を自分のサイトで提供してくれていることはなんてこったー!!!でお話ししましたが、実際に入手して使ってみると、どーいぅわけかソフトウェアレンダリングになってしまいました(;-;)。
同じ結果になっていただきたい。
のはやまやまなんですが、もうこれは
と腹を括って、人間の叡智をもってC#の最適解→VBの最適解へのトランスファーを試みるしかないかもしれません。
あ、ちなみに。
今回の検証で一番ツカえると思ったツールは、Instant VBです。
外貨シェアウェアなのでフルスペック版の入手が難しいのが難点ですが、プロジェクトごとかけてやるとクラスやオブジェクトの構造まで参照までして可能な限り正しく置換しようと動作するのはすげぇと思いました。
C#は「Device型の変数device」などと大小文字の違いだけで宣言しちゃってる場合がけっこうあって(C++からの流れかなあ…いいかどうかは別として)。
他のツールはほとんどステートメント単位の逐次解釈なのでこのへん全滅なんですけれども、Instant VBだけはそれなりに何とかしてくれました。
パーフェクトとは行きませんが、手動変換の手間が一番省けます。おすすめっす。