.NET Tools
注目のJava→C#コンバータを試用する

コラム:JLCAベータ1で発生した問題点(バグ編)

(株)ピーデー
川俣 晶
2002/03/09
Page1 Page2 Page3 Page4 Page5 Page6

 「りすと亭」を使った今回の変換作業において発生した問題点のうち、JLCAのバグと思われるものは以下のとおり。ただし本文中でも述べたとおり、今回評価したJLCAはまだ開発途中のベータ1であり、今後発表されるバージョンでは解消される可能性が高い。この点に注意してご覧いただきたい。

[1]8進表記の変換ミス

final static String crlf = "\015\012";

というコードが、

internal const System.String crlf = "\x000D\012";

と変換されていた。これは本来なら、"\x000D\x000A";となるべきところである。単なるバグだと思うが、JLCAベータ1を利用する人は気を付けてほしい。なお、C#では8進表記はサポートされないので、変換しないと正常には機能しない。

[2]うっかりミス?

 このようなコードが生成されていたが、どう見てもキャスト不能である。

public override void Write(System.Char[] cbuf)
{
    Write((char) cbuf);
}

[3]見つからないBaseStream

 以下は完全に誤った変換例である。

System.IO.StreamReader br = new System.IO.StreamReader(new System.IO.StringReader(all).BaseStream);

 これをコンパイルすると以下のエラーになる。

'System.IO.StringReader' does not contain a definition for 'BaseStream'

 StreamReaderオブジェクトからBaseStreamプロパティを通じて、実際の入出力を扱うStreamオブジェクトにアクセスできるのは、うまく使えばソースがきれいにまとまるのだが、この例なら、素直に以下のように書くだけで十分である。

System.IO.StringReader br = new System.IO.StringReader(all);

[4]エラーになる組み合わせ

 以下のようにエラーになるコードが生成される場合がある。tmpで始まる変数はJLCAが生成したものである。もちろん、17行目でエラーになる。このコードは製品版ではより最適化されるもようである。

 1: if (tmpBool)
 2: {
 3:     //UPGRADE_NOTE: This code will be optimized in the future;
 4:     bool tmpBool2;
 5:     if (System.IO.File.Exists(fileTmp.FullName))
 6:     {
 7:         System.IO.File.Delete(fileTmp.FullName);
 8:         tmpBool2 = true;
 9:     }
10:     else if (System.IO.Directory.Exists(fileTmp.FullName))
11:     {
12:         System.IO.Directory.Delete(fileTmp.FullName);
13:         tmpBool2 = true;
14:     }
15:     else
16:         tmpBool2 = false;
17:     tmpBool2;
18: }

[5]returnで終わっていないコード

 returnで終わらないメソッドが生成される場合があった。

1: public virtual System.Object remove(System.String key)
2: {
3:     System.Object temp_key;
4:     System.Collections.Hashtable temp_hashtable;
5:     temp_key = new NoCaseString(key);
6:     temp_hashtable = target;
7:     return temp_hashtable[temp_key];
8:     temp_hashtable.Remove(temp_key);
9: }

[6]java.util.Enumerationの変換ミス

 java.util.EnumerationはSystem.Collections.IEnumeratorに変換されるがそのままではコンパイル・エラーになる。JLCAは以下のようなソースを生成する。

for (System.Collections.IEnumerator e = (System.Collections.IEnumerator) params_Renamed.Keys; e.MoveNext(); )

 しかし、System.Collections.Hashtable.KeysはICollectionsを返すが、これはIEnumerableにキャストできても、IEnumeratorにキャストできない。もし直すとすれば、以下のようになるだろう。

for (System.Collections.IEnumerator e = params_Renamed.Keys.GetEnumerator(); e.MoveNext(); )

 System.Collections.IEnumeratorとSystem.Collections.IEnumerableは名前が紛らわしいので間違ったのだろうと推測する。単純なミスなので製品版では直るだろう。

[7]間違った式の変換

ary[i] -= seed1 + i;

 これが以下のように変換されてしまうケースがあった。

ary[i] = (sbyte) (ary[i] - seed1 + i);

 いうまでもなく、最後の (ary[i] - seed1 + i) は (ary[i] - (seed1 + i)) が正しい。End of Article

 

 INDEX
  [.NET Tools]
  注目のJava→C#コンバータを試用する
     1.インストールと実行
     2.変換の内容と品質
     3.りすと亭の変換で遭遇した問題点
     4.稼働したソースと結論
       コラム:JLCAベータ1で発生した問題点(バグ編)
 
インデックス・ページヘ  「.NET Tools」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間