.NET Tools 注目のJava→C#コンバータを試用する |
変換結果はすでにVS .NETで扱える形式になっているので、そのまま普通のC#のプロジェクトとして扱うことができる。しかし、これをそのままビルドして実行できるかというと、そうではなかった。試しにビルドしてみると、大量のエラーが表示された。正確な数は数えていないが、一瞬目の前がクラクラするぐらいの、膨大なエラーだった。
エラーが表示された行の多くには、“UPGRADE_TODO:”という文字列で始まるコメントが挿入されている。また、エラーが表示されていなくても、手を加える必要がありそうな個所にも、同じコメントが入っている。以後の基本的な移行作業は、この“UPGRADE_TODO:”というコメントが挿入された個所を手動でチェックして、必要なら修正を加えるというスタイルになる。今回、“UPGRADE_TODO:”なしでエラーになった個所もあるが、これはベータ版ゆえの欠陥ではないかと思われる。
さて、“UPGRADE_TODO:”にはいくつかのバリエーションがある。まず、変換できるが動作が完全に等価でない場合。例えば、java.util.EnumerationはSystem.Collections.IEnumeratorに置き換えられるが、前者は「次のデータを取る」と「終わりかどうかを判定する」という機能の組み合わせであるのに対して、後者は「現在のデータを取る」と「次のデータに進み、終わりかどうかを判定する」という機能の組み合わせで表現される。そのため、単純なケースでは変換できるが、ソースが込み入ると非互換性が発生する恐れがある。
次は、クラス・ライブラリの変換ができないケースである。これは、2つの理由によって発生する。1つは、まだ変換可能なクラスの種類が少ないこと。これは、製品版に向かって改善されていくことが予想される。もう1つは、そもそも.NET Framework側に対応するクラスが存在しない場合である。例えば、java.lang.ThreadGroupクラス(スレッドを集めてグループ化して扱うクラス)に対応する.NET Frameworkのクラスを探してみたが、類似機能を持つものはあっても、そのまま置き換えに使えるクラスは見つからなかった。
最後は、異なる機能によって置き換えられた場合である。例えばラベル付きbreakなどが、goto文に置き換えられるケースがある。おそらく、これは動作的には非互換ではないと思うのだが、gotoは絶対にソースに含めないという主義の人は、これも“UPGRADE_TODO:”を頼りに修正個所を特定し、修正することになるだろう。
以上の“UPGRADE_TODO:”をチェックし、直すべきところを直し、コンパイル・エラーが表示されなくなるまで作業を行ったとしても、それでプログラムが正常に動作するとは限らない。言語文法やクラス・ライブラリの仕様として完全に互換が取れても、定数値の中身に非互換があるケースもあるからだ。例えばJavaでは、シフトJISを示すエンコーディング名として、“SJIS”というキーワードが使用できるが、これはJavaのみで通用する方言である。.NET Frameworkではエンコーディング名としてIANA(The Internet Assigned Numbers Authority)に登録されたインターネット標準の名前を採用しているので、“SJIS”は受け付けない。このようなケースは、実行して発生する例外を見て問題の発生個所を探すか、地道にソースをチェックするしかないだろう。
以上のように、JLCAが自動変換を行ってくれるからといっても、最終的には相当な手間を要することを覚悟しなければならないだろう。製品版になれば多少は手間が減ると思われるが、本格的な業務用ソフトを変換するなら、かなりの工数を見積もっておいた方がよいだろう。とはいえ、すべて手動で、JavaソースからC#に書き換えることを考えれば、けた違いに少ない労力である。
関連リンク | |
IANA
|
IANA(The Internet Assigned Numbers Authority)のページ |
INDEX | ||
[.NET Tools] | ||
注目のJava→C#コンバータを試用する | ||
1.インストールと実行 | ||
2.変換の内容と品質 | ||
3.りすと亭の変換で遭遇した問題点 | ||
4.稼働したソースと結論 | ||
コラム:JLCAベータ1で発生した問題点(バグ編) | ||
「.NET Tools」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|