(57)【要約】【課題】エミュレーションによるソフトウェアの実行を高速化する。【解決手段】エミュレーション装置３は、エミュレーション実行対象ソフトウェア７１に含まれる、命令種別７１１とオペランド７１２とを内包する命令情報７１０と、命令情報７１０がエミュレーション可能にコンパイルされたコンパイル済命令情報７２と、コンパイル済命令情報７２の格納アドレスを示す情報７３とが、関連付けられて記憶された記憶部７０と、命令情報７１０を、命令情報７１０に関連付けられたコンパイル済命令情報７２を格納アドレスから呼び出すサブルーチン読み出し命令情報に変換することによって、エミュレーション実行対象ソフトウェア７１を、エミュレーション可能にコンパイルしたコンパイル済ソフトウェア８１を生成する生成部８０と、を備える。【選択図】      図１２
2018028777.tif 000002
【特許請求の範囲】
【請求項１】
エミュレーション実行対象ソフトウェアに含まれる、命令種別とオペランドとを内包する命令情報と、前記命令情報がエミュレーション可能にコンパイルされたコンパイル済命令情報と、前記コンパイル済命令情報の格納アドレスを示す情報とが、関連付けられて記憶された記憶手段と、
前記命令情報を、前記命令情報に関連付けられた前記コンパイル済命令情報を前記格納アドレスから呼び出すサブルーチン読み出し命令情報に変換することによって、前記エミュレーション実行対象ソフトウェアを、エミュレーション可能にコンパイルしたコンパイル済ソフトウェアを生成する生成手段と、
を備えるエミュレーション装置。
【請求項２】
前記記憶手段には、前記命令種別が示す値と前記オペランドが示す値とに基づいて生成された前記コンパイル済命令情報が記憶されている、
請求項１に記載のエミュレーション装置。
【請求項３】
前記生成手段は、前記エミュレーション実行対象ソフトウェアにおいて、連続して実行される２つの前記命令情報について、先行する前記命令情報が分岐命令以外の命令を示す場合は、前記先行する命令情報に続いて、後続する前記命令情報を前記サブルーチン読み出し命令情報に変換し、前記先行する命令情報が分岐命令を示す場合は、前記先行する命令情報に続いて、前記コンパイル済ソフトウェアの実行を終了する命令である復帰命令が挿入されるように、前記コンパイル済ソフトウェアを生成する、
請求項１または２に記載のエミュレーション装置。
【請求項４】
前記コンパイル済ソフトウェアを使用して、前記エミュレーション実行対象ソフトウェアのエミュレーションを実行する実行手段をさらに備え、
前記生成手段は、１以上の前記コンパイル済ソフトウェアを生成したのち、生成した前記コンパイル済ソフトウェアを、前記コンパイル済ソフトウェアに関連付けられる、前記エミュレーション実行対象ソフトウェアにおける実行場所を示す命令ポインタが示す値に関連付けて、前記記憶手段に記憶し、
前記実行手段は、前記命令ポインタが示す値に関連付けられた前記コンパイル済ソフトウェアが前記記憶手段に記憶されている場合に、前記コンパイル済ソフトウェアを前記記憶手段から読み出して実行する、
請求項１乃至３のいずれか一項に記載のエミュレーション装置。
【請求項５】
前記実行手段は、前記命令ポインタが示す値に関連付けられた前記コンパイル済ソフトウェアが前記記憶手段に記憶されていない場合、前記命令ポインタによって示される前記命令情報をコンパイルした前記コンパイル済ソフトウェアを生成することを、前記生成手段に指示するとともに、前記命令ポインタによって示される前記命令情報のエミュレーションを、インタプリタ方式によって実行し、
前記生成手段は、前記実行手段からの指示に従って、前記命令ポインタによって示される前記命令情報をコンパイルした前記コンパイル済ソフトウェアを生成する、
請求項４に記載のエミュレーション装置。
【請求項６】
前記実行手段は、前記生成手段に対して前記コンパイル済ソフトウェアを生成することを指示する対象である、前記命令情報を示す前記命令ポインタが示す値を、前記記憶手段に含まれる１以上のエントリのいずれかに登録し、
前記生成手段は、前記エントリに登録されている前記命令ポインタが示す値によって特定される前記命令情報をコンパイルした前記コンパイル済ソフトウェアを生成する、
請求項５に記載のエミュレーション装置。
【請求項７】
前記コンパイル済ソフトウェアについて、エミュレーションが実行された回数が基準を満たすか否かを判定する判定手段と、
前記判定手段が、前記回数が基準を満たすと判定した場合に、前記コンパイル済ソフトウェアにおいて、前記サブルーチン読み出し命令情報を、前記サブルーチン読み出し命令情報によって呼び出される前記コンパイル済命令情報に更新する更新手段と、
をさらに備える請求項１に記載のエミュレーション装置。
【請求項８】
前記生成手段は、前記コンパイル済ソフトウェアについて、エミュレーションが実行される度に前記回数を更新し、更新した前記回数を前記記憶手段に記憶する動作を示す情報を、前記コンパイル済ソフトウェアに追加し、
前記判定手段は、前記記憶手段に記憶された前記回数を参照する、
請求項７に記載のエミュレーション装置。
【請求項９】
エミュレーション実行対象ソフトウェアに含まれる、命令種別とオペランドとを内包する命令情報と、前記命令情報がエミュレーション可能にコンパイルされたコンパイル済命令情報と、前記コンパイル済命令情報の格納アドレスを示す情報とが、関連付けられて、記憶手段に記憶されている場合に、
情報処理装置によって、
前記命令情報を、前記命令情報に関連付けられた前記コンパイル済命令情報を前記格納アドレスから呼び出すサブルーチン読み出し命令情報に変換することによって、前記エミュレーション実行対象ソフトウェアを、エミュレーション可能にコンパイルしたコンパイル済ソフトウェアを生成する、
エミュレーション方法。
【請求項１０】
エミュレーション実行対象ソフトウェアに含まれる、命令種別とオペランドとを内包する命令情報と、前記命令情報がエミュレーション可能にコンパイルされたコンパイル済命令情報と、前記コンパイル済命令情報の格納アドレスを示す情報とが、関連付けられて記憶された記憶手段にアクセス可能なコンピュータに、
前記命令情報を、前記命令情報に関連付けられた前記コンパイル済命令情報を前記格納アドレスから呼び出すサブルーチン読み出し命令情報に変換することによって、前記エミュレーション実行対象ソフトウェアを、エミュレーション可能にコンパイルしたコンパイル済ソフトウェアを生成する生成処理
を実行させるためのエミュレーションプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本願発明は、エミュレーションの実行対象であるソフトウェアを、エミュレーション可能にコンパイルする技術に関する。
【背景技術】
【０００２】
現代社会において、コンピュータシステムのアーキテクチャは急速に進歩している。しかしながら、例えば、新しいアーキテクチャが古いアーキテクチャと互換性がない場合、その新しいアーキテクチャにより構成されたコンピュータシステムは、古いアーキチャクチャ用のソフトウェア資産をそのまま実行することができない。このような場合、新しいアーキテクチャにより構成されたコンピュータシステムは、エミュレーションを行うことによって、古いソフトウェア資産を実行することができる。
【０００３】
例えば、過去に開発されたメインフレーム用のソフトウェア資産は、エミュレーションにより、現在のオープンサーバによって実行することができるので、メインフレーム用の膨大なソフトウェア資産を有効活用することができる。ただし、ソフトウェアをエミュレーションにより実行する場合、そのソフトウェアをそのまま実行する場合よりも、実行速度が低下する。したがって、エミュレーションによるソフトウェアの実行を高速化する技術に対する期待が高まってきている。
【０００４】
このような技術に関連する技術として、特許文献１には、コンパイルプロセッサと、エミュレーションプロセッサと、を具備したエミュレーションシステムが開示されている。このシステムにおけるコンパイルプロセッサは、ターゲットコードから命令を読み出して解析し、その命令に対してエミュレーションを行うためのホストコードを生成する。エミュレーションプロセッサは、コンパイルプロセッサによりホストコードが生成されているコンパイルモードにおいて、ホストコードを実行する。そして、エミュレーションプロセッサは、コンパイルプロセッサによりホストコードが生成されていないインタプリタモードにおいて、次のターゲットコードから命令を読み出して解析し、その命令に対するエミュレーションを実行する。
【０００５】
また、特許文献２には、プログラムの実行過程においてメソッドを呼び出す際に、当該メソッドが未コンパイルであるか否かを判定するプログラム実行制御装置が開示されている。この装置は、当該メソッドが未コンパイルであれば、当該メソッドのバイトコードをインタプリタ処理で実行すると共に当該メソッドをコンパイルする要求を行い、コンパイル済であれば、当該メソッドのネイティブコードを実行する。この装置は、コンパイル要求されたメソッドのコンパイルを、バイトコードのインタプリタ処理による実行又はネイティブコードの実行といった命令実行を行うタスクとは別のタスクにより行う。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開2010-140233公報
【特許文献２】特許第4713820号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
特許文献１及び特許文献２に開示されているように、実行対象であるソフトウェアに対するコンパイル処理とインタプリタ処理とを併用することによって、エミュレーションによる当該ソフトウェアの実行を高速化することができる。この場合、特にコンパイル処理による高速化への影響は大きいが、特許文献１及び特許文献２に開示された構成では、コンパイル処理による高速化が十分であるとは言えず、コンパイル処理による高速化をさらに高めることが課題である。本願発明の主たる目的は、この課題を解決するエミュレーション装置等を提供することである。
【課題を解決するための手段】
【０００８】
本願発明の一態様に係るエミュレーション装置は、エミュレーション実行対象ソフトウェアに含まれる、命令種別とオペランドとを内包する命令情報と、前記命令情報がエミュレーション可能にコンパイルされたコンパイル済命令情報と、前記コンパイル済命令情報の格納アドレスを示す情報とが、関連付けられて記憶された記憶手段と、前記命令情報を、前記命令情報に関連付けられた前記コンパイル済命令情報を前記格納アドレスから呼び出すサブルーチン読み出し命令情報に変換することによって、前記エミュレーション実行対象ソフトウェアを、エミュレーション可能にコンパイルしたコンパイル済ソフトウェアを生成する生成手段と、を備える。
【０００９】
上記目的を達成する他の見地において、本願発明の一態様に係るエミュレーション方法は、エミュレーション実行対象ソフトウェアに含まれる、命令種別とオペランドとを内包する命令情報と、前記命令情報がエミュレーション可能にコンパイルされたコンパイル済命令情報と、前記コンパイル済命令情報の格納アドレスを示す情報とが、関連付けられて、記憶手段に記憶されている場合に、情報処理装置によって、前記命令情報を、前記命令情報に関連付けられた前記コンパイル済命令情報を前記格納アドレスから呼び出すサブルーチン読み出し命令情報に変換することによって、前記エミュレーション実行対象ソフトウェアを、エミュレーション可能にコンパイルしたコンパイル済ソフトウェアを生成する。
【００１０】
また、上記目的を達成する更なる見地において、本願発明の一態様に係るエミュレーションプログラムは、エミュレーション実行対象ソフトウェアに含まれる、命令種別とオペランドとを内包する命令情報と、前記命令情報がエミュレーション可能にコンパイルされたコンパイル済命令情報と、前記コンパイル済命令情報の格納アドレスを示す情報とが、関連付けられて記憶された記憶手段にアクセス可能なコンピュータに、前記命令情報を、前記命令情報に関連付けられた前記コンパイル済命令情報を前記格納アドレスから呼び出すサブルーチン読み出し命令情報に変換することによって、前記エミュレーション実行対象ソフトウェアを、エミュレーション可能にコンパイルしたコンパイル済ソフトウェアを生成する生成処理をコンピュータに実行させるためのプログラムである。
【００１１】
更に、本願発明は、係るエミュレーションプログラム（コンピュータプログラム）が格納された、コンピュータ読み取り可能な、不揮発性の記録媒体によっても実現可能である。
【発明の効果】
【００１２】
本願発明は、エミュレーションによるソフトウェアの実行を高速化することを可能とする。
【図面の簡単な説明】
【００１３】
【図１】本願発明の第１の実施形態に係るエミュレーション装置１の構成を示すブロック図である。
【図２】本願発明の第１の実施形態に係るエミュレーション装置１がエミュレーションを実行する過程において、参照あるいは生成する情報の関係を例示する図である。
【図３】本願発明の第１の実施形態に係るエミュレーション装置１における、命令情報３１００とエミュレーションコード群３３２との関係を例示する図である。
【図４】本願発明の第１の実施形態に係るリクエストバッファ３４２０の構成を例示する図である。
【図５】本願発明の第１の実施形態に係る命令情報管理テーブル３４２１の構成を例示する図である。
【図６】本願発明の第１の実施形態に係るコンパイルエミュレーションコード管理テーブル３４２２−０００乃至３４２２−２５５の構成を例示する図である。
【図７Ａ】本願発明の第１の実施形態に係るエミュレーション装置１におけるエミュレーションプロセッサ２０の動作を示すフローチャート（１／２）である。
【図７Ｂ】本願発明の第１の実施形態に係るエミュレーション装置１におけるエミュレーションプロセッサ２０の動作を示すフローチャート（２／２）である。
【図８Ａ】本願発明の第１の実施形態に係るエミュレーション装置１におけるコンパイルプロセッサ１０の全体動作を示すフローチャート（１／２）である。
【図８Ｂ】本願発明の第１の実施形態に係るエミュレーション装置１におけるコンパイルプロセッサ１０の全体動作を示すフローチャート（２／２）である。
【図９Ａ】本願発明の第１の実施形態に係るエミュレーション装置１におけるコンパイルプロセッサ１０がコンパイル済ソフトウェアを生成する詳細動作を示すフローチャート（１／２）である。
【図９Ｂ】本願発明の第１の実施形態に係るエミュレーション装置１におけるコンパイルプロセッサ１０がコンパイル済ソフトウェアを生成する詳細動作を示すフローチャート（２／２）である。
【図１０】本願発明の第２の実施形態に係るエミュレーション装置２の構成を示すブロック図である。
【図１１Ａ】本願発明の第２の実施形態に係るエミュレーション装置１における最適化プロセッサ６０の動作を示すフローチャート（１／２）である。
【図１１Ｂ】本願発明の第２の実施形態に係るエミュレーション装置１における最適化プロセッサ６０の動作を示すフローチャート（２／２）である。
【図１２】本願発明の第３の実施形態に係るエミュレーション装置３の構成を示すブロック図である。
【発明を実施するための形態】
【００１４】
以下、本願発明の実施の形態について図面を参照して詳細に説明する。
【００１５】
＜第１の実施形態＞
図１は、本願発明の第１の実施の形態に係るエミュレーション装置１の構成を概念的に示すブロック図である。エミュレーション装置１は、ソフトウェアに対するエミュレーションを実行可能な、例えばサーバ装置等の情報処理装置である。
【００１６】
本実施形態に係るエミュレーション装置１は、構成要素として下記を備えている。
・コンパイルプロセッサ１０、
・エミュレーションプロセッサ２０、
・主記憶３０、
・入出力プロセッサ４０、
・システムバス５０、
・入出力Ｉ／Ｆ（インタフェース）４１、
・通信Ｉ／Ｆ４２、
・ハードディスク４３、
・リーダライタ４４。
【００１７】
図１に示す通り、コンパイルプロセッサ１０、エミュレーションプロセッサ２０、及び、入出力プロセッサ４０は、システムバス５０を介して、主記憶３０と通信可能に接続され、主記憶３０に記憶されたコンピュータプログラムを読み出して実行する。コンパイルプロセッサ１０、エミュレーションプロセッサ２０、及び、入出力プロセッサ４０は、コンピュータプログラムを実行する際に必要なデータを主記憶３０から読み出し、その実行結果を主記憶３０に書き込む。主記憶３０は、例えば、ＲＡＭ（Random Access Memory）等により構成された読み書き可能な記憶デバイスである。
【００１８】
入出力プロセッサ４０は、入出力Ｉ／Ｆ４１、通信Ｉ／Ｆ４２、ハードディスク４３、及び、リーダライタ４４と通信可能に接続されている。入出力Ｉ／Ｆ４１は、例えば、キーボード、マウス、モニタ装置など、情報の入出力を行うデバイスである。入出力プロセッサ４０は、例えば、ＣＤ−ＲＯＭ等の各種記録媒体４５に記録されたコンピュータプログラムやデータを、リーダライタ４４を介して読み込んだのち、読み込んだコンピュータプログラムやデータを、主記憶３０に格納する。入出力プロセッサ４０は、あるいは、インターネット等の通信回線に接続された通信Ｉ／Ｆ４２を介して、主記憶３０に格納するコンピュータプログラムやデータを、外部からダウンロードしてもよい。
【００１９】
本願では、エミュレーション装置１がエミュレーションを行う対象とするソフトウェアに含まれる命令コード（すなわち、エミュレーション装置１とはアーキテクチャが異なる情報処理装置が実行可能な命令コード）を、ターゲットコードと定義することとする。本願では、また、エミュレーション装置１がそのまま実行可能な命令コードを、ホストコードと定義することとする。
【００２０】
本実施形態に係る主記憶３０は、アドレス空間（記憶領域）として、ターゲットコード空間３１、ターゲットデータ空間３２、ホストコード空間３３、及び、ホストデータ空間３４を有している。
【００２１】
ターゲットコード空間３１は、ターゲットコードによって構成されたソフトウェア（プログラム）が記憶される主記憶３０のアドレス空間であり、エミュレーション実行対象ソフトウェア３１０が記憶されている。エミュレーション実行対象ソフトウェア３１０は、エミュレーション装置１がエミュレーションを行う対象とするソフトウェアである。
【００２２】
ターゲットデータ空間３２は、ターゲットコードによって構成されたデータが記憶される主記憶３０のアドレス空間であり、エミュレーション実行対象ソフトウェア用データ３２０が記憶されている。エミュレーション実行対象ソフトウェア用データ３２０は、エミュレーション実行対象ソフトウェア３１０の実行において入力あるいは出力されるデータである。
【００２３】
ホストコード空間３３は、ホストコードによって構成されたソフトウェアが記憶される主記憶３０のアドレス空間であり、コンパイルプログラム３３０、エミュレーションプログラム３３１、エミュレーションコード群３３２、及び、コンパイル済ソフトウェア群３３３が記憶されている。コンパイルプログラム３３０は、エミュレーション実行対象ソフトウェア３１０をコンパイルすることによって、コンパイル結果であるソフトウェアを生成する処理（生成処理）を行うプログラムであり、コンパイルプロセッサ１０によって実行される。エミュレーションプログラム３３１は、エミュレーション実行対象ソフトウェア３１０に対するエミュレーションを行う処理（実行処理）を行うプログラムであり、エミュレーションプロセッサ２０によって実行される。
【００２４】
エミュレーションコード群３３２は、エミュレーション実行対象ソフトウェア３１０に含まれる命令情報ごとに、ホストコードによって記載された、サブルーチンプログラム群である。エミュレーションコード群３３２は、また、エミュレーション実行対象ソフトウェア３１０に対するエミュレーションをインタプリタ方式による処理（インタプリタ処理）によって行う場合に使用される、ホストコードによって記載されたプログラムも含んでいる。コンパイル済ソフトウェア群３３３は、エミュレーション実行対象ソフトウェア３１０の少なくとも一部分が、エミュレーション可能にコンパイルされた結果であるプログラム群である。
【００２５】
ホストデータ空間３４は、ホストコードによって構成されたデータが記憶される主記憶３０のアドレス空間であり、コンパイルプログラム用データ３４０、エミュレーションプログラム用データ３４１、プロセッサ間Ｉ／Ｆ（インタフェース）用データ３４２、及び、コンパイル済ソフトウェア管理情報３４３が記憶されている。コンパイルプログラム用データ３４０は、コンパイルプログラム３３０の実行において入力あるいは出力されるデータである。エミュレーションプログラム用データ３４１は、エミュレーションプログラム３３１の実行において入力あるいは出力されるデータである。
【００２６】
プロセッサ間Ｉ／Ｆ用データ３４２は、コンパイルプロセッサ１０とエミュレーションプロセッサ２０とが連携して、エミュレーション実行対象ソフトウェア３１０に対するエミュレーションを行う場合に、これらのプロセッサの間で入出力されるデータである。コンパイル済ソフトウェア管理情報３４３は、コンパイル済ソフトウェア群３３３に含まれる個々のコンパイル済ソフトウェアを管理するための情報（データ）である。
【００２７】
上述した主記憶３０に記憶される個々のソフトウェアやデータの詳細については、必要に応じて後述することとする。
【００２８】
以下、第１の実施形態に係るエミュレーションプロセッサ２０、及び、コンパイルプロセッサ１０について詳細に説明する。
【００２９】
（エミュレーションプロセッサ２０）
本実施形態に係るエミュレーションプロセッサ２０は、主記憶３０からエミュレーションプログラム３３１を読み出して実行することによって、エミュレーション実行対象ソフトウェア３１０に対するエミュレーションを行う。
【００３０】
図２は、本実施形態に係るエミュレーション装置１がエミュレーションを実行する過程において、参照あるいは生成する情報の関係を例示する図である。エミュレーションプロセッサ２０は、エミュレーション実行対象ソフトウェア３１０における、命令ポインタ３４１０が示すアドレスから、命令情報を入手して、入手した命令情報をエミュレーションにより実行する。命令ポインタ３４１０は、エミュレーションプロセッサ２０がエミュレーション実行対象ソフトウェア３１０に対するエミュレーションを行う際に、エミュレーション実行対象ソフトウェア３１０における現在の実行場所（アドレス）を示すポインタである。命令ポインタ３４１０は、エミュレーションプログラム用データ３４１に含まれるデータである。
【００３１】
本実施形態では、エミュレーション実行対象ソフトウェア３１０に含まれる、１以上の命令を含む命令列は、コンパイルプロセッサ１０によってコンパイルされ、コンパイルされた結果は、コンパイル済ソフトウェア群３３３として主記憶３０に記憶される。図２に示す例では、エミュレーション実行対象ソフトウェア３１０に含まれる連続する命令である、命令Ｘ、命令Ｙ、及び、命令Ｚにより構成される命令列がコンパイルされた結果は、コンパイル済ソフトウェア３３３−１として主記憶３０に記憶されている。図２に示す例では、コンパイル済ソフトウェア群３３３は、コンパイル済ソフトウェア３３３−１乃至３３３−ｎ（ｎは任意の自然数）を含んでいる。
【００３２】
エミュレーションプロセッサ２０は、図２に例示する、命令Ｘ、命令Ｙ、及び、命令Ｚにより構成される命令列に対するエミュレーションを行う場合、主記憶３０から、コンパイル済ソフトウェア３３３−１を読み出し、読み出したコンパイル済ソフトウェア３３３−１を実行する。
【００３３】
エミュレーションプロセッサ２０は、エミュレーション実行対象ソフトウェア３１０に対するエミュレーションを、エミュレーション実行対象ソフトウェア３１０に含まれる命令を、１命令ずつ順番に解析することによって実行するインタプリタ形式により実行することができる。したがって、エミュレーションプロセッサ２０は、コンパイル済ソフトウェア３３３−１が主記憶３０に記憶されていない場合は、図２に例示する、命令Ｘ、命令Ｙ、及び、命令Ｚにより構成される命令列に対するエミュレーションを、インタプリタ形式により実行する。
【００３４】
図２に例示するコンパイル済ソフトウェア管理情報３４３は、コンパイル済ソフトウェア３３１−１乃至３３３−ｎについて、それらの格納アドレスと、エミュレーション実行対象ソフトウェア３１０における実行開始アドレスとを関連付ける情報である。図２に例示するコンパイル済ソフトウェア管理情報３４３は、例えば、エミュレーション実行対象ソフトウェア３１０におけるアドレス１に位置する命令Ｘから始まる命令列に関するコンパイル済ソフトウェア３３３−１が格納されているアドレスを示している。したがって、エミュレーションプロセッサ２０は、コンパイル済ソフトウェア管理情報３４３を参照することによって、エミュレーション実行対象ソフトウェア３１０において、命令ポインタ３４１０が示すアドレスから始まる命令列に対するコンパイル済ソフトウェアが、コンパイル済ソフトウェア群３３３として主記憶３０に記憶されているか否かを確認することができる。
【００３５】
図３は、本実施形態に係るエミュレーション装置１における、命令情報３１００とエミュレーションコード群３３２との関係を例示する図である。命令情報３１００は、エミュレーション実行対象ソフトウェア３１０に含まれる個々の命令（例えば、図２に例示する命令Ｘ、命令Ｙ、命令Ｚ等）の内容を示す情報である。命令情報３１００は、図３に例示するとおり、命令コード（命令種別）、Ｒｅｇ（レジスタ）、及び、Ｉｍｍ（即値）を含んでいる。命令コード、Ｒｅｇ、及び、Ｉｍｍは、例えば順に、８ビット、４ビット、及び、４ビットの情報である。Ｒｅｇ及びＩｍｍは、命令の処理対象である情報（オペランド）である。Ｒｅｇは、プロセッサ内のレジスタを識別する情報である。
【００３６】
エミュレーションコード群３３２は、エミュレーションプロセッサ２０が、エミュレーション実行対象ソフトウェア３１０に含まれる命令に対するエミュレーションを実行するときに使用する、ホストコードによって構成されたプログラム（ソフトウェア）群である。エミュレーションコード群３３２は、命令コード「０ｘ００」に関する、命令０ｘ００のコンパイルエミュレーションコード３３２０００−０００乃至３３２０００−２５５、及び、命令０ｘ００のインタプリタエミュレーションコード３３２０００−２５６を含んでいる。但し、「０ｘ」は、１６進数表記を表す記号である。エミュレーションコード群３３２は、命令コード「０ｘＦＦ」に関する、命令０ｘＦＦのコンパイルエミュレーションコード３３２２５５−０００乃至３３２２５５−２５５、及び、命令０ｘＦＦのインタプリタエミュレーションコード３３２２５５−２５６を含んでいる。エミュレーションコード群３３２は、命令コード「０ｘ０１」乃至「０ｘＦＥ」に関しても、同様に、コンパイルエミュレーションコード及びインタプリタエミュレーションコードを含んでいる。
【００３７】
命令０ｘ００のコンパイルエミュレーションコード３３２０００−０００は、命令コードが「０ｘ００」であり、オペランドが「０ｘ００」である命令情報３１００に対するエミュレーションを行うための、コンパイルされたプログラムである。命令０ｘ００のコンパイルエミュレーションコード３３２０００−２５５は、命令コードが「０ｘ００」であり、オペランドが「０ｘＦＦ」である命令情報３１００に対するエミュレーションを行うための、コンパイルされたプログラムである。命令０ｘ００のインタプリタエミュレーションコード３３２０００−２５６は、命令コードが「０ｘ００」である命令情報３１００に対して、インタプリタ形式によりエミュレーションを実行するためのプログラムである。エミュレーションコード群３３２に含まれる、命令０ｘ０１乃至０ｘＦＦに関するコンパイルエミュレーションコード及びインタプリタエミュレーションコードについても、上述した命令０ｘ００に関するエミュレーションコードと同様である。
【００３８】
エミュレーションプロセッサ２０は、図２に例示するコンパイル済ソフトウェア３３３−１を実行する場合、命令Ｘのコンパイルエミュレーションコードを読み出すＣａｌｌ命令（サブルーチン読み出し命令）によって指定された、エミュレーションコード群３３２におけるいずれかのコンパイルエミュレーションコードを読み出して実行する。エミュレーションプロセッサ２０は、命令Ｙ及び命令Ｚに対しても同様な処理を行ったのち、コンパイル済ソフトウェア３３３−１の実行終了を指示するｒｅｔ命令（復帰命令）を実行する。
【００３９】
エミュレーションプロセッサ２０は、エミュレーション実行対象ソフトウェア３１０において、命令ポインタ３４１０が示すアドレスから始まる命令列に対するコンパイル済ソフトウェアが、コンパイル済ソフトウェア群３３３として主記憶３０に記憶されていない場合、コンパイルプロセッサ１０に対して、当該命令列に対するコンパイルの実行を指示する。エミュレーションプロセッサ２０は、その指示を、図１に示すプロセッサ間Ｉ／Ｆ用データ３４２に含まれるリクエストバッファ３４２０を介して行う。
【００４０】
図４は、本実施形態に係るリクエストバッファ３４２０の構成を概念的に例示する図である。リクエストバッファ３４２０は８個のエントリ０乃至７を備え、エントリごとに、「エミュレーション実行対象ソフトウェア３１０におけるコンパイル開始アドレス」と、「有効フラグ」とを関連付けて記憶している。尚、リクエストバッファ３４２０が備えるエントリの数は８個に限定されない。
【００４１】
リクエストバッファ３４２０における有効フラグは、エントリに格納された情報が有効か否かを示す情報であり、「０ｘＦＦ」の場合は有効であり、「０ｘ００」である場合は無効である（即ち未使用エントリである）ことを示す。エミュレーションプロセッサ２０は、例えば、図２に例示する命令Ｘから始まる命令列に対するコンパイルをコンパイルプロセッサ１０に指示する場合、有効フラグが「０ｘ００」であるいずれかの未使用エントリに、エミュレーション実行対象ソフトウェア３１０において命令Ｘが位置するアドレスを登録し、当該エントリの有効フラグを「０ｘＦＦ」に設定する。リクエストバッファ３４２０におけるエントリが全て有効である場合は、エミュレーションプロセッサ２０は、当該命令列に対するコンパイルをコンパイルプロセッサ１０に指示しない。
【００４２】
エミュレーションプロセッサ２０は、エミュレーション実行対象ソフトウェア３１０において、命令ポインタ３４１０が示すアドレスから始まる命令列に対するコンパイル済ソフトウェアが、コンパイル済ソフトウェア群３３３として主記憶３０に記憶されていない場合、当該命令列に対するエミュレーションを、インタプリタ形式により実行する。エミュレーションプロセッサ２０は、その際、プロセッサ間Ｉ／Ｆ用データ３４２に含まれる命令情報管理テーブル３４２１を参照する。
【００４３】
図５は、本実施形態に係る命令情報管理テーブル３４２１の構成を概念的に例示する図である。命令情報管理テーブル３４２１は、「命令コード」と、「命令長」と、「コンパイルエンドフラグ」と、「インタプリタエミュレーションコードアドレス」と、「オペランドフィールド」と、「コンパイルエミュレーションコード管理テーブルアドレス」と、を関連付ける情報である。図２に例示する命令Ｘの命令コードが例えば「０ｘＸＸ」である場合、エミュレーションプロセッサ２０は、命令情報管理テーブル３４２１によって示される、命令０ｘＸＸのインタプリタエミュレーションコード３３２ＸＸＸ−２５６の格納アドレスから、インタプリタエミュレーションコード３３２ＸＸＸ−２５６を読み込んで実行する。図５に例示する命令情報管理テーブル３４２１は、命令Ｘの命令長が２バイトであることを示している。したがって、エミュレーションプロセッサ２０は、命令ポインタ３４１０が示す値に２バイトを加算したのち、命令Ｘに後続する命令である命令Ｙに対するエミュレーションを実行する。
【００４４】
（コンパイルプロセッサ１０）
図１に示す本実施形態に係るコンパイルプロセッサ１０は、エミュレーションプロセッサ２０によってリクエストバッファ３４２０に登録された情報にしたがって、エミュレーション実行対象ソフトウェア３１０に含まれる命令列に対するコンパイルを実行する。コンパイルプロセッサ１０は、例えば定期的にリクエストバッファ３４２０に対するポーリングを行ってもよい。その場合、エミュレーションプロセッサ２０は、コンパイルプロセッサ１０に対してコンパイル処理を要求する通信を行う必要はない。コンパイルプロセッサ１０は、あるいは、リクエストバッファ３４２０に登録されたコンパイル要求に対するコンパイル処理を全て完了した後、アイドル状態に推移するようにしてもよい。この場合、エミュレーションプロセッサ２０は、コンパイルプロセッサ１０に対してコンパイル処理を要求する通信を行う必要がある。
【００４５】
コンパイルプロセッサ１０は、図４に例示するリクエストバッファ３４２０において、有効フラグが「０ｘＦＦ」であるエントリに格納されたコンパイル開始アドレスにより示される、エミュレーション実行対象ソフトウェア３１０における命令を読み出して、当該命令に対するコンパイルを実行する。この際、コンパイルプロセッサ１０は、図５に例示する命令情報管理テーブル３４２１を参照する。コンパイルプロセッサ１０は、例えば命令コードが「０ｘＸＸ」である命令Ｘに対するコンパイルを行う場合、命令情報管理テーブル３４２１によって示される「命令０ｘＸＸのコンパイルエミュレーションコード管理テーブル３４２２−ＸＸＸの格納アドレス」を入手する。
【００４６】
図６は、実施形態に係るコンパイルエミュレーションコード管理テーブル３４２２−０００乃至３４２２−２５５の構成を概念的に例示する図である。コンパイルエミュレーションコード管理テーブル３４２２−０００は、命令コードが「０ｘ００」である命令に関するテーブルであり、コンパイルエミュレーションコード管理テーブル３４２２−２５５は、命令コードが「０ｘＦＦ」である命令に関するテーブルである。コンパイルエミュレーションコード管理テーブル３４２２−０００乃至３４２２−２５５は、「オペランド」と、「コンパイルエミュレーションコードアドレス」と、「コンパイルエミュレーションコードサイズ」とを関連付ける情報である。
【００４７】
コンパイルプロセッサ１０は、命令Ｘに対するコンパイルを行う場合、命令Ｘのオペランドが示す値に応じて、コンパイルエミュレーションコード管理テーブル３４２２−ＸＸＸによって示される、命令０ｘＸＸのコンパイルエミュレーションコード３３２ＸＸＸ−ｉ（ｉはオペランドによって特定される０乃至２５５のいずれかの整数）の格納アドレスを入手する。コンパイルプロセッサ１０は、入手した当該格納アドレスを呼び出すＣａｌｌ命令を、図２に例示するコンパイル済ソフトウェア３３３−１として生成する。
【００４８】
コンパイルプロセッサ１０は、図５に例示する命令情報管理テーブル３４２１を参照し、命令０ｘＸＸの「コンパイルエンドフラグ」を確認する。コンパイルエンドフラグは、後続する命令に対するコンパイルを続いて行うか否かを示すフラグである。コンパイルエンドフラグが示す値が「ＣＯＮＴＩＮＵＥ」である場合は、後続する命令に対するコンパイルを続いて行うことを示し、その値が「ＥＮＤ」である場合は、その命令にてコンパイルを終了することを示す。一般的に、分岐命令に関するコンパイルエンドフラグは「ＥＮＤ」に設定され、分岐命令を除く命令のコンパイルエンドフラグは「ＣＯＮＴＩＮＵＥ」に設定されている。コンパイルプロセッサ１０は、命令０ｘＸＸの「コンパイルエンドフラグ」が「ＣＯＮＴＩＮＵＥ」であることを確認したのち、命令０ｘＸＸの命令長である２バイトをコンパイル開始アドレスに加算することによって、エミュレーション実行対象ソフトウェア３１０に含まれる命令Ｙを読み出し、命令Ｙに対するコンパイル処理を、命令Ｘのときと同様に行う。
【００４９】
図２に例示するとおり、命令Ｙは分岐命令ではないので、コンパイルプロセッサ１０は、命令Ｙに後続する命令Ｚを読み出し、命令Ｚに対するコンパイル処理を、命令Ｘ及び命令Ｙのときと同様に行う。図２に例示するとおり、命令Ｚは分岐命令であるので、コンパイルプロセッサ１０は、命令情報管理テーブル３４２１において、命令Ｚに関する「コンパイルエンドフラグ」が「ＥＮＤ」であることを確認する。コンパイルプロセッサ１０は、命令Ｚのコンパイルエミュレーションコードの格納アドレスを呼び出すＣａｌｌ命令を、コンパイル済ソフトウェア３３３−１に追加する。コンパイルプロセッサ１０は、続いて、命令Ｚに関するＣａｌｌ命令に後続する命令として、ｒｅｔ命令（復帰命令）をコンパイル済ソフトウェア３３３−１に追加し、コンパイル済ソフトウェア３３３−１を生成する処理を終了する。
【００５０】
コンパイルプロセッサ１０は、生成したコンパイル済ソフトウェア３３３−１を主記憶３０に格納し、その格納アドレスを、エミュレーション実行対象ソフトウェア３１０における命令Ｘのアドレスと関連付けて、図２に例示するコンパイル済ソフトウェア管理情報３４３へ登録する。コンパイルプロセッサ１０は、エミュレーション装置１における他のプロセッサとの間で、コンパイル済ソフトウェア管理情報３４３を排他的に更新するために、コンパイル済ソフトウェア管理情報３４３をロックしてから更新処理を実行し、更新処理が完了したのちに、コンパイル済ソフトウェア管理情報３４３をアンロックする。
【００５１】
次に図７乃至図９のフローチャートを参照して、第１の実施形態に係るエミュレーション装置１の動作（処理）について詳細に説明する。
【００５２】
図７Ａ及び７Ｂは、本実施形態に係るエミュレーションプロセッサ２０の動作を示すフローチャートである。
【００５３】
エミュレーションプロセッサ２０は、エミュレーション実行対象ソフトウェア３１０における、命令ポインタ３４１０が示すアドレスから、命令情報を入手する（ステップＳ１０１）。当該命令情報が分岐命令を示さない場合（ステップＳ１０２でＮｏ）、エミュレーションプロセッサ２０は、当該命令情報により特定されるインタプリタエミュレーションコードを使用することによって、エミュレーションを実行する（ステップＳ１０３）。エミュレーションプロセッサ２０は、命令ポインタ３４１０を更新し（ステップＳ１０４）、処理はステップＳ１０１へ戻る。
【００５４】
当該命令情報が分岐命令を示す場合（ステップＳ１０２でＹｅｓ）、エミュレーションプロセッサ２０は、ステップＳ１０３及びステップＳ１０４と同様の処理を行う（ステップＳ１０５）。エミュレーションプロセッサ２０は、リクエストバッファ３４２０に空きエントリ（未使用エントリ）があるか確認する（ステップＳ１０６）。空きエントリが無い場合（ステップＳ１０７でＮｏ）、処理はステップＳ１０１へ戻る。
【００５５】
空きエントリがある場合（ステップＳ１０７でＹｅｓ）、エミュレーションプロセッサ２０は、コンパイル済ソフトウェア管理情報３４３をロックする（ステップＳ１０８）。エミュレーションプロセッサ２０は、コンパイル済ソフトウェア管理情報３４３に、命令ポインタ３４１０が示す値が登録されているか確認する（ステップＳ１０９）。エミュレーションプロセッサ２０は、コンパイル済ソフトウェア管理情報３４３をアンロックする（ステップＳ１１０）。
【００５６】
命令ポインタ３４１０が示す値が登録されている場合（ステップＳ１１１でＹｅｓ）、エミュレーションプロセッサ２０は、命令ポインタ３４１０が示す値に関連付けられたコンパイル済ソフトウェア３３３−ｉを実行することによってエミュレーションを実行し（ステップＳ１１２）、処理はステップＳ１０８へ戻る。
【００５７】
命令ポインタ３４１０が示す値が登録されていない場合（ステップＳ１１１でＮｏ）、エミュレーションプロセッサ２０は、リクエストバッファ３４２０における空きエントリに、命令ポインタが示す値をコンパイル開始アドレスとしてセットし、その有効フラグを「０ｘＦＦ」にセットする（ステップＳ１１３）。エミュレーションプロセッサ２０は、コンパイルプロセッサ１０に、コンパイル要求を送信し（ステップＳ１１４）、処理はステップＳ１０１へ戻る。
【００５８】
図８Ａ及び８Ｂは、本実施形態に係るエミュレーション装置１におけるコンパイルプロセッサ１０の全体動作を示すフローチャートである。
【００５９】
コンパイルプロセッサ１０は、エミュレーションプロセッサ２０から、コンパイル要求を受信する（ステップＳ２０１）。コンパイルプロセッサ１０は、リクエストバッファ３４２０の有効フラグを確認する（ステップＳ２０２）。有効フラグが全て「０ｘ００」である場合（ステップＳ２０３でＹｅｓ）、コンパイルプロセッサ１０は、アイドル状態に推移して（ステップＳ２１３）、全体の処理は終了する。
【００６０】
有効フラグの少なくともいずれかが「０ｘ００」でない（すなわち、有効フラグの少なくともいずれかが「０ｘＦＦ」である）場合（ステップＳ２０３でＮｏ）、コンパイルプロセッサ１０は、コンパイル済ソフトウェア管理情報３４３をロックする（ステップＳ２０４）。コンパイルプロセッサ１０は、コンパイル済ソフトウェア管理情報３４３に、有効フラグが「０ｘＦＦ」であるエントリに格納されたコンパイル開始アドレスと等しいアドレスがあるか確認する（ステップＳ２０５）。コンパイル済ソフトウェア管理情報３４３をアンロックする（ステップＳ２０６）。
【００６１】
コンパイル開始アドレスと等しいアドレスが、コンパイル済ソフトウェア管理情報３４３に登録されている場合（ステップＳ２０７でＹｅｓ）、コンパイルプロセッサ１０は、当該アドレスが登録されているリクエストバッファ３４２０のエントリの有効フラグをリセットし（ステップＳ２０８）、処理は、ステップＳ２０１へ戻る。
【００６２】
コンパイル開始アドレスと等しいアドレスが、コンパイル済ソフトウェア管理情報３４３に登録されていない場合（ステップＳ２０７でＹｅｓ）、コンパイルプロセッサ１０は、エミュレーション実行対象ソフトウェア３１０における、当該コンパイル開始アドレスから始まる部分をコンパイルしたコンパイル済ソフトウェア３３３−ｉを生成する（ステップＳ２０９）。コンパイルプロセッサ１０は、コンパイル済ソフトウェア管理情報３４３をロックする（ステップＳ２１０）。コンパイルプロセッサ１０は、コンパイル済ソフトウェア管理情報３４３に、当該コンパイル開始アドレスと、コンパイル済ソフトウェア３３３−ｉの格納アドレスとを関連付けて登録する（ステップＳ２１１）。コンパイルプロセッサ１０は、コンパイル済ソフトウェア管理情報３４３をアンロックし（ステップＳ２１２）、処理はステップＳ２０８へ戻る。
【００６３】
図９Ａ及び９Ｂは、本実施形態に係るエミュレーション装置１におけるコンパイルプロセッサ１０が、コンパイル済ソフトウェアを生成する詳細動作（図８におけるステップＳ２０９）を示すフローチャートである。
【００６４】
コンパイルプロセッサ１０は、エミュレーション実行対象ソフトウェア３１０におけるコンパイル開始アドレスの命令情報３１００を入手する（ステップＳ３０１）。コンパイルプロセッサ１０は、命令情報３１００に含まれる命令コードを、命令情報管理テーブル３４２１と照合し、コンパイルエミュレーションコード管理テーブルアドレスを入手する（ステップＳ３０２）。コンパイルプロセッサ１０は、入手したアドレスに格納されているコンパイルエミュレーションコード管理テーブルを参照する（ステップＳ３０３）。
【００６５】
コンパイルプロセッサ１０は、命令情報３１００に含まれるオペランドが示す値と関連付けされたコンパイルエミュレーションコードアドレスを入手する（ステップＳ３０４）。コンパイルプロセッサ１０は、当該コンパイルエミュレーションコードアドレスにあるコンパイルエミュレーションコードを呼び出すＣａｌｌ命令を含むコンパイル済ソフトウェア３３３−ｉを生成する（ステップＳ３０５）。コンパイルプロセッサ１０は、命令情報管理テーブル３４２１が示す、命令情報３１００に含まれる命令コードに関するコンパイルエンドフラグを確認する（ステップＳ３０６）。
【００６６】
コンパイルエンドフラグが「ＣＯＮＴＩＮＵＥ」である場合（ステップＳ３０７でＹｅｓ）、コンパイルプロセッサ１０は、命令情報管理テーブル３４２１が示す、命令情報３１００に含まれる命令コードに関する命令長を、コンパイル開始アドレスに加算し（ステップＳ３０８）、処理はステップＳ３０１へ戻る。コンパイルエンドフラグが「ＣＯＮＴＩＮＵＥ」でない（すなわち、「ＥＮＤ」である）場合（ステップＳ３０７でＮｏ）、コンパイルプロセッサ１０は、生成したコンパイル済ソフトウェアの最終行にｒｅｔ命令を挿入したのち、コンパイル済ソフトウェアを主記憶３０へ格納し（ステップＳ３０９）、ステップＳ２０９の処理は終了する。
【００６７】
本実施形態に係るエミュレーション装置１は、エミュレーションによるソフトウェアの実行を高速化することができる。その理由は、主記憶３０に、エミュレーション実行対象の命令情報と、エミュレーションコード群３３２と、エミュレーションコード群３３２の格納アドレスとが関連付けられて記憶され、コンパイルプロセッサ１０は、当該命令情報を、エミュレーションコードを呼び出すサブルーチン読み出し命令情報に変換することによって、エミュレーション実行対象をエミュレーション可能にコンパイルしたコンパイル済ソフトウェア群３３３を生成するからである。
【００６８】
以下に、本実施形態に係るエミュレーション装置１によって実現される効果について、詳細に説明する。
【００６９】
エミュレーションの実行対象であるソフトウェアに対するコンパイル処理とインタプリタ処理とを併用することによって、エミュレーションによる当該ソフトウェアの実行を高速化する技術が知られている。この技術において、コンパイル対象である命令ごとに事前に用意されたサイズが例えば数十バイト程度であるエミュレーションコードを、命令ごとにコピーすることによってコンパイル処理を行う場合、コピーするデータ量が非常に大きくなるので、コンパイル処理に要する時間が長くなる問題がある。すなわち、エミュレーションを実行する場合に、コンパイル処理による高速化をより高めることが課題である。
【００７０】
このような課題を解決するために、本実施形態に係るエミュレーション装置１では、主記憶３０に、エミュレーション実行対象ソフトウェア３１０に含まれる、命令種別とオペランドとを内包する命令情報３１００と、命令情報３１００がエミュレーション可能にコンパイルされたエミュレーションコード群３３２と、エミュレーションコード群３３２の格納アドレスを示す情報とが、関連付けられて記憶されている。そしてコンパイルプロセッサ１０は、命令情報３１００を、命令情報３１００に関連付けられたエミュレーションコードをその格納アドレスから呼び出すサブルーチン読み出し命令情報に変換することによって、エミュレーション実行対象ソフトウェア３１０を、エミュレーション可能にコンパイルしたコンパイル済ソフトウェア群３３３を生成する。すなわち、エミュレーション装置１は、コンパイル対象である命令ごとにエミュレーションコードをコピーするのではなく、コンパイル対象である命令を、当該エミュレーションコードを読み出すサブルーチン読み出し命令に変換することによってコンパイル処理を行う。したがって、本実施形態に係るエミュレーション装置１は、エミュレーションコードのコピーに時間を要することを回避することにより、エミュレーションによるソフトウェアの実行を高速化することができる。
【００７１】
また、本実施形態に係るエミュレーションコード群３３２は、命令情報３１００に含まれる命令種別が示す値とオペランドが示す値とに基づいて生成されたコード群である。すなわち、エミュレーションコード群３３２は、命令種別とオペランドの両方の値をふまえて最適にコンパイルされたコードであるので、例えば命令種別が示す値のみに基づいて生成されたコードと比較して、高速に実行される。したがって、本実施形態に係るエミュレーション装置１は、エミュレーションによるソフトウェアの実行を高速化することができる。
【００７２】
また、本実施形態に係るコンパイルプロセッサ１０は、エミュレーション実行対象ソフトウェア３１０において、分岐命令が発生するまでの命令列を単位として、１つのコンパイル済ソフトウェア３３３−ｉを生成する。分岐命令が発生するまでの命令列に含まれる命令は、エミュレーション実行対象ソフトウェア３１０におけるアドレス順に実行されるので、これらの命令は１つのコンパイル済ソフトウェアにまとめることができる。したがって、本実施形態に係るエミュレーション装置１は、コンパイル済ソフトウェア群３３３を効率的に生成することができる。
【００７３】
また、本実施形態に係る主記憶３０におけるホストデータ空間３４には、プロセッサ間Ｉ／Ｆ用データ３４２として、複数のエントリを有するリクエストバッファ３４２０が記憶されている。エミュレーションプロセッサ２０は、コンパイルプロセッサ１０に対してコンパイルを指示する際に、エミュレーション実行対象ソフトウェア３１０におけるコンパイル開始アドレスを、いずれかの空きエントリに登録し、当該エントリの有効フラグを有効にセットする。そして、コンパイルプロセッサ１０は、有効フラグが有効を示すエントリに登録されたコンパイル開始アドレスからコンパイル処理を開始する。すなわち、コンパイルプロセッサ１０は、エミュレーションプロセッサ２０によるエミュレーション実行処理と非同期かつ並列に、コンパイル処理を行うことができる。これにより、本実施形態に係るエミュレーション装置１は、エミュレーションによるソフトウェアの実行を高速化することができる。
【００７４】
尚、本実施形態に係るエミュレーション装置１は、コンパイルプログラム３３０を実行することによって生成処理を行うコンパイルプロセッサ１０と、エミュレーションプログラム３３１を実行することによって実行処理を行うエミュレーションプロセッサ２０とを備えるが、エミュレーション装置１を実現する構成は、上述した構成に限定されない。エミュレーション装置１は、例えば、生成処理を行う専用ハードウェアである生成部（生成手段）と、実行処理を行う専用ハードウェアである実行部（実行手段）とを備えてもよい。
【００７５】
＜第２の実施形態＞
図１０は、本願発明の第２の実施形態に係るエミュレーション装置２の構成を概念的に示すブロック図である。本実施形態の説明では、第１の実施形態と機能が同様である構成要素については、当該構成要素に対して、第１の実施形態と同じ番号を付与することによって、その詳細な説明を省略する。
【００７６】
本実施形態に係るエミュレーション装置２は、第１の実施形態に係るエミュレーション装置１が備える構成要素に加えて、最適化プロセッサ６０を備えている。そして、本実施形態に係る主記憶３０におけるホストコード空間３３には、第１の実施形態に係る主記憶３０に記憶されたコンパイルプログラム３３０に対して一部機能が追加されたコンパイルプログラム３３５が記憶されている。また、本実施形態に係るホストコード空間３３には、第１の実施形態に係る主記憶３０に記憶された情報に加えて、最適化プログラム３３４が記憶されている。また、本実施形態に係る主記憶３０におけるホストデータ空間３４には、第１の実施形態に係るコンパイル済ソフトウェア管理情報３４３に対して、コンパイル済ソフトウェア３３３−１乃至３３３−ｎの個々の実行回数を示す情報が追加された、コンパイル済ソフトウェア管理情報３４４が記憶されている。
【００７７】
コンパイルプログラム３３５は、エミュレーション実行対象ソフトウェア３１０をコンパイルすることによって、コンパイル結果であるソフトウェアを生成する処理（生成処理）を行うプログラムであり、コンパイルプロセッサ１０によって実行される。
【００７８】
本実施形態に係るコンパイルプロセッサ１０は、コンパイルプログラム３３５を実行することによって、第１の実施形態に係るコンパイルプロセッサ１０が行う処理に加えて、以下の処理を行う。すなわち、本実施形態に係るコンパイルプロセッサ１０は、図２に例示するコンパイル済ソフトウェア３３３−１乃至３３３−ｎを生成する際に、エミュレーションが実行される度にその実行回数を更新（カウント）し、更新した実行回数を、コンパイル済ソフトウェア管理情報３４４として記憶する動作を示す命令情報（コード）を、コンパイル済ソフトウェア３３３−１乃至３３３−ｎに組み込む。これにより、本実施形態に係るエミュレーションプロセッサ２０は、エミュレーション実行対象ソフトウェア３１０に対するエミュレーションを実行する際に、コンパイル済ソフトウェア３３３−１乃至３３３−ｎの個々について実行した回数を更新し、コンパイル済ソフトウェア管理情報３４４として主記憶３０に格納する。
【００７９】
最適化プログラム３３４は、エミュレーション装置２がエミュレーション実行対象ソフトウェア３１０に対するエミュレーションを実行する環境を最適化する（高速化する）ための処理である判定処理及び更新処理を行うプログラムであり、最適化プロセッサ６０によって実行される。
【００８０】
ここで、判定処理とは、コンパイル済ソフトウェア３３３−１乃至３３３−ｎの各々について、エミュレーションが実行された回数が基準を満たす否かを判定する処理のことである。この基準としては、例えば、「閾値以上であること」などがある。
【００８１】
上述した更新処理とは、判定処理によって、コンパイル済ソフトウェア３３３−ｉ（ｉは１乃至ｎのいずれかの整数）が実行された回数が基準を満たすと判定された場合に、コンパイル済ソフトウェア３３３−ｉにおいて、Ｃａｌｌ命令（サブルーチン読み出し命令）を、当該Ｃａｌｌ命令によって呼び出されるコンパイルエミュレーションコードに更新する処理のことである。例えば、更新処理は、図２に示すコンパイル済ソフトウェア３３３−１が実行された回数が閾値を越えた場合に、コンパイル済ソフトウェア３３３−１に対して、命令Ｘ、命令Ｙ、及び、命令Ｚのコンパイルエミュレーションコードを読み出すＣａｌｌ命令を、エミュレーションコード群３３２に含まれる、命令Ｘ、命令Ｙ、及び、命令Ｚのコンパイルエミュレーションコードそのものに置き換える。
【００８２】
次に図１１Ａ及び１１Ｂのフローチャートを参照して、第２の実施形態に係るエミュレーション装置２における最適化プロセッサ６０の動作（処理）について詳細に説明する。
【００８３】
最適化プロセッサ６０は、コンパイル済ソフトウェア管理情報３４４を参照することによって、コンパイル済ソフトウェア３３３−ｉ（ｉは１乃至ｎのいずれかの整数）について、エミュレーションが実行された回数を確認する（ステップＳ４０１）。回数が閾値未満である場合（ステップＳ４０２でＮｏ）、処理はステップＳ４０１へ戻る。
【００８４】
回数が閾値以上である場合（ステップＳ４０２でＹｅｓ）、最適化プロセッサ６０は、コンパイル済ソフトウェア３３３−ｉを、コンパイル済ソフトウェア管理情報３４４が示す格納アドレスから入手する（ステップＳ４０３）。最適化プロセッサ６０は、コンパイル済ソフトウェア３３３−ｉに含まれるＣａｌｌ命令文を検索する（ステップＳ４０４）。Ｃａｌｌ命令文が存在する場合（ステップＳ４０５でＹｅｓ）、最適化プロセッサ６０は、当該Ｃａｌｌ命令文を、当該Ｃａｌｌ命令文によって呼び出されるコンパイルエミュレーションコードに更新し（ステップＳ４０６）、処理はステップＳ４０４へ戻る。
【００８５】
Ｃａｌｌ命令文が存在しない場合（ステップＳ４０５でＮｏ）、最適化プロセッサ６０は、更新したコンパイル済ソフトウェア３３３−ｉを、主記憶３０へ格納する（ステップＳ４０７）。最適化プロセッサ６０は、コンパイル済ソフトウェア管理情報３４３をロックする（ステップＳ４０８）。最適化プロセッサ６０は、コンパイル済ソフトウェア管理情報３４３における、コンパイル済ソフトウェア３３３−ｉの格納アドレスを更新する（ステップＳ４０９）。最適化プロセッサ６０は、コンパイル済ソフトウェア管理情報３４３をアンロックし（ステップＳ４１０）、処理はステップＳ４０１へ戻る。
【００８６】
本実施形態に係るエミュレーション装置２は、エミュレーションによるソフトウェアの実行を高速化することができる。その理由は、第１の実施形態について説明した通りである。
【００８７】
また、第１の実施形態について説明した通り、コンパイル対象である命令ごとに、エミュレーションコードを読み出すサブルーチン読み出し命令に変換することによってコンパイル処理を行う場合、コンパイル処理の時間を短縮することができる。しかしながら、サブルーチン読み出し命令は、エミュレーションコードを読み出す処理を伴う分、その実行時間が長くなる。したがって、エミュレーションによって実行される回数が多い命令については、コンパイル処理によってサブルーチン読み出し命令に変換されたことが、エミュレーションによるソフトウェアの実行が遅くなる要因となる問題がある。
【００８８】
このような問題に対して、第２の実施形態に係るエミュレーション装置２では、コンパイルプロセッサ１０は、コンパイルプログラム３３５を実行することによって、エミュレーションによる実行回数をカウントして主記憶３０に記憶する機能を備えたコンパイル済ソフトウェア群３３３を生成する。これにより、エミュレーションプロセッサ２０によりコンパイル済ソフトウェア３３３−１乃至３３３−ｎの個々が実行された回数が、主記憶３０に記憶される。本実施形態に係る最適化プロセッサ６０は、コンパイル済ソフトウェア３３３−ｉが実行された回数が閾値以上である場合、コンパイル済ソフトウェア３３３−ｉに含まれるＣａｌｌ命令文を、当該Ｃａｌｌ命令文によって呼び出されるコンパイルエミュレーションコードに更新する。
【００８９】
すなわち、本実施形態に係るエミュレーション装置２は、実行回数が閾値未満である命令についてはＣａｌｌ命令文が組み込まれ、実行回数が閾値以上である命令については、その命令に関するエミュレーションコードがそのまま組み込まれた、コンパイル済ソフトウェア群３３３を生成する。したがって、本実施形態に係るエミュレーション装置２は、各命令のコンパイル処理の時間と、当該命令の実行時間とをバランスよく短縮することによって、エミュレーションによるソフトウェアの実行を高速化することができる。
【００９０】
尚、本実施形態に係るエミュレーション装置２は、最適化プログラム３３４を実行することによって、判定処理及び更新処理を行う最適化プロセッサ６０を備えるが、エミュレーション装置２を実現する構成は、上述した構成に限定されない。エミュレーション装置２は、例えば、判定処理を行う専用ハードウェアである判定部（判定手段）と、更新処理を行う専用ハードウェアである更新部（更新手段）とを備えてもよい。
【００９１】
＜第３の実施形態＞
図１２は、本願発明の第３の実施形態に係るエミュレーション装置３の構成を概念的に示すブロック図である。エミュレーション装置３は、記憶部７０、及び、生成部８０を備えている。
【００９２】
記憶部７０には、エミュレーション実行対象ソフトウェア７１に含まれる、命令種別７１１とオペランド７１２とを内包する命令情報７１０と、命令情報７１０がエミュレーション可能にコンパイルされたコンパイル済命令情報７２と、コンパイル済命令情報７２の格納アドレスを示す情報７３とが、関連付けられて記憶されている。
【００９３】
生成部８０は、命令情報７１０を、命令情報７１０に関連付けられたコンパイル済命令情報７２を格納アドレスを示す情報７３が示す格納アドレスから呼び出すサブルーチン読み出し命令情報に変換する。これにより、生成部８０は、エミュレーション実行対象ソフトウェア７１を、エミュレーション可能にコンパイルしたコンパイル済ソフトウェア８１を生成する。
【００９４】
本実施形態に係るエミュレーション装置３は、エミュレーションによるソフトウェアの実行を高速化することができる。その理由は、記憶部７０に、エミュレーション実行対象の命令情報７１０と、コンパイル済命令情報７２と、コンパイル済命令情報の格納アドレスを示す情報７３とが関連付けられて記憶され、生成部８０は、命令情報７１０を、コンパイル済命令情報７２を呼び出すサブルーチン読み出し命令情報に変換することによって、エミュレーション実行対象をエミュレーション可能にコンパイルしたコンパイル済ソフトウェア８１を生成するからである。
【００９５】
以上、上述した実施形態を模範的な例として本願発明を説明した。しかしながら、本願発明は、上述した実施形態には限定されない。即ち、本願発明は、本願発明のスコープ内において、当業者が理解し得る様々な態様を適用することができる。
【符号の説明】
【００９６】
１    エミュレーション装置
１０    コンパイルプロセッサ
２０    エミュレーションプロセッサ
３０    主記憶
３１    ターゲットコード空間
３１０    エミュレーション実行対象ソフトウェア
３１００    命令情報
３２    ターゲットデータ空間
３２０    エミュレーション実行対象ソフトウェア用データ
３３    ホストコード空間
３３０    コンパイルプログラム
３３１    エミュレーションプログラム
３３２    エミュレーションコード群
３３２０００−０００乃至３３２０００−２５５    コンパイルエミュレーションコード
３３２０００−２５６    インタプリタエミュレーションコード
３３２２５５−０００乃至３３２２５５−２５５    コンパイルエミュレーションコード
３３２２５５−２５６    インタプリタエミュレーションコード
３３３    コンパイル済ソフトウェア群
３３３−１乃至３３３−ｎ    コンパイル済ソフトウェア
３４    ホストデータ空間
３４０    コンパイルプログラム用データ
３４１    エミュレーションプログラム用データ
３４１０    命令ポインタ
３４２    プロセッサ間Ｉ／Ｆ用データ
３４２０    リクエストバッファ
３４２１    命令情報管理テーブル
３４２２−０００乃至３４２２−２５５    コンパイルエミュレーションコード管理テーブル
３４３    コンパイル済ソフトウェア管理情報
４０    入出力プロセッサ
４１    入出力Ｉ／Ｆ
４２    通信Ｉ／Ｆ
４３    ハードディスク
４４    リーダライタ
４５    記録媒体
５０    システムバス
２    エミュレーション装置
３３４    最適化プログラム
３３５    コンパイルプログラム
６０    最適化プロセッサ
３    エミュレーション装置
７０    記憶部
７１    エミュレーション実行対象ソフトウェア
７１０    命令情報
７１１    命令種別
７１２    オペランド
７２    コンパイル済命令情報
７３    格納アドレスを示す情報
８０    生成部
８１    コンパイル済ソフトウェア
【図１】
2018028777.tif 000003
【図２】
2018028777.tif 000004
【図３】
2018028777.tif 000005
【図４】
2018028777.tif 000006
【図５】
2018028777.tif 000007
【図６】
2018028777.tif 000008
【図７Ａ】
2018028777.tif 000009
【図７Ｂ】
2018028777.tif 000010
【図８Ａ】
2018028777.tif 000011
【図８Ｂ】
2018028777.tif 000012
【図９Ａ】
2018028777.tif 000013
【図９Ｂ】
2018028777.tif 000014
【図１０】
2018028777.tif 000015
【図１１Ａ】
2018028777.tif 000016
【図１１Ｂ】
2018028777.tif 000017
【図１２】
2018028777.tif 000018