読書会(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/
------------------------------------------------------------


[ 戻る ]