(57)【要約】【課題】  大域変数のアドレスを生成するコストを可及的に低する。【解決手段】  入力コードから同一のグループに属する大域変数をグループ別に抽出し、各前記グループから抽出された前記大域変数のうちベースとなるベース大域変数を前記グループごとに決定し、前記ベース大域変数のアドレスと、前記ベース大域変数と同一のグループに属する他の大域変数のアドレスとのオフセットを、前記ベース大域変数のアドレスに加算して前記他の大域変数にアクセスするコード、を生成する。【選択図】  図２
2005228047.tif 000002
【特許請求の範囲】
【請求項１】
入力コードから同一のグループに属する大域変数をグループ別に抽出する大域変数抽出手段と、
各前記グループから抽出された前記大域変数のうちベースとなるベース大域変数を前記グループごとに決定するベース決定手段と、
前記ベース大域変数のアドレスと、前記ベース大域変数と同一のグループに属する他の大域変数のアドレスとのオフセットを、前記ベース大域変数のアドレスに加算して前記他の大域変数にアクセスするコード、を生成するコード生成手段と、
を備えた言語処理装置。
【請求項２】
ソースコードのコンパイルにより生成された目的コードにおける大域変数へのアクセスコード部分を書き換える言語処理装置であって、
同一のグループに属する大域変数を前記目的コードからグループ別に抽出する大域変数抽出手段と、
各前記グループから抽出された前記大域変数のうちベースとなるベース大域変数を前記グループごとに決定するベース決定手段と、
前記ソースコードから前記目的コードへの変換時に生成される大域変数の配置関係を表す情報を用いて、前記ベース大域変数と同一のグループに属する他の大域変数について前記ベース大域変数のアドレスからのオフセットを計測するオフセット計測手段と、
前記ベース大域変数のアドレスに前記オフセットを加算して前記他の大域変数にアクセスするように、前記目的コードにおける前記他の大域変数へのアクセスコード部分を書き換えるコード変更手段と、
を備えたことを特徴とする言語処理装置。
【請求項３】
前記大域変数抽出手段は、同一の関数内に属する大域変数を、前記同一のグループに属する大域変数として抽出することを特徴とする請求項１又は２に記載の言語処理装置。
【請求項４】
入力コードから同一のグループに属する大域変数をグループ別に抽出する大域変数抽出ステップと、
各前記グループから抽出された前記大域変数のうちベースとなるベース大域変数を前記グループごとに決定するベース決定ステップと、
前記ベース大域変数のアドレスと、前記ベース大域変数と同一のグループに属する他の大域変数のアドレスとのオフセットを、前記ベース大域変数のアドレスに加算して前記他の大域変数にアクセスするコード、を生成するコード生成ステップと、
をコンピュータに実行させる言語処理プログラム。
【請求項５】
ソースコードのコンパイルにより生成された目的コードにおける大域変数へのアクセスコード部分を書き換えることをコンピュータに実行させる言語処理プログラムであって、
同一のグループに属する大域変数を前記目的コードからグループ別に抽出する大域変数抽出ステップと、
各前記グループから抽出された前記大域変数のうちベースとなるベース大域変数を前記グループごとに決定するベース決定ステップと、
前記ソースコードから前記目的コードへの変換時に生成される大域変数の配置関係を表す情報を用いて、前記ベース大域変数と同一のグループに属する他の大域変数について前記ベース大域変数のアドレスからのオフセットを計測するオフセット計測ステップと、
前記ベース大域変数のアドレスに前記オフセットを加算して前記他の大域変数にアクセスするように、前記目的コードにおける前記他の大域変数へのアクセスコード部分を書き換えるコード変更ステップと、
をコンピュータに実行させることを特徴とする言語処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、言語処理装置及び言語処理プログラムに関する。
【背景技術】
【０００２】
一般的な32bitRISCでは、大域変数にアクセスするために、32bit幅のアドレスを生成する必要がある。この32bit幅のアドレスを生成するためには、複数の命令を使用しなければならない。
【０００３】
図９は、従来における大域変数のアクセス手法を説明する図である。
【０００４】
命令ＩＮＳＴ１の「lui  r2, hi(a)」は、大域変数ａのアドレスの上位１６ビットを、全３２ビット長のレジスタｒ２の上位１６ビット領域に格納することを指示する（レジスタｒ２内の下位１６ビットは全て０）。また、命令ＩＮＳＴ２の「lw  r4, lo(a)(r2)」は大域変数ａのアドレスの下位１６ビットと、レジスタｒ２内のデータとを加算して大域変数ａのアドレスを算出し、この大域変数ａのアドレス内のデータをレジスタｒ４にロードすることを指示する。
【０００５】
よって、大域変数ａにアクセスするためには、２つの命令ＩＮＳＴ１、ＩＮＳＴ２を必要とし、同様に、命令ＩＮＳＴ３、ＩＮＳＴ４に示すように、大域変数ｂにアクセスするためにも、２つの命令を必要とする。つまり、１つの大域変数にアクセスするためには２つの命令を必要とする。命令サイズを４バイト（３２ビット）とすると、本手法により複数の大域変数にアクセスする場合、合計、アクセス数×８バイトのコードサイズを要する。
【０００６】
このように、本手法により大域変数へアクセスするには、大域変数ごとに２つの命令を使用するため、スタックポインタからのオフセットによりアクセスする局所変数の場合と比較して、常に倍に近いコードサイズ及び実行速度を要する。
【０００７】
そこで、ベースとなるアドレス（ベースアドレス）を設定し、そのベースアドレスからのオフセットによってアクセスするようにすると、コードサイズが縮小し、実行速度が向上する。具体的には、コンパイル時に、特定のメモリ領域に配置した大域変数については、ベースアドレスからのオフセットによりアクセスするようにする。これについて図１０を用いて説明する。
【０００８】
図１０は、従来における、ベースアドレスを用いた大域変数のアクセス手法を説明する図である。
【０００９】
命令ＩＮＳＴ５の「lw  r4, g_off(a)(r2)」は、レジスタｒ２内に格納されたベースアドレスと、このベースアドレスから大域変数ａのアドレスまでのオフセットｇ＿ｏｆｆ（ａ）とを加算して大域変数ａのアドレスを算出し、このアドレス内のデータをレジスタｒ４にロードすることを指示する。従って、大域変数ａにアクセスするためには、１つの命令を必要とし、同様に、命令ＩＮＳＴ６に示すように、大域変数ｂにアクセスするためにも、１つの命令を必要とする。つまり、１つの大域変数にアクセスするためには１つの命令を必要とする。よって、複数の大域変数にアクセスする場合、合計、アクセス数×４バイトのコードサイズを要する。
【００１０】
このように、ベースアドレスを用いることで、より少ない命令数によって大域変数にアクセスできる。しかし、問題点として、ベースアドレスが常に固定であるため、大域変数のアドレスを簡易に生成できるメモリ領域がベースアドレスから一定の範囲に限られることがある。
【００１１】
そこで、ベースアドレスを固定ではなく可変にする方法も考えられる。これについて図１１を用いて説明する。
【００１２】
図１１は、ベースアドレスを可変とした場合における大域変数のアクセス手法を説明する図である。
【００１３】
命令ＩＮＳＴ７の「lui  gp, hi(base1)」は、ベースアドレスｂａｓｅ１の上位１６ビットを、全３２ビット長のグローバルポインタｇｐの上位１６ビット領域に格納することを指示する（グローバルポインタｇｐの下位１６ビットは全て０）。また、命令ＩＮＳＴ８の「addiu  gp, gp, lo(base1)」は、ベースアドレスｂａｓｅ１の下位１６ビットと、グローバルポインタｇｐ内のデータとを加算してベースアドレスｂａｓｅ１を算出し、このベースアドレスｂａｓｅ１をグローバルポインタｇｐに格納することを指示する。即ち、これら２つの命令を用いてグローバルポインタｇｐ内にベースアドレスｂａｓｅ１を設定する。
【００１４】
次に、命令ＩＮＳＴ９の「lw  r4, g_off(a)(gp)」は、グローバルポインタｇｐ内のベースアドレスｂａｓｅ１と、ベースアドレスｂａｓｅ１から大域変数ａのアドレスまでのオフセットg_off(a)とを加算して大域変数ａのアドレスを算出し、このアドレスに格納されたデータをレジスタｒ４にロードすることを指示する。
【００１５】
従って、本手法により複数の大域変数にアクセスする場合、ベースアドレスｂａｓｅ１を設定する２つの命令と、各大域変数へアクセスするためのそれぞれ１つの命令とを要し、コードサイズは、合計、８＋アクセス数×４バイトとなる。
【００１６】
以上から分かるように、ベースアドレスｂａｓｅ１を切り替えるには、その都度、２つの命令を必要とするベースアドレスｂａｓｅ１の再設定が必要となる（命令ＩＮＳＴ７、ＩＮＳＴ８参照）。このため、大域変数が必要とするメモリ領域が大きい場合、ベースアドレスｂａｓｅ１の切り替えが頻繁に発生して、本手法による最適化の効果が薄くなってしまう。
【００１７】
一方、割り込み処理時には、ベースアドレスｂａｓｅ１を一旦保存し、割り込みプログラムにおいて上述の再設定を行い、割り込み終了後には、保存したベースアドレスｂａｓｅ１を復帰させる必要がある。つまり、ベースアドレスｂａｓｅ１の保存及び復帰という余計な処理が必要となる。なお、上述の固定のベースアドレスを用いる場合は、このような処理は生じない。
【００１８】
これらの結果、応答性能及びコードサイズは、アドレスを直接生成して大域変数にアクセスする場合（図９参照）よりも悪化及び増大してしまう。
【特許文献１】特開２００２−１８２９２６号公報
【特許文献２】特開平１０−１２４３２５号公報
【特許文献３】特開平０５−１２００２８号公報
【特許文献４】特開平０２−１７１８３１号公報
【発明の開示】
【発明が解決しようとする課題】
【００１９】
本発明の目的は、コードサイズの縮小、延いては、実行速度の向上を図ることのできる言語処理装置及び言語処理プログラムを提供することにある。
【課題を解決するための手段】
【００２０】
本発明の言語処理装置は、入力コードから同一のグループに属する大域変数をグループ別に抽出する大域変数抽出手段と、各前記グループから抽出された前記大域変数のうちベースとなるベース大域変数を前記グループごとに決定するベース決定手段と、前記ベース大域変数のアドレスと、前記ベース大域変数と同一のグループに属する他の大域変数のアドレスとのオフセットを、前記ベース大域変数のアドレスに加算して前記他の大域変数にアクセスするコード、を生成するコード生成手段と、を備える。
【００２１】
本発明の言語処理装置は、ソースコードのコンパイルにより生成された目的コードにおける大域変数へのアクセスコード部分を書き換える言語処理装置であって、同一のグループに属する大域変数を前記目的コードからグループ別に抽出する大域変数抽出手段と、  各前記グループから抽出された前記大域変数のうちベースとなるベース大域変数を前記グループごとに決定するベース決定手段と、前記ソースコードから前記目的コードへの変換時に生成される大域変数の配置関係を表す情報を用いて、前記ベース大域変数と同一のグループに属する他の大域変数について前記ベース大域変数のアドレスからのオフセットを計測するオフセット計測手段と、前記ベース大域変数のアドレスに前記オフセットを加算して前記他の大域変数にアクセスするように、前記目的コードにおける前記他の大域変数へのアクセスコード部分を書き換えるコード変更手段と、を備える。
【００２２】
本発明の言語処理プログラムは、入力コードから同一のグループに属する大域変数をグループ別に抽出する大域変数抽出ステップと、各前記グループから抽出された前記大域変数のうちベースとなるベース大域変数を前記グループごとに決定するベース決定ステップと、前記ベース大域変数のアドレスと、前記ベース大域変数と同一のグループに属する他の大域変数のアドレスとのオフセットを、前記ベース大域変数のアドレスに加算して前記他の大域変数にアクセスするコード、を生成するコード生成ステップと、をコンピュータに実行させる。
【００２３】
本発明の言語処理プログラムは、ソースコードのコンパイルにより生成された目的コードにおける大域変数へのアクセスコード部分を書き換えることをコンピュータに実行させる言語処理プログラムであって、同一のグループに属する大域変数を前記目的コードからグループ別に抽出する大域変数抽出ステップと、各前記グループから抽出された前記大域変数のうちベースとなるベース大域変数を前記グループごとに決定するベース決定ステップと、前記ソースコードから前記目的コードへの変換時に生成される大域変数の配置関係を表す情報を用いて、前記ベース大域変数と同一のグループに属する他の大域変数について前記ベース大域変数のアドレスからのオフセットを計測するオフセット計測ステップと、  前記ベース大域変数のアドレスに前記オフセットを加算して前記他の大域変数にアクセスするように、前記目的コードにおける前記他の大域変数へのアクセスコード部分を書き換えるコード変更ステップと、をコンピュータに実行させる。
【発明の効果】
【００２４】
本発明により、コードサイズの縮小、延いては、実行速度の向上を図ることができる。
【発明を実施するための最良の形態】
【００２５】
図１は、本実施の形態に従ったコンパイラ（言語処理プログラム）による処理ステップ（後述）により生成された、複数の関数を含むコードの一部を示す図である。
【００２６】
このコード部分は、ある関数内における例えば先頭の３つの命令を示し、最初の２つの命令ＩＮＳＴ１１、１２で大域変数ａにアクセスし、次の命令ＩＮＳＴ１２で大域変数ｂにアクセスする。より詳しくは以下の通りである。
【００２７】
命令ＩＮＳＴ１１、ＩＮＳＴ１２は、大域変数ａのアドレスを生成し、生成された大域変数ａのアドレスに格納されたデータをレジスタｒ４にロードする命令である。
【００２８】
即ち、命令ＩＮＳＴ１１の「lui  r2, hi(a)」は、大域変数ａ（３２ビット）の上位１６ビットを、全３２ビット長のレジスタｒ２の上位１６ビット領域に格納することを指示する（レジスタｒ２の下位１６ビットには全て０が格納される）。また、命令ＩＮＳＴ１２の「lw  r4, lo(a)(r2)」は、大域変数ａの下位１６ビットとレジスタｒ２内のデータとを加算して大域変数ａのアドレスを生成し、この大域変数ａのアドレスに格納されたデータをレジスタｒ４にロードすることを指示する。
【００２９】
次に、命令ＩＮＳＴ１３は、大域変数ａのアドレスに、大域変数ａのアドレスと大域変数ｂのアドレスとのオフセットを加えることにより大域変数ｂのアドレスを生成し、この大域変数ｂのアドレスに格納されたデータをレジスタｒ５にロードする命令である。
【００３０】
即ち、命令ＩＮＳＴ１３の「lw  r5, lo(a)+offset(b-a)(r2)」は、レジスタｒ２内のデータと大域変数ａ、ｂ間のオフセット（ｏｆｆｓｅｔ（ｂ−ａ））とを加算し、さらにこれに、大域変数ａの下位アドレス（ｌｏ（ａ））を加えたアドレス（大域変数ｂのアドレス）に格納されたデータをレジスタｒ５にロードすることを指示する。言い換えると、命令ＩＮＳＴ１３は、大域変数ａのアドレス（ｌｏ（ａ）＋レジスタｒ２内のデータ）に大域変数ａ、ｂ間のオフセット（ｏｆｆｓｅｔ（ｂ−ａ））を加算することにより大域変数ｂのアドレスを算出し、このアドレスに格納されたデータをレジスタｒ５にロードすることを指示する。
【００３１】
以上のように、このコードでは、最初にアクセスする大域変数ａについては従来と同様に直接、アドレスを生成し、アクセスする。従って、２つの命令を要する（図９参照）。しかし、２番目以降にアクセスする大域変数ｂ等については、大域変数ａからのオフセットによりアクセスするので、必要な命令数は、１命令である。従って、複数の大域変数にアクセスするために必要な合計のコードサイズは、１つの命令長を４バイトとすると、図１に示すように、（４＋アクセス数×４）バイトとなる。
【００３２】
以上では１つの関数に着目して説明したが、他の関数においても同様のコード形式を有する。つまり、各関数において最初にアクセスする大域変数については従来と同様に直接、アドレスを生成してアクセスするが、２番目以降の大域変数については最初にアクセスした大域変数のアドレスからのオフセットにより、つまり１命令でアクセスする。
【００３３】
但し、以上までの説明において、同一関数内の各大域変数は同一のメモリ領域（例えば、tiny領域、near領域、far領域、各領域が複数のセクションに分割されている場合の各セクション等）に配置されているものとする。
【００３４】
図２は、本発明の実施の形態としてのコンパイラによる処理ステップを示すフローチャートである。
【００３５】
本コンパイラによる処理ステップは、例えば、従来のコンパイルによる処理（前処理）の後処理として実行される。従って、本処理の開始前には、変数配置が既に決定されており、本処理では、この変数配置を利用する。より詳しくは以下の通りである。
【００３６】
まず、従来のコンパイル処理の結果としてのコード（対象コード）（例えばアセンブリコード）を先頭から読み込んで最初に現れる関数を特定し、特定した関数内の大域変数をメモリ領域別に抽出する（ステップＳ１）。
【００３７】
即ち、一般的に、上述の前処理では、大域変数へのアクセス手法（図９、図１０参照）等に応じて各大域変数をそれぞれ異なるメモリ領域に割り当てる。大域変数が実際に配置されるアドレスは、リンク処理時に決定されるので、コード生成の段階（コンパイル時）では特定できないが、大域変数がどの種類のメモリ領域に属するかという情報は、コンパイラが有している。従って、この情報を利用することで、特定した関数内の大域変数がいずれのメモリ領域に配置されたのかを判断できる。
【００３８】
次に、抽出した大域変数が、各メモリ領域について、一番はじめに抽出されたものであるかどうか、つまり、一番はじめにアクセスされるものであるかどうかを判断する（ステップＳ２）。
【００３９】
抽出した大域変数が一番初めのものである場合は（ステップＳ２のＹｅｓ）、当該関数中においてこの大域変数へアクセスするコードを、アドレスを直接生成してアクセスするコードに書き換える（ステップＳ３）。例えば、図１の命令ＩＮＳＴ１１、ＩＮＳＴ２２に示す形式のコードに書き換える。但し、既にこの形式を有していれば書き換える必要はない。
【００４０】
一方、抽出した大域変数が一番はじめに抽出されたものでない場合は（ステップＳ２のＮｏ）、その大域変数が、外部参照型であるかどうかを判断する（ステップＳ４）。抽出した大域変数が外部参照型であるかどうかは、例えば、対象コード中に記述された宣言に基づいて判断する。
【００４１】
その大域変数が外部参照型である場合は（ステップＳ４のＹｅｓ）、上述と同様に、この大域変数へアクセスするコードを、アドレスを直接生成してアクセスするコードに書き換える（ステップＳ３）。但し、既にこの形式を有していれば書き換える必要はない。
【００４２】
一方、その大域変数が外部参照型でない場合は（ステップＳ４のＮｏ）、この大域変数と、ステップＳ２で一番はじめに抽出したと判断された大域変数とのオフセットを上述の変数配置に基づき計算し、このオフセットが所定の範囲（命令セットの範囲）に収まるか否かを判断する（ステップＳ５）。つまり、上述の前処理により各大域変数の既に決定しているので、この変数配置に基づき、抽出した大域変数が、所定のオフセットによる範囲内に収まるか否かを判断する。
【００４３】
抽出した大域変数がオフセットによる範囲内に収まる場合は（ステップＳ５のＹｅｓ）、当該関数中においてこの大域変数へアクセスするコードを、一番はじめに抽出した大域変数からのオフセットによりアクセスするコードに書き換える（図１の命令ＩＮＳＴ１３参照）（ステップＳ６）。つまり、最初にアクセスする大域変数のアドレスにオフセット（命令ＩＮＳＴ１３の「ｏｆｆｓｅｔ（ｂ−ａ）」参照）を加算することによりこの大域変数へアクセスするコードを生成する。
【００４４】
以上のようにして、最初に特定した関数内における大域変数へのアクセスコードを書き換えたら、対象コード中の他の関数についても、上述の処理ステップＳ１〜Ｓ６を繰り返して、大域変数へのアクセスコードを書き換える。
【００４５】
以上のように、本実施の形態によれば、同一の関数且つ同一のメモリ領域ごとに固有のベースアドレスを持たせるようにしたので、少ない命令数で大域変数にアクセスできる可能性を可及的に高めることができる。つまり、これらの大域変数が、従来の固定のグローバルポインタから遠くに配置されていたとしても、最初にアクセスした大域変数からのオフセットによる範囲に収まれば、１命令でアクセスすることが可能となる。この際、ベースアドレスとして最初にアクセスした大域変数のアドレスを再利用するので、従来のベースアドレスの設定（図１１参照）のような余計な命令は必要なく、従って、少ない命令数でアクセスできる。このように、本実施形態によれば、少ない命令数で大域変数にアクセスできる結果、コードサイズの縮小及び実行速度の向上を図ることができる。
【００４６】
また、本実施の形態によれば、割り込み処理時においても、従来から行われていたのと同様のレジスタ待避等を行えば良く、図１１を用いて説明したような特別なレジスタの待避（グローバルポインタの待避）等の余計な処理は生じない。よって、割り込み処理時においても、実行性能の低下は生じない。
【００４７】
以上では、前処理により決定された変数配置をそのまま用いたが、以上の処理により生成されたコードを用いて変数の再配置を行い、この新たな変数配置に基づいて、上述の処理を再度行うことも可能である。以下、この例について説明する。
【００４８】
図３は、上述した図２に示す処理により生成されたコードに基づいて変数を再配置し、新たな変数の再配置に基づいて上述の処理を再度行う処理ステップ例を示すフローチャートである。
【００４９】
まず、上述した図２に示す処理により生成されたコード中からメモリ領域別且つ関数別に大域変数を抽出し、大域変数テーブルに登録する（ステップＳ１１）。
【００５０】
図４（ａ）〜図４（ｃ）は、コード中に３つの関数func1,func2,func3が含まれる場合において各関数func1,func2,func3について作成された大域変数テーブルを示す図である。
【００５１】
図中、各大域変数の前に付された「int」は、各大域変数が整数であることを表す型コードである。
【００５２】
図４（ａ）〜図４（ｃ）の見方について、図４（ａ）を例に取り、説明する。
【００５３】
図４（ａ）の左欄は、大域変数ａ１のアドレスをベースアドレスとしてアクセスする回数が、大域変数ｂ１は２回、大域変数ｃ１は３回あることを表す。一方、図４（ａ）の右欄は、大域変数ａ２のアドレスをベースアドレスとしてアクセスする回数が、大域変数ｂ２は１回、大域変数ｃ２は２回あることを表す。
【００５４】
次に、関数ごとに作成した大域変数テーブルをメモリ領域別に集計した集計テーブルを作成する（ステップＳ１２）。
【００５５】
図５は、メモリ領域Ｍ１に関して作成された集計テーブルを示す図である。図６は、メモリ領域Ｍ２に関して作成された集計テーブルを示す図である。
【００５６】
図５に示すように、大域変数ａ１は計５回、大域変数ｄ１、ｆ１はそれぞれ計２回、ベースアドレスとして参照されている。一方、図６に示すように、大域変数ａ２、ｃ２はそれぞれ計３回、大域変数ｄ２は計４回、ベースアドレスとして参照されている。
【００５７】
次に、各メモリ領域の集計テーブルを用いて、メモリ領域ごとに、大域変数の配置順序を決定する（図３のステップＳ１３）。現時点での変数配置は、メモリ領域Ｍ１は、ａ１、ｂ１、ｃ１、ｄ１、ｅ１、ｆ１、メモリ領域Ｍ２は、ａ２、ｂ２、ｃ２、ｅ２、ｄ２の順であるとする（図４参照）。
【００５８】
図７は、メモリ領域Ｍ１に関する集計テーブル（図５参照）に基づき、大域変数の配置順序を決定する様子を示す図である。図８は、メモリ領域Ｍ２に関する集計テーブル（図６参照）に基づき、大域変数の配置順序を決定する様子を示す図である。
【００５９】
具体的な大域変数の配置順序の決定手法について、図５及び図７を用いて、メモリ領域Ｍ１を例にして説明する。
【００６０】
（１）まず、図５の集計テーブルに基づき、被参照回数が最も多い大域変数を１つ選択（ここでは大域変数ａ１）して、図７に示すように、メモリ領域Ｍ１の先頭に配置する。被参照回数が最大の大域変数が複数ある場合は、例えば集計テーブルの上位に配置された方を優先する。
【００６１】
（２）次に、選択された大域変数を参照する回数の多い、同じ関数内の大域変数を、参照する回数（但し１回以上）の多い順に選択して（ここでは大域変数ｃ１、ｂ１の順に選択）、図７に示すように、大域変数ａ１の後側（高位アドレス側）に順次配置する。
【００６２】
（３）次に、残りの大域変数（ここでは大域変数ｄ１、ｅ１、ｆ１）の中から、被参照回数が最も多い大域変数を選択し（ここでは大域変数ｄ１）、（２）と同じ処理を行う。この結果、図７に示すように、大域変数ｂ１の後側に、大域変数ｄ１、ｅ１が、順次配置される。
【００６３】
（４）次に、（３）の処理を繰り返す。この結果、大域変数ｅ１の後に、大域変数ｆ１が配置される。
【００６４】
（５）残った大域変数（本例では特に該当するものはない）、つまり、参照・被参照関係のない大域変数（他の大域変数のアドレスをベースとしてアクセスする大域変数でも、他の大域変数によってベースアドレスとして用いられる大域変数でもない）は、メモリ領域内の任意の位置、例えば（４）までの処理によって配置された大域変数の直後に配置する。
【００６５】
以上では、メモリ領域Ｍ１を例にして、大域変数の配置順序を決定したが、メモリ領域Ｍ２についても、同様にして行う（図６及び図８参照）
この後、新たな大域変数の配置順序に基づいて、図２のフローチャートに示す処理ステップを再度行い、コードを生成する（ステップＳ１４）。
【００６６】
以上の処理による効果として以下のことが考えられる。即ち、ベースアドレスを参照する回数の多い大域変数を、ベースアドレスを有する大域変数に近づけて配置したので、変数の再配置を行わない場合よりも、最終的により短い機械語コード（例えばアセンブリコードをアセンブルしたコード）を生成できる可能性がある。例えば、図５に示すように、大域変数の再配置前は、大域変数の配置順序は、大域変数ａ１、ｂ１、ｃ１・・の順序であったが、大域変数の再配置後は、大域変数ａ１、ｃ１、ｂ１・・となり、大域変数ａ１を参照する回数の多い大域変数ｃ１（３回）を、参照回数の少ない回数の大域変数ｂ１（２回）と入れ替えて、大域変数ａ１に近づけた。大域変数ａ１に近い程、オフセット長を短くできるので、この結果、最終的に生成される機械語のコードサイズを短くできる可能性がある。
【図面の簡単な説明】
【００６７】
【図１】本発明の実施の形態としてのコンパイラによる処理ステップにより生成されたコードの一部を示す図である。
【図２】本発明の実施の形態としてのコンパイラによる処理ステップを示すフローチャートである。
【図３】図２の処理ステップにより生成されたコードに基づいて、変数の再配置を行う処理ステップを示すフローチャートである。
【図４】大域変数テーブルを示す図である。
【図５】集計テーブルを示す図である。
【図６】集計テーブルを示す図である。
【図７】図５の集計テーブルに基づき、大域変数の配置順序を決定する様子を示す図である。
【図８】図６の集計テーブルに基づき、大域変数の配置順序を決定する様子を示す図である。
【図９】従来における大域変数のアクセス手法を説明する図である。
【図１０】従来における、ベースアドレスからのオフセットによる大域変数のアクセス手法を説明する図である。
【図１１】従来における、ベースアドレスを可変とした場合の大域変数のアクセス手法を説明する図である。
【符号の説明】
【００６８】
ＩＮＳＴ１〜ＩＮＳＴ１２  命令
Ｓ１〜Ｓ６、Ｓ１１〜Ｓ１４  ステップ
【図１】
2005228047.tif 000003
【図２】
2005228047.tif 000004
【図３】
2005228047.tif 000005
【図４】
2005228047.tif 000006
【図５】
2005228047.tif 000007
【図６】
2005228047.tif 000008
【図７】
2005228047.tif 000009
【図８】
2005228047.tif 000010
【図９】
2005228047.tif 000011
【図１０】
2005228047.tif 000012
【図１１】
2005228047.tif 000013