(57)【要約】【課題】プログラム変換装置により生成・出力されるプログラムのスタックの使用量を削減する。【解決手段】解析部１０７において、引数の使用区間及び自動変数の使用区間を解析し、割付部１１１において、前記解析部１０７の解析結果を用いて、前記引数の使用区間と前記自動変数の使用区間とが重なるか否かを判定し、それらの使用区間が重ならない場合には、自動変数を作業用領域に割り付けることなく、引数領域に割り付ける。【選択図】図２
2008305337.tif 000002
【特許請求の範囲】
【請求項１】
サブルーチン間で共有される変数Ａの使用区間、及びサブルーチン内のみで使用される変数Ｂの使用区間を解析する解析部と、
前記変数Ａ、Ｂの使用区間が重ならない場合に、前記変数Ａの割り付けメモリに前記変数Ｂを割り付ける割付部とを備えた
ことを特徴とするプログラム変換装置。
【請求項２】
前記請求項１記載のプログラム変換装置において、
前記変数Ａは実引数であり、
前記変数Ｂは自動変数である
ことを特徴とするプログラム変換装置。
【請求項３】
前記請求項１記載のプログラム変換装置において、
前記変数Ａは仮引数であり、
前記変数Ｂは自動変数である
ことを特徴とするプログラム変換装置。
【請求項４】
前記請求項２又は３記載のプログラム変換装置において、
前記解析部は、前記実引数又は前記仮引数と前記自動変数とが生存区間内で同値であることを解析し、
前記割付部は、同値である自動変数を実引数領域又は仮引数領域に優先的に割り付ける
ことを特徴とするプログラム変換装置。
【請求項５】
前記請求項１〜４の何れか一項に記載のプログラム変換装置において、
デバッグ情報を生成しない場合のみ、使用区間の解析、及びメモリの割り付けを行う
ことを特徴とするプログラム変換装置。
【請求項６】
通常の変数データ保持領域とは別に、実引数の値を格納するメモリ領域Ａを確保し、
実行時、関数呼び出しが実行される度に実引数の値を前記メモリ領域Ａにコピーし、
実引数の値を参照する場合に前記メモリ領域Ａを参照する
ことを特徴とするデバッグ装置。
【請求項７】
サブルーチン間で共有される変数Ａの使用区間を解析するステップと、
サブルーチン内のみで使用される変数Ｂの使用区間を解析するステップと、
前記変数Ａ、Ｂの使用区間が重ならない場合に、前記変数Ａの割り付けメモリに前記変数Ｂを割り付けるステップとを備えた
ことを特徴とするプログラム変換方法。
【請求項８】
サブルーチン間で共有される変数Ａの使用区間を解析し、
サブルーチン内のみで使用される変数Ｂの使用区間を解析し、
前記変数Ａ、Ｂの使用区間が重ならない場合に、前記変数Ａの割り付けメモリに前記変数Ｂを割り付ける
ことを特徴とするプログラム。
【請求項９】
プログラム変換を行う記憶媒体であって、
サブルーチン間で共有される変数Ａの使用区間を解析し、
サブルーチン内のみで使用される変数Ｂの使用区間を解析し、
前記変数Ａ、Ｂの使用区間が重ならない場合に、前記変数Ａの割り付けメモリに前記変数Ｂを割り付ける
ことを特徴とする記憶媒体。
【請求項１０】
通常の変数データ保持領域とは別に、実引数の値を格納するメモリ領域Ａを確保するステップと、
実行時、関数呼び出しが実行される度に実引数の値を前記メモリ領域Ａにコピーするステップと、
実引数の値を参照する場合に前記メモリ領域Ａを参照するステップとを備えた
ことを特徴とするデバッグ方法。
【請求項１１】
通常の変数データ保持領域とは別に、実引数の値を格納するメモリ領域Ａを確保し、
実行時、関数呼び出しが実行される度に実引数の値を前記メモリ領域Ａにコピーし、
実引数の値を参照する場合に前記メモリ領域Ａを参照する
ことを特徴とするプログラム。
【請求項１２】
通常の変数データ保持領域とは別に、実引数の値を格納するメモリ領域Ａを確保し、
実行時、関数呼び出しが実行される度に実引数の値を前記メモリ領域Ａにコピーし、
実引数の値を参照する場合に前記メモリ領域Ａを参照する
ことを特徴とする記憶媒体。
【請求項１３】
前記請求項１記載のプログラム変換装置と、
前記請求項６記載のデバッグ装置とを備えた
ことを特徴とするプログラム開発システム。
【請求項１４】
前記請求項１〜４の何れか一項に記載のプログラム変換装置と、
前記請求項６記載のデバッグ装置とを備え、
前記プログラム変換装置は、さらに、前記デバッグ装置に入力されるデバッグ情報を生成するデバッグ情報生成部を有し、
前記デバッグ装置は、前記デバッグ情報に応じて処理動作を行う
ことを特徴とするプログラム開発システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム変換装置、その記憶領域割り付け方法、及び、そのプログラムに係わり、特に、プログラミング言語などにおいて宣言される変数や構造体のメモリ配置を行うコンパイラ技術、すなわち一般的に記憶領域割り付けと呼ばれる技術のプログラム変換装置、その記憶領域割り付け方法及びそのプログラム、コンパイラを含んだプログラム開発システムに関するものである。
【背景技術】
【０００２】
近年、開発効率を高めるために、Ｃ言語に代表される高級言語とそれを機械言語に変換するプログラム変換装置とが多用されている。これらを用いて開発される製品は、年々ダウンサイズや省コスト化が求められており、使用されるハード機器の制約が大きくなってきている。それに伴い、プログラムにおけるメモリ使用量の削減が必須となっている。従来のプログラム変換装置では、熟練したアセンブラプログラマに匹敵するようなメモリ使用量を削減したアセンブラコードが生成できず、これに如何に近づけるかが課題であり、様々な試みが行われている。
【０００３】
その試みの１つとして、プログラム変換装置により仮想的に切り分けられた特殊なメモリ領域であるスタックの使用量を削減する技術がある。このスタックは、関数毎に使用する局所的なデータを格納するメモリ領域であり、プログラム実行における関数使用時に必要に応じて確保される。関数は同じ関数から何度も呼び出されること（再起呼び出し）があり、そのような場合には１関数あたりのスタック使用量を減らすことが大幅なメモリ使用量の削減に繋がる。
【０００４】
例えば、特許文献１記載の技術では、変数のスタックへの配置順を最適化することにより、スタック使用量の削減を行っている
また、スタックとは異なるが、特許文献２記載の技術では、関数毎に使用される変数である自動変数のメモリ配置において、同時に使用されない関数の自動変数同士で同じメモリ領域を使いまわすことにより、メモリ使用量を削減している。
【特許文献１】特開平８−１５３００６号公報
【特許文献２】特開２０００−１１２７６７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
しかしながら、前記特許文献１及び前記特許文献２記載の技術においては、同一メモリ領域を複数の変数で共有しないことや、共有する場合であっても自動変数同士といったような同一の属性の変数のみでしか共有しないことにより、スタック使用量の削減余地が残るという課題があった。
【０００６】
そこで従来の課題を解決するために、異なる属性の変数、例えば引数及び自動変数の使用区間をそれぞれ解析し、それぞれ使用区間が重ならない場合には属性が異なるような変数でも同一のスタック領域に割り付け、スタック使用量のさらなる削減を図る。
【課題を解決するための手段】
【０００７】
具体的に、請求項１記載の発明のプログラム変換装置は、サブルーチン間で共有される変数Ａの使用区間、及びサブルーチン内のみで使用される変数Ｂの使用区間を解析する解析部と、前記変数Ａ、Ｂの使用区間が重ならない場合に、前記変数Ａの割り付けメモリに前記変数Ｂを割り付ける割付部とを備えたことを特徴とする。
【０００８】
かかる構成により、スタック使用量を削減できる。
【０００９】
請求項２記載の発明は、前記請求項１記載のプログラム変換装置において、前記変数Ａは実引数であり、前記変数Ｂは自動変数であることを特徴とする。
【００１０】
かかる構成により、実引数領域を有効に使用し、スタック使用量を削減できる。
【００１１】
請求項３記載の発明は、前記請求項１記載のプログラム変換装置において、前記変数Ａは仮引数であり、前記変数Ｂは自動変数であることを特徴とする。
【００１２】
かかる構成により、仮引数領域を有効に使用し、さらにスタック使用量を削減できる。
【００１３】
請求項４記載の発明は、前記請求項２又は３記載のプログラム変換装置において、前記解析部は、前記実引数又は前記仮引数と前記自動変数とが生存区間内で同値であることを解析し、前記割付部は、同値である自動変数を実引数領域又は仮引数領域に優先的に割り付けることを特徴とする。
【００１４】
かかる構成により、スタック使用量の削減に加え、冗長な命令コードの削減によるプログラム実行時間の軽減や、命令コードを格納するメモリ領域使用量の削減ができる。
【００１５】
請求項５記載の発明は、前記請求項１〜４の何れか一項に記載のプログラム変換装置において、デバッグ情報を生成しない場合のみ、使用区間の解析、及びメモリの割り付けを行うことを特徴とする。
【００１６】
本発明を使用すると引数領域に自動変数が上書きされることによりデバッグ時に正しく引数の値が表示されなくなるが、かかる構成により、デバッグ時には引数領域に自動変数を上書きしないため、正しく引数の値を表示できる。
【００１７】
請求項６記載の発明のデバッグ装置は、通常の変数データ保持領域とは別に、実引数の値を格納するメモリ領域Ａを確保し、実行時、関数呼び出しが実行される度に実引数の値を前記メモリ領域Ａにコピーし、実引数の値を参照する場合に前記メモリ領域Ａを参照することを特徴とする。
【００１８】
かかる構成により、デバッガが引数の値を異なるメモリ領域にコピーするため、正しく引数の値を表示できる。
【００１９】
請求項７記載の発明のプログラム変換方法は、サブルーチン間で共有される変数Ａの使用区間を解析するステップと、サブルーチン内のみで使用される変数Ｂの使用区間を解析するステップと、前記変数Ａ、Ｂの使用区間が重ならない場合に、前記変数Ａの割り付けメモリに前記変数Ｂを割り付けるステップとを備えたことを特徴とする。
【００２０】
請求項８記載の発明のプログラムは、サブルーチン間で共有される変数Ａの使用区間を解析し、サブルーチン内のみで使用される変数Ｂの使用区間を解析し、前記変数Ａ、Ｂの使用区間が重ならない場合に、前記変数Ａの割り付けメモリに前記変数Ｂを割り付けることを特徴とする。
【００２１】
請求項９記載の発明の記憶媒体は、プログラム変換を行う記憶媒体であって、サブルーチン間で共有される変数Ａの使用区間を解析し、サブルーチン内のみで使用される変数Ｂの使用区間を解析し、前記変数Ａ、Ｂの使用区間が重ならない場合に、前記変数Ａの割り付けメモリに前記変数Ｂを割り付けることを特徴とする。
【００２２】
請求項１０記載の発明のデバッグ方法は、通常の変数データ保持領域とは別に、実引数の値を格納するメモリ領域Ａを確保するステップと、実行時、関数呼び出しが実行される度に実引数の値を前記メモリ領域Ａにコピーするステップと、実引数の値を参照する場合に前記メモリ領域Ａを参照するステップとを備えたことを特徴とする。
【００２３】
請求項１１記載の発明のプログラムは、通常の変数データ保持領域とは別に、実引数の値を格納するメモリ領域Ａを確保し、実行時、関数呼び出しが実行される度に実引数の値を前記メモリ領域Ａにコピーし、実引数の値を参照する場合に前記メモリ領域Ａを参照することを特徴とする。
【００２４】
請求項１２記載の発明の記憶媒体は、通常の変数データ保持領域とは別に、実引数の値を格納するメモリ領域Ａを確保し、実行時、関数呼び出しが実行される度に実引数の値を前記メモリ領域Ａにコピーし、実引数の値を参照する場合に前記メモリ領域Ａを参照することを特徴とする。
【００２５】
請求項１３記載の発明のプログラム開発システムは、前記請求項１記載のプログラム変換装置と、前記請求項６記載のデバッグ装置とを備えたことを特徴とする。
【００２６】
かかる構成により、スタック使用量を削減した上で、デバッグ時に正しく引数の値を表示できるプログラム開発システムとなる。
【００２７】
請求項１４記載の発明のプログラム開発システムは、前記請求項１〜４の何れか一項に記載のプログラム変換装置と、前記請求項６記載のデバッグ装置とを備え、前記プログラム変換装置は、さらに、前記デバッグ装置に入力されるデバッグ情報を生成するデバッグ情報生成部を有し、前記デバッグ装置は、前記デバッグ情報に応じて処理動作を行うことを特徴とする。
【００２８】
かかる構成により、スタック使用量を削減した上でデバッグ時に正しく引数の値を表示できることに加え、必要時にのみデバッグ装置は引数のコピーを行うことになり、デバッグ速度の向上や、デバッグ装置のメモリ使用量を削減できる。
【発明の効果】
【００２９】
以上説明したように、本発明によるプログラム変換装置によれば、関数毎のスタック使用量を削減できる。
【発明を実施するための最良の形態】
【００３０】
以下、本発明の実施形態のプログラム変換装置等を図面に基づいて説明する。
【００３１】
尚、実施形態において同じ符号を付した構成要素は同様の動作を行うので、再度の説明を省略する場合がある。
【００３２】
（実施形態１）
図１は、本発明の実施形態１のプログラム変換装置における全体構成を示すブロック図である。
【００３３】
同図において、プログラム変換装置１０１は、構文解析部１０２、最適化部１０３、資源割付部１０４、及びコード生成部１０５を具備する。
【００３４】
前記構文解析部１０２は、入力ファイル１００を解析して、中間コードと呼ばれるプログラム変換装置１０１の内部でのみ使用されるプログラムに変換する。
【００３５】
前記最適化部１０３は、前記構文解析部１０２で変換された中間コードに対して様々なコンパイル最適化を行い、中間コードより生成される出力ファイル１０６の実行速度性能、使用メモリの省サイズ化を行う。
【００３６】
前記資源割付部１０４は、中間コードに対して必要なリソース（レジスタやメモリ）を割り付ける。前記資源割付部１０４は、その内部にレジスタ割付部１１５とメモリ割付部１１０とを具備し、それぞれは後述する図２に示すように解析部１０７及び割付部１１１を有する。
【００３７】
前記コード生成部１０５は、資源を割り付けた中間コードから出力ファイル１０６を生成する。
【００３８】
尚、便宜上、図１には入力ファイル１００及び出力ファイル１０６を併せて記載している。前記入力ファイル１００は、Ｃ言語等で記述されたソースプログラムを内容とするファイルである。また、出力ファイル１０６は、入力ファイル１００の内容であるソースプログラムを翻訳した結果として生成されるアセンブラを格納したファイルである。
【００３９】
以下、図１を用いて、本実施形態のプログラム変換装置１０１の概略動作について説明する。
【００４０】
入力ファイル１００は、プログラム変換装置１０１内の構文解析部１０２で中間コードに変換され、最適化部１０３で最適化され、資源割付部１０４でレジスタやスタックなどの資源を割り付けられ、コード生成部１０５でアセンブラに変換され、出力ファイル１０６に格納される。
【００４１】
本発明は、メモリ割付部１１０内の解析部１０７及び割付部１１１（図２参照）に関するものである。
【００４２】
本実施形態のプログラム変換装置１０１において、構文解析部１０２、最適化部１０３、資源割付部１０４のメモリ割付部１１０以外、及びコード生成部１０５は、従来のコンパイラにおける処理と同等であるので、その説明は省略する。
【００４３】
図２は、本実施形態のメモリ割付部１１０における全体構成を示すブロック図である。
【００４４】
同図において、メモリ割付部１１０は、引数の使用区間及び自動変数の使用区間を解析する解析部１０７と、前記解析部１０７で解析された情報に基づいて引数及び自動変数にメモリ（スタック）を割り付ける割付部１１１とを具備する。前記解析部１０７の内部には、引数使用区間解析部１０８と、自動変数使用区間解析部１０９とを備え、前記割付部１１１の内部には、引数領域−引数割付部１１２と、引数領域−自動変数割付部１１３と、作業用領域−自動変数割付部１１４とを備えている。ここで、使用区間とは変数の定義から最終使用までを意味する。
【００４５】
前記解析部１０７において、前記引数使用区間解析部１０８は、引数の使用区間を解析し、前記自動変数使用区間解析部１０９は、自動変数の使用区間を解析する。
【００４６】
前記割付部１１１において、前記引数領域−引数割付部１１２は、引数使用区間解析部１０８で解析された情報を基に、引数格納領域に実引数を割り付ける。ここで、実引数とは、関数使用時に関数に渡される引数のことである。
【００４７】
また、引数領域−自動変数割付部１１３は、引数使用区間解析部１０８及び自動変数使用区間解析部１０９で解析された情報を基に、引数格納領域に自動変数を割り付ける。ここで、自動変数とは、関数内でのみ使用される変数のことである。
【００４８】
さらに、作業用領域−自動変数割付部１１４は、自動変数使用区間解析部１０９で解析された結果と、引数領域−自動変数割付部１１３での割り付け結果を基に、作業用領域に自動変数を割り付ける。
【００４９】
以下、メモリ割付部１１０の動作について説明する。
【００５０】
メモリ割り付け前の中間コード２００は、最適化部１０３において最適化された中間コードであり、メモリ割付部１１０ではこの中間コードにメモリを割り付ける。この際、解析部１０７内の引数使用区間解析部１０８、自動変数使用区間解析部１０９で、引数の使用区間及び自動変数の使用区間の解析が行われる。
【００５１】
使用区間の解析を行われたメモリ割り付け前の中間コードは、割付部１１１内の引数領域−引数割付部１１２、引数領域−自動変数割付部１１３、及び作業用領域−自動変数割付部１１４において、段階的にメモリを割り付けられ、メモリ割り付け後の中間コード２０１として出力される。
【００５２】
ここで、前記メモリ割付部１１０の解析部１０７、引数使用区間解析部１０８、自動変数使用区間解析部１０９、割付部１１１内の引数領域−引数割付部１１２、及び作業用領域−自動変数割付部１１４は、従来のコンパイラにおける処理と同等であるので、その説明は省略する。
【００５３】
以下、引数領域−自動変数割付部１１３の動作について説明する。
【００５４】
図３は、本実施形態の引数領域−自動変数割付部１１３における処理動作を示すフローチャート図である。
【００５５】
引数領域−自動変数割付部１１３が、引数領域−引数割付部１１２の出力中間コードを受け付けると、まず、全ての自動変数を実引数領域割付け候補リストに入れる（ステップＳ３０１）。実引数領域割付け候補リストに格納する自動変数がない、若しくは引数領域−自動変数割付部１１３の自動変数の割り付け過程で実引数領域割付け候補リスト内の自動変数が無くなれば（ステップＳ３０２）、ｎｏの分岐に進んで処理を終了するが、実引数領域割付け候補リスト内に自動変数がある限りステップＳ３０２においてｙｅｓの分岐に進み、実引数領域割付け候補リストから１つ自動変数を選択し（ステップＳ３０３）、以降の処理を行う。
【００５６】
実引数領域割付け候補リストから１つ選択された自動変数の割付先候補として、全ての実引数領域を自動変数の割付先リストに入れる（ステップＳ３０４）。自動変数の割付先リストに格納する実引数領域がない場合や、自動変数の割付先リストに格納されていた実引数領域が以降の処理により全てなくなっていた場合は（ステップＳ３０５）、ｎｏの分岐に進み、選択されている自動変数を実引数領域割付け候補リストから抜く処理（ステップＳ３１１）を経て、ステップＳ３０２の処理に戻る。
【００５７】
自動変数の割付先リストに実引数領域が存在する場合は、ステップＳ３０５のｙｅｓの分岐に進み、割付先リストから１つ実引数領域を選択する（ステップＳ３０６）。
【００５８】
それぞれ選択された自動変数の使用区間と実引数領域の使用区間が重なる場合は（ステップＳ３０７）、ｙｅｓの分岐に進み、実引数領域を自動変数の割付先リストから抜く処理（ステップＳ３１０）を経て、ステップＳ３０５の処理に戻る。
【００５９】
尚、実引数領域の使用区間には図１の引数領域−引数割付部１１２の結果を用いる。
【００６０】
それぞれ選択された自動変数の使用区間と実引数領域の使用区間が重ならない場合は、それぞれ選択された実引数領域に自動変数を割り付け（ステップＳ３０８）、選択された自動変数の使用区間を実引数領域の使用区間に追加することにより更新し（ステップＳ３０９）、ステップＳ３１１を経て、ステップＳ３０２の処理に戻る。
【００６１】
以上の処理を終え、実引数領域に割り付けられなかった自動変数は、図２の作業用領域−自動変数割付部１１４において、作業用領域に割り付ける。
【００６２】
尚、図３において、全ての処理を行う前に、実引数領域が存在するかを確認し、存在しない場合は図３の処理を行わないようにして、冗長な処理を削減しても良い。
【００６３】
次に、図４のソースコードを入力プログラムとして用いて、引数領域−自動変数割付部１１３の具体的な動作を説明する。
【００６４】
図４の入力プログラムに対し、解析部１０７で使用区間解析を行うと図５のような解析結果となる。図５の結果を用いて、引数領域−引数割付部１１２において引数領域に引数を割り付けると、図６の割り付け結果となり、これら図５と図６の結果を用いて引数領域−自動変数割付部１１３において、引数領域への自動変数の割り付けを行う。
【００６５】
引数領域−自動変数割付部１１３では、まず、全ての自動変数を実引数領域割付け候補リストに入れる（ステップＳ３０１）。これにより実引数領域割付リストにはａ、ｂ、ｃ、ｄが入れられる。実引数領域割付リストにａ、ｂ、ｃ、ｄが格納されているため、ステップＳ３０２ではｙｅｓとなる。ステップＳ３０３でａを選択し、ステップＳ３０４でａの割り付け先リストにｓｐ、ｓｐ＋４を入れる。
【００６６】
ステップＳ３０５では割り付け先リストにｓｐ、ｓｐ＋４が入っているのでｙｅｓとなる。
【００６７】
ステップＳ３０６で割付先リストからｓｐを選択し、ステップＳ３０７でａとｓｐの使用区間の重なりを確認する。使用区間は重ならないため、ｎｏとなり、ステップＳ３０８でａにｓｐを割り付ける。ステップＳ３０９でｓｐの使用区間にａの使用区間を追加し、ステップＳ３１１でａを実引数領域割付け候補リストから抜き、ステップＳ３０２の判定処理に戻る。
【００６８】
処理を続けると、ｂについても同様に実引数領域ｓｐに割付ける。
【００６９】
ｃ、ｄについては、全ての実引数領域の使用区間とｃ、ｄの使用区間が重なるため、ステップＳ３０７の処理により全てｙｅｓとなり、ｎｏ側に分岐せずに処理が続く。最終的にステップＳ３０２でｎｏとなり、ｃ、ｄの割付けを行わないまま引数領域−自動変数割付部１１３における処理は終了する。
【００７０】
ｃ、ｄは、次の作業用領域−自動変数割付部１１４の処理で作業用領域に割付ける。
【００７１】
結果として、図７のように自動変数ａ、ｂに実引数領域ｓｐを割付けることができる。
【００７２】
従来技術では、図８のように６ワードのスタック領域を必要として図９のような出力コードが得られるが、本実施では、図１０のように５ワードのスタック領域とすることができ、図１１のような出力コードが出力ファイル１０６に格納される。
【００７３】
以上、本実施の形態によれば、関数毎のスタック領域の使用量を削減できる。その関数が再帰的に呼び出される場合、削減量は、呼び出し回数×関数毎のスタック削減分となり、非常に大きなスタック使用量の削減効果が得られる。
【００７４】
尚、本実施形態では、ｉｎｔ型の変数を例として説明を行ったが、引数が他のスカラ型や集合型などの他の型に対しても、領域を複数に分割するなどの手段を用いて、同様にスタック使用量を削減できることは言うまでもない。
【００７５】
また、本実施形態では、自動変数を実引数領域のみへ割付けたが、加えて仮引数領域にも割付けても良い。図３のフローチャートのステップＳ３０１、Ｓ３０４、Ｓ３０５、Ｓ３０６、Ｓ３０７、Ｓ３０８、Ｓ３０９、Ｓ３１０、及びＳ３１１の実引数に仮引数をさらに加えることで実現できる。図４の入力プログラムに対し、仮引数と自動変数の使用区間の解析を行うと、図１２となる。実引数領域に割付けられた変数ａ、ｂを除くと、ステップＳ３０７でｄが仮引数領域の使用区間と重ならないため、ステップＳ３０８でｄは仮引数領域に割付けられる。結果、仮引数ｎのスタック領域にｄを配置すると図１３のようなスタック配置となり、さらに１ワード少ない４ワードのスタック領域とすることができ、図１４のような出力コードが出力ファイル１０６に格納される。
【００７６】
さらに、本実施形態においては、使用区間が重ならない引数領域と自動変数を引数領域に割り付けていたが、それらが同値であれば使用区間が重なる場合でも引数領域に割り付けても良い。図３のフローチャートのステップＳ３０７とステップＳ３１０の間に引数と自動変数の同値判定ステップを加え、同値であればＳ３０８に、同値でなければＳ３１０に分岐させることで実現できる。ここでは、引数領域−自動変数割付部１１３内で同値判定を行っているが、解析部１０７で同値解析を行っておいても良い。図４の入力プログラムに対し同値判定ステップを行うと、ステップＳ３０６で選択した引数が関数ｓｕｂの第２引数（ａｒｇ２）であり、ステップＳ３０３で選択した自動変数がｃのときに同値であると判定できる。その場合は、ステップＳ３０８でａｒｇ２のスタック領域にｃを配置すると図１５のようなスタック配置となり、さらに１ワード少ないスタック領域とすることができ、図１６のような出力コードが出力ファイル１０６に格納される。また、出力コードの命令数は１８命令であったが、１６命令となり、命令コード格納領域の使用量を削減できる。さらに、命令コード削減により、プログラム実行速度も向上する。
【００７７】
加えて、本実施形態においては、デバッグを行うかどうかに関係なく、引数領域に自動変数を格納していた。このような場合、デバッグ時に引数情報を正しく参照できなく問題がある。そのため、デバッグを行う場合には引数領域−自動変数割付部１１３における処理を行わないようにしても良い。図３のフローチャートのステップＳ３０１の前にコンパイルオプションのデバッグ情報生成オプションが指定されているかどうかを判定するステップを追加することで実現できる。デバッグ情報生成オプションが指定されている場合は終了に、指定されていない場合はステップＳ３０１に分岐させる。これにより、開発時にはデバッグ情報生成オプションを指定することにより正しくデバッグでき、製品にする場合にはデバッグ情報生成オプションを指定しないことによりメモリ使用量を削減することができる。
【００７８】
（実施形態２）
図１７は、本発明の実施形態２のデバッグ装置における全体構成のブロック図である。
【００７９】
デバッグ装置１７０１は、入力部１７０２、及びデバッグ実行部１７０６を具備する。
【００８０】
入力部１７０２は、実行形式ファイル１７００を入力とし、機械語命令列１７０３、デバッグ情報１７０４に分割し、初期データを実行時メモリ領域に格納する。
【００８１】
デバッグ実行部１７０６は、機械語命令列１７０３、デバッグ情報１７０４、実行時メモリ領域１７０５、引数値退避処理部１７０７、及び引数値格納領域１７０８を用いて、デバッグ処理を行う。
【００８２】
機械語命令列１７０３は、デバッグ装置１７０１で実行する機械語の命令列である。
デバッグ情報１７０４は、デバッグ時のヒント情報をコンパイラが生成したものであり、デバッグ装置１７０１がデバッグ時に必要に応じて参照する。
【００８３】
実行時メモリ領域１７０５は、デバッグ時に機械語が定義・使用する各データを格納する領域である。機械語命令が実行される度に必要に応じて更新される。
【００８４】
引数値退避処理部１７０７は、引数値格納領域１７０８に引数値をコピーし、デバッグ情報の引数の参照先をコピー先に変更する。
【００８５】
引数値格納領域１７０８は、引数値退避処理部１７０７によって引数値を格納する領域である。デバッグ実行部１７０６は必要に応じて引数値格納領域１７０８から引数値を参照する。
【００８６】
尚、便宜上、図１７には実行形式ファイル１７００も併せて記載している。
【００８７】
実行形式ファイル１７００は、プログラム変換装置１０１により生成され、機械語命令列とデバッグ情報と初期データを内容とするファイルである。
【００８８】
本発明は、引数値退避処理部１７０７と引数値格納領域１７０８である。
【００８９】
以下、図１７を用いて、本実施形態のデバッグ装置の動作について説明する。
【００９０】
デバッグ装置１７０１は、入力部１７０２で実行形式ファイル１７００を受け取る。入力部１７０２は機械語命令列１７０３とデバッグ情報１７０４に分割し、初期データを実行時メモリ領域１７０５に格納する。入力が完了すると、デバッグ実行部１７０６を起動し、機械語命令列１７０３を読み込み、デバッグ処理を行う。デバッグ処理中に必要があれば、デバッグ情報１７０４の参照や、実行時メモリ領域１７０５を参照・更新を行う。ここまでは従来のデバッグ装置と同等の処理である。デバッグ実行部１７０６はさらに、機械語命令により引数が定義される場合に引数値退避処理部１７０７を行う。引数定義の判断はデバッグ情報１７０４の引数値定義情報を用いる。
【００９１】
引数値退避処理部１７０７について図１８のフローチャート図を用いて説明する。まず引数のデバッグ情報を取得（ステップＳ１８００）し、その情報から実行しようとする命令で引数が定義されるかを判定（ステップＳ１８０１）する。定義されない場合は引数値の退避処理は不要なので、ｎｏの分岐を行い、処理を終了する。定義される場合は、ｙｅｓの分岐を行い、実行時メモリ領域１７０５に格納されている引数の値を引数値格納領域１７０８にコピー（ステップＳ１８０２）する。その後、デバッグ情報１７０４の引数格納先アドレスをコピー先に変更（ステップＳ１８０３）する。
【００９２】
尚、既にアドレス先が変更されている場合は、再度変更する必要はないためステップＳ１８０３を実行しなくても良い。
【００９３】
ここでは、図１６のアセンブラプログラムを実行形式ファイルに変換したものを用いて引数値退避処理部１７０７の具体的な動作を説明する。まず、最初のｌｄ命令実行時点で引数値退避処理部１７０７がデバッグ実行部１７０６から呼び出される。ステップＳ１８００で最初のｌｄ命令での引数のデバッグ情報を取得する。ｌｄ命令では引数が定義されないため、ｎｏの分岐となり終了する。次のａｄｄ命令についても同様の結果となる。その次のｓｔ命令実行時点で引数値退避処理部１７０７が呼び出された場合は、同様にデバッグ情報をステップＳ１８００で取得する。ここでは第２引数（ａｒｇ２）が定義されるため、ステップＳ１８０１のｙｅｓの分岐となり、ステップＳ１８０２の処理で、実行時メモリ領域１７０５のａｒｇ２の格納場所から、定義される値を引数値格納領域１７０８にコピーする。次にステップＳ１８０３の処理で、第２引数（ａｒｇ２）のデバッグ情報の引数格納先アドレスを、Ｓ１８０２でのコピー先のアドレスに変更する。同様の処理を繰り返すと上から５つ目のｓｔ命令がＳ１８０１でｙｅｓの分岐となり、残りは全てｎｏの分岐となり、結果、ａｒｇ１とａｒｇ２の引数値は引数値格納領域にコピーされる。その後にデバッグ装置１７０１がａｒｇ１やａｒｇ２の引数値を参照する場合は、引数値格納領域から参照する。
【００９４】
尚、図１のプログラム変換装置と図１７のデバッグ装置を組み合わせてプログラム開発システムとしても良い。その場合、プログラム変換装置が引数領域に自動変数を格納したかどうかを示すデバッグ情報を出力し、デバッグ装置はその情報により引数値の退避処理を行うかどうかを判断することで、引数値の退避を行っていない場合の冗長な処理が削減され、デバッグ効率が向上する。
【００９５】
また、本発明は、上記の実施形態に限定されることなく、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
【産業上の利用可能性】
【００９６】
以上説明したように、本発明は、スタック使用量を従来よりもより一層削減することが可能であるので、特に、プログラム変換装置、組み込み向けプログラム開発システム等として有用である。
【図面の簡単な説明】
【００９７】
【図１】本発明の実施形態１のプログラム変換装置における全体構成を示すブロック図である。
【図２】本実施形態のメモリ割付部１１０における全体構成を示すブロック図である。
【図３】本実施形態の引数領域−自動変数割付部１１３における処理動作を示すフローチャート図である。
【図４】本実施形態のプログラム変換装置における入力ファイルの内容を示すソースコード図である。
【図５】本実施形態の解析部１０７による実引数の使用区間及び自動変数の使用区間の解析結果を示す模式図である。
【図６】本実施形態の引数領域−引数割付部１１２による割り付け結果の実引数領域の使用区間を示す模式図である。
【図７】本実施形態の引数領域−自動変数割付部１１３による割り付け結果の実引数領域の使用区間を示す模式図である。
【図８】従来のプログラム変換装置によるスタック配置を示す模式図である。
【図９】従来のプログラム変換装置による出力ファイルの内容を示すアセンブラコード図である。
【図１０】本実施形態のプログラム変換装置１０１によるスタック配置を示す模式図である。
【図１１】本実施形態のプログラム変換装置１０１による出力ファイル１０６の内容を示すアセンブラコード図である。
【図１２】本実施形態の解析部１０７による仮引数の使用区間及び自動変数の使用区間の解析結果を示す模式図である。
【図１３】本実施形態のプログラム変換装置１０１による他のスタック配置を示す模式図である。
【図１４】本実施形態のプログラム変換装置１０１による他の出力ファイル１０６の内容を示すアセンブラコード図である。
【図１５】本実施形態のプログラム変換装置１０１によるさらに他のスタック配置を示す模式図である。
【図１６】本実施形態のプログラム変換装置１０１によるさらに他の出力ファイル１０６の内容を示すアセンブラコード図である。
【図１７】本発明の実施形態２のデバッグ装置１７０１における全体構成を示すブロック図である。
【図１８】本実施形態のデバッグ装置１７０１の引数値退避処理における処理動作を示すフローチャート図である。
【符号の説明】
【００９８】
１００    入力ファイル
１０１    プログラム変換装置
１０２    構文解析部
１０３    最適化部
１０４    資源割付部
１０５    コード生成部
１０６    出力ファイル
１０７    解析部
１０８    引数使用区間解析部
１０９    自動変数使用区間解析部
１１０    メモリ割付部
１１１    割付部
１１２    引数領域−引数割付部
１１３    引数領域−自動変数割付部
１１４    作業用領域−自動変数割付部
２００    メモリ割り付け前の中間コード
２０１    メモリ割り付け後の中間コード
１７００    実行形式ファイル
１７０１    デバッグ装置
１７０２    入力部
１７０３    機械語命令列
１７０４    デバッグ情報
１７０５    実行時メモリ領域
１７０６    デバッグ実行部
１７０７    引数値退避処理部
１７０８    引数値格納領域
【図１】
2008305337.tif 000003
【図２】
2008305337.tif 000004
【図３】
2008305337.tif 000005
【図４】
2008305337.tif 000006
【図５】
2008305337.tif 000007
【図６】
2008305337.tif 000008
【図７】
2008305337.tif 000009
【図８】
2008305337.tif 000010
【図９】
2008305337.tif 000011
【図１０】
2008305337.tif 000012
【図１１】
2008305337.tif 000013
【図１２】
2008305337.tif 000014
【図１３】
2008305337.tif 000015
【図１４】
2008305337.tif 000016
【図１５】
2008305337.tif 000017
【図１６】
2008305337.tif 000018
【図１７】
2008305337.tif 000019
【図１８】
2008305337.tif 000020