(57)【要約】      （修正有）【課題】スタックメモリの使用メモリサイズを低減可能なコンパイラ、解析方法、及びコンピュータシステムを提供する。【解決手段】コンパイラ１０は、コンピュータシステムに、変換処理１１と、スタックサイズ演算処理１２と、判定処理１３と、を実行させる。変換処理では、ソースコードをオブジェクトコードに変換する。スタックサイズ演算処理では、ソースコード中の変数に割り当てられるスタックメモリの使用メモリサイズを求める。判定処理では、使用メモリサイズが目標値を超えるか否かを判定する。【選択図】図１
2020080016.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータシステムに、
ソースコードをオブジェクトコードに変換する変換処理と、
前記ソースコード中の変数に割り当てられるスタックメモリの使用メモリサイズを求めるスタックサイズ演算処理と、
前記使用メモリサイズが目標値を超えるか否かを判定する判定処理と、を実行させるための、
コンパイラ。
【請求項２】
前記コンピュータシステムに、
前記判定処理の判定結果を通知部に出力する通知処理を、更に実行させるための、
請求項１に記載のコンパイラ。
【請求項３】
前記コンピュータシステムに、
前記使用メモリサイズが前記目標値を超える場合に、複数の前記変数のうち一部の変数が前記スタックメモリを共有するように、前記複数の変数に前記スタックメモリを割り当てる割当処理を、更に実行させる、
請求項１又は２に記載のコンパイラ。
【請求項４】
前記一部の変数は、生存区間が互いに重ならない、
請求項３に記載のコンパイラ。
【請求項５】
前記一部の変数は、互いに依存関係がある、
請求項３又は４に記載のコンパイラ。
【請求項６】
前記ソースコードが多階層のループ処理を含み、
前記割当処理において、前記多階層のループ処理のうち階層が相対的に浅いループ処理中の前記変数を、前記多階層のループ処理のうち階層が相対的に深いループ処理中の前記変数よりも優先して、前記スタックメモリを共有する前記一部の変数とする、
請求項３〜５のいずれか１項に記載のコンパイラ。
【請求項７】
前記コンピュータシステムに、
前記割当処理の実行後に前記スタックサイズ演算処理と前記判定処理とを再び実行させる、
請求項３〜６のいずれか１項に記載のコンパイラ。
【請求項８】
ソースコードをオブジェクトコードに変換する変換処理と、
前記ソースコード中の変数に割り当てられるスタックメモリの使用メモリサイズを求めるスタックサイズ演算処理と、
前記使用メモリサイズが目標値を超えるか否かを判定する判定処理と、
前記判定処理の判定結果を通知部に出力する出力処理と、を含む、
解析方法。
【請求項９】
請求項１〜７のいずれか１項に記載のコンパイラを備えた、
コンピュータシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、コンパイラ、解析方法、及びコンピュータシステムに関する。より詳細には、本開示は、ソースコードをオブジェクトコードに変換するコンパイラ、解析方法、及びコンピュータシステムに関する。
【背景技術】
【０００２】
特許文献１には、並列処理される複数の子タスクのそれぞれにスタックメモリを割り当てる並列処理スタックサイズ割当装置が開示されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平１１−２６５２９４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
特許文献１の並列処理スタックサイズ割当装置では、複数の子タスクのそれぞれにスタックメモリを割り当てているので、プログラム中の変数に割り当てられるスタックメモリの使用メモリサイズが増加する。そのため、メモリの容量に制約がある組み込みプロセッサでは、スタックメモリの使用メモリサイズが増加することによって、プログラムなどを記憶するワーク領域が不足する可能性があった。
【０００５】
本開示の目的は、スタックメモリの使用メモリサイズを低減可能なコンパイラ、解析方法、及びコンピュータシステムを提供することにある。
【課題を解決するための手段】
【０００６】
本開示の一態様のコンパイラは、コンピュータシステムに、変換処理と、スタックサイズ演算処理と、判定処理と、を実行させる。前記変換処理では、ソースコードをオブジェクトコードに変換する。前記スタックサイズ演算処理では、前記ソースコード中の変数に割り当てられるスタックメモリの使用メモリサイズを求める。前記判定処理では、前記使用メモリサイズが目標値を超えるか否かを判定する。
【０００７】
本開示の一態様の解析方法は、変換処理と、スタックサイズ演算処理と、判定処理と、出力処理とを、含む。前記変換処理では、ソースコードをオブジェクトコードに変換する。前記スタックサイズ演算処理では、前記ソースコード中の変数に割り当てられるスタックメモリの使用メモリサイズを求める。前記判定処理では、前記使用メモリサイズが目標値を超えるか否かを判定する。前記出力処理では、前記判定処理の判定結果を通知部に出力する。
【０００８】
本開示の一態様のコンピュータシステムは、前記コンパイラを備えたコンピュータシステムである。
【発明の効果】
【０００９】
本開示によれば、スタックメモリの使用メモリサイズを低減可能なコンパイラ、解析方法、及びコンピュータシステムを提供することができる。
【図面の簡単な説明】
【００１０】
【図１】図１は、本開示の一実施形態に係るコンパイラの機能を説明するブロック図である。
【図２】図２は、同上のコンパイラを備えたコンピュータシステムの構成図である。
【図３】図３は、同上のコンパイラが変換したオブジェクトコードが組み込まれるプロセッサのメモリ領域を説明する説明図である。
【図４】図４は、同上のコンパイラの動作を説明するフローチャートである。
【図５】図５は、本開示の一実施形態の変形例１に係るコンパイラの機能を説明するブロック図である。
【図６】図６は、同上のコンパイラの動作を説明するフローチャートである。
【図７】図７は、同上のコンパイラがスタックメモリを割り当てる処理を説明する説明図である。
【図８】図８は、同上のコンパイラがスタックメモリを割り当てる処理を説明する説明図である。
【図９】図９は、同上のコンパイラがスタックメモリを割り当てる処理を説明する説明図である。
【発明を実施するための形態】
【００１１】
以下に説明する実施形態は、本開示の種々の実施形態の一つに過ぎない。本開示の実施形態は、下記実施形態に限定されることはなく、この実施形態以外も含み得る。また、下記の実施形態は、本開示に係る技術的思想を逸脱しない範囲であれば、設計等に応じて種々の変更が可能である。
【００１２】
（実施形態）
（１）概要
本実施形態のコンパイラは、例えば、自動車等に搭載されるＤＳＰ（Digital Signal Processor）に組み込むためのオブジェクトコードを作成するために使用される。本実施形態のコンパイラは、例えばＣ言語又はＣ++言語等のコンピュータ言語で作成されたソースコードを、ソースコードよりも低い水準のコンピュータ言語（例えば機械語又は中間言語）で記述されるオブジェクトコードに変換する。
【００１３】
本実施形態のコンパイラ１０（図１参照）は、コンピュータシステム１（図２参照）に、変換処理と、スタックサイズ演算処理と、判定処理と、を実行させる。換言すれば、コンパイラ１０は、変換処理を行う変換処理部１１、スタックサイズ演算処理を行うスタックサイズ演算部１２、及び判定処理を行う判定処理部１３の各機能を含む。
【００１４】
変換処理（変換処理部１１）では、ソースコードＣＤ１をオブジェクトコードに変換する。スタックサイズ演算処理（スタックサイズ演算部１２）では、ソースコードＣＤ１中の変数に割り当てられるスタックメモリの使用メモリサイズを求める。判定処理（判定処理部１３）では、使用メモリサイズが目標値を超えるか否かを判定する。
【００１５】
本実施形態のコンパイラ１０は、コンピュータシステム１に、使用メモリサイズが目標値を超えるか否かを判定する判定処理を実行させるので、ユーザは、判定処理の結果に基づいて使用メモリサイズが目標値を超えるか否かを把握できる。よって、使用メモリサイズが目標値を超えた場合、ユーザは、判定処理の結果に基づいて使用メモリサイズを低減するための処理を行うことができ、スタックメモリの使用メモリサイズを低減可能なコンパイラを実現できる。
【００１６】
（２）詳細
以下、本実施形態に係るコンパイラ１０、及びコンパイラ１０を備えたコンピュータシステム１（コンパイラ装置）について図面を参照して詳しく説明する。
【００１７】
（２．１）構成
本実施形態のコンピュータシステム１は、図２に示すように、演算部２と、入力部３と、記憶部４と、通知部５とを備える。
【００１８】
演算部２は、例えば、ハードウェアとしてのプロセッサ及びメモリを主構成とする。演算部２は、記憶部４に記録されたプログラム（例えば、コンパイラ１０のプログラム）をプロセッサが実行することによって、演算部２としての機能（コンパイラ１０の機能）が実現される。プログラムは、記憶部４に予め記録されてもよく、電気通信回線を通じて提供されてもよく、演算部２で読み取り可能なメモリカード、光学ディスク、ハードディスクドライブ等の非一時的記録媒体に記録されて提供されてもよい。
【００１９】
入力部３は、例えばキーボード、マウス、ポインティングデバイス等の入力機器を含む。コンピュータシステム１のユーザ（例えば、コンパイラ１０を使ってオブジェクトコードを作成するユーザ）が入力部３を用いて入力作業を行うと、入力部３を用いて入力された入力データが演算部２に入力される。
【００２０】
記憶部４は、例えば、ＲＡＭ（Random Access Memory）等の半導体メモリを含む主記憶装置と、ハードディスク装置等のストレージと、を含む。記憶部４は、コンパイラ１０のプログラム、ソースコードＣＤ１、コンパイラ１０が変換したオブジェクトコード等のデータを記憶する。
【００２１】
通知部５は、コンパイラ１０から出力される情報を、コンピュータシステム１のユーザに通知する機能を有する。通知部５は、例えば、コンパイラ１０から出力される情報を画面上に表示する表示装置６を含む。表示装置６は、例えば、液晶ディスプレイ又は有機ＥＬ（Electro Luminescence）ディスプレイ等の薄型ディスプレイを含む。なお、通知部５は、コンパイラ１０から出力される情報を音声等で出力するスピーカ等を含んでもよい。
【００２２】
図１は、演算部２がコンパイラ１０のプログラム（ソフトウェア）を実行することによって実現されるコンパイラ１０の機能を説明するブロック図である。
【００２３】
コンパイラ１０は、変換処理部１１と、スタックサイズ演算部１２と、判定処理部１３と、出力処理部１４と、を含む。なお、本実施形態のコンパイラ１０は、オプティマイザを含むものである。
【００２４】
変換処理部１１は、例えばＣ言語で記述されたソースコードＣＤ１を、機械語で記述されるオブジェクトコードに変換する。
【００２５】
スタックサイズ演算部１２は、ソースコードＣＤ１中の複数の変数に割り当てられるスタックメモリの大きさ（使用メモリサイズ）を求める。ここにおいて、変換処理部１１は、先ずは、ソースコードＣＤ１中の複数の変数のそれぞれにスタックメモリを割り当てる。つまり、複数の変数が互いにスタックメモリを共有しないように、複数の変数に対してスタックメモリが割り当てられる。つまり、コンパイラ１０は、初期段階では、複数の変数がスタックメモリを共有しないように、複数の変数にスタックメモリを割り当てる。初期段階は、変換処理部１１が変換処理を行ってから、スタックサイズ演算処理部１２が初めて使用メモリサイズを求めるまでの段階である。コンパイラ１０はソースコードＣＤ１で使用される関数のコールツリーを作成しており、スタックサイズ演算部１２は、例えば、関数のコールツリーを解析することによって、各関数のコール数を求める。スタックサイズ演算部１２は、ソースコードＣＤ１で使用される各関数のコール数と、各関数で使用されるスタックメモリのメモリサイズ（既知の値）とを用いて、ソースコードＣＤ１中の複数の変数に割り当てられるスタックメモリの使用メモリサイズを求める。
【００２６】
判定処理部１３は、スタックサイズ演算部１２が求めた使用スタックサイズが、例えばコンパイラ１０のユーザがプラグマ（pragma）命令を用いて設定した目標値を超えるか否かを判定する。ここで、図３は、コンパイラ１０によって変換されたオブジェクトコードが組み込まれるプロセッサ（例えばＤＳＰ）のメモリ領域を示している。プロセッサのメモリ１００のメモリ領域は、例えば、オブジェクトコード等を記憶するワーク領域１０１と、プログラム実行時の作業領域であるスタック領域１０２とに分けられる。本実施形態では、コンパイラ１０のユーザがプラグマ命令を用いて使用メモリサイズの目標値を入力することができるので、メモリ１００及びワーク領域１０１のそれぞれの大きさを考慮してスタック領域１０２のメモリサイズを適宜設定できる。
【００２７】
出力処理部１４は、判定処理部１３の判定結果をユーザに通知する通知部５に対して、判定処理部１３の判定結果を出力する。出力処理部１４は、使用スタックサイズが目標値を超えると判定処理部１３が判定した場合、通知部５に通知信号を出力し、通知部５に判定結果を通知させる。例えば、通知部５が備える表示装置６は、出力処理部１４から入力された通知信号の情報を表示しており、コンパイラ１０のユーザに対して、使用スタックサイズが目標値を超えていることを通知することができる。本実施形態のコンパイラ１０では、使用スタックサイズが目標値を超えていないと判定処理部１３が判定した場合、出力処理部１４は通知部５に通知信号を出力させておらず、通知部５に通知動作を行わせていない。なお、コンパイラ１０は、使用スタックサイズが目標値を超えていないと判定処理部１３が判定した場合、出力処理部１４から通知部５に通知信号を出力して、通知部５から通知信号の情報を通知させてもよい。
【００２８】
（２．２）動作
本実施形態のコンパイラ１０の動作を図４に基づいて説明する。
【００２９】
ユーザは、コンピュータシステム１の入力部３を用いてコンパイラ１０を起動させる。
【００３０】
ユーザが、入力部３を用いてソースコードＣＤ１のコンパイルを指示すると、コンパイラ１０は、プラグマ命令を用いて入力された目標値Ｍ２の設定情報に基づいて、目標値Ｍ２の値を設定する（Ｓ１）。また、コンパイラ１０は、コンパイラ１０の変換処理部１１は、ソースコードＣＤ１をオブジェクトコードに変換する変換処理を行う（Ｓ２）。
【００３１】
変換処理部１１がソースコードＣＤ１をオブジェクトコードに変換すると、スタックサイズ演算部１２が、ソースコードＣＤ１で使用される関数のコールツリーを解析し、各関数のコール数を求める。スタックサイズ演算部１２は、各関数のコール数と、各関数で使用されるスタックメモリのメモリサイズとに基づいて、ソースコードＣＤ１中の複数の変数に割り当てられるスタックメモリの使用メモリサイズＭ１を求める（Ｓ３）。
【００３２】
スタックサイズ演算部１２が使用メモリサイズＭ１を求めると、判定処理部１３は、使用メモリサイズＭ１が目標値Ｍ２を超えているか否かを判定する（Ｓ４）。
【００３３】
ここで、使用メモリサイズＭ１が目標値Ｍ２を超えていると（Ｓ４：Ｙｅｓ）、判定処理部１３は判定結果を出力処理部１４に出力し、出力処理部１４が通知信号を通知部５に出力する（Ｓ５）。すなわち、本実施形態のコンパイラ１０は、コンピュータシステム１に、判定処理（判定処理部１３）の判定結果を通知部５に出力する通知処理を、更に実行させる。通知部５は、出力処理部１４から入力される通知信号に基づいて、使用メモリサイズＭ１が目標値Ｍ２を超えていることを表示装置６に表示させるので、コンパイラ１０のユーザは使用メモリサイズＭ１が目標値Ｍ２を超えていることを把握できる。したがって、コンパイラ１０のユーザは、スタックメモリの使用メモリサイズを下げるために、ソースコードＣＤ１の修正等の対応をとることが可能になり、スタックメモリの使用メモリサイズを低減可能なコンパイラ１０を実現できる。また、本実施形態では、コンパイラ１０が、ソースコードＣＤ１をコンパイルする際に使用メモリサイズＭ１が目標値Ｍ２を超えているか否かを判定し、判定結果をユーザに通知させている。したがって、コンパイラ１０によって作成されたオブジェクトコードを、コンパイラ１０以外の解析ツール（解析用のソフトウェア）を使って解析し、使用メモリサイズＭ１が目標値Ｍ２を超えているか否かを調べる場合に比べてユーザの手間を省くことができ、作業効率を改善できる。
【００３４】
なお、Ｓ４の判定において、判定処理部１３が、使用メモリサイズＭ１が目標値Ｍ２を超えていないと判定した場合（Ｓ４：Ｎｏ）、出力処理部１４は、通知部５による通知を行わず、コンパイルを終了する。
【００３５】
コンパイラ１０によって変換されたオブジェクトコードは、例えばＤＳＰのようなプロセッサのメモリに組み込まれて使用される。
【００３６】
なお、本実施形態において、使用メモリサイズＭ１が目標値Ｍ２を超えていない場合に（Ｓ４：Ｎｏ）、出力処理部１４が、使用メモリサイズＭ１が目標値Ｍ２を超えていないこと示す情報を通知部５に出力し、通知部５に通知動作を行わせてもよい。コンパイラ１０のユーザは、通知部５によって通知された情報に基づいて、使用メモリサイズＭ１が目標値Ｍ２を超えていないことを確認できる。
【００３７】
（３）変形例
上記実施形態は、本開示の様々な実施形態の一つに過ぎない。上記実施形態は、本開示の目的を達成できれば、設計等に応じて種々の変更が可能である。また、コンパイラ１０（プログラム）と同様の機能は、解析方法、コンパイラ１０（プログラム）を備えたコンピュータシステム１、又はコンパイラ１０（プログラム）を記録した非一時的な記録媒体等で具現化されてもよい。一態様に係る解析方法は、変換処理と、スタックサイズ演算処理と、出力処理と、を含む。変換処理では、ソースコードＣＤ１をオブジェクトコードに変換する。スタックサイズ演算処理では、ソースコードＣＤ１中の変数に割り当てられるスタックメモリの使用メモリサイズを求める。判定処理では、使用メモリサイズが目標値を超えるか否かを判定する。一態様に係るコンピュータシステム１は、コンパイラ１０を備えたコンピュータシステムである。コンピュータシステム１は、変換処理を行う変換処理部１１、スタックサイズ演算処理を行うスタックサイズ演算部１２、及び判定処理を行う判定処理部１３の各機能を含む。変換処理部１１はソースコードＣＤ１をオブジェクトコードに変換する。スタックサイズ演算部１２は、ソースコードＣＤ１中の変数に割り当てられるスタックメモリの使用メモリサイズを求める。判定処理部１３は、使用メモリサイズが目標値を超えるか否かを判定する。
【００３８】
以下、上記の実施形態の変形例を列挙する。以下に説明する変形例は、適宜組み合わせて適用可能である。なお、以下では、上記実施形態を「基本例」と呼ぶこともある。
【００３９】
本開示におけるコンパイラ１０を備えたコンピュータシステム１は、ハードウェアとしてのプロセッサ（演算部２）及びメモリ（記憶部４）を主構成とする。コンピュータシステム１のメモリに記録されたコンパイラ１０のプログラムをプロセッサが実行することによって、本開示におけるコンピュータシステム１としての機能が実現される。コンパイラ１０のプログラムは、コンピュータシステム１のメモリに予め記録されてもよく、電気通信回線を通じて提供されてもよく、コンピュータシステム１で読み取り可能なメモリカード、光学ディスク、ハードディスクドライブ等の非一時的記録媒体に記録されて提供されてもよい。コンピュータシステム１のプロセッサは、半導体集積回路（ＩＣ）又は大規模集積回路（ＬＳＩ）を含む１ないし複数の電子回路で構成される。ここでいうＩＣ又はＬＳＩ等の集積回路は、集積の度合いによって呼び方が異なっており、システムＬＳＩ、ＶＬＳＩ（Very Large Scale Integration）、又はＵＬＳＩ（Ultra Large Scale Integration）と呼ばれる集積回路を含む。さらに、ＬＳＩの製造後にプログラムされる、ＦＰＧＡ（Field-Programmable Gate Array）、又はＬＳＩ内部の接合関係の再構成若しくはＬＳＩ内部の回路区画の再構成が可能な論理デバイスについても、プロセッサとして採用することができる。複数の電子回路は、１つのチップに集約されていてもよいし、複数のチップに分散して設けられていてもよい。複数のチップは、１つの装置に集約されていてもよいし、複数の装置に分散して設けられていてもよい。ここでいうコンピュータシステム１は、１以上のプロセッサ及び１以上のメモリを有するマイクロコントローラを含む。したがって、マイクロコントローラについても、半導体集積回路又は大規模集積回路を含む１ないし複数の電子回路で構成される。また、コンパイラ１０の複数の機能がクラウド（クラウドコンピューティング）等によって実現されてもよい。
【００４０】
上記の実施形態において、使用メモリサイズ等の２値の比較において、「超える」としているところは「以上」であってもよい。つまり、２値の比較において、２値が等しい場合を含むか否かは、目標値等の設定次第で任意に変更できるので、「超える」か「以上」かに技術上の差異はない。同様に、「以下」としているところは「未満」であってもよい。
【００４１】
（３．１）変形例１
変形例１のコンパイラ１０を図５〜図９に基づいて説明する。
【００４２】
変形例１のコンパイラ１０は、割当処理部１５を更に備える。割当処理部１５は、使用メモリサイズＭ１が目標値Ｍ２を超える場合に、複数の変数のうち一部の変数がスタックメモリを共有するように、複数の変数にスタックメモリを割り当てる。換言すると、変形例１のコンパイラ１０は、コンピュータシステム１に、割当処理を更に実行させる。割当処理では、使用メモリサイズＭ１が目標値Ｍ２を超える場合に、複数の変数のうち一部の変数がスタックメモリを共有するように、複数の変数にスタックメモリを割り当てる。なお、割当処理部１５以外の構成は基本例と同様であるので、上記の基本例と共通の構成要素には同一の符号を付して、その説明は省略する。
【００４３】
変形例１のコンパイラ１０の動作を図６に基づいて説明する。
【００４４】
ユーザが、入力部３を用いてソースコードＣＤ１のコンパイルを指示すると、コンパイラ１０は、プラグマ命令を用いて入力された目標値Ｍ２の設定情報に基づいて、目標値Ｍ２の値を設定する（Ｓ１１）。また、コンパイラ１０は、コンパイラ１０の変換処理部１１は、ソースコードＣＤ１をオブジェクトコードに変換する変換処理を行う（Ｓ１２）。
【００４５】
変換処理部１１がソースコードＣＤ１をオブジェクトコードに変換すると、スタックサイズ演算部１２が、ソースコードＣＤ１で使用される関数のコールツリーを解析し、各関数のコール数を求める。スタックサイズ演算部１２は、各関数のコール数と、各関数で使用されるスタックメモリのメモリサイズとに基づいて、ソースコードＣＤ１中の複数の変数に割り当てられるスタックメモリの使用メモリサイズＭ１を求める（Ｓ１３）。
【００４６】
スタックサイズ演算部１２が使用メモリサイズＭ１を求めると、判定処理部１３は、使用メモリサイズＭ１が目標値Ｍ２を超えているか否かを判定する（Ｓ１４）。
【００４７】
ここで、使用メモリサイズＭ１が目標値Ｍ２を超えていると（Ｓ１４：Ｙｅｓ）、判定処理部１３は、判定回数がＮを超えているか否かを更に判定する（Ｓ１５）。ここにおいて、判定回数は、使用メモリサイズＭ１が目標値Ｍ２を超えていると判定された回数であり、ソースコードＣＤ１のコンパイルを開始する際に判定回数はゼロにリセットされる。Ｎは２以上の整数である。Ｎは、スタックメモリの割当処理を繰り返す場合の上限回数であり、コンパイラ１０のユーザによって所望の回数に設定される。
【００４８】
Ｓ１５の判定で判定回数がＮ以下と判定された場合（Ｓ１５：Ｎｏ）、つまり割当処理を行った回数が上限回数以下の場合、割当処理部１５はスタックメモリの割当処理を実行する（Ｓ１６）。
【００４９】
ここで、割当処理部１５は、複数の変数のうち、生存区間が重なっていない２以上の変数がスタックメモリを共有するように、複数の変数にスタックメモリを割り当てる。つまり、複数の変数のうちスタックメモリを共有する一部の変数は、生存区間が互いに重ならない変数である。ここにおいて、ある変数の生存区間とは、プログラム（例えばソースコードＣＤ１）において、当該変数が使用される区間である。図７はソースコードＣＤ１の一部を示し、変数Ｘを用いた処理が行われる変数Ｘの生存区間Ｔ１と、変数Ｙを用いた処理が行われる変数Ｙの生存区間Ｔ２とは互いに重なっていない。したがって、変数Ｘと変数Ｙとに同じスタックアドレスを割り当てることができ、変数Ｘと変数Ｙとがスタックメモリを共有することで、スタックメモリの使用メモリサイズを低減できる。ここで、変数Ｘと変数Ｙとがスタックメモリを共有した場合、変数Ｘを用いる処理と、変数Ｙを用いる処理とは並列実行できず、シリアル実行となるが、スタックメモリの使用メモリサイズを低減できる。なお、変数Ｘと変数Ｙとに互いに異なるスタックメモリを割り付けた場合は、変数Ｘを用いる処理と、変数Ｙを用いる処理とを並列実行できるので、オブジェクトコードの実行速度は速くなる。
【００５０】
なお、割当処理部１５は、生存区間が互いに重なっていない３つ以上の変数がスタックメモリを共有するようにスタックメモリを割り当ててもよく、スタックメモリの使用メモリサイズを低減できる。
【００５１】
割当処理部１５がＳ１６の割当処理を実行すると、スタックサイズ演算部１２がスタックメモリの使用メモリサイズＭ１を求め（Ｓ１３）、判定処理部１３が、使用メモリサイズＭ１が目標値Ｍ２を超えているか否かを再び判定する（Ｓ１４）。つまり、コンパイラ１０は、コンピュータシステム１に、割当処理の実行後に演算処理と判定処理とを再び実行させる。
【００５２】
ここで、Ｓ１４の判定において、判定処理部１３が、使用メモリサイズＭ１が目標値Ｍ２を超えていないと判定すると（Ｓ１４：Ｎｏ）、コンパイラ１０はソースコードＣＤ１のコンパイルを正常に終了する。そして、コンパイラ１０によって変換されたオブジェクトコードは、例えばＤＳＰのようなプロセッサのメモリに組み込まれて使用される。
【００５３】
また、Ｓ１４の判定において、判定処理部１３が、使用メモリサイズＭ１が目標値Ｍ２を超えていると判定すると（Ｓ１４：Ｙｅｓ）、判定処理部１３は、判定回数がＮを超えているか否かを更に判定する（Ｓ１５）。ここで、判定処理部１３が、判定回数がＮを超えていると判定した場合（Ｓ１５：Ｙｅｓ）、つまり割当処理を（Ｎ＋１）回実行しても使用メモリサイズＭ１が目標値Ｍ２以下にならなかった場合、判定処理部１３は判定結果を出力処理部１４に出力する。このとき、出力処理部１４が通知信号を通知部５に出力し（Ｓ１７）、通知部５は、出力処理部１４から入力される通知信号に基づいて、使用メモリサイズＭ１が目標値Ｍ２を超えていることを表示装置６に表示させる。これにより、コンパイラ１０のユーザは、使用メモリサイズＭ１が目標値Ｍ２を超えていることを把握でき、スタックメモリの使用メモリサイズを下げるために、ソースコードＣＤ１の修正等の対応をとることが可能になる。よって、スタックメモリの使用メモリサイズを低減可能なコンパイラ１０を実現できる。
【００５４】
なお、コンパイラ１０は、割当処理部１５が割当処理を実行した後も使用メモリサイズが目標値を超えた場合、複数の変数のうちスタックメモリを共有可能な２以上の変数の全てでスタックメモリを共有させてもよい。ここで、スタックメモリを共有可能な変数とは、生存区間が重ならず、互いに依存関係がない変数であり、スタックメモリを最大限低減できる。
【００５５】
なお、変形例１において、割当処理部１５は、複数の変数のうち、互いに依存関係がある２以上の変数がスタックメモリを共有するように、複数の変数にスタックメモリを割り当ててもよい。つまり、複数の変数のうちスタックメモリを共有する一部の変数は、互いに依存関係がある変数である。図８はソースコードＣＤ１の一部を示し、区間Ｔ４の処理で用いられる変数Ｘ３の値は、区間Ｔ３の処理で演算される変数Ｘ２の値によって決定される。つまり、変数Ｘ３は変数Ｘ２に依存しており、変数Ｘ２と変数Ｘ３とは互いに依存関係があるので、区間Ｔ３の処理と区間Ｔ４の処理とは並列実行ができない。このような場合、割当処理部１５は、変数Ｘ２と変数Ｘ３とがスタックメモリを共有するように、複数の変数にスタックメモリを割り当てており、オブジェクトコードの実行速度の低下を招くことなく、スタックメモリの使用メモリサイズを低減できる。なお、割当処理部１５は、互いに依存関係がある３つ以上の変数がスタックメモリを共有するようにスタックメモリを割り当ててもよく、スタックメモリの使用メモリサイズを低減できる。
【００５６】
また、ソースコードＣＤ１が多階層のループ処理を含む場合に、割当処理部１５は、多階層のループ処理のうち、階層が相対的に浅いループ処理中の変数を、相対的に深いループ処理中の変数よりも優先して、スタックメモリを共有させてもよい。つまり、割当処理において、多階層のループ処理のうち階層が相対的に浅いループ処理中の変数を、多階層のループ処理のうち階層が相対的に深いループ処理中の変数よりも優先して、スタックメモリを共有する一部の変数としてもよい。図９はソースコードＣＤ１の一部を示しており、図９の例ではソースコードＣＤ１が３階層のループ処理ＬＰ１〜ＬＰ３を含んでいる。階層が最も浅いループ処理ＬＰ１では変数Ｙ１，Ｙ２が用いられ、階層が２番目に浅いループ処理ＬＰ２では変数Ｙ３が用いられ、階層が最も深いループ処理ＬＰ３では変数Ｙ４が用いられている。この場合、割当処理部１５は、階層が相対的に浅いループ処理ＬＰ１中で使用される変数Ｙ１，Ｙ２を、階層が相対的に深いループ処理ＬＰ２，ＬＰ３中で使用される変数Ｙ３、Ｙ４よりも優先して、スタックメモリを共有する一部の変数とする。ここで、階層が相対的に深いループ処理中の変数は、階層が相対的に浅いループ処理中の変数に比べて、使用される回数が多くなる。したがって、階層が相対的に浅いループ処理中の変数でスタックメモリを共有することで、オブジェクトコードの実行速度を遅くすることなく、スタックメモリの使用メモリサイズを低減することができる。
【００５７】
なお、変形例１のコンパイラ１０において、使用メモリサイズＭ１が目標値Ｍ２を超えた場合に、割当処理部１５は、複数の変数の中からユーザによって指定された一部の変数でスタックメモリを共有するように割当処理を行ってもよい。
【００５８】
変形例１において、割当処理部１５が割当処理を上限回数実行しても、使用メモリサイズＭ１が目標値Ｍ２を超える場合、出力処理部１４は、複数の変数の中からスタックメモリを共有可能な変数を示す情報を通知部５に出力する。ここで、出力処理部１４は、複数の変数の中から生存区間が互いに重なっていない２以上の変数を共有候補の変数として求め、共有候補の変数を示す情報を通知部５に出力する。通知部５は、出力処理部１４から共有候補の変数を示す情報が入力されると、共有候補の変数を示す情報を例えば表示装置６に表示させる。コンパイラ１０のユーザは、表示装置６に表示された情報に基づいて、スタックメモリを共有させる２以上の変数を選択し、選択した変数を示す情報を入力部３を用いてコンパイラ１０に入力する。コンパイラ１０では、割当処理部１５が、ユーザから入力された情報に基づいて、ユーザが選択した２以上の変数でスタックメモリを共有するようにスタックメモリの割当処理を実行する。これにより、スタックメモリを共有可能（例えば生存区間が重なっていない）な２以上の変数のうち、ユーザが指定した変数でスタックメモリを共有することで、オブジェクトコードの実行速度を遅くすることなく、使用メモリサイズを低減できる。
【００５９】
（まとめ）
以上説明したように、第１の態様に係るコンパイラ（１０）は、コンピュータシステム（１）に、変換処理と、スタックサイズ演算処理と、判定処理と、を実行させるための、コンパイラ（１０）である。変換処理では、ソースコード（ＣＤ１）をオブジェクトコードに変換する。スタックサイズ演算処理では、ソースコード（ＣＤ１）中の変数に割り当てられるスタックメモリの使用メモリサイズ（Ｍ１）を求める。判定処理では、使用メモリサイズ（Ｍ１）が目標値（Ｍ２）を超えるか否かを判定する。
【００６０】
この態様によれば、コンパイラ（１０）のユーザは、判定処理の判定結果に基づいて、使用メモリサイズ（Ｍ１）が目標値（Ｍ２）を超えているか否かを把握できる。したがって、使用メモリサイズ（Ｍ１）が目標値（Ｍ２）を超えていると判定された場合、コンパイラ（１０）のユーザは、使用メモリサイズ（Ｍ１）を低減するための対応をとることが可能になり、使用メモリサイズ（Ｍ１）を低減可能なコンパイラ（１０）を提供できる。
【００６１】
第２の態様に係るコンパイラ（１０）は、第１の態様において、コンピュータシステム（１）に、判定処理の判定結果を通知部（５）に出力する出力処理を、更に実行させる。
【００６２】
この態様によれば、コンパイラ（１０）のユーザは、通知部（５）の通知に基づいて、使用メモリサイズ（Ｍ１）が目標値（Ｍ２）を超えているか否かを把握できる。したがって、使用メモリサイズ（Ｍ１）が目標値（Ｍ２）を超えていると判定された場合、コンパイラ（１０）のユーザは、使用メモリサイズ（Ｍ１）を低減するための対応をとることが可能になり、使用メモリサイズ（Ｍ１）を低減可能なコンパイラ（１０）を提供できる。
【００６３】
第３の態様に係るコンパイラ（１０）は、第１又は第２の態様において、コンピュータシステム（１）に、割当処理を、更に実行させる。割当処理では、使用メモリサイズ（Ｍ１）が目標値（Ｍ２）を超える場合に、複数の変数のうち一部の変数がスタックメモリを共有するように、複数の変数にスタックメモリを割り当てる。
【００６４】
この態様によれば、スタックサイズの使用メモリサイズ（Ｍ１）を低減できる。
【００６５】
第４の態様に係るコンパイラ（１０）では、第３の態様において、一部の変数は、生存区間が互いに重ならない。
【００６６】
この態様によれば、スタックサイズの使用メモリサイズ（Ｍ１）を低減できる。
【００６７】
第５の態様に係るコンパイラ（１０）では、第３又は第４の態様において、一部の変数は、互いに依存関係がある。
【００６８】
この態様によれば、スタックサイズの使用メモリサイズ（Ｍ１）を低減できる。
【００６９】
第６の態様に係るコンパイラ（１０）では、第３〜第５のいずれかの態様において、ソースコード（ＣＤ１）が多階層のループ処理を含む。割当処理において、多階層のループ処理のうち階層が相対的に浅いループ処理中の変数を、多階層のループ処理のうち階層が相対的に深いループ処理中の変数よりも優先して、スタックメモリを共有する一部の変数とする。
【００７０】
ここで、多階層のループ処理のうち階層が相対的に浅いループ処理は、階層が相対的に深いループ処理に比べて、ループ処理を繰り返す回数が少ないので、変数が使用される回数が少なくなる。この態様によれば、多階層のループ処理のうち階層が相対的に浅いループ処理中の変数でスタックメモリを共有しているので、階層が相対的に深いループ処理中の変数でスタックメモリを共有する場合に比べて、オブジェクトコードの実行速度の低下を抑制できる。
【００７１】
第７の態様に係るコンパイラ（１０）では、第３〜第６のいずれかの態様において、コンピュータシステム（１）に、割当処理の実行後にスタックサイズ演算処理と判定処理とを再び実行させる。
【００７２】
この態様によれば、使用メモリサイズ（Ｍ１）を低減可能なコンパイラ（１０）を提供できる。
【００７３】
第８の態様に係る解析方法は、変換処理と、スタックサイズ演算処理と、判定処理と、通知処理と、を含む。変換処理では、ソースコード（ＣＤ１）をオブジェクトコードに変換する。スタックサイズ演算処理では、ソースコード（ＣＤ１）中の変数に割り当てられるスタックメモリの使用メモリサイズ（Ｍ１）を求める。判定処理では、使用メモリサイズ（Ｍ１）が目標値（Ｍ２）を超えるか否かを判定する。通知処理では、判定処理の判定結果を通知部（５）に通知させる。
【００７４】
この態様によれば、使用メモリサイズ（Ｍ１）を低減可能な解析方法を提供できる。
【００７５】
第９の態様に係るコンピュータシステム（１）は、第１〜第７のいずれかの態様のコンパイラ（１０）を備えた、コンピュータシステムである。
【００７６】
この態様によれば、使用メモリサイズ（Ｍ１）を低減可能なコンピュータシステム（１）を提供できる。
【００７７】
第１０の態様に係るコンパイラ（１０）では、第１〜第７のいずれかの態様において、コンピュータシステム（１）に、目標値を指定する設定情報に基づいて目標値を設定する。
【００７８】
この態様によれば、使用メモリサイズ（Ｍ１）を低減可能なコンピュータシステム（１）を提供できる。
【００７９】
第１１の態様に係るコンパイラ（１０）では、第１〜第７及び第１０のいずれかの態様において、初期段階では、複数の変数がスタックメモリを共有しないように、複数の変数にスタックメモリを割り当てる。初期段階は、変換処理が行われてから、スタックサイズ演算処理が初めて行われるまでの段階である。
【００８０】
この態様によれば、並列性を最大限高めた状態でスタックメモリの使用メモリサイズを求めることができる。
【００８１】
第１２の態様に係るコンパイラ（１０）では、第３〜第７のいずれかの態様において、割当処理の実行後も使用メモリサイズが目標値を超えた場合、複数の変数のうちスタックメモリを共有可能な２以上の変数の全てでスタックメモリを共有させる。ここで、スタックメモリを共有可能な変数とは、生存区間が重ならず、互いに依存関係がない変数である。
【００８２】
この態様によれば、使用メモリサイズが目標値を超える場合でも使用メモリサイズを最大限低減できる。
【００８３】
上記態様に限らず、上記の実施形態に係るコンパイラ（１０）の種々の構成（変形例を含む）は、解析方法、コンパイラ（１０）を備えたコンピュータシステム（１）、又はコンパイラ（１０）（プログラム）を記録した非一時的記録媒体等で具現化可能である。
【００８４】
第２〜第７及び第１０〜第１２の態様に係る構成については、コンパイラ（１０）に必須の構成ではなく、適宜省略可能である。
【符号の説明】
【００８５】
１  コンピュータシステム
５  通知部
１０  コンパイラ
Ｍ１  使用メモリサイズ
Ｍ２  目標値
【図１】
2020080016.tif 000003
【図２】
2020080016.tif 000004
【図３】
2020080016.tif 000005
【図４】
2020080016.tif 000006
【図５】
2020080016.tif 000007
【図６】
2020080016.tif 000008
【図７】
2020080016.tif 000009
【図８】
2020080016.tif 000010
【図９】
2020080016.tif 000011