InfoQ

Articles

Fedora CoreにJavaアプリケーションを供給する

作者 Tom Tromey, 翻訳者 佐野 徹郎 投稿日 2007年9月19日 午前12時54分

コミュニティ
Java
トピック
Linux
タグ
RedHat

Fedora Core 4はJavaプログラミング言語で書かれた相当量のコードを含む最初のFedoraリリースです。これらの追加はGNU ClasspathとGNU gcjの改良によって可能になりました。

GCJの基礎

最初に、GNU gcjはJavaではありません。

それでも、AOT(Ahead-of-Time)コンパイラを中心に、Javaと互換性のある、完全なシステムの実装を目指しています。それはGNU Classpathに基づくクリーンルーム方式のクラスライブラリと、組み込みのインタープリタを持っているからです。コンパイラはJavaのソースファイル、クラスファイル、さらにはJARファイル全体をオブジェクトコードにコンパイルできます。

歴史的にgcjはJavaをやや独特なC++の方言であるかのように扱う「極めて伝統的な」テスティングのアプローチを取ります。これは多くの良い結果をもたらしますが、残念なことに実行時のリンクのモデルがあまりに違いすぎます。そのため大きくて複雑な、特に洗練されたクラスローディングの基盤を備えたJavaアプリケーションに対して、このアプローチは破綻してしまうのです。

GCC 4.0のリリースで私たちは、Binary Compatibility ABI(Application Binary Interface)と呼ばれるgcjのための新しいコンパイルのモードを実装しました。このコンパイルのアプローチはすべてのリンクを実行時まで延期し、プリコンパイルされたコードとクラスローディングの適切な相互作用に必要な、Javaのバイナリ互換性の仕様を完全に実現できます。

私たちはまた、クラスマッピングデータベースも追加しました。実行時に、クラスが定義されるとすぐに、「libgcj」と呼ばれるgcjのランタイムがこのデータベースからそのクラスを探します。 もしクラスが見つかると(クラスの「内容」が単なる名前ではなく、使用されたものであることに注意)、次にlibgcjはクラスのコンパイルされたバージョンを含む共有ライブラリにマップします。

これらの2つの変更によって、私たちはとても強力なものを得ることができます。私たちはアプリケーションレベルのどんな変更も必要とせずに、実行前にJavaプログラムをコンパイルできます。さらに、バイトコード検証の新しいアプローチによって、私たちはコンパイルされたコードの実行時の型安全性も保証できます。

RPMの構築

Fedora CoreでJavaプログラムを構築するのは簡単です。既存のビルド環境はそのまま機能するでしょう。Fedora Coreは「Ant」を出し、Javaプログラムをバイトコードに変換するのにEclipseからJavaコンパイラを利用します。

ソースRPMの書き方の説明はこの記事の範囲外ですが、Fedora RPM Guide(サイト・英語)に有益な一般情報があり、JPackage(サイト・英語)にいくらかのJava仕様のガイドラインがあります。

一度バイトコードにコンパイルされたプログラムは、さらにネイティブコードにコンパイルできます。gcjはまだJITを含んでいませんので、これは妥当なパフォーマンスを得るための手段となります。gcjは共有ライブラリを利用しますので、いくつかのケースでは既存のJITよりパフォーマンスが良いかもしれません。たくさんのアプリケーションのインスタンスを同時に実行する場合に、最も異なる結果を期待できます。

Fedoraはパッケージのネイティブなコンパイルをとても簡単にする2つのプログラムを提供します。これらはRPMの構築に利用されます。

1つ目のプログラムは「aot-compile-rpm」で、これはJARファイルを検索し、gcjを利用してそれぞれを共有ライブラリにコンパイルします。aot-compile-rpmは大きなJARファイルを(一度にコンパイルするには非常に大量のメモリを必要とするので)コンパイルの前に小さく分割するなど、有益なgcj仕様のトリックを少し知っていて、共有ライブラリの結果をリンクする(そして結果的に実行時のパフォーマンスを改善する)ために-Bsymbolicを利用します。

RPMを構築しない場合は、このプログラムの代わりに、単にそれぞれのプログラムのJARファイルを共有ライブラリにコンパイルします。最も簡単なアプローチをお見せします(前述のとおり、大きなJARではとても遅くなるかもしれません)。

gcj -fjni -findirect-dispatch -fPIC -shared \
-Wl,-Bsymbolic -o foo.jar.so
foo.jar

詳細:

  • -fjniはJavaコードのネイティブメソッドがJNIを利用して実装されることをgcjに伝えます。
  • -findirect-dispatchはバイナリ互換性ABIを利用することをgcjに伝えます。
  • -fPICと-sharedは共有ライブラリを構築する場合に必須です。
  • -Wl,-Bsymbolicは可能であれば、共有ライブラリへの参照をバインドすることをリンカに伝えます。

Fedora Coreに供給された2つ目の便利なプログラムは「rebuild-gcj-db」で、このプログラムはグローバルなクラスマッピングデータベースを更新するためにRPMをインストールまたはアンインストールし、RPMの%postと%postunセクションを実行させるのに利用されます。

rebuild-gcj-dbは規約によって、それぞれのパッケージが自身のクラスマッピングデータベースを/usr/lib/gcj(マルチアーキテクチャOSの64ビットパッケージなら/usr/lib64/gcjですが、この差異を抽象化するRPMマクロがある)の下のどこかにインストールすると仮定して動作します。次にこれらの個々のデータベースのすべてについてループし、それらをランタイムが利用するグローバルなデータベースにマージします。

gcjを利用してJavaプログラムをコンパイルすることが常に可能とは限らないことに注意します。gcjのクラスライブラリはまだ完全ではなく、時としてプログラムが利用するであろういくつかのAPIはまだ実装されていません。例えばSwingは現在、鋭意開発中です。また、Sunの警告(source)をよそに、いくつかのパッケージはプライベートなcom.sun.*やsun.*のAPIを利用します。そしてgcjは大抵の場合これらを実装しません。

何がこれを利用するのか

Fedora Core 4は多くのプログラムをコンパイルするのにgcjを利用します。

  • 最初に、Fedora Coreは他のJavaプログラムをコンパイルして実行するために、AntとAntが依存する多くのものを含みます。それはまたEclipseのJavaコンパイラを含みます。
  • Tomcatとそれが依存するもの。
  • OpenOfficeのJavaコード。
  • Eclipse IDEと、CDTなどのいくつかのEclipseプラグイン。

Fedora Core 5で公開されるもの

  • RSSリーダ「RSSOwl」
  • すばらしいBitTorrentクライアント「Azureus」
  • 実行中のプロセスやスレッドをモニタリングするための実行分析技術「Frysk」

J2EEの実装であるJOnASアプリケーションサーバ(サイト・英語)もまた機能していますが、まだFedora Extrasのレビュープロセスを通過していません。

今後の作業

この1年でGNU Classpathのコミュニティは完成に向けて大きく前進し、私たちはこれが2006年も持続すると期待します。私たちは定期的に更新されるAPIを比較するページを持っています。ここ(source)で私たちのAPIのステータスを追跡することができます。

私たちはまたgcjにいくつかのコアとなる改良を行っています。コンパイラ、ランタイム、およびJava 5のクラスライブラリをアップデートしています。

最後に、私たちはlibgcjにJavaのセキュリティの基盤を実装しています。これで私たちはMozillaプラグイン(サイト・英語)とJava Web Startの実装であるnetx(サイト・英語)を出荷できるでしょう。

バイオグラフィ

Tom Tromeyは1990年にカリフォルニア工科大学(Caltech)を卒業しました。彼はRed HatでGNU Javaコンパイラとランタイムに取り組んでいます。彼はGNU Automakeの作者でもあります。

原文はこちらです:http://www.infoq.com/articles/Java-Apps-on-Fedora-Core

(このArticleは2006年6月26日にリリースされました)
ブックマーク
digg+,
reddit+,
del.icio.us+,
dzone+,
Hatena

No comments

返信

ジャンル別一覧

"YUKATA"から始まるコミュニケーション(Agile2008 ライトニングトークより)

私は「浴衣」を着てパーティーに参加したことで、たくさん声を掛けていただけました。 そこで感じたことは、このカンファレンスが人との繋がりを生み出し、また言葉の壁を越えて積極的に交流する場所であることです。民族衣装はそれらを助けてくれるものでした。きっとこの交流が、新たなムーブメントをアジア圏の仲間たちにも与えてくれると確信しています。

ソフトウェアのリーン思考入門

これは、InfoQ Chinaのアジャイル編集者、Jacky Li氏によるリーン思考とリーン思考をどのようにソフトウェア開発に適用するかについての入門です。

Java 6のスレッド最適化は実際に動作しているのか?

2つのパートからなるこの記事では、シングルスレッドベンチマークの助けを借りて、Java 6のスレッドのパフォーマンスに関する疑問に答える試みをしようと思います。

平鍋氏のGordon Pask Award受賞スピーチ

Agile2008において、Gordon Pask Awardの授与式が行われ、その一人として、チェンジビジョンの平鍋氏が受賞しました。本賞は、毎年、アジャイルコミュニティで定評のあるリーダーだけではなく、新たなリーダーになる可能性のある者に贈られるものです。InfoQでは、授与式のスピーチを動画にてお送りします。

Linda Rising氏による「誰を信頼しますか?」

Agile2008の3日目、8/6(水)午前中の、Linda Risingによるセッションです。セッションの冒頭、Linda Risingはとてもゆったりとしたきれいな、わかりやすい英語で話し始めました。

Jean Tabaka氏による「Collaboration Explained--真のアジャイルチームのためのファシリテーションツール」

Jean Tabaka氏の書いた書籍では、会議などのチーム活動において、ファシリテーションの手法とツールについて具体的かつ実践的に説明しています。8/8(金)、Agile2008の最終日の朝のセッションでは、Jean Tabaka氏自身が本の内容をベースとしたセッションを行いました。

Hubert Smits氏による「ゲーム・デザイン・ワークショップ」

Agile2008の4日目となる8/6(木)の8:30から、Hubert Smits氏による「ゲーム・デザイン・ワークショップ」がおこなわれました。ゲームと言っても単なる遊びではなく、「フレームゲーム」と呼ばれる、グループでの情報収集や意志決定、また教育やトレーニングの教材として使えるいろいろなゲームです。

スケーラビリティに関するベストプラクティス:eBayからの教訓

eBayが日々挑んでいる主要なアーキテクチャの勢力は、スケーラビリティです。これはアーキテクチャや設計に関するあらゆる意思決定を特徴づけたり、駆り立てたりします。