(57)【特許請求の範囲】
【請求項１】
リターンポイントに関連する埋込みライブラリ値を有するダミー命令を利用して、期待リターンポイントと代替リターンポイントとを含む複数のリターンポイントのうちの一つを識別するコンピュータ実現方法であって、
ルーチン内から前記ルーチンの実行中に関数をコールするステップであって、前記関数が前記ルーチンから独立するようになっているステップ、
前記関数の実行を開始するステップ、
前記ダミー命令に関連するリターンポイントにおいて前記コールされた関数から前記ルーチンに戻るステップ、
前記リターンポイントが期待リターンポイントであるように、前記コールされた関数の前記実行が正常に戻る場合、前記ダミー命令を実行するステップ、
前記リターンポイントが代替リターンポイントであるように、前記コールされた関数の前記実行が代替リターンを要求している場合、前記埋込みライブラリ値を読み取るステップ、
前記読み取るステップにのみ基づいて前記代替リターンポイントを決定するステップ、及び
前記リターンポイントにおいて前記ルーチン内の命令を実行するステップ、
を有するコンピュータ実現方法。
【請求項２】
前記関数が期待通りに前記ルーチンに戻り、更に、前記関数の前記実行が完了した後に実行される前記ルーチン内の第１命令を識別するように構成された前記期待リターンポイントに戻る前に、前記関数の前記実行を完了するステップ、を含むようになっている、請求項１に記載のコンピュータ実現方法。
【請求項３】
更に、前記ルーチンの実行を継続するステップを含む、請求項２に記載のコンピュータ実現方法。
【請求項４】
前記関数の前記実行を開始するステップが第１代替リターンポイントをロードするステップを含み、前記第１代替リターンポイントが前記期待リターンポイントから一定のオフセットに配置された命令によって識別されるようになっている、請求項１に記載のコンピュータ実現方法。
【請求項５】
更に、
前記コールされた関数の前記実行を中止するステップ、及び
前記期待リターンポイントから前記一定のオフセットに配置された前記命令によって識別される前記第１代替リターンポイントにジャンプするステップ、を含む、請求項４に記載のコンピュータ実現方法。
【請求項６】
前記期待リターンポイントから前記一定のオフセットに配置された前記命令は、前記埋込みライブラリ値を含む命令である、請求項４に記載のコンピュータ実現方法。
【請求項７】
前記期待リターンポイントから前記一定のオフセットに配置された前記命令は、前記第１命令である、請求項４に記載のコンピュータ実現方法。
【請求項８】
前記関数が正常に戻る場合に前記ルーチン内の第１命令が実行され、更に、
前記関数が正常に戻らない場合に前記期待リターンポイントから一定のオフセットに配置された命令によって識別される第１代替リターンポイントをロードするステップを含み、
前記第１代替リターンポイントをロードするステップは、前記埋込みライブラリ値から前記第１代替リターンポイントを取り出すステップを含むようになっている、請求項１に記載のコンピュータ実現方法。
【請求項９】
複数のリターンポイントの一つに関連するデータを格納して前記複数のリターンポイントの一つに関連する前記データの効率的な取得を可能にするためのコンピュータ実現方法であって、前記複数のリターンポイントは、期待リターンポイントと少なくとも第１代替リターンポイントとを含み、前記コンピュータ実現方法が、
ルーチンを実行するステップであって、前記ルーチンはそのルーチンの一部ではない関数をコールするように構成されているステップ、
前記ルーチン内から、前記ルーチンの実行中に、前記関数をコールするステップ、
前記関数の実行を開始するステップ、
前記関数から前記ルーチンに戻るステップであって、前記関数は、前記ルーチン内の第１命令にアクセスするようになっており、前記ルーチン内の前記第１命令は、前記期待リターンポイントに配置されると共に、前記複数のリターンポイントの一つに関連するデータを含むようになっているステップ、
前記関数が期待通りに戻る場合に前記ルーチン内の前記第１命令を実行するステップであって、前記第１命令の実行は、前記ルーチンの実行に影響を与えないようになっているステップ、
前記関数が期待通りに戻らずに第１非期待リターンとして戻る場合に前記第１代替リターンポイントを計算するために、前記第１命令に関連する前記埋込みライブラリ値にアクセスするステップ、及び
前記関数が期待通りに戻らずに第１非期待リターンとして戻る場合に前記第１代替リターンポイントにおいて前記ルーチン内の第２命令を実行するステップであって、前記関数が期待通りに戻らずに第１非期待リターンとして戻る場合に前記第１命令は実行されないようになっているステップ、
を含む、コンピュータ実現方法。
【請求項１０】
前記第１命令はテスト命令及び移動命令のうちの何れかである、請求項９に記載のコンピュータ実現方法。
【請求項１１】
更に、前記第１代替リターンポイントにジャンプするステップを含む、請求項９に記載のコンピュータ実現方法。
【請求項１２】
前記第１命令に関連する前記埋込みライブラリ値にアクセスするステップは、前記期待リターンポイントから前記第１代替リターンポイントを識別する前記ライブラリ値をロードするステップを含む、請求項９に記載のコンピュータ実現方法。
【請求項１３】
更に、
前記関数が期待通りに戻らずに第２非期待リターンとして戻る場合に第２代替リターンポイントを識別するための第３命令にアクセスするステップであって、前記第３命令は、前記期待リターンポイントからオフセット分、離して配置されているステップ、及び
前記関数が期待通りに戻らずに第２非期待リターンとして戻る場合に前記第２代替リターンポイントにおいて前記ルーチン内の第４命令を実行するステップであって、前記関数が期待通りに戻らずに第２非期待リターンとして戻る場合に前記第１命令及び前記第３命令は実行されないようになっているステップ、
を含む、請求項９に記載のコンピュータ実現方法
【請求項１４】
更に、
前記関数が期待通りに戻る場合に前記第３命令を実行するステップを含む、請求項１３に記載のコンピュータ実現方法。
【請求項１５】
複数のリターンポイントの一つに関連するデータを格納して前記複数のリターンポイントの一つに関連する前記データの効率的な取得を可能にするためのコンピュータプログラムが記録されたコンピュータ読取可能な記録媒体であって、前記複数のリターンポイントは期待リターンポイントと少なくとも第１代替リターンポイントとを含み、前記コンピュータプログラムが、コンピュータに、
ルーチンを実行するためのステップであって、前記ルーチンはそのルーチンの一部ではない関数をコールするように構成されているステップ、
前記ルーチン内から、前記ルーチンの実行中に、前記関数をコールするためのステップ、
前記関数の実行を開始するためのステップ、
前記関数から前記ルーチンに戻るためのステップであって、前記関数は前記ルーチン内の第１命令にアクセスするようになっており、前記第１命令は、前記期待リターンポイントに配置されると共に、前記複数のリターンポイントの一つに関連するデータを含むようになっているステップ、
前記関数が期待通りに戻る場合に前記ルーチン内の前記第１命令を実行するためのステップであって、前記第１命令の実行は、あまり大きくない計算オーバヘッドを使用すると共に、前記ルーチンの実行に影響を与えないようになっているステップ、
前記第１命令に関連する埋込みライブラリ値にアクセスするためのステップであって、前記関数が期待通りに戻らずに第１非期待リターンとして戻る場合に前記第１代替リターンポイントを決定するステップ、及び
前記関数が期待通りに戻らずに第１非期待リターンポイントとして戻る場合に前記第１代替リターンポイントで前記ルーチン内の第２命令を実行するためのステップであって、前記関数が期待通りに戻らずに第１非期待リターンポイントとして戻る場合に前記第１命令は実行されないようになっているステップを実行させる、コンピュータ読取可能な記録媒体。
【請求項１６】
前記第１命令に関連する前記埋込みライブラリ値にアクセスするための前記ステップは、前記期待リターンポイントから前記第１代替リターンポイントを識別するための前記埋込みライブラリ値を含むバイトをロードするためのステップを有する、請求項１５に記載のコンピュータ読取可能な記録媒体。
【請求項１７】
更に、
前記関数が期待通りに戻らずに第２非期待リターンとして戻る場合に第２代替リターンポイントを識別するための第３命令に関連するバイトにアクセスするステップであって、前記第３命令は、前記期待リターンポイントからオフセット分、離して配置されているステップ、及び
前記関数が期待通りに戻らずに第２非期待リターンとして戻る場合に第２代替リターンポイントにおいて前記ルーチン内の第４命令を実行するステップであって、前記関数が期待通りに戻らずに第２非期待リターンとして戻る場合に前記第１命令及び第３命令は実行されないようになっているステップ、
を有する、請求項１５に記載のコンピュータ読取可能な記録媒体。
【請求項１８】
リターンポイントに関連する埋込みライブラリ値を有するダミー命令を利用して、期待リターンポイントと代替リターンポイントとを含む複数のリターンポイントのうちの一つを識別するコンピュータプログラムが記録されたコンピュータ読取可能な記録媒体であって、前記コンピュータプログラムが、コンピュータに、
ルーチン内から、前記ルーチンの実行中に、前記ルーチンの外部にある関数をコールするためのステップ、
前記関数の実行を開始するためのステップ、
前記ダミー命令に関連するリターンポイントにおいて前記コールされた関数の前記実行から前記ルーチンに戻るためのステップ、
前記リターンポイントが期待リターンポイントであるように、前記コールされた関数の前記実行が正常に戻る場合に、前記ダミー命令を実行するためのステップ、
前記リターンポイントが代替リターンポイントであるように、前記コールされた関数の前記実行が代替リターンを要求している場合に、前記埋込みライブラリ値を読み取るためのステップ、
前記埋込みライブラリ値にのみ基づいて前記代替リターンポイントを決定するためのステップ、及び
前記リターンポイントにおいて前記ルーチン内の命令を実行するためのステップを実行させる、コンピュータ読取可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の背景】
１．  発明の分野
本発明は一般的に、関数をコールするためのマルチプルリターンポイントを実現する方法及び装置に関する。より詳細には、本発明は、マルチプルリターンポイント用のアドレスの取得を効率的に可能にする方法及び装置に関する。
２．  関連技術の説明
コンピュータシステムはそのネットワーク、例えばローカルエリアネットワーク、イントラネット、及びインターネットを横切って、それらがソフトウェアコードやプログラムコード等のリソースを共有できるように、しばしばリンクされる。更に、ルーチンを含む多くのプログラムは、プログラムがその中に含まれない「外部」関数をコールするように書かれている。一般に、関数は多くのルーチンによって共有できるので、コンピュータシステムリソースのより効率的な使用が可能になる。
【０００２】
関数をコールするようにルーチンが構成されると、コールされる関数は結局、ルーチンに戻らなければならない。更に、ルーチンへの戻りはそのルーチン内の適切な記憶位置に対して行なわなければならない。図１に関して、コンピュータプログラムとそのプログラムによってコールされる関数を説明する。コンピュータコード１０４はルーチンｇ（）１０８を含む。ルーチンｇ（）１０８は実行される命令を含む。図示のように、命令は関数ｆ（）１１６への繰返し(repeated)コール１１２を含む。
【０００３】
関数ｆ（）１１６がコールされて「正常に」実行される場合（例えば例外が投入(thrown)されない場合）、関数ｆ（）１１６は通常、実行を完了して、ルーチンｇ（）１０８ａコンピュータルーチンへのリターンが行なわれる。関数ｆ（）１１６が戻るｇ（）１０８ａコンピュータルーチン内の記憶位置はコールサイト、即ち関数ｆ（）１１６をコールしたルーチンｇ（）１０８ａコンピュータルーチン内のサイトに依存する。具体的には、関数ｆ（）１１６がコール１１２ａの結果として実行する場合、関数ｆ（）１１６は、当業者の承知するように、ｇ（）１０８ａコンピュータルーチン内のコール１１２ａの直後に配置されるリターンアドレス１２０に戻る。同様に、コール１１２ｂによってコールされて関数ｆ（）１１６が実行する場合は、関数ｆ（）１１６はリターンアドレス１２０に戻る。関数ｆ（）１１６がルーチンｇ（）１０８ａコンピュータルーチンに戻ると、ルーチン（）１０８ａは一般に実行を続ける。
【０００４】
多くの関数は２つ以上のリターンサイトやリターンポイントを有することができる。例として、関数は正常、つまり期待(expected)と代替(alternate)リターンポイントを有することができる。代替リターンポイントはしばしば、投入された例外に関連するリターンポイントのような「異常」リターンポイントと見做される。代替リターンポイントは通常、リターンポイントが必要に応じて直ちに識別されるように、全プログラム内に格納又はカタログされる。例として、代替リターンポイントは、例外を扱わない関数によって投入された例外の処理中のプログラムによって必要とされるだろう。
【０００５】
関数を代替リターンポイントと関連させるために使用される一つのメカニズムは、リターンポイントテーブル、つまりリターンアドレステーブルである。図２(a）は、コールスタックに関連するリターンポイントテーブルの図式表示である。コールスタック２０４は別のフレーム、即ちコーリー(callee)フレーム２１２をコールするコーラー(caller)フレーム２０８を含む。コーリー２１２は関数ｆ（）２１４に関連する。かくして、コーラー２０８がコーリー２１２をコールすると、関数ｆ（）２１４が実行を開始する。
【０００６】
関数ｆ（）２１４の実行の終了時に、関数ｆ（）２１４と、従ってコーリー２１２はコーラー２０８に戻る。コーラー２０８への戻りが正常リターンでないときは、正常リターンアドレスをリターンポイントテーブル２２０へのインデックス２１６として使用して、適正な代替リターンポイントを識別できる。例えば、正常リターンアドレスが「１２３４」の場合は、リターンポイントテーブル２２０を探索して「１２３４」を発見するであろう。「１２３４」が発見されると、「１２３４」に関連する代替リターンプログラムアドレスを取得できる。図示のように、「１２３４」の正常リターンアドレスでは、対応する代替リターンポイントアドレスは「１２５６」である。一旦取得されると、次にその代替リターンポイントアドレスを使って、コーリー２１２がコーラー２０８に適切に戻ることを確認できる。
【０００７】
リターンポイントテーブル（一般にルックアップテーブルかハッシュテーブルである）の使用は、コーリー用の適正リターンポイントの識別に有効だが、テーブルルックアップの実現は遅いことが多い。マルチプルリターンポイントを実現するための、より迅速なプロセスは、リターンポイントを識別するためのテーブルルックアップを除去することを含む。当業者の承知するように、関数の実行中、関数が正常リターンを使って戻るべきか否か、或いは関数が代替リターンを使って戻るべきか否かは、関数にとって本質的に「既知」である。従って、格納すべき、代替リターンアドレスに関するデータが入手できる。
【０００８】
図２(ｂ）は、代替リターンアドレスデータを格納するために構成されたルーチンの図式表示である。ルーチンｇ（）２３６は関数ｆ（）へのコール２３８を含む。関数ｆ（）へのコール２３８が代替アドレスに戻る必要を生じるか否かに関わらず、コール２３８は正常にリターンアドレス２４０に戻るだろう。リターンアドレス２４０は、格納された代替リターンアドレスデータ２４２を識別する。格納された代替リターンアドレス２４２は、コール２３８に近いルーチンｇ（）２３６ａコンピュータルーチン内に配置されて、代替リターンアドレスデータ２４２に容易にアクセスできる。一般に、代替リターンアドレスデータ２４２は命令ストリーム自体に格納される。格納された代替リターンアドレスデータ２４２は合法な命令を代表しないか、或いはレジスタやメモリセル内の値のオーバライト等の望ましくない副作用を有するかもしれないので、ルーチンｇ（）の実行はアドレス２４０で続かないかもしれないが、その代わり次の命令(next instruction)２４４で継続しなければならない。
【０００９】
コール２３８が正常にリターンしたときは、コール２３８は次の命令２４４に戻らなければならない。図示のように、ルーチンｇ（）２３６内で次の命令２４４は、格納された代替リターンアドレスデータ２４２から距離Ｄだけオフセットされる。従って、コール２３８が正常にリターンすると、コール２３８は、オフセットＤだけ増分されたリターンアドレス２４０の記憶位置、即ち次の命令２４４の記憶位置によって指定される記憶位置に戻らなければならない。通常、距離Ｄは４バイトの値を有するので、次の命令２４４はリターンアドレス２４０の記憶位置から４バイトだけオフセットされる。
【００１０】
プログラムの格納された代替リターンアドレスへのアクセスは、代替リターンアドレスが必要なときのテーブルルックアップの実現よりも時間効率が良いが、代替リターンアドレスが必要でないときは、格納された代替リターンアドレスにアクセスする能力はプログラムの性能に不利な影響を与えることが多い。関数コールが正常にリターンするときに実行すべきその後の命令を配置するためのリターンアドレスの記憶位置へのオフセットの追加は比較的遅い場合が多く、その後の命令の記憶位置の計算に関連する性能ペナルティを負うかもしれない。言い換えれば、正常リターンに伴う速度は、格納された代替リターンアドレスの実現によって損なわれるかもしれない。更に、正常リターン、又は最も起こりそうなリターンのための「最善の推測」("best-guess" estimate) を生成するためにしばしば使用される分岐予測(branch prediction) は、当業者の承知するように、ジャンプの使用によって損なわれるかもしれない。
【００１１】
別法として、「ジャンプ」を使って、次のように、格納された代替アドレスをバイパスできる。ジャンプ又は分岐は、ある状況で不必要なコードのセクションをバイパスするために、しばしばプログラムルーチンに含まれる。例えば、図２(ｃ）に示すように、ジャンプをルーチンで実現して、関数コールが正常にリターンしたときの格納された代替リターンアドレスのバイパスを可能にできる。ルーチンｇ（）２６６内で関数ｆ（）へのコール２６８が行なわれる。コール２６８が正常にリターンすると、リターンアドレス２７０によって指定されるルーチンｇ（）２６６の記憶位置へのリターンが行なわれる。リターンアドレス２７０に対応する記憶位置は、命令２７２から一定のオフセットに配置される記憶位置Ｌにジャンプするための命令２７２である。従って、コール２６８がリターンアドレス２７０に正常にリターンすると、次の命令２７４へのジャンプが行なわれる。このジャンプは、格納された代替リターンアドレスデータ２７６をバイパスするか、そのまわりに分岐する。
【００１２】
ジャンプの実現は、その後の命令の記憶位置を発見するためにリターンアドレスへのオフセットの追加に伴う性能ペナルティ、例えばハードウェア性能ペナルティを削減するであろうが、ジャンプは遅くなるであろう。ジャンプを可能にするための追加コードをプログラムに含めなければならないので、プログラムの全サイズを増加させるであろう。
【００１３】
上述のように、関数コール用のマルチプルリターンポイントを実現するための従来の方法は、しばしば遅くて非効率であり、従って、マルチプルリターンポイントの実現は関数コールに関連するプログラムの性能に不利に影響するかもしれない。従って、正常リターンと代替リターンの両者が効率的に起こるようにマルチプルリターンポイントを実現するための効率的な方法と装置が望まれる。
【００１４】
【発明の概要】
代替リターンアドレスに容易にアクセスできるように、関数コールに関連する代替リターンアドレスの本質的なキャッシュを効率的に可能にするための方法及び装置を開示する。本発明の一局面によれば、ルーチンによってコールされる関数に関連するリターンアドレスの効率的なキャッシュを可能にするための方法は、ルーチンの実行中にルーチン内から関数をコールすることを含む。一般に、関数はルーチンの外にある。関数は、一旦コールされると実行を開始する。結局、関数はそのルーチンに戻る。具体的には、関数は期待リターンポイント又は正常リターンアドレスによって識別されるルーチン内の記憶位置に戻る。期待リターンポイントに対応するルーチン内の命令は、低い計算オーバヘッドで実行する「ダミー」命令である。ダミー命令は、正常プログラムの実行に対する影響なしに実行するように選択される。即ち、その結果は使用されない。その代わりに、ダミー命令の目的は代替リターンポイント（単数、又は複数）を適当な方法でコード化することである。
【００１５】
一実施形態では、関数が期待される方法でルーチンに戻ると、関数の実行は期待リターンポイントに戻る前に完了され、ダミー命令の実行は効果がない。別の実施形態では、関数が代替リターンポイントに戻らないときは、正常リターンポイントで格納されたダミー命令にアクセスするためのコードが実行され、代替リターンポイントのアドレスはダミー命令が表すライブラリ値から計算される。
【００１６】
本発明のこれら及び他の利点は、下記の詳細説明を一読して各種の図面を検討することによって明らかになるであろう。
【００１７】
本発明は添付の図面に関してなされる下記説明を参照することによって充分に理解されるであろう。
【００１８】
【発明の実施の形態】
コンピュータプログラムによってコールされた関数がそのコンピュータプログラムに戻ろうとするとき、その関数は複数のリターンサイト、つまりリターンポイントの任意の一つにリターンできる。例として、関数は正常に、即ち期待通りに戻るかもしれない。その代わりに、関数は別の形、例えば異常に戻るかもしれない。異常リターンに対応する異常リターンサイトは一般に、それらが容易にアクセスできるように格納されていなければならない。
【００１９】
ある関数からプログラム内の異なるポイントへのリターンを提供する実現例の中には、ルックアップテーブルの代替リターンサイト用のアドレスを格納するものがある。代替リターンアドレスを配置するためのルックアップテーブルを実現化するとしばしば遅くなるまた、異なるサイトへのリターンを提供する他の実現例では、リターンが行なわれる関数へのコールに近い代替リターンアドレスに関するデータを明瞭に格納する。コールに近いデータを明瞭に格納することを含むこの実現は一般に、余分のスペースオーバヘッドを要求するか、ハードウェアの性能ペナルティを負うか、正常リターンに不利な影響を与えるかのいずれかである。
【００２０】
いかなるリターンの効率をも大きく損なうことなしに、或いは性能ペナルティを負うことなしに、関数コールからのマルチプルリターンを実現するために、リターンに対応するアドレス用のデータを、「有用」なオペレーションを本質的に実行しない命令に埋め込むことができる。即ち、実質的に依存性を有さず、通常は殆どオーバヘッドなしで、例えばジャンプの実行より少ないオーバヘッドで実行する命令を使って、代替リターンアドレスをコード化できる。本質的に依存性を有さず、大きなオーバヘッドなしで正常に実行する命令は一般に、「ダミー」命令と見做される。このような命令は、それに限定されないが、移動命令又はテスト命令等の命令を含む。
【００２１】
移動命令は一般に、データをレジスタやスタック記憶位置に移動するために使用される。例として、定数を未使用のレジスタに移動するように構成された移動命令は次のシンタックスを有することができる。
【００２２】
mov constant, unused reg
ここで「unused reg」は、現在は有用値を含まない任意のレジスタであろう。また「constant」は代替リターンアドレス等のデータを含んでいるであろう。テスト命令はレジスタの値によってプロセッサフラグをセットし、次のシンタックスを有することができる、
tst constant reg
ここに「reg」は任意のレジスタでよく、「constant」は代替リターンアドレスに関連するデータを含んでいるであろう。
【００２３】
ダミー命令の実行は通常、わずかな量の計算オーバヘッドしか必要としないので、関数コールからのリターンが正常のときにダミー命令を実行することは、コンピュータシステムの総合性能に不利な影響を与えない。言い換えれば、それを必要としないときにダミー命令を実行することは一般に、コンピュータシステムの性能に実質的な影響を与えない。従って、代替リターンとなるような関数コールに関して使用されるダミー命令の実現は、リターンが正常リターンか代替リターンかに関わらず比較的迅速で、効率的である。
【００２４】
ダミー命令は一般に、プログラムやルーチン内の任意の場所に配置可能である。例として、ダミー命令は、ルーチン内の関数へのコールの直後に位配置可能である。図３（ａ）に関して、ルーチン内の関数へのコールの後のダミー命令の包含(inclusion) について、本発明の実施形態に従って説明する。ルーチンｇ（）３０４は一般に命令３０８を含む。関数ｆ（）へのコール３０８ａは正常にリターンすることもあれば異常にリターンすることもある。
【００２５】
関数ｆ（）へのコール３０８ａが戻るとき、リターンアドレス３１０によって指定されるルーチンｇ（）３０４内の記憶位置へのリターンが行なわれる。リターンアドレス３１０はダミー命令３０８ｂを識別する。ダミー命令３０８ｂは一般に、関数ｆ（）へのコール３０８ａから、例えば４バイトの一定のオフセットに配置される。
【００２６】
一実施形態では、関数ｆ（）へのコール３０８ａが正常にリターンすると、ダミー命令３０８ｂは、当業者の承知するように、特に、サイクル当たりマルチプルの独立命令を実行する最新のスーパスケーラ中央処理装置（ＣＰＵ）の上で、本質的にオーバヘッドを使わずに実行する。それとは別に、関数ｆ（）へのコール３０８ａが代替リターンポイントに戻るときは、それが、ダミー命令３０８ｂを含むバイトを読み取って、ダミー命令３０８ｂでコード化された代替リターンアドレスを抽出する。その後、実行はこの代替リターンポイントに戻ることによって、代替リターンを完了する。
【００２７】
上述のように、ダミー命令３０８ｂが本質的にオーバヘッドを使わずに実行した後、ルーチンｇ（）３０４のその後の命令、つまり次の命令３０８ｃが実行する。命令３０８は通常、多くの他の命令によって先行、ならびに後続されることは言うまでもない。
【００２８】
一実施形態では、関数へのコールは２つ以上の代替リターン又は異常リターンを有することができる。例えば、関数へのコールはマルチプルの可能な例外を伴うことができるが、これは図５（ａ）、５（ｂ）に関して下記に更に詳しく説明する。２つ以上の異常リターンが可能なときは、各異常リターンアドレスが関連ダミー命令を有するようにマルチプルダミー命令を関数コールの近くに含むことができる。単一ダミー命令がレジスタやスタック記憶位置のすべての関連データを保持するために不十分な場合には、マルチプルダミー命令を実現してもよい。
【００２９】
図３（ｂ）は、本発明の実施形態による関数へのコール後にマルチプルダミー命令を実行するコンピュータルーチンの図式表示である。図示のように、ルーチンｇ（）３２４は命令３２８を含む。命令３２８はルーチンｇ（）３２４内の任意の場所に配置できる。言い換えれば、命令３２８はルーチンｇ（）３２４の始まりの近くに配置可能であり、ルーチンｇ（）３２４の中央部や、ルーチンｇ（）３２４の実質的な末尾にも配置可能である。関数ｆ（）へのコール３２８ａが戻るときは、リターンアドレス３３０によって識別された記憶位置へのリターンが行なわれる。リターンアドレスは第１ダミー命令３２８ｂを識別する。第１ダミー命令３２８ｂが実行した後、その第１ダミー命令３２８ｂに続くダミー命令が実行される。最後に、「Ｎ番目」のダミー命令３２８ｃが実行される。
【００３０】
各ダミー命令、例えばダミー命令３２８ｂ、３２８ｃは一般に、ダミー記憶位置がコール３２８ａに対して容易に配置されるように、コール３２８ａから一定のオフセットに配置される。すべてのダミー命令の全実行は、各ダミー命令が個々に、本質的にオーバヘッドを使用しないので、ごくわずかのオーバヘッドしか使用しない。その後の命令、つまり次の命令３２８ｄは「Ｎ番目」のダミー命令３２８ｃが実行した後で実行する。
【００３１】
一般に、ダミー命令は必ずしも、マルチプルリターンサイトを有する関数へのコールの後に配置されるわけではない。ダミー命令は、マルチプルリターンサイトを有する関数へのコールの前に配置されることもできる。図３（ｃ）に関して、ルーチン内の関数へのコール前のダミー命令の挿入を、本発明の実施形態に従って説明する。図示のように、ルーチンｇ（）３４４はダミー命令３４８ａへのコールを含み、それは関数ｆ（）へのコール２４８ｂに先行する。ダミー命令３４８ａは関数ｆ（）へのコール２４８ｂから一定のオフセットに配置される。即ち、ダミー命令３４８ａがルーチンｇ（）３４４内の関数ｆ（）へのコール２４８ｂに先行する度に、ダミー命令３４８ａは関数ｆ（）へのコール２４８ｂに対して同一のオフセットに位置する。一実施形態ではオフセットは４バイトだが、一般には大幅に変化する。関数ｆ（）へのコール３４８ｂが戻るとき、リターンアドレス３５０によって識別された記憶位置へのリターンが行なわれる。上述の実施形態では、リターンアドレス３５０によって識別された記憶位置は命令３４８ａを含む。
【００３２】
次に図４を参照して、プログラムに含まれるルーチンの実行中に関数コールを一般的に実行することに関連するステップを、本発明の実施形態に従って説明する。当業者の承知するように、実行中のルーチンは結局、関数コールに到達できる。ステップ４０２では、ルーチンによってコールされた関数の実行が開始する。関数の実行の進行中は、発生する状態が、関数へのコールは正常リターンになるか、異常、つまり代替リターンになるかを決定する。
【００３３】
ステップ４０２におけるコールされた関数の実行が正常リターンになると、プロセスの流れはステップ４０４に分岐して、そこで、コールされた関数が完了する。コールされた関数の実行が完了した後、ステップ４０６で、関数はリターンアドレス、即ち正常リターンアドレスによって指定された記憶位置に戻る。上述の実施形態では、リターンアドレスによって指定された記憶位置はダミー命令、例えば図３（ａ）に示すダミー命令を含む。一般に、ダミー命令は、プログラムの全実行に伴う内部状態を変えることなく定数を埋め込む任意の適当なほぼ「オーバヘッドなしの(no-overhead) 」命令でよい。先に記載したように、ダミー命令は、それらに限定されないが、移動命令とテスト命令を含んでもよい。
【００３４】
ルーチンは、ダミー命令がステップ４１２で実行された後で実行を続ける。一般に、ルーチンの継続的実行は、追加の関数コールやリターン等の様々な命令の実行を含む。実行すべき命令が残っていないときは、ルーチンの実行は完了する。
【００３５】
ステップ４０２でのコールされた関数の実行に戻ると、コールされた関数の実行が、代替リターン、例えば異常リターンが要求されるようなものであるときは、ステップ４０２からプロセスの流れはステップ４０８に進み、そこで代替リターンアドレスがメモリからロードされる。具体的には、一実施形態では、代替リターンアドレスはオフセットによって増大された正常リターンアドレスからロードされる。
【００３６】
一旦、代替リターンアドレスがロードされると、ステップ４１０で代替リターンアドレスによって識別された記憶位置に、関数からのジャンプが行なわれる。ダミー命令は代替アドレスへのリターンを実行するときにデータとして扱われるので、命令を表すビットも二進値と見做されるという事実が活用される。例として、プロセッサは下記の命令をコード化できる、
mov #1234, reg1
これが、代替リターンアドレスとなる１６進定数「1234」を、バイトシーケンス「5B 00 00 12 34」としてレジスタ「reg1」に移動する。命令のコード化は異なるプロセッサタイプ間で変化するかもしれないが、どのコード化も、命令タイプ、例えば「move」、第１オペランド、例えば定数「1234」、及び第２オペランド、例えば「 reg1 」を含めて、命令のすべての部分を本質的に識別する。
【００３７】
コンパイラは、上述のように、ダミー命令がダミー移動命令の第１オペランドとして代替リターンアドレスを含むように構成する。従って、命令のフォーマットが分かっていれば、定数、例えば代替リターンアドレスの値等の情報は、その情報の２ないし５バイトを整数値として読むことによって取得できる。
【００３８】
当業者の承知するように、ダミー命令は一種のパターンを形成し、そこでは命令ビットの一部は固定で、一部は可変である。固定ビットは、命令の実行が、さもなければ高くつくかプログラムの正常な実行を妨げる副作用があるので、一般に変更してはならない。例として、固定ビットの中には「move」等の命令タイプを示すものもある。命令中の可変ビットは、代替リターンポイントのアドレス等の任意の値のコード化に使用できる。例として、ダミー命令「5B 00 00 12 34」では、バイト「 5B 」はレジスタ「reg1」への移動を示す固定部分、「 00 00 12 34」は可変部分である。一般に、ダミー命令の可変部分は、使用される特定機械命令によって、マルチプルの非連続部分を含む実質的に任意の命令ビットの組合せから構成できる。
【００３９】
ステップ４１０から、代替リターンアドレスへのジャンプが行なわれた後、プロセスの流れはステップ４１３に進み、そこで代替リターンアドレスに関連するコードが実行される。次に、プログラムの実行は、それが完了するまでステップ４１４で続く。
【００４０】
マルチプルリターンアドレスは様々なプログラミング言語メカニズムを実現するのに役立つ。例として、ダミー命令を使って、例外を投入する関数コールを有するルーチンの実行を促進できる。コールされた関数が例外を投入すると、その例外は一般に、コールされた関数によって扱うことができない。代わりに、関数のコーラーが、関数によって投入された例外を扱う。図５（ａ）、図５（ｂ）は、本発明の実施形態による、正常にリターンするか、例外を投入するので異常にリターンする関数の図式表示である。ルーチンｇ（）５０４は関数ｆ（）５１２をコールするトライブロック５０８を含む。ルーチンｇ（）５０４は更に、関数トライ(function try)５０８の実行中に生じる例外を扱うか処理するように構成された例外ハンドラ(exception handler) ５１０を含む。
【００４１】
関数ｆ（）５１２がコールされて、正常にリターン、例えば関数ｆ（）５１２によって例外が投入されないときは、関数ｆ（）５１２は、図５（ａ）で示すように、トライブロック５０８に戻る。具体的には、関数ｆ（）５１２は正常リターンアドレス５１６によって識別されたトライブロック５０８内の記憶位置に戻る。記載の実施形態では、正常リターンアドレス５１６によって識別された記憶位置は、図３（ａ）に関して上述したように、ダミー命令である。
【００４２】
図５（ｂ）に示すように、関数ｆ（）５１２の実行によって例外が投入されると、関数ｆ（）５１２は例外ハンドラ５１０に戻る。即ち、例外が関数ｆ（）５１２によって投入されると、命令関連の例外ハンドラ５１２を識別する代替リターンアドレス５２０によって指定された記憶位置へのリターンが行なわれる。
【００４３】
例外ハンドラ５１０が、関数ｆ（）５１２によって投入された例外を処理した後、関数ｆ（）５１２は結局、トライブロック５０８の後の第１命令５２２で実行を継続する。ダミー命令は、一実施形態では、命令ストリーム内への代替リターンアドレス５２０の格納を可能にする移動命令又はテスト命令等の命令である。
【００４４】
本発明は一般に任意の適切なコンピュータシステムに実現できる。具体的には、マルチプルリターンポイントは、上述のように、例えば図７に関して以下に説明するバーチャルマシンのような任意の適切なバーチャルマシンを使用して実現できる。図６は、本発明の実現に適した典型的な汎用コンピュータシステムを示す。コンピュータシステム７３０は、主記憶装置７３４（通常、リードオンリーメモリ、又はＲＯＭ）と主記憶装置７３６（通常、ランダムアクセスメモリ、又はＲＡＭ）とを含むメモリデバイスに連結された任意数のプロセッサ７３２（中央処理装置、又はＣＰＵとも称する）を含む。
【００４５】
コンピュータシステム７３０、又はより具体的には、ＣＰＵ７３２は、当業者の承知するように、バーチャルマシンを支援するように構成できる。コンピュータシステム７３０上で支援されるバーチャルマシンの一例を、図７に関して以下に説明する。当技術分野で周知のように、ＲＯＭはデータと命令をＣＰＵ７３２に一方向的に転送するように働くが、ＲＡＭは通常、データと命令を二方向的に転送するように使用される。ＣＰＵ７３２は一般に任意数のプロセッサを含んでもよい。主記憶装置７３４、７３６は共に、任意の適切なコンピュータ読取り可能媒体を含んでもよい。通常、マスメモリデバイスである二次記憶媒体７３８もＣＰＵ７３２に二方向的に連結されて、追加のデータ記憶容量を提供する。マスメモリデバイス７３８は、コンピュータコード、データ等を含むプログラムの格納のために使用されるコンピュータ読取り可能媒体である。通常、マスメモリデバイス７３８は、主記憶装置７３４、７３６よりも一般に遅いハードディスクやテープ等の記憶媒体である。マスメモリデバイス７３８は磁気かペーパテープ読取り装置、又は何らかの他の周知のデバイスの形を取ることができる。マスメモリデバイス７３８内に保持された情報は、適切な場合は、バーチャルメモリとしてのＲＡＭ７３６の一部として、標準的な方式で組込みできることは言うまでもない。ＣＤ−ＲＯＭ等の特定の主記憶装置７３４も、データを一方向的にＣＰＵ７３２に渡すことができる。
【００４６】
ＣＰＵ７３２はまた、それらに限定されないが、ビデオモニタ、トラックボール、マウス、キーボード、マイクロホン、接触感知ディスプレイ、トランスデューサカードリーダ、磁気又はペーパテープ読取り装置、タブレット、スタイラス、音声又は手書き認識装置、その他の周知の入力装置、例えば、勿論、他のコンピュータといった装置を含む一つ以上の入出力装置７４０に連結される。最後に、ＣＰＵ７３２はオプションとして、７１２で概略図示するネットワーク接続を使って、コンピュータ又は遠隔通信ネットワーク、例えばローカルエリアネットワーク、インターネットネットワーク、又はイントラネットネットワークに連結してもよい。このようなネットワーク接続を使って、ＣＰＵ７３２はネットワークから情報を受信したり、上述の方法手段を実行する過程で情報を出力するであろうことが予期される。それらの情報は、ＣＰＵ７３２を使って実行される一連の情報として表されことが多いが、例えば、搬送波に組み込まれたコンピュータデータ信号の形でネットワークから受信されたり、ネットワークに出力することができる。上述のデバイスと材料は、コンピュータハードウェアとソフトウェアの分野の当業者には周知であろう。
【００４７】
前述のように、バーチャルマシンはコンピュータシステム７３０上で実行できる。図７は、図７のコンピュータシステム７３０によって支援されて本発明の実現に適したバーチャルマシンの図式表示である。コンピュータプログラム、例えばカリフォルニア州Palo Alto のSun Microsystemsによって開発されたＪａｖａ（商標）プログラミング言語で書かれたコンピュータプログラムが実行されると、ソースコード８１０がコンパイルタイム環境８０５内のコンパイラ８２０に供給される。コンパイラはソースコード８１０をバイトコード８３０に翻訳する。一般に、ソースコード８１０は、それがソフトウェア開発者によって作成される時点でバイトコード８３０に翻訳される。
【００４８】
バイトコード８３０は一般に、再生、ダウンロード、或いは別途にネットワーク、例えば図６のネットワーク７１２を介して配信されるか、図６の主記憶装置７３４等の記憶装置に格納される。記載の実施形態では、バイトコード８３０はプラットホーム独立形(platform-independent)である。即ち、バイトコード８３０は、適切なバーチャルマシン８４０を実行している実質的に任意のコンピュータシステムで実行できる。例として、Ｊａｖａ（商標）環境では、バイトコード８３０はＪａｖａ（商標）バーチャルマシンを実行しているコンピュータシステム上で実行できる。
【００４９】
バイトコード８３０は、バーチャルマシン８４０を含むランタイム環境８３５に供給される。ランタイム環境８３５は一般に、図７のＣＰＵ７３２等のプロセッサを使って実行できる。バーチャルマシン８４０はコンパイラ８４２、インタープリタ８４４、及びランタイムシステム８４６を含む。バイトコード８３０は一般にコンパイラ８４２かインタープリタ８４４のいずれかに供給される。
【００５０】
バイトコード８３０がコンパイラ８４２に供給されると、バイトコード８３０に含まれる方法は、上述のように、機械命令にコンパイルされる。他方、バイトコード８３０がインタープリタ８４４に供給されると、バイトコード８３０は一度に１バイトずつインタープリタ８４４に読み取られる。インタープリタ８４４は次に、各バイトコードがインタープリタ８４４に読み取られるに従って、各バイトコードによって定義されるオペレーションを実行する。一般に、インタープリタ８４４はバイトコード８３０を処理すると共に、バイトコード８３０に関連するオペレーションを実質上連続的に実行する。
【００５１】
方法がオペレーティングシステム８６０からコールされると、その方法を、解釈された方法としてコールするべきであると決定された場合、ランタイムシステム８４６はインタープリタ８４４からその方法を取得できる。他方、その方法、コンパイルされた方法としてコールするベきであると決定された場合、ランタイムシステム８４６はコンパイラ８４６を活性化する。コンパイラ８４２は次にバイトコード８３０から機械命令を生成すると共に、その機械語命令を実行する。一般に、機械語命令は、バーチャルマシン８４０が終了すると放棄される。
【００５２】
本発明の実施形態をごく少数だけ説明したが、本発明は、発明の精神と範囲から逸脱することなく、他の多くの特定形式で具体化できることは言うまでもない。例として、本発明を一般に２つのリターンポイントを有するものとして説明したが、本発明は３つ以上のリターンポイントを有する関数へのコールに関して実現することもできる。一般に、ダミー命令は、コンピュータルーチンの中の、コールされた関数に関連する各リターンポイントに追加できる。
【００５３】
機械命令の中には長さが３２ビットに制限されたものもあるが、それは、完全なリターンアドレスを表すのに必要な全３２ビット又は６４ビット値をコード化するには一般に充分でない。この場合、３２ビット又は６４ビット値を直接にコード化するダミー命令を構築することは不可能かもしれない。しかしながら、それにもかかわらず、本発明を適用して代替リターンポイントへの迅速なアクセスを提供することができる。代替リターンアドレスをダミー命令の中で直接にコード化する代わりに、正常リターンポイントと代替リターンポイント間の距離をコード化できる。この距離値が与えられると、その距離を正常リターンアドレスに加えることによって、代替リターンポイントを容易に計算できる。別法として、ダミー命令中のアドレスの部分を、図３（ｂ）に関して上述したように、マルチプルダミー命令を使ってコード化してもよい。例として、第１ダミー命令が代替リターンアドレスの最初の１６ビットを埋め込み、その一方で第２ダミー命令が３２ビット値の残りの１６ビットを埋め込んでもよい。
【００５４】
マルチプルリターンポイントを有する関数を含むプログラムの実行に関連するステップは一般に大幅に変更できる。例えば、図３（ｃ）に関して上述したように、特定関数コールに関連するダミー命令はその関数コールに先行してもよい。言い換えれば、移動命令やテスト命令等のダミー命令は、本発明の精神と範囲から逸脱することなく、ダミー命令に関連する関数コールに先立って実行できる。
【００５５】
マルチプルリターンポイントの使用は様々な目的に適する。上述のように、マルチプルリターンポイントを使って例外の投入を促進できる。本発明によって如何にして例外を実現できるかの一例のみを説明したが、例外の実現は、本発明の精神と範囲から逸脱することなく、大幅に変更できることは言うまでもない。マルチプルリターンポイントの使用は、非ローカルリターンを利用するシステム、例えばSmalltalk ベースのシステムにおける使用にも適する。マルチプルリターンポイントを使用すると、関連ダミー命令はすべて、マルチプルリターンポイントを有する関数へのコールの後で配置できる。ダミー命令もすべて、関数へのコールの前に配置できる。最後に、ダミー命令は、一部のダミー命令がコールの前に配置されるが、他の命令はコールの後で配置されるように分岐させることができる。従って、本例は説明的と見做すべきであって、制限的と見做してはならず、また本発明は、本明細書に記された詳細に限定すべきではなく、同等仕様の全範囲と共に添付の特許請求項の範囲内で修正可能である。
【図面の簡単な説明】
【図１】外部方法をコールするコンピュータコードの図式表示である。
【図２】（ａ）は、コールスタックと関連リターンポイントテーブルの図式表示であり、（ｂ）は、関数へのコールに関連する代替リターンアドレスを格納するコンピュータルーチンの図式表示であり、（ｃ）は、関数へのコールに関連する格納された代替リターンアドレスを過ぎて分岐するコンピュータルーチンの図式表示である。
【図３】本発明の実施形態による、関数へのコールの後でダミー命令を実行するコンピュータルーチンの図式表示であり、（ｂ）は、本発明の実施形態による、関数へのコールの後でマルチプルダミー命令を実行するコンピュータルーチンの図式表示であり、（ｃ）は、本発明の実施形態による、関数へのコールの前にダミー命令を実行するコンピュータルーチンの図式表示である。
【図４】本発明の実施形態による、複数のリターンポイントを有する関数コールを含むルーチンの実行に関連するステップを示すプロセス流れ線図である。
【図５】（ａ）は、本発明の実施形態による、正常にリターンする関数コールの図式表示であり、（ｂ）は、本発明の実施形態による、投入された例外をもたらすと共に異常にリターンする関数コールの図式表示である。
【図６】本発明の実現に適したコンピュータシステムの図式表示である。
【図７】本発明に実現に適したバーチャルマシンの図式表示である。
【符号の説明】
７１２…ネットワーク、７３２…プロセッサ、７３４…主記憶装置、７３６…ＲＯＭ、７３８…ネットワーク、７４０…入出力装置、８０５…コンパイルタイム環境、８１０…ソースコード、８２０…コンパイラ、８３０…バイトコード、８３５…ランタイム環境、８４０…バーチャルマシン、８４２…コンパイラ、８４４…インタープリタ、８４６…ランタイムシステム、８６０…オペレーティングシステム。
【図１】
0004005724.tif 000002
【図２】
0004005724.tif 000003
【図３】
0004005724.tif 000004
【図４】
0004005724.tif 000005
【図５】
0004005724.tif 000006
【図６】
0004005724.tif 000007
【図７】
0004005724.tif 000008