(57)【特許請求の範囲】
【請求項１】
各変数を型のサイズ別に振り分けるステップと、
前記変数を並べ替える順序を昇順、降順のいずれかに選択するステップと、
昇順が選択されたときはサイズの小さい変数から大きい変数へと並べ替え、降順が選択されたときはサイズの大きい変数から小さい変数へと並べ替えるステップと、
該並べ替えの順番でスタック領域に割り付けるステップと、を含むことを特徴とするコンパイラによるスタック領域割り付け方法。
【請求項２】
システムの要求仕様がファイルサイズ又はスピードを優先する場合は前記昇順を選択し、
該要求仕様がスタックサイズの削減を優先する場合は前記降順を選択することを特徴とする請求項１に記載のコンパイラによるスタック領域割り付け方法。
【請求項３】
各変数を型のサイズ別に振り分けるステップと、
サイズの小さい変数から大きい変数へと昇順で並べ替えるステップと、
サイズの小さい変数が先頭にくるように該並べ替えの順番でスタック領域に割り付けるステップと、
前記振り分けられたサイズ毎のトータルサイズを所定のサイズで除算し、商の部分は前記サイズの順序に従って割り付けを行うステップと、
前記除算の余りの部分を前記割り付けが終了した後に割り付けるステップと、を含むことを特徴とするコンパイラによるスタック領域割り付け方法。
【請求項４】
前記所定のサイズが１命令でアクセスできるサイズであることを特徴とする請求項３に記載のコンパイラによるスタック領域割り付け方法。
【請求項５】
各変数を型のサイズ別に振り分けるステップと、
サイズの小さい変数から大きい変数へと昇順で並べ替えるステップと、
サイズの小さい変数が先頭にくるように該並べ替えの順番でスタック領域に割り付けるステップと、
前記スタック領域内で変数を分割し、該分割された部分をスタックの最後に割り付けるステップと、を含むことを特徴とするコンパイラによるスタック領域割り付け方法。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、Ｃ言語等のシステム記述言語に適用するコンパイラ（compiler；翻訳ルーチン）によるスタック領域割り付け方法に関する。
【０００２】
【技術背景】
Ｃ言語に代表されるシステム記述言語は、アセンブリ言語に比べて開発効率が高く、大規模システムの開発に適しているが、メモリの使用量が多いという欠点を有しており、とくにマイクロコントローラ組み込みシステム用のプログラムを作成する場合には、パソコンやワークステーション上で動作するプログラムを作成する場合と異なって、１バイトでもメモり容量を少なくすることが求められるから、上記欠点の克服が大きな課題になっている。
【０００３】
【従来の技術】
システム記述言語で書かれたプログラムは、専用のコンパイラによってそのコントローラで実行できる機械語に翻訳された後、メモリにロードされ、実行される。メモリ空間におけるプログラムの配置は、コード（命令）とデータ（変数）の部分に分けられており、変数の値を参照して適宜のコードが実行されるようになっている。たとえば、ＡＤＤという加算命令があったとすると、命令ＡＤＤ（Ａ，Ｂ）の実行結果は、変数ＡとＢの内容の加算値になる。
【０００４】
ここで、変数には、プログラムの実行中、常に確保されるもの（静的変数）と所定の関数が呼び出されるときだけに確保されるもの（動的変数）の二種類がある。静的変数はメモリ上に固定的にその領域が確保されるが、動的変数は必要に応じてメモリ上のスタック領域に各変数が割り付けられる。
図５は従来のスタック領域の概念図である。ここでは、説明の便宜上、４バイト幅のスタック領域を示しているがこれに限定されない。
【０００５】
Ｖ１  〜Ｖ１４はそれぞれ変数であり、型（ｔｙｐｅ；たとえば、固定小数点数値型、浮動小数点単精度数値型、浮動小数点倍精度数値型……）のサイズの大きいものから小さいものへとアドレス順に割り付けられている。すなわち、Ｖ１  〜Ｖ４  は最大サイズ（４バイトサイズ）の型を有するもの、Ｖ５  〜Ｖ１０は中間サイズ（２バイトサイズ）の型を有するもの、Ｖ１１〜Ｖ１４は最小サイズ（１バイトサイズ）の型を有するものである。なお、これらの型やサイズは説明のためのものであり、実際の変数を特定するものではない。
【０００６】
ここで、変数の宣言順とメモリの削減効果との関係について説明する。いま、変数の宣言の順番が「１バイト」、「４バイト」、「２バイト」、「４バイト」であったと仮定すると、このときのメモリイメージは図６（ａ）のようになる。なお、図中の数字（１、４、２、４）は変数の型のサイズを表している。これによれば、１バイトの変数の隣に３バイト分の空きが生じ、さらに、２バイトの変数の隣に２バイト分の空きが生じているから、結局、スタックメモリは、変数の総バイト数（１＋４＋２＋４＝１１バイト）に、空きバイト（５バイト）を加えた大きさ（１６バイト）になる。これに対し、宣言の順番を降順、すなわち「４バイト」、「４バイト」、「２バイト」、「１バイト」にしたときのメモリイメージは、同図（ｂ）のようになる。空きは最後の１バイト分だけであり、スタックメモリの大きさは空きバイトも含めて１２バイトになる。したがって同図（ａ）に比べて、４バイト分のメモリ削減を図ることができる。
【０００７】
【発明が解決しようとする課題】
しかしながら、かかる従来のコンパイラによるスタック領域割り付け方法にあっては、その割り付け順が型が大きいものから小さいものへとなっていたため、たとえば、型のサイズによってアクセス範囲が異なるアーキテクチャの場合には、スタック領域の後方に位置する変数（すなわち型サイズの小さな変数）に対するアクセス回数が増えて効率が悪くなるといった問題点がある。
【０００８】
図７はスタック領域に対して１命令でアクセスできる範囲を示す概念図であり、スタック領域の最後方に位置する変数に対するアクセス範囲（１バイトアクセスの範囲）が最も狭くなっている。したがって、たとえば、図５のＶ１１〜Ｖ１４を１度にアクセスすることができないから、型サイズの小さい変数の呼出し頻度が多いほど、プログラムの実行速度が遅くなるという不具合がある。
【０００９】
【目的】
そこで、本発明は、変数の割り付け順序を逆にすることにより、型のサイズによってアクセス範囲が異なるアーキテクチャに適用した場合の実行速度の低下問題を解決することを目的とする。
【００１０】
【課題を解決するための手段】
本発明は、上記目的を達成するために、各変数を型のサイズ別に振り分けるステップと、前記変数を並べ替える順序を昇順、降順のいずれかに選択するステップと、昇順が選択されたときはサイズの小さい変数から大きい変数へと並べ替え、降順が選択されたときはサイズの大きい変数から小さい変数へと並べ替えるステップと、該並べ替えの順番でスタック領域に割り付けるステップと、を含むことを特徴とする。
なお、システムの要求仕様がファイルサイズ又はスピードを優先する場合は前記昇順を選択し、該要求仕様がスタックサイズの削減を優先する場合は前記降順を選択するとよい。
【００１１】
また、各変数を型のサイズ別に振り分けるステップと、サイズの小さい変数から大きい変数へと昇順で並べ替えるステップと、サイズの小さい変数が先頭にくるように該並べ替えの順番でスタック領域に割り付けるステップと、前記振り分けられたサイズ毎のトータルサイズを所定のサイズで除算し、商の部分は前記サイズの順序に従って割り付けを行うステップと、前記除算の余りの部分を前記割り付けが終了した後に割り付けるステップと、を含むことを特徴とする。
なお、前記所定のサイズが１命令でアクセスできるサイズであることはよい。
【００１２】
また、各変数を型のサイズ別に振り分けるステップと、サイズの小さい変数から大きい変数へと昇順で並べ替えるステップと、サイズの小さい変数が先頭にくるように該並べ替えの順番でスタック領域に割り付けるステップと、前記スタック領域内で変数を分割し、該分割された部分をスタックの最後に割り付けるステップと、を含むことを特徴とする。
【００１３】
【作用】
本発明では、型のサイズの小さい変数がスタック領域の前方に配置される。したがって、型のサイズによってアクセス範囲が異なるアーキテクチャに適用した場合でも、サイズの小さい変数を１命令でアクセスでき、プログラムの実行速度を向上できる。
【００１４】
【実施例】
以下、本発明の実施例を図面に基づいて説明する。
図１〜図４は本発明に係るコンパイラによるスタック領域割り付け方法の一実施例を示す図である。
図１において、１は前処理部、２は変数割り付け部である。前処理部１はその概略フローを図２に示すように、すべての変数（データ）について、型のサイズ（境界整合値）毎に振り分けるステップ１１と、プログラムの設計仕様に従って、スタックサイズの削減を優先させるか実行速度（またはプログラムサイズ；ファイルサイズとも言う）を優先させるかを決めるステップ１２とを含み、スタックサイズ優先の場合には肢（１）に分岐し、実行速度優先の場合には肢（２）に分岐する。
【００１５】
再び、図１において、２０及び２１は、いずれも変数を割り付けたスタック領域であるが、２０は肢（１）に対応するもの、２１は肢（２）に対応するものである。スタック領域２０は、冒頭で述べた従来例と同様に、各変数をサイズの大きいものから小さいものへと降順に並べ替え、サイズの大きい変数が先頭に来るように割り付けたものである。これに対して、スタック領域２１は、各変数をサイズの小さいものから大きいものへと昇順に並べ替え、サイズの小さい変数が先頭に来るように割り付けたものである。
【００１６】
たとえば、左側のスタック領域２０の先頭行から４行目には４バイトサイズの変数Ｖ１  〜Ｖ４  が割り付けられ、５行目から７行目には２バイトサイズの変数Ｖ５  〜Ｖ１０が割り付けられ、最終行には１バイトサイズの変数Ｖ１１〜Ｖ１４が割り付けられており、右側のスタック領域２１の先頭行には１バイトサイズの変数Ｖ１１〜Ｖ１４が割り付けられ、２行目から４行目には２バイトサイズの変数Ｖ５  〜Ｖ１０が割り付けられ、５行目から最終行には４バイトサイズの変数Ｖ１  〜Ｖ４  が割り付けられている。すなわち、スタック領域２０は「降順」の割り付け、スタック領域２１は「昇順」の割り付けになっている。
【００１７】
ここで、二つのスタック領域２０、２１の間には、型のサイズによって１命令でアクセスできる範囲が示されている。４バイトデータのアクセスであれば領域のすべてが範囲に収まるが、２バイトデータのアクセスや１バイトデータのアクセスでは領域の一部に限られる。
したがって、左側のスタック領域２０の変数Ｖ１１〜Ｖ１４をアクセスする場合は、１バイトアクセスを複数命令で行う必要があり、効率的でないが、右側のスタック領域２１の変数Ｖ１１〜Ｖ１４をアクセスする場合は、その変数Ｖ１１〜Ｖ１４が領域の先頭、すなわち１バイトアクセスの範囲内に位置しているから、１命令で済み、効率がよい。
【００１８】
以上のとおり、本実施例では、スタック領域の変数割り付けを昇順とすることにより、型サイズの小さな変数に対するアクセス効率を改善でき、プログラムの実行速度を向上することができるという優れた効果が得られる。なお、スタックサイズ優先の場合には、従来通り、割り付けを降順とすればよく、要求仕様によって「昇順」、「降順」を適宜に選択すればよい。
【００１９】
また、変数を昇順に並べ替える際に、各型ごとの変数のトータルサイズを所定のサイズで除算し、その商の部分を並べ替えの対象にするとともに、余りの部分を並べ替え順の後に割り付けるようにしてもよい。
図３はその並べ替えの概略フローである。このフローでは、まず、ステップ３１で、すべての変数（データ）について、型のサイズ（境界整合値）毎に振り分けた後、ステップ３２で、振り分けたデータのトータルサイズ（すなわち各型ごとの変数のトータルサイズ）及びデータのチェックを行う。次いで、ステップ３３で、そのトータルサイズを所定のサイズ（たとえば最大の境界整合値）で除算し、商の部分（割りきれる部分）と余りの部分とに分割した後、ステップ３４、３５で、境界整合値の種類分だけループを繰り返すとともに、境界整合値の小さいものから昇順で各変数を割り付ける。そして、最後にステップ３６で、余りの部分をその後に割り付ける。
【００２０】
たとえば、図４（ａ）に示すように、１バイトの型を持つデータ（図中の“１”）が９個連続する場合で、かつ、その１バイトの型のデータを１命令でアクセスできる範囲をＡとすると、このデータ型のトータルサイズは９バイトとなり、最大の境界整合値は８バイトとなるから、商の部分は８バイト、余りの部分は１バイトになる。したがって、この場合には、１バイトの型のデータのうち、最後の１バイト分がスタックの最後に割り付けられることになる。
【００２１】
または、スタック内で分割可能な変数であれば、次のようにすることもできる。たとえば、図４（ｂ）に示すように、５バイトの型を持つ１つの変数（図中の“５”）で、この変数が分割可能な場合には、３バイトの部分（３）と２バイトの部分（２）とに分割し、２バイトの部分（２）をスタックの最後に割り付けてもよい。
【００２２】
【発明の効果】
本発明によれば、スタック領域の変数割り付けを昇順とすることにより、型のサイズによってアクセス範囲が異なるアーキテクチャに適用した場合でも、サイズの小さい変数を１命令でアクセスでき、プログラムの実行速度を向上できる。
【図面の簡単な説明】
【図１】一実施例の概念図である。
【図２】一実施例の前処理の概略フローである。
【図３】一実施例に適用して好ましい変数分割の概略フローである。
【図４】一実施例に適用して好ましい変数分割の概念図である。
【図５】従来のスタック領域の概念図である。
【図６】変数の宣言順とメモリの削減効果との関係図である。
【図７】型のサイズとアクセス範囲との関係を示す概念図である。
【符号の説明】
Ｖ１  〜Ｖ１４：変数
２０、２１：スタック領域
【図１】
0003625878.tif 000002
【図２】
0003625878.tif 000003
【図３】
0003625878.tif 000004
【図４】
0003625878.tif 000005
【図５】
0003625878.tif 000006
【図６】
0003625878.tif 000007
【図７】
0003625878.tif 000008