GNU Compiler for Java(グニュー・コンパイラ・フォー・ジャバ、GCJ、ジーシージェー)は、かつて開発されていたJavaのためのフリーなコンパイラで、GCCの一部であった。Javaソースコードをコンパイルし、Java仮想マシンのJavaバイトコードまたは機械語を出力することができた。また、バイトコードを格納したJavaクラスファイルや、それらを格納したJAR全体をマシン語にコンパイルすることもできた。GCJで使用されていたほとんど全てのランタイムライブラリはGNU Classpathプロジェクトに由来する。

2007年当時、AWTとSwingの2つのグラフィカルAPIをGNU Classpathにサポートさせることに多くの労力が投入されていたが、AWTのサポートは不完全なままであった。削除されるまでに、GCCがサポートしていたのはJava 1.4までであり、ジェネリクスやアノテーションなどそれ以降の機能の大部分を欠いていた。GNU ClasspathもJava 1.2のステータスにさえ完全には到達せず、現在は開発が完全に放棄されたとみられている。

2015年より、新しい開発のアナウンスはなく、製品はメンテナンスモードとなり、オープンソースのJavaツールチェーン開発は主にOpenJDK内で行われるようになったGCC Looks To Turn Off Java, Replace With Go Or ADA。2016年9月30日、GCJはGCCのtrunkから削除された。削除のアナウンスは、GCJを含まないGCC 7.1のリリースとともに行われた。GCJが含まれる最後のリリースはGCC 6となった。

CNI (Compiled Native Interface) CNI (Compiled Native Interface)は、ネイティブアプリケーションやC++で記述されたライブラリを、Javaコードとの間で相互に呼び出せるようにするためのGCJ独自のソフトウェアフレームワークであった。

これは多くのJava仮想マシンで標準とされているJNI (Java Native Interface)フレームワークに似ているが、CNIの作成者はJNIに対して幾つもの優位性を主張していた。

我々はCNIをより良い手段だと考えて採用している。特に、Javaは標準的なコンパイル技術を使って実装されるもう一つのプログラミング言語に過ぎない、とする発想に基づいたJava実装において、より良いと考える。それゆえ、そしてGCCを用いた言語実装は出来るだけ互換であるべきなので、Javaの呼び出し規約は、他の言語、特にC++で使用される規約に対して、実用性を損なわない範囲で極力似ていなければならない。なぜなら我々は、JavaをC++のサブセットと考えることもできるためである。CNIは、単にC++とJavaは同じ呼び出し規約とオブジェクト配置を持ち、バイナリ互換である、という発想によるヘルパー関数と規約のセットである。(この説明は単純化されているが、十分に正確である)The GCJ FAQ 2.3 Why does GCJ use CNI? より

脚注

関連項目 GNU Interpreter for Java GNUコンパイラコレクション Kaffe

外部リンク GCJ Homepage GCJ Manual About CNI section of GCJ Manual GCJ Frequently Asked Questions GCC/GCJ for MinGW