Date: Sun, 1 Aug 99 16:46:04 JST From: SHUDO Kazuyuki Subject: [JavaHouse-Brewers:27047] shuJIT 0.3.2 To: java-house-brewers at java-house.etl.go.jp (JavaHouse Brewers ML) Message-Id: <199908010746.QAA30346@cafe.muraoka.info.waseda.ac.jp> 首藤です。 Sun 社の JVM (JDK,JRE) / FreeBSD,Linux / x86 用の JIT コンパイラ、 shuJIT の 0.3.2 をリリースしました。 http://www.shudo.net/jit/index-j.html (日本語) http://www.shudo.net/jit/ (英語) なかなか再現しにくい、いくつかのバグがとれました。 主な変更点は次の通りです。詳細は、付属の ChangeLog をご覧下さい。 [1] JDK 1.1 でも、クラスの初期化が Java 言語仕様 (JLS) 通りのタイミングで 行われるようにした。(cf. 12.4.1 When Initialization Occurs) [2] コンパイルされたメソッドでも、スタックトレースでソースコード中の 位置 (行) が表示されるようにした。 [3] ごく稀に SIGFPE で JVM が異常終了する問題に対処。 [4] JDK 1.2 で AWT を使ったプログラムがデッドロックし得る問題に対処。 [5] インタプリタによって実行されているメソッドが、 実行中にコンパイル完了した場合、JVM が落ち得る問題に対処。 [1] TYA (*) はクラス初期化 (static initializer & static field の初期化、の実行) のタイミングが、JLS の記述と異なります。 これをテストするコードが下の文章中にあります。 [JavaHouse-Brewers:21091] timing of class initialization 以前、いろいろな JVM を試したところ、JLS に準拠できていない JVM が けっこうありました。Navigator 4.0X (Symantec の古い JIT) とか IE 3.0X とか。 (*) JDK,JRE/Linux,FreeBSD/x86 用 JIT コンパイラ ftp://gonzalez.cyberus.ca/pub/Linux/java/ OpenJIT を x86 に移植している (した) Matt Welsh が JLS に準拠させる方法を尋ねてきたので、OpenJIT (FJIT も?) は (まだ) JLS に準拠できていないようです。 Matt からひとつアドバイスをもらって、 JDK 1.1 でも shuJIT を JLS に準拠させることができました。 [2] クラスファイル中にソースコードの行番号情報 (LineNumberTable attribute) が あっても、通常、JIT コンパイルされたメソッドは、バックトレース表示 (Throwable#printStackTrace()) の際、例外が発生したソース中の位置 (行) は 表示されず、単に `(Compiled Code)' と表示されてしまいます。 (ただし、HotSpot VM では例外発生位置が表示されるらしい。) JIT コンパイルされたメソッドについても、例外が発生した位置 (行) が 表示されるようにしました。 ただし、NullPointerException, ArithmeticException (0 での除算) の 発生位置は、残念ながら完全に正確ではないです。 [3] FPU の control word の内容がごく稀に破壊され、そのために (FPU の) 例外のマスクがはずれ、SIGFPE が発生していました。 [4] JDK 1.2 for Linux に対応できたと思っていたのですが、実は AWT を使ったプログラムをテストしていませんでした。 安松さんの文章 [JavaHouse-Brewers:24378] Linux JDK1.2 Font Tips を参考にフォントまわりの設定をして shuJIT を試験したところ、 AWT を使ったプログラムがハングアップ…モニタ関係のバグでした。 SHUDO Kazuyuki/首藤一幸 私をたばねないで あらせいとうの花のように shudoh at muraoka.info.waseda.ac.jp