JP2001290656A - 差分コンパイル方式 - Google Patents

差分コンパイル方式

Info

Publication number
JP2001290656A
JP2001290656A JP2000111866A JP2000111866A JP2001290656A JP 2001290656 A JP2001290656 A JP 2001290656A JP 2000111866 A JP2000111866 A JP 2000111866A JP 2000111866 A JP2000111866 A JP 2000111866A JP 2001290656 A JP2001290656 A JP 2001290656A
Authority
JP
Japan
Prior art keywords
intermediate language
code
compilation
function
generation
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
JP2000111866A
Other languages
English (en)
Inventor
Hiroshi Nonomura
野々村  洋
Ichiro Kushima
伊知郎 久島
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.)
Hitachi Ltd
Original Assignee
Hitachi 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 Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2000111866A priority Critical patent/JP2001290656A/ja
Publication of JP2001290656A publication Critical patent/JP2001290656A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】 【課題】コンパイル時に無駄なコード生成を削除する。 【解決手段】コンパイル時に生成した中間語を保存して
おき、次回コンパイル時には、保存しておいた中間語と
今回生成した中間語を比較して、中間語が同じ場合はコ
ード生成を省略して、前回生成したオブジェクトコード
を利用し、中間語が異なる場合も実際には再度のコード
生成が不要かどうかを調べ、不要の場合はコード生成処
理を省略する。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明はコンパイラに関し、
再度コードの生成を行なう必要がない部分は、以前コン
パイルしたときのオブジェクトコードをそのまま再利用
する、差分コンパイル機能を持つコンパイラに関する。
【0002】
【従来の技術】近年の、マイクロプロセッサの高性能化
にともない、コンパイラは、その性能を発揮できるよう
な、オブジェクトコードを生成することが求められてい
る。
【0003】しかし、性能を発揮できるようなコードの
生成には、複雑な解析や、プログラム変換などが必要と
なり、多くのコンパイル時間を要するようになる。この
ことは、プログラム開発における、コンパイル時間の増
加をまねき、プログラム開発の効率低下の原因となる。
【0004】プログラム開発時には、コンパイル、テス
ト実行、ソースプログラム修正、の手順を何回も繰り返
すことが多いため、コンパイル時間の増加によるプログ
ラム開発効率低下の問題の解決手段として、一度コンパ
イルしたソースコードを、修正して再度コンパイルする
場合に、修正箇所の影響する範囲のみ再度コード生成を
行ない、影響のない部分は、以前コンパイルしたオブジ
ェクトコードをそのまま再利用する、差分コンパイル方
式が考えられている。
【0005】ソースプログラムの修正による影響範囲を
調べる方法としては、make コマンドなどのように、オ
ブジェクトコードのファイルの更新時間と、ソースプロ
グラムのファイルの更新時間を比較して、オブジェクト
コードを生成するのに必要なソースプログラムのファイ
ルの更新時間が、一つでもオブジェクトコードの更新時
間より新しい場合は、再コンパイルを行なうものがあ
る。この方法では、修正内容には関わらず、影響を与え
得るファイルが更新された場合は再コンパイルが行なわ
れため、例えば、多くのソースファイルから参照されて
いるヘッダファイルが修正された場合などは、多数のフ
ァイルに対して不要な再コンパイルが起こることがあ
る。
【0006】make コマンドの欠点を解決する方法とし
て、特開平9−218789号公報「分割コンパイル方式」に
示されるように、コンパイル初期にソースコードから生
成する中間語や、記号表を関数単位に保存しておき、再
コンパイルの場合は関数単位で中間語を比較して、ソー
スプログラムが変更されたかどうか調べ、中間語に差が
ある関数は再度コード生成を行ない、中間語が同じ場合
は、前回生成したオブジェクトコードを利用するものが
ある。この方法では、影響を与え得るファイルが修正さ
れても、中間語の差となって現れない関数に対しては、
コード生成は行なわれない。
【0007】
【発明が解決しようとする課題】特開平9−218789号公
報「分割コンパイル方式」の方法を用いても、プログラ
ムの変更、特に宣言の変更が行なわれた時、実際には不
要なコード生成が発生する場合がある。例えば、宣言の
変更により記号表の順番や構造が変化した場合、中間語
から参照される記号表が変わり、中間語が異なる場合が
ある。このとき、実際にはそのまま前回コンパイルした
際に生成したオブジェクトコードが利用できる場合で
も、コード生成が再度行なわれることがある。
【0008】
【課題を解決するための手段】上記課題解決のため、本
発明では修正範囲を調べる際に、次のようなことを行な
う。
【0009】修正範囲を調べるのは、中間語の比較によ
り行なう。中間語の比較は、関数単位に行なう。
【0010】宣言の修正により、中間語が変更された場
合、修正内容によっては、以下のような方法によりコー
ド生成を省略する。
【0011】構造体の宣言の変更がされた時、関数の中
で参照されている構造体メンバの型と構造体先頭からの
オフセット、サイズを調べ、これらに変更がなければ、
構造体のメンバが増えたり、削除されたり、名前が変わ
ったり、順序が変わるなどの変更があった場合でも、前
回コンパイルしたオブジェクトコードを使えるものと判
断して、コード生成を省略する。
【0012】変数の宣言をした時に作成される記号辞書
のうち、関数内で宣言されるローカル変数については、
例えば中間語を先頭から走査して、中間語中で参照され
る順に並べることにより、関数内の変数の宣言の順序の
み変更した場合や、変数の名前のみの変更した場合は、
ソースプログラムは変更されなかったものとして、その
関数に関しては、前回コンパイルした時のオブジェクト
コードを利用することができ、コード生成を省略する。
【0013】また、グローバル変数、ローカル変数と
も、変数の宣言が追加、削除された場合も、関数内で参
照されていない変数の追加、削除の場合は、その関数の
コード生成は省略する。
【0014】
【発明の実施の形態】以下図面を参照しながら本発明の
一実施例について説明する。
【0015】図1は本発明を利用する際の手順を示した
ものである。ソースプログラム101は差分コンパイル可
能なコンパイラ102により、前回コンパイルした際の中
間語105および前回コンパイルした際のオブジェクトコ
ード107から、前回から修正された部分だけ再コンパイ
ルした、修正後のオブジェクトコード108を高速に生成
する。
【0016】差分コンパイル可能なコンパイラ102がコ
ンパイルを行なう時、読み込まれたソースプログラム10
1は、解析・中間語生成フェーズ103において、プログラ
ムの字句解析、構文解析、意味解析などを行なって、中
間語を生成する。
【0017】生成された中間語は、中間語比較部104に
渡され、記号表の順番が変わることにより、中間語が異
なるとみなされないようにする。たとえば、記号表が宣
言された順番に依存しないように、例えば中間語を先頭
から検索していき、参照された順番になるように並べ変
える。また、前回コンパイルした際の中間語105も読み
込み、対応する関数の中間語を、関数名から検索して探
す。
【0018】対応する関数が見つかったら中間語の比較
を行なう。中間語比較部104における中間語比較処理の
詳細については、図6をつかって説明する。
【0019】中間語の比較を行なって差がなかった場合
は、コード生成フェーズ106において、前回コンパイル
した際のオブジェクトコード107を読み込み、該当する
関数のコードを検索して、そのコードをコピーし、オブ
ジェクトコードを生成する。
【0020】中間語の比較の結果、差があった場合は、
その関数に関しては、従来のコンパイラと同様にコード
生成処理を行い、オブジェクトコードを生成する。
【0021】図2は、修正対象となるプログラムの例で
ある。
【0022】図3は、図2の修正対象となるプログラム
の中間語例である。中間語は関数辞書301に接続され
た、リスト構造と木構造を合わせ持つデータ構造を持
つ。
【0023】図4は、修正されたプログラムの例であ
る。大域変数宣言401、構造体宣言402、構造体要素403
の宣言、引数の宣言404などが変更されている。
【0024】図5は、図4の修正対象となるプログラム
の修正例を中間語で表したものである。プログラムの修
正により、中間語から指示される記号辞書が異なるた
め、図3の中間語とは、異なるものと識別される。
【0025】図6は、中間語比較の手順を示したフロー
チャートである。解析・中間語生成フェーズ103で、中
間語を生成した後、処理手順601より比較処理を開始す
る。
【0026】処理602において、ソースプログラムより
生成した中間語から、一要素取り出す。処理603におい
て、同様に前回コンパイル時に生成した中間語から、一
要素取り出す。処理604において、中間語読み込み処理
が終了したかどうかを調べる。もし、終了していた場合
は、前回コンパイル時に生成したオブジェクトコードを
利用できるので、処理611に移り、オブジェクトコード
再利用処理へと制御を移し、比較処理を終了する。
【0027】処理604においは、処理602,603でとりだし
た2つの中間語要素の比較を行なう。もし同じ要素であ
ったなら、比較した中間語は等しいので、処理のはじめ
に戻り、次の中間語要素の比較を行なう。
【0028】処理605において、とりだした2つの中間語
要素が等しくない場合、処理606において、等しくない
のは、変数の記号表の違いかどうかを調べる。そうでは
なかった場合、オブジェクトコードの生成が必要となる
ため、処理612へ移り、オブジェクトコード生成処理へ
と制御を移し、比較処理を終了する。
【0029】処理606において、とりだした2つの中間語
要素の違いが変数の記号表の違いであった場合、処理60
7において2つの記号表のデータサイズが同じかどうか調
べる。データサイズが異なる場合は、オブジェクトコー
ドの生成が必要となるため、処理612へ移り、オブジェ
クトコード生成処理へと制御を移し、比較処理を終了す
る。
【0030】データサイズが等しい場合は、処理608へ
移り、その変数がロケーションを持つかどうかを調べ
る。
【0031】変数がロケーションを持つ場合、処理609
に移りロケーションが同じかどうか比較を行なう。ロケ
ーションが同じ場合、処理のはじめに戻り、次の中間語
要素の比較を行なう。オフセットがことなる場合、オブ
ジェクトコードの生成が必要となるため、処理612へ移
り、オブジェクトコード生成処理へと制御を移し、比較
処理を終了する。
【0032】処理608において、変数がロケーションを
持たない場合は、オフセットを持っているはずなので、
処理610に移りオフセットが同じかどうか比較を行な
う。オフセットが同じ場合、処理のはじめに戻り、次の
中間語要素の比較を行なう。オフセットがことなる場
合、オブジェクトコードの生成が必要となるため、処理
612へ移り、オブジェクトコード生成処理へと制御を移
し、比較処理を終了する。
【0033】次に、図6のフローチャートで、図3の中
間語と図5の中間語の比較を行なった際の処理の流れを
説明する。ソースプログラムは、解析・中間語生成フェ
ーズ103において、関数単位で中間語が生成され、中間
語比較フェーズ104に渡されるものとする。ここでは、
関数辞書501に接続されている中間語602,603などが渡っ
てくるものとする。また、記号表は、中間語の出現順に
並べられ、中間語中に現れない記号の記号表について
は、最後に加えられるものとする。前回コンパイルした
際に生成した中間語としては、図3に示す中間語表記の
中から、関数名検索処理によって関数辞書を検索し、関
数名が同じである関数辞書201に接続された中間語302,3
03などが渡ってくるものとする。
【0034】処理601においては、再度コンパイルされ
て生成された中間語として、図5の中間語が渡される。
そして、まず処理602において中間語502が、処理603に
おいて中間語302が取り出される。次に処理604におい
て、中間語の読み込みが終了したかどうかの判定が行な
われるが、これはまだ中間語が残っているため、比較結
果は no となり、処理605に進む。処理605では中間語50
2と302を比較するが、同じ中間語であるため、判定は y
es となり処理602に戻る。中間語503と303、504と3
04は同じ中間語であるため、同様に処理が進む。
【0035】中間語505と305の場合は、処理、602、60
3、604までは同様に処理が進むが、処理605において、
中間語の指示する辞書の記号が異なる辞書番号であるた
め、中間語は異なると判定され、処理606へ進む。ここ
で中間語の差異は記号表の差であるため、yes と判定さ
れ、処理607へ進む。処理607ではデータサイズが同じか
どうかの比較を行なうが、これは同じであるので、yes
と判定されて、処理608へ進む。処理608では、ロケーシ
ョンがあるかどうかの判定がされるが、中間語505、305
ともロケーションを情報として持っているため、yes と
判定されて処理609に進む。処理609では、ロケーション
が同じかどうかの判定を行なうが、中間語505、305と
も、ロケーションは SP + 0 であり、同じであるため、
yes と判定され、中間語の差は再度のコード生成の必要
がないものと判定され、処理602へ戻る。
【0036】中間語506と306の場合は、608まで中間語
同様に処理が進むが、処理605において、505と305の場
合と同様に処理が進むが、記号表中にロケーションはな
くオフセットを持つため、処理610へ進む。処理610で
は、オフセットがあるかどうかの判定がされるが、中間
語506、306ともオフセットは 0 であり、同じであるた
め、yes と判定され、中間語の差は再度のコード生成の
必要がないものと判定され、処理602へ戻る。
【0037】このようにして中間語の比較を行なってい
き、最後の中間語の比較の後、処理604へ来た場合、そ
の関数については、コード生成処理が省略できるものと
して、オブジェクトコード再利用処理へと進む。
【0038】なお、中間語比較処理において、処理60
6、607、609、610で、no と判定された場合は、オブジ
ェクトコード生成処理が必要なものと判定され、コード
生成処理へと進む。
【0039】また、大域変数宣言401の追加により生成
された、参照されなかった辞書に関しては、コード生成
には関係しないが、オブジェクトファイルを生成する時
に、データの領域は確保される。
【0040】
【発明の効果】本発明によれば、従来の技術では、再度
コード生成の必要があったプログラムの修正でも、以前
生成したオブジェクトコードの一部を利用して、コード
生成処理を省略することにより、コンパイル時間を短縮
することができる。
【図面の簡単な説明】
【図1】本発明の実施形態の一例を示す図。
【図2】修正対象となるプログラムの例を示す図。
【図3】修正対象となるプログラムの中間語例を示す
図。
【図4】修正されたプログラム例を示す図。
【図5】修正されたプログラムの中間語例を示す図。
【図6】中間語比較手順の一例を示す図。

Claims (4)

    【特許請求の範囲】
  1. 【請求項1】 プログラムのコンパイル途中段階で生成
    される中間語を保存しておき、再コンパイル時に、以前
    のコンパイル時に保存しておいた中間語と、今回生成し
    た中間語を比較し、コードの再生成が必要かどうかを調
    べ、コード再生成が必要ない部分に対しては、以前のオ
    ブジェクトコードを再利用することにより、コンパイル
    時間を短縮する差分コンパイル方式。
  2. 【請求項2】 請求項1の差分コンパイル方式におい
    て、 プログラムの構造体の宣言の変更によって中間語の差が
    生じた場合、関数の中で参照されている構造体メンバの
    型と構造体先頭からのオフセット、サイズを調べ、これ
    らに変更がなければ、構造体のメンバが増えたり、削除
    されたり、名前が変わったり、順序が変わるなどの変更
    があった場合でも、前回コンパイルしたオブジェクトコ
    ードを使えるものと判断して、コート生成を省略するこ
    とを特徴とする差分コンパイル方式。
  3. 【請求項3】 請求項1の差分コンパイル方式におい
    て、 関数内で宣言されるローカル変数については、関数内の
    変数の宣言の順序のみ変更した場合や、変数の名前のみ
    の変更した場合は、ソースプログラムは変更されなかっ
    たものとして、その関数に関しては、前回コンパイルし
    た時のオブジェクトコードを利用して、コート生成を省
    略することを特徴とする差分コンパイル方式。
  4. 【請求項4】 請求項1の差分コンパイル方式におい
    て、 グローバル変数、ローカル変数とも、変数の宣言が追
    加、削除された場合も、関数内で参照されていない変数
    の追加、削除の場合は、その関数に関しては、前回コン
    パイルした時のオブジェクトコードを利用して、コート
    生成を省略することを特徴とする差分コンパイル方式。
JP2000111866A 2000-04-07 2000-04-07 差分コンパイル方式 Pending JP2001290656A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2000111866A JP2001290656A (ja) 2000-04-07 2000-04-07 差分コンパイル方式

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2000111866A JP2001290656A (ja) 2000-04-07 2000-04-07 差分コンパイル方式

Publications (1)

Publication Number Publication Date
JP2001290656A true JP2001290656A (ja) 2001-10-19

Family

ID=18624131

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2000111866A Pending JP2001290656A (ja) 2000-04-07 2000-04-07 差分コンパイル方式

Country Status (1)

Country Link
JP (1) JP2001290656A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP6452924B1 (ja) * 2018-05-11 2019-01-16 三菱電機株式会社 コンパイラおよびプログラミング支援装置
JP7450565B2 (ja) 2021-02-02 2024-03-15 三菱電機株式会社 コンパイル方法、開発支援装置および制御システム

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP6452924B1 (ja) * 2018-05-11 2019-01-16 三菱電機株式会社 コンパイラおよびプログラミング支援装置
WO2019215919A1 (ja) * 2018-05-11 2019-11-14 三菱電機株式会社 コンパイラおよびプログラミング支援装置
US10802808B2 (en) 2018-05-11 2020-10-13 Mitsubishi Electric Corporation Compiler and programming support device
JP7450565B2 (ja) 2021-02-02 2024-03-15 三菱電機株式会社 コンパイル方法、開発支援装置および制御システム

Similar Documents

Publication Publication Date Title
US7559050B2 (en) Generating software development tools via target architecture specification
US4686623A (en) Parser-based attribute analysis
Le Fessant et al. Optimizing pattern matching
US20030088860A1 (en) Compiler annotation for binary translation tools
US5367683A (en) Smart recompilation of performing matchup/difference after code generation
US20040243988A1 (en) Compiler, method of compiling and program development tool
Miecznikowski et al. Decompiling Java using staged encapsulation
JP2002259134A (ja) ポストリンク・コードの最適化方法及び装置
JP2002196937A (ja) 従来のアセンブラを用いた新規の命令を含む命令セットアーキテクチャ用のアセンブリ言語コードをコンパイルする方法
Aaby Compiler construction using flex and bison
US5446899A (en) Hint generation in smart recompilation
Waddington et al. High-fidelity C/C++ code transformation
Röjemo Highlights from nhc—a space-efficient haskell compiler
JP7391983B2 (ja) プログラム論理の表現を生成する方法、逆コンパイル装置、再コンパイルシステムおよびコンピュータプログラム製品
US5535392A (en) Using hint generation to cause portions of object files to remain the same
Rastello et al. Optimizing translation out of SSA using renaming constraints
KR20090011974A (ko) 컴파일 대상 파일 추출 방법
JP2001290656A (ja) 差分コンパイル方式
Sewell et al. Cakes that bake cakes: Dynamic computation in CakeML
Barnard et al. Hierarchic syntax error repair for LR grammars
JP3266097B2 (ja) 非リエントラントプログラムの自動リエントラント化方法及びシステム
GB2420638A (en) Method of substituting code fragments in Internal Representation
US6976247B1 (en) Generating an executable file
Atterer Automatic test data generation from VDM-SL specifications
Maliavko The Lexical and Syntactic Analyzers of the Translator for the EI Language