(57)【特許請求の範囲】
【請求項１】
オブジェクト指向型クラスのインスタンスを動的にコンパイルしかつインタプリタ的に実行することができる仮想マシンを動作させるためのコンピュータにより実現される方法であって、
コールを行うメソッドに対するコードを格納部内に格納するステップであって、該コールを行うメソッドに対する該コードはターゲットメソッドを呼出す命令を有しており、該命令はパラメータを有している、ステップと；
現在の状態から該ターゲットメソッドにより経験される新たな状態への状態変化に応答して、第一値から第二値へ該パラメータを修正するステップと；
を有し、
該状態変化は：
コンパイルされるかアンコンパイルされるかという、該ターゲットメソッドのコンパイルの変化；及び／又は、
該ターゲットメソッドのオーバーライド状態の変化、
を含み、
該ターゲットメソッドが仮想メソッドである場合に、
該方法は、
該コールを行うメソッドに対する該コードを該格納部内に格納するステップの前に、
該コールを行うメソッドに対する該コードを派生するために該コールを行うメソッドをコンパイルするステップと；
該ターゲットメソッドの該現在の状態が該ターゲットメソッドが少なくとも１つのオーバーライドメソッドによりオーバーライドされる第一状態であるか否かを決定するステップと；
該ターゲットメソッドの該現在の状態が該第一状態であることの決定に応答して、該パラメータを該命令が実行される場合に該ターゲットメソッド及び該少なくとも１つのオーバーライドメソッドのうちのどちら一方を呼出すべきかを決定する１組のコードに対する第一参照を有するようにセットするステップと；
を更に有し、
該１組のコードは該コールを行うメソッドの該コード内に挿入されているインラインコードである、
方法。
【請求項２】
請求項１記載の方法であって、該現在の状態がアンコンパイルされた状態であり、且つ該新たな状態が、該ターゲットメソッドが実行可能なコードにコンパイルされたコンパイルされた状態であり、且つ該パラメータの該第二値が該ターゲットメソッドの該実行可能なコードへの参照を有している方法。
【請求項３】
請求項１又は２に記載の方法であって、該現在の状態が、該ターゲットメソッドが実行可能なコードにコンパイルされているコンパイルされた状態であり、且つ該新たな状態がアンコンパイルされた状態であり、且つ該パラメータの該第二値が該ターゲットメソッドのアンコンパイルされたバージョンをインタプリタ的に実行させる１組のコードに対する参照を有している方法。
【請求項４】
請求項１ないし３のうちいずれか１項に記載の方法であって、更に、
該ターゲットメソッドにより経験される該状態変化の前に、該ターゲットメソッドと該ターゲットメソッドを呼出す該コールを行うメソッドのコードにおける命令との間の関連性を記録する方法。
【請求項５】
請求項４記載の方法であって、該パラメータを修正するステップは：
該状態変化に応答して修正されることが必要な特定の命令として該命令を識別するように、該ターゲットメソッドと該命令との間の該関連性を使用するステップ、
を含む方法。
【請求項６】
請求項５記載の方法であって、
該コールを行うメソッドがデコンパイルされ且つ該格納部から除去されたか否かを決定するステップと；
該コールを行うメソッドがデコンパイルされたことの決定に応答して、該ターゲットメソッドと該命令との間の該関連性を除去するステップと；
を更に有する方法。
【請求項７】
請求項１ないし６のうちいずれか１項に記載の方法であって、
該コールを行うメソッドに対する該コードを該格納部内に格納するステップの前に：
該コールを行うメソッドに対する該コードを派生するために該コールを行うメソッドをコンパイルするステップと；
該ターゲットメソッドの該現在の状態が、該ターゲットメソッドが実行可能なコードにコンパイルされているコンパイルされた状態であるか否かを決定するステップと；
該ターゲットメソッドの該現在の状態が該コンパイルされた状態であることの決定に応答して、該パラメータを該ターゲットメソッドの該実行可能なコードに対する参照を有するように設定するステップと；
を更に有する方法。
【請求項８】
請求項１ないし７のうちいずれか１項に記載の方法であって、
該コールを行うメソッドに対する該コードを該格納部内に格納するステップの前に：
該コールを行うメソッドに対する該コードを派生するために該コールを行うメソッドをコンパイルするステップと；
該ターゲットメソッドの該現在の状態がアンコンパイルされた状態であるか否かを決定するステップと；
該ターゲットメソッドの該現在の状態が該アンコンパイルされた状態であることの決定に応答して、該パラメータを、該ターゲットメソッドのアンコンパイルされたバージョンをインタプリタ的に実行させる１組のコードに対する参照を有するように設定するステップと；
を更に有する方法。
【請求項９】
請求項１ないし８のうちいずれか１項に記載の方法であって、
該ターゲットメソッドが仮想メソッドであり、
該現在の状態が、該ターゲットメソッドがいずれのオーバーライドメソッドによってもオーバーライドされることのない第二状態であり、且つ該新たな状態が該ターゲットメソッドが少なくとも１つのオーバーライドメソッドによりオーバーライドされる第一状態であり、かつ、
該パラメータの該第二値が仮想メソッドを呼出すための１組のコードに対する参照を有している、
方法。
【請求項１０】
請求項９記載の方法であって、
該ターゲットメソッドが該少なくとも１つのオーバーライドメソッドによりオーバーライドされる場合に第一情報を記録するステップと；
該ターゲットメソッドが該状態変化を経験したか否かを決定するために該第一情報を検査するステップと；
を更に有する方法。
【請求項１１】
請求項１０記載の方法であって、
該第一情報が該ターゲットメソッドと関連しているメソッドブロック内に格納されるオーバーライドフラッグであり、
該第一情報を記録するステップは、該少なくとも１つのオーバーライドメソッドが実行のためにロードされる場合に該オーバーライドフラッグをセットするステップを含む、
方法。
【請求項１２】
請求項１０記載の方法であって、
該第一情報が、該ターゲットメソッドと関連しているメソッドブロック内に格納されるオーバーライドカウントであり、
該第一情報を記録するステップは、該少なくとも１つのオーバーライドメソッドの各々が実行のためにロードされる場合に該オーバーライドカウントをインクリメントするステップを含む、
方法。
【請求項１３】
請求項１記載の方法であって、
該ターゲットメソッドが仮想メソッドである場合に、
該方法は、
該コールを行うメソッドに対する該コードを該格納部内に格納するステップの前に、
該ターゲットメソッドの該現在の状態が該ターゲットメソッドがいずれのオーバーライドメソッドによってもオーバーライドされることのない第二状態であるか否かを決定するステップと；
該ターゲットメソッドの該現在の状態が該第二状態であることの決定に応答して、
該第二状態において該ターゲットメソッドが実行可能なコードにコンパイルされている場合には、該パラメータを該ターゲットメソッドの該実行可能なコードに対する第一参照を有するようにセットするステップと；
該第二状態において該ターゲットメソッドが実行可能なコードにコンパイルされていない場合には、該パラメータを仮想メソッドを呼出すための１組のコードに対する第二参照を有するようにセットするステップと；
を更に有する方法。
【請求項１４】
請求項１ないし１３のうちいずれか１項に記載の方法であって、
該コールを行うメソッドが該ターゲットメソッドを呼び出す１つ又はそれ以上の命令を有する複数個のコールを行うメソッドのうちの特定のコールを行うメソッドであり、該１つ又はそれ以上の命令の各々が該パラメータを有しており、且つ該命令が該１つ又はそれ以上の命令のうちの特定の命令であり、
第一値から第二値へ該パラメータを修正するステップは、該１つ又はそれ以上の命令の各々における該パラメータを修正するステップを含む、
方法。
【請求項１５】
請求項１ないし１４のうちいずれか１項に記載の方法であって、該命令がブランチアンドリンクプロセッサ命令である方法。
【請求項１６】
請求項１ないし１５のうちいずれか１項に記載の方法であって、該コールを行うメソッドを実行するステップを更に有し、該コールを行うメソッドを実行するステップは、該パラメータの該第一値及び該パラメータの該第二値のうちのいずれか１つに基づいて該命令を実行するステップを含む方法。
【請求項１７】
請求項１ないし１６のうちいずれか１項に記載の方法であって、
該方法がオブジェクトメソッドをバイトコードから実行可能なコードへコンパイルするための動的適用型コンパイラを有する仮想マシンにおいて実現され、
該格納部が該仮想マシンに対して割当てられているメモリ内の領域であり、該メモリ内の領域が該動的適用型コンパイラによりコンパイルされた該オブジェクトメソッドを格納するよう構成された方法。
【請求項１８】
請求項１７記載の方法であって、該仮想マシンがＪＡＶＡ仮想マシンである方法。
【請求項１９】
コンピュータによって実行されると、１つ又は複数のプロセッサに、請求項１ないし１８のうちのいずれか１項記載の方法を実行させるための命令を備えたコンピュータ・プログラム。
【請求項２０】
請求項１９記載のコンピュータ・プログラムを備えたコンピュータ読み取り可能な記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はメソッドをコールする技術に関するものであって、更に詳細には、コンパイルされているコールを行うメソッドからターゲットメソッドを高速に呼出す技術に関するものである。
【背景技術】
【０００２】
このセクションに記載されるアプローチを追及することが可能なものであったが、必ずしも以前に着想されたか又は追及されたアプローチではない。従って、本明細書においてそうでないことが明示されない限り、このセクションに記載されるアプローチは本願における特許請求の範囲に対する従来技術ではなく且つこのセクションに包含されることにより従来技術であることを認めるものではない。
【０００３】
典型的なジャバ仮想マシン（ＪＶＭ）は、ジャバ（Ｊａｖａ（登録商標））アプリケーション又はその他のジャバをベースとしたコードを実行するためのインタプリタを包含している。ジャバクラスのインスタンスにおけるバイトコードとしてインプリメントされているジャバメソッドがインボーク（ｉｎｖｏｋｅ）即ち呼出されると、インタプリタは該メソッドへアクセスし且つインタプリタ的に該バイトコードを実行する。幾つかのＪＶＭは、更に、ジャバメソッドの実行を高速化するために動的適用型コンパイラを提供することが可能である。このようなＪＶＭが、特定のメソッドが頻繁に実行されることを検知する場合には、ＪＶＭは該メソッドをネイティブコードへコンパイルするために動的適用型コンパイラを使用する。ＪＶＭは該ネイティブコードをメモリ（例えば、コードキャッシュ）の１つの領域内に格納し、且つ次回に該メソッドが呼出される場合に、ＪＶＭは該メソッドのバイトコードをインタプリタ的に実行するためにインタプリタを使用する代わりにメモリ内において見つかったネイティブコードを実行する。その割当てられたメモリを効率的に利用するために、このようなＪＶＭは、典型的に、最早頻繁に使用されることのないコンパイルされたメソッドに対するネイティブコードをメモリから除去する。メモリからコンパイルされたメソッドに対する実行可能なコードを除去するプロセスは、本明細書においては、デコンパイルと呼称する。
【０００４】
典型的なメソッドは、多数のその他のメソッドに対する又は自分自身に対する（例えば、反復的コール）呼出し即ちコール（ｃａｌｌ）を包含している場合がある。別のメソッドを呼出す１つのメソッドはコーリングメソッド（ｃａｌｌｉｎｇ  ｍｅｔｈｏｄ）、即ち「コールを行うメソッド」と呼称する。別のメソッドにより呼出されている１つのメソッドは、本明細書においては、ターゲットメソッドと呼称する。典型的なＪＶＭにおいて、コンパイルされているメソッドからのメソッド呼出しは必要以上に遅いものであり、何故ならば、ターゲットメソッドの正しいランタイムアドレスはコンパイル時においてコールを行う方法によって知られていないからである。例えば、ＪＶＭがターゲットメソッドに対するコールを包含するコールを行うメソッドをコンパイルすることを決定するものと仮定する。コンパイル時において、ＪＶＭは確実性を持ってターゲットメソッドのランタイムアドレスを知得しているものではない。何故ならば、（１）ターゲットメソッド（例えば、コンパイルされているか又はコンパイルされていない）のコンパイル状態がコールを行うメソッドがコンパイルされた後に変化する場合があるか、又は（２）ターゲットメソッドが、コールを行うメソッドがコンパイルされた後に、別のメソッドによりオーバーライドされる場合のある仮想メソッドである場合があるからである。この不確実性のために、ＪＶＭは、ターゲットメソッドが呼出されるランタイムにおいてのみターゲットメソッドの正しいアドレスを決定することが可能であり、従って、コールを行うメソッドをコンパイルし且つその実行可能なコードをメモリ内に格納した後に、メモリ内に格納されているターゲットメソッドのメソッドブロックにおいてルックアップを実施することにより、コールを行うメソッドが実際にターゲットメソッドを呼出す度にターゲットメソッドのアドレスを決定せねばならない。（ロードされたメソッドのメソッドブロックは、典型的に、該メソッドのタイプを表示し且つ該メソッドに関するその他のランタイム情報を格納する。）
ターゲットメソッドを呼出すこのアプローチは、パイプライン型アーキテクチャを有するコンピュータプロセッサに関し著しい低速化を発生する場合がある。このようなプロセッサにおいては、該プロセッサがデコードし、実行し、又は前の命令からの結果を書込んでいる間に、その後の命令をルックフォワードし且つプリフェッチするためにパイプラインが使用される。このように、パイプライン型プロセッサは幾つかの命令を並列的に処理し且つ実行している場合があり、例えば、第一命令の結果がメモリへ又はレジスタへ書込まれている間に、該プロセッサが第二命令を実行し、第三命令をデコードし、且つ第四命令をフェッチする。ターゲットメソッドを呼出す上のアプローチにおいて、コールを行うメソッドがコンパイルされる時におけるターゲットメソッドのアドレスの不確実性は、プロセッサをしてコールを行うメソッドの実行期間中に誤った命令をプリフェッチさせる場合があり、そのことは該プロセッサをしてそのパイプラインをフラッシュさせることとなる。然しながら、プロセッサパイプラインをフラッシュさせることはプロセッササイクルを浪費させ且つ実行の低速化を発生させる。
【０００５】
例えば、ターゲットメソッドを呼出すコールを行うメソッドのコードをコンパイルしている場合に、間接参照を使用することが必要である。何故ならば、そのターゲットメソッドが、ターゲットメソッドがコールされる時にコンパイルされるか否かが知られていないからである。幾つかのプロセッサアーキテクチャにおいては、間接参照を介してターゲットメソッドを呼出すためにコールを行うメソッドのコンパイルされたコードにおいて以下の１組の命令を使用する場合がある。
【０００６】
【表１】
0005845221.tif 000002
【０００７】
上の命令のうちの最初のもの（「ｍｏｖ  ｌｒ，ｃｐ」）は、ターゲットメソッドが実行を終了した後に実行が継続する戻りアドレスとしてプログラムカウンタ「ｐｃ」の値を格納する。例えば、ＡＲＭプロセッサアーキテクチャ上で、プログラムカウンタ「ｐｃ」は現在の命令＋８のアドレスを包含している場合がある。第二命令（「ｌｄｒ  ｐｃ，［ａ０］」）はメモリ内のターゲットメソッドのメソッドブロックの第一ワードからターゲットメソッドの現在のアドレスをプログラムカウンタ内にロードする。実行時に該ターゲットメソッドがコンパイルされると、ターゲットメソッド（ターゲットメソッドのメソッドブロックの第一ワード内に格納されているように）の現在のアドレスはコードキャッシュ内のターゲットメソッドのアドレスであり、ターゲットメソッドがコンパイルされていない場合には、ターゲットメソッドの現在のアドレスは実行をインタプリタへリダイレクトさせる何等かのヘルパーグルーコード（ｈｅｌｐｅｒ  ｇｌｕｅ  ｃｏｄｅ）のアドレスである。ターゲットメソッドを呼出すための上の１組の命令は、パイプラインを具備するプロセッサ上ではその動作が劣ったものとなる。何故ならば、プロセッサは、間接参照を行うためにターゲットメソッドの現在のアドレスをルックアヘッドし且つ決定することができないからである。このことは、ターゲットメソッドが呼出される度に完全なプロセッサパイプラインのフラッシュを発生させる場合があり、且つ浪費されるプロセッササイクルの数はパイプライの深さに等しいものである場合がある。
【０００８】
プロセッサパイプラインフラッシュの機会を減少させるために、ターゲットメソッド呼出しに対する過去のアプローチは既にコンパイルされているターゲットメソッドに対する直接的なメソッドコールを行うことに依存していた。然しながら、コンパイルされているターゲットメソッドがコンパイルされている状態からコンパイルされていない状態へ状態を変化させる場合に問題が発生する。何故ならば、ターゲットメソッドがデコンパイルされた後に、このターゲットメソッドを呼出すコールを行うメソッドにおける直接的なコールは最早正しいアドレスを指し示すものではないからである。この問題を解決するために、過去のアプローチは、典型的に、コンパイルされているコールを行うメソッドの強制的デコンパイルに依存していた。強制的デコンパイルは、ターゲットメソッドの状態が変化する場合には（例えば、ターゲットメソッドがオーバーライドされるか又はデコンパイルされる場合には）、そのターゲットメソッドを直接的に呼出すための命令を包含する全てのコンパイルされているメソッドをデコンパイルさせるものである。
【０００９】
然しながら、強制的デコンパイルは幾つかの顕著な欠点を有している。１つの欠点は、特に現在実行中であるメソッドに対して、強制的デコンパイルをインプリメントすることは困難である。強制的デコンパイルの別の欠点は、メモリ及び使用中のプロセッササイクルの観点において非常にコスト高であることである。メソッドがデコンパイルされると、このメソッドを呼出す他の全てのコンパイルされているメソッドは必然的にデコンパイルされねばならない。従って、単一のターゲットメソッドの状態変化がかなりの数のコンパイルされているメソッドの一連のデコンパイルを発生させる場合がある。更に、頻繁に呼出されるデコンパイルされたメソッドは究極的にリコンパイルされねばならず、そのことはメモリ及びプロセッササイクル等の資源を付加的に使用することとなる。
【発明の概要】
【発明が解決しようとする課題】
【００１０】
本発明は、以上の点に鑑みなされたものであって、上述した如き従来技術の欠点を解消し、改良したメソッドをコールする技術を提供することを目的とする。特に、本発明は、プロセッサのパイプラインをフラッシュさせることがなく、且つ強制的デコンパイルの欠点を回避することが可能な技術を提供するものである。
【課題を解決するための手段】
【００１１】
メソッドのより速い呼出しを可能とするために、本発明の１つの実施例は、ターゲットメソッドを呼出すコンパイルされているコールを行うメソッドの実行可能なコードにおける命令のパラメータを修正する技術を提供する。ターゲットメソッドを呼出す命令のパラメータは、任意の与えられた時間におけるターゲットメソッドの現在の状態を反映するために維持されている。該パラメータは、例えば、その命令と関連しているオプコード（ｏｐｃｏｄｅ）、その命令と関連しているオペランド、及び１個のオプコードと１個又はそれ以上のオペランドとの組合わせ等のその命令と関連する任意のデータとすることが可能である。ターゲットメソッドの状態変化に応答して、コンパイルされているコールを行うメソッドにおける命令のパラメータはターゲットメソッドの現在の状態を反映するために修正される。従って、本明細書において記載する技術は、従来のアプローチよりも一層高速である。何故ならば、コールを行うメソッドをデコンパイルすることは必要ではなく且つターゲットメソッドのメソッドブロックにおける付加的なメモリルックアップを行うことはないからである。
【００１２】
本明細書に記載する技術に従って、コンパイルされているコールを行うメソッドはターゲットメソッドを呼出すための命令を包含している。そのターゲットメソッドが仮想メソッドであるか、又は非仮想又は静的メソッドであるかに基づいて、ターゲットメソッドに対して６個の可能な状態が存在している。
【００１３】
（１）非仮想／静的：コンパイルされている
（２）非仮想／静的：コンパイルされていない
（３）仮想：オーバーライドされており且つコンパイルされている
（４）仮想：オーバーライドされており且つコンパイルされていない
（５）仮想：オーバーライドされておらず且つコンパイルされている
（６）仮想：オーバーライドされておらず且つコンパイルされていない
該命令と関連しているパラメータは、その現在の状態におけるターゲットメソッドの実行を容易化するために常に正しいアドレスを反映する。ターゲットメソッドが状態（１）又は（５）にある場合には、該パラメータは、そのターゲットメソッドの実行が開始するコードキャッシュ内のアドレスを表わす。ターゲットメソッドが状態（２）にある場合には、該パラメータはターゲットメソッドのアンコンパイルされているバージョンをしてインタプリタにより実行させる１組のコードを参照する。ターゲットメソッドが状態（３），（４）又は（６）にある場合には、該パラメータは仮想メソッドを呼出すための１組のコードを参照する。
【００１４】
１実施例においては、本明細書に記載する高速のパッチベースメソッド呼出し用の技術は、コールを行うメソッドの実行可能なコードから非仮想及び静的ターゲットメソッドの両方に対するコールをパッチング（ｐａｔｃｈｉｎｇ）させる。この実施例においては、パラメータを有する直接的ブランチアンドリンク（ｂｒａｎｃｈ−ａｎｄ−ｌｉｎｋ）命令がターゲットメソッドを呼出すためにコールを行うメソッドの実行可能なコード内にコンパイルされる。ターゲットメソッドが現在コンパイルされており且つコードキャッシュ内に格納されている場合には、該ブランチアンドリンク命令パラメータは、ターゲットメソッドの実行が開始するコードキャッシュにおけるアドレスを表わす。ターゲットメソッドがデコンパイルされ且つコードキャッシュから除去されることに応答して、該ブランチアンドリンク命令パラメータの値は、ターゲットメソッドのアンコンパイルされたバージョンをしてインタプリタにより実行させる１組のコードを参照するために修正される。
１実施例においては、本明細書に記載する高速のパッチベースメソッド呼出し用の技術は、又、コールを行うメソッドの実行可能なコードから仮想ターゲットメソッドに対してコールをパッチングさせる。この実施例においては、直接的ブランチアンドリンク命令がコールを行うメソッドの実行可能なコードにおいて使用されて仮想ターゲットメソッドを呼出す。本明細書に記載する該技術に従って、仮想ターゲットメソッドを呼出す直接的ブランチアンドリンク命令は、ターゲットメソッドがそのコンパイル状態（例えば、コンパイルされているか又はアンコンパイルされている）又はそのオーバーライド状態（例えば、オーバーライドされているか又はオーバーライドされていない）のうちの少なくとも１つ又はそれ以上における変化を経験する場合にパッチさせることが可能である。直接的ブランチアンドリンク命令は、該命令のパラメータを修正することによりパッチ（ｐａｔｃｈ）させることが可能であり、そのパラメータは仮想ターゲットメソッドの現在の状態を反映する態様でセットされ且つ修正される。ターゲットメソッドが少なくとも１つのその他のメソッドにより現在オーバーライドされている場合には、該パラメータの値は仮想メソッドを呼出すことが可能な１組のコードを参照するためにセットされる。仮想メソッドを呼出す１組のコードは、実行されると、実行されるべきターゲットメソッド（例えば、オリジナルのターゲットメソッド又はオーバーライドメソッド）の識別を決定し且つその識別されたメソッドの実行を容易化させる。例えば、直接的ブランチアンドリンク命令が実行される場合にその識別されたターゲットメソッドがデコンパイルされる場合には、仮想メソッドを呼出す該１組のコードは、実行される場合に、ターゲットメソッドをしてインタプリタにより実行させる。その識別されたターゲットメソッドがコンパイルされ且つコードキャッシュ内に格納されると、仮想メソッドを呼出す該１組のコードは、実行される場合に、実行をコードキャッシュ内のターゲットメソッドの実行可能なコードの始めへ転送させる。仮想ターゲットメソッドがその他のメソッドにより現在オーバーライドされておらず且つ現在コンパイルされており且つコードキャッシュ内に格納されている場合には、該パラメータの値はコードキャッシュ内のターゲットメソッドの実行可能なコードの始めを表わす。仮想ターゲットメソッドがそのコンパイル状態及び／又はそのオーバーライド状態のいずれかにおける状態変化を経験することに応答して、直接的ブランチアンドリンク命令は、上述した如くターゲットメソッドの現在の状態を反映させるためにそのパラメータの値を修正することによりパッチさせることが可能である。
【図面の簡単な説明】
【００１５】
【図１】本発明の１実施例をインプリメントすることが可能なシステムの機能的ブロック図。
【図２Ａ】ターゲットメソッドがコンパイルされている状態に対する変化を経験した場合の１実施例に基づくコードキャッシュを例示したブロック図。
【図２Ｂ】ターゲットメソッドがアンコンパイルされている状態に対する変化を経験した場合の１実施例に基づくコードキャッシュを例示したブロック図。
【図３】ターゲットメソッドがオーバーライドされておらず且つコンパイルされていない仮想メソッドである場合の１実施例に基づくコードキャッシュを例示したブロック図。
【図４Ａ】１実施例に基づいて静的又は非仮想ターゲットメソッドへのコールを包含するコールを行うメソッドのコンパイルを例示したフローチャート。
【図４Ｂ】１実施例に基づいて非仮想又は静的ターゲットメソッドへのコールを行うメソッドのコールをパッチする状態を例示したフローチャート。
【図４Ｃ】１実施例に基づいて仮想ターゲットメソッドに対するコールを包含するコールを行うメソッドのコンパイルを例示したフローチャート。
【図４Ｄ】１実施例に基づいて仮想ターゲットメソッドへのコールを行うメソッドのコールのパッチを行う状態を例示したフローチャート。
【図５】本発明の１実施例をインプリメントすることが可能な汎用コンピュータシステムを示したブロック図。
【発明を実施するための形態】
【００１６】
概観
本明細書に記載する高速のパッチベース（ｐａｔｃｈ−ｂａｓｅｄ）メソッド呼出し（ｍｅｔｈｏｄ  ｉｎｖｏｃａｔｉｏｎ）用の技術は、間接参照の代わりにコンパイルされているコールを行うメソッドからの直接的なメソッドコール（ｍｅｔｈｏｄ  ｃａｌｌ）を利用する。異なるプロセッサアーキテクチャは、これらに制限されるものではないが、ブランチアンドリンク命令、ジャンプ命令、及びジャンプアンドリンク命令を包含する直接的なコールを容易化させるために使用することが可能な異なる命令又はタイプの命令を与える場合がある。従って、コンパイルされているコールを行うメソッドからの直接的なメソッドコールを容易化させるために以下に記載する命令は、制限的な意味ではなく例示的なものとして理解されるべきである。
【００１７】
幾つかの実施例において、直接的ブランチアンドリンク命令は、ターゲットメソッドを呼出すためにコールを行うメソッドのコンパイルされているコードにおいて使用される。本明細書において使用されるように直接的ブランチアンドリンク命令とは、通常、プロセッサによって実行される場合に、その命令により特定されるパラメータに基づいて実行を直接的に分岐させる命令のことを意味している。特定のプロセッサアーキテクチャに依存して、直接的ブランチアンドリンク命令において特定されるパラメータは、例えば、ラベル、命令ポインタ、レジスタ、及びプログラムスタック上のアドレス等のいずれかの参照とすることが可能である。幾つかの実施例において、このような命令と関連するパラメータは、該命令と関連するオプコード、該命令と関連するオペランド、又は１個のオプコードと１個又はそれ以上のオペランドとの組合わせとすることが可能である。本明細書に記載する技術に従って、直接的ブランチアンドリンク命令において特定されるパラメータは、ターゲットメソッドの実行を容易化させるための正しいアドレスを表わすために維持される。例えば、ターゲットメソッドがコンパイルされると、そのパラメータはコードキャッシュ内のターゲットメソッドの開始アドレスを表わし、ターゲットメソッドがコンパイルされていない場合には、そのパラメータはターゲットメソッドのアンコンパイルされているバージョンをしてインタプリタ的に実行させる１組のコードのアドレスを表わし、ターゲットメソッドが別のメソッドによりオーバーライドされている場合には、該パラメータは直接的ブランチアンドリンク命令が実行された後にどのメソッドを呼出すべきかを決定する１組のコードのアドレスを表わす。ターゲットメソッドが状態変化を経験する場合に（例えば、ターゲットメソッドがデコンパイルされる場合、又はターゲットメソッドの状態がいずれかその他のメソッドによりオーバーライドされていない状態から別のメソッドによりオーバーライドされている状態へ変化する場合）、コールを行うメソッドのコンパイルされているコードにおける直接的ブランチアンドリンク命令は、その現在の状態においてターゲットメソッドの実行を容易化するために正しいアドレスを表わすために該パラメータを修正することによりパッチされる。このように、コールを行うメソッドは、ターゲットメソッドが状態を変化させる場合にデコンパイルされることはない。同時に、ターゲットメソッドの実行を実際に容易化させる直接的ブランチアンドリンク命令は、正しいその後の命令を表わし、そのことは該ブランチアンドリンク命令が実行されるずっと前にプロセッサがそのパイプライン内のこれらのその後の命令をプリフェッチすることを可能とする。従って、本明細書に記載する高速のパッチベースメソッド呼出し用の技術は従来のアプローチよりも一層高速である。何故ならば、コールを行うメソッドはデコンパイルされることは必要ではなく、且つターゲットメソッドのメソッドブロックにおける付加的なメモリルックアップは実施されないからである。
【００１８】
図１は本明細書に記載する高速のパッチベースメソッド呼出し用の技術の１実施例をインプリメントすることが可能なシステムの機能的ブロック図である。例示的な目的のために、ＪＶＭを参照して１つの実施例について説明する。然しながら、理解すべきことであるが、本明細書に記載する高速のパッチベースメソッド呼出し用の技術はＪＶＭにおいてのみインプリメントされることに制限されるものではない。そうではなく、本明細書において教示する概念及び技術は、オブジェクト指向型クラスのインスタンスを動的にコンパイルし且つインタプリタ的に実行することが可能な任意のプロセス又は仮想マシンに対して適用することが可能である。
【００１９】
図１を参照すると、システム１００はオペレーティングシステム１０２の上で実行を行うＪＶＭ１０４を有している。オペレーティングシステム１０２は、これらに制限されるものではないが、ユニックス（Ｕｎｉｘ（登録商標））オペレーティングシステム（例えば、サンマイクロシステムズインコーポレイテッドにより開発されたソラリス（Ｓｏｌａｒｉｓ（登録商標））ＯＳ）、リナックス（Ｌｉｎｕｘ（登録商標））オペレーティングシステム（例えば、デビアン（Ｄｅｂｉａｎ（登録商標）））、及びウインドウズ（Ｗｉｎｄｏｗｓ（登録商標））オペレーティングシステム（例えば、マイクロソフトコーポレイションにより開発されたウインドウズＸＰ）を包含する任意のタイプのオペレーティングシステムとすることが可能である。オペレーティングシステム１０２はシステム１００内のその他のコンポーネントに依存する低レベル機能性を提供する。
【００２０】
ＪＶＭ１０４はインタプリタ１０６、動的適応型コンパイラ（ＤＡＣ）１０８、コードキャッシュ１０５を有するプロセスである。図１はこれらのコンポーネント１０５，１０６，１０８をＪＶＭ１０４の一部として示しているが、そのように所望される場合には、これらのコンポーネントはＪＶＭ１０４とは別個にインプリメントさせることが可能であることを注意すべきである。インタプリタ１０６は、ＪＶＭ１０４による実行のためにサポートされるジャバ（Ｊａｖａ）アプリケーション又はその他のジャバをベースとしたコードをインタプリタ的に実行する。ＤＡＣ１０８はＪＶＭにより頻繁に実行されるメソッドをコンパイルし且つコードキャッシュ１０５内に格納するためにＪＶＭ１０４により使用される。コードキャッシュ１０５は実行可能なコードを格納するためのメモリ又はその他の格納部における１つの領域である。異なる実施例においては、システム１００は各ＪＶＭがそれ自身のコンポーネントを有している状態でオペレーティングシステム１０２の上で複数個のＪＶＭプロセスを実行することが可能である。然しながら、説明の便宜上、単に１個のこのようなＪＶＭ及びそのコンポーネントのみが図１において図示されている。インタプリタ１０６及び動的コンパイラ１０８は、例えば、プロセス又はスレッド等の種々の実行エンティティとしてＪＶＭ１０４内において実行することが可能である。コードキャッシュ１０５は任意のタイプのメモリ、又は実行可能なコードを格納するためにＪＶＭ１０４によって使用することが可能なその他のタイプの高速格納部とすることが可能である。従って、ＪＶＭ１０４及び図１に図示されているその他のコンポーネントは、制限的な意味ではなく例示的なものとして理解すべきである。
【００２１】
１実施例によれば、ＪＶＭ１０４は本明細書において記載する高速のパッチベースメソッド呼出し用の技術をインプリメントする。この実施例においては、ＪＶＭ１０４はコールを行うメソッドを実行可能なコードへコンパイルさせ且つその実行可能なコードをコードキャッシュ１０５内に格納させるためにＤＡＣ１０８を使用する。ＪＶＭ１０４は、又、コールを行うメソッドにより呼出すことが可能なターゲットメソッドの状態を現在の状態から異なる新たな状態へ変化させるための１つ又はそれ以上の組のコード又はその他の論理を包含している。ターゲットメソッドにより経験される状態変化に応答して、ＪＶＭ１０４内の１組のコード又はその他の論理がコールを行うメソッドの実行可能なコードからターゲットメソッドを呼出す命令を探し出し且つターゲットメソッドの実行を容易化させるために現在のアドレスを表わすためにその命令により特定されるパラメータをパッチさせる。
【００２２】
非仮想及び静的メソッドの呼出し
本明細書に記載する高速のパッチベースメソッド呼出し用の技術は、コールを行うメソッドの実行可能なコードから非仮想及び静的ターゲットメソッドの両方に対してコールをパッチさせる。本明細書に記載する技術は非仮想及び静的ターゲットメソッドの両方に対して同一の態様で適用可能である。何故ならば、非仮想及び静的ターゲットメソッドの両方は、コールを行うメソッドがコンパイルされる時に決定することが可能だからである。
【００２３】
１実施例において、ターゲットメソッドを呼出すためにコールを行うメソッドの実行可能なコードにおいて直接的ブランチアンドリンク命令を使用する。以下のものはコンパイルされており且つコードキャッシュ内に格納されているターゲットメソッドを呼出すためのこのような命令の１つの例である。
【００２４】
【表２】
0005845221.tif 000003
【００２５】
上の命令において、命令パラメータ「＜ｔａｒｇｅｔ  ｍｅｔｈｏｄ  ｐｃ＞」はターゲットメソッドの実行が開始するコードキャッシュにおけるアドレスを表わす値である。ターゲットメソッドがデコンパイルされ且つコードキャッシュから除去されることに応答して、上の命令は以下の如くにパッチされる。
【００２６】
【表３】
0005845221.tif 000004
【００２７】
この命令パラメータ「＜ｉｎｖｏｋｅＩｎｔｅｒｐｒｅｔｅｒ＞」は、ターゲットメソッドのアンコンパイルされたバージョンをしてインタプリタにより実行させる１組のコードを参照する値である。この実施例の例示において、図２Ａはターゲットメソッドがコンパイルされた状態への変化を経験した場合のコードキャッシュを図示するブロック図であり、図２Ｂはターゲットメソッドがコンパイルされていない状態への変化を経験した場合のコードキャッシュを図示するブロック図である。（コンパイルされていない状態は、又、本明細書においては、アンコンパイルされた状態とも呼称する。）
図２Ａを参照すると、コードキャッシュ１０５が図示されている。コールを行うメソッド２０２及びターゲットメソッド２０８の実行可能なコードはコードキャッシュ１０５内に格納されている。省略記号２１１により示されるように、１つ又はそれ以上のその他のコンパイルされているメソッド又はその他の実行可能なコードもコードキャッシュ１０５内に格納させることが可能である。コールを行うメソッド２０２はターゲットメソッド２０８を呼出すための直接的ブランチアンドリンク命令２０４を有している。命令２０４はコードキャッシュ１０５内のターゲットメソッド２０８の実行可能なコードの始めを参照するパラメータ２０６を有している。
【００２８】
コールを行うメソッド２０２がコンパイルされた後に、パラメータ２０６の値はターゲットメソッドが丁度コンパイルされ且つコードキャッシュ１０５内に格納された場合にターゲットメソッドの状態変化に応答してターゲットメソッド２０８の実行可能なコードの始めを参照するためにセットさせることが可能である。パラメータ２０６の値は、又、コールを行うメソッド２０２がコンパイルされている時にターゲットメソッド２０８が既にコンパイルされており且つコードキャッシュ１０５内に格納されている場合にターゲットメソッド２０８の実行可能なコードの始めを参照するためにセットさせることが可能である。
【００２９】
次に図２Ｂを参照すると、コードキャッシュ１０５はコールを行うメソッド２０２の実行可能なコード、及び省略記号２１１により示したようにその他の実行可能なコードを格納する。ターゲットメソッド２０８はコンパイルされていない状態にあり且つコードキャッシュ１０５内に格納されていない。直接的ブランチアンドリンク命令２０４の命令パラメータ２０６が１組のコード２１０を参照する値を格納しており、該コードは、実行された場合に、実行をインタプリタへ遷移させ、次いで、該インタプリタはアンコンパイルされているターゲットメソッドを実行する。（ｉｎｖｏｋｅＩｎｔｅｒｐｒｅｔｅｒコード２１０は、基礎となるＪＶＭの特定のインプリメンテーションに依存してコードキャッシュ１０５内に存在する場合があるか又は存在しない場合のあるヘルパーグルーコードであり、説明の便宜上、図２Ｂにおいては、このｉｎｖｏｋｅＩｎｔｅｒｐｒｅｔｅｒコードはコードキャッシュ１０５の外側に図示してある。）
コールを行うメソッド２０２がコンパイルされた後に、パラメータ２０６の値は、ターゲットメソッドが丁度デコンパイルされ且つコードキャッシュ１０５から除去された場合の状態変化に応答してｉｎｖｏｋｅＩｎｔｅｒｐｒｅｔｅｒコード２１０を参照するためにセットさせることが可能である。パラメータ２０６の値は、又、コールを行うメソッド２０２がコンパイルされている時にターゲットメソッド２０８がコンパイルされていない状態にある場合にｉｎｖｏｋｅＩｎｔｅｒｐｒｅｔｅｒコード２１０を参照するためにセットさせることが可能である。
【００３０】
一般的に、コールを行うメソッドがコンパイルされる時に、ターゲットメソッドの状態（例えば、コンパイルされているか又はコンパイルされていないか）に関して決定が行われる。ターゲットメソッドがコンパイルされておらず且つコードキャッシュ内に格納されていない場合には、コールを行うメソッドの実行可能なコードにおける命令（例えば、図２Ａ及び２Ｂにおける直接的ブランチアンドリンク命令２０６）はターゲットメソッドのアンコンパイルされているバージョンをしてインタプリタ的に実行させる１組のコードを参照するパラメータを有している（例えば、図２Ｂにおけるパラメータ２０６）。後にターゲットメソッドが、コンパイルされ且つコードキャッシュ内に格納される状態変化を経験すると、該命令はコードキャッシュ内のターゲットメソッドの実行可能なコードの始めを参照するパラメータ値でパッチされる（例えば、図２Ａにおけるパラメータ２０６）。
【００３１】
コールを行うメソッドがコンパイルされている時にターゲットメソッドが既にコンパイルされており且つコードキャッシュ内に格納されている場合には、コールを行うメソッドの実行可能なコードにおける命令（例えば、図２Ａ及び２Ｂにおける直接的ブランチアンドリンク命令２０６）は、コードキャッシュにおけるターゲットメソッドの実行可能なコードの始めを参照するパラメータ（例えば、図２Ａにおけるパラメータ２０６）を有している。後にターゲットメソッドがデコンパイルされ且つコードキャッシュから除去される場合に、該命令はターゲットメソッドのアンコンパイルされているバージョンをしてインタプリタ的に実行させる１組のコードを参照するパラメータ値でパッチされる（例えば、図２Ｂにおけるパラメータ２０６）。
【００３２】
図４Ａは１実施例に基づいて静的又は非仮想ターゲットメソッドに対するコールを包含するコールを行うメソッドのコンパイルを例示したフローチャートである。ステップ４０２において、コールを行うメソッドがコンパイルされる。コールを行うメソッドをコンパイルする一部として、ステップ４０４において、コールを行うメソッドにより呼出されるべきターゲットメソッドがコンパイルされているか又はコンパイルされていないかについての決定が行われる。
【００３３】
ステップ４０４において、ターゲットメソッドがコンパイルされているものと決定される場合には、ステップ４０６において、コールを行うメソッドの実行可能なコードからターゲットメソッドを呼出す該命令のパラメータがコードキャッシュにおけるターゲットメソッドの実行可能なコードの始めのアドレスを参照すべくセットされる。ステップ４０４において、ターゲットメソッドがコンパイルされていないことが決定される場合には、ステップ４０８において、ターゲットメソッドを呼出す命令のパラメータがｉｎｖｏｋｅＩｎｔｅｒｐｒｅｔｅｒコードのアドレスへセットされ、該コードは、実行される場合に、実行をインタプリタへ遷移させ、該インタプリタがターゲットメソッドを実行する。
【００３４】
ステップ４０９において、コールを行うメソッドが他の静的又は非仮想ターゲットメソッドに対するその他のコールを包含しているか否かが決定される。コールを行うメソッドがその他の静的又は非仮想ターゲットメソッドへのコールを包含している場合には、これらのその他の静的又は非仮想ターゲットメソッドに対するコールを行うメソッドにおける全てのコールに対してステップ４０４乃至４０８が繰返される。静的又は非仮想ターゲットメソッドに対するコールを行うメソッドにおける全てのコールがこのような態様で処理された後に、ステップ４１０において、コンパイルされたコールを行うメソッドがコードキャッシュ内に格納される。
【００３５】
図４Ｂは１実施例に基づいてコールを行うメソッドのコールを非仮想又は静的ターゲットメソッドに対してパッチングする状態を例示したフローチャートである。ステップ４１２において、ターゲットメソッドの状態に対する変化が行われる。例えば、ステップ４１２において、ターゲットメソッドはコンパイルされた状態からコンパイルされていない状態への状態変化を経験する場合がある。代替的に、ステップ４１２において、ターゲットメソッドはアンコンパイルされた状態からコンパイルされた状態への状態変化を経験する場合がある。
【００３６】
ターゲットメソッドに対してなされる状態変化に応答して、ステップ４１４は、例えば、図４Ａのステップ４０２においてコンパイルされるコールを行うメソッド等の全てのコールを行うメソッドにおけるターゲットメソッドに対するパッチ可能なコールにわたって繰返す。コールを行うメソッドにおける各パッチ可能なコールに対して、図４Ｂのステップ４１６において、ターゲットメソッドを呼出す命令がそのコールを行うメソッドの実行可能なコードにおいて見つけられる。その命令が見つけられた後に、ステップ４１８において、その命令のパラメータはターゲットメソッドの新たな状態を反映するために修正される。ターゲットメソッドがコンパイルされた状態からコンパイルされていない状態への変化を経験した場合には、該命令のパラメータの値はｉｎｖｏｋｅＩｎｔｅｒｐｒｅｔｅｒコードを参照するために変化される。ターゲットメソッドがコンパイルされていない状態からコンパイルされている状態への変化を経験した場合には、該パラメータの値はコードキャッシュにおけるコンパイルされているターゲットメソッドの実行可能なコードのはじめを参照すべく変化される。
【００３７】
ステップ４１９において、同一の又はその他のコールを行うメソッドにおいてターゲットメソッドを呼出すためのその他のパッチ可能なコールが存在するか否かが決定される。更なるパッチ可能なコールが存在する場合には、コールを行うメソッドにおけるこれらのパッチ可能なコールに対してステップ４１６及び４１８が実施される。ステップ４１９において、ターゲットメソッドに対する全てのパッチ可能なコールが修正されたことが決定される場合には、ステップ４２０がその他の処理で継続する。
【００３８】
非仮想及び静的メソッドコールのトラッキング
１実施例においては、本明細書に記載する高速のパッチベースメソッド呼出し用の技術をインプリメントすることは、複数個のコンパイルされているコールを行うメソッドからターゲットメソッドへの直接的な参照をトラッキング即ち追跡することが関与する。コンパイルされているコールを行うメソッドからターゲットメソッドへの直接参照はターゲットメソッドを呼び出すためのコンパイルされているコールを行うメソッドの実行可能なコードにおいて使用される命令のパラメータとすることが可能である。該直接参照は、ターゲットメソッドとコンパイルされているコールを行うメソッドにおける特定の命令の位置との間の関連性としてメモリ又はその他の格納部内に記録させることが可能である。
【００３９】
例えば、ターゲットメソッドとコンパイルされているコールを行うメソッドにおける命令との間に関連性を記録することが可能であり、その場合に該関連性はコールを行うメソッドの実行可能なコードにおける命令の位置を表わす。ターゲットメソッドが状態変化（例えば、コンパイルされている状態からアンコンパイルされている状態）を経験する場合に、コールを行うメソッドの実行可能なコードにおける命令を識別し且つ見つけるために該関連性が使用される。該命令がこのような態様で識別され且つ見つけられた後に、該命令は、ターゲットメソッドの新たな状態を反映するために該命令のパラメータを変化させることによりパッチさせることが可能である。
【００４０】
ターゲットメソッドと該ターゲットメソッドを呼出すコンパイルされているコールを行うメソッドにおける命令との間の関連性をトラッキングすることは、該関連性を格納するためのメモリ又はその他の格納部内にデータ構造を与え且つ該データ構造における情報を見つけるためのルックアップメカニズムを与えることによりインプリメントすることが可能である。例えば、該データ構造はハッシュテーブルとすることが可能であり、且つターゲットメソッドとコンパイルされているコールを行うメソッドにおける命令との間の特定の関連性を該ハッシュテーブルにおいて見つけるためにハッシュ関数を使用することが可能である。
【００４１】
１実施例においては、コンパイルされているコールを行うメソッドの実行可能なコードにおける命令とターゲットメソッドとの間の関連性を表わす情報と共にパッチレコード（記録）をデータ構造内に格納することが可能である。更に、該パッチレコードは、又、ターゲットメソッドが状態変化を経験する場合に該命令の１つ又はそれ以上のパラメータを修正するために実際に使用されるパッチ用データを包含することが可能である。更に、パッチレコードは、又、該パッチレコードの特定のタイプを表わす情報を包含することが可能である。例えば、該パッチレコードの１つ又はそれ以上のビット又はバイトが、ターゲットメソッド状態変化のタイプを表わすことが可能であり、それに応答して、パッチ用データを使用して例えばコンパイル状態変化等のコールを行うメソッドの命令をパッチする。
【００４２】
更に、本明細書に記載する高速のパッチベースメソッド呼出し用の技術をインプリメントすることは、又、コールを行うメソッドがデコンパイルされる場合にターゲットメソッドとコンパイルされているコールを行うメソッドにおける命令との間の関連性を除去することが関与する場合がある。
【００４３】
１実施例においては、このような関連性の除去は、特定のデコンパイルされたコールを行なうメソッドの命令と１つ又はそれ以上のターゲットメソッドとの間において構成された全ての関連性のリストをトラバースすることによりインプリメントすることが可能である。この実施例においては、ターゲットメソッドに対する全ての関連性のリストが、特定のデコンパイルされたコールを行うメソッドの識別に基づいて決定される。特定のデコンパイルされたメソッドに対する関連性のリストが決定されると、該リスト上の関連性はそれらが記録されているメモリ又はその他の格納部から除去される。
【００４４】
別の実施例においては、ターゲットメソッドとコンパイルされているコールを行うメソッドにおける命令との間の関連性の除去は全ての記録されている関連性をトラバースすることによりインプリメントすることが可能である。この実施例においては、各関連性に対して、その関連性により反映されるコールを行うメソッドがデコンパイルされたか否かについての決定が行われ、且つそのコールを行うメソッドがデコンパイルされている場合には、その関連性が、それが記録されているメモリ又はその他の記録部から除去される。
【００４５】
仮想メソッドの呼出し
本明細書に記載する高速のパッチベースメソッド呼出し用の技術は、コールを行うメソッドの実行可能なコードから仮想ターゲットメソッドに対してコールをパッチさせる。オブジェクト指向型プログラミングにおいては、仮想メソッドはベースクラスにおけるメソッドであって、そのベースクラスのサブクラスにおいてインプリメントされている別のメソッドによりオーバーライドされることが許可されるメソッドである。典型的に、仮想ターゲットメソッドのアイデンティティ即ち識別は、コールを行うメソッドが実行されるまで不知である。何故ならば、呼出しを行うオブジェクトのインスタンスタイプ（従って、呼出されるべきオーバーライドメソッドの識別）はランタイムにおいてのみ決定することが可能だからである。
【００４６】
非仮想メソッドの高速パッチベース呼出しに対する上述した技術と同様に、１実施例においては、仮想ターゲットメソッドを呼出すためにコールを行うメソッドの実行可能なコードにおいて直接的ブランチアンドリンク命令が使用される。本明細書に記載する技術に従って、仮想ターゲットメソッドを呼出す直接的ブランチアンドリンク命令は、ターゲットメソッドがそのコンパイル状態（例えば、コンパイルされているか又はコンパイルされていないか）及びそのオーバーライド状態（例えば、オーバーライドされているか又はオーバーライドされていないか）のうちの少なくとも１つ又はそれ以上において変化を経験する場合にパッチさせることが可能である。以下のものは仮想ターゲットメソッドを呼出すためのこのような直接的ブランチアンドリンク命令の１例である。
【００４７】
【表４】
0005845221.tif 000005
【００４８】
命令パラメータ「」の値は、仮想ターゲットメソッドの現在の状態を反映する態様でセットされ且つ修正される。ターゲットメソッドが現在少なくとも１つの他のメソッドによりオーバーライドされている場合には、パラメータ「」の値は仮想メソッド呼出しを実施することが可能な１組のコードを参照すべくセットされる。仮想メソッドの仮想呼出しを実施することが可能な１組のコードは本明細書においては「ｉｎｖｏｋｅＶｉｒｔｕａｌ」コードと呼称する。ｉｎｖｏｋｅＶｉｒｔｕａｌコードは、実行されると、実行されるべきターゲットメソッド（例えば、呼出しを行うオブジェクトのインスタンスタイプに基づいて、オリジナルターゲットメソッド又はオーバーライドメソッド）のアイデンティティ即ち識別を決定し且つ識別したメソッドの実行を容易とさせる。例えば、上の命令が実行される場合に識別されたターゲットメソッドがコンパイルされていない場合には、ｉｎｖｏｋｅＶｉｒｔｕａｌコードは、実行されると、ターゲットメソッドをしてインタプリタにより実行させる。識別されたターゲットメソッドがコンパイルされており且つコードキャッシュ内に格納されている場合には、ｉｎｖｏｋｅＶｉｒｔｕａｌコードは、実行されると、実行をコードキャッシュ内のターゲットメソッドの実行可能なコードの始めへ転送させる。
【００４９】
コールを行うメソッドが初期的にコンパイル中である場合には、仮想ターゲットメソッドが（１）コンパイルされており且つコードキャッシュ内に格納されており、且つ（２）いずれかその他のメソッドによりオーバーライドされていない場合には、上の直接的ブランチアンドリンク命令におけるパラメータ「」はコードキャッシュ内のターゲットメソッドの実行可能なコードの始めを参照する値へ初期的にセットされる。後の点において仮想ターゲットメソッドがそのコンパイル状態及び／又はそのオーバーライド状態のうちのいずれかにおいて状態変化を経験する場合には、上の直接的ブランチアンドリンク命令は、ｉｎｖｏｋｅＶｉｒｔｕａｌコードを参照するためにパラメータ「」の値を修正することによりパッチさせることが可能である。そうでない場合には、コールを行うメソッドが初期的にコンパイル中である場合にターゲットメソッドが少なくとも１つのその他のメソッドによりオーバーライドされている場合には、幾つかの実施例において、ターゲットメソッドの仮想呼出しを実施するために１組のインラインコードが発生される。これらの実施例においては、後の点において仮想ターゲットメソッドが何等かの状態変化を経験する場合に、パッチングが試みられることはない。何故ならば、該１組のインラインコードは高速で実行を行い且つ該メソッドがオーバーライドされたままである間により良い性能を与えるからである。コールを行うメソッドが初期的にコンパイル中である場合にターゲットメソッドがコンパイルされておらず且ついずれかその他のメソッドによりオーバーライドされていない場合には、上の直接的ブランチアンドリンク命令におけるパラメータ「」はｉｎｖｏｋｅＶｉｒｔｕａｌコードのアドレスにセットされる。後の点において、仮想ターゲットメソッドがそのコンパイル状態において変化を経験し且つコンパイルされることになるが、いずれかその他のメソッドにより未だにオーバーライドされていない場合には、上の直接的ブランチアンドリンク命令は、ターゲットメソッドの新たな状態を反映するためにパラメータ「」の値を修正することによりパッチされる（例えば、ターゲットメソッドはその新たな状態においてコンパイルされるので、パラメータ「」の値はキャッシュコード内のターゲットメソッドの実行可能なコードの始めにセットさせることが可能である）。
【００５０】
図３はターゲットメソッドがオーバーライドされておらず且つコンパイルされていない仮想メソッドである場合の１実施例に基づくコードキャッシュを例示したブロック図である。図３において、コールを行うメソッド３０２の実行可能なコードがコードキャッシュ１０５内に格納されている。省略記号３１１により示されるように、１つ又はそれ以上のその他のコンパイルされたメソッド又はその他の実行可能なコードもコードキャッシュ１０５内に格納することが可能である。コールを行うメソッド３０２は仮想ターゲットメソッドを呼出すための直接的ブランチアンドリンク命令３０４を有している。図３はターゲットメソッドがコンパイルされておらず且ついずれかのその他のメソッドによりオーバーライドされていない仮想ターゲットメソッドの状態を反映している。命令３０４は１組のｉｎｖｏｋｅＶｉｒｔｕａｌコード３１０を参照するパラメータ３０６を有している。ｉｎｖｏｋｅＶｉｒｔｕａｌコード３１０はヘルパーグルーコードであり、それは基礎となるＪＶＭの特定のインプリメンテーションに依存してコードキャッシュ１０５内に存在する場合も存在しない場合もある。（説明の便宜上、図３においては、ｉｎｖｏｋｅＶｉｒｔｕａｌコードはコードキャッシュ１０５の外側に図示してある。）実行されると、ｉｎｖｏｋｅＶｉｒｔｕａｌコード３１０はターゲットメソッドの仮想呼出しを実施する。例えば、ターゲットメソッドがコンパイルされていない場合には、実行はインタプリタへ転送され、該インタプリタが該メソッドのアンコンパイルされているバージョンを実行する。幾つかの実施例においては、仮想ターゲットメソッドが、新たな状態においてターゲットメソッドがコンパイルされており且つコードキャッシュ１０５内に格納されているように状態変化を経験することに応答して、パラメータ３０６の値は、コードキャッシュ内のターゲットメソッドの実行可能なコードの始めを参照するように修正させることが可能である。
【００５１】
幾つかの実施例においては、コールを行うメソッドが初期的にコンパイルされている場合に仮想ターゲットメソッドが少なくとも１つのその他のメソッドによりオーバーライドされる場合には、ターゲットメソッドの仮想呼出しを実施するためにコールを行うメソッドの実行可能なコードにおいて１組のインラインコードが発生される。これらの実施例においては、後に仮想ターゲットメソッドが、ターゲットメソッドが最早いずれかその他のメソッドによりオーバーライドされるものではないように状態変化を経験する場合であっても、パッチングが試みられることはない。何故ならば、ターゲットメソッドが一度オーバーライドされると、それは、通常、オーバーライドされたままであり、且つターゲットメソッドがオーバーライドされたままである間は、インラインコードはターゲットメソッドのより速い呼出しを発生し且つターゲットメソッドの状態変化をトラッキングするために処理資源を費消することを開始する。
【００５２】
図４Ｃは１実施例に基づいて仮想ターゲットメソッドに対するコールを包含するコールを行うメソッドのコンパイルを例示したフローチャートである。ステップ４２２において、コールを行うメソッドがコンパイルされる。コールを行うメソッドをコンパイルする一部として、ステップ４２３において、コールを行うメソッドにより呼出されるべき仮想ターゲットメソッドが１つ又はそれ以上のその他のメソッドによりオーバーライドされるか否かが決定される。
【００５３】
ステップ４２３において、仮想ターゲットメソッドが少なくとも１つのその他のメソッドによりオーバーライドされることが決定される場合には、ステップ４２５において、１組のインラインコードが発生され且つコールを行うメソッド内に挿入される。該１組のインラインコードは、実行される場合に、ターゲットメソッドの仮想呼出しを実施する。このような仮想呼出しは、例えば、最初にオリジナルのターゲットメソッド又はオーバーライドメソッドのいずれが実行されるべきであるかを決定し、次いで、その識別されたメソッドの実行を容易化させることを包含する場合がある。インラインコードがステップ４２５において発生された後に、ステップ４２７が実施される。ステップ４２３において仮想ターゲットメソッドがいずれかその他のメソッドによりオーバーライドされていないことが決定される場合には、ステップ４２４が実施される。
【００５４】
ステップ４２４において、仮想ターゲットメソッドがコンパイルされているか又はコンパイルされていないかが決定される。ステップ４２４において、仮想ターゲットメソッドがコンパイルされていることが決定される場合には、ステップ４２６において、コールを行うメソッドの実行可能なコードからターゲットメソッドを呼出す命令のパラメータがコードキャッシュ内のターゲットメソッドの実行可能なコードの始めのアドレスを参照すべくセットされる。ステップ４２４において、仮想ターゲットメソッドがコンパイルされていないことが決定される場合には、ステップ４２９が実施され且つ命令パラメータはｉｎｖｏｋｅＶｉｒｔｕａｌコードのアドレスへセットされ、該コードは、幾つかの実施例においては、仮想メソッドを呼出すための１組の既に発生されているコードとすることが可能である。
【００５５】
ステップ４２７において、コールを行うメソッドがその他の仮想ターゲットメソッドに対するその他のコールを包含するか否かが決定される。コールを行うメソッドがその他の仮想ターゲットメソッドへのコールを包含している場合には、これらのその他の仮想ターゲットメソッドに対してのコールを行うメソッドにおける全てのコールに対してステップ４２３乃至４２６が繰返される。仮想ターゲットメソッドに対するコールを行うメソッドにおける全てのコールがこのような態様で処理された後に、ステップ４２８において、コンパイルされたコールを行うメソッドがコードキャッシュ内に格納される。
【００５６】
図４Ｄは１実施例に基づいて仮想ターゲットメソッドに対するコールを行うメソッドのコールをパッチさせる状態を例示したフローチャートである。ステップ４３０において、仮想ターゲットメソッドの状態に対する変化が行われる。例えば、ステップ４３０において、仮想ターゲットメソッドはそのコンパイル状態において変化を経験する場合がある。代替的に、又はそれに加えて、ステップ４３０において、ターゲットメソッドはそのオーバーライド状態における変化を経験する場合がある。仮想ターゲットメソッドに対して行われる状態変化に応答して、ステップ４３１において、仮想ターゲットメソッドが以前にオーバーライドされているか否かの決定が行われる。例えば、幾つかの実施例において、オーバーライドフラッグを仮想ターゲットメソッド内に格納する場合があり、これらの実施例においては、オーバーライドフラッグは、仮想ターゲットメソッドが最初にオーバーライドされる場合にセットさせることが可能であり、その後に、仮想ターゲットメソッドが以前にオーバーライドされたか否かを決定するためにオーバーライドフラッグを検査することが可能である。ステップ４３１において、仮想ターゲットメソッドが以前にオーバーライドされたか否かの決定が行われる場合には、このことは、ターゲットメソッドが呼出される場合にはいつでもターゲットメソッドを呼出す全てのコールを行うメソッドにおける命令は既にｉｎｖｏｋｅＶｉｒｔｕａｌコードを参照すべくセットされていることを表わす。従って、この実施例においては、ターゲットメソッドを呼出すコールを行うメソッドにおける命令はパッチさせることは必要ではなく、且つその他の処理で継続するためにステップ４４２を実施することが可能である。
【００５７】
ステップ４３１において、仮想ターゲットメソッドが以前にオーバーライドされていないことの決定がなされる場合には、ステップ４３２において、新たな状態においてターゲットメソッドが別のメソッドによりオーバーライドされるか否かの決定が行われる。
【００５８】
ステップ４３２において、新たな状態において仮想ターゲットメソッドが少なくとも１つのその他のメソッドによりオーバーライドされるか否かの決定が行われる場合には、例えば図４Ｃのステップ４２２においてコンパイルされているコールを行うメソッド等のすべてのコールを行うメソッドにおける仮想ターゲットメソッドに対するパッチ可能なコールにわたってステップ４３４Ａが繰返される。コールを行うメソッドにおける各パッチ可能なコールに対して、図４Ｄのステップ４３６Ａにおいて、ターゲットメソッドを呼出す命令がそのコードを行うメソッドの実行可能なコード内に位置決めされる。その命令が位置決めされた後に、ステップ４３８Ａにおいて、その命令が、パラメータがｉｎｖｏｋｅＶｉｒｔｕａｌコードを参照すべく修正され、該コードは、実行される場合に、その新たな状態において仮想ターゲットメソッドの実行を容易とさせる。ステップ４４０Ａにおいて、同一の又はその他のコールを行うメソッドにおいて仮想ターゲットメソッドを呼出すためのその他のパッチ可能なコールが存在するか否かの決定が行われる。更なるパッチ可能なコールが存在する場合には、コールを行うメソッド又は複数のメソッドにおけるこれらのパッチ可能なコールに対してステップ４３６Ａ及び４３８Ａが実施される。ステップ４４０Ａにおいて仮想ターゲットメソッドに対する全てのパッチ可能なコールが修正されていることの決定が行われる場合には、ステップ４４２はその他の処理で継続する。
【００５９】
ステップ４３２において、新たな状態において仮想ターゲットメソッドがその他のメソッドによりオーバーライドされないことの決定がなされる場合には、ステップ４３３において、そのターゲットメソッドが新たな状態でコンパイルされているか否かの決定が行われる。ステップ４３３において新たな状態においてターゲットメソッドがコンパイルされていないことの決定がなされる場合には、上述した如くに実行はステップ４３４Ａ乃至４４０Ａで進行する。
【００６０】
ステップ４３３において新たな状態において仮想ターゲットメソッドがコンパイルされることの決定がなされる場合には、それは、ターゲットメソッドが未だに別のメソッドによりオーバーライドされておらず且つそのコンパイル状態をコンパイルされており且つコードキャッシュ内に格納されているものへ変化させたことを意味する。従って、ステップ４３４Ｂは例えば、図４Ｃのステップ４２２においてコンパイルされているコールを行うメソッド等の全てのコールを行うメソッドにおける仮想ターゲットメソッドに対するパッチ可能なコールにわたって繰返すために実施される。コールを行うメソッドにおける各パッチ可能なコールに対して、図４Ｄのステップ４３６Ｂにおいて、ターゲットメソッドを呼出す命令がそのコールを行うメソッドの実行可能なコード内に位置決めされる。その命令が位置決めされた後に、ステップ４３８Ｂにおいて、該命令のパラメータはキャッシュコード内のターゲットメソッドの実行可能なコールのアドレスにセットされる。その後に、ステップ４４０Ｂにおいて、同一の又はその他のコールを行うメソッドにおける仮想ターゲットメソッドを呼出すためのその他のパッチ可能なコールが存在するか否かの決定がなされる。その他のパッチ可能なコールが存在する場合には、ステップ４３６Ｂ及び４３８Ｂがコールを行うメソッド又は複数のメソッドにおけるこれらのパッチ可能なコールに対して実施される。ステップ４４０Ｂにおいて仮想ターゲットメソッドに対する全てのパッチ可能なコールが修正されていることの決定がなされる場合には、ステップ４４２はその他の処理で継続する。
【００６１】
仮想メソッドコールのトラッキング
１実施例においては、本明細書に記載する仮想メソッドコールの高速のパッチベースメソッド呼出し用の技術をインプリメントすることは複数個のコンパイルされているコールを行うメソッドから仮想ターゲットメソッドへの直接参照をトラッキング即ち追跡することが関与する。更に、該技術をインプリメントすることは、又、１つ又はそれ以上のその他のメソッドによる仮想ターゲットメソッドのオーバーライドをトラッキングすることが関与する。
【００６２】
１実施例において、コンパイルしたコールを行うメソッドからターゲットメソッドへの直接参照をトラッキングすることは、非仮想メソッドコールをトラッキングするために上述した技術に従ってインプリメントすることが可能である。例えば、仮想ターゲットメソッドとコンパイルされているコールを行うメソッドにおける命令との間の関連性を記録することが可能であり、その場合に該関連性はコールを行うメソッドの実行可能なコードにおける命令の位置を表わす。仮想ターゲットメソッドが状態変化を経験する場合には（例えば、オーバーライドされておらず且つコンパイルされている状態からオーバーライドされるか又はコンパイルされていない状態への変化）、１つ又はそれ以上のコールを行うメソッドの実行可能なコードにおいて１つ又はそれ以上の命令を識別し且つ位置決めするために格納されている関連性を使用することが可能である。該１つ又はそれ以上の命令がこのような態様で識別され且つ位置決めされた後に、ターゲットメソッドの現在の状態を反映するために該命令のパラメータを変化させることにより該命令をパッチさせることが可能である。非仮想メソッドコールをトラッキングするために上述した技術と同様に、メモリ又はその他の高速格納部における任意のデータ構造をこのような関連性を格納するために使用することが可能である。仮想ターゲットメソッドとコンパイルされているコールを行うメソッドにおける命令との間の関連性をトラッキングすることに加えて、コールを行うメソッドがデコンパイルされる場合に、幾つかの実施例は、又、ターゲットメソッドとコンパイルされているコールを行うメソッドにおける命令との間の関連性を除去することが可能である。
【００６３】
１実施例においては、１つ又はそれ以上のその他のメソッドによる仮想ターゲットメソッドのオーバーライドのトラッキングは、ターゲットメソッドのメソッドブロック内に１組のオーバーライド情報を維持することによりインプリメントすることが可能である。該オーバーライド情報は、特定の時刻において仮想ターゲットメソッドがオーバーライドされるか否かを表わす。従って、本明細書に記載する技術に従って、該オーバーライド情報は、ターゲットメソッドが１つ又はそれ以上のその他のメソッドによりオーバーライドされるか否かを決定するために任意の時刻において検査することが可能である。該オーバーライド情報は、初期的に、ターゲットメソッドがオーバーライドされていないことを表わすべくセットすることが可能である。その後に、ターゲットメソッドをオーバーライドするメソッドがロードされる場合にはいつでも、ターゲットメソッドのデータ構造内のオーバーライド情報はそれに従って修正されてターゲットメソッドがオーバーライドされたことを表わす。
【００６４】
幾つかの実施例において、ターゲットメソッド内のオーバーライド情報はオーバーライドフラッグとして表わすことが可能である。ターゲットメソッドをオーバーライドするメソッドが実行のためにロードされる場合にはいつでも、ターゲットメソッド内のオーバーライドフラッグは、そのターゲットメソッドがオーバーライドされていることを表わすべくセットされる。従って、これらの実施例においては、ターゲットメソッドのオーバーライド状態を決定するために、本明細書に記載した技術はターゲットメソッドと関連するオーバーライドフラッグを検査する。
【００６５】
幾つかの実施例においては、ターゲットメソッドに対するオーバーライド情報は初期的にゼロにセットされるオーバーライドカウントとして表わすことが可能である。ターゲットメソッドをオーバーライドするメソッドが実行のためにロードされる場合にはいつでも、そのターゲットメソッドと関連するオーバーライドカウントがインクリメントされる。ターゲットメソッドをオーバーライドするメソッドがアンロードされ且つターゲットメソッドと関連するオーバーライドカウントが正の値を格納している場合にはいつでも、オーバーライドカウントはデクリメントされる。このように、任意の時刻において、オーバーライドカウントはターゲットメソッドの現在のオーバーライド状態を表わす。従って、これらの実施例においては、ターゲットメソッドのオーバーライド状態を決定するために、本明細書に記載した技術は、ターゲットメソッドと関連するオーバーライドカウントを検査する（例えば、正のオーバーライドカウント値は、ターゲットメソッドが少なくとも１つの他のメソッドによりオーバーライドされたことを表わし、且つゼロの値はターゲットメソッドがオーバーライドされていないことを表す）。
【００６６】
ハードウエア概観
１実施例において、オペレーティングシステム１０２、ＪＶＭ１０４、インタプリタ１０６及びＤＡＣ１０８は１個又はそれ以上のプロセッサにより実行される命令の組の形態をとる。図５はこれらの組の命令を実行することが可能なコンピュータシステム５００のブロック図である。コンピュータシステム５００は情報交換を容易とするためのバス５０２、及び情報を処理するためにバス５０２と結合されている１個又はそれ以上のプロセッサ５０４を包含している。コンピュータシステム５００は、又、情報及びプロセッサ５０４により実行されるべき命令を格納するためにバス５０２へ結合されているランダムアクセスメモリ（ＲＡＭ）又はその他のダイナミック格納装置等のメインメモリ５０６を包含している。メインメモリ５０６は、又、プロセッサ５０４による命令の実行期間中に、一時的な変数又はその他の中間情報を格納するために使用することが可能である。コンピュータシステム５００は、更に、静的情報及びプロセッサ５０４用の命令を格納するためにバス５０２へ結合されているリードオンリメモリ（ＲＯＭ）５０８又はその他の静的格納装置を包含することが可能である。磁気ディスク又は光学ディスク等の格納装置５１０が情報及び命令を格納するために設けられ且つバス５０２へ結合されている。
【００６７】
コンピュータシステム５００は、コンピュータユーザに対し情報を表示するためにバス５０２を介してディスプレイ５１２へ結合させることが可能である。英文字及びその他のキーを包含する入力装置５１４がプロセッサ５０４に対し情報及びコマンド選択を通信するためにバス５０２へ結合されている。別のタイプのユーザ入力装置はマウス、トラックボール、又はプロセッサ５０４に対し方向情報及びコマンド選択を通信し且つディスプレイ５１２上にカーソルの移動を制御するためのカーソル方向器等のカーソル制御器５１６である。この入力装置は、典型的に、２つの軸、即ち第一軸（例えばｘ）及び第二軸（例えば、ｙ）において２つの自由度を有しており、そのことは該装置が平面内において位置を特定することを可能とする。
【００６８】
コンピュータシステム５００においてバス５０２は種々のコンポーネント間において情報、信号、データ等を交換させることを可能とする任意のメカニズム及び／又は媒体とすることが可能である。例えば、バス５０２は電気信号を担持する１組の導体とすることが可能である。バス５０２は、又、１つ又はそれ以上のコンポーネント間においてワイヤレス信号を担持するワイヤレス媒体（例えば、空気）とすることが可能である。バス５０２は、更に、１つ又はそれ以上のコンポーネントを接続するネットワーク接続とすることが可能である。種々のコンポーネント間において情報、信号、データ等を交換させることを可能とする任意のメカニズム及び／又は媒体をバス５０２として使用することが可能である。
【００６９】
バス５０２は、又、これらのメカニズム／媒体の組合わせとすることが可能である。例えば、プロセッサ５０４はワイヤレス的に格納装置５１０と通信を行うことが可能である。このような場合において、バス５０２は、プロセッサ５０４と格納装置５１０の観点からは、空気等のワイヤレス媒体である。更に、プロセッサ５０４は容量的にＲＯＭ５０８と通信することが可能である。更に、プロセッサ５０４はネットワーク接続を介してメインメモリ５０６と通信することが可能である。この場合には、バス５０２はネットワーク接続である。更に、プロセッサ５０４は１組の導体を介してディスプレイ５１２と通信することが可能である。この場合には、バス５０２は１組の導体である。従って、種々のコンポーネントがどのようにして互いに通信するかに依存して、バス５０２は異なる形態をとることが可能である。バス５０２は図５に示したように、種々のコンポーネント間において情報、信号、データ等を交換させることを可能とするメカニズム及び／又は媒体の全てを機能的に表わしている。
【００７０】
本発明は本明細書に記載した高速のパッチベースメソッド呼出し用の技術をインプリメント即ち実現するためのコンピュータシステム５００の使用に関連している。本発明の１実施例によれば、これらの技術は、メインメモリ５０６内に包含されている１つ又はそれ以上の命令の１つ又はそれ以上のシーケンスを実行するプロセッサ５０４に応答してコンピュータシステム５００により実施される。このような命令は、格納装置５１０等の別のマシンにより読取可能な媒体からメインメモリ５０６内へ読取らせることが可能である。メインメモリ５０６内に包含されている命令のシーケンスの実行は、プロセッサ５０４をして本明細書に記載する処理ステップを実施する。代替的実施例においては、本発明をインプリメントするためにソフトウエア命令の代わりに又はそれと結合してハードワイヤード回路を使用することが可能である。従って、本発明の実施例はハードウエア回路とソフトウエアの特定の組合わせに制限されるものではない。
【００７１】
「マシンにより読取可能な媒体」という用語は、本明細書においては、特定の態様でマシンを動作させるデータを供給することに関与する任意の媒体のことを意味するものとして使用されている。コンピュータシステム５００を使用してインプリメントされる実施例においては、例えば、実行のためにプロセッサ５０４へ命令を供給する上で種々のマシンにより読取可能な媒体が関与する。このような媒体は多数の形態を取ることが可能であり、これらに制限されるものではないが、非揮発性媒体、揮発性媒体、伝送媒体を包含している。非揮発性媒体は、例えば、格納装置５１０等の光学的又は磁気的ディスクを包含している。揮発性媒体はメインメモリ５０６等の動的メモリを包含している。伝送媒体は、バス５０２を構成するワイヤを包含して、同軸ケーブル、銅ワイヤ及びオプチカルファイバーを包含している。伝送媒体は、又、無線及び赤外線データ通信において発生されるような音響又は光波の形態をとることも可能である。マシンにより読取可能な媒体の一般的な形態は、例えば、フロッピィディスク、フレキシブルディスク、ハードディスク、磁気テープ、又は任意のその他の磁気媒体、ＣＤ−ＲＯＭ、ＤＶＤ、又は任意のその他の光学的格納媒体、パンチカード、ペーパーテープ、孔のパターンを具備する任意のその他の物理的媒体、ＲＡＭ，ＰＲＯＭ、ＥＰＲＯＭ、フラッシュＥＰＲＯＭ、任意のその他のメモリチップ又はカートリッジ、以後に記載するような搬送波、又はそれからコンピュータ読取ることが可能な任意のその他の媒体を包含している。
【００７２】
種々の形態のマシンにより読取可能な媒体は、実行のためにプロセッサ５０４に対して１つ又はそれ以上の命令からなる１つ又はそれ以上のシーケンスを担持する場合に関与する場合がある。例えば、該命令は、初期的に、遠隔コンピュータの磁気ディスク上に担持されている場合がある。該遠隔コンピュータは該命令をその動的メモリ内にロードさせ且つ該命令を、モデムを使用して電話線を介して送信することが可能である。コンピュータシステム５００に対して局所的なモデムは電話線上のデータを受信し且つ赤外線送信器を使用して該データを赤外線信号へ変換させることが可能である。赤外線検知器は該赤外線信号内に担持されるデータを受取ることが可能であり且つ適宜の回路が該データをバス５０２上に配置させることが可能である。バス５０２は該データをメインメモリ５０６へ運び、そこからプロセッサ５０４が該命令を検索し且つ実行する。メインメモリ５０６により受取られる命令は、オプションとして、プロセッサ５０４による実行の前又は後のいずれかにおいて格納装置５１０上に格納させることが可能である。
【００７３】
コンピュータシステム５００は、又、バス５０２へ結合されている通信インターフェース５１８を包含している。通信インターフェース５１８はローカルネットワーク５２２へ接続されているネットワークリンク５２０へ結合する二方向データ通信を提供する。例えば、通信インターフェース５１８は対応するタイプの電話線に対してデータ通信接続を与えるために統合サービスデジタルネットワーク（ＩＳＤＮ）カード又はモデムとすることが可能である。別の例として、通信インターフェース５１８は互換性のあるＬＡＮに対しデータ通信接続を提供するためのローカルエリアネットワーク（ＬＡＮ）カードとすることが可能である。ワイヤレスリンクも実現することが可能である。いずれかのこのような実現例において、通信インターフェース５１８は種々のタイプの情報を表わすデジタルデータストリームを担持する電気的、電磁的又は光学的信号を送信し且つ受信する。
【００７４】
ネットワークリンク５２０は、典型的に、１つ又はそれ以上のネットワークを介して他のデータ装置に対しデータ通信を提供する。例えば、ネットワークリンク５２０はローカルネットワーク５２２を介してホストコンピュータ５２４に対して又はインターネットサービスプロバイダ（ＩＳＰ）５２６により運用されるデータ装置に対しての接続を与えることが可能である。ＩＳＰ５２６は現在「インターネット」５２８として一般的に呼ばれているワールドワイドパケットデータ通信ネットワークを介してデータ通信サービスを提供する。ローカルネットワーク５２２及びインターネット５２８は、両方共、デジタルデータストリームを担持する電気的、電磁的又は光学的信号を使用する。種々のネットワークを介しての信号及びネットワークリンク５２０上及びコンピュータシステム５００へ及びそれからのデジタルデータを担持する通信インターフェース５１８を介しての信号は情報を輸送する搬送波の例示的な形態である。
【００７５】
コンピュータシステム５００は、ネットワーク、ネットワークリンク５２０及び通信インターフェース５１８を介して、プログラムコードを包含して、メッセージを送信し且つデータを受取ることが可能である。インターネットの例においては、サーバー５３０はインターネット５２８、ＩＳＰ５２６、ローカルネットワーク５２２、通信インターフェース５１８を介して、アプリケーションプログラムに対して要求されたコードを送信する場合がある。
【００７６】
受信されたコードは、受信されたままで、プロセッサ５０４により実行し及び／又は格納装置５１０、又は後の実行のためにその他の非揮発性格納部内に格納させることが可能である。このように、コンピュータシステム５００は搬送波の形態でアプリケーションコードを得ることが可能である。
【００７７】
以上、本発明の具体的実施の態様について詳細に説明したが、本発明は、これら具体例にのみ制限されるべきものではなく、本発明の技術的範囲を逸脱することなしに種々の変形が可能であることは勿論である。
【符号の説明】
【００７８】
１００  システム
１０２  オペレーティングシステム
１０４  ＪＶＭ
１０５  コードキャッシュ
１０６  インタプリタ
１０８  動的適応型コンパイラ（ＤＡＣ）
２０２  コールを行うメソッド
２０４  直接的ブランチアンドリンク命令
２０６  パラメータ
２０８  ターゲットメソッド
２１０  １組のコード
２１１  省略記号
【図１】
0005845221.tif 000006
【図２Ａ】
0005845221.tif 000007
【図２Ｂ】
0005845221.tif 000008
【図３】
0005845221.tif 000009
【図４Ａ】
0005845221.tif 000010
【図４Ｂ】
0005845221.tif 000011
【図４Ｃ】
0005845221.tif 000012
【図４Ｄ】
0005845221.tif 000013
【図５】
0005845221.tif 000014