読書会(Java仮想マシン仕様)第5回議事録
[ 戻る ]
第5回読書会議事録
日時:2000年 2月 26日(土) 10〜16時
場所:Javaカンファレンス事務局会議室(曙橋)
出席者(敬称略):高橋・橋本・斉藤・布留川・山下・遠藤・小川
・酒井・宮崎・前橋(記)
金山・小川・鷲見・前橋・高橋(記)
範囲:
宮崎さん訳の第2版 5章(5.3節から)
6章はインストラクションの説明なので飛ばして、
日本語版 第7章 終わりまで
内容:
5.3(5章については、l.??とあったら、宮崎さん訳の行番号を意味する)
・ブートストラップクラスローダは、JDK1.2から使われている言葉で、
以前は「システムクラスローダ」と呼ばれていた。
・「配列クラスの生成」とあるが(l.396)、配列は、クラスとして
存在するのか?
→型と次元毎に独立して存在する。
・ユーザクラスローダを作成するのはどういう場合か?
→サーブレットエンジン
→ブラウザ
・名前空間の話。名前空間は、クラスローダ毎に独立している?
→ブラウザは、URL毎にクラスローダを作成するので、クラスの
名前空間が独立する。だから、例えばMyAppletというアプレッ
トがInternet上にたくさんあったとしても、独立して実行できる。
→クラスローダ毎に名前空間が完全に独立しているのなら、
java.lang.String のようなクラスはどうなるのか?
→システムクラスローダは別扱いらしい。
→「Javaバーチャルマシン」p.105によれば、
「JDK1.1までは、このloadClass()メソッドをサブクラスでオーバ
ライドする以外にユーザクラスローダを実装する方法がありま
せんでしたが、JDK1.2からはかなり細かい処理を行ないたい場合
以外はloadClass()メソッドをオーバライドする必要がなくなり、
(中略)
デフォルトのloadClass()はすでにロードしたクラスのキャッシ
ングや、これからロードしようとするクラスがCLASSPATHから
たどれるところにあるクラスである場合にシステムクラスローダを
呼び出すなど(後略)」
とある。
→「Dynamic Class Loading in the Java Virtual Machine」(後述)
によれば、MyClassLoaderのサンプル実装(p.38)のloadClass()の
実装で、まずfindSystemClass()を実行している。つまり、
システムクラスローダで見つからなかった場合に、ユーザクラス
ローダを使うように、ユーザクラスローダを実装するらしい。
・クラスがロードされているかどうかを確認することは出来るのか?
→できるような気はするけれど、やってもそんなに意味がないのでは。
5.3.4 ロード制約
・l.696からの4つの条件
→NL が決まれば C は一意に決定するのではなかったの?
→AND条件である。ひとつめとふたつめが同時に成立するのは別に
変なことではない。
→3つめ、「ロード制約」は、いつ誰が設定するのか?
→4つめ、C ≠C' は、どのように判定するのか?
・「クラスローダや形式の安全性についての完全な議論はこの仕様の
範囲からはずれます(l.725)」包括的な議論は、"Dynamic Class
Loading in the Java Virtual Machine"を読みなさい、ということ
なので、Webから探してコピーして全員に配布した。
5.3.5
・l.751のLinking Errorって、何故エラー?
→ここでは、ロードした表現からクラスまたはインタフェイスを
取得する話をしている。既に存在した場合、ロードしたこと自体が
何かの間違いなので、エラーにするのではないか?
→本当にこのエラーって発生するのだろうか?
5.4.2
・TiL1 = TiL2をTnまで確認するらしいけど、nは何の数?
→メソッドの引数の数。
・ちょっと脱線して、メソッドのディスクリプタ、シグニチャに関する
議論。
→ディスクリプタは、戻り値と引数を含む(クラスファイルのフォー
マットで定義)。
→シグニチャは、メソッド名と引数を含む(Java文法で定義)。
5.4.3.3
・メソッドの解決って、クラスをロードしたときの話?
それともメソッドを読んだときの話?
→文脈から言って、ロードした時のことではないかな。
次にどこを読むか議論になるが、6章は、インストラクションリファ
レンスで、しかもアルファベット順なので、飛ばして「Java仮想
マシン仕様(日本語版) 第7章」ということに決まった。
・p.279の
・p.282のfor文の例、なんで第3式を先に吐くんだろう?
→p.286のwhlieの例の説明からすると、高速化のためらしい。
・p.282のforの例、ループのたびに100をpushしてるようだけど。
→比較のためにはスタック上になければいけないんだからしょう
がない。
→スタックマシンとはそういうもの。
・p.284 整数型の扱いについて、
→オペランドスタック・ローカル変数については、byteやshortは
存在しない。常にintで、演算してから切り捨てる。
→でも、byte配列をintの配列として扱ってたら、いくらなんでも
もったいない。baload, bastore, saload, sastoreのような命
令があるんだから、配列ではbyteの配列やshortの配列もあるら
しい。
→フィールドでは? インストラクションにはgetfieldとか
putfieldしかない。具体的には実装依存か?
・p.285で、1〜2バイトの整数リテラルは、bipush, sipushでスタッ
クにpushできるのに、32ビット必要な値はいきなりコンスタント
プールなのか。ほう。
→2バイトまでの数値が扱えれば大抵の場合問題ないと思われてる
のかなあ。
・p.287 NaNの扱いもちゃんと決められていることに感心。
→NaNを番兵に使うことについての議論。
・p.293の最初の例。invokeの前のdupは必要か?
→invokeで消えちゃうから必要。
・p.295の下のほうの例。multianewarrayの、
multianewarray #1 dim #3
について。
→「Javaバーチャルマシン」のmultianewarrayの解説(p.434)では、
multianewarray [[I 2
と書いてある。上の例の#3って余計なのでは?
→でも、javapは、#1 dim #3 という表現を生成する。
p.305 同期について
・synchronizedの中で例外が発生した場合には?
→ロックが外れる。問題ない。
次回予定:
第1候補 3/25
第2候補 3/11
内容は、8章・9章
そろそろ読み終わるけど、次に読む本は?:
「計算機プログラムの構造と解釈第二版」を強く推薦する人あり。
以上
P.S.間違い、足りないところなどあれば補足願います。
------------------------------------------------------------
前橋 和弥 maebashi@cse.co.jp
http://web.archive.org/web/20010604223247/http://member.nifty.ne.jp/maebashi/
------------------------------------------------------------
[ 戻る ]