(57)【要約】  混合モード命令の動的な最適コンパイルの方法及び装置が提供される。  一実施形態では、提供された方法は、非ネイティブソフトウェア命令をデバイスで受け取る段階と、デバイスで行われる、非ネイティブソフトウェア命令に基づいて第１命令セットから第１ネイティブソフトウェア命令を生成する段階と、第１ネイティブソフトウェア命令をデバイスで実行する段階と、デバイスで行われる、非ネイティブソフトウェア命令に基づいて第２命令セットから第２ネイティブソフトウェア命令を生成する段階と、第２ネイティブソフトウェア命令をデバイスで実行する段階とを備える。
2007505399.tif 000002
【特許請求の範囲】
【請求項１】
非ネイティブソフトウェア命令を実行する方法であって、
前記非ネイティブソフトウェア命令をデバイスで受け取る段階と、
前記非ネイティブソフトウェア命令に基づいて第１命令セットから第１ネイティブソフトウェア命令を生成する段階であって、前記デバイスで行われる段階と、
前記第１ネイティブソフトウェア命令を前記デバイスで実行する段階と、
前記非ネイティブソフトウェア命令に基づいて第２命令セットから第２ネイティブソフトウェア命令を生成する段階であって、前記デバイスで行われる段階と、
前記第２ネイティブソフトウェア命令を前記デバイスで実行する段階と
を備える方法。
【請求項２】
前記第１ネイティブソフトウェア命令が実行された回数をカウントする段階と、
前記第１ネイティブソフトウェア命令が実行された前記回数を閾値と比較する段階と
をさらに備え、
前記第２ネイティブソフトウェア命令を生成する段階は、（ｉ）前記閾値と等しい前記回数、及び（ｉｉ）前記閾値を超える前記回数の１つに応答する
請求項１に記載の方法。
【請求項３】
前記第１ネイティブソフトウェア命令が実行された前記回数をカウントする手段を挿入する段階
をさらに備える請求項２に記載の方法。
【請求項４】
動的ランタイム設定パラメータを通じて前記閾値を受け取る段階
をさらに備える請求項２に記載の方法。
【請求項５】
前記非ネイティブソフトウェア命令を前記デバイスで受け取る段階は、
中間言語命令を前記デバイスで受け取る段階
を有する請求項１に記載の方法。
【請求項６】
前記非ネイティブソフトウェア命令を前記デバイスで受け取る段階は、
Ｊａｖａバイトコードを前記デバイスで受け取る段階
を有する請求項１に記載の方法。
【請求項７】
前記非ネイティブソフトウェア命令を前記デバイスで受け取る段階は、
前記非ネイティブソフトウェア命令を、ハンドヘルドコンピューティングデバイスで無線により受け取る段階
を有する請求項１に記載の方法。
【請求項８】
前記第１ネイティブソフトウェア命令はＸビット幅の命令を有し、前記第２ネイティブソフトウェア命令はＹビット幅の命令を有し、ＸはＹより小さい
請求項１に記載の方法。
【請求項９】
前記第１ネイティブソフトウェア命令は１６ビット幅の命令を有し、前記第２ネイティブソフトウェア命令は３２ビット幅の命令を有する
請求項１に記載の方法。
【請求項１０】
前記第１ネイティブソフトウェア命令はサム命令を有し、前記第２ネイティブソフトウェア命令はＡＲＭ命令を有する
請求項１に記載の方法。
【請求項１１】
前記第１ネイティブソフトウェア命令を生成する段階は、
前記非ネイティブソフトウェア命令をジャストインタイムコンパイラを用いて前記デバイスでコンパイルする段階
を有する請求項１に記載の方法。
【請求項１２】
前記第１ネイティブソフトウェア命令の生成の前に第１コード最適化オプションを設定する段階であって、前記第１コード最適化オプションはより小さいコードを生成させる段階と、
前記第２ネイティブソフトウェア命令の生成の前に第２コード最適化オプションを設定する段階であって、前記第２コード最適化オプションはより高速なコードを生成させる段階と
をさらに備える請求項１に記載の方法。
【請求項１３】
第１ネイティブソフトウェア命令を生成する段階は、第１の複数のネイティブソフトウェア命令を生成する段階を有し、
第２のネイティブソフトウェア命令を生成する段階は、第２の複数のネイティブソフトウェア命令を生成する段階を有し、
前記方法は、
前記第１の複数のネイティブソフトウェア命令に含まれる第１の命令数をカウントする段階と、
前記第２の複数のネイティブソフトウェア命令に含まれる第２の命令数をカウントする段階と、
前記第１の命令数と前記第２の命令数とを比較する段階と
をさらに備え、
前記第１ネイティブソフトウェア命令を実行する段階は、（ｉ）前記第１の命令数と等しい前記第２の命令数、及び（ｉｉ）前記第１の命令数を超える前記第２の命令数の１つに応答する
請求項１に記載の方法。
【請求項１４】
前記第１の命令数及び前記第２の命令数を比較する段階
をさらに備え、
前記第２ネイティブソフトウェア命令を実行する段階は、予め定められた閾値より大きく前記第２の命令数を超えない前記第１の命令数に応答する
請求項１３に記載の方法。
【請求項１５】
前記第１ネイティブソフトウェア命令を測定して第１バイト数を得る段階と、
前記第２ネイティブソフトウェア命令を測定して第２バイト数を得る段階と、
前記第１バイト数と前記第２バイト数とを比較する段階と
をさらに備え、
前記第１ネイティブソフトウェア命令を実行する段階は、前記第２バイト数より少なくとも予め定められた閾値だけ小さい前記第１バイト数に応答する
請求項１に記載の方法。
【請求項１６】
前記第１ネイティブソフトウェア命令を測定して第１バイト数を得る段階と、
前記第２ネイティブソフトウェア命令を測定して第２バイト数を得る段階と、
前記第１バイト数と前記第２バイト数とを比較する段階であって、前記第２ネイティブソフトウェア命令を実行する段階は、前記第２バイト数より少なくとも予め定められた閾値だけ小さくない前記第１バイト数に応答する段階と
をさらに備える請求項１に記載の方法。
【請求項１７】
複数の機械アクセス可能命令を含む機械アクセス可能メディアを備える製品であって、前記複数の機械アクセス可能命令は、実行された場合に、デバイスに、
非ネイティブソフトウェア命令を前記デバイスで受け取らせ、
前記非ネイティブソフトウェア命令に基づいて第１命令セットから第１ネイティブソフトウェア命令を生成させ、前記第１ネイティブソフトウェア命令の前記生成は前記デバイスで行われ、
前記第１ネイティブソフトウェア命令を前記デバイスで実行させ、
前記非ネイティブソフトウェア命令に基づいて第２命令セットから第２ネイティブソフトウェア命令を生成させ、前記第２ネイティブソフトウェア命令の前記生成は前記デバイスで行われ、
前記第２ネイティブソフトウェア命令を前記デバイスで実行させる
製品。
【請求項１８】
前記複数の機械アクセス可能命令は、前記デバイスに、
前記第１ネイティブソフトウェア命令が実行された回数をカウントさせ、
前記第１ネイティブソフトウェア命令が実行された前記回数を閾値と比較させ、前記第２ネイティブソフトウェア命令の生成は、（ｉ）前記閾値と等しい前記回数、及び（ｉｉ）前記閾値を超える前記回数の１つに応答させる
請求項１７に記載の機械アクセス可能メディア。
【請求項１９】
前記複数の機械アクセス可能命令は、前記デバイスに、
前記第１ネイティブソフトウェア命令が実行された前記回数をカウントする手段を挿入させる
請求項１８に記載の機械アクセス可能メディア。
【請求項２０】
前記非ネイティブソフトウェア命令は中間言語命令を有する
請求項１７に記載の機械アクセス可能メディア。
【請求項２１】
前記第１ネイティブソフトウェア命令はＸビット幅の命令を有し、前記第２ネイティブソフトウェア命令はＹビット幅の命令を有し、ＸはＹより小さい
請求項１７に記載の機械アクセス可能メディア。
【請求項２２】
前記第１ネイティブソフトウェア命令はサム命令を有し、前記第２ネイティブソフトウェア命令はＡＲＭ命令を有する
請求項１７に記載の機械アクセス可能メディア。
【請求項２３】
前記複数の機械アクセス可能命令は、少なくともジャストインタイムコンパイラの一部を含む
請求項１７に記載の機械アクセス可能メディア。
【請求項２４】
前記第１ネイティブソフトウェア命令は第１の複数のネイティブソフトウェア命令を含み、前記第２ネイティブソフトウェア命令は第２の複数のネイティブソフトウェア命令を含み、前記複数の機械アクセス可能命令は、前記デバイスに、
前記第１の複数のネイティブソフトウェア命令に含まれる第１の命令数をカウントさせ、
前記第２の複数のネイティブソフトウェア命令に含まれる第２の命令数をカウントさせ、
前記第１の命令数と前記第２の命令数とを比較させ、前記第１ネイティブソフトウェア命令の実行は、（ｉ）前記第１の命令数と等しい前記第２の命令数、及び（ｉｉ）前記第１の命令数を超える前記第２の命令数の１つに応答させる
請求項１７に記載の機械アクセス可能メディア。
【請求項２５】
前記複数の機械アクセス可能命令は、前記デバイスに、
前記第１の命令数と第２の命令数とを比較させ、前記第２ネイティブソフトウェア命令の実行は、予め定められた閾値より大きく前記第２の命令数を超える前記第１の命令数に応答させる
請求項２４に記載の機械アクセス可能メディア。
【請求項２６】
前記複数の機械アクセス可能命令は、前記デバイスに、
前記第１ネイティブソフトウェア命令を測定させて第１バイト数を得させ、
前記第２ネイティブソフトウェア命令を測定させて第２バイト数を得させ、
前記第１バイト数と前記第２バイト数とを比較させ、前記第１ネイティブソフトウェア命令の実行は、前記第２バイト数より少なくとも予め定められた閾値だけ小さい前記第１バイト数に応答させる
請求項１７に記載の機械アクセス可能メディア。
【請求項２７】
前記複数の機械アクセス可能命令は、前記デバイスに、
前記第１ネイティブソフトウェア命令を測定させて第１バイト数を得させ、
前記第２ネイティブソフトウェア命令を測定させて第２バイト数を得させ、
前記第１バイト数と前記第２バイト数とを比較させ、前記第２ネイティブソフトウェア命令の実行は、前記第２バイト数より少なくとも予め定められた閾値だけ小さくない前記第１バイト数に応答させる
請求項１７に記載の装置アクセス可能メディア。
【請求項２８】
混合モードコードを実行するよう構成された装置であって、
前記装置は、
記憶装置と、
前記記憶装置に機能的に結合され、前記記憶装置に記憶されたランタイム環境を実行するよう構成された混合モードプロセッサと
を備え、
前記ランタイム環境は、
コンパイルされたバイナリと、
前記コンパイルされたバイナリに基づいて、前記混合モードプロセッサの第１命令セットに関するソフトウェアの第１の命令を生成する第１コードジェネレータと、
前記コンパイルされたバイナリに基づいて、前記混合モードプロセッサの第２命令セットに関するソフトウェアの第２の命令を生成する第２コードジェネレータであって、前記第１命令セットは前記第２命令セットと異なる、第２コードジェネレータと、
前記第１の命令及び前記第２の命令を含むコードを実行する手段
を有する装置。
【請求項２９】
前記第１命令セットはＸビット幅の命令セットを有し、前記第２命令セットはＹビット幅の命令セットを有し、ＸはＹより小さい
請求項２８に記載の装置。
【請求項３０】
前記第１命令セットは１６ビット幅の命令セットを有し、前記第２命令セットは３２ビット幅の命令セットを有する
請求項２８に記載の装置。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明の開示は、混合モードコンピュータ命令に関連し、より実際的には、混合モードコンピュータ命令の動的な最適コンパイルのための方法及び装置に関連する。
【背景技術】
【０００２】
エンデッドシステム（例えば、無線通信端末、無線データデバイス等）は、要求が増大しつづける状態にある。エンベデッドシステムで利用可能なリソースのタイプは、静的及び動的メモリ、処理能力、ディスプレイサイズ、バッテリ寿命、入出力能力等の観点で著しく異なる。したがって、エンベデッドシステムにおけるハードウェア及びソフトウェアの収斂(convergence)は非常に小さい。
【０００３】
当業者に知られているように、ネイティブなコンパイル型言語（例えば、Ｃプログラミング言語）よりも、Ｊａｖａ（登録商標）、Ｃ＃等のような中間言語（ＩＬ）を用いてエンベデッドシステムを開発することには多くの利点がある。第１に、中間言語モジュールを複数のプラットフォームに移植することは、ほとんどのコンパイル型言語と異なり、ソースコードを変更することなく可能である。第２に、複数の中間言語及びそれらのランタイム環境は多くの場合、多くのコンパイル型言語が有していない、配列境界チェックのようなバグ排除機能、自動的なガーベッジコレクション、及び例外処理を有している。第３に、中間言語は、典型的には、完全なインタプリタ型言語より高速に動作する。
【０００４】
前述の中間言語の利点を理解するとともに、エンベデッドシステムはランタイム環境で動作する中間言語に徐々に移行している。アプリケーションソフトウェアがランタイム環境からより大きな価値を得ていることから、多くの将来のアプリケーションは中間言語を用いて記述されるであろうことが期待される。
【０００５】
エンベデッドシステムで中間言語を使用することの最大の抑制要因の１つは、その実行速度である。中間言語は典型的には、インタプリタ型言語より高速に動作するが、中間言語は通常、ネイティブなコンパイル型言語より低速である。例えば、Ｊａｖａ（登録商標）のような中間言語は、Ｃのようなネイティブなコンパイル型言語より最大３倍から４倍低速かもしれない。
【０００６】
中間言語命令をスピードアップする１つの技術は、中間言語命令のいくつかからネイティブ命令を生成することを含む。典型的には、最も頻繁に使用される複数のコードパスだけがネイティブコードにコンパイルされ、その他のコードは中間言語命令として残される。この従来技術はパフォーマンスを向上させる場合がある、中間言語命令のいくつかからのネイティブ命令の生成は、１つのプロセッサの１つの命令セットだけを用いる。
【０００７】
ＡＲＭ準拠プロセッサのような混合モードプロセッサは、例えば１６ビット命令セット（サム命令セット）及び３２ビット命令セット（ＡＲＭ命令セット）のような、２以上の命令セットを有する。これらの複数の命令セットのそれぞれは、その複数の命令セットがどのように使用されるかによって、利点及び欠点を持つ。例えば、１６ビットサム命令セットは、典型的には、３２ビットＡＲＭ命令の機能を半分のビット数にエンコードするので、それによってより高いコード密度もたらす。しかしながら、ＡＲＭ命令は典型的には、サム命令が有するものよりも、より意味論的な中身を持つ。当業者に知られているように、このことは、サム命令で実装された動作が、ＡＲＭ命令で実装された動作と等価な動作を実行するためには、より多くの命令（例えば、４０％のさらなる命令）を必要とする場合があるということを意味する。例えば、１６ビットの即時データロケーションを使用するには、データをレジスタに移動するために、サム命令セットはＡＲＭ命令セットが必要とする命令より２つの更なる命令を必要とするだろう。
【０００８】
システムのメモリ構成に依存して、ＡＲＭコードはサムコードより著しく高速に動作し、又はその逆に動作する場合がある。例えば、３２ビットメモリでは、ＡＲＭコードは対応するサムコードより４０％高速に動作すると評価されている。しかしながら、１６ビットメモリでは、サムコードは対応するＡＲＭコードより４５％高速に動作するだろう。したがって、そのようなエンベデッドシステムの個々の構成に基づく速度及び記憶特性の大きな差により、中間言語を排他的に１つの命令セット（例えば、ＡＲＭ命令セット）にコンパイルすることには重大な欠点が存在する。加えて、全ての中間言語命令をネイティブ命令にコンパイルしないことには、重大な欠点が存在する。
【図面の簡単な説明】
【０００９】
【図１】開示されたシステムのための一利用環境を示すコンピュータシステムの一例のブロック図である。
【００１０】
【図２】図１のコンピューティングシステムによって実行される、混合モード命令システムの動的な最適コンパイルの方法の一例を示すブロック図である。
【００１１】
【図３】図１のコンピューティングシステムによって実行される、混合モード命令を動的にコンパイルするための処理の一例を示すフローチャートである。
【００１２】
【図４】図１のコンピューティングシステムによって実行される、混合モード命令の発見的最適化のための処理の一例を示すフローチャートである。
【００１３】
【図５】図１のコンピューティングシステムによって実行される、１６ビット命令及び３２ビット命令の使用のどちらにするかを決定する処理の一例を示すフローチャートである。
【発明の開示】
【００１４】
全般的には、ここに記載される方法及び装置は、混合モード命令を動的にコンパイル（すなわち、混合モード命令の動的な最適コンパイル）する。以下の記載は特にハードウェアで実行されるソフトウェアを含むシステム例を開示するが、そのような複数のシステムは単に実例であって、限定するとみなされるべきではないことに注意すべきである。
例えば、開示されたハードウェア及びソフトウェアコンポーネントのいくつか又は全ては、専用のハードウェアだけ、ソフトウェアだけ、ファームウェアだけ、或いはハードウェア、ファームウェア及び／又はソフトウェアのいくつかの組み合わせに組み入れられることができると考えられる。
【００１５】
さらに、以下の開示は、動的コンパイルシステムの例に関連してなされるが、その開示されたシステムに多くの他の動的コンパイルシステムを容易に適用可能であることが理解されるべきである。したがって、以下にシステム例及び処理例が記載されているが、当業者は、その開示された例はそのようなシステムを実装するただ１つの方法ではないということを容易に理解するだろう。例えば、１６ビット命令セット及び３２ビット命令セット以外の命令セットが使用され得るだろう。
【００１６】
図１は、コンピュータシステム１００の一例のブロック図を示す。コンピュータシステム１００は、パーソナルコンピュータ（ＰＣ）、携帯情報端末（ＰＤＡ）、インターネット機器、移動電話、又は他の任意のコンピューティングデバイスであってよい。一例では、コンピュータシステム１００は、電源１０３によって給電される主プロセッシングユニット１０２を備える。主プロセッシングユニット１０２は、システム相互接続１０６によって主メモリデバイス１０８及び１以上のインタフェース回路１１０に電気的に結合された混合モードプロセッサユニット１０４を含んでよい。一例では、システム相互接続１０６は、アドレス／データバスである。無論、当業者は、混合モードプロセッサユニット１０４を主メモリデバイス１０８に結合するためにバス以外の相互接続が使用され得ることを容易に理解するだろう。一例では、１以上の専用線及び／又はクロスバが、混合モードプロセッサユニット１０４を主メモリデバイス１０８に結合するために使用されてよい。
【００１７】
混合モードプロセッサユニット１０４は、Ｉｎｔｅｌ（登録商標）Ｘｓｃａｌｅ（登録商標）ファミリプロセッサ及びＩｎｔｅｌ（登録商標）のＩｎｔｅｒｎｅｔ  Ｅｘｃｈａｎｇｅ  Ｐｒｏｃｅｓｓｏｒ（ＩＸＰ）ファミリプロセッサからのプロセッサのような、よく知られた任意のタイプの混合モードプロセッサを含む。他にも、混合モードプロセッサ１０４は、２個以上の、シングル命令セットプロセッサによって実装されてよい。例えば、Ｉｎｔｅｌ（登録商標）Ｐｅｎｔｉｕｍ（登録商標）プロセッサ及びＩｎｔｅｌ（登録商標）Ｉｔａｎｉｕｍ（登録商標）プロセッサの混成システムが使用されてよい。さらに、混合モードプロセッサ１０４は、スタティックＲＡＭ（ＳＲＡＭ）のような、よく知られた任意のタイプのキャッシュメモリを有してよい。主メモリデバイス１０８は、ダイナミックＲＡＭ（ＤＲＡＭ）及び／又は任意の他の形式のランダムアクセスメモリを有してよい。例えば、主メモリデバイス１０８は、ＤＤＲ型ＤＲＡＭ（ＤＤＲＡＭ）を有してよい。主メモリデバイス１０８は、不揮発性メモリを有してもよい。一例では、主メモリデバイス１０８は、よく知られた方法で混合モードプロセッサ１０４によって実行されるソフトウェアプログラムを記憶する。主メモリデバイス１０８は、混合モードプロセッサ１０４による実行のためのコンパイラプログラム１１１を記憶してよい。
【００１８】
インタフェース回路１１０は、イーサネットインタフェース及び／又はユニバーサルシリアルバス（ＵＳＢ）インタフェースのような、よく知られた任意のタイプのインタフェース基準を用いて実装される。１以上の入力デバイス１１２は、データ及びコマンドを主プロセッシングユニット１０２に入力すべくインタフェース回路１１０に結合されてよい。例えば、入力デバイス１１２は、キーボード、マウス、タッチスクリーン、トラックパッド、トラックボール、アイソポイント（ｉｓｏｐｏｉｎｔ）、及び／又は音声認識システムであってよい。
【００１９】
１以上のディスプレイ、プリンタ、スピーカ、及び／又は他の出力デバイス１１４が、１以上のインタフェース回路１１０を介して主プロセッシングユニット１０２に結合されてよい。ディスプレイ１１４は、陰極線管（ＣＲＴ）、液晶表示装置（ＬＣＤ）、又は任意の他のタイプのディスプレイであってよい。ディプレイ１１４は、主プロセッシングユニット１０２の動作中に生成されたデータの視覚的な指示を生成する。その視覚的な指示は、人間のオペレータ入力用のプロンプト、計算された値、検出されたデータ等を含む。
【００２０】
コンピュータシステム１００は、１以上の記憶デバイス１１６を備える。例えば、コンピュータシステム１００は、１以上のハードドライブ、コンパクトディスク（ＣＤ）ドライブ、デジタル多目的ディスクドライブ（ＤＶＤ）、及び／又は他のコンピュータメディア入出力（Ｉ／Ｏ）デバイスを備える。
【００２１】
コンピュータシステム１００は、ネットワーク１１８への接続を介して、他のデバイスとデータを交換してもよい。ネットワーク１１８への接続は、イーサネット接続、デジタル加入者線、電話線、同軸ケーブル等のような、任意のタイプのネットワーク接続であってよい。ネットワーク１１８は、インターネット、電話ネットワーク、ケーブルネットワーク、及び／又は無線ネットワークのような、任意のタイプのネットワークであってよい。
【００２２】
図２のブロック図は、全般的には、混合モード命令システム２００の動的な最適コンパイルの方法の一例を示す。混合モード命令システム２００は、複数のアプリケーション２０２、言語コンパイラ２０４、コンパイルされたバイナリ２０６、及びランタイム環境２０８を備える。
【００２３】
複数のアプリケーション２０２は、Ｊａｖａ（登録商標）ソースファイル、Ｃ＃ソースファイル等を含む。さらに、複数のアプリケーション２０２は、Ｐｅｒｌ、Ｐｙｔｈｏｎ，Ｊｙｔｈｏｎ等のような、一般的には仮想マシンコンパイル型言語に関連しないプログラミング言語によるソースファイルを含む。
【００２４】
複数のアプリケーション２０２は、言語コンパイラ２０４によってコンパイルされる。
言語コンパイラ２０４の例は、Ｊａｖａ（登録商標）コンパイラ、Ｃ＃コンパイラ、Ｊ＃コンパイラ、Ｖｉｓｕａｌ  Ｂａｓｉｃ  ．ＮＥＴコンパイラ、Ｖｉｓｕａｌ  Ｃ＋＋  ．ＮＥＴコンパイラ等であってよい。言語コンパイラ２０４は、高レベル記号型言語で記述されたコンピュータプログラム（例えば、複数のアプリケーション２０２）を、中間言語命令（すなわち、非ネイティブ命令）に変換する。
【００２５】
言語コンパイラ２０４の出力（すなわち、非ネイティブ命令）は、コンパイルされたバイナリ２０６に記憶される。コンパイルされたバイナリ２０６は、例えば、Ｊａｖａ（登録商標）バイトコード、．ＮＥＴ  ＭＳＩＬ、Ｐｅｒｌバイトコード等であってよい。コンパイルされたバイナリ２０６は、ランタイム環境がロードし、ネイティブ命令にコンパイルし、そしてそれから実行することができる形式の、複数の非ネイティブ命令を有する。
【００２６】
例えば、コンパイルされたバイナリ２０６がＪａｖａ（登録商標）バイトコードである場合、そのコンパイルされたバイナリ２０６は一連の複数のＪａｖａ（登録商標）命令を有する。一連の複数のＪａｖａ（登録商標）命令の個々のＪａｖａ（登録商標）命令のそれぞれは、ゼロの又はさらなるオペランドが続く１バイトのオペコードである。その１バイトのオペコードは、ランタイム環境２０８（すなわち、Ｊａｖａ（登録商標）仮想マシン）が使用する１つのオペレーションである。そのオペランドは、そのオペコードのオペレーションによって使用される値である。例えば、Ｊａｖａ（登録商標）バイトコードは、以下の１６進形式の一連のバイト"８４  ０１  ０２"を含む。ランタイム環境２０８は、"８４"が、ローカル変数をインクリメントするオペレーションである"ｉｉｎｃ"を意味すると解釈してよい。この場合、オペランド"０１"は、いずれのローカル変数が整数値によってインクリメントされるべきかを示し、この場合、オペランド"０２"は、十進値の２を示す。
【００２７】
ランタイム環境２０８は、Ｊａｖａ（登録商標）仮想マシン、．ＮＥＴ共通言語ランタイム（ＣＬＲ）、Ｐｅｒｌ仮想マシン（例えば、Ｐａｒｒｏｔ）等であってよい。ランタイム環境２０８は、ＪＩＴコンパイラ２１０及び実行コード２１２を有する。コンパイルされたバイナリ２０６は、図１の主メモリデバイス１０８の中に記憶され得る、ＪＩＴメモリロケーション２１４中にコンパイルされたバイナリ２０６のコピーを形成すべく、ＪＩＴコンパイラ２１０にロードされてよい。ＪＩＴメモリロケーション２１４の中のコンパイルされたバイナリ２０６のコピーが主メモリ１０８に一旦ロードされると、ＪＩＴコンパイラ２１０は、そこに記憶された非ネイティブ命令に従って動作してよい。例えば、サムコードジェネレータ２１６が非ネイティブ命令をネイティブなサム命令に生成することによって、或いは、ＡＲＭコードジェネレータ２１８が非ネイティブ命令をネイティブなＡＲＭ命令に生成することによって、非ネイティブ命令はＪＩＴコンパイラ２１０によって実行され得る。サムコードジェネレータ２１６及びＡＲＭコードジェネレータ２１８は、１６ビット命令セットコード及び３２ビット命令セットコードをそれぞれ生成する、ＪＩＴコンパイラ２１０のコンポーネントであってよい。
【００２８】
当業者に知られているように、そのような非ネイティブ命令をネイティブ命令に変換する方法が存在する。例えば、インシグニアソリューションズ社は、Ｊｅｏｄｅプラットフォームとして知られるＪａｖａ（登録商標）ベースのランタイム環境を提供している。そのＪｅｏｄｅプラットフォームは、まれにしか使用されないコードパスに対してインタプリタを使用し、頻繁に実行されるコードパスに対してＪＩＴコンパイラを使用する。ＪｅｏｄｅプラットフォームのＪＩＴコンパイラは、非ネイティブ命令を１以上のＡＲＭ命令に変換する能力を持つ。ＪｅｏｄｅプラットフォームのＪＩＴコンパイラは、しかしながら、混合モード命令の生成を利用しておらず、代わりに１つの命令セットを単に使用する。ＡＲＭコードジェネレータは、これらのよく知られた複数の方法の１つを実装してよい。他にも、又はさらに、ＡＲＭ命令は、非ネイティブ命令からではなく、サム命令から変換されてよい。例えば、ＡＲＭ開発スイート（ＡＤＳ）は、ソースファイルからＡＲＭ命令又はサム命令のいずれかに変換することができるコンパイラ及びアセンブラを有する。サムコードジェネレータ２１６は、同様の方法で非ネイティブ命令をネイティブ命令に変換してよい。
【００２９】
さらに、ＪＩＴコンパイラ２１０は、非ネイティブ及びネイティブ命令の生成及び実行に関係するオペレーションデータを記憶するコードプロファイラ２２０を含む。さらに又はそれに代えて、コードプロファイラ２２０は、ＪＩＴコンパイラ２１０の外部に設けられてよい。混合モード生成がいかにして及びいつ実現されるかというさらなる詳細は、図３を用いて説明される。
【００３０】
図３のプロセス３００の例は全般的に、図１の主プロセッシングユニット１０２にある複数の命令を動的にコンパイルする。とはいえ、その複数の命令は、図１のインターネット、ＰＯＴＳ、及び／又は他の（複数の）ネットワーク１１８、或いは、図１の（複数の）ハードドライブ、（複数の）ＣＤ、（複数の）ＤＶＤ、及び／又は他の複数の記憶デバイス１１６に由来してもよい。より具体的には、プロセス３００の例は、図２のＪＩＴコンパイラ２１０の中で動作してよい。好ましくは、プロセス３００は、１以上のメモリに記憶されて１以上のプロセッサによってよく知られた方法で実行される、１以上のソフトウェアプログラムに組み込まれてよい。しかしながら、プロセス３００のブロックのいくつか又は全ては、手動で実行されてよい。プロセス３００は、図３に示されたフローチャートに関連して説明されるが、当業者は、プロセス３００を実行する多くの他の方法を用いることができることを容易に理解するだろう。例えば、ブロックの多くの順番が変更されたり、１以上のブロックの動作が変更されたり、複数のブロックが結合されたり、及び／又は複数のブロックが排除されたりしてよい。
【００３１】
プロセス３００の例は、メソッドが以前に呼び出されたか否かを判断することによって開始する（ブロック３０２）。一実装例は、そのメソッドのサム命令が既に存在するかをチェックしてよい。そのメソッドのサム命令が既に存在する場合、そのメソッドが以前に呼び出されたと判断される。
【００３２】
そのメソッドが以前に呼び出されていない場合（ブロック３０２）、図２の１６ビットサムコードジェネレータ２１６は、他の方法でサムコードジェネレータ２１６によって生成されたものより小さいサムコードを生成すべく、必要に応じて設定されてよい（ブロック３０４）。より小さいコードの１つの利点は、図１のコンピュータシステム１００のメモリサイズを低減する可能性であり、それは場合によってはより少なくより限られたリソースを持つ安価な製品をもたらす。ここで、１６ビットサムコードジェネレータ２１６のコンフィギュレーションは、イネーブルレベル及びディセーブルレベルの２つのレベルだけを持つとして説明されているが、当業者は、様々なレベルのコンフィギュレーションを定義可能であることを理解している。
【００３３】
１６ビットサムコードジェネレータ２１６を必要に応じて設定した（ブロック３０４）後、サム命令が生成され（ブロック３０６）、プロセス３００の例は終了する（ブロック３０８）。サム命令は、図２のサムコードジェネレータ２１６によって生成される。サムコードジェネレータ２１６は、非ネイティブ命令をネイティブ命令に変換することによってサム命令を生成する。サムコードの明らかな特性により、最初の呼び出しでサム命令を生成することが堅実である。例えば、サムコードは、典型的にはＡＲＭコードが要するメモリスペースより小さなメモリスペースしか要しないが、ＡＲＭコードはサムコードより高速であるかもしれない。したがって、最も頻繁に呼び出される命令をＡＲＭ命令へと生成し、あまり頻繁に実行されない命令は、より優れたメモリスペース特性を持つサム命令へと生成することが望ましい。プロセス３００中のこの時点では、命令の呼び出し頻度はまだ分かっておらず、それゆえ命令はサム命令へと変換される。
【００３４】
逆に、そのメソッドが以前に呼び出されていた場合（ブロック３０２）、現在実行されたメソッドに関する呼び出しカウンタがインクリメントされる（ブロック３１０）。呼び出しカウンタは、上述のメソッドが呼び出された回数を表す、図２のコードプロファイラ２２０に記憶された変数であってよい。一実装例は、生成されたネイティブなサム又はＡＲＭメソッド内に、呼び出しカウント命令を挿入してよい。この呼び出しカウント命令は、グローバル変数としての呼び出しカウンタをインクリメントしてよい。その呼び出しカウンタは、図２のコードプロファイラ２２０内にあってよい。代わりに、呼び出しカウント命令は、図２のコードプロファイラ２２０内でローカルスコープを持つ変数としての呼び出しカウンタをインクリメントするメソッドを呼び出してよい。その変数は、上述のメソッドが呼び出された回数を表す。その変数がゼロである場合、プロセス３００は、そのメソッドが以前に呼び出されていない旨を判断し、そうでなければこのプロセス３００は、そのメソッドが以前に呼び出された旨を判断する。
【００３５】
現在実行されたメソッドに関する呼び出しカウンタがインクリメントされた（ブロック３１０）後、プロセス３００の例は、その呼び出しカウンタが予め定められたリミットより大きいか否かを判断する（ブロック３１２）。その呼び出しカウンタが予め定められたリミットより大きくない場合（ブロック３１２）、そのサムコードは既に存在し、したがって再び生成される必要はない。その結果、プロセス３００の例は終了する（ブロック３０８）。
【００３６】
逆に、その呼び出しカウンタが予め定められたリミットより大きい場合（ブロック３１２）、発見的最適化プロセスが呼び出される（ブロック３１４）。発見的最適化プロセスは、図４に関連してより詳細に説明される。発見的最適化プロセスが制御をリターンした後、プロセス３００の例は終了する（ブロック３０８）。
【００３７】
図４は、発見的最適化プロセス４００の一例を示す。好ましくは、プロセス４００は、１以上のメモリに記憶されて１以上のプロセッサによってよく知られた方法で実行される、１以上のソフトウェアプログラムに組み込まれてよい。しかしながら、プロセス４００のブロックのいくつか又は全ては、手動で実行されてよい。プロセス４００は、図４に示されたフローチャートに関連して説明されるが、当業者は、プロセス４００を実行する多くの他の方法を用いることができることを容易に理解するだろう。例えば、ブロックの多くの順番が変更されたり、１以上のブロックの動作が変更されたり、複数のブロックが結合されたり、及び／又は複数のブロックが排除されたりしてよい。
【００３８】
プロセス４００の例は、全般的に、図１の主プロセッシングユニット１０２にある複数の混合モード命令を最適化する。とはいえ、その複数の命令は、図１のインターネット、ＰＯＴＳ、及び／又は他の（複数の）ネットワーク１１８、或いは、図１の（複数の）ハードドライブ、（複数の）ＣＤ、（複数の）ＤＶＤ、及び／又は他の複数の記憶デバイス１１６に由来してもよい。より具体的には、そのプロセス４００の例は、図２のＪＩＴコンパイラ２１０の中で動作してよい。
【００３９】
図２の複数のアプリケーション２０２の１以上のアプリケーションのような、多くのソフトウェアアプリケーションは、アプリケーション時間の大部分を、図２のコンパイルされたバイナリ２０６からの少数の命令を実行することに費やす。これらの頻繁に実行される命令はホットスポットと呼ばれ、それらが中に組織化されたメソッドは、ホットスポットメソッドと呼ばれる。頻繁に実行されない大部分の命令の最適化がシステム全体のパフォーマンスを向上させることより、ホットスポットメソッドの最適化がシステム全体のパフォーマンスを向上させる。したがって、ホットスポットメソッドを正確に特定し、特定されたときにホットスポットメソッドを最適化することが重要である。ホットスポットメソッドの特定は、図３の呼び出しカウンタに関連して既に述べられた。
【００４０】
図４は、ホットスポットメソッドが最適化され得るプロセス４００の例を示す。プロセス４００の例は、より大きいコードになる可能性があるがより高速なコードを生成すべく、図２の３２ビットＡＲＭコードジェネレータ２１８を必要に応じて設定することによって開始する（ブロック４０２）。典型的には、より大きいがより高速であることのトレードオフがホットスポットメソッド（例えば、タイムクリティカルなメソッド）のスピードを向上させ、より大きいメモリサイズをもたらすがより高いパフォーマンスをもたらす場合がある。ここでは３２ビットＡＲＭコードジェネレータ２１８の設定が、イネーブルレベル及びディセーブルレベルのただ２つのレベルを持つとして説明されるが、当業者は、様々なレベルの構成を定義可能であることを理解している。
【００４１】
３２ビットＡＲＭコードジェネレータ２１８を必要に応じて設定した（ブロック４０２）後、プロセス４００の例は、ホットスポットメソッドの３２ビットＡＲＭコードを生成する（ブロック４０４）。ホットスポットメソッドの３２ビットＡＲＭコードを生成した（ブロック４０４）後、生成された３２ビットＡＲＭコードから、そのホットスポットメソッドのＡＲＭ命令カウントが求められる（ブロック４０６）。例えば、図２のＪＩＴコンパイラ２１０は、最後に生成された３２ビットＡＲＭコード命令を含むメモリロケーションを、最初に生成された３２ビットＡＲＭコード命令を含むメモリロケーションから減じることによって、ＡＲＭ命令カウントを求めてよい。
【００４２】
ホットスポットメソッドのＡＲＭ命令カウントが求められた（ブロック４０６）後、そのホットスポットメソッドのＡＲＭコードサイズが求められる（ブロック４０８）。ＡＲＭコードサイズは、バイト単位で測定されたＡＲＭマシンコードのサイズである。ＡＲＭコードサイズは、例えば、ＡＲＭ命令カウントに４を乗ずることによって求められるか見積もられる。当業者が容易に理解できるように、ＡＲＭ命令は、サイズが４オクテット（すなわち、バイト）である３２ビットであるので、ＡＲＭ命令カウントは４が乗ぜられる。ＡＲＭ命令カウントは命令数を示すのに対し、ＡＲＭコードサイズは与えられたホットスポットメソッドのバイト数を示すという点で、ＡＲＭコードサイズはＡＲＭ命令カウントと異なる。１つの命令は複数バイトを含んでよい。
【００４３】
ホットスポットメソッドのＡＲＭコードサイズが求められた（ブロック４０８）後、そのホットスポットメソッドのサム命令カウントが求められる（ブロック４１０）。例えば、図２のＪＩＴコンパイラ２１０が、最後に生成された１６ビットサムコード命令を含むメモリロケーションを、最初に生成された１６ビットサムコード命令を含むメモリロケーションから減じることによって、サム命令カウントを求めてよい。
【００４４】
ホットスポットメソッドのサム命令カウントが求められた（ブロック４１０）後、そのホットスポットメソッドのサムコードサイズが求められる（ブロック４１２）。サムコードサイズは、バイト単位で示されたサムマシンコードのサイズである。サム命令カウントは命令数を示すのに対し、サムコードサイズは与えられたホットスポットメソッドのバイト数を示すという点で、サムコードサイズはサム命令カウントと異なる。サムコードサイズは、例えば、サム命令カウントに２を乗ずることによって求められるか見積もられる。
当業者が容易に理解できるように、サム命令は、サイズが２オクテット（すなわち、バイト）である１６ビットであるので、サム命令カウントは２が乗ぜられる。
【００４５】
ホットスポットメソッドのサムコードサイズが求められると（ブロック４１２）、サム又はＡＲＭ決定プロセスが呼び出される（ブロック４１４）。サム又はＡＲＭ決定プロセスは、図５に関連してより詳細に述べられる。サム又はＡＲＭ決定プロセスが終了した（ブロック４１４）後、プロセス４００の例は終了する（ブロック４１６）。
【００４６】
図５は、ＡＲＭ又はサム命令を使用することを決定するためのプロセス５００の一例を示す。好ましくは、プロセス５００は、１以上のメモリに記憶されてよく知られた方法で１以上のプロセッサによって実行される、１以上のソフトウェアプログラムに組み込まれてよい。しかしながら、プロセス５００のブロックのいくつか又は全ては、手動で実行されてよい。プロセス５００は、図５に示されたフローチャートに関連して説明されるが、当業者は、プロセス５００を実行する多くの他の方法を用いることができることを容易に理解するだろう。例えば、ブロックの多くの順番が変更されたり、１以上のブロックの動作が変更されたり、複数のブロックが結合されたり、及び／又は複数のブロックが排除されたりしてよい。
【００４７】
プロセス５００の例は、全般的に、図１の主プロセッシングユニット１０２にある複数の混合モード命令を最適化する。とはいえ、その複数の命令は、図１のインターネット、ＰＯＴＳ、及び／又は他の（複数の）ネットワーク１１８、或いは、図１の（複数の）ハードドライブ、（複数の）ＣＤ、（複数の）ＤＶＤ、及び／又は他の複数の記憶デバイス１１６に由来してもよい。より具体的には、そのプロセス５００の例は、図２のＪＩＴコンパイラ２１０の中で動作してよい。
【００４８】
プロセス５００は、サム命令カウントがＡＲＭ命令カウントより小さいか否かを判断することによって開始する（ブロック５０２）。サム命令カウントがＡＲＭ命令カウントより小さいと判断された場合（ブロック５０２）、プロセス５００の例は、そのより小さい命令カウントのために１６ビットサムコードが最適であると判断する（ブロック５０４）。１６ビットサムコードを使用することを決定した（ブロック５０４）後、プロセス５００の例は終了する（ブロック５０６）。
【００４９】
逆に、サム命令カウントがＡＲＭ命令カウントより大きければ（ブロック５０２）、プロセス５００の例は、サム命令カウントがＡＲＭ命令カウントより第１閾値を超えて大きいか否かを判断する（ブロック５０８）。その第１閾値は、不揮発性メモリに記憶されてよいし、システムのコードスペース（例えば、図１のハードドライブ、（複数の）ＣＤ、（複数の）ＤＶＤ、フラッシュ、及び／又は他の記憶デバイス１１６）に直接記録されてよいし、通信リンクを通じて伝送される等してよい。その第１閾値は、例えば、パーセンテージ数（例えば、４％）、十進法数、十六進法数等のような、様々な異なるフォーマットの１つであってよい。
【００５０】
サム命令カウントがＡＲＭ命令カウントに比べて第１閾値を越えて大きくない場合（ブロック５０８）、プロセス５００の例は、命令カウントに関して１６ビットサムコードが３２ビットＡＲＭコードより著しく小さくないと判断して、３２ビットＡＲＭが最適であると判断する（ブロック５１０）。３２ビットＡＲＭコードが最適であると決定した（ブロック５１０）後、プロセス５００の例は終了する（ブロック５０６）。
【００５１】
逆に、サム命令カウントがＡＲＭ命令カウントに比べて第１閾値を越えて大きい場合（ブロック５０８）、プロセス５００の例は、サムコードサイズがＡＲＭコードサイズより少なくとも第２閾値だけ小さいか否かを判断する（ブロック５１２）。その第２閾値は、不揮発性メモリに記憶されてよいし、システムのコードスペース（例えば、図１のハードドライブ、（複数の）ＣＤ、（複数の）ＤＶＤ、フラッシュ、及び／又は他の記憶デバイス１１６）に直接記録されてよいし、通信リンクを通じて伝送される等してよい。その第２閾値は、例えば、パーセンテージ数（例えば、３５％）、十進法数、十六進法数等のような、様々な異なるフォーマットの１つであってよい。
【００５２】
サムコードサイズがＡＲＭコードサイズより少なくとも第２閾値だけ小さい場合（ブロック５１２）、プロセス５００の例は、その著しく小さいコードサイズのために１６ビットサムコードが最適であると判断する（ブロック５０４）。プロセス５００の例が１６ビットサムコードを使用する旨を決定した（ブロック５０４）後に、プロセス５００の例は終了する（ブロック５０６）。逆に、サムコードサイズがＡＲＭコードサイズより少なくとも第２閾値だけ小さくない場合（ブロック５１２）、プロセス５００の例は３２ビットＡＲＭコードが最適であると判断して（ブロック５１０）、終了する（ブロック５０６）。
【００５３】
ここではいくつかの方法及び装置が説明されたが、この特許の適用範囲はそれには制限されない。対照的に、この特許は、文言上語又は均等主義のもとに、添付のクレームの範囲内に適正に属する装置、方法、及び工業製品をカバーする。
【図１】
2007505399.tif 000003
【図２】
2007505399.tif 000004
【図３】
2007505399.tif 000005
【図４】
2007505399.tif 000006
【図５】
2007505399.tif 000007
【国際調査報告】
2007505399.tif 000008
2007505399.tif 000009
2007505399.tif 000010