(57)【要約】【課題】  プログラムを分岐なしに処理できるプログラムの断片としてコンパイルし、これらをキャッシュにロードして処理することで処理速度を向上させることができるコンパイル方法及び情報処理装置を提供する。【解決手段】  コンピュータのメモリにロードされて実行することで以下のような機能を有するコンパイラプログラムであって、ソースプログラムを解析して、プログラムの制御について分岐する部分を検出し、ソースプログラムを分岐を含まずに実行されるプログラムの断片である分割プログラムＰ１〜Ｐ５と、分岐して実行される部分Ｃ１〜Ｃ５とに各々分割することを特徴とするコンパイラプログラムを記録する記録媒体。【選択図】図１
2007323358.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータのメモリにロードされて実行することで以下のような機能を有するコンパイラプログラムであって、
ソースプログラムを解析して、プログラムの制御について分岐する部分を検出し、
前記ソースプログラムを前記分岐を含まずに実行されるプログラムの断片である分割プログラムと、分岐して実行される部分とに各々分割することを特徴とするコンパイラプログラムを記録する記録媒体。
【請求項２】
前記コンパイラプログラムは、更に前記分割プログラムをＰＩＣコードとして目的コード化することを特徴とする請求項１記載の記録媒体。
【請求項３】
ソースプログラムを解析して、プログラムの制御について分岐する部分を検出し、
前記ソースプログラムを前記分岐を含まずに実行されるプログラムの断片である分割プログラムと、分岐して実行される部分とに各々分割することにより、ソースプログラムをコンパイルするコンパイル方法。
【請求項４】
前記分割プログラムをＰＩＣコードとして目的コード化することを特徴とする請求項３記載のコンパイル方法。
【請求項５】
第１記憶領域と前記第１記憶領域よりも読出速度が速い第２記憶領域と処理部とをもつ情報処理装置であり、
前記処理部の働きとして、ソースプログラムを解析して、プログラムの制御について分岐する部分を検出し、
前記ソースプログラムを前記分岐を含まずに実行されるプログラムの断片である分割プログラムと、分岐して実行される部分とに各々分割して前記第1記憶領域に保存し、
前記コンパイラされた分割プログラムを、前記第２記憶領域に各々ロードして実行することを具備することを特徴とする情報処理装置。
【請求項６】
前記分岐して実行される部分である仮想コードを、仮想機械のインタプリタで実行することを更に特徴とする請求項５記載の情報処理装置。
【請求項７】
前記分岐して実行される部分である仮想コードを、ＪＩＴコンパイラでネイティブコードに展開して実行することを更に特徴とする請求項５記載の情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、コンピュータプログラムのコンパイル方法に関し、特に、プログラムを分岐なしに処理できる断片に分割して処理するコンパイラプログラムを記録する媒体、コンパイル方法及びこれを伴う情報処理装置に関する。
【背景技術】
【０００２】
コンピュータプログラムを実行する際にコンパイル処理が行われるが、これに関連して、制御フロー解析等が知られている。
【０００３】
特許文献１には、プログラムを手続き毎に分割して、使用頻度の低いモジュールをアンロードすることで使用効率を向上させる技術が開示されている。
【特許文献１】特開２００３−３３０７４１公報。
【発明の開示】
【発明が解決しようとする課題】
【０００４】
上記した特許文献１の従来技術においては、プログラム中の使用頻度の低い手続きのモジュールをアンロードするものであり、一つの手続き中のあまり使用しないエラー処理等のみを排除することができないという問題がある。
【０００５】
本発明は、プログラムを分岐なしに処理できるプログラムの断片としてコンパイルし、これらをキャッシュにロードして処理することでプログラムの実行効率を向上させることができるコンパイル方法及び情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【０００６】
コンピュータのメモリにロードされて実行することで以下のような機能を有するコンパイラプログラムであって、ソースプログラムを解析して、プログラムの制御について分岐する部分を検出し、前記ソースプログラムを前記分岐を含まずに実行されるプログラムの断片である分割プログラムＰ１〜Ｐ５と、分岐して実行される部分Ｃ１〜Ｃ５とに各々分割することを特徴とするコンパイラプログラムを記録する記録媒体。
【０００７】
または、ソースプログラムを解析して、プログラムの制御について分岐する部分を検出し、前記ソースプログラムを前記分岐を含まずに実行されるプログラムの断片である分割プログラム（Ｐ１〜Ｐ５）と、分岐して実行される部分（Ｃ１〜Ｃ５）とに各々分割することにより、ソースプログラムをコンパイルするコンパイル方法である。
【発明の効果】
【０００８】
実行頻度の低いエラー処理等のプログラムの命令コード等をキャッシュメモリ等にロードすることが少なくなるため、プログラムの実行効率を向上させることができる。
【発明を実施するための最良の形態】
【０００９】
以下、この発明の実施の形態について図面を参照して詳細に説明する。  
図１は、本発明の一実施形態に係るコンパイラ機能の一例を説明する説明図。図２は、同じくコンパイラ機能を備えた情報処理システムの機能の一例を説明する説明図。図３は、同じくコンパイラ機能の一例を説明するフローチャート。図４は、同じく分割プログラムの処理の一例を示すフローチャート。図５は、同じく分割プログラム処理のサブルーティンの一例を示すフローチャート。図６は、同じくＶＭコードの実行処理の一例を示すフローチャート。図７は、同じくコンパイラ機能によるプログラム分割処理の概要の一例を示す説明図。図８は、同じくコンパイラ機能によるプログラムの分割処理の具体的な一例を示す説明図である。
【００１０】
＜本発明の一実施形態に係るコンパイル方法＞
（該コンパイル方法の趣旨）
通常、プログラムの実行時間の大部分は、プログラムのごく一部のみが占めており、この部分を高速に実行できればよい。この特性を利用して、実行頻度が高い命令コードを高速なキャッシュメモリに配置して実行することが一般的に行われている。しかし、プログラムのコードサイズが大きくなるとともに、命令キャッシュは不足し、キャッシュミスを頻発するようになり、実行効率の低下の原因となる。特に、組み込み機器では、ＬＳＩの面積を大きく占めるキャッシュメモリを大きくすることは難しいため、より効率的なキャッシュメモリの利用が必要になる。
【００１１】
規模の大きなプログラムを詳細に見ると、プログラムコードの大部分は、エラー処理が占めていることが多い。これらの処理は、通常のノーマルパスでは実行されないので、キャッシュメモリのラインサイズが十分小さければ、これらのプログラムコードがキャッシュメモリを占拠することは起きない。しかし、メモリの高速化に伴い、キャッシュのラインサイズが大きくなる傾向にあるため、キャッシュの中にエラー処理の一部がロードされてしまうことが起こりうる。
【００１２】
また、スクラッチパッドや、ローカルストレージのような、局所メモリをプログラマが意識して使うようなケースにおいては、通常、プログラムの部品単位で、コードを主メモリから局所メモリ上にＤＭＡ転送してプログラムを実行する。この場合においても、if-then-elseのような構文でエラー処理が書いてあると、ノーマルパスのプログラムと一緒にローカルメモリへプログラムコードが転送されてしまい、ローカルメモリの利用効率が悪化する原因となる。
【００１３】
一般に、プログラムの構成は、図７で後述するように、手続きＡ，Ｂ，…に分類でき、更に、処理Ａ，処理Ｂ，…，処理Ｑのように分類できる。ここで、通常のコンパイル処理であれば、手続きＡ、手続きＢは、コンパイルしたときのメモリ配置のまま、キャッシュ上にロードされるため、エラー処理がノーマルパスの処理と同時にキャッシュにロードされてしまう。
【００１４】
そこで、本発明の一実施形態に係るコンパイル方法では、図１に示すように、ソースプログラム１に対して、コンパイラ・制御フロー解析１２を行なうことにより、分岐無しに直列実行できるプログラムの断片１３に分割し、同時に制御フローを実現するＶＭコードと共に、この複数の分割プログラムの状態でプログラムを保持する。そして、実際の動作時に、必要な断片の実行アドレス位置をキャッシュ等に割り当てていくものである。
【００１５】
これにより、通常では実行されないエラー処理がキャッシュにロードされることがなく、ノーマルパスのプログラムを連続領域に配置することが可能なため、プログラムの実行効率向上につながる。また、スクラッチパッドやローカルストレージのように制限されたメモリ空間で、プログラムコードを出し入れしながら実行するような場合においても、プログラムの入れ替え回数を削減することができる。
【００１６】
（該コンパイル方法を実現するための情報処理装置）
次に、本発明の一実施形態に係るコンパイル方法を実現するための情報処理装置２０の一例を図２により説明する。該コンパイル方法を実現するための情報処理装置２０は、ＣＰＵ２２と、上述したプログラムの断片１３と制御フローを実現するＶＭコード１４とを格納する２次記憶（ハードディスク）２１とを有しており、機能的な構成として、プログラムローダ２６と、仮想マシン又はＪＩＴコンパイラ２３とを有している。更に、情報処理装置２０は、主記憶部２５と局所メモリ又はキャッシュ２４を有している。このような情報処理装置において、コンパイル処理及びプログラム処理が以下のように行なわれる。
【００１７】
（動作）
初めに、上述した情報処理装置２０において行なわれるコンパイル処理を図３のフローチャート及び図７乃至図８を用いて詳細に説明する。情報処理装置２０で実現した例えばＪａｖａ（登録商標）等の仮想マシン上に機能するＪＩＴコンパイラ等により、初めに、ソースプログラムを取得し（ステップＳ１１）、このプログラムの中に分岐が存在するかどうかを判断する（ステップＳ１２）。図７においては、処理Ｃ、処理Ｇ、処理Ｊ、処理Ｎ，処理Ｑ等に分岐が含まれることが検出されている。
【００１８】
これに基づき、プログラムをプログラムの制御が分岐無しで直列実行される部分（基本ブロックという）に分割する（ステップＳ１３）。図７においては、分割プログラムＡ，Ｂ，Ｃ，Ｄ，Ｅ等に分割され、ＶＭコードが併せて生成される。図８においては、分割プログラムＰ１乃至Ｐ５とＶＭコードＣ１乃至Ｃ５とが生成される。
【００１９】
分割したそれぞれの断片をＰＩＣコードとして目的コード化すると同時に、制御フローを仮想マシンの仮想命令列としてコード生成する。このプログラムコードの断片１３と、仮想マシンの命令コード１４がプログラムの実体であり、通常は、ハードディスクなどの２次記憶装置２１に保存しておく。このようなコンパイル処理をブログラムの全てについて行なう（ステップＳ１４）。
【００２０】
次に、プログラム実行時は、図４のフローチャートに示すように、『任意のプログラムの断片を実行する』とする命令Ｊが実行される（ステップＳ２１）。すなわち、オペランドｉをロードすると（ステップＳ２２）、ｉが示すプログラム断片Ｘが実行される（ステップＳ２３）。
【００２１】
命令Ｊによるプログラム断片Ｘの実行は、具体的には、図５のフローチャートに示すように、はじめに、ＣＰＵ２２の制御下において、ハードディスクの実体を主記憶部２５へロードし、制御構造を実行する仮想マシンの実行にしたがって、処理を進める。すなわち、プログラム断片の呼び出しという仮想命令の実行を行うタイミングで、そのプログラム断片を主記憶部２５から局所メモリ２４へロードする。具体的には、局所メモリ等２４にプログラム断片Ｘがロードされているかどうかを判断する（ステップＳ２４）。そして、ロードされていなければ、プログラム断片Ｘを局所メモリにロードしていく（ステップＳ２５）。この処理を任意のプログラムの断片に関して行なうものである（ステップＳ２６）。
【００２２】
これらの処理は、例えば、Ｊａｖａ（登録商標）等の仮想マシンによる仮想コードの処理により進行する。すなわち、図６のフローチャートに示すように、ＶＭの初期化の後に（ステップＳ３１）、この仮想コードをロードする（ステップＳ３２）。そして、命令を終了しないのであれば（ステップＳ３３）、この仮想コードの命令を実行する（ステップＳ３５）。ステップＳ３３において、命令を終了する場合は、その後、ＶＭの後始末処理を行なう（ステップＳ３４）。
【００２３】
ここで、仮想コードは、仮想機械のインタプリタで実行することも可能であるし、ＪＩＴコンパイラによってネイティブコードに展開して実行することも可能である。
【００２４】
更に、ＪＩＴコンパイル時に、プログラム断片の呼び出しフローにしたがって、ローカルメモリへのコード配置を最適化することも可能である。
【００２５】
（具体的なコンパイル処理の一例）
次に、図８を参照して、具体的なプログラムのコンパイル処理の一例を説明する。
【００２６】
図８は、ＭＰＥＧ２デコーダのＭＣ（ＭｏｔｉｏｎＣｏｍｐｅｎｓａｔｉｏｎ＝動き補償）のプログラムの一部である。ここで、ピクチャストラクチャは、多くの場合、ストリームごとに固定である。デコーダは、規格に準拠したあらゆるストリームをデコードできるようにプログラムを実装する。例えば、フレーム構造の場合は、最初のifの中が実行されるが、フィールド構造の場合は、後半のelseの部分が実行される。
【００２７】
又、モジュール単位で、高速メモリに転送する場合、両方ともメモリにロードされてしまうが、本発明の実施形態においては、どちらかだけが高速メモリにロードされることになる。
【００２８】
このようなプログラムの分割後の例が、図８の右部分に示されている。細かく言えば、if文やfor文も分割対象になるが、制御部分であるため、ここでは、コンパイラの出力としてＶＭ側のコードとして生成している。図８において、プログラムは、第１分割プログラムＰ１乃至第５分割プログラムＰ５と、５つのＶＭコードＣ１乃至Ｃ５に分割されている。
【００２９】
なお、ＶＭ側の実行コードについては、例えば、Just-In-Timeコンパイルすることで高速実行できるため、必ずしもＶＭでなければならないということはない。
【００３０】
又、上述した実施形態では、プログラムの断片への分割はコンパイラで行っているが、プログラムの記述の段階から、制御構造とプログラムのシーケンスを分割して記述することも好適である。更に、この場合に、並列実行できる部分を記述できる言語を使えば、制御フローを実行するＶＭが、並列実行できる部分を効果的にスレッドに割り当てることが可能である。
【００３１】
以上、説明したように、本発明の一実施形態に係るコンパイル処理及びプログラムの実行処理により、規模の大きなプログラムの命令コードのキャッシュミスを小さくすることが可能となる。また、スクラッチパッドやローカルストレージのような、高速メモリにソフトウェアでプログラムを出し入れして実行するような環境においては、プログラムの出し入れ回数を削減することが可能である。
【００３２】
以上記載した様々な実施形態により、当業者は本発明を実現することができるが、更にこれらの実施形態の様々な変形例を思いつくことが当業者によって容易であり、発明的な能力をもたなくとも様々な実施形態へと適用することが可能である。従って、本発明は、開示された原理と新規な特徴に矛盾しない広範な範囲に及ぶものであり、上述した実施形態に限定されるものではない。
【図面の簡単な説明】
【００３３】
【図１】本発明の一実施形態に係るコンパイラ機能の一例を説明する説明図。
【図２】本発明の一実施形態に係るコンパイラ機能を備えた情報処理システムの機能の一例を説明する説明図。
【図３】本発明の一実施形態に係るコンパイラ機能の一例を説明するフローチャート。
【図４】本発明の一実施形態に係る分割プログラムの処理の一例を示すフローチャート。
【図５】本発明の一実施形態に係る分割プログラム処理のサブルーティンの一例を示すフローチャート。
【図６】本発明の一実施形態に係るＶＭコードの実行処理の一例を示すフローチャート。
【図７】本発明の一実施形態に係るコンパイラ機能によるプログラム分割処理の概要の一例を示す説明図。
【図８】本発明の一実施形態に係るコンパイラ機能によるプログラムの分割処理の具体的な一例を示す説明図。
【符号の説明】
【００３４】
１１…ソースプログラム、１２…コンパイラ制御フローチャート解析、１３…分岐なしに処理できるプログラムの断片、１４…制御フローを実現するＶＭコード。
【図１】
2007323358.tif 000003
【図２】
2007323358.tif 000004
【図３】
2007323358.tif 000005
【図４】
2007323358.tif 000006
【図５】
2007323358.tif 000007
【図６】
2007323358.tif 000008
【図７】
2007323358.tif 000009
【図８】
2007323358.tif 000010