Date: Fri, 9 Apr 99 13:50:47 JST From: SHUDO Kazuyuki Subject: [JavaHouse:7804] saving intermediate results of JIT compilation (Re: =?ISO-2022-JP?B?GyRCJU0lQyVIJTklMSE8JVckRxsoQg==?= VM =?ISO-2022-JP?B?GyRCJE41L0YwJHIkKyRKJGpBYSQvJDkka0p9SyEbKEI=?=) To: java-house at java-house.etl.go.jp (JavaHouse ML) Message-Id: <199904090448.NAA25973@cafe.muraoka.info.waseda.ac.jp> 首藤です。 村田さん wrote: > JITコンパイラのDLLを隠してJava起動が早くなるということ > は、起動するたびに、core APIなどの標準のクラスライブラ > リを毎回コンパイルし直しているのではあるまいか。 私もそう想像しています。 > コンパイル結果をバイナリファイルとして保持できない理由 > が何かありうるでしょうか。 JIT コンパイラ作成の経験からいいまして.. JIT コンパイラ作成初期の段階から、コンパイル(中間)結果を 保存することを意識して作っておかないと、ある程度作ってし まってから保存可能にするのはけっこう面倒です。 コンパイル結果を保存してしまえばいいではないか、と単純に 考えがちなのですが、JITコンパイルの処理には、実は、どう してもプログラム実行時にならないと行えないものがあります。 例えば、次のような処理です。 - シンボルの解決 (リンク) ネイティブコード中に関数のアドレスを書き込む - 実行時に値が決まる、ネイティブコード中の定数 文字列定数のアドレス、フィールド,メソッド構造体のアドレスなど - JVM 側のデータ領域への何かの書き込み shuJIT では、CatchFrame という catch 節を表す構造体に、 とある情報を追加しています。 ネイティブコードを保存可能な JIT コンパイラの動作は次のようになります。 1. プログラム実行前に行える処理を済ませる。 or 保存してあるネイティブコードを読み込む。 2. プログラム実行時にしか行えない処理を行う。 もし、実行前に行える処理にかかる時間より、保存したネイティ ブコードを読み込むのにかかる時間が大きければ、ネイティブ コードを保存する意味はありません。ネイティブコードを読み 込むコストも実は結構ばかにできません。ファイルなりデータ ベースから該当するネイティブコードを検索し、読み込むわけ ですから、もしそこでファイルアクセスが起きたら... あらかじめメモリに読み込んでおけばいいのですけどね。 SHUDO Kazuyuki/首藤一幸 私をたばねないで あらせいとうの花のように shudoh at muraoka.info.waseda.ac.jp