(57)【要約】プログラムコード変換、特に動的バイナリ変換において、対象コード（１７）を目的コード（２１）にトランスレータ（１９）を通じて変換し、目的プロセッサ（１３）で実行する。ライブラリ関数SFuncA（１７２）のような対象コードの選択部分が、ネイティブ関数NFuncA（２８２）のようなネイティブコードの一部分を代わりに実行することにより置き換えられる。ネイティブ関数は目的プロセッサ（１３）に組み込まれる。更に、対象関数SFuncB（１７３）のような対象コード部分が、ライブラリ関数NFuncB（２８３）のようなネイティブコード部分（２８２）の代わりに実行される。このリバースバインディングでは、対象コードをネイティブコードの選択部分、特にネイティブライブラリ関数の代わりに用いて、制御をトランスレータ（１９）内に保持する。これにより、正確な対象ステートをトランスレータ（１９）において維持し易くなる。
2008546085.tif 000002
【特許請求の範囲】
【請求項１】
対象プロセッサにより実行可能な対象コード（１７）を目的プロセッサ（１３）が実行可能な目的コード（２１）に変換する間に、前記目的プロセッサ（１３）がネイティブに実行可能なネイティブコード（２８）と組み合わせてプログラムコードを実行する方法であって、
第１対象コード部分（１７１）を前記目的プロセッサ（１３）上で変換済み目的コード（２１）として実行するステップと、
前記第１対象コード部分（１７１）からコールしてネイティブコード部分（２８２）を前記目的プロセッサ（１３）上でネイティブに実行するステップと、
を含む、当該方法において、
前記ネイティブコード部分（２８２）からコールして第２対象コード部分（１７３）を変換済み目的コード（２１）として実行するステップと、
前記第２対象コード部分（１７３）の実行から前記ネイティブコード部分（２８２）の実行に戻るステップと、
前記ネイティブコード部分（２８２）の実行から前記第１対象コード部分（１７１）の実行に戻るステップと、
を備えることを特徴とする方法。
【請求項２】
前記ネイティブコード部分（２８２）が等価な対象コード部分（１７２）を有することにより、前記ネイティブコード部分（２８２）が前記等価な対象コード部分（１７２）の代わりに実行される、請求項１記載の方法。
【請求項３】
前記第２対象コード部分（１７３）が等価なネイティブコード部分（２８３）と置き換えられることにより、前記第２対象コード部分（１７３）が前記等価なネイティブコード部分（２８３）の代わりに実行される、請求項１記載の方法。
【請求項４】
前記第２対象コード部分（１７３）が等価なネイティブコード部分（２８３）を含まない、請求項１記載の方法。
【請求項５】
前記第２対象コード部分（１７３）を実行することにより、前記目的プロセッサ（１３）に保持されたエミュレート後の対象ステートを更新して前記対象プロセッサにおける前記対象コード（１７）の実行を表現する、請求項１記載の方法。
【請求項６】
当該方法は更に、
前記第２対象コード部分（１７３）または第２ネイティブコード部分（２８３）のいずれを実行すべきかを判断するステップと、
前記ネイティブコード部分（２８２）から前記第２ネイティブコード部分（２８３）へのリンクか、または前記ネイティブコード部分（２８２）から前記第２対象コード部分（１７３）へのリンクを設けるステップと、
を備える、請求項１記載の方法。
【請求項７】
前記第２対象コード部分（１７３）は、等価なネイティブライブラリ関数の代わりに実行される対象ライブラリ関数を規定する、請求項１記載の方法。
【請求項８】
前記ネイティブコード部分（２８２）は、第１ネイティブライブラリ関数（ＮＦｕｎｃＡ）であり、前記第１ネイティブライブラリ関数は、従属性を有する第２ネイティブライブラリ関数（ＮＦｕｎｃＢ）へのコールを含み、
当該方法は更に、前記コールを前記第２対象コード部分（１７３）へのコールに置き換えるステップを備える、請求項１記載の方法。
【請求項９】
当該方法は更に、
少なくとも第１及び第２ネイティブ関数（ＮＦｕｎｃＡ，ＮＦｕｎｃＢ）を含むネイティブライブラリ（２８０）を前記目的プロセッサ（１３）のメモリに読み込むステップであって、前記第２ネイティブ関数（ＮＦｕｎｃＢ）は、前記第１ネイティブ関数（ＮＦｕｎｃＡ）に対して従属性を有している、ステップと、
前記第２ネイティブ関数（ＮＦｕｎｃＢ）に関連する記憶域への前記ネイティブライブラリ（２８０）内のコールを、前記第２対象コード部分（１７３）に関連する記憶域へのコールに置き換えるステップと、
を備える、請求項１記載の方法。
【請求項１０】
当該方法は更に、
少なくとも第１ネイティブライブラリ（２８０）を読み込むステップと、
前記第１ネイティブライブラリ（２８０）の従属性を解析し、記憶域を一つ以上の従属関数（ＮＦｕｎｃＢ）に割り当てるステップと、
前記一つ以上の従属関数（ＮＦｕｎｃＢ）のうちの少なくとも一つに対する割当て済み記憶域への前記第１ネイティブライブラリ（２８０）内のコールを、前記第２対象コード部分（１７３）に関連する記憶域へのコールに選択的に置き換えるステップと、
を備える、請求項９記載の方法。
【請求項１１】
前記判断するステップは、（ａ）ネイティブ関数（ＮＦｕｎｃＢ）を、逆方向にバインドすべき前記第２ネイティブコード部分（２８３）として識別するための記述と、（ｂ）コールすべき対象関数（ＳＦｕｎｃＢ）を、前記ネイティブ関数（ＮＦｕｎｃＢ）の代わりに使用する前記第２対象コード部分（１７３）として識別するための記述と、を含むリバースバインドポイント記述を設けるステップを含む、請求項６記載の方法。
【請求項１２】
当該方法は更に、前記リバースバインドポイント記述に含まれる前記ネイティブ関数（ＮＦｕｎｃＢ）が発生したときに、前記対象関数（ＳＦｕｎｃＢ）に対するリバースコールスタブ（２１５，２８５）を前記ネイティブコード部分（２８２）に挿入するステップを備える、請求項１１記載の方法。
【請求項１３】
当該方法は更に、前記ネイティブコード（２８）内において、ネイティブ関数コールの前か、後か、もしくは代わりに前記リバースコールスタブ（２１５，２８５）を挿入するステップを備える、請求項１２記載の方法。
【請求項１４】
当該方法は更に、対象コード（１７）から目的コード（２１）への変換を行なうトランスレータ（１９）の内部に前記リバースバインドポイント記述を埋め込むステップを備える、請求項１１記載の方法。
【請求項１５】
当該方法は更に、対象コード（１７）から目的コード（２１）への変換を行なうトランスレータ（１９）の実行の開始時に、保存済みのリバースバインドポイント記述ファイルから前記リバースバインドポイント記述を読み出すステップを備える、請求項１１記載の方法。
【請求項１６】
前記判断するステップは更に、修正版ネイティブライブラリ（２８０）を前記ネイティブコード部分（２８２）として設けるステップを含み、前記修正版ネイティブライブラリ（２８０）は、対象コード（１７）から目的コード（２１）への変換を行なうトランスレータ（１９）によって使用され、前記修正版ネイティブライブラリ（２８０）は更に、前記ネイティブライブラリ（２８０）から前記第２対象コード部分（１７３）へのリンクを含む、請求項６記載の方法。
【請求項１７】
前記ネイティブコード部分（２８２）は、等価な対象ライブラリ関数の代わりに実行される第１ネイティブライブラリ関数（ＮＦｕｎｃＡ）を規定し、前記第２対象コード部分（１７３）は、等価なネイティブライブラリ関数の代わりに実行される対象ライブラリ関数を規定し、当該方法は更に、
ゼロ又は１個以上の第１関数パラメータを目的コード表現からネイティブコード表現に変換し、前記変換されたゼロ又は１個以上の第１関数パラメータを含む前記第１ネイティブライブラリ関数（ＮＦｕｎｃＡ）を、前記第１ネイティブライブラリ関数（ＮＦｕｎｃＡ）のプロトタイプに従って呼び出すステップと、
ゼロ又は１個以上の第２関数パラメータをネイティブコード表現から対象コード表現に変換し、前記変換されたゼロ又は１個以上の第２関数パラメータを含む前記対象ライブラリ関数を、前記対象ライブラリ関数のプロトタイプに従って呼び出すステップと、
前記呼び出された対象ライブラリ関数のゼロ又は１個以上の第２戻り値を、対象コード表現からネイティブコード表現に変換し、前記第１ネイティブライブラリ関数（ＮＦｕｎｃＡ）に戻るステップと、
前記呼び出されたネイティブライブラリ関数のゼロ又は１個以上の第１戻り値を、ネイティブコード表現から対象コード表現に変換し、前記第１対象コード部分（１７１）に戻るステップと、
を備える、請求項１記載の方法。
【請求項１８】
当該方法は更に、リバースコールスタブ（２１５，２８５）を挿入することにより、前記ネイティブコード部分（２８２）から前記第２対象コード部分（１７３）にコールするステップを備える、請求項１記載の方法。
【請求項１９】
前記リバースコールスタブ（２１５，２８５）は、ネイティブコード（２８）内に設けられる、請求項１８記載の方法。
【請求項２０】
前記リバースコールスタブ（２１５，２８５）は、対象コード（１７）から目的コード（２１）への変換を行なうトランスレータ（１９）が生成する目的コード（２１）を含む、請求項１８記載の方法。
【請求項２１】
当該方法は更に、
前記リバースコールスタブ（２１５，２８５）の中間表現を前記対象コード（１７）のブロックに関する中間表現フォレストに結合させるステップと、
前記中間表現フォレストの目的コード（２１）を生成するステップと、
を備える、請求項２０記載の方法。
【請求項２２】
当該方法は更に、
対象コード（１７）から目的コード（２１）への変換を行なうために使用するコンテキストスレッドデータ構造（２１４）を設けるステップと、
前記コンテキストスレッドデータ構造（２１４）を使用して、前記第２対象コード部分（１７３）を前記変換済み目的コード（２１）の形態に変換するステップと、
前記コンテキストスレッドデータ構造（２１４）を前記目的プロセッサ（１３）のメモリに保存するステップと、
前記第２対象コード部分（１７３）が２回目以降に発生したときに、前記保存されたコンテキストスレッドデータ構造（２１４）を再利用するステップと、
を備える、請求項１記載の方法。
【請求項２３】
当該方法は更に、
前記ネイティブコード部分（２８２）からのコールによって実行される少なくとも第３対象コード部分（１７３ｂ）を設けるステップと、
前記第３対象コード部分（１７３ｂ）を前記目的コード（２１）に変換する際に、前記保存されたコンテキストスレッドデータ構造（２１４）を共有して使用するステップと、
を備える、請求項２２記載の方法。
【請求項２４】
前記コンテキストスレッドデータ構造（２１４）には、抽象レジスタバンク（２７）の表現、エミュレートされた対象スタックの場所及びサイズ、スレッド識別子、及び前記対象コード部分の変換に関するトランスレータ固有情報が少なくとも規定される、請求項２２記載の方法。
【請求項２５】
対象プロセッサにより実行可能な対象コード（１７）から目的プロセッサ（１３）により実行可能な目的コード（２１）へのプログラムコード変換を、前記目的プロセッサ（１３）がネイティブに実行可能なネイティブコード（２８）と組み合わせて実行するトランスレータ装置であって、
第１対象コード部分（１７１）を前記目的プロセッサ（１３）上で実行可能な変換済み目的コード（２１）に変換するトランスレータユニット（１９）であって、前記変換後の第１対象コード部分（１７１）は、前記目的プロセッサ（１３）がネイティブコード部分（２８２）をネイティブに実行するためのコールを含む、トランスレータユニット（１９）を備えた、当該トランスレータ装置において、
前記トランスレータユニット（１９）は、前記第２対象コード部分（１７３）の実行を前記ネイティブコード部分（２８２）の実行に戻し、前記ネイティブコード部分（２８２）の実行を前記第１対象コード部分（１７１）の実行に戻すべく、前記第２対象コード部分（１７３）を前記変換済み目的コード（２１）として実行するためのコールを含むように前記ネイティブコード部分（２８２）を提供することを特徴とするトランスレータ装置。
【請求項２６】
前記ネイティブコード部分（２８２）が等価な対象コード部分（１７２）を有することにより、前記ネイティブコード部分（２８２）が前記等価な対象コード部分（１７２）の代わりに実行される、請求項２５記載のトランスレータ装置。
【請求項２７】
前記第２対象コード部分（１７３）が等価なネイティブコード部分（２８３）と置き換えられることにより、前記第２対象コード部分（１７３）が前記等価なネイティブコード部分（２８３）の代わりに実行される、請求項２５記載のトランスレータ装置。
【請求項２８】
前記第２対象コード部分（１７３）が等価なネイティブコード部分（２８３）を含まない、請求項２５記載のトランスレータ装置。
【請求項２９】
第２対象コード部分（１７３）を実行することにより、目的プロセッサ（１３）に保持されるエミュレートされた対象ステートを更新して、対象プロセッサにおける対象コード（１７）の実行を表現する、請求項２５記載のトランスレータ装置。
【請求項３０】
前記トランスレータユニット（１９）は、前記第２対象コード部分（１７３）または第２ネイティブコード部分（２８３）のいずれを実行すべきかを判断し、前記ネイティブコード部分（２８２）から前記第２ネイティブコード部分（２８３）へのリンクか、または前記ネイティブコード部分（２８２）から前記第２対象コード部分（１７３）へのリンクを設けるように構成されている、請求項２５記載のトランスレータ装置。
【請求項３１】
前記第２対象コード部分（１７３）は、等価なネイティブライブラリ関数の代わりに実行される対象ライブラリ関数を規定する、請求項２５記載のトランスレータ装置。
【請求項３２】
前記ネイティブコード部分（２８２）は、第１ネイティブライブラリ関数（ＮＦｕｎｃＡ）であり、前記第１ネイティブライブラリ関数は、従属性を有する第２ネイティブライブラリ関数（ＮＦｕｎｃＢ）へのコールを含み、
前記トランスレータユニット（１９）は、前記コールを前記第２対象コード部分（１７３）へのコールに置き換えるように構成されている、請求項２５記載のトランスレータ装置。
【請求項３３】
前記トランスレータユニット（１９）は、少なくとも第１及び第２ネイティブ関数（ＮＦｕｎｃＡ，ＮＦｕｎｃＢ）を含むネイティブライブラリ（２８０）であって、前記第２ネイティブ関数（ＮＦｕｎｃＢ）が前記第１ネイティブ関数（ＮＦｕｎｃＡ）に対して従属性を有している、前記ネイティブライブラリ（２８０）を前記目的プロセッサ（１３）のメモリに読み込み、前記第２ネイティブ関数（ＮＦｕｎｃＢ）の記憶域への前記ネイティブライブラリ（２８２）内のコールを、前記第２対象コード部分（１７３）に関連する記憶域へのコールに置き換えるように構成されている、請求項２５記載のトランスレータ装置。
【請求項３４】
前記トランスレータユニット（１９）は、少なくとも第１ネイティブライブラリ（２８０ａ）を読み込み、前記第１ネイティブライブラリ（２８０）の従属性を解析して、一つ以上の従属ライブラリ（２８０ｂ）における一つ以上の従属関数（ＮＦｕｎｃＢ）に記憶域を割り当て、前記従属関数（ＮＦｕｎｃＢ）の割当て済み記憶域への前記第１ネイティブライブラリ（２８０ａ）内のコールを、前記第２対象コード部分（１７３）に関連する記憶域へのコールに選択的に置き換えるように構成されている、請求項３３記載のトランスレータ装置。
【請求項３５】
前記トランスレータユニット（１９）は、（ａ）ネイティブ関数を、逆方向にバインドすべき前記第２ネイティブコード部分（２８３）として識別するための記述と、（ｂ）コールすべき対象関数を、前記ネイティブ関数の代わりに使用する前記第２対象コード部分（１７３）として識別するための記述と、を含むリバースバインドポイント記述を参照する、請求項３０記載のトランスレータ装置。
【請求項３６】
前記トランスレータユニット（１９）は、前記リバースバインドポイント記述に含まれる前記ネイティブ関数が発生したときに、前記対象関数に対するリバースコールスタブ（２１５，２８５）を前記ネイティブコード部分（２８２）に挿入するように構成されている、請求項３５記載のトランスレータ装置。
【請求項３７】
前記トランスレータユニット（１９）は、前記ネイティブコード（２８）内において、ネイティブ関数コールの前か、後か、もしくは代わりに前記リバースコールスタブ（２１５，２８５）を挿入するように構成されている、請求項３６記載のトランスレータ装置。
【請求項３８】
前記リバースバインドポイント記述は当該トランスレータ装置の内部に埋め込まれる、請求項３５記載のトランスレータ装置。
【請求項３９】
前記トランスレータユニット（１９）は、当該トランスレータ装置の実行の開始時に、保存済みのリバースバインドポイント記述ファイルから、前記リバースバインドポイント記述を読み出すように構成されている、請求項３５記載のトランスレータ装置。
【請求項４０】
前記トランスレータユニット（１９）は、当該トランスレータ装置による使用に適合した、前記ネイティブコード部分（２８２）を含む修正版ネイティブライブラリ（２８０）を提供するように構成され、前記修正版ネイティブライブラリ（２８０）は更に、前記ネイティブライブラリ（２８０）から前記第２対象コード部分（１７３）へのリンクを含む、請求項３０記載のトランスレータ装置。
【請求項４１】
前記ネイティブコード部分（２８２）は、等価な対象ライブラリ関数（ＳＦｕｎｃＡ）の代わりに実行される第１ネイティブライブラリ関数（ＮＦｕｎｃＡ）を含み、前記第２対象コード部分（１７３）は、等価なネイティブライブラリ関数（ＳＦｕｎｃＢ）の代わりに実行される対象ライブラリ関数（ＳＦｕｎｃＢ）を含み、
前記トランスレータユニット（１９）は、
ゼロ又は１個以上の第１関数パラメータを目的コード表現からネイティブコード表現に変換し、前記変換されたゼロ又は１個以上の第１関数パラメータを含む前記第１ネイティブライブラリ関数（ＮＦｕｎｃＡ）を、前記第１ネイティブライブラリ関数（ＮＦｕｎｃＡ）のプロトタイプに従って呼び出すステップと、
ゼロ又は１個以上の第２関数パラメータをネイティブコード表現から対象コード表現に変換し、前記変換されたゼロ又は１個以上の第２関数パラメータを含む前記対象ライブラリ関数（ＳＦｕｎｃＢ）を、前記対象ライブラリ関数（ＳＦｕｎｃＢ）のプロトタイプに従って呼び出すステップと、
前記呼び出された対象ライブラリ関数（ＳＦｕｎｃＢ）のゼロ又は１個以上の第２戻り値を、対象コード表現からネイティブコード表現に変換し、前記第１ネイティブライブラリ関数（ＮＦｕｎｃＡ）に戻るステップと、
前記呼び出されたネイティブライブラリ関数（ＮＦｕｎｃＡ）のゼロ又は１個以上の第１戻り値を、ネイティブコード表現から対象コード表現に変換し、前記第１対象コード部分（１７１）に戻るステップと、
を実行するように構成されている、請求項２５記載のトランスレータ装置。
【請求項４２】
前記トランスレータユニット（１９）は、リバースコールスタブ（２１５，２８５）を挿入することにより、前記ネイティブコード部分（２８２）から前記第２対象コード部分（１７３）にコールするように構成されている、請求項２５記載のトランスレータ装置。
【請求項４３】
前記リバースコールスタブ（２１５，２８５）は、ネイティブコード（２８）に設けられている、請求項４２記載のトランスレータ装置。
【請求項４４】
前記リバースコールスタブ（２１５，２８５）は、対象コード（１７）から目的コード（２１）への変換を行なうトランスレータ（１９）が生成する目的コード（２１）を含む、請求項４２記載のトランスレータ装置。
【請求項４５】
前記トランスレータユニット（１９）は、前記リバースコールスタブ（２１５，２８５）の中間表現を前記対象コード（１７）のブロックに関する中間表現フォレストに結合して、前記中間表現フォレストの目的コード（２１）を生成するように構成されている、請求項４４記載のトランスレータ装置。
【請求項４６】
前記トランスレータユニット（１９）は、
対象コード（１７）から目的コード（２１）への変換を行なうために使用するコンテキストスレッドデータ構造（２１４）を提供し、
前記コンテキストスレッドデータ構造（２１４）を使用して、前記第２対象コード部分（１７３）を前記変換済み目的コードの形態に変換し、
前記コンテキストスレッドデータ構造（２１４）を前記目的プロセッサ（１３）のメモリに保存し、
前記第２対象コード部分（１７３）が２回目以降に発生したときに、前記保存されたコンテキストスレッドデータ構造（２１４）を再利用する、
ように構成されている、請求項２５記載のトランスレータ装置。
【請求項４７】
前記トランスレータユニット（１９）は、
前記ネイティブコード部分（２８２）からのコールによって実行される少なくとも第３対象コード部分（１７３ｂ）を提供し、
前記第３対象コード部分（１７３ｂ）を前記変換済み目的コードの形態に変換する際に、前記保存されたコンテキストスレッドデータ構造（２１４）を共有して使用する、
ように構成されている、請求項４６記載のトランスレータ装置。
【請求項４８】
前記コンテキストスレッドデータ構造（２１４）には、抽象レジスタバンクの表現、エミュレートされた対象スタックの場所及びサイズ、スレッド識別子、及び前記対象コード部分の変換に関するトランスレータ固有情報が少なくとも規定される、請求項４６記載のトランスレータ装置。
【請求項４９】
対象プロセッサにより実行可能な対象コード（１７）から目的プロセッサ（１３）により実行可能な目的コード（２１）へのプログラムコード変換を前記目的プロセッサ（１３）がネイティブに実行可能なネイティブコード（２８）と組み合わせて実行するための方法を、前記コンピュータにより実行すべく、前記コンピュータが実行可能な命令を記録したコンピュータ読み取り可能な媒体であって、前記方法が、
第１対象コード部分（１７１）を前記目的プロセッサ（１３）上で変換済み目的コード（２１）として実行すること、
前記第１対象コード部分（１７１）からコールしてネイティブコード部分（２８２）を前記目的プロセッサ（１３）上でネイティブに実行すること、
を含む、コンピュータ読み取り可能な媒体において、
前記方法が、
前記ネイティブコード部分（２８２）からコールして第２対象コード部分（１７３）を変換済み目的コード（２１）として実行すること、
前記第２対象コード部分（１７３）の実行から前記ネイティブコード部分（２８２）の実行に戻ること、
前記ネイティブコード部分（２８２）の実行から前記第１対象コード部分（１７１）の実行に戻ること、
を備えることを特徴とする、コンピュータ読み取り可能な媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は概して、コンピュータ及びコンピュータソフトウェアの分野に関し、特に、例えばプログラムコードを変換するコードトランスレータ、コードエミュレータ、及びコードアクセラレータに有用なプログラムコード変換方法及び装置に関する。
【背景技術】
【０００２】
内蔵型ＣＰＵ及び非内蔵型ＣＰＵの両方には、非常に多くのソフトウェアが実装される非常に高性能な命令セットアーキテクチャ（Instruction Set Architectures: ＩＳＡ）が実装されている。これらの命令セットアーキテクチャは、性能を「加速する」ことができる、または、コスト／性能に関してより多くの利点をもたらす無数の高性能プロセッサにおいて、これらのプロセッサが関連ソフトウェアに透過的にアクセスすることができるとする場合に当該プロセッサに「変換する」ことができる。高性能のＣＰＵアーキテクチャはＣＰＵのＩＳＡに時間的に拘束されるので、性能面で進化することができず、かつマーケット面で成長することができないということが判明している。このようなＣＰＵは、ソフトウェア指向プロセッサに共通するアーキテクチャの利点を利用することになる。
【０００３】
このような加速機能、変換機能、及び共通アーキテクチャ機能を容易にするプログラムコード変換方法及び装置は、例えば第ＷＯ００／２２５２１号に開示され、同文献の開示内容を参照することにより当該内容が本明細書に組み込まれる。
【０００４】
ライブラリ関数はコードの或るセクションであり、このセクションを別のプログラムがコールすることで特定の関数を実行する。多くのコンピューティング環境は標準セットのライブラリ関数を、例えばオペレーティングシステムの一部分（「システムライブラリ」）として提供する。他の事例では、一つ以上の独自ライブラリが提供される。対象プログラムが対象コンピューティング環境で実行される場合、これらの外部対象ライブラリに対して関数コールが行われるときに、対象コードの異なる単位の間で制御フローが渡される。或る環境では、所定の対象ライブラリのネイティブ（すなわち、対象アーキテクチャ）バージョンを対象アーキテクチャで利用することができる。従って、対象ライブラリを目的コードに変換するのではなく、これらのネイティブライブラリ関数を必要に応じて利用することが望ましい。ネイティブライブラリをプログラムコード変換に使用する手法は、本出願と同時係属中のＵＳ１０／７４８，３１７号（ＷＯ２００５／００８４７８号参照）に説明されており、同文献の開示内容を参照することにより、当該内容が本明細書に組み込まれる。
【発明の開示】
【発明が解決しようとする課題】
【０００５】
本願発明者らは、このようなネイティブバインディング（native binding）で不具合が生じることを見出した。例えば、実行制御が対象プログラムから取り出され、ネイティブコードに渡されると、従属サブライブラリを使用するといったような、後続の処理の実行を制御することが更に難しくなる。また、最適化を行なう機会が失われる恐れがある。更に、エミュレートされた対象ステートが不正確になる恐れがある。
【課題を解決するための手段】
【０００６】
本発明は、添付の特許請求の範囲に示される装置及び方法を提供する。本発明の好適な特徴は、従属する請求項及び以下の説明から明らかになる。
以下の説明は、本発明の実施形態によって実現し得る種々の態様及び利点を要約したものである。以下の説明は、以下に記載され、かつ本明細書に添付される特許請求の範囲の技術範囲を何ら制限したり、制限を意図したりするものでなく、この技術分野の当業者が設計に関する詳細な説明を一層早く理解し得るためのものとして提示される。
【０００７】
本発明の一つの態様では、対象プロセッサが実行可能な対象コードを目的プロセッサが実行可能な目的コードに変換する間にプログラムコードを実行する方法であって、目的コードを、目的プロセッサがネイティブに実行可能なネイティブコードと組み合わせて実行することができる、方法が提供される。当該方法は、第１対象コード部分を目的プロセッサ上で変換済み目的コードとして実行するステップと；第１対象コード部分からコールして、ネイティブコード部分を目的プロセッサ上でネイティブに実行するステップと；ネイティブコード部分からコールして、第２対象コード部分を変換済み目的コードとして実行するステップと；第２対象コード部分の実行からネイティブコード部分の実行に戻るステップと；ネイティブコード部分の実行から第１対象コード部分の実行に戻るステップと、を含む。
【０００８】
本発明の別の態様では、対象プロセッサが実行可能な対象コードを目的プロセッサが実行可能な目的コードに変換した後にプログラムコードを実行する方法であって、目的コードを、目的プロセッサがネイティブに実行可能なネイティブコードと組み合わせて実行することができる、方法が提供される。当該方法は、少なくとも第１、第２、及び第３対象コード部分、及び少なくとも第１ネイティブコード部分を設けるステップと；第１対象コード部分の実行からコールして第１ネイティブコード部分を実行し、第１ネイティブコード部分が第２対象コード部分の変換済み目的コードバージョンの代わりに実行されるようにするステップと；第１ネイティブコード部分の実行からコールして第３対象コード部分の変換済み目的コードバージョンを実行するステップと；第３対象コード部分の変換済み目的コードバージョンの実行から第１ネイティブコード部分の実行に戻るステップと；第１ネイティブコード部分の実行から第１対象コード部分の実行に戻るステップと、を含む。
【０００９】
本発明の別の態様では、対象プロセッサが実行可能な対象コードを目的プロセッサが実行可能な目的コードに変換することに関連する使用に適したプログラムコード実行方法が提供される。当該方法では、目的コードは、目的プロセッサがネイティブに実行可能なネイティブコードと組み合わせて実行することができる。当該方法は、ネイティブコードの対応する第１及び第２部分を有する対象コードの少なくとも第１及び第２部分を設けるステップであって、第１ネイティブコード部分が第２ネイティブコード部分へのリンクを含む、ステップと；第１対象コード部分を第１ネイティブコード部分にバインドして、第１ネイティブコード部分が第１対象コード部分の変換済み目的コードバージョンの代わりに実行されるようにするステップと；第１ネイティブコード部分に含まれるリンクを第１対象コード部分へのリンクに置き換えて、第２対象コード部分の変換済み目的コードバージョンが第２ネイティブコード部分の代わりに実行されるようにするステップと、を含む。
【００１０】
例示としての実施形態では、本願発明者らは、対象プログラムコードを目的コードに動的にバイナリ変換するランタイムトランスレータに関連して特に有用なプログラムコード変換を迅速に行なうための方法を開発した。
【００１１】
本発明の例示としての実施形態は、プログラムコード変換を行うときの性能を向上させることができる。特に、例示としての実施形態は、ネイティブバインドコード（native bound code ）を変換済み目的コードと組み合わせて使用することに関連して性能を向上させることができる。更に、本発明の実施形態は、トランスレータによる対象コードから目的コードへのプログラムコード変換、及び、ネイティブコードの一部分と組み合わせた形での目的コードの効率的な実行を可能にする。
【００１２】
本発明は更に、ここに規定される複数の方法のうちのいずれかの方法を実行するように構成されるトランスレータユニットを有するトランスレータ装置に拡張することができる。また、本発明は、コンピュータが実行可能な命令を記録するコンピュータ読み取り可能な媒体であって、その命令によって、ここに規定される複数の方法のうちのいずれかの方法が実行される、コンピュータ読み取り可能な媒体に拡張することができる。
【発明を実施するための最良の形態】
【００１３】
以下の説明は、この技術分野の当業者が本発明を構成し、かつ使用できるようにするためのものであり、本発明を実施するための最良の形態を開示している。しかしながら、この技術分野の当業者であれば、種々の変更を容易に想到すると考えられる。その理由は、本発明の一般的な原理が、特に改良型プログラムコード変換方法及び装置を提供するために本明細書において規定されているからである。
【００１４】
専門用語を用いた以下の説明では、対象プログラム（subject program ）が対象プロセッサを含む対象コンピューティングプラットフォームで実行されるように構成される。目的プロセッサを含む目的コンピューティングプラットフォームはトランスレータを通して対象プログラムを実行するために使用され、トランスレータは動的プログラムコード変換を実行する。トランスレータは対象コード（subject code）から目的コード（target code ）へのコード変換を行なって、目的コードを目的コンピューティングプラットフォームで実行可能とする。
【００１５】
図１は、例示としての目的コンピューティングプラットフォーム１４を示し、このプラットフォームは、目的レジスタ１５を含む目的プロセッサ１３を、複数のソフトウェアコンポーネント１７，１９，２０，２１，２２，２７，２８を保存するメモリ１８と共に含む。これらのソフトウェアコンポーネントは、変換対象の対象コード１７と、オペレーティングシステム２０と、トランスレータコード１９と、変換済みコード（目的コード）２１と、抽象レジスタバンク２７と、ネイティブバインド機構２２と、ネイティブコード２８と、を含む。
【００１６】
「目的コード」２１と「ネイティブコード」２８とは区別され、目的コードは対象コード１７のランタイム変換を行なうことにより得られ、ネイティブコードは目的アーキテクチャに関して直接コンパイルされる。目的オペレーティングシステム２０によって提供される目的システムライブラリは、ネイティブコード２８の一例である。これとは異なり、対象システムライブラリの変換は目的コード２１の一例である。ネイティブコード２８はトランスレータ１９の外部で生成される。これは、トランスレータ１９がネイティブコード２８を生成しないことを意味する。また、トランスレータ１９はネイティブコード２８を最適化する機会を持たない。
【００１７】
一つの実施形態では、トランスレータコード１９は、或る対象命令セットアーキテクチャ（ＩＳＡ）の対象コードを別のＩＳＡの変換済み目的コードに、最適化を行なって、もしくは最適化を行なわずに変換するエミュレータである。別の実施形態では、トランスレータ１９は、同じＩＳＡの対象コードを同じＩＳＡの目的コードに、プログラムコード最適化を行なうことにより変換するアクセラレータとして機能する。
【００１８】
一般的には、目的コンピューティングプラットフォーム１４はトランスレータ装置であり、トランスレータ装置はとりわけトランスレータユニット１９を含む。例示としての実施形態では、トランスレータ１９はトランスレータを実行するソースコードのコンパイル済みバージョンである。トランスレータ１９、及びトランスレータ１９によって生成される変換済みコード２１は、通常マイクロプロセッサまたは他の適切なコンピュータである目的プロセッサ１３のオペレーティングシステム２０と連動して実行される。図１に示す構造は例示に過ぎず、例えば本発明の実施形態は、オペレーティングシステムに組み込まれたコード、またはオペレーティングシステムの下位レベルのコードとして用いることができることを理解し得る。対象コード１７、トランスレータコード１９、オペレーティングシステム２０、及びメモリ１８の保存機構は、この技術分野の当業者に公知の種々のタイプのいずれかとすることができる。
【００１９】
図１による装置では、プログラムコード変換は、目的コード２１を実行している間に動的にランタイム時に行なわれることが好ましい。トランスレータ１９は変換済みプログラム２１に従って実行される。トランスレータ１９は、目的アーキテクチャ用にコンパイルされるアプリケーションとして用いることが好ましい。対象プログラム１７は、トランスレータ１９によりランタイム時に変換されて、目的アーキテクチャ１４上で実行される。対象プログラム１７は、トランスレータ１９によりランタイム時に変換されて、目的アーキテクチャ上で直接実行される。トランスレータ１９は更に、対象プログラム１７が行なう対象オペレーティングシステム（ＯＳ）コールを変換して、これらのコールが目的ＯＳ２０に渡されるときに正常に動作するようにする。
【００２０】
対象プログラム１７をトランスレータ１９を通じて実行することにより、２つの異なるタイプのコード、すなわちトランスレータコード１９と目的コード２１とが交互に実行される。トランスレータコード１９は、例えばコンパイラにより、ランタイム時の前にトランスレータ１９の高レベルのソースコード形態に基づいて生成される。これとは異なり、目的コード２１は、トランスレータコード１９によりランタイムの全期間に渡って、変換されているプログラムの保存済み対象コード１７に基づいて生成される。
【００２１】
対象プログラム１７は対象プロセッサ（図示せず）上で実行されるように構成される。一つの実施形態では、トランスレータ１９はエミュレータとして動作する。すなわち、トランスレータ１９は、実際に対象プログラム１７を目的コード２１として目的プロセッサ１３上で実行しながら、対象プロセッサをエミュレートする。
【００２２】
例示としての実施形態では、少なくとも一つのグローバルレジスタストア２７（対象レジスタバンク２７または抽象レジスタバンク２７とも表記される）が設けられる。マルチプロセッサ環境では、任意であるが、二以上の抽象レジスタバンク２７が対象プロセッサのアーキテクチャに従って設けられる。対象プロセッサステートの表現は、トランスレータ１９のコンポーネント、及び目的コード２１によって提示される。すなわち、トランスレータ１９は、対象プロセッサステートを、変数及び／又はオブジェクトのような種々の明示的なプログラミング言語デバイスに保存する。トランスレータ１９をコンパイルするために使用されるコンパイラは、ステート及びオペレーションをトランスレータコードでどのようにして実装するかを決定する。これと比較して、目的コード２１は対象プロセッサステートを目的レジスタ１５及び記憶域（memory location）１８の中に暗示的に提示され、これらの目的レジスタ及び記憶域は、目的コード２１の目的命令によって操作される。例えば、グローバルレジスタストア２７の低レベル表現は、単なる割り当てメモリの或る領域である。しかしながら、トランスレータ１９のソースコードでは、グローバルレジスタストア２７は、高レベルでアクセス可能かつ操作可能なデータアレイまたはオブジェクトである。
【００２３】
図２は、プログラムコード変換中に実行制御を行なう例示としての方法を示す模式フロー図である。
図２に示すように、制御は、最初はトランスレータ制御ループ１９０に入っている。ステップ２０１では、制御ループ１９０はトランスレータコード１９のコード生成関数１９２をコールし、コード生成関数は対象コード１７の或るブロックを変換済みコード２１の対応するブロックに変換する。次に、ステップ２０２では、変換済み目的コード２１の当該ブロックが目的プロセッサ１３上で実行される。好都合なことに、変換済み目的コード２１の各ブロックの終点は、制御を制御ループ２０１に返す命令を含む。別の表現をすると、対象コードを変換するステップ、及び対象コードを実行するステップは交互に行なわれるので、対象プログラム１７の各部分が変換された後、実行される。
【００２４】
ここで、「基本ブロック（basic block ）」という用語は、この技術分野の当業者には公知である。基本ブロックは、厳密に一つのエントリポイント及び厳密に一つのエグジットポイントを有するコードセクションであり、このコードセクションは、コードブロックを単一の制御パスに限定する。従って、基本ブロック群は制御フローの有用な基本単位である。トランスレータ１９は、適切な形で、対象コード１７を複数の基本ブロックに分割する。この場合、各基本ブロックは、単一のエントリポイントの最初の命令と単一のエグジットポイントの最後の命令との間における連続する一連の命令である（ジャンプ命令、コール命令、または分岐命令のような）。トランスレータは、これらの基本ブロックのうちの一つの基本ブロックのみを選択する（ブロックモード）か、または或る基本ブロックグループを選択する（グループブロックモード）。グループブロックは、適切な形で、２つ以上の基本ブロックを含み、これらの基本ブロックは単一ユニットとして一括して処理されることになる。更に、トランスレータは、対象コードの同じ基本ブロックであるが、異なるエントリ条件の基本ブロックを表わすアイソブロック群を形成することができる。
【００２５】
例示としての実施形態では、中間表現（Intermediate Representation:ＩＲ）のツリーは、目的コード２１を元の対象プログラム１７から生成するプロセスの一部分として対象命令シーケンスに基づいて生成される。ＩＲツリーは、対象プログラムによって計算される数式、及び対象プログラムによって行なわれる演算の抽象表現である。後の時点で、目的コード２１はＩＲツリーに基づいて生成される。ＩＲノード群の集合は、実際には有向非巡回グラフ（directed acyclic graphs:ＤＡＧ）であるが、「ツリー群（trees ）」と平易に表記される。
【００２６】
この技術分野の当業者であれば理解し得るように、一つの実施形態では、トランスレータ１９は、オブジェクト指向の、Ｃ＋＋のようなプログラミング言語を使用して実装される。例えば、ＩＲノードはＣ＋＋オブジェクトとして実装され、他のノードへの参照は、これらの他のノードに対応するＣ＋＋オブジェクトへのＣ＋＋参照として実装される。従って、ＩＲツリーは、互いに対する種々の参照を含むＩＲノードオブジェクト群の集合として実装される。
【００２７】
更に、本実施形態において、ＩＲ生成には一連の抽象レジスタ定義が使用される。これらの抽象レジスタ定義は対象アーキテクチャの特定の機能に対応し、この対象アーキテクチャ上で対象プログラム１７が実行されるようになっている。例えば、対象アーキテクチャ上の各物理レジスタ（「対象レジスタ」）に関して固有の抽象レジスタ定義が存在する。従って、トランスレータにおける抽象レジスタ定義はＣ＋＋オブジェクトとして実装され、Ｃ＋＋オブジェクトは、或るＩＲノードオブジェクト（すなわち、ＩＲツリー）への参照を含む。一連の抽象レジスタ定義によって参照される全てのＩＲツリーの集合は、ワーキングＩＲフォレスト（working IR forest ）と表記される（「フォレスト」と呼ばれるのは、フォレストが複数の抽象レジスタルートを含み、これらの抽象レジスタルートの各ルートがＩＲツリーを参照するからである）。これらのＩＲツリー及び他のプロセスは適切な形で、トランスレータコード生成関数１９２の一部分を形成する。
【００２８】
［ネイティブバインディング］
図３は、トランスレータ１９を通じて実行される対象プログラム１７の複数のコンパイル単位１７１，１７２，１７３を示す例示としての実施形態である。この例では、メイン対象実行ファイル１７１が第１ライブラリ１７０ａの関数ＳＦｕｎｃＡ１７２をコールする。この第１対象関数ＳＦｕｎｃＡ１７２が実行されると、第２ライブラリ１７０ｂの第２対象関数ＳＦｕｎｃＢ１７３がコールされる。図３の矢印は、対象プログラムのこれらの異なる単位の間の制御フローを表わす。例えば、第１ライブラリ１７０ａは専用ライブラリであり、第２ライブラリ１７０ｂはシステムライブラリである、または、この逆である。
【００２９】
ライブラリを図３に例示のために示しているが、対象コード単位１７１，１７２，１７３は対象コードのいずれかの適切な部分とすることができる。ネイティブバインディングを用いない場合、対象プログラム１７の単位１７１，１７２，１７３はそれぞれ、目的コード２１に変換され、トランスレータ１９による制御の下で実行される。
【００３０】
図４は、本発明の例示としての実施形態に用いられるネイティブバインディング機構を示している。この場合、トランスレータ１９は、ネイティブバインディングを使用して、対象システムライブラリ関数１７２に対する対象プログラム１７内のコールを、ネイティブシステムライブラリ２８０ａ内の等価な関数に対するコールに置き換える。すなわち、対象プログラム１７１は実際に、ネイティブバウンドコード２８の或るセクションに対するコールを行なう。対象プログラム１７１の変換済み目的コードバージョンはネイティブバウンドコード２８に対するコールを含む。この場合、コールは第１ネイティブライブラリ２８０ａの第１ネイティブ関数ＮＦｕｎｃＡ２８２にバインドされる。
【００３１】
これも図４に示すように、この例示としての例では、今度は、第１ネイティブ関数ＮＦｕｎｃＡが、第２ネイティブライブラリ（すなわち、サブライブラリ）の第２ネイティブ関数ＮＦｕｎｃＢ２８３に対してコールを行なう。すなわち、通常予測される実行シーケンスでは、ネイティブバウンドコード２８３の第２セクションの実行は、ネイティブバウンドコード２８２の第１セクションの実行に続いて行なわれる。
【００３２】
ＭＩＰＳ−ｘ８６用に変換を行なう例では、ｘ８６システム目的ライブラリ「ｌｉｂｃ」は、最先端のｍｅｍｃｐｙ（）（メモリコピー）ルーチンを定義することができる。このルーチンは、ＳＳＥ２ベクトル演算を利用してバイトコピーを極めて高速に行なう。ネイティブバインディング機構２２を使用して、ＭＩＰＳ対象コードのｍｅｍｃｐｙに対する全てのコールがネイティブｍｅｍｃｐｙ（）にバインドされる。これにより、ｍｅｍｃｐｙ（）関数の対象（ＭＩＰＳ）バージョンの変換コストがゼロになる。更に、ｍｅｍｃｐｙ（）関数のネイティブ（ｘ８６）バージョンは、目的ハードウェアの複雑さを非常に大きく意識したものとなっているので、当該バージョンは最も効率的に提供されて関数の所望効果を達成する。
【００３３】
ネイティブバインディングは、対象プログラムの制御フローが、対象コードのネイティブバージョンが存在する対象ライブラリのような対象コード１７の或るセクションに入ったことが検出されると、トランスレータ１９によって実行される。対象コード１７を変換するのではなく、トランスレータ１９は等価なネイティブコード２８を実行する。
【００３４】
目的システムライブラリコールの他に、ネイティブバインディングは更に、例えば非ライブラリ関数のネイティブにコンパイルされたバージョンへの置き換えといったような、任意のコード置き換えに使用することもできる。更に、ネイティブバインディングを使用して、対象システム関数に対するコールを、対象システム関数に対するコールと同じ機能を実現する、または目的システムコールのコールスタブ（Call Stubs）として機能する代替ネイティブ関数に置き換えることにより、対象システムコールを目的アーキテクチャにおいて実行することができる。また、ネイティブバインディングは、関数呼び出しサイト（function call sites ）外の任意の対象コード場所に適用されることにより、（目的コードまたはネイティブコードのいずれかの）任意のコードシーケンス、及び／又は関数コールを、対象プログラムのいずれかの明確なポイントに挿入することができる、または置き換える形で配置することができる。
【００３５】
トランスレータ１９は、ネイティブバインディング機構２２によって特定の対象コード１７の関数群をこれらの関数のネイティブコード２８側の関数群と相関させることができるため、どの対象関数をバインドすべきかについて、且つどのネイティブ関数をこれらの対象関数にバインドすべきかについて認識することができる。トランスレータ１９は、この関数マッピング情報を異なる方法で獲得することができ、いずれの方法を使用するかは、ネイティブバインディング機構２２の形態によって変わる。ネイティブバインディングを実行する特定の機構としては、バインドポイント、ランタイムシンボルパッチ（runtime symbol patching ）、Ｓ−コールなどが挙げられ、これについては本出願と同時係属中のＵＳ１０／７４８，３１７号及びＷＯ２００５／００８４７８号に議論されている。
【００３６】
ネイティブバインディングによって、変換済み対象コードが、ライブラリのネイティブバージョンのような等価な対象コードを変換し実行するのではなく、コードの或る単位のネイティブ（すなわち、目的アーキテクチャ）バージョンを直接実行することが可能となる。これにより、これらのライブラリの対象バージョンの変換に伴なうオーバーヘッドを回避することができる。更に、ネイティブバージョンは、ネイティブバージョンが対象バージョンでは意識されない目的アーキテクチャのアーキテクチャ機能を利用することができるので、同じ機能のずっと効率の高い形態となる。
【００３７】
ネイティブバインディングは利点をもたらすが、制約もある。特に、ネイティブコード２８はトランスレータ１９によって直接制御される訳ではない。
ネイティブコード２８を実行することによって、トランスレータ１９が保持する対象ステートは更新されない。例えば、ネイティブコード２８は抽象レジスタバンク２７を更新しない。また、ネイティブコードは、トランスレータ１９が制御するスタック及びヒープメモリ割り当てのようなエミュレートされた対象メモリ割り当てを考慮に入れない。
【００３８】
ネイティブコードは一つ以上のサブライブラリに対して一つ以上のレベルでコールを行なうことができる。トランスレータ１９は、ネイティブコード２８２によるサブライブラリの使用を制御することができない。実際、サブライブラリは、約百レベルの深度に設定される場合があり、多くのレベルの実行制御がトランスレータ１９から移る。
【００３９】
トランスレータ１９はネイティブコード２２に関する最適化を行なうことができない。例えば、トランスレータ１９はネイティブコードライブラリのコードを最適化する十分な機能を備えるが、この機会は、ネイティブコード２８をトランスレータ１９による制御から独立して実行することにより失われる。
【００４０】
パラメータ変換に関する制約も存在する。例えば、浮動小数点精度に関するような制約が存在し、この場合、対象プログラム１７、トランスレータ１９、及びネイティブコード２８の全てが、等価な浮動小数点精度を共有する訳ではない。
【００４１】
本発明の例示としての実施形態は、ネイティブバインディングに関連して使用され、かつこれらの不具合、及び他の不具合を解決する改良型機構を提供する。
［リバースバインディング（Reverse Binding）］
図５は、本発明の例示としての実施形態に用いられるリバースバインディング技術を示している。
【００４２】
図５に示すように、トランスレータ１９はネイティブコード２８を実行することにより部分的に呼び出され、対象コード１７の一部分が実行される。次に、制御フローはバインドされたネイティブコード２８に戻る。図５のリバースバインディング技術はハイブリッドである。別の表現をすると、対象コード１７の一部分はネイティブコード２８の各部分の間で（トランスレータ１９を通じて）交互に実行される。詳細には、トランスレータ１９を呼び出すことにより、対象コード１７の一部分が、ネイティブコード２８の予測される次の部分の代わりにもしくはそれに加えて、実行される。
【００４３】
図５に示す例では、メイン対象プログラム１７１は、ネイティブバインドコードとして実行される第１ネイティブ関数ＮＦｕｎｃＡ２８２に対するコールを、ステップ［１］で行なう。次に、ステップ［２］では、対象コード関数ＮＦｕｎｃＢ１７３が、トランスレータ１９を通じて、第２ネイティブ関数ＮＦｕｎｃＢ２８３の代わりに目的コードとして実行される。ステップ［３］では、制御がネイティブコード２８に戻ることにより、ＮＦｕｎｃＡ２８２の実行が完了する。最終的に、ステップ［４］では、制御が、メイン対象実行ファイル１７１に戻される。
【００４４】
図６は、リバースバインディングが特に有用となる実際の状況を示すプログラムコードのセクション例を示している。
この例では、ｆｕｎｃｔｉｏｎＡ１７１は対象コードであり、この対象コードは変換され、目的コードとして実行される。トランスレータ１９は、ネイティブコードとして実行される関数「ｇｅｔＳｏｍｅＩｎｆｏ」２８２のネイティブコードバージョンにネイティブにバインドする。このネイティブ関数「ｇｅｔＳｏｍｅＩｎｆｏ」は「ｍａｌｌｏｃ」関数に対するコールを含む。この「ｍａｌｌｏｃ」関数は、「ｇｅｔＳｏｍｅＩｎｆｏ」関数が動作可能となるように、メモリの或るエリアを割り当てる。しかしながら、このメモリ割り当ては、対象コードのｆｕｎｃｔｉｏｎＡによって偶発的に解放されることがある。ｍａｌｌｏｃ関数のネイティブバージョンを実行することにより、メモリリーク及び潜在欠陥が発生する。すなわち、メモリ割り当てが対象コード実行とネイティブコード実行との間でのみ行われるようにする際に、問題が生じる。
【００４５】
図６に示すように、この例では、ネイティブコード関数「ｇｅｔＳｏｍｅＩｎｆｏ」２８２から「ｍａｌｌｏｃ」関数１７３の対象コードバージョンへの逆方向のバインド（リバースバインド）が行なわれる。ネイティブ関数「ｇｅｔＳｏｍｅＩｎｆｏ」２８２が実行されている間、「ｍａｌｌｏｃ」関数に対するコールによってトランスレータ１９が呼び出される。トランスレータ１９は対象「ｍａｌｌｏｃ」関数１７２を目的コードに変換する。「ｍａｌｌｏｃ」及び「ｆｒｅｅ」はこの時点で、トランスレータ１９が保持するエミュレートされた対象ステートで正しくペアリングされる。対象「ｍａｌｌｏｃ」関数１７３を実行することにより得られる結果をネイティブ「ｇｅｔＳｏｍｅＩｎｆｏ」関数２８２に返して、ａＢｕｆｆｅｒを表わすストレージを割り当てる。対象「ｍａｌｌｏｃ」関数１７３を実行した結果をネイティブ「ｇｅｔＳｏｍｅＩｎｆｏ」関数２８２に返して、ａＢｕｆｆｅｒを表わすストレージを割り当てる。
【００４６】
図６の例は例示のために簡易化されている。リバースバインディングは、ネイティブバウンドコードの多くの異なるサイトで行なわれることが好ましく、かつ多くの異なるサブレベルで行なうことができる。
【００４７】
特定の例示としての実施形態では、リバースバインディングは、ネイティブバインドコード２８におけるリンクを、対象コード１７のリバースバインドセクションへのリンクで置き換えることにより適用される。
【００４８】
図７は、リバースバインディングを行なうメモリリアドレッシング機構の例を示している。図７は目的プロセッサ１３のメモリ１８の模式図であり、メモリはとりわけ、ネイティブコードセクション２８２，２８３、及び対象コードセクション１７３を格納する。この場合、図５と同様に、ネイティブ関数ＮＦｕｎｃＡ２８２及びＮＦｕｎｃＢ２８３は、第１及び第２ネイティブライブラリＮＬｉｂＡ２８０ａ及びＮＬｉｂＢ２８０ｂにそれぞれ収納される。従って、第１ライブラリＮＬｉｂＡ２８０ａは第２ライブラリＮＬｉｂＢ２８０ｂに依存し、ＮＬｉｂＢはＮＬｉｂＡに従属する。別の実施形態では、第１及び第２関数ＮＦｕｎｃＡ２８２及びＮＦｕｎｃＢ２８３は単一のライブラリに収納されるが、ＮＦｕｎｃＢは依然としてＮＦｕｎｃＡに従属する。
【００４９】
また、図７は、トランスレータ１９によって対象コード１７３に基づいて生成されている目的コード２１３を示している。目的コード２１３は目的プロセッサ１３上で、対象コード１７３に代わって実行することができる。
【００５０】
目的アーキテクチャは通常、ネイティブライブラリ２８０ａ、及びそのライブラリの全ての従属物（例えば、ライブラリ２８０ｂ）を、要求を受けたときに、例えば動的リンカーを通じてメモリ１８に読み込む。しかしながら、本発明の例示としての実施形態では、ネイティブライブラリ２８０ａ（及びそのライブラリの従属物２８０ｂ）は、トランスレータ１９を初期化したときにメモリ１８に読み込まれる。この場合、多くのメモリを消費するが、ネイティブライブラリ２８０ａ，２８０ｂをトランスレータ１９が更に容易に操作することができるという利点がある。
【００５１】
一つの例では、第１ネイティブライブラリ（ＮＬｉｂＡ２８０ａ）における従属物及びシンボルを解析し、第１ネイティブライブラリ（２８０ａ）におけるリンクを、対象ライブラリ（１７３）における関数であって、リバースバインド対象関数となる関数へのリンクの替わりに用いる。図７では、ＮＦｕｎｃＡ２８２内部からのＮＦｕｎｃＢへのコールが、＿ｒｅｖｅｒｓｅ＿ＮＦｕｎｃＢへのコールに置き換えられる。この置き換えコールは、コールスタブによって適切にネイティブ関数ライブラリ２８２に挿入される。この時点で、リバースコールスタブによって対象関数ＳＦｕｎｃＢ１７３が発生し、対象関数ＳＦｕｎｃＢがトランスレータ１９によって変換され、ＴＦｕｎｃＢ２１３で目的コードとして実行される。
【００５２】
次に、ネイティブバインディング及びリバースバインディングを行なうメカニズム例について詳細に説明することとする。
［リバースバインドポイント（Reverse Bind Points）］
一つの実施形態では、バインドされるネイティブ関数は、特定用途向けの「リバースバインドポイント」記述言語を使用して特定される。リバースバインドポイント記述は、（ａ）逆方向にバインドすべきネイティブ関数、及び（ｂ）逆方向にバインドすべき対応する対象関数を含む。トランスレータ１９はリバースバインドポイント記述を実行の開始時に読み取って、リバースバインドポイント（対象関数をネイティブコードから呼び出す場所）を特定する。
【００５３】
ネイティブライブラリを初期化している間、トランスレータ１９がこれらのリバースバインドポイントに到達すると、該トランスレータ１９はネイティブコード２８内に、適切な対象関数に対するコールスタブを挿入する。
【００５４】
一つの実施形態では、特定のリバースバインドポイント記述は、トランスレータ１９に埋め込まれる。別の実施形態では、リバースバインドポイント記述は、個別のファイルに格納され、これらのファイルはトランスレータ１９によってランタイム時に読み出され、その結果、エンドユーザはリバースバインディング機構２２を、特定のネイティブ−対象関数マッピングを付加することにより制御することができる。
【００５５】
［修正版ネイティブライブラリ］
別の実施形態では、ネイティブライブラリのトランスレータ固有バージョンを予め生成して、リバースコールスタブのようなリバースバインドポイントをライブラリにコンパイル時に埋め込む。
【００５６】
［パラメータ変換］
ネイティブ関数が呼び出されると、トランスレータ１９は目的アーキテクチャのネイティブ呼び出し（native calling）バージョンに従って動作する。これに対し、目的コード２１は、トランスレータ１９が目的コード２１全体を通じて或る一定の呼び出し規約に従って動作する限り、必ずしも目的アーキテクチャ呼び出し規約に従って動作する必要はない。従って、第１呼び出し規約は、ネイティブコード２８を実行するときに適用することができ、第２呼び出し規約は、目的コード２１を実行するときに適用することができる。この場合においては、呼び出し規約は、ネイティブコード２８と目的コード２１との間を移動するときに、または逆の方向に移動するときに切り変えられる。
【００５７】
更に、トランスレータ１９は、データ変換を目的マシンステート（ネイティブコード２８において表現される）と対象マシンステート（目的コード２１において表現される）との間で行なう必要があり、両方のステートは、リバースバインド対象関数１７３の入力パラメータ、及びあるとすれば戻り値に関して作成される。このようなデータ変換の例としては、（ｉ）エンディアン変換（すなわち、バイトスワッピング）、（ｉｉ）データ構造配列、（ｉｉｉ）対象アドレスと目的アドレスとの間の変換、（ｉｖ）値変換（例えば、定数変換または値スケーリング）などが挙げられる。
【００５８】
例えば、ＭＩＰＳアーキテクチャでは、関数パラメータをレジスタに渡し、ｘ８６アーキテクチャでは、パラメータをスタックに渡す。ＭＩＰＳ−ｘ８６トランスレータがネイティブ関数を呼び出す場合、ｘ８６呼び出し規約では、関数パラメータを対象レジスタバンク２７からスタックに移動させる必要がある。逆に、対象ＭＩＰＳ関数に対するリバースバインディングでは、関数パラメータをスタックから対象レジスタバンク２７に移動させる必要がある。
【００５９】
［コールスタブ］
リバースバインド対象関数１７３を呼び出す操作は、パラメータ設定、入力パラメータ変換、関数呼び出し、及び結果変換を含む幾つかのステップを含む。
【００６０】
パラメータ設定とは、コードが関数呼び出しパラメータの値を計算する操作を指す。便利なことに、ネイティブコード２８は、関数がネイティブ関数２８３として、またはリバースバインド対象関数１７３として呼び出されるかどうかに関係なく、パラメータ値を計算する。
【００６１】
入力パラメータ変換により、関数呼び出しパラメータ値が、ネイティブコード２８表現から、対象関数１７３に指定できると考えられるフォーマット及び場所に体系化される。
関数呼び出しはリバースバインド対象関数１７３への実際の関数呼び出しであり、関数呼び出しでは、（再フォーマット済みの）パラメータが、関数プロトタイプが必要とする順番に、トランスレータ１９において適用される呼び出し規約に準拠した方法で体系化される。関数プロトタイプは、関数のパラメータ群の順番及びタイプ、更には関数の戻り値のタイプを示す。例えば、トランスレータが適用する呼び出し規約において、引数をスタックに渡す必要がある場合、リバースバインド対象関数を呼び出すコードは引数を対象スタックに正しい順番で配置し、対象スタックポインタをそれに従って進める。
【００６２】
結果変換処理では、対象関数の戻り値を、もしそれがあるとすれば変換する。リバースバインド対象関数１７３は或る値を、対象アーキテクチャに従ったフォーマットで返し、この値をトランスレータ１９がネイティブコード２８によって使用される表現に変換する。
【００６３】
「パラメータ変換」とは、異なるデータフォーマットと、目的コード２１及びネイティブコード２８の呼び出し規約との間の対応する変換の全てを指す。パラメータ変換を行なうコードは「コールスタブ」と表記され、コールスタブは、下位の関数呼び出しの最小構成のラッパーを含み、ラッパーの目的は、ネイティブコードの呼出元（caller）２８２による対象コードの呼出先（callee）１７３との相互作用を可能にするためにある。従って、単一の「コールスタブ」はネイティブコードコンポーネント２８及び目的コードコンポーネント２１に分割することができる。パラメータ変換が全て目的コード２１において、またはネイティブコード２８において行われるかどうかは、リバースバインディングの形態によって変わる。
【００６４】
［ネイティブコードリバースコールスタブ］
図８は、ネイティブコードに用いられるコールスタブ２８１，２８５を使用する例示としての実施形態を示している。コールが対象コード１７１からネイティブバインド関数Ａ２８２に対して行なわれる場合、ネイティブコードコールスタブ２８１が使用される。逆に、バインドされるネイティブ関数Ａからリバースバインド対象関数Ｂ１７３に対して行なわれる場合、ネイティブコードリバースコールスタブ２８５を用いる。バインドされるネイティブコード２８２内では、トランスレータ１９は、ネイティブライブラリ関数（例えば、図７に示す従属ライブラリ２８３）に対するコールを、リバースコールスタブ２８５に対するコールに置き換える。この場合、リバースコールスタブ２８５はネイティブコードに（予め）書き込まれる。各リバースコールスタブ２８５は上述したパラメータ変換を行ない、リバースバインド対象関数１７３をコールする。
【００６５】
一つの実施形態では、パラメータ変換は、均一リバースコールスタブ関数インターフェースを定義することにより容易になる。均一コールスタブ関数インターフェースは一定の関数シグネチャを、全てのリバースコールスタブ及び対応するデータタイプに関して定義し、これによってトランスレータ１９は、リバースコールスタブ２８１を、下位の対象関数１７３の関数シグネチャ（プロトタイプ）を参照することなく埋め込むことができる。これによりリバースコールスタブ２８５を、ＣまたはＣ＋＋のような高レベルのプログラミング言語に用いることができ、これによってネイティブバインディング及びリバースバインディング機構にトランスレータ１９のエンドユーザが更にアクセスし易くなる。
【００６６】
別の実施形態では、パラメータ変換は、双方向均一コールスタブ関数インターフェースを定義することにより容易になる。このコールスタブ関数インターフェースは一定の関数シグネチャを、全てのネイティブバインド関数コール２１１及び全てのリバースバインド関数コール２８２に関して定義する。その結果、ネイティブバインディング及びリバースバインディング機構にトランスレータ１９のエンドユーザが一層更にアクセスし易くなる。
【００６７】
［目的コードコールスタブ］
図９は、目的コードコールスタブ２１１及び目的コードリバースコールスタブ２１５を使用する別の例示としての実施形態を示している。この場合、ネイティブバインディング及びリバースバインディングに関するパラメータ変換は全てが目的コード２１において行なわれる。この実施形態では、トランスレータ１９は、対象コード１７１からのネイティブバインディングコールをデコード時に検出し、パラメータ変換情報をＩＲ（中間表現）ツリー（ツリーは最終的に目的コードとして生成される）によってエンコードする。パラメータ変換情報、及びネイティブ関数プロトタイプの詳細をＩＲに保持することにより、コールスタブコード２１１が対象コードに組み込まれる（すなわち、コールスタブのＩＲは、対象コードのＩＲから区別することができない）。これにより、トランスレータは最適化（例えば、グループブロック群）をパラメータ変換コードに適用することができる。これとは異なり、対象レジスタをネイティブコードコールスタブ２１１において行なわれる関数パラメータにマッピングする操作（上に説明した）のような、ネイティブコードにおいて行なわれるパラメータ変換はトランスレータ１９の外部で行なわれ、かつ容易に最適化することができない。同様に、リバースコールスタブ２１５が目的コードにも設けられ、最適化はトランスレータ１９内で行なわれる。
【００６８】
ネイティブコードコールスタブ２８１，２８５、及び目的コードコールスタブ２１１，２１５はペアとして適切に用いられるが、混合ペアを用いることも可能である。すなわち、ネイティブコードコールスタブ２８１を目的コードリバースコールスタブ２８５と共に使用するか、または目的コードリバースコールスタブ２８５をネイティブコードコールスタブ２８１と共に使用する。
【００６９】
上記したように、本発明の例示としての実施形態は主として、ネイティブ関数を対象関数の替わりに用いる操作（ネイティブバインディング）、及び対象関数をネイティブ関数の替わりに用いる操作（リバースバインディング）に関するものである。しかしながら、本発明の実施形態は、更に任意の代替及び追加の形態に拡張することもできる。詳細には、リバースバインディングは、追加のリバースバインド対象関数コールをネイティブコードルーチンに埋め込むことにより、適切に実行される。この場合、追加の対象関数コールは一時的に実行制御をトランスレータ１９に戻される。一例として、トランスレータはコードを実行して、例えばエミュレートされた対象ステートを、制御をネイティブコードに戻す前に更新することができる。別の例として、トランスレータは、プロファイリングを適用して、ネイティブバインドコードを対象プログラムの特定ポイントで呼び出す操作と、または変換済み対象コードを対象プログラムの特定ポイントで呼び出す操作とを動的に選択する。
【００７０】
［コンテキストの再利用］
図１０は、本発明の例示としての実施形態の別の態様を示している。
図１０は、コンテキストスレッド２１４の模式的な表現である。コンテキストスレッド２１４はデータ構造であり、このデータ構造は多様なデータセットを保持し、この構造によってトランスレータ１９はマルチスレッドプログラムで動作することができる。例えば、データ構造はとりわけ、抽象レジスタバンク２７の現在値、エミュレートされた対象スタックの場所、エミュレートされた対象スタックのサイズ、スレッド識別子、及び対象スレッドの変換についてのトランスレータ固有情報を保持する。
【００７１】
新規のコンテキストスレッドは、マルチスレッドプログラムの各スレッドに関して生成される。また、コンテキストスレッドは各リバースバインド対象関数１７３に関して使用される。すなわち、リバースバインド関数１７３が発生するたびに、トランスレータ１９は、コンテキストスレッド２１４を、このスレッドを実行する必要がある環境として供給する。
【００７２】
ところが、各コンテキストスレッドの生成に関連したオーバーヘッドが発生する。詳細には、空間をコンテキストスレッドのために予約し、次に適切な値を持つデータ構造を収集するためにワークが必要になる。新規のコンテキストスレッドの生成には非常に高いコストが伴なう。
【００７３】
本発明の例示としての実施形態では、単一のコンテキストスレッドを複数のリバースバインド対象関数が共有する。最も好ましくは、図１０に示すように、単一のコンテキストスレッドデータ構造２１４ａを生成し、次に第１リバースバインド対象関数１７３ａに使用する。対象関数１７３ａが完了すると、コンテキストスレッド２１４ａを保存し、かつ廃棄しない。データ構造はメモリ１８にそのまま残る。
【００７４】
図１０に示すように、第２リバースバインド対象関数１７３ｂが発生すると、保存済みの対象コンテキストが取り出され、再利用される。この場合、保存済みのコンテキストスレッド２１４ａが取り出されて、第２リバースバインド対象関数１７３ｂのコンテキストスレッド２１４ｂとなる。このプロセスが繰り返されることにより、コンテキストスレッド２１４ｂが保存され、第３リバースバインド対象関数１７３ｃのコンテキストスレッド２１４ｃとして再利用される。
【００７５】
コンテキストスレッドを再利用するたびに、対応する対象関数１７３ｂ、１７３ｃに適する値を持つ当該コンテキストスレッドが再収集される。しかしながら、このような再収集に要するコストは、新しいコンテキストスレッドを生成するために要するコストよりもずっと小さい。その結果、トランスレータ１９におけるオーバーヘッドは非常に小さい。
【００７６】
上述した例示としての実施形態は多くの利点を有する。例えば、トランスレータは実行制御の手段を、ネイティブコード２８を実行する場合でも、ネイティブコードのセクション群を逆方向にトランスレータの対象コードにバインドすることにより保持することができる。更に、リバースバインド対象コードを実行することにより、抽象レジスタバンク２７のような、トランスレータ１９が保持する対象ステートを更新する。また、リバースバインド対象コードを実行することにより、トランスレータは、スタック及びヒープメモリ割り当てのような、エミュレートされた対象メモリ割り当てを更新することができる。トランスレータは、バインドされたネイティブコードにおけるサブライブラリの使用を、リバースバインディングを適切に配置することにより制御することができる。レベル制御をイネーブルにすると、トランスレータは最適化を行なうことができる。パラメータ提示は、例えばネイティブコード関数が対象コードと同レベルの浮動小数点精度を共有することがないようにすることにより改善される。
【００７７】
種々の好適な実施形態について示し説明したが、この技術分野の当業者であれば、種々の変更及び変形が、添付の特許請求の範囲に規定される本発明の技術範囲から逸脱しない限り加え得ることを理解し得る。
【００７８】
本明細書に開示する全ての特徴（特許請求の範囲、要約書、図面を含む）、及び／又は開示される全ての方法またはプロセスの全てのステップは、このような特徴及び／又はステップの少なくとも或る部分が相容れない組合せを除いて、如何なる組合せをも採り得る。
【００７９】
本明細書に開示する各特徴（特許請求の範囲、要約書、図面を含む）は、特に断らない限り、同一な、等価な、または同様の目的を達成する別の特徴により置き換えることができる。従って、特に断らない限り、開示する各特徴は一般的な一連の等価な、または同様な特徴の一例に過ぎない。
【００８０】
本発明は上記した実施形態（複数の実施形態）に限定されない。本発明は、本明細書に開示する複数の特徴（特許請求の範囲、要約書、図面を含む）のうちいずれか一つの新規な特徴、またはこれらの特徴のいずれかの新規の組合せ、或いはこれまでに開示したいずれかの方法またはプロセスの複数のステップのいずれか一つの新規のステップ、またはこれらのステップのいずれかの新規の組合せに拡張することができる。
【図面の簡単な説明】
【００８１】
【図１】本発明の実施形態を適用することができる装置を表わすブロック図である。
【図２】実行制御をプログラムコード変換中に行なう例示としての方法を示す模式フロー図である。
【図３】例示としてのトランスレータにおける例示としての対象プログラムの模式図である。
【図４】ネイティブバインドを使用する例示としての実施形態の動作フローを示す模式ブロック図である。
【図５】例示としてのリバースバインド関数の模式図である。
【図６】ネイティブバインド関数及びリバースバインド対象関数を含むプログラムコードの例である。
【図７】目的プロセッサにおけるメモリのレイアウト例である。
【図８】ネイティブバインド及びリバースバインドに関する例示としての第１機構を示す。
【図９】ネイティブバインド及びリバースバインドに関する例示としての別の機構を示す。
【図１０】コンテキストをトランスレータにおいて再利用してプログラムコード変換を行なう例示としての機構を示す。
【図１】
2008546085.tif 000003
【図２】
2008546085.tif 000004
【図３】
2008546085.tif 000005
【図４】
2008546085.tif 000006
【図５】
2008546085.tif 000007
【図６】
2008546085.tif 000008
【図７】
2008546085.tif 000009
【図８】
2008546085.tif 000010
【図９】
2008546085.tif 000011
【図１０】
2008546085.tif 000012
【国際調査報告】
2008546085.tif 000013
2008546085.tif 000014
2008546085.tif 000015