Date: Sat, 25 Dec 99 19:10:59 JST From: SHUDO Kazuyuki Subject: [JavaHouse-Brewers:29751] Re: java.lang.Compiler =?ISO-2022-JP?B?GyRCJEskRCQkJEYbKEI=?= To: java-house-brewers at java-house.etl.go.jp (JavaHouse Brewers ML) Message-Id: <199912251010.TAA31763@cafe.muraoka.info.waseda.ac.jp> 首藤です。 高木さん wrote: > 首藤さんはお忙しいのかな 12/14 - 12/21、インドに行っていました。 インドのエンジニア、とても優秀で仕事が速くて向上心が強いです。 それでいて (今のところ) 人件費が日本よりとても低い (約 1/10) のですから、 たくさんの仕事がインドに流れはじめています。 日本のソフトウェア産業、真剣にやばいです。 > Yoshiki Sato writes: > > このようにJITコンパイラをJDKに組み込むためには > > include-old/jit.h内で宣言されたフック関数を使用しなければならないと > > 解釈しています。このJITインターフェイスについての情報が唯一「TheJIT > > Compiler Interface Specification」のみであり、このインターフェイスを > > どのように実装すればよいのか思案しているところです。 > shuJITもそうですが、OpenJITのソースコードも参考になるでしょう。 > http://www.openjit.org/ 僕は OpenJIT 関係者ではないですが… > api.c というファイルの、java_lang_Compiler_start というfunctionで、 > 必要なフックのセットと、その他の初期化を行っています。 ここまではいいのですが、以下『ダウト』です。 > すると、クラスがロードされたときに、 > OpenJIT_CompilerCompileClass(ClassClass) が呼ばれるようになり、 OpenJIT_CompilerCompileClass(ClassClass *)、 つまり、フック p_CompilerCompileClass が呼ばれるのは、 java.lang.Compiler#compileCLass(Class) が呼ばれたときだけです。 また、厳密に言うと、クラスの load, link, initialize は 分けて考えるべきです。(cf. Java Virtual Machine Spec.) load, link と initialize は、実行されるタイミングが異なります。 > ここで、各メソッドについてJITコンパイルするよう、 > OpenJIT_compile(ExecEnv, struct methodblock) を呼んでいます。 本当にこの通りだとすると、クラスのロード時に、 そのクラスの全メソッドがコンパイルされてしまいます。 あるメソッドのコンパイルは、そのメソッドが実行される直前に行われます。 言い直すとこうなります。 クラスが初期化される直前に OpenJIT_InitializeForCompiler(ClassClass *)、 つまりフック p_InitializeForCompiler が呼ばれるようになる。 この関数は呼ばれると、各メソッドを表す構造体 struct methodblock のメンバ invoker を OpenJIT_invoke() に設定する。 メソッドが呼ばれる際にはこの invoker、つまり OpenJIT_invoke() が呼ばれる。 OpenJIT_invoke() が OpenJIT_compile() が呼び、 そこで様々な初期化が行った後、org.OpenJIT.Compile#compile() を呼ぶ。 > OpenJITがどのようなものであるかは、 > UNIX Magazine今月号の風間さんの記事の中にも紹介があるようです。 UNIX Magazine、チェックしなくなって久しいです。 探して読もうと思います。 > > この他にJITインターフェイスについての資料など > > ご存知の方がいらっしゃったらお教えください。 > > まあ、「これで作れない人にはどのみちJITコンパイラなど作れないよ」 > ということもあるのかもしれませんが、 現状、紙の資料だけを元に JIT コンパイラを作ろうというのはまず無理です。 件の JIT Interface (http://java.sun.com/docs/jit_interface.html) も ほとんど役に立ちません。気安め程度です。 仮にターゲットを Sun の classic VM に絞ったとしても、 JVM のソースコードとの格闘はまず避けられないと思います。 しかし、JVM のソースを見ずに作られた TYA の例もありますし、 今なら OpenJIT, TYA, shuJIT など classic VM 用 JIT コンパイラのソースも いくつか手に入るので、なんとかなるかもしれません。 > 首藤さんあたりに「JITを作ろう」なんて連載を > bit誌あたりに書いて欲しいなあなどと思っております。 いいですね。 そういえば雑誌記事の執筆はいまだに経験がありません。 もし、bit 誌の XORB 連載にならうとしたら… Japhar か Sun classic VM でもターゲットにして、 一歩一歩、JIT コンパイラが完成するまでを辿る…むぅ とても片手間じゃ済まないような気がしたりしなかったり 痛かったり痒かったり眠かったりします。 絶対どこかで原稿を落としそうな。 SHUDO Kazuyuki/首藤一幸 私をたばねないで あらせいとうの花のように shudoh at muraoka.info.waseda.ac.jp