(57)【要約】  本発明のある実施形態は、バイトコードをネイティブコードへ動的にコンパイルし、より高速の実行を円滑に行うためにシステムを提供する。この方法は、混合モードシステムで動作し、コンパイルされたコードおよびインタプリタコードの両方の実行をサポートする。動作中、システムは、現在実行しているスレッドがインタプリタにより実行されているのかを周期的に判定する。現在実行しているスレッドがインタプリタにより実行されている場合、システムは、スレッドにより実行されるメソッドをロケートし、そのメソッドのバイトコードをネイティブコードへコンパイルする。次のこのメソッドの実行は、より高速に実行するネイティブコードを利用する。
2005509945.tif 000002
【特許請求の範囲】
【請求項１】
バイトコードをネイティブコードに動的にコンパイルし、より高速の実行を円滑に行う方法であって、
現在実行しているスレッドがインタプリタによって実行されているかどうかを周期的に判定するステップであって、現在実行しているスレッドがインタプリタによって実行されている場合、
該スレッドによって現在実行されているメソッドをロケートし、
次回の該メソッドの実行がネイティブコードを実行するように、該メソッドのバイトコードをネイティブコードにコンパイルする、ステップ
を包含する、方法。
【請求項２】
前記メソッドをコンパイルする前に、前記スレッドの実行を中断するステップと、該メソッドが完了した後に、該スレッドの実行を再開するステップとをさらに包含する、請求項１に記載の方法。
【請求項３】
前記スレッドの実行を再開するステップは、バイトコードを利用するインタプリタされたモードの前記メソッドの実行を再開するステップを含む、請求項２に記載の方法。
【請求項４】
前記スレッドの実行を再開するステップは、バイトコードを利用するインタプリタされたモードの前記メソッドではなく、ネイティブコードを利用して該メソッドの実行を再開するステップを含む、請求項２に記載の方法。
【請求項５】
ネイティブコードを利用して前記スレッドの実行を再開するステップは、プロセススタックの起動レコードをコンパイルされたバージョンの該起動レコードで置換するステップを含む、請求項４に記載の方法。
【請求項６】
周期的に現在実行しているスレッドを試験するステップは、インタラプトを受け取った後に、該現在実行しているスレッドを試験するステップを含む、請求項１に記載の方法。
【請求項７】
前記インタラプトは、オペレーティングシステムのインタラプトを周期的に発生させるチックタイマーから受け取られる、請求項６に記載の方法。
【請求項８】
メモリスペースを開放するために、メソッドのネイティブコードを周期的に除去し、それにより、次回の該メソッドの実行に、インタプリタされたモードでバイトコードを実行させるステップをさらに包含する、請求項１に記載の方法。
【請求項９】
所定の閾値に整合しない場合に、前記メソッドをネイティブコードへコンパイルしないステップであって、所定の閾値との整合とは、
プロセッサタイムのアローワンスを越えること、
メモリ使用のアローワンスを超えること、または、
メモリストレージの割り当てを超えること
を含み得る、ステップをさらに包含する、請求項１に記載の方法。
【請求項１０】
コンピュータによって実行される際に、バイトコードをネイティブコードに動的にコンパイルし、より高速の実行を円滑に行う方法をコンピュータに実行させるコンピュータ読み出し可能ストレージメディアであって、
現在実行しているスレッドがインタプリタによって実行されているかどうかを周期的に判定することであって、現在実行しているスレッドがインタプリタによって実行されている場合、
該スレッドによって現在実行されているメソッドをロケートし、
次回の該メソッドの実行がネイティブコードを実行するように、該メソッドのバイトコードをネイティブコードにコンパイルすること
を含む、コンピュータ読み出し可能ストレージメディア。
【請求項１１】
前記メソッドをコンパイルする前に、前記スレッドの実行を中断することと、該メソッドが完了した後に、該スレッドの実行を再開することとをさらに含む、請求項１０に記載のコンピュータ読み出し可能ストレージメディア。
【請求項１２】
前記スレッドの実行を再開することは、バイトコードを利用するインタプリタされたモードの前記メソッドの実行を再開することを含む、請求項１１に記載のコンピュータ読み出し可能ストレージメディア。
【請求項１３】
前記スレッドの実行を再開することは、バイトコードを利用するインタプリタされたモードの前記メソッドではなく、ネイティブコードを利用して該メソッドの実行を再開することを含む、請求項１１に記載のコンピュータ読み出し可能ストレージメディア。
【請求項１４】
ネイティブコードを利用して前記スレッドの実行を再開することは、プロセススタックの起動レコードをコンパイルされたバージョンの該起動レコードで置換することを含む、請求項１３に記載のコンピュータ読み出し可能ストレージメディア。
【請求項１５】
周期的に現在実行しているスレッドを試験することは、インタラプトを受け取った後に、該現在実行しているスレッドを試験することを含む、請求項１０に記載のコンピュータ読み出し可能ストレージメディア。
【請求項１６】
前記インタラプトは、オペレーティングシステムのインタラプトを周期的に発生させるチックタイマーから受け取られる、請求項１５に記載のコンピュータ読み出し可能ストレージメディア。
【請求項１７】
メモリスペースを開放するために、メソッドのネイティブコードを周期的に除去し、それにより、次回の該メソッドの実行に、インタプリタされたモードでバイトコードを実行させることをさらに含む、請求項１０に記載のコンピュータ読み出し可能ストレージメディア。
【請求項１８】
所定の閾値に整合する場合に、前記メソッドをネイティブコードへコンパイルしないことであって、所定の閾値との整合とは、
プロセッサタイムのアローワンスを越えること、
メモリ使用のアローワンスを超えること、または、
メモリストレージの割り当てを超えること
を含み得る、ことをさらに含む、請求項１０に記載のコンピュータ読み出し可能ストレージメディア。
【請求項１９】
バイトコードをネイティブコードに動的にコンパイルし、より高速の実行を円滑に行う装置であって、
現在実行しているスレッドがインタプリタによって実行されているかどうかを周期的に判定するように構成された判定メカニズムと、
動的な比較メカニズムであって、
該スレッドによって現在実行されているメソッドをロケートし、
次回の該メソッドの実行がネイティブコードを実行するように、該メソッドのバイトコードをネイティブコードにコンパイルする
ように構成された、メカニズム
を備える、装置。
【請求項２０】
前記メソッドをコンパイルする前に、前記スレッドの実行を中断するし、該メソッドが完了した後に、該スレッドの実行を再開するように構成された制御メカニズムをさらに備える、請求項１９に記載の装置。
【請求項２１】
前記制御メカニズムは、バイトコードを利用するインタプリタされたモードの前記メソッドの実行を再開することによって、該スレッドの実行を再開するように構成される、請求項２０に記載の装置。
【請求項２２】
前記制御メカニズムは、バイトコードを利用するインタプリタされたモードの前記メソッドではなく、ネイティブコードを利用して該メソッドの実行を再開することによって、該スレッドの実行を再開するように構成される、請求項２０に記載の装置。
【請求項２３】
前記スレッドの実行を再開しつつ、前記制御メカニズムは、プロセススタックの起動レコードをコンパイルされたバージョンの該起動レコードで置換することによって、ネイティブコードを利用するように構成される、請求項２２に記載の装置。
【請求項２４】
前記判定メカニズムは、インタラプトを受け取った後に、現在実行しているスレッドを試験するように構成される、請求項１９に記載の装置。
【請求項２５】
前記インタラプトは、オペレーティングシステムのインタラプトを周期的に発生させるチックタイマーから受け取られる、請求項２４に記載の装置。
【請求項２６】
メモリスペースを開放するために、メソッドのネイティブコードを周期的に除去し、それにより、次回の該メソッドの実行に、インタプリタされたモードでバイトコードを実行させるように構成される逆最適化（ｄｅ−ｏｐｔｉｍｉｚａｔｉｏｎ）をさらに備える、請求項１９に記載の装置。
【請求項２７】
前記コンパイルメカニズムは、所定の閾値に整合する場合に、前記メソッドをネイティブコードへコンパイルしないように構成され、所定の閾値との整合とは、
プロセッサタイムのアローワンスを越えること、
メモリ使用のアローワンスを超えること、または、
メモリストレージの割り当てを超えること
を含み得る、請求項１９に記載の装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータシステムのコンパイラに関する。より詳細には、本発明は、より高速のプログラムの実行を円滑にするために、動的にバイトコードをネイティブコードにコンパイルする方法および装置に関する。
【背景技術】
【０００２】
（関連技術）
インターネットの指数関数的な成長は、１つとして、Ｐａｌｏ  Ａｌｔｏ，ＣＡのＳｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ，Ｉｎｃ．により配布されているプログラミング言語ＪＡＶＡ（登録商標）等のコンピュータ言語の開発に刺激されてきた。ＪＡＶＡ（登録商標）プログラミング言語は、アプリケーションをプラットフォームに独立のバイトコードを含むモジュールへとコンパイルすることを可能にし、多くの異なるコンピュータシステムのネットワークを介して配布され得る。ＪＡＶＡ（登録商標）仮想マシン等の、対応するプラットフォームに独立の仮想マシンを処理する任意のコンピュータシステムにより、バイトコードを実行することが可能である。このように、単一の形式のアプリケーションは、多数の異なるコンピューティングプラットフォームに容易に配布し得、かつ実行し得る。
【０００３】
アプリケーションがプラットフォームに独立の形式で受信されるとき、インタプリタにより直接インタプリタされ得るか、または、そのコンピューティングプラットフォームのネイティブアーキテクチャ用のマシンコードにコンパイルされ得る。マシンコードは、インタプリタコードと比較して著しく高速に実行される。しかし、コンパイルされたコードは、インタプリタコードと比較して著しく広いスペースを占有する。従って、インタプリタコードをコンパイルするかどうかの判定は、メモリスペース対実行速度の相対的な重要性に依存する。
【０００４】
いくつかの「混合モード（ｍｉｘｅｄ−ｍｏｄｅ）」コンピュータシステムは、コンパイルされたコードおよびインタプリタコードの両方の実行をサポートする。どのメソッドをコンパイルすべきか、および、どのメソッドをインタプリタによって実行される状態にしておくべきかを判定することは、難しい問題となり得る。このことは、特に、メモリスペースが制限されるためにコンパイルされるメソッドを収容することができず、通常、仮想メモリシステム用のセカンダリストレージにスワップスペースを備えていない、ポケットサイズのコンピュータデバイス等の制約付きのメモリシステムに当てはまる。このことは、コンパイルされるメソッドを格納するためのより多くのメモリを有し、利用されていないコンパイルされるメソッドをセカンダリストレージのスワップスペースに移動させる仮想メモリシステムに依存し得る、比較的大型のコンピュータシステムにおいては大きな問題にはならない。
【０００５】
多くの場合、スペシャルプロファイリングセッションにより得られる静的な情報を用いて、どのメソッドをコンパイルするべきかを判定し得る。しかし、プロファイリング情報に基づいてコンパイルするシステムは、状況によって真を保持しないかもしれないという仮定の上で動作する。メソッドは、非常に多くの回数呼び出される場合もあれば、プロファイリングの間、全く呼び出されない場合もある。さらに、プロファイリングは、静的な情報を集めるメソッドが実行される必要があり、さらなる時間を必要とする。さらに、プロファイリングコードは、貴重なスペースを占有する。
【０００６】
どのメソッドを完了するべきかを判定する別の可能な方法は、呼び出しカウンターを利用することである。各メソッドは、専用の呼び出しカウンターを有し得、この呼び出しカウンターは、メソッドが実行されるたびにインクリメントされる。メソッドがコンパイルされるのは、そのメソッドに対応する呼び出しカウンターが所定の値を超えたときである。しかし、この技術は、欠陥を有する。すなわち、呼び出しカウンターがスペースを占有すること、時々利用されるメソッドが最終的にはコンパイルされること、呼び出しカウンターが所定値に達する前のインタプリタされたモードのメソッドの実行が、計算時間の量を著しく消費することである。
【発明の開示】
【発明が解決しようとする課題】
【０００７】
従って、必要とされるのは、上述の技術の問題なく、バイトコードをネイティブコードへ動的にコンパイルする方法および装置である。
【課題を解決するための手段】
【０００８】
（要旨）
本発明のある実施形態は、バイトコードをネイティブコードへ動的にコンパイルし、より高速の実行を円滑に行うためにシステムを提供する。この方法は、混合モードシステムで動作し、コンパイルされたコードおよびインタプリタコードの両方の実行をサポートする。動作中、システムは、現在実行しているスレッドがインタプリタにより実行されているのかを周期的に判定する。現在実行しているスレッドがインタプリタにより実行されている場合、システムは、スレッドにより実行されるメソッドをロケートし、そのメソッドのバイトコードをネイティブコードへコンパイルする。次のこのメソッドの実行は、より高速に実行するネイティブコードを利用する。
【０００９】
この実施形態の変形では、現在実行しているスレッドが停止する一方で、比較プロセスが行われる。比較プロセスの完了時に、スレッドの実行が再開される。
【００１０】
さらなる変形では、スレッドの実行が再開される際に、バイトコードを利用するインタプリタで再開される。
【００１１】
さらなる変形では、スレッドの実行が再開される際に、バイトコードを利用するインタプリタによってではなく、コンパイルされたネイティブコードを利用して再開される。
【００１２】
さらなる変形では、スレッドの実行がコンパイルされたネイティブコードを利用して再開される際に、システムは、スタックの起動レコードをコンパイルされたバージョンの起動レコードと置換する。
【００１３】
この実施形態の変形では、システムは、インタラプトを受け取った際に、現在実行しているスレッドがインタラプタで実行しているのかを判定する。
【００１４】
さらなる変形では、インタラプトは、オペレーティングシステムのインタラプトを周期的に発生されるチックタイマーから受け取られる。
【００１５】
この実施形態の変形では、システムは、メモリスペースを開放するために、選択されたメソッドのネイティブコードを除去することによって、コードを周期的に逆最適化（ｄｅ−ｏｐｔｉｍｉｚｅ）する。このことは、次回のこのメソッドの実行に、インタラプトされたモードでバイトコードを実行させる。
【００１６】
この実施形態の変形では、システムは、コンパイラのスロットリングを利用する。コンパイラのストットリングの間、システムは、ある閾値が超過された場合に、バイトコードをネイティブコードへコンパイルする機会をスキップする。これらの閾値は、コンパイラに分割されたプロセッサタイムの量を超過すること、コンパイラのメモリアローワンスを超過すること、またはメモリストレージ割り当てを超過することを含み得る。
【発明を実施するための最良の形態】
【００１７】
以下の説明は、任意の当業者が本発明を製作および利用することを可能にし、かつ、特定の用途およびその要件の文脈で提供される。開示される実施形態に対するさまざまな改変が、当業者には容易に明らかであり、本明細書中で規定される一般原理は、本発明の意図および範囲から逸脱することなく、ほかの実施形態および用途に適用され得る。したがって、本発明は、示される実施形態に限定されず、本明細書中に記載される原理および特徴と一致する最大範囲で許容され得る。
【００１８】
この詳細な説明において記載されるデータ構造およびコードは、通常、コンピュータ読み出し可能ストレージメディアに格納される。コンピュータ読み出し可能ストレージメディアは、コンピュータシステムが利用するコードおよび／またはデータを格納し得る任意のデバイスまたはメディアであり得る。これは、ディスクドライブ、磁気テープ、ＣＤ（コンパクトディスク）、およびＤＶＤ（デジタル多目的ディスク、またはデジタルビデオディスク）等の磁気および光学ストレージデバイス、ならびに、送信メディアに組み込まれ他コンピュータ命令信号（信号が変調される際の搬送波によってか、または、よらずに）を含むが、これらに限定されない。例えば、送信メディアは、インターネット等の通信ネットワークを含み得る。
（コンピューティングデバイス）
図１は、本発明の実施形態による開発システム１０６に接続されたコンピュータデバイス１１０を示す。開発システム１０６は、通常、マイクロプロセッサ、メインフレームコンピュータ、デジタル信号プロセッサ、ポータブルコンピューティングデバイス、パーソナルオーガナイザ、デバイスコントローラ、またはアプライアンス内のコンピューショナルエンジンに基づくコンピュータシステムを含む任意のタイプのコンピュータシステムを含み得るが、これらに限定されない。開発システム１０６は、開発ユニット１０８を含み、開発ユニット１０８は、プラットフォームに独立のアプリケーションを開発するプログラミングツールを含む。これは、通常、アプリケーションをソースコード形式から、ＪＡＶＡ（登録商標）バイトコード等のプラットフォームに独立の形式へコンパイルすることに関連する。
【００１９】
開発システム１０６は、通信リンク１１２を介してコンピューティングデバイス１１０に接続される。コンピューティングデバイス１１０は、メインフレームコンピュータ、サーバコンピュータシステム、パーソナルコンピュータシステム、ワークステーション、ラップトップコンピュータシステム、パケットサイズコンピュータシステム、パーソナルオーガナイザ、またはデバイスコントローラを含む任意のタイプのコンピューティングデバイスまたはシステムであり得るが、これらに限定されない。コンピューティングデバイス１１０はまた、ページャ、携帯電話、テレビ、自動車、またはアプライアンス等の別のデバイス内に組み込まれたコンピューティングデバイスを含み得る。
【００２０】
通信リンク１１２は、任意のタイプの永続的または一時的通信チャネルを含み得る。このチャネルを利用して、開発システム１０６からコンピューティングデバイス１１０にデータを転送し得る。イーサネット（登録商標）等のコンピュータネットワーク、ワイヤレス通信リンク、または電話線を含み得るが、これらに限定されない。
【００２１】
コンピューティングデバイス１１０は、コードおよびデータを格納するデータストア１１４を含む。コンピューティングデバイス１１０はまた、データストア１１４から取り出されたプラットフォームに独立のアプリケーションを処理する仮想マシン１１６を含む。
【００２２】
開発プロセスの間に、クラスファイル１１８は、開発ユニット１０８内で生成される。クラスファイル１１８は、コンピューティングデバイス１１０に実行されるプラットフォームに独立のアプリケーションのコンポーネントを含む。例えば、クラスファイル１１８は、オブジェクト指向のクラスに関連するメソッドおよびフィールドを含み得る。なお、これらのメソッドは、プラットフォームに独立のバイトコード１１９を利用して指定される。
【００２３】
次に、クラスファイル１１８は、通信リンク１１２を介して、開発ユニット１０８からコンピューティングデバイス１１０内のデータストア１１４に転送される。このことにより、仮想マシン１１６は、クラスファイル１１８内のコンポーネントを利用するアプリケーションを実行することができる。なお、仮想マシン１１６は、通常、Ｐａｌｏ  Ａｌｔｏ  ＣａｌｉｆｏｒｎｉａのＳＵＮ  Ｍｉｃｒｏｓｙｓｔｅｍｓ，Ｉｎｃ．によって開発されたＪＡＶＡ（登録商標）  ＶＩＲＴＵＡＬ  ＭＡＣＨＩＮＥ（登録商標）等の、プラットフォームに独立のコードを実行可能である任意のタイプの仮想マシンを含み得る（Ｓｕｎ、Ｓｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ、Ｊａｖａ（登録商標）、および、Ｊａｖａ（登録商標）  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅは、米国および他の国におけるＳｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ，Ｉｎｃ．の（登録）商標である）。
【００２４】
仮想マシン１１６は、仮想マシン１１６で実行するコードによって操作されるオブジェクトを格納するオブジェクトヒープ１２２を含む。オブジェクトヒープ１２２はまた、コンポイルされたメソッド１２３を格納する。
【００２５】
仮想マシン１１６はまた、インタプリタ１２０を含み、インタプリタ１２０は、データストア１１４から取り出されたプラットフォームに独立のバイトコード１１９をインタプリタして、プログラムの実行を円滑にする。実行中、インタプリタ１２０は、通常、バイトコード１１９がインタプリタ１２０に連続して読み出されるときに、１つのバイトコードを翻訳する。
【００２６】
もしくは、仮想マシンは、コンパイラ１２１を利用して、メソッドをバイトコード形式からマシンコード形式へコンパイルし、コンパイルされたメソッド１２３を作成し得る。コンパイルされたメソッド１２３は、オブジェクトヒープ１２２に格納される。
【００２７】
なお、コンパイルされたメソッドは、関連する起動レコードからの情報に沿って、コンパイルされたメソッドと等価なインタプリタコードを復元し得る。もしくは、コンパイルされたメソッドと等価なインタプリタコードは、再度データストア１１４から取り出され得る。このように、コンパイルされたメソッドと等価なインタプリタコードは、通常、いつでも取得され得る。
【００２８】
仮想マシン１１６は、ランタイムシステム１２４を含む。ランタイムシステム１２４は、スレッド１３０〜１３１のステート情報を保持する。このステート情報は、それぞれ実行スタック１４０〜１４１を含む。実行スタック１４０〜１４１は、それぞれスレッド１３０〜１３１によって実行されるメソッドの起動レコードを格納する。
【００２９】
ランタイムシステム１２４は、インタプリタ１２０から受け取ったコードか、またはオブジェクトヒープ１２２から受け取ったコンパイルされたメソッド１２３のどちらかを実行し得る。メソッドが仮想マシン１１６によって呼び出されるとき、システムはまず、メソッドがインタプリタされたメソッドとして呼び出されるべきかどうかを判定する。インタプリタされたメソッドとして呼び出されるべき場合、ランタイムシステム１２４は、インタプリタ１２０からメソッドを取得する。
【００３０】
一方、システムが、メソッドがコンパイルされたメソッドとして呼び出されるべきであると判定した場合、ランタイムシステム１２４は、コンパイラ１２１を起動する。コンパイラ１２１は、バイトコードからマシンコード命令を生成する。これらのマシンコード命令は、続いて、ランタイムシステム１２４によって実行される。
【００３１】
仮想マシンはまた、ガーベッジコレクタ１５０を含む。ガーベッジコレクタ１５０は、周期的にオブジェクトヒープ１２２から利用されていないストレージを回収する。なお、ガーベッジコレクタ１５０はまた、コンパイルされたメソッドを除去して、ストレージを回収し得る。
（動的にメソッドをコンパイルするシステムのプロセス）
図２は、本発明の実施形態による、メソッドを動的にコンパイルするシステムの動作を示すフローチャートである。このシステムは、現在実行しているスレッドがインタプリタ１２０により実行されているのかどうかを判定することによって開始する（ステップ２００）。このプロセスは、インタラプトによってトリガーされ得るか、または、トリックタイマーからトリガーされ得る。現在実行しているスレッドがインタプリタ１２０により実行されている場合、システムは、スレッドによって実行されるメソッドをロケートする（ステップ２０２）。最終的に、システムは、次回の実行でこのコンパイルされたメソッドを利用するように、このメソッドをネイティブコードへコンパイルする（ステップ２０４）。
（メソッドをコンパイルするプロセス）
図３は、本発明の実施形態による、メソッドをコンパイルするプロセスを示すフローチャートである。このシステムは、実行しているスレッドを中断することによって開始する（ステップ３０２）。なお、このステップは、全ての環境において必ずしも必要ではない。例えば、現在の実行を中断することなく将来実行するメソッドをコンパイルすることは、有益であり得る。
【００３２】
次に、このシステムは、メソッドのバイトコードをネイティブコードへコンパイルする（ステップ３０４）。
【００３３】
最終的に、このシステムは、スレッドの実行を再開する（ステップ３０６）。スレッドの実行を再開する際に、このシステムは、いくつかのオプションを有する。１つのオプションは、システムが、スレッドが中断された点から、インタプリタによってスレッドの実行を再開することである。次回のこのメソッドの読み出しは、ネイティブコードバージョンのメソッドを利用する。
【００３４】
第２のオプションは、まさにコンパイルされたネイティブコードを利用して、スレッドの実行を再開する。この場合、スタックの起動レコードは、コンパイルされたバージョンの起動と置換する必要があり得る。本発明の実施形態の以上の説明は、例示および説明のためにのみ示された。これらは、包括的である、または、開示される形式に本発明を制限することを意図していない。したがって、多くの改変および変形が、当業者には明らかである。さらに、上述の開示は、本発明を制限することを意図しない。本発明の範囲は、添付の特許請求の範囲によって規定される。
【図面の簡単な説明】
【００３５】
【図１】図１は、本発明の実施形態による、コンピューティングデバイスを示す。
【図２】図２は、本発明の実施形態による、メソッドを動的にコンパイルするシステムの動作を示すフローチャートである。
【図３】図３は、本発明の実施形態による、メソッドをコンパイルするプロセスを示すフローチャートである。
【図１】
2005509945.tif 000003
【図２】
2005509945.tif 000004
【図３】
2005509945.tif 000005
【国際調査報告】
2005509945.tif 000006
2005509945.tif 000007
2005509945.tif 000008