JP2000339171A - コンパイル装置、方法及び記録媒体 - Google Patents

コンパイル装置、方法及び記録媒体

Info

Publication number
JP2000339171A
JP2000339171A JP11147742A JP14774299A JP2000339171A JP 2000339171 A JP2000339171 A JP 2000339171A JP 11147742 A JP11147742 A JP 11147742A JP 14774299 A JP14774299 A JP 14774299A JP 2000339171 A JP2000339171 A JP 2000339171A
Authority
JP
Japan
Prior art keywords
register
program
generating
external variable
code
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP11147742A
Other languages
English (en)
Inventor
Eishin Tanaka
英信 田中
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
NEC IC Microcomputer Systems Co Ltd
Original Assignee
NEC IC Microcomputer Systems Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by NEC IC Microcomputer Systems Co Ltd filed Critical NEC IC Microcomputer Systems Co Ltd
Priority to JP11147742A priority Critical patent/JP2000339171A/ja
Publication of JP2000339171A publication Critical patent/JP2000339171A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】 【課題】 メモリの利用効率がよく、実行速度の速いオ
ブジェクトプログラムを生成する。 【解決手段】 字句解析手段101、構文解析手段10
2及び最適化手段103の処理結果を中間ファイルとし
て出力する。コード生成手段1041では、外部変数お
よびレジスタ情報出力コード生成手段10412が、中
間ファイルを基にして外部変数の参照領域をメモリ領域
に確保するコードと、外部変数の参照回数と変数へのレ
ジスタ割り当てに関する情報を実行時にファイルに出力
する第1のコードを生成する。未使用レジスタ外部変数
割り当て手段10413は、上記第1のコードの実行結
果に従って、外部変数へのレジスタ割り当てを行う。未
使用レジスタ外部変数割り当てコード生成手段1041
4は、外部変数へのレジスタ割り当て結果を参照し、上
記の中間ファイルを基にして外部変数の参照領域をメモ
リ領域に確保しないコードを生成する。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、コンパイル装置、
方法及びコンパイラプログラムを記録したコンピュータ
読み取り可能な記録媒体に関する。
【0002】
【従来の技術】従来のコンパイラは、例えば、図18に
示すように、字句解析手段101と、構文解析手段10
2と、最適化手段103と、コード出力手段10401
を有するコード生成手段1041とで構成されている。
このようなコンパイラでは、字句解析、構文解析、最適
化の各フェーズを経て、コード生成手段1041におい
てオブジェクトプログラム(アセンブラまたは機械語)
のコードが生成される。
【0003】このようなコンパイラにおいて、コンパイ
ル対象となるソースプログラムで変数を定義すると、生
成されたオブジェクトプログラムは、定義した変数の領
域をメモリ中に確保するためのコードを含むものとな
る。そして、このオブジェクトプログラムを実行するコ
ンピュータのCPU(Central Processing Unit)は、
当該変数に対する参照があったとき、前記のコードによ
り確保されたメモリ中の領域にアクセスすることとな
る。
【0004】ところが、メモリへのアクセスは外部バス
を経由して行わなければならないので、時間がかかって
しまう。そこで、参照頻度の高い変数にはCPU内部の
レジスタを割り当て、変数の参照時にレジスタに対する
アクセスを行うようにすることが、プログラムの実行時
間の観点から有効である。このような最適化処理は、一
般に、レジスタ割り当て最適化と呼ばれている。
【0005】従来のコンパイラにおけるレジスタ割り当
て最適化は、一般に、ソースプログラムでの参照回数が
多い変数にレジスタを割り当てるものであった。ところ
が、ソースプログラムで変数の参照命令が出現する回数
と、コンパイルしたオブジェクトプログラムを実行する
ときに変数を参照する回数とは異なっている。例えば、
変数の参照命令の前に条件分岐命令がある場合には、プ
ログラム実行時の条件によって当該変数が参照されたり
参照されなかったりする。
【0006】また、ループ処理には、ループの回数が静
的に判断可能なものもあるが、実行時にしか分からない
ものもある。実行時にしか回数の分からないループ処理
がある場合には、適当な重み付けをしてループの回数と
見なし、変数を参照する回数を判断するのが一般的であ
るが、これは当然誤差を含んだものとなる。ループの回
数は、プログラムによっては実行時にかなり変動するも
のもあり、これが変数の参照回数を判断するために大き
な誤差となって、最適なレジスタ割り当てが行われない
場合がかなりあった。
【0007】そこで、特開昭61−82243号公報に
記載の「オブジェクトプログラム生成方法」では、コン
パイラに2つの出力手段を持たせることで、最適なレジ
スタ割り当てを行っている。すなわち、1つ目の手段で
は、実行時に変数毎の参照回数を記録する参照頻度記憶
領域を生成するコードを含むオブジェクトプログラムを
生成し、2つ目の手段では、1つ目の手段で出力された
オブジェクトプログラムを実行することにより得られた
参照頻度記憶領域内の情報を参照して、参照頻度の高い
変数にレジスタを割り当てるオブジェクトプログラムを
生成するものとしている。
【0008】
【発明が解決しようとする課題】しかしながら、上記特
開昭61−82243号公報では、参照頻度に従ってレ
ジスタの割り当てを行うのみで、レジスタの割り当て対
象となる変数の属性に関する記述がなされていない。ま
た、どのような変数にどのようなレジスタを割り当てる
かに関する記述もされていない。このため、例えば、外
部変数の参照回数が多くなり、これに多くのレジスタが
割り当てられてしまうと、関数の整合性を図るために必
要なレジスタを確保することができなくなってしまう。
【0009】ところが、上記公報では、このような場合
の対処方法が何ら開示されていなかった。そこで、この
ような事態が発生した場合には、結局のところレジスタ
の退避/復帰を行わなければならなくなってしまうの
で、コード効率が悪くなり、プログラムの実行速度が遅
くなってしまうという問題があった。また、メモリ中に
レジスタの退避領域も用意しておく必要があり、メモリ
の利用効率が悪くなってしまうという問題もあった。
【0010】なお、レジスタ割り当て最適化に関する他
の技術が、例えば、特開平4−326432号公報や特
開平6−214802号公報において開示されている。
しかしながら、これらの公報に記載された技術でも、上
記特開昭61−82243号公報に記載の技術で指摘し
た問題点を何ら解決することができない。
【0011】本発明は、メモリの利用効率がよく、しか
も実行速度の速いオブジェクトプログラムを生成するこ
とができるコンパイル装置、方法、及びこのようなコン
パイラプログラムを記録したコンピュータ読み取り可能
な記録媒体を提供することを目的とする。
【0012】
【課題を解決するための手段】上記目的を達成するた
め、本発明の第1の観点にかかるコンパイル装置は、互
いに参照される外部変数を含む複数のソースプログラム
を構文解析した複数の中間ファイルに基づいて、オブジ
ェクトプログラムを生成するコンパイル装置であって、
前記複数の中間ファイルに基づいて、前記外部変数を参
照するための領域をメモリに確保する複数の第1のオブ
ジェクトプログラムを生成する第1のオブジェクトプロ
グラム生成手段と、前記オブジェクトプログラム生成手
段が生成した複数の第1のオブジェクトプログラムを結
合した実行形式のプログラムを実行した結果、参照回数
が多い外部変数から順に、他で使用されていないレジス
タを割り当てるレジスタ割り当て手段と、前記レジスタ
割り当て手段によるレジスタの割り当てを参照し、前記
複数の中間ファイルに基づいて、レジスタが割り当てら
れた外部変数の参照を当該割り当てられたレジスタを用
いて行う複数の第2のオブジェクトプログラムを生成す
る第2のオブジェクトプログラム生成手段とを備えるこ
とを特徴とする。
【0013】上記コンパイル装置では、参照頻度の高い
外部変数は割り当てたレジスタを用いて参照することが
できるため、生成された第2のオブジェクトプログラム
を結合したプログラムを実行した場合の実行速度を早く
することができる。また、レジスタを使用して参照され
る外部変数には、メモリを割り当てなくても済む場合が
生じるため、メモリの利用効率を高いものとすることが
できる。
【0014】上記コンパイル装置において、前記レジス
タ割り当て手段が外部変数に割り当てる他で使用されて
いないレジスタは、前記実行形式のプログラムを実行し
た結果により得られたものであってもよい。
【0015】この場合において、前記第1のオブジェク
トプログラム生成手段は、前記複数の第1、第2のオブ
ジェクトプログラムを結合した実行形式のプログラムが
実行される装置に含まれるレジスタと、各レジスタに対
応付けてその使用状況に関する情報を管理するレジスタ
使用管理手段を前記複数の第1のオブジェクトプログラ
ムを結合した実行形式のプログラムを実行するときに生
成するためのコードを生成する手段と、前記複数の第1
のオブジェクトプログラムを結合した実行形式のプログ
ラムを実行してレジスタが使用されたときに当該使用さ
れたレジスタに対応する前記レジスタ使用管理手段内の
使用状況を使用状態とするコードを生成する手段とを含
むものとすることができ、前記レジスタ割り当て手段
は、前記複数の第1のオブジェクトプログラムを結合し
た実行形式のプログラムを実行後に得られた前記レジス
タ使用管理手段を参照して、外部変数へレジスタを割り
当てるものとすることができる。
【0016】上記コンパイル装置において、前記レジス
タ割り当て手段が外部変数に割り当てる他で使用されて
いないレジスタは、また、前記複数の第1のオブジェク
トプログラム中で使用されているレジスタ以外のレジス
タであってもよい。
【0017】この場合において、前記第1のオブジェク
トプログラム生成手段は、前記複数の第1、第2のオブ
ジェクトプログラムを結合した実行形式のプログラムが
実行される装置に含まれる各レジスタに対応付けてその
使用状況に関する情報を管理するレジスタ使用管理手段
を生成する手段と、前記レジスタのいずれかを使用する
コードを生成したときに当該使用されたレジスタに対応
する前記レジスタ使用管理手段内の使用状況を使用状態
とする手段とを備えるものとすることができる。
【0018】上記コンパイル装置において、前記第1の
オブジェクトプログラム生成手段は、各外部変数と対応
付けて参照回数を記憶する参照頻度記憶手段を前記複数
の第1のオブジェクトプログラムを結合した実行形式の
プログラムを実行するときに生成するためのコードを生
成する手段と、前記複数の第1のオブジェクトプログラ
ムを結合した実行形式のプログラムを実行して外部変数
が参照さたときに当該参照された外部変数に対応する前
記参照頻度記憶手段内の参照回数を加算するコードを生
成する手段とを含むものとしてもよい。
【0019】また、前記参照頻度記憶手段は、さらに前
記外部変数のそれぞれに対応付けてその初期値を記憶す
るものとしてもよく、この場合には、前記第1のオブジ
ェクトプログラム生成手段は、前記外部変数の初期値を
前記参照頻度記憶手段内に設定するコードを生成する手
段を含むものとすることができる。
【0020】さらに、前記参照頻度記憶手段は、前記外
部変数のそれぞれに対応して割り当てたレジスタに関す
る情報を記憶するものとしてもよく、この場合には、前
記レジスタ割り当て手段は、前記複数の第1のオブジェ
クトプログラムを結合した実行形式のプログラムを実行
した後の前記参照頻度記憶手段内の各外部変数の参照回
数に従ってレジスタの割り当てを行って、対応する外部
変数のレジスタに関する情報の欄に記憶させ、前記第2
のオブジェクトプログラム生成手段は、前記参照頻度記
憶手段を参照して、前記複数の第2のオブジェクトプロ
グラムを生成するものとすることができる。
【0021】また、上記コンパイル装置において、前記
第2のオブジェクトプログラム生成手段は、前記レジス
タ割り当て手段が外部変数に割り当てたレジスタを、割
り込み処理での退避及び復帰の対象となるレジスタから
除外するためのコードを生成する手段を含むものとして
もよい。
【0022】なお、上記コンパイル装置において、前記
複数の中間ファイルは、前記第1のオブジェクトプログ
ラム生成手段が前記複数の第1のオブジェクトプログラ
ムを生成する前と、前記第2のオブジェクトプログラム
生成手段が前記複数の第2のオブジェクトプログラムを
生成する前とにおいて、それぞれ別々に生成されたもの
であってもよい。
【0023】上記目的を達成するため、本発明の第2の
観点にかかるコンパイル方法は、互いに参照される外部
変数を含む複数のソースプログラムを構文解析した複数
の中間ファイルに基づいて、オブジェクトプログラムを
生成するコンパイル方法であって、前記複数の中間ファ
イルに基づいて、前記外部変数を参照するための領域を
メモリに確保する複数の第1のオブジェクトプログラム
を生成する第1のオブジェクトプログラム生成ステップ
と、前記オブジェクトプログラム生成ステップで生成し
た複数の第1のオブジェクトプログラムを結合した実行
形式のプログラムを実行した結果、参照回数が多い外部
変数から順に、他で使用されていないレジスタを割り当
てるレジスタ割り当てステップと、前記レジスタ割り当
てステップにおけるレジスタの割り当てを参照し、前記
複数の中間ファイルに基づいて、レジスタが割り当てら
れた外部変数の参照を当該割り当てられたレジスタを用
いて行う複数の第2のオブジェクトプログラムを生成す
る第2のオブジェクトプログラム生成ステップとを含む
ことを特徴とする。
【0024】上記コンパイル方法において、前記レジス
タ割り当てステップで外部変数に割り当てる他で使用さ
れていないレジスタは、前記実行形式のプログラムを実
行した結果により得られたものであってもよい。
【0025】上記コンパイル方法において、前記レジス
タ割り当てステップで外部変数に割り当てる他で使用さ
れていないレジスタは、また、前記複数の第1のオブジ
ェクトプログラム中で使用されているレジスタ以外のレ
ジスタであってもよい。
【0026】上記目的を達成するため、本発明の第3の
観点にかかるコンピュータ読み取り可能な記録媒体は、
互いに参照される外部変数を含む複数のソースプログラ
ムを構文解析した複数の中間ファイルに基づいて、オブ
ジェクトプログラムを生成するためのコンパイラプログ
ラムを記録したコンピュータ読み取り可能な記録媒体で
あって、前記複数の中間ファイルに基づいて、前記外部
変数を参照するための領域をメモリに確保する複数の第
1のオブジェクトプログラムを生成する第1のオブジェ
クトプログラム生成ステップと、前記オブジェクトプロ
グラム生成ステップで生成した複数の第1のオブジェク
トプログラムを結合した実行形式のプログラムを実行し
た結果、参照回数が多い外部変数から順に、他で使用さ
れていないレジスタを割り当てるレジスタ割り当てステ
ップと、前記レジスタ割り当てステップにおけるレジス
タの割り当てを参照し、前記複数の中間ファイルに基づ
いて、レジスタが割り当てられた外部変数の参照を当該
割り当てられたレジスタを用いて行う複数の第2のオブ
ジェクトプログラムを生成する第2のオブジェクトプロ
グラム生成ステップとを実行させるためのプログラムを
記録することを特徴とする。
【0027】上記記録媒体に記録されているプログラム
において、前記レジスタ割り当てステップで外部変数に
割り当てる他で使用されていないレジスタは、前記実行
形式のプログラムを実行した結果により得られたもので
あってもよい。
【0028】上記記録媒体に記録されているプログラム
において、前記レジスタ割り当てステップで外部変数に
割り当てる他で使用されていないレジスタは、また、前
記複数の第1のオブジェクトプログラム中で使用されて
いるレジスタ以外のレジスタであってもよい。
【0029】
【発明の実施の形態】以下、添付図面を参照して、本発
明の実施の形態について説明する。
【0030】[第1の実施の形態]図1は、この実施の
形態にかかるコンパイラを示す機能ブロック図である。
この図では、メモリ上に記憶されたコンパイラプログラ
ムを実行するプロセッサが実現する機能として示してい
る。すなわち、コンパイラプログラムが実行されるコン
ピュータシステムが、コンパイル装置として動作する。
【0031】図1に示すように、この実施の形態にかか
るコンパイラ10は、字句解析手段101と、構文解析
手段102と、最適化手段103と、コード生成手段1
041とを備えている。コード生成手段1041は、コ
ード生成制御手段10411と、外部変数およびレジス
タ情報出力コード生成手段10412と、未使用レジス
タ外部変数割り当て手段10413と、未使用レジスタ
外部変数割り当てコード生成手段10414と、コード
出力手段10401とを備えている。
【0032】字句解析手段101は、コンパイルの対象
となる、高級言語で記述されたソースプログラムを字句
(トークン)に分解する。構文解析手段102は、分解
された字句を当該プログラム言語の仕様に従って構文解
析し、解析結果として、例えば構文木などを生成する。
最適化手段103は、冗長な命令等を見直すことで、コ
ンパイル後のオブジェクトプログラムの実行効率を向上
させる。これらの手段101〜103の処理結果は、中
間ファイルとしてコード生成手段1041に渡される。
【0033】コード生成制御手段10411は、2回の
処理で行われる翻訳処理(上記の中間ファイルからアセ
ンブラコードを生成するための処理をいう。以下、同
じ)を制御する。すなわち、コード生成手段10411
は、1回目の翻訳処理では、外部変数及びレジスタ情報
出力コード生成手段10412を呼び出し、2回目の翻
訳処理では、未使用レジスタ外部変数割り当て手段10
413及び未使用レジスタ外部変数割り当てコード生成
手段10414を順次呼び出す。
【0034】外部変数およびレジスタ情報出力コード生
成手段10412は、最適化手段103の出力結果であ
る中間ファイルから従来と同様の外部変数のための領域
をメモリ内に確保するためのコードを生成すると共に、
外部変数の参照回数と変数に割り当てるレジスタに関す
る情報を出力するためのコードを生成する。
【0035】未使用レジスタ外部変数割り当て手段10
413は、外部変数およびレジスタ情報出力コード生成
手段10412が生成したコードが実行形式となって実
行されたときの情報を基にして、未使用のレジスタを外
部変数のために割り当てる処理を行う。
【0036】未使用レジスタ外部変数割り当てコード生
成手段10414は、未使用レジスタ外部変数割り当て
手段10413による外部変数へのレジスタ割り当てを
参照して、最適化手段103の出力結果である中間ファ
イルから、レジスタ割り当ての行われた外部変数のため
の領域をメモリ領域に確保しないコードを生成する。
【0037】コード出力手段10401は、外部変数お
よびレジスタ情報出力コード生成手段10412により
生成されたアセンブラプログラムのコード、または未使
用レジスタ外部変数割り当てコード生成手段10414
により生成されたアセンブラプログラムのコードを出力
する。
【0038】以下、この実施の形態にかかるコンパイラ
10を含むシステムにおいて、高級言語で記述されたソ
ースプログラムから実行可能な形式のロードモジュール
が生成されるまでの動作の概略について、説明する。図
2は、このような動作を行うための、コンパイラ10を
含むシステム全体を示す図である。
【0039】まず、高級言語で記述された複数のソース
プログラム(A、B、C)201をコンパイラ10に入
力する。コンパイラ10は、入力されたソースプログラ
ム201のそれぞれに対して1回目の翻訳処理を行う。
この1回目の翻訳処理では、まず、字句解析手段10
1、構文解析手段102及び最適化手段103が、従来
と同様の処理を行い、その結果を中間ファイル(A、
B、C)202として出力する。
【0040】次に、コンパイラ10では、コード生成手
段1041が、中間ファイル202を入力として通常の
コード生成を行うと共に、外部変数およびレジスタ情報
出力コード生成手段10412により外部変数の参照回
数と変数に割り当てるレジスタに関する情報を出力する
ためのコードを生成することにより、第1のアセンブラ
プログラム(A、B、C)203を生成する。
【0041】次に、アセンブラ20が第1のアセンブラ
プログラム203をそれぞれアセンブルし、これをさら
にリンカ30がリンクして、実行形式のプログラム20
5を生成する。そして、プログラム実行部40が実行形
式のプログラム205を実行することにより、レジスタ
使用管理領域301と、参照頻度記憶領域302とを生
成する。
【0042】次に、コンパイラ10では、コード生成手
段1041が、1回目の翻訳処理で生成された中間ファ
イル202、並びにレジスタ使用管理領域301及び参
照頻度記憶領域302を入力として2回目の翻訳処理を
行う。2回目の翻訳処理では、未使用レジスタ外部変数
割り当て手段10413がすべてのプログラムで同一の
レジスタを参照回数の多い変数に割り当てると共に、使
用レジスタ外部変数割り当てコード生成手段10414
がレジスタが割り当てられた外部変数のための領域をメ
モリ領域に確保しないコードを生成することにより、第
2のアセンブラプログラム(A、B、C)204を生成
する。
【0043】そして、アセンブラ20が第2のアセンブ
ラプログラム204をそれぞれアセンブルし、これをさ
らにリンカ30がリンクして、最終の出力として、実行
形式のプログラム206を生成する。
【0044】以下、コード生成制御手段10411、外
部変数およびレジスタ情報出力コード生成手段1041
2、未使用レジスタ外部変数割り当て手段10413及
び未使用レジスタ外部変数割り当てコード生成手段10
414の動作の詳細について、それぞれ図3〜図6に示
すフローチャートを参照して説明する。
【0045】図3は、コード生成制御手段10411の
処理を示すフローチャートである。コード生成制御手段
10411は、まず、最初の翻訳処理であるかどうかを
判定する(ステップS101)。最初の翻訳処理である
場合には、コード生成制御手段10411は、外部変数
およびレジスタ情報出力コード生成手段10412を呼
び出し、後述する処理を実行させる(ステップS10
2)。外部変数およびレジスタ情報出力コード生成手段
10412から制御が戻ると、コード生成制御手段10
411は、このフローチャートの処理を終了する。
【0046】一方、最初の翻訳処理でない場合、すなわ
ち2回目の翻訳処理である場合には、コード生成制御手
段10411は、未使用レジスタ外部変数割り当て手段
10413を呼び出し、後述する処理を実行させる(ス
テップS103)。外部変数およびレジスタ情報出力コ
ード生成手段10412から制御が戻ると、コード生成
制御手段10411は、今度は未使用レジスタ外部変数
割り当てコード生成手段10414を呼び出し、後述す
る処理を実行させる(ステップS104)。未使用レジ
スタ外部変数割り当てコード生成手段10414から制
御が戻ると、コード生成手段10411は、このフロー
チャートの処理を終了する。
【0047】図4は、外部変数およびレジスタ情報出力
コード生成手段10412の処理を示すフローチャート
である。外部変数およびレジスタ情報出力コード生成手
段10412は、まず、上述した参照頻度記憶領域30
2及びレジスタ使用管理要域301を確保するためのコ
ードがまだ生成されていないかどうかを判定する(ステ
ップS201)。判定結果により、このようなコードが
生成されていればステップS203に、そうでなければ
ステップS202の処理に進む。
【0048】ステップS202では、外部変数およびレ
ジスタ情報出力コード生成手段10412は、プログラ
ム実行部40による実行時において参照頻度記憶領域3
01とレジスタ使用管理領域302とをメモリ内に確保
し、レジスタ使用管理領域302のレジスタ名の欄に特
殊レジスタを除くすべてのレジスタの名称を登録し、且
つレジスタ使用管理領域302の使用フラグの欄を
“0”に初期化するための処理を行うためのコードを生
成する。このコードの生成が終了すると、ステップS2
03の処理に進む。
【0049】ステップS203では、外部変数およびレ
ジスタ情報出力コード生成手段10412は、最適化手
段103の処理結果である中間ファイル202がすべて
終了したかどうかを判定する。なお、この判定における
中間ファイル202は、コンパイルの対象となるものす
べてのことを意味し、図2の例でいえば、中間ファイル
A、B、Cの3つすべてをいう。
【0050】中間ファイル202がまだ終了していない
と判定すれば、外部変数およびレジスタ情報出力コード
生成手段10412は、最適化手段103の処理結果で
ある中間ファイル202から1行分を読み出す(ステッ
プS204)。さらに、外部変数およびレジスタ情報出
力コード生成手段10412は、当該読み出した行が外
部変数定義文であるかどうかを判定する(ステップS2
05)。
【0051】外部変数定義文であると判定した場合は、
外部変数およびレジスタ情報出力コード生成手段104
12は、プログラム実行部40による実行時において参
照頻度記憶領域302の変数の欄に当該外部変数の名称
を登録し、対応する参照回数の欄を“0”に初期化し、
対応する初期値の欄に当該外部変数の初期値を設定する
ためのコードを生成する(ステップS206)。そし
て、ステップS203に戻る。
【0052】一方、ステップS205で外部変数定義文
でないと判定した場合は、外部変数およびレジスタ情報
出力コード生成手段10412は、さらに当該読み出し
た行が外部変数参照文であるかどうかを判定する(ステ
ップS207)。ここで、外部変数参照文でもないと判
定した場合には、ステップS209の処理に進む。
【0053】一方、ステップS207で外部変数参照文
であると判定した場合には、外部変数およびレジスタ情
報出力コード生成手段10412は、参照頻度記憶領域
302の当該外部変数に対応する参照回数の欄を“1”
だけ加算するためのコードを生成する(ステップS20
8)。そして、ステップS209の処理に進む。
【0054】ステップS209では、外部変数およびレ
ジスタ情報出力コード生成手段10412は、さらに読
み出した当該行がレジスタを使用するコード(変数の参
照以外の場合も含む)を生成するものであるかどうかを
判定する。レジスタを使用するコードを生成するもので
ないと判定したときはステップS203の処理に戻り、
レジスタを使用するコードを生成するものであると判定
したときはステップS210の処理に進む。
【0055】ステップS210では、外部変数およびレ
ジスタ情報出力コード生成手段10412は、レジスタ
使用管理領域302の当該使用するレジスタに対応する
使用フラグの欄を“1”とするためのコードを生成す
る。そして、ステップS203の処理に戻る。
【0056】上記したようなステップS204からS2
10の処理を繰り返し、ステップS203において最終
的に中間ファイル202が終了したと判定すれば、この
フローチャートの処理を終了する。
【0057】図5は、未使用レジスタ外部変数割り当て
手段10413の処理を示すフローチャートである。処
理が開始すると、未使用レジスタ外部変数割り当て手段
10413は、1回目の翻訳処理に従って得られた実行
形式のプログラム205の実行結果から、レジスタ使用
管理領域301に管理されるレジスタに未使用レジスタ
があり、且つ外部変数に割り当てられてないかどうかを
判定する(ステップS301)。
【0058】未使用レジスタがあり、且つ外部変数に割
り当てられていないと判定した場合には、未使用レジス
タ外部変数割り当て手段10413は、参照頻度記憶領
域302において参照回数の多い変数から順にレジスタ
を割り当て、割り当てレジスタの欄に登録する。このと
き、割り当てを行ったレジスタに関するレジスタ使用管
理領域301の使用フラグをセットする(ステップS3
02)。そして、このフローチャートの処理を終了す
る。
【0059】一方、未使用レジスタがなく、および/ま
たは外部変数に割り当てられていないと判定した場合に
は、そのままこのフローチャートの処理を終了する。
【0060】図6は、未使用レジスタ外部変数割り当て
コード生成手段10414の処理を示すフローチャート
である。未使用レジスタ外部変数割り当てコード生成手
段10414は、最適化手段103の処理結果である中
間ファイル202がすべて終了したかどうかを判定する
(ステップS401)。
【0061】一方、中間ファイル202がまだ終了して
いないと判定すれば、未使用レジスタ外部変数割り当て
コード生成手段10414は、最適化手段103の処理
結果である中間ファイル202から1行分を読み出す
(ステップS402)。次に、未使用レジスタ外部変数
割り当てコード生成手段10414は、読み出した当該
行がmain関数の先頭のコードを生成するものである
かどうかを判定する(ステップS403)。
【0062】main関数の先頭のコードを生成するも
のであると判定した場合には、未使用レジスタ外部変数
割り当てコード生成手段10414は、参照頻度記憶領
域302を参照して、外部変数を割り当てたレジスタに
対して初期値をロードするためのコードを生成する(ス
テップS404)。そして、ステップS401の処理に
戻る。
【0063】一方、ステップS403でmain関数の
先頭のコードを生成するものでないと判定した場合に
は、未使用レジスタ外部変数割り当てコード生成手段1
0414は、ステップS402で読み出した当該行が割
り込み関数の先頭のコードを生成するものであるかどう
かどうかをさらに判定する(ステップS405)。
【0064】割り込み関数の先頭のコードを生成するも
のであると判定した場合には、未使用レジスタ外部変数
割り当てコード生成手段10414は、外部変数に割り
当てたレジスタを割り込み処理の際の退避レジスタ群か
ら除くためのコードを生成する(ステップS406)。
そして、ステップS401の処理に戻る。
【0065】一方、ステップS405で割り込み関数の
先頭のコードを生成するものでないと判定した場合に
は、未使用レジスタ外部変数割り当てコード生成手段1
0414は、ステップS402で読み出した当該行が割
り込み関数の終わりのコードを生成するものであるかど
うかをさらに判定する(ステップS407)。
【0066】割り込み関数の終わりのコードを生成する
ものであると判定した場合には、未使用レジスタ外部変
数割り当てコード生成手段10414は、外部変数に割
り当てたレジスタを割り込み処理から復帰する際の退避
レジスタ群から除くためのコードを生成する(ステップ
S408)。そして、ステップS401の処理に戻る。
【0067】一方、ステップS407で割り込み関数の
終わりのコードを生成するものでないと判定した場合に
は、未使用レジスタ外部変数割り当てコード生成手段1
0414は、ステップS402で読み出した当該行がレ
ジスタを割り当てた外部変数に対して参照を行うもので
あるかどうかを判定する(ステップS409)。レジス
タを割り当てた外部変数に対して参照を行うものでない
と判定したときは、そのままステップS401の処理に
戻る。
【0068】一方、レジスタを割り当てた外部変数に対
して参照を行うものであると判定したときは、未使用レ
ジスタ外部変数割り当てコード生成手段10414は、
参照頻度記憶領域302を参照して、当該レジスタを使
用して外部変数を参照するためのコードを生成する(ス
テップS410)。そして、ステップS401の処理に
戻る。
【0069】そして、ステップS402〜S410の処
理を繰り返し、ステップS401で最終的に中間ファイ
ル202が終了したと判定した場合には、このフローチ
ャートの処理を終了する。
【0070】以下、この実施の形態にかかるコンパイラ
10によって、高級言語で記述されたソースプログラム
201から第2アセンブラプログラム202が生成され
るまでの動作を、具体例に従って説明する。ここでは、
ソースプログラム201として、図7、図8に示すC言
語で記述されたプログラムを例とする。ここで、図9、
図10は、1回目の翻訳処理で得られる第1アセンブラ
プログラム201(従来技術と同じ)、図13、図14
は、2回目の翻訳処理で得られる第2アセンブラプログ
ラム202を示している。また、図11、図12は、そ
れぞれ1回目の翻訳処理で得られた第1アセンブラプロ
グラム203をアセンブル、リンクして実行したときの
レジスタ使用管理領域301と参照頻度記憶領域302
の状態遷移を示している。
【0071】図7で示されるソースプログラムa.cを
コンパイラ10に入力すると、字句解析手段101、構
文解析手段102、最適化手段103で従来技術と同等
の処理を行ない、その結果を中間ファイル201として
出力する。次に、コード生成制御手段10411に制御
が移り、図3のS101の判定処理の結果によりステッ
プS102の処理が行われ、外部変数およびレジスタ情
報出力コード生成手段10412に制御が移る。
【0072】外部変数およびレジスタ情報出力コード生
成手段10412の処理では、mざう、図4のステップ
S201の判定処理の結果により、ステップS202の
処理が行われ、レジスタ使用管理領域301、参照頻度
記憶領域302を確保し、初期化するコードが生成され
る。
【0073】図7のソースプログラムの1行目では、ス
テップS203、S204、S205、S206の処理
により、参照頻度記憶領域302に変数の初期値を登録
するためのコードが生成される。図7のソースプログラ
ムの3、5、6、7、8、10、11行目では、それぞ
れステップS203、S204、S205、S207、
S209の処理が行われる。
【0074】図7のソースプログラムの12、13、1
4行目では、それぞれステップS203、S204、S
205、S207、S208、S209、S210の処
理が行われ、参照頻度記憶領域302の参照回数を加算
するためのコード、及びレジスタ使用管理領域301の
使用フラグを“1”とするためのコードが生成される。
図7のソースプログラムの15、16行目では、それぞ
れステップS203、S204、S205、S207、
S209の処理が行われる。そして、最後にステップS
203の処理で中間ファイル202の終了を認識して終
了し、コード出力手段10401から図9に示す第1ア
センブラプログラム203を出力する。
【0075】次に、図8で示されるソースプログラム
b.cをコンパイラ10に入力すると、字句解析手段1
01、構文解析手段102、最適化手段103で従来技
術と同等の処理を行ない、その結果を中間ファイル20
2として出力する。次に、コード生成制御手段1041
1に制御が移り、図3のS101の判定処理の結果によ
りステップS102の処理が行われ、外部変数およびレ
ジスタ情報出力コード生成手段10412に制御が移
る。
【0076】外部変数およびレジスタ情報出力コード生
成手段10412では、図4のステップS201の判定
処理においてすでにレジスタ使用管理領域301および
参照頻度記憶領域302を確保するコードを生成してい
ると判定されるため、そのままステップS203以降の
処理に進む。
【0077】図8のソースプログラムの1、3、6、7
行目では、それぞれステップS203、S204、S2
05、S207、S209の処理が行われる。図8のソ
ースプログラムの8、9行目では、それぞれステップS
203、S204、S205、S207、S208、S
209、S210の処理が行われ、参照頻度記憶領域3
02の参照回数を加算するためのコード、及びレジスタ
使用管理領域301の使用フラグを“1”とするための
コードが生成される。
【0078】図8のソースプログラムの10、12、1
3、14、15行目では、それぞれステップS203、
S204、S205、S207、S209の処理が行わ
れる。そして、最後にステップS203の処理で中間フ
ァイル202の終了を認識して終了し、コード出力手段
10401から図10に示す第1アセンブラプログラム
203を出力する。
【0079】以上述べた処理で得られた図9に示す第1
アセンブラプログラムa.sと図10に示す第1アセン
ブラプログラムb.sとを、アセンブル、リンクして得
られた実行形式のプログラム205を実行することによ
り、図3におけるレジスタ使用管理領域301、及び参
照頻度記憶領域302が生成される。次に、実行形式の
プログラム205の実行時における各生成領域の状態遷
移について述べる。なお、実行時に割り込みは起こら
ず、割り込み関数wariは実行しないこととする。
【0080】プログラムはmain関数から始まり、図
9のオブジェクトプログラムの22行目において、外部
変数およびレジスタ情報出力コード生成手段10412
によって生成されたコードから、レジスタ使用管理領域
301及び参照頻度記憶領域302が確保、初期化され
る。ここで、レジスタ使用管理領域301の状態遷移は
図11(a)に、参照頻度記憶領域302の状態遷移は
図12(a)となる。
【0081】次に、図9のオブジェクトプログラムの2
4行目の関数コールで関数func1に処理が移る。f
unc1では、図9における36行目から39行目の処
理であり、レジスタ$2と$8とを使用し、変数aを2
回、変数bを1回参照している。このため、外部変数お
よびレジスタ情報出力コード生成手段10412により
生成されたコードにより、レジスタ使用管理領域301
の状態遷移は図11(b)に、参照頻度記憶領域302
の状態遷移は図12(b)となる。
【0082】次に、図9のオブジェクトプログラムの4
1行目から44行目の処理では、レジスタ$9と$10
を使用し、変数cを1回、変数dを1回、変数eを1回
参照している。このため、外部変数およびレジスタ情報
出力コード生成手段10412により生成されたコード
により、レジスタ使用管理領域301の状態遷移は図1
1(c)、参照頻度記憶領域302の状態遷移は図12
(c)となる。
【0083】次に、図9のオブジェクトプログラムの4
6行目から49行目の処理では、レジスタ$11と$1
2を使用し、変数fを1回、変数gを1回、変数hを1
回参照している。このため、外部変数およびレジスタ情
報出力コード生成手段10412により生成されたコー
ドにより、レジスタ使用管理領域301の状態遷移は図
11(d)、参照頻度記憶領域302の状態遷移は図1
2(d)となる。
【0084】次に、図9のオブジェクトプログラムの5
1行目の関数コールで関数func2に処理が移る。f
unc2の処理において、図10のオブジェクトプログ
ラムの11行目から14行目の処理でレジスタ$2と$
8を使用し、変数aを2回、変数fを1回参照してい
る。このため、外部変数およびレジスタ情報出力コード
生成手段10412により生成されたコードにより、レ
ジスタ使用管理領域301の状態遷移は図11(d)か
ら変わらず、参照頻度記憶領域302の状態遷移は図1
2(e)となる。
【0085】次に、図10のオブジェクトプログラムの
16行目から21行目の処理でレジスタ$9と$10と
$11を使用し、変数eを2回、変数bを1回、変数g
を1回参照している。このため、外部変数およびレジス
タ情報出力コード生成手段10412により生成された
コードによりレジスタ使用管理領域301の状態遷移は
図11(d)から変わらず、参照頻度記憶領域302の
状態遷移は図12(f)となる。
【0086】次に、図10のオブジェクトプログラムの
23行目の処理で、関数func2の呼出し側に戻る。
そして、図9のオブジェクトプログラムの55行目の処
理で関数func1から呼出し側に戻る。さらに、図9
のオブジェクトプログラムの28行目の処理で関数ma
inの呼出し側であるスタートアップルーチンに戻り、
処理を終了する。
【0087】2回目の翻訳処理では、1回目の翻訳処理
で得られた図9、図10のオブジェクトプログラムをア
センブル、リンクすることにより得られた実行形式のプ
ログラムを実行することで得られたレジスタ使用管理領
域301および参照頻度記憶領域302をコンパイラに
入力する。その後、まず、1回目の翻訳処理で得られた
図7に示すソースプログラムa.cに対する中間ファイ
ル202に対し処理を行なう。
【0088】コード生成制御手段10411は、図3の
ステップS101の判定処理の結果によりステップS1
03を行ない、未使用レジスタ外部変数割り当て手段1
0413に制御を移す。未使用レジスタ外部変数割り当
て手段10413は、図5のステップS301の判定処
理にの結果により、ステップS302の処理を実行す
る。
【0089】この時点でのレジスタ使用管理領域301
は図11(d)の状態であるため、未使用レジスタ外部
変数割り当て手段10413は、レジスタ$13と$1
4と$15を未使用レジスタと認識する。また、この時
点での参照頻度記憶領域302は図12(g)の状態で
あるため、未使用レジスタ外部変数割り当て手段104
13は、参照回数の多い変数をa、e、bに対してレジ
スタ$13と$14と$15をそれぞれ割り当て、参照
頻度記憶領域302を図12(h)の状態とする。変数
bは、変数f、gと参照回数が同じであるが、この場合
には、どの変数にレジスタを割り当てても同じ効果が得
られるので、本例では一例として変数bに割り当てるも
のとする。
【0090】次に、コード生成制御手段10411に処
理が戻り、図3のステップS104の処理を行って、未
使用レジスタ外部変数割り当てコード生成手段1041
4に制御を移す。
【0091】未使用レジスタ外部変数割り当てコード生
成手段10414では、図7のステップS401の判定
処理の結果により、ステップS402が実行される。次
に、図9のオブジェクトプログラムの20行目でステッ
プS403、S404の処理が行われ、図13のオブジ
ェクトプログラムの18、19、20行目のコードが生
成される。以後、判定処理に適合しない行に関して、未
使用レジスタ外部変数割り当てコード生成手段1041
4は、ステップS403、S405、S407、S40
9、S401、S402の処理が繰り返される。
【0092】次に、図9のオブジェクトプログラムの3
6行目から49行目でステップS409、S410の処
理が行われ、図13のオブジェクトプログラムの33行
目から42行目のコードが生成される。未使用レジスタ
外部変数割り当てコード生成手段10414は、最後に
ステップS401の処理で中間ファイルの終了を認識し
て終了し、コード出力手段10401から図13に示す
アセンブラコードを出力する。
【0093】次に、1回目の翻訳処理で得られた図8に
示すソースプログラムb.cに対する中間ファイル20
2に対し処理を行なう。まず、コード生成制御手段10
411は、図3のステップS101の判定処理の結果に
よりステップS103を行ない、未使用レジスタ外部変
数割り当て手段10413に制御を移す。ここでは、既
に未使用レジスタを外部変数に割り当て済みのため、本
手段を終了し、コード生成制御手段10411に処理が
戻り、図3のステップS104の処理を行った結果、未
使用レジスタ外部変数割り当てコード生成手段1041
4に制御が移る。
【0094】未使用レジスタ外部変数割り当てコード生
成手段10414では、図6のステップS401の判定
処理の結果によりステップS402の処理が実行され
る。次に、図9のアセンブラプログラムの20行目でス
テップS403、S404の処理が行われ、図13のア
センブラプログラムの18、19、20行目のコードが
生成される。以後、判定処理に適合しない行に関して
は、ステップS403、S405、S407、S40
9、S401、S402の処理が繰り返される。
【0095】次に、図10のアセンブラプログラムの1
1行目から21行目でステップS409、S410の処
理が行われ、図14の8行目から13行目のコードが生
成される。次に、図10のアセンブラプログラムの29
行目から38行目でステップS405、S406の処理
が行われ、レジスタ$13と$14と$15を退避レジ
スタ群から除いて、図14のアセンブラプログラムの2
1行目から27行目のコードが生成される。
【0096】次に、図10のアセンブラプログラムの4
4行目から53行目でステップS407、S408の処
理が行われ、レジスタ$13と$14と$15を復帰レ
ジスタ群から除いて、図14の33行目から39行目の
コードが生成される。次に、図10のアセンブラプログ
ラムの44行目から53行目でステップS407、S4
08の処理が行われ、図14の28行目から32行目の
コードが生成される。次に、図10のアセンブラプログ
ラムの29行目から38行目でステップS405、S4
06の処理が行われ、レジスタ$13と$14と$15
を退避レジスタ群から除いて、図14の21行目から2
7行目のコードが生成される。
【0097】そして、未使用レジスタ外部変数割り当て
コード生成手段10414は、最後にステップS401
で中間ファイル201の終了を認識して終了し、コード
出力手段10401から図14に示すアセンブラプログ
ラムを出力する。
【0098】以上のように図7、図8のソースプログラ
ムから生成した第1アセンブラプログラム203(図
9、図10:従来技術)に対する第2アセンブラプログ
ラム(図13、図14:本実施形態)でのデータ領域及
びコード領域の削減率を、図15に示す。この図から、
本実施形態では、メモリ領域の大幅な削減ができること
が分かる。また、この例とは異なる大規模のソースプロ
グラムに対しても、定量的に同等な削減効果が得られる
ことは、経験上予測することができる。
【0099】以上説明したように、この実施の形態にか
かるコンパイラ10では、外部変数およびレジスタ情報
出力コード生成手段10412が1回目の翻訳処理で生
成した第1アセンブラプログラム203をアセンブル、
リンクした実行形式のプログラム205を実行して、外
部変数にに割り当てることのできるレジスタを調べてレ
ジスタ使用管理領域301に登録している。
【0100】そして、未使用レジスタ外部変数割り当て
手段10413は、実行形式のプログラム205を実際
に実行した状態におけるレジスタ使用管理領域301で
使用フラグが“0”のレジスタを、参照頻度の多い外部
変数に割り当てている。こうして、未使用レジスタ外部
変数割り当てコード生成手段10414が参照頻度の高
い外部変数にレジスタを割り当ててコードを生成するこ
とができるため、第2のアセンブラプログラム204を
アセンブル、リンクした実行形式のプログラム206
は、コード効率がよく、その実行速度が速いものとな
る。
【0101】また、この実施の形態にかかるコンパイラ
10では、外部変数およびレジスタ情報出力コード生成
手段10412による1回目の翻訳処理では外部変数以
外の変数にレジスタの割り当てを行い、外部変数に対す
るレジスタの割り当ては、2回目の翻訳処理で行うこと
にしている。このため、複数のソースプログラム201
のうちで互いに異なるもの同士での外部変数の参照につ
いても、同一のレジスタを割り当てることができるた
め、、第2のアセンブラプログラム204をアセンブ
ル、リンクした実行形式のプログラム206は、コード
効率がよく、その実行速度が速いものとなる。
【0102】また、この実施の形態にかかるコンパイラ
10では、レジスタを割り当てる外部変数に初期値があ
る場合に、未使用レジスタ外部変数割り当てコード生成
手段10414が当該レジスタに初期値を設定するため
のコードを生成している。このため、外部変数を最初か
ら最後まで同一のレジスタに割り当てることが可能とな
り、この分だけメモリ領域に確保しなければならない外
部変数の参照のための領域を小さくすることができる。
【0103】さらに、この実施の形態にかかるコンパイ
ラ10では、未使用レジスタ外部変数割り当てコード生
成手段10414は、割り込み関数で退避/復帰するレ
ジスタから外部変数に割り当てたレジスタを除いてい
る。これにより、第2のアセンブラプログラム204を
アセンブル、リンクした実行形式のプログラム206
は、割り込み処理時に退避/復帰しなければならないレ
ジスタの数が従来よりも少なくすることができるので、
コード効率がよく、その実行速度が速いものとなる。ま
た、レジスタの退避/復帰のためのメモリの領域も小さ
くすることができる。
【0104】[第2の実施の形態]この実施の形態にか
かるコンパイラ10は、第1の実施の形態にかかるもの
とほぼ同じである。但し、この実施の形態では、図16
に示すように、レジスタ使用管理領域301が未使用の
レジスタに関する情報を1回目の翻訳処理において得て
レジスタ使用管理領域301を生成する。すなわち、こ
の実施の形態では、外部変数およびレジスタ情報出力コ
ード生成手段10412がレジスタ使用管理領域301
を生成する点において、第1の実施の形態のものと異な
る。
【0105】図17は、この実施の形態における外部変
数およびレジスタ情報出力コード生成手段1042の処
理を示すフローチャートである。この実施の形態では、
外部変数およびレジスタ情報出力コード生成手段104
12は、まず、レジスタ使用管理領域301がメモリ中
に確保されていないかどうかを判定する(ステップS5
01)。レジスタ使用管理領域301がメモリ中に確保
されていると判定したときは、ステップS503の処理
に進む。
【0106】一方、レジスタ使用管理領域301がメモ
リ中に確保されていないと判定したときは、外部変数お
よびレジスタ情報出力コード生成手段10412は、レ
ジスタ使用管理領域301をメモリ中に確保し、さらに
レジスタ使用管理領域302のレジスタ名の欄に特殊レ
ジスタを除くすべてのレジスタの名称を登録する(ステ
ップS502)。そして、ステップS503の処理に進
む。
【0107】ステップS503からステップS509ま
での処理は、図4のステップS203からS209まで
の処理と同じである。
【0108】ステップS509においてレジスタを使用
するコードを生成するものであると判定したときは、外
部変数およびレジスタ情報出力コード生成手段1041
2は、レジスタ使用管理領域302の当該使用するレジ
スタに対応する使用フラグの欄を“1”とする(ステッ
プS510)。そして、ステップS503の処理に戻
る。
【0109】以上説明したように、この実施の形態にか
かるコンパイラ10では、外部変数およびレジスタ情報
出力コード生成手段10412がレジスタ使用管理領域
301を確保し、特殊レジスタを除くすべてのレジスタ
の名称を登録すると共に、レジスタを使用するコードを
生成する場合には、当該使用するレジスタに対応する使
用フラグの欄を“1”に設定している。これにより、こ
の実施の形態にかかるコンパイラ10では、第1の実施
の形態での効果に加えて次のような効果を得ることがで
きる。
【0110】すなわち、ソースプログラム201によっ
ては、外部からの情報の入力や割り込みによって、実行
する度に動作が異なるものとなることがある。このよう
な場合、ある実行結果では未使用であったレジスタを別
の実行結果では使用する場合がある。しかし、この実施
の形態では、実行時に使用される可能性のあるレジスタ
に対応する使用フラグを、1回目の翻訳時にすべて
“1”にセットするため、外部変数に割り当てられたレ
ジスタが、プログラムの実行時に使用されて、不正な動
作が行われることがなくなる。
【0111】[実施の形態の変形]本発明は、上記の第
1、第2の実施の形態に限られず、種々の変形、応用が
可能である。以下、本発明に適用可能な上記の実施の形
態の変形態様について、説明する。
【0112】上記の第1、第2の実施の形態では、未使
用レジスタ外部変数割り当てコード生成手段10414
によって2回目の翻訳処理を行うときに、最初に入力し
たソースプログラム201から生成した中間ファイル2
02を利用していた。すなわち、1回目の翻訳処理と2
回目の翻訳処理とで同じ中間ファイル202を利用して
いた。しかしながら、2回目の翻訳処理を行う前に、コ
ンパイラ10にソースプログラム201を新たに入力し
て、1回目の翻訳処理を行う前と同様に中間ファイルを
生成するものとしてもよい。
【0113】上記の第1、第2の実施の形態では、ソー
スプログラム201をコンパイラ10でコンパイルした
オブジェクトプログラムとしてアセンブラプログラムを
生成するものとし、生成されたアセンブラプログラムを
アセンブラ20を用いて機械語のコードに変換するもの
としていた。しかしながら、ソースプログラムからアセ
ンブラプログラムをコンパイルしたオブジェクトプログ
ラムとして、直接機械語のコードを生成するものとして
もよい。
【0114】上記の第1、第2の実施の形態では、コン
パイラ10は、字句解析手段101、構文解析手段10
2、最適化手段103、及びコード生成手段1041で
構成されるものとしていた。しかしながら、最適化手段
103を有さず、ソースプログラムを字句解析、構文解
析しただけの中間ファイルに基づいてアセンブラコード
を生成する場合でも、コード生成手段1041に含まれ
る各手段が正しく動作することができる。
【0115】上記の第1、第2の実施の形態では、コン
パイラ10は、メモリ上に記憶されたコンパイラプログ
ラムを実行するプロセッサが実現する機能として説明し
ていた。しかし、このようなコンパイラプログラムは、
磁気ディスク或いは光ディスクなどのコンピュータ読み
取り可能な記録媒体に格納して配布してもよい。さらに
は、ネットワーク上のサーバから当該ネットワークを介
して配信するものとしてもよい。
【0116】上記の第1、第2の実施の形態では、コン
パイラ10は、字句解析手段101、構文解析手段10
2、最適化手段103及びコード生成手段1041が一
体のものとして構成されるものとしていた。しかしなが
ら、字句解析手段101、構文解析手段102及び最適
化手段103は、従来のものと同じであるので、コード
生成手段1041のみのモジュールとして提供するよう
にしてもよい。
【0117】
【発明の効果】以上説明したように、本発明によれば、
コード効率のよい、すなわち実行速度が速いオブジェク
トプログラムを生成することができる。また、外部変数
を参照するための領域をメモリ内に確保しなくても済む
ようになるので、メモリの利用効率のよいオブジェクト
プログラムを生成することができる。
【図面の簡単な説明】
【図1】本発明の第1の実施の形態にかかるコンパイラ
を示す機能ブロック図である。
【図2】本発明の第1の実施の形態において、ソースプ
ログラムから実行形式のプログラムを生成するまでの処
理を行うシステム全体を示す図である。
【図3】図1のコード生成制御手段の処理を示すフロー
チャートである。
【図4】図1の外部変数およびレジスタ情報出力コード
生成手段の処理を示すフローチャートである。
【図5】未使用レジスタ外部変数割り当て手段の処理を
示すフローチャートである。
【図6】未使用レジスタ外部変数割り当てコード生成手
段の処理を示すフローチャートである。
【図7】C言語で記述されたソースプログラムの例を示
す図である。
【図8】C言語で記述されたソースプログラムの例を示
す図である。
【図9】図7のソースプログラムから1回目の翻訳処理
で生成されたアセンブラコードを示す図である。
【図10】図8のソースプログラムから1回目の翻訳処
理で生成されたアセンブラコードを示す図である。
【図11】レジスタ使用管理領域の状態遷移を示す図で
ある。
【図12】参照頻度記憶領域の状態遷移を示す図であ
る。
【図13】図7のソースプログラムから2回目の翻訳処
理で生成されたアセンブラコードを示す図である。
【図14】図8のソースプログラムから2回目の翻訳処
理で生成されたアセンブラコードを示す図である。
【図15】本発明の第1の実施の形態にかかるコンパイ
ラによる効果を説明する図である。
【図16】本発明の第1の実施の形態において、ソース
プログラムから実行形式のプログラムを生成するまでの
処理を行うシステム全体を示す図である。
【図17】本発明の第2の実施の形態における外部変数
およびレジスタ情報出力コード生成手段の処理を示すフ
ローチャートである。
【図18】従来例にかかるコンパイラを示す機能ブロッ
ク図である。
【符号の説明】
10 コンパイラ 101 字句解析手段 102 構文解析手段 103 最適化手段 1041 コード生成手段 10401 コード出力手段 10411 コード生成制御手段 10412 外部変数およびレジスタ情報出力コード生
成手段 10413 未使用レジスタ外部変数割り当て手段 10414 未使用レジスタ外部変数割り当てコード生
成手段 20 アセンブラ 30 リンカ 40 プログラム実行部 201 ソースプログラム 202 中間ファイル 203 第1アセンブラプログラム 204 第2アセンブラプログラム 205 実行形式のプログラム 206 実行形式のプログラム 301 レジスタ使用管理領域 302 参照頻度記憶領域

Claims (16)

    【特許請求の範囲】
  1. 【請求項1】互いに参照される外部変数を含む複数のソ
    ースプログラムを構文解析した複数の中間ファイルに基
    づいて、オブジェクトプログラムを生成するコンパイル
    装置であって、 前記複数の中間ファイルに基づいて、前記外部変数を参
    照するための領域をメモリに確保する複数の第1のオブ
    ジェクトプログラムを生成する第1のオブジェクトプロ
    グラム生成手段と、 前記オブジェクトプログラム生成手段が生成した複数の
    第1のオブジェクトプログラムを結合した実行形式のプ
    ログラムを実行した結果、参照回数が多い外部変数から
    順に、他で使用されていないレジスタを割り当てるレジ
    スタ割り当て手段と、 前記レジスタ割り当て手段によるレジスタの割り当てを
    参照し、前記複数の中間ファイルに基づいて、レジスタ
    が割り当てられた外部変数の参照を当該割り当てられた
    レジスタを用いて行う複数の第2のオブジェクトプログ
    ラムを生成する第2のオブジェクトプログラム生成手段
    とを備えることを特徴とするコンパイル装置。
  2. 【請求項2】前記レジスタ割り当て手段が外部変数に割
    り当てる他で使用されていないレジスタは、前記実行形
    式のプログラムを実行した結果により得られたものであ
    ることを特徴とする請求項1に記載のコンパイル装置。
  3. 【請求項3】前記第1のオブジェクトプログラム生成手
    段は、前記複数の第1、第2のオブジェクトプログラム
    を結合した実行形式のプログラムが実行される装置に含
    まれるレジスタと、各レジスタに対応付けてその使用状
    況に関する情報を管理するレジスタ使用管理手段を前記
    複数の第1のオブジェクトプログラムを結合した実行形
    式のプログラムを実行するときに生成するためのコード
    を生成する手段と、前記複数の第1のオブジェクトプロ
    グラムを結合した実行形式のプログラムを実行してレジ
    スタが使用されたときに当該使用されたレジスタに対応
    する前記レジスタ使用管理手段内の使用状況を使用状態
    とするコードを生成する手段とを含み、 前記レジスタ割り当て手段は、前記複数の第1のオブジ
    ェクトプログラムを結合した実行形式のプログラムを実
    行後に得られた前記レジスタ使用管理手段を参照して、
    外部変数へレジスタを割り当てることを特徴とする請求
    項2に記載のコンパイル装置。
  4. 【請求項4】前記レジスタ割り当て手段が外部変数に割
    り当てる他で使用されていないレジスタは、前記複数の
    第1のオブジェクトプログラム中で使用されているレジ
    スタ以外のレジスタであることを特徴とする請求項1に
    記載のコンパイル装置。
  5. 【請求項5】前記第1のオブジェクトプログラム生成手
    段は、前記複数の第1、第2のオブジェクトプログラム
    を結合した実行形式のプログラムが実行される装置に含
    まれる各レジスタに対応付けてその使用状況に関する情
    報を管理するレジスタ使用管理手段を生成する手段と、
    前記レジスタのいずれかを使用するコードを生成したと
    きに当該使用されたレジスタに対応する前記レジスタ使
    用管理手段内の使用状況を使用状態とする手段とを備え
    ることを特徴とする請求項4に記載のコンパイル装置。
  6. 【請求項6】前記第1のオブジェクトプログラム生成手
    段は、各外部変数と対応付けて参照回数を記憶する参照
    頻度記憶手段を前記複数の第1のオブジェクトプログラ
    ムを結合した実行形式のプログラムを実行するときに生
    成するためのコードを生成する手段と、前記複数の第1
    のオブジェクトプログラムを結合した実行形式のプログ
    ラムを実行して外部変数が参照さたときに当該参照され
    た外部変数に対応する前記参照頻度記憶手段内の参照回
    数を加算するコードを生成する手段とを含むことを特徴
    とする請求項1乃至5のいずれか1項に記載のコンパイ
    ル装置。
  7. 【請求項7】前記参照頻度記憶手段は、さらに前記外部
    変数のそれぞれに対応付けてその初期値を記憶し、 前記第1のオブジェクトプログラム生成手段は、前記外
    部変数の初期値を前記参照頻度記憶手段内に設定するコ
    ードを生成する手段を含むことを特徴とする請求項6に
    記載のコンパイル装置。
  8. 【請求項8】前記参照頻度記憶手段は、さらに前記外部
    変数のそれぞれに対応して割り当てたレジスタに関する
    情報を記憶し、 前記レジスタ割り当て手段は、前記複数の第1のオブジ
    ェクトプログラムを結合した実行形式のプログラムを実
    行した後の前記参照頻度記憶手段内の各外部変数の参照
    回数に従ってレジスタの割り当てを行って、対応する外
    部変数のレジスタに関する情報の欄に記憶させ、 前記第2のオブジェクトプログラム生成手段は、前記参
    照頻度記憶手段を参照して、前記複数の第2のオブジェ
    クトプログラムを生成することを特徴とする請求項6ま
    たは7に記載のコンパイル装置。
  9. 【請求項9】前記第2のオブジェクトプログラム生成手
    段は、前記レジスタ割り当て手段が外部変数に割り当て
    たレジスタを、割り込み処理での退避及び復帰の対象と
    なるレジスタから除外するためのコードを生成する手段
    を含むことを特徴とする請求項1乃至8に記載のコンパ
    イル装置。
  10. 【請求項10】前記複数の中間ファイルは、前記第1の
    オブジェクトプログラム生成手段が前記複数の第1のオ
    ブジェクトプログラムを生成する前と、前記第2のオブ
    ジェクトプログラム生成手段が前記複数の第2のオブジ
    ェクトプログラムを生成する前とにおいて、それぞれ別
    々に生成されたものであることを特徴とする請求項1乃
    至9のいずれか1項に記載のコンパイル装置。
  11. 【請求項11】互いに参照される外部変数を含む複数の
    ソースプログラムを構文解析した複数の中間ファイルに
    基づいて、オブジェクトプログラムを生成するコンパイ
    ル方法であって、 前記複数の中間ファイルに基づいて、前記外部変数を参
    照するための領域をメモリに確保する複数の第1のオブ
    ジェクトプログラムを生成する第1のオブジェクトプロ
    グラム生成ステップと、 前記オブジェクトプログラム生成ステップで生成した複
    数の第1のオブジェクトプログラムを結合した実行形式
    のプログラムを実行した結果、参照回数が多い外部変数
    から順に、他で使用されていないレジスタを割り当てる
    レジスタ割り当てステップと、 前記レジスタ割り当てステップにおけるレジスタの割り
    当てを参照し、前記複数の中間ファイルに基づいて、レ
    ジスタが割り当てられた外部変数の参照を当該割り当て
    られたレジスタを用いて行う複数の第2のオブジェクト
    プログラムを生成する第2のオブジェクトプログラム生
    成ステップとを含むことを特徴とするコンパイル方法。
  12. 【請求項12】前記レジスタ割り当てステップで外部変
    数に割り当てる他で使用されていないレジスタは、前記
    実行形式のプログラムを実行した結果により得られたも
    のであることを特徴とする請求項11に記載のコンパイ
    ル方法。
  13. 【請求項13】前記レジスタ割り当てステップで外部変
    数に割り当てる他で使用されていないレジスタは、前記
    複数の第1のオブジェクトプログラム中で使用されてい
    るレジスタ以外のレジスタであることを特徴とする請求
    項11に記載のコンパイル方法。
  14. 【請求項14】互いに参照される外部変数を含む複数の
    ソースプログラムを構文解析した複数の中間ファイルに
    基づいて、オブジェクトプログラムを生成するためのコ
    ンパイラプログラムを記録したコンピュータ読み取り可
    能な記録媒体であって、 前記複数の中間ファイルに基づいて、前記外部変数を参
    照するための領域をメモリに確保する複数の第1のオブ
    ジェクトプログラムを生成する第1のオブジェクトプロ
    グラム生成ステップと、 前記オブジェクトプログラム生成ステップで生成した複
    数の第1のオブジェクトプログラムを結合した実行形式
    のプログラムを実行した結果、参照回数が多い外部変数
    から順に、他で使用されていないレジスタを割り当てる
    レジスタ割り当てステップと、 前記レジスタ割り当てステップにおけるレジスタの割り
    当てを参照し、前記複数の中間ファイルに基づいて、レ
    ジスタが割り当てられた外部変数の参照を当該割り当て
    られたレジスタを用いて行う複数の第2のオブジェクト
    プログラムを生成する第2のオブジェクトプログラム生
    成ステップとを実行させるためのプログラムを記録する
    ことを特徴とするコンピュータ読み取り可能な記録媒
    体。
  15. 【請求項15】前記レジスタ割り当てステップで外部変
    数に割り当てる他で使用されていないレジスタは、前記
    実行形式のプログラムを実行した結果により得られたも
    のであることを特徴とする請求項14に記載のコンピュ
    ータ読み取り可能な記録媒体。
  16. 【請求項16】前記レジスタ割り当てステップで外部変
    数に割り当てる他で使用されていないレジスタは、前記
    複数の第1のオブジェクトプログラム中で使用されてい
    るレジスタ以外のレジスタであることを特徴とする請求
    項14に記載のコンピュータ読み取り可能な記録媒体。
JP11147742A 1999-05-27 1999-05-27 コンパイル装置、方法及び記録媒体 Pending JP2000339171A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP11147742A JP2000339171A (ja) 1999-05-27 1999-05-27 コンパイル装置、方法及び記録媒体

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP11147742A JP2000339171A (ja) 1999-05-27 1999-05-27 コンパイル装置、方法及び記録媒体

Publications (1)

Publication Number Publication Date
JP2000339171A true JP2000339171A (ja) 2000-12-08

Family

ID=15437127

Family Applications (1)

Application Number Title Priority Date Filing Date
JP11147742A Pending JP2000339171A (ja) 1999-05-27 1999-05-27 コンパイル装置、方法及び記録媒体

Country Status (1)

Country Link
JP (1) JP2000339171A (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2012203581A (ja) * 2011-03-24 2012-10-22 Fujitsu Ltd レジスタ配置最適化方法、レジスタ配置最適化プログラム、及びレジスタ配置最適化装置

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2012203581A (ja) * 2011-03-24 2012-10-22 Fujitsu Ltd レジスタ配置最適化方法、レジスタ配置最適化プログラム、及びレジスタ配置最適化装置

Similar Documents

Publication Publication Date Title
EP0428084A2 (en) Method and apparatus for compiling computer programs with interprocedural register allocation
US8799881B2 (en) Program parallelization device and program product
US20070226720A1 (en) System and Method for Efficiently Passing Information Between Compiler and Post-Compile-Time Software
US20100229161A1 (en) Compile method and compiler
US20090328016A1 (en) Generalized expression trees
US20180052667A1 (en) Emulation device, emulation method, and recording medium storing emulation program
JP2004220583A (ja) アセンブラにおいて大域的プロセッサ資源割当てを実行するための方法およびシステム
JP2017228029A (ja) 並列化方法、並列化ツール、車載装置
US7251594B2 (en) Execution time modification of instruction emulation parameters
CN111930359B (zh) 一种异构嵌入式系统上进行算法开发的系统及方法
Pellegrini Distillating knowledge about Scotch
US20010039653A1 (en) Program conversion method, program conversion apparatus, storage medium for storing program conversion program and program conversion program
US5404531A (en) Method and apparatus for compiler processing on program related to data transfer and calculation, and method of managing memory
JP2011141676A (ja) 言語処理装置、言語処理方法およびコンピュータプログラムプロダクト
US11435989B2 (en) Thread-local return structure for asynchronous state machine
JP2005129001A (ja) プログラム実行装置、マイクロプロセッサ及びプログラム実行方法
JP5576605B2 (ja) プログラム変換装置およびプログラム変換方法
CN115826946A (zh) 一种程序异常向量空间优化系统、方法、设备及介质
US6134708A (en) Program compilation execution system
CN118092887B (zh) 一种Wasm指令集生成方法、装置、终端及存储介质
JP2000339171A (ja) コンパイル装置、方法及び記録媒体
EP4196874B1 (en) Representing asynchronous state machine in intermediate code
JP3241214B2 (ja) 分散処理装置及びプロセス実行方法
US20200409746A1 (en) Information processing apparatus and recording medium
US6029003A (en) Method of assigning external variables to memories when compiling source program