JPH09237190A - インライン展開方法 - Google Patents

インライン展開方法

Info

Publication number
JPH09237190A
JPH09237190A JP4443496A JP4443496A JPH09237190A JP H09237190 A JPH09237190 A JP H09237190A JP 4443496 A JP4443496 A JP 4443496A JP 4443496 A JP4443496 A JP 4443496A JP H09237190 A JPH09237190 A JP H09237190A
Authority
JP
Japan
Prior art keywords
function
program
translation unit
translation
execution
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
JP4443496A
Other languages
English (en)
Inventor
Tatsuo Isobe
竜雄 磯部
Yoshinori Hayakawa
義則 早川
Yuugo Kashiwagi
有吾 柏木
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 Software Engineering Co Ltd
Hitachi Ltd
Original Assignee
Hitachi Software Engineering Co Ltd
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 Software Engineering Co Ltd, Hitachi Ltd filed Critical Hitachi Software Engineering Co Ltd
Priority to JP4443496A priority Critical patent/JPH09237190A/ja
Publication of JPH09237190A publication Critical patent/JPH09237190A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】 【課題】 別の翻訳単位に定義された関数をコンパイラ
の中間段階のプログラム表現形式にして、その構造をテ
ンポラリとして保持することにより、翻訳単位に縛られ
ることなく自由にインライン展開をすることを可能にす
る。 【解決手段】 原始プログラムを実行可能なオブジェク
トプログラムに変換する翻訳システムのインライン展開
最適化において、別翻訳単位に定義された関数の中間木
とそのシンボルをテンポラリファイルに格納する第1段
階と、翻訳する原始プログラム中で別翻訳単位の関数を
呼び出している時にテンポラリファィルを使用しインラ
イン展開を行う第2段階に分けることにより、翻訳単位
を越えたインライン展開を行う。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術】本発明は原始プログラムの効率的
なオブジェクト生成方法に係り、特にインライン展開方
法に関する。
【0002】
【従来の技術】高級言語で書かれた原始プログラムを、
マイクロコンピュータ等のプロセッサで実行可能な機械
語のオブジェクトプログラムに変換するコンパイラ等の
翻訳システムがある。また、関数の呼び出しを行ったと
きに関数の中身の処理の他に、呼び出しのための一連の
命令、例えば、パラメタのセット、レジスタの退避回
復、分岐、リターン命令、が必要になる設計思想、命令
セット、レジスタセット有するマイクロコンピュータシ
ステムがある。これらのコンピュータシステムでは、原
始プログラムに関数呼び出しがあればオブジェクトプロ
グラムにおいて呼び出しのための上記のような一連の命
令が展開されるのが普通である。この一連の命令は呼び
出しがループ構造の中にある場合等に特に無駄となり、
これを省くための最適化として、呼び出す関数の中身を
呼び出し場所に展開するという、いわゆるインライン展
開最適化が用いられることがある。しかし、従来は同じ
翻訳単位内に閉じてこの最適化を行っていたために、展
開しようとする関数が翻訳単位内に定義されていない場
合は対象外とせざるをえなかった。
【0003】
【発明が解決しようとする課題】上記で明白なように、
別の翻訳単位に定義してある関数と当該翻訳単位内の呼
び出し場所に展開できないということが課題であった。
【0004】本発明の目的は、別翻訳単位中にある関数
をテンポラリとしてその構造を保持しておくことによっ
て、あらゆる呼び出し場所でインライン展開を行う手段
を提供することにある。これによって翻訳単位(通常は
磁気ディスク上のファイル)に縛られることなく、原始
プログラム上の関数呼び出しを自由にインライン展開す
ることが可能になり、結果的に実行効率の優れたオブジ
ェクトプログラムを生成する。
【0005】
【課題を解決するための手段】本発明のうち、代表的な
ものの概要を簡単に説明すれば下記のとおりである。す
なわち、原始プログラムを、オブジェクトプログラムに
変換する翻訳システムで、関数呼び出しをインライン展
開にする場合に、別翻訳単位に定義してある関数をもイ
ンライン展開するために、翻訳段階を2段階にする。第
1段階はインライン展開対象関数をコンパイラ内部の表
現形式にして、テンポラリファイルにする過程であり、
第2段階は本来の翻訳処理と第1段階で残したテンポラ
リを元にして翻訳単位に依存しないインライン展開最適
化を行う過程である。もちろん、第1と2の過程はコン
パイラオプションで指定することができ、使用者が展開
したい関数を定義した翻訳単位のみ展開を行う手段も当
然提供される。インライン展開対象の選択方法について
は既に様々な方式が提案実現されており、原始プログラ
ム内指定方式やオプション指定方式、サイズ指定での自
動判断方式等があるが、ここでは請求範囲外であるので
特に言及はしない。さて、この第1段階で生成・保持す
るテンポラリファイルであるが、構造的にはコンパイラ
の中間段階のプログラム表現形式であり、シンボル情報
とアルゴリズム情報を持つものとする。この中間段階の
形式は言語の特徴を残したレベルにあるものとする。さ
らにその単位は関数毎になっており、関数名称をインデ
ックスにその情報にアクセスすることができる構造を持
つ。一方、第2段階の翻訳過程では翻訳する原始プログ
ラムをコンパイラの中間段階に落とした状態で、先に生
成済みのテンポラリファイルをアクセスする。まず翻訳
プログラム内をトレースして関数呼び出しがありかつそ
れがインライン展開の対象であることを判断したら、関
数名称でテンポラリファイル内の該当関数情報を読み込
み、アルゴリズム情報をその関数呼び出しの文とを置き
換える。さらにその関数に関わるシンボル情報をテンポ
ラリファイルから読み込み、現翻訳プログラム中のシン
ボルテーブルに追加する。もちろん他の展開タイミング
で既に当該関数のシンボル情報が追加済みであればさら
にこれを行う必要はない。ここで、ローカルなシンボル
は当該関数内のローカルシンボルとは別のユニークな識
別ができるようにする。上記の過程を経ることによっ
て、関数呼び出しを翻訳単位の縛りから開放することが
できる。
【0006】インライン展開方法によれば、プログラム
の実質的な機能を損なうこと無く、しかも関数呼び出し
を繰り返すことによる呼び出しの一連の命令の無駄を省
いてインライン展開を行い、かつ翻訳単位を越えてその
展開対象を広げることができる。これはフレキシブルな
最適化の提供に他ならず、この手法を通してプロセッサ
の実行効率を向上させることが可能となる。
【0007】
【発明の実施の形態】以下、本発明の実施例を図面に基
づいて詳細に説明する。
【0008】図1は本発明の一実施例である関数呼び出
しを翻訳単位を越えてインライン展開する手法を適用し
たコンパイラを示すブロック図が示されている。図2は
原始プログラムをメモリ上で表現するためにノード木を
構造する例を、C言語を用いて図示してある。図3およ
び図4は、図1のコンパイラで用いられる翻訳単位を越
えてインライン展開するための一実施例のメモリ領域構
成図が示されている。これらの図をもとに、まずこの実
施例のコンパイラの動作環境とインライン展開のための
判断を行うメモリ領域構成ならびにその特徴について説
明する。
【0009】図1において、この実施例のコンパイラ
は、中央処理装置(CPU)11を基本構成要素とする
翻訳用コンピュータ1をその稼動環境とする。中央処理
装置11には、所定の記憶容量を有する記憶装置12
と、オペレータ及びコンピュータ間のマンマシンインタ
フェースとなるキーボード13とが結合される。また、
記憶装置12には、コンパイラつまり翻訳システム4を
格納するための領域と、翻訳システム4による翻訳処理
の過程で用いられるインライン展開処理用メモリ5の領
域とが設けられる。翻訳用コンピュータ1は、所定の高
級言語で書かれた原始プログラム3を、翻訳システム4
に従って、実行用組み込みシステム2で実行可能な機械
語のオブジェクトプログラム6に変換する。
【0010】一方、オブジェクトプログラム6の実行環
境となる実行用組み込みシステム2は、ターゲットマイ
コン21を基本構成要素とし、このターゲットマイコン
21には、所定の記憶容量を有するROM(リードオン
リーメモリ)22が結合される。ROM22には、コン
パイラにより作成されたオブジェクトプログラム6が実
行プログラム7として格納される。実行用組み込みシス
テム2は、ROM22内の実行プログラム7により制御
され、図示されない入出力装置の制御や所定の演算処理
をおこなう。
【0011】C言語による原始プログラム30は、図2
の様に翻訳システム4により記憶装置(メモリ)12上
にノード木31として構成される。一つのノードに対し
て、ノードテーブル32が存在し、各ノードテーブルは
ポインタによりチェイン33されて、木形成の構造とな
っている。
【0012】関数呼び出しをインライン展開する場合、
まず第1段階として図3の様に別翻訳単位I40に定義
された関数の字句を読み込み、構文解析・意味解析をお
こないノード木41形成の構造とシンボル情報テーブル
43を生成する。これを関数単位に行い、例えば関数b
42がインライン展開の対象である場合関数b42のノ
ード木41と関数bのシンボル情報44をテンポラリフ
ァイル45に格納し、保持しておく。
【0013】テンポラリファィル45は、図4の様に、
インデックス部分46と関数情報部分47とに分かれ、
インデックスにより関数情報にアクセス可能な構造を持
つ。インデックス部分46はテンポラリファイルに格納
してある関数の数48を持ち、その数だけ関数名50と
その関数名長49、そしてその関数の情報の格納場所を
ファイル内のオフセット51により保持している。ファ
ィル内オフセット51により参照される関数情報部分4
7は、ノード木情報52とシンボル情報53からなりイ
ンライン展開の際に使用される。
【0014】インライン展開が行われる第2段階では、
このテンポラリファイルの情報からインデックステーブ
ルを作成される。インデックステーブルはテンポラリフ
ァィルの格納関数の数48だけあり、次テーブルへのリ
ンク56がされ、関数名54とファイル内オフセット5
5が設定されている。インライン展開をする際には、関
数名54からインデックステーブルをサーチしてファイ
ル内オフセット55からテンポラリファイル内の関数情
報部分47を参照する。
【0015】図5の様に、第2段階でテンポラリファィ
ル57のインデックス部分58からインデックステーブ
ル61を作成した後に翻訳単位II60に定義された関数
x62のノード木63を生成する。関数x62のノード
木63生成中にインデックステーブル61に設定されて
いる関数名と同名の関数b64を呼び出している場合、
関数呼び出しを削除してテーブル上のファイル内オフセ
ット65からテンポラリファィル57の関数bのインラ
イン展開用テンポラリ情報59からノード木を情報を参
照しインライン展開を行う。また、関数x62の中で関
数b64を初めて展開する場合にはシンボルテーブル6
6内の関数xのシンボル情報67の後に関数bのシンボ
ル情報68を追加する。これを翻訳単位II60内の全て
の関数について行う。
【0016】図6は本発明を適用したコンパイラの処理
フローの概要を示している。第1段階ではインライン展
開対象となる関数をテンポラリファィルに取得する過程
であるが、これは字句解折、構文解析、意味解析が終了
したあと、プログラム構造を射像したノード木とシンボ
ルテーブルが完成した時点で展開対象か否かを判断して
テンポラリに出力する。この過程はフローのST1〜S
T7に該当する。ここでの注意は、出力する関数内で参
照している大域変数や型情報はすべてシンボルの一部と
して出力しなければならないことである。第2段階では
テンポラリファィルの存在をコンパイラに知らせる何ら
かの手だてが必要になる。これは一つのオプション指定
であり、一つはディスク上のある名称の特定ディレクト
リである場合もある。テンポラリの存在が確定したら、
コンパイラは展開する処理に先立ってこのテンポラリを
入力する。入力は図4に示したインデックステーブルの
みをメモリ上に持つ。これにより展開対象関数全体をメ
モリに持つことによる空きメモリの圧迫を回避する。こ
のインデックステーブルにはテンポラリファイル上のオ
フセット55が格納されているため、ファィル内にある
関数情報47にランダムにアクセスすることができ、呼
び出しが出現した時の検索および情報引き出しがフレキ
シブルに実現できる。さて、インデックステーブルがメ
モリ上に展開されてこれが完成した後に、コンパイル単
位の完成した状態のノード木を走査して関数呼び出しを
探す。これが展開対象であれば、ST12のようにイン
デックステーブルからファィルオフセットを導きだし、
テンポラリファイルから関数を読み込む。次に呼び出し
を削除し、この場所に呼び出し関数に対応するノード木
をうめこむ。この時にこの関数は展開を行った翻訳中の
関数の中で初めての展開関数であったならば、引き続い
てシンボル情報も翻訳中のシンボルテーブルに追加す
る。2度目以降であれば追加する必要はない。この過程
はST13〜ST15である。このように繰り返すこと
によって、テンポラリに蓄えられた展開関数情報を有効
に使用することによって、翻訳単位を越えたインライン
展開最適化を実現することができる。
【0017】
【発明の効果】本発明によれば、原始プログラムを実行
可能なオブジェクトプログラムに変換する翻訳システム
におけるインライン展開最適化で、別翻訳単位に定義さ
れた関数をコンパイラの中間段階の表現形式にしてテン
ポラリファイルに保持することで、翻訳をする原始プロ
グラム中で別翻訳単位の関数呼び出しをしている場合、
そのテンポラリファィルをアクセスすることでインライ
ン展開を可能にする。
【図面の簡単な説明】
【図1】本発明の実施例である効率的なインライン展開
を判断する方法を適用したコンパイラを示すブロック
図。
【図2】本発明を適用する場合に原始プログラムをメモ
リ上で表現する方法であるノード木の生成例を示した説
明図。
【図3】図1のコンパイラで用いられる翻訳単位を越え
たインライン展開の第1段階として、テンポラリファイ
ルを作成する例を示したメモリ/ディスク領域の説明
図。
【図4】図1のコンパイラで用いられる翻訳単位を越え
たインライン展開のためのテンポラリ情報ファイルとイ
ンデックステーブルの例を示す説明図。
【図5】図1のコンパイラで用いられる翻訳単位を越え
たインライン展開の第2段階として、テンポラリファィ
ルより情報を入力し、関数の展開を行う例を示すメモリ
/ディスク領域の説明図。
【図6】図1のコンパイラによる翻訳単位を越えたイン
ライン展開のための判断を行う処理のためのフローチャ
ート。
【符号の説明】
1…翻訳用コンピュータ、2…実行用組み込みシステ
ム、3…原始プログラム、4…翻訳システム、5…イン
ライン展開処理用メモリ。
───────────────────────────────────────────────────── フロントページの続き (72)発明者 早川 義則 神奈川県横浜市中区尾上町6丁目81番地 日立ソフトウェアエンジニアリング株式会 社内 (72)発明者 柏木 有吾 東京都小平市上水本町五丁目20番1号 株 式会社日立製作所半導体事業部内

Claims (1)

    【特許請求の範囲】
  1. 【請求項1】関数を呼び出した時に、関数パラメタの設
    定、レジスタの退避回復、分岐、リターン命命の実行時
    間を節約するためのインライン展開において、他の翻訳
    単位にその関数定義が存在する場合でも、それをテンポ
    ラリに残しておくことによって、翻訳時に展開を行うこ
    とを可能にすることを特徴とするインライン展開方法。
JP4443496A 1996-03-01 1996-03-01 インライン展開方法 Pending JPH09237190A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP4443496A JPH09237190A (ja) 1996-03-01 1996-03-01 インライン展開方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP4443496A JPH09237190A (ja) 1996-03-01 1996-03-01 インライン展開方法

Publications (1)

Publication Number Publication Date
JPH09237190A true JPH09237190A (ja) 1997-09-09

Family

ID=12691394

Family Applications (1)

Application Number Title Priority Date Filing Date
JP4443496A Pending JPH09237190A (ja) 1996-03-01 1996-03-01 インライン展開方法

Country Status (1)

Country Link
JP (1) JPH09237190A (ja)

Similar Documents

Publication Publication Date Title
KR930008769B1 (ko) 소프트웨어 프로그램 발생용 장치 및 방법
US20060064682A1 (en) Compiler, compilation method, and compilation program
KR960035260A (ko) 소프트웨어 매크로 호출내에 검출된 에러의 위치를 표시하기 위한 방법 및 장치
JP2000035893A (ja) デ―タ処理システムの配列の静的初期化方法、デ―タ処理方法、並びにデ―タ処理システム及びその制御手順をコンピュ―タに実行させるプログラムを記憶したコンピュ―タ読み取り可能な記憶媒体
JPH06103463B2 (ja) コード生成方法
JP3802058B2 (ja) ソフトウェア・コンパイル・ユニットを条件付きでコンパイルするシステム、方法およびコンパイラ・プリプロセッサ
US6198813B1 (en) System and method for providing call processing services using call independent building blocks
JPH09237190A (ja) インライン展開方法
JP7059757B2 (ja) Api処理方法、端末、api処理プログラム
GB2420638A (en) Method of substituting code fragments in Internal Representation
JPH09274570A (ja) コンパイル方法及びコンパイラシステム
JPH03135630A (ja) 命令スケジューリング方式
JP2002132502A (ja) 言語機能解釈による分散オブジェクト自動生成システム及び方法
JPH0438528A (ja) ソースプログラムのインライン展開方式
JPH0689187A (ja) インライン展開最適化方法
JPH06266562A (ja) オブジェクト指向言語処理システムにおける目的コードサイズ最適化方式
JP3327640B2 (ja) 命令コード選択装置
JP3604936B2 (ja) 最適化方法,最適化装置及び記録媒体
JP2004126739A (ja) 名前解決方法
JP2000207184A (ja) プログラムソ―ス記述再標準化装置
JPH0573335A (ja) プログラムの自動インライン展開方式
JPH06103079A (ja) コンパイル方式
JPH0816402A (ja) ソースコード生成方式
KR20010028697A (ko) 데이터베이스 시스템에서 데이터베이스 어플리케이션 프로세스생성방법
JPS62182843A (ja) 高速コンパイル/リンク方式