(57)【特許請求の範囲】
【請求項１】
エミュレータによって実行されるプログラムコード変換を検証する方法であって、コンピュータが、対象プロセッサと、メモリと、当該メモリに関連付けられた読み込み／格納バッファとを備えており、前記コンピュータが、
（ａ）対象コードを複数のブロックに分割し、前記対象コード中の比較できるポイントまで、エミュレーション・コンテキストに従い、対象コードのブロックの１つのエミュレータを介しての実行を対象プロセッサ上のプロセスイメージ内で行い、エミュレートされた機械状態を用意するステップと、
（ｂ）コンテキストをネイティブ・コンテキストに切り替えて実行し、前記対象コード中の前記比較できる同一のポイントまで、前記対象コードの前記ブロックの１つに対応するブロックのネイティブでの実行を前記対象プロセッサ上の前記同一のプロセスイメージ内で行い、ネイティブの機械状態を用意するステップと、
（ｃ）前記対象コード中の前記比較できるポイントでの、前記ネイティブの機械状態を前記エミュレートされた機械状態と比較するステップと
を実行することを含み、
前記エミュレートされた機械状態は、エミュレートされた対象プロセッサの状態とエミュレートされたメモリの状態を含み、前記エミュレートされた対象プロセッサの状態は、抽象レジスタ群及び当該抽象レジスタに関連付けられた条件コードフラグ群に含まれる値を含み、
前記ネイティブの機械状態は、ネイティブの対象プロセッサの状態とネイティブのメモリの状態を含み、前記ネイティブの対象プロセッサの状態は、レジスタ群及び当該レジスタ群に関連付けられた条件コードフラグ群に含まれる値を含み、
前記ステップ（ｃ）における比較は、前記エミュレートされた対象プロセッサの状態と前記ネイティブの対象プロセッサの状態との第１の比較、及び、前記エミュレートされたメモリの状態と前記ネイティブのメモリの状態との第２の比較を含み、前記第２の比較は、ネイティブの実行後に更新されたメモリと前記エミュレータを介した実行後に更新された前記読み込み／格納バッファとの間で行われ、
ステップ（ａ）において、前記エミュレートされたメモリの前記状態が前記メモリに影響を与えることなしに前記読み込み／格納バッファに用意され、ステップ（ｂ）において、前記ネイティブのメモリの前記状態が前記メモリに用意され、前記ステップ（ａ）の中でのあらゆるメモリアクセスが、ステップ（ｂ）の中でアクセスされるメモリと異なる前記読み込み／格納バッファに対して行われる、前記方法。
【請求項２】
前記ステップ（ｂ）が前記ステップ（ａ）よりも先に実行される、請求項１に記載の方法。
【請求項３】
前記対象プロセッサ上で前記エミュレータを実行するためのエミュレーション・コンテキストと、前記対象プロセッサ上で前記エミュレータによって生成された目標コードを実行するための目標実行コンテキストと、前記対象コードが前記対象プロセッサ内でネイティブに実行するためのネイティブ・コンテキストとの間で選択的に切り替えを行うことを含む、請求項１又は２に記載の方法。
【請求項４】
前記対象コードを複数のブロックに分割することが、下記第１〜第３の検証モードの間で選択を行い、前記選択された検証モードに従い前記複数のブロックに前記対象コードを分割することを含み、
第１の検証モードは、各ブロックが、対象コードの単一の命令を含み、
第２の検証モードは、各ブロックが、固有エントリ命令から固有エグジット命令までの命令シーケンスを含む基本ブロックを含み、
第３の検証モードは、各ブロックが、複数の前記基本ブロックを含むグループブロックを含む、請求項１〜３のいずれか一項に記載の方法。
【請求項５】
前記複数のブロックのそれぞれについて、ステップ（ａ）〜（ｃ）を繰り返すことを含む、請求項１〜４のいずれか一項に記載の方法。
【請求項６】
前記コンピュータが、
前記対象コードの大きいセグメントを、複数のより小さいブロックに分割するステップであって、各ブロックは、対象コードの前記大きいセグメントからの１つまたは複数の命令を含む、前記分割するステップと、
前記複数のブロックのなかの連続した近隣ブロックの各ペア間のブロック境界において検証比較を実行するステップと
を実行することを含む、請求項１〜５のいずれか一項に記載の方法。
【請求項７】
前記コンピュータが、
前記対象コードのブロックを選択するステップと、
前記エミュレータを介して前記対象プロセッサ上で対象コードの前記ブロックを実行するステップと、
対象コードの前記ブロックにリターンジャンプを付加し、そして対象コードの前記ブロックを前記対象プロセッサ上においてネイティブで実行して、前記リターンジャンプで終了させ、前記リターンジャンプが前記プロセッサの制御を前記エミュレータに戻すようにするステップと
を実行することをさらに含む、請求項１〜６のいずれか一項に記載の方法。
【請求項８】
コンピュータに、請求項１〜７のいずれか一項に記載の方法の各ステップを実行させるコンピュータ・プログラム。
【請求項９】
エミュレータによって実行されるプログラムコード変換を検証するためのシステムであって、
プロセッサと、
前記プロセッサに接続されたメモリと
を含み、
請求項１〜７のいずれか一項に記載の方法の各ステップを実行するためのエミュレータコードが前記メモリに記憶されており、且つ前記プロセッサで実行される、前記システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般に、プログラムコード変換の分野に関する。詳細には、本発明は、プログラムコード変換が正しく実行されたことを検証するための方法および装置に関する。
【背景技術】
【０００２】
コンピュータ処理の分野においては、対象プログラムが、対象コンピュータプロセッサ上で実行されるように書かれる。しばしば、対象プログラムを異なる形態に変換するために、プログラムコード変換を実行することが必要である。第１に、不要な命令を削除すること、または命令シーケンスを単純化することなどにより、対象プログラムの実行を最適化するために、ときとして、プログラムコード変換を実行することが所望される。第２に、対象プログラムと適合しない目標プロセッサ上で対象プログラムを実行することが、ときとして、所望される。いずれの場合でも、エミュレータを使用してプログラムコード変換を実行して、変換されたプログラムが所望された異なる形態でもたらされるようにする。
【０００３】
プログラムコード変換が正しく実行されたことを検証する強い要望が存在する。詳細には、変換済みのプログラムを実行することの結果が、元の対象プログラムを実行することの結果と等価であることを検証することが所望される。理想的には、対象プログラムと変換済みのプログラムの間でビット単位の適合性を実証することが所望される。
【０００４】
本発明によれば、添付の特許請求の範囲に記載する装置および方法が提供される。本発明の好ましい特徴は、従属請求項、および以下の説明から明白となろう。以下は、本発明の様々な実施形態により実現可能な様々な態様および利点の概要である。この概要は、当業者が、その後に続く詳細な設計の説明をより速やかに習得するのに役立つ概説として提供され、本明細書に添付される特許請求の範囲を制限することを意図するものでは全くない。
【特許文献１】国際公開第９９／０３１６８号パンフレット
【発明の開示】
【発明が解決しようとする課題】
【０００５】
本発明は、迅速、効率的、正確、かつ費用対効果の大きい形でプログラムコード変換を検証するための方法および装置を提供する。
【課題を解決するための手段】
【０００６】
本発明の第１の態様によれば、対象プロセッサ上で対象コードをネイティブで実行することを、エミュレータを介して対象プロセッサ上で対象コードを実行することと比較することによりエミュレータによって実行される、プログラムコード変換を検証する方法が提供される。プログラムコード変換は、エミュレータを介して対象プロセッサ上で実行された対象コードのエミュレートされた状態を、対象プロセッサ上においてネイティブで実行された対象コードのネイティブの状態と比較して、エミュレートされた状態とネイティブの状態が、対象コードの中のすべての選択可能な比較ポイントで比較されるようにすることにより、検証される。プログラムコード変換は、好ましくは、様々な複雑度の検証モードで検証されて、次第により複雑な検証モードが使用されるようにする。
【０００７】
好ましくは、プログラムコード変換を検証する方法は、対象プロセッサからのメモリに対する読み込み要求および格納要求を読み込み／格納バッファの中に入れ、好ましくは、目標コードを実行する際にメモリへのアクセスを選択的に阻止して、エミュレートされたメモリイメージが読み込み／格納バッファの中で提供されるようにすることにより、対象プロセッサに関連するメモリへのアクセスを選択的に禁止する。次に、プログラムコード変換検証を実行するために、読み込み／格納バッファの中で提供されるエミュレートされたメモリイメージが、メモリの中で提供される対象プロセッサ状態と比較される。
【０００８】
本発明の特に好ましい発展形態では、プログラムコード変換検証方法は、対象プロセッサ上で実行される第１のエミュレータを介した対象コードの実行を、目標プロセッサ上で実行される第２のエミュレータを介した対象コードの実行と比較する増進的検証アルゴリズムをさらに含むことが可能である。増進的検証アルゴリズムを使用する際、第１のホストプロセッサが、対象プロセッサとして提供され、第２のホストプロセッサが、目標プロセッサとして提供され、対象コードは、対象プロセッサ上においてネイティブで実行可能である一方で、目標プロセッサ上ではネイティブで実行可能ではない。したがって、この場合、対象プロセッサと目標プロセッサは、本来的に不適合である。対象プロセッサ上で対象コードをネイティブで実行することを、第１のエミュレータを介して対象プロセッサ上で対象コードを実行することと比較して、第１のエミュレータによって実行されたプログラムコード変換を検証することにより、対象プロセッサ上の第１のエミュレータのプログラムコード変換が最初に検証された後、対象プロセッサ上で実行される第１のエミュレータを介した対象コードの実行が、目標プロセッサ上で実行される第２のエミュレータを介した対象コードの実行と比較され、第２のエミュレータによって実行されたプログラムコード変換が増進的に検証される。
【０００９】
本発明をよりよく理解するため、および本発明の諸実施形態をどのように実施することができるかを示すため、例として、添付の図面を次に参照する。
【発明を実施するための最良の形態】
【００１０】
以下に説明する様々な新規の特徴を実施するための例示的な装置が図１に示されている。図１は、レジスタ群１４を、いくつかのソフトウェアコンポーネント１０、１６、２０、および３０を格納するメモリ１８とともに含むホストプロセッサ１２を示し、そのようなメモリ１８は、基本ブロックキャッシュ１５用、およびグローバルレジスタストア１７用の作業ストレージをさらに提供する。ソフトウェアコンポーネント群には、オペレーティングシステム１６、エミュレータコード３０、および翻訳された目標コード２０が含まれる。エミュレータコード３０は、例えば、あるＩＳＡの対象コードを別のＩＳＡの目標コードに翻訳するエミュレータとして、または対象コードを、それぞれ同一のＩＳＡの翻訳済みのコードに翻訳するためのアクセラレータとして、または他の任意の知られているタイプのエミュレータとして機能することもできる。
【００１１】
エミュレータ３０、すなわち、エミュレータ機能を実施するソースコードのコンパイル済みのバージョン、および目標コード２０、すなわち、エミュレータ３０によって生成された対象コード１０の翻訳は、通常はマイクロプロセッサ、または他の適切なコンピュータであるホストプロセッサ１２上で実行される、例えば、ＵＮＩＸ（登録商標）などの、オペレーティングシステム１６と連携して実行される。図１に示した構造は、単に典型的であり、例えば、本発明によるソフトウェア、方法、およびプロセスは、オペレーティングシステム内、またはオペレーティングシステムの下に存在するコードとして実施されてもよいことが理解されよう。対象コード１０、エミュレータコード３０、オペレーティングシステム１６、およびメモリ記憶機構群は、当業者に知られている多種多様なタイプのいずれであることも可能である。
【００１２】
図２は、プログラムコード変換を使用する典型的なコンピューティングシステムの概要を示す。システムは、対象コンピューティング環境１および目標コンピューティング環境２を含む。対象コンピューティング環境１および目標コンピューティング環境２は、通常、２つの物理的に別個のコンピューティングプラットフォームによって提供され、このため、図２は、クロスプラットフォームシステムを示す。対象コード１０の形態の対象プログラムが、対象環境１内の対象プロセッサ１２上で実行可能である。既存のプログラムの手間がかかり、時間がかかる書き換えを回避するためなどの、多くの実際的な理由で、目標コンピューティング環境２内の目標プロセッサ２２上で同一の対象コード１０を実行することも所望される。しかし、目標プロセッサ２２が、対象コード１０と適合しないことがしばしば生じる。このため、プログラムコード変換を実行するようにエミュレータ３０が、目標コンピューティング環境２内において提供される。このケースでは、エミュレータ３０は、クロスプラットフォーム翻訳を実行して、目標プロセッサ２２上においてネイティブで実行される翻訳済みの目標コード２０の形態で、変換済みのプログラムを生成する。
【００１３】
エミュレータ３０は、図２の典型的な構成を超えて、多くの異なる形態をとることができる。詳細には、エミュレータ３０は、対象プログラムの実行を最適化し、最適化された変換済みのプログラムを対象プロセッサ１２に戻すために、対象プロセッサ１２上で実行されるように適合されることも可能である。他のケースでは、エミュレータ３０は、最適化と翻訳の両方の結合を実行するように構成される。各状況において、エミュレータ３０がプログラムコード変換を正しく実行することを検証することが所望される。
【００１４】
正しいプログラムコード変換を検証するための好ましい方法および装置を以下に詳細に説明する。ただし、本発明の背景として、図２の典型的な対象コンピューティング環境１および目標コンピューティング環境２の全体的な動作をまず、より詳細に説明する。
【００１５】
図２は、対象コード１０の形態で対象プログラムを示す。対象プログラムは、普通、人間のプログラマが容易に理解する高水準言語（例えば、Ｃ、Ｃ＋＋などの言語）で書かれる。次に、プログラムは、高水準言語から、コンピュータのプロセッサ、ならびにメモリ、入出力ユニットなどの関連するコンポーネントの制御により適した低水準言語（例えば、バイトコード）に変換される。最後に、プロセッサが機能するように、プログラムコードは、読み込み動作、シフト動作、追加動作、および格納動作などの、プロセッサの基本動作を指示する、機械可読のネイティブで実行可能な形態（すなわち、機械コード）で提供される。
【００１６】
ほとんどのケースでは、特に１つのタイプのプロセッサ向けに生成されたネイティブで実行可能なプログラムコードは、他のいずれのタイプのプロセッサ上でも実行することができない。詳細には、各プロセッサは、独自の特定のネイティブ命令セットを有し、異なるタイプのプロセッサ向けの命令セットの間には、かなりの、しばしば、根本的な相違が存在する。プロセッサがある条件コードフラグセットを使用するか否か、ならびに各条件コードフラグの特定の性質および目的などの、不適合につながる他の相違も存在する。
【００１７】
一般的な例として、一部のプロセッサは、ＲＩＳＣ（縮小命令セットコンピュータ）として知られる、単純な命令シーケンスの迅速な実行向けに設計されている。他のプロセッサは、ＣＩＳＣ（コンプレックス命令セットコンピュータ）として知られる基本命令シーケンスをそれぞれが表す命令の拡張セットを使用する。この結果、ＲＩＳＣプロセッサ向けのネイティブで実行可能なプログラムコードをＣＩＳＣプロセッサが実行することはできず、その逆も同様である。典型的な具体例として、対象プロセッサ１２は、Ｉｎｔｅｌ（ｒｔｍ）ｘ８６系のプロセッサ群のメンバなどのＣＩＳＣプロセッサであり、他方、目標プロセッサ２２は、ＰｏｗｅｒＰＣ（ｒｔｍ）プロセッサ系のメンバなどのＲＩＳＣプロセッサである。これら２つのプロセッサは、本来的に互換性がない。第１に、これら２つのプロセッサは、実質的に異なる命令セットを使用する。第２に、ｘ８６プロセッサは、ｘ８６系に固有であり、ＰｏｗｅｒＰＣアーキテクチャでは提供されない２つの条件コードフラグ（補助フラグおよびパリティフラグ）を使用する。
【００１８】
ほとんどのケースでは、エミュレータ３０は、レジスタや条件コードフラグなどの、プロセッサの重要な諸態様を含め、対象プロセッサ１２の仮想モデルを提供する。この仮想環境により、あたかも対象コード１０が、対象プロセッサ１２の物理的な実施例の上においてネイティブで実行されているかのように、対象プログラムが、対象プロセッサの仮想モデル上においてネイティブで実行されることが可能になる。
【００１９】
図３を参照すると、本発明の好ましい諸実施形態において使用されるエミュレータ３０が、次のコンポーネント群を有するものとして概略で示されている。すなわち、フロントエンド３１、コア３２、およびバックエンド３３であり、これらのコンポーネントのそれぞれが、好ましくは、エミュレータ３０を表すコードのそれぞれの部分において実装される。
【００２０】
フロントエンド３１は、エミュレートされる対象プロセッサ１２に固有に構成される。フロントエンド３１は、対象コード１０の所定のセクションを復号化し、一般的な中間表現のブロック（「ＩＲブロック」）をもたらす。中間表現生成の例は、「プログラムコード変換（Ｐｒｏｇｒａｍ  Ｃｏｄｅ  Ｃｏｎｖｅｒｓｉｏｎ）」という名称の国際公開第９９／０３１６８号パンフレットに記載されている。
【００２１】
コア３２は、他にも多くの最適化技術が存在するなかで、とりわけ、「プログラムコード変換のためのブロック翻訳最適化（Ｂｌｏｃｋ  Ｔｒａｎｓｌａｔｉｏｎ  Ｏｐｔｉｍｉｚａｔｉｏｎ  ｆｏｒ  Ｐｒｏｇｒａｍ  Ｃｏｄｅ  Ｃｏｎｖｅｒｓｉｏｎ）」という名称の米国特許出願公開１０／４３９９６６号明細書で開示される最適化技術などの、局所最適化技術または大域最適化技術を使用することにより、フロントエンド３１によって生成された各ＩＲブロックを最適化する。
【００２２】
バックエンド３３は、コア３２からの最適化されたＩＲブロックを取り込み、目標プロセッサ２２によって実行可能な目標コード２０を生成する。適切には、フロントエンド３１は、対象コード１０を基本ブロックに分割し、各基本ブロックは、固有エントリポイントにおける第１の命令と固有エグジットポイント（ジャンプ命令、呼び出し命令、または分岐命令などの）における最後の命令の間の連続した命令セットである。コア３２は、一緒に単一の単位として扱われる２つ以上の基本ブロックを含むグループブロックを選択することができる。さらに、フロントエンド３１は、異なるエントリ条件の下で対象コードの同一の基本ブロックを表すアイソブロックを形成することができる。
【００２３】
好ましいエミュレータ３０は、適切には、コア３２において提供される複数の抽象レジスタ群３２０を含み、レジスタ群３２０は、対象プロセッサ１２内部で使用されて、対象コード１０を実行する物理レジスタ群１４を表す。抽象レジスタ群３２０は、対象プロセッサレジスタ群１４に対する対象コード命令の予期される効果を表現することにより、エミュレートされている対象プロセッサ１２の状態をシミュレートする。エミュレータ３０は、オプションとして、対象プロセッサのレジスタ群に関連する条件コードフラグ群３２１の状態などの、対象プロセッサ１２の他の諸態様もエミュレートする。動作の際、エミュレータ３０は、対象コード１０を実行する際のエミュレートされた対象プロセッサ１２の予期される状態を、抽象レジスタ群３２０およびエミュレートされた条件コードフラグ群３２１を使用することなどにより、暗黙に記録する。
【００２４】
クロスプラットフォーム翻訳モードにおいて、エミュレータ３０は、対象コード１０に対してプログラムコード変換を実行し、翻訳済みの目標コード２０を目標プロセッサ２２に提供する。本発明の好ましい諸実施形態では、エミュレータ３０は、対象プロセッサ１２に適切な実行可能なバイナリコード（すなわち、機械コード）の形態の対象コード１０が、目標プロセッサ２２に適切な実行可能なバイナリコードの形態の目標コード２０に翻訳される、バイナリ翻訳を実行する。
【００２５】
翻訳は、静的に実行されることも、動的に実行されることも可能である。静的翻訳では、プログラム全体が、目標プロセッサ２２上で翻訳済みのプログラムを実行するのに先立って翻訳される。これには、相当な遅延が伴う。したがって、好ましいエミュレータ３０は、目標プロセッサ２２上で即時に実行するために、対象コード１０の小さいセクションを動的に翻訳するように構成される。これは、はるかに効率的である。というのは、対象コード１０の大きいセクションは、実際には使用されないか、または稀にしか使用されないからである。したがって、本発明の好ましい諸実施形態は、動的バイナリ翻訳を実行するエミュレータ３０で使用されることが特に意図されている。ただし、本発明は、動的なバイナリ翻訳に限定されず、プログラムコード変換の分野において一般に適用可能である。例えば、本発明の諸実施形態は、コンパイラとしてではなく、インタプリタとして動作するエミュレータにも適用可能である。
【００２６】
図４は、プログラムコード変換を検証する好ましい方法の動作フローチャートであり、他方、図５は、図４の方法によるプログラムコード変換を検証するための好ましい装置の概略である。図４および図５に示した好ましい方法および装置では、第１のエミュレータ３０ａが、対象プロセッサ１２上で対象コード１０を実行するのに使用される。最初、ステップ２００で、エミュレータ３０ａが、前述したとおり、対象コード１０を目標コード２０ａに変換し、次にステップ２０２で、目標コード２０ａが対象プロセッサ１２によって実行されて、対象コード１０を実行する対象プロセッサ１２のエミュレートされた状態が提供される。次にステップ２０４で、対象コード１０が、対象プロセッサ１２上においてネイティブで実行されて、対象コード１０を実行する対象プロセッサ１２のネイティブの状態が提供される。このため、変換済みの出力目標コード２０ａと元の対象コード１０がともに、同一タイプのプロセッサ上で実行される。この特定のタイプのエミュレーションを「セイムツーセイム（ｓａｍｅ−ｔｏ−ｓａｍｅ）」エミュレータ、または「ＸツーＸ」エミュレータと呼ぶことができる。第１のエミュレータ３０ａによって実行されるプログラムコード変換は、ステップ２０６で、第１のエミュレータ３０ａを介して対象コード１０を実行したことの出力を、対象プロセッサ１２上においてネイティブで同一の対象コード１０を実行したことの結果と比較することにより、正しいと検証される。ステップ２０６で、対象プロセッサ１２のエミュレートされた状態とネイティブの状態は、可能な場合、好ましくは、対象コードの中の各命令後、対象コード１０の中の可能なすべての比較できるポイントにおいて互いに比較される。対象プロセッサ１２のエミュレートされた状態とネイティブの状態が合致した場合、次にステップ２０８で、エミュレートされた対象コードに関するプログラムコード変換が検証される。エミュレートされた状態とネイティブの状態の間に不一致が存在する場合、次にステップ２１０で、プログラムコード変換誤りが識別される。この検証プロセスは、以下により詳細に説明するとおり、非常に有用なツールである。
【００２７】
図６を参照して、対象環境１内における本発明の好ましい実施形態の動作を以下により詳細に説明する。図６で、対象プロセッサ１２上における対象コード１０のネイティブの実行が、エミュレータ３０ａを介して同一の対象コード１０の実行と比較される。この場合、任意の適切な構成を、対象コード１０のネイティブの実行のために使用することができる。理想的には、対象コード１０は、機械コードの形態であり、対象プロセッサ１２上で直接に実行される。ただし、コンパイラまたはインタプリタなどの１つまたは複数の中間ステップも、それらが正しく機能することが信頼されるという条件付きで、使用することができる。対象コード１０のこのネイティブの実行後、特に対象プロセッサ１２を含む対象環境１の状態が、ネイティブの機械状態を形成する。ネイティブの機械状態は、対象プロセッサ１２の状態（すなわち、レジスタ群１４および条件コードフラグ群に含まれる値）、およびメモリ１２２の状態を含む。
【００２８】
エミュレータ３０ａは、対象プロセッサ１２上における対象コード１０の実行をエミュレートするように構成される。例えば、エミュレータ３０は、レジスタ群１４や条件コードフラグ群などの対象プロセッサ１２の重要な要素に対する対象コード１０の効果をエミュレートする。エミュレートされた機械状態が、特にこのエミュレートされたプロセッサモデルから導出されて、提供される。このため、ネイティブの機械状態は、エミュレータによって実行されたプログラムコード変換を検証するように、エミュレートされた機械状態と比較できる。エミュレートされた機械状態は、好ましくは、対象コード１０の中の各命令の実行後、対象コード１０の中の可能なすべての比較できるポイントにおいて、ネイティブの機械状態と比較される。誤った変換は、エミュレートされた機械状態とネイティブの機械状態の間の相違で容易に識別される。
【００２９】
対象プロセッサ１２の状態に関する情報に加えて、ネイティブの機械状態は、好ましくは、対象コード１０のネイティブの実行後のメモリ１２２の状態を表す情報も含む。同様に、エミュレートされた機械状態は、好ましくは、エミュレータ３０ａを介した対象コードの実行後の、メモリ１２２のイメージも含む。図６に示した本発明の好ましい実施形態では、プロセッサメモリ１２２と連携して動作する読み込み／格納バッファ１２１が提供される。動作の際、読み込み／格納バッファ１２１は、メモリ１２２に全く影響を与えることなしに、エミュレータ３０ａによって生成された目標コード２０ａの実行によって生じさせられる、あらゆるメモリアクセスを扱う。このようにして、読み込み／格納バッファ１２１は、エミュレータ３０ａのメモリ１２２へのアクセス可能性を制限する。対照的に、対象コード１０が対象プロセッサ１２においてネイティブで実行される場合、メモリ１２２への完全なアクセスが提供される。この結果、メモリ１２２の現実の状態を、読み込み／格納バッファ１２１の状態から導出された、エミュレートされたメモリイメージと比較することが可能である。代替として、対象コード１０のエミュレートされた実行に、メモリ１２２へのアクセスが許される一方で、読み込み／格納バッファ１２１を使用して、ネイティブの実行中のメモリの状態が保存されてもよい。
プロセッサ状態およびメモリ状態の以上の比較は、別々に実行されても、組み合わせで実行されてもよい。好ましくは、第１の比較が、ネイティブのプロセッサ状態とエミュレートされたプロセッサ状態の間で、すなわち、プロセッサ１２の現実の状態（レジスタ群１４および条件コードフラグ群に含まれる値）とエミュレータ３０ａによって保持されるプロセッサの仮想モデル（抽象レジスタ群３２０および条件コードフラグ群３２１に含まれる値）の間で行われる。第２の比較が、ネイティブのメモリ状態とエミュレートされたメモリ状態の間で、すなわち、ネイティブの実行後に更新されたメモリ１２２と、エミュレータ３０ａを介した実行後に更新された読み込み／格納バッファ１２１の間で行われる。理想的には、ビット単位のＸＯＲ比較が実行されて、対象コード１０のネイティブの実行と、エミュレータ３０ａによって実行されたプログラムコード変換の間でビット単位の適合性が実証される。ビット単位の適合性は、好ましくは、対象コード１０の中のそれぞれの個別の命令のレベルにおいて実証される。この場合、コード実行によって影響を受けた機械状態の部分（例えば、選択されたレジスタ群、または選択されたメモリロケーション）だけを比較することなどの、効率的な比較スキームを特定することができる。
【００３０】
本発明の特定の好ましい実施形態では、対象コード１０の実行と目標コード２０ａの実行は、対象プロセッサ１２内部で単一のプロセスイメージを共有し、したがって、全く同一の対象コードを扱う。有利には、単一のプロセスイメージを共有することは、直接の比較が迅速に、効率的に行われることを可能にすることにより、検証を実行することの影響を最小限に抑える。さらに、ネイティブのプロセッサ状態とエミュレートされたプロセッサ状態の同時の実行のため、対象コード１０の単一の共有されたイメージストリームだけを要し、決定論的な信号ストリームを記録し、再生することの面倒な問題が回避される。さらに、ネイティブのプロセッサ状態とエミュレートされたプロセッサ状態の同時の比較により、大きいトレースファイルの必要性が回避される。ただし、そのように緊密に結合された動作は、対象コード実行と目標コード実行の間で所望の分離を実現する際に問題をもたらすことが明らかである。前述したとおり、読み込み／格納バッファ１２１は、メモリ１２２を選択的に分離する。さらに、対象プロセッサにおいてコンテキスト切り替えが実行されて、ネイティブの実行とエミュレータの実行の間で切り替えが行われる。
【００３１】
図７は、対象プロセッサ１２が異なるコンテキストの間で切り替えを行う際の主要な状態遷移を示して、好ましい検証方法を例示する状態図である。図７では、各コンテキストが１つの列で表され、対象プロセッサ１２の制御の変化が、列の間の水平方向の移動で強調されている。この例では、対象プロセッサ１２は、３つの異なるコンテキスト、すなわち、エミュレータ３０ａが対象プロセッサ１２内部で実行されるエミュレータコンテキスト４１、エミュレータ３０ａによって生成された目標コード２０ａが対象プロセッサ１２内部で実行される目標実行コンテキスト４２、および対象コード１０が対象プロセッサ１２内部においてネイティブで実行される対象ネイティブコンテキスト４３を有する。ただし、その他の特定のコンテキスト構成も可能である。例えば、インタプリタとして動作するエミュレータ３０ａが、変換コンテキスト４１と目標実行コンテキスト４２を結合して単一のコンテキストにする。
【００３２】
プログラムコード変換検証の好ましい実施形態は、対象コード１０の大きいセグメントを多数のより小さいブロックに分割し、各ブロック境界において検証比較を実行する。この例では、現行のブロックＢＢｎと直前の先行するブロックＢＢｎ−１が考慮され、各ブロックは、対象コード１０からの１つまたは複数の命令を含む。各ブロックは、好ましくは、初期検証段階において単一の命令を含み、以下により詳細に説明するとおり、より複雑なモードのプログラムコード変換検証を実現するため、複数の命令を含むブロックの分析がその後に実行される。
【００３３】
ステップ４０１で、対象プロセッサ１２の制御は、エミュレータコンテキスト４１におけるエミュレータ３０ａにある。エミュレータ３０ａは、対象コード１０を検査し、現行のブロックＢＢｎを定義する。エミュレータ３０ａは、次に、現行のブロックＢＢｎに対してプログラムコード変換を実行して、目標コード２０ａの対応するブロックを生成する。ステップ４０２で、対象コードの直前の先行するブロックＢＢｎ−１にリターンジャンプがパッチされる。コンテキスト切り替えルーチンを実行することにより、コンテキスト切り替えが実行されて、対象ネイティブコンテキスト４３になる。ステップ４０３で、対象コードの先行するブロックＢＢｎ−１が、対象プロセッサ１２によってネイティブで実行され、ネイティブ実行ハーネスとしてエミュレータ３０ａによってパッチされたリターンジャンプで終了する。リターンジャンプは、コンテキスト切り替えルーチンを呼び出し、このルーチンにより、変換コンテキスト４１に戻るように切り替えられる。ステップ４０４で、前述したとおり、ネイティブの機械状態とエミュレートされた機械状態が比較される。この時点で、エミュレータ３０ａによって保持される対象プロセッサの仮想モデルは、現実のプロセッサ１２と同一でなければならず、両方とも、先行するブロックＢＢｎ−１の終りにある。比較が誤りを示さないものと想定すると、別のコンテキスト切り替えが実行され、今回は、目標実行コンテキスト４２に切り替わる。ステップ４０５で、対象コードの現行のブロックＢＢｎに対応する目標コード２０ａが、エミュレータによって保持される対象プロセッサの仮想モデルにおいて実行され、仮想モデルと読み込み／格納バッファは、現行のブロックＢＢｎの終りを表す機械状態に置かれる。次に、目標コード２０ａ実行が、エミュレータコンテキスト４１に戻る別のコンテキスト切り替えで終了する。ステップ４０６で、対象コードのパッチされた前のブロックＢＢｎ−１が、最初の状態に復元されて、検証プロセスの侵入的な効果が最小限に抑えられる。次に、方法は、次のブロックＢＢｎ＋１を扱うことを始めるために、ステップ４０１に戻る。
【００３４】
各ブロックＢＢｎは、そのブロックＢＢｎのネイティブの実行（ステップ４０３における）に先立って、エミュレータ３０ａを介して（ステップ４０５で目標コードとして）まず実行されることが理解されよう。本発明の図示した好ましいインプリメンテーションでは、対象プロセッサ上における直前の先行するブロックＢＢｎ−１のネイティブの実行の前に、エミュレータ３０ａにおける現行のブロックＢＢｎを定義することが好都合である。この場合、対象プロセッサの仮想モデルは、最初、ホストプロセッサの物理レジスタ群（このケースでは、対象プロセッサ１２の現実のレジスタ群１４）、および物理メモリロケーション（キャッシュメモリロケーションおよびバッファメモリロケーションを含む）などの、分散されたソースを参照して獲得される。このため、検証比較を実行するのに先立って、メモリの所定の領域に順序正しい形でレジスタ内容を書き込むことなどにより、仮想モデルを強化することが好ましい。好ましいインプリメンテーションでは、そのような強化された仮想モデルは、各ブロックの終りにおいてではなく、先頭において、より容易に利用可能である。
【００３５】
本発明の別の好ましい実施形態では、図５に示すとおり、目標コンピューティング環境２内において第２のエミュレータ３０ｂが提供される。対象コード１０は、第２のエミュレータ３０ｂによって、目標プロセッサ２２上で実行される目標コード２０ｂに変換される。つまり、第１のタイプのプロセッサ向けの対象プログラムが変換されて（例えば、最適化を伴って、または伴わずに翻訳または解釈されて）、異なるタイプのプロセッサ向けの変換済みのプログラムが生成される。この場合、エミュレータは、「ディスツーダット（ｔｈｉｓ−ｔｏ−ｔｈａｔ）」エミュレータ、または「ＸツーＹ」エミュレータと呼ばれる。第２のエミュレータ３０ｂによって実行されたプログラムコード変換は、第１のエミュレータ３０ａとの比較によって検証される。このため、信頼の連鎖が、増進的に確立される。信頼は、最初、第１のエミュレータ３０ａにおいて得られ、第２に、第２のエミュレータ３０ｂにおいて得られる。この形態の増進的検証により、検証が、費用およびオーバーヘッドを最小限に抑えながら、単純に正確な形で実行されることが可能になる。異なるタイプのプロセッサ向けに設計された第１のエミュレータ３０ｂの既に検証されたプログラムコード変換を使用して、第２のエミュレータ３０ｂのプログラムコード変換を検証するこのタイプの構成を、以降、クロスプラットフォーム構成と呼ぶ。
【００３６】
次に図８を参照して、クロスプラットフォーム構成における本発明の好ましい実施形態の動作フローチャートを以下により詳細に説明し、他方、図９は、図８の方法に従ってプログラムコード変換を検証するための好ましい装置の概略である。図８および図９に示す好ましい方法および装置において示すとおり、第１のエミュレータ３０ａは、対象環境１内で提供され、対象コード１０に対してプログラムコード変換を実行する。図４および図５を参照して前述したとおり、対象環境１内においてネイティブで対象コード１０を実行したことの結果が、第１のエミュレータ３０ａを使用したことの結果と比較されて、第１のエミュレータ３０ａが正しく動作していることが確認される。次に、第１のエミュレータ３０ａを使用して、目標環境２内で実行されている第２のエミュレータ３０ｂによって実行されたプログラムコード変換が検証される。第１のエミュレータ３０ａは、正しく動作していることが既に検証されており、このため、第１のエミュレータ３０ａを本明細書では、以降、「基準システム」と呼ぶ。それに対して、第２のエミュレータ３０ｂが正しく動作しているかどうかは未判定であり、したがって、第２のエミュレータ３０ｂを本明細書では、以降、「試験システム」と呼ぶことができる。
【００３７】
動作の際、第２のエミュレータ３０ｂは、ステップ５０２で目標プロセッサ２２上においてネイティブで実行される第２の目標コード２０ｂを、ステップ５００で生成する。これを行う際、第２のエミュレータ３０ｂは、エミュレートされた対象プロセッサ１２に対する対象コード１０の効果をエミュレートする。同時に、第１のエミュレータ３０ａが、図４のステップ２０２で既に生成済みのエミュレートされた対象プロセッサ１２に対する対象コード１０の効果を再びエミュレートする。このため、第１のエミュレータ３０ａによって保持される第１のエミュレートされた状態で表される結果が、ステップ５０４で獲得される（「基準システム状態」）。基準システム状態は、ステップ５０６で、第２のエミュレータ３０ｂによって保持される第２のエミュレートされた機械状態で表される結果（「試験システム状態」）と比較できる。ステップ５０６で、対象プロセッサ１２の基準システムエミュレート状態と試験システムエミュレート状態が、可能な場合、対象コード１０の中の各命令後の、対象コード１０の中の可能なすべての比較できるポイントにおいて互いに比較される。基準システムエミュレート状態と試験システムエミュレート状態が合致した場合、第２のエミュレータ３０ｂに関するプログラムコード変換が、ステップ５０８で検証される。基準システムエミュレート状態と試験システムエミュレート状態の間に不一致が存在する場合は、ステップ５１０で、第２のエミュレータ３０ｂに関するプログラムコード変換誤りが識別される。第１のエミュレータ３０ａは、正しく機能することが既に信頼されているので、この時点で、第２のエミュレータ３０ｂが、正しく機能することが検証され、信頼される。
【００３８】
本発明の様々な実施形態では、次第に複雑になる動作モードを使用して検証が実行される。第１の最も単純な動作モードでは、対象コード１０の大きいセグメントがブロックに分割され、各ブロックは、単一の命令を含む。対象コードのそれぞれの単一の命令が、対象プロセッサ１２でネイティブで実行され、第１のエミュレータ３０ａと比較される。第１のエミュレータ３０ａの正しい動作が、命令ごとに検証される。対象コード１２の中の命令のすべてが実行されて、信頼できるプログラムコード変換が確立されると、各ブロックのサイズが、いくつかの命令の基本ブロックを含むように大きくされた第２のより複雑なモードが行われる。命令の基本ブロックが前述したとおり検証された後、プログラムコード変換の信頼性がさらなるレベルで検証される。次に、各ブロックが、単一の単位として一緒に扱われる、または異なる条件下の同一の基本ブロックを表す、グループの基本ブロック（すなわち、グループブロックまたはアイソブロック）を含む第３のモードが行われる。プログラムコード変換検証方法は、グループの基本ブロックに対して繰り返される。最後に、対象コードの累進的に大きくなるセグメントが提供され、それぞれの累進的に複雑になる検証モードが、完全に信頼できるプログラムコード変換が確立されるまで、さらなるレベルの信頼性を追加する。
【００３９】
同一の累進的にますます複雑になる動作モードが、目標環境２内のエミュレータ３０ｂを検証する際に適用され、単一の命令からグループのブロックまでの累進的に複雑になる動作モードが可能になる。
【００４０】
一実施形態では、第１のエミュレータ３０ａおよび第２のエミュレータ３０ｂの検証は、異なる時点において順次に実行されるが、これにより、一方の環境内で記録され、他方の環境内で再生される大量のデータが生成される。このため、最も好ましくは、第１のエミュレータ３０ａおよび第２のエミュレータ３０ｂの検証は、実質的に同時に実行され、これにより、負担になる再生機構の必要性が回避される。対象コード１０のブロックが、対象プロセッサ１２、第１のエミュレータ３０ａ、および第２のエミュレータ３０ｂのそれぞれに供給されて、それぞれの機械状態、基準システム状態、および試験システム状態が生成され、検証比較が実行されるようにする。それらの比較が成功であったものと想定すると、第１のエミュレータ３０ａと第２のエミュレータ３０ｂの両方において信頼できるプログラムコード変換が検証されるまで、次のブロックが順に供給される。
【００４１】
図１０は、対象環境１内の動作を目標環境２内の動作と同期させるための好ましい機構を示す。図１１は、対象環境１内の動作を目標環境２内の動作と同期させる際に実行される方法の動作フローチャートをさらに示す。図１０に示すとおり、対象環境１から目標環境２までの、詳細には、第１のエミュレータ３０ａから第２のエミュレータ３０ｂまでの通信パスが提供される。この通信パスは、好ましくは、ネットワーク待ち時間を最小限に抑え、検証の速度を向上させるために、単一方向通信である。ただし、第２のエミュレータ３０ｂは、代替の諸実施形態において、第１のエミュレータ３０ａと直接、または間接に、双方向で通信するように構成することもできるものと理解される。
【００４２】
第１に、２つのエミュレータ３０ａ、３０ｂが、第１のエミュレータ３０ａから第２のエミュレータ３０ｂに初期状態情報を送ることにより、エミュレートされたレジスタ群およびメモリの値を含め、エミュレートされた対象機械状態を同期させる。
【００４３】
第２に、対象環境からの非決定論的な値を目標環境に送ることにより、同期が保持される。例えば、システムコール「ｇｅｔ＿ｔｉｍｅ＿ｏｆ＿ｄａｙ」から獲得された戻り値が、対象環境１内で記録され、目標環境２に送られる。このため、目標環境２は、対象環境１をミラーリングするようにさせられる。対象コード１０は、複数のブロックに分割される。対象コードの各ブロックＢＢＮ（例えば、１つの命令、命令のブロック、グループブロックなど）に関して、対象環境１は、ステップ６００で、第１のエミュレータ３０ａ（基準システムとも呼ばれる）を介してそのコードブロックＢＢＮを実行し、これにより、ステップ６０２で目標環境２（試験システムとも呼ばれる）に送られる、対象機械状態データ［ｓ］ｒｎおよび非決定論的な値［ｄ］ｒｎがもたらされる。対象機械状態データ［ｓ］ｒｎおよび非決定論的な値［ｄ］ｒｎを試験システムに直接に送ることが可能であり、あるいは、そのような情報をネットワークバッファの中に格納して、試験システムが、必要に応じてその情報を取り出すことができるようにすることができる。試験システムが、ステップ６０４で、基準システムから対象機械状態データ［ｓ］ｒｎおよび非決定論的な値［ｄ］ｒｎを受け取ると、第２のエミュレータ３０ｂは、ステップ６０６で、非決定論的な値［ｄ］ｒｎを適宜、代入して、試験システム上で対象コード１０の同一のブロックＢＢＮを実行する。対象コードのそのブロックの実行に続き、ステップ６０８で、第１のエミュレータ３０ａからの受け取られた対象機械状態データ［ｓ］ｒｎが、第２のエミュレータ３０ｂにおける対応する対象機械状態データ［ｓ］ｔｎと比較される。基準システムに関する状態データと試験システムに関する状態データが一致した場合、ステップ６１０で、対象コード１０のブロックＢＢＮに関するプログラムコード変換が正しいことが検証される。相違が検出された場合、そのことが、ステップ６１２で誤りとして報告される。検出されなかった場合、プロセスは、対象コードの次のブロックに関して繰り返される。
【００４４】
基準システムと試験システムは、好ましくは、制御の下で同期に実行される。この緊密に制御された実行により、非決定論的な状態の相違が回避され、命令レベルから基本ブロック境界を経てグループブロック境界まで、任意のポイントで基準システム状態と試験システム状態の比較が可能になる。
【００４５】
本明細書で説明する方法は、コンピュータ可読記憶媒体上にコンピュータプログラムとして記録されるのに適している。本発明は、本明細書で説明した方法を実行するのに適したエミュレータ装置、および本明細書で説明する方法を実行するようにプログラミングされている場合のコンピュータプラットフォームにも及ぶ。本発明のプログラムコード変換検証の方法および装置は、本明細書で定義した方法のいずれかを実行するように構成されたエミュレーションシステム、コンピューティングシステム、またはコンピューティングプラットフォームにも及ぶ。本発明は、例えば、ネットワーク化されたコンピューティングシステム、サーバコンピュータ、デスクトップコンピュータ、またはポータブルコンピューティングデバイスを含め、任意の適切な形態で実施することができる。本発明は、本明細書で定義した方法のいずれかを実行するためのプログラムコード命令を含むコンピュータ可読記録媒体にも及ぶ。
【００４６】
本発明は、以上の説明から明白となり、本発明の実施を介して当業者に明白となる多くの利点を有する。詳細には、プログラムコード変換が、迅速、効率的、正確、かつ費用対効果の大きい形で検証される。本発明の好ましい実施形態は、互換性のない対象環境と目標環境にわたる検証が、安価に、最小限のオーバーヘッドで実行されることを可能にする。まず対象コンピューティング環境内で、次に目標コンピューティング環境における増進的検証により、各環境内における影響が最小限に抑えられる。増進的検証を介し、次第に複雑になる検証モードの使用により、エミュレータを迅速に、信頼できる形で検証することができる。好ましいエミュレータは、エミュレータのフロントエンドまたはバックエンドを相応する形に適合させることにより、異なるタイプのプロセッサで使用されるように容易に適合される。検証は、単純で、信頼できる形で実行され、したがって、開発の早い段階で適用して、誤りが、迅速で、安価に検出され、解決されることを可能にすることができる。好ましい検証は、対象コードのそれぞれの個別の命令のレベルにおけるビット単位の適合性の実証を可能にする。
【００４７】
いくつかの好ましい実施形態を図示し、説明してきたが、添付の特許請求の範囲において定義する本発明の範囲を逸脱することなく、様々な変更および改変を行うことが可能であることが、当業者には理解されよう。
本出願に関連して本明細書と同時に、または本明細書に先立って提出され、本明細書とともに公共の閲覧が自由であるすべての書類および文書に注意を向けられたい。すべてのそのような書類および文書の内容は、参照により本明細書に組み込まれている。
【００４８】
本明細書（添付の特許請求の範囲、要約書、および図面を含む）で開示した特徴のすべて、および／またはそのように開示した方法またはプロセスのステップのすべては、そのような特徴および／またはステップの少なくとも一部が相互排他的である場合の組み合わせを除き、あらゆる組み合わせで組み合わせることができる。本明細書（添付の特許請求の範囲、要約書、および図面を含む）で開示した各特徴は、別段、明記しない限り、同一の目的、均等の目的、または類似の目的を果たす代替の特徴で置き換えることができる。このため、別段、明記しない限り、開示した各特徴は、一般的な一連の均等の特徴、または類似の特徴の一例に過ぎない。本発明は、以上の実施形態の詳細に限定されない。本発明は、本明細書（添付の特許請求の範囲、要約書、および図面を含む）で開示した特徴の任意の新規な１つ、または任意の新規な組み合わせ、あるいはそのように開示した任意の方法またはプロセスのステップの任意の新規な１つ、または任意の新規な組み合わせにも及ぶ。
【図面の簡単な説明】
【００４９】
【図１】本発明によるエミュレーションを実行するための例示的なコンピューティング環境の概略図である。
【図２】プログラムコード変換に関わる典型的なコンピューティングシステムの概略図である。
【図３】好ましいエミュレータの概略図である。
【図４】好ましい実施形態による、対象プロセッサ上で実行されたプログラムコード変換の検証の動作フローチャートである。
【図５】本発明の好ましい実施形態に従って使用される第１のエミュレータおよび第２のエミュレータの概略図である。
【図６】本発明の好ましい実施形態に従って使用される第１のエミュレータを示すより詳細な概略図である。
【図７】本発明の好ましい実施形態による検証方法を示す概略の状態図である。
【図８】好ましい実施形態に従って実行されるプログラムコード変換の増進的検証の動作フローチャートである。
【図９】本発明の好ましい実施形態に従って使用される第１のエミュレータおよび第２のエミュレータを示す概略図である。
【図１０】本発明の好ましい実施形態によるプログラムコード変換の検証中における第１のエミュレータと第２のエミュレータの同期を示す概略図である。
【図１１】本発明の好ましい実施形態によるプログラムコード変換の検証中における第１のエミュレータと第２のエミュレータの同期を示す動作フローチャートである。
【符号の説明】
【００５０】
１０  対象コード
１２  プロセッサ
１５  基本ブロックキャッシュ
１６  オペレーティングシステム
１７  グローバルレジスタストア
２０  目標コード
２２  目標プロセッサ
３０  エミュレータ（コード）
３１  フロントエンド
３２  コア
３３  バックエンド
１２１  読み込み／格納バッファ
１２２  メモリ
【図１】
0004766540.tif 000002
【図２】
0004766540.tif 000003
【図３】
0004766540.tif 000004
【図４】
0004766540.tif 000005
【図５】
0004766540.tif 000006
【図６】
0004766540.tif 000007
【図７】
0004766540.tif 000008
【図８】
0004766540.tif 000009
【図９】
0004766540.tif 000010
【図１０】
0004766540.tif 000011
【図１１】
0004766540.tif 000012