(57)【要約】【課題】変数の占めるメモリ容量を最適化するコンパイル方式およびシミュレータおよびプログラム開発支援システムを提供する。【解決手段】宣言された変数に対して、静的にメモリ領域を確保してオブジェクトコードを生成するコンパイラにおいて、変数の値が、プログラムを実行した結果、型宣言されたサイズより小さい値しか持ち得ない場合に、型宣言されたサイズより小さいメモリ領域を確保してオブジェクトファイルを生成する。このようにすれば、宣言された静的な変数に対して、使用される値の範囲がその宣言されたサイズ以下である場合、メモリ占有量を小さくすることができる。【選択図】    図１
2005301415.tif 000002
【特許請求の範囲】
【請求項１】
宣言された変数に対して、静的にメモリ領域を確保してオブジェクトコードを生成するコンパイラにおいて、
前記変数の値が、プログラムを実行した結果、型宣言されたサイズより小さい値しか持ち得ない場合に、前記型宣言されたサイズより小さいメモリ領域を確保してオブジェクトファイルを生成することを特徴とするコンパイル方式。
【請求項２】
宣言された配列に対して、静的にメモリ領域を確保してオブジェクトコードを生成するコンパイラにおいて、
前記配列のメモリ使用量が、プログラムを実行した結果、宣言された範囲より小さい範囲しか使用しない場合に、前記宣言された範囲のサイズより小さいメモリ領域を確保してオブジェクトファイルを生成することを特徴とするコンパイル方式。
【請求項３】
宣言された変数に対して、プログラム実行時に一時的にメモリ領域を確保するようなオブジェクトコードを生成するコンパイラにおいて、
前記変数の値が、プログラムを実行した結果、型宣言されたサイズより小さい値しか持ちえない場合に、前記型宣言されたサイズより小さいメモリ領域を確保するようにオブジェクトファイルを生成することを特徴とするコンパイル方式。
【請求項４】
宣言された配列に対して、プログラム実行時に一時的にメモリ領域を確保するようなオブジェクトコードを生成するコンパイラにおいて、
前記配列のメモリ使用量が、プログラムを実行した結果、宣言されたサイズより小さい範囲しか使用しない場合に、前記宣言されたサイズより小さいメモリ領域を確保するようにオブジェクトファイルを生成することを特徴とするコンパイル方式。
【請求項５】
ソースファイルをコンパイルして複数のオブジェクトファイルを生成し、前記複数のオブジェクトファイルをリンクして生成された実行形式プログラムをシミュレートするシミュレータにおいて、
各変数に対するメモリ書き込み値の最大値と最小値のみを記録、または各配列における最大使用量を記録し、前記最大値と最小値のみの記録内容、または前記最大使用量の記録内容を、外部ファイルに生成することを特徴とするシミュレータ。
【請求項６】
ソースファイルをコンパイルして複数のオブジェクトファイルを生成し、前記複数のオブジェクトファイルをリンクして生成された実行形式プログラムを実行するエミュレータにおいて、
各変数に対するメモリ書き込み値の最大値と最小値のみを記録、または各配列における最大使用量を記録し、前記最大値と最小値のみの記録内容、または前記最大使用量の記録内容を、外部ファイルに生成するエミュレータ。
【請求項７】
請求項１〜請求項６記載のコンパイラ、シミュレータ、エミュレータで構成される変数、配列のメモリ領域の占有量を低減化することを特徴とするプログラム開発支援システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイル方式、シミュレータ、エミュレータおよびプログラム開発支援システムに関し、特に、変数の占めるメモリ容量を最適化するコンパイル方式およびシミュレータおよびプログラム開発支援システムに関する。
【背景技術】
【０００２】
従来より、プログラム開発は、図１２に示すように、ホストコンピュータ上でソースファイルをコンパイルし、オブジェクトファイルを生成し、そのオブジェクトファイルからリンカにより実行形式プログラムを生成していた。
【０００３】
通常、Ｃ言語等の高級プログラミング言語にて、変数を使用する場合、数値ならint型の宣言を用いることが多い。扱う数値が大きいことが分かっている時は、long型、小さい時は、short型やchar型が用いられるが、最も一般的にはint型が用いられる。
【０００４】
ところで、一旦宣言された変数は、コンパイル時点でその占有するメモリサイズが決定されてしまい、たとえプログラム実行時に、数値の範囲が小さかったとしても、後からメモリ占有量が小さくなることはない。
このため、特に組み込み機器用プログラミングのように、メモリ容量に制限がある場合、使用されない無駄なメモリ領域が存在することになっていた。
【０００５】
同様に、添え字付きで宣言された配列が占めるメモリ容量も、たとえプログラム実行時に、その配列全てを使用しないとしても、そのままのメモリ容量が占有されていた。
【０００６】
そこで、従来技術として、コンパイル時に判明している定数を用いた演算の場合に、その変数の範囲を調べ、適切な型を求める手法が提案されているが、コンパイル時に値が不明である変数値に対しては、前記従来技術の発明を適用することはできない（特許文献１、参照）。
【特許文献１】特開２０００-３３９１７２号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
ここで、従来技術の具体的な問題点を列挙する。
（１）宣言された静的な変数に対して、たとえ使用される値の範囲がその宣言されたサイズ以下だとしても、コンパイラが宣言されたサイズを変えてメモリ占有量を小さく確保することはなかった。
（２）宣言された静的な配列において、たとえ配列のメモリ領域が、宣言された範囲より小さい範囲しか使用されない場合でも、コンパイラが宣言されたサイズを変えてメモリ占有量を小さく確保することはなかった。
【０００８】
（３）宣言された一時変数に対して、たとえ使用される値の範囲がその宣言されたサイズ以下だとしても、コンパイラが宣言されたサイズを変えてメモリ領域をそのサイズより小さく確保することはなかった。
（４）宣言された一時配列において、たとえ配列のメモリ領域が、宣言された範囲より小さい範囲しか使用されない場合でも、コンパイラが宣言されたサイズを変えてメモリ占有量を小さく確保することはなかった。
【０００９】
（５）シミュレータにおいて、プログラム実行時に、各変数の実際に変化する最大値や最小値を記録し、また各配列の実際のメモリ使用量を記録し、その内容を外部ファイルに生成することはなかった。
（６）エミュレータにおいて、プログラム実行時に、各変数の実際に変化する最大値や最小値を記録し、また各配列の実際のメモリ使用量を記録し、その内容を外部ファイルに生成することはなかった。
【００１０】
（７）プログラムの実行時の変数の取り得る最大値、配列のメモリ使用量からプログラムのメモリ使用量を最小化するコンパイラ、リンカ、シミュレータ、エミュレータで構成されるプログラム開発支援システムがなかった。
【００１１】
本発明は上記の問題を解決すべくなされたものであり、変数の占めるメモリ容量を最適化するコンパイル方式、シミュレータ、エミュレータおよびプログラム開発支援システムの提供を目的とする。
【課題を解決するための手段】
【００１２】
前記目的を達成するための本発明の処理の概要を説明する。
図１において、ホストコンピュータＨ１にてプログラム作成を行う時、コンパイラＣ１は各ソースプログラムファイルよりそれぞれオブジェクトファイルを生成する。
リンカＬ１は、これらのオブジェクトファイルの結合処理を行い、実行形式プログラムＰ１を生成する。
【００１３】
実行形式プログラムＰ１は、シミュレータＳ１により、割り込み処理を含めて実動作に近い十分な動作をさせる。ここでシミュレータＳ１は、各静的な変数、一時変数への書き込み値をトレースし、その最大値と最小値を記録する。また、各配列領域でアクセスされる最小アドレスと最大アドレスを記録する。それらの変数、配列の記録データを外部ファイルＦ１に出力する。
【００１４】
この出力された変数、及び配列データを元に、再度ソースプログラムをコンパイルする。この時、各変数のメモリサイズは、宣言されたサイズが、実際に取り得る値から導き出されるサイズより大きければ、後者のサイズとしてメモリ確保、及びコード展開する。
また、各配列の占有サイズも、宣言されたサイズよりも、実際に使用されるサイズが小さければ、その小さいサイズとしてメモリ確保、及びコード展開する。
【００１５】
こうして再コンパイルし、生成された各オブジェクトファイルを再度リンカにて結合処理を行う。これにより、変数、及び配列の不要なメモリ領域を除去した実行形式プログラムが生成される。
【００１６】
同様に、シミュレータの代わりに図１１に示すように、エミュレータＥ１により、各静的な変数、一時変数への書き込み値をトレースし、その最大値と最小値を記録する。また、各配列領域で使用される最小アドレスと最大アドレスを記録する。それらの変数、配列の記録データを外部ファイルＦ１に出力し、同様な再コンパイル、再リンクにより、変数、及び配列の不要なメモリ領域を除去した実行形式プログラムが生成される。
【００１７】
前記目的を達成するために請求項1記載の発明は、宣言された変数に対して、静的にメモリ領域を確保してオブジェクトコードを生成するコンパイラにおいて、
前記変数の値が、プログラムを実行した結果、型宣言されたサイズより小さい値しか持ち得ない場合に、前記型宣言されたサイズより小さいメモリ領域を確保してオブジェクトファイルを生成する構成としてある。
【００１８】
このようにすれば、宣言された静的な変数に対して、使用される値の範囲がその宣言されたサイズ以下である場合、型宣言されたサイズより小さいメモリ領域を確保してオブジェクトファイルを生成するので、メモリ占有量を小さくすることができる。
【００１９】
また、請求項２記載の発明は、宣言された配列に対して、静的にメモリ領域を確保してオブジェクトコードを生成するコンパイラにおいて、
前記配列のメモリ使用量が、プログラムを実行した結果、宣言された範囲より小さい範囲しか使用しない場合に、前記宣言された範囲のサイズより小さいメモリ領域を確保してオブジェクトファイルを生成する構成としてある。
【００２０】
このようにすれば、宣言された静的な配列において、配列のメモリ領域が、宣言された範囲より小さい範囲しか使用されない場合、宣言された範囲のサイズより小さいメモリ領域を確保してオブジェクトファイルを生成するので、メモリ占有量を小さくすることができる。
【００２１】
また、請求項３記載の発明は、宣言された変数に対して、プログラム実行時に一時的にメモリ領域を確保するようなオブジェクトコードを生成するコンパイラにおいて、
前記変数の値が、プログラムを実行した結果、型宣言されたサイズより小さい値しか持ちえない場合に、前記型宣言されたサイズより小さいメモリ領域を確保するようにオブジェクトファイルを生成する構成としてある。
【００２２】
このようにすれば、宣言された一時変数に対して、使用される値の範囲がその宣言されたサイズ以下である場合、型宣言されたサイズより小さいメモリ領域を確保するようにオブジェクトファイルを生成するので、メモリ領域をそのサイズより小さく確保することができる。
【００２３】
また、請求項４記載の発明は、宣言された配列に対して、プログラム実行時に一時的にメモリ領域を確保するようなオブジェクトコードを生成するコンパイラにおいて、
前記配列のメモリ使用量が、プログラムを実行した結果、宣言されたサイズより小さい範囲しか使用しない場合に、前記宣言されたサイズより小さいメモリ領域を確保するようにオブジェクトファイルを生成する構成としてある。
【００２４】
このようにすれば、宣言された一時配列において、配列のメモリ領域が、宣言された範囲より小さい範囲しか使用されない場合、宣言されたサイズより小さいメモリ領域を確保するようにオブジェクトファイルを生成するので、メモリ占有量を小さく確保することができる。
【００２５】
また、請求項５記載の発明は、ソースファイルをコンパイルして複数のオブジェクトファイルを生成し、前記複数のオブジェクトファイルをリンクして生成された実行形式プログラムをシミュレートするシミュレータにおいて、
各変数に対するメモリ書き込み値の最大値と最小値のみを記録、または各配列における最大使用量を記録し、前記最大値と最小値のみの記録内容、または前記最大使用量の記録内容を、外部ファイルに生成する構成としてある。
【００２６】
このようにすれば、シミュレータにおいて、プログラム実行時に、各変数の実際に変化する最大値や最小値を記録し、また各配列の実際のメモリ使用量を記録し、その内容を外部ファイルに生成することができる。
【００２７】
また、請求項６記載の発明は、ソースファイルをコンパイルして複数のオブジェクトファイルを生成し、前記複数のオブジェクトファイルをリンクして生成された実行形式プログラムを実行するエミュレータにおいて、
各変数に対するメモリ書き込み値の最大値と最小値のみを記録、または各配列における最大使用量を記録し、前記最大値と最小値のみの記録内容、または前記最大使用量の記録内容を、外部ファイルに生成する構成としてある。
【００２８】
このようにすれば、エミュレータにおいて、プログラム実行時に、各変数の実際に変化する最大値や最小値を記録し、また各配列の実際のメモリ使用量を記録し、その内容を外部ファイルに生成することができる。
【００２９】
また、請求項７記載の発明は、プログラム開発支援システムを、請求項１〜請求項６記載のコンパイラ、シミュレータ、エミュレータで構成される変数、配列のメモリ領域の占有量を低減化する構成としてある。
【００３０】
このようにすれば、コンパイラ、リンカ、シミュレータ、エミュレータで構成されるプログラム開発支援システムにおいて、プログラムの実行時の変数の取り得る最大値、配列のメモリ使用量からプログラムのメモリ使用量を最小化することができる。
【発明の効果】
【００３１】
請求項１記載の発明によれば、宣言された静的な変数に対して、使用される値の範囲がその宣言されたサイズ以下である場合、メモリ占有量を小さくすることができる。
請求項２記載の発明によれば、宣言された静的な配列において、配列のメモリ領域が、宣言された範囲より小さい範囲しか使用されない場合、メモリ占有量を小さくすることができる。
【００３２】
請求項３記載の発明によれば、宣言された一時変数に対して、使用される値の範囲がその宣言されたサイズ以下である場合、メモリ領域をそのサイズより小さく確保することができる。
請求項４記載の発明によれば、宣言された一時配列において、配列のメモリ領域が、宣言された範囲より小さい範囲しか使用されない場合、メモリ占有量を小さく確保することができる。
【００３３】
請求項５記載の発明によれば、シミュレータにおいて、プログラム実行時に、各変数の実際に変化する最大値や最小値を記録し、また各配列の実際のメモリ使用量を記録し、その内容を外部ファイルに生成することができる。
請求項６記載の発明によれば、エミュレータにおいて、プログラム実行時に、各変数の実際に変化する最大値や最小値を記録し、また各配列の実際のメモリ使用量を記録し、その内容を外部ファイルに生成することができる。
【００３４】
請求項７記載の発明によれば、コンパイラ、リンカ、シミュレータ、エミュレータで構成されるプログラム開発支援システムにおいて、プログラムの実行時の変数の取り得る最大値、配列のメモリ使用量からプログラムのメモリ使用量を最小化することができる。
【発明を実施するための最良の形態】
【００３５】
［実施形態１］
以下、本発明を図示の実施形態に基づいて説明する。
図１は、本実施形態の処理の流れを示す図である。
図１において、ホストコンピュータＨ１にて作成されたソースプログラム群は、コンパイラＣ１によりそれぞれデバッグ情報付きで複数のオブジェクトファイルが生成され、リンカＬ１が、これら複数のオブジェクトファイルの結合処理を行い、実行形式プログラムＰ１が生成される。
【００３６】
この実行形式プログラムＰ１がシミュレータＳ1にダウンロードされ、プログラムが実行される。この時、各変数への書き込みデータをトレースし、その変数の取り得る最大値と最小値を記録する。この最大値、及び最小値は、その変数の符号付きであるか否かにより異なるため、その情報に従って記録される。
【００３７】
記録される情報の例を図２に示す。ここで、配列の場合は、全配列メンバー全てに対しての最小値、最大値を記録する。
また、各配列領域のアクセスされる先頭から相対アドレスの最小値と最大値を記録する。その情報例を図３に示す。
【００３８】
プログラムの実行が終わり、それらの記録した変数、及び配列情報を外部ファイルＦ１にファイル化する。外部ファイルＦ１の内容は、図２、及び図３の内容を含んで、例えば図４のような形式になる。
【００３９】
コンパイラＣ１は、このファイル内部情報（変数、及び配列情報）を元に、再度ソースファイルのコンパイルを実行し、実際にとり得る値に沿った変数の型変換、配列のサイズ変換を行い、メモリ容量の低減化を行ったオブジェクトファイルを生成する。リンカＬ１は、それらのオブジェクトファイルを再結合し、メモリ容量を低減化した実行形式プログラムＰ２を生成することになる。
【００４０】
ここで、図５で示すようなＣ言語ソースファイルがあり、一旦実行形式プログラム生成後、シミュレータで実行した結果、変数の実際の取り得る値が、図６で示される値であるとすると、unsigned intである変数abcは最大値が250なので、unsigned charのサイズで収まり、ext1もcharサイズで収まる。def、xyz、ext2は、それぞれ宣言通りのサイズを要することになる。
【００４１】
これにより、図７のように、abc、ext1がそれぞれ小さいサイズの型に見なしてコンパイルを実行する。ただし、一時変数をメモリに確保せず、プロセッサのレジスタに置き、サイズ変更しても効果がない場合は、サイズ変更は行われない。図５では、自動変数であるiが該当するものとする。なお、ここで、charは１バイト、intは２バイト、longは４バイトとする。
【００４２】
また、図８で示すようなＣ言語ソースファイルがあり、配列のアクセスされる範囲が、図９(a)，(b)で示される値であるとすると、変数のサイズについては、上記同様の方法で小さくできるものは小さくする。つまり、ext1、ext2、ext4がそれに該当する。配列については、abcはabc[0]からabc[12]までしか用いず、defはdef[10]からdef[28]までしか用いられないため、それぞれabc[13]、def[19]の宣言で収まることになる。これにより、図１０のように配列サイズが小さいサイズに見なされる。
【００４３】
また、abcの場合は添え字0から始まるため、使用される最も大きい添え字分まで確保するだけでよいが、defの場合は、添え字が10から始まるため、この配列defを使用している部分は、そのオフセット分を差し引いてコンパイルを実行する。図１０における「def[ext2+i-10]」の「-10」の部分はそのための記述である。
【００４４】
ここで、図９(b)における配列のアドレス最小値、最大値は、宣言されている型のサイズを元にして添え字の値を計算させたものを示している。この計算は、コンパイラが行う場合と、シミュレータが情報ファイルを生成する時に行う場合がある。
【００４５】
さらに、ここでは、各配列メンバーの値がその宣言されたサイズより小さければ、上記同様に、型を小さいものと見なしてコンパイルする。つまり、unsigned int宣言されている配列abcは、最大値が250なので、unsigned charで収まることになる。
【００４６】
なお、配列サイズにおける本例は、一次元配列での変換であるが、多次元配列でも同様にメモリ容量の低減化が実現できる。
【００４７】
［実施形態２］
図１１は、本実施形態の処理の流れを示す図である。Ｈ２は、ホストコンピュータである。
図１１において、図１と同様に生成された実行形式プログラムＰ１を、デバッガＤ１を通じてエミュレータＥ１にダウンロードし、実環境での実行トレースからも、同様に変数情報、配列情報を得る。
【００４８】
ただし、エミュレータＥ１では、リアルタイムトレース用のトレースバッファに、一旦変数への読み書き情報を蓄積し、プログラム終了後（停止後）に、そのトレース情報から、デバッガＤ１により上記情報を解析し得ることになる。
以下、上記説明したシミュレータＳ１での手順と同様にして、メモリ容量を低減化した実行形式プログラムＰ２を生成することになる。
【産業上の利用可能性】
【００４９】
本発明は、ＣＰＵ／ＤＳＰ等のマイコン組み込み機器ソフトウェア開発に好適である。
【図面の簡単な説明】
【００５０】
【図１】本発明の実施形態１の処理の流れを示す図である。
【図２】同実施形態１における、記録される情報の例を示す図である。
【図３】同実施形態１における、各配列領域のアクセスされる先頭から相対アドレスの最小値と最大値を記録した情報例を示す図である。
【図４】同実施形態１における、外部ファイルの内容の形式を示す図である。
【図５】同実施形態１における、Ｃ言語ソースファイルの例である。
【図６】図５で示したＣ言語ソースファイルに対し、一旦実行形式プログラム生成後、シミュレータで実行した結果、変数の実際の取り得る値の例である。
【図７】図６で示したabc、ext1がそれぞれ小さいサイズの型に見なしてコンパイルを実行する場合の図である。
【図８】同実施形態１における、別のＣ言語ソースファイルの例である。
【図９】図８で示したＣ言語ソースファイルに対し、配列のアクセスされる範囲を示す図であって、(a)変数情報テーブル、(b)は配列情報テーブルである。
【図１０】図８で示したＣ言語ソースファイルに対し、abc、defがそれぞれ小さいサイズの型に見なしてコンパイルを実行する場合の図である。
【図１１】本発明の実施形態２の処理の流れを示す図である。
【図１２】従来例のプログラム開発の処理の流れを示す図である。
【符号の説明】
【００５１】
Ｈ１，Ｈ２  ホストコンピュータ
Ｃ１  コンパイラ
Ｌ１  リンカ
Ｐ１  縮小前の実行形式プログラム
Ｐ２  縮小後の実行形式プログラム
Ｓ1  シミュレータ
Ｆ１  外部ファイル
Ｄ１  デバッガ
Ｅ１  エミュレータ
Ｔ１  トレースメモリ
【図１】
2005301415.tif 000003
【図２】
2005301415.tif 000004
【図３】
2005301415.tif 000005
【図４】
2005301415.tif 000006
【図５】
2005301415.tif 000007
【図６】
2005301415.tif 000008
【図７】
2005301415.tif 000009
【図８】
2005301415.tif 000010
【図９】
2005301415.tif 000011
【図１０】
2005301415.tif 000012
【図１１】
2005301415.tif 000013
【図１２】
2005301415.tif 000014