(57)【特許請求の範囲】
【請求項１】
仮想マシンのコンパイル装置が使用する変換用のテンプレート及びオペランド埋込情報を生成するコンパイル情報生成装置であって、
インタプリタのソースコードから、前記仮想マシンの実行単位である命令に対応する処理内容が記述された命令処理部分をテンプレート用ソースコードとして抽出する切り出し手段と、
前記テンプレート用ソースコードをコンパイルして、前記命令に対応する処理内容を表すテンプレート用アセンブリコードを生成するアセンブリコード生成手段と、
前記テンプレート用アセンブリコードをアセンブルして、前記命令に対応する処理内容を表すテンプレート用オブジェクトを生成するオブジェクト生成手段と、
前記アセンブリコード生成手段によるコンパイル及び前記オブジェクト生成手段によるアセンブルを、前記テンプレート用ソースコードにおけるオペランド部分に異なる即値を設定しながら繰り返し実行させる繰り返し制御手段と、
前記オブジェクト生成手段が生成したテンプレート用オブジェクトは、前記命令に対応する処理内容を機械語命令列で表したものであって、前記テンプレート用オブジェクトから、各命令を識別する識別情報と、前記各命令に対する機械語命令列とを対応づけたテンプレートを生成するテンプレート生成手段と、
前記繰り返し制御手段の制御に従って前記アセンブリコード生成手段が前記命令毎に生成した複数のテンプレート用アセンブリコード、及び、前記繰り返し制御手段の制御に従って前記オブジェクト生成手段が前記命令毎に生成した複数のテンプレート用オブジェクト、に表れるオペランド値の差分を元に、前記仮想マシンの前記コンパイル装置がコンパイルする対象である命令に付随されたオペランド値を、前記命令に対する機械語命令列へ埋め込む際の規則を示すオペランド埋込情報を、前記命令毎に生成する埋込情報生成手段と、を有すること
を特徴とするコンパイル情報生成装置。
【請求項２】
前記アセンブリコード生成手段は、前記テンプレート用ソースコードをコンパイルする際、ＣＰＵの属性を反映したソースコード用コンパイラを用いてコンパイルを行うこと、
を特徴とする請求項１に記載のコンパイル情報生成装置。
【発明の詳細な説明】
【０００１】
【発明が属する技術分野】
本発明は、Ｊａｖａバイトコードから機械語命令列を生成するためのＪａｖａコンパイラであって特にＪａｖａプログラム実行に当たってインタプリタと共に動作する場合があるＪａｖａコンパイラ、そして、これが使用するコンパイル情報を生成するコンパイル情報生成装置に関する。
【０００２】
【従来の技術】
最近、Ｊａｖａプログラムは普及が進んでおり、携帯電話をはじめとする家電製品にもＪａｖａプログラムの実行環境を備えるものが増えている（「Ｊａｖａ」は、米国 Sun Microsystems, Inc.の商標または登録商標）。
家電製品上でのＪａｖａプログラム実行は、Ｊａｖａプログラムを直接実行するプログラムであるインタプリタによって行われるのが一般的であるが、インタプリタによる実行は一般的に処理速度が遅いため、携帯電話においてＪａｖａプログラムのゲームを実行するなどの新サービスにおいては、特に処理速度に関して不満がある。
【０００３】
Ｊａｖａプログラムの実行を高速化する方法として、高速なＪＩＴ（Ｊｕｓｔ−ｉｎ−Ｔｉｍｅ）型のＪａｖａコンパイラを使ってバイトコードを機械語命令列に変換する方法、あるいは、インタプリタとＪａｖａコンパイラとを実行環境に共存させ、部分部分でインタプリタとＪａｖａコンパイラとを切り替えながらＪａｖａプログラムを実行する、というハイブリッド（混在実行）などの方法がある（ハイブリッド方式に関しては、例えば特許文献１に開示されている）。
【０００４】
図１３は、従来のＪＩＴ型Ｊａｖａコンパイラの構成とそのコンパイル処理の流れとを示す図である。
Ｊａｖａバイトコード（Ｊａｖａプログラムの実行単位、１命令に相当）を受け取ったＪａｖａコンパイラ１３００において、先ず、中間コード生成部１３０１がバイトコードを中間コードに変換する。その後、最適化部１３０２が、実行環境のＣＰＵの属性に合わせて中間コードの最適化（レジスタやスタックフレームに関連する部分の書き換え）を行う（ここで、レジスタやオペランドスタック構造が実行環境のＣＰＵの属性に合わせて最適化される）。そして、コード生成部１３０３が、最適化後の中間コードを機械語命令列に変換し、オペランドを埋め込む。
【０００５】
【特許文献１】
特開２０００−２６７８６２号公報
【０００６】
【特許文献２】
特開２０００−３４７８７３号公報
【０００７】
【特許文献３】
特開２０００−３４７８７５号公報
【０００８】
【非特許文献１】
Manjunath, G. and Krishnan, V. : A small Hybrid JIT for Embedded Systems, ACM SIGPLAN Notices Vol.35,No4,April, pp.44-49(2000)
【０００９】
【発明が解決しようとする課題】
しかしながら、こうした従来型Ｊａｖａコンパイラの使用は、高性能のＣＰＵ及び豊富なメモリ資源を有するパーソナルコンピュータでのＪａｖａプログラム実行を前提としており、ＣＰＵ性能やメモリ資源に関して制約のある家電製品上のＪａｖａ実行環境へ導入しようとすると、以下のような問題がある。
【００１０】
その問題とは、（１）中間コード生成用プログラム及び最適化処理用プログラム、そして、中間コードを格納するためのメモリが大きく、メモリ資源が不足する場合があること、（２）中間コード生成及び最適化処理の処理量が大きいため、能力の低い家電用ＣＰＵはこの部分の処理に長時間を要し、高速化の効果が得られないこと、である。
【００１１】
また、ハイブリッド方式を採用した家電製品でＪａｖａバイトコードを実行する場合、メモリの制約のため、細かい単位でインタプリタ実行とＪａｖａコンパイル実行とを切り替えることが好ましいが、従来のハイブリッド方式でこうした切り替えを行おうとすれば、切り替えの度に、データをスタックして使用するインタプリタとデータをレジスタに割り付けて使用するＪａｖａコンパイラとの間でデータの扱いに整合を取るための処理が発生する。これによって、ＣＰＵ処理負荷が著しく増大するため、家電製品の実行環境において従来のＪａｖａコンパイラをハイブリッド方式で使用することには無理がある。
【００１２】
本発明は上記課題に鑑み、家電機器などメモリ容量及びＣＰＵ性能に制限のある機器上で使用するのに適したＪａｖａプログラムであって、Ｊａｖａ実行環境においてインタプリタとの間で細かい単位の切り替えを行ってもＪａｖａプログラムの高速実行を可能とするＪａｖａコンパイラを提供すること、さらに、こうしたＪａｖａコンパイラが利用するコンパイル情報を生成するコンパイル情報生成装置及び方法を提供すること、を目的とする。
【００１３】
【課題を解決するための手段】
上記の目的を達成するために、本発明のＪａｖａコンパイラは、実行環境においてＪａｖａプログラムをバイトコード単位で機械語命令列に変換するＪａｖａコンパイラであって、各種バイトコードとその処理内容を記述した機械語命令列とを対応づけた機械語テンプレートを保持するテンプレート保持手段と、前記テンプレート保持手段が保持する機械語テンプレートを用いてバイトコードから機械語命令列を生成する機械語命令生成手段と、各種バイトコードに含まれるオペランド値について、機械語命令列への埋め込みの際の規則を示すオペランド埋込情報を保持する埋込情報保持手段と、前記埋込情報保持手段が保持するオペランド埋込情報が示す規則に従って、前記機械語命令生成手段によって生成された機械語命令列にオペランド値を埋め込むオペランド埋込手段と、を有し、前記テンプレート保持手段が保持する機械語テンプレートに含まれる機械語命令列は、バイトコード実行用のインタプリタのコンパイル及びアセンブルによって得られるオブジェクトコードから生成されたものであり、前記埋込情報保持手段が保持するオペランド埋込情報は、前記インタプリタのコンパイル及びアセンブルを前記インタプリタ中のオペランド部分に異なる即値を設定しながら繰り返し実行させることで得られた複数パターンのアセンブリコード及びオブジェクトコードに表れるオペランド値の差分を元に求められたものであることを特徴とする。
【００１４】
テンプレートを用いてバイトコードを直接機械語命令列に変換することで中間コードを生成及び最適化する処理を省いているので、メモリ容量及びＣＰＵ処理性能に制限のある実行環境で使用するのに適している。
さらに、前記Ｊａｖａコンパイラは前記実行環境で前記インタプリタと共存した状態で動作し、前記テンプレート保持手段が保持するテンプレートに含まれる機械語命令列は、前記インタプリタにおいてバイトコードの処理内容を記述した部分であるテンプレート用ソースコードを前記インタプリタのソースコードと共に単一ファイルとしてコンパイル及びアセンブルして得られるオブジェクトコードから生成されたものであること、とすれば、テンプレートを用いてバイトコードを機械語命令列に変換する本Ｊａｖａコンパイラとインタプリタとの間ではデータの扱いに整合が取れている。そのため、本Ｊａｖａコンパイラについては、メモリ容量及びＣＰＵ処理性能に制限のある実行環境でも、インタプリタとの間で細かい単位の切り替えを行う形のハイブリッド方式での使用が可能となり、Ｊａｖａプログラムを高速実行できる。
【００１５】
また、こうしたテンプレート及びオペランド埋込情報は、実行環境にあってＪａｖａバイトコードを機械語命令列に変換するＪａｖａコンパイラが使用する変換用のテンプレート及びオペランド埋込情報を生成するコンパイル情報生成装置であって、バイトコード実行用のインタプリタのソースコードから各種バイトコードの処理内容が記述された部分をテンプレート用ソースコードとして切り出す切出し手段と、前記テンプレート用ソースコードをコンパイルして各種バイトコードの処理内容を表すテンプレート用アセンブリコードを得るアセンブリコード生成手段と、前記テンプレート用アセンブリコードをアセンブルして各種バイトコードの処理内容を表すテンプレート用オブジェクトを得るオブジェクト生成手段と、前記アセンブリコード生成手段によるコンパイル及び前記オブジェクト生成手段によるアセンブルを、前記テンプレート用ソースコードにおけるオペランド部分に異なる即値を設定しながら繰り返し実行させる繰り返し制御手段と、前記オブジェクト生成手段が生成したテンプレート用オブジェクトから、各種バイトコードを示す識別情報とその処理内容に対応する機械語命令列とを対応づけたテンプレートを生成するテンプレート生成手段と、前記繰り返し制御手段の制御に従って前記アセンブリコード生成手段が各種バイトコード毎に生成した複数のテンプレート用アセンブリコード、及び、前記繰り返し制御手段の制御に従って前記オブジェクト生成手段が各種バイトコード毎に生成した複数のテンプレート用オブジェクト、に表れるオペランド値の差分を元に、バイトコード中のオペランド値をその処理内容に対応する機械語命令列へ埋め込む際の規則を示すオペランド埋込情報を各種バイトコード毎に生成する埋込情報生成手段と、を有する、というコンパイル情報生成装置によって生成することができる。
【００１６】
【発明の実施の形態】
以下、本発明のＪＩＴ型Ｊａｖａコンパイラ（以下、単に「ＪＩＴコンパイラ」という）、及び当該ＪＩＴコンパイラがコンパイル実行に当たって使用するコンパイル情報を生成するためのコンパイル情報生成装置に関する実施の形態を、図面を参照しながら説明する。
（ＪＩＴコンパイラ）
（概要）
本実施の形態におけるＪＩＴコンパイラは、機械語テンプレート及びオペランド埋込情報（あわせて「コンパイル情報」という）を用いてＪａｖａプログラムをバイトコード単位で機械語命令列に変換するものであり、当該機械語テンプレート及びオペランド埋込情報は、各種Ｊａｖａ実行環境で共通して用いられるインタプリタのＣソースコードから生成されたものである。従来のＪａｖａコンパイラが行っている、バイトコードから中間コードへ変換処理及び中間コードの最適化処理（図１３参照）を行わない分、本ＪＩＴコンパイラは使用メモリ量やＣＰＵ負荷が小さい。また、本ＪＩＴコンパイラが生成する機械語命令列は、インタプリタと同様のスタックマシンとして動作する。そのため、本ＪＩＴコンパイラをハイブリッド方式の実行環境で使用しても、インタプリタとの切り替え時に整合を取るための処理が発生しない。その分ＣＰＵ負荷が軽くなり、Ｊａｖａプログラム実行速度が向上する。
【００１７】
（構成）
以下、本実施の形態におけるＪＩＴコンパイラの構成及び処理内容について説明する。
図１は、本実施の形態におけるＪＩＴコンパイラ１の構成を、同ＪＩＴコンパイラ１が動作するＪａｖａプログラム実行環境Ｅにおいて示す図である。このＪａｖａプログラム実行環境Ｅにおいて、ＪＩＴコンパイラ１は、インタプリタ３と共に動作するハイブリッド実行の形で、Ｊａｖａプログラムをバイトコード単位で機械語命令列に変換する。同実行環境Ｅ上では、他に、生成された機械語命令列を実行する機械語命令実行装置４、ＪＩＴコンパイラ１とインタプリタ３との間の実行切替を制御する切替装置２などが動作している。
【００１８】
ＪＩＴコンパイラ１は、アドレス管理部１１、分離部１２、機械語生成部１３、オペランド埋込部１４を有し、更に、アドレス変換テーブル１５、テンプレート１６、オペランド埋込情報１７を有する。
テンプレート１６は、各種バイトコードの識別子（オペコード）とこれに対応する機械語命令列（オペランド部分を空値とした形式のもの）との組合せ（テンプレート素片データ）の集合である。バイトコードから得たオペコードをキーにテンプレート１６を検索すれば、当該バイトコードに対応する処理内容の機械語命令列が得られる。
【００１９】
オペランド埋込情報１７は、各種バイトコードについて、当該バイトコードに含まれるオペランドを対応する機械語命令列に埋め込む際のルールを示す情報である。
分離部１２は、切替装置２から出力されてくる１命令分のバイトコードをオペコード部分とオペランド部分とに分離して、オペコード部分を機械語生成部１３に、オペランド部分をオペランド埋込部１４に出力する。
【００２０】
機械語生成部１３は、受け取ったオペコード部分の値をキーにしてテンプレート１６を検索し、当該バイトコードの処理内容に対応する機械語命令列を読み出してオペランド埋込部１４に出力する。
オペランド埋込部１４は、機械語生成部１３から受け取った、オペランド部分が空値の機械語命令列に、分離部１２から受け取ったバイトコードのオペランド部分の内容を、対応するオペランド埋込情報に応じた形で機械語命令列に埋め込む。この時、必要であれば、バイトコードにおけるオペランド値をオペランド埋込情報の内容に応じて変換する。例えば、バイトコードにおけるオペランドがローカル変数配列中のある要素の配列番号である場合は、当該要素の配列先頭からのオフセットに変換する。
【００２１】
また、オペランドがアドレス（分岐先アドレス）の場合は、バイトコードにおけるオペランド値（当該バイトコードの先頭アドレスからの見た相対アドレスの値）を、アドレス管理部１１が管理するアドレス変換テーブル１５の内容をもとに機械語アドレス値に変換（当該バイトコードに対応する機械語命令列の先頭アドレスに上記の相対アドレスを加える処理）を行った上で機械語命令列に埋め込む。この変換を可能とするために、アドレス管理部１１はバイトコードのアドレスと当該バイトコードに対応する機械語命令のアドレスとの組をアドレス変換テーブル１５に設定しておく。そして、切替装置２からバイトコードとそのアドレスとが出力されてくると、バイトコードに含まれるオペコードをキーにテンプレート１６を検索して当該バイトコードに対応する機械語命令列の長さを得る。そして、これら情報を用いてアドレス変換テーブルの内容を更新する。なお、オペランドがアドレスか否かは、ＪＩＴコンパイラが各種バイトコードの構文情報を保持しておいて、これを各構成部が参照して判定することにしても良いし、アドレスオペランドに関するオペランド埋込情報に、アドレスであることを示す情報を付加しておくことにしてもよい。
【００２２】
オペランド埋込の完了によって、当該バイトコードの機械語への変換は完了する。そして、オペランド埋込部１４は、結果の機械語命令列を機械語命令実行装置４に出力し、これを実行させる。
以下、具体的なバイトコードを例に、ＪＩＴコンパイラ１の処理を説明する。図２は、バイトコード例として示す“ｂｉｐｕｓｈ”命令（オペランドスタックに整数値を積む命令）に関して、そのバイトコード２１と変換後の機械語命令列２４の内容、さらに、対応するテンプレート素片データ２２及びオペランド埋込情報２３の内容を示す。なお、“ｂｉｐｕｓｈ”を含め、Ｊａｖａオペコードは通常１バイトの１６進データで表現されるが、ここでは説明の便宜上“ｂｉｐｕｓｈ”という文字列で表記している。
【００２３】
図２に示す“ｂｉｐｕｓｈ”命令用テンプレート素片データ２２は、２バイト長の“ｂｉｐｕｓｈ”バイトコードが４バイトの機械語命令列“０ｘ４Ｄ２６００００”に対応することを示している。また、同図に示す“ｂｉｐｕｓｈ”命令用のオペランド埋込情報２３の内容は、オペランドの数が１つであり、当該オペランドの「埋込場所」、「サイズ及び符号」、「エンディアン」（データの埋め込み順序）が、それぞれ「３バイト目」、「２バイト長、符号あり」、「リトルエンディアン」であることを示している。
【００２４】
そして、計算式情報は、バイトコードにおけるオペランドの値を、「１倍した上で０を加える」という計算式に代入して得られる結果を機械語命令列にオペランド値として設定することを示す。「１倍した上で０を加える」とはバイトコードにおけるオペランド値をそのまま機械語命令列に設定することを示す。計算式の内容がこのようになるのは、ｂｉｐｕｓｈにおけるオペランドが定数だからである。
【００２５】
ｂｉｐｕｓｈの場合、先ず、分離部１２がバイトコードの先頭１バイト（オペコード値）を読み出し、それが“ｂｉｐｕｓｈ”であることを認識する。そして先頭１バイト（オペコード）を機械語生成部１３に、後続１バイト（オペランド）をオペランド埋込部１４にそれぞれ出力する。
機械語生成部１３は、テンプレート１６の中から“ｂｉｐｕｓｈ”オペコードに対応するテンプレート素片データ２２を参照して機械語命令列“０ｘ４Ｄ２６００００”を読み出し、オペランド埋込部１４に出力する。
【００２６】
オペランド埋込部１４は、機械語生成部１３から機械語命令列が出力されてくると、オペランド埋込情報２３を参照しながら、分離部１２から得たオペランド値“０ｘ９Ｅ”を機械語命令列中に埋め込む。ここでは、当該オペランド値を、機械語命令列の３バイト目からの２バイト長（３、４バイト目）のエリアに「リトルエンディアン」で「符号付き」で埋め込む。また、埋め込みに当たっては、バイトコード中のオペランド値を埋込情報の「計算式」の指定に従って変換したうえで埋め込む。計算式は「１倍した上で０を加える」という内容なので変換結果は変わらず“０ｘ９Ｅ”（１バイト）のままである。２バイトのエリアに埋め込むのでパッドデータを加えて２バイト長にする必要があるが、負の符号付きデータなので０ｘＦＦを追加する。リトルエンディアンであることから、オペランド埋め込みエリアの先頭バイト（３バイト目）のエリアに“０ｘ９Ｅ”を埋め込み、４バイト目のエリアには“０ｘＦＦ”を埋める。そして、完成した機械語命令列“０ｘ４Ｄ２６９ＥＦＦ”を機械語命令実行装置４に出力する。
（まとめ）
上記の通り、本実施の形態によるＪＩＴコンパイラは、機械語テンプレートを用いてバイトコードを機械語命令列に変換する方式なので、従来のＪＩＴコンパイラのように中間コードが発生せず、メモリ消費量が小さい。さらに、使用する機械語テンプレートは、実行環境で共に動作するインタプリタの内容をもとに生成したテンプレート素片用Ｃソースコードを当該インタプリタのＣソースコードと１つのファイルに併せて、実行環境用ＣＰＵの属性を反映したＧＣＣ（ＧＮＵＣ Compiler）でコンパイルした結果から生成している（詳細は後述）。１つのファイルにしてコンパイルしているため、実行環境においてインタプリタとハイブリッド構成で使用してもデータの扱い（オペランド割り付けなど）の不一致が発生しない（すなわち、従来のＪＩＴコンパイラをハイブリッド方式で使用する場合のような切り替え時の整合性確保の処理が発生しない）ので、性能の低いＣＰＵを使用する実行環境においてもハイブリッド方式による処理速度の向上を実現できる。
【００２７】
（備考）
なお、本実施の形態におけるＪａｖａコンパイラを、よりリアルタイム性に優れたＡＯＴ（ahead-of-time）コンパイラとして用いることも可能である。その場合、Ｊａｖａプログラムを構成するバイトコードについては、プログラム実行開始前に、Ｊａｖａコンパイラで機械語変換してから実行するのかインタプリタで実行するのかが基本ブロック単位で決定される。そして、機械語変換してから実行すると決定されたバイトコードはＪａｖａコンパイラによって、プログラム実行開始前の段階で機械語列に変換される。
（コンパイル情報生成装置）
次いで、上記のＪＩＴコンパイラ１が使用するコンパイル情報（テンプレート及びオペランド埋込情報）を生成するコンパイル情報生成装置１０について説明する。
【００２８】
（概要）
本コンパイル情報生成装置１０は、上で述べたようなコンパイル情報を生成する装置である。そのために、先ずインタプリタのソースコードからテンプレート用Ｃソースコードを生成する。そして、生成したテンプレート用ＣソースコードをインタプリタのＣソースコードと併せて、実行環境のＣＰＵ属性を反映したＧＣＣ（ＧＮＵ Ｃ Compiler）でコンパイルした結果得られるアセンブリコード、及び、これをさらにアセンブルした結果得られるオブジェクトコードからテンプレート及びオペランド埋込情報を生成する。
【００２９】
以下、本コンパイル情報生成装置１０の構成及び処理内容について、図面を参照しながら説明する。
（構成）
図３は、コンパイル情報生成装置１０の構成を示すブロック図である。
コンパイル情報生成装置１０は、Ｃ言語で記述されたインタプリタソースコードから、機械語テンプレート及びオペランド埋込情報を生成する。
【００３０】
インタプリタは、バイトコードをそのまま実行するためのプログラムであり、入力されてくるバイトコードの命令の種類（オペコードの値）に応じてｓｗｉｔｃｈ文で処理を振り分ける。振り分け先は、それぞれ１種類の命令のバイトコードに対応する処理が記述されたｃａｓｅ節である。各ｃａｓｅ節には、対応するバイトコードの処理内容がＣ言語で記述されているので、その内容をコンパイル、アセンブルして得られるオブジェクトコードは、当該バイトコードの処理内容を機械語命令列として表したものになる。コンパイル情報生成装置１０は、この機械語命令列を当該バイトコード用の機械語テンプレートに流用する。
【００３１】
コンパイル情報生成装置１０は、前処理部１０１、コンパイル管理部１０２、分離処理部１０３、アセンブル実行部１０４、繰り返し制御部１０５、差分検出部１０６を有する。また、機械語テンプレート及びオペランド埋込情報の生成に必要な各種情報を格納するための記憶部１０７を有する。
図４は、本実施の形態におけるコンパイル情報生成装置１０による生成処理の工程を示す図である。生成工程は大きく分けて、
（１）「前処理工程」：インタプリタの命令処理部のｃａｓｅ節を切り出してテンプレート用Ｃソースコードとし、コンパイル可能な形に書き換える。この時、テンプレート用Ｃソースコードのオペランド部分には、オペランド埋込情報の生成処理の便宜を考慮した即値を設定しておく。
（２）「コンパイル工程」：インタプリタとテンプレート用Ｃソースコードを単一ファイルにまとめたうえで、Ｊａｖａ実行環境のＣＰＵ属性を反映したＧＣＣでコンパイルする。
（３）「分離工程」：（２）の結果得られるアセンブリコードをインタプリタ部分とテンプレート部分とに分離して別々に保存する。以下、それぞれをインタプリタアセンブリコード、テンプレート用アセンブリコードという。
（４）「１次差分検出工程」：（１）〜（３）の処理を、テンプレート用Ｃソースコードに設定するオペランド即値を変えながら複数回繰り返し実行して、各種バイトコードに関し、それぞれオペランド即値が異なる複数パターンのテンプレート用アセンブリコードを生成した後、これらを比較して差分検出を行う（差分はオペランド部分にのみ表れる）。そして、検出した差分に基づいて各種バイトコード毎のオペランド埋込情報を生成する。ただし、テンプレート用アセンブリコードの差分だけからでは、オペランド埋込情報の全ての項目を得ることはできない。残り項目は後続の「２次差分検出工程」で求められる。
（５）「アセンブル工程」：テンプレート用アセンブリコードをアセンブルして機械語命令列からなるテンプレート用オブジェクトコードを生成する。そして、テンプレート用オブジェクトコードから機械語テンプレートを生成し、保存する。
（６）「２次差分検出工程」：テンプレート用アセンブリコードのアセンブル処理を、オペランド即値を変えながら複数回繰り返し、それぞれオペランド即値が異なる複数パターンのテンプレート用オブジェクトコードを生成し、これらのオペランド部分の差分検出を行う。そして、検出した差分に基づいてオペランド埋込情報の項目のうち上記「１次差分検出工程」で求められなかったものを求め、オペランド埋込情報を完成する。
【００３２】
以下、上記工程の各々について詳しく説明する。コンパイル情報生成処理は、外部からの起動指示に応じて開始される。
（前処理工程）
前処理工程は前処理部１０１が行う。
前処理部１０１は、繰り返し制御部１０５からの起動指示に応じて処理を開始し、まず、▲１▼インタプリタＣソースコード５０１から命令処理部分（命令処理部Ｃソースコード５０２）を抽出する。
【００３３】
次いで、▲２▼命令処理部Ｃソースコード５０２に対し、インタプリタ用マクロ定義５０３を適用してインタプリタ用Ｃソースコード５０５に変換する。
そして、▲３▼同じ命令処理部Ｃソースコード５０２にテンプレート用マクロ定義５０４を適用してテンプレート用Ｃソースコード５０６に変換する。この処理▲３▼において、インタプリタにのみ必要でテンプレートでは不要となる内容（オペコードのフェッチ及びデコード、プログラムカウンタの更新）は削除する。
【００３４】
前処理部１０１は、インタプリタ用Ｃソースコード５０５、テンプレート用Ｃソースコード５０６、そして、インタプリタＣソースコード５０１から命令処理部Ｃソースコード５０２を除いた部分（前処理部Ｃソースコード５０７及び後処理部Ｃソースコード５０８）をコンパイル管理部１０２に出力する。上記処理のうち(1)、(2)は、１回のコンパイラ生成処理につき１回のみ実行されるが、(3)の処理のみは後述する繰り返し制御部１０５の指示に従って繰り返し実行される。そして、各実行において、テンプレート用マクロ定義５０４のオペランド部分に設定される即値が書き換えられる。すなわち、オペランド即値が異なる複数パターンのテンプレート用Ｃソースコード５０６が出力される。設定すべきオペランド即値は繰り返し制御部１０５からの実行指示に付加されたパラメータの形で前処理部１０１に通知されるものとする。
【００３５】
図５は、インタプリタの命令処理部Ｃソースコード５０２、そして、これから前処理部１０１が生成するテンプレート用Ｃソースコード５０６、インタプリタ用Ｃソースコード５０５の一部を示す。
図６は、インタプリタ用Ｃソースコード５０５に適用されるインタプリタ用マクロ定義５０３、テンプレート用Ｃソースコード５０６の生成に用いられるテンプレート用マクロ定義５０４の一例を示す。
【００３６】
インタプリタ命令処理部５０２は、ｓｗｉｔｃｈ文と複数のｃａｓｅ節とから成り、ＯＰＥ＿ＣＯＤＥ（オペコードの値、すなわち、バイトコードの命令の種類）に応じてＳＷＩＴＣＨ文で処理（ＣＡＳＥ節）を振り分ける形式となっている。
マクロ定義を使ってｓｗｉｔｃｈ文を記述し分ける都合上、Ｃ言語のｓｗｉｔｃｈ文のマクロ記述は大文字ＳＷＩＴＣＨを使用している。以下、大文字でＳＷＩＴＣＨ文と書いた場合は、それがマクロ記述を指しているものとする。ＣＡＳＥ節、ＢＲＥＡＫ文についても同様である。
【００３７】
図６（ａ）に示すインタプリタ用マクロ定義５０３は、インタプリタの命令処理部Ｃソースコード５０２におけるＣＡＳＥ節内の処理の記述をプログラムカウンタ（ｐｃ）を用いた形式に書き換える（＃ｄｅｆｉｎｅ文７１４〜７１９）。また、ＳＷＩＴＣＨ文、そして、各ＣＡＳＥ節の開始と終端を示すＣＡＳＥ文及びＢＲＥＡＫ文については、記述形式を変更する（＃ｄｅｆｉｎｅ文７１１〜７１３）。
【００３８】
例えば、＃ｄｅｆｉｎｅ文７１５によって、オペコードを示す“ＯＰＥ＿ＣＯＤＥ（）”という記述は、プログラムカウンタを用いた“ｐｃ［］”という記述に書き換えられる。
また、数値を表すオペランド、例えば、「符号あり１バイト（ＯＰＥ＿ＳＣＨＡＲ（ｎ））」、「符号なし２バイト（ＯＰＥ＿ＵＳＨＲＴ（ｎ））」は、それぞれ、＃ｄｅｆｉｎｅ文７１６、７１９によって、プログラムカウンタｐｃを用いた記述、“（ｃｈａｒ）ｐｃ［ｎ］”、“（（ｐｃ［ｎ］<<８＋ｐｃ［ｎ＋１］）”に書き換えられる。
【００３９】
また、図には示していないが、アドレスを表すオペランド、例えば、「２バイトアドレス（ＯＰＥ＿ＡＤＤＲ２（ｎ））」は、“ｐｃ＋（ｓｈｏｒｔ）（ｐｃ［ｎ］＊２５６＋ｐｃ［ｎ＋１］）”に書き換えられる。
オペランドを表すマクロの引数ｎは、Ｊａｖａバイトコードにおける当該オペランドの先頭位置からのオフセット（オペランドオフセット）であり、マクロを用いて書き換えた後、ｎはプログラムカウンタｐｃのインデックスとなる。
【００４０】
なお、プログラムカウンタのインクリメントを行う“ＩＮＣＲＥＭＥＮＴ＿ＰＣ（ｖａｌｕｅ）”は、＃ｄｅｆｉｎｅ文７１４によって“ｐｃ＋＝（ｖａｌｕｅ）”と書き変えられる。
図６（ｂ）に示すテンプレート用マクロ定義５０４は、インタプリタ命令処理部５０２における個々のＣＡＳＥ節をテンプレート用Ｃソースコードとして切り出し、各種オペランドに即値を設定する。また、テンプレートにおいて不要となる種類の処理が記述された文を削除する。具体的にはオペランドフェッチ処理、プログラムカウンタ更新処理が除かれる。
【００４１】
マクロによるテンプレート切り出しは、ＳＷＩＴＣＨ文、ＣＡＳＥ文、ＢＲＥＡＫ文に対応する３つの＃ｄｅｆｉｎｅ文７２１〜７２３によって行われる。ＳＷＩＴＣＨ文はテンプレートには不要なので、ダミーラベル（ｔｅｍｐｌａｔｅ＿ｔａｂｌｅ［０］）へのｇｏｔｏ文に置き換える。ＣＡＳＥ文はテンプレートの開始位置を示すラベルに置き換える。対応するオペコードを明示するために、ラベルの末尾には、対応するＣＡＳＥ文の引数（オペコードを示す１６進１バイトのデータ、「０ｘ０１」など）を付加する。
【００４２】
ＢＲＥＡＫ文については、テンプレートの終端位置であることを示すために、前出のダミーラベル（ｔｅｍｐｌａｔｅ＿ｔａｂｌｅ［０］）へのｇｏｔｏ文に置き換える。
各種オペランドに対しては＃ｄｅｆｉｎｅ文７２４〜７２９によって即値が設定されるが、上で述べた通り、即値の内容は変更される。図６（ｂ）に示したのは即値の一例であり、これに固定されない。
【００４３】
図６に示したもの以外にも、インタプリタ内の呼出関数についても、インタプリタ用、テンプレート用それぞれのマクロで書き換える。以下、メソッド呼出関数“ｉｎｔ ｉｎｖｏｋｅ＿ｖｉｒｔｕａｌ（ｉｎｔ ｉｎｄｅｘ）”を例に説明する。
インタプリタ用マクロの場合、＃ｄｅｆｉｎｅ文で“ＩＮＶＯＫＥ＿ＶＩＲＴＵＡＬ（ｉｎｄｅｘ）”を“ｉｎｖｏｋｅ＿ｖｉｒｔｕａｌ（ｖａｌｕｅ）”に書き換える。テンプレート用マクロの場合、“ＩＮＶＯＫＥ＿ＶＩＲＴＵＡＬ（ｉｎｄｅｘ）”を、前記“ｉｎｖｏｋｅ＿ｖｉｒｔｕａｌ（ｖａｌｕｅ）”の間接参照呼出に書き換える。
【００４４】
具体的には、インタプリタの前処理部Ｃソースコードのｍａｉｎ＿ｌｏｏｐ（）内にｉｎｔ（＊）（ｉｎｔ）型の自動変数 ｉｎｄ＿ｉｎｖｏｋｅ＿ｖｉｒｔｕａｌを設けて、テンプレートでは（＊ｉｎｄ＿ｉｎｖｏｋｅ＿ｖｉｒｔｕａｌ）（ｉｎｄｅｘ）を呼び出すこととする。ｉｎｄ＿ｉｎｖｏｋｅ＿ｖｉｒｔｕａｌの初期化は前処理部Ｃソースコード５０７内で行う。
（コンパイル工程）
コンパイル工程は、コンパイル管理部１０２が行う。コンパイル管理部１０２は、前述の前処理工程によって得られたインタプリタ用Ｃソースコード５０５（▲１▼）、テンプレート用Ｃソースコード５０６（▲２▼）、インタプリタ５０１における前処理部Ｃソースコード５０７（図４参照）（▲３▼）及び後処理部Ｃソースコード５０８（図４参照）（▲４▼）を、▲３▼→▲１▼→▲４▼→▲２▼の順で、▲２▼がメイン関数（ｍａｉｎ＿ｌｏｏｐ（））内に含まれる形で、一つにまとめて単一ファイルとする。そして、コンパイル管理部１０２は、ＧＣＣ（図外）に当該ファイルを渡してコンパイルを行わせる。ここで使用されるＧＣＣは、生成中のＪａｖａコンパイラのターゲットとなるＪａｖａ実行環境で使用されるＣＰＵの属性を反映したものであり、当該ＣＰＵ属性に関する情報は、コンパイル情報生成処理開始時に繰り返し制御部１０５が起動指示に付属するパラメータとして受け取り、ＧＣＣに反映しておく。その後、コンパイル結果のアセンブリコード５０９がＧＣＣから出力されてくると、コンパイル管理部１０２は、これを分離処理部１０３に送って、分離処理の開始を指示する。
【００４５】
インタプリタの用Ｃソースコードとテンプレート用Ｃソースコードとを単一ファイルにしてコンパイルするのは、両者で共通する変数をアセンブリコードにおいて共有化するためである。こうしてコンパイルすることで、両ソースコードに共通する変数は、同じオフセットに割り当てられることになる。それによって、アセンブリコードから後述する手順で生成される機械語テンプレートに含まれる変数は、Ｊａｖａ実行環境で実際に使用する時点でも、上記ＧＣＣによってコンパイルされたインタプリタのアセンブリコードにおける同名変数とオフセットが共通となる。よって、従来のような共通変数のオフセット不整合による問題は発生せず、この不整合解消のための処理が不要となる分ＣＰＵ負荷が軽いので、低性能のＣＰＵを使用する環境でもハイブリッド方式によるコンパイル処理高速化を実現できる。また、上で述べた通り、関数呼出における関数ラベルについては、マクロによる書き換えで、インタプリタ部分においては自動変数として保持し、テンプレート部分ではこの関数ラベルを間接参照呼出しする、という形にしてあるので、両者をまとめてコンパイルすることで、テンプレート部分からインタプリタ内の関数を呼び出す場合にも関数ラベル解決の処理は不要となる。
【００４６】
（分離工程）
分離処理部１０３は、コンパイル管理部１０２から受けとったアセンブリコード５０９を、テンプレート部分（テンプレート素片アセンブリコード５１１）とインタプリタ部分（インタプリタアセンブリコード５１０）とに分離する。１つのテンプレート素片アセンブリコードは、インタプリタのうち１種類の命令のバイトコードに対応する部分（命令処理部Ｃソースコード５０２における１つのＣＡＳＥ節）に相当し、当該バイトコードの処理内容を示す。
【００４７】
図７に、切り出し処理の具体例を示す。以下、同図を参照しながら分離処理部１０３の処理内容を説明する。図７はアセンブリコード５０９の一部と、そこから切り出された２つのテンプレート素片アセンブリコード５１１、そしてインタプリタアセンブリコード５１０の一部を示す。
分離処理部１０３は、アセンブリコード５０９を先頭からサーチして、変数“ｔｅｍｐｌａｔｅ＿ｔａｂｌｅ”を検出し、この変数以降の部分からテンプレート素片アセンブリコードの切り出しを開始する。それ以降は、“ｔｅｍｐｌａｔｅ＿ｌａｂｅｌ”節を１つのテンプレート素片アセンブリコードとして切り出して保存する。切り出しに当たっては、対象の“ｔｅｍｐｌａｔｅ＿ｌａｂｅｌ”の次の行から“ｔｅｍｐｌａｔｅ＿ｔａｂｌｅ”への分岐命令の行までトレースして、その間の処理命令文をテンプレート素片アセンブリコードとする。ただし、“ｔｅｍｐｌａｔｅ＿ｔａｂｌｅ”以外への分岐（ジャンプ）命令が存在すれば、分岐先の命令処理部分も含めて１つのテンプレート素片アセンブリコードとする。ただし、分岐命令を示す文（“ｊｍｐ.Ｌ２０３３”など）、分岐先ラベル（“．Ｌ２０３３”など）はテンプレート素片アセンブリコードには含めない。また、各テンプレート素片アセンブリコードには、対応する“ｔｅｍｐｌａｔｅ＿ｌａｂｅｌ”文のうちバイトコード種別を示す識別情報（オペコード）部分（“＿０ｘｎｎ”）を識別子として付加しておく。これによって、オペコードをキーにテンプレート素片アセンブリコードを検索することが可能となる。
【００４８】
図７に示す例のうち、ｉｌｏａｄ命令に対応するアセンブリコードについては、途中に分岐命令がないので、行７０１，７０２，７０３，７０４を切り出してｉｌｏａｄ用のテンプレート素片アセンブリコードを生成する。
一方、ｉｌｏａｄ＿１命令に対応するアセンブリコードについては、途中に分岐命令“ｊｍｐ.Ｌ２０３３”があるため、行７０５，７０６に加えて、分岐先の行７０３，７０４も含んだテンプレート素片アセンブリコードを生成する。
【００４９】
分離処理部１０３は、各テンプレート素片アセンブリコードに対応するオペコードの情報を付加したうえで、全テンプレート素片アセンブリコードをまとめて「アセンブリテンプレート」として、マクロ定義に設定したオペランド即値のデータと共に保存する。
（１次差分検出工程）
１次差分検出工程は、繰り返し制御部１０５と差分検出部１０６とによって行われる。このうち繰り返し制御部１０５は、オペランド即値を変えながら、これまでに述べたテンプレート用アセンブリコード生成までの処理を繰り返し実行させ、オペランド即値の異なる複数パターンのアセンブリテンプレート（テンプレート用アセンブリコードの集合）を生成させる。差分検出部１０６は、各種バイトコードについて、複数パターンのテンプレート用アセンブリコードのオペランドに表れる差分をもとに、当該バイトコード用のオペランド埋込情報（一部項目は除く）を生成する。
【００５０】
先ず、繰り返し制御部１０５は、各構成部に対し、上記の前処理工程から分離工程までの処理を繰り返し実行させる。その際、繰り返し制御部１０５は、各実行毎に図６（ｂ）に示したテンプレート用マクロ定義５０４における数値オペランド及びアドレスオペランド用＃ｄｅｆｉｎｅ文におけるオペランド即値を書き換える。
【００５１】
図８は、繰り返し制御部１０６が設定するオペランド即値の複数のパターンを表形式で示す図である。オペランド即値は４パターンある（すなわち、繰り返しは４回行われる）。また、各パターンにおいても対象オペランドの属性（長さ、符号の有無）に応じて値は異なる。
パターン（１）、（２）、（３）は、いずれのオペランド即値も、当該オペランドのバイトコードにおけるオフセットに相当する値ｎ（プログラムカウンタの引数）を含む計算式となっており、ｎに関わる部分の値を変化させている（ｎ＋１、ｎ、２ｎ）。パターン（４）はｎを含まない定数値となっている。
【００５２】
繰り返し制御部１０５は、図８で示す４パターンのうち１パターンのオペランド即値をテンプレート用マクロ定義５０４中のオペランド部分に設定すると、当該テンプレート用マクロ定義５０４と命令処理部Ｃソースコード５０２とを用いてテンプレート用Ｃソースコード５０６を生成するよう前処理部１０１に指示する。それ以降の処理はすでに述べた通りである。そして、分離処理部１０３からアセンブリテンプレートの生成完了の通知を受けると、繰り返し制御部１０５は次のパターンのオペランド即値をテンプレート用マクロ定義５０４に設定して上記の処理を繰り返す。そして、これを４回繰り返した後、得られた４パターンのアセンブリテンプレートを差分検出部１０６に送って１次差分検出（オペランド埋込情報生成）の処理を開始させる。その際、各アセンブリテンプレートには、それぞれに使用したオペランド即値のパターン識別情報を付加しておく。
【００５３】
差分検出部１０６は、各種バイトコードに関し、４パターンのアセンブリテンプレートを検索してオペランド即値の異なる４パターンのテンプレート用アセンブリコードを読み出し、それらのオペランド部分の差分を抽出することで、当該バイトコードのオペランドを機械語命令列に埋め込む際のルールであるオペランド埋込情報を生成する。
【００５４】
図９は、オペランド埋込情報の構成とその一例（オペコード：ｉｉｎｃの場合）とを示す図である。ｉｉｎｃは、ｉｎｔ型のローカル変数に整数を加算する命令であり、オペランドは２つ（「ローカル変数」及び「整数」）である。
オペランド埋込情報９００は、どの種類の命令のバイトコードに対応するかを示す識別情報（オペコード）である識別情報部９１０と当該バイトコードの各オペランドに対応する情報であるオペランド部９２０とから成る。オペランド部９２０の数は、各バイトコードのオペランド数によって異なる。
【００５５】
オペランド部９２０は更に、バイトコードにおけるオペランドの位置をバイトコード先頭からのオフセットで示すオフセット部、機械語命令列におけるオペランドの埋め込み開始位置を示す埋込位置情報部、機械語命令列におけるオペランドの埋め込み領域のサイズを示す埋込サイズ部、オペランドの符号の有無を示す符号部、計算式情報部から成る。計算式情報部は、バイトコードにおけるオペランドの値を機械語命令列用に変換するための１次計算式（Ｘｎ＋Ｙ）を表す２種類の数値（倍率：Ｘ、加算値：Ｙ）が格納される。式の倍率値Ｘは実行環境におけるローカル変数配列の１要素の長さ、加算値Ｙは同配列先頭のヘッダ長に相当する。
【００５６】
図９に示すｉｉｎｃの場合、１つ目のオペランドに対応するオペランド部９２０ａの内容は、当該オペランドについて、埋め込み位置が機械語命令列の先頭から「８」バイト目であり、埋め込みサイズは「２」バイト、符号は「なし」で、オペランド値を変換する際の計算式が「４ｎ＋０」で表される、ということを示している。同様に２つ目のオペランドに対応するオペランド部９２０ｂの内容は、当該オペランドについて、埋め込み位置が機械語命令列の先頭から「１２」バイト目であり、埋め込みサイズは「１」バイト、符号は「あり」で、「１ｎ＋０」の計算式によってオペランド値を変換する、ということを示している。ただし、「１ｎ＋０」の計算式で変換した結果は元と同じ値になる。これは、第２オペランドが定数値だからであり、バイトコード中のオペランド値がそのまま機械語命令列のオペランド値として埋め込まれることを示す。
【００５７】
ただし、図９に示したオペランド埋込情報の項目のうち、埋め込み位置情報はアセンブリコードからは求めることができない。そこで、１次差分検出工程では、後述する２次差分検出工程で埋め込み位置情報を求める手がかりとなる仮情報（埋め込み行番号、埋め込みオペランド番号）を求めて、埋め込み位置情報の代わりに設定しておく。
【００５８】
以下、図９に示した命令ｉｉｎｃの例を参照しながら、１次差分検出工程におけるオペランド埋込情報の生成処理について説明する。
図１０は、命令ｉｉｎｃを例に、オペランド埋込情報が生成される際に参照される４パターンのテンプレート素片アセンブリコード１０２１〜１０２４、それらの生成時に使用されたテンプレート用マクロ定義の一部内容１０３１〜１０３４、そして、インタプリタ用Ｃソースコードのうちｉｉｎｃに対応するＣＡＳＥ節のＣソースコード１０１０を示している。
【００５９】
１次差分検出工程は、比較対象のテンプレート素片アセンブリコードのパターン、検出した差分から求める埋込情報の種類によって、さらに３つの工程に分かれる。
先ず、第１の工程として、差分検出部１０６は、マクロ定義でオペランド即値に「１」差を設けた２パターンのテンプレート素片アセンブリコード（図１０の例ではマクロ定義１０３１、１０３２、そして、テンプレート素片アセンブリコード１０２１、１０２２）を比較して、計算式情報のうちの倍率と仮情報（埋め込み行番号、埋め込みオペランド番号）とを求める。
【００６０】
差分検出部１０６によるテンプレート素片アセンブリコードの比較の凡その手順は以下の通りである。先ず、アセンブラ命令を示すキーワードを検出して、これを元にテンプレート素片アセンブリコードを行に分け、さらに、区切り記号（カッコ、カンマなど）を基に行を単語に分ける。そして、対応する位置にある単語同士を比較する。
【００６１】
テンプレート素片アセンブリコード１０２１、１０２２の場合、いずれもｍｏｖｌ行（１行目）とａｄｄｌ行（２行目）の２つの行から成り、ｍｏｖｌ行は両者が完全に一致する。これは、ｍｏｖｌ行ではバイトコード中のオペランドは使用されないことを意味する。一方、ａｄｄｌ行では、２つめの単語（“＄−７７”と“＄−７８”）と３つめの単語（“７７６”と“７７２”）とで差分が生じている。この結果から、ｉｉｎｃのオペランドが２つであり、両オペランドともアセンブリコードの２行目（ａｄｄｌ行）に埋め込まれることが分かる。
【００６２】
差分検出部１０６は、検出したオペランド数（「２」）に応じて、ｉｉｎｃ用オペランド埋込情報を格納する領域を確保する。そして、ｉｉｎｃを示す識別子（０ｘ８４）を識別情報部９１０に格納する。そして、２つのオペランド部９２０ａ、９２０ｂには、埋め込み行番号（両方とも「２」）、埋め込みオペランド番号（それぞれ「１」、「２」）を格納する。
【００６３】
次いで、差分検出部１０６は、２つのオペランド（オペランド番号が「１」であるオペランドの値「“＄−７７”と“＄−７８”（＄は数値であること示す記号）」、オペランド番号が「２」であるオペランドの値「“７７６”と“７７２”」）におけるオペランド値の差分から、それぞれの、計算式情報の一部（倍率）を求める。これら値は、計算式：「Ｘ×（マクロ定義のオペランド即値）＋Ｙ」の計算結果なので、マクロ定義における両者のオペランド即値の差が「１」であることを考えると、それぞれの差分は「Ｘ×１（＝Ｘ）」に相当する。よって、１つ目のオペランドに関する倍率は「７７６−７７２＝４」、２つ目のオペランドに関する倍率は「−７７−（−７８）＝１」となる。差分検出部１０６は、求めた倍率をオペランド埋込情報の２つのオペランド部に格納する（埋め込みオペランド番号「１」のオペランドには「１」、埋め込みオペランド番号「２」のオペランドには「４」）。
【００６４】
次に、第２の工程として、差分検出部１０６は、オペランド埋め込み情報のうち「オフセット」と「埋め込みサイズ」を求める。また、オペランドに関して符号の有無を示す情報を取得する。この工程で参照される２つのテンプレート素片データは、マクロ定義におけるオペランド即値の変数部分の比が１：２（ｎと２ｎ）となる組み合わせである。図１０の例では、テンプレート素片アセンブリコード１０２２、１０２３である（対応するマクロ定義はマクロ定義１０３２、１０３３）。
【００６５】
差分検出部１０６は、先ず、オフセットの値（バイトコードにおけるオペランドの位置、すなわち、マクロ定義の即値における変数ｎ）を求める。テンプレート素片アセンブリコード１０２２、１０２３それぞれにおけるオペランド即値は、それぞれ、式で表すと「（ｎ＋定数）×倍率＋加算値」、「（２ｎ＋定数）×倍率＋加算値」（「ｎ＋定数」、「２ｎ＋定数」はそれぞれマクロ定義１０３２、１０３３で設定された即値）となる。よって、両者の差分は「ｎ×倍率」となる。
【００６６】
そこで、テンプレート素片アセンブリコード１０２２、１０２３におけるオペランド即値の差分（「−７６−（−７８）＝２」、「７７６−７７２＝４」）を第１検出工程で算出した計算式の倍率（「１」、「４」）で割る。この結果、オペランド番号が「１」のオペランドについては、オフセットは「２」と算出され、オペランド番号が「２」のオペランドのオフセットは「１」となる。このオフセット値から、アセンブリコードにおけるオペランドの出現順序とバイトコードにおけるオペランドの出現順序が逆になっていることが分かる。
【００６７】
また、符号の有無については、ｉｉｎｃ命令の構文情報（コンパイル情報生成装置１０が予め保持しているもの）を参照して知る。すなわち、第１オペランド（オフセットが「１」のオペランド）は「符号なし」、第２オペランド（オフセットが「２」のオペランド）は「符号あり」。
差分検出部１０６は、こうして得た各オペランドに関するオフセット値及び符号の有無の情報を、オペランド埋込情報に設定する。また、各オペランドの「バイトコードにおける長さ」についてもｉｉｎｃ命令の構文情報から取得する。この情報は、第３の工程においてオペランドの埋め込みサイズ（機械語命令列におけるサイズ）を算出する際に使用される。
【００６８】
第３の工程で、差分検出部１０６は、マクロ定義で定数値のみのオペランド即値を設定した結果のテンプレート素片アセンブリコード１１２４、第１の工程で算出した計算式の倍率値、第２の工程で取得した「バイトコードにおけるオペランドの長さ」の情報を用いて、「計算式における加算値」及び「埋め込みサイズ」を検出する。
【００６９】
差分検出部１０６は、“倍率値×固定値＋加算値＝テンプレート素片アセンブリコードにおけるオペランド値”という式に、既に求めた倍率値、テンプレート素片アセンブリコード生成時のマクロ定義１０３４に設定されていた即値（固定値）、テンプレート素片アセンブリコード１０２４におけるオペランド値を代入して加算値を求める。
【００７０】
すなわち、“１×（−０ｘ５０）＋加算値＝−８０”、“４×０ｘｃ０＋加算値＝７６８”であるが、“０ｘ５０”、“０ｘｃ０”は１０進数でそれぞれ「８０」、「１９２」となるので、これらの式は“１×（−８０）＋加算値＝−８０”、“４×１９２＋加算値＝７６８”と書き変えられる。この式を解くと加算値はいずれも「０」となる。
【００７１】
ついで、差分検出部１０６は、完成した計算式とバイトコードにおけるオペランド長とを元に、埋め込みサイズ（機械語命令列におけるオペランドの長さ）を求める。差分検出部１０６は、埋め込みサイズを、バイトコードにおけるオペランド値の長さに、このオペランド値が計算式に代入されることで生じる桁上がり分の長さを加えた値として計算する。
【００７２】
１つめのオペランドは、「１倍して０を加えた値（＝そのままの値）」を機械語命令列に埋め込むので、桁上がりは発生せず、バイトコードにおけるオペランド長と等しい埋め込みサイズ（１バイト）とすればよい。また、もう一方のオペランドは、バイトコードにおけるオペランド長が１バイトであり、その値は計算式によって４倍されたうえで機械語命令列に埋め込まれる。４倍されるとは２進数で２ビット左シフト（２桁の桁上がり）が生じることを意味する。加算値は０なのでそれによる桁上がりはない。合計の桁上がりは２ビットなので、バイト長で言えば１バイトだけ埋め込み領域サイズを拡張すれば足りるので、第１オペランドの埋め込みサイズは１＋１＝２バイトとすればよい。
【００７３】
ただし、上記の算出方法で求めた埋め込みサイズは、必要最小限のサイズであって、実際のサイズはこの必要最小限より長めになっている場合もある。実際、ｉｉｎｃにおけるオペランド番号「２」のオペランドの場合、実行時には４バイトサイズのエリアに設定される。
符号なしのオペランドでは、実際より短めに算出した値に基づいてオペランド埋込を行っても、埋め込みエリアに初期値「０」を設定していれば問題は生じないが、符号付きオペランドの場合、Ｊａｖａコンパイラがオペランド埋込情報を元に短めにオペランド値を設定し、機械語命令実行装置が実際の長いエリアでオペランド値を参照すると、実行結果は不正になってしまう。そこで、埋め込みサイズについては、２次差分検出工程でテンプレート素片のオブジェクトを元にチェックを行う。その内容は後述する。
【００７４】
差分検出部１０６は、こうして求めた計算式の加算値、埋め込みサイズの値を追加してオペランド埋込情報を完成する。
差分検出部１０６は、上記のｉｉｎｃの例で示した処理を、全ての種類の命令のバイトコードについて行い、オペランド埋込情報を得る。その後、全オペランド埋込情報を記憶部１０７に格納する。
（アセンブル）
アセンブリ実行部１０４は、各テンプレート素片アセンブリコードをアセンブルし、テンプレート素片オブジェクトを得る。そして、当該テンプレート素片オブジェクトに対応するバイトコードの識別情報（オペコード）などの情報を付加してテンプレート素片データを生成する。そして、全テンプレート素片アセンブリコードに以上の処理を行うと、結果として得たテンプレート素片データを全てまとめて、機械語テンプレート５１３として保存する。また、インタプリタアセンブリコードをアセンブルして得たインタプリタオブジェクト５１２を記憶部１０７に保存する。
【００７５】
図１１はテンプレート素片データ１１００の構成を示す模式図である。各テンプレート素片データは、対応するバイトコードの命令の種類を示すオペコード値１１１０にアセンブルして得られたテンプレート素片オブジェクトコード（機械語命令列）１１５０を組み合わせたものであり、その他にも、ワイドプレフィクスの有無を示すプレフィクス情報１１２０、対応するバイトコードのサイズを示すバイトコードサイズ値１１３０、機械語命令列１１５０のサイズである機械語命令列サイズ値１１４０が含まれる。
【００７６】
機械語命令列サイズ１１４０については、アセンブル処理の結果得られた機械語命令列のサイズを設定する。オペコード値及びバイトコードサイズは、当該テンプレート素片が対応するバイトコードの文法に関する情報であり、予め決まっている。
（２次差分検出工程）
差分検出部１０６は、テンプレート素片アセンブリコードのオペランド部分に任意の数値を設定したうえで、これをアセンブル実行部１０４にアセンブルさせる処理を数回繰り返し、その結果得られる数種類のオブジェクトコードに表れるオペランド値の差分と、１次差分検出工程で生成したオペランド埋込情報の仮情報とを参照して、オペランド埋込情報のうち「埋込位置」の情報を得るとともに１次検出で求めた「埋め込みサイズ」を検証する。また、差分検出部１０６は、オペランド値を機械語命令列へ埋め込む際のルール（上位バイトから下位バイトへ、又はその逆）であるエンディアンを求める。エンディアンは実行環境ごとに決まり、全種類の命令のバイトコードに共通である。
【００７７】
先ず、差分検出部１０６は、エンディアン検出のために、テンプレート素片アセンブリコードの中から、符号付き４バイト数値オペランドを含むバイトコードに対応するテンプレート素片アセンブリコードを検出し、この数値オペランドに“０ｘｆ０ｅ０ｄ０ｃ０”という即値を設定した上で、アセンブル実行部１０４にアセンブルを行わせる。そして、アセンブルの結果得られるオブジェクトコードにおける数値オペランドの内容を取得する。その中での“０ｘｆ０”、“０ｘｅ０”、“０ｘｄ０”、“０ｘｃ０”の各バイトの並びがどうなっているかによってエンディアンを検出する。求めたエンディアンは各テンプレート素片データに設定しても良いし、機械語テンプレートのヘッダ部分に設定しても良い。以下の説明は「リトルエンディアン」であった場合の内容である。
【００７８】
「埋込位置」の検出のためには、テンプレート用アセンブリコードのターゲットとなるオペランドに、機械語命令列でオペランド部分の開始位置１バイトにのみ差分が生じるようなオペランド即値を設定する（以下の説明で用いる即値は１例であって、これに限定されない）。
図１２は、ｉｉｎｃを対象とした２次差分検出に用いる、３種類のオペランド即値が設定されたテンプレート用アセンブリコード１２０１〜１２０３と、それぞれをアセンブルして得られるオブジェクトコード（機械語命令列）１２１１〜１２１３とを示す。
【００７９】
テンプレート用アセンブリコード１２０１には、２つのオペランドの両方に「０」を設定する。
テンプレート用アセンブリコード１２０１には、２つのオペランドの両方に「０」を設定する。これをアセンブルして得られるオブジェクトコード１２１１では、オペランド部分は全て０ｘ００となる。
【００８０】
テンプレート用アセンブリコード１２０２には、２つのオペランドのうち１つ目に「１（＄１）」、もう一方には「０」を設定する。そして、結果のオブジェクトコード１２１２をオブジェクトコード１２１１と比較すると、１２バイト目が不一致であり、オブジェクトコード１２１２の１２バイト目には「０ｘ０１」という値が出現している。差分検出部１０６は、この結果から、１つ目のオペランド（オペランド番号＝１、オフセット＝２）の埋込位置を「１２バイト目」と算出する。
【００８１】
次いで、テンプレート用アセンブリコード１２０３には、２つのオペランドのうち１つ目に「０」、もう一方には「１」を設定する。そして、結果のオブジェクトコード１２１３をオブジェクトコード１２１１と比較すると、８バイト目が不一致であり、オブジェクトコード１２１３の８バイト目には「０ｘ０１」という値が出現している。差分検出部１０６は、この結果から、２つ目のオペランド（オペランド番号＝２、オフセット＝１）の埋込位置を「８バイト目」と算出する。
【００８２】
さらに、差分検出部１０６は、１次差分検出で求めた埋込サイズの検証を行う。ただし、対象は「符号あり」のオペランドに限る。ここでは、「オペランド番号＝１、オフセット＝２」のオペランドが対象となる。検証を行うのは、符号ありオペランドの場合、埋め込みサイズを誤って短く算出すると符号拡張の問題が発生するためである。
【００８３】
具体的には、差分検出部１０６は、テンプレート用アセンブリコード中の当該オペランドに負の値（例えば“−１”）を設定（テンプレート用アセンブリコード１２０２で、＄１を＄−１に置き換えた形に）したうえでアセンブル処理させ、オブジェクトコードに表れるオペランド値をチェックする。１次差分検出で求めた「１バイト」というサイズが正しければ、１２バイト目のみに「０ｘＦＦ」という値が表れるはずである。例えば１２バイト目を含む複数バイトに「０ｘＦＦＦＦ」といった値が表れれば、２バイトであるものを誤って１バイトと検出していたことになるので、その結果に応じて「埋込サイズ」を修正する。
【００８４】
また、差分検出部１０６は、コンパイル情報生成処理の後処理として、記憶部１０７に格納された機械語テンプレートに含まれる各テンプレート素片データの機械語命令列におけるオペランド埋め込み領域については、対応するオペランド埋込情報を参照しながらゼロクリアする。
（まとめ）
上記のような本コンパイル情報生成装置１０によって生成された機械語テンプレート及びオペランド埋込情報を、Ｊａｖａバイトコードの機械語命令列変換処理に用いた場合、従来のＪＩＴコンパイラのように中間コードが発生せず、メモリ消費量が小さい。
【００８５】
さらに、使用する機械語テンプレートは、実行環境で共に動作するインタプリタの内容をもとに生成したテンプレート用Ｃソースコードを当該インタプリタのＣソースコードと併せて単一ファイルとしてコンパイルした結果から生成されているので、実行環境においてインタプリタとハイブリッド構成で使用してもオペランド割り付けなどデータの扱いの不一致が発生せず、従来のＪＩＴコンパイラをハイブリッド方式で使用する場合のような切替時の整合性確保の処理が発生しない。その分ＣＰＵ負荷が軽くなり、ＣＰＵやメモリに制限のある実行環境でもハイブリッド方式による処理速度向上を実現できる。
【００８６】
また、本実施の形態のコンパイル情報生成装置が生成するテンプレートは、単にインタプリタの命令実行部（ｓｗｉｔｃｈ文のｃａｓｅ節）を切出しただけのものではなく、テンプレート用ソースコードを切出すに当たって、テンプレート用マクロ定義を用いてオペランドフェッチやプログラムカウンタ操作の処理を含まない形に最適化し、そのうえでインタプリタソースコードと単一ファイルにまとめてコンパイルしている。そのため、例えば、インタプリタの実行イメージのｃａｓｅ節をテンプレートに流用する方式に比べれば、使用メモリ量が少なく、実行性能も優っている。
【００８７】
また、本実施の形態のＪａｖａコンパイラが使用するテンプレート及びオペランド情報については、インタプリタを実行環境のＣＰＵに対応したコンパイラ（ＧＣＣ）でコンパイルした結果から生成することで、実行環境のＣＰＵ属性を反映した内容とされる。
そのため、ある実行環境用に使用していた本実施の形態ＪＩＴコンパイラを他の実行環境のＣＰＵに移植する場合、本実施の形態のコンパイル情報生成装置にパラメータとしてＣＰＵ属性を入力するだけで、移植先ＣＰＵに対応したテンプレート及びオペランド埋込情報が自動的に生成される。さらに、本ＪＩＴコンパイラのうちテンプレート及びオペランド埋込情報を参照してバイトコードを機械語に変換するプログラム部分の処理、及び、本コンパイル情報生成装置の処理は、ＣＰＵに依存しない汎用的なものなので、移植する際にも変更が不要である。よって、本実施の形態のＪＩＴコンパイラを他の実行環境に移植するのに要する作業は、移植先ＣＰＵの属性情報をコンパイル情報生成装置にパラメータとして入力し、その結果、自動的に得られるコンパイル情報（テンプレート及びオペランド埋込情報）を、移植前のＪＩＴコンパイラが使用していたものと置き換える、という作業のみとなる。
（備考）
なお、実行環境で使用されるＣＰＵの種類によっては、上で述べた実施の形態そのままでは対応できない場合があって、個別に対応が必要である。すなわち、ＣＰＵによっては機械語のオペランドとして３２ビットの即値を扱えないものがあり、（１）３２ビットのオペランド即値をバイト境界でない２つの値に分割する、あるいは、（２）オペランド即値をデータとして別領域に配列の形で再配置して、機械語にはこの配列を参照するためのデータを設定する、などの処理を行う。
【００８８】
そこで、（１）のタイプの場合、コンパイル情報生成装置は、パラメータとして分割の仕様（何ビットと何ビットに分割するか）に関する情報の入力を受け付ける。さらに、２次差分検出において、差分検出部は、複数パターンのテンプレート素片データ（機械語命令）における３２ビットオペランドを比較して差分を検出する際に、この分割仕様を考慮し、２つの値を１つのオペランド値として認識する。
【００８９】
また、（２）のタイプの場合、Ｊａｖａコンパイラのアドレス管理部が実行時に、間接参照される３２ビットオペランド用の配列領域を確保して、この領域に３２ビットオペランドの即値を格納する。そして、格納した領域のアドレスをオペランド埋込部に通知する。オペランド埋込部はこの通知されたアドレスを参照する内容の機械語命令列を生成する。
【００９０】
なお、１次差分検出、２次差分検出においてオペランドに設定された具体的な即値（図８、図１２）は例として示したものである。オペランド埋込情報の各項目の上記算出手順を適用できる値であれば、即値はこれらの例に限定されない。また、オペランドの差分からオペランド埋込情報を生成する方式についても、上記の説明は一例であり、異なる差分検出や参照の仕方も考えられる。例えば、オペランドの埋込サイズについては、エンディアンを逆にして「埋込位置」を２度検出すれば埋め込みエリアの両端位置が分かるので、そこからサイズを算出することができる。
【００９１】
【発明の効果】
以上の説明から明らかなように、本発明のＪａｖａコンパイラは、実行環境においてＪａｖａプログラムをバイトコード単位で機械語命令列に変換するＪａｖａコンパイラであって、各種バイトコードとその処理内容を記述した機械語命令列とを対応づけた機械語テンプレートを保持するテンプレート保持手段と、前記テンプレート保持手段が保持する機械語テンプレートを用いてバイトコードから機械語命令列を生成する機械語命令生成手段と、各種バイトコードに含まれるオペランド値について、機械語命令列への埋め込みの際の規則を示すオペランド埋込情報を保持する埋込情報保持手段と、前記埋込情報保持手段が保持するオペランド埋込情報が示す規則に従って、前記機械語命令生成手段によって生成された機械語命令列にオペランド値を埋め込むオペランド埋込手段と、を有し、前記テンプレート保持手段が保持する機械語テンプレートに含まれる機械語命令列は、バイトコード実行用のインタプリタのコンパイル及びアセンブルによって得られるオブジェクトコードから生成されたものであり、前記埋込情報保持手段が保持するオペランド埋込情報は、前記インタプリタのコンパイル及びアセンブルを前記インタプリタ中のオペランド部分に異なる即値を設定しながら繰り返し実行させることで得られた複数パターンのアセンブリコード及びオブジェクトコードに表れるオペランド値の差分を元に求められたものであること、を特徴とする。これによれば、中間コードの生成、最適化などの処理や中間コード保存用のメモリが不要なので、Ｊａｖａコンパイル実行時の使用メモリ量及びＣＰＵ負荷を小さくできる。また、他の実行環境に移植する場合は、テンプレート及びオペランド埋込情報を移植先環境に適用されるものに交換するだけでよいので、移植性にも優れているといえる。
【００９２】
また、前記Ｊａｖａコンパイラは前記実行環境で前記インタプリタと共存した状態で動作し、前記テンプレート保持手段が保持するテンプレートに含まれる機械語命令列は、前記インタプリタにおいてバイトコードの処理内容を記述した部分であるテンプレート用ソースコードを前記インタプリタのソースコードと共に単一ファイルとしてコンパイル及びアセンブルして得られるオブジェクトコードから生成されたものであること、という特徴を有する、とすれば、ハイブリッド方式を採用した環境においてインタプリタとの間で細かい単位の切り替えを行ってもＪａｖａプログラム実行を高速で行える、という効果が生じる。
【００９３】
また、上に述べたような効果は、同様のコンパイル手順からなるコンパイル方法、計算機を上記のコンパイラとして動作させるためのコンパイラプログラムによっても達成できる。また、上記の効果を達成するＪａｖａ（登録商標）コンパイラが使用するテンプレート及び埋込情報は、仮想マシンのコンパイル装置が使用する変換用のテンプレート及びオペランド埋込情報を生成するコンパイル情報生成装置であって、インタプリタのソースコードから、前記仮想マシンの実行単位である命令に対応する処理内容が記述された命令処理部分をテンプレート用ソースコードとして抽出する切り出し手段と、前記テンプレート用ソースコードをコンパイルして、前記命令に対応する処理内容を表すテンプレート用アセンブリコードを生成するアセンブリコード生成手段と、前記テンプレート用アセンブリコードをアセンブルして、前記命令に対応する処理内容を表すテンプレート用オブジェクトを生成するオブジェクト生成手段と、前記アセンブリコード生成手段によるコンパイル及び前記オブジェクト生成手段によるアセンブルを、前記テンプレート用ソースコードにおけるオペランド部分に異なる即値を設定しながら繰り返し実行させる繰り返し制御手段と、前記オブジェクト生成手段が生成したテンプレート用オブジェクトは、前記命令に対応する処理内容を機械語命令列で表したものであって、前記テンプレート用オブジェクトから、各命令を識別する識別情報と、前記各命令に対する機械語命令列とを対応づけたテンプレートを生成するテンプレート生成手段と、前記繰り返し制御手段の制御に従って前記アセンブリコード生成手段が前記命令毎に生成した複数のテンプレート用アセンブリコード、及び、前記繰り返し制御手段の制御に従って前記オブジェクト生成手段が前記命令毎に生成した複数のテンプレート用オブジェクト、に表れるオペランド値の差分を元に、前記仮想マシンの前記コンパイル装置がコンパイルする対象である命令に付随されたオペランド値を、前記命令に対する機械語命令列へ埋め込む際の規則を示すオペランド埋込情報を、前記命令毎に生成する埋込情報生成手段とを有すること、という特徴を有するコンパイル情報生成装置によって生成される。また、こうしたテンプレート及び埋込情報は、同様の生成手順からなるコンパイル情報生成方法、計算機を上記のコンパイル情報生成装置として動作させるためのコンパイル情報生成プログラムによっても生成できる。
【００９４】
また、前記アセンブリコード生成手段について、前記アセンブリコード生成手段は、前記テンプレート用ソースコードをコンパイルする際、ＣＰＵの属性を反映したソースコード用コンパイラを用いてコンパイルを行うこと、としてもよい。そうすれば、ある実行環境用に使用していたＪａｖａ（登録商標）コンパイラを他の実行環境に移植する場合、コンパイル情報生成装置にパラメータとして移植先ＣＰＵの属性情報を入力するだけで、移植先ＣＰＵに対応したテンプレート及びオペランド埋込情報が自動的に生成でき、移植に要する作業の負荷は非常に軽い。
【図面の簡単な説明】
【図１】本発明に関わるＪａｖａコンパイラの実施の形態における構成を、同ＪＩＴコンパイラ１が動作するＪａｖａプログラム実行環境において示す図である。
【図２】同実施の形態におけるバイトコード及び、その変換後の機械語命令列の一例を、対応するテンプレート素片データ及びオペランド埋込情報の内容と共に示す図である。
【図３】本発明に関わるＪａｖａコンパイル情報生成装置の本実施の形態における構成を示すブロック図である。
【図４】同実施の形態におけるコンパイル情報生成装置による生成処理の工程を示す図である。
【図５】同実施の形態におけるインタプリタの命令処理部Ｃソースコード及び、これから生成されるテンプレート用Ｃソースコードとインタプリタ命令処理部Ｃソースコードとの一部を示す図である。
【図６】同実施の形態におけるインタプリタ用マクロ定義及びテンプレート用マクロ定義の内容を示す図である。
【図７】同実施の形態における切り出し処理の具体例を示す図である。
【図８】同実施の形態においてテンプレート用マクロ定義に設定されるオペランド即値の例を表形式で示す図である。
【図９】同実施の形態におけるオペランド埋込情報の構成とその一例とを示す図である。
【図１０】本実施の形態においてオペランド埋込情報生成の際に参照される複数種類のテンプレート用アセンブリコード及び、それらの生成使用されたテンプレート用マクロ定義の内容を示す図である。
【図１１】同実施の形態におけるテンプレート素片データの構成を示す模式図である。
【図１２】本実施の形態においてオペランド埋込情報生成の際に参照される複数種類のテンプレート用アセンブリコード及び、それから生成されたオブジェクトコードの内容を示す図である。
【図１３】従来のＪＩＴコンパイラの構成とそのコンパイル処理の流れとを示す図である。
【符号の説明】
１  ＪＩＴコンパイラ
１１  アドレス管理部
１２  分離部
１３  機械語生成部
１４  オペランド埋込部
１５  アドレス変換テーブル
１６  テンプレート
１７  オペランド埋込情報
１０  コンパイル情報生成装置
１０１  前処理部
１０２  コンパイル管理部
１０３  分離処理部
１０４  アセンブル実行部
１０５  繰り返し制御部
１０６  差分検出部
１０７  記憶部
【図１】
0004163927.tif 000002
【図２】
0004163927.tif 000003
【図３】
0004163927.tif 000004
【図４】
0004163927.tif 000005
【図５】
0004163927.tif 000006
【図６】
0004163927.tif 000007
【図７】
0004163927.tif 000008
【図８】
0004163927.tif 000009
【図９】
0004163927.tif 000010
【図１０】
0004163927.tif 000011
【図１１】
0004163927.tif 000012
【図１２】
0004163927.tif 000013
【図１３】
0004163927.tif 000014