(3) 軽くギブ。→そしてTranslator
こんな時間ではありますがネタが若干たまり気味になってきましたのでこの際ってんで連続で文章書いてるさるべーじですこんばんは今宵はまたお会いできましたね。
さて、お題は引き続きCodeing4FunのAsk the ZMan: Applying Textures(part1)、DirectX SDKから提供されているFrameworkまで移植しないばVBで遊べないと腹を括ってみたところまでなんですが。
文章立て続けに書いていますので読んでいる皆さんにはなかなか実感していただきにくいとは思ぅんですが、実はもー3日も、仕事と家庭の合間を縫って必死こいて移植していたりしていたわけです。
3日ガンバって、未だひとつめのファイル「dxmut.vb」の2/3ですぜ。やってらんねぇっす。
こりゃぁまたあきらめちゃぅって手かなーとか思っていたんですが、ふと先日ひろ/Hさんて方(CLR/Hメンバー)が、C#→VBの変換サービスを提供しているWebページC# to VB.NET Translatorを自分の日記ページにメモ書きしていたのを思い出して。
その時は「ふーんこんなんもあるんだー」レベルの感想で、頭の隅に留めておいた程度なんですが。
この際少しでも効率が上がるんならいぅことないす。ちょっと試してみましょぅ。
いゃ実際これは大助かりですよ。かなりいい感じの変換コードを生成してくれます。
まぁ当然ですが100%の変換にはならないので、変換後に元ソースと突き合わせて修正入れなきゃならないんですが、それでも半日でファイル2つ消化できました。わーい。
せっかくですので、変換時に気がついたこととか変換後の手修正のポイントとか。
- インデントが「3」。
VBの標準は「4」なんですけど…技術屋って自分のスタイルにかたくななまでにこだわるからなー(含私)。
まぁIDEにかけたとたんにインデントは整形かかるので不都合はないんですが。 - 「For i As Integer = 0 ~」とすべきところを、Dim文とFor文の2行に分割する。
これはなんでなんだかちょっとわからないっす。For文の中にループ用変数の宣言を埋め込むとアクセシビリティがFor~Nextループの内側のみになるのに対し、その上の行で宣言しちゃうとそのプロシージャ全体になっちゃうので、びみょーにおかしなことになりそげな感じです。
「i」とかを複数のFor~Nextループで使い回している時は重複宣言になっちゃぅんですけど。ここは気をつけて直しておくこと。 - プロシージャの引数の「ByVal」が付記されない。
まぁこれもIDEに貼り付けたとたんに付加されるので実害はないんですが。 - プロシージャの最後、「End ~」の右側にコメントアウトでプロシージャ名を付加してくれる。
実はこれはけっこぅ便利。私、自分でコード書くときにはこれやってます。
C#のプロシージャやループやその他範囲の括りはすべて「}」で終わるので、実はちょっと見分けにくいんですよ。
この「}」による括り終りはCの頃からそぅだったんですけれども。あの頃は構造化プログラミングがどーたらで「「}」の括り終りを見誤るほど長いソースを書くこと自体が悪だ」みたいな雰囲気があったんですが。
実務上泥臭いコードを書くのなんて実は当たり前なんだ、と割り切ってからは「}」が大嫌いに。いゃ書き方としてはかっこいいんですけどね。
もっともVBの「End~」だって五十歩百歩と言えばそれはそれでそんなもんなんですが。 - 並列の「Else If」が、Elseの中にIfを置く多重入れ子になる時がある。
まぁ論理的には同じロジックですので動くんですけどね。なんだかスタックが膨れるのが怖いのは、私が旧世代のプログラマだからなんでしょうか。
ちなみにその下にコメント文があると、End Ifの行に食い込んでしまうおまけつき。 - Try~Catchがあると、Catchの中のコマンドが全部落ちる時がある。
例外の内容に応じてCatchが複数あったりするとどぅもダメっぽいです。 - #If文が完全に落ちる。その中身も落ちる。
ふつーのIf文と解析ロジックは似たよぅなもんなんでしょうから、入れてくれてもいいのになぁ、と思う部分ですね。 - 型指定子つきリテラルの、型指定子が変換されない。
たとえば左辺の変数の型をfloat→Singleに変換しても、右辺の「1.0F」はそのまんま。「1.0!」にしてほしいなぁ。 - Continue機能は2003までには存在しないため、ループの出口直前にラベルを置いて、そこへのGoto文に置き換えてくれる。
2005にはContinue機能があるんだけど…とりあえずかなり複雑なIfの入れ子等でも適切にラベルとGotoを置くので、感心してみたり。 - 「///」→「'''」の置き換えがされず、「'/」となってしまう。
xmlコメントも2003までなかったから当然なんですけど。 - uint→UIntegerの置き換えがされない。でもSystem.UInt32に置き換わる。
これも2005からの新規格なので。 - using→Tryに置き換わる。
これはある意味みごと。逆に私は、この変換ソースを見てよぅやくUsingの概念が把握できたといぅ。
ちなみに、同様のサービスを提供しているWebページにConvertCSharp2VBなんてのもありまして。
「C# to VB.NET Translator」を提供されているAlex Loweさんは、
This is NOT the same translation engine that is used at Kamalpatel.net. Try them both out and in some cases they will produce similar code but in many cases the engine used on this page is much better.
このサービスはKamalpatel.net(ConvertCSharp2VBの提供サイト)と同じ変換エンジンを使用しているわけではない。両方を使い比べてみてほしい。同じような結果になる場合もあるが、多くの場合はこのページの方がいい結果を出力しているはずだ。
まぁなんだか自信たっぷりげな言い分がいっそすがすがしく。