(57)【要約】  動的コンパイラによるコンパイルの効率化を図り、プログラムを高速に実行すること。この課題を解決するために、インタプリタ（１１０）は、実行対象のプログラムから命令コードを取り出して、命令コードまたはコンパイル後の変換コードを実行する。また、インタプリタ（１１０）は、命令コードに対するライトプロテクションの設定・解除をし、ライトプロテクション違反の発生の有無をＷＰ管理テーブル（１４０）に記録する。ＷＰ管理テーブル（１４０）は、命令コードごとに過去にライトプロテクション違反が発生したか否かを記憶する。ＪＩＴコンパイラ（１５０）は、過去にライトプロテクション違反が発生していない命令コードについてはライトプロテクションを設定することを前提としたＷＰコードを生成し、過去にライトプロテクション違反が発生した命令コードについてはライトプロテクションを設定することを前提としない非ＷＰコードを生成する。
2008126299.tif 000002
【特許請求の範囲】
【請求項１】
プログラムの実行時に当該プログラムを構成する命令コードをコンパイルして変換コードを生成するコンパイル装置であって、
命令コードごとの実行回数が所定の閾値以上であるか否かを判定する判定手段と、
前記判定手段による判定の結果、実行回数が所定の閾値未満である命令コードを実行する実行手段と、
前記実行手段によって実行される命令コードに対する書き込み保護違反が発生するか否かを監視する監視手段と、
前記判定手段による判定の結果、実行回数が所定の閾値以上である命令コードから前記監視手段の監視結果に応じて異なる変換コードを生成する生成手段と
を有することを特徴とするコンパイル装置。
【請求項２】
前記生成手段は、
書き込み保護違反が発生した命令コードから、データの書き込み先が既にコンパイル済みであるか否かを判定する判定コードが埋め込まれた非ライトプロテクション方式の変換コードを生成することを特徴とする請求項１記載のコンパイル装置。
【請求項３】
前記生成手段は、
書き込み保護違反が発生しなかった命令コードを書き込み保護しつつ、この命令コードをコンパイルしてライトプロテクション方式の変換コードを生成することを特徴とする請求項１記載のコンパイル装置。
【請求項４】
前記監視手段は、
前記実行手段によって初めて実行される命令コードに書き込み保護を設定する設定手段と、
前記設定手段によって設定された書き込み保護の違反が発生したか否かを記憶する記憶手段と
を含むことを特徴とする請求項１記載のコンパイル装置。
【請求項５】
前記判定手段による判定の結果、命令コードの実行回数が所定の閾値以上である場合に、この命令コードから前記生成手段によって生成された変換コードを実行する変換コード実行手段をさらに有することを特徴とする請求項１記載のコンパイル装置。
【請求項６】
プログラムの実行時に当該プログラムを構成する命令コードをコンパイルして変換コードを生成するコンパイル方法であって、
命令コードごとの実行回数が所定の閾値以上であるか否かを判定する判定工程と、
前記判定工程における判定の結果、実行回数が所定の閾値未満である命令コードを実行する実行工程と、
前記実行工程にて実行される命令コードに対する書き込み保護違反が発生するか否かを監視する監視工程と、
前記判定手段における判定の結果、実行回数が所定の閾値以上である命令コードから前記監視工程の監視結果に応じて異なる変換コードを生成する生成工程と
を有することを特徴とするコンパイル方法。
【請求項７】
前記生成工程は、
書き込み保護違反が発生した命令コードから、データの書き込み先が既にコンパイル済みであるか否かを判定する判定コードが埋め込まれた非ライトプロテクション方式の変換コードを生成することを特徴とする請求項６記載のコンパイル方法。
【請求項８】
前記生成工程は、
書き込み保護違反が発生しなかった命令コードを書き込み保護しつつ、この命令コードをコンパイルしてライトプロテクション方式の変換コードを生成することを特徴とする請求項６記載のコンパイル方法。
【請求項９】
前記監視工程は、
前記実行工程にて初めて実行される命令コードに書き込み保護を設定する設定工程と、
前記設定工程にて設定された書き込み保護の違反が発生したか否かを命令コードごとのフラグとして記録する記録工程と
を含むことを特徴とする請求項６記載のコンパイル方法。
【請求項１０】
前記判定工程における判定の結果、命令コードの実行回数が所定の閾値以上である場合に、この命令コードから前記生成工程にて生成された変換コードを実行する変換コード実行工程をさらに有することを特徴とする請求項６記載のコンパイル方法。
【請求項１１】
プログラムの実行時に当該プログラムを構成する命令コードをコンパイルして変換コードを生成するコンピュータによって実行されるコード生成プログラムであって、前記コンピュータに、
命令コードごとの実行回数が所定の閾値以上であるか否かを判定する判定工程と、
前記判定工程における判定の結果、実行回数が所定の閾値未満である命令コードを実行する実行工程と、
前記実行工程にて実行される命令コードに対する書き込み保護違反が発生するか否かを監視する監視工程と、
前記判定手段における判定の結果、実行回数が所定の閾値以上である命令コードから前記監視工程の監視結果に応じて異なる変換コードを生成する生成工程と
を実行させることを特徴とするコード生成プログラム。
【請求項１２】
前記生成工程は、
書き込み保護違反が発生した命令コードから、データの書き込み先が既にコンパイル済みであるか否かを判定する判定コードが埋め込まれた非ライトプロテクション方式の変換コードを生成することを特徴とする請求項１１記載のコード生成プログラム。
【請求項１３】
前記生成工程は、
書き込み保護違反が発生しなかった命令コードを書き込み保護しつつ、この命令コードをコンパイルしてライトプロテクション方式の変換コードを生成することを特徴とする請求項１１記載のコード生成プログラム。
【請求項１４】
前記監視工程は、
前記実行工程にて初めて実行される命令コードに書き込み保護を設定する設定工程と、
前記設定工程にて設定された書き込み保護の違反が発生したか否かを命令コードごとのフラグとして記録する記録工程と
を含むことを特徴とする請求項１１記載のコード生成プログラム。
【請求項１５】
前記判定工程における判定の結果、命令コードの実行回数が所定の閾値以上である場合に、この命令コードから前記生成工程にて生成された変換コードを実行する変換コード実行工程をさらに前記コンピュータに実行させることを特徴とする請求項１１記載のコード生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの実行時に当該プログラムを構成する命令コードをコンパイルして変換コードを生成するコンパイル装置、コンパイル方法、およびコード生成プログラムに関し、特に、動的コンパイラによるコンパイルの効率化を図り、プログラムを高速に実行することができるコンパイル装置、コンパイル方法、およびコード生成プログラムに関する。
【背景技術】
【０００２】
従来、例えばコンピュータなどでソフトウェアを動作させる際には、プログラミング言語で記述された命令コードがインタプリタによって解釈されたり、コンパイラでコンパイルされたりするのが一般的である。インタプリタは、命令コードを１つ１つ解釈しながら実行するのに対し、コンパイラは、命令コードをあらかじめまとめてコンパイルし、変換コードを生成しておく。このため、コンパイラによれば、プログラムの実行時に変換コードを直接実行することができ、実行速度を速めることができる。【０００３】
また、近年では、例えば特許文献１に記載されたように、動的コンパイラが注目されている。動的コンパイラは、ＪＩＴ（Just  In  Time）コンパイラとも呼ばれ、プログラムの実行時に、実行回数が所定の閾値以上となった命令コードのまとまりをコンパイルして実行するようになっている。したがって、上述した通常のコンパイラと比較すると、ＯＳ（Operating  System）やＣＰＵ（Central  Processing  Unit）に依存しない命令コードの形式でソフトウェアを配布することが可能となるとともに、インタプリタと比較すると、実行回数が多い命令コードをコンパイルする分だけ実行速度を速めることができる。【０００４】
このようなＪＩＴコンパイラにおいては、頻繁に処理される命令コードをコンパイルしながら、コンパイルにより得られる変換コードを実行するため、変換コードのコンパイル元となる命令コードが変更された場合には、コンパイル元の命令コードとコンパイル先の変換コードとが指示する処理内容が異なってしまう。そして、元の命令コードと処理内容が異なってしまえば、変換コードをそのまま実行することはできない。そこで、コンパイル元の命令コードが変更されたことを検出するために、ライトプロテクション方式と非ライトプロテクション方式の２通りのコンパイル方式が考えられている。【０００５】
ライトプロテクション方式は、図１の上図に示すように、ＪＩＴコンパイラが命令コードをコンパイルする際、コンパイル元の命令コードが存在するページにライトプロテクションを設定する方式である。ライトプロテクションによって、ハードウェア的に書き込み保護されることにより、一度コンパイルされた命令コードが存在するページに対する書き込みが行われる場合には、ライトプロテクション違反が発生し、確実に命令コードの変更を検出することができる。【０００６】
一方、非ライトプロテクション方式は、図１の下図に示すように、ＪＩＴコンパイラが命令コードをコンパイルする際、特に書き込みを行うストア命令については、書き込み先に既にコンパイル済みの命令コードがあるか否かを判定する判定コードを埋め込む方式である。この判定コードにより、変換コード内のストア命令が実行される際には、一度コンパイルされた命令コードが変更されるか否かを判定することができ、結果として、命令コードの変更を検出することができる。【０００７】
【特許文献１】特開２０００−１３２４０８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
ところで、上述したライトプロテクション方式および非ライトプロテクション方式を比較すると、ライトプロテクション方式は、変換コードに判定コードが埋め込まれることがないため、非ライトプロテクション方式よりも変換コードを高速に動作させることができる。その反面、ライトプロテクション方式は、命令コードが存在するページ全体にライトプロテクションを設定するため、ライトプロテクション違反が発生した場合には、ページ全体について改めてコンパイルし直すなどの必要が生じる。【０００９】
このため、一般には、命令コードの実行回数が所定の閾値以上となると、最初はライトプロテクション方式で命令コードのコンパイルを行い、ライトプロテクション違反が発生すると、改めて非ライトプロテクション方式で命令コードのコンパイルを行うことが考えられている。こうすることで、ライトプロテクション違反が発生しないページについては、ライトプロテクション方式の変換コードを実行して高速動作を実現しつつ、ライトプロテクション違反が発生したページについては、ページの部分的な削除などが可能な非ライトプロテクション方式の変換コードが得られることになる。【００１０】
しかしながら、ライトプロテクション方式が適用される命令コードが存在するページがコンパイル後に変更される可能性が高い場合には、ライトプロテクション方式の変換コードを生成する処理が無駄になることがあるという問題がある。すなわち、ライトプロテクション方式の変換コードを生成しても、一度ライトプロテクション違反が発生すれば、このライトプロテクション方式の変換コードは破棄されて、改めて非ライトプロテクション方式の変換コードが生成される。このため、ライトプロテクション方式の変換コード生成後、すぐにライトプロテクション違反が発生すれば、ライトプロテクション方式の変換コードを生成する処理が無駄になり、効率が悪い。【００１１】
特に、ライトプロテクション方式が適用される命令コードが存在するページに、命令コードとデータが混在している場合には、データは頻繁に書き換えられると考えられるため、ライトプロテクション方式の変換コードがまったく実行されない可能性もある。そして、実行されないライトプロテクション方式の変換コードが生成された後に、非ライトプロテクション方式の変換コードが改めて生成されるため、コンパイルによる実行速度の高速化にも支障が生じる。【００１２】
本発明はかかる点に鑑みてなされたものであり、動的コンパイラによるコンパイルの効率化を図り、プログラムを高速に実行することができるコンパイル装置、コンパイル方法、およびコード生成プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１３】
上記課題を解決するために、本発明は、プログラムの実行時に当該プログラムを構成する命令コードをコンパイルして変換コードを生成するコンパイル装置であって、命令コードごとの実行回数が所定の閾値以上であるか否かを判定する判定手段と、前記判定手段による判定の結果、実行回数が所定の閾値未満である命令コードを実行する実行手段と、前記実行手段によって実行される命令コードに対する書き込み保護違反が発生するか否かを監視する監視手段と、前記判定手段による判定の結果、実行回数が所定の閾値以上である命令コードから前記監視手段の監視結果に応じて異なる変換コードを生成する生成手段とを有することを特徴とする。【００１４】
また、本発明は、上記発明において、前記生成手段は、書き込み保護違反が発生した命令コードから、データの書き込み先が既にコンパイル済みであるか否かを判定する判定コードが埋め込まれた非ライトプロテクション方式の変換コードを生成することを特徴とする。【００１５】
また、本発明は、上記発明において、前記生成手段は、書き込み保護違反が発生しなかった命令コードを書き込み保護しつつ、この命令コードをコンパイルしてライトプロテクション方式の変換コードを生成することを特徴とする。【００１６】
また、本発明は、上記発明において、前記監視手段は、前記実行手段によって初めて実行される命令コードに書き込み保護を設定する設定手段と、前記設定手段によって設定された書き込み保護の違反が発生したか否かを記憶する記憶手段とを含むことを特徴とする。【００１７】
また、本発明は、上記発明において、前記判定手段による判定の結果、命令コードの実行回数が所定の閾値以上である場合に、この命令コードから前記生成手段によって生成された変換コードを実行する変換コード実行手段をさらに有することを特徴とする。【００１８】
また、本発明は、プログラムの実行時に当該プログラムを構成する命令コードをコンパイルして変換コードを生成するコンパイル方法であって、命令コードごとの実行回数が所定の閾値以上であるか否かを判定する判定工程と、前記判定工程における判定の結果、実行回数が所定の閾値未満である命令コードを実行する実行工程と、前記実行工程にて実行される命令コードに対する書き込み保護違反が発生するか否かを監視する監視工程と、前記判定手段における判定の結果、実行回数が所定の閾値以上である命令コードから前記監視工程の監視結果に応じて異なる変換コードを生成する生成工程とを有することを特徴とする。【００１９】
また、本発明は、上記発明において、前記生成工程は、書き込み保護違反が発生した命令コードから、データの書き込み先が既にコンパイル済みであるか否かを判定する判定コードが埋め込まれた非ライトプロテクション方式の変換コードを生成することを特徴とする。【００２０】
また、本発明は、上記発明において、前記生成工程は、書き込み保護違反が発生しなかった命令コードを書き込み保護しつつ、この命令コードをコンパイルしてライトプロテクション方式の変換コードを生成することを特徴とする。【００２１】
また、本発明は、上記発明において、前記監視工程は、前記実行工程にて初めて実行される命令コードに書き込み保護を設定する設定工程と、前記設定工程にて設定された書き込み保護の違反が発生したか否かを命令コードごとのフラグとして記録する記録工程とを含むことを特徴とする。【００２２】
また、本発明は、上記発明において、前記判定工程における判定の結果、命令コードの実行回数が所定の閾値以上である場合に、この命令コードから前記生成工程にて生成された変換コードを実行する変換コード実行工程をさらに有することを特徴とする。【００２３】
また、本発明は、プログラムの実行時に当該プログラムを構成する命令コードをコンパイルして変換コードを生成するコンピュータによって実行されるコード生成プログラムであって、前記コンピュータに、命令コードごとの実行回数が所定の閾値以上であるか否かを判定する判定工程と、前記判定工程における判定の結果、実行回数が所定の閾値未満である命令コードを実行する実行工程と、前記実行工程にて実行される命令コードに対する書き込み保護違反が発生するか否かを監視する監視工程と、前記判定手段における判定の結果、実行回数が所定の閾値以上である命令コードから前記監視工程の監視結果に応じて異なる変換コードを生成する生成工程とを実行させることを特徴とする。【００２４】
また、本発明は、上記発明において、前記生成工程は、書き込み保護違反が発生した命令コードから、データの書き込み先が既にコンパイル済みであるか否かを判定する判定コードが埋め込まれた非ライトプロテクション方式の変換コードを生成することを特徴とする。【００２５】
また、本発明は、上記発明において、前記生成工程は、書き込み保護違反が発生しなかった命令コードを書き込み保護しつつ、この命令コードをコンパイルしてライトプロテクション方式の変換コードを生成することを特徴とする。【００２６】
また、本発明は、上記発明において、前記監視工程は、前記実行工程にて初めて実行される命令コードに書き込み保護を設定する設定工程と、前記設定工程にて設定された書き込み保護の違反が発生したか否かを命令コードごとのフラグとして記録する記録工程とを含むことを特徴とする。【００２７】
また、本発明は、上記発明において、前記判定工程における判定の結果、命令コードの実行回数が所定の閾値以上である場合に、この命令コードから前記生成工程にて生成された変換コードを実行する変換コード実行工程をさらに前記コンピュータに実行させることを特徴とする。
【発明の効果】
【００２８】
本発明によれば、命令コードごとの実行回数が所定の閾値以上であるか否かを判定し、判定の結果、実行回数が所定の閾値未満である命令コードを実行し、実行される命令コードに対する書き込み保護違反が発生するか否かを監視し、実行回数が所定の閾値以上である命令コードから監視結果に応じて異なる変換コードを生成する。このため、実行回数が所定の閾値未満である間に書き込み保護違反が発生する可能性が高い命令コードであるか否かを判断することができ、書き込み保護違反が発生する可能性が高い命令コードの実行回数が所定の閾値以上となった際には、最初から書き込み保護違反が発生することを前提としたコンパイルを実行することができる。結果として、命令コードのコンパイル時に、すぐに破棄される可能性がある変換コードの生成を省くことができ、動的コンパイラによるコンパイルの効率化を図り、プログラムを高速に実行することができる。【００２９】
また、本発明によれば、書き込み保護違反が発生した命令コードから、データの書き込み先が既にコンパイル済みであるか否かを判定する判定コードが埋め込まれた非ライトプロテクション方式の変換コードを生成する。このため、実行回数が所定の閾値に到達した後も書き込み保護違反が発生する可能性が高い命令コードに関しては、最初からライトプロテクション以外の方法で命令コードの変更が検知されるようにコンパイルすることができ、無駄なコンパイルを防止することができる。【００３０】
また、本発明によれば、書き込み保護違反が発生しなかった命令コードを書き込み保護しつつ、この命令コードをコンパイルしてライトプロテクション方式の変換コードを生成する。このため、実行回数が所定の閾値に到達した後に書き込み保護違反が発生する可能性が低い命令コードに関しては、ライトプロテクションを前提とした方法で命令コードの変更が検知されるようにコンパイルすることができ、コンパイル後の変換コードを短くしてプログラムの実行速度を向上することができる。【００３１】
また、本発明によれば、初めて実行される命令コードに書き込み保護を設定し、設定された書き込み保護の違反が発生したか否かを記憶するため、命令コードの実行回数が所定の閾値に到達するまでの間、書き込み保護違反が発生するか否かを確実に監視することができる。【００３２】
また、本発明によれば、命令コードの実行回数が所定の閾値以上である場合に、この命令コードから生成された変換コードを実行するため、頻繁に実行される処理については、コンパイル後の変換コードを実行することができ、プログラムの実行速度を向上することができる。
【図面の簡単な説明】
【００３３】
【図１】図１は、２通りのコンパイル方式を説明する図である。
【図２】図２は、本発明の一実施の形態に係るコンパイル装置の要部構成を示すブロック図である。
【図３】図３は、一実施の形態に係る変換コードテーブルの例を示す図である。
【図４】図４は、一実施の形態に係るプロファイル情報テーブルの例を示す図である。
【図５】図５は、一実施の形態に係るＷＰ管理テーブルの例を示す図である。
【図６】図６は、一実施の形態に係るインタプリタの動作を示すフロー図である。
【図７】図７は、一実施の形態に係るプロファイル処理を示すフロー図である。
【図８】図８は、一実施の形態に係るＪＩＴコンパイラの動作を示すフロー図である。
【符号の説明】
【００３４】
１１０  インタプリタ
１１１  命令フェッチ部
１１２  変換コード実行部
１１３  プロファイラ部
１１４  命令実行部
１１５  閾値判定部
１１６  ＷＰ設定部
１２０  変換コードテーブル
１３０  プロファイル情報テーブル
１４０  ＷＰ管理テーブル
１５０  ＪＩＴコンパイラ
１５１  ＷＰ判定部
１５２  ＷＰコード生成部
１５３  非ＷＰコード生成部
【発明を実施するための最良の形態】
【００３５】
本発明の骨子は、命令コードの実行回数が所定の閾値に達するまでの間に、この命令コードに対するライトプロテクション違反が発生するか否かを監視しておき、命令コードの実行回数が所定の閾値に達した際には、監視中におけるライトプロテクション違反の発生の有無に応じて生成する変換コードを決定することである。以下、本発明の一実施の形態について、図面を参照して詳細に説明する。【００３６】
図２は、本発明の一実施の形態に係るコンパイル装置の要部構成を示すブロック図である。同図に示すコンパイル装置は、インタプリタ１１０、変換コードテーブル１２０、プロファイル情報テーブル１３０、ライトプロテクション（Write  Protection：以下「ＷＰ」と略記することもある）管理テーブル１４０、およびＪＩＴコンパイラ１５０を有している。【００３７】
インタプリタ１１０は、実行対象のプログラムから命令コードを取り出して、そのまま実行したり、コンパイル後の変換コードを実行したりする。また、インタプリタ１１０は、取り出した命令コードに対するライトプロテクション（ＷＰ）の設定・解除をするとともに、ライトプロテクション違反の発生の有無をＷＰ管理テーブル１４０に記録する。【００３８】
具体的には、インタプリタ１１０は、命令フェッチ部１１１、変換コード実行部１１２、プロファイラ部１１３、命令実行部１１４、閾値判定部１１５、およびＷＰ設定部１１６を有している。【００３９】
命令フェッチ部１１１は、実行対象のプログラムから命令コードを取り出して（フェッチして）、変換コード実行部１１２へ出力する。【００４０】
変換コード実行部１１２は、命令コードに対応する変換コードを変換コードテーブル１２０から検索し、変換コードが変換コードテーブル１２０に記憶されていれば、この変換コードを実行する。また、変換コード実行部１１２は、変換コードが変換コードテーブル１２０に記憶されていなければ、命令コードをプロファイラ部１１３へ出力する。さらに、変換コード実行部１１２は、閾値判定部１１５から変換コードの実行を指示された場合に、ＪＩＴコンパイラ１５０によって変換コードが生成されるのを待機した後、変換コードテーブル１２０から変換コードを読み出して実行する。【００４１】
プロファイラ部１１３は、命令コードがプロファイル対象のものであるか否かを判断し、プロファイル対象の命令コードであれば、この命令コードの実行回数をプロファイル情報テーブル１３０に記録する。すなわち、プロファイラ部１１３は、変換コード実行部１１２から命令コードが出力されるたびにこの命令コードが実行されるものとして、プロファイル情報テーブル１３０に記憶された実行回数を１インクリメントする。そして、プロファイラ部１１３は、命令コードを命令実行部１１４およびＷＰ設定部１１６へ出力する。【００４２】
命令実行部１１４は、閾値判定部１１５から命令コードの実行を指示された場合に、プロファイラ部１１３から出力された命令コードを解釈して実行する。【００４３】
閾値判定部１１５は、プロファイル情報テーブル１３０において命令コードの実行回数が更新されると、この命令コードの実行回数が所定の閾値以上となったか否かを判定する。そして、閾値判定部１１５は、実行回数が所定の閾値以上となった命令コードについて、変換コードを生成するようにＪＩＴコンパイラ１５０へ指示する。また、閾値判定部１１５は、更新された命令コードの実行回数が所定の閾値未満であれば、命令実行部１１４に対して命令コードの実行を指示し、更新された命令コードの実行回数が所定の閾値以上であれば、変換コード実行部１１２に対して変換コードの実行を指示する。【００４４】
ＷＰ設定部１１６は、プロファイラ部１１３から出力された命令コードが存在するプログラムのページに対するライトプロテクションの有無とＷＰ管理テーブル１４０におけるＷＰフラグとから、命令コードが存在するページにライトプロテクションを設定する。すなわち、ＷＰ設定部１１６は、命令コードが存在するページにライトプロテクションが未設定であり、かつ、後述するＷＰフラグが「偽」である場合に、この命令コードが存在するページにライトプロテクションを設定する。ＷＰフラグは、過去にライトプロテクション違反が発生していれば「真」とされ、過去にライトプロテクション違反が発生していなければ「偽」とされている。【００４５】
また、ＷＰ設定部１１６は、実行対象のプログラムに対するライトプロテクション違反を検知し、ライトプロテクション違反が発生したページに対するライトプロテクションを解除するとともに、ＷＰ管理テーブル１４０において、このページの命令コードに対応するＷＰフラグを「真」に設定する。【００４６】
このように、インタプリタ１１０は、命令コードおよび変換コードの実行やライトプロテクションの設定・解除を行う。【００４７】
変換コードテーブル１２０は、命令コードのアドレス（命令アドレス）に対応付けてＪＩＴコンパイラ１５０によって生成された変換コードを記憶する。なお、本実施の形態においては、命令コードが存在するページにライトプロテクションを設定することを前提としたライトプロテクション方式の変換コード（以下「ＷＰコード」と略記する）、または変換コード中に所定の判定コードを埋め込んで命令コードの書き換えを検知する非ライトプロテクション方式の変換コード（以下「非ＷＰコード」と略記する）が生成される。【００４８】
このため、変換コードテーブル１２０は、例えば図３に示すように、命令アドレス「ａａａａ」および「ｂｂｂｂ」に対応付けてそれぞれ「非ＷＰコード」および「ＷＰコード」を記憶している。また、図３において、命令アドレス「ｃｃｃｃ」および「ｄｄｄｄ」に対応する変換コードが記憶されていないが、これらの命令コードについては、実行回数が所定の閾値以上となっていないため、変換コードが生成されていないことを示す。【００４９】
プロファイル情報テーブル１３０は、命令コードごとの実行回数を記憶する。すなわち、プロファイル情報テーブル１３０は、例えば図４に示すように、命令アドレス「ａａａａ」から「ｄｄｄｄ」に対応付けて、それぞれの命令コードの実行回数を記憶している。【００５０】
ＷＰ管理テーブル１４０は、命令コードごとに過去に一度でもライトプロテクション違反が発生したか否かを記憶する。すなわち、ＷＰ管理テーブル１４０は、例えば図５に示すように、命令アドレス「ａａａａ」から「ｄｄｄｄ」に対応付けて、それぞれの命令コードが存在するページのライトプロテクション違反が発生したか否かを示すＷＰフラグを記憶している。上述したように、ＷＰフラグが「真」であれば、この命令コードが存在するページに対するライトプロテクション違反が過去に発生したことを示し、ＷＰフラグが「偽」であれば、この命令コードが存在するページに対するライトプロテクション違反が過去に一度も発生していないことを示す。なお、ＷＰ管理テーブル１４０におけるＷＰフラグは、初期状態ではすべて「偽」となっている。【００５１】
ＪＩＴコンパイラ１５０は、実行回数が所定の閾値以上となった命令コードに対応する変換コードを生成する。このとき、ＪＩＴコンパイラ１５０は、過去にライトプロテクション違反が一度も発生していない命令コードについてはライトプロテクションを設定することを前提としたＷＰコードを生成し、過去にライトプロテクション違反が発生した命令コードについてはライトプロテクションを設定することを前提としない非ＷＰコードを生成する。【００５２】
具体的には、ＪＩＴコンパイラ１５０は、ＷＰ判定部１５１、ＷＰコード生成部１５２、および非ＷＰコード生成部１５３を有している。【００５３】
ＷＰ判定部１５１は、インタプリタ１１０の閾値判定部１１５から命令コードに対応する変換コードの生成が指示されると、この命令コードが存在するページにライトプロテクションが設定されているか否かを確認する。そして、ＷＰ判定部１５１は、ライトプロテクションが設定されている場合には、ＷＰコード生成部１５２へＷＰコードを生成するように指示し、ライトプロテクションが設定されていない場合には、非ＷＰコード生成部１５３へ非ＷＰコードを生成するように指示する。【００５４】
ここで、命令コードが存在するページにライトプロテクションが設定されているか否かは、この命令コードの実行回数が所定の閾値に到達するまでにライトプロテクション違反が発生したか否かに対応している。すなわち、実行回数が所定の閾値に到達するまでにライトプロテクション違反が一度も発生しなければ、命令コードにはライトプロテクションが設定されており、実行回数が所定の閾値に到達するまでにライトプロテクション違反が一度でも発生すれば、命令コードにはライトプロテクションが設定されていない。そして、実行回数が所定の閾値に到達するまでのライトプロテクション違反の有無は、ＷＰ管理テーブル１４０におけるＷＰフラグでも確認可能であるため、ＷＰ判定部１５１は、ＷＰ管理テーブル１４０のＷＰフラグを参照して、命令コードにライトプロテクションが設定されているか否かを判断しても良い。【００５５】
また、ＷＰ判定部１５１は、実行対象のプログラムに対するライトプロテクション違反を検知し、ライトプロテクション違反が発生したページに対応するＷＰコードの破棄をＷＰコード生成部１５２へ指示するとともに、このページの非ＷＰコードの生成を非ＷＰコード生成部１５３へ指示する。【００５６】
ＷＰコード生成部１５２は、ＷＰ判定部１５１の指示に従って、実行回数が所定の閾値以上となった命令コードが存在するページをライトプロテクション方式でコンパイルしてＷＰコードを生成し、変換コードテーブル１２０に登録する。ＷＰコード生成部１５２が生成するＷＰコードに対応する命令コードにはライトプロテクションが設定されており、命令コードの実行回数が所定の閾値に到達するまでにライトプロテクション違反が発生していない。【００５７】
また、ＷＰコード生成部１５２は、ライトプロテクション違反発生時にＷＰ判定部１５１からＷＰコードの破棄を指示されると、指示された命令アドレスに対応する変換コードを変換コードテーブル１２０において確認し、この変換コードがＷＰコードであれば破棄する。【００５８】
非ＷＰコード生成部１５３は、ＷＰ判定部１５１の指示に従って、実行回数が所定の閾値以上となった命令コードが存在するページを非ライトプロテクション方式でコンパイルして非ＷＰコードを生成し、変換コードテーブル１２０に登録する。非ＷＰコード生成部１５３が生成する非ＷＰコードに対応する命令コードにはライトプロテクションが設定されておらず、命令コードの実行回数が所定の閾値に到達するまでにライトプロテクション違反が発生している。【００５９】
また、非ＷＰコード生成部１５２は、ライトプロテクション違反発生時にＷＰ判定部１５１から非ＷＰコードの生成を指示されると、指示された命令アドレスの命令コードから非ＷＰコードを生成し、変換コードテーブル１２０に登録する。【００６０】
このように、ＪＩＴコンパイラ１５０は、命令コードの実行回数が所定の閾値に到達すると、実行回数が所定の閾値に到達するまでのライトプロテクション違反の有無に応じてＷＰコードおよび非ＷＰコードのどちらを生成するか決定し、決定された変換コードを生成して変換コードテーブル１２０に登録する。【００６１】
次いで、上記のように構成されたインタプリタ１１０の動作について、図６に示すフロー図を参照しながら説明する。【００６２】
実行対象のプログラムを実行する際、まず、インタプリタ１１０の命令フェッチ部１１１によって、プログラム中の命令コードがフェッチされる（ステップＳ１０１）。この命令コードは、変換コード実行部１１２へ出力され、変換コード実行部１１２によって変換コードテーブル１２０が検索されることにより、命令コードに対応する変換コードが既に記憶されているか否かが確認される（ステップＳ１０２）。この結果、既に変換コードが記憶されていれば（ステップＳ１０２Ｙｅｓ）、変換コード実行部１１２によって、変換コードテーブル１２０から変換コードが読み出され、実行される（ステップＳ１０３）。【００６３】
一方、変換コードが変換コードテーブル１２０に記憶されていなければ（ステップＳ１０２Ｎｏ）、命令コードは、プロファイラ部１１３へ出力され、プロファイル対象の命令コードであるか否かが判定される（ステップＳ１０４）。この結果、命令コードがプロファイル対象でなければ（ステップＳ１０４Ｎｏ）、命令コードは命令実行部１１４へ出力され、実行される（ステップＳ１０７）。【００６４】
また、命令コードがプロファイル対象であれば（ステップＳ１０４Ｙｅｓ）、プロファイラ部１１３によってプロファイル情報テーブル１３０に記憶された命令コードの実行回数が１インクリメントされるなどのプロファイル処理が実行される（ステップＳ１０５）。また、プロファイル処理においては、ＷＰ設定部１１６によって、命令コードが存在するページのライトプロテクションの設定が実行される。このプロファイル時の処理については、後に詳述する。【００６５】
そして、プロファイラ部１１３によってプロファイル情報テーブル１３０に記憶された実行回数が１インクリメントされると、閾値判定部１１５によって、更新された実行回数が所定の閾値以上であるか否かが判定される（ステップＳ１０６）。この結果、実行回数が所定の閾値未満であれば（ステップＳ１０６Ｎｏ）、まだ変換コードが生成されることはないため、閾値判定部１１５から命令実行部１１４へ命令を実行するように指示され、命令実行部１１４によってプロファイラ部１１３から出力される命令コードが実行される（ステップＳ１０７）。【００６６】
一方、命令コードの実行回数が所定の閾値以上であれば（ステップＳ１０６Ｙｅｓ）、命令コードが頻繁に実行されていることから、閾値判定部１１５によって、ＪＩＴコンパイラ１５０のＷＰ判定部１５１へ変換コードの生成が指示されるとともに（ステップＳ１０８）、変換コード実行部１１２へ変換コードの実行が指示される。そして、変換コード実行部１１２によって、ＪＩＴコンパイラ１５０による変換コードの生成が待機され、変換コード生成後、変換コードテーブル１２０から変換コードが読み出されて実行される（ステップＳ１０９）。このとき、ＪＩＴコンパイラ１５０によって生成される変換コードは、命令コードに対する過去のライトプロテクション違反の有無によって、ＷＰコードおよび非ＷＰコードのいずれかとなっている。【００６７】
ここまでの処理により、命令フェッチ部１１１によってフェッチされた命令コードは、実行回数が所定の閾値未満であれば命令コードそのものとして実行され、実行回数が所定の閾値以上であれば対応する変換コードが実行されたことになる。そして、このとき、ＷＰ設定部１１６によって、ライトプロテクション違反が発生したか否かが監視される（ステップＳ１１０）。すなわち、ＷＰ設定部１１６によって、プロファイル処理時にライトプロテクションが設定されたページに対する書き込みが発生したか否かが判断され、ライトプロテクション違反が発生した場合には（ステップＳ１１０Ｙｅｓ）、ＷＰ設定部１１６によって、該当するページのライトプロテクションが解除されるとともに（ステップＳ１１１）、ＷＰ管理テーブル１４０において、ページ内の命令コードに対応するＷＰフラグが「真」に設定される（ステップＳ１１２）。【００６８】
ここで、ライトプロテクション違反が発生するページに関しては、例えば命令コードとデータが混在しているなどのために、書き込みが頻繁に発生するページであると考えられ、このようなページについては、ライトプロテクション方式のＷＰコードを生成してもすぐに破棄する必要が生じる。【００６９】
そこで、本実施の形態においては、プロファイル処理時に設定したライトプロテクションの違反が発生した場合には、このページ内の命令コードに対応するＷＰフラグを「真」に設定しておき、命令コードの実行回数が所定の閾値以上となって変換コードを生成する際に、ＷＰコードを生成することなく最初から非ＷＰコードを生成する。このため、ライトプロテクション方式のコンパイルが適していない命令コードのページについては、非ＷＰコードが生成され、コンパイルの効率化を図り、プログラムを高速に実行することができる。なお、変換コード生成の処理については、後に詳述する。【００７０】
次に、命令フェッチ部１１１によってフェッチされた命令コードがプロファイル対象である場合のプロファイル時の処理について、図７に示すフロー図を参照しながら説明する。【００７１】
プロファイラ部１１３において、命令コードがプロファイル対象であると判断されると、プロファイラ部１１３によって、この命令コードの実行回数がプロファイル情報テーブル１３０に記録される（ステップＳ２０１）。具体的には、プロファイラ部１１３によって、命令コードに対応付けて記憶された実行回数が１インクリメントされる。【００７２】
また、ＷＰ設定部１１６によって、命令コードが存在するページに対してライトプロテクションが既に設定されているか否かが判断され（ステップＳ２０２）、既に設定されていれば（ステップＳ２０２Ｙｅｓ）、ライトプロテクションを維持したままプロファイル処理が終了する。【００７３】
一方、ライトプロテクションが設定されていなければ（ステップＳ２０２Ｎｏ）、ＷＰ管理テーブル１４０が参照され、命令コードに対応するＷＰフラグが「真」であるか否かが確認される（ステップＳ２０３）。ここで、ＷＰフラグが「真」であれば（ステップＳ２０３Ｙｅｓ）、過去にライトプロテクション違反が発生したことを意味しており、この命令コードが存在するページに対する書き込みが比較的頻繁に実行されると考えられることから、ＷＰ設定部１１６によって再度ライトプロテクションが設定されることなく、プロファイル処理が終了する。また、ＷＰフラグが「偽」であれば（ステップＳ２０３Ｎｏ）、ＷＰ設定部１１６によって、この命令コードが存在するページにライトプロテクションが設定される（ステップＳ２０４）。【００７４】
このようなプロファイル処理により、プロファイル対象の命令コードの初回実行時には、必ずライトプロテクションが設定され、その後、一度でもライトプロテクション違反が発生した命令コードについては、ライトプロテクションは解除されたままで、再びライトプロテクションが設定されることはない。同時に、一度でもライトプロテクション違反が発生した命令コードについては、ＷＰ管理テーブル１４０におけるＷＰフラグが「真」とされたままとなる。【００７５】
このため、命令コードの実行回数が所定の閾値に到達した際、ライトプロテクションの設定の有無またはＷＰ管理テーブル１４０のＷＰフラグを参照することにより、それぞれの命令コードが比較的頻繁に書き込みが実行されるページ内の命令コードであるか否かを判定することが可能となる。したがって、次に説明するように、ライトプロテクションが設定されていないか、またはＷＰフラグが「真」である命令コードについては、再びページ内に書き込みが発生することを想定して最初から非ＷＰコードを生成し、コンパイルの効率化を図ることが可能となる。【００７６】
図８は、本実施の形態に係るＪＩＴコンパイラ１５０の動作を示すフロー図である。ＪＩＴコンパイラ１５０は、命令コードの実行回数が所定の閾値以上となった時に、この命令コードに対応する変換コードを生成する。【００７７】
すなわち、インタプリタ１１０の閾値判定部１１５によって命令コードの実行回数が所定の閾値以上であると判定されると、変換コード生成の指示が出され、この指示がＪＩＴコンパイラ１５０のＷＰ判定部１５１によって取得される（ステップＳ３０１）。この指示を受け、ＷＰ判定部１５１によって、コンパイル対象の命令コードが存在するページにライトプロテクションが設定されているか否かが判定される（ステップＳ３０２）。上述したように、ＷＰ判定部１５１による判定は、ＷＰ管理テーブル１４０においてコンパイル対象の命令コードに対応するＷＰフラグが「真」であるか否かの判定でも良い。【００７８】
この判定の結果、ライトプロテクションが設定されている、もしくはＷＰフラグが「偽」である場合（ステップＳ３０２Ｙｅｓ）、この命令コードが存在するページについては、過去に一度もライトプロテクション違反が発生していないことになる。このため、以後も命令コードが存在するページに対する書き込みが比較的発生しにくいと考えられ、ＷＰ判定部１５１によって、ＷＰコード生成部１５２へ変換コードの生成が指示される。これにより、ＷＰコード生成部１５２によって、命令コードが存在するページに対するライトプロテクション方式のコンパイルが行われ、ＷＰコードが生成される（ステップＳ３０３）。このＷＰコードは、元の命令コードのアドレスに対応付けられ、変換コードテーブル１２０に記憶される。【００７９】
一方、ＷＰ判定部１５１における判定の結果、ライトプロテクションが設定されていない、もしくはＷＰフラグが「真」である場合（ステップＳ３０２Ｎｏ）、この命令コードが存在するページについては、過去にライトプロテクション違反が発生していることになる。このため、以後も命令コードが存在するページに対する書き込みが比較的発生しやすいと考えられ、ＷＰ判定部１５１によって、非ＷＰコード生成部１５３へ変換コードの生成が指示される。これにより、非ＷＰコード生成部１５３によって、命令コードが存在するページに対する非ライトプロテクション方式のコンパイルが行われ、非ＷＰコードが生成される（ステップＳ３０４）。この非ＷＰコードは、元の命令コードの命令アドレスに対応付けられ、変換コードテーブル１２０に記憶される。【００８０】
このようにして生成された変換コードは、変換コードテーブル１２０に登録後、既に説明したように、インタプリタ１１０の変換コード実行部１１２によって実行される。本実施の形態においては、特に非ＷＰコードが生成される場合に、一度ＷＰコードが生成されてから改めて非ＷＰコードが生成されるということがなく、変換コードが実行されるまでの時間の短縮を図ることができる。結果として、プログラムを高速に実行することができる。【００８１】
ＷＰコードまたは非ＷＰコードの生成後、ＪＩＴコンパイラ１５０においては、ＷＰ判定部１５１によって、常にライトプロテクション違反の発生が監視される（ステップＳ３０５）。そして、ライトプロテクション違反が発生した場合には（ステップＳ３０５Ｙｅｓ）、ＷＰ判定部１５１によって、ライトプロテクション違反が発生したページのＷＰコードを破棄する旨の指示がＷＰコード生成部１５２へ出される。この指示を受け、ＷＰコード生成部１５２によって、ライトプロテクション違反が発生したページ内の命令コードに対応付けて変換コードテーブル１２０に記憶された変換コードが確認され、この変換コードがＷＰコードであれば破棄される（ステップＳ３０６）。【００８２】
同時に、ＷＰ判定部１５１によって、ライトプロテクション違反が発生したページの非ＷＰコードを生成する旨の指示が非ＷＰコード生成部１５３へ出される。この指示を受け、非ＷＰコード生成部１５３によって、ライトプロテクション違反が発生したページの非ＷＰコードが生成され（ステップＳ３０７）、変換コードテーブル１２０に登録される。【００８３】
これにより、実行回数が所定の閾値に到達するまでにライトプロテクション違反が発生しなかったことからＷＰコードが生成された命令コードについても、ＷＰコードの生成後、ライトプロテクション違反が発生した場合には、改めて非ＷＰコードが生成される。したがって、命令コードと変換コードの処理内容が異なってしまうことがなく、確実に命令コードと変換コードの処理内容を一致させることができる。【００８４】
以上のように、本実施の形態によれば、命令コードの初回実行時にこの命令コードにライトプロテクションを設定し、命令コードの実行回数が所定の閾値に到達するまでライトプロテクション違反が発生しなければライトプロテクション方式で命令コードをコンパイルし、ライトプロテクション違反が発生すれば非ライトプロテクション方式で命令コードをコンパイルする。このため、命令コードの実行回数が所定の閾値に到達して変換コードを生成する際、最初から適した方式で命令コードをコンパイルすることができ、動的コンパイラによるコンパイルの効率化を図り、プログラムを高速に実行することができる。
【産業上の利用可能性】
【００８５】
本発明は、動的コンパイラによるコンパイルの効率化を図り、プログラムを高速に実行する場合に適用することができる。
【図１】
2008126299.tif 000003
【図２】
2008126299.tif 000004
【図３】
2008126299.tif 000005
【図４】
2008126299.tif 000006
【図５】
2008126299.tif 000007
【図６】
2008126299.tif 000008
【図７】
2008126299.tif 000009
【図８】
2008126299.tif 000010
【手続補正書】
【提出日】平成21年5月18日(2009.5.18)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
プログラムの実行時に当該プログラムを構成する命令コードをコンパイルして変換コードを生成するコンパイル装置であって、
命令コードごとの実行回数が所定の閾値以上であるか否かを判定する判定手段と、
前記判定手段による判定の結果、実行回数が所定の閾値未満である命令コードを実行する実行手段と、
前記実行手段によって実行される命令コードに対する書き込み保護違反が発生するか否かを監視する監視手段と、
前記判定手段による判定の結果、実行回数が所定の閾値以上である命令コードから前記監視手段の監視結果に応じて異なる変換コードを生成する生成手段と
を有することを特徴とするコンパイル装置。
【請求項２】
プログラムの実行時に当該プログラムを構成する命令コードをコンパイルして変換コードを生成するコンパイル方法であって、
命令コードごとの実行回数が所定の閾値以上であるか否かを判定する判定工程と、
前記判定工程における判定の結果、実行回数が所定の閾値未満である命令コードを実行する実行工程と、
前記実行工程にて実行される命令コードに対する書き込み保護違反が発生するか否かを監視する監視工程と、
前記判定手段における判定の結果、実行回数が所定の閾値以上である命令コードから前記監視工程の監視結果に応じて異なる変換コードを生成する生成工程と
を有することを特徴とするコンパイル方法。
【請求項３】
前記生成工程は、
書き込み保護違反が発生した命令コードから、データの書き込み先が既にコンパイル済みであるか否かを判定する判定コードが埋め込まれた非ライトプロテクション方式の変換コードを生成することを特徴とする請求項２記載のコンパイル方法。
【請求項４】
前記生成工程は、
書き込み保護違反が発生しなかった命令コードを書き込み保護しつつ、この命令コードをコンパイルしてライトプロテクション方式の変換コードを生成することを特徴とする請求項２記載のコンパイル方法。
【請求項５】
前記監視工程は、
前記実行工程にて初めて実行される命令コードに書き込み保護を設定する設定工程と、
前記設定工程にて設定された書き込み保護の違反が発生したか否かを命令コードごとのフラグとして記録する記録工程と
を含むことを特徴とする請求項２記載のコンパイル方法。
【請求項６】
前記判定工程における判定の結果、命令コードの実行回数が所定の閾値以上である場合に、この命令コードから前記生成工程にて生成された変換コードを実行する変換コード実行工程をさらに有することを特徴とする請求項２記載のコンパイル方法。
【請求項７】
プログラムの実行時に当該プログラムを構成する命令コードをコンパイルして変換コードを生成するコンピュータによって実行されるコード生成プログラムであって、前記コンピュータに、
命令コードごとの実行回数が所定の閾値以上であるか否かを判定する判定工程と、
前記判定工程における判定の結果、実行回数が所定の閾値未満である命令コードを実行する実行工程と、
前記実行工程にて実行される命令コードに対する書き込み保護違反が発生するか否かを監視する監視工程と、
前記判定手段における判定の結果、実行回数が所定の閾値以上である命令コードから前記監視工程の監視結果に応じて異なる変換コードを生成する生成工程と
を実行させることを特徴とするコード生成プログラム。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの実行時に当該プログラムを構成する命令コードをコンパイルして変換コードを生成するコンパイル装置、コンパイル方法、およびコード生成プログラムに関し、特に、動的コンパイラによるコンパイルの効率化を図り、プログラムを高速に実行することができるコンパイル装置、コンパイル方法、およびコード生成プログラムに関する。
【背景技術】
【０００２】
従来、例えばコンピュータなどでソフトウェアを動作させる際には、プログラミング言語で記述された命令コードがインタプリタによって解釈されたり、コンパイラでコンパイルされたりするのが一般的である。インタプリタは、命令コードを１つ１つ解釈しながら実行するのに対し、コンパイラは、命令コードをあらかじめまとめてコンパイルし、変換コードを生成しておく。このため、コンパイラによれば、プログラムの実行時に変換コードを直接実行することができ、実行速度を速めることができる。
【０００３】
また、近年では、例えば特許文献１に記載されたように、動的コンパイラが注目されている。動的コンパイラは、ＪＩＴ（Just  In  Time）コンパイラとも呼ばれ、プログラムの実行時に、実行回数が所定の閾値以上となった命令コードのまとまりをコンパイルして実行するようになっている。したがって、上述した通常のコンパイラと比較すると、ＯＳ（Operating  System）やＣＰＵ（Central  Processing  Unit）に依存しない命令コードの形式でソフトウェアを配布することが可能となるとともに、インタプリタと比較すると、実行回数が多い命令コードをコンパイルする分だけ実行速度を速めることができる。
【０００４】
このようなＪＩＴコンパイラにおいては、頻繁に処理される命令コードをコンパイルしながら、コンパイルにより得られる変換コードを実行するため、変換コードのコンパイル元となる命令コードが変更された場合には、コンパイル元の命令コードとコンパイル先の変換コードとが指示する処理内容が異なってしまう。そして、元の命令コードと処理内容が異なってしまえば、変換コードをそのまま実行することはできない。そこで、コンパイル元の命令コードが変更されたことを検出するために、ライトプロテクション方式と非ライトプロテクション方式の２通りのコンパイル方式が考えられている。
【０００５】
ライトプロテクション方式は、図１の上図に示すように、ＪＩＴコンパイラが命令コードをコンパイルする際、コンパイル元の命令コードが存在するページにライトプロテクションを設定する方式である。ライトプロテクションによって、ハードウェア的に書き込み保護されることにより、一度コンパイルされた命令コードが存在するページに対する書き込みが行われる場合には、ライトプロテクション違反が発生し、確実に命令コードの変更を検出することができる。
【０００６】
一方、非ライトプロテクション方式は、図１の下図に示すように、ＪＩＴコンパイラが命令コードをコンパイルする際、特に書き込みを行うストア命令については、書き込み先に既にコンパイル済みの命令コードがあるか否かを判定する判定コードを埋め込む方式である。この判定コードにより、変換コード内のストア命令が実行される際には、一度コンパイルされた命令コードが変更されるか否かを判定することができ、結果として、命令コードの変更を検出することができる。
【０００７】
【特許文献１】特開２０００−１３２４０８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
ところで、上述したライトプロテクション方式および非ライトプロテクション方式を比較すると、ライトプロテクション方式は、変換コードに判定コードが埋め込まれることがないため、非ライトプロテクション方式よりも変換コードを高速に動作させることができる。その反面、ライトプロテクション方式は、命令コードが存在するページ全体にライトプロテクションを設定するため、ライトプロテクション違反が発生した場合には、ページ全体について改めてコンパイルし直すなどの必要が生じる。
【０００９】
このため、一般には、命令コードの実行回数が所定の閾値以上となると、最初はライトプロテクション方式で命令コードのコンパイルを行い、ライトプロテクション違反が発生すると、改めて非ライトプロテクション方式で命令コードのコンパイルを行うことが考えられている。こうすることで、ライトプロテクション違反が発生しないページについては、ライトプロテクション方式の変換コードを実行して高速動作を実現しつつ、ライトプロテクション違反が発生したページについては、ページの部分的な削除などが可能な非ライトプロテクション方式の変換コードが得られることになる。
【００１０】
しかしながら、ライトプロテクション方式が適用される命令コードが存在するページがコンパイル後に変更される可能性が高い場合には、ライトプロテクション方式の変換コードを生成する処理が無駄になることがあるという問題がある。すなわち、ライトプロテクション方式の変換コードを生成しても、一度ライトプロテクション違反が発生すれば、このライトプロテクション方式の変換コードは破棄されて、改めて非ライトプロテクション方式の変換コードが生成される。このため、ライトプロテクション方式の変換コード生成後、すぐにライトプロテクション違反が発生すれば、ライトプロテクション方式の変換コードを生成する処理が無駄になり、効率が悪い。
【００１１】
特に、ライトプロテクション方式が適用される命令コードが存在するページに、命令コードとデータが混在している場合には、データは頻繁に書き換えられると考えられるため、ライトプロテクション方式の変換コードがまったく実行されない可能性もある。そして、実行されないライトプロテクション方式の変換コードが生成された後に、非ライトプロテクション方式の変換コードが改めて生成されるため、コンパイルによる実行速度の高速化にも支障が生じる。
【００１２】
本発明はかかる点に鑑みてなされたものであり、動的コンパイラによるコンパイルの効率化を図り、プログラムを高速に実行することができるコンパイル装置、コンパイル方法、およびコード生成プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１３】
上記課題を解決するために、本発明は、プログラムの実行時に当該プログラムを構成する命令コードをコンパイルして変換コードを生成するコンパイル装置であって、命令コードごとの実行回数が所定の閾値以上であるか否かを判定する判定手段と、前記判定手段による判定の結果、実行回数が所定の閾値未満である命令コードを実行する実行手段と、前記実行手段によって実行される命令コードに対する書き込み保護違反が発生するか否かを監視する監視手段と、前記判定手段による判定の結果、実行回数が所定の閾値以上である命令コードから前記監視手段の監視結果に応じて異なる変換コードを生成する生成手段とを有することを特徴とする。
【００１４】
また、本発明は、上記発明において、前記生成手段は、書き込み保護違反が発生した命令コードから、データの書き込み先が既にコンパイル済みであるか否かを判定する判定コードが埋め込まれた非ライトプロテクション方式の変換コードを生成することを特徴とする。
【００１５】
また、本発明は、上記発明において、前記生成手段は、書き込み保護違反が発生しなかった命令コードを書き込み保護しつつ、この命令コードをコンパイルしてライトプロテクション方式の変換コードを生成することを特徴とする。
【００１６】
また、本発明は、上記発明において、前記監視手段は、前記実行手段によって初めて実行される命令コードに書き込み保護を設定する設定手段と、前記設定手段によって設定された書き込み保護の違反が発生したか否かを記憶する記憶手段とを含むことを特徴とする。
【００１７】
また、本発明は、上記発明において、前記判定手段による判定の結果、命令コードの実行回数が所定の閾値以上である場合に、この命令コードから前記生成手段によって生成された変換コードを実行する変換コード実行手段をさらに有することを特徴とする。
【００１８】
また、本発明は、プログラムの実行時に当該プログラムを構成する命令コードをコンパイルして変換コードを生成するコンパイル方法であって、命令コードごとの実行回数が所定の閾値以上であるか否かを判定する判定工程と、前記判定工程における判定の結果、実行回数が所定の閾値未満である命令コードを実行する実行工程と、前記実行工程にて実行される命令コードに対する書き込み保護違反が発生するか否かを監視する監視工程と、前記判定手段における判定の結果、実行回数が所定の閾値以上である命令コードから前記監視工程の監視結果に応じて異なる変換コードを生成する生成工程とを有することを特徴とする。
【００１９】
また、本発明は、上記発明において、前記生成工程は、書き込み保護違反が発生した命令コードから、データの書き込み先が既にコンパイル済みであるか否かを判定する判定コードが埋め込まれた非ライトプロテクション方式の変換コードを生成することを特徴とする。
【００２０】
また、本発明は、上記発明において、前記生成工程は、書き込み保護違反が発生しなかった命令コードを書き込み保護しつつ、この命令コードをコンパイルしてライトプロテクション方式の変換コードを生成することを特徴とする。
【００２１】
また、本発明は、上記発明において、前記監視工程は、前記実行工程にて初めて実行される命令コードに書き込み保護を設定する設定工程と、前記設定工程にて設定された書き込み保護の違反が発生したか否かを命令コードごとのフラグとして記録する記録工程とを含むことを特徴とする。
【００２２】
また、本発明は、上記発明において、前記判定工程における判定の結果、命令コードの実行回数が所定の閾値以上である場合に、この命令コードから前記生成工程にて生成された変換コードを実行する変換コード実行工程をさらに有することを特徴とする。
【００２３】
また、本発明は、プログラムの実行時に当該プログラムを構成する命令コードをコンパイルして変換コードを生成するコンピュータによって実行されるコード生成プログラムであって、前記コンピュータに、命令コードごとの実行回数が所定の閾値以上であるか否かを判定する判定工程と、前記判定工程における判定の結果、実行回数が所定の閾値未満である命令コードを実行する実行工程と、前記実行工程にて実行される命令コードに対する書き込み保護違反が発生するか否かを監視する監視工程と、前記判定手段における判定の結果、実行回数が所定の閾値以上である命令コードから前記監視工程の監視結果に応じて異なる変換コードを生成する生成工程とを実行させることを特徴とする。
【００２４】
また、本発明は、上記発明において、前記生成工程は、書き込み保護違反が発生した命令コードから、データの書き込み先が既にコンパイル済みであるか否かを判定する判定コードが埋め込まれた非ライトプロテクション方式の変換コードを生成することを特徴とする。
【００２５】
また、本発明は、上記発明において、前記生成工程は、書き込み保護違反が発生しなかった命令コードを書き込み保護しつつ、この命令コードをコンパイルしてライトプロテクション方式の変換コードを生成することを特徴とする。
【００２６】
また、本発明は、上記発明において、前記監視工程は、前記実行工程にて初めて実行される命令コードに書き込み保護を設定する設定工程と、前記設定工程にて設定された書き込み保護の違反が発生したか否かを命令コードごとのフラグとして記録する記録工程とを含むことを特徴とする。
【００２７】
また、本発明は、上記発明において、前記判定工程における判定の結果、命令コードの実行回数が所定の閾値以上である場合に、この命令コードから前記生成工程にて生成された変換コードを実行する変換コード実行工程をさらに前記コンピュータに実行させることを特徴とする。
【発明の効果】
【００２８】
本発明によれば、命令コードごとの実行回数が所定の閾値以上であるか否かを判定し、判定の結果、実行回数が所定の閾値未満である命令コードを実行し、実行される命令コードに対する書き込み保護違反が発生するか否かを監視し、実行回数が所定の閾値以上である命令コードから監視結果に応じて異なる変換コードを生成する。このため、実行回数が所定の閾値未満である間に書き込み保護違反が発生する可能性が高い命令コードであるか否かを判断することができ、書き込み保護違反が発生する可能性が高い命令コードの実行回数が所定の閾値以上となった際には、最初から書き込み保護違反が発生することを前提としたコンパイルを実行することができる。結果として、命令コードのコンパイル時に、すぐに破棄される可能性がある変換コードの生成を省くことができ、動的コンパイラによるコンパイルの効率化を図り、プログラムを高速に実行することができる。
【００２９】
また、本発明によれば、書き込み保護違反が発生した命令コードから、データの書き込み先が既にコンパイル済みであるか否かを判定する判定コードが埋め込まれた非ライトプロテクション方式の変換コードを生成する。このため、実行回数が所定の閾値に到達した後も書き込み保護違反が発生する可能性が高い命令コードに関しては、最初からライトプロテクション以外の方法で命令コードの変更が検知されるようにコンパイルすることができ、無駄なコンパイルを防止することができる。
【００３０】
また、本発明によれば、書き込み保護違反が発生しなかった命令コードを書き込み保護しつつ、この命令コードをコンパイルしてライトプロテクション方式の変換コードを生成する。このため、実行回数が所定の閾値に到達した後に書き込み保護違反が発生する可能性が低い命令コードに関しては、ライトプロテクションを前提とした方法で命令コードの変更が検知されるようにコンパイルすることができ、コンパイル後の変換コードを短くしてプログラムの実行速度を向上することができる。
【００３１】
また、本発明によれば、初めて実行される命令コードに書き込み保護を設定し、設定された書き込み保護の違反が発生したか否かを記憶するため、命令コードの実行回数が所定の閾値に到達するまでの間、書き込み保護違反が発生するか否かを確実に監視することができる。
【００３２】
また、本発明によれば、命令コードの実行回数が所定の閾値以上である場合に、この命令コードから生成された変換コードを実行するため、頻繁に実行される処理については、コンパイル後の変換コードを実行することができ、プログラムの実行速度を向上することができる。
【発明を実施するための最良の形態】
【００３３】
本発明の骨子は、命令コードの実行回数が所定の閾値に達するまでの間に、この命令コードに対するライトプロテクション違反が発生するか否かを監視しておき、命令コードの実行回数が所定の閾値に達した際には、監視中におけるライトプロテクション違反の発生の有無に応じて生成する変換コードを決定することである。以下、本発明の一実施の形態について、図面を参照して詳細に説明する。
【００３４】
図２は、本発明の一実施の形態に係るコンパイル装置の要部構成を示すブロック図である。同図に示すコンパイル装置は、インタプリタ１１０、変換コードテーブル１２０、プロファイル情報テーブル１３０、ライトプロテクション（Write  Protection：以下「ＷＰ」と略記することもある）管理テーブル１４０、およびＪＩＴコンパイラ１５０を有している。
【００３５】
インタプリタ１１０は、実行対象のプログラムから命令コードを取り出して、そのまま実行したり、コンパイル後の変換コードを実行したりする。また、インタプリタ１１０は、取り出した命令コードに対するライトプロテクション（ＷＰ）の設定・解除をするとともに、ライトプロテクション違反の発生の有無をＷＰ管理テーブル１４０に記録する。
【００３６】
具体的には、インタプリタ１１０は、命令フェッチ部１１１、変換コード実行部１１２、プロファイラ部１１３、命令実行部１１４、閾値判定部１１５、およびＷＰ設定部１１６を有している。
【００３７】
命令フェッチ部１１１は、実行対象のプログラムから命令コードを取り出して（フェッチして）、変換コード実行部１１２へ出力する。
【００３８】
変換コード実行部１１２は、命令コードに対応する変換コードを変換コードテーブル１２０から検索し、変換コードが変換コードテーブル１２０に記憶されていれば、この変換コードを実行する。また、変換コード実行部１１２は、変換コードが変換コードテーブル１２０に記憶されていなければ、命令コードをプロファイラ部１１３へ出力する。さらに、変換コード実行部１１２は、閾値判定部１１５から変換コードの実行を指示された場合に、ＪＩＴコンパイラ１５０によって変換コードが生成されるのを待機した後、変換コードテーブル１２０から変換コードを読み出して実行する。
【００３９】
プロファイラ部１１３は、命令コードがプロファイル対象のものであるか否かを判断し、プロファイル対象の命令コードであれば、この命令コードの実行回数をプロファイル情報テーブル１３０に記録する。すなわち、プロファイラ部１１３は、変換コード実行部１１２から命令コードが出力されるたびにこの命令コードが実行されるものとして、プロファイル情報テーブル１３０に記憶された実行回数を１インクリメントする。そして、プロファイラ部１１３は、命令コードを命令実行部１１４およびＷＰ設定部１１６へ出力する。
【００４０】
命令実行部１１４は、閾値判定部１１５から命令コードの実行を指示された場合に、プロファイラ部１１３から出力された命令コードを解釈して実行する。
【００４１】
閾値判定部１１５は、プロファイル情報テーブル１３０において命令コードの実行回数が更新されると、この命令コードの実行回数が所定の閾値以上となったか否かを判定する。そして、閾値判定部１１５は、実行回数が所定の閾値以上となった命令コードについて、変換コードを生成するようにＪＩＴコンパイラ１５０へ指示する。また、閾値判定部１１５は、更新された命令コードの実行回数が所定の閾値未満であれば、命令実行部１１４に対して命令コードの実行を指示し、更新された命令コードの実行回数が所定の閾値以上であれば、変換コード実行部１１２に対して変換コードの実行を指示する。
【００４２】
ＷＰ設定部１１６は、プロファイラ部１１３から出力された命令コードが存在するプログラムのページに対するライトプロテクションの有無とＷＰ管理テーブル１４０におけるＷＰフラグとから、命令コードが存在するページにライトプロテクションを設定する。すなわち、ＷＰ設定部１１６は、命令コードが存在するページにライトプロテクションが未設定であり、かつ、後述するＷＰフラグが「偽」である場合に、この命令コードが存在するページにライトプロテクションを設定する。ＷＰフラグは、過去にライトプロテクション違反が発生していれば「真」とされ、過去にライトプロテクション違反が発生していなければ「偽」とされている。
【００４３】
また、ＷＰ設定部１１６は、実行対象のプログラムに対するライトプロテクション違反を検知し、ライトプロテクション違反が発生したページに対するライトプロテクションを解除するとともに、ＷＰ管理テーブル１４０において、このページの命令コードに対応するＷＰフラグを「真」に設定する。
【００４４】
このように、インタプリタ１１０は、命令コードおよび変換コードの実行やライトプロテクションの設定・解除を行う。
【００４５】
変換コードテーブル１２０は、命令コードのアドレス（命令アドレス）に対応付けてＪＩＴコンパイラ１５０によって生成された変換コードを記憶する。なお、本実施の形態においては、命令コードが存在するページにライトプロテクションを設定することを前提としたライトプロテクション方式の変換コード（以下「ＷＰコード」と略記する）、または変換コード中に所定の判定コードを埋め込んで命令コードの書き換えを検知する非ライトプロテクション方式の変換コード（以下「非ＷＰコード」と略記する）が生成される。
【００４６】
このため、変換コードテーブル１２０は、例えば図３に示すように、命令アドレス「ａａａａ」および「ｂｂｂｂ」に対応付けてそれぞれ「非ＷＰコード」および「ＷＰコード」を記憶している。また、図３において、命令アドレス「ｃｃｃｃ」および「ｄｄｄｄ」に対応する変換コードが記憶されていないが、これらの命令コードについては、実行回数が所定の閾値以上となっていないため、変換コードが生成されていないことを示す。
【００４７】
プロファイル情報テーブル１３０は、命令コードごとの実行回数を記憶する。すなわち、プロファイル情報テーブル１３０は、例えば図４に示すように、命令アドレス「ａａａａ」から「ｄｄｄｄ」に対応付けて、それぞれの命令コードの実行回数を記憶している。
【００４８】
ＷＰ管理テーブル１４０は、命令コードごとに過去に一度でもライトプロテクション違反が発生したか否かを記憶する。すなわち、ＷＰ管理テーブル１４０は、例えば図５に示すように、命令アドレス「ａａａａ」から「ｄｄｄｄ」に対応付けて、それぞれの命令コードが存在するページのライトプロテクション違反が発生したか否かを示すＷＰフラグを記憶している。上述したように、ＷＰフラグが「真」であれば、この命令コードが存在するページに対するライトプロテクション違反が過去に発生したことを示し、ＷＰフラグが「偽」であれば、この命令コードが存在するページに対するライトプロテクション違反が過去に一度も発生していないことを示す。なお、ＷＰ管理テーブル１４０におけるＷＰフラグは、初期状態ではすべて「偽」となっている。
【００４９】
ＪＩＴコンパイラ１５０は、実行回数が所定の閾値以上となった命令コードに対応する変換コードを生成する。このとき、ＪＩＴコンパイラ１５０は、過去にライトプロテクション違反が一度も発生していない命令コードについてはライトプロテクションを設定することを前提としたＷＰコードを生成し、過去にライトプロテクション違反が発生した命令コードについてはライトプロテクションを設定することを前提としない非ＷＰコードを生成する。
【００５０】
具体的には、ＪＩＴコンパイラ１５０は、ＷＰ判定部１５１、ＷＰコード生成部１５２、および非ＷＰコード生成部１５３を有している。
【００５１】
ＷＰ判定部１５１は、インタプリタ１１０の閾値判定部１１５から命令コードに対応する変換コードの生成が指示されると、この命令コードが存在するページにライトプロテクションが設定されているか否かを確認する。そして、ＷＰ判定部１５１は、ライトプロテクションが設定されている場合には、ＷＰコード生成部１５２へＷＰコードを生成するように指示し、ライトプロテクションが設定されていない場合には、非ＷＰコード生成部１５３へ非ＷＰコードを生成するように指示する。
【００５２】
ここで、命令コードが存在するページにライトプロテクションが設定されているか否かは、この命令コードの実行回数が所定の閾値に到達するまでにライトプロテクション違反が発生したか否かに対応している。すなわち、実行回数が所定の閾値に到達するまでにライトプロテクション違反が一度も発生しなければ、命令コードにはライトプロテクションが設定されており、実行回数が所定の閾値に到達するまでにライトプロテクション違反が一度でも発生すれば、命令コードにはライトプロテクションが設定されていない。そして、実行回数が所定の閾値に到達するまでのライトプロテクション違反の有無は、ＷＰ管理テーブル１４０におけるＷＰフラグでも確認可能であるため、ＷＰ判定部１５１は、ＷＰ管理テーブル１４０のＷＰフラグを参照して、命令コードにライトプロテクションが設定されているか否かを判断しても良い。
【００５３】
また、ＷＰ判定部１５１は、実行対象のプログラムに対するライトプロテクション違反を検知し、ライトプロテクション違反が発生したページに対応するＷＰコードの破棄をＷＰコード生成部１５２へ指示するとともに、このページの非ＷＰコードの生成を非ＷＰコード生成部１５３へ指示する。
【００５４】
ＷＰコード生成部１５２は、ＷＰ判定部１５１の指示に従って、実行回数が所定の閾値以上となった命令コードが存在するページをライトプロテクション方式でコンパイルしてＷＰコードを生成し、変換コードテーブル１２０に登録する。ＷＰコード生成部１５２が生成するＷＰコードに対応する命令コードにはライトプロテクションが設定されており、命令コードの実行回数が所定の閾値に到達するまでにライトプロテクション違反が発生していない。
【００５５】
また、ＷＰコード生成部１５２は、ライトプロテクション違反発生時にＷＰ判定部１５１からＷＰコードの破棄を指示されると、指示された命令アドレスに対応する変換コードを変換コードテーブル１２０において確認し、この変換コードがＷＰコードであれば破棄する。
【００５６】
非ＷＰコード生成部１５３は、ＷＰ判定部１５１の指示に従って、実行回数が所定の閾値以上となった命令コードが存在するページを非ライトプロテクション方式でコンパイルして非ＷＰコードを生成し、変換コードテーブル１２０に登録する。非ＷＰコード生成部１５３が生成する非ＷＰコードに対応する命令コードにはライトプロテクションが設定されておらず、命令コードの実行回数が所定の閾値に到達するまでにライトプロテクション違反が発生している。
【００５７】
また、非ＷＰコード生成部１５２は、ライトプロテクション違反発生時にＷＰ判定部１５１から非ＷＰコードの生成を指示されると、指示された命令アドレスの命令コードから非ＷＰコードを生成し、変換コードテーブル１２０に登録する。
【００５８】
このように、ＪＩＴコンパイラ１５０は、命令コードの実行回数が所定の閾値に到達すると、実行回数が所定の閾値に到達するまでのライトプロテクション違反の有無に応じてＷＰコードおよび非ＷＰコードのどちらを生成するか決定し、決定された変換コードを生成して変換コードテーブル１２０に登録する。
【００５９】
次いで、上記のように構成されたインタプリタ１１０の動作について、図６に示すフロー図を参照しながら説明する。
【００６０】
実行対象のプログラムを実行する際、まず、インタプリタ１１０の命令フェッチ部１１１によって、プログラム中の命令コードがフェッチされる（ステップＳ１０１）。この命令コードは、変換コード実行部１１２へ出力され、変換コード実行部１１２によって変換コードテーブル１２０が検索されることにより、命令コードに対応する変換コードが既に記憶されているか否かが確認される（ステップＳ１０２）。この結果、既に変換コードが記憶されていれば（ステップＳ１０２Ｙｅｓ）、変換コード実行部１１２によって、変換コードテーブル１２０から変換コードが読み出され、実行される（ステップＳ１０３）。
【００６１】
一方、変換コードが変換コードテーブル１２０に記憶されていなければ（ステップＳ１０２Ｎｏ）、命令コードは、プロファイラ部１１３へ出力され、プロファイル対象の命令コードであるか否かが判定される（ステップＳ１０４）。この結果、命令コードがプロファイル対象でなければ（ステップＳ１０４Ｎｏ）、命令コードは命令実行部１１４へ出力され、実行される（ステップＳ１０７）。
【００６２】
また、命令コードがプロファイル対象であれば（ステップＳ１０４Ｙｅｓ）、プロファイラ部１１３によってプロファイル情報テーブル１３０に記憶された命令コードの実行回数が１インクリメントされるなどのプロファイル処理が実行される（ステップＳ１０５）。また、プロファイル処理においては、ＷＰ設定部１１６によって、命令コードが存在するページのライトプロテクションの設定が実行される。このプロファイル時の処理については、後に詳述する。
【００６３】
そして、プロファイラ部１１３によってプロファイル情報テーブル１３０に記憶された実行回数が１インクリメントされると、閾値判定部１１５によって、更新された実行回数が所定の閾値以上であるか否かが判定される（ステップＳ１０６）。この結果、実行回数が所定の閾値未満であれば（ステップＳ１０６Ｎｏ）、まだ変換コードが生成されることはないため、閾値判定部１１５から命令実行部１１４へ命令を実行するように指示され、命令実行部１１４によってプロファイラ部１１３から出力される命令コードが実行される（ステップＳ１０７）。
【００６４】
一方、命令コードの実行回数が所定の閾値以上であれば（ステップＳ１０６Ｙｅｓ）、命令コードが頻繁に実行されていることから、閾値判定部１１５によって、ＪＩＴコンパイラ１５０のＷＰ判定部１５１へ変換コードの生成が指示されるとともに（ステップＳ１０８）、変換コード実行部１１２へ変換コードの実行が指示される。そして、変換コード実行部１１２によって、ＪＩＴコンパイラ１５０による変換コードの生成が待機され、変換コード生成後、変換コードテーブル１２０から変換コードが読み出されて実行される（ステップＳ１０９）。このとき、ＪＩＴコンパイラ１５０によって生成される変換コードは、命令コードに対する過去のライトプロテクション違反の有無によって、ＷＰコードおよび非ＷＰコードのいずれかとなっている。
【００６５】
ここまでの処理により、命令フェッチ部１１１によってフェッチされた命令コードは、実行回数が所定の閾値未満であれば命令コードそのものとして実行され、実行回数が所定の閾値以上であれば対応する変換コードが実行されたことになる。そして、このとき、ＷＰ設定部１１６によって、ライトプロテクション違反が発生したか否かが監視される（ステップＳ１１０）。すなわち、ＷＰ設定部１１６によって、プロファイル処理時にライトプロテクションが設定されたページに対する書き込みが発生したか否かが判断され、ライトプロテクション違反が発生した場合には（ステップＳ１１０Ｙｅｓ）、ＷＰ設定部１１６によって、該当するページのライトプロテクションが解除されるとともに（ステップＳ１１１）、ＷＰ管理テーブル１４０において、ページ内の命令コードに対応するＷＰフラグが「真」に設定される（ステップＳ１１２）。
【００６６】
ここで、ライトプロテクション違反が発生するページに関しては、例えば命令コードとデータが混在しているなどのために、書き込みが頻繁に発生するページであると考えられ、このようなページについては、ライトプロテクション方式のＷＰコードを生成してもすぐに破棄する必要が生じる。
【００６７】
そこで、本実施の形態においては、プロファイル処理時に設定したライトプロテクションの違反が発生した場合には、このページ内の命令コードに対応するＷＰフラグを「真」に設定しておき、命令コードの実行回数が所定の閾値以上となって変換コードを生成する際に、ＷＰコードを生成することなく最初から非ＷＰコードを生成する。このため、ライトプロテクション方式のコンパイルが適していない命令コードのページについては、非ＷＰコードが生成され、コンパイルの効率化を図り、プログラムを高速に実行することができる。なお、変換コード生成の処理については、後に詳述する。
【００６８】
次に、命令フェッチ部１１１によってフェッチされた命令コードがプロファイル対象である場合のプロファイル時の処理について、図７に示すフロー図を参照しながら説明する。
【００６９】
プロファイラ部１１３において、命令コードがプロファイル対象であると判断されると、プロファイラ部１１３によって、この命令コードの実行回数がプロファイル情報テーブル１３０に記録される（ステップＳ２０１）。具体的には、プロファイラ部１１３によって、命令コードに対応付けて記憶された実行回数が１インクリメントされる。
【００７０】
また、ＷＰ設定部１１６によって、命令コードが存在するページに対してライトプロテクションが既に設定されているか否かが判断され（ステップＳ２０２）、既に設定されていれば（ステップＳ２０２Ｙｅｓ）、ライトプロテクションを維持したままプロファイル処理が終了する。
【００７１】
一方、ライトプロテクションが設定されていなければ（ステップＳ２０２Ｎｏ）、ＷＰ管理テーブル１４０が参照され、命令コードに対応するＷＰフラグが「真」であるか否かが確認される（ステップＳ２０３）。ここで、ＷＰフラグが「真」であれば（ステップＳ２０３Ｙｅｓ）、過去にライトプロテクション違反が発生したことを意味しており、この命令コードが存在するページに対する書き込みが比較的頻繁に実行されると考えられることから、ＷＰ設定部１１６によって再度ライトプロテクションが設定されることなく、プロファイル処理が終了する。また、ＷＰフラグが「偽」であれば（ステップＳ２０３Ｎｏ）、ＷＰ設定部１１６によって、この命令コードが存在するページにライトプロテクションが設定される（ステップＳ２０４）。
【００７２】
このようなプロファイル処理により、プロファイル対象の命令コードの初回実行時には、必ずライトプロテクションが設定され、その後、一度でもライトプロテクション違反が発生した命令コードについては、ライトプロテクションは解除されたままで、再びライトプロテクションが設定されることはない。同時に、一度でもライトプロテクション違反が発生した命令コードについては、ＷＰ管理テーブル１４０におけるＷＰフラグが「真」とされたままとなる。
【００７３】
このため、命令コードの実行回数が所定の閾値に到達した際、ライトプロテクションの設定の有無またはＷＰ管理テーブル１４０のＷＰフラグを参照することにより、それぞれの命令コードが比較的頻繁に書き込みが実行されるページ内の命令コードであるか否かを判定することが可能となる。したがって、次に説明するように、ライトプロテクションが設定されていないか、またはＷＰフラグが「真」である命令コードについては、再びページ内に書き込みが発生することを想定して最初から非ＷＰコードを生成し、コンパイルの効率化を図ることが可能となる。
【００７４】
図８は、本実施の形態に係るＪＩＴコンパイラ１５０の動作を示すフロー図である。ＪＩＴコンパイラ１５０は、命令コードの実行回数が所定の閾値以上となった時に、この命令コードに対応する変換コードを生成する。
【００７５】
すなわち、インタプリタ１１０の閾値判定部１１５によって命令コードの実行回数が所定の閾値以上であると判定されると、変換コード生成の指示が出され、この指示がＪＩＴコンパイラ１５０のＷＰ判定部１５１によって取得される（ステップＳ３０１）。この指示を受け、ＷＰ判定部１５１によって、コンパイル対象の命令コードが存在するページにライトプロテクションが設定されているか否かが判定される（ステップＳ３０２）。上述したように、ＷＰ判定部１５１による判定は、ＷＰ管理テーブル１４０においてコンパイル対象の命令コードに対応するＷＰフラグが「真」であるか否かの判定でも良い。
【００７６】
この判定の結果、ライトプロテクションが設定されている、もしくはＷＰフラグが「偽」である場合（ステップＳ３０２Ｙｅｓ）、この命令コードが存在するページについては、過去に一度もライトプロテクション違反が発生していないことになる。このため、以後も命令コードが存在するページに対する書き込みが比較的発生しにくいと考えられ、ＷＰ判定部１５１によって、ＷＰコード生成部１５２へ変換コードの生成が指示される。これにより、ＷＰコード生成部１５２によって、命令コードが存在するページに対するライトプロテクション方式のコンパイルが行われ、ＷＰコードが生成される（ステップＳ３０３）。このＷＰコードは、元の命令コードのアドレスに対応付けられ、変換コードテーブル１２０に記憶される。
【００７７】
一方、ＷＰ判定部１５１における判定の結果、ライトプロテクションが設定されていない、もしくはＷＰフラグが「真」である場合（ステップＳ３０２Ｎｏ）、この命令コードが存在するページについては、過去にライトプロテクション違反が発生していることになる。このため、以後も命令コードが存在するページに対する書き込みが比較的発生しやすいと考えられ、ＷＰ判定部１５１によって、非ＷＰコード生成部１５３へ変換コードの生成が指示される。これにより、非ＷＰコード生成部１５３によって、命令コードが存在するページに対する非ライトプロテクション方式のコンパイルが行われ、非ＷＰコードが生成される（ステップＳ３０４）。この非ＷＰコードは、元の命令コードの命令アドレスに対応付けられ、変換コードテーブル１２０に記憶される。
【００７８】
このようにして生成された変換コードは、変換コードテーブル１２０に登録後、既に説明したように、インタプリタ１１０の変換コード実行部１１２によって実行される。本実施の形態においては、特に非ＷＰコードが生成される場合に、一度ＷＰコードが生成されてから改めて非ＷＰコードが生成されるということがなく、変換コードが実行されるまでの時間の短縮を図ることができる。結果として、プログラムを高速に実行することができる。
【００７９】
ＷＰコードまたは非ＷＰコードの生成後、ＪＩＴコンパイラ１５０においては、ＷＰ判定部１５１によって、常にライトプロテクション違反の発生が監視される（ステップＳ３０５）。そして、ライトプロテクション違反が発生した場合には（ステップＳ３０５Ｙｅｓ）、ＷＰ判定部１５１によって、ライトプロテクション違反が発生したページのＷＰコードを破棄する旨の指示がＷＰコード生成部１５２へ出される。この指示を受け、ＷＰコード生成部１５２によって、ライトプロテクション違反が発生したページ内の命令コードに対応付けて変換コードテーブル１２０に記憶された変換コードが確認され、この変換コードがＷＰコードであれば破棄される（ステップＳ３０６）。
【００８０】
同時に、ＷＰ判定部１５１によって、ライトプロテクション違反が発生したページの非ＷＰコードを生成する旨の指示が非ＷＰコード生成部１５３へ出される。この指示を受け、非ＷＰコード生成部１５３によって、ライトプロテクション違反が発生したページの非ＷＰコードが生成され（ステップＳ３０７）、変換コードテーブル１２０に登録される。
【００８１】
これにより、実行回数が所定の閾値に到達するまでにライトプロテクション違反が発生しなかったことからＷＰコードが生成された命令コードについても、ＷＰコードの生成後、ライトプロテクション違反が発生した場合には、改めて非ＷＰコードが生成される。したがって、命令コードと変換コードの処理内容が異なってしまうことがなく、確実に命令コードと変換コードの処理内容を一致させることができる。
【００８２】
以上のように、本実施の形態によれば、命令コードの初回実行時にこの命令コードにライトプロテクションを設定し、命令コードの実行回数が所定の閾値に到達するまでライトプロテクション違反が発生しなければライトプロテクション方式で命令コードをコンパイルし、ライトプロテクション違反が発生すれば非ライトプロテクション方式で命令コードをコンパイルする。このため、命令コードの実行回数が所定の閾値に到達して変換コードを生成する際、最初から適した方式で命令コードをコンパイルすることができ、動的コンパイラによるコンパイルの効率化を図り、プログラムを高速に実行することができる。
【図面の簡単な説明】
【００８３】
【図１】図１は、２通りのコンパイル方式を説明する図である。
【図２】図２は、本発明の一実施の形態に係るコンパイル装置の要部構成を示すブロック図である。
【図３】図３は、一実施の形態に係る変換コードテーブルの例を示す図である。
【図４】図４は、一実施の形態に係るプロファイル情報テーブルの例を示す図である。
【図５】図５は、一実施の形態に係るＷＰ管理テーブルの例を示す図である。
【図６】図６は、一実施の形態に係るインタプリタの動作を示すフロー図である。
【図７】図７は、一実施の形態に係るプロファイル処理を示すフロー図である。
【図８】図８は、一実施の形態に係るＪＩＴコンパイラの動作を示すフロー図である。
【符号の説明】
【００８４】
１１０  インタプリタ
１１１  命令フェッチ部
１１２  変換コード実行部
１１３  プロファイラ部
１１４  命令実行部
１１５  閾値判定部
１１６  ＷＰ設定部
１２０  変換コードテーブル
１３０  プロファイル情報テーブル
１４０  ＷＰ管理テーブル
１５０  ＪＩＴコンパイラ
１５１  ＷＰ判定部
１５２  ＷＰコード生成部
１５３  非ＷＰコード生成部
【国際調査報告】
2008126299.tif 000011
2008126299.tif 000012