(57)【特許請求の範囲】
【請求項１】
システム・バス（２３）により結合されたプロセッサ（２１）とシステム・メモリ（２２）を備えるコンピュータ・システムにおいてインタプリト言語のプログラムを実行する方法であって、前記システム・メモリ（２２）には、前記プログラムを実行するためのランタイム環境（４０２）を提供する命令が格納されており、前記ランタイム環境は、
ｉ）スタック（４０６）、定数プール（４０７）及びメソッド（４０８）を含み、前記メソッドを実行するランタイム・システム（４０５）と、
ｉｉ）ランタイム・インタプリタ（４０３）と、
ｉｉｉ）ランタイム・コンパイラ（４０４）
を含み、
前記方法は、
前記ランタイム環境へエントリする前に、前記プロセッサが、前記インタプリト言語のソース・コード（４０９）をバイト・コードにコンパイルしてクラス・ファイル（４１１）を生成する第１のステップと、
前記ランタイム環境へエントリする前に、前記プロセッサが、前記バイト・コードの少なくともある部分を、ハードウェア特定言語コンパイラ（４１３）を用いて、実行可能な命令へコンパイルして実行可能ＤＬＬファイル（４１４）を生成する第２のステップと、
前記プロセッサが、前記ランタイム環境でプログラムを実行する際に、外部メソッドを呼び出す第３のステップと、
前記プロセッサが、前記外部メソッドが前記クラス・ファイルと前記ＤＬＬファイルのどちらにあるかを判定し、
ｉ）前記外部メソッドが前記クラス・ファイルにあった場合、前記クラス・ファイルを前記ランタイム・インタプリタ又は前記ランタイム・コンパイラの一方を用いることによってインタプリト又はコンパイルして、前記ランタイム・システムにおいて実行し、
ｉｉ）前記外部メソッドが前記ＤＬＬファイルにあった場合、前記ランタイム・システムを用いて、前記ＤＬＬファイルを実行する、第４のステップ
を含む方法。
【請求項２】
請求項１に記載された方法において、前記第２のステップは、
前記バイト・コードごとに一意のラベルを作成するステップと、
前記バイト・コードをデコードするステップと、
前記バイト・コードを、等価のコンパイル言語命令に変換するステップ
を含む方法。
【請求項３】
請求項２に記載された方法において、前記第２のステップは、更に、前記バイト・コードに対する未使用ラベルを削除することによって前記コンパイル言語命令で参照されるラベルのみを残すステップを含む方法。
【請求項４】
請求項２に記載された方法において、前記一意のラベルを作成するステップは、前記バイト・コードに対して一意の連番を作成するステップを含む方法。
【請求項５】
請求項４に記載された方法において、前記一意の連番は、前記バイト・コードを含むプログラムの開始値に対する、前記バイト・コードのオフセット値を備え、
前記等価のコンパイル言語命令に変換するステップでは、分岐命令内で指定された相対的オフセット値を、前記分岐命令のラベル内のオフセット値から減算することによって、目標バイト・コードのラベルが計算される、方法。
【請求項６】
システム・バス（２３）により結合されたプロセッサ（２１）及びシステム・メモリ（２２）を備え、インタプリト言語のプログラムを実行するコンピュータ・システムであって、前記システム・メモリ（２２）には、前記プログラムを実行するためのランタイム環境（４０２）を提供する命令が格納されており、前記ランタイム環境は、
ｉ）スタック（４０６）、定数プール（４０７）及びメソッド（４０８）を含み、前記メソッドを実行するランタイム・システム（４０５）と、
ｉｉ）ランタイム・インタプリタ（４０３）と、
ｉｉｉ）ランタイム・コンパイラ（４０４）
を含み、
前記プロセッサは、
前記ランタイム環境へエントリする前に、前記インタプリト言語のソース・コード（４０９）をバイト・コードにコンパイルしてクラス・ファイル（４１１）を生成し、
前記ランタイム環境へエントリする前に、前記バイト・コードの少なくともある部分を、ハードウェア特定言語コンパイラ（４１３）を用いて、実行可能な命令へコンパイルして実行可能ＤＬＬファイル（４１４）を生成し、
前記ランタイム環境でプログラムを実行する際に、外部メソッドを呼び出し、
前記外部メソッドが前記クラス・ファイルと前記ＤＬＬファイルのどちらにあるかを判定し、
ｉ）前記外部メソッドが前記クラス・ファイルにあった場合、前記クラス・ファイルを前記ランタイム・インタプリタ又は前記ランタイム・コンパイラの一方を用いることによってインタプリト又はコンパイルして、前記ランタイム・システムにおいて実行し、
ｉｉ）前記外部メソッドが前記ＤＬＬファイルにあった場合、前記ランタイム・システムを用いて、前記ＤＬＬファイルを実行する、
コンピュータ・システム。
【請求項７】
請求項６に記載されたコンピュータ・システムにおいて、前記プロセッサは、前記バイト・コードを前記実行可能な命令へコンパイルする際に、
前記バイト・コードごとに一意のラベルを作成し、
前記バイト・コードをデコードし、
前記バイト・コードを、等価のコンパイル言語命令に変換する、
コンピュータ・システム。
【請求項８】
請求項７に記載されたコンピュータ・システムにおいて、前記プロセッサは、前記バイト・コードを前記実行可能な命令へコンパイルする際に、更に、前記バイト・コードに対する未使用ラベルを削除することによって前記コンパイル言語命令で参照されるラベルのみを残す、コンピュータ・システム。
【請求項９】
請求項７に記載されたコンピュータ・システムにおいて、前記プロセッサは、前記一意のラベルを作成する際に、前記バイト・コードに対して一意の連番を作成する、コンピュータ・システム。
【請求項１０】
請求項９に記載されたコンピュータ・システムにおいて、前記一意の連番は、前記バイト・コードを含むプログラムの開始値に対する、前記バイト・コードのオフセット値を備え、
前記プロセッサは、前記バイト・コードを前記等価のコンパイル言語命令に変換する際に、分岐命令内で指定された相対的オフセット値を、前記分岐命令のラベル内のオフセット値から減算することによって、目標バイト・コードのラベルを計算する、
コンピュータ・システム。
【請求項１１】
請求項１ないし５のいずれか一項に記載された方法を前記コンピュータ・システムに実行させるためのコンピュータ実行可能命令を格納するコンピュータ読み取り可能な媒体。
【発明の詳細な説明】
【０００１】
（発明の分野）
本発明は、一般的に、インタプリティブ・ランタイム（ｉｎｔｅｒｐｒｅｔｉｖｅ  ｒｕｎｔｉｍｅ）環境に関し、更に特定すれば、インタプリティブ・ランタイム環境における実行のためのコンパイル言語のコード生成に関する。
【０００２】
（著作権に関する注意／許諾）
本特許文書の開示の一部は、著作権保護の対象となる資料を含む。著作権所有者は、特許商標庁の特許ファイルまたは記録に見られる、特許文書または特許開示のファクシミリ複製については、いずれの人によるものであっても異議を唱えないが、それ以外の場合、あらゆる著作権を保存することとする。以下の告示は、以下に記載するソフトウエア・およびデータ、ならびに図面にも適用される。著作権c1997, Microsoft Corporation, All Rights Reserved.
【０００３】
（発明の背景）
インタプリト言語（ｉｎｔｅｒｐｒｅｔｅｄ  ｌａｎｇｕａｇｅ）は、こん様々なハードウエア・プラットフォーム間で移植可能なコンピュータ・プログラムを作成するために、広く用いられている。同じインタプリト言語のプログラムは、異種のコンピュータ間で容易に移動することができ、インタプリテーション（ｉｎｔｅｒｐｒｅｔａｔｉｏｎ）を実行するランタイム環境のみを、基礎のハードウエアに合わせて構成すればよい。
【０００４】
このインタプリト言語の有効性は、その最大の欠点でもある。インタプリト言語で書かれたプログラムは、同じコンピュータ上でコンパイル言語で書かれた同じプログラムよりも、実行がはるかに遅い。この問題に対する以前の解決策は全て大きな欠点を含んでいる。
【０００５】
例えば、インタプリト言語の命令を、特定のハードウエアにネーティブな言語の同等の命令に変換するネーティブ・コード・コンパイラが実現されている。そして、このネーティブ・コード・プログラムを実行する。しかしながら、コンパイルしたネーティブ・コード・プログラムはインタプリト・ランタイム環境では実行しないので、ランタイム環境によって与えられるあらゆる機能がこのプログラムには使用できない。また、このようなプログラムは、インタプリト言語プログラムよりもかなり大きい場合が多く、最少構成コンピュータにおいてリソースの問題が生ずる。
【０００６】
別の手法として、インタプリト言語プログラム全体を、同じ機能を行なうコンパイル言語のプログラムに変換することがあげられる。このような処理は、実現するのが非常に複雑であり、コンパイル・コードが非効率的となることがわかった。
【０００７】
したがって、対応するランタイム環境の機能にアクセスすることができ、しかもインタプリト言語プログラムの処理能力を向上させ、システム・リソースを交流させるようにこれを行なう方法が求められている。
【０００８】
（発明の概要）
本発明は、前述の短所、欠点および問題に取り組むものであり、以下の明細書を読み、検討することによって理解されよう。
【０００９】
ランタイム環境外部で実行するインライン・コード生成部は、当該ランタイム環境のためのインタプリタのインナループ（ｉｎｎｅｒｌｏｏｐ）の処理を再生する。インライン・コード生成部は、インタプリト言語のプログラムを処理し、コンパイル言語の対応するプログラムを生成する。基礎のハードウエアに特定的な標準的コンパイラを用いて、コンパイル言語プログラムをネーティブ言語プログラムにコンパイルする。ネーティブ言語プログラムは、ランタイム環境のフレームワーク内で動作するので、ランタイム環境が備える関数およびルーチンは、ネーティブ言語プログラムにも使用可能である。
【００１０】
インライン・コード生成部は、インナループの処理時間をコード生成部にエクスポートすることによって、インタプリタ・コード・プログラムの実行に伴うオーバーヘッドを解消する。インライン・コード生成部は、既存のインタプリト言語プログラムを入力として受け入れるので、これらのプログラムによって得られる移植性の利点を保持しつつ、同時に、これらのプログラムを特定のコンパイラ上で走らせる場合、これらを最適化することができる。更に、得られるネーティブ言語プログラムはランタイム環境のフレームワーク内で動作するので、ランタイム環境が備える関数およびルーチンは、ネーティブ言語プログラムにも使用可能である。
【００１１】
本発明では、種々の範囲のシステム、クライアント、サーバ、メソッド、およびコンピュータ読み取り可能媒体について記載する。この概要に記載した本発明の態様および利点に加えて、本発明の更に別の態様および利点は、図面を参照し、以下に続く詳細な説明を読むことによって明白となろう。
（発明の詳細な説明）
以下の本発明の実施形態の一例に関する詳細な説明では、その一部をなす添付図面を参照する。図面には、本発明を実施可能な具体的な実施形態の例が、例示として示されている。これらの実施形態は、当業者が本発明を実施することができるように、十分に詳細に記載されており、更にその他の実施形態も利用可能であり、論理的、機械的、電気的およびその他の変更は本発明の精神や範囲を逸脱することなく可能であることは理解されよう。したがって、以下の説明は、限定的な意味で捕えるべきではなく、本発明は、添付した特許請求の範囲によってのみ規定されるものとする。
【００１２】
詳細な説明は５つの章に別れている。第１章では、本発明の実施形態を実現可能なハードウエアおよび動作環境について説明する。第２章では、本発明のシステム・レベルの概要を提示する。第３章では、本発明の実施形態の一例に対する方法を提供する。第４章では、本発明の特定的なＪａｖａ（登録商標）実施態様について説明する。最後に、第５章では、詳細な説明の結論を述べる。
（ハードウエアおよび動作環境）
図１は、本発明の実施形態を実現可能なハードウエアおよび動作環境の図である。図１の説明は、本発明を実現するのに適したコンピュータ・ハードウエアおよび計算機環境の端的な全体的説明を行なうことを意図している。必ずしもその必要はないが、本発明の説明は、パーソナル・コンピュータのようなコンピュータが実行する、プログラム・モジュールのような一般的なコンピュータ実行可能命令に関連して行なう。一般に、プログラム・モジュールは、ルーチン、プログラム、オブジェクト、コンポーネント、データ構造等を含み、特定のタスクを実行したり、あるいは特定の抽象的データ・タイプを実装する。
【００１３】
更に、本発明は、別のコンピュータ・システム構成でも実施可能であることを当業者は認めよう。別のコンピュータ・システム構成には、ハンド・ヘルド・デバイス、マルチプロセッサ・システム、マイクロプロセッサ系電子機器またはプログラマブル消費者電子機器、ネットワークＰＣ、ミニコンピュータ、メインフレーム・コンピュータ等が含まれる。また、本発明は、分散型計算機環境においても実施可能であり、この場合、通信ネットワークを通じてリンクされたリモート処理デバイスによってタスクを実行する。分散型計算機環境では、プログラム・モジュールは、ローカルおよびリモート・メモリ記憶装置双方に位置することができる。
【００１４】
図１の本発明を実現するハードウエアおよび動作環境の一例は、コンピュータ２０の形態の汎用計算機を含む。このコンピュータ２０は、演算装置２１、システム・メモリ２２、およびシステム・メモリ２２から演算装置２１までを含む種々のシステム・コンポーネントを結合するシステム・バス２３を含む。演算装置２１は、１つのみでもよく、あるいは１つよりも多い演算装置２１があってもよく、コンピュータ２０のプロセッサは、単一の中央演算装置（ＣＰＵ）、または一般に並列処理環境と呼ばれる、複数の演算装置を備えることができる。コンピュータ２０は、従来のコンピュータ、分散型コンピュータ、またはその他のいずれの形式のコンピュータでもよく、本発明はこれに限定されることはない。
【００１５】
システム・バス２３は、数種類のバス構造のいずれでもよく、メモリ・バスまたはメモリ・コントローラ、周辺バス、および種々のバス構造のいずれかを用いたローカル・バスが含まれる。システム・メモリは、単純にメモリと呼んでもよく、リード・オンリ・メモリ（ＲＯＭ）２４およびランダム・アクセス・メモリ（ＲＡＭ）２５を含む。基本入出力システム２６（ＢＩＯＳ）は、起動中のように、パーソナル・コンピュータ２０内のエレメント間におけるデータ転送を補助する基本的なルーティンを含み、ＲＡＭ２４内に格納されている。更に、パーソナル・コンピュータ２０は、図示しないハード・ディスクの読み書きを行なうハード・ディスク・ドライブ２７、リムーバブル磁気ディスク２９の読み書きを行なう磁気ディスク・ドライブ２８、ＣＤ  ＲＯＭまたはその他の光媒体のようなリムーバブル光ディスク３１の読み書きを行なう光ディスク・ドライブ３０も含む。
【００１６】
ハード・ディスク・ドライブ２７、磁気ディスク・ドライブ２８、および光ディスク・ドライブ３０は、それぞれ、ハード・ディスク・ドライブ・インターフェース３２、磁気ディスク・ドライブ・インターフェース３３、および光ドライブ・インターフェース３４を介して、システム・バス２３に接続されている。ドライブおよびそれに関連するコンピュータ読取可能媒体は、コンピュータ読取可能命令、データ構造、プログラム・モジュールおよびコンピュータ２０のその他のデータの不揮発性格納を行なう。磁気カセット、フラッシュ・メモリ・カード、ディジタル・ビデオ・ディスク、ベルヌーイ・カートリッジ、ランダム・アクセス・メモリ（ＲＡＭ）、リード・オンリ・メモリ（ＲＯＭ）等のように、コンピュータによるアクセスが可能なデータを格納することができる、別の形式のコンピュータ読取可能媒体も、動作環境例では使用可能であることは、当業者には認められよう。
【００１７】
ハード・ディスク、磁気ディスク２９、光ディスク３１、ＲＯＭ２４またはＲＡＭ２５上には、多数のプログラム・モジュールを格納可能であり、オペレーティング・システム３５、１つ以上のアプリケーション・プログラム３６、その他のプログラム・モジュール３７、およびプログラム・データ３８を含む。ユーザは、キーボード４０およびポインティング・デバイス４２のような入力デバイスによって、コマンドおよび情報をパーソナル・コンピュータ２０に入力することができる。他の入力デバイス（図示せず）は、マイクロフォン、ジョイスティック、ゲーム・パッド、衛星ディッシュ、スキャナ等を含むことができる。これらおよびその他の入力デバイスは、多くの場合、システム・バス２３に結合するシリアル・ポート・インターフェース４６のような周辺ハードウエア・デバイスを介して、演算装置２１に接続されるが、パラレル・ポート、ゲーム・ポートまたはユニバーサル・シリアル・バス（ＵＳＢ）のようなその他のインターフェースによって接続することも可能である。また、ビデオ・アダプタ４８のようなインターフェースを介して、モニタ４７またはその他の種類のディスプレイ装置もシステム・バス２３に接続されている。モニタに加えて、パーソナル・コンピュータは、通常、スピーカおよびプリンタのような、その他の周辺出力デバイス（図示せず）を含む。
【００１８】
コンピュータ２０は、リモート・コンピュータ４９のような１つ以上のリモート・コンピュータへの論理接続を用いれば、ネットワーク環境においても動作可能である。これらの論理接続は、コンピュータ２０に結合した通信デバイスまたはコンピュータ２０の一部によって行われ、本発明は、特定の形式の通信デバイスに限定されることはない。リモート・コンピュータ４９は、別のパーソナル・コンピュータ、サーバ、ルータ、ネットワークＰＣ、クライアント、ピア・デバイス、またはその他の共通ネットワーク・ノードとすることができ、典型的に、コンピュータ２０に関して先に述べたエレメントの多くまたは全てを含むが、図１にはメモリ記憶装置５０のみを図示している。図１に示す論理接続は、ローカル・エリア・ネットワーク（ＬＡＮ）５１およびワイド・エリア・ネットワーク（ＷＡＮ）５２を含む。このようなネットワーク環境は、会社全域に及ぶコンピュータ・ネットワーク、イントラネットおよびインターネットでは一般的である。
【００１９】
ＬＡＮネットワーク環境で用いる場合、コンピュータ２０は、ネットワーク・インターフェースまたはアダプタ５３を介してローカル・ネットワーク５１に接続する。ＷＡＮネットワーク環境で用いる場合、コンピュータ２０は、典型的に、モデム５４、またはインターネットのようなワイド・エリア・ネットワーク５２を通じて通信を確立するその他の形式の通信デバイスを含む。モデム５４は、内蔵でも外付けでもよく、シリアル・ポート・インターフェース４６を介してシステム・バス２３に接続する。ネットワーク環境では、パーソナル・コンピュータ２０に関して図示したプログラム・モジュールまたはその一部は、ローカルまたはリモートメモリ記憶装置に格納することができる。尚、図示のネットワーク接続は一例であり、コンピュータ間に通信リンクを確立する別の手段も使用可能であることは認められよう。
【００２０】
以上、本発明の実施形態を実現可能なハードウエアおよび動作環境について説明した。本発明を実現可能なコンピュータは、従来のコンピュータ、分散型コンピュータ、またはその他のいずれの形式のコンピュータとすることもでき、本発明はこれに限定されることはない。このようなコンピュータは、通常、１つ以上の演算装置をそのプロセッサとして含み、コンピュータ読み取り可能媒体をメモリとして含む。また、コンピュータは、ネットワーク・アダプタまたはモデムのような通信デバイスも含むことができるので、他のコンピュータと結合し通信することができる。
（システム・レベルの概要）
本発明の実施形態の一例の動作のシステム・レベルでの概要について、図２Ａないし図２Ｃを参照しながら説明する。
【００２１】
図２Ａは、図１のコンピュータ２０のようなコンピュータにおいて、ランタイム環境で実行する、汎用コンピュータ言語インタプリタ２００の論理ブロック図を示す。インタプリタ２００は、一般に「バイト・コード」と呼ばれるインタプリト言語の命令を、ランタイム環境にネーティブな言語の命令として実行させる。一般に、バイト・コードおよびインタプリト言語コードは、「ランナブル」コード（ｒｕｎｎａｂｌｅ  ｃｏｄｅ）と呼ばれる。何故なら、これらは、コンパイルする必要なく、コンピュータによって実行されるからである。同様に、機械言語コードのようなネーティブ言語コードも、ランナブル・コードである。
【００２２】
インタプリト言語で書いたプログラムをランタイム環境で走らせると、インタプリタ２００は、プログラムの各バイト・コードを読み取り、バイト・コード型に特定のルーチンに分岐する（論理ブロック２０１）。次いで、インタプリタは、バイト・コードが指定する動作を実行する、ネーティブ言語命令または命令セットを実行する。プログラム内のバイト・コード全てを走らせ終わるまで、このプロセスを繰り返す。
【００２３】
「ジャスト・イン・タイム」（ＪＩＴ）コンパイラ２１０と呼ばれる、異なる形式のインタプリタを図２Ｂに示す。各バイト・コードをインタプリトしその動作を直ちに実行する代わりに、ＪＩＴ２１０は、プログラム内のバイト・コード全てを、ネーティブ言語での同等の命令に変換する（論理ブロック２１１および２１２）。次いで、これらの命令をネーティブ言語プログラムに集合化し（論理ブロック２１３）、実行する（論理ブロック２１４）。論理ブロック２１１および２１２を纏めてＪＩＴコンパイラの「インナループ」と呼ぶ。
【００２４】
図２Ｃは、ランタイム環境２２１外部で実行するインライン・コード生成部２２０を示し、ＪＩＴコンパイラ２１０のインナループの処理を再生する。バイト・コード・プログラム２２２をインライン・コード生成部２２０に入力し、コンパイル言語２２３での対応するプログラムを生成する。次いで、コンパイラ２２４を用いて、コンパイル言語のプログラム２２３を、ネーティブ言語のプログラム２２５にコンパイルする。ネーティブ言語プログラム２２５をランタイム環境２２１によって実行すると、ＪＩＴコンパイラによって生成したように見える。ネーティブ言語プログラム２２５はランタイム環境２２１の実行フレームワーク内で動作するので、ランタイム環境２２１によって与えられる関数およびルーチンは、インライン・コード生成部２２０およびランタイム環境２２１の間にある破線の接続で示すように、ネーティブ言語プログラム２２５にも使用可能である。更に、コンパイラ２２４はコンピュータに特定しているので、生成したコードを最適化し、冗長な命令を除去し、ハードウエアに対して追加のコード最適化を行なうことができる。
【００２５】
例示の一実施形態では、インライン・コード生成部２２０は、Ｃのような上位コンパイル言語に対するソース・コード命令を出力し、コンパイラ２２４はその言語に特定的となる。
【００２６】
実施形態の別の一例では、インライン・コード生成部２２０は、コンパイラ中間言語の命令を出力する。コンパイラ中間言語は、言語特定コンパイラ・ロジックとハードウエア特定コンパイラ・ロジックとの間で通信を行なうために用いられる。インライン・コード生成部によって生成された中間言語命令は、適切なハードウエア特定コンパイラ・ロジック、即ち、コンパイラ２２４に渡され、ネーティブ言語のプログラムを生成する。
【００２７】
詳細な説明のこの章では、本発明の実施形態の一例の動作について、システム・レベルでの概要を説明した。インライン・コード生成部は、ランタイム環境外部のＪＩＴコンパイラのインナループを実現し、インタプリト・コード・プログラムの実行に伴うオーバーヘッドを解消する。インライン・コード生成部は、既存のインタプリト言語プログラムを入力として受け入れるので、これらのプログラムによって与えられる移植性の利点を確保しつつ、同時に、これらのプログラムを特定のコンピュータで走らせるときに、その実行を最適化する。更に、インライン・コード生成部は、ランタイム環境がエクスポートするあらゆる関数をも利用するコードを生成する。本発明は、インタプリト・インナループのいずれの特定的な実施形態にも限定されないが、明確化のために、ＪＩＴコンパイラ・インナループの上位機能について説明した。
【００２８】
（本発明の実施形態の一例の方法）
直前の章では、本発明の実施形態の一例の動作について、システム・レベルの概要を説明した。この章では、このような実施形態の一例を実行するコンピュータが処理する個々の方法について、一連のフローチャートを参照しながら、説明する。処理する方法は、コンピュータ実行可能命令で構成されたコンピュータ・プログラムから成る。フローチャートを参照しながらこれらの方法を説明することにより、当業者は、このような命令を含むこのようなプログラムを開発し、適当なコンピュータ（コンピュータ読み取り可能媒体からの命令を実行するコンピュータのプロセッサ）上で本方法を実行することが可能となる。
【００２９】
最初に図３を参照すると、コンピュータがインライン・コード生成部２２０を実行する際に行われる行為が示されている。ブロック３０１において開始し、プログラム中最初のバイト・コードが読み込まれる。以下で更に詳細に説明するが、バイト・コードに一意のラベルを生成する（ブロック３０２）。バイト・コード型を判定し（ブロック３０３）、このバイト・コードをそれと同等のコンパイル言語命令または命令セットに変換する（ブロック３０４）。インライン・コード生成部３００は、全てのバイト・コードを変換し終えるまで、プログラム内の各バイト・コードを処理し続ける（ブロック３０５）。当業者には直ちに理解されようが、ブロック３０４で生成する命令型は、インライン・コード生成部がコンパイル言語のソース・コードまたはコンパイラ中間コードのどちらを出力しているのかによって異なる。
【００３０】
殆どのバイト・コード・プログラムでは、ロジックが、シーケンス外のバイト・コードにジャンプする必要がある場合、分岐命令に対して目標バイト・コードのオフセットを指定する分岐命令を用いる。インライン・コード生成部３００は、バイト・コード毎にラベルを作成するので、ブロック３０４は、分岐命令内のオフセット値を、目標バイト・コードのラベルに変換する。一実施形態では、ブロック３０２で生成する各ラベルは、プログラムの先頭に対するそのオフセットを含む。インライン・コード生成部は、分岐命令内に指定されている相対的オフセットを、分岐命令のラベル内のオフセットから減算し、目標バイト・コードのラベルを計算する。全てのラベルを管理するアレイを用いる等、元のバイト・コードを同等の命令に対して生成したラベルと等価にする別の方法も、当業者には容易にわかるであろう。図３に破線で示す代替実施形態の一例では、コード生成部は、全てのバイト・コードを変換した後に、未使用ラベルを「削除」し（ブロック３０６）、最終的に生成した命令が参照するラベルのみを残す。
【００３１】
直前の章で説明したように、ブロック３０４で生成したコードは、ランタイム環境がエクスポートする、あらゆるグローバル変数および／または関数にアクセスすることができる。
【００３２】
本発明の実施形態の一例を実行するコンピュータによって実行する個々の方法について説明した。これらの方法について、ステップ３１０から３０６までの全てを含むフローチャートを参照しながら示した。
（Ｊａｖａ（登録商標）仮想機械実施態様）
詳細な説明のこの章では、Ｊａｖａ（登録商標）仮想機械（ＪＶＭ：Ｊａｖａ（登録商標）  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ）のＭｉｃｒｏｓｏｆｔ  Ｃｏｒｐｏｒａｔｉｏｎ（マイクロソフト社）の実施態様である、本発明の特定的な実施態様について説明する。
【００３３】
図４は、ＪＶＭ４０２に関連する本発明のインライン・コード生成部４０１の実施形態の一例を示す。ＪＶＭ４０２は、３つの主要構成要素から成る。即ち、Ｊａｖａ（登録商標）インタプリタ４０３、Ｊａｖａ（登録商標）  ＪＩＴコンパイラ４０４、およびランタイム・システム４０５である。ＪＶＭはスタック系システムであるので、ランタイム・システム４０２内において実行するプログラムが作成するオブジェクトは全て、スタック４０６に格納される。定数プール４０７がプログラムの変数を与える。スタック４０６および定数プール４０７双方は、ランタイム・システム４０５によって管理されている。また、ランタイム・システム４０２は、もはや使用しないオブジェクトの背景ガベージ・コレクションのような、特殊関数４０８も備えている。
【００３４】
Ｊａｖａ（登録商標）プログラマは、Ｊａｖａ（登録商標）ソース・コード（「Ｊａｖａ（登録商標）」ファイル）４０９内のオブジェクトに作用するオブジェクトおよびメソッドを作成し、Ｊａｖａ（登録商標）ファイル４０９をＪａｖａ（登録商標）コンパイラ４１０に渡す。Ｊａｖａ（登録商標）コンパイラ４１０は、Ｊａｖａ（登録商標）バイト・コード（「クラス」ファイル）４１１を生成する。インライン・コード生成部４０１を用いる場合、クラス・ファイル４１１、およびクラス・ファイル４１１が参照するメソッドを収容するあらゆるＪａｖａ（登録商標）クラス・ライブラリがコード生成部４０２に渡される。コンパイル言語コードが、コード生成部４０２によって発生され、ハードウエア特定コンパイラ４１３に渡され、実行可能ファイル（ＤＬＬ０４１４）を生成する。
【００３５】
ランタイム・システム４０５内で実行するプログラムによって外部メソッドが読み出された場合、ＪＶＭ４０２は、そのメソッドがバイト・コード・クラス・ファイルまたは実行可能ＤＬＬファイルのどちらにあるか判定を行なう。これについては、以下で更に詳細に説明する。メソッドがクラス・ファイルにある場合、ＪＶＭ４０２はそのクラス・ファイル４１１を、必要なクラス・ライブラリ４１２と共に、Ｊａｖａ（登録商標）インタプリタ４０３またはＪａｖａ（登録商標）  ＪＩＴコンパイラ４０４のいずれかに導出し、実行可能コードに変換する。次いで、実行可能コードは、実行のためにランタイム・システム４０５に導出される。一方、メソッドが、インライン・コード生成部４０１から生成されたＤＬＬファイルにある場合、ＪＶＭ４０２は単にＤＬＬファイル４１４をランタイム・システム４０５に導出し、実行する。
【００３６】
また、ＪＶＭ４０２は、あるランタイム・システム変数およびメソッドをコード生成部４０１にエクスポートし、ＤＬＬファイル４１４内の実行可能コードがＪＶＭ４０２の状態を取得し、操作できるようにする。
【００３７】
以下の表１は、Ｊａｖａ（登録商標）バイト・コードのサブセットに対してＪＩＴコンパイラ４０４のインナループが生成したＣ言語の命令を示す。このＣ言語の命令は、スタック４０６、定数プール４０７、メソッド４０８、およびＪＶＭ４０２がエクスポートした、ランタイム・システム４０５内のローカル変数に対するポインタを含む。インナループは次のようにコード化される。
【００３８】
【表１】
0004562918.tif 000002
一例として、以下のＪａｖａ（登録商標）バイト・コード・プログラムを用いると、
【００３９】
【表２】
0004562918.tif 000003
コード生成部４０１は、次のＣ言語プログラムを生成する。
【００４０】
【表３】
0004562918.tif 000004
実行可能コード４１４はＪＶＭ４０２の外側で作成されるので、ＪＶＭ４０２は、ランタイムにＪＩＴコンパイラ４０４のインナループ全体を通過する必要がなく、このためＪＩＴコンパイラ４０４を通過する同一のバイト・コード・プログラムに対して処理能力が大幅に向上する。 更に、定数ループ４０７は、コード生成部４０１によって具体的にコード化されるので、コンパイラ４１３は、性質上汎用的なコードを出力するＪＩＴコンパイラ４０４よりも、Ｃ言語プログラムのその部分に対して効率的なコードを生成する。コンパイラ４１３が最適化Ｃコンパイラである代替実施形態の一例では、バイト・コード同等命令の数が、最少のコンパイル命令セットに減少する。
【００４１】
Ｊａｖａ（登録商標）バイト・コードの中には、ＪＶＭ４０２にコール・バックしなければならないものもあるので、Ｃ言語命令のみで表すことはできない。結果的に生成されたコードを、INVOKESTATIC<index>バイト・コードとして、表１に示す。これは、別のＪａｖａ（登録商標）メソッドへのコールを実行する。生成されたコードは、最初にFindMethodをコールし、ＪＶＭ４０２によって露出されたメソッド（pMethod)に対するポインタを得なければならない。次いで、生成されたコードは、エクスポートされたメソッド、ExecuteStaticMethodをコールし、呼び出したメソッドを実行し、更にLookUpExceptionをコールし、実行によって生ずるあらゆる例外を処理しなければならない。代替実施形態の一例では、ExecuteStaticMethodおよびLookUpException双方に対する命令は、INVOKESTATICに対してＣ言語コードでインラインで生成される。
【００４２】
ＪＶＭ４０２の実施形態の一例では、２つのフラグ、即ち、各メソッド毎のネーティブ・メソッド・フラグ５０１およびＪＩＴフラグ５０２が、当該メソッドの「状態」を示す。フラグ５０１、５０２は、クラスの内部メモリ内表現に格納することができ、あるいはデータ・ファイル内に永続させることができる。フラグを収容するデータ構造の一例を図５に示す。ＪＶＭ４０２は、フラグ５０１、５０２を用いて、ランタイム・システム４０５内で呼び出されたメソッドをどのようにロードするか決定する。
【００４３】
いずれのフラグもセットされていない場合、ＪＶＭ４０２はそのメソッドに対するバイト・コードをロードし、インタプリタ４０３またはＪＩＴコンパイラ４０４のいずれかをコールして、コードを処理する。この場合は、Ｊａｖａ（登録商標）コールに対するＪａｖａ（登録商標）を表す。
【００４４】
ネーティブ・メソッド・フラグのみがセットされている場合、ＪＶＭ４０２は対応するＤＬＬをロードし、ＤＬＬ全体を探索して、呼び出したメソッドへのエントリ・ポイントを求め、ＪＮＩまたはＲＮＩのようなネーティブ・メソッド・インターフェースによって、このメソッドをコールする。この場合は、「インポート」コードへのコールとして処理される。
【００４５】
ＪＩＴフラグのみがセットされている場合、ＪＶＭ４０４は、メソッドが既に機械コードにコンパイルされていると認識し、対応するＤＬＬファイル内にあるメソッドのエントリ・ポイントに直接ジャンプし、適切なコードを実行する。本発明を用いて生成しコンパイルした実行可能コードは、このように処理される。
【００４６】
各メソッドの状態を維持するために使用可能な他のロケーションは、当業者には容易に明らかとなろう。例えば、代替実施形態の一例では、各メソッドの状態は、対応するクラス・ファイル自体の中に格納されている。別の代替実施形態の一例では、メソッドのエントリ・ポイントを指し示す秘密データ集合を維持する、J/Direct拡張子を用いる。
【００４７】
この章は、Ｊａｖａ（登録商標）バイト・コードをコンパイル言語の同等の命令に変換するインライン・コード生成部について記載した。コンパイル言語の命令は、次にコンパイラに渡され、コンパイラは実行可能な機械後コードを生成する。すると、実行可能コードは現Ｊａｖａ（登録商標）ランタイム・システムによって直接コールすることができ、これはインタプリト・バイト・コードのスタック動作の全てに従うので、既存のガベージ・コレクタおよびその他のランタイム機能が通常通りに動作する。実行可能コードは、関数コールが行われたときまたは例外が生じたときに、それが実行しているのは何の等価バイト・コードであるかというＪＶＭの情報を更新するだけでよい。このため、そして基本的なスタック動作はコンパイラによってレジスタを用いるために最適化することができるため、インライン・コード生成部は、インタプリタまたはＪＩＴコンパイラよりもはるかに、Ｊａｖａ（登録商標）バイト・コードの実行を高速化する。
（結論）
以上、インライン・コード生成部について説明した。ここでは、具体的な実施形態を示し説明したが、提示した具体的な実施形態の代わりに、同一目的を達成するために想起されるあらゆる構成が使用可能であることを当業者は認めよう。本願は、本発明のあらゆる適応化または変形も包含することを意図するものである。
【００４８】
例えば、全てのＪａｖａ（登録商標）仮想機械はスタックに基づくが、ＪＶＭの全てが先の章に記載した定数プールを有する訳ではないことを当業者は認めよう。「定数プール」という用語は、定数を保持する使用可能な変数のあらゆる集合に適用することができるので、定数プールと同等の構造は、クラス・ファイル内に実装し、ロード時にハッシュ・テーブルにデコードする変数ストアを含む。
【００４９】
更に、異なるランタイム環境は、異なるメソッド、即ち、例外処理、メソッドの呼び出し、および／またはメモリ割り当てをエクスポートし、これらは生成されたコードによって利用可能であることも、当業者は認めよう。したがって、インタプリタまたはＪＩＴコンパイラによって作成されたコードと同様に、生成されたコードは、ランタイム環境に特定的であり、インライン・コード生成部を実現するランタイム環境に固有の制限によってのみ限定される。
【００５０】
本願において用いた用語は、全てのランタイム環境、過去、現在そして未来のランタイム環境を含むことを意味する。したがって、本発明は、以下の特許請求の範囲およびその均等物によってのみ限定されることを意図するのは一目瞭然である。
【図面の簡単な説明】
【図１】  図１は、本発明の実施形態を実施可能なハードウエアおよび動作環境を示す図である。
【図２】  図２Ａは、本発明の実施形態の一例のシステム・レベルの概要を示す図であり、
図２Ｂは、本発明の実施形態の一例のシステム・レベルの概要を示す図であり、
図２Ｃは、本発明の実施形態の一例のシステム・レベルの概要を示す図である。
【図３】  図３は、本発明の実施形態の一例にしたがって、クライアントが実行する方法のフローチャートである。
【図４】  図４は、本発明のＪａｖａ（登録商標）による実施形態の一例を示すシステム・レベルの図である。
【図５】  図５は、本発明の実施形態の一例において用いる方法状態データ構造の図である。
【図１】
0004562918.tif 000005
【図２】
0004562918.tif 000006
0004562918.tif 000007
【図３】
0004562918.tif 000008
【図４】
0004562918.tif 000009
【図５】
0004562918.tif 000010