(57)【要約】【課題】異なる種類の複数のバイトコードを１つのファイル上にエンコードし、効率良く実行されるプログラムを生成するシステムおよびプログラム変換方法を提供する。【解決手段】第１の言語のバイトコード上に第２の言語のバイトコードをエンコードしてクラス・ファイルを生成するシステムであって、前処理部１１０と、コード化処理部１２０とを備える。前処理部１１０は、第１の言語のバイトコードの処理系が実行可能な形式に書き替えられた第２の言語のバイトコードである仮想バイトコードの命令により使用される領域を、第１の言語のバイトコードのコンスタント・プールにおける第２の言語のバイトコードの命令ごとに予め定められた場所に確保し、第２の言語のバイトコードの各命令を仮想バイトコードに変換する。コード化処理部１２０は、コンスタント・プールおよび仮想バイトコードを含む第１の言語のバイトコードのクラス・ファイルを生成する。【選択図】図１
2010026728.tif 000002
【特許請求の範囲】
【請求項１】
第１の言語のバイトコード上に第２の言語のバイトコードをエンコードして当該第１の言語のバイトコードのクラス・ファイルを生成するシステムにおいて、
前記第２の言語のバイトコードに対する前処理を行う前処理部と、
前処理の結果を元に実際に前記第１の言語のバイトコードを生成して、メソッド呼び出しのバイトコードから参照される値を保持するデータ構造を持つクラス・ファイルを生成するコード化処理部とを備え、
前記前処理部は、
前記第１の言語のバイトコードの処理系が実行可能な形式に書き替えられた前記第２の言語のバイトコードである仮想バイトコードの命令により使用される領域を、一時記憶手段に保持された前記データ構造における当該第２の言語のバイトコードの命令ごとに予め定められた場所に確保し、
前記第２の言語のバイトコードにおける各命令を前記仮想バイトコードに変換して、当該仮想バイトコードを前記一時記憶手段に保持し、
前記コード化処理部は、
前記一時記憶手段に保持された前記データ構造および前記仮想バイトコードを含む前記第１の言語のバイトコードのクラス・ファイルを生成する、
システム。
【請求項２】
前記コード化処理部は、前記仮想バイトコードを前記第１の言語のバイトコードのメソッドとしてエンコードする、請求項１に記載のシステム。
【請求項３】
前記コード化処理部は、前記データ構造に、前記仮想バイトコードの実行に必要なデータおよびメソッドの位置を示す情報を記録する、請求項２に記載のシステム。
【請求項４】
前記第１の言語のバイトコードはＪａｖａ（登録商標）バイトコードであり、前記データ構造はＪａｖａ仮想機械で用いられるコンスタント・プールである、請求項１に記載のシステム。
【請求項５】
前記第２の言語のバイトコードはＰＨＰバイトコードである、請求項４に記載のシステム。
【請求項６】
第１の言語のバイトコード上に第２の言語のバイトコードをエンコードして当該第１の言語のバイトコードのクラス・ファイルを生成し、実行するシステムにおいて、
前記第２の言語のバイトコードに対する前処理を行う前処理部と、
前処理の結果を元に実際に前記第１の言語のバイトコードを生成して、メソッド呼び出しのバイトコードから参照される値を保持するデータ構造を持つクラス・ファイルを生成するコード化処理部と、
前記コード化処理部により生成された前記クラス・ファイルを実行する実行部とを備え、
前記前処理部は、
前記第１の言語のバイトコードの処理系が実行可能な形式に書き替えられた前記第２の言語のバイトコードである仮想バイトコードの命令により使用される領域を、一時記憶手段に保持された前記データ構造における当該第２の言語のバイトコードの命令ごとに予め定められた場所に確保し、
前記第２の言語のバイトコードにおける各命令を前記仮想バイトコードに変換して、当該仮想バイトコードを前記一時記憶手段に保持し、
前記コード化処理部は、
前記一時記憶手段に保持された前記データ構造を含み、前記仮想バイトコードをメソッドとしてエンコードした前記第１の言語のバイトコードのクラス・ファイルを生成する、
システム。
【請求項７】
前記実行部は、
前記第２の言語のバイトコードの命令と、予め定められた当該命令により使用される前記データ構造上の場所との対応関係を示す情報を記憶手段に保持し、
前記情報に基づいて、前記データ構造上の場所から前記仮想バイトコードの内容を認識する、請求項６に記載のシステム。
【請求項８】
前記コード化処理部は、前記データ構造に、前記仮想バイトコードの実行に必要なデータおよびメソッドの位置を示す情報を記録し、
前記実行部は、前記データ構造に記録された、前記データおよび前記メソッドの位置を示す情報に基づき、前記仮想バイトコードの実行に不要な内容の解読を省略して前記クラス・ファイルの解読および実行を行う、請求項７に記載のシステム。
【請求項９】
Ｊａｖａ（登録商標）バイトコードにＰＨＰバイトコードをエンコードして当該Ｊａｖａバイトコードのクラス・ファイルを生成し、実行するシステムにおいて、
前記ＰＨＰバイトコードに対する前処理を行う前処理部と、
前処理の結果を元に実際に前記Ｊａｖａバイトコードを生成して、クラス・ファイルを生成するコード化処理部と、
前記コード化処理部により生成された前記クラス・ファイルを実行する実行部とを備え、
前記前処理部は、
前記ＰＨＰバイトコードを前記Ｊａｖａバイトコードの処理系が実行可能な形式に書き替えたものである仮想バイトコードの命令により使用される領域を、一時記憶手段に保持されたコンスタント・プールにおける当該ＰＨＰバイトコードの命令ごとに予め定められた場所に確保し、
前記ＰＨＰバイトコードにおける各命令を前記仮想バイトコードに変換して、当該仮想バイトコードを前記一時記憶手段に保持し、
前記コード化処理部は、
前記一時記憶手段に保持された前記コンスタント・プールを含み、前記仮想バイトコードをメソッドとしてエンコードした前記Ｊａｖａバイトコードのクラス・ファイルを生成し、
前記コンスタント・プールに、前記仮想バイトコードの実行に必要なデータおよびメソッドの位置を示す情報を記録し、
前記実行部は、
前記ＰＨＰバイトコードの命令と、予め定められた当該命令により使用される前記コンスタント・プール上の場所との対応関係を示す情報を記憶手段に保持し、
前記情報に基づいて、前記コンスタント・プール上の場所から前記仮想バイトコードの内容を認識し、
前記コンスタント・プールに記録された、前記データおよび前記メソッドの位置を示す情報に基づき、前記仮想バイトコードの実行に不要な内容の解読を省略して前記クラス・ファイルの解読および実行を行う、
システム。
【請求項１０】
第１の言語のバイトコード上に第２の言語のバイトコードをエンコードして当該第１の言語のバイトコードのクラス・ファイルを生成するプログラム変換方法において、
前記第１の言語のバイトコードのクラス・ファイルは、メソッド呼び出しのバイトコードから参照される値を保持するデータ構造を持ち、
前記第１の言語のバイトコードの処理系が実行可能な形式に書き替えられた前記第２の言語のバイトコードである仮想バイトコードの命令により使用される領域を、一時記憶手段に保持された前記データ構造における当該第２の言語のバイトコードの命令ごとに予め定められた場所に確保するステップと、
前記第２の言語のバイトコードにおける各命令を前記仮想バイトコードに変換して、当該仮想バイトコードを前記一時記憶手段に保持させるステップと、
前記一時記憶手段に保持された前記データ構造を含み、前記仮想バイトコードをメソッドとしてエンコードした前記第１の言語のバイトコードのクラス・ファイルを生成するステップと、
を含む、方法。
【請求項１１】
コンピュータに、
第１の言語のバイトコード上に第２の言語のバイトコードをエンコードし、メソッド呼び出しのバイトコードから参照される値を保持するデータ構造を持つ当該第１の言語のバイトコードのクラス・ファイルを生成するための下記の機能であって、
前記第１の言語のバイトコードの処理系が実行可能な形式に書き替えられた前記第２の言語のバイトコードである仮想バイトコードの命令により使用される領域を、一時記憶手段に保持された前記データ構造における当該第２の言語のバイトコードの命令ごとに予め定められた場所に確保する機能と、
前記第２の言語のバイトコードにおける各命令を前記仮想バイトコードに変換して、当該仮想バイトコードを前記一時記憶手段に保持する機能と、
前記一時記憶手段に保持された前記データ構造および前記仮想バイトコードを含む前記第１の言語のバイトコードのクラス・ファイルを生成する機能と、
を実現させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムを変換するシステムに関し、特に、特定の言語のバイトコード上に他の言語のバイトコードをエンコードするシステムおよび変換方法に関する。
【背景技術】
【０００２】
コンピュータ・システムを動作させる際に、相異なるプログラミング言語で記載された複数のプログラムを連携させて実行する場合がある。例えば、Ｊａｖａ（米国サン・マイクロシステムズ社の登録商標）によるプラットフォーム上で、ＰＨＰ（PHP:Hypertext Preprocessor）等で記述されたプログラムを実行する場合等である。
【０００３】
様々な局面で効果的に動作する言語処理系を実現するためには、このような複数の機械語コードをうまく使い分けることが望まれる。しかし、１つの機械語コード表現を理解する処理系は、通常、そのままでは他の機械語コード表現を理解できない。そこで、従来から、１つの機械語コードを実行する処理系から他の機械語コードを実行するための工夫が行われている。
【０００４】
特許文献１には、２種類のバイナリ表現によるプログラムを１つのアプリケーションに両方備えた処理系が開示されている。この従来技術によれば、アプリケーションが複数の異なる種類の機械語コードを実行できるため、上記のような機械語コードの使い分けが可能である。
【０００５】
非特許文献１には、サブルーチン・スレッディングと呼ばれるプログラム変換方式について開示されている。この従来技術によれば、例えば、ＰＨＰバイトコードの各命令がＪａｖａバイトコード上のサブルーチン（メソッド）呼び出しに対応するようにＪａｖａバイトコードが構成され、呼び出されるメソッドがＪａｖａで実装される。このサブルーチン・スレッディングを用いることで、コンパイル結果のＪａｖａバイトコードからＰＨＰ言語のセマンティクスを読み取ることが可能になる。
【０００６】
【特許文献１】米国特許第５４３２９３７号明細書
【非特許文献１】C. J. Cheney, "A Nonrecursive List Compacting Algorithm", Communications of the ACM 13 (11), 1970.
【発明の開示】
【発明が解決しようとする課題】
【０００７】
上記のように、１つの機械語コードを実行する処理系から他の機械語コードを実行するための工夫が、従来から行われている。
しかし、２種類のバイナリ表現によるプログラムを１つのアプリケーションに両方備えた処理系で対応する場合、次のような問題があった。例えば２種の処理系がある場合には、その処理系を２つとも実行系に読み込むことになる。そのため、各処理系に対応したバイナリ・データをそれぞれ用意しなければならず、プログラムのサイズが増大していた。また、このとき用意される複数のバイナリ・データは各々独立した異なる表現である。そのため、所定のバイトコードを調べて成り立つことがわかった性質が、他のバイトコードで成り立つか否かについては、実際に他のバイトコードでも調べてみないとわからない。そのため、バイナリ・データごとに全く独立の検証作業が必要になる。
【０００８】
また、サブルーチン・スレッディングによる手法では、サブルーチンを読み取る際の処理コストが大きいという問題があった。これは、サブルーチン・スレッディングが、そもそも、プラットフォーム（例えば、Ｊａｖａ仮想機械）上で直接実行することのみを意図したものであり、そこに埋め込まれている他の言語（例えば、ＰＨＰ言語）のインストラクションなどのセマンティクスを読み取るために作られてはいないためである。
【０００９】
本発明は、これらの課題を解決し、異なる種類の複数のバイトコードを１つのファイル上にエンコーディングし、効率良く実行されるプログラムを生成するシステムおよびプログラム変換方法を提供することを目的とする。
【課題を解決するための手段】
【００１０】
上記の目的を達成するため、本発明は、次のようなシステムとして実現される。このシステムは、第１の言語のバイトコード上に第２の言語のバイトコードをエンコードして第１の言語のバイトコードのクラス・ファイルを生成するシステムであって、第２の言語のバイトコードに対する前処理を行う前処理部と、前処理の結果を元に実際に前記第１の言語のバイトコードを生成して、メソッド呼び出しのバイトコードから参照される値を保持するデータ構造を持つクラス・ファイルを生成するコード化処理部とを備える。前処理部は、第１の言語のバイトコードの処理系が実行可能な形式に書き替えられた第２の言語のバイトコードである仮想バイトコードの命令により使用される領域を、一時記憶手段に保持された当該データ構造における第２の言語のバイトコードの命令ごとに予め定められた場所に確保し、第２の言語のバイトコードにおける各命令を仮想バイトコードに変換して、この仮想バイトコードを一時記憶手段に保持する。コード化処理部は、一時記憶手段に保持されたデータ構造および仮想バイトコードを含む第１の言語のバイトコードのクラス・ファイルを生成する。
【００１１】
また、このシステムは、生成されたクラス・ファイルを通常の第１の言語のバイトコードの実行形態とは異なる形で実行する実行部をさらに備える構成としても実現される。
そして、好ましくは、実行部は、第２の言語のバイトコードの命令と、予め定められた命令により使用されるデータ構造上の場所との対応関係を示す情報を記憶手段に保持し、この情報に基づいて、クラス・ファイルの多くの部分を読まずして、データ構造上の場所から仮想バイトコードの内容を認識する。
【００１２】
上記のシステムにおいて、より詳細には、コード化処理部は、仮想バイトコードを第１の言語のバイトコードのメソッドとしてエンコードする。
また、コード化処理部は、データ構造に、仮想バイトコードの実行に必要なデータおよびメソッドの位置を示す情報を記録する。そして、実行部は、データ構造に記録された、データおよびメソッドの位置を示す情報に基づき、仮想バイトコードの実行に不要な内容の解読を省略してクラス・ファイルの解読および実行を行う。
【００１３】
また、本発明は、次のような方法としても実現される。この方法は、第１の言語のバイトコード上に第２の言語のバイトコードをエンコードして第１の言語のバイトコードのクラス・ファイルを生成するプログラム変換方法であって、所定のバイトコードのクラス・ファイルは、メソッド呼び出しのバイトコードから参照される値を保持するデータ構造を持ち、第１の言語のバイトコードの処理系が実行可能な形式に書き替えられた第２の言語のバイトコードである仮想バイトコードの命令により使用される領域を、一時記憶手段に保持された当該データ構造における第２の言語のバイトコードの命令ごとに予め定められた場所に確保するステップと、第２の言語のバイトコードにおける各命令を仮想バイトコードに変換して、仮想バイトコードを一時記憶手段に保持させるステップと、一時記憶手段に保持されたデータ構造を含み、仮想バイトコードをメソッドとしてエンコードした第１の言語のバイトコードのクラス・ファイルを生成するステップと、を含む。
【００１４】
さらに本発明は、コンピュータを制御して、上記のシステムにおける各機能を実現させるプログラムや、上記の方法における各ステップに対応する処理を実行させるプログラムとしても実解される。このプログラムは、光ディスクや磁気ディスク、半導体メモリ、その他の記録媒体に格納して配布したり、ネットワークを介して配信したりすることにより、提供される。
【発明の効果】
【００１５】
以上のように構成された本発明によれば、異なる種類の複数のバイトコードを１つのファイル上にエンコーディングし、効率良く実行されるプログラムを生成するシステムおよびプログラム変換方法を提供することができる。
【発明を実施するための最良の形態】
【００１６】
以下、添付図面を参照して、本発明の実施形態について詳細に説明する。
本発明は、一定の特徴（後述）を備えたプログラミング言語で記述されたプログラムに対して適用できるものであるが、本実施形態では、ＪａｖａバイトコードとＰＨＰバイトコードとを１つのファイル上にエンコードする場合を例として説明する。具体的には、ＰＨＰバイトコードを仮想バイトコード（後述）として、Ｊａｖａバイトコードにエンコードする。
【００１７】
＜システム構成＞
図１は、本実施形態が適用されるシステムの全体構成を示す図である。
図１に示すシステムは、パーソナルコンピュータ等のコンピュータで実現される。このシステムは、ＰＨＰスクリプトが記述されたソースコードをコンパイルしてＪａｖａのバイトコードを生成する変換部１００と、生成されたバイトコードを実行する実行部２００とを備える。
【００１８】
変換部１００は、コンパイラであり、仮想バイトコードを生成する前処理部１１０と、仮想バイトコードを組み込んだＪａｖａバイトコードのクラス・ファイルを生成するコード化処理部１２０とを備える。ここで、仮想バイトコードとは、ＰＨＰバイトコードをＪａｖａバイトコード上のメソッド呼び出しとしてエンコードしたものであり、言い換えれば、Ｊａｖａ仮想機械がそのまま実行できる形に変換したものである。仮想バイトコードは、仮想インストラクションと仮想コンスタント値（定数値）とからなる。
【００１９】
実行部２００は、Ｊａｖａ仮想機械、または、ＰＨＰバイトコードの実行系、または、両者の性質を備えた実行系である。実行部２００がＪａｖａ仮想機械である場合は通常のＪａｖａバイトコードとして実行される。一方、ＰＨＰバイトコードの実行系である場合、詳しくは後述するが、実行部２００は、変換部１００により生成されるバイトコードに固有のデータ構造に応じて、このバイトコードを実行する。実行部２００の実装は、インタプリタであっても良いし、ＪＩＴ（Just In Time）コンパイラであっても良い。また、複数の実装を併存させても良い。
【００２０】
図２は、本実施形態のプログラム処理装置を実現するコンピュータのハードウェア構成例を示す図である。
図２に示すコンピュータ１０は、演算手段であるＣＰＵ（Central Processing Unit）１０ａと、記憶手段であるメイン・メモリ１０ｃおよび磁気ディスク装置（ＨＤＤ：Hard Disk Drive）１０ｇを備える。また、ネットワークを介して外部装置に接続するためのネットワーク・インタフェース・カード１０ｆと、表示出力を行うためのビデオ・カード１０ｄおよび表示装置１０ｊと、音声出力を行うための音声機構１０ｈとを備える。さらに、キーボードやマウス等の入力デバイス１０ｉを備える。
【００２１】
図２に示すように、メイン・メモリ１０ｃおよびビデオ・カード１０ｄは、システム・コントローラ１０ｂを介してＣＰＵ１０ａに接続されている。また、ネットワーク・インタフェース・カード１０ｆ、磁気ディスク装置１０ｇ、音声機構１０ｈおよび入力デバイス１０ｉは、Ｉ／Ｏコントローラ１０ｅを介してシステム・コントローラ１０ｂと接続されている。各構成要素は、システム・バスや入出力バス等の各種のバスによって接続される。例えば、ＣＰＵ１０ａとメイン・メモリ１０ｃの間は、システム・バスやメモリ・バスにより接続される。また、ＣＰＵ１０ａと磁気ディスク装置１０ｇ、ネットワーク・インタフェース・カード１０ｆ、ビデオ・カード１０ｄ、音声機構１０ｈ、入力デバイス１０ｉ等との間は、ＰＣＩ（Peripheral Components Interconnect）、ＰＣＩ  Ｅｘｐｒｅｓｓ、シリアルＡＴＡ（AT Attachment）、ＵＳＢ（Universal Serial Bus）、ＡＧＰ（Accelerated Graphics Port）等の入出力バスにより接続される。
【００２２】
なお、図２は、本実施形態が適用されるのに好適なコンピュータのハードウェア構成を例示するに過ぎず、実際の各サーバが図示の構成に限定されないことは言うまでもない。例えば、ビデオ・カード１０ｄを設ける代わりに、ビデオメモリのみを搭載し、ＣＰＵ１０ａにてイメージ・データを処理する構成としても良い。また、音声機構１０ｈを独立した構成とせず、システム・コントローラ１０ｂやＩ／Ｏコントローラ１０ｅを構成するチップセットの機能として備えるようにしても良い。また、補助記憶装置として磁気ディスク装置１０ｇの他に、各種の光学ディスクやフレキシブル・ディスクをメディアとするドライブを設けても良い。表示装置１０ｊとしては、主として液晶ディスプレイが用いられるが、その他、ＣＲＴディスプレイやプラズマ・ディスプレイ等、任意の方式のディスプレイを用いて良い。
【００２３】
図１に示したシステムにおいて、変換部１００および実行部２００は、例えば図２に示したコンピュータにおいて、メイン・メモリ１０ｃに読み込まれたプログラムをＣＰＵ１０ａが実行することにより実現される。また、変換部１００および実行部２００の処理中に生成される一時ファイル等は、メイン・メモリ１０ｃの作業領域等に保持される。
【００２４】
＜バイトコードのデータ構造＞
図３は、Ｊａｖａバイトコードのデータ構造を示す図である。
変換部１００により生成される、本実施形態のバイトコードのクラス・ファイルは、全体的な構成としては、通常のＪａｖａバイトコードのクラス・ファイルと変わらない。すなわち、図３に示すように、ヘッダ３０１、コンスタント・プール３０２、クラス情報３０３、フィールド３０４、メソッド３０５、アトリビュート３０６と呼ばれる部分が含まれる。メソッド３０５内には、Ｊａｖａ自体のインストラクションの他、ＰＨＰのインストラクションである仮想インストラクションと、仮想インストラクションに使用されるＰＨＰ内部のコンスタント・プールとが含まれる。
【００２５】
上述したように、本実施形態では、ＰＨＰバイトコードを仮想バイトコードとして、Ｊａｖａバイトコードにエンコードする。具体的には、仮想バイトコードは、ｉｎｖｏｋｅｓｔａｔｉｃ（０ｘｂ８）インストラクションと、メソッドを示すコンスタント値が入っているコンスタント・プール３０２中のインデックス（索引番号）として、エンコードされる。例えば、ＰＨＰ言語用の仮想バイトコードを考えると、ＰＨＰオブジェクトの足し算を行うＡＤＤという仮想インストラクションは、ＶｉｒｔｕａｌＯｐｃｏｄｅｓクラスのスタティック・メソッドａｄｄ（）へのメソッド呼び出しになる。なお、コンスタント・プール３０２は、メソッド呼び出しのバイトコードから参照される値を保持するデータ構造である。
【００２６】
実際のバイト列は、
０ｘｂ８（invokestatic）
０ｘ００（higher byte of 5, index for the constant pool）
０ｘ０５（lower byte of 5, index for the constant pool）
という、３バイトになる。ただし、コンスタント・プール３０２は図４のようになっているとする。これにより、Ｊａｖａバイトコードとしては、ｃｏｍ．ｉｂｍ．ＶｉｒｔｕａｌＯｐｃｏｄｅｓクラスのｖｏｉｄ  ａｄｄ（Ｒｕｎｔｉｍｅ）というスタティック・メソッドを呼び出すという意味になる。なお、実装形態によっては、ｉｎｖｏｋｅｓｔａｔｉｃ（０ｘｂ８）インストラクションの代わりに、ｉｎｖｏｋｅｖｉｒｔｕａｌ（０ｘｂ６）、ｉｎｖｏｋｅｉｎｔｅｒｆａｃｅ（０ｘｂ９）、ｉｎｖｏｋｅｓｐｅｃｉａｌ（０ｘｂ７）等を使用して実現しても良い。
【００２７】
メソッドの引数には、実行コンテキスト（Ｒｕｎｔｉｍｅ）を渡している。仮想機械の状態を変えるような仮想インストラクションをＪａｖａのメソッドとして実装する場合には、この実行コンテキスト・オブジェクトに対する操作として実装されることになる。ここで、仮想機械の状態とは、ＰＨＰバイトコードにおけるレジスタ、スタック、ヒープなどの仮想的な記憶装置の内容や、広義には入出力などを含む。したがって、仮想機械の状態を変えるとは、例えば、外部入出力へのアクセスや、スタックへの積み下ろしなどが行われることを意味する。具体的には、例えばＡＤＤというインストラクションは、
・スタックから２つ値を取り出す。
・スタックに計算結果の値を積む。
という、仮想機械の状態変化を起こす。なお、実行コンテキストを必要としないインストラクションの場合は省略して良い。
【００２８】
仮想バイトコードの無条件分岐命令や条件分岐命令のエンコードには、実際のＪａｖａ仮想機械の分岐命令を用いる。具体的には、無条件分岐にはｇｏｔｏ（０ｘａ７）、条件分岐にはｉｆｎｅ（０ｘ９ａ）やｉｆｅｑ（０ｘ９９）を用いる。また、実装形態により、さらに、多条件分岐命令ｔａｂｌｅｓｗｉｔｃｈ（０ｘａａ）、ｌｏｏｋｕｐｓｗｉｔｃｈ（０ｘａｂ）と組み合わせた分岐も考えられる。
【００２９】
仮想バイトコードの定数には、スタティック・フィールドと、そこからの読み出しである、ｇｅｔｓｔａｔｉｃ（０ｘｂ２）を用いる。なお、実装形態によっては、インスタンス・フィールドと、そこからの読み出しである、ｇｅｔｆｉｅｌｄ（０ｘｂ４）を使用して実現しても良い。
【００３０】
＜コンスタント・プールのデータ構造＞
次に、本実施形態におけるコンスタント・プールのデータ構造について説明する。
図５は、ＰＨＰのオペコード（Ｏｐｃｏｄｅ）の一部を例示する図である。
図５に示すように、本実施形態では、仮想バイトコードの各オペコードに対し、できるだけ連続した番号（ＩＤ）を割り振り、この番号は利用者間で共通化されているものとする。番号の始まりは、大きくなりすぎないように決めるか、別途オフセットなどの情報を渡してクラス・ファイル単位で柔軟に調整できるようにしても良い。
【００３１】
図６は、図５のオペコードＩＤに対応して構成された本実施形態によるコンスタント・プールの例を示す図である。
図６に示すように、本実施形態では、各仮想インストラクションに対応するメソッドを指定するメソッド情報（Ｍｅｔｈｏｄ＿ｉｎｆｏ）が、コンスタント・プール中で、対応するＩＤをインデックスとする位置に置かれる。このように、仮想インストラクションの内容に応じてコンスタント・プールにおける配置を決めておくことにより、ｉｎｖｏｋｅｓｔａｔｉｃから続く３バイトに含まれるコンスタント・プール・エントリのインデックスを読むだけで（メソッド情報自体を読まなくても）、その一連のバイトコードが表す仮想インストラクションの内容が分かるようになる。
【００３２】
なお、このようなコンスタント・プールとなるように調整する方法としては、種々の方法が考えられる。単純な方法は、仮想インストラクションを指定するコンスタントは全て固定にしておき、他の用途に用いないことである。また、多少効率的にコンスタント・プールを利用するために、利用されていない仮想インストラクションに対応するコンスタント・プールのエントリを他の用途に開放するようにしても良い。
【００３３】
＜変換部の機能＞
次に、変換部１００の前処理部１１０およびコード化処理部１２０の機能を説明する。
図７は、変換部１００による処理の流れを示すフローチャートである。
図７に示す動作例では、コンスタント・プール、メソッド定義、フィールド定義などを仮に記憶しておくコンポーネント（Ｔｏ−Ｄｏリスト）を用意している。このコンポーネントは、例えば図２に示したメイン・メモリ１０ｃやＣＰＵ１０ａのキャッシュメモリにより実現される。
図７を参照すると、まず、変換部１００の前処理部１１０が、変換対象のプログラム全体を見て、各仮想インストラクションに関して、コンスタント・プールにおける配置場所を予約する（ステップ７０１）。
【００３４】
次に、前処理部１１０は、各仮想インストラクションに関して、バイトコード生成処理を行い、生成されたバイトコードをコンスタント・プールの未だ予約されていない場所に置く（ステップ７０２）。このとき、仮想インストラクションが仮想コンスタント値を取るような場合に、その仮想インストラクションをエンコードしておくフィールド（名）を割り当て、仮想コンスタント値とともにＴｏ−Ｄｏリストに入れる。
【００３５】
以上の操作の後、前処理部１１０は、ステップ７０２で割り当てられた各フィールドとそれらの初期化のためのコードを生成し、Ｔｏ−Ｄｏリストに入れる（ステップ７０３）。そして、コード化処理部１２０が、Ｔｏ−Ｄｏリストに保持されている全ての内容をＪａｖａのバイトコードとして書き出す（ステップ７０４）。書き出されたＪａｖａバイトコードにおいて、コンスタント・プールにおけるｃｐ＿ｉｎｆｏの配列に、ＣＯＮＳＴＡＮＴ＿Ｉｎｔｅｇｅｒ＿ｉｎｆｏ型の整数コンスタント値として、実行に必要なデータおよびメソッドの位置を示す情報（この情報をオフセット値と呼ぶ）が記録される。オフセット値により示される情報は、仮想インストラクション列がエンコードされているメソッドの本体部分（Ｃｏｄｅ属性情報）の開始位置、読み込みが必要なコンスタント・プールの記録内容の開始位置、読み込みを行うべきコンスタント・プール・エントリのインデックスの３つである。
【００３６】
図８は、図７のバイトコード生成処理の内容を示すフローチャートである。
図８を参照すると、前処理部１１０は、まず仮想インストラクションが仮想コンスタント値を取るか否かを判断する（ステップ８０１）。仮想コンスタント値を取らない場合（ステップ８０１でＮｏ）、前処理部１１０は、ランタイム・コンテキストに関するバイトコード「ａｌｏａｄ  １」を生成する（ステップ８０４）。
【００３７】
一方、仮想インストラクションが仮想コンスタント値を取る場合（ステップ８０１でＹｅｓ）、前処理部１１０は、｛フィールド，値｝の情報をＴｏ−Ｄｏリストに追加する（ステップ８０２）。そして、追加されたフィールドに関するバイトコード「ｇｅｔｓｔａｔｉｃ」を生成した後（ステップ８０３）、バイトコード「ａｌｏａｄ  １」を生成する（ステップ８０４）。
【００３８】
次に、前処理部１１０は、生成したバイトコードをコンスタント・プールのインデックスにおける予約されている場所に割り当てる（ステップ８０５）。そして、バイトコード「ｉｎｖｏｋｅｓｔａｔｉｃ」を生成する（ステップ８０６）。バイトコード「ｉｎｖｏｋｅｓｔａｔｉｃ」に付加されるＭｅｔｈｏｄｒｅｆコンスタント・プール・エントリのインデックスは、エンコードされた仮想インストラクションの種類に応じて特定されている。そのため、このステップ８０６で生成されたバイトコードを見れば、実際にＭｅｔｈｏｄｒｅｆコンスタント・プール・エントリを読み込んで内容を解読しなくても、仮想インストラクションの内容がわかる。
【００３９】
具体的な仮想インストラクションの例を挙げて、図８のバイトコード生成処理をさらに説明する。
ＰＨＰのソースコード
ｅｃｈｏ“Ｈｅｌｌｏ  Ｗｏｒｌｄ￥ｎ”；
に対し、仮想インストラクションは次のようになる。
ＰＵＳＨ“Ｈｅｌｌｏ  Ｗｏｒｌｄ＾ｎ”
ＥＣＨＯ
この仮想インストラクションを図８に示す手順で処理すると、次のようになる。
【００４０】
まず、「ＰＵＳＨ“Ｈｅｌｌｏ  Ｗｏｒｌｄ＾ｎ”」について処理を行うと、ステップ８０１ではＹｅｓとなるので、ステップ８０２に移行し、
｛フィールド，値｝＝｛“ｃｏｎｓｔＶａｌ０”，“Ｈｅｌｌｏ  Ｗｏｒｌｄ￥ｎ”｝
がＴｏ−Ｄｏリストに追加される。そして、ステップ８０３で、バイトコード
ｇｅｔｓｔａｔｉｃ“ｃｏｎｓｔＶａｌ０”
が生成され、ステップ８０４で、バイトコード
ａｌｏａｄ  １
が生成される。
【００４１】
この後、ステップ８０５で、ＰＵＳＨのオペコードに対するＭｅｔｈｏｄｒｅｆコンスタント・プール・エントリ（VirtualOpcodes.push(PHPValue,Runtime)という情報）のインデックスが得られる。ここでは、仮に「２０」とする。そして、ステップ８０６で、バイトコード
ｉｎｖｏｋｅｓｔａｔｉｃ  ２０
が生成される。
【００４２】
次に、「ＥＣＨＯ」について処理を行うと、ステップ８０１ではＮｏとなるので、直ちにステップ８０４に移行し、バイトコード
ａｌｏａｄ  １
が生成される。そして、ステップ８０５で、ＥＣＨＯのオペコードに対するＭｅｔｈｏｄｒｅｆコンスタント・プール・エントリ（VirtualOpcodes.echo(Runtime)という情報）のインデックスが得られる。ここでは、仮に「３０」とする。そして、ステップ８０６で、バイトコード
ｉｎｖｏｋｅｓｔａｔｉｃ  ３０
が生成される。
【００４３】
＜実行部の機能＞
次に、実行部２００の機能を説明する。
本実施形態の実行部２００は、バイトコードや仮想バイトコードについて、既に検証が済んでいる場合等、検証を行わなくても良い場合に、不要なコンスタント・プールの解読を省略する。そして、プログラムの実行に必要なコンスタント・プールのエントリとバイトコードを読み込むことで、高速な読み込みが実現される。
【００４４】
図９は、バイトコードの検証を行わなくて良い場合における実行部２００の処理の流れを示すフローチャートである。
図９を参照すると、実行部２００は、まずプログラムの先頭の８バイトをスキップする（ステップ９０１）。これにより、図３に示したＪａｖａバイトコードのヘッダ３０１が飛ばされる。
【００４５】
次に、実行部２００は、コンスタント・プール・エントリの個数を読み込み（ステップ９０２）、さらに、コンスタント・プールに記録されたオフセット値を読み込む（ステップ９０３）。次に、実行部２００は、ステップ９０３で読み込んだオフセット値を用いて、仮想インストラクションのためのＭｅｔｈｏｄｒｅｆ等の不要なコンスタント・プール・エントリをスキップする（ステップ９０４）。そして、残りのコンスタント・プール・エントリを読み込んで解読する（ステップ９０５）。この後、実行部２００は、仮想インストラクション列（ｒｕｎ（））の先頭（実際には、その手前のメソッド情報）までスキップし（ステップ９０６）、後続する仮想インストラクション列を読み込む（ステップ９０７）。
【００４６】
このように、本実施形態では、変換部１００により生成されたクラス・ファイルについて、バイトコードの検証を行わなくて良い場合には、実行部２００は、クラス・ファイルの全てを読み込んで解読するのではなく、オフセット値を用いて不要な部分を読み飛ばし、必要な部分のみを読み込んで解読する。このため、実行部２００による処理の高速化を図ることができる。
【００４７】
以上、本実施形態について説明したが、本発明の技術的範囲は上記実施形態に記載の範囲には限定されない。例えば、上記実施形態では、ＪａｖａバイトコードにＰＨＰバイトコードをエンコードしてクラス・ファイルを生成する場合について説明したが、適用される言語はＪａｖａおよびＰＨＰに限定されないことは言うまでもない。第１のバイトコード上に第２のバイトコードがエンコードされる場合を想定すると、第１のバイトコードが、Ｊａｖａのコンスタント・プールのような、メソッド呼び出しのバイトコードから参照される値を保持するデータ構造を持ち、このデータ構造がクラス・ファイル全体のできるだけ先に読まれる位置（先頭付近）に位置するような言語であれば、本実施形態を適用することができる。その他、上記実施形態に、種々の変更または改良を加えたものも、本発明の技術的範囲に含まれることは、特許請求の範囲の記載から明らかである。
【図面の簡単な説明】
【００４８】
【図１】本実施形態が適用されるシステムの全体構成を示す図である。
【図２】本実施形態のプログラム処理装置を実現するコンピュータのハードウェア構成例を示す図である。
【図３】Ｊａｖａバイトコードのデータ構造を示す図である。
【図４】図３のバイトコードにおけるコンスタント・プールの構成例を示す図である。
【図５】ＰＨＰのオペコード（Ｏｐｃｏｄｅ）の一部を例示する図である。
【図６】図５のオペコードＩＤに対応して構成された本実施形態によるコンスタント・プールの例を示す図である。
【図７】本実施形態の変換部による処理の流れを示すフローチャートである。
【図８】図７のバイトコード生成処理の内容を示すフローチャートである。
【図９】バイトコードの検証を行わなくて良い場合における、本実施形態の実行部の処理の流れを示すフローチャートである。
【符号の説明】
【００４９】
１０ａ…ＣＰＵ、１０ｃ…メイン・メモリ、１００…変換部、１１０…前処理部、１２０…コード化処理部、２００…実行部
【図１】
2010026728.tif 000003
【図２】
2010026728.tif 000004
【図３】
2010026728.tif 000005
【図４】
2010026728.tif 000006
【図５】
2010026728.tif 000007
【図６】
2010026728.tif 000008
【図７】
2010026728.tif 000009
【図８】
2010026728.tif 000010
【図９】
2010026728.tif 000011