Date: Sat, 25 Dec 99 17:32:20 JST From: SHUDO Kazuyuki Subject: [JavaHouse-Brewers:29748] Re: java.lang.Compiler =?ISO-2022-JP?B?GyRCJEskRCQkJEYbKEI=?= To: java-house-brewers at java-house.etl.go.jp (JavaHouse Brewers ML) Message-Id: <199912250832.RAA31181@cafe.muraoka.info.waseda.ac.jp> 首藤です。 ちょっと気合い入れて書きます。 佐藤さん wrote: > JDK1.0以降で導入されたjava.lang.Compilerクラスというものについて > プログラマーの作成したAOTコンパイラやJITコンパイラを組み込むための > インターフェイスであるようで JIT コンパイラを作る際に必要とされる知識はやはり少なくなく、 しかも文書がほとんどありません。 以下、JIT の作り方に直結する話ではありませんが、 書きたいことを書かせてもらいます。 [要旨] JVM にも種類がある。どの JVM 向けに JIT を作るか? 理想的には、JVM が JIT コンパイラに提供するインタフェースが 標準化、統一、および、よく文書化されて、各種の JIT コンパイラと JVM を 組み合わせて使えると一部の利用者や研究者は嬉しいわけです。 しかし需要が大きくないことと、また、まだまだ他社との差別化が はかれる部分でもあるせいで、標準化は実現されていません。 標準化の動きがある、とも聞いたことがありません。 つまり、JIT コンパイラは各 JVM に依存しがちです。 僕が知る限り、各 JVM 独自の、文書化されていない関数を利用せずして JIT コンパイラは作れません。 ゆえに、JVM のソースコードを見ずして JIT コンパイラを書くのは かなり難しいです。 (しかし TYA (ftp://gonzalez.cyberus.ca/pub/Linux/java/) の作者は 『それをやった。clean room implementation だ。』と言っています。) 例えば Sun の JVM (classic VM) にしても次のような文書が あるにはありますが、 > 「TheJIT Compiler Interface Specification」 >     http://java.sun.com/docs/jit_interface.html この文書に書かれている内容と JNI だけを使って JIT コンパイラを作れるかというと、答えは NO です。 しかもこの文書は古く、現状 (JDK 1.2) を反映していません。 ひと口に JVM といっても様々に種類があります。 Sun がリリースしているものだけでも、僕の知る限り 3種類あります。 - classic VM SCSL でソースコードが公開されているのはこれ (だけ)。 - ResearchVM Sun Labs で開発された JVM。以前は ExactVM という名前だった。 ソースコードをもらうことも可能らしい。 (参考) http://www.sun.com/research/jtech/ [JavaHouse-Brewers:27853] asynchronous GC thread から始まるスレッド [JavaHouse-Brewers:28914] OOPSLA'99 Report(予告) [JavaHouse-Brewers:29147] ResearchVM - HotSpot VM そして、Sun 由来の各種 JDK がどの JVM を使っているかというと 以下の通りです。 java -version、または java -fullversion でヒントが得られます。 - classic VM 1.2.X for Win32 (production release) 1.2.X, 1.1.X for Solaris の reference implementation for Linux, FreeBSD, NetBSD, ... 1.3beta for Solaris - ResearchVM 1.2.X, 1.1.X for Solaris の production release - HotSpot VM 1.3beta for Win32 今後 (1.3 以上?) の for Solaris また、当然ながら、Sun のものとは異なる JVM も各種あります。 Sun 以外の企業は、classic VM を移植するか、JVM を独自開発するかしています。 - IBM JDK http://www.ibm.com/java/jdk/download/ Mixed Mode Interpreter (MMI) という独自の JVM を持っている。 - Kaffe http://www.transvirtual.com/ (Transvirtual 社) 1.0.5 の JIT コンパイラ (JIT3) は、それまでの JIT (JIT2) より ずいぶん速くなったそうです。 http://www.mail-archive.com/java-linux@java.blackdown.org/msg09972.html - Japhar http://www.japhar.org/ - ElectricalFire http://www.mozilla.org/projects/ef/ PC or WS 用ではない、例えば組み込み用まで含めて考えると、 もっともっとあります。例えば HP の Chai (http://www.chai.hp.com/) Sun の KVM (http://developer.java.sun.com/developer/earlyAccess/kvm/) さて、どの JVM 用の JIT コンパイラを作ろうか、と考えるとき、 それぞれ得失があるわけです。 もちろん JVM から作ってしまうというアプローチもありだと思います。 - classic VM * ソースコードも手に入るので (SCSL)、なんとか作れる。 * Linux などの JVM もこれなので、利用者も多いだろう。 (しかし Sun は HotSpot VM を Linux に移植予定だし、 IBM の JDK 1.2 が出て来ると、利用者はそちらに移るだろう。) * VM の構造ゆえの、性能の限界がある。 ハンドルの存在、一括 mark & sweep の GC など。 - ResearchVM * 利用者が多くないだろう。Solaris 用の JDK だけなので。 * exact GC のために、stack map の提供など JIT 側もあるていど頑張らねばならない。-> 作るのがちょっと大変。 * ソースコードを手に入れるには多少の覚悟が要る。 配布先は a small number of academic researchers に限られるので。 http://www.sun.com/research/jtech/source/ - HotSpot VM * 作れないだろう。ドキュメントもソースコードもないので。 - IBM の JDK、つまり Mixed Mode Interpreter (MMI) * 同上。 - Kaffe * ソースコードが手に入るので (GPL)、作れる。 * しかし、そこそこの性能でかつ移植性の高い JIT コンパイラ JIT3 がすでにある。 - Japhar * ソースコードが手に入るので (GPL)、作れる。 * まだ JIT もないので歓迎されるだろう。 * しかし (今のところ) 利用者は少ないだろう。 - ElectricalFire * もともとインタプリタを持たない、JIT の存在が前提の JVM。 * 元からある JIT にどこかしら勝つ覚悟がないと、手を付ける意味がないか。 - 組み込み用 JVM * 資源の制約 (メモリ, 計算能力) が厳しいので、JIT コンパイルによって 利益を産むのはなかなか難しい。 (通常の JIT は、バイトコードの 3〜十数倍のサイズの ネイティブコードを生成する。) * Chai などでは、JIT コンパイルではなく、 あらかじめコンパイル、生成しておいたネイティブコードと インタプリタを組み合わせられるようになっている。 他にも、考えるべき点はあります。 例えば、SCSL (Sun Community Source License) を受け入れるべきか否か。 いったん SCSL を受け入れて classic VM のソースコードを見たが最後、 Kaffe, Japhar など GPL な JVM への貢献は出来なくなってしまうかもしれません。 正確なところは知りませんが、そう主張する人がいます。 FSF の言うところのフリーソフトウェア (not フリーウェア) の発展に 貢献したいと考える方は、ぜひ Japhar や Kaffe や GCJ や GNU Classpath や Mauve Project に対してこそ貢献して欲しいです。 僕は Sun の non-commercial use source license や SCSL を受け入れたので、 Japhar 他への貢献は難しいです。#不可逆だ… GCJ http://sourceware.cygnus.com/java/ GNU Classpath http://www.gnu.org/software/classpath/ The Mauve Project http://sourceware.cygnus.com/mauve/ SHUDO Kazuyuki/首藤一幸 私をたばねないで あらせいとうの花のように shudoh at muraoka.info.waseda.ac.jp