(57)【特許請求の範囲】
【請求項１】
ソースプログラムを解析することにより最適化を図るコンパイル方法において、
ソースプログラムに含まれる条件分岐によって動作が分割可能な処理実行単位にモジュール化するモジュール生成ステップと、
前記モジュール生成ステップによるモジュール化により生成された条件処理モジュールが実行されるか否かを確定するソースプログラム内の分岐条件確定箇所を探し出す探索ステップと、
前記探索ステップにより探し出された確定箇所の分岐条件に合致したときに実行される条件処理モジュールを、当該条件処理モジュールをメモリにロードするプログラムコードに書き換える書換ステップと、
を含み、実行されることが確定した時点で前記分岐条件に合致したときに実行される条件処理モジュールがメモリにロードされるようにソースプログラムを書き換えることを特徴とするコンパイル方法。
【請求項２】
ソースプログラムを解析することにより最適化を図るコンパイル方法において、
ソースプログラムに含まれる条件分岐によって動作が分割可能な処理実行単位にモジュール化するモジュール生成ステップと、
前記モジュール生成ステップによるモジュール化により生成された条件処理モジュールが実行されるか否かを確定するソースプログラム内の分岐条件確定箇所を探し出す探索ステップと、
前記探索ステップにより探し出された確定箇所の分岐条件に合致したときに実行される条件処理モジュールを、当該条件処理モジュールをメモリからアンロードするプログラムコードに書き換える書換ステップと、
を含み、実行されないことが確定した時点で前記分岐条件に合致したときに実行される条件処理モジュールがメモリからアンロードされるようにソースプログラムを書き換えることを特徴とするコンパイル方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンパイル方法、特にメモリ使用容量を考慮したプログラムの最適化に関する。
【０００２】
【従来の技術】
コンパイラは、一般にソースプログラムのコンパイル時に、ソースコードの不要な部分を探し出し、そのコード部分を削除するなどしてイメージサイズを削減し高速化を図るようにしている。例えば、条件分岐が組み込まれたソースプログラムにおいて、入力値がいかなる値であっても実行されることのないソースコード部分が組み込まれていたときには、そのソースコードを削除して実行イメージを生成する。
【０００３】
【発明が解決しようとする課題】
しかしながら、従来のコンパイル方法では、上記のようにプログラムの最適化を図っているが、プログラム実行時において最適化を実行するようなことはしていなかった。例えば、プログラム実行開始時において入力を促し、その入力値がＯＮのときには処理Ａを実行し、他方ＯＦＦのときには処理Ｂを実行するようなプログラムの場合、一方の処理プログラムは必ず実行されないことになる。しかしながら、従来のコンパイル方法では、双方の処理プログラムがメモリにロードされる場合があった。処理Ａと処理Ｂのイメージが同じサイズの場合は、プログラムの実行に必要な容量の２倍のメモリを消費することになる。
【０００４】
本発明は以上のような問題を解決するためになされたものであり、その目的は、メモリの使用容量の削減を図ることのできるコンパイル方法を提供することにある。
【０００５】
【課題を解決するための手段】
以上のような目的を達成するために、本発明に係るコンパイル方法は、ソースプログラムを解析することにより最適化を図るコンパイル方法において、ソースプログラムに含まれる条件分岐によって動作が分割可能な処理実行単位にモジュール化するモジュール生成ステップと、前記モジュール生成ステップによるモジュール化により生成された条件処理モジュールが実行されるか否かを確定するソースプログラム内の分岐条件確定箇所を探し出す探索ステップと、前記探索ステップにより探し出された確定箇所の分岐条件に合致したときに実行される条件処理モジュールを、当該条件処理モジュールをメモリにロードするプログラムコードに書き換える書換ステップとを含み、実行されることが確定した時点で前記分岐条件に合致したときに実行される条件処理モジュールがメモリにロードされるようにソースプログラムを書き換えるものである。
【０００６】
また、他の発明に係るコンパイル方法は、ソースプログラムを解析することにより最適化を図るコンパイル方法において、ソースプログラムに含まれる条件分岐によって動作が分割可能な処理実行単位にモジュール化するモジュール生成ステップと、前記モジュール生成ステップによるモジュール化により生成された条件処理モジュールが実行されるか否かを確定するソースプログラム内の分岐条件確定箇所を探し出す探索ステップと、前記探索ステップにより探し出された確定箇所の分岐条件に合致したときに実行される条件処理モジュールを、当該条件処理モジュールをメモリからアンロードするプログラムコードに書き換える書換ステップとを含み、実行されないことが確定した時点で前記分岐条件に合致したときに実行される条件処理モジュールがメモリからアンロードされるようにソースプログラムを書き換えるものである。
【０００７】
【発明の実施の形態】
以下、図面に基づいて、本発明の好適な実施の形態について説明する。
【０００８】
実施の形態１．
図１は、本発明に係るコンパイル方法を実施するコンパイル装置を示した構成図である。本実施の形態におけるコンパイル装置１は、一般的なコンピュータで実現でき、ハードウェア構成自体には特徴的なものはない。図１には、コンパイルを実行するＣＰＵ２と、メモリ３と、ディスク装置４とが示されている。ディスク装置４には、本実施の形態において特徴的な方法でコンパイルを実行するコンパイラ、コンパイル対象のソースプログラム、コンパイラにより生成された実行イメージが格納される。本実施の形態では、便宜的に１台のみを示したが、各ファイルをどの記憶装置に格納するかは、本発明の要旨ではない。実行イメージは、メモリ３にロードされ、ＣＰＵ２により実行される。
【０００９】
本実施の形態において特徴的なことは、プログラム実行時において実行されないことが確定した条件処理モジュールをメモリにロードしない、換言すると、実行されることが確定した条件処理モジュールのみをメモリにロードする実行イメージを生成することであるが、ここで、本発明の基本的な技術的思想について説明する。
【００１０】
例えば、図２（ａ）に示したようなプログラム（プログラム名：ｐｒｇ１）があるとする。このプログラムでは、変数”Ａ”が入力された時点でいずれかの処理が選択的に実行される。つまり、１が入力されれば処理１が実行され、処理２は実行されない。一方、１以外の値が入力されれば処理２が実行され、処理１は実行されない。例えば、１が入力されたとき、処理２のコード部分は不要であり、メモリから削除されても何の問題もない。つまり、変数”Ａ”に１が入力された時点でｐｒｇ１は図２（ｂ）に示したコードのみで十分である。逆に変数”Ａ”に１以外の値が入力された時点でｐｒｇ１は図２（ｃ）に示したコードのみで十分である。
【００１１】
しかし、実際には、変数”Ａ”がいかなる値になるかは、実行時までわからない。従って、入力データ値によって動的に最適なコードを生成するには、図３に示したようなコードでプログラムを生成する必要がある。
【００１２】
ｐｒｇ４は、ｐｒｇ１に比べ、はるかに非効率的ではあるが、プログラムの構造次第では効率性が逆転する場合がある。例えば、図４（ａ）に示したｐｒｇ５は、”Ａ”が１のときの最適なプログラムコード及び”Ａ”が１以外の値のときの最適なプログラムコードは、それぞれ図４（ｂ），（ｃ）に示したようになる。
【００１３】
ｐｒｇ６，ｐｒｇ７は、ｐｒｇ５に比べ、”Ａ”が１であるかをループ毎に判断しないので、その分、処理速度は速くなり、ループの回数が多ければ多いほど、この効果は大になる。図４（ａ）に示したｐｒｇ５を条件分岐を先に行うよう、つまり、図５に示したようにコーディングしておけばよいようにも考えられる。
【００１４】
しかしながら条件分岐の数が多くなってくると、条件分岐を先に行うようにソースプログラムを書き換えることは、困難になってくるので現実的でない。仮に、条件分岐を先に行うように書き換えることができたとしても重複した記載（図５で例示すると”ＦＯＲ  Ｉ＝１  ＴＯ  １０００００”と”ＮＥＸＴ  Ｉ”）が膨大になる。すなわち、書き換えられたソースプログラムに基づく実行イメージは、巨大化し、メモリ効率が悪くなる。
【００１５】
そこで、本実施の形態におけるコンパイラは、次のようにソースプログラムをコンパイルする。この処理の流れを図６に示したフローチャートを用いて説明する。
【００１６】
ステップ１０１において、まず、コンパイラは、入力された処理対象とするソースプログラムを解析することにより条件分岐を見つけると、その条件分岐によって分割される処理実行単位に分割する。例えば、図２（ａ）に示したｐｒｇ１では、”ＩＮＰＵＴ  Ａ”と”（処理１）”と”（処理２）”のブロックに分割される。各処理は、”ＩＦ”と”ＥＬＳＥ”と”ＥＮＤＩＦ”の組合せを探すことでブロック化することができる。本実施の形態では、指定された条件によりいずれかが選択され実行されるモジュールを特に条件処理モジュールと称することにする。
【００１７】
ステップ１０２において、コンパイラは、条件処理モジュールが実行されるか否かを確定するソースプログラム内の分岐条件確定箇所を探し出す。図２（ａ）に示した例では、入力された”Ａ”により分岐する”ＩＦ  Ａ＝１  ＴＨＥＮ”、”ＥＬＳＥ”がこれに相当する。
【００１８】
ステップ１０３において、コンパイラは、分岐条件確定箇所の後段に、その分岐条件に合致したときに実行する条件処理モジュールを組み込むようなソースコードを組み込む。本実施の形態における処理においては、図２（ａ）に示したソースプログラムは図３に示したソースプログラムに書き換えられ、実行イメージが生成されることになる。図７（ａ）には図２（ａ）に相当する模式図が、図７（ｂ）には図３に相当する模式図がそれぞれ示されているが、ステップ１０３においてソースプログラムは、図７（ｂ）において模式したソースプログラムに書き換えられる。
【００１９】
以上のようにしてソースプログラムを書き換え、実行イメージを生成することになるが、この実行イメージを実行したときの行われる最適化について以下に説明する。
【００２０】
実行イメージの実行中に何らかの入力若しくは処理結果が得られたことにより分岐条件が確定されたとする。図３に示した例では、”ＩＮＰＵＴ  Ａ”に対して何らかの値が入力されることにより”Ａ”の値は確定する。本実施の形態においては、このときになってはじめて”Ａ”が１のときには処理１がメモリ上にロードされ、”Ａ”が１以外の値のときには処理２がメモリ上にロードされる。つまり、本実施の形態では、実質的に図７（ｃ）に示したいずれかのプログラムを実行することになる。
【００２１】
本実施の形態によれば、以上のように実行されることのないソースプログラム部分、上記例では処理１若しくは処理２のいずれかはメモリにロードされることはないので、この実行イメージを実行する際に要するメモリ容量を削減することができる。
【００２２】
なお、上記実施の形態では、”Ａ”の値が入力されるときを分岐条件が確定する場合の例として説明したが、必ずしも入力されるときに限られるわけではなく、何らかの処理によって変数の値が確定するときも分岐条件が確定する場合に相当する。
【００２３】
実施の形態２．
上記実施の形態１では、実行イメージの実行中に分岐条件が確定されたとき、処理対象とするプログラム部分のみをメモリ３にロードする。しかし、場合によっては、実行しない部分が既にメモリ３にロードされている場合もあり得る。そこで、本実施の形態では、分岐条件が確定したことによって実行されないことが確定した時点で該当する条件処理モジュールをメモリ３から積極的にアンロードする実行イメージを生成するようにする。すなわち、上記例に基づくと、ソースプログラムの処理１の実行部分に処理２をメモリ３からアンロードするプログラムコードを組み込むことになる。
【００２４】
このように、メモリ３からアンロードすることでメモリの使用容量を削減することによって高速化を図ることができる。
【００２５】
【発明の効果】
本発明によれば、プログラム実行時において前記条件確定箇所における判定により実行されることが確定した条件処理モジュールのみをメモリにロードするようにしたので、メモリの使用容量の削減を図ることができ、ひいては処理の高速化を図ることができる。
【００２６】
また、プログラム実行時において前記条件確定箇所における判定により実行されないことが確定した条件処理モジュールをメモリからアンロードするようにしたので、メモリの使用容量の削減を図ることができ、ひいては処理の高速化を図ることができる。
【図面の簡単な説明】
【図１】本発明に係るコンパイル方法を実施するコンパイル装置を示した構成図である。
【図２】実施の形態１におけるコンパイル方法を説明するために用いるプログラムの例を示した図である。
【図３】実施の形態１におけるコンパイル方法を説明するために用いるプログラムの例を示した図である。
【図４】実施の形態１におけるコンパイル方法を説明するために用いるプログラムの例を示した図である。
【図５】実施の形態１におけるコンパイル方法を説明するために用いるプログラムの例を示した図である。
【図６】実施の形態１におけるコンパイル方法を示したフローチャートである。
【図７】実施の形態１においてプログラムが変換される遷移を示した模式図である。
【符号の説明】
１  コンパイル装置、２  ＣＰＵ、３  メモリ、４  ディスク装置。
【図１】
0003614372.tif 000002
【図２】
0003614372.tif 000003
【図３】
0003614372.tif 000004
【図４】
0003614372.tif 000005
【図５】
0003614372.tif 000006
【図６】
0003614372.tif 000007
【図７】
0003614372.tif 000008