(57)【要約】  サブジェクトコード（１７）からターゲットコード（２１）へ変換するトランスレータにて用いられる実行制御方法を記載する。トランスレータ（１９）はトランスレータトランポリン関数（１９１）を備える。トランスレータトランポリン関数（１９１）はトランスレータランループ（１９０）から呼び出されると、トランスレータコードジェネレータ関数（１９２）を呼び出しターゲットコード（２１）を生成するか、以前に生成されたターゲットコード（２１２）を呼び出し実行する。次いで、制御はトランスレータトランポリン関数（１９１）に返り、新たな呼出を行うか、トランスレータランループ（１９０）に返る。他の態様は、トランポリン関数（１９１）によってコンテキスト切替を行うことと、トランポリン関数の両側に第１、第２の呼出規約を設定することとを含む。実行中のターゲットコードブロック（２１２）間での直接的又は間接的なジャンプも記載する。
2008533578.tif 000002
【特許請求の範囲】
【請求項１】
サブジェクトプログラム（１７）からターゲットプロセッサ（１３）によって実行可能なターゲットコード（２１）へのプログラムコード変換中の実行制御の方法であって、
（ａ）サブジェクトプログラム（１７）中のサブジェクトブロックをカレントサブジェクトブロックとして設定するトランスレータランループ（１９０）を提供する工程と、
（ｂ）トランスレータランループ（１９０）からトランスレータトランポリン関数（１９１）を呼び出す工程と、
（ｃ）トランスレータトランポリン関数（１９１）からトランスレータコードジェネレータ関数（１９２）を呼び出しカレントサブジェクトブロックからターゲットコードブロック（２１２）を生成及び格納するか、或いはカレントサブジェクトブロックに対応する以前に格納されたターゲットコードブロック（２１２）を呼び出し実行する工程と、
（ｄ）トランスレータトランポリン関数（１９１９）に戻り、別のサブジェクトブロックに対して工程（ｃ）を繰り返すか、或いはトランスレータトランポリン関数（１９１）からトランスレータランループ（１９０）に戻る工程と、からなる方法。
【請求項２】
トランスレータランループ（１９０）及びトランスレータコードジェネレータ関数（１９２）を含むトランスレータ実行中に第１の呼出規約（７１）を適用する工程と、
ターゲットコード（２１）の実行中に第２の呼出規約（７２）を適用する工程と、を含む請求項１に記載の方法。
【請求項３】
第１の呼出規約（７１）において、ターゲットプロセッサ（１３）のレジスタ（１５）に第１の所定の役割及び第１のレジスタ保存プロパティを割り当てる工程と、
第２の呼出規約（７２）において、ターゲットプロセッサ（１３）のレジスタ（１５）に第２の所定の役割及び第２のレジスタ保存プロパティを割り当てる工程と、を含む請求項２に記載の方法。
【請求項４】
トランスレータ実行とターゲットコード実行との間での切替時に第１の呼出規約（７１）から第２の呼出規約（７２）へ又は逆に第２の呼出規約（７２）から第１の呼出規約（７１）へトランポリン関数の切替を実行する工程を含む請求項２又は３に記載の方法。
【請求項５】
第１の呼出規約（７１）はターゲットプロセッサ（１３）の命令セットアーキテクチャに対し適切に適用される請求項４に記載の方法。
【請求項６】
第１の呼出規約（７１）は、呼出先で保存されるレジスタ及び呼出元で保存されるレジスタを含む、レジスタ役割及び保存プロパティの第１のセットを定義することと、
第２の呼出規約（７２）は、第１のセットと異なるレジスタ役割及び保存プロパティの第２のセットを定義することと、を含む請求項４又は５に記載の方法。
【請求項７】
トランスレータコードジェネレータ関数（１９２）の実行時に、ターゲットプロセッサ（１３）の命令セットアーキテクチャに適切な第１の呼出規約（７１）を適用する工程と、
トランスレータコードジェネレータ関数（１９２）により、第２の呼出規約（７２）に従って動作するターゲットコード（２１）を生成する工程と、を含む請求項２乃至６のいずれか一項に記載の方法。
【請求項８】
トランスレータコードジェネレータ関数（１９２）へ若しくはトランスレータコードジェネレータ関数（１９２）から、又は実行されているターゲットコード（２１）のブロックへ若しくは実行されているターゲットコード（２１）のブロックから１つ以上のパラメータを渡す工程を含む請求項１乃至７のいずれか一項に記載の方法。
【請求項９】
前記１つ以上のパラメータは、考慮中のカレントブロックを表す１つ以上の第１のパラメータと、サブジェクトプロセッサの状態に関する情報を提供する１つ以上の第２のパラメータとを含む請求項８に記載の方法。
【請求項１０】
ターゲットプロセッサ（１３）のレジスタ（１５）を用いて、各ターゲットコードブロック（２１２）へ又は各ターゲットコードブロック（２１２）からパラメータを渡す工程を含む請求項１乃至９のいずれか一項に記載の方法。
【請求項１１】
第２の呼出規約（７２）はターゲットプロセッサ（１３）の１つ以上レジスタ（１５）にパラメータを渡す役割を割り当てる請求項２に記載の方法。
【請求項１２】
トランポリン関数のプロセッサモード切替を実行し、ターゲットプロセッサ（１３）のモードを切り替える工程を含む請求項１に記載の方法。
【請求項１３】
少なくともトランスレータコードジェネレータ関数（１９２）の実行中にはターゲットプロセッサ（１３）を第１のモードに設定する工程と、
少なくともターゲットコードブロック（２１２）の実行中にはターゲットプロセッサ（１３）を第２のモードに設定する工程と、を含む請求項１２に記載の方法。
【請求項１４】
トランスレータトランポリン関数（１９１）を通じてターゲットコード（２１）のカレントブロックからターゲットコード（２１）の続くブロックへ間接的にリンクする工程を含む請求項１乃至１３のいずれか一項に記載の方法。
【請求項１５】
ターゲットコードブロック（２１２）のコードを含むか又は格納されたターゲットコードブロック（２１２）へのリンクを含む格納されたブロックオブジェクト（１００）にリンクするリンクパラメータ（１０１）を提供するテール部を有するターゲットコード（２１）の各ブロックを生成する工程と、
トランポリン関数において、カレントブロックからブロックリンクパラメータ（１０１）を受け取ることによって、ターゲットコードの続くブロックを呼び出す工程と、を含む請求項１４に記載の方法。
【請求項１６】
トランポリン関数に復帰することなくカレントターゲットコードブロック（２１２）からターゲットコード（２１）の続くブロックへ間接的にリンクするテール部を有するターゲットコード（２１）の各ブロックを生成する工程を含む請求項１乃至１３のいずれか一項に記載の方法。
【請求項１７】
テール部は、メモリに格納されたリンクパラメータ（１０１）に基づき間接ジャンプを実行するジャンプ命令を含む請求項１６に記載の方法。
【請求項１８】
リンクパラメータ（１０１）は次に実行される続くブロックオブジェクトを格納するメモリアドレスを指し示すことと、ブロックオブジェクトは続くブロックの翻訳されたターゲットコード（２１）を格納することと、を含む請求項１７に記載の方法。
【請求項１９】
リンクパラメータ（１０１）は次に実行される続くブロックオブジェクトを格納するメモリアドレスを指し示すことと、ブロックオブジェクトは続くターゲットコードブロック（２１２）のアドレスポインタを含むことと、を含む請求項１７に記載の方法。
【請求項２０】
カレントターゲットコードブロック（２１２）において、ターゲットプロセッサ（１３）のターゲットレジスタにリンクパラメータ（１０１）を格納する工程と、
ターゲットレジスタに含まれるメモリアドレスへジャンプすることによって、次に実行されるコードのブロックを表す格納されたオブジェクトにリンクする工程と、を含む請求項１６乃至１９のいずれか一項に記載の方法。
【請求項２１】
ターゲットコード（２１）の実行から第２のトランポリン関数（１９３）を呼び出す工程と、
第２のトランポリン関数（１９３）から入れ子のトランスレータ関数（１９２）を呼び出す工程と、
入れ子のトランスレータ関数（１９２）から第２のトランポリン関数（１９３）へ戻る工程と、
第２のトランポリン関数（１９３）からターゲットコード実行へ戻る工程と、を含む請求項１乃至２０のいずれか一項に記載の方法。
【請求項２２】
入れ子のトランスレータ関数（１９２）は、サブジェクトプログラム（１７）の対応するブロックからターゲットコード（２１）のブロックを生成するトランスレータコードジェネレータ関数（１９２）を含む請求項２１に記載の方法。
【請求項２３】
第２のトランポリン関数（１９３）において、ターゲットコード実行と入れ子のトランスレータ実行との間での切替時に第１の呼出規約（７１）から第２の呼出規約（７２）へ又は逆に第２の呼出規約（７２）から第１の呼出規約（７１）へコンテキスト切替を実行する工程を含む請求項２２に記載の方法。
【請求項２４】
ターゲットコード実行コンテキストに留まるか、或いはトランスレータコンテキストをリストアし、トランスレータランループ（１９０）に戻るかをトランポリン関数内で決定することによって、各ターゲットコードブロック（２１２）のプロファイリングチェックを実行する工程を含む請求項１４に記載の方法。
【請求項２５】
ターゲットコードブロック（２１２）にプロファイル閾値を割り当てる工程と、
閾値に達するまでターゲットコードブロック（２１２）の各繰返される実行を数え、閾値に達した場合、トランスレータランループ（１９０）に制御を返す工程と、を含む請求項２４に記載の方法。
【請求項２６】
ターゲットコード実行コンテキストに留まるか、或いはトランスレータコンテキストをリストアし、トランポリン関数に戻るかをターゲットコードブロック（２１２）内で決定することによって、ターゲットコードブロック（２１２）のプロファイリングチェックを実行する工程を含む請求項１６に記載の方法。
【請求項２７】
ターゲットコードブロック（２１２）にプロファイル閾値を割り当てる工程と、
０に達するまでターゲットコードブロック（２１２）の各繰返される実行の閾値から逆に数え、０に達した場合、トランポリン関数に制御を返す工程と、を含む請求項２６に記載の方法。
【請求項２８】
請求項１乃至２７のいずれかの一項に記載の方法を実行するためにコンピュータによって実行可能なコンピュータ可読コードの形式でソフトウェアを常駐させているコンピュータ可読記憶媒体。
【請求項２９】
ターゲットプロセッサ（１３）と、請求項１乃至２７のいずれかの一項に記載の方法を実行するトランスレータコードとの組合せ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はコンピュータ及びコンピュータソフトウェアの分野に関する。より詳細には、本発明は、例えば、プログラムコードを変換するコードトランスレータ、エミュレータ、及びアクセラレータにおいて有用な、プログラムコード変換方法及び装置に関する。
【背景技術】
【０００２】
組込、非組込ＣＰＵの両方において、優勢な命令セットアーキテクチャ（ＩＳＡ）が存在する。関連するソフトウェアに透明性にアクセスすることが可能である場合には、そうしたＩＳＡには、性能を「加速する」、或いはより優れたコスト／性能の利益を提供し得る多数の高性能プロセッサへ「翻訳する」ことの可能な大量のソフトウェアが存在する。また、それらのＩＳＡと時を同じくする支配的なＣＰＵアーキテクチャも見出される。そうしたＣＰＵアーキテクチャが性能面又は市場リーチにおいて発展することは不可能である。そのようなＣＰＵはソフトウェア指向のプロセッサコアーキテクチャから利益を得る。
【０００３】
そのような加速、翻訳、及びコアーキテクチャ機能を行うプログラムコード変換方法及び装置は、例えば、特許文献１などに開示されている。
【特許文献１】国際公開第００／２２５２１号パンフレット
【発明の開示】
【発明が解決しようとする課題】
【０００４】
プログラムコード変換を実行するトランスレータは、必然的にトランスレータの動作に関連したオーバヘッドをもたらす。詳細には、動的な翻訳には、ホストＣＰＵの実行がトランスレータプログラムと翻訳されたコードとの間で切り替わるように、トランスレータが翻訳されたプログラムコードと直列に動作することが要求される。この切替の実行にはかなりの作業が必要であり、時間遅延を生じる。
【課題を解決するための手段】
【０００５】
本発明は、プログラムコード変換の実行時、トランスレータの性能を改善する。
本発明の好適な実施形態は、特に動的な翻訳中に、トランスレータの実行と翻訳されたコードの実行との間のコンテキスト切替を行うことに関連したオーバヘッドを低減する。
【０００６】
詳細には、本発明者らは、プログラムコード変換の促進用の最適化技術を開発した。この最適化技術は、サブジェクトプログラムコードをターゲットコードへ翻訳するランタイムトランスレータに関して特に有用である。
【０００７】
本発明の第１の態様では、サブジェクトコードからターゲットコードへ変換するときの実行制御の方法を提供する。この方法は、トランスレータランループから呼び出され、次にトランスレータコードジェネレータを呼び出してさらなるターゲットコードを生成するか、或いは以前に生成されたターゲットコードを実行のために呼び出す、トランスレータトランポリン関数を提供する。次いで、制御はトランスレータトランポリン関数へ返って新たな呼出を行うか、或いはトランポリン関数を通じてトランスレータランループへ返る。
【０００８】
好適には、第１、第２の呼出規約は、トランポリン関数の両側に適用される。呼出規約を変更することによって、詳細には、ターゲットプロセッサレジスタを用いることによって、トランスレータコードジェネレータ関数と実行されるターゲットコードとの間などで
パラメータを渡すことが可能となる。好適には、パラメータは、カレントブロックのサブジェクトコードを参照する識別子、サブジェクトプロセッサの状態に関するパラメータ、又はその両方を含む。
【０００９】
好適には、トランポリン関数は第１、第２のモードの間など、ターゲットプロセッサのプロセッサモードの切替も実行する。適切には、第１のモードはトランスレータジェネレータ関数を呼び出すとき（即ち、トランスレータコンテキスト）に適用され、第２の異なるモードは、生成されたターゲットコードの実行のために適用される。
【００１０】
本発明の別の好適な態様では、第１のターゲットコードブロックから続くブロックへ、トランスレータトランポリン関数を通じて間接的に、又はブロックからブロックへ直接的に、ジャンプすることが可能となる。好適には、この方法は、テール部命令によって各ターゲットコードブロックを生成し、リンクパラメータを提供する工程を含む。リンクパラメータは、続くブロックが格納されているメモリアドレスや、或いは続くブロックを表すブロックオブジェクトが格納されているメモリアドレスへリンクすることなどによって、続くブロックへリンクする。一実施形態では、リンクパラメータはジャンプ命令のオペランドとして用いられる。
【００１１】
本発明の別の態様では、好適な方法は、第１のトランスレータトランポリン関数内に入れ子にされている第２のトランスレータトランポリン関数を提供する工程を含む。好適には、第２のトランポリン関数は実行中のターゲットブロックコードから呼び出され、次に入れ子にされているトランスレータ関数を呼び出し、さらなるターゲットコードを生成する。
【００１２】
本発明のさらに別の態様では、好適な方法は、実行制御がターゲットコード内に留まるか或いはトランスレータランループへ返るかを決定するために、プロファイリングチェックを実行する工程を含む。プロファイリングチェックは、特に、ターゲットコードブロック間をジャンプするときに適用される。好適には、プロファイリングチェックは、ターゲットコードブロックの実行のカウンタ値を管理し、カウンタ値を所定の閾値と比較することを含む。ターゲットコードが所定の回数繰り返されると、実行制御はトランスレータランループへ返される。
【００１３】
また、本発明は、本明細書に記載の方法を実行するためのプログラムソフトウェアが記録されているコンピュータ可読記憶媒体を含む。さらに、本発明は、トランスレータ装置その他の計算装置など、コンピュータプロセッサとそうしたソフトウェアとの組合せを含む。
【発明を実施するための最良の形態】
【００１４】
以下の用語において、サブジェクトプログラムは、サブジェクトプロセッサを含むサブジェクトコンピューティングプラットフォーム上の実行を意図されている。ターゲットプロセッサを含むターゲットコンピューティングプラットフォームは、動的なプログラムコード変換を実行するトランスレータを通じて、サブジェクトプログラムを実行するために用いられる。トランスレータは、ターゲットコンピューティングプラットフォーム上でターゲットコードが実行可能であるように、サブジェクトコードからターゲットコードへのコード変換を実行する。
【００１５】
図１には、複数のターゲットレジスタ１５を有するターゲットプロセッサ１３と、複数のソフトウェアコンポーネント１７，１９，２０，２１，２７を格納するメモリ１８とを備える、ターゲットコンピューティングプラットフォームを示す。ソフトウェアコンポーネントは、オペレーティングシステム２０、サブジェクトコード１７、トランスレータコ
ード１９、及び翻訳されたターゲットコード２１を含む。
【００１６】
一実施形態では、トランスレータコード１９はエミュレータであり、最適化あり又はなしで、サブジェクトＩＳＡのサブジェクトコードを別のＩＳＡの翻訳されたターゲットコードに翻訳する。別の実施形態では、トランスレータコードは、同じＩＳＡの各々において、サブジェクトコードをターゲットコードに翻訳するためのアクセラレータとして機能する。
【００１７】
トランスレータ１９、即ち、トランスレータを実装するソースコードのコンパイルされたバージョンと、翻訳されたコード２１、即ち、トランスレータ１９によって生成されるサブジェクトコード１７の翻訳とは、ターゲットプロセッサ１３上で動作するオペレーティングシステム２０と共に動作する。ターゲットプロセッサ１３は、通常、マイクロプロセッサその他の適切なコンピュータである。
【００１８】
図１に示す構造が例でしかないこと、また、例えば、本発明によるソフトウェア、方法、及び処理が、オペレーティングシステム内又はオペレーティングシステム下に存在するコードにより実装されてよいことが認識される。当業者には知られているように、サブジェクトコード１７と、トランスレータコード１９と、オペレーティングシステム２０と、メモリ１８の記憶機構とは、広範な種々の型のいずれであってもよい。
【００１９】
インターリーブ化コード実行
図１による装置では、プログラムコード変換は、ターゲットコード２１の動作中、好適には動的に、ランタイムに実行される。トランスレータ１９は、翻訳されたプログラム２１と直列に動作する。トランスレータ１９は、好適には、ターゲットアーキテクチャ用にコンパイルされたアプリケーションとして用いられる。サブジェクトプログラム１７は、ターゲットアーキテクチャ上での実行のために、ランタイムでトランスレータ１９によって翻訳される。
【００２０】
トランスレータ１９によってサブジェクトプログラム１７を動作させることは、２つの異なる型のコード、即ち、トランスレータコード１９及びターゲットコード２１をインターリーブして実行することを含む。トランスレータコード１９は、トランスレータ１９の高水準ソースコード実装に基づき、ランタイムに先立ってコンパイラなどによって生成される。対照的に、ターゲットコード２１は、翻訳されているプログラムの格納されたサブジェクトコード１７に基づき、ランタイムの全体を通じてトランスレータコード１９によって生成される。
【００２１】
サブジェクトプログラム１７は、サブジェクトプロセッサ（図示せず）上で動作することが意図される。一実施形態では、トランスレータ１９はエミュレータとして機能する。即ち、トランスレータ１９はサブジェクトプロセッサをエミュレートする一方で、実際にターゲットプロセッサ１３上でサブジェクトプログラム１７をターゲットコード２１として実行する。好適な実施形態では、１つ以上のグローバルレジスタストア２７が提供される（サブジェクトレジスタバンク２７とも呼ばれる）。マルチプロセッサ環境においては、随意では、サブジェクトプロセッサのアーキテクチャに従って、１より多くの抽象レジスタバンク２７が提供される。サブジェクトプロセッサの状態の図は、トランスレータ１９及びターゲットコード２１のコンポーネントによって提供される。即ち、トランスレータ１９は、変数、オブジェクト、又はその両方など、様々な明示的なプログラミング言語デバイスにサブジェクトプロセッサの状態を格納する。トランスレータをコンパイルするために用いられるコンパイラは、状態及び動作がどのようにターゲットコードへ実装されるかを決定する。比較すると、ターゲットコード２１は、ターゲットコード２１のターゲット命令によって操作されるターゲットレジスタ１５及びメモリ域１８に、サブジェクト
プロセッサの状態を非明示的に提供する。例えば、グローバルレジスタストア２７の低水準表現は、単に割り当てられたメモリの領域である。しかしながら、トランスレータ１９のソースコードでは、グローバルレジスタストア２７は、より高水準でアクセス及び操作されることの可能なデータ配列又はオブジェクトである。
【００２２】
図２は、プログラムコード変換中の実行制御の方法例を示す概略的なフローチャートである。
図２に示すように、最初、制御はトランスレータ制御ループ１９０に存在する。工程２０１にて、制御ループ１９０は、トランスレータコード１９のコードジェネレータ関数１９２を呼び出し、コードジェネレータ関数１９２は、サブジェクトコード１７のブロックを翻訳されたコード２１の対応するブロックに翻訳する。次いで工程２０２にて、その翻訳されたコード２１のブロックがターゲットプロセッサ１３上で実行される。簡便には、翻訳されたコード２１の各ブロックの終端は、制御ループ１９０に制御を返す命令を含む。換言すると、サブジェクトコードを翻訳する工程及び実行する工程は、サブジェクトプログラム１７の部分が順番に翻訳され、次いで実行されるように、インタレースされる。
【００２３】
ここで、用語「基本ブロック（ｂａｓｉｃ  ｂｌｏｃｋ）」は、当業者にはよく知られている。基本ブロックは、ブロックコードを単一の制御経路に限定する唯１つの入口点と唯１つの出口点とを有するコードのセクションとして定義される。この理由のため、基本ブロックは制御フローの有用な基本ユニットである。適切には、トランスレータ１９はサブジェクトコード１７を複数の基本ブロックに分割する。ここで、各基本ブロックは、ユニークな入口点の最初の命令とユニークな出口点の最後の命令（ジャンプ、呼出、又は分岐命令など）との間の連続的な命令のセットである。トランスレータは、これらの基本ブロックのうちのただ１つを選択してもよく（ブロックモード）、１群の基本ブロックを選択してもよい（グループブロックモード）。グループブロックは、適切には、単一のユニットとして共に処理される２つ以上の基本ブロックを含む。さらに、トランスレータは、サブジェクトコードの同じ基本ブロックであるが異なる入口条件下にあることを表す、等ブロック（ｉｓｏ−ｂｌｏｃｋ）を形成してもよい。
【００２４】
好適な実施形態では、元のサブジェクトプログラム１７からターゲットコード２１を生成する処理の一部として、サブジェクト命令シーケンスに基づき、ＩＲ木が生成される。ＩＲ木は、サブジェクトプログラムによって計算される表現及び実行される動作の抽象的な図である。その後、このＩＲ木に基づき、ターゲットコード２１が生成される。ＩＲノードの集合は実際には有向非巡回グラフ（ＤＡＧ）であるが、口語的には「木」と呼ばれる。
【００２５】
当業者には認められるように、一実施形態では、トランスレータ１９はＣ＋＋などオブジェクト指向プログラミング言語を用いて実装される。例えば、ＩＲノードはＣ＋＋オブジェクトとして実装され、他のノードへの参照は、それら他のノードに対応するＣ＋＋オブジェクトへのＣ＋＋参照として実装される。したがって、ＩＲ木は、互いへの様々な参照を含むＩＲノードオブジェクトの集合として実装される。
【００２６】
さらに、説明中の実施形態では、ＩＲ生成には、サブジェクトプログラム１７が動作することが意図されるサブジェクトアーキテクチャの特定の特徴に対応する、抽象レジスタの定義のセットが用いられる。例えば、サブジェクトアーキテクチャ上の各物理レジスタ（「サブジェクトレジスタ」）に対するユニークな抽象レジスタ定義が存在する。そのため、トランスレータにおける抽象レジスタ定義は、ＩＲノードオブジェクト（即ち、ＩＲ木）への参照を含むＣ＋＋オブジェクトとして実装され得る。抽象レジスタ定義のセットによって参照されるＩＲ木全ての集合体は、有効ＩＲ林と呼ばれる（ＩＲ木を各々参照する複数の抽象レジスタの根を含むため「林」）。
【００２７】
これらのＩＲ木その他の処理は、トランスレータコードジェネレータ関数１９２の一部を形成する。
ここで、本発明に至る背景及び対処される問題をよりよく理解するために、図３，４を参照して、プログラムコード変換中の実行制御の一例について、さらに説明する。
【００２８】
図３は、サブジェクトプログラム１７の機能セクション３００を示す概略的な図である。セクションにはブロックＡ，Ｂ，Ｃとしてラベルが付されており、それらの間の矢印は、サブジェクトプログラムのフローを表す。この例では、ブロックＢは、ブロックＢ内でループバックするか、或いはブロックＣに続くかの決定に関する、ループ構造を含む。
【００２９】
図４は、ターゲットアーキテクチャにおける実行制御の概略的な図である。プログラムフローは図の下方へと進み、列は、トランスレータ１９の実行と翻訳されたコード２１の実行との間の実行制御渡しを示す。
【００３０】
トランスレータ１９は、適切には、トランスレータ及びターゲットコードの実行の制御動作へのランループ１９０を含む。ランループ１９０は、メモリ１８に格納された、以前に翻訳されたターゲットコード２１（例えば、ＴＣＡ、ＴＣＢ、又はＴＣＣ）を呼び出すか、或いはトランスレータコードジェネレータ関数１９２を呼び出し、メモリ１８に格納されたサブジェクトコードＡ、Ｂ、又はＣの対応するブロックからのそのような翻訳されたターゲットコードを生成する。実行中、これらの関数の間で、１つ以上のパラメータ４００、詳細には、考慮中のカレントブロック（Ａ、Ｂ、又はＣ）と、サブジェクトプロセッサの状態に関する情報とを表すパラメータが渡される。
【００３１】
図４に示す実行制御構造では、幾つかの問題が識別される。
第１に、実行経路は直線的でなく、メモリの任意の位置への多くのジャンプが存在する。詳細には、実行は、ランループ１９０、コードジェネレータ１９２、及びターゲットコード２１の間で頻繁に切り替わり、部分的には、ジャンプはカレントブロック（Ａ、Ｂ、又はＣ）を表すパラメータによって決定される。これらのジャンプを正確に予測することは不可能であり、多くのプロセッサアーキテクチャにおいて予測強化の有効性を著しく低減する。
【００３２】
さらに、翻訳及びターゲットコードの実行の間の切替は、各々相当な作業を含む。以下でより詳細に説明するように、通常、そのようなコンテキスト切替は、所定の条件を満たし、解決された状態に達するために、グローバルレジスタストア２７などへレジスタを保存又はリストアすることを含む。通常、コンテキスト切替には、ターゲットプロセッサ１３による１０個以上の命令の実行が要求される。基本ブロックＡ、Ｂ、又はＣ自体は、５〜１０個の命令しか含まない場合があるので、コンテキスト切替毎にターゲットアーキテクチャに要求される作業が著しく追加されることが認識される。
【００３３】
コンテキスト切替
トランスレータ１９の実行とターゲットコード２１の実行との間の切替は、本明細書ではコンテキスト切替と呼ばれる。ターゲットコード２１の各ブロックは、ターゲットプロセッサ１３及びメモリ１８の状態に関する仮定のセットに基づき実行される。同様に、トランスレータ１９の実行は、ターゲットマシンの状態に関する仮定に従う。詳細には、呼出規約は、レジスタ役割、レジスタ保存、又はその両方などの属性を決定するように定義される。
【００３４】
レジスタ役割に関して、特定のレジスタには共通して特定の役割が割り当てられる。様々な汎用レジスタが提供される場合もある。例えば、ｘ８６プロセッサアーキテクチャに
共通して用いられる呼出規約では、レジスタＥＳＰはスタックポインタとして定義され、レジスタＥＢＰはフレーム／ベースポインタとして定義される。これらの役割及び他の役割は、そのＩＳＡ及びプロセッサの呼出規約の一部を形成し、有効に機能するコード実行を可能とする。
【００３５】
レジスタ保存は、ターゲットマシン上のプログラムコードの異なるセクションの実行を通じて移動するとき、いずれのレジスタコンテンツを保存するべきか（例えば、スタックに保存し、次いでリストアすることによって）、また、いずれを安全に無視することが可能であるか（例えば、スクラッチ又は一時レジスタ）を定義する。
【００３６】
例えば、ｘ８６プロセッサは８つのレジスタを有する。ｘ８６プロセッサ上で共通して用いられる標準的な呼出規約では、レジスタＥＡＸ、ＥＣＸ、ＥＤＸはスクラッチであり、関数呼出しを通じて保存される必要はない、即ち、これらは呼出元で保存される。対照的に、ＥＢＸ、ＥＳＰ、ＥＢＰ、ＥＳＩ、ＥＤＩは呼出先で保存される。即ち、これらのレジスタは、コードの呼び出されたブロックへ入るときにスタックへプッシュされ、次いで、呼出しを通じてそれらのコンテンツを保存及びリストアするために、出るときにスタックからポップされる必要がある。呼出先で保存されるレジスタは、ターゲットコード２１の各ブロックの記憶及び実行の両方にオーバヘッドを追加する。即ち、トランスレータ１９は、呼出規約によって要求されるレジスタ保存及びリストア動作を実行するために、ターゲットコード２１の生成された各ブロックの始端及び終端に余分な命令を追加する。これは、サブジェクトコードの等価なブロックを複製する、ターゲットブロックの有用な命令に加えて存在する。
【００３７】
他のプロセッサは、１６、３２、又は６４以上のレジスタを有するため、特に呼出先で保存されるレジスタに対しては作業負荷の増加を伴う。
各コンテキスト切替にはターゲットアーキテクチャによる相当な作業が要求され、必然的に時間遅延が導入されるので、トランスレータ１９によってサブジェクトプログラム１７の実行は遅らせられることが認められる。
【００３８】
図５には、図２，３，４を参照して上述の実行制御方法例の作業負荷分散を示す。左手の列がトランスレータランループ１９０であり、右手の列がターゲットコード２１の実行である。ランループ１９０によって行われる作業をＸで表す。レジスタ保存及びパラメータ渡しなどの呼出規約のオーバヘッドなど、ターゲットコード２１の各ブロック（ＴＣＡ、ＴＣＢ、ＴＣＣ）内の作業をＹで表し、関連するターゲットコードブロック（元のサブジェクトプログラム１７のブロックＡ、Ｂ、又はＣの作業に対応する）の有用な作業をＺで表す。
【００３９】
図３の単純なサブジェクトプログラムを参照すると、ブロックＢは繰り返し実行されるが、図５に示すように、ブロックＢの実行毎にトランスレータ及びターゲットの実行の間のコンテキスト切替が要求されるため、相当なオーバヘッドが生じる。
【００４０】
本発明の好適な実施形態は、詳細には、コンテキスト切替をより効率的にすることによって、コンテキスト切替に関連したオーバヘッドの低減によって、及び、コンテキスト切替の発生の低減によって、プログラムコード変換中の実行制御の改良された方法を提供する。
【００４１】
アセンブリトランポリン
図６には、本発明の第１の好適な態様による、プログラムコード変換中の実行を制御する方法の概要を示す。
【００４２】
図６に示すように、トランスレータランループ１９０はアセンブリトランポリン関数１９１への呼出しを行い、次にアセンブリトランポリン関数１９１が、格納された以前に翻訳されたターゲットコードブロック２１２（ＴＣＡ、ＴＣＢ、ＴＣＣ）の実行を呼び出す。或いは、トランポリン関数１９１は、格納されたサブジェクトプログラム（１７）からターゲットコード２１を生成するトランスレータコードジェネレータ関数（１９２）を呼び出す。
【００４３】
図７には、本発明の第１の好適な態様によるプログラムコード変換中の作業負荷分散を示す。
図７に示すように、トランスレータ１９とターゲットコード２１との間で作業負荷が分散される。ランループ１９０によって行われる作業をＸで表し、トランポリン関数１９１による作業をＹ’として表し、ターゲットコードブロック２１２による作業をＺとして表す。
【００４４】
トランポリン関数１９１の擬似コード例を以下に示す：
【００４５】
【表１】
2008533578.tif 000003
【００４６】
トランポリン関数１９１の主なタスクは、トランスレータコンテキストとターゲットコードコンテキストとの間でコンテキスト切替を実行することである。この例では、変数ｂｌｏｃｋ＿ｉｄｅｎｔｉｆｉｅｒがレジスタへロードされ、次いで、このレジスタの値は直接的又は間接的に呼び出すためのアドレスとして用いられ、そのアドレスに格納されたコードを実行するために用いられる。実行されるコードは以前に翻訳されたターゲットコード２１２であってもよくトランスレータコードジェネレータ関数１９２であってもよい。
【００４７】
トランポリン関数１９１を提供する際、メモリに格納された各ターゲットコードブロック２１２のサイズを低減することによる直接の利点が存在する。即ち、各ブロックは有用な命令及び最小のオーバヘッドを含む。さらに、各ブロックの作成はより小さくより速いため、翻訳中の作業は低減される。
【００４８】
呼出規約
図８には、プログラムコード変換中に第１、第２の呼出規約を用いる好適な方法を示す。
【００４９】
この方法は、トランスレータ１９の実行中に第１の呼出規約７１を適用する工程と、ターゲットコード２１の実行中に第２の呼出規約７２を適用する工程と、を含む。
図８に示すように、第１の呼出規約７１では、レジスタは第１の所定の役割を割り当てられ、一定のプロパティを仮定する。第２の呼出規約７２では、レジスタは異なる第２の役割を割り当てられ、異なる第２のプロパティのセットを仮定する。
【００５０】
トランポリン関数１９１は、第１の呼出規約から第２の呼出規約へ呼出規約切替を実行する命令を含む。呼出規約切替命令を含むトランポリンの擬似コード例を以下に示す：
【００５１】
【表２】
2008533578.tif 000004
【００５２】
簡便には、第１の呼出規約７１は、ターゲットプロセッサ１３の命令セットアーキテクチャ（ＩＳＡ）に適切に順守される。この第１の呼出規約は、呼出先で保存される１つ以上のレジスタ１５と、呼出元で保存される１つ以上のレジスタ（スクラッチレジスタ）とを定義する。
【００５３】
トランスレータ１９自体は、ターゲットプロセッサ１３の命令セットアーキテクチャに適切な第１の呼出規約に従って動作する。しかしながら、ターゲットコード２１は第２の呼出規約に従うトランスレータ１９によって生成されるため、第２の呼出規約によって定義される代替のレジスタ役割及びレジスタ保存の利点を得る。
【００５４】
パラメータ渡し
図７を再び参照すると、トランポリン関数１９１は、各ターゲットコードブロックＴＣＡ、ＴＣＢ、ＴＣＣの実行中、各ターゲットコードブロックから、また各ターゲットコードブロックへパラメータを渡すための簡便な機構も提供する。詳細には、考慮中のカレントブロックのサブジェクトコード（例えば、Ａ、Ｂ、又はＣ）を表す１つ以上の第１のパラメータを渡すことは有用である。また、サブジェクトプロセッサの状態（抽象レジスタバンク２７に対するポインタなど）に関する情報を提供する１つ以上の第２のパラメータを渡すことも有用である。
【００５５】
最も簡便には、ターゲットプロセッサ１３のレジスタ１５を用いて、各ターゲットコードブロックへ又は各ターゲットコードブロックからパラメータが渡される。これは、これらの１つ以上のレジスタ１５に格納されたパラメータ値を渡すために、適切な時に第１、第２の呼出規約７１，７２に選択的に従うことによって達成される。
【００５６】
呼出規約切替命令及びパラメータ渡しを含むトランポリンの擬似コード例を以下に示す：
【００５７】
【表３】
2008533578.tif 000005
【００５８】
この特定の例において、Ｘ８６プロセッサにおける第１の呼出規約７１では、レジスタｅｂｐはスタックベースポインタを格納する。好適な第２の呼出規約７２では、これに代えて、ｅｂｐは抽象レジスタバンク２７に対するポインタを格納する。これは、第１の呼出規約７１におけるそのレジスタの仮定に反する。
【００５９】
ターゲットレジスタ１５のうちの１つのパラメータを渡すことは、複数の利点を有する。第１に、演算の保存／リストアが回避される。第２に、一般に、スタック、キャッシュ、又は長期メモリにメモリアクセスすることと比較して、プロセッサがレジスタから値を読み出すことは、はるかに速い。
【００６０】
プロセッサモード切替
随意では、プロセッサモード切替は各コンテキスト切替中に実行される。即ち、トランポリン関数１９１は、好適には、プロセッサモード切替を実行する命令をさらに含む。
【００６１】
一例として、一部のプロセッサは、リトルエンディアン又はビッグエンディアンのバイト配列モードで動作することが可能である。コンテキスト切替中にターゲットコード実行に適切なリトル又はビッグエンディアンモードを設定するようにプロセッサモード切替が実行され、トランスレータ実行では反対のモードが設定される。
【００６２】
特に、特定のサブジェクトプロセッサモードのために書かれているサブジェクトプログラムの必要をよりよく反映する代替の動作モードをターゲットプロセッサが提供する場合には、プロセッサモード切替を実行する際、実際的な利点が存在する。当業者にはよく知られているように、プロセッサモードの変更は、モードフラグを設定する命令のセット、又は特定のターゲットプロセッサに適切な他のプロセッサ制御構成によって行われる。
【００６３】
トランポリンブロックジャンプ
図９には、プログラムコード変換中の実行制御の方法のさらに好適な実施形態を示す。
図９を参照すると、ターゲットコード２１２の各ブロックは、トランポリン関数１９１に制御を渡す１つ以上の命令によって終了する。ここで、さらなる強化によって、ターゲットコード２１２（例えば、ＴＣＢ）のカレントブロックがターゲットコード（例えば、ＴＣＢ又はＴＣＣ）の続くブロックをトランポリン関数１９１によって間接的に参照することが可能となる。
【００６４】
図３のプログラムの単純なループ構造を再び参照すると、例示のため、我々はブロック
Ｂがジャンプで終了し、ブロックＢの始端に戻るか、或いはブロックＣへ続くと仮定している。
【００６５】
図９に示すように、トランポリンブロックのジャンプによって、ランループ１９０に戻ることなく、アセンブリコードトランポリン１９１によって、カレントブロック（ＴＣＢ）から次のブロック（ＴＣＢ又はＴＣＣ）までジャンプするプログラム実行が可能となる。これは、コンテキスト切替を回避しターゲットコード実行コンテキスト内に留まることによって、相当な節約を示す。好適な実施形態では、続くターゲットコードブロックのコードを含むか又は格納された続くターゲットコードブロックへのリンクを含む、格納されたブロックオブジェクトにリンクするリンクパラメータ（変数「ｂｌｏｃｋ＿ｉｄｅｎｔｉｆｉｅｒ」など）を提供するテール部を有する、ターゲットコード２１２の各ブロックが生成される。トランポリン関数１９１は、このブロックリンクパラメータを受け取ることによって、ターゲットコードの続くブロックを呼び出す。
【００６６】
格納されたブロックオブジェクトの好適な形式を、図１０に示す。各ブロックオブジェクト１００は、ブロックラベル１０１（例えば、「Ａ」、「Ｂ」、又は「Ｃ」）、ソースコード１７の対応するブロックのサブジェクトアドレス１０２、及びターゲットアドレス１０３を含む。利用可能な場合、ターゲットアドレス１０３はターゲットコードブロック（ＴＣＡ、ＴＣＢ、ＴＣＣ）を参照するか、或いはターゲットコードジェネレータ１９２を参照する。したがって、適切なように、格納されたターゲットアドレス１０３へのジャンプによって、ターゲットコード又はコードジェネレータ関数の実行が可能となる。
【００６７】
ターゲットコードジャンプ
図１１は、プログラムコード変換中の実行制御の方法のさらに好適な実施形態を示す。
図１１を参照すると、トランポリン関数１９１に復帰することなく、カレントブロック（ＴＣＢ）から続くブロック（ＴＣＢ又はＴＣＣ）までリンクする１つ以上のテール部命令によって、ターゲットコードのブロック２１２は各々終了する。
【００６８】
テール部は、好適には、メモリからロードされた値に基づき間接ジャンプを実行するジャンプ命令を含む。ターゲットコードテール部の擬似コード例を以下に示す：
【００６９】
【表４】
2008533578.tif 000006
【００７０】
ここでは「ｂｌｏｃｋ＿ｉｄｅｎｔｉｆｉｅｒ」と呼ばれる格納されたリンクパラメータの値に従って、ジャンプが実行される。格納された変数は次に実行される続くブロックオブジェクトを格納するメモリアドレスを指し示す。ブロックオブジェクトは翻訳されたターゲットコードを格納するか、或いはターゲットコードのアドレスポインタを含む。
【００７１】
特に好適な実施形態では、リンクパラメータはターゲットレジスタ１５のうちの１つに提供される。再び、テール部命令の例を以下に示す。
【００７２】
【表５】
2008533578.tif 000007
【００７３】
この例では、変数ｂｌｏｃｋ＿ｉｄｅｎｔｉｆｉｅｒは、ｘ８６プロセッサのレジスタＥＡＸに格納される。テール部命令は、リンクパラメータを含むレジスタＥＡＸを参照するように修正される。レジスタＥＡＸに含まれるメモリアドレスへジャンプすることによって、次に実行されるコードのブロックを表す格納されたオブジェクトにリンクする。また、考慮中のサブジェクトプログラムのカレントブロックを表すために、レジスタＥＡＸの値が保持される。即ち、リンクパラメータは、好適には、対応するターゲットコードの実行中に有用である、ブロックＡ、Ｂ、又はＣのサブジェクトプログラムを表す。
【００７４】
軽度のプロファイリングチェック
図１２には、軽度のプロファイリングチェックを提供することによる、実行制御方法のさらに別の好適な態様を示す。
【００７５】
上述の図９に類似する第１の実施形態では、ターゲットコード実行コンテキストに留まる（第２の呼出規約及び対応するプロセッサモード）か、或いはランループ１９０に戻り、トランスレータコンテキストをリストアする（第１の呼出規約及び第１のプロセッサモード）かの決定は、トランポリン関数１９１内で行われる。
【００７６】
サブジェクトコード１７の実行中、トランスレータは多くの最適化を行うことが可能であり、翻訳されたコード２１の修正又は置換が必要とされる場合があるので、この決定は実用において重要である。次いで、ランループ１９０に制御を返すことによって、これらの最適化決定を行うことが可能となる。
【００７７】
特に好適な機構では、各ターゲットコードブロック２１２に実行限界が割り当てられる。即ち、ランループに制御を返す前に、各ターゲットコードブロックはＮ回以内で実行される。ここで、Ｎは整数である。簡便には、カウンタは、ターゲットコードブロック２１２の生成時にトランスレータ１９によって設定される閾値Ｎまで、数え上げる。これに代えて、閾値Ｎから０まで逆に数えることによって、さらなるコスト削減が達成される。これによって、多くのプロセッサアーキテクチャにおける実行により有効な、「０以下へのジャンプ」型の命令が可能となる。
【００７８】
図１０を再び参照すると、好適な実施形態では、ターゲットコードのブロック１００は各々、カウンタＮの現在の値を格納するためのプロファイルカウント１０４を含んで生成される。
【００７９】
軽度のプロファイリングチェックは、次の擬似コード例によって示すようなトランポリン関数１９１により提供される：
【００８０】
【表６】
2008533578.tif 000008
【００８１】
この例では、カウンタが既に０に達している場合、ｊｚ（０に等しい場合にはジャンプする）命令によって、呼出しは回避される。
図１３には、図１１に関する上述の実施形態に適切な軽度のプロファイリングチェックのさらに別の好適な態様を示す。
【００８２】
ここで、プロファイリングチェックはターゲットコードブロック１９１内で実行される。閾値が０に設定され、続く反復を通じて低減される。好適には、チェックは、次の例における命令などによって、ターゲットコードブロックに入るときに実行される：
【００８３】
【表７】
2008533578.tif 000009
【００８４】
閾値に達する（例えば、０に）場合、トランスレータランループ１９０へのコンテキスト切替など適切なアクションを実行するため、制御はトランポリン関数１９１に返る。
入れ子の制御ループ
図１４には、プログラムコード変換中の実行制御の別の好適な方法を示す。この方法では、入れ子の制御ループが用いられる。
【００８５】
図１４に示すように、入れ子形式の実行制御によって、トランスレータコードジェネレータ関数１９２を呼び出すための簡便な機構が提供される。ここで、ブロックジャンプは
上述において図９，１１で説明したように実行される。したがって、ターゲットコードブロックＴＣＢのテール部は、まだ生成されていないブロックＴＣＣへのジャンプを試みる。これに代えて、トランスレータジェネレータ関数１９２を呼び出す第２のトランポリン関数１９３へ実行を渡すように、ブロックオブジェクトＣは転送を含む。次いで、ターゲットコードブロックＴＣＣが、対応するサブジェクトコードブロックＣから生成される。トランポリン関数１９３、次いで第１のトランポリン関数１９１を通じて戻り、制御はランループ１９０に返る。次いで、ターゲットコードブロックＴＣＣは第１のトランポリン関数１９１によって呼び出される。
【００８６】
第１、第２のトランポリン関数１９１，１９３は、非常に類似しており、同じコードを共有してもよいが、明瞭さのため、図１４では別々に示している。
また、図１４には、トランスレータコンテキストとターゲットコードコンテキストとの間のコンテキスト切替を示す。トランポリン関数１９１，１９３は各々、第１、第２の呼出規約７１，７２の間で変化することを含め、ターゲットコードコンテキストへの、またターゲットコードコンテキストからのコンテキスト切替を実行する。したがって、トランポリン１９１，１９３は各々、第１、第２のコンテキストを跨いで示される。
【００８７】
第２のトランポリン関数１９３は、トランスレータコンテキスト７１への、またトランスレータコンテキスト７１からのコンテキスト切替を入れ子にし、コードジェネレータ１９２を動作させる。次いで、第１のトランポリン関数は元のコンテキスト切替の選択を止め、ランループ１９０の最上位へ戻る。第１、第２のトランポリン１９１，１９３によるダブルバウンスによって、パラメータその他のデータをスタックに格納し、次いで正確な順序で適切にリストアすることが可能となる。上述のように、各コンテキスト切替には、簡便にはＬＩＦＯスタックのプッシュ又はポップを用いる、レジスタ保存又はリストア動作が必要である。
【００８８】
ほとんどの場合、サブジェクトプログラム１７では小さな領域のコードが繰り返し実行されることが要求され、大部分は、実行されるにしてもまれである。例えば、サブジェクトプログラムはスプレッドシート又はワードプロセッサのプログラムであり、多くの利用可能な関数又はコマンドのうちの比較的少数しか頻繁に用いられない。したがって、動的なバイナリトランスレータでは、翻訳よりかなり頻繁にターゲットコード実行が起きる。図１４の好適な実行制御方法は、第２のトランポリン関数１９３にオーバヘッドを追加するが、翻訳されたコード２１の実行のために最適化される。
【００８９】
上述の各態様を分離して用いることが可能である。しかしながら、これらの機構の相乗的な組合せによって著しい利益が得られる。即ち、トランポリン関数、第１、第２の呼出規約、ブロックジャンプ、軽度のプロファイリングチェック、及び入れ子の制御ループによる１つ以上のコンテキスト切替を組み合わせることによって、トランスレータ１９によるサブジェクトコード１７の実行において相当な節約が得られる。
【００９０】
実際の例として、本発明の好適な実装においては、本明細書に記載の強化によって実行は２〜３倍速い。これは、トランスレータ１９の性能に対する相当な向上である。
【図面の簡単な説明】
【００９１】
【図１】サブジェクトコードからターゲットコードへの翻訳を示す、例示的な計算環境の概略図。
【図２】プログラムコード変換中の実行制御の方法例を示す概略的なフローチャート。
【図３】サブジェクトプログラムの例を示す概略的な図。
【図４】ターゲットアーキテクチャにおける実行制御の概略的な図。
【図５】図２，３，４の実行制御方法の作業負荷分散を示す図。
【図６】プログラムコード変換中の実行制御の好適な方法の概要を示す図。
【図７】好適な方法における作業負荷分散の図。
【図８】プログラムコード変換中に第１、第２の呼出規約を用いる好適な方法を示す図。
【図９】プログラムコード変換中の実行制御の別の好適な方法を示す図。
【図１０】本発明の好適な実施形態において用いられる格納されたブロックオブジェクトの例を示す図。
【図１１】プログラムコード変換中の実行制御のさらに別の好適な方法を示す図。
【図１２】軽度のプロファイリングチェックを含む好適な実行制御方法を示す図。
【図１３】は、軽度のプロファイリングチェックを含む別の好適な実行制御方法を示す図。
【図１４】入れ子のコントロールループを用いる、プログラムコード変換中の実行制御の別の好適な方法を示す図。
【図１】
2008533578.tif 000010
【図２】
2008533578.tif 000011
【図３】
2008533578.tif 000012
【図４】
2008533578.tif 000013
【図５】
2008533578.tif 000014
【図６】
2008533578.tif 000015
【図７】
2008533578.tif 000016
【図８】
2008533578.tif 000017
【図９】
2008533578.tif 000018
【図１０】
2008533578.tif 000019
【図１１】
2008533578.tif 000020
【図１２】
2008533578.tif 000021
【図１３】
2008533578.tif 000022
【図１４】
2008533578.tif 000023
【国際調査報告】
2008533578.tif 000024
2008533578.tif 000025
2008533578.tif 000026