(57)【要約】対象コードを目的コードにトランスレーションする間にネイティブ関数に対する呼び出しを挿入するためのネイティブ結合技術が、提供されている。これは、対象コード関数に対する対象プログラム内での関数呼び出しの代わりに、目的コードにおいて、同じ機能のネイティブ同等物に対する呼び出しが用いられるように行なわれる。ネイティブ関数（１１７）呼び出しのパラメータを、目的コード表現から変換することが、ネイティブ・コード（２８）表現、ネイティブ・コード（２８）呼び出し規約、およびネイティブ関数（１１７）プロトタイプと整合するように行なわれる。
2007529063.tif 000002
【特許請求の範囲】
【請求項１】
対象プロセッサによって実行可能な対象プログラム・コード（１７）を、目的プロセッサ（１３）によって実行可能な目的プログラム・コード（２１）にトランスレーションする間に、ネイティブ・コード（２８）を実行するためのネイティブ結合を行なうための方法であって、前記ネイティブ・コード（２８）は、前記目的プロセッサ（１３）によって実行可能なコードであり、前記方法は、
対応するネイティブ・コード（２８）を有する特定の対象プログラム・コード（１７）を特定すること、
前記特定された対象プログラム・コード（１７）に対応するネイティブ・コード（２８）を特定すること、
前記特定された対象プログラム・コード（１７）のトランスレート済みバージョンを実行する代わりに、前記対応するネイティブ・コード（２８）を実行すること、
を備える方法。
【請求項２】
請求項１に記載の方法において、
前記特定された対象プログラム・コード（１７）が対象関数（１０９）に対応し、前記特定されたネイティブ・コード（２８）がネイティブ関数（１１７）に対応し、
前記ネイティブ・コード（２８）を実行するステップは、
前記対象プログラム・コード（１７）のトランスレーションにおいて、前記対象関数（１０９）の代わりに前記ネイティブ関数（１１７）を実行することを含む、方法。
【請求項３】
請求項２に記載の方法において、
前記ネイティブ関数（１１７）を実行するステップは、
ゼロ以上の関数パラメータを目的コード表現からネイティブ・コード（２８）表現に変換すること、
前記ネイティブ関数（１１７）を、前記ネイティブ関数（１１７）のプロトタイプに基づいて、前記変換された関数パラメータを用いて呼び出すこと、
前記呼び出されたネイティブ関数（１１７）のゼロ以上の戻り値を、ネイティブ・コード（２８）表現から目的コード表現に変換すること、
を含む、方法。
【請求項４】
請求項３に記載の方法において、前記変換するステップにおける少なくとも１つの変換は、該変換の中間表現を生成する、方法。
【請求項５】
請求項３または４に記載の方法において、前記変換するステップにおける少なくとも１つの変換は、目的コードを生成する、方法。
【請求項６】
請求項３、４、または５に記載の方法において、前記ネイティブ関数（１１７）を実行するステップはさらに、
目的コードにおいて、すべての対象レジスタ値を目的コード表現からネイティブ・コード（２８）表現に変換すること、
統一された呼び出しスタブ・インターフェースに基づいて、前記変換された対象レジスタを用いて、目的コードからネイティブ・コード（２８）呼び出しスタブ関数を呼び出すこと、
ネイティブ関数（１１７）のプロトタイプに基づいて、特定の対象レジスタおよび／またはパラメータ・スタックを用いて、ネイティブ・コード（２８）呼び出しスタブ関数からネイティブ関数（１１７）を呼び出すこと、
を含む、方法。
【請求項７】
請求項３〜６のうちのいずれか１項に記載の方法において、前記ネイティブ関数（１１７）を実行するステップは、
関数パラメータを、目的コード表現からネイティブ・コード（２８）表現に変換すること、
前記ネイティブ関数（１１７）のプロトタイプに基づいて、前記変換された関数パラメータを用いて、前記ネイティブ関数（１１７）を呼び出すこと、
前記呼び出されたネイティブ関数（１１７）の結果を、ネイティブ・コード（２８）表現から目的コード表現に変換すること、
を含む、方法。
【請求項８】
請求項３〜７のうちのいずれか１項に記載の方法において、前記関数パラメータを変換するステップおよび前記ネイティブ関数（１１７）呼び出すステップは、対象コードにおいて、対象命令セットに加えられるトランスレータ固有の命令によって記述される、方法。
【請求項９】
請求項１〜８のうちのいずれか１項に記載の方法において、前記特定の対象コードおよびその対応するネイティブ・コード（２８）を特定するステップは、結合点の記述を用いて行なわれる、方法。
【請求項１０】
請求項９に記載の方法において、前記結合点の記述は対象関数（１０９）およびネイティブ関数（１１７）を含み、該対象関数（１０９）は、対応するネイティブ・コード（２８）を有する特定の対象プログラム・コード（１７）を特定し、該ネイティブ関数（１１７）は、前記対応するネイティブ・コード（２８）を特定する、方法。
【請求項１１】
請求項１０に記載の方法であって、さらに、
対象コードのトランスレーションの間に、前記結合点の記述に含まれる前記対象関数（１０９）に遭遇すると、目的コード内に、前記ネイティブ関数（１１７）に対する呼び出しスタブを挿入すること、
を備える方法。
【請求項１２】
請求項９、１０、または１１に記載の方法において、前記結合点の記述を、トランスレーションを行なうトランスレータ内に埋め込む、方法。
【請求項１３】
請求項９〜１２のうちのいずれか１項に記載の方法であって、さらに、
トランスレーション実行の開始時に、前記結合点の記述を、記憶された結合点の記述ファイルから読み取ること、
を備える方法。
【請求項１４】
請求項９〜１３のうちのいずれか１項に記載の方法において、前記結合点の記述は、対象コード内の箇所および対応するネイティブ関数（１１７）を含み、該対象コード内の箇所は、対応するネイティブ・コード（２８）を有する特定の対象プログラム・コード（１７）を特定し、該ネイティブ関数（１１７）は、前記対応するネイティブ・コード（２８）を特定する、方法。
【請求項１５】
請求項９〜１４のうちのいずれか１項に記載の方法において、前記結合点の記述は、対象コード内の箇所および呼び出すべきコードに対する参照を含み、該対象コード内の箇所は、対応するネイティブ・コード（２８）を有する特定の対象プログラム・コード（１７）を特定し、該呼び出すべきコードに対する参照は、前記対応するネイティブ・コード（２８）を特定する、方法。
【請求項１６】
請求項１５に記載の方法において、前記呼び出すべきコードは目的コードである、方法。
【請求項１７】
請求項９〜１６のうちのいずれか１項に記載の方法において、前記結合点の記述は、対象関数（１０９）呼び出しの前、後、あるいはその代わりに目的コード内に挿入されるネイティブ関数（１１７）呼び出しを含む、方法。
【請求項１８】
請求項９〜１７のうちのいずれか１項に記載の方法であって、さらに、
対象対ネイティブ関数（１１７）マッピングを、前記対象プログラムの記号テーブル内でエンコードすること、
前記対象プログラムの前記記号テーブル内のエントリを特別なネイティブ結合マーカと取り替えること、
前記特別なネイティブ結合マーカを、このマーカにトランスレーションの間に遭遇したときに、呼び出すべき適切なネイティブ関数（１１７）を特定する結合点の記述としてインタープリットすること、
を含む実行時記号パッチングを実行する方法。
【請求項１９】
請求項９〜１８のうちのいずれか１項に記載の方法において、前記結合点の記述は、外部のスキゾ呼び出しコマンドに対する対応を含み、該スキゾ呼び出しコマンドはトランスレータ固有のネイティブ結合命令であり、前記方法は、
前記対象コードのトランスレーションの間に、外部のスキゾ呼び出しコマンドを特定する結合点の記述に遭遇したときに、トランスレーションのフローを変えて、前記外部のスキゾ呼び出しコマンドの実行とすることを備える方法。
【請求項２０】
請求項１９に記載の方法において、前記外部のスキゾ呼び出しコマンド実行ステップは、
前記外部のスキゾ呼び出しコマンドをインタープリットすること、
前記外部のスキゾ呼び出しコマンドの中間表現を生成することであって、前記コマンドは、関数パラメータを目的コード表現からネイティブ・コード（２８）表現に変換し、ネイティブ関数（１１７）のプロトタイプに基づいて、該変換された関数パラメータを用いて、ネイティブ関数（１１７）を呼び出す、生成すること、
を含む、方法。
【請求項２１】
請求項１９に記載の方法において、前記外部のスキゾ呼び出しコマンド実行ステップは、
前記外部のスキゾ呼び出しコマンドをインタープリットすること、
前記外部のスキゾ呼び出しコマンドに対する目的コードを生成することであって、前記コマンドは、関数パラメータを目的コード表現からネイティブ・コード（２８）表現に変換し、ネイティブ関数（１１７）のプロトタイプに基づいて、該変換された関数パラメータを用いて、ネイティブ関数（１１７）を呼び出す、生成すること、
を含む、方法。
【請求項２２】
請求項１〜２１のうちのいずれか１項に記載の方法であって、さらに、
スキゾ呼び出しコマンドを対象コードに挿入することであって、該スキゾ呼び出しコマンドは、トランスレータ固有のネイティブ結合命令である、挿入すること、
対象コードのトランスレーションの間に前記スキゾ呼び出しコマンドを検出すること、
を備える方法。
【請求項２３】
請求項２２に記載の方法であって、さらに、
対象コードのトランスレーションの間にスキゾ呼び出しコマンドに遭遇したときに、トランスレーションのフローを変えてスキゾ呼び出しコマンドの実行とすること、
を備える方法。
【請求項２４】
請求項２３に記載の方法において、前記スキゾ呼び出しコマンド実行ステップは、
前記外部のスキゾ呼び出しコマンドをインタープリットすること、
前記スキゾ呼び出しコマンドの中間表現を生成することであって、前記コマンドは、関数パラメータを目的コード表現からネイティブ・コード（２８）表現に変換し、ネイティブ関数（１１７）のプロトタイプに基づいて、該変換された関数パラメータを用いて、ネイティブ関数（１１７）を呼び出す、生成すること、
を含む、方法。
【請求項２５】
請求項２３に記載の方法において、前記スキゾ呼び出しコマンド実行ステップは、
前記スキゾ呼び出しコマンドをインタープリットすること、
前記スキゾ呼び出しコマンドに対する目的コードを生成することであって、前記コマンドは、関数パラメータを目的コード表現からネイティブ・コード（２８）表現に変換し、ネイティブ関数（１１７）のプロトタイプに基づいて、該変換された関数パラメータを用いて、ネイティブ関数（１１７）を呼び出す、生成すること、
を含む、方法。
【請求項２６】
請求項２２〜２５のうちのいずれか１項に記載の方法において、前記スキゾ呼び出しコマンドは、複数のサブ・コンポーネント命令を含む可変長命令である、方法。
【請求項２７】
請求項２６に記載の方法において、前記複数のサブ・コンポーネント命令はスキゾ・エスケープ・サブコンポーネント命令を含み、前記スキゾ呼び出しコマンドを検出するステップはさらに、前記スキゾ・エスケープ・サブコンポーネント命令を検出することを含む、方法。
【請求項２８】
請求項２７に記載の方法において、前記スキゾ・エスケープ・サブ・コンポーネント命令はさらに、スキゾ呼び出しコマンドのその他のサブ・コンポーネント命令によって表わされるスキゾ呼び出しコマンドの形式を特定する、方法。
【請求項２９】
請求項１〜２８のうちのいずれか１項に記載の方法であって、さらに、
ネイティブ結合スクリプトを含むネイティブ結合実施スクリプト言語を構文解析してデコードすること、
トランスレーションの間に前記ネイティブ結合スクリプトをインタープリットすること、
前記ネイティブ結合スクリプトの中間表現を生成して、関数パラメータを目的コード表現からネイティブ・コード（２８）表現に変換すること、
を備える方法。
【請求項３０】
請求項２９に記載の方法であって、さらに、
前記ネイティブ結合スクリプトの中間表現を、対象コードのブロックに対する中間表現フォレストに統合すること、
前記中間表現フォレストに対する目的コードを生成すること、
を備える方法。
【請求項３１】
請求項１〜３０のうちのいずれか１項に記載の方法であって、さらに、
目的コードにおいて、すべての対象レジスタ値を目的コード表現からネイティブ・コード（２８）表現に変換すること、
統一された呼び出しスタブ・インターフェースに基づいて、前記変換された対象レジスタを用いて、目的コードからネイティブ・コード（２８）呼び出しスタブ関数を呼び出すこと、
前記ネイティブ・コード（２８）呼び出しスタブ関数をインタープリットすること、
ネイティブ・コード（２８）呼び出しスタブ関数結合スクリプトの中間表現を生成して、関数パラメータを目的コード表現からネイティブ・コード（２８）表現に変換すること、を備える方法。
【請求項３２】
請求項２１または請求項２１に従属するいずれかの請求項に記載の方法であって、さらに、
ネイティブ・コード（２８）呼び出しスタブ関数の中間表現を、対象コードのブロックに対する中間表現フォレストに統合すること、
前記中間表現フォレストに対する目的コードを生成すること、
を備える方法。
【請求項３３】
請求項３または請求項３に従属するいずれかの請求項に記載の方法において、
前記ネイティブ関数（１１７）を実行するステップはさらに、
目的コードにおいて、すべての対象レジスタ値を目的コード表現からネイティブ・コード（２８）表現に変換すること、
前記変換された対象レジスタを用いて、目的コードから、ネイティブ・コード（２８）呼び出しスタブ関数を呼び出すこと、
ネイティブ関数（１１７）のプロトタイプに基づいて、特定の対象レジスタおよび／またはパラメータ・スタックを用いて、ネイティブ・コード（２８）呼び出しスタブ関数から、ネイティブ関数（１１７）を呼び出すこと、
を含む、方法。
【請求項３４】
請求項１〜３３のうちのいずれか１項に記載の方法であって、さらに、
ネイティブ・コード（２８）呼び出しスタブ関数のスクリプト言語の実施を構文解析すること、
前記構文解析されたネイティブ・コード（２８）呼び出しスタブ関数をコンパイルして、ネイティブ・コード（２８）実行可能モジュールにすること、
前記ネイティブ・コード（２８）実行可能モジュールを、トランスレーションを行なうための実行ファイルとリンクさせること、
を備える方法。
【請求項３５】
請求項３４に記載の方法において、前記ネイティブ・コード（２８）実行可能モジュールは、
目的コードにおいて、すべての対象レジスタ値を目的コード表現からネイティブ・コード（２８）表現に変換すること、
前記変換された対象レジスタを用いて、目的コードから、ネイティブ・コード（２８）呼び出しスタブ関数を呼び出すこと、
ネイティブ関数（１１７）のプロトタイプに基づいて、特定の対象レジスタおよび／またはパラメータ・スタックを用いて、前記ネイティブ・コード（２８）呼び出しスタブ関数から、ネイティブ関数（１１７）を呼び出すこと、
に対して実行可能である、方法。
【請求項３６】
請求項３４または３５に記載の方法において、前記特定の対象コードおよびその対応するネイティブ・コード（２８）を特定するステップは、結合点の記述を用いて行なわれ、前記結合点の記述は、対象関数（１０９）およびネイティブ・コード（２８）呼び出しスタブ関数を含み、該対象関数（１０９）は、対応するネイティブ・コード（２８）を有する特定の対象プログラム・コード（１７）を特定し、該ネイティブ・コード（２８）呼び出しスタブ関数は、前記対応するネイティブ・コード（２８）を特定する、方法。
【請求項３７】
請求項３６に記載の方法であって、さらに、
前記ネイティブ・コード（２８）実行可能モジュールのスクリプト言語の実施において、前記ネイティブ・コード（２８）呼び出しスタブ関数のネイティブ関数（１１７）の身元をエンコードすること、
を備える方法。
【請求項３８】
請求項３または請求項３に従属するいずれかの請求項に記載の方法において、前記ネイティブ関数（１１７）を実行するステップはさらに、
目的コードにおいて、すべての対象レジスタ値を目的コード表現からネイティブ・コード（２８）表現に変換すること、
前記変換された対象レジスタを用いて、目的コードから、目的コード呼び出しスタブ関数を呼び出すこと、
ネイティブ関数（１１７）のプロトタイプに基づいて、特定の対象レジスタおよび／またはパラメータ・スタックを用いて、目的コード呼び出しスタブ関数からネイティブ関数（１１７）を呼び出すこと、
を含む、方法。
【請求項３９】
請求項３８に記載の方法であって、さらに、
前記ネイティブ関数（１１７）を実行するステップの中間表現を生成すること、
前記ネイティブ関数（１１７）を実行するステップの中間表現を、対象コードのブロックに対する中間表現フォレストに統合すること、
前記中間表現フォレストに対する目的コードを生成すること、
を備える方法。
【請求項４０】
請求項１〜３９のうちのいずれか１項に記載の方法において、前記実行すべき対象関数（１０９）はシステム呼び出しである、方法。
【請求項４１】
請求項１〜４０のうちのいずれか１項に記載の方法において、前記実行すべき対象関数（１０９）はライブラリ関数である、方法。
【請求項４２】
請求項１〜４１のうちのいずれか１項の方法を行なうように、コンピュータによって実行可能であるコンピュータ読取可能なコードの形態のソフトウェアが常駐するコンピュータ読取可能な記憶媒体。
【請求項４３】
目的プロセッサ（１３）と、
請求項１〜４１のうちのいずれか１項の方法を行なうためのトランスレータ・コードとの組み合わせ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータおよびコンピュータ・ソフトウェアの分野に関し、より詳細には、たとえば、関数呼び出しを含むプログラム・コードをトランスレートするコード・トランスレータ、エミュレータ、およびアクセラレータにおいて有用なプログラム・コード変換方法および装置に関する。
【背景技術】
【０００２】
組込型および非組込型ＣＰＵの両方において、主流的な命令セット・アーキテクチャ（ＩＳＡ：Instruction Set Architecture）に対して、大量のソフトウェアが存在する。これらのソフトウェアは、性能を上げるために「アクセラレート」することもできるし、より優れたコスト・パフォーマンスの利点を示す無数の高性能なプロセッサに「トランスレート」することもできる。ただしこのようなプロセッサは、関連するソフトウェアにトランスペアレントにアクセスできなければならない。また、主流的なＣＰＵアーキテクチャは、そのＩＳＡに歩調を合わせなければならないため、性能または市場の範囲を発展させることができない。このようなアーキテクチャには、「複合ＣＰＵ（synthetic CPU ）」共通アーキテクチャが有用であろう。
【０００３】
前述のアクセラレーション、トランスレーション、および共通アーキテクチャ能力を促進するプログラム・コード変換方法および装置が、たとえば同時継続中の英国特許出願第１３０９０５６０号明細書（２００３年４月２２日出願）、発明の名称「プログラム・コード変換に対するブロック・トランスレーション最適化（Block Translation Optimization for Program Code Conversion）」において扱われている。なお、この文献の開示は本明細書において参照により取り入れられている。
【発明の開示】
【発明が解決しようとする課題】
【０００４】
トランスレートすべき対象（subject ）プログラムは通常、対象コードの複数の単位からなる。これらには、対象実行ファイル自体および多くの対象ライブラリが含まれる。対象ライブラリのいくつかは独占的である場合があり、いくつかは対象ＯＳの一部（「システム・ライブラリ」）として提供される。対象プログラムが実行されると、関数呼び出しが外部のライブラリに対して行なわれるため、対象コードのこれらの異なる単位の間で制御フローが移る。状況によっては、ネイティブ（すなわち、目的（target）アーキテクチャ）バージョンのある特定の対象ライブラリが、目的アーキテクチャ上で利用可能な場合もある。
【課題を解決するための手段】
【０００５】
本発明によれば、添付請求項で述べるような装置および方法が提供される。本発明の好ましい特徴は、従属請求項および以下の説明から明らかとなる。
以下は、本発明による種々の実施形態による実現可能な種々の態様および優位性の概要である。この概要は、当業者が、後に続く詳細な構成の説明を迅速に理解するための助けとなる導入部として設けられている。概要は、添付の請求項の範囲を限定するものではなく、また決して限定することが意図されているわけではない。
【０００６】
詳細には、発明者は、プログラム・コード変換の促進に向けた方法を開発した。この方法は、対象プログラム・コードの目的コードへのトランスレーションを用いる実行時トランスレータと共に用いると、特に有用である。対象コードを目的コードにトランスレーションする間にネイティブ関数に対する呼び出しを挿入するためのネイティブ結合技術が提供される。これは、対象コード関数に対する対象プログラム内での関数呼び出しの代わりに、目的コードにおいて、同じ関数のネイティブ同等物に対する呼び出しが用いられるように行なわれる。ネイティブ関数呼び出しのパラメータを、目的コード表現から変換することが、ネイティブ・コード表現、ネイティブ・コード呼び出し規約、およびネイティブ関数プロトタイプと整合するように行なわれる。
【０００７】
ネイティブ結合は、本発明のメカニズムであって、トランスレート済み対象コードが、等価な対象コードをトランスレートおよび実行するのではなくて、ネイティブ（すなわち、目的アーキテクチャ）バージョンのコード単位（たとえばネイティブ・バージョンのライブラリなど）を直接実行できるようにするものである。この結果、対象バージョンのこれらのライブラリをトランスレートするオーバーヘッドが回避される。加えて、ネイティブ・バージョンは、同じ機能をはるかに効率的に実施するものであり得る。何故なら、ネイティブ・バージョンは、対象バージョンが認識していない目的アーキテクチャのアーキテクチャ特徴を利用できるからである。
【０００８】
添付図面は、本明細書に取り入れられて本明細書の一部を構成しているが、現時点で好ましい実施形態を例示するものであり、後述するように説明される。
【発明を実施するための最良の形態】
【０００９】
図１に、後述する種々の新しい特徴を実施するための例示的な装置を示す。図１には、目的レジスタ１５を含む目的プロセッサ１３とともに、メモリ１８が例示されている。メモリ１８には、多くのソフトウェア・コンポーネント１７，１９，２０，２１，２２，２８が記憶されている。ソフトウェア・コンポーネントには、トランスレートすべき対象コード１７、オペレーティング・システム２０、トランスレータ・コード１９、トランスレート済みコード２１、グローバル・レジスタ記憶装置２７、ネイティブ結合メカニズム２２、およびネイティブ・コード２８が含まれる。トランスレート済みコード２１は、目的コード２１とも呼ばれる。グローバル・レジスタ記憶装置２７は、対象レジスタ・バンク２７とも呼ばれる。トランスレータ・コード１９は、たとえば、あるＩＳＡの対象コードをトランスレートして他のＩＳＡのトランスレート済みコードにするエミュレータとしてか、あるいは対象コードをトランスレートしてトランスレート済みコード（それぞれ、同じＩＳＡである）にするためのアクセラレータとして機能しても良い。ネイティブ・コード２８は、目的プロセッサ１３に対して直接コンパイルされるコードである。
【００１０】
トランスレータ１９、すなわちトランスレータを実施するコンパイル済みバージョンのソース・コードと、トランスレート済みコード２１、すなわちトランスレータ１９によって生成された対象コード１７のトランスレーションとは、目的プロセッサ１３（通常は、マイクロプロセッサまたは他の好適なコンピュータ）上で実行されるオペレーティング・システム２０とともに実行される。当然のことながら、図１に例示した構造は単に典型であり、またたとえば本発明によるソフトウェア、方法、およびプロセスは、オペレーティング・システム内にまたはその下に存在するコードにおいて実施しても良い。対象コード１７、トランスレータ・コード１９、オペレーティング・システム２０、および記憶メカニズムは、多種多様のタイプのいかなるものであっても良い。これは当業者には知られている。
【００１１】
本明細書で用いる場合、「目的コード」２１（対象コード１７のフラグメントの実行時トランスレーションから生じる）と、「ネイティブ・コード」２８（目的アーキテクチャに対して直接コンパイルされる）とは区別される。目的オペレーティング・システムが与えるシステム・目的ライブラリは、ネイティブ・コード２８の例である。システム・対象ライブラリのトランスレーションは、目的コード２１の例である。ネイティブ・コード２８は、トランスレータ１９の外で生成される。すなわちトランスレータ１９ではネイティブ・ノード２８は生成されないし、トランスレータ１９にはネイティブ・コード２８を最適化する機会もない。
【００１２】
図１による装置では、プログラム・コード変換は好ましくは、目的コード２１が実行されている実行時に動的に行なわれる。トランスレータ１９は、トランスレート済みプログラム２１に合わせて実行される。前述したトランスレータ１９は通常、目的アーキテクチャに対してコンパイルされるアプリケーションとして用いられる。対象プログラム１７は、実行時にトランスレータ１９によってトランスレートされて、目的アーキテクチャ上で直接実行される。またトランスレータ１９は、対象プログラム１７が起こす対象オペレーティング・システム（ＯＳ：Operating System）呼び出しを変換して、この呼び出しが目的ＯＳ２０に受け渡されたときに正しく動作するようにする。
【００１３】
目的コード２１を生成する過程で、対象命令シーケンスに基づいて中間表現（「ＩＲ：Intermediate Representation 」）ツリーが生成される。ＩＲツリーは、対象プログラムが計算する式および行なう動作の抽象表現である。後に、ＩＲツリーに基づいて目的コード２１が生成される。
【００１４】
本明細書で説明するＩＲノードを集めたものが、俗称的に「ツリー」と呼ばれる。なお正式には、このような構造は実際には、有向非循環グラフ（ＤＡＧ：Directed Acyclic Graph）であり、ツリーではないことに注意されたい。ツリーの正式な定義によれば、各ノードには、多くても１つの親が存在する必要がある。説明する実施形態では、ＩＲの生成中に共通部分式の除去が用いられるため、ノードには複数の親があることが多い。たとえば、フラッグに影響を与える命令結果のＩＲは、２つの抽象レジスタ（格納先対象レジスタおよびフラッグ結果パラメータに対応する）によって参照しても良い。
【００１５】
たとえば、対象命令「ａｄｄ％ｒ１，％ｒ２，％ｒ３」によって、対象レジスタ％ｒ２および％ｒ３の内容の加算が行なわれて、結果が対象レジスタ％ｒ１内に記憶される。すなわち、この命令は、抽象式「％ｒ１＝％ｒ２＋％３」に対応する。この例には、抽象レジスタ％ｒ１の定義とともに、命令オペランド％ｒ１および％ｒ２を表わす２つの部分式が含まれる加算式が含まれている。対象プログラム１７に関連して言えば、これらの部分式は、それより前の他の対象命令に対応していても良いし、あるいはそれらの部分式は、現在の命令の詳細、たとえば直接定数値を表していても良い。
【００１６】
「ａｄｄ」命令が構文解析されると、加算に対する抽象的な数学演算子に対応して、新しい「＋」ＩＲノードが生成される。「＋」ＩＲノードには、オペランド（ＩＲにおいて部分式ツリーとして表わされ、対象レジスタに保持されることが多い）を表わす他のＩＲノードに対する参照が記憶される。「＋」ノード自体は、「＋」ノードによって値が規定される対象レジスタ（％ｒ１に対する抽象レジスタ、命令の格納先レジスタ）によって参照される。たとえば、図２０の中心より右側の部分には、Ｘ８６命令「ａｄｄ％ｅｃｘ，％ｅｄｘ」に対応するＩＲツリーが示されている。
【００１７】
当業者であれば理解できるように、一実施形態においては、トランスレータ１９は、オブジェクト指向のプログラミング言語、たとえばＣ＋＋を用いて実現される。たとえば、ＩＲノードは、Ｃ＋＋オブジェクトとして実現され、他のノードに対する参照は、この他のノードに対応するＣ＋＋オブジェクトに対するＣ＋＋参照として実現される。したがって、ＩＲツリーは、互いに対する様々な参照を含むＩＲノード・オブジェクトを集めたものとして実現される。
【００１８】
また、説明している本実施形態においては、ＩＲ生成は、抽象レジスタの組を用いる。これら抽象レジスタは、対象アーキテクチャの特定の特徴に対応する。たとえば、対象アーキテクチャ上の各物理レジスタ（「対象レジスタ」）に対して、一意の抽象レジスタが存在する。同様に、対象アーキテクチャ上に存在する各状態コード・フラッグに対して、一意の抽象レジスタが存在する。抽象レジスタは、ＩＲ生成中にＩＲツリーに対するプレースホルダとして機能する。たとえば、対象命令シーケンス内の所定の点における対象レジスタ％ｒ２の値は、対象レジスタ％ｒ２に対する抽象レジスタ３４に関連する特定のＩＲ式ツリーによって表わされる。一実施形態においては、抽象レジスタはＣ＋＋オブジェクトとして実現される。Ｃ＋＋オブジェクトは、特定のＩＲツリーに、そのツリーのルート・ノード・オブジェクトに対するＣ＋＋参照を介して関連する。
【００１９】
抽象レジスタの実現は、トランスレータ・コード１９および目的コード２１両方におけるコンポーネント間で分割される。トランスレータ１９内では、「抽象レジスタ」は、ＩＲ生成の過程で使用されるプレースホルダである。使用は、特定の抽象レジスタが対応する対象レジスタの値を計算するＩＲツリーに、抽象レジスタが関連するようになされる。したがって、トランスレータ内の抽象レジスタは、ＩＲノード・オブジェクト（すなわちＩＲツリー）への参照を含むＣ＋＋オブジェクトとして実現しても良い。抽象レジスタ・セットによって参照されるすべてのＩＲツリーの集合体は、作業用ＩＲフォレストと呼ばれる（「フォレスト」と呼ばれる理由は、集合体が複数の抽象レジスタ・ルートを含み、それぞれがＩＲツリーを参照するからである）。作業用ＩＲフォレストは、対象コードの特定の点における対象プログラムの抽象的な操作のスナップショットを表わす。
【００２０】
基本ブロック・モードでは、ある基本ブロックから次の基本ブロックへ状態を受け渡すことが、すべてのトランスレート済みコード・シーケンスにとってアクセス可能なメモリ領域、すなわちグローバル・レジスタ記憶装置２７を用いて行なわれる。グローバル・レジスタ記憶装置２７は、抽象レジスタに対するリポジトリである。各抽象レジスタは、特定の対象レジスタまたは他の対象アーキテクチャ特徴の値に対応し、これをエミュレートする。目的コード２１を実行する間、抽象レジスタは、命令に関与できるように、目的レジスタに一時的に保持される。トランスレータ・コード２１を実行する間、抽象レジスタ値は、グローバル・レジスタ記憶装置２７または目的レジスタ１５内に記憶される。
【００２１】
目的コード２１内では、「抽象レジスタ」は、グローバル・レジスタ記憶装置内の特定の箇所であり、その箇所まで、およびその箇所から、対象レジスタ値が実際の目的レジスタと同期する。あるいは、グローバル・レジスタ記憶装置からロードされている値がある場合には、目的コード２１内の抽象レジスタは、目的レジスタ１５であると理解することができ、すなわち、目的コード２１の実行中に対象レジスタ値を、それがレジスタ記憶装置に再び保存される前に一時的に保持するものである。
【００２２】
こうして、トランスレータ１９の下で実行中の対象プログラムには、交互的に実行される２つの異なる形式のコードがある。すなわちトランスレータ・コード１９および目的コード２１である。トランスレータ・コード１９は、トランスレータ１９の高レベルのソース・コードの実現に基づいて、実行時の前にコンパイラによって生成される。目的コード２１は、トランスレート中のプログラムの対象コード１７に基づいて、実行時の間中、トランスレータ・コード１９によって生成される。
【００２３】
対象プロセッサ状態の表現は同様に、トランスレータ１９および目的コード２１のコンポーネント間で分割される。トランスレータ１９は、対象プロセッサ状態たとえば変数および／またはオブジェクトを、種々の明示的なプログラミング言語装置に記憶する。トランスレータをコンパイルするために用いられるコンパイラによって、状態および動作を目的コードにおいてどのように実現するかが決定される。比較して、目的コード２１は、対象プロセッサ状態を暗黙的に、目的レジスタおよびメモリ箇所に記憶する。目的レジスタおよびメモリ箇所は、目的コード２１の目的命令によって直接扱われる。
【００２４】
たとえば、グローバル・レジスタ記憶装置２７の低レベルの表現は単純に、割り当てメモリの領域である。これは、目的コード２１がどのように、抽象レジスタを見て、そして抽象レジスタとやり取りすることを規定されたメモリ領域と種々の目的レジスタとの間で保存および復元することによって行なうか、である。しかしトランスレータ１９のソース・コードにおいては、グローバル・レジスタ記憶装置２７は、より高いレベルでアクセスおよび扱うことができるデータ・アレイまたはオブジェクトである。目的コード２１に関して言えば、単純に、高レベルの表現は存在しない。
【００２５】
図２〜５に示すのは、図１のトランスレータ１９の種々の例示的な実施形態である。図２に示すのは、トランスレータ１０５がトランスレートすべき対象コード１７における対象プログラム１０６の異なるコンパイル単位の例示的な実施形態である。トランスレータ１０５は、ネイティブ・アーキテクチャ（その他の場合には目的アーキテクチャと呼ばれる）に対してコンパイルされた実行ファイルとして実行される。ネイティブ・アーキテクチャには、ネイティブＯＳ１０３およびネイティブ・プロセッサ１０１（図１の目的ＯＳ２０および目的プロセッサ１３に等価である）の両方が含まれる。この例の対象プログラム１０６には、対象実行ファイル１０７および多くの対象ライブラリが含まれている。対象ライブラリには、対象独占的ライブラリ１０９および対象システム・ライブラリ１１１が含まれていても良い。ネイティブ結合が用いられない場合には、対象プログラム１０６のコンパイル単位は、目的コード２１にトランスレートされて実行されることがトランスレータ１０５内で行なわれる。
【００２６】
図３に示すのは、ネイティブ結合が、トランスレート済みプログラムのコードの単位上で利用される場合の、例示的な実施形態の動作フローのブロック図である。
対象プログラム１０６には、対象実行ファイル１０７および多くの対象ライブラリが含まれている。対象ライブラリには、独占的ライブラリ１０９およびシステム・ライブラリ１１１が含まれる。トランスレータ１０５は、ネイティブ結合を用いて、対象システム・ライブラリ関数１１１に対する対象プログラム１０６呼び出しの代わりに、ネイティブ・システム・ライブラリ１１７内の関数に対する呼び出しを用いる。
【００２７】
たとえば、ＭＩＰＳｘ８６トランスレーションの場合、ｘ８６システム・目的ライブラリ「ｌｉｂｃ」は、ＳＳＥ２ベクトル操作を利用して極めて速いバイト・コピーを行なう高性能なｍｅｍｃｐｙ（）（メモリ・コピー）ルーチンを規定することができる。本出願で説明されるネイティブ結合メカニズム２２を用いて、ＭＩＰＳ対象コード内のｍｅｍｃｐｙに対するすべての呼び出しを、ネイティブｍｅｍｃｐｙ（）に結合する。この結果、対象（ＭＩＰＳ）バージョンのｍｅｍｃｐｙ（）関数をトランスレートするコストが削減される。加えて、ネイティブ（ｘ８６）バージョンのｍｅｍｃｐｙ（）関数は、ネイティブ・ハードウェアの複雑さについてはるかに良く認識しているため、関数の所望の効果を達成するための最も効率的な方法を知っている。
【００２８】
ネイティブ結合が、トランスレータ１９によって実現されるのは、対象プログラムの制御フローが、対象コードのネイティブ・バージョンが存在する対象コード１７のセクション（たとえば対象ライブラリ）に入ることが検出されたときである。トランスレータ１９は、対象コード１７をトランスレートするのではなくて、等価なネイティブ・コード２８を実行する。
【００２９】
目的システム・ライブラリの呼び出しだけでなく、より多くの任意コードの代用に対して、たとえばネイティブでコンパイルされたバージョンの非ライブラリ関数を代用することに対して、ネイティブ結合を用いても良い。さらに、ネイティブ結合を用いて、ネイティブ・アーキテクチャ上で対象システムの呼び出しを実現しても良い。これは、対象システム関数に対するすべての呼び出しを、代用のネイティブ関数と取り替えることによって行なう。代用のネイティブ関数は、対象システム関数に対する呼び出しと同じ機能を実施するか、あるいは目的システムの呼び出しの周りの呼び出しスタブとしての機能を果たすものである。またネイティブ結合を、関数呼び出しサイトを過ぎた任意の対象コード箇所で適用して、任意コードのシーケンス（目的コードまたはネイティブ・コード内の）および／または関数呼び出しを、対象プログラム内の任意の明確な点で挿入または代用できるようにしても良い。
【００３０】
結合点の記述
ネイティブ結合メカニズム２２では、トランスレータ１９が、特定の対象コード１７関数を、それらのネイティブ・コード２８対応物と関連づける必要がある。その結果、トランスレータ１９は、どの対象関数を結合すべきか、およびどのネイティブ関数に対して対象関数を結合すべきかを知る。トランスレータ１９は、ネイティブ結合メカニズム２２の実現に依存して、この関数マッピング情報を種々の方法で取得することができる。
【００３１】
一実施形態においては、結合すべき対象関数を、特別目的の「結合点」記述言語を用いて特定する。結合点の記述には、以下のものが含まれる。すなわち、（ａ）結合すべき対象関数、（ｂ）結合すべき対応するネイティブ関数である。トランスレータ１９は、実行の開始時に結合点の記述を読み込んで、結合点（ネイティブ関数を呼び出す箇所）を特定する。対象プログラムのデコード中に、トランスレータ１９はこれらの結合点に遭遇すると、トランスレータ１９は、適切なネイティブ関数に対する呼び出しスタブを、目的コード２１内に挿入する。一実施形態においては、トランスレータ１９内に、特定の結合点の記述が埋め込まれる。他の実施形態においては、結合点の記述が、トランスレータ１９が実行時に読み込む別個のファイルに記憶される。その結果、エンド・ユーザが、ネイティブ結合メカニズム２２の制御を、特定の対象対ネイティブ関数マッピングを加えることによって行なうことができる。
【００３２】
他の実施形態においては、ネイティブ結合用結合点の記述言語によって、任意の結合点を指定して、対象関数呼び出しを過ぎた対象コード内の他の点においてネイティブ関数呼び出しを挿入できるようにすることができる。この実施形態においては、結合点の記述には以下のものが含まれる。すなわち（ａ）対象プログラム内の規定された箇所（すなわち、関数呼び出しサイトだけではない）、（ｂ）結合すべき対応するネイティブ関数である。たとえば、任意の結合点を以下のように特定しても良い。（１）関数の開始、（２）対象モジュールの初期化コードの開始、（３）特定の記号からの固定された相対位置（たとえば、関数の開始からの固定された相対位置）、（４）モジュール内の第１のテキスト・セグメントからの固定された相対位置、または（５）特定の対象関数（特定のモジュール内か、またはある特定のモジュールを除いたすべてのモジュールにおける）に対するすべての呼び出し。結合点の形式（１）と（５）との間の差は、（１）は対象関数のエントリ・ポイントを結合し、一方で、（５）は関数の呼び出しサイトを結合するということである。
【００３３】
いくつかの実施形態においては、ネイティブ結合用結合点の記述言語によって、エンド・ユーザは、相対的な結合点を指定することができる。この場合、ネイティブ関数呼び出しを、結合点（たとえばシステム・対象関数呼び出し）の前、後、またはその代わりに挿入することができる。たとえば、対象関数「ｂａｒ（）」に対するすべての呼び出しの直後にネイティブ関数「ｆｏｏ（）」を呼び出すことを、ネイティブ結合用結合点の記述によって指定することができる。
【００３４】
また結合点の記述言語を用いて、ネイティブ関数呼び出し以外のコードを結合点において挿入しても良い。このような実施形態においては、結合点の記述には以下のものが含まれる。（ａ）対象プログラム内の規定された箇所、（ｂ）呼び出すべき目的コード・ブロックまたはネイティブ・コード関数に対する参照。挿入されるコードが目的コード２１の場合には、トランスレータ１９は、結合点において、パラメータ変換およびネイティブ呼び出し規約（後述する）に関連するほとんどの動作を行なう必要がない。この場合、トランスレータ固有の目的コード呼び出し規約に準拠することで十分である。任意の目的およびネイティブ・コードの挿入によって、トランスレータ１９は、トランスレート済みプログラム上の他のタスク、たとえばデバッギングおよびパフォーマンス・プロファイリングを行なうことができる。
【００３５】
代替的な実施形態においては、対象対ネイティブ関数マッピングを、対象プログラムの記号テーブルにおいて、実行時前に、実行時記号パッチングと呼ばれるプロセスにおいてエンコードする。実行時記号パッチングによって、対象プログラムの記号テーブル内のエントリが、特別なネイティブ結合マーカに取り替えられる。こうするためには、対象プログラムの扱いを、対象プログラムがコンパイルされた（コンパイル時）後で、しかし対象プログラムがトランスレートされる（実行時）前に、行なうことが必要である。トランスレータ１９は、実行時に記号テーブル・マーカーに遭遇すると、トランスレータ１９は、記号テーブル・マーカーを結合点の記述としてインタープリットするとともに、記号テーブル・マーカーをインタープリットして、どのネイティブ関数を呼び出すべきかを特定する。本実施形態においては、結合すべき対象関数の身元は、記号テーブル内の記号テーブル・マーカーの箇所において暗黙的である。何故なら、記号テーブル・マーカーは、特定の対象関数に対応する記号テーブル・エントリ内に置かれるからである。
【００３６】
結合点の記述によって結合点を明白に特定する代わりに、結合点を代替的に、トランスレータ固有の対象命令セット拡張部分によって暗黙的に特定しても良い。トランスレータ固有の対象命令セット拡張部分は、コンパイルされると、対象コードにおいてプラントされる（後述の「Ｓ−呼び出し」を参照のこと）。
【００３７】
パラメータ変換
ネイティブ関数を呼び出すときに、トランスレータ１９は、目的アーキテクチャの呼び出し規約に適合しなければならない。比較して、目的コード２１が目的アーキテクチャ呼び出し規約に準拠することは、トランスレータ１９が目的コード２１の全体を通して何らかの一貫した呼び出し規約に準拠する限り、必ずしも必要ではない。加えて、トランスレータ１９は、対象装置状態（目的コード２１において表わされる）とネイティブ装置状態（ネイティブ・コード２８において表わされる）との間のデータ変換を行なう必要があっても良い。両状態とも、ネイティブ関数の入力パラメータおよびその戻り値（もしあれば）に対するものである。このようなデータ変換の例には、以下のものが含まれていても良い。（ｉ）エンディアン変換（すなわち、バイト交換）、（ｉｉ）データ構造アライメント、（ｉｉｉ）対象アドレスと目的アドレスとの間の変換、（ｉｖ）値変換（たとえば、定数変換または値スケーリング）。
【００３８】
たとえば、ＭＩＰＳアーキテクチャ上では、関数パラメータの受け渡しがレジスタ内で行なわれ、一方で、ｘ８６アーキテクチャ上では、パラメータの受け渡しがスタック上で行なわれる。ＭＩＰＳｘ８６トランスレータがネイティブ関数を呼び出すためには、ｘ８６呼び出し規約において、関数パラメータを対象レジスタからスタックへ移動させることを必要とする。
【００３９】
図６に例示するのは、ネイティブ関数を呼び出すためにトランスレータ１９が行なうステップである。ネイティブ関数を呼び出すためには、トランスレータ１９は、複数のステップを行なわなければならない。すなわち、パラメータ・セットアップ５０１、入力パラメータ変換５０３、ネイティブ関数呼び出し５０５、結果変換５０７である。パラメータ・セットアップ５０１では、関数呼び出しパラメータの値を計算する目的コード２１を参照する。入力パラメータ変換５０３では、関数呼び出しパラメータ値を、それらの目的コード２１表現から、ネイティブ関数コードが予想するフォーマットおよび箇所に、構成する。ネイティブ関数呼び出し５０５は、ネイティブ関数に対する実際の関数呼び出しであり、関数プロトタイプが必要とする順番に、（再フォーマット済み）パラメータを構成することを、ネイティブ呼び出し規約に準拠する仕方で含んでいる。関数のパラメータの順番および形式と、関数の戻り値の形式とは、関数プロトタイプによって示される。たとえば、ネイティブ呼び出し規約が、引数の受け渡しをスタック上で行なうことを必要とする場合には、ネイティブ関数を呼び出す目的コード２１は、引数をスタック上に正しい順番で置いて、スタック・ポインタを相応に進めなければならない。結果変換５０７では、関数の戻り値（もしあれば）を変換する。関数は、ネイティブ・アーキテクチャに整合するフォーマットで値を戻し、トランスレータはこの値を、目的コード２１が用いる表現に変換する。
【００４０】
パラメータ・セットアップ５０１は、ネイティブ結合メカニズム２２に専用のものではない。何故なら、関数が、トランスレート済み対象コード２１として呼び出されるのか、ネイティブ・コード２８として呼び出されるのかに関係なく、目的コード２１はパラメータ値を計算しなければならないからである。ネイティブ関数呼び出しがどの特定の対象レジスタを（パラメータ値として）使用するのかを、トランスレータ１９が知らない場合には、トランスレータ１９は、使用される対象レジスタの値を修正して、対象レジスタ・バンク２７が一貫した状態にあることを保証しなければならない。対象レジスタ値の計算は、遅延評価などのトランスレータ最適化によって、これらの値が必要とされるまで延期されても良い。この場合、評価が延期されたレジスタの強制的な計算は、修正によって参照される。修正されると、対象レジスタ値は次に、対象レジスタ・バンク２７に記憶される。
【００４１】
関数の明示的なパラメータの値を計算すること（場合によっては、すべての対象レジスタを修正する必要がある）に加えて、パラメータ・セットアップ・ステップ５０１では、対象メモリ空間が一貫した状態にあることも保証しなければならない。何故なら、ネイティブ呼び出しが、メモリ・アクセスの形態において副作用を有する場合があるからである。一実施形態においては、（ネイティブ呼び出しスタブに対するか、あるいはその下のネイティブ関数に対する）ネイティブ関数呼び出しをエンコードするＩＲによって、対象メモリ状態が修正される。この修正は、対象プログラムにおいて関数呼び出しの前に行なわれるであろうすべてのロードおよび記憶が、ネイティブ関数呼び出しの前に目的コードにおいてプラントされるように、かつ同様に、関数呼び出しの後に行なわれるべきメモリ・アクセスが、ネイティブ呼び出しの前にまったくプラントされないように行なわれる。
【００４２】
「パラメータ変換」５０９は、ステップ５０３，５０５，５０７を一括して参照するために、すなわち、異なるデータ・フォーマット間のすべての個々の変換と、目的コード２１およびネイティブ・コード２８の呼び出し規約とを参照するために用いられる。パラメータ変換５０９を行なうコードは、「呼び出しスタブ」と呼ばれる。「呼び出しスタブ」は、その下のネイティブ関数呼び出しの周りの最小限のラッパーを含み、その唯一の目的は、目的コード２１呼び出し元が、ネイティブ・コード２８呼び出し先とやり取りできるようにすることである。したがって単一の「呼び出しスタブ」を分割して、目的コード２１およびネイティブ・コード２８のコンポーネントにしても良い。パラメータ変換５０９が、全体に目的コード２１において起こるのか、あるいは部分的にネイティブ・コード２８において起こるのかは、ネイティブ結合の実施に依存する。
【００４３】
ネイティブ・コード・スタブ
いくつかの実施形態においては、ネイティブ結合に対するパラメータ変換５０９を、一つにはネイティブ・コード２８によって行なう。ネイティブ・コード・スタブには、トランスレータ１９によって最適化されないという不利な点がある。これらの実施形態においては、目的コード２１が、なんらかのパラメータ変換を行ない、ネイティブ呼び出し規約を用いてネイティブ呼び出しスタブを呼び出す。次に呼び出しスタブのネイティブ・コード２８は、さらなるパラメータ変換を行なって、その下のネイティブ関数を呼び出す。
【００４４】
図４に示すのは、ネイティブ・コード呼び出しスタブ１１３に基づいてネイティブ結合を用いるトランスレータ１２０の例示的な実施形態における関数呼び出しの動作フローを示すブロック図である。この例での対象プログラム１０６には、対象実行ファイル１０７および多くの対象ライブラリが含まれる。対象ライブラリには、独占的ライブラリ１０９およびシステム・ライブラリ１１１が含まれる。トランスレータ１２０は、対象システム・ライブラリ関数１１１に対する呼び出しの代わりに、ネイティブ・コード呼び出しスタブ１１３に対する呼び出しを用いる。ネイティブ・コード呼び出しスタブ１１３を呼び出す目的コード２１によって、パラメータ変換が行なわれる。ネイティブ・コード呼び出しスタブ１１３によって、さらなるパラメータ変換およびパラメータ・マッピングが行なわれる。次に、ネイティブ・コード呼び出しスタブ１１３は、ネイティブ・システム・ライブラリ関数１１７を呼び出す。
【００４５】
ネイティブ・コード・スタブ：統一されたインターフェース
一実施形態においては、ネイティブ・コード・パラメータ変換５０９を、統一された呼び出しスタブ関数インターフェースを規定することによって容易にする。統一された呼び出しスタブ関数インターフェースによって、すべてのネイティブ呼び出しスタブに対する固定された関数署名と、対応するデータ形式とが規定される。この結果、トランスレータ１２０は、呼び出しスタブを呼び出すことを、その下のネイティブ関数の関数署名（プロトタイプ）を何ら知ることなく行なうことができる。この結果、呼び出しスタブを、高レベルのプログラミング言語（たとえばＣまたはＣ＋＋）において実現することができる。この結果、ネイティブ結合メカニズムは、トランスレータ１９のエンド・ユーザにとって、より利用しやすいものとなる。
【００４６】
この実施形態においては、呼び出しスタブ関数を、トランスレータ実行ファイルにリンクされるネイティブ・コード実行ファイルとしてコンパイルする。実行中、トランスレータ１２０は、スタブの呼び出しを、ネイティブ呼び出し規約を用いて、統一されたインターフェースを通して行なう。呼び出しスタブ・インターフェースは統一されているため、呼び出しスタブを呼び出す目的コードのシーケンスは、すべてのネイティブ呼び出しに対して同じである。
【００４７】
たとえば、一実施形態においては、統一された呼び出しスタブ・インターフェースは、Ｃ関数であって、正確に２つのパラメータ（呼び出しサイトの対象アドレスと、すべての対象レジスタ値を含む統一されたデータ構造に対する参照）を取り、および１つの値（トランスレータが実行すべき次の対象命令の対象アドレス）を戻すものである。呼び出しスタブに受け渡される統一されたデータ構造には常に、すべての対象レジスタ（その他の場合には、対象コンテキストと呼ばれる）の現在の値が含まれている。
【００４８】
統一された呼び出しスタブ・インターフェースに基づくネイティブ結合メカニズムでは、ネイティブ結合は、複数のコンポーネントに分割される。すなわち、（ｉ）すべての対象レジスタ値を修正する特別なＩＲノード形式、（ｉｉ）すべての対象レジスタを整列させて統一されたコンテキスト構造にし、ネイティブ呼び出し規約に基づいて呼び出しスタブを呼び出す目的コード２１、（ｉｉｉ）特定の対象レジスタ値を整列させて関数パラメータにし、ネイティブ関数を呼び出すネイティブ呼び出しスタブである。
【００４９】
トランスレーション中に、ネイティブ呼び出しサイトが、ネイティブ呼び出しＩＲノードにトランスレートされる。ネイティブ呼び出しＩＲノードには、すべての対象レジスタのＩＲに対する依存関係参照が含まれている。目的コード生成フェーズにおいて、対象レジスタ値に対応する目的コードが、ネイティブ呼び出しの前に生成されることが、ネイティブ呼び出しＩＲノードのこれらのＩＲ依存関係によって保証される。対象レジスタ値の計算は、遅延評価などのトランスレータ最適化によって、これらの値が必要とされるまで延期されても良い。ネイティブ呼び出しＩＲ依存関係によって、コード生成フェーズに、ネイティブ呼び出しスタブがすべての対象レジスタ値を「必要とする」ことが通知される。したがって、トランスレータ１９は、ネイティブ呼び出しスタブ１１３を呼び出す目的コード２１を生成する前に、すべての対象レジスタ値を修正する目的コード２１を生成する。同様に、ネイティブ呼び出しＩＲノードは、コードを生成するためのメモリ参照として処理される。これは、対象コード１７における関数呼び出しの前にあるすべてのロードおよび記憶が、目的コード２１における関数呼び出しの前に（生成されて）実行されるように行なわれる。同様に、対象コード１７において関数呼び出しの後に行なわれるすべてのロードおよび記憶は、ネイティブ呼び出しの後まで延期される。
【００５０】
必要に応じて、トランスレータ１９には、ネイティブ呼び出しＩＲを保持するための特別な抽象レジスタが含まれる。トランスレーションのＩＲ生成フェーズでは、抽象レジスタが、ＩＲツリーに対するプレースホルダ（すなわちＩＲツリーのルート・ノード）として機能する。ＩＲツリーは、抽象レジスタにリンクされなければならない。そうでないと、ＩＲツリーは目的コードとして放出されない。他のトランスレータでは、ネイティブ呼び出しＩＲノードを、既存の抽象レジスタ、たとえば（現在のブロックの）後継アドレスに対する抽象レジスタに付することができる。
【００５１】
ネイティブ呼び出しスタブ１１３を呼び出す目的コード２１は、対象レジスタ値を修正した後に、その値を対象コンテキスト構造に記録する。本実施形態においては、ネイティブ・コード呼び出しスタブ１１３はネイティブ・コード２８によって実施されるため、対象コンテキストは、ネイティブ・アーキテクチャに整合する表現で構築されなければならない。したがって、目的コード２１は、必要に応じてパラメータ変換５０３を行なって、対象レジスタ値を目的コード表現からネイティブ・コード表現に変換する。複数の値を、他のアーキテクチャと整合するデータ構造表現に変換するプロセスは、しばしばマーシャリングと呼ばれる。
【００５２】
目的コード２１によって、すべての対象レジスタ値のネイティブ表現を含む対象コンテキストが構築される。次に目的コード２１は、ネイティブ・コード呼び出しスタブ１１３を呼び出し、呼び出しスタブ１１３に対象コンテキストをパラメータとして受け渡す。呼び出しスタブ１１３は、その下のネイティブ関数を呼び出し、対象コンテキストから必要な特定の対象レジスタを引き出して、その対象レジスタをネイティブ関数に適切なパラメータとして受け渡す。こうして呼び出しスタブ１１３は、ネイティブ関数のプロトタイプをエンコードするとともに、特定の対象レジスタの対応するネイティブ関数パラメータに対するマッピングを規定する。
【００５３】
場合によっては、ネイティブ関数インターフェースがその対象コード同等物と実質的に異なっていて、対象データがネイティブ関数パラメータとしての使用に適するように、対象データに対してさらなる計算（データ表現に対する変換および呼び出し規約の先）を行なわなければならないようであっても良い。このような場合には、呼び出しスタブ１１３は、対象レジスタ値に対してさらなるパラメータ変換を行なっても良い。たとえばネイティブ関数は、その対象コード同等物とは異なる単位での特定のパラメータを予想しても良い。この場合、呼び出しスタブ１１３は、ネイティブ関数を呼び出す前に、適切な対象レジスタ値に対して定数変換を行なって、そのパラメータに対する単位形式の差に対処する。
【００５４】
統一されたネイティブ呼び出しスタブ・インターフェースを用いる実施形態においては、目的コード２１は、すべての対象レジスタを、目的コード表現からネイティブ・コード表現に無差別に変換する。次にネイティブ呼び出しスタブ１１３は、ネイティブ関数のプロトタイプがパラメータとして必要とする特定の（変換済み）対象レジスタを取り出す。ネイティブ呼び出しスタブ１１３は、呼び出し中の関数の対象バージョンとネイティブ・バージョンとの間の差を反映するために、さらなるパラメータ変換を行なっても良い。目的コード２１は、目的コード２１とネイティブ・コード２８との間の表現差に対する調整を行ない、一方で、呼び出しスタブ１１３は、その下にある特定のネイティブ関数の署名に対処する。
【００５５】
本実施形態においては、結合すべき対象関数および対応するネイティブ呼び出しスタブ関数を、ネイティブ結合用結合点の記述によって特定する、一方で、結合先のその下のネイティブ関数の身元は、呼び出しスタブの実施において暗黙的である（すなわち、ハード・コードされている）。
【００５６】
ネイティブ・コード・スタブ：コンパイル済みスクリプト
他の実施形態においては、特別目的のネイティブ結合プログラミング言語（以後、「スクリプト言語」と呼ぶ）を用いて、ネイティブ・コード・パラメータ変換を実現する。実行前または実行中に、トランスレータ１９は、呼び出しスタブのスクリプト言語の実現を構文解析し、それを、ネイティブ実行可能モジュールにコンパイルする。次に、呼び出しスタブ・モジュールをトランスレータ実行ファイルとリンクさせ、（ネイティブ）呼び出しスタブ機能を、ネイティブ呼び出し規約を用いて呼び出す。これは、前述した通りである。
【００５７】
ネイティブ結合スクリプトを、呼び出しスタブの実行可能な表現に、コンパイルするかあるいはインタープリットする。一実施形態においては、結合点の記述を、別個のツールが、トランスレータの実行前に、実行可能なネイティブ・コードにインタープリットする。他の実施形態においては、トランスレータ自体が、実行時に結合点の記述をインタープリットまたはコンパイルして、実行可能なネイティブ・コードまたはトランスレータＩＲ（後で目的コードとして生成される）のいずれかにする。
【００５８】
いくつかの実施形態においては、スクリプト言語は、トランスレータに固有の特別目的言語である。スクリプト言語には、広範囲の可能なパラメータ変換動作を説明するためにプリミティブ（プログラミング言語構築ブロック）が含まれている。可能なパラメータ変換動作には、以下のものが含まれる。すなわち、（ｉ）データ形式の記述、（ｉｉ）これらのデータ形式の目的コードとネイティブ表現との間の変換、（ｉｉｉ）ネイティブ関数の特定、（ｉｖ）特定の対象レジスタの特定の関数パラメータへのマッピング、（ｖ）対象プログラムのメモリ空間に対するメモリ・アクセス、（ｖｉ）基本的な数学演算である。代替的な実施形態においては、スクリプト言語にはさらに、（ｖｉ）基本的な論理動作、（ｖｉｉ）複数のネイティブ結合スクリプトに渡る一時的な値のグローバルな記憶が含まれる。これらのプリミティブ（すなわちトランスレータによってか、あるいは特別なツールによって、スクリプトから生成されるネイティブ・コード）を実現することは、目的アーキテクチャの表現および呼び出し規約と整合していなければならない。
【００５９】
本実施形態においては、結合すべき対象関数および対応するネイティブ呼び出しスタブ関数を、ネイティブ結合用結合点の記述によって特定し、一方で、結合先のその下のネイティブ関数の身元は、呼び出しスタブのスクリプト言語の実施においてハード・コードされる。
【００６０】
目的コード・スタブ
他の実施形態においては、ネイティブ結合に対するパラメータ変換を、全体に目的コードにおいて行なう。本実施形態においては、トランスレータ１９によって、デコード時にネイティブ結合呼び出しが検出され、パラメータ変換がＩＲツリー（最終的に目的コードとして生成される）としてエンコードされる。パラメータ変換とネイティブ関数プロトタイプの詳細とをＩＲにおいて表わすことによって、呼び出しスタブ・コードは、対象コードに統合されることになる（呼び出しスタブのＩＲは、対象コードのＩＲと区別できない）。この結果、トランスレータは、パラメータ変換コードに対して最適化（たとえば、グループ・ブロック）を施すことができる。対照的に、ネイティブ・コードにおいて行なわれるパラメータ変換、たとえばネイティブ・コード呼び出しスタブにおいて行なわれる対象レジスタの関数パラメータへのマッピング（前述した）は、トランスレータの外であり、最適化することはできない。
【００６１】
図５に示すのは、目的コード呼び出しスタブ１１５に基づいてネイティブ結合を用いるトランスレータ１２２の例示的な実施形態における関数呼び出しの動作フローを示すブロック図である。対象プログラム１０６は、対象実行ファイル１０７および多くの対象ライブラリからなる。対象ライブラリには、独占的ライブラリ１０９およびシステム・ライブラリ１１１が含まれていても良い。トランスレータ１２２は、対象システム・ライブラリ関数１１１に対する呼び出しの代わりに、目的コード呼び出しスタブ１１５を用いる。目的コード呼び出しスタブ１１５は、パラメータ変換およびパラメータ・マッピングを行なった後で、ネイティブ・システム・ライブラリ１１７内の関数を呼び出す。
【００６２】
トランスレータ１２２が目的コード呼び出しスタブ１１５を用いる実施形態においては、目的コード２１が結合済みネイティブ関数を直接呼び出すが、すべてのパラメータ変換およびパラメータ・マッピングは、目的コード２１によって行なわれる。これらの実施形態においては、目的コード２１が、特定のネイティブ関数の表現変換および署名（すなわち、特定の対象レジスタの対応するネイティブ関数パラメータへのマッピング）の両方に対処する。目的コード２１がパラメータ・マッピングを行なうためには、トランスレータ１２２は、トランスレーション中に、ネイティブ関数プロトタイプおよび対象レジスタ対パラメータ・マッピングを知っていなければならない。場合によっては、目的コード呼び出しスタブ１１５を、このスタブ１１５を呼び出す目的コード２１（「呼び出し元目的コード」）とは別個のブロックにおいてトランスレートする。他の場合には、目的コード呼び出しスタブ１１５を、このスタブ１１５を呼び出す目的コード２１と同じブロックにおいてトランスレートする。この結果、呼び出しスタブ・コードを、呼び出し元目的コードと統合してこの呼び出し元目的コードによって最適化することができる（「初期結合」メカニズムと呼ばれる）。対象プログラムが、多くの呼び出しサイトから特定の対象関数を呼び出す場合には、目的コード呼び出しスタブ１１５をあらゆる呼び出しサイトにおいてインラインすることは不都合である。何故なら、結果として生じる呼び出しスタブ・コードの重複によって、過剰なメモリが消費されるからである。このような場合、トランスレータ１２２は、呼び出しスタブをあらゆる呼び出しサイトにおいてインラインするのではなくて、目的コード呼び出しスタブ１１５を、各トランスレート済み呼び出しサイトが呼び出す別個のブロックとして保持する。ネイティブ結合の最適化の１つは、非常に頻繁に実行されるブロックでのみ、初期結合を用いる（すなわち、呼び出しスタブをインラインする）ことである。
【００６３】
目的コード・スタブ：スキゾ呼び出し
他の実施形態においては、トランスレータ１９は、スキゾ呼び出しまたは「Ｓ−呼び出し」と呼ばれるメカニズムを用いる。このメカニズムでは、対象コード単位がコンパイルされるときに対象コードに挿入されるトランスレータ固有のネイティブ結合命令（Ｓ呼び出しコマンドと呼ばれる）を含むように対象命令セットを拡張することによって、目的コード・パラメータ変換を容易にする。トランスレータ１９が対象コードをデコードするとき、トランスレータ１９は、これらのＳ−呼び出しコマンドを検出およびインタープリットし、また適切なＩＲ（または目的コード）をプラントしてパラメータ変換を行なう。
【００６４】
Ｓ−呼び出しメカニズムでは、対象プログラムの開発者からのサポートが必要である。対象プログラムがコンパイルされるとき、Ｓ−呼び出しコマンドは、コンパイル済み対象プログラムにおいて対象命令としてエンコードされる。ネイティブ関数に対する呼び出しを記述する呼び出しスタブは、Ｓ−呼び出しコマンドを含むことだけに制約されない。呼び出しスタブは、パラメータ変換を支援する正規の合法的な対象命令を含んでいても良い。組み合わせて、Ｓ−呼び出しコマンドおよび正規の対象命令によって、パラメータ変換に必要なすべての情報および動作がエンコードされる。
【００６５】
一実施形態においては、Ｓ−呼び出しコマンドは、複数のサブ・コンポーネントから構築される可変長命令においてエンコードされる。この構築は、１つのＳ−呼び出しコマンド命令が、正規の対象コード命令よりも大きくなり得るように、また複数の正規の対象命令のサイズでさえあり得るように行なわれる。Ｓ−呼び出しコマンドが始まるサブ・コンポーネントは、命令をＳ−呼び出しコマンドとして特定するとともに、対象アーキテクチャ上での違法命令（スキゾ・エスケープと呼ばれる）としてインタープリットされることが知られているものである。スキゾ・エスケープ・サブ・コンポーネントは任意的に、Ｓ−呼び出しコマンド内に含まれるコマンドの形式をさらに特定しても良い。Ｓ−呼び出しコマンドは好ましくは、５つの形式のコマンド・クラスに分類される。すなわち（１）マーカ、（２）パラメータ、（３）呼び出し、（４）コピー、および（５）ナリファイである。Ｓ−呼び出しコマンドのクラスは、先頭のスキゾ・エスケープ・サブ・コンポーネントの未使用のビットにエンコードされる。スキゾ・エスケープの後に、クラス固有のオプションおよび／または引数の組み合わせが続く。これらはそれぞれ、再規定されたｏｐｃｏｄｅおよびフォーマットを有し、またそれぞれ、Ｓ−呼び出しコマンド命令において１つまたは複数のワード（すなわち４バイト単位）としてエンコードされる。Ｓ−呼び出しコマンド命令は、初期スキゾ・エスケープの再現であるサブ・コンポーネントで終了する。以下、前述した５つの形式のＳ−呼び出しコマンドについて、より詳しく説明する。しかし当然のことながら、他の形式のトランスレータ固有のネイティブ結合命令を、すでに列挙した５つの形式以外のＳ−呼び出しコマンドとして用いても良いことは、本発明の発明者が完全に意図するところである。
【００６６】
Ｓ−呼び出しの「マーカ」コマンドは、アプリケーション・バイナリ・インターフェース（ＡＢＩ）固有の最適化を可能にするために用いられる任意的なマーカである。Ｓ−呼び出しマーカー・コマンドによって、トランスレータ固有のコード（たとえばネイティブ関数に対する呼び出しスタブ）を含む対象コード１７の範囲（開始および終了アドレス）が示される。この範囲は、対象関数の全範囲と一致していても良いし、いなくても良い。Ｓ−呼び出しマーカー・コマンドは、２つの形式からなる。すなわち、開始および終了である。Ｓ−呼び出しマーカー・コマンドは、１つの文字列引数を有していて、マーキングされる点に名前（たとえば結合されている対象関数の名前）を割り当てる。
【００６７】
Ｓ−呼び出しの「パラメータ」コマンドは、ネイティブ関数パラメータとして用いられる値を特定して、その値に対する適切なパラメータ変換をエンコードする。一実施形態においては、各Ｓ−呼び出しパラメータ・コマンドは、関数呼び出しに対する「次の」パラメータを規定することを、対応する値をスタックにプッシュすることによって行ない、したがってＳ−呼び出しパラメータ・コマンドは、関数プロトタイプに対応する順序に設けられている必要がある。
【００６８】
ネイティブ関数に対する実際の関数呼び出しは、Ｓ−呼び出しの「呼び出し」コマンドによってエンコードされる。Ｓ−呼び出しの呼び出しコマンド引数には、関数の戻り値を記憶する箇所と、呼び出されている関数の対象装置状態における名前、絶対アドレス、またはアドレス箇所のいずれかとが、含まれている。
【００６９】
Ｓ−呼び出しの「コピー」コマンドは、対象レジスタまたは対象メモリ箇所に対して値をコピーしまたはそこから値をコピーする動作と、目的コードとネイティブ表現との間の変換を行なう動作とをエンコードする。
【００７０】
Ｓ−呼び出しの「ナリファイ」コマンドは、このコマンドが従う命令を無効にする。このコマンドを、無条件のブランチとともに用いて（これについては後述する）、ネイティブで実行されるときに対象プログラムを適切に実行できるようにするとともに、さらに、トランスレータがコードのトランスレータ固有部分を特定およびインタープリットできるようにする。
【００７１】
トランスレーションの間、トランスレータ１９は、スキゾ・エスケープを検出して、Ｓ−呼び出しコマンドを、対応するパラメータ変換およびネイティブ関数呼び出し動作のＩＲ表現にデコードする。トランスレータ１９は、パラメータ変換ＩＲを現在のブロックのＩＲフォレストに統合する。これはその後、目的コードとして生成される。パラメータ変換動作をＩＲにエンコードすることによって、パラメータ変換コードを、対象コードをエンコードするＩＲに統合して、このコードによって最適化することができる。
【００７２】
Ｓ−呼び出しコマンドは、対象プログラムにおいて、先頭の命令のｏｐｃｏｄｅ、スキゾ・エスケープを用いてエンコードされる。スキゾ・エスケープは、トランスレータ１９だけが分かっている。何故なら、Ｓ−呼び出しコマンドは、トランスレータ固有のネイティブ結合命令であるからである。対象プロセッサによって、Ｓ−呼び出しコマンドが、違法の対象命令としてインタープリットされる。したがって、Ｓ−呼び出しコマンドの実行は、対象プログラムがネイティブで（すなわち、対象アーキテクチャ上で）実行されているときには、回避しなければならない。対象プログラム・ソフトウェアの開発者は、複数の方法を用いて、Ｓ−呼び出し拡張対象プログラムをネイティブで実行することができる。この方法には、（ａ）条件付きの実行、および（ｂ）ブランチ・ルック・アヘッド構文解析が含まれる。条件付きの実行は、条件付きの対象コードからなる。この条件付きの対象コードは、対象プログラムがネイティブで実行されているのかトランスレート済みプログラムとして実行されているのかを、実行時の環境に基づいてチェックし、ネイティブで実行されている場合にはＳ−呼び出しコマンドを省略するものである。ブランチ・ルック・アヘッド構文解析は、無条件のブランチ命令からなる。無条件のブランチ命令は、対象コード内でプラントされて、すべてのトランスレータ固有の命令（たとえば（これに限定されないが）Ｓ−呼び出しコマンド）を省略する。ネイティブで実行するときには、無条件のブランチが実行され、その結果、トランスレータ固有のコードがスキップされる。トランスレート済みプログラムとして実行されるときは、トランスレータは、Ｓ−呼び出しナリファイ・コマンドが後に続く任意の無条件のブランチ命令を無視する（すなわち、無条件のブランチは、デコーディングにおいてトランスレータ固有のコードを特定するためにトランスレータが用いる対象命令パターンの一部である）。
【００７３】
目的コード・スタブ：外部のスキゾ・スタブ
他の実施形態においては、スキゾ呼び出しコマンドと普通の対象命令とから構成される呼び出しスタブを、対象コードの別個にコンパイルされる単位内に配置する。トランスレータ１９は、特別目的のネイティブ結合用結合点の記述言語（前述したように）を用いて、対象コード箇所を結合点として指定する。トランスレータ１９がこのような結合点に到達すると、制御フローは変えられて、外部のスキゾ・スタブが代わりに実行される。この点から以降では、トランスレータの作用は、スキゾ呼び出しに対して説明した作用と同じである。外部のスキゾ・スタブがあると、Ｓ−呼び出しコマンドを対象コードに直接挿入できないとき（たとえば対象ライブラリ／アプリケーションに対するソース・コードが利用できないとき）に、Ｓ呼び出しコマンドを用いることができる。
【００７４】
目的コード・スタブ：インタープリット済みスクリプト
代替的な実施形態においては、目的コード・パラメータ変換を、特別目的のネイティブ結合実施言語（「スクリプト言語」）によって容易にする。これについては、前述した通りである。この実施形態においては、実行時に、トランスレータが、ネイティブ結合スクリプトを、パラメータ変換のＩＲ表現にインタープリットする。トランスレータは、パラメータ変換ＩＲを現在のブロックのＩＲフォレストに統合する。これはその後最適化されて、目的コードとして生成される。このようなトランスレータは、スクリプト言語を構文解析およびデコードすることができるフロント・エンド・コンポーネントを含んでいなければならない。
【００７５】
本実施形態においては、結合すべき対象関数および対応するネイティブ呼び出しスタブ関数を、ネイティブ結合用結合点の記述によって特定し、一方で、結合先のその下のネイティブ関数の身元は、呼び出しスタブの実施においてハード・コードされる。
【００７６】
目的コード・スタブ：統一されたインターフェース
代替的な実施形態においては、目的コード・パラメータ変換を、統一された呼び出しスタブ関数インターフェースを規定することによって容易にする。これについては前述した通りである。統一された呼び出しスタブ関数インターフェースによって、すべてのネイティブ呼び出しスタブに対する固定された関数署名と、対応するデータ形式とが規定される。この結果、トランスレータは、呼び出しスタブをネイティブ関数として呼び出すことを、その下のネイティブ関数の関数署名（プロトタイプ）を何ら知ることなく、行なうことができる。この結果、呼び出しスタブを、高レベル・プログラミング言語（たとえばＣまたはＣ＋＋）において実現することができる。この結果、ネイティブ結合メカニズムは、トランスレータ１９のエンド・ユーザにとって、より利用しやすいものとなる。
【００７７】
前述のネイティブ・コードの統一された呼び出しスタブ・インターフェースとは対照的に、いくつかの実施形態において、トランスレータは、実行時に呼び出しスタブの実現を構文解析するとともに、呼び出しスタブの実現を、パラメータ変換のＩＲ表現にインタープリットする。言い換えれば、トランスレータによって、呼び出しスタブの実施をトランスレータＩＲにコンパイルする。トランスレータによって、パラメータ変換ＩＲが現在のブロックのＩＲフォレストに統合される。これはその後最適化されて、目的コードとして生成される。このようなトランスレータは、コンパイラと同様に、高レベルのプログラミング言語を構文解析してデコードすることができるフロント・エンド・コンポーネントを含んでいなければならない。
【００７８】
本実施形態においては、結合すべき対象関数および対応するネイティブ呼び出しスタブ関数を、ネイティブ結合用結合点の記述によって特定し、一方で、結合先のその下のネイティブ関数の身元は、呼び出しスタブの実施においてハード・コードされる。
【００７９】
いくつかの好ましい実施形態について図示して説明してきたが、当業者であれば理解するように、添付請求項において規定されるように、本発明の範囲から逸脱することなく、種々の変形および変更を行なっても良い。
【００８０】
本出願に関連して本明細書と同時にまたは以前に出願され、本明細書とともに公衆の便覧に公開されているすべての論文および文献に注意を払うものであり、このような論文および文献はすべて、その内容が本明細書において参照により取り入れられている。
【００８１】
本明細書（任意の添付請求項、要約、および図面を含む）で開示されるすべての特徴、および／または同様に開示される任意の方法またはプロセスのすべてのステップは、このような特徴および／またはステップの少なくとも一部が互いに相容れない組み合わせを除いて、任意の組み合わせで組み合わせても良い。
【００８２】
本明細書（任意の添付請求項、要約、および図面を含む）で開示される各特徴を、特にことわらない限り、同じ、同等、または類似の目的を満たす代替的な特徴と取り替えても良い。したがって、特にことわらない限り、開示される各特徴は、同等または類似の特徴の包括的な組の１つの例に過ぎない。
【００８３】
本発明は、前述の実施形態の詳細に限定されない。本発明は、本明細書（任意の添付請求項、要約、および図面を含む）で開示される特徴の任意の新しい１つまたは任意の新しい組み合わせに及ぶか、または同様に開示される任意の方法またはプロセスのステップの任意の新しい１つまたは任意の新しい組み合わせに及ぶ。
【図面の簡単な説明】
【００８４】
【図１】本発明の実施形態が応用例を見出す装置のブロック図。
【図２】本発明の例示的な実施形態によるネイティブ結合プロセスを例示する概略図。
【図３】本発明の例示的な実施形態によるネイティブ結合プロセスを例示する概略図。
【図４】本発明の例示的な実施形態によるネイティブ結合プロセスを例示する概略図。
【図５】本発明の例示的な実施形態によるネイティブ結合プロセスを例示する概略図。
【図６】本発明の例示的な実施形態によるネイティブ関数呼び出しを例示するフロー図。
【図１】
2007529063.tif 000003
【図２】
2007529063.tif 000004
【図３】
2007529063.tif 000005
【図４】
2007529063.tif 000006
【図５】
2007529063.tif 000007
【図６】
2007529063.tif 000008
【国際調査報告】
2007529063.tif 000009
2007529063.tif 000010