(57)【要約】  関数、および関数の複雑度レベルを検出するエミュレートされたバイナリのプリブートスキャン（図２、＃２０１）。ブートアッププロセス中にプリコンパイルが行われることが可能である。さらなる閾値が使用されて、コードが組み込まれるべきかどうかが判定される（図２、＃２０９）。ジャストインタイム変換が、実行時に実行されることが可能である（図２、＃２１１）。
2009501368.tif 000002
【特許請求の範囲】
【請求項１】
少なくとも１つの関数を有する仮想コードをスキャンするステップと、
前記少なくとも１つの関数が、前記スキャン中に第１の所定の閾値を超えるかどうかを判定するステップと、
前記少なくとも１つの関数が、前記第１の所定の閾値を超える場合、前記関数をプリコンパイルするステップと、
前記仮想コードのジャストインタイム変換を実行するステップと
を含むことを特徴とする方法。
【請求項２】
前記所定の閾値は、所定の複雑度レベルに対応することを特徴とする請求項１に記載の方法。
【請求項３】
前記複雑度レベルは、所定のコード行数に対応することを特徴とする請求項２に記載の方法。
【請求項４】
ブートアッププロセス中に前記仮想コードをロードするステップをさらに含み、
前記スキャンするステップは、前記ロードするステップに先立って実行されることを特徴とする請求項１に記載の方法。
【請求項５】
前記プリコンパイルするステップは、所定の時間だけ仮想コードブートアップ時間を長くし、前記第１の所定の閾値は、前記時間に基づくことを特徴とする請求項１に記載の方法。
【請求項６】
前記仮想コードは、本文と、少なくとも１つのサブルーチンとを有し、
前記少なくとも１つのサブルーチンが、第２の所定の閾値未満の複雑度を有すると判定するステップと、
前記少なくとも１つのサブルーチンを前記仮想コードの前記本文の中に配置するステップと
をさらに含むことを特徴とする請求項１に記載の方法。
【請求項７】
前記少なくとも１つのサブルーチンは、コード行を有し、前記本文は、前記サブルーチンに対応する関数呼び出しを有し、前記配置するステップは、前記少なくとも１つのサブルーチンから前記コード行をコピーして、前記仮想コードの前記本文の中の前記関数呼び出しを前記コード行で置き換えることを含むことを特徴とする請求項６に記載の方法。
【請求項８】
複数のサブルーチンをさらに含み、前記配置するステップは、サブルーチンの数が、第３の所定の閾値を下回る場合に限って実行されることを特徴とする請求項７に記載の方法。
【請求項９】
前記仮想コードは、グラフィックスレンダリングソフトウェアを実施することを特徴とする請求項１に記載の方法。
【請求項１０】
ソフトウェアアプリケーションのエミュレートされたバイナリのプリブートスキャンを実行するステップと、
第１の所定の閾値を超える、前記バイナリ内の第１の関数を識別するステップと、
実行のためにコンテキスト切り替えを要求し、第２の所定の閾値を下回る、前記バイナリ内の第２の関数を識別するステップと、
前記第１の関数をプリコンパイルするステップと、
前記第２の関数を前記エミュレートされたバイナリの本文にインラインで配置するステップと、
前記エミュレートされたバイナリのジャストインタイム変換を実行するステップと
を含むことを特徴とする方法。
【請求項１１】
前記ジャストインタイム変換は、所定のプロセッサによって実行されるように適合された第２のバイナリを生成することを特徴とする請求項１０に記載の方法。
【請求項１２】
前記変換されたバイナリを実行するステップをさらに含むことを特徴とする請求項１１に記載の方法。
【請求項１３】
前記ジャストインタイム変換は、前記ソフトウェアアプリケーションの実行時に実行されることを特徴とする請求項１０に記載の方法。
【請求項１４】
前記ソフトウェアアプリケーションは、ゲームソフトウェアであることを特徴とする請求項１０に記載の方法。
【請求項１５】
前記第１の関数、および前記第２の関数は、グラフィックスレンダリングと関係することを特徴とする請求項１０に記載の方法。
【請求項１６】
少なくとも１つの関数を有する仮想コードをスキャンするステップと、
前記少なくとも１つの関数が、第１の所定の閾値を超えるかどうかを判定するステップと、
前記少なくとも１つの関数が、前記第１の所定の閾値を超える場合、前記関数をプリコンパイルするステップと、
前記仮想コードのジャストインタイム変換を実行するステップとを含む方法を実行するためのコンピュータ実行可能命令を有することを特徴とするコンピュータ可読媒体。
【請求項１７】
前記方法は、ブートアッププロセス中に前記仮想コードをロードするステップをさらに含み、前記スキャンするステップは、前記ロードするステップに先立って実行されることを特徴とする請求項１６に記載のコンピュータ可読媒体。
【請求項１８】
前記プリコンパイルするステップは、或る時間だけ仮想コードブートアップ時間を長くし、前記第１の所定の複雑度閾値は、前記時間に基づくことを特徴とする請求項１６に記載のコンピュータ可読媒体。
【請求項１９】
前記仮想コードは、本文と、少なくとも１つのサブルーチンとを有し、
前記少なくとも１つのサブルーチンが、第２の所定の複雑度閾値未満の複雑度を有すると判定するステップと、
前記少なくとも１つのサブルーチンを前記仮想コードの前記本文の中に配置するステップとをさらに含むことを特徴とする請求項１６に記載のコンピュータ可読媒体。
【請求項２０】
前記少なくとも１つのサブルーチンは、コード行を有し、前記本文は、前記サブルーチンに対応する関数呼び出しを有し、前記配置するステップは、前記少なくとも１つのサブルーチンから前記コード行をコピーして、前記仮想コードの前記本文の中の前記関数呼び出しを前記コード行で置き換えることを含むことを特徴とする請求項１９に記載のコンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般に、ソフトウェアエミュレーションの分野に関する。より詳細には、本発明は、仮想コードの選択的なプリコンパイルおよびインライン化に関する。
【背景技術】
【０００２】
ビデオゲームなどのソフトウェアアプリケーションは、通常、コンパイルされる際、アプリケーションの記述、ならびにアプリケーションがどのように実行されるかについての命令を提供する中間のエミュレートされたバイナリなど、仮想コードに変換される。ソフトウェアエミュレータは、アプリケーションが実行されるより前の何らかの時点で、ソフトウェアアプリケーションの中間バイナリのバイナリ変換を実行する。バイナリ変換とは、中間バイナリを、コードを実行するプロセッサのタイプに固有であるマシン実行可能バイナリに変換するプロセスを指す。すると、実行可能バイナリは、そのバイナリのフォーマットが合わせられたプロセッサによって実行される準備ができている。
【０００３】
１つのそのようなバイナリ変換方法は、「ＪＩＴ」（「ジャストインタイム」）バイナリ変換と呼ばれ、ＪＩＴは、その名前が示唆するとおり、コードが実行される直前に行われるソフトウェアコードのバイナリ変換である。その結果、コードの実行が成功するために行われる必要があるプロセッサ固有の変更が、実行の直前まで行われないので、特定の中間バイナリが、様々なプロセッサ上、およびコンピューティングプラットフォーム上で使用されることが可能である。また、ＪＩＴ変換は、バイナリ変換が、ブートアップ中に行われないため、比較的迅速なロード時間およびブート時間をもたらす。
【発明の開示】
【発明が解決しようとする課題】
【０００４】
しかしながら、ＪＩＴ変換は、実行時におけるコードの実行に悪影響を与える可能性がある。例えば、通常のゲームシステムは、コードの実行に悪影響を与えることなしに（すなわち、グラフィックスレンダリングに影響を及ぼすことなしに）、コード内のほとんどの平均複雑度のグラフィックス関数に関して、実行時間中にＪＩＴ変換を実行することができる可能性がある。しかし、「ＡＩ」（人工知能）の大きいセグメントが関与するグラフィックス関数などの、特定の複雑なグラフィックス関数に遭遇した場合、関数変換とコード実行の両方を実行するのに利用できるだけの十分なプロセッサリソースが、存在しない可能性がある。したがって、ユーザは、コード実行における瞬間的な休止を、再生中の目に見える「ちらつき」または「スタッター」として認める可能性がある。プログラマが、グラフィックスリアリズムの増大に向けて絶えず努力するなかで、そのような遅延は、ますます望ましくないものとなりつつある。
【０００５】
別の変換方法は、ソフトウェアプリコンパイラの使用を必要とする。プリコンパイラは、実行に先立つソフトウェアアプリケーションのコードを表す静的中間バイナリ全体のバイナリ変換を実行する。変換は、通常、ソフトウェアが、ブートアッププロセス中にロードされる際に（「ロード時」に）行われる。プリコンパイラの使用は、実行時に、より高速な割り込みのない実行を可能にする一方で、プリコンパイラがバイナリ変換を実行する初期ロード時間が、長くなる。このため、ユーザは、不合理に長いシステムブート時間を経験する可能性があり、その結果、プリコンパイラは、通常、大きいプログラムに関して使用されない。
【０００６】
別の問題は、マシン実行可能バイナリ内の比較的単純な関数を実行することに関連して実行時に生じる。例えば、多くの関数には、コードの本文からサブルーチンへの呼び出しがかかわる。サブルーチンへの呼び出し、およびサブルーチンからの呼び出しリターン（「コンテキスト切り替え」と呼ばれる）は、処理時間を要する。ほとんどの関数の場合、コンテキスト切り替えに要求される処理時間は、関数自体を実行するのに要求される処理時間と比べると、無視できるほど小さい。しかし、関数が、非常に小さい場合、コンテキスト切り替えに要求される処理時間は、その関数に関して要求される全体的な実行時間のかなり大きいパーセンテージとなる可能性がある。その結果、サブルーチンとしてのそのような関数の実行は、その関数が、単にコードの本文内で実行されたとした場合より効率が劣る。この非効率は、余計な処理時間が、コンテキスト切り替えにとられるため、ＪＩＴ変換ばかりでなく、コード実行のパフォーマンスにも悪影響を及ぼす可能性がある。そのような関数をサブルーチンとして実行することは、非効率である可能性があるが、そのようなサブルーチン全般は、通常、ソフトウェア開発者のための好都合なツールとして働く。このため、単に、すべてのそのような関数が、コードの本文の中に配置されたコードを作成することは、望ましくない。
【０００７】
したがって、以上の不備および欠点を克服する機構の必要性が、存在する。本発明は、その必要性を満足させる。
【課題を解決するための手段】
【０００８】
以上の不備および欠点に鑑みて、エミュレートされたバイナリのプリブートスキャンを実行して、所定の複雑度閾値を超える関数を検出する方法およびコンピュータ可読媒体が、提供される。検出された関数が、次いで、ブートアッププロセス中にプリコンパイルされることが可能である。また、プリブートスキャンは、第２の所定の複雑度閾値を下回る関数を検出することもできる。検出された関数は、コード本文にインラインで配置されることが可能である。次いで、ジャストインタイム変換が、実行時に実行されることが可能であり、プリコンパイルされた関数は、さらなる変換なしに、直接に実行されることが可能であり、インラインで移動された関数は、コンテキスト切り替えなしに実行されることが可能である。
【発明を実施するための最良の形態】
【０００９】
本発明の主題を、法定要件を満たすように具体的に説明する。しかし、この説明自体は、本特許の範囲を限定することを意図していない。むしろ、請求される主題は、他の現在または将来の技術と関連して、本明細書で説明されるステップまたは要素と類似した、異なるステップまたは要素を含むように、他の仕方で実施されることも可能であることを、本発明者らは企図している。さらに、「ステップ」という用語は、使用される方法の様々な態様を意味するように本明細書で使用される可能性があるが、この用語は、個々のステップの順序が明示的に説明されない限り、なおかつ、その場合を除き、本明細書で開示される様々なステップの間で、いずれの特定の順序も暗示するものと解釈されてはならない。
【００１０】
（例示的なコンピューティング環境）
図１は、本発明が実施されることが可能な適切なコンピューティングシステム環境１００の例を示す。コンピューティングシステム環境１００は、適切なコンピューティング環境の一例に過ぎず、本発明の用法または機能の範囲について何ら限定を示唆するものではない。また、コンピューティング環境１００が、例示的な動作環境１００に例示されるコンポーネントのいずれのコンポーネント、またはいずれの組合せと関係する依存関係または要件も有するものと解釈されてはならない。
【００１１】
本発明は、他の多数の汎用または専用のコンピューティングシステム環境またはコンピューティングシステム構成で機能する。本発明で使用するのに適する可能性がある、よく知られたコンピューティングシステム、コンピューティング環境、および／またはコンピューティング構成の例には、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルドデバイスもしくはラップトップデバイス、マルチプロセッサシステム、マイクロプロセッサベースのシステム、セットトップボックス、プログラマブル家庭用電化製品、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、以上のシステムまたはデバイスのいずれかを含む分散コンピューティング環境などが含まれるが、以上には限定されない。
【００１２】
本発明は、コンピュータによって実行される、プログラムモジュールなどの、コンピュータ実行可能命令の一般的な文脈で説明されることが可能である。一般に、プログラムモジュールには、特定のタスクを実行する、または特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などが含まれる。また、本発明は、通信ネットワークを介してリンクされたリモート処理デバイス群によってタスクが実行される、分散コンピューティング環境において実施してもよい。分散コンピューティング環境では、プログラムモジュール群は、メモリストレージデバイスを含むローカルコンピュータ記憶媒体とリモートコンピュータ記憶媒体の両方の中に配置されることが可能である。
【００１３】
図１を参照すると、本発明を実施するための例示的なシステムが、コンピュータ１１０の形態で汎用コンピューティングデバイスを含む。コンピュータ１１０のコンポーネントには、処理装置１２０、システムメモリ１３０、およびシステムメモリを含む様々なシステムコンポーネントを処理装置１２０に結合するシステムバス１２１が含まれることが可能であるが、以上には限定されない。システムバス１２１は、様々なバスアーキテクチャのいずれかを使用する、メモリバスまたはメモリコントローラ、周辺バス、およびローカルバスを含め、いくつかのタイプのバス構造のいずれであってもよい。例として、限定としてではなく、そのようなアーキテクチャには、ＩＳＡ（Ｉｎｄｕｓｔｒｙ  Ｓｔａｎｄａｒｄ  Ａｒｃｈｉｔｅｃｔｕｒｅ）バス、ＭＣＡ（Ｍｉｃｒｏ  Ｃｈａｎｎｅｌ  Ａｒｃｈｉｔｅｃｔｕｒｅ）バス、ＥＩＳＡ（Ｅｎｈａｎｃｅｄ  ＩＳＡ）バス、ＶＥＳＡ（Ｖｉｄｅｏ  Ｅｌｅｃｔｒｏｎｉｃｓ  Ｓｔａｎｄａｒｄｓ  Ａｓｓｏｃｉａｔｅ）ローカルバス、およびメザニン（Ｍｅｚｚａｎｉｎｅ）バスとしても知られるＰＣＩ（Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ）バスが含まれる。
【００１４】
コンピュータ１１０は、通常、様々なコンピュータ可読媒体を含む。コンピュータ可読媒体は、コンピュータ１１０がアクセスすることができる任意の利用可能な媒体であることが可能であり、揮発性媒体と不揮発性媒体、着脱式媒体と固定式媒体がともに含まれる。例として、限定としてではなく、コンピュータ可読媒体は、コンピュータ記憶媒体および通信媒体を含む。コンピュータ記憶媒体には、コンピュータ可読命令、データ構造、プログラムモジュール、または他のデータなどの情報の格納のために任意の方法または技術で実装された、揮発性媒体と不揮発性媒体、着脱式媒体と固定式媒体がともに含まれる。コンピュータ記憶媒体には、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリまたは他のメモリ技術、ＣＤ−ＲＯＭ、ＤＶＤ（デジタルバーサタイルディスク）または他の光ディスクストレージ、磁気カセット、磁気テープ、磁気ディスクストレージまたは他の磁気ストレージデバイス、あるいは所望の情報を格納するのに使用することができ、コンピュータ１１０がアクセスすることができる他の任意の媒体が含まれるが、以上には限定されない。通信媒体は、通常、搬送波などの変調されたデータ信号、または他のトランスポート機構で、コンピュータ可読命令、データ構造、プログラムモジュール、または他のデータを実体化し、あらゆる情報配信媒体が含まれる。「変調されたデータ信号」という用語は、信号内に情報を符号化するような形で特性の１つまたは複数が設定または変更されている信号を意味する。例として、限定としてではなく、通信媒体には、有線ネットワークまたは直接有線接続などの有線媒体、ならびに音響媒体、ＲＦ媒体、赤外線媒体、およびその他の無線媒体などの無線媒体が含まれる。また、以上の媒体のいずれかの媒体の組合せも、コンピュータ可読媒体の範囲内に含められなければならない。
【００１５】
システムメモリ１３０は、ＲＯＭ（読み取り専用メモリ）１３１やＲＡＭ（ランダムアクセスメモリ）１３２などの揮発性メモリおよび／または不揮発性メモリの形態でコンピュータ記憶媒体を含む。起動中などに、コンピュータ１１０内部の要素間で情報を転送するのを助ける基本ルーチンを含むＢＩＯＳ（基本入出力システム）１３３が、通常、ＲＯＭ１３１の中に格納される。ＲＡＭ１３２は、通常、処理装置１２０が、即時にアクセスすることができ、かつ／または現在、処理しているデータおよび／またはプログラムモジュール群を含む。例として、限定としてではなく、図１は、オペレーティングシステム１３４、アプリケーションプログラム群１３５、その他のプログラムモジュール群１３６、およびプログラムデータ１３７を示す。
【００１６】
また、コンピュータ１１０は、他の着脱式／固定式、揮発性／不揮発性のコンピュータ記憶媒体も含むことが可能である。単に例として、図１は、固定式不揮発性の磁気媒体に対して読み取りまたは書き込みを行うハードディスクドライブ１４１、着脱式不揮発性の磁気ディスク１５２に対して読み取りまたは書き込みを行う磁気ディスクドライブ１５１、およびＣＤ−ＲＯＭまたは他の光媒体などの着脱式不揮発性の光ディスク１５６に対して読み取りまたは書き込みを行う光ディスクドライブ１５５を示す。例示的な動作環境において使用することができる、他の着脱式／固定式、揮発性／不揮発性のコンピュータ記憶媒体には、磁気テープカセット、フラッシュメモリカード、デジタルバーサタイルディスク、デジタルビデオテープ、ソリッドステートＲＡＭ、ソリッドステートＲＯＭなどが含まれるが、以上には限定されない。ハードディスクドライブ１４１は、通常、インタフェース１４０のような固定式メモリインタフェースを介してシステムバス１２１に接続され、磁気ディスクドライブ１５１および光ディスクドライブ１５５は、通常、インタフェース１５０のような着脱式メモリインタフェースでシステムバス１２１に接続される。
【００１７】
前述し、図１に示すドライブ群、および関連するコンピュータ記憶媒体は、コンピュータ可読命令、データ構造、プログラムモジュール、および他のデータのストレージをコンピュータ１１０に提供する。図１では、例えば、ハードディスクドライブ１４１は、オペレーティングシステム１４４、アプリケーションプログラム群１４５、その他のプログラムモジュール群１４６、およびプログラムデータ１４７を格納しているものとして示されている。以上のコンポーネントは、オペレーティングシステム１３４、アプリケーションプログラム群１３５、その他のプログラムモジュール群１３６、およびプログラムデータ１３７と同一であることも、異なることも可能であることに留意されたい。オペレーティングシステム１４４、アプリケーションプログラム群１４５、他のプログラムモジュール群１４６、およびプログラムデータ１４７に、ここでは、少なくともそれらが異なるコピーであることを示すように、異なる符号を与えている。ユーザは、キーボード１６２や、マウス、トラックボール、またはタッチパッドと一般に呼ばれるポインティングデバイス１６１などの入力デバイス群を介して、コマンドおよび情報をコンピュータ１１０に入力することができる。他の入力デバイス群（図示せず）には、マイク、ジョイスティック、ゲームパッド、サテライトディッシュ、スキャナなどが含まれることが可能である。以上、およびその他の入力デバイスは、しばしば、システムバスに結合されたユーザ入力インタフェース１６０を介して処理装置１２０に接続されるが、パラレルポート、ゲームポート、またはＵＳＢ（ユニバーサルシリアルバス）などの、他のインタフェースおよびバス構造で接続してもよい。また、モニタ１９１、または他のタイプのディスプレイデバイスも、ビデオインタフェース１９０のようなインタフェースを介して、システムバス１２１に接続される。モニタに加え、コンピュータは、出力周辺インタフェース１９０を介して接続することができる、スピーカ１９７やプリンタ１９６などの、他の周辺出力デバイス群も含むことが可能である。
【００１８】
コンピュータ１１０は、リモートコンピュータ１８０のような１つまたは複数のリモートコンピュータに対する論理接続を使用する、ネットワーク化された環境で動作することができる。リモートコンピュータ１８０は、パーソナルコンピュータ、サーバ、ルータ、ネットワークＰＣ、ピアデバイス、または他の一般的なネットワークノードであることが可能であり、通常、コンピュータ１１０に関連して前述した要素の多く、またはすべてを含むが、メモリストレージデバイス１８１だけを図１に示している。図１に示す論理接続には、ＬＡＮ（ローカルエリアネットワーク）１７１およびＷＡＮ（ワイドエリアネットワーク）１７３が含まれるが、他のネットワークも含まれることが可能である。そのようなネットワーキング環境は、オフィス、企業全体のコンピュータ網、イントラネット、およびインターネットで一般的である。
【００１９】
ＬＡＮネットワーキング環境で使用される場合、コンピュータ１１０は、ネットワークインタフェースまたはネットワークアダプタ１７０を介してＬＡＮ１７１に接続される。ＷＡＮネットワーキング環境で使用される場合、コンピュータ１１０は、通常、インターネットなどのＷＡＮ１７３を介して通信を確立するためのモデム１７２、または他の手段を含む。内部にあることも、外部にあることも可能なモデム１７２は、ユーザ入力インタフェース１６０、または他の適切な機構を介してシステムバス１２１に接続することができる。ネットワーク化された環境では、コンピュータ１１０に関連して示したプログラムモジュール群、またはプログラムモジュール群の諸部分は、リモートメモリストレージデバイスの中に格納することができる。例として、限定としてではなく、図１は、リモートアプリケーションプログラム群１８５が、メモリデバイス１８１上に存在するものとして示す。図示したネットワーク接続は、例示的であり、コンピュータ間で通信リンクを確立する他の手段も使用できることを理解されたい。
【００２０】
（例示的な実施形態）
以下の説明では、コードエミュレーションおよびバイナリ変換と関係する詳細は、当業者に知られているものと想定する。したがって、そのような詳細は、簡明および説明のため、本明細書では大部分、省略する。さらに、ゲームソフトウェアの文脈におけるグラフィックスレンダリングがかかわる例示的な実施形態が、説明のためだけに本明細書で使用され、本発明をいずれのそのような実施形態にも限定するものではない。
【００２１】
本発明の或る実施形態は、ＪＩＴ変換技術とプリコンパイル技術を選択的に組み合わせて、ソフトウェアアプリケーションのコード実行中の休止を回避する。そのようなコードのエミュレートされたバイナリのプリブートスキャンが実行されて、バイナリ内の複雑な関数を検出することが可能である。ソフトウェアのブートプロセス中、或る実施形態は、検出された複雑な関数をプリコンパイルする。実行時に、ＪＩＴ変換技術が、バイナリの残りの部分に関して使用され、他方、プリコンパイルされた関数は、直接に、さらなる変換なしに実行されることが可能である。加えて、そのようなプリブートスキャン中、或る実施形態は、非常に単純な関数を検出して、それらの関数を、コードの本文に選択的に再配置することが可能である（本明細書で「インライン化」と呼ばれるプロセス）。実行時に、関数を実行するのに、さもなければ必要なコンテキスト切り替えを回避することができる。
【００２２】
或る実施形態のプリブートスキャンは、初期ブートプロセスを実行するのに要求される時間を増大させる可能性がある。しかし、プリコンパイル動作およびインライン化動作が、選択的に適用されるため、ブート時間の増加は、許容できる限度内に留まるようにとりはからうことができる。このため、コード実行は、アプリケーションのブート時間を拡大しすぎることなしに、顕著な休止を回避するように改良されることが可能である。
【００２３】
次に図２を参照すると、或る実施形態の例示的な方法２００が、示されている。ステップ２０１で、例えば、ビデオゲームの中間バイナリなどのエミュレートされたコードが、スキャンされる。いずれのタイプのスキャン機構を使用してもよい。例えば、１つのそのようなスキャン方法が、参照により全体が本明細書に組み込まれている、２００５年５月１２日に出願した、「Ｆｕｎｃｔｉｏｎ−Ｌｅｖｅｌ  Ｊｕｓｔ−ｉｎ−Ｔｉｍｅ  Ｔｒａｎｓｌａｔｉｏｎ  Ｅｎｇｉｎｅ  ｗｉｔｈ  Ｍｕｌｔｉｐｌｅ  Ｐａｓｓ  Ｏｐｔｉｍｉｚａｔｉｏｎ」という名称の、本発明の譲受人に譲渡された米国特許出願第１１／１２８６９９号明細書において説明されている。スキャンには、例えば、当業者には当然、知られているとおり、相対命令移動技術などに従って、エミュレートされたコードフローの中で命令ポインタなどを移動させることがかかわることが可能である。スキャンが、エミュレートされたコードの中を進むにつれ、関数の境界が判定されて、エミュレートされたコード内の各関数の複雑度が確定される。本明細書で使用される「複雑度」という用語は、関数をコンパイルし、かつ／または実行するのに要求される処理時間またはリソースの任意の尺度を指す。例えば、複雑度は、関数サイズ（例えば、コードの行の数など）、処理の難度などの点で測られることが可能である。関数ポインタ、または別の形態の絶対アドレス指定を介して参照される関数がかかわる実例に関して、そのような関数へのバイナリ固有のリファレンスが、後段のステップ２１１のプリコンパイルが行われることを可能にするのに使用されることが可能である。
【００２４】
ステップ２０１のスキャンが完了した後、ステップ２０３で、１つまたは複数の複雑な関数が検出されたかどうかについての判定が、行われる。前述したとおり、何が「複雑な」関数であるかは、任意の基準に基づくことが可能である。さらに、所定の閾値が、その閾値を超える関数だけが複雑であると判定されるように、選択されることが可能である。前述したとおり、所定の閾値は、コードの行の数に関することが可能である。このため、或る関数が、閾値を超える行数のコードを含む場合、その関数は、複雑であると判定されることが可能である。閾値は、任意の数の要因に基づいて前もって決定されることが可能である。例えば、後段で説明するステップ２０５のプリコンパイルが、アプリケーションの全体的なブートアップ時間を増大させる可能性がある。開発者などは、そのようなプリコンパイルによって生じるブートアップ時間の増大を或る限度内に留めたいと望む可能性がある。このため、閾値は、例えば、その時間限度内でプリコンパイルされることが可能な数だけの、複雑であると判定される関数をもたらすように選択されてもよい。
【００２５】
ステップ２０３の判定が、いずれの関数も複雑ではないということであった場合、方法２００は、任意選択のステップ２０７に進む。ステップ２０３の判定が、１つまたは複数の関数が複雑であるということであった場合、次いで、ステップ２０５で、それらの複雑な関数が、コンパイルされる。このコンパイルは、本明細書では、「プリコンパイル」と呼ばれる。というのは、そのようなコンパイルは、コードの実行に先立って（いずれのＪＩＴ変換にも先立って）行われるからである。或る実施形態によれば、関数は、ステップ２０５に従ってプリコンパイルされると、さらなる処理なしに実行される準備ができている。
【００２６】
任意選択のステップ２０７において、１つまたは複数の「単純な」関数が検出されたかどうかについての判定が、行われる。複雑な関数の場合と同様に、何が単純な関数であるかは、任意の基準に基づくことが可能である。例えば、単純な関数は、閾値未満の行数のコードを有するサブルーチンとして定義されることが可能である。閾値は、例えば、そのサブルーチンを実行するのに要求される処理時間と比較された、コンテキスト切り替えによって要求される処理時間に基づいて選択されてもよい。また、アプリケーション特有の要因を含め、さらなる要因を考慮することも可能である。
【００２７】
例えば、或る特定のサブルーチンが、閾値より少ない行数のコードを有するが、アプリケーションのコード全体にわたって多数回、出現することが可能である。関数のインライン化は、基本的に、その関数内のコードの行を、対応する関数呼び出しの代わりに、コードの本文にコピーすることを必要とする。このため、実行中、その関数のコードが、そのコードの出所であるサブルーチンへのコンテキスト切り替え、およびそのようなサブルーチンからのコンテキスト切り替えを行う必要なしに、インラインでコンパイルされて、実行されることが可能である。そのようにコピーを行うことは、複製されるデータのため、アプリケーションの全体的なサイズを増大させる可能性がある。その結果、アプリケーション全体にわたって多数回、出現するサブルーチンは、あまりにも多くの複製を必要とし、そのため、それらの関数を組み込むことから得られるべき処理上の利益が、ストレージ要件の増大、多数の関数をインライン化するのに要求される過度の処理時間などによって相殺される可能性がある。その結果、そのような関数は、さもなければ、閾値に従って適格である場合でも、単純であると判定されないことが可能である。
【００２８】
１つまたは複数の関数が、任意選択のステップ２０７において単純であると判定された場合、任意選択のステップ２０９において、それらの関数は、アプリケーションコードの本文にインラインで配置される。前述したとおり、コードをインラインで配置することは、サブルーチンなどからコードをコピーして、本文における対応する関数呼び出しを、そのサブルーチンコードで置き換えることを必然的に伴う。関数をインラインで配置することの効果の図を、後段で説明する図４Ａ〜図４Ｂに示す。ステップ２０７の判定が、任意選択のステップ２０７において単純であると判定された関数が全く存在しないということであった場合、方法２００は、ステップ２１１に直接に進む。
【００２９】
ステップ２１１で、エミュレートされたコードのＪＩＴ変換が、ランタイムエンジンなどによるコードの実行に関連して行われる。前述したとおり、複雑な関数は、ステップ２０５でプリコンパイルされているので、そのような関数は、ステップ２１１において変換される必要がなく、直接に実行されることが可能である。さらに、コンテキスト切り替えは、ステップ２０９でインラインで配置されたいずれの関数に関しても、実行される必要がない。
【００３０】
前述したとおり、関数が複雑であるか、または単純であるか（したがって、関数が、プリコンパイルされるべきか、またはインラインで配置されるべきか）を判定するために使用される閾値および要因は、アプリケーションの所望されるブート時間を含むが、これには限定されない、様々な要因に基づくことが可能である。このため、或る実施形態は、開発者などが、そのようなプリコンパイルおよび／またはインライン化によって生じる実行時間上の利益と、ブート時間の対応する増加との間の許容できるトレードオフを決定することを可能にすることが理解されよう。
【００３１】
図３は、或る実施形態による例示的なコードフローを示す。関数３１０ａ〜ｄは、アプリケーションの仮想コードの本文３００内の関数を表す。実行時間中、関数３１０ａが、ＪＩＴ変換プロセス３２０ａを使用して変換される。コードフローは、関数３１０ａからＪＩＴ変換プロセス３２０ａにつながる矢印Ａによって表され、次いで、ＪＩＴ変換プロセス３２０ａが完了すると、矢印Ｂが、次いで関数３１０ａが実行されることを示す。エミュレートされたバイナリは、次いで、矢印Ｃによって関数３１０ｂに進む。関数３１０ｂも、矢印Ａで表されるとおり、プロセス３２０ｂによるＪＩＴ変換を受け、矢印Ｂで表されるとおり、実行される。しかし、バイナリが、プリコンパイルされた関数３１０ｃに達すると、ＪＩＴ変換は、全く要求されない。というのは、プリコンパイルされた関数３１０ｃは、例えば、図２のステップ２０５に従って、既に変換を受けているので、実行される準備ができている。同じことが、プリコンパイルされた関数３１０ｄにも当てはまる。このため、図３は、或る実施形態に従って行われることが可能な、変形されたＪＩＴ変換プロセスを例示することがわかる。
【００３２】
図４Ａ〜図４Ｂは、図２の任意選択のステップ２０９に関連して前述したとおり、コードのインライン化に関連する例示的なコードフローを示す。図４Ａを参照すると、関数４１０ａ〜ｂが、アプリケーションの本文４００内に配置されている。サブルーチン４２０ａ〜ｂが、矢印Ａで示されるとおり、関数４１０ａ〜ｂから、それぞれ呼び出され、サブルーチン４２０ａ〜ｂの結果が、矢印Ｂで示されるとおり、関数４１０ａ〜ｂに戻される。図４Ａでわかるように、サブルーチン４２０ｂは、「単純」として示され、このことは、サブルーチン４２０ｂが、図２のステップ２０７に関連して前述したとおり、例えば、閾値未満のコード行数を有することを示す。本文４００内の関数４１０ａから関数４１０ｂに至るコードフローが、矢印Ｃで表される。
【００３３】
次に図４Ｂを参照すると、関数４１０ａおよびサブルーチン４２０ａは、図４Ａに関連して前述したとおりである。しかし、関数４１０ｂは、サブルーチン４２０ｂへの呼び出しを含まないことがわかる。代わりに、関数４１０ｂは、コードの本文４００の中に配置されたサブルーチン４２０ｂに進む。このため、矢印ＡおよびＢで示される呼び出しおよびリターンが、サブルーチン４２０ｂに関して回避される。サブルーチン４２０ｂ’は、サブルーチン４２０ｂのコードが、コードの本文４００にコピーされているために使用されない、元のサブルーチン４２０ｂによって占有されるメモリを表す。
【００３４】
本発明を様々な図の実施形態に関連して説明してきたが、本発明を逸脱することなく、本発明と同一の機能を実行するために、他の類似した実施形態が使用されることが可能であり、あるいは説明した実施形態に変更および追加が行われることが可能であることを理解されたい。したがって、本発明は、いずれの単一の実施形態にも限定されるべきではなく、むしろ、添付の特許請求の範囲による広がりおよび範囲で解釈されなければならない。
【図面の簡単な説明】
【００３５】
【図１】本発明の諸態様が実施されることが可能な例示的なコンピューティング環境を示す図である。
【図２】本発明の実施形態による例示的な方法を示す流れ図である。
【図３】本発明の実施形態による例示的なコードフローを示すブロック図である。
【図４Ａ】本発明の実施形態によるコードフローの例示的な変更を示すブロック図である。
【図４Ｂ】本発明の実施形態によるコードフローの例示的な変更を示すブロック図である。
【図１】
2009501368.tif 000003
【図２】
2009501368.tif 000004
【図３】
2009501368.tif 000005
【図４Ａ】
2009501368.tif 000006
【図４Ｂ】
2009501368.tif 000007
【手続補正書】
【提出日】平成20年9月30日(2008.9.30)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
プリブートスキャン中に、複数の関数を有する仮想コードをスキャンするステップと、
前記プリブートスキャン中に、前記複数の関数のうちのある関数が複雑な関数であるか否かを判定するために計算を実行するステップであって、前記計算は、前記関数をプリコンパイルすることの実行時間上の利益を、前記関数をプリコンパイルすることにより引き起こされるブート時間の増加とを比較する、計算を実行するステップと、
前記計算により前記関数が複雑な関数として識別された場合に、前記複雑な関数をプリコンパイルするステップと、
前記仮想コード内の前記複数の関数のうち残りの部分についてジャストインタイム変換を実行するステップとを含む方法。
【請求項２】
前記計算は、関数が複雑な関数であるか否かを識別するために前記関数内のコード行の数を利用するステップを含む請求項１に記載の方法。
【請求項３】
前記複数の関数のうちのある関数が複雑な関数であるか否かを判定する前記計算は、前記関数がプリコンパイルされない場合にブートアップにかかる時間に対する前記関数がプリコンパイルされる場合にブートアップにかかる時間の程度を考慮する請求項１に記載の方法。
【請求項４】
前記仮想コードは本文及び少なくとも１つのサブルーチンを有し、前記方法は、
前記計算により、前記少なくとも１つのサブルーチンが複雑な関数であるか否かを判定するステップと、
前記少なくとも１つのサブルーチンを前記仮想コードの前記本文に配置するステップとをさらに含む請求項１に記載の方法。
【請求項５】
前記少なくとも１つのサブルーチンはコード行を有し、前記本文は前記サブルーチンに対応する関数呼び出しを有し、前記配置するステップは、前記少なくとも１つのサブルーチンから前記コード行をコピーするステップと、前記仮想コードの前記本文中の前記関数呼び出しを前記コード行で置き換えるステップとを含む請求項４に記載の方法。
【請求項６】
ソフトウェアアプリケーションのエミュレートされたバイナリのプリブートスキャンを実行するステップと、
第１の所定の閾値を超える、前記バイナリ内の第１の関数を識別するステップと、
実行のためにコンテキスト切り替えを要求し、第２の所定の閾値を下回る、前記バイナリ内の第２の関数を識別するステップと、
前記第１の関数をプリコンパイルするステップと、
前記第２の関数を、前記エミュレートされたバイナリの本文にインラインで配置するステップと、
前記エミュレートされたバイナリのジャストインタイム変換を実行するステップとを含む方法。
【請求項７】
前記ジャストインタイム変換は、所定のプロセッサにより実行されるように構成された第２のバイナリを生成する請求項６に記載の方法。
【請求項８】
前記変換されたバイナリを実行するステップをさらに含む請求項７に記載の方法。
【請求項９】
前記ジャストインタイム変換は、前記ソフトウェアアプリケーションの実行時に実行される請求項６に記載の方法。
【請求項１０】
前記ソフトウェアアプリケーションはゲームソフトウェアである請求項６に記載の方法。
【請求項１１】
前記第１及び第２の関数は、グラフィックスレンダリングに関連する請求項６に記載の方法。
【請求項１２】
プリブートスキャン中に、複数の関数を有する仮想コードをスキャンするステップと、
前記プリブートスキャン中に、前記複数の関数のうちのある関数が複雑な関数であるか否かを判定するために計算を実行するステップであって、前記計算は、前記関数をプリコンパイルすることの実行時間上の利益を、前記関数をプリコンパイルすることにより引き起こされるブート時間の増加とを比較する、計算を実行するステップと、
前記計算により前記関数が複雑な関数として識別された場合に、前記複雑な関数をプリコンパイルするステップと、
前記仮想コード内の前記複数の関数のうち残りの部分についてジャストインタイム変換を実行するステップとを含む方法を実行するためのコンピュータ実行可能命令を有するコンピュータ可読媒体。
【請求項１３】
前記仮想コードは本文及び少なくとも１つのサブルーチンを有し、前記方法は、
前記計算により、前記少なくとも１つのサブルーチンが複雑な関数であるか否かを判定するステップと、
前記少なくとも１つのサブルーチンを前記仮想コードの前記本文に配置するステップとをさらに含む請求項１２に記載のコンピュータ可読媒体。
【請求項１４】
前記少なくとも１つのサブルーチンはコード行を有し、前記本文は前記サブルーチンに対応する関数呼び出しを有し、前記配置するステップは、前記少なくとも１つのサブルーチンから前記コード行をコピーするステップと、前記仮想コードの前記本文中の前記関数呼び出しを前記コード行で置き換えるステップとを含む請求項１３に記載のコンピュータ可読媒体。
【国際調査報告】
2009501368.tif 000008