(57)【特許請求の範囲】
【請求項１】
複数の命令を実行するプロセッサであって、少なくとも１つのコア及び動的言語アクセラレータを含み、前記動的言語アクセラレータと関連付けられたファイル記述子に関するメモリマップド入出力（ＭＭＩＯ）操作に応答してバイトコードを実行し、前記動的言語アクセラレータを用いて前記バイトコードを実行すべく、仮想マシンが、パス名を含むコールに従って、前記仮想マシンがアクセラレータを開くことが可能であると判断し、前記動的言語アクセラレータが前記バイトコードを実行している間、前記少なくとも１つのコアにおけるネイティブコードの実行をブロックし、システムコールを介して、前記動的言語アクセラレータをトリガする仮想マシンの仮想マシン状態に対して前記プロセッサのネイティブ状態のマッピングを構成し、前記仮想マシン状態はバイトコード状態を含み、識別子を前記仮想マシン状態と関連付け、前記動的言語アクセラレータに結合されたアクセラレータネイティブインタフェースをさらに備え、前記動的言語アクセラレータは、前記アクセラレータネイティブインタフェースを介して、ネイティブライブラリにコールバックし、前記ネイティブライブラリを用いて前記仮想マシン用の関数を実行して、前記関数が実行された後に、前記動的言語アクセラレータにおいて前記バイトコードの実行を継続する、プロセッサと、
前記プロセッサに結合されたシステムメモリと、
を備える、
システム。
【請求項２】
前記動的言語アクセラレータはハードウェア割り込みに応答して実行を中断し、前記プロセッサは前記ネイティブコードを実行して前記ハードウェア割り込みを処理し、前記ハードウェア割り込みが処理された後に、前記プロセッサは前記動的言語アクセラレータを再度トリガする、
請求項１に記載のシステム。
【請求項３】
前記動的言語アクセラレータは、前記ネイティブコードの実行の前に、前記識別子と関連付けられた前記バイトコード状態を記憶する、
請求項２に記載のシステム。
【請求項４】
前記仮想マシンは、前記ハードウェア割り込みが処理された後に、少なくとも１つのバイトコードを解釈し、その後、前記動的言語アクセラレータを再度トリガする、
請求項２又は３に記載のシステム。
【請求項５】
前記動的言語アクセラレータは、前記動的言語アクセラレータの実行中に生じた例外に応答して、前記例外を引き起こしたバイトコード命令の前の前記バイトコードの命令において実行を中断し、
前記プロセッサは、その後、前記バイトコードの少なくとも１つのバイトコード命令を解釈し、ネイティブ例外ハンドラを実行して前記例外を処理し、次に前記動的言語アクセラレータを再度トリガする、
請求項１から４の何れか一項に記載のシステム。
【請求項６】
プロセッサの動的言語アクセラレータを用いてバイトコードを実行すべく、仮想マシンが、パス名を含むコールに従って、前記仮想マシンがアクセラレータを開くことが可能であると判断し、前記動的言語アクセラレータ用のアクセラレータマッピング及び仮想マシン状態を構成し、前記仮想マシン状態を仮想マシンの識別子と関連付ける段階と、
入出力操作を実行して前記動的言語アクセラレータにおいて前記バイトコードの実行をトリガし、前記動的言語アクセラレータが前記バイトコードを実行している間、前記プロセッサのコアにおけるネイティブコードの実行をブロックする段階と、
前記動的言語アクセラレータのアクセラレータネイティブインタフェースを介して、ネイティブライブラリをコールし、前記動的言語アクセラレータ用の関数を処理する段階であって、前記プロセッサが、前記ネイティブライブラリを用いて前記仮想マシン用の関数を実行して、前記関数が実行された後に、前記動的言語アクセラレータにおいて前記バイトコードの実行を継続する、段階と、
前記動的言語アクセラレータが前記バイトコードの少なくとも一部を実行した後に、前記仮想マシンにおいて前記バイトコードの少なくとも１つのバイトコードを解釈する段階と、
を備える、
方法。
【請求項７】
ハードウェア割り込みに応答して、前記識別子と関連付けられたバイトコード状態を記憶し、その後、前記動的言語アクセラレータを中断し、ネイティブコードを実行して前記ハードウェア割り込みを処理する段階をさらに備える、
請求項６に記載の方法。
【請求項８】
前記ネイティブコードを実行して前記ハードウェア割り込みを処理した後に、前記少なくとも１つのバイトコードを解釈し、その後、前記動的言語アクセラレータを再度トリガして前記バイトコードをさらに実行する段階をさらに備える、
請求項７に記載の方法。
【請求項９】
例外に応答して、前記識別子と関連付けられたバイトコード状態を記憶し、その後、前記例外の前の命令において前記動的言語アクセラレータを中断し、ネイティブ例外ハンドラを実行して前記例外を処理する段階をさらに備える、
請求項６から８の何れか一項に記載の方法。
【請求項１０】
前記動的言語アクセラレータのアクセラレータネイティブインタフェースを介して、ネイティブライブラリをコールして前記動的言語アクセラレータ用の関数を処理する段階をさらに備える、
請求項６から９の何れか一項に記載の方法。
【請求項１１】
請求項６から１０の何れか一項に記載の方法を実行する手段を備える、装置。
【請求項１２】
請求項６から１０の何れか一項に記載の方法を実行する手順をコンピュータに実行させる、プログラム。
【請求項１３】
請求項１２に記載のプログラムを格納する、コンピュータ可読記憶媒体。
【請求項１４】
プロセッサの動的言語アクセラレータを用いてバイトコードを実行すべく、仮想マシンが、パス名を含むコールに従って、前記仮想マシンがアクセラレータを開くことが可能であると判断し、前記動的言語アクセラレータ用のアクセラレータマッピング及び仮想マシン状態を構成し、前記仮想マシン状態を仮想マシンの識別子と関連付ける手段と、
入出力操作を実行して前記動的言語アクセラレータにおいて前記バイトコードの実行をトリガし、前記動的言語アクセラレータが前記バイトコードを実行している間、前記プロセッサのコアにおけるネイティブコードの実行をブロックする手段と、
前記動的言語アクセラレータのアクセラレータネイティブインタフェースを介して、ネイティブライブラリをコールし、前記動的言語アクセラレータ用の関数を処理する手段であって、前記プロセッサが、前記ネイティブライブラリを用いて前記仮想マシン用の関数を実行して、前記関数が実行された後に、前記動的言語アクセラレータにおいて前記バイトコードの実行を継続する、手段と、
前記動的言語アクセラレータが前記バイトコードの少なくとも一部を実行した後に、前記仮想マシンにおいて前記バイトコードの少なくとも１つのバイトコードを解釈する手段と、
を備える、
システム。
【請求項１５】
前記動的言語アクセラレータが開かれることが可能かどうかを判断し、可能でなければ、前記仮想マシンにおいて前記バイトコードを解釈する手段をさらに備える、
請求項１４に記載のシステム。
【請求項１６】
前記仮想マシンにおいて前記少なくとも１つのバイトコードを前記解釈した後に、前記動的言語アクセラレータにおいて前記バイトコードの実行を再度トリガする手段をさらに備える、
請求項１４又は１５に記載のシステム。
【請求項１７】
ハードウェア割り込みに応答して、前記識別子と関連付けられたバイトコード状態を記憶し、その後、前記動的言語アクセラレータを中断し、ネイティブコードを実行して前記ハードウェア割り込みを処理する手段をさらに備える、
請求項１４から１６の何れか一項に記載のシステム。
【請求項１８】
前記ネイティブコードを実行して前記ハードウェア割り込みを処理した後に、前記少なくとも１つのバイトコードを解釈し、その後、前記動的言語アクセラレータを再度トリガして前記バイトコードをさらに実行する手段をさらに備える、
請求項１７に記載のシステム。
【請求項１９】
例外に応答して、前記識別子と関連付けられたバイトコード状態を記憶し、その後、前記例外の前の命令において前記動的言語アクセラレータを中断し、ネイティブ例外ハンドラを実行して前記例外を処理する手段をさらに備える、
請求項１４から１８の何れか一項に記載のシステム。
【発明の詳細な説明】
【背景技術】
【０００１】
いわゆるハードウェア（ＨＷ）／ソフトウェア（ＳＷ）の協調設計手法は、ｘ８６命令セットアーキテクチャ（ＩＳＡ）の後方互換性の問題を持たずに、パフォーマンス効率のよいプロセッサ（例えば、中央処理ユニット（ＣＰＵ））の設計を可能にする。パフォーマンス効率のよいＣＰＵは、内部実装ＩＳＡを（例えば、マイクロ操作（ｕｏｐｓ）の形で）実装し、内部コードモーフィングソフトウェア（ＣＭＳ）が、ｘ８６コードを実行用の内部実装ＩＳＡのコードに変換することで、ＣＰＵ上でｘ８６コード実行をエミュレートする。しかしながら、そのような変換を実行する際には複雑なことが多く、プロセッサ効率に影響し得る。これらの複雑なことの中には、Ｊａｖａ（登録商標）／ＪａｖａＳｃｒｉｐｔ（登録商標）／ＰＨＰなどの動的言語を可能にする仮想マシンにおいて実行時（ＪＩＴ）コンパイルを実行する上でのオーバヘッドがある。これらの言語は、内部実装ＩＳＡへの変換を達成すべく、異なるプラットフォーム上でポータブルバイトコードを実行するよう設計されている。
【図面の簡単な説明】
【０００２】
【図１】コード実行をアクセラレーションするためのコンピューティングデバイスの少なくとも１つの実施形態の簡略ブロック図である。
【０００３】
【図２】図１のコンピューティングデバイスの環境の少なくとも１つの実施形態の簡略ブロック図である。
【０００４】
【図３】本発明の別の実施形態に係るプロセッサのブロック図である。
【０００５】
【図４】本発明の一実施形態に係る方法のフロー図である。
【発明を実施するための形態】
【０００６】
様々な実施形態において、ＨＷ／ＳＷ協調設計動的言語アクセラレータがプロセッサに提供され、仮想マシン（ＶＭ）でのＪＩＴコンパイルの必要がなく、アクセラレータインタフェースを介してバイトコードが効率的に動作することを可能にする。
【０００７】
ここで図１を参照すると、コード実行をアクセラレーションし、本明細書で説明される機能を実行することが可能な任意の種類のコンピューティングデバイスとして、コンピューティングデバイス１００が具現化され得る。例えば、コンピューティングデバイス１００は、携帯電話、スマートフォン、タブレットコンピューティングデバイス、携帯情報端末、メッセージングデバイス、民生用電子デバイス、ハンドセット、ラップトップコンピュータ、デスクトップコンピューティング、及び／又は他のコンピューティング／通信デバイスとして具現化され得る。図１に示されるように、例示のコンピューティングデバイス１００は、プロセッサ１０２、入出力（Ｉ／Ｏ）サブシステム１０４、メモリ１０６、ハードウェアアクセラレータ１０８、１又は複数の周辺デバイス１１０、及びデータストレージ１１２を含む。もちろん、他の複数の実施形態では、コンピューティングデバイス１００は、コンピューティングデバイスで一般にみられるものなど（例えば、様々な入出力デバイス）、他の又は追加の複数のコンポーネントを含み得る。さらに、いくつかの実施形態では、例示の複数のコンポーネントのうちの１又は複数は、別のコンポーネントに組み込まれ得るか、そうでなければその一部を形成し得る。例えば、いくつかの実施形態では、メモリ１０６、又はその複数の部分は、プロセッサ１０２に組み込まれ得る。
【０００８】
プロセッサ１０２は、本明細書で説明される複数の機能を実行することが可能な任意の種類のプロセッサとして具現化され得る。例えば、プロセッサは、シングル又はマルチコアプロセッサ、デジタルシグナルプロセッサ、マイクロコントローラ、あるいは他のプロセッサ又は処理／制御回路として具現化され得る。同様に、メモリ１０６は、本明細書で説明される複数の機能を実行することが可能な任意の種類の揮発性又は不揮発性メモリ、あるいはデータストレージとして具現化され得る。動作中、メモリ１０６は、コンピューティングデバイス１００の動作中に用いられる、オペレーティングシステム、アプリケーション、プログラム、ライブラリ、及びドライバなどの様々なデータ及びソフトウェアを格納し得る。メモリ１０６は、プロセッサ１０２にＩ／Ｏサブシステム１０４を介して通信可能に結合され、Ｉ／Ｏサブシステム１０４は、コンピューティングデバイス１００のプロセッサ１０２、メモリ１０６、及び他の複数のコンポーネントとの入出力操作を容易にする回路及び／又はコンポーネントとして具現化され得る。例えば、Ｉ／Ｏサブシステム１０４は、メモリコントローラハブ、入出力制御ハブ、ファームウェアデバイス、通信リンク（例えば、ポイントツーポイントリンク、バスリンク、ケーブル、ライトガイド、プリント回路基板配線など）、及び／又は、他の複数のコンポーネント及びサブシステムとして具現化されるか、そうでなければそれらを含み得て、入出力操作を容易にする。いくつかの実施形態では、Ｉ／Ｏサブシステム１０４は、ＳｏＣの一部を形成し、コンピューティングデバイス１００のプロセッサ１０２、メモリ１０６、及び他の複数のコンポーネントと共に、単一の集積回路チップに組み込まれ得る。さらに、いくつかの実施形態では、プロセッサ１０２は、コード実行をアクセラレーションするバイトコードアクセラレーションサポート１１４を含む。バイトコードアクセラレーションサポート１１４は、プロセッサ１０２上で実行される１又は複数の命令又はバイトコードの実行をアクセラレーションすることが可能、且つ本明細書で説明される複数の機能を実行することが可能な任意の種類のコンポーネント又は回路として具現化され得る。
【０００９】
ハードウェアアクセラレータ１０８は、ソフトウェアアプリケーションと関連する１又は複数の命令又はバイトコードの実行をアクセラレーションすることが可能、且つ本明細書で説明される複数の機能を実行することが可能な任意の種類のハードウェアデバイス又はコンポーネントとして具現化され得る。例えば、ハードウェアアクセラレータ１０８は、グラフィックスアクセラレータ、浮動小数点アクセラレータ、又は他のハードウェアアクセラレータデバイスとして具現化されるか、そうでなければそれを含み得る。以下に論じられるように、いくつかの実施形態では、ハードウェアアクセラレータ１０８は、コンピューティングデバイス１００のオペレーティングシステム（ＯＳ）に依存しないコードをアクセラレーションするよう構成され得る。いくつかの実施形態では、ハードウェアアクセラレータ１０８は、コンピューティングデバイス１００の１又は複数の他のコンポーネントと共に、ＳｏＣの一部を形成し得る。
【００１０】
コンピューティングデバイス１００の周辺デバイス１１０は、任意の数の周辺／インタフェースのデバイス又はコンポーネントを含み得る。例えば、周辺デバイス１１０は、リモートデバイスと通信する通信回路を含み得る。周辺デバイス１１０に含まれる複数の特定のデバイスは、例えば、コンピューティングデバイス１００の使用目的に依存し得る。データストレージ１１２は、例えば、メモリデバイス及び回路、メモリカード、ハードディスクドライブ、ソリッドステートドライブ、又は他のデータストレージデバイスなど、データの短期又は長期保管用に構成された任意の種類の１又は複数のデバイスとして具現化され得る。
【００１１】
図２に示されるように、コンピューティングデバイス１００は、コードをアクセラレーションするための環境２００を確立し得る。例示の実施形態における環境２００は、仮想マシン２０２、アクセラレータランタイムライブラリ２０４、ＯＳアクセラレータデバイスドライバ２０６、アクセラレータ仮想デバイス２０８、及び内部動的バイナリ変換モジュール２１０を含むソフトウェア環境を提供する。
【００１２】
仮想マシン２０２は、コンピューティングデバイス１００を調べて、アクセラレータ仮想デバイス２０８がコンピューティングデバイス１００によりサポートされるかどうかを、例えば、Ｉ／Ｏ命令又は他のソフトウェアＩ／Ｏインタフェースを用いて判断し得る。アクセラレータランタイムライブラリ２０４は、アクセラレータ仮想デバイス２０８のアプリケーションプログラミングインターフェース（ＡＰＩ）を実装し得る。そうすることで、アクセラレータランタイムライブラリ２０４は、アクセラレータ仮想デバイス２０８がＯＳアクセラレータデバイスドライバ２０６及びメモリマップドＩ／Ｏを介してアクセスされることを可能にする。以下に論じられるように、いくつかの実施形態では、ＯＳアクセラレータデバイスドライバ２０６は、アクセラレータ仮想デバイス２０８を初期化するためだけに用いられる。その後、アクセラレータ仮想デバイス２０８は、メモリマップドＩ／Ｏを介してアクセスされ、コードアクセラレーションをトリガし得る。ＯＳアクセラレータデバイスドライバ２０６は、例えば、標準的なオペレーティングシステムＩ／Ｏ命令を用いて、アクセラレータ仮想デバイス２０８を初期化するのに用いられ得る。アクセラレータ仮想デバイス２０８は、コード実行をアクセラレーションするのに用いられ得る内部動的バイナリ変換モジュール２１０を含み得る。いくつかの実施形態では、内部動的バイナリ変換モジュール２１０は、ハードウェアアクセラレータ１０８、及び／又は、バイトコードアクセラレーションサポート１１４を用いて、非ＩＳＡコード（例えば、Ｄａｌｖｉｋバイトコード、ＪａｖａＳｃｒｉｐｔ（登録商標）、ＨＴＭＬ５など）を内部ＩＳＡコードに透過的に変換することで、アクセラレータ仮想デバイス２０８を仮想化する。例示の実施形態を含むいくつかの実施形態では、内部動的バイナリ変換モジュール２１０は、プロセッサ１０２の内部にあり、コンピューティングデバイス１００のオペレーティングシステムを含む外部のソフトウェアには透過的である。このように、内部動的バイナリ変換モジュール２１０ではなく、アクセラレータ仮想デバイス２０８を外部のソフトウェアは認識し得る。さらに、いくつかの実施形態では、内部動的バイナリ変換モジュール２１０は、内部ＩＳＡ内の様々なハードウェアアクセラレータサポートを利用して、コードを異なる言語から透過的に変換し得る。
【００１３】
ここで図３を参照すると、本発明の別の実施形態に係るプロセッサのブロック図が示される。図３に示されるように、プロセッサ３００は、ＨＷ／ＳＷ協調設計動的言語アクセラレータを介してバイトコード実行を実行するよう構成される。図３の例示では、プロセッサ３００は、Ｉ／Ｏ操作を介してＶＭ／ＯＳ３１０をプロセッサと接続するｘ８６−ＩＳＡインタフェースを含む複数のインタフェースを含む。さらに、例えばＶＭ及び同時に動作するアクセラレータデバイスドライバから受信されたバイトコード３１５の通信を可能にすべく、動的言語アクセラレータインタフェースが存在する。
【００１４】
図３にさらに示されるように、様々な変換を実行して内部実装ＩＳＡフォーマットでコードを生成し得るコードモーフィングソフトウェア（ＣＭＳ）ユニット３２０に複数の着信操作が提供され、これらは、一時ストレージ３４０（一実施形態において、これは所与のキャッシュメモリ、バッファなどであってよい）に格納され得る。さらに、バイトコードエミュレーションをトリガするために、着信バイトコードがバイトコードＣＭＳユニット３３０に提供される。バイトコードＣＭＳユニット３３０は、バイトコードエミュレーションを実行し、これにより内部実装ＩＳＡにコードを生成し得る。図に見られるように、このコードは、１又は複数のコア及び他のロジックを含み得るＣＰＵ３５０に提供され、例えば、本明細書で説明されるように動的言語アクセラレータを介して、バイトコードアクセラレーションサポートをさらに提供する。図３の実施形態では、このような高レベルで示されているが、多くの変形形態があり得ることを理解されたい。
【００１５】
図３の実装では、ｘ８６コードがＶＭ／ＯＳ３１０においてｘ８６−ＩＳＡインタフェースを介して従来通り実行され、これにより内部ＣＭＳユニット３２０を介してｘ８６コード実行がエミュレートされる。ｘ８６−ＩＳＡインタフェースに加えて、動的言語アクセラレータインタフェースも存在する。一実施形態を用いると、ＶＭ／ＯＳ３１０は標準的なｘ８６Ｉ／Ｏ操作を用いて動的言語アクセラレータを管理し得る。これは、従来のハードウェアアクセラレータが他のプロセッサにおいて管理されるのと同じである。ここで、しかしながら、Ｉ／Ｏ信号をＩ／Ｏバス３０５に送信する代わりに、動的言語アクセラレータのためのｘ８６Ｉ／Ｏ操作が、内部バイトコードＣＭＳ３３０を介してバイトコード実行のエミュレーションをトリガする。内部バイトコードＣＭＳ３３０は、特化されたバイトコードアクセラレーションサポートを持つパフォーマンス効率のよいＣＰＵ上で実行するために、バイトコードを内部実装ＩＳＡのコードに変換する。
【００１６】
ＨＷ／ＳＷ協調設計動的言語アクセラレータには、そこでのプログラミングを従来のアクセラレータ上のプログラミングと異なったものにしている多くの新たな特性がある。本明細書で説明される複数の実施形態は、そのようなプログラミングを柔軟且つ効率的な方法で可能にする。
【００１７】
本明細書で説明される複数の実施形態及び手法を用いて、ＨＷ／ＳＷ協調設計動的言語アクセラレータを用いるＶＭ実装は以下のことを実現し得る。動的言語アクセラレータをサポートするのにＩＳＡの変更も拡張も提供されないという点でのＩＳＡ透過性（言い換えれば、動的言語アクセラレータへのアクセスは、標準的なｘ８６Ｉ／Ｏ操作を介する）、動的言語アクセラレータをサポートするのに既存のＯＳ実装への変更が実装されないという点でのＯＳ透過性（しかしながら、後述されるように、ＯＳカーネルアクセラレータドライバが、既存のＯＳに任意で接続され、動的言語アクセラレーションを管理し得ることに留意されたい）、移植可能でない複雑なＪＩＴコンパイルをせずに、移植可能なバイトコードインタプリタをＶＭが実装し得るという点での移植性（いくつかの実施形態では、動的言語アクセラレータを介してバイトコードを実行すべく、小さな変更が既存のＶＭ実装を移植するのに提供され得ることに留意されたい）、及び、動的言語アクセラレータが複数の異なるＶＭ実装を柔軟にサポートし得るという点での柔軟性である。
【００１８】
動的言語プログラムは、ユーザレベルの仮想マシンで実行される。他のＨＷアクセラレータと同じように、ユーザレベルのアプリケーション（ＶＭなど）が、ＯＳカーネルアクセラレータデバイスドライバへの標準的なＯＳコールを介して、動的言語アクセラレータデバイスにアクセスする。以下の表１は、システム例（これは、Ｌｉｎｕｘ（登録商標）ベースのシステムであり得る）のアクセラレータデバイスを開く／閉じるためのＶＭ実装例を示す。ＶＭがアクセラレータデバイスを開くことができない場合（ＣＰＵ内の動的言語アクセラレータサポートの欠如、又はアクセラレータ用のＯＳカーネルドライバの欠如による）、ＶＭはバイトコードを従来通りに実行し得る。そうでなければ、サポートが利用可能なときに、以下の表１にあるようなコールを用い、ＶＭは、動的言語アクセラレータを用いてバイトコードを実行する。
【表１】
0006458959.tif 000002
【００１９】
動的言語アクセラレータには、そのプログラミングを従来のＨＷアクセラレータのプログラミングと異なったものにする複数の独特な特性がある。例えば、ＨＷアクセラレータは、ブロッキングＩ／Ｏ操作及び非ブロッキングＩ／Ｏ操作の両方をサポートし得る。非ブロッキングＩ／Ｏ操作は、ＣＰＵ上でｘ８６コードと同時に動作するために、ＯＳ／ランタイムが、ＨＷアクセラレータを効率的に管理するのに有用であり得る。しかしながら、動的言語アクセラレータは、ｘ８６コードと同じＣＰＵ上で実行を共有する。このように、動的言語アクセラレータは、ブロッキングＩ／Ｏ操作のみをサポートし得る。これにより、非ブロッキングＩ／Ｏ操作用の複雑な同期を考慮することなく、ＶＭプログラミング及びＣＭＳ実装の両方が簡略化される。
【００２０】
さらに、一般的に共有物理メモリに対するダイレクトメモリアクセス（ＤＭＡ）を介してｘ８６コードで通信するＨＷアクセラレータとは異なり、動的言語アクセラレータはコプロセッサのように動作し、ｘ８６コンテキスト／状態（例えば、ｘ８６レジスタ及び仮想メモリ）上で直接動く。この方式は、アクセラレータ実行とｘ８６コード実行との間の明確な通信を必要とせずに、動的言語アクセラレータのプログラミングを簡略化するだけでなく、バイトコードがＶＭプロセスの特権レベルでのみ動作することになるので、バイトコード実行のセキュリティ制御も提供する。
【００２１】
いかなるｘ８６ＩＳＡ変更も拡張もせずに、アクセラレータ上のバイトコード実行は、関数コールとして実装され得る。すなわち、以下の表２に示されるように、ｘ８６ブロッキングメモリマップドＩ／Ｏ操作が、アクセラレータ上のバイトコード実行をトリガするのに用いられ得る。トリガした後に、ｘ８６コード実行はブロックされ、アクセラレータは、バイトコードに対する通常の関数コールと同様にバイトコードを実行し始める。バイトコード実行が終了した後に、ブロックされたｘ８６コード実行は、関数コール復帰と同様に再開される。
【表２】
0006458959.tif 000003
【００２２】
アクセラレータ上のバイトコード実行はｘ８６状態を用いてバイトコード状態をエミュレートする。これは、バイトコード状態からｘ８６状態へのマッピングに依存する。例えば、バイトコードレジスタＲ０がｘ８６レジスタＥＡＸにマッピングされ、次にＲ０を修正するバイトコードをエミュレートする場合、それに応じて、アクセラレータはｘ８６レジスタＥＡＸを修正する。内部では、ｘ８６コード実行におけるｘ８６状態のエミュレーションと同様に、バイトコードＣＭＳは、その内部実装ＩＳＡ状態にｘ８６状態を再びマッピングする。
【００２３】
異なる複数のＶＭが、バイトコード状態からｘ８６状態に、異なる複数のマッピングを実装し得る。異なる複数のＶＭ実装をサポートすべく、複数のＶＭのそれぞれが、ＯＳアクセラレータデバイスドライバを介して、動的言語アクセラレータ上にマッピングを柔軟に構成し得る。以下の表３はＶＭ実装例を示す。ここでは、複数のＶＭが柔軟にサポートされ得るように、ＯＳシステムコール（ｉｏｃｔｌ）がアクセラレータを構成するのに用いられる。
【表３】
0006458959.tif 000004
【００２４】
アクセラレータ実行をトリガするｘ８６メモリマップドＩ／Ｏ操作は、アクセラレータ実行が終了するまでブロックするが、そのような操作は、アクセラレータ実行の潜在的に長いレイテンシに起因して、ＨＷ割り込み処理をブロックしなくてよい。そこで、ＨＷ割り込みの場合では、アクセラレータ実行が中断し、ブロックされたｘ８６コード実行が再開し得る（つまり、ブロッキングＩ／Ｏ操作が終了する）。割り込みは、アクセラレータ実行に非同期的に発生し得るが、アクセラレータは、正確な状態を伴ってバイトコード命令境界で中断し得る。このようにＶＭは、割り込み処理後に、バイトコード実行を正しく再開し得る。様々なＨＷ／ＳＷ協調設計手法が、ｘ８６実行における正確な割り込み状態と同様に、バイトコード実行における正確な割り込み状態を実現するのに用いられ得る。
【００２５】
複数の割り込みに起因して、動的言語アクセラレータの実行は非確定的に中断し得る。このために、表４のように、最後のバイトコードが現れるまで、ＶＭは、バイトコードアクセラレーションをループで繰り返しトリガし得る。
【表４】
0006458959.tif 000005
【００２６】
排他的アクセラレータアクセスが、アクセラレータを用いるソフトウェアに制限を加え得る。例えば、ソフトウェアは排他的アクセラレータを、他のソフトウェアがそれを用いている限り、開くことができない。コードがアクセラレータ上でタイムシェアリングによって動作し得るように、ＯＳは一般的に共用アクセラレータアクセスをサポートする。共用アクセラレータアクセスでは、上記の表４にあるように、アクセラレータ実行の繰り返しトリガ間のＨＷ割り込みが、コンテキストスイッチに、アクセラレータを用いて別の（場合によっては異なる）仮想マシンを動作させ得る。このように、（アクセラレータの構成を含む）バイトコード状態が、（例えば、バイトコードＣＭＳを持つ）アクセラレータ内で内部に、動的言語アクセラレータ実行の繰り返しトリガにわたって（例えば、ステートレスアクセラレーションとして）維持され得ない。別の言い方をすれば、バイトコードアクセラレーションの各トリガは、（ｘ８６状態によりエミュレートされた）完全なバイトコード状態を入力としてアクセラレータ実行に明示的に提供し得て、アクセラレータが中断した後に、完全なバイトコード状態はアクセラレータから出力される。
【００２７】
表５は、ステートレスアクセラレーションを持つＶＭ実装例を示す。バイトコードアクセラレーションの各トリガは、アクセラレータの構成を介して、（バイトコード状態を含む）仮想マシン状態と関連付けられる識別子を提供する。次に、バイトコードアクセラレータは、識別子と関連付けられたバイトコード状態上で動く。
【表５】
0006458959.tif 000006
【００２８】
アクセラレータ実行中に例外も生じうる。例えば、ＶＭアプリケーションの仮想メモリにおけるバイトコード実行は、ページング例外をトリガして仮想ページをスワップし得る。この例外は、管理されたランタイムを用いても、バイトコード実行において発生し得る。バイトコード命令ではなくｘ８６命令がＯＳ例外処理を発動することがわかることを例外ハンドラが要求し得るので、アクセラレータ実行中の例外処理は複雑になり得る。従って、一実施形態において、ＯＳ透過性を提供すべく、ＯＳ例外処理はアクセラレータ実行中に発動されない。その代わり、アクセラレータ実行は、例外を引き起こしたバイトコード命令の前で正確なバイトコード状態を伴って中断する。
【００２９】
アクセラレータ実行は、いかなるＯＳ例外処理も発動しないので、アクセラレータ実行の中断が例外により引き起こされる場合、表５のアクセラレータ実行の繰り返しトリガは先に進むことができない。このために、表６に示されるように、ＶＭの移植可能なインタプリタが先に進むために用いられ得る。動的言語アクセラレータを持たない従来のＶＭにおけるバイトコードの解釈と同様に、アクセラレータ実行の繰り返しトリガ間で、１つのバイトコードが解釈される。このように、バイトコード解釈中に、例外が発動されて処理される。
【表６】
0006458959.tif 000007
【００３０】
動的言語アクセラレータに関する別の問題は、特定のバイトコード命令実行が、ＶＭ／ＯＳ依存ネイティブライブラリにコールし得るということである。例えば、メモリ割り当てバイトコード命令が、新たなメモリを割り当てるためにライブラリをコールし得る。これは、ＶＭ／ＯＳのメモリ管理に依存し得る。別の例として、スレッド間の同期のために、同期バイトコード命令がランタイムライブラリをコールし得る。これは、ＶＭ／ＯＳのスレッド／同期管理に依存し得る。そのような場合に、Ｉ／Ｏバイトコード命令がＩ／Ｏ操作のためにライブラリをコールする。これは、ＶＭ／ＯＳのＩ／Ｏ管理に依存し得る。バイトコードは、ダイレクトネイティブライブラリコール（例えば、Ｊａｖａ（登録商標）ネイティブインタフェース、又はＪＮＩ）もサポートし得る。異なるＶＭ及びＯＳをサポートする柔軟性のために、そのようなＶＭ／ＯＳ依存ライブラリコードは、動的言語アクセラレータにおいて実行され得ない。
【００３１】
様々な手法が、ＶＭ／ＯＳ依存ライブラリを処理するのに用いられ得る。まず、例外に起因してアクセラレータ実行を中断するのと同様に、アクセラレータ実行が、ＶＭ／ＯＳ依存ライブラリをコールするバイトコードの前のバイトコード境界において、正確な状態を伴って中断させられ得る。次に、アクセラレータ実行に続くバイトコード解釈が上記の表６にあるように生じ、当然、これらのライブラリコールをＶＭにおいて実行し得る。
【００３２】
ＶＭ／ＯＳ依存ライブラリと対話する別の、場合によってはより効率的な方法は、アクセラレータ実行中に、ネイティブ関数にコールバックすることである。しかしながら、アクセラレータ実行中にネイティブ関数にダイレクトコールバックすることには２つの問題がある。第１に、ネイティブライブラリコールインタフェースはＶＭ依存があり得る。第２に、ＩＳＡ透過性に関しては、ネイティブ関数はアクセラレータ実行に直接戻ることができず、アクセラレータ実行は、メモリマップドＩ／Ｏ操作によってのみトリガされ得る。従って、いくつかの実施形態では、アクセラレータネイティブインタフェースが定義され得て、これにより、アクセラレータ実行中に、ネイティブライブラリコール用のこのアクセラレータネイティブインタフェースにコールバックし得る。
【００３３】
表７は、アクセラレータネイティブインタフェース例を示す。所与のアクセラレータが、このアクセラレータネイティブインタフェースで構成され得る。次に、ネイティブライブラリコールの場合、ネイティブ関数ポインタを伴ったアクセラレータネイティブインタフェースへのアクセラレータコールは、ｎａｔｉｖｅ＿ｆｕｎｃに入る。ネイティブ関数の実行後に、アクセラレータネイティブインタフェースは、メモリマップドＩ／Ｏを介してアクセラレータへの復帰をトリガし得る。
【表７】
0006458959.tif 000008
【００３４】
もちろん、上述された表１から７、及びその中の疑似コードは、特定の複数の実装を対象にしており、例示のために提供されることが理解されるべきである。本明細書で論じられる概念は、そのように限定されず、上述されたものとは異なる疑似コードを有する他の複数の実装が作成され得る。
【００３５】
本明細書で説明される複数の実施形態及び手法を用いて、動的言語アクセラレータは、アクセラレータインタフェース、及びＣＭＳにおける内部バイトコード変換を介して、バイトコード実行をアクセラレーションするよう動作する。動的言語アクセラレータの独特な特性が、動的言語アクセラレータをプログラミングする手法を提供し、ＩＳＡ透過性、ＯＳ透過性、移植性、及び柔軟性を実現するのに活用され得る。
【００３６】
ここで図４を参照すると。本発明の一実施形態に係る方法のフロー図が示される。概して、図４は、本明細書で説明されるように、動的言語アクセラレータを用いて、バイトコードアクセラレーションにおいて様々な動作を実行する方法を説明する。概して、方法４００の様々な動作は、所与のプロセッサ上でＶＭの実行に関連して実行され得る。
【００３７】
方法４００は、ＶＭがアクセラレータを開くことが可能かどうかを判断すること（ひし形４０５）から始まる。一実施形態において、この判断は、上記の表１で説明されたように行われ得て、ファイル記述子をアクセラレータと関連付けることで、パス名が動的言語アクセラレータに提供される。アクセラレータ用のサポートもドライバもない場合、処理はブロック４１０に進み、ＶＭ自体が、例えばバイトコード解釈により、バイトコードを実行するのに用いられ得ることに留意されたい。
【００３８】
代わりに、ＶＭがアクセラレータを開くことが可能であると判断される場合、処理はブロック４１５に進む。ここでは、アクセラレータが構成され得る。より具体的には、アクセラレータは、バイトコード状態からｘ８６状態へのマッピングを用いて構成され、ＶＭ状態を識別子と関連付けるようさらに構成され得る。次の処理は、ひし形４２０に進む。ここでは、実行されるバイトコードが最後に達したかどうかが判断される。最後に達した場合、処理はブロック４２５に進み、処理はＶＭに戻り得る。
【００３９】
そうでなければ、処理はブロック４３０に進む。ここでは、ＭＭＩＯ操作が実行されてアクセラレータ実行をトリガし、ｘ８６コードを操作からブロックし得る。このように、デバイス言語アクセラレータは、実装を簡略化するために、ブロッキング環境で動作する。従って、この段階で、アクセラレータ実行がブロック４３５で生じ、その間に、バイトコードの少なくとも一部が実行される。図４に見られるように、そのようなアクセラレータ実行中に、所与の一連のイベントのうちの１又は複数が生じたかどうかが判断され得る。
【００４０】
より具体的には、さらに図４を参照すると、アクセラレータ実行中に、処理は次にひし形４４０に進む。ここでは、ハードウェア割り込みが発生したかどうかが判断され得る。発生した場合、識別子と関連付けられたバイトコード状態が、例えば、キャッシュメモリなどの一時ストレージに記憶され得る（ブロック４５０）。次に、処理はブロック４５５に進み、アクセラレータ実行が中断させられ得て、ブロックされたｘ８６コードが実行され得る。そのようなｘ８６コードは、割り込みと関連付けられ得て、割り込みハンドラ又は他のｘ８６コードに対応し得る。
【００４１】
このネイティブコード（例えば、割り込みハンドラ）の最後で、処理はブロック４９５に進む。ここでは、バイトコードの少なくとも１つのバイトコードが、ＶＭ内で解釈され得る。ＶＭの移植可能なインタプリタを介したこのバイトコード解釈は、割り込み又は他のそのような状況が発動する状態において、先に進むことが行われるのを可能にすることに留意されたい。図に見られるように、処理は次に上述されたひし形４２０に戻る。
【００４２】
アクセラレータ実行中に、ひし形４４０で判断されるように、ハードウェア割り込みが受信されなかった場合、処理はひし形４６０に進む。ここでは、ハードウェア例外が発生したかどうかが判断され得る。発生した場合、処理はブロック４６５に進み、識別子と関連付けられたバイトコード状態が、例えばキャッシュメモリに記憶され得る。その後、アクセラレータ実行は中断させられ得る（ブロック４７０）。より具体的には、例外がマスクされるように、アクセラレータ実行は例外の前の命令で中断させられ得る。この段階で、ｘ８６コードが実行され得る。より具体的には、ｘ８６コード実行は生じる例外をトリガし、これにより、例外的なイベントを処理する例外ハンドラなどのネイティブ例外コードをトリガする。そのような実行の後、処理は上述のひし形４２０に進み、（バイトコードが最後に達していない場合には）さらにアクセラレータ実行に進む。
【００４３】
さらに図４を参照すると、ひし形４６０で判断されるように、ハードウェア例外が生じなかった場合、処理は代わりにひし形４８０に進む。ここで、ネイティブライブラリへのコールが、必要かどうかが判断され得る。必要な場合、処理はブロック４９０に進み、アクセラレータネイティブインタフェースを介して、ネイティブライブラリへのコールバックが生じ得る。このネイティブライブラリでは、必要な関数が実行され得て、関数の結果は、動的言語アクセラレータにおいてさらなるバイトコード実行に用いられ得る。そのような実行の後に、処理はひし形４９２に進み、最後のバイトコードが現れたかどうかを判断する。最後のバイトコードの場合、処理はＶＭに戻る。そうでなければ、処理はブロック４３５に進み、上述されたように、アクセラレータ内でバイトコードをさらに実行する。図４の実装ではこのような高レベルで示されているが、複数の変形形態が可能であり、本発明の範囲はこの点に限定されないことを理解されたい。
【００４４】
ＨＷ／ＳＷ協調設計動的言語アクセラレータがＯＳより下で動作するので、アクセラレータはこうして、割り込み／例外問題を処理し得る。それに対して、従来の仮想マシンは、ＯＳより上で動作し、割り込み／例外処理などのシステム問題によって影響されない。その理由は、ＯＳがそれらの問題を透過的に処理するからである。また、ｘ８６コード（そのセマンティクスは所与のＩＳＡにより明確に定義されている）だけを実行するＣＭＳとは対照的に、一実施形態に係る動的言語アクセラレータは、いかなるｘ８６−ＩＳＡの変更も拡張もせずに、ＣＭＳを介してバイトコードを実行する。本明細書で説明された複数の実施形態及び手法を用いて、動的言語アクセラレータは、透過的に、移植可能に、且つ柔軟にプログラミングされ得る。開示された複数の実施形態を用いて、ＨＷ／ＳＷ協調設計動的言語アクセラレータが、ＶＭにおいて実行時コンパイルを必要とせずに、且ついかなるｘ８６変更もせずに、バイトコード実行をアクセラレーションし得る。複数の実施形態が、非ｘ８６コード、例えばＪａｖａ（登録商標）、ＪａｖａＳｃｒｉｐｔ（登録商標）、ＨＴＭＬ５、ＡＲＭなどを用いるタブレットコンピュータ、スマートフォンなどのモバイルでポータブルなデバイスに関連して特に用いられ、ワット当たりの優れたパフォーマンスでそのようなコードを効率的に実行し得る。
【００４５】
以下の複数の実施例は、さらなる複数の実施形態に関する。
【００４６】
実施例１はシステムである。システムは、複数の命令を実行するプロセッサであって、少なくとも１つのコア及び動的言語アクセラレータを含み、動的言語アクセラレータと関連付けられたファイル記述子に関するＭＭＩＯ操作に応答してバイトコードを実行し、動的言語アクセラレータがバイトコードを実行している間、ネイティブコードの実行をブロックするプロセッサと、プロセッサに結合されたシステムメモリとを備える。
【００４７】
実施例２において、実施例1のプロセッサは、システムコールを介して、動的言語アクセラレータをトリガする仮想マシンの仮想マシン状態に対してプロセッサのネイティブ状態のマッピングを任意で構成し、仮想マシン状態はバイトコード状態を含む。
【００４８】
実施例３において、実施例２のプロセッサは、識別子を仮想マシン状態と任意で関連づける。
【００４９】
実施例４において、実施例１から３のうちの１つの動的言語アクセラレータはハードウェア割り込みに応答して実行を任意で中断し、プロセッサはネイティブコードを実行してハードウェア割り込みを処理し、ハードウェア割り込みが処理された後に、プロセッサは動的言語アクセラレータを再度トリガする。
【００５０】
実施例５において、実施例１から４のうちの１つの動的言語アクセラレータは、ネイティブコードの実行の前に、識別子と関連付けられたバイトコード状態を任意で記憶する。
【００５１】
実施例６において、例４の仮想マシンは、ハードウェア割り込みが処理された後に、少なくとも１つのバイトコードを任意で解釈し、その後、動的言語アクセラレータを再度トリガする。
【００５２】
実施例７において、アクセラレータネイティブインタフェースは動的言語アクセラレータに任意で結合され、動的言語アクセラレータはアクセラレータネイティブインタフェースを介してネイティブライブラリにコールバックし、プロセッサは、ネイティブライブラリを用いて仮想マシン用の関数を実行して、関数が実行された後に、動的言語アクセラレータにおいてバイトコードの実行を継続する。
【００５３】
実施例８において、実施例１から７のうちの１つの動的言語アクセラレータは、動的言語アクセラレータの実行中に生じた例外に応答して、例外を引き起こしたバイトコード命令の前のバイトコードの命令において実行を任意で中断し、プロセッサは、その後、バイトコードの少なくとも１つのバイトコード命令を解釈し、ネイティブ例外ハンドラを実行して例外を処理し、次に動的言語アクセラレータを再度トリガする。
【００５４】
実施例９において、方法は、プロセッサの動的言語アクセラレータ用のアクセラレータマッピング及び仮想マシン状態を構成し、仮想マシン状態を仮想マシンの識別子と関連付ける段階と、入出力操作を実行して動的言語アクセラレータにおいてバイトコードの実行をトリガし、ネイティブコードの実行をブロックする段階と、動的言語アクセラレータがバイトコードの少なくとも一部を実行した後に、仮想マシンにおいてバイトコードの少なくとも１つのバイトコードを解釈する段階とを備える。
【００５５】
実施例１０において、実施例９の方法は、ハードウェア割り込みに応答して、識別子と関連付けられたバイトコード状態を記憶し、その後、動的言語アクセラレータを中断し、ネイティブコードを実行してハードウェア割り込みを処理する段階を任意で備える。
【００５６】
実施例１１において、実施例１０の方法は、ネイティブコードを実行してハードウェア割り込みを処理した後に、少なくとも１つのバイトコードを解釈し、その後、動的言語アクセラレータを再度トリガしてバイトコードをさらに実行する段階を任意で備える。
【００５７】
実施例１２において、実施例９から１１のうちの１つの方法は、例外に応答して、識別子と関連付けられたバイトコード状態を記憶し、その後、例外の前の命令において動的言語アクセラレータを中断し、ネイティブ例外ハンドラを実行して例外を処理する段階を任意で備える。
【００５８】
実施例１３において、実施例９から１２のうちの１つの方法は、動的言語アクセラレータのアクセラレータネイティブインタフェースを介して、ネイティブライブラリをコールして動的言語アクセラレータ用の関数を処理する段階を任意で備える。
【００５９】
実施例１４において、少なくとも１つのコンピュータ可読記憶媒体は、実行された場合に、システムが、プロセッサの動的言語アクセラレータ用のアクセラレータマッピング及び仮想マシン状態を構成して仮想マシン状態を仮想マシンの識別子と関連付け、入出力操作を実行して動的言語アクセラレータにおいてバイトコードの実行をトリガし、ネイティブコードの実行をブロックし、動的言語アクセラレータがバイトコードの少なくとも一部を実行した後に、仮想マシンにおいてバイトコードの少なくとも１つのバイトコードを解釈することを可能にする複数の命令を備える。
【００６０】
実施例１５において、実施例１４の少なくとも１つのコンピュータ可読媒体は、システムが、動的言語アクセラレータが開かれることが可能かどうかを判断し、可能でなければ、仮想マシンにおいてバイトコードを解釈することを可能にする複数の命令を任意でさらに備える。
【００６１】
実施例１６において、実施例１４から１５のうちの１つの少なくとも１つのコンピュータ可読媒体は、システムが、仮想マシンにおいて少なくとも１つのバイトコードを解釈した後に、動的言語アクセラレータにおいてバイトコードの実行を再度トリガすることを可能にする複数の命令を任意でさらに備える。
【００６２】
実施例１７において、実施例１４から１６のうちの１つの少なくとも１つのコンピュータ可読媒体は、システムが、ハードウェア割り込みに応答して、識別子と関連付けられたバイトコード状態を記憶し、その後、動的言語アクセラレータを中断し、ネイティブコードを実行してハードウェア割り込みを処理することを可能にする複数の命令を任意でさらに備える。
【００６３】
実施例１８において、実施例１７の少なくとも１つのコンピュータ可読媒体は、システムが、ネイティブコードを実行してハードウェア割り込みを処理した後に、少なくとも１つのバイトコードを解釈し、その後、動的言語アクセラレータを再度トリガしてバイトコードをさらに実行することを可能にする複数の命令を任意でさらに備える。
【００６４】
実施例１９において、実施例１４から１８のうちの１つの少なくとも１つのコンピュータ可読媒体は、システムが、例外に応答して、識別子と関連付けられたバイトコード状態を記憶し、その後、例外の前の命令において動的言語アクセラレータを中断し、ネイティブ例外ハンドラを実行して例外を処理することを可能にする複数の命令を任意でさらに備える。
【００６５】
実施例２０において、実施例１４から１９のうちの１つの少なくとも１つのコンピュータ可読媒体は、システムが、動的言語アクセラレータのアクセラレータネイティブインタフェースを介して、ネイティブライブラリをコールし、動的言語アクセラレータ用の関数を処理することを可能にする複数の命令を任意でさらに備える。
【００６６】
複数の実施形態が、多くの異なる種類のシステムに用いられ得る。例えば、１つの実施形態では、通信デバイスが、本明細書で説明された様々な方法及び手法を実行するよう構成され得る。もちろん、本発明の範囲は通信デバイスに限定されず、その代わりに、複数の命令を処理する他の種類の装置、又は、コンピューティングデバイス上で実行されることに応答して、本明細書で説明された複数の方法及び手法のうちの１又は複数をデバイスに実行させる複数の命令を含む１又は複数の機械可読媒体を、他の複数の実施形態が対象とし得る。 
【００６７】
複数の実施形態がコードに実装され得て、非一時的記憶媒体に記憶され得る。非一時的記憶媒体は、そこに記憶された複数の命令を有し、複数の命令を実行するようシステムをプログラムするのに用いられ得る。記憶媒体は、限定されないが、フロッピー（登録商標）ディスク、光ディスク、ソリッドステートドライブ（ＳＳＤ）、コンパクトディスクリードオンリメモリ（ＣＤ−ＲＯＭ）、コンパクトディスクリライタブル（ＣＤ−ＲＷ）、及び磁気光ディスクを含む任意の種類のディスク、リードオンリメモリ（ＲＯＭ）、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）・スタティックランダムアクセスメモリ（ＳＲＡＭ）などのランダムアクセスメモリ（ＲＡＭ）、消去可能プログラマブルリードオンリメモリ（ＥＰＲＯＭ）、フラッシュメモリ、電気的消去可能プログラマブルリードオンリメモリ（ＥＥＰＲＯＭ）などの半導体デバイス、磁気又は光カード、あるいは複数の電子命令を記憶するのに適した他の種類の媒体を含み得る。
【００６８】
本発明は、限られた数の実施形態を参照して説明されたが、当業者は、そこから様々な修正形態および変形形態を認識するであろう。添付の特許請求の範囲は、本発明の真の趣旨及び範囲内に含まれるそのような全ての修正形態および変形形態を包含することが企図されている。
【図１】
0006458959.tif 000009
【図２】
0006458959.tif 000010
【図３】
0006458959.tif 000011
【図４】
0006458959.tif 000012