C2J、C言語からJava言語ソースへのトランスレーター

(C2Jで「Z80逆アセンブラhoja」のC言語(K&R)ソースからJava版を作ったので後から記事を書き換えました。)
C言語でJava VM上で動作するプログラムを作れるのか作れないのか調べてみた。
結論はなんとか作れる場合もある。
NOVOSOFTのC2JというC to Javaのトランスレーターを見つけた。
http://tech.novosoft-us.com/product_c2j.jsp
C言語ソースからJavaのクラスファイルを直接作ることはできない。
C言語ソースをJavaソースに変換する。
実行にはC2J付属のランタイムライブラリ(Java classファイル)が必要だ。
C2Jは結構C言語に広範囲に対応しているようだ。
「Z80逆アセンブラhoja」のC言語(K&R)ソースをいろいろ手直ししながらだがなんとかJavaソースに変換できてJava版のhojaが完成した。
まず問題として、日本語文字列には対応していない。
SJISは変換時にエラー。(0x5cを含む漢字の前に\(円)マーク付加でコンパイルだけなら通る可能性はある。)
UTF-8文字列なら変換もコンパイルも通るがUTF-8の文字列を出力できず文字化けする。
非常に残念な仕様だ。
あとはバグがあり、javacのコンパイルでエラーが出るJavaソースを出力することがよくある。
それを回避するには、バグの起きるパターンを把握してバグを回避するようにC言語ソースを書き直す。
それでも回避できない場合は変換された間違ったJavaソースを正しいJava構文に書き換えるしかない。
バグがあるので結局C言語だけでは書けなかった。
変換後のJavaソースをいじくるはめになった。
C言語ソースをまた少しでも変えて変換するといじったJavaソースがリセットされるから開発はものすごく大変になると思う。
変換後のJavaソースは原型をとどめていないぐらいに大きく書き換えられており、C言語ソースの作者本人が見ても解読が難しい。
変換後のJavaソースにはコメントで元のC言語ソースの何行の位置かが書いてあり、一応解読しやすいようにしてはあるが。
バグがあるので、1から開発するならC言語ではなく最初からJavaで書いたほうが早い場合が多いような気がする。
だが、すでに開発を終了したGUIを使わないC言語ソースがあるなら、驚くほど速くJavaに移植できる場合がある。
このC2Jは、1995年に出て最終更新は2001年と非常に古いプログラムだ。
Windows 95版でライセンスはGPLだ。
GPLを自称しているのにソースは公開していないようで矛盾を感じる。
多分GNU Cを利用しているのではないかと思う。
使い道ないと思うがなぜか拡張子oのオブジェクトファイルも生成される。
C2Jで作ったプログラムの配布にはライセンスの問題がありそうだ。
ランタイムライブラリも同梱しないと動かないが、同梱するとソース開示の義務が発生すると思う。
ソースといってもC言語のほうなのかそれとも変換後のJavaのほうなのか考えてしまう。
変換後のJavaソースをいじった場合でもC言語のソース開示が必要なのだろうか?
GPLだとランタイムライブラリのソース開示義務も出てくると思うが、そのソースは公開されていない。
NOVASOFTに言えばもらえるのだろうか。
よさそうなソフトなのだが、ランタイムライブラリがGPLではソース公開したくなくてライセンス違反もしたくない人には使えないなあ。

C2Jの他にも、Tangible Software SolutionsのC++ to Java Converterの100行まで対応のフリー版を試してみたが実用にはならなかった。
FILE *fp;と書いてもjavacコンパイル時にFILEが未定義でエラー。
fopenと書いてもやはりjavacコンパイル時に未定義でエラー。
printfとsprintfは変換できたが。
Java to Converterは変換できるところだけ書き換えて、できないところはC言語そのままで変換時にはエラーすら出ない。
javacでのコンパイルが通るようなソースを出力しないのだから話にならない。
過去には、jazillianやEphedraというのもあったらしいが現在では入手不能のようだ。
ちなみにZ80逆アセンブラhojaは、私が大昔に8ビットパソコンのMSXで作ったMSX-DOSまたはCP/Mで動くコマンドラインのプログラムで、その後、MS-DOS、Windows 95、UNIXに移植した。
今回はUNIX版のソースを使用。
もうそれしかソースは残っていない。