C言語にあってJavaにないもの

PCエンジンエミュの移植作業を暇なときにちまちまとやってたわけなんです。

xpceのソースはとってもC言語な感じです。

C言語らしい書き方をされたソースです。

マクロが多用されています。


C言語よりJavaのほうが後発の言語ですが、C言語にあってJavaに無い機能というのは、けっこうあります。

パッと思いつくものは、

  1. マクロ
  2. unsigned型
  3. ポインタ演算子

とかでしょうか。

Javaはシンプルイズベストの思想で、使うのが難しかったり、使い方を間違うと危険な機能は、基本的に無いんですよね。

マクロもそんな機能の一つです。

マクロを使うと、関数呼び出しのオーバーヘッドを減らして、高速なコードをコンパクトに記述できます。
しかし、単純に文字列置換を行うだけの機能なので、むやみに使うと何でも出来てしまうので、ちょっと危険な機能です。

xpceのソースはマクロがガンガン使われています。
マクロで記述された部分は、Javaのメソッドに直すか、マクロの文字列を手作業で置換したりしてました。

でもはっきりいってめちゃめちゃ面倒です。

なんとかならないかということで、Javaの言語仕様からは外れてしまいますが、コンパイル前にプリプロセッサを通すことで、Javaでもマクロを使えるようにできないか調べました。

そのようなプリプロセッサはいくつか存在しているようです。
中でも、拡張可能 Java プリプロセッサ EPPというのがよさそうです。

これを使って、xpceソース中のマクロを使って書かれた部分は、そのまんま残すことにしました。
そうすれば、かなり作業が短縮されるはずです。

しかし、Javaの言語仕様から外れたソースコードになってしまうので、Eclipseなどの総合開発環境が使いづらくなっちゃいます。
具体的には、自動コンパイルや、コードアシストの機能をOFFにしないとだめですね。

ビルドはantでスクリプトを書いて、プリプロセッサを通したあとにjavacにかけるようにする必要があるでしょう。

多少面倒ですが、マクロを手作業で展開することを考えればずっと楽なはずです。