JP2007234022A - 高速パッチベースメソッドコール - Google Patents

高速パッチベースメソッドコール Download PDF

Info

Publication number
JP2007234022A
JP2007234022A JP2007047989A JP2007047989A JP2007234022A JP 2007234022 A JP2007234022 A JP 2007234022A JP 2007047989 A JP2007047989 A JP 2007047989A JP 2007047989 A JP2007047989 A JP 2007047989A JP 2007234022 A JP2007234022 A JP 2007234022A
Authority
JP
Japan
Prior art keywords
target
call
state
code
target method
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2007047989A
Other languages
English (en)
Inventor
Christopher J Plummer
ジェイ. プランバー クリストファー
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Sun Microsystems Inc
Original Assignee
Sun Microsystems Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Sun Microsystems Inc filed Critical Sun Microsystems Inc
Publication of JP2007234022A publication Critical patent/JP2007234022A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/449Object-oriented method invocation or resolution

Abstract

【課題】 ジャバ仮想マシン等のオブジェクト指向環境におけるメソッドの呼出しを迅速化させる。
【解決手段】 コンパイルされているコールを行うメソッドからターゲットメソッドの高速の呼出しを与えるパッチベースメカニズムが提供される。コールを行うメソッドに対するコードが格納部内に格納される。コールを行うメソッドに対するコードはターゲットメソッドを呼出す命令を有しており、該命令はパラメータを有している。ターゲットメソッドにより経験される現在の状態から新たな状態への状態変化に応答して、該パラメータは第一値から第二値へ修正され、該第二値は新たな状態においてのターゲットメソッドの実行を容易化させるための正しいアドレスを表わしている。従って、ターゲットメソッドを呼出すための命令におけるパラメータは、常に、ターゲットメソッドの正しい状態を反映しており、そのことは該命令が実行される場合にターゲットメソッドの高速の呼出しを提供する。
【選択図】 図1

Description

本発明はメソッドをコールする技術に関するものであって、更に詳細には、コンパイルされているコールを行うメソッドからターゲットメソッドを高速に呼出す技術に関するものである。
このセクションに記載されるアプローチを追及することが可能なものであったが、必ずしも以前に着想されたか又は追及されたアプローチではない。従って、本明細書においてそうでないことが明示されない限り、このセクションに記載されるアプローチは本願における特許請求の範囲に対する従来技術ではなく且つこのセクションに包含されることにより従来技術であることを認めるものではない。
典型的なジャバ仮想マシン(JVM)は、ジャバ(Java)アプリケーション又はその他のジャバをベースとしたコードを実行するためのインタプリタを包含している。ジャバクラスのインスタンスにおけるバイトコードとしてインプリメントされているジャバメソッドがインボーク(invoke)即ち呼出されると、インタプリタは該メソッドへアクセスし且つインタプリタ的に該バイトコードを実行する。幾つかのJVMは、更に、ジャバメソッドの実行を高速化するために動的適用型コンパイラを提供することが可能である。このようなJVMが、特定のメソッドが頻繁に実行されることを検知する場合には、JVMは該メソッドをネイティブコードへコンパイルするために動的適用型コンパイラを使用する。JVMは該ネイティブコードをメモリ(例えば、コードキャッシュ)の1つの領域内に格納し、且つ次回に該メソッドが呼出される場合に、JVMは該メソッドのバイトコードをインタプリタ的に実行するためにインタプリタを使用する代わりにメモリ内において見つかったネイティブコードを実行する。その割当てられたメモリを効率的に利用するために、このようなJVMは、典型的に、最早頻繁に使用されることのないコンパイルされたメソッドに対するネイティブコードをメモリから除去する。メモリからコンパイルされたメソッドに対する実行可能なコードを除去するプロセスは、本明細書においては、デコンパイルと呼称する。
典型的なメソッドは、多数のその他のメソッドに対する又は自分自身に対する(例えば、反復的コール)呼出し即ちコール(call)を包含している場合がある。別のメソッドを呼出す1つのメソッドはコーリングメソッド(calling method)、即ち「コールを行うメソッド」と呼称する。別のメソッドにより呼出されている1つのメソッドは、本明細書においては、ターゲットメソッドと呼称する。典型的なJVMにおいて、コンパイルされているメソッドからのメソッド呼出しは必要以上に遅いものであり、何故ならば、ターゲットメソッドの正しいランタイムアドレスはコンパイル時においてコールを行う方法によって知られていないからである。例えば、JVMがターゲットメソッドに対するコールを包含するコールを行うメソッドをコンパイルすることを決定するものと仮定する。コンパイル時において、JVMは確実性を持ってターゲットメソッドのランタイムアドレスを知得しているものではない。何故ならば、(1)ターゲットメソッド(例えば、コンパイルされているか又はコンパイルされていない)のコンパイル状態がコールを行うメソッドがコンパイルされた後に変化する場合があるか、又は(2)ターゲットメソッドが、コールを行うメソッドがコンパイルされた後に、別のメソッドによりオーバーライドされる場合のある仮想メソッドである場合があるからである。この不確実性のために、JVMは、ターゲットメソッドが呼出されるランタイムにおいてのみターゲットメソッドの正しいアドレスを決定することが可能であり、従って、コールを行うメソッドをコンパイルし且つその実行可能なコードをメモリ内に格納した後に、メモリ内に格納されているターゲットメソッドのメソッドブロックにおいてルックアップを実施することにより、コールを行うメソッドが実際にターゲットメソッドを呼出す度にターゲットメソッドのアドレスを決定せねばならない。(ロードされたメソッドのメソッドブロックは、典型的に、該メソッドのタイプを表示し且つ該メソッドに関するその他のランタイム情報を格納する。)
ターゲットメソッドを呼出すこのアプローチは、パイプライン型アーキテクチャを有するコンピュータプロセッサに関し著しい低速化を発生する場合がある。このようなプロセッサにおいては、該プロセッサがデコードし、実行し、又は前の命令からの結果を書込みをしている間に、その後の命令をルックフォワードし且つプリフェッチするためにパイプラインが使用される。このように、パイプライン型プロセッサは幾つかの命令を並列的に処理し且つ実行している場合があり、例えば、第一命令の結果がメモリへ又はレジスタへ書込まれている間に、該プロセッサが第二命令を実行し、第三命令をデコードし、且つ第四命令をフェッチする。ターゲットメソッドを呼出す上のアプローチにおいて、コールを行うメソッドがコンパイルされる時におけるターゲットメソッドのアドレスの不確実性は、プロセッサをしてコールを行うメソッドの実行期間中に誤った命令をプリフェッチさせる場合があり、そのことは該プロセッサをしてそのパイプラインをフラッシュさせることとなる。然しながら、プロセッサパイプラインをフラッシュさせることはプロセッササイクルを浪費させ且つ実行の低速化を発生させる。
例えば、ターゲットメソッドを呼出すコールを行うメソッドのコードをコンパイルしている場合に、間接参照を使用することが必要である。何故ならば、そのターゲットメソッドがターゲットメソッドがコールされる時にコンパイルされるか否かが知られていないからである。幾つかのプロセッサアーキテクチャにおいては、間接参照を介してターゲットメソッドを呼出すためにコールを行うメソッドのコンパイルされたコードにおいて以下の1組の命令を使用する場合がある。
Figure 2007234022
上の命令のうちの最初のもの(「mov lr,cp」)は、ターゲットメソッドが実行を終了した後に実行が継続する戻りアドレスとしてプログラムカウンタ「pc」の値を格納する。例えば、ARMプロセッサアーキテクチャ上で、プログラムカウンタ「pc」は現在の命令+8のアドレスを包含している場合がある。第二命令(「ldr pc,[a0]」)はメモリ内のターゲットメソッドのメソッドブロックの第一ワードからターゲットメソッドの現在のアドレスをプログラムカウンタ内にロードする。実行時に該ターゲットメソッドがコンパイルされると、ターゲットメソッド(ターゲットメソッドのメソッドブロックの第一ワード内に格納されているように)の現在のアドレスはコードキャッシュ内のターゲットメソッドのアドレスであり、ターゲットメソッドがコンパイルされていない場合には、ターゲットメソッドの現在のアドレスは実行をインタプリタへリダイレクトさせる何等かのヘルパーグルーコード(helper glue code)のアドレスである。ターゲットメソッドを呼出すための上の1組の命令は、パイプラインを具備するプロセッサ上ではその動作が劣ったものとなる。何故ならば、プロセッサは、間接参照を行うためにターゲットメソッドの現在のアドレスをルックアヘッドし且つ決定することができないからである。このことは、ターゲットメソッドが呼出される度に完全なプロセッサパイプラインのフラッシュを発生させる場合があり、且つ浪費されるプロセッササイクルの数はパイプライの深さに等しいものである場合がある。
プロセッサパイプラインフラッシュの機会を減少させるために、ターゲットメソッド呼出しに対する過去のアプローチは既にコンパイルされているターゲットメソッドに対する直接的なメソッドコールを行うことに依存していた。然しながら、コンパイルされているターゲットメソッドがコンパイルされている状態からコンパイルされていない状態へ状態を変化させる場合に問題が発生する。何故ならば、ターゲットメソッドがデコンパイルされた後に、このターゲットメソッドを呼出すコールを行うメソッドにおける直接的なコールは最早正しいアドレスを指し示すものではないからである。この問題を解決するために、過去のアプローチは、典型的に、コンパイルされているコールを行うメソッドの強制的デコンパイルに依存していた。強制的デコンパイルは、ターゲットメソッドの状態が変化する場合には(例えば、ターゲットメソッドがオーバーライドされるか又はデコンパイルされる場合には)、そのターゲットメソッドを直接的に呼出すための命令を包含する全てのコンパイルされているメソッドをデコンパイルさせるものである。
然しながら、強制的デコンパイルは幾つかの顕著な欠点を有している。1つの欠点は、特に現在実行中であるメソッドに対して、強制的デコンパイルをインプリメントすることは困難である。強制的デコンパイルの別の欠点は、メモリ及び使用中のプロセッササイクルの観点において非常にコスト高であることである。メソッドがデコンパイルされると、このメソッドを呼出す他の全てのコンパイルされているメソッドは必然的にデコンパイルされねばならない。従って、単一のターゲットメソッドの状態変化がかなりの数のコンパイルされているメソッドの一連のデコンパイルを発生させる場合がある。更に、頻繁に呼出されるデコンパイルされたメソッドは究極的にリコンパイルされねばならず、そのことはメモリ及びプロセッササイクル等の資源を付加的に使用することとなる。
本発明は、以上の点に鑑みなされたものであって、上述した如き従来技術の欠点を解消し、改良したメソッドをコールする技術を提供することを目的とする。特に、本発明は、プロセッサのパイプラインをフラッシュさせることがなく、且つ強制的デコンパイルの欠点を回避することが可能な技術を提供するものである。
メソッドのより速い呼出しを可能とするために、本発明の1つの実施例は、ターゲットメソッドを呼出すコンパイルされているコールを行うメソッドの実行可能なコードにおける命令のパラメータを修正する技術を提供する。ターゲットメソッドを呼出す命令のパラメータは、任意の与えられた時間におけるターゲットメソッドの現在の状態を反映するために維持されている。該パラメータは、例えば、その命令と関連しているオプコード(opcode)、その命令と関連しているオペランド、及び1個のオプコードと1個又はそれ以上のオペランドとの組合わせ等のその命令と関連する任意のデータとすることが可能である。ターゲットメソッドの状態変化に応答して、コンパイルされているコールを行うメソッドにおける命令のパラメータはターゲットメソッドの現在の状態を反映するために修正される。従って、本明細書において記載する技術は、従来のアプローチよりも一層高速である。何故ならば、コールを行うメソッドをデコンパイルすることは必要ではなく且つターゲットメソッドのメソッドブロックにおける付加的なメモリルックアップを行うことはないからである。
本明細書に記載する技術に従って、コンパイルされているコールを行うメソッドはターゲットメソッドを呼出すための命令を包含している。そのターゲットメソッドが仮想メソッドであるか、又は非仮想又は静的メソッドであるかに基づいて、ターゲットメソッドに対して6個の可能な状態が存在している。
(1)非仮想/静的:コンパイルされている
(2)非仮想/静的:コンパイルされていない
(3)仮想:オーバーライドされており且つコンパイルされている
(4)仮想:オーバーライドされており且つコンパイルされていない
(5)仮想:オーバーライドされておらず且つコンパイルされている
(6)仮想:オーバーライドされておらず且つコンパイルされていない
該命令と関連しているパラメータは、その現在の状態におけるターゲットメソッドの実行を容易化するために常に正しいアドレスを反映する。ターゲットメソッドが状態(1)又は(5)にある場合には、該パラメータは、そのターゲットメソッドの実行が開始するコードキャッシュ内のアドレスを表わす。ターゲットメソッドが状態(2)にある場合には、該パラメータはターゲットメソッドのアンコンパイルされているバージョンをしてインタプリタにより実行させる1組のコードを参照する。ターゲットメソッドが状態(3),(4)又は(6)にある場合には、該パラメータは仮想メソッドを呼出すための1組のコードを参照する。
1実施例においては、本明細書に記載する高速のパッチベースメソッド呼出し用の技術は、コールを行うメソッドの実行可能なコードから非仮想及び静的ターゲットメソッドの両方に対するコールをパッチング(patching)させる。この実施例においては、パラメータを有する直接的ブランチアンドリンク(branch−and−link)命令がターゲットメソッドを呼出すためにコールを行うメソッドの実行可能なコード内にコンパイルされる。ターゲットメソッドが現在コンパイルされており且つコードキャッシュ内に格納されている場合には、該ブランチアンドリンク命令パラメータは、ターゲットメソッドの実行が開始するコードキャッシュにおけるアドレスを表わす。ターゲットメソッドがデコンパイルされ且つコードキャッシュから除去されることに応答して、該ブランチアンドリンク命令パラメータの値は、ターゲットメソッドのアンコンパイルされたバージョンをしてインタプリタにより実行させる1組のコードを参照するために修正される。
1実施例においては、本明細書に記載する高速のパッチベースメソッド呼出し用の技術は、又、コールを行うメソッドの実行可能なコードから仮想ターゲットメソッドに対してコールをパッチングさせる。この実施例においては、直接的ブランチアンドリンク命令がコールを行うメソッドの実行可能なコードにおいて使用されて仮想ターゲットメソッドを呼出す。本明細書に記載する該技術に従って、仮想ターゲットメソッドを呼出す直接的ブランチアンドリンク命令は、ターゲットメソッドがそのコンパイル状態(例えば、コンパイルされているか又はアンコンパイルされている)又はそのオーバーライド状態(例えば、オーバーライドされているか又はオーバーライドされていない)のうちの少なくとも1つ又はそれ以上における変化を経験する場合にパッチさせることが可能である。直接的ブランチアンドリンク命令は、該命令のパラメータを修正することによりパッチ(patch)させることが可能であり、そのパラメータは仮想ターゲットメソッドの現在の状態を反映する態様でセットされ且つ修正される。ターゲットメソッドが少なくとも1つのその他のメソッドにより現在オーバーライドされている場合には、該パラメータの値は仮想メソッドを呼出すことが可能な1組のコードを参照するためにセットされる。仮想メソッドを呼出す1組のコードは、実行されると、実行されるべきターゲットメソッド(例えば、オリジナルのターゲットメソッド又はオーバーライドメソッド)の識別を決定し且つその識別されたメソッドの実行を容易化させる。例えば、直接的ブランチアンドリンク命令が実行される場合にその識別されたターゲットメソッドがデコンパイルされる場合には、仮想メソッドを呼出す該1組のコードは、実行される場合に、ターゲットメソッドをしてインタプリタにより実行させる。その識別されたターゲットメソッドがコンパイルされ且つコードキャッシュ内に格納されると、仮想メソッドを呼出す該1組のコードは、実行される場合に、実行をコードキャッシュ内のターゲットメソッドの実行可能なコードの始めへ転送させる。仮想ターゲットメソッドがその他のメソッドにより現在オーバーライドされておらず且つ現在コンパイルされており且つコードキャッシュ内に格納されている場合には、該パラメータの値はコードキャッシュ内のターゲットメソッドの実行可能なコードの始めを表わす。仮想ターゲットメソッドがそのコンパイル状態及び/又はそのオーバーライド状態のいずれかにおける状態変化を経験することに応答して、直接的ブランチアンドリンク命令は、上述した如くターゲットメソッドの現在の状態を反映させるためにそのパラメータの値を修正することによりパッチさせることが可能である。
概観
本明細書に記載する高速のパッチベース(patch−based)メソッド呼出し(method invocation)用の技術は、間接参照の代わりにコンパイルされているコールを行うメソッドからの直接的なメソッドコール(method call)を利用する。異なるプロセッサアーキテクチャは、これらに制限されるものではないが、ブランチアンドリンク命令、ジャンプ命令、及びジャンプアンドリンク命令を包含する直接的なコールを容易化させるために使用することが可能な異なる命令又はタイプの命令を与える場合がある。従って、コンパイルされているコールを行うメソッドからの直接的なメソッドコールを容易化させるために以下に記載する命令は、制限的な意味ではなく例示的なものとして理解されるべきである。
幾つかの実施例において、直接的ブランチアンドリンク命令は、ターゲットメソッドを呼出すためにコールを行うメソッドのコンパイルされているコードにおいて使用される。本明細書において使用されるように直接的ブランチアンドリンク命令とは、通常、プロセッサによって実行される場合に、その命令により特定されるパラメータに基づいて実行を直接的に分岐させる命令のことを意味している。特定のプロセッサアーキテクチャに依存して、直接的ブランチアンドリンク命令において特定されるパラメータは、例えば、ラベル、命令ポインタ、レジスタ、及びプログラムスタック上のアドレス等のいずれかの参照とすることが可能である。幾つかの実施例において、このような命令と関連するパラメータは、該命令と関連するオプコード、該命令と関連するオペランド、又は1個のオプコードと1個又はそれ以上のオペランドとの組合わせとすることが可能である。本明細書に記載する技術に従って、直接的ブランチアンドリンク命令において特定されるパラメータは、ターゲットメソッドの実行を容易化させるための正しいアドレスを表わすために維持される。例えば、ターゲットメソッドがコンパイルされると、そのパラメータはコードキャッシュ内のターゲットメソッドの開始アドレスを表わし、ターゲットメソッドがコンパイルされていない場合には、そのパラメータはターゲットメソッドのアンコンパイルされているバージョンをしてインタプリタ的に実行させる1組のコードのアドレスを表わし、ターゲットメソッドが別のメソッドによりオーバーライドされている場合には、該パラメータは直接的ブランチアンドリンク命令が実行された後にどのメソッドを呼出すべきかを決定する1組のコードのアドレスを表わす。ターゲットメソッドが状態変化を経験する場合に(例えば、ターゲットメソッドがデコンパイルされる場合、又はターゲットメソッドの状態がいずれかその他のメソッドによりオーバーライドされていない状態から別のメソッドによりオーバーライドされている状態へ変化する場合)、コールを行うメソッドのコンパイルされているコードにおける直接的ブランチアンドリンク命令は、その現在の状態においてターゲットメソッドの実行を容易化するために正しいアドレスを表わすために該パラメータを修正することによりパッチされる。このように、コールを行うメソッドは、ターゲットメソッドが状態を変化させる場合にデコンパイルされることはない。同時に、ターゲットメソッドの実行を実際に容易化させる直接的ブランチアンドリンク命令は、正しいその後の命令を表わし、そのことは該ブランチアンドリンク命令が実行されるずっと前にプロセッサがそのパイプライン内のこれらのその後の命令をプリフェッチすることを可能とする。従って、本明細書に記載する高速のパッチベースメソッド呼出し用の技術は従来のアプローチよりも一層高速である。何故ならば、コールを行うメソッドはデコンパイルされることは必要ではなく、且つターゲットメソッドのメソッドブロックにおける付加的なメモリルックアップは実施されないからである。
図1は本明細書に記載する高速のパッチベースメソッド呼出し用の技術の1実施例をインプリメントすることが可能なシステムの機能的ブロック図である。例示的な目的のために、JVMを参照して1つの実施例について説明する。然しながら、理解すべきことであるが、本明細書に記載する高速のパッチベースメソッド呼出し用の技術はJVMにおいてのみインプリメントされることに制限されるものではない。そうではなく、本明細書において教示する概念及び技術は、オブジェクト指向型クラスのインスタンスを動的にコンパイルし且つインタプリタ的に実行することが可能な任意のプロセス又は仮想マシンに対して適用することが可能である。
図1を参照すると、システム100はオペレーティングシステム102の上で実行を行うJVM104を有している。オペレーティングシステム102は、これらに制限されるものではないが、ユニックス(Unix)オペレーティングシステム(例えば、サンマイクロシステムズインコーポレイテッドにより開発されたソラリス(Solaris)OS)、リナックス(Linux)オペレーティングシステム(例えば、デビアン(Debian))、及びウインドウズ(Windows)オペレーティングシステム(例えば、マイクロソフトコーポレイションにより開発されたウインドウズXP)を包含する任意のタイプのオペレーティングシステムとすることが可能である。オペレーティングシステム102はシステム100内のその他のコンポーネントに依存する低レベル機能性を提供する。
JVM104はインタプリタ106、動的適応型コンパイラ(DAC)108、コードキャッシュ105を有するプロセスである。図1はこれらのコンポーネント105,106,108をJVM104の一部として示しているが、そのように所望される場合には、これらのコンポーネントはJVM104とは別個にインプリメントさせることが可能であることを注意すべきである。インタプリタ106は、JVM104による実行のためにサポートされるジャバ(Java)アプリケーション又はその他のジャバをベースとしたコードをインタプリタ的に実行する。DAC108はJVMにより頻繁に実行されるメソッドをコンパイルし且つコードキャッシュ105内に格納するためにJVM104により使用される。コードキャッシュ105は実行可能なコードを格納するためのメモリ又はその他の格納部における1つの領域である。異なる実施例においては、システム100は各JVMがそれ自身のコンポーネントを有している状態でオペレーティングシステム102の上で複数個のJVMプロセスを実行することが可能である。然しながら、説明の便宜上、単に1個のこのようなJVM及びそのコンポーネントのみが図1において図示されている。インタプリタ106及び動的コンパイラ108は、例えば、プロセス又はスレッド等の種々の実行エンティティとしてJVM104内において実行することが可能である。コードキャッシュ105は任意のタイプのメモリ、又は実行可能なコードを格納するためにJVM104によって使用することが可能なその他のタイプの高速格納部とすることが可能である。従って、JVM104及び図1に図示されているその他のコンポーネントは、制限的な意味ではなく例示的なものとして理解すべきである。
1実施例によれば、JVM104は本明細書において記載する高速のパッチベースメソッド呼出し用の技術をインプリメントする。この実施例においては、JVM104はコールを行うメソッドを実行可能なコードへコンパイルさせ且つその実行可能なコードをコードキャッシュ105内に格納させるためにDAC108を使用する。JVM104は、又、コールを行うメソッドにより呼出すことが可能なターゲットメソッドの状態を現在の状態から異なる新たな状態へ変化させるための1つ又はそれ以上の組のコード又はその他の論理を包含している。ターゲットメソッドにより経験される状態変化に応答して、JVM104内の1組のコード又はその他の論理がコールを行うメソッドの実行可能なコードからターゲットメソッドを呼出す命令を探し出し且つターゲットメソッドの実行を容易化させるために現在のアドレスを表わすためにその命令により特定されるパラメータをパッチさせる。
非仮想及び静的メソッドの呼出し
本明細書に記載する高速のパッチベースメソッド呼出し用の技術は、コールを行うメソッドの実行可能なコードから非仮想及び静的ターゲットメソッドの両方に対してコールをパッチさせる。本明細書に記載する技術は非仮想及び静的ターゲットメソッドの両方に対して同一の態様で適用可能である。何故ならば、非仮想及び静的ターゲットメソッドの両方は、コールを行うメソッドがコンパイルされる時に決定することが可能だからである。
1実施例において、ターゲットメソッドを呼出すためにコールを行うメソッドの実行可能なコードにおいて直接的ブランチアンドリンク命令を使用する。以下のものはコンパイルされており且つコードキャッシュ内に格納されているターゲットメソッドを呼出すためのこのような命令の1つの例である。
Figure 2007234022
上の命令において、命令パラメータ「<target method pc>」はターゲットメソッドの実行が開始するコードキャッシュにおけるアドレスを表わす値である。ターゲットメソッドがデコンパイルされ且つコードキャッシュから除去されることに応答して、上の命令は以下の如くにパッチされる。
Figure 2007234022
この命令パラメータ「<invokeInterpreter>」は、ターゲットメソッドのアンコンパイルされたバージョンをしてインタプリタにより実行させる1組のコードを参照する値である。この実施例の例示において、図2Aはターゲットメソッドがコンパイルされた状態への変化を経験した場合のコードキャッシュを図示するブロック図であり、図2Bはターゲットメソッドがコンパイルされていない状態への変化を経験した場合のコードキャッシュを図示するブロック図である。(コンパイルされていない状態は、又、本明細書においては、アンコンパイルされた状態とも呼称する。)
図2Aを参照すると、コードキャッシュ105が図示されている。コールを行うメソッド202及びターゲットメソッド208の実行可能なコードはコードキャッシュ105内に格納されている。省略記号211により示されるように、1つ又はそれ以上のその他のコンパイルされているメソッド又はその他の実行可能なコードもコードキャッシュ105内に格納させることが可能である。コールを行うメソッド202はターゲットメソッド208を呼出すための直接的ブランチアンドリンク命令204を有している。命令204はコードキャッシュ105内のターゲットメソッド208の実行可能なコードの始めを参照するパラメータ206を有している。
コールを行うメソッド202がコンパイルされた後に、パラメータ206の値はターゲットメソッドが丁度コンパイルされ且つコードキャッシュ105内に格納された場合にターゲットメソッドの状態変化に応答してターゲットメソッド208の実行可能なコードの始めを参照するためにセットさせることが可能である。パラメータ206の値は、又、コールを行うメソッド202がコンパイルされている時にターゲットメソッド208が既にコンパイルされており且つコードキャッシュ105内に格納されている場合にターゲットメソッド208の実行可能なコードの始めを参照するためにセットさせることが可能である。
次に図2Bを参照すると、コードキャッシュ105はコールを行うメソッド202の実行可能なコード、及び省略記号211により示したようにその他の実行可能なコードを格納する。ターゲットメソッド208はコンパイルされていない状態にあり且つコードキャッシュ105内に格納されていない。直接的ブランチアンドリンク命令204の命令パラメータ206が1組のコード210を参照する値を格納しており、該コードは、実行された場合に、実行をインタプリタへ遷移させ、次いで、該インタプリタはアンコンパイルされているターゲットメソッドを実行する。(invokeInterpreterコード210は、基礎となるJVMの特定のインプリメンテーションに依存してコードキャッシュ105内に存在する場合があるか又は存在しない場合のあるヘルパーグルーコードであり、説明の便宜上、図2Bにおいては、このinvokeInterpreterコードはコードキャッシュ105の外側に図示してある。)
コールを行うメソッド202がコンパイルされた後に、パラメータ206の値は、ターゲットメソッドが丁度デコンパイルされ且つコードキャッシュ105から除去された場合の状態変化に応答してinvokeInterpreterコード210を参照するためにセットさせることが可能である。パラメータ206の値は、又、コールを行うメソッド202がコンパイルされている時にターゲットメソッド208がコンパイルされていない状態にある場合にinvokeInterpreterコード210を参照するためにセットさせることが可能である。
一般的に、コールを行うメソッドがコンパイルされる時に、ターゲットメソッドの状態(例えば、コンパイルされているか又はコンパイルされていないか)に関して決定が行われる。ターゲットメソッドがコンパイルされておらず且つコードキャッシュ内に格納されていない場合には、コールを行うメソッドの実行可能なコードにおける命令(例えば、図2A及び2Bにおける直接的ブランチアンドリンク命令206)はターゲットメソッドのアンコンパイルされているバージョンをしてインタプリタ的に実行させる1組のコードを参照するパラメータを有している(例えば、図2Bにおけるパラメータ206)。後にターゲットメソッドが、コンパイルされ且つコードキャッシュ内に格納される状態変化を経験すると、該命令はコードキャッシュ内のターゲットメソッドの実行可能なコードの始めを参照するパラメータ値でパッチされる(例えば、図2Aにおけるパラメータ206)。
コールを行うメソッドがコンパイルされている時にターゲットメソッドが既にコンパイルされており且つコードキャッシュ内に格納されている場合には、コールを行うメソッドの実行可能なコードにおける命令(例えば、図2A及び2Bにおける直接的ブランチアンドリンク命令206)は、コードキャッシュにおけるターゲットメソッドの実行可能なコードの始めを参照するパラメータ(例えば、図2Aにおけるパラメータ206)を有している。後にターゲットメソッドがデコンパイルされ且つコードキャッシュから除去される場合に、該命令はターゲットメソッドのアンコンパイルされているバージョンをしてインタプリタ的に実行させる1組のコードを参照するパラメータ値でパッチされる(例えば、図2Bにおけるパラメータ206)。
図4Aは1実施例に基づいて静的又は非仮想ターゲットメソッドに対するコールを包含するコールを行うメソッドのコンパイルを例示したフローチャートである。ステップ402において、コールを行うメソッドがコンパイルされる。コールを行うメソッドをコンパイルする一部として、ステップ404において、コールを行うメソッドにより呼出されるべきターゲットメソッドがコンパイルされているか又はコンパイルされていないかについての決定が行われる。
ステップ404において、ターゲットメソッドがコンパイルされているものと決定される場合には、ステップ406において、コールを行うメソッドの実行可能なコードからターゲットメソッドを呼出す該命令のパラメータがコードキャッシュにおけるターゲットメソッドの実行可能なコードの始めのアドレスを参照すべくセットされる。ステップ404において、ターゲットメソッドがコンパイルされていないことが決定される場合には、ステップ408において、ターゲットメソッドを呼出す命令のパラメータがinvokeInterpreterコードのアドレスへセットされ、該コードは、実行される場合に、実行をインタプリタへ遷移させ、該インタプリタがターゲットメソッドを実行する。
ステップ409において、コールを行うメソッドが他の静的又は非仮想ターゲットメソッドに対するその他のコールを包含しているか否かが決定される。コールを行うメソッドがその他の静的又は非仮想ターゲットメソッドへのコールを包含している場合には、これらのその他の静的又は非仮想ターゲットメソッドに対するコールを行うメソッドにおける全てのコールに対してステップ404乃至408が繰返される。静的又は非仮想ターゲットメソッドに対するコールを行うメソッドにおける全てのコールがこのような態様で処理された後に、ステップ410において、コンパイルされたコールを行うメソッドがコードキャッシュ内に格納される。
図4Bは1実施例に基づいてコールを行うメソッドのコールを非仮想又は静的ターゲットメソッドに対してパッチングする状態を例示したフローチャートである。ステップ412において、ターゲットメソッドの状態に対する変化が行われる。例えば、ステップ412において、ターゲットメソッドはコンパイルされた状態からコンパイルされていない状態への状態変化を経験する場合がある。代替的に、ステップ412において、ターゲットメソッドはアンコンパイルされた状態からコンパイルされた状態への状態変化を経験する場合がある。
ターゲットメソッドに対してなされる状態変化に応答して、ステップ414は、例えば、図4Aのステップ402においてコンパイルされるコールを行うメソッド等の全てのコールを行うメソッドにおけるターゲットメソッドに対するパッチ可能なコールにわたって繰返す。コールを行うメソッドにおける各パッチ可能なコールに対して、図4Bのステップ416において、ターゲットメソッドを呼出す命令がそのコールを行うメソッドの実行可能なコードにおいて見つけられる。その命令が見つけられた後に、ステップ418において、その命令のパラメータはターゲットメソッドの新たな状態を反映するために修正される。ターゲットメソッドがコンパイルされた状態からコンパイルされていない状態への変化を経験した場合には、該命令のパラメータの値はinvokeInterpreterコードを参照するために変化される。ターゲットメソッドがコンパイルされていない状態からコンパイルされている状態への変化を経験した場合には、該パラメータの値はコードキャッシュにおけるコンパイルされているターゲットメソッドの実行可能なコードのはじめを参照すべく変化される。
ステップ419において、同一の又はその他のコールを行うメソッドにおいてターゲットメソッドを呼出すためのその他のパッチ可能なコールが存在するか否かが決定される。更なるパッチ可能なコールが存在する場合には、コールを行うメソッドにおけるこれらのパッチ可能なコールに対してステップ416及び418が実施される。ステップ419において、ターゲットメソッドに対する全てのパッチ可能なコールが修正されたことが決定される場合には、ステップ420がその他の処理で継続する。
非仮想及び静的メソッドコールのトラッキング
1実施例においては、本明細書に記載する高速のパッチベースメソッド呼出し用の技術をインプリメントすることは、複数個のコンパイルされているコールを行うメソッドからターゲットメソッドへの直接的な参照をトラッキング即ち追跡することが関与する。コンパイルされているコールを行うメソッドからターゲットメソッドへの直接参照はターゲットメソッドを呼び出すためのコンパイルされているコールを行うメソッドの実行可能なコードにおいて使用される命令のパラメータとすることが可能である。該直接参照は、ターゲットメソッドとコンパイルされているコールを行うメソッドにおける特定の命令の位置との間の関連性としてメモリ又はその他の格納部内に記録させることが可能である。
例えば、ターゲットメソッドとコンパイルされているコールを行うメソッドにおける命令との間に関連性を記録することが可能であり、その場合に該関連性はコールを行うメソッドの実行可能なコードにおける命令の位置を表わす。ターゲットメソッドが状態変化(例えば、コンパイルされている状態からアンコンパイルされている状態)を経験する場合に、コールを行うメソッドの実行可能なコードにおける命令を識別し且つ見つけるために該関連性が使用される。該命令がこのような態様で識別され且つ見つけられた後に、該命令は、ターゲットメソッドの新たな状態を反映するために該命令のパラメータを変化させることによりパッチさせることが可能である。
ターゲットメソッドと該ターゲットメソッドを呼出すコンパイルされているコールを行うメソッドにおける命令との間の関連性をトラッキングすることは、該関連性を格納するためのメモリ又はその他の格納部内にデータ構造を与え且つ該データ構造における情報を見つけるためのルックアップメカニズムを与えることによりインプリメントすることが可能である。例えば、該データ構造はハッシュテーブルとすることが可能であり、且つターゲットメソッドとコンパイルされているコールを行うメソッドにおける命令との間の特定の関連性を該ハッシュテーブルにおいて見つけるためにハッシュ関数を使用することが可能である。
1実施例においては、コンパイルされているコールを行うメソッドの実行可能なコードにおける命令とターゲットメソッドとの間の関連性を表わす情報と共にパッチレコード(記録)をデータ構造内に格納することが可能である。更に、該パッチレコードは、又、ターゲットメソッドが状態変化を経験する場合に該命令の1つ又はそれ以上のパラメータを修正するために実際に使用されるパッチ用データを包含することが可能である。更に、パッチレコードは、又、該パッチレコードの特定のタイプを表わす情報を包含することが可能である。例えば、該パッチレコードの1つ又はそれ以上のビット又はバイトが、ターゲットメソッド状態変化のタイプを表わすことが可能であり、それに応答して、パッチ用データを使用して例えばコンパイル状態変化等のコールを行うメソッドの命令をパッチする。
更に、本明細書に記載する高速のパッチベースメソッド呼出し用の技術をインプリメントすることは、又、コールを行うメソッドがデコンパイルされる場合にターゲットメソッドとコンパイルされているコールを行うメソッドにおける命令との間の関連性を除去することが関与する場合がある。
1実施例においては、このような関連性の除去は、特定のデコンパイルされたコールを行なうメソッドの命令と1つ又はそれ以上のターゲットメソッドとの間において構成された全ての関連性のリストをトラバースすることによりインプリメントすることが可能である。この実施例においては、ターゲットメソッドに対する全ての関連性のリストが、特定のデコンパイルされたコールを行うメソッドの識別に基づいて決定される。特定のデコンパイルされたメソッドに対する関連性のリストが決定されると、該リスト上の関連性はそれらが記録されているメモリ又はその他の格納部から除去される。
別の実施例においては、ターゲットメソッドとコンパイルされているコールを行うメソッドにおける命令との間の関連性の除去は全ての記録されている関連性をトラバースすることによりインプリメントすることが可能である。この実施例においては、各関連性に対して、その関連性により反映されるコールを行うメソッドがデコンパイルされたか否かについての決定が行われ、且つそのコールを行うメソッドがデコンパイルされている場合には、その関連性がそれが記録されているメモリ又はその他の記録部から除去される。
仮想メソッドの呼出し
本明細書に記載する高速のパッチベースメソッド呼出し用の技術は、コールを行うメソッドの実行可能なコードから仮想ターゲットメソッドに対してコールをパッチさせる。オブジェクト指向型プログラミングにおいては、仮想メソッドはベースクラスにおけるメソッドであって、そのベースクラスのサブクラスにおいてインプリメントされている別のメソッドによりオーバーライドされることが許可されるメソッドである。典型的に、仮想ターゲットメソッドのアイデンティティ即ち識別は、コールを行うメソッドが実行されるまで不知である。何故ならば、呼出しを行うオブジェクトのインスタンスタイプ(従って、呼出されるべきオーバーライドメソッドの識別)はランタイムにおいてのみ決定することが可能だからである。
非仮想メソッドの高速パッチベース呼出しに対する上述した技術と同様に、1実施例においては、仮想ターゲットメソッドを呼出すためにコールを行うメソッドの実行可能なコードにおいて直接的ブランチアンドリンク命令が使用される。本明細書に記載する技術に従って、仮想ターゲットメソッドを呼出す直接的ブランチアンドリンク命令は、ターゲットメソッドがそのコンパイル状態(例えば、コンパイルされているか又はコンパイルされていないか)及びそのオーバーライド状態(例えば、オーバーライドされているか又はオーバーライドされていないか)のうちの少なくとも1つ又はそれ以上において変化を経験する場合にパッチさせることが可能である。以下のものは仮想ターゲットメソッドを呼出すためのこのような直接的ブランチアンドリンク命令の1例である。
Figure 2007234022
命令パラメータ「」の値は、仮想ターゲットメソッドの現在の状態を反映する態様でセットされ且つ修正される。ターゲットメソッドが現在少なくとも1つの他のメソッドによりオーバーライドされている場合には、パラメータ「」の値は仮想メソッド呼出しを実施することが可能な1組のコードを参照すべくセットされる。仮想メソッドの仮想呼出しを実施することが可能な1組のコードは本明細書においては「invokeVirtual」コードと呼称する。invokeVirtualコードは、実行されると、実行されるべきターゲットメソッド(例えば、呼出しを行うオブジェクトのインスタンスタイプに基づいて、オリジナルターゲットメソッド又はオーバーライドメソッド)のアイデンティティ即ち識別を決定し且つ識別したメソッドの実行を容易とさせる。例えば、上の命令が実行される場合に識別されたターゲットメソッドがコンパイルされていない場合には、invokeVirtualコードは、実行されると、ターゲットメソッドをしてインタプリタにより実行させる。識別されたターゲットメソッドがコンパイルされており且つコードキャッシュ内に格納されている場合には、invokeVirtualコードは、実行されると、実行をコードキャッシュ内のターゲットメソッドの実行可能なコードの始めへ転送させる。
コールを行うメソッドが初期的にコンパイル中である場合には、仮想ターゲットメソッドが(1)コンパイルされており且つコードキャッシュ内に格納されており、且つ(2)いずれかその他のメソッドによりオーバーライドされていない場合には、上の直接的ブランチアンドリンク命令におけるパラメータ「」はコードキャッシュ内のターゲットメソッドの実行可能なコードの始めを参照する値へ初期的にセットされる。後の点において仮想ターゲットメソッドがそのコンパイル状態及び/又はそのオーバーライド状態のうちのいずれかにおいて状態変化を経験する場合には、上の直接的ブランチアンドリンク命令は、invokeVirtualコードを参照するためにパラメータ「」の値を修正することによりパッチさせることが可能である。そうでない場合には、コールを行うメソッドが初期的にコンパイル中である場合にターゲットメソッドが少なくとも1つのその他のメソッドによりオーバーライドされている場合には、幾つかの実施例において、ターゲットメソッドの仮想呼出しを実施するために1組のインラインコードが発生される。これらの実施例においては、後の点において仮想ターゲットメソッドが何等かの状態変化を経験する場合に、パッチングが試みられることはない。何故ならば、該1組のインラインコードは高速で実行を行い且つ該メソッドがオーバーライドされたままである間により良い性能を与えるからである。コールを行うメソッドが初期的にコンパイル中である場合にターゲットメソッドがコンパイルされておらず且ついずれかその他のメソッドによりオーバーライドされていない場合には、上の直接的ブランチアンドリンク命令におけるパラメータ「」はinvokeVirtualコードのアドレスにセットされる。後の点において、仮想ターゲットメソッドがそのコンパイル状態において変化を経験し且つコンパイルされることになるが、いずれかその他のメソッドにより未だにオーバーライドされていない場合には、上の直接的ブランチアンドリンク命令は、ターゲットメソッドの新たな状態を反映するためにパラメータ「」の値を修正することによりパッチされる(例えば、ターゲットメソッドはその新たな状態においてコンパイルされるので、パラメータ「」の値はキャッシュコード内のターゲットメソッドの実行可能なコードの始めにセットさせることが可能である)。
図3はターゲットメソッドがオーバーライドされておらず且つコンパイルされていない仮想メソッドである場合の1実施例に基づくコードキャッシュを例示したブロック図である。図3において、コールを行うメソッド302の実行可能なコードがコードキャッシュ105内に格納されている。省略記号311により示されるように、1つ又はそれ以上のその他のコンパイルされたメソッド又はその他の実行可能なコードもコードキャッシュ105内に格納することが可能である。コールを行うメソッド302は仮想ターゲットメソッドを呼出すための直接的ブランチアンドリンク命令304を有している。図3はターゲットメソッドがコンパイルされておらず且ついずれかのその他のメソッドによりオーバーライドされていない仮想ターゲットメソッドの状態を反映している。命令304は1組のinvokeVirtualコード310を参照するパラメータ306を有している。invokeVirtualコード310はヘルパーグルーコードであり、それは基礎となるJVMの特定のインプリメンテーションに依存してコードキャッシュ105内に存在する場合も存在しない場合もある。(説明の便宜上、図3においては、invokeVirtualコードはコードキャッシュ105の外側に図示してある。)実行されると、invokeVirtualコード310はターゲットメソッドの仮想呼出しを実施する。例えば、ターゲットメソッドがコンパイルされていない場合には、実行はインタプリタへ転送され、該インタプリタが該メソッドのアンコンパイルされているバージョンを実行する。幾つかの実施例においては、仮想ターゲットメソッドが、新たな状態においてターゲットメソッドがコンパイルされており且つコードキャッシュ105内に格納されているように状態変化を経験することに応答して、パラメータ306の値は、コードキャッシュ内のターゲットメソッドの実行可能なコードの始めを参照するように修正させることが可能である。
幾つかの実施例においては、コールを行うメソッドが初期的にコンパイルされている場合に仮想ターゲットメソッドが少なくとも1つのその他のメソッドによりオーバーライドされる場合には、ターゲットメソッドの仮想呼出しを実施するためにコールを行うメソッドの実行可能なコードにおいて1組のインラインコードが発生される。これらの実施例においては、後に仮想ターゲットメソッドが、ターゲットメソッドが最早いずれかその他のメソッドによりオーバーライドされるものではないように状態変化を経験する場合であっても、パッチングが試みられることはない。何故ならば、ターゲットメソッドが一度オーバーライドされると、それは、通常、オーバーライドされたままであり、且つターゲットメソッドがオーバーライドされたままである間はインラインコードはターゲットメソッドのより速い呼出しを発生し且つターゲットメソッドの状態変化をトラッキングするために処理資源を費消することを開始する。
図4Cは1実施例に基づいて仮想ターゲットメソッドに対するコールを包含するコールを行うメソッドのコンパイルを例示したフローチャートである。ステップ422において、コールを行うメソッドがコンパイルされる。コールを行うメソッドをコンパイルする一部として、ステップ423において、コールを行うメソッドにより呼出されるべき仮想ターゲットメソッドが1つ又はそれ以上のその他のメソッドによりオーバーライドされるか否かが決定される。
ステップ423において、仮想ターゲットメソッドが少なくとも1つのその他のメソッドによりオーバーライドされることが決定される場合には、ステップ425において、1組のインラインコードが発生され且つコールを行うメソッド内に挿入される。該1組のインラインコードは、実行される場合に、ターゲットメソッドの仮想呼出しを実施する。このような仮想呼出しは、例えば、最初にオリジナルのターゲットメソッド又はオーバーライドメソッドのいずれが実行されるべきであるかを決定し、次いで、その識別されたメソッドの実行を容易化させることを包含する場合がある。インラインコードがステップ425において発生された後に、ステップ427が実施される。ステップ423において仮想ターゲットメソッドがいずれかその他のメソッドによりオーバーライドされていないことが決定される場合には、ステップ424が実施される。
ステップ424において、仮想ターゲットメソッドがコンパイルされているか又はコンパイルされていないかが決定される。ステップ424において、仮想ターゲットメソッドがコンパイルされていることが決定される場合には、ステップ426において、コールを行うメソッドの実行可能なコードからターゲットメソッドを呼出す命令のパラメータがコードキャッシュ内のターゲットメソッドの実行可能なコードの始めのアドレスを参照すべくセットされる。ステップ424において、仮想ターゲットメソッドがコンパイルされていないことが決定される場合には、ステップ429が実施され且つ命令パラメータはinvokeVirtualコードのアドレスへセットされ、該コードは、幾つかの実施例においては、仮想メソッドを呼出すための1組の既に発生されているコードとすることが可能である。
ステップ427において、コールを行うメソッドがその他の仮想ターゲットメソッドに対するその他のコールを包含するか否かが決定される。コールを行うメソッドがその他の仮想ターゲットメソッドへのコールを包含している場合には、これらのその他の仮想ターゲットメソッドに対してのコールを行うメソッドにおける全てのコールに対してステップ423乃至426が繰返される。仮想ターゲットメソッドに対するコールを行うメソッドにおける全てのコールがこのような態様で処理された後に、ステップ428において、コンパイルされたコールを行うメソッドがコードキャッシュ内に格納される。
図4Dは1実施例に基づいて仮想ターゲットメソッドに対するコールを行うメソッドのコールをパッチさせる状態を例示したフローチャートである。ステップ430において、仮想ターゲットメソッドの状態に対する変化が行われる。例えば、ステップ430において、仮想ターゲットメソッドはそのコンパイル状態において変化を経験する場合がある。代替的に、又はそれに加えて、ステップ430において、ターゲットメソッドはそのオーバーライド状態における変化を経験する場合がある。仮想ターゲットメソッドに対して行われる状態変化に応答して、ステップ431において、仮想ターゲットメソッドが以前にオーバーライドされているか否かの決定が行われる。例えば、幾つかの実施例において、オーバーライドフラッグを仮想ターゲットメソッド内に格納する場合があり、これらの実施例においては、オーバーライドフラッグは、仮想ターゲットメソッドが最初にオーバーライドされる場合にセットさせることが可能であり、その後に、仮想ターゲットメソッドが以前にオーバーライドされたか否かを決定するためにオーバーライドフラッグを検査することが可能である。ステップ431において、仮想ターゲットメソッドが以前にオーバーライドされたか否かの決定が行われる場合には、このことは、ターゲットメソッドが呼出される場合にはいつでもターゲットメソッドを呼出す全てのコールを行うメソッドにおける命令は既にinvokeVirtualコードを参照すべくセットされていることを表わす。従って、この実施例においては、ターゲットメソッドを呼出すコールを行うメソッドにおける命令はパッチさせることは必要ではなく、且つその他の処理で継続するためにステップ442を実施することが可能である。
ステップ431において、仮想ターゲットメソッドが以前にオーバーライドされていないことの決定がなされる場合には、ステップ432において、新たな状態においてターゲットメソッドが別のメソッドによりオーバーライドされるか否かの決定が行われる。
ステップ432において、新たな状態において仮想ターゲットメソッドが少なくとも1つのその他のメソッドによりオーバーライドされるか否かの決定が行われる場合には、例えば図4Cのステップ422においてコンパイルされているコールを行うメソッド等のすべてのコールを行うメソッドにおける仮想ターゲットメソッドに対するパッチ可能なコールにわたってステップ434Aが繰返される。コールを行うメソッドにおける各パッチ可能なコールに対して、図4Dのステップ436Aにおいて、ターゲットメソッドを呼出す命令がそのコードを行うメソッドの実行可能なコード内に位置決めされる。その命令が位置決めされた後に、ステップ438Aにおいて、その命令がパラメータがinvokeVirtualコードを参照すべく修正され、該コードは、実行される場合に、その新たな状態において仮想ターゲットメソッドの実行を容易とさせる。ステップ440Aにおいて、同一の又はその他のコールを行うメソッドにおいて仮想ターゲットメソッドを呼出すためのその他のパッチ可能なコールが存在するか否かの決定が行われる。更なるパッチ可能なコールが存在する場合には、コールを行うメソッド又は複数のメソッドにおけるこれらのパッチ可能なコールに対してステップ436A及び438Aが実施される。ステップ440Aにおいて仮想ターゲットメソッドに対する全てのパッチ可能なコールが修正されていることの決定が行われる場合には、ステップ442はその他の処理で継続する。
ステップ432において、新たな状態において仮想ターゲットメソッドがその他のメソッドによりオーバーライドされないことの決定がなされる場合には、ステップ433において、そのターゲットメソッドが新たな状態でコンパイルされているか否かの決定が行われる。ステップ433において新たな状態においてターゲットメソッドがコンパイルされていないことの決定がなされる場合には、上述した如くに実行はステップは434A乃至440Aで進行する。
ステップ433において新たな状態において仮想ターゲットメソッドがコンパイルされることの決定がなされる場合には、それは、ターゲットメソッドが未だに別のメソッドによりオーバーライドされておらず且つそのコンパイル状態をコンパイルされており且つコードキャッシュ内に格納されているものへ変化させたことを意味する。従って、ステップ434Bは例えば、図4Cのステップ422においてコンパイルされているコールを行うメソッド等の全てのコールを行うメソッドにおける仮想ターゲットメソッドに対するパッチ可能なコールにわたって繰返すために実施される。コールを行うメソッドにおける各パッチ可能なコールに対して、図4Dのステップ436Bにおいて、ターゲットメソッドを呼出す命令がそのコールを行うメソッドの実行可能なコード内に位置決めされる。その命令が位置決めされた後に、ステップ438Bにおいて、該命令のパラメータはキャッシュコード内のターゲットメソッドの実行可能なコールのアドレスにセットされる。その後に、ステップ440Bにおいて、同一の又はその他のコールを行うメソッドにおける仮想ターゲットメソッドを呼出すためのその他のパッチ可能なコールが存在するか否かの決定がなされる。その他のパッチ可能なコールが存在する場合には、ステップ436B及び438Bがコールを行うメソッド又は複数のメソッドにおけるこれらのパッチ可能なコールに対して実施される。ステップ440Bにおいて仮想ターゲットメソッドに対する全てのパッチ可能なコールが修正されていることの決定がなされる場合には、ステップ442はその他の処理で継続する。
仮想メソッドコールのトラッキング
1実施例においては、本明細書に記載する仮想メソッドコールの高速のパッチベースメソッド呼出し用の技術をインプリメントすることは複数個のコンパイルされているコールを行うメソッドから仮想ターゲットメソッドへの直接参照をトラッキング即ち追跡することが関与する。更に、該技術をインプリメントすることは、又、1つ又はそれ以上のその他のメソッドによる仮想ターゲットメソッドのオーバーライドをトラッキングすることが関与する。
1実施例において、コンパイルしたコールを行うメソッドからターゲットメソッドへの直接参照をトラッキングすることは、非仮想メソッドコールをトラッキングするために上述した技術に従ってインプリメントすることが可能である。例えば、仮想ターゲットメソッドとコンパイルされているコールを行うメソッドにおける命令との間の関連性を記録することが可能であり、その場合に該関連性はコールを行うメソッドの実行可能なコードにおける命令の位置を表わす。仮想ターゲットメソッドが状態変化を経験する場合には(例えば、オーバーライドされておらず且つコンパイルされている状態からオーバーライドされるか又はコンパイルされていない状態への変化)、1つ又はそれ以上のコールを行うメソッドの実行可能なコードにおいて1つ又はそれ以上の命令を識別し且つ位置決めするために格納されている関連性を使用することが可能である。該1つ又はそれ以上の命令がこのような態様で識別され且つ位置決めされた後に、ターゲットメソッドの現在の状態を反映するために該命令のパラメータを変化させることにより該命令をパッチさせることが可能である。非仮想メソッドコールをトラッキングするために上述した技術と同様に、メモリ又はその他の高速格納部における任意のデータ構造をこのような関連性を格納するために使用することが可能である。仮想ターゲットメソッドとコンパイルされているコールを行うメソッドにおける命令との間の関連性をトラッキングすることに加えて、コールを行うメソッドがデコンパイルされる場合に、幾つかの実施例は、又、ターゲットメソッドとコンパイルされているコールを行うメソッドにおける命令との間の関連性を除去することが可能である。
1実施例においては、1つ又はそれ以上のその他のメソッドによる仮想ターゲットメソッドのオーバーライドのトラッキングは、ターゲットメソッドのメソッドブロック内に1組のオーバーライド情報を維持することによりインプリメントすることが可能である。該オーバーライド情報は、特定の時刻において仮想ターゲットメソッドがオーバーライドされるか否かを表わす。従って、本明細書に記載する技術に従って、該オーバーライド情報は、ターゲットメソッドが1つ又はそれ以上のその他のメソッドによりオーバーライドされるか否かを決定するために任意の時刻において検査することが可能である。該オーバーライド情報は、初期的に、ターゲットメソッドがオーバーライドされていないことを表わすべくセットすることが可能である。その後に、ターゲットメソッドをオーバーライドするメソッドがロードされる場合にはいつでも、ターゲットメソッドのデータ構造内のオーバーライド情報はそれに従って修正されてターゲットメソッドがオーバーライドされたことを表わす。
幾つかの実施例において、ターゲットメソッド内のオーバーライド情報はオーバーライドフラッグとして表わすことが可能である。ターゲットメソッドをオーバーライドするメソッドが実行のためにロードされる場合にはいつでも、ターゲットメソッド内のオーバーライドフラッグは、そのターゲットメソッドがオーバーライドされていることを表わすべくセットされる。従って、これらの実施例においては、ターゲットメソッドのオーバーライド状態を決定するために、本明細書に記載した技術はターゲットメソッドと関連するオーバーライドフラッグを検査する。
幾つかの実施例においては、ターゲットメソッドに対するオーバーライド情報は初期的にゼロにセットされるオーバーライドカウントとして表わすことが可能である。ターゲットメソッドをオーバーライドするメソッドが実行のためにロードされる場合にはいつでも、そのターゲットメソッドと関連するオーバーライドカウントがインクリメントされる。ターゲットメソッドをオーバーライドするメソッドがアンロードされ且つターゲットメソッドと関連するオーバーライドカウントが正の値を格納している場合にはいつでも、オーバーライドカウントはデクリメントされる。このように、任意の時刻において、オーバーライドカウントはターゲットメソッドの現在のオーバーライド状態を表わす。従って、これらの実施例においては、ターゲットメソッドのオーバーライド状態を決定するために、本明細書に記載した技術は、ターゲットメソッドと関連するオーバーライドカウントを検査する(例えば、正のオーバーライドカウント値は、ターゲットメソッドが少なくとも1つの他のメソッドによりオーバーライドされたことを表わし、且つゼロの値はターゲットメソッドがオーバーライドされていないことを表す)。
ハードウエア概観
1実施例において、オペレーティングシステム102、JVM104、インタプリタ106及びDAC108は1個又はそれ以上のプロセッサにより実行される命令の組の形態をとる。図5はこれらの組の命令を実行することが可能なコンピュータシステム500のブロック図である。コンピュータシステム500は情報交換を容易とするためのバス502、及び情報を処理するためにバス502と結合されている1個又はそれ以上のプロセッサ504を包含している。コンピュータシステム500は、又、情報及びプロセッサ504により実行されるべき命令を格納するためにバス502へ結合されているランダムアクセスメモリ(RAM)又はその他のダイナミック格納装置等のメインメモリ506を包含している。メインメモリ506は、又、プロセッサ504による命令の実行期間中に、一時的な変数又はその他の中間情報を格納するために使用することが可能である。コンピュータシステム500は、更に、静的情報及びプロセッサ504用の命令を格納するためにバス502へ結合されているリードオンリメモリ(ROM)508又はその他の静的格納装置を包含することが可能である。磁気ディスク又は光学ディスク等の格納装置510が情報及び命令を格納するために設けられ且つバス502へ結合されている。
コンピュータシステム500は、コンピュータユーザに対し情報を表示するためにバス502を介してディスプレイ512へ結合させることが可能である。英文字及びその他のキーを包含する入力装置514がプロセッサ504に対し情報及びコマンド選択を通信するためにバス502へ結合されている。別のタイプのユーザ入力装置はマウス、トラックボール、又はプロセッサ504に対し方向情報及びコマンド選択を通信し且つディスプレイ512上にカーソルの移動を制御するためのカーソル方向器等のカーソル制御器516である。この入力装置は、典型的に、2つの軸、即ち第一軸(例えばx)及び第二軸(例えば、y)において2つの自由度を有しており、そのことは該装置が平面内において位置を特定することを可能とする。
コンピュータシステム500においてバス502は種々のコンポーネント間において情報、信号、データ等を交換させることを可能とする任意のメカニズム及び/又は媒体とすることが可能である。例えば、バス502は電気信号を担持する1組の導体とすることが可能である。バス502は、又、1つ又はそれ以上のコンポーネント間においてワイヤレス信号を担持するワイヤレス媒体(例えば、空気)とすることが可能である。バス502は、更に、1つ又はそれ以上のコンポーネントを接続するネットワーク接続とすることが可能である。種々のコンポーネント間において情報、信号、データ等を交換させることを可能とする任意のメカニズム及び/又は媒体をバス502として使用することが可能である。
バス502は、又、これらのメカニズム/媒体の組合わせとすることが可能である。例えば、プロセッサ504はワイヤレス的に格納装置510と通信を行うことが可能である。このような場合において、バス502は、プロセッサ504と格納装置510の観点からは、空気等のワイヤレス媒体である。更に、プロセッサ504は容量的にROM508と通信することが可能である。更に、プロセッサ504はネットワーク接続を介してメインメモリ506と通信することが可能である。この場合には、バス502はネットワーク接続である。更に、プロセッサ504は1組の導体を介してディスプレイ512と通信することが可能である。この場合には、バス502は1組の導体である。従って、種々のコンポーネントがどのようにして互いに通信するかに依存して、バス502は異なる形態をとることが可能である。バス502は図5に示したように、種々のコンポーネント間において情報、信号、データ等を交換させることを可能とするメカニズム及び/又は媒体の全てを機能的に表わしている。
本発明は本明細書に記載した高速のパッチベースメソッド呼出し用の技術をインプリメント即ち実現するためのコンピュータシステム500の使用に関連している。本発明の1実施例によれば、これらの技術は、メインメモリ506内に包含されている1つ又はそれ以上の命令の1つ又はそれ以上のシーケンスを実行するプロセッサ504に応答してコンピュータシステム500により実施される。このような命令は、格納装置510等の別のマシンにより読取可能な媒体からメインメモリ506内へ読取らせることが可能である。メインメモリ506内に包含されている命令のシーケンスの実行は、プロセッサ504をして本明細書に記載する処理ステップを実施する。代替的実施例においては、本発明をインプリメントするためにソフトウエア命令の代わりに又はそれと結合してハードワイヤード回路を使用することが可能である。従って、本発明の実施例はハードウエア回路とソフトウエアの特定の組合わせに制限されるものではない。
「マシンにより読取可能な媒体」という用語は、本明細書においては、特定の態様でマシンを動作させるデータを供給することに関与する任意の媒体のことを意味するものとして使用されている。コンピュータシステム500を使用してインプリメントされる実施例においては、例えば、実行のためにプロセッサ504へ命令を供給する上で種々のマシンにより読取可能な媒体が関与する。このような媒体は多数の形態を取ることが可能であり、これらに制限されるものではないが、非揮発性媒体、揮発性媒体、伝送媒体を包含している。非揮発性媒体は、例えば、格納装置510等の光学的又は磁気的ディスクを包含している。揮発性媒体はメインメモリ506等の動的メモリを包含している。伝送媒体は、バス502を構成するワイヤを包含して、同軸ケーブル、銅ワイヤ及びオプチカルファイバーを包含している。伝送媒体は、又、無線及び赤外線データ通信において発生されるような音響又は光波の形態をとることも可能である。マシンにより読取可能な媒体の一般的な形態は、例えば、フロッピィディスク、フレキシブルディスク、ハードディスク、磁気テープ、又は任意のその他の磁気媒体、CD−ROM、DVD、又は任意のその他の光学的格納媒体、パンチカード、ペーパーテープ、孔のパターンを具備する任意のその他の物理的媒体、RAM,PROM、EPROM、フラッシュEPROM、任意のその他のメモリチップ又はカートリッジ、以後に記載するような搬送波、又はそれからコンピュータ読取ることが可能な任意のその他の媒体を包含している。
種々の形態のマシンにより読取可能な媒体は、実行のためにプロセッサ504に対して1つ又はそれ以上の命令からなる1つ又はそれ以上のシーケンスを担持する場合に関与する場合がある。例えば、該命令は、初期的に、遠隔コンピュータの磁気ディスク上に担持されている場合がある。該遠隔コンピュータは該命令をその動的メモリ内にロードさせ且つ該命令をモデムを使用して電話線を介して送信することが可能である。コンピュータシステム500に対して局所的なモデムは電話線上のデータを受信し且つ赤外線送信器を使用して該データを赤外線信号へ変換させることが可能である。赤外線検知器は該赤外線信号内に担持されるデータを受取ることが可能であり且つ適宜の回路が該データをバス502上に配置させることが可能である。バス502は該データをメインメモリ506へ運び、そこからプロセッサ504が該命令を検索し且つ実行する。メインメモリ506により受取られる命令は、オプションとして、プロセッサ504による実行の前又は後のいずれかにおいて格納装置510上に格納させることが可能である。
コンピュータシステム500は、又、バス502へ結合されている通信インターフェース518を包含している。通信インターフェース518はローカルネットワーク522へ接続されているネットワークリンク520へ結合する二方向データ通信を提供する。例えば、通信インターフェース518は対応するタイプの電話線に対してデータ通信接続を与えるために統合サービスデジタルネットワーク(ISDN)カード又はモデムとすることが可能である。別の例として、通信インターフェース518は互換性のあるLANに対しデータ通信接続を提供するためのローカルエリアネットワーク(LAN)カードとすることが可能である。ワイヤレスリンクも実現することが可能である。いずれかのこのような実現例において、通信インターフェース518は種々のタイプの情報を表わすデジタルデータストリームを担持する電気的、電磁的又は光学的信号を送信し且つ受信する。
ネットワークリンク520は、典型的に、1つ又はそれ以上のネットワークを介して他のデータ装置に対しデータ通信を提供する。例えば、ネットワークリンク520はローカルネットワーク522を介してホストコンピュータ524に対して又はインターネットサービスプロバイダ(ISP)526により運用されるデータ装置に対しての接続を与えることが可能である。ISP526は現在「インターネット」528として一般的に呼ばれているワールドワイドパケットデータ通信ネットワークを介してデータ通信サービスを提供する。ローカルネットワーク522及びインターネット528は、両方共、デジタルデータストリームを担持する電気的、電磁的又は光学的信号を使用する。種々のネットワークを介しての信号及びネットワークリンク520上及びコンピュータシステム500へ及びそれからのデジタルデータを担持する通信インターフェース518を介しての信号は情報を輸送する搬送波の例示的な形態である。
コンピュータシステム500は、ネットワーク、ネットワークリンク520及び通信インターフェース518を介して、プログラムコードを包含して、メッセージを送信し且つデータを受取ることが可能である。インターネットの例においては、サーバー530はインターネット528、ISP526、ローカルネットワーク522、通信インターフェース518を介して、アプリケーションプログラムに対して要求されたコードを送信する場合がある。
受信されたコードは、受信されたままで、プロセッサ504により実行し及び/又は格納装置510、又は後の実行のためにその他の非揮発性格納部内に格納させることが可能である。このように、コンピュータシステム500は搬送波の形態でアプリケーションコードを得ることが可能である。
以上、本発明の具体的実施の態様について詳細に説明したが、本発明は、これら具体例にのみ制限されるべきものではなく、本発明の技術的範囲を逸脱することなしに種々の変形が可能であることは勿論である。
本発明の1実施例をインプリメントすることが可能なシステムの機能的ブロック図。 ターゲットメソッドがコンパイルされている状態に対する変化を経験した場合の1実施例に基づくコードキャッシュを例示したブロック図。 ターゲットメソッドがアンコンパイルされている状態に対する変化を経験した場合の1実施例に基づくコードキャッシュを例示したブロック図。 ターゲットメソッドがオーバーライドされておらず且つコンパイルされていない仮想メソッドである場合の1実施例に基づくコードキャッシュを例示したブロック図。 1実施例に基づいて静的又は非仮想ターゲットメソッドへのコールを包含するコールを行うメソッドのコンパイルを例示したフローチャート。 1実施例に基づいて非仮想又は静的ターゲットメソッドへのコールを行うメソッドのコールをパッチする状態を例示したフローチャート。 1実施例に基づいて仮想ターゲットメソッドに対するコールを包含するコールを行うメソッドのコンパイルを例示したフローチャート。 1実施例に基づいて仮想ターゲットメソッドへのコールを行うメソッドのコールのパッチを行う状態を例示したフローチャート。 本発明の1実施例をインプリメントすることが可能な汎用コンピュータシステムを示したブロック図。
符号の説明
100 システム
102 オペレーティングシステム
104 JVM
105 コードキャッシュ
106 インタプリタ
108 動的適応型コンパイラ(DAC)
202 コールを行うメソッド
204 直接的ブランチアンドリンク命令
206 パラメータ
208 ターゲットメソッド
210 1組のコード
211 省略記号

Claims (40)

  1. マシンにより実現される方法において、
    コールを行うメソッドに対するコードを格納部内に格納し、該コールを行うメソッドに対する該コードはターゲットメソッドを呼出す命令を有しており、該命令はパラメータを有しており、
    現在の状態から該ターゲットメソッドにより経験される新たな状態への状態変化に応答して、該パラメータを第一値から第二値へ修正する、
    ことを特徴とする方法。
  2. 請求項1において、該現在の状態がアンコンパイルされた状態であり、且つ該新たな状態が、該ターゲットメソッドが実行可能なコードにコンパイルされたコンパイルされた状態であり、且つ該パラメータの該第二値が該ターゲットメソッドの該実行可能なコードへの参照を有していることを特徴とする方法。
  3. 請求項1において、該現在の状態が、該ターゲットメソッドが実行可能なコードにコンパイルされているコンパイルされた状態であり、且つ該新たな状態がアンコンパイルされた状態であり、且つ該パラメータの該第二値が該ターゲットメソッドのアンコンパイルされたバージョンをしてインタプリタ的に実行させる1組のコードに対する参照を有していることを特徴とする方法。
  4. 請求項1において、更に、
    該ターゲットメソッドにより経験される該状態変化の前に、該ターゲットメソッドと該ターゲットメソッドを呼出す該コールを行うメソッドのコードにおける命令との間の関連性を記録する、
    ことを特徴とする方法。
  5. 請求項4において、該パラメータを修正する場合に、
    該ターゲットメソッドと該命令との間の該関連性を使用して該状態変化に応答して修正されることが必要な特定の命令として該命令を識別する、
    ことを特徴とする方法。
  6. 請求項5において、更に、
    該コールを行うメソッドがデコンパイルされ且つ該格納部から除去されたか否かを決定し、
    該コールを行うメソッドがデコンパイルされたことの決定に応答して、該ターゲットメソッドと該命令との間の該関連性を除去する、
    ことを特徴とする方法。
  7. 請求項1において、更に、
    該コールを行うメソッドに対する該コードを該格納部内に格納する前に、
    該コールを行うメソッドに対する該コードを派生するために該コールを行うメソッドをコンパイルし、
    該ターゲットメソッドの該現在の状態が、該ターゲットメソッドが実行可能なコードにコンパイルされているコンパイルされた状態であるか否かを決定し、
    該ターゲットメソッドの該現在の状態が該コンパイルされた状態であることの決定に応答して、該パラメータを該ターゲットメソッドの該実行可能なコードに対する参照を有するように設定する、
    ことを特徴とする方法。
  8. 請求項1において、更に、
    該コールを行うメソッドに対する該コードを該格納部内に格納する前に、
    該コールを行うメソッドに対する該コードを派生するために該コールを行うメソッドをコンパイルし、
    該ターゲットメソッドの該現在の状態がアンコンパイルされた状態であるか否かを決定し、
    該ターゲットメソッドの該現在の状態が該アンコンパイルされた状態であることの決定に応答して、該パラメータを、該ターゲットメソッドのアンコンパイルされたバージョンをしてインタプリタ的に実行させる1組のコードに対する参照を有するように設定する、
    ことを特徴とする方法。
  9. 請求項1において、
    該ターゲットメソッドが仮想メソッドであり、
    該現在の状態が、該ターゲットメソッドがいずれのオーバーライドメソッドによってもオーバーライドされることのない第一状態であり、且つ該新たな状態が該ターゲットメソッドが少なくとも1つのオーバーライドメソッドによりオーバーライドされる第二状態であり、
    該パラメータの該第二値が仮想メソッドを呼出すための1組のコードに対する参照を有している、
    ことを特徴とする方法。
  10. 請求項9において、更に、
    該ターゲットメソッドが該少なくとも1つのオーバーライドメソッドによりオーバーライドされる場合に第一情報を記録し、
    該ターゲットメソッドが該状態変化を経験したか否かを決定するために該第一情報を検査する、
    ことを特徴とする方法。
  11. 請求項10において、
    該第一情報が該ターゲットメソッドと関連しているメソッドブロック内に格納されるオーバーライドフラッグであり、
    該第一情報を記録する場合に、該少なくとも1つのオーバーライドメソッドが実行のためにロードされる場合に該オーバーライドフラッグをセットする、
    ことを特徴とする方法。
  12. 請求項10において、
    該第一情報が、該ターゲットメソッドと関連しているメソッドブロック内に格納されるオーバーライドカウントであり、
    該第一情報を記録する場合に、該少なくとも1つのオーバーライドメソッドの各々が実行のためにロードされる場合に該オーバーライドカウントをインクリメントさせる、
    ことを特徴とする方法。
  13. 請求項1において、
    該ターゲットメソッドが仮想メソッドであり、
    請求項1のマシンにより実現される方法が、更に、
    該コールを行うメソッドに対する該コードを該格納部内に格納する前に、
    該コールを行うメソッドに対する該コードを派生するために該コールを行うメソッドをコンパイルし、
    該ターゲットメソッドの該現在の状態が該ターゲットメソッドがいずれのオーバーライドメソッドによってもオーバーライドされることのない第一状態であるか否かを決定し、
    該ターゲットメソッドの該現在の状態が該第一状態であることの決定に応答して、
    該第一状態において該ターゲットメソッドが実行可能なコードにコンパイルされている場合には、該パラメータを該ターゲットメソッドの該実行可能なコードに対する第一参照を有するようにセットし、
    該第一状態において該ターゲットメソッドが実行可能なコードにコンパイルされていない場合には、該パラメータを仮想メソッドを呼出す1組のコードに対する第二参照を有するようにセットする、
    ことを特徴とする方法。
  14. 請求項1において、
    該ターゲットメソッドが仮想メソッドであり、
    請求項1のマシンにより実現可能な方法が、更に、該コールを行うメソッドに対する該コードを該格納部内に格納する前に、
    該コールを行うメソッドに対する該コードを派生するために該コールを行うメソッドをコンパイルし、
    該ターゲットメソッドの該現在の状態が該ターゲットメソッドが少なくとも1つのオーバーライドメソッドによりオーバーライドされる第一状態であるか否かを決定し、
    該ターゲットメソッドの該現在の状態が該第一状態であることの決定に応答して、該パラメータを該命令が実行される場合に該ターゲットメソッド及び該少なくとも1つのオーバーライドメソッドのうちのどちら一方を呼出すべきかを決定する1組のコードに対する第一参照を有するようにセットする、
    ことを特徴とする方法。
  15. 請求項14において、該1組のコードが該コールを行うメソッドの該コード内に挿入されているインラインコードであることを特徴とする方法。
  16. 請求項1において、
    該コールを行うメソッドが該ターゲットメソッドを呼出す1つ又はそれ以上の命令を有する複数個のコールを行うメソッドのうちの特定のコールを行うメソッドであり、該1つ又はそれ以上の命令の各々が該パラメータを有しており、且つ該命令が該1つ又はそれ以上の命令のうちの特定の命令であり、
    該パラメータを第一値から第二値へ修正する場合に、該1つ又はそれ以上の命令の各々における該パラメータを修正する、
    ことを特徴とする方法。
  17. 請求項1において、該命令がブランチアンドリンクプロセッサ命令であることを特徴とする方法。
  18. 請求項1において、更に、該コールを行うメソッドを実行し、該コールを行うメソッドを実行する場合に、該パラメータの該第一値及び該パラメータの該第二値のうちのいずれか1つに基づいて該命令を実行することを特徴とする方法。
  19. 請求項1において、
    該マシンにより実現される方法がオブジェクトメソッドをバイトコードから実行可能なコードへコンパイルするための動的適用型コンパイラを有する仮想マシンにおいて実現され、
    該格納部が該仮想マシンに対して割当てられているメモリ内の領域であり、該メモリ内の領域が該動的適用型コンパイラによりコンパイルされた該オブジェクトメソッドを格納する形態とされている、
    ことを特徴とする方法。
  20. 請求項19において、該仮想マシンがJAVA仮想マシンであることを特徴とする方法。
  21. マシンにより読取可能な媒体において、
    1個又はそれ以上のプロセッサをしてコールを行うメソッドに対するコードを格納部内に格納させる命令、該コールを行うメソッドに対する該コードはターゲットメソッドを呼出す命令を有しており、該命令はパラメータを有しており、
    現在の状態から該ターゲットメソッドにより経験される新たな状態への状態変化に応答して1個又はそれ以上のプロセッサをして該パラメータを第一値から第二値へ修正させる命令、
    を有していることを特徴とするマシンにより読取可能な媒体。
  22. 請求項21において、該現在の状態がアンコンパイルされた状態であり且つ該新たな状態が該ターゲットメソッドが実行可能なコードにコンパイルされているコンパイルされた状態であり、且つ該パラメータの該第二値が該ターゲットメソッドの該実行可能なコードに対する参照を有していることを特徴とするマシンにより読取可能な媒体。
  23. 請求項21において、該現在の状態が該ターゲットメソッドが実行可能なコードにコンパイルされているコンパイルされた状態であり且つ該新たな状態がアンコンパイルされた状態であり、且つ該パラメータの該第二値は該ターゲットメソッドのアンコンパイルされたバージョンをしてインタプリタ的に実行させる1組のコードに対する参照を有していることを特徴とするマシンにより読取可能な媒体。
  24. 請求項21において、更に、
    該ターゲットメソッドにより経験される該状態変化の前に、1個又はそれ以上のプロセッサをして該ターゲットメソッドと該ターゲットメソッドを呼出す該コールを行うメソッドの該コードにおける該命令との間の関連性を記録させる命令、
    を有していることを特徴とするマシンにより読取可能な媒体。
  25. 請求項24において、該1個又はそれ以上のプロセッサをして該パラメータを修正させる該命令が、
    1個又はそれ以上のプロセッサをして該ターゲットメソッドと該状態変化に応答して修正することが必要な特定の命令として該命令を識別するための該命令との間の関連性を使用させる命令、
    を有していることを特徴とするマシンにより読取可能な媒体。
  26. 請求項25において、更に、
    1個又はそれ以上のプロセッサをして該コールを行うメソッドがデコンパイルされており且つ該格納部から除去されているか否かを決定させる命令、
    1個又はそれ以上のプロセッサをして該コールを行うメソッドがデコンパイルされていることの決定に応答して該ターゲットメソッドと該命令との間の該関連性を除去させる命令、
    を有していることを特徴とするマシンにより読取可能な媒体。
  27. 請求項21において、更に、
    1個又はそれ以上のプロセッサをして該コールを行うメソッドに対する該コードを派生するために該コールを行うメソッドをコンパイルさせる命令、
    1個又はそれ以上のプロセッサをして該ターゲットメソッドの該現在の状態が該ターゲットメソッドが実行可能なコードにコンパイルされているコンパイルされた状態であるか否かを決定させる命令、
    1個又はそれ以上のプロセッサをして該パラメータを該ターゲットメソッドの該現在の状態が該コンパイルされた状態であることの決定に応答して該ターゲットメソッドの該実行可能なコードに対する参照を有するようにセットする命令、
    を有しており、1個又はそれ以上のプロセッサをして該コールを行うメソッドをコンパイルさせる該命令、1個又はそれ以上のプロセッサをして該ターゲットメソッドの該現在の状態がコンパイルされた状態であるか否かを決定させる該命令、及び1個又はそれ以上のプロセッサをして該パラメータをセットさせる該命令が、1個又はそれ以上のプロセッサをして該コールを行うメソッドに対する該コードを該格納部内に格納させる該命令を実行する前に実行される形態とされている、
    ことを特徴とするマシンにより読取可能な媒体。
  28. 請求項21において、更に、
    1個又はそれ以上のプロセッサをして該コールを行うメソッドに対する該コードを派生するために該コールを行うメソッドをコンパイルさせる命令、
    1個又はそれ以上のプロセッサをして該ターゲットメソッドの該現在の状態がアンコンパイルされた状態であるか否かを決定させる命令、
    該ターゲットメソッドの該現在の状態が該アンコンパイルされた状態であることの決定に応答して、1個又はそれ以上のプロセッサをして該パラメータを該ターゲットメソッドのアンコンパイルされたバージョンをしてインタプリタ的に実行させる1組のコードに対する参照を有するようにセットさせる命令、
    を有しており、1個又はそれ以上のプロセッサをして該コールを行うメソッドをコンパイルさせる該命令、1個又はそれ以上のプロセッサをして該ターゲットメソッドの該現在の状態がアンコンパイルされた状態であるか否かを決定させる該命令、及び1個又はそれ以上のプロセッサをして該パラメータをセットさせる該命令が、1個又はそれ以上のプロセッサをして該コールを行うメソッドに対する該コードを該格納部内に格納させる該命令を実行する前に実行される形態とされている、
    ことを特徴とするマシンにより読取可能な媒体。
  29. 請求項21において、
    該ターゲットメソッドが仮想メソッドであり、
    該現在の状態が該ターゲットメソッドがいずれのオーバーライドメソッドによってもオーバーライドされることのない第一状態であり且つ該新たな状態が該ターゲットメソッドが少なくとも1個のオーバーライドメソッドによりオーバーライドされる第二状態であり、
    該パラメータの該第二値が仮想メソッドを呼出すための1組のコードに対する参照を有している、
    ことを特徴とするマシンにより読取可能な媒体。
  30. 請求項29において、更に、
    該ターゲットメソッドが該少なくとも1つのオーバーライドメソッドによりオーバーライドされる場合に1個又はそれ以上のプロセッサをして第一情報を記録させる命令、
    該ターゲットメソッドが該状態変化を経験したか否かを決定させるために1個又はそれ以上のプロセッサをして該第一情報を検査させる命令、
    を有していることを特徴とするマシンにより読取可能な媒体。
  31. 請求項30において、
    該第一情報が該ターゲットメソッドと関連しているメソッドブロック内に格納されるオーバーライドフラッグであり、
    1個又はそれ以上のプロセッサをして該第一情報を記録させる該命令が該1個又はそれ以上のプロセッサをして該少なくとも1つのオーバーライドメソッドが実行のためにロードされる場合に該オーバーライドフラッグをセットさせる命令を有している、
    ことを特徴とするマシンにより読取可能な媒体。
  32. 請求項30において、
    該第一情報が該ターゲットメソッドと関連しているメソッドブロック内に格納されるオーバーライドカウントであり、
    1個又はそれ以上のプロセッサをして該第一情報を記録させる該命令が、該1個又はそれ以上のプロセッサをして該少なくとも1つのオーバーライドメソッドの各々が実行のためにロードされる場合に該オーバーライドカウントをインクリメントさせる命令を有している、
    ことを特徴とするマシンにより読取可能な媒体。
  33. 請求項21において、
    該ターゲットメソッドが仮想メソッドであり、
    該マシンにより読取可能な媒体が、更に、該コールを行うメソッドに対する該コードを該格納部内に格納する前に、1個又はそれ以上のプロセッサをして以下のステップを実施させる命令を有しており、該以下のステップとは、
    該コールを行うメソッドに対する該コードを派生させるために該コールを行うメソッドをコンパイルし、
    該ターゲットメソッドの該現在の状態が該ターゲットメソッドがいずれのオーバーライドメソッドによってもオーバーライドされることのない第一状態であるか否かを決定し、
    該ターゲットメソッドの該現在の状態が該第一状態であることの決定に応答して、
    該第一状態において該ターゲットメソッドが実行可能なコードにコンパイルされている場合には、該パラメータを該ターゲットメソッドの該実行可能なコードに対する第一参照を有するようにセットし、
    該第一状態において該ターゲットメソッドが実行可能なコードにコンパイルされていない場合には、該パラメータを仮想メソッドを呼出すための1組のコードに対する第二参照を有するようにセットする、
    であることを特徴とするマシンにより読取可能な媒体。
  34. 請求項21において、
    該ターゲットメソッドが仮想メソッドであり、
    該マシンにより読取可能な媒体が、更に、該コールを行うメソッドに対する該コードを該格納部内に格納する前に、1個又はそれ以上のプロセッサをして以下のステップを実施させる命令を有しており、該以下のステップとは、
    該コールを行うメソッドに対する該コードを派生させるために該コールを行うメソッドをコンパイルし、
    該ターゲットメソッドの該現在の状態が該ターゲットメソッドが少なくとも1つのオーバーライドメソッドによりオーバーライドされる第一状態であるか否かを決定し、
    該ターゲットメソッドの該現在の状態が該第一状態であることの決定に応答して、該パラメータを該ターゲットメソッドと該少なくとも1つのオーバーライドメソッドのうちのどちらか一方を該命令が実行される場合に呼出されるべきであるかを決定する1組のコードに対する第一参照を有するようにセットする、
    であることを特徴とするマシンにより読取可能な媒体。
  35. 請求項34において、該1組のコードが該コールを行うメソッドの該コール内に挿入されるインラインコードであることを特徴とするマシンにより読取可能な媒体。
  36. 請求項21において、
    該コールを行うメソッドが該ターゲットメソッドを呼出す1つ又はそれ以上の命令を有する複数個のコールを行うメソッドのうちの特定のコールを行うメソッドであり、該1つ又はそれ以上の命令の各々が該パラメータを有しており、且つ該命令が該1つ又はそれ以上の命令のうちの特定の命令であり、
    1個又はそれ以上のプロセッサをして該パラメータを第一値から第二値へ修正させる該命令が1個又はそれ以上のプロセッサをして該1つ又はそれ以上の命令の各々における該パラメータを修正させる命令を有している、
    ことを特徴とするマシンにより読取可能な媒体。
  37. 請求項21において、該命令がブランチアンドリンクプロセッサ命令であることを特徴とするマシンにより読取可能な媒体。
  38. 請求項21において、更に、1個又はそれ以上のプロセッサをして該コールを行うメソッドを実行させる命令を有しており、該ターゲットメソッドを呼出す該命令は該パラメータの該第一値及び該パラメータの該第二値のいずれか一方に基づいて実行されることを特徴とするマシンにより読取可能な媒体。
  39. 請求項21において、更に、
    1個又はそれ以上のプロセッサをしてオブジェクトメソッドをバイトコードから実行可能なコードへコンパイルさせるための動的適用型コンパイラを有している仮想マシンを実行させる命令、
    を有しており、該格納部が該仮想マシンに割当てられているメモリ内の領域であり、該メモリ内の領域が該動的適用型コンパイラによりコンパイルされた該オブジェクトメソッドを格納する形態とされている、
    ことを特徴とするマシンにより読取可能な媒体。
  40. 請求項39において、該仮想マシンがJAVA仮想マシンであることを特徴とするマシンにより読取可能な媒体。
JP2007047989A 2006-02-28 2007-02-27 高速パッチベースメソッドコール Pending JP2007234022A (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
US11/365,146 US8099724B2 (en) 2006-02-28 2006-02-28 Fast patch-based method calls

Related Child Applications (1)

Application Number Title Priority Date Filing Date
JP2013186387A Division JP5845221B2 (ja) 2006-02-28 2013-09-09 高速パッチベースメソッドコール

Publications (1)

Publication Number Publication Date
JP2007234022A true JP2007234022A (ja) 2007-09-13

Family

ID=38050212

Family Applications (2)

Application Number Title Priority Date Filing Date
JP2007047989A Pending JP2007234022A (ja) 2006-02-28 2007-02-27 高速パッチベースメソッドコール
JP2013186387A Active JP5845221B2 (ja) 2006-02-28 2013-09-09 高速パッチベースメソッドコール

Family Applications After (1)

Application Number Title Priority Date Filing Date
JP2013186387A Active JP5845221B2 (ja) 2006-02-28 2013-09-09 高速パッチベースメソッドコール

Country Status (6)

Country Link
US (1) US8099724B2 (ja)
EP (1) EP1826668B1 (ja)
JP (2) JP2007234022A (ja)
CN (1) CN101030149B (ja)
AT (1) ATE423346T1 (ja)
DE (1) DE602007000544D1 (ja)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8458670B2 (en) * 2007-09-27 2013-06-04 Symantec Corporation Automatically adding bytecode to a software application to determine network communication information
US8762952B2 (en) * 2010-12-14 2014-06-24 Bmc Software, Inc. Recording method calls that led to an unforeseen problem
EP2798470A4 (en) * 2011-12-29 2015-07-15 Intel Corp PRE-ACQUISITION OF ANTEMOTE BY MANAGED INSTRUCTION
JP5976930B2 (ja) * 2012-08-08 2016-08-24 インテル コーポレイション バーチャルファンクションを無効にするコールのためのサポートを含むisaブリッジング
CN105335200B (zh) * 2015-11-24 2019-05-07 小米科技有限责任公司 系统升级方法及装置
US10474446B2 (en) * 2016-09-16 2019-11-12 Bank Of America Corporation Installation tool for adhering to enterprise requirements
CN109710396B (zh) * 2017-10-26 2023-08-22 华为技术有限公司 一种信息采集及内存释放的方法及装置

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2003526135A (ja) * 1998-11-16 2003-09-02 インシグニア・ソリューションズ・ピーエルシー コンピュータ・システム、コンピュータ読取り可能な記憶媒体および同媒体を動作させる方法、およびコンピュータ・システムを動作させる方法

Family Cites Families (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4970639A (en) * 1988-05-20 1990-11-13 International Business Machines Corporation Virtual machine architecture independent program loader
KR100529416B1 (ko) * 1996-01-24 2006-01-27 선 마이크로시스템즈 인코퍼레이티드 스택기반컴퓨터를위한명령폴딩방법및장치
US6151703A (en) * 1996-05-20 2000-11-21 Inprise Corporation Development system with methods for just-in-time compilation of programs
US6321323B1 (en) * 1997-06-27 2001-11-20 Sun Microsystems, Inc. System and method for executing platform-independent code on a co-processor
US6170083B1 (en) * 1997-11-12 2001-01-02 Intel Corporation Method for performing dynamic optimization of computer code
US6233678B1 (en) * 1998-11-05 2001-05-15 Hewlett-Packard Company Method and apparatus for profiling of non-instrumented programs and dynamic processing of profile data
US6233725B1 (en) * 1998-12-03 2001-05-15 International Business Machines Corporation Method and apparatus to coordinate and control the simultaneous use of multiple just in time compilers with a java virtual machine
US6295642B1 (en) * 1999-04-29 2001-09-25 International Business Machines Corporation Method and apparatus for partial just in time compiling in a data processing system
US6429860B1 (en) * 1999-06-15 2002-08-06 Visicomp, Inc. Method and system for run-time visualization of the function and operation of a computer program
JP2001154855A (ja) * 1999-09-13 2001-06-08 Matsushita Electric Ind Co Ltd プログラム変換装置
US6721875B1 (en) * 2000-02-22 2004-04-13 Hewlett-Packard Development Company, L.P. Method and apparatus for implementing a single-syllable IP-relative branch instruction and a long IP-relative branch instruction in a processor which fetches instructions in bundle form
US6779188B1 (en) * 2000-09-28 2004-08-17 International Business Machines Corporation Apparatus and method for improved devirtualization of method calls
US7032230B2 (en) * 2001-08-27 2006-04-18 International Business Machines Corporation Efficient virtual function calls for compiled/interpreted environments
US6934943B2 (en) * 2001-10-18 2005-08-23 Hewlett-Packard Development Company Optimization of control transfers to dynamically loaded modules
US6928536B2 (en) * 2001-11-29 2005-08-09 Hewlett-Packard Development Company, L.P. Dynamic execution layer interface for replacing instructions requiring unavailable hardware functionality with patch code and caching
US6915513B2 (en) * 2001-11-29 2005-07-05 Hewlett-Packard Development Company, L.P. System and method for dynamically replacing code

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2003526135A (ja) * 1998-11-16 2003-09-02 インシグニア・ソリューションズ・ピーエルシー コンピュータ・システム、コンピュータ読取り可能な記憶媒体および同媒体を動作させる方法、およびコンピュータ・システムを動作させる方法

Also Published As

Publication number Publication date
JP2014002790A (ja) 2014-01-09
CN101030149B (zh) 2012-10-17
EP1826668B1 (en) 2009-02-18
JP5845221B2 (ja) 2016-01-20
CN101030149A (zh) 2007-09-05
US20070234311A1 (en) 2007-10-04
EP1826668A1 (en) 2007-08-29
ATE423346T1 (de) 2009-03-15
DE602007000544D1 (de) 2009-04-02
US8099724B2 (en) 2012-01-17

Similar Documents

Publication Publication Date Title
JP5845221B2 (ja) 高速パッチベースメソッドコール
US7069549B2 (en) Multi-threaded fragment patching
EP3314422B1 (en) Extending a virtual machine instruction set architecture
US11347489B2 (en) Accessing a migrated member in an updated type
US6286134B1 (en) Instruction selection in a multi-platform environment
US8352925B2 (en) Mechanism for enabling a set of code intended for a first platform to be executed on a second platform
EP0778521B1 (en) System and method for runtime optimization of private variable function calls in a secure interpreter
US8255922B1 (en) Mechanism for enabling multiple processes to share physical memory
CN111399990B (zh) 解释执行智能合约指令的方法及装置
US10929149B2 (en) Method and system for updating firmware
JP2009059349A (ja) 共用型ジャバjarファイル
JP2010176688A (ja) 仮想マシン環境におけるアプリケーション・プログラム・インタフェースの最適化の方法および装置
JP2003196107A (ja) エミュレートされるコードとネイティブコードとを統合するシステムおよび方法
JP2007012066A (ja) ローカル及び匿名クラスに対するイントロスペクションサポート
US8291393B2 (en) Just-in-time compiler support for interruptible code
US20140208301A1 (en) Function calling computer programs
US20080172656A1 (en) Processing engine for enabling a set of code intended for a first platform to be executed on a second platform
JP2005215830A (ja) コンパイラ、コンパイル方法、コンパイルプログラム、及び記録媒体
EP1046985A2 (en) File portability techniques
US6904516B2 (en) Mechanism for enabling efficient execution of an instruction
US7895603B1 (en) Mechanism for enabling virtual method dispatch structures to be created on an as-needed basis
JP2003186674A (ja) 仮想マシンにおけるJavaデータ型表現
US11726786B2 (en) Lazy copying of runtime-managed stack frames
WO2024036517A1 (zh) 一种交叉链接方法、装置,电子设备及存储介质

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20100226

RD03 Notification of appointment of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7423

Effective date: 20110113

RD04 Notification of resignation of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7424

Effective date: 20110118

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120710

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20121010

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20130507