JP2001154855A - プログラム変換装置 - Google Patents

プログラム変換装置

Info

Publication number
JP2001154855A
JP2001154855A JP2000257814A JP2000257814A JP2001154855A JP 2001154855 A JP2001154855 A JP 2001154855A JP 2000257814 A JP2000257814 A JP 2000257814A JP 2000257814 A JP2000257814 A JP 2000257814A JP 2001154855 A JP2001154855 A JP 2001154855A
Authority
JP
Japan
Prior art keywords
class
virtual function
function
definition
read
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
JP2000257814A
Other languages
English (en)
Inventor
Hirohisa 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.)
Panasonic Holdings Corp
Original Assignee
Matsushita Electric Industrial 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 Matsushita Electric Industrial Co Ltd filed Critical Matsushita Electric Industrial Co Ltd
Priority to JP2000257814A priority Critical patent/JP2001154855A/ja
Publication of JP2001154855A publication Critical patent/JP2001154855A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】 【課題】 オブジェクト指向言語で記述されたプログラ
ムにおいて、特定の場合の仮想関数呼出しを実行形式プ
ログラムに変換するときに生成される実行形式命令数が
少なくなるようなプログラム変換装置を提供する。 【解決手段】 最適化情報付加装置100は、クラスと
仮想関数と基底クラスとを含むクラス定義と、仮想関数
を呼び出す呼出命令とを含むソースプログラムを記憶
し、他のクラスへ継承されないクラスを検出し、検出さ
れたクラスを含むクラス定義に最適化情報を付加する。
コンパイラ装置110は、ソースプログラムから呼出命
令を読み出し、ソースプログラムに含まれる最適化情報
を用いて、仮想関数が他のクラスにより継承されないク
ラスに属するか否かを判断し、仮想関数を直接呼び出す
実行形式命令群を生成する。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、オブジェクト指向
言語で記述されたソースプログラムを実行形式プログラ
ムに変換するプログラム変換装置に関する。
【0002】
【従来の技術】近年、ソフトウェア開発において、C+
+言語やJava(Javaは、Sun Micros
ystems社の商標)などのオブジェクト指向言語に
よるプログラム開発が頻繁に行なわれるようになってき
ている。C++言語やJavaなどのオブジェクト指向
言語では、変数の集合であるデータ構造と、そのデータ
構造により表現されるデータを用いて処理を行なうルー
チンとの集合を合わせ持つクラスという概念が導入され
ている。C++言語では、前者のデータ構造をデータメ
ンバ、後者のルーチンをメンバ関数と呼んでいる。
【0003】C++言語の規格に基づくクラス定義の一
例として、クラス定義を含むファイル901、902
を、図23に示す。この図に示すように、ファイル90
1は、クラス定義911、912を含んでおり、ファイ
ル902は、クラス定義913を含んでいる。ファイル
901のクラス定義911は、行920〜924を含ん
でいる。行920は、クラス定義の開始を宣言するとと
もに、クラス定義911のクラス名がXであることを示
している。行921は、データメンバの宣言を示してお
り、クラスXはデータメンバとしてint型のメンバx
を持つことを表している。行922〜924は、それぞ
れ、メンバ関数の宣言であり、行922は、クラスXが
引数を持たず、戻り値を返さないメンバ関数fを有して
いることを示し、行923は、クラスXが、int型の
引数を持ちint型の戻り値を返すメンバ関数gを有し
ていることを示し、行924は、クラスXが、int型
の引数を持ち戻り値を返さないメンバ関数hを有してい
ることを示している。
【0004】行923、924において、関数gおよび
関数hの宣言の先頭に記述されている「virtua
l」は、C++言語における予約語であり、この予約語
が指定されているメンバ関数は、仮想関数と呼ばれる特
殊な関数であることを意味する。図23に示す3つのク
ラスX、Y、Zの継承関係を図24に示す。この図に示
すように、クラスXはクラスYによって継承され、クラ
スYはクラスZによって継承されている。このとき、ク
ラスXはクラスYの基底クラスであると言い、クラスY
はクラスXの派生クラスであると言う。同様に、クラス
YはクラスZの基底クラスであり、クラスZはクラスY
の派生クラスであると言う。また、クラスXはクラスZ
によって直接継承されているわけではないが、クラスY
によって間接的に継承されている。このような場合、ク
ラスXをクラスZの間接基底クラス、クラスZをクラス
Xの間接派生クラスと言う場合もある。
【0005】C++言語やJavaなどの言語では、基
底クラスへのポインタに基底クラスのオブジェクトのア
ドレスを代入することにより、基底クラスへのポインタ
が、その基底クラスのオブジェクトを指すようにするこ
ともできる。また、基底クラスへのポインタに派生クラ
スのオブジェクトのアドレスを代入することにより、基
底クラスへのポインタが、派生クラスのオブジェクトを
指すようにすることもできる。例えば、クラスXへのポ
インタが、クラスXのオブジェクトを指すようにするこ
ともできるし、クラスYのオブジェクトを指すようにす
ることもできるし、またクラスZのオブジェクトを指す
ようにすることもできる。同様に、クラスYへのポイン
タが、クラスYのオブジェクトを指すようにすることも
できるし、またクラスZのオブジェクトを指すようにす
ることもできる。
【0006】図25において、行951は、ポインタp
tr_xが指し示すオブジェクトが、クラスX、Y、又
はZの何れかに属することを示し、行952は、ポイン
タptr_yが指し示すオブジェクトが、クラスY又は
Zの何れかに属することを示し、行953は、ポインタ
ptr_zが指し示すオブジェクトが、クラスZに属す
ることを示している。
【0007】このとき、そのポインタが指し示す実体で
あるオブジェクトの型に従って、呼び出される関数が実
行時に動的に決定されるような関数を仮想関数と呼ぶ。
クラスへのポインタが指す実体のオブジェクトの型によ
って、実行される関数が動的に決定される場合のコーデ
ィング例を図26に示す。この図において、行961
は、クラスXへのポインタptr_xを介して関数gを
呼び出すことを示しており、そのポインタptr_xが
クラスXのオブジェクトを指すときには、クラスXの関
数gを実行し、クラスYのオブジェクトを指すときには
クラスYの関数gを実行し、クラスZのオブジェクトを
指すときにはクラスZの関数gを実行する。行962
は、クラスYへのポインタptr_yを介して関数gを
呼び出すことを示しており、そのポインタptr_yが
クラスYのオブジェクトを指すときにはクラスYの関数
gを実行し、クラスZのオブジェクトを指すときにはク
ラスZの関数gを実行する。また、行963は、クラス
Zへのポインタptr_zを介して関数gを呼び出すこ
とを示しており、クラスZの関数gを実行する。
【0008】派生クラスにおける仮想関数の宣言は、図
23の行931、941に示すように、基底クラスで宣
言されている仮想関数と、同じ関数名、引数型、戻り型
で宣言する必要がある。このような特殊な関数呼び出し
を実現するため、クラスに仮想関数が宣言されている場
合は、そのクラスに対して仮想関数表を生成する。仮想
関数表にはそのクラスで宣言されている全ての仮想関数
へのアドレスが格納されている。さらに仮想関数が宣言
されているクラスのオブジェクトは、仮想関数表へのポ
インタをメンバとして保持している。仮想関数表へのポ
インタはコンパイラによって暗黙に生成される。
【0009】仮想関数が宣言されているクラスのオブジ
ェクト及び仮想関数表の構成の一例を図27に示す。図
27(a)において、クラスXのオブジェクト701
「obj_x」において、オブジェクト701「obj
_x」の先頭アドレス、即ち「&obj_x」により示
される領域702には、メンバxが格納され、その次の
アドレス「&obj_x+4」により示される領域70
3には、クラスXの仮想関数表へのポインタが格納され
ている。また、領域703に格納されているクラスXの
仮想関数表へのポインタが示す領域712からは、クラ
スXの仮想関数表711が存在し、クラスXの仮想関数
表711の先頭アドレス、即ち「_vtbl_X」で示
される領域712には、クラスXの仮想関数gへのアド
レスが格納されており、また、その次のアドレス「_v
tbl_X+4」で示される領域713にはクラスXの
仮想関数hへのアドレスが格納されている。
【0010】また、図27(b)において、同様に、ク
ラスYのオブジェクト721「obj_y」は、メンバ
xが格納されている領域722と、クラスYの仮想関数
表へのポインタが格納されている領域723と、メンバ
yが格納されている領域724とから構成され、クラス
Yの仮想関数表731は、クラスYの仮想関数gへのア
ドレスが格納されている領域732と、クラスYの仮想
関数hへのアドレスが格納されている領域733とから
構成されている。
【0011】さらに、図27(c)において、同様に、
クラスZのオブジェクト741「obj_z」は、メン
バxが格納されている領域742と、クラスZの仮想関
数表へのポインタが格納されている領域743と、メン
バyが格納されている領域744と、メンバzが格納さ
れている領域745とから構成され、クラスZの仮想関
数表751は、クラスZの仮想関数gへのアドレスが格
納されている領域752と、クラスZの仮想関数hへの
アドレスが格納されている領域753とから構成されて
いる。
【0012】仮想関数の呼び出しは次のようにして行な
われる。まず最初にオブジェクト内の仮想関数表へのポ
インタを取得する。次に仮想関数表から、呼び出す関数
へのポインタを取得する。最後に関数へのポインタによ
って、関数の間接呼び出しを行なう。上記のような処理
を行なうことによって、クラスXへのポインタがクラス
Xのオブジェクトを指している場合は、仮想関数表への
ポインタがクラスXの仮想関数表を指しているため、ク
ラスXの仮想関数が呼び出される。そうではなく、クラ
スYのオブジェクトを指している場合は、仮想関数表へ
のポインタがクラスYの仮想関数表を指しているため、
クラスYの仮想関数が呼び出される。そうではなく、ク
ラスZのオブジェクトを指している場合は、仮想関数表
へのポインタがクラスZの仮想関数表を指しているた
め、クラスZの仮想関数が呼び出される。
【0013】図28(a)に、C++言語による仮想関
数の呼出しを行うソースプログラム781を示し、図2
8(b)に、ソースプログラム781を基にして生成さ
れた実行形式プログラム791を示す。この図におい
て、行782は、クラスZへのポインタptr_zを介
して関数gを呼び出すことを示しており、行792は、
オブジェクト内の仮想関数表へのポインタの取得を実行
する命令であり、行793は、仮想関数表から呼び出す
関数へのポインタの取得を実行する命令であり、行79
4は、関数への引数値をセットする命令であり、行79
5は、関数の呼出しを行なう命令である。
【0014】一方、図28(a)に示すソースプログラ
ム781に記述されている関数が仮想関数でないと仮定
する場合に、ソースプログラム781を基にして生成さ
れた実行形式プログラム771を図28(c)に示す。
図28(c)において、行772は、関数への引数値を
セットする命令であり、行773は、関数の呼出しを行
なう命令である。
【0015】
【発明が解決しようとする課題】しかしながら、仮想関
数呼出しを実行形式プログラムに変換する場合、仮想関
数でない関数を呼び出す場合と比較すると、生成される
実行形式命令数が多くなるという問題点がある。このた
め、仮想関数呼出しの実行時間が遅くなることがある。
【0016】本発明は、上記の問題点に鑑み、オブジェ
クト指向言語で記述されたプログラムにおいて、特定の
場合の仮想関数呼出しを実行形式プログラムに変換する
ときに生成される実行形式命令数が少なくなるようなプ
ログラム変換装置を提供することを目的とする。
【0017】
【課題を解決するための手段】上記目的を達成するため
に、本発明は、オブジェクト指向言語に基づくソースプ
ログラムから1以上の実行形式命令を生成するプログラ
ム変換装置であって、複数のクラス定義と呼出命令とを
含むソースプログラムを記憶している記憶手段と、前記
呼出命令は、1個の仮想的関数を識別する関数名を含
み、各クラス定義は、クラスと、前記クラスと他のクラ
スとの継承関係と、前記関数名で識別され前記クラスに
属する仮想的関数とを定義し、前記呼出命令の実行時に
複数のクラスで定義される仮想的関数のうち1個の仮想
的関数のみが実行され、前記呼出命令に含まれる関数名
により識別される仮想的関数について、前記複数のクラ
ス定義で定義されている前記複数の仮想的関数のうちの
1個の仮想的関数のみが呼び出されると確定できるか否
かを、前記呼出命令を実行することなく前記ソースプロ
グラムを用いて、判断する判断手段と、前記判断手段に
より確定できると判断される場合に、前記1個の仮想的
関数に対応する実行形式命令群を直接呼び出す実行形式
命令を生成する生成手段とを備えることを特徴とする。
【0018】ここで、前記ソースプログラムに含まれる
各クラス定義を用いて、前記呼出命令に含まれる関数名
により識別される仮想的関数が、他のクラスにより継承
されないクラスに属するか否かを判断することにより、
確定できるか否かを判断し、前記生成手段は、前記判断
手段により、前記呼出命令に含まれる関数名により識別
される仮想的関数が他のクラスにより継承されないクラ
スに属すると判断される場合に、前記実行形式命令を生
成するように構成してもよい。
【0019】ここで、前記プログラム変換装置は、ソー
スプログラムから中間形式プログラムを介して実行形式
プログラムを生成し、前記記憶手段が記憶しているソー
スプログラムにおいて、各クラス定義は、クラス定義に
より定義されているクラスが他のクラスを継承する場合
に、前記他のクラスを示す基底クラスを含み、これによ
り定義されているクラスが他のクラスを継承するか否か
を示し、前記判断手段は、前記ソースプログラムに含ま
れる全てのクラス定義を読み出し、読み出したクラス定
義からクラスを抽出するクラス抽出手段と、前記ソース
プログラムに含まれる全てのクラス定義を読み出し、読
み出したクラス定義から基底クラスを抽出する継承関係
抽出手段と、前記クラス抽出手段により抽出されたクラ
スから、前記継承関係抽出手段により抽出された基底ク
ラスを除いた残りのクラスを抽出する継承関係解析手段
と、前記ソースプログラムに含まれる前記呼出命令か
ら、前記仮想的関数を呼び出す中間形式の呼出命令を生
成する中間形式生成手段と、前記生成された中間形式の
呼出命令に含まれる関数名により識別される仮想的関数
が、前記継承関係解析手段により抽出されたクラスに属
するか否かを判断する中間形式判断手段とを備え、前記
生成手段は、前記中間形式判断手段により、前記クラス
に属すると判断される場合に、前記実行形式命令を生成
するように構成してもよい。
【0020】ここで、前記判断手段は、前記ソースプロ
グラムに含まれるクラス定義を用いて、前記呼出命令に
含まれる関数名により識別される仮想的関数の置き換え
が行われるか否かを判断することにより、確定できるか
否かを判断し、前記生成手段は、前記判断手段により置
き換えが行われないと判断される場合に、前記実行形式
命令を生成するように構成してもよい。
【0021】ここで、前記プログラム変換装置は、前記
ソースプログラムから中間形式プログラムを介して実行
形式プログラムを生成し、前記記憶手段が記憶している
ソースプログラムにおいて、各クラス定義は、定義され
ているクラスが他のクラスを継承する場合に、前記他の
クラスを示す基底クラスを含み、これにより定義されて
いるクラスが他のクラスを継承するか否かを示し、前記
判断手段は、前記ソースプログラムに含まれる全てのク
ラス定義を読み出し、読み出したクラス定義を用いて、
置き換えの行われる仮想的関数を抽出する置換関数抽出
手段を含み、前記置換関数抽出手段は、前記ソースプロ
グラムに含まれるクラス定義を読み出し、読み出したク
ラス定義に基底クラスが含まれているか否かを判断する
読出判断部と、読み出したクラス定義に基底クラスが含
まれない場合に、前記クラス定義に含まれている仮想的
関数を、読み出したクラス定義により定義されているク
ラスに属する仮想的関数であると決定する第1決定部
と、読み出したクラス定義に基底クラスが含まれる場合
に、基底クラスに属すると決定された仮想的関数を、読
み出したクラス定義により定義されているクラスに属す
る仮想的関数であると仮に決定し、読み出した前記クラ
ス定義に含まれている仮想的関数が、前記仮に決定され
た仮想的関数と一致するか否かを判断し、一致すると判
断する場合に、仮に決定された仮想的関数の代わりに、
読み出した前記クラス定義に含まれている仮想的関数
を、読み出した前記クラス定義により定義されているク
ラスに属する仮想的関数であると決定し、前記仮に決定
された仮想的関数を置き換えの行われる仮想的関数とし
て抽出する第2決定部と、前記ソースプログラムに含ま
れる前記呼出命令から、前記仮想的関数を識別する関数
名を含む中間形式の呼出命令を生成する中間形式生成手
段と、前記生成された中間形式の呼出命令に含まれる関
数名により識別される仮想的関数が、置き換えの行われ
る仮想的関数であるか否かを判断する中間形式判断手段
とを含み、前記生成手段は、前記中間形式判断手段によ
り、置き換えの行われる仮想的関数であると判断される
場合に、前記実行形式命令を生成するように構成しても
よい。
【0022】
【発明の実施の形態】I 第1の実施の形態 本発明に係る1つの実施の形態としてのプログラム変換
装置120について説明する。プログラム変換装置12
0は、図1に示すように最適化情報付加装置100とコ
ンパイラ装置110とから構成される。 1.最適化情報付加装置100 ここでは、最適化情報付加装置100について説明す
る。 1.1 最適化情報付加装置100の構成 最適化情報付加装置100は、図2に示すように、プロ
グラム記憶部11、入力部12、未読ファイル集合記憶
部13、クラス定義抽出部14、全クラス定義集合記憶
部15、クラス定義ファイル記憶部16、継承関係抽出
部17、被継承クラス集合記憶部18、継承関係解析部
19、終端クラス集合記憶部20、最適化情報付加部2
1、変更ファイル集合記憶部22、出力部23から構成
されている。 (プログラム記憶部11)プログラム記憶部11は、C
++言語の規格に基づいて記述されたソースプログラム
をデータとして含むファイルを記憶している。
【0023】プログラム記憶部11が記憶しているファ
イルの一例を図3に示す。この図に示すように、プログ
ラム記憶部11は、ファイル201、202及び203
を記憶している。ファイル201、202、203のフ
ァイル名は、それぞれ、「filex.h」、「fil
ey.h」、「filez.cc」である。ファイル2
01は、クラス定義211を含む。ファイル202は、
#include行221とクラス定義222とを含
む。ファイル203は、#include行231とク
ラス定義232と関数定義233とを含む。
【0024】ここで、クラス定義は、クラスの定義の開
始を意味する「class」、クラス名、基底クラスの
クラス名、データメンバの定義、メンバ関数の定義など
から構成される。クラス定義の詳細については、C++
言語の規格として公知であるので、詳しい説明は省略す
る。また、#include行は、#include行
の開始を意味する「#include」とファイル名と
から構成され、#include行を、前記ファイル名
の内容と置き換えることを意味する制御行である。 (入力部12)入力部12は、操作者による文字列の入
力を受け付け、入力を受け付けた文字列を表示する。操
作者が入力する文字列は、1個のコマンド名と少なくと
も1個のファイル名を含む。入力部12が入力を受け付
けた文字列を表示する様子を図4に一例として示す。入
力部12は、画面301に、操作者が入力した文字列3
02「run filez.cc」を表示する。
【0025】入力部12が操作者による文字列の入力を
受け付けると、入力部12は、入力を受け付けた文字列
を分解して1個のコマンド名と少なくとも1個のファイ
ル名とを生成し、コマンド名が「run」であるなら、
以下に示す入力処理を実行し、コマンド名が「run」
でないなら、生成されたコマンド名に誤りがある旨の表
示をし、再度操作者による文字列の入力を待つ。図4に
示す例の場合、入力部12は、文字列「run fil
ez.cc」の入力を受け付け、入力を受け付けた文字
列「run filez.cc」を分解して、コマンド
名「run」と、ファイル名「filez.cc」とを
生成し、コマンド名が「run」であるので、以下に示
す入力処理を実行する。
【0026】ここで、操作者は、少なくとも1個のファ
イルのファイル名を入力する。前記ファイル内で定義さ
れているクラス定義が基底クラスを含む場合には、操作
者は、さらに、前記基底クラスをクラスとして定義する
クラス定義を含むファイルのファイル名も入力する。以
下、操作者は、ファイルが基底クラスを含まなくなるま
で、同様にしてファイル名を入力する。また、派生クラ
スについても同様である。
【0027】入力部12は、前記生成された少なくとも
1個のファイル名を有する少なくとも1個のファイルを
プログラム記憶部11から読み出し、読み出した少なく
とも1個のファイルを同じファイル名を用いて未読ファ
イル集合記憶部13へ書き込む。入力部12により未読
ファイル集合記憶部13へ書き込まれた少なくとも1個
のファイルからなる集合を、未読ファイル集合TFと呼
ぶ。
【0028】図4に示す例の場合、入力部12は、ファ
イル名「filez.cc」を有するファイルをプログ
ラム記憶部11から読み出し、読み出したファイルをそ
のファイル名を「filez.cc」として未読ファイ
ル集合記憶部13へ書き込む。未読ファイル集合TF
は、ファイル名「filez.cc」を有するファイル
を含む。ここで、このファイル名「filez.cc」
を有するファイルの内容は、図3に示すファイル203
と同じである。
【0029】入力部12は、未読ファイル集合記憶部1
3に記憶されているファイルを1個ずつ順に読み出す。
ここで、読み出すファイルをf1とする。入力部12
は、読み出したファイルf1とそのファイル名とをクラ
ス定義抽出部14へ出力する。上記の例の場合、入力部
12は、未読ファイル集合記憶部13からファイル名
「filez.cc」を有するファイルを読み出し、読
み出したファイルとそのファイル名「filez.c
c」とをクラス定義抽出部14へ出力する。
【0030】入力部12は、前記読み出したファイルf
1内に、#include行が含まれているかどうかを
判断し、#include行が含まれていると判断する
場合に、前記#include行を構成しているファイ
ル名を取得し、取得したファイル名と同じファイル名を
有するファイルf2をプログラム記憶部11から読み出
し、読み出したファイルf2を同じファイル名を用いて
未読ファイル集合記憶部13へ書き込む。
【0031】上記の例の場合、入力部12は、ファイル
203内に、#include行231が含まれている
と判断し、#include行231を構成しているフ
ァイル名「filey.h」を取得し、「filey.
h」と同じファイル名を有するファイルf2をプログラ
ム記憶部11から読み出し、読み出したファイルf2を
ファイル名「filey.h」を用いて未読ファイル集
合記憶部13へ書き込む。
【0032】入力部12は、未読ファイル集合から読み
出したファイルf1を削除する。入力部12は、未読フ
ァイル集合記憶部13に記憶されている全てのファイル
の読み出しが終了するまで、前記の未読ファイル集合記
憶部13に記憶されているファイルf1の読み出しと、
前記読み出したファイルf1内に、#include行
が含まれているかどうかの判断と、#include行
が含まれていると判断する場合に、前記#includ
e行を構成しているファイル名の取得と、取得したファ
イル名と同じファイル名を有するファイルf2のプログ
ラム記憶部11からの読出しと、読み出したファイルf
2の未読ファイル集合記憶部13への書込みとファイル
f1の削除とを繰り返す。
【0033】入力部12は、未読ファイル集合記憶部1
3に記憶されている全てのファイルについて、前記の繰
り返しが終了すると、継承関係解析部19へ動作指示を
出力する。 (未読ファイル集合記憶部13)未読ファイル集合記憶
部13は、入力部12により読み出されたファイルを記
憶する。 (クラス定義抽出部14)クラス定義抽出部14は、入
力部12からファイルf1とそのファイル名とを受け取
り、ファイルf1内に定義されている全てのクラス定義
を取得する。取得したクラス定義からなる集合をクラス
定義集合DSETと呼び、クラス定義集合DSETに含
まれる各クラス定義を要素Eと呼ぶこととする。クラス
定義抽出部14は、クラス定義集合DSETを継承関係
抽出部17へ出力する。
【0034】上記の例の場合、図5に示すように、クラ
ス定義抽出部14は、ファイル「filez.cc」内
に定義されているクラス定義232を取得し、取得した
クラス定義を要素Eとして含むクラス定義集合DSET
420を継承関係抽出部17へ出力する。この例におい
ては、クラス定義集合DSET420は、1つのクラス
定義421のみを含んでいる。ファイルf1内に複数の
クラス定義が含まれていれば、クラス定義集合DSET
は、複数のクラス定義を含むことになる。
【0035】次に、クラス定義抽出部14は、クラス定
義集合DSETの各要素Eのクラス名と、要素Eが定義
されている前記ファイルf1のファイル名との組をクラ
ス定義ファイル記憶部16へ書き込む。上記の例の場
合、クラス定義抽出部14は、クラス名「Z」とファイ
ル名「filez.cc」との組をクラス定義ファイル
記憶部16へ書き込む。
【0036】さらに、クラス定義抽出部14は、クラス
定義集合DSETの各要素Eが、全クラス定義集合記憶
部15が有する全クラス定義集合TSETに含まれてい
るか否かを判断し、全クラス定義集合TSETに含まれ
ていないと判断する場合に、要素Eを全クラス定義集合
TSETに書き込む。上記の例の場合、クラス定義抽出
部14は、クラス定義集合DSETに含まれる要素Eと
しての「Z」のクラス名を有するクラス定義が、全クラ
ス定義集合記憶部15に記憶されているか否かを判断
し、全クラス定義集合記憶部15に記憶されていないと
判断する場合には、要素Eとしての「Z」のクラス名を
有するクラス定義を全クラス定義集合TSETに書き込
む。 (全クラス定義集合記憶部15)全クラス定義集合記憶
部15は、全クラス定義集合TSETを有する。全クラ
ス定義集合TSETは、クラス定義を含む。
【0037】全クラス定義集合TSETの一例を、図6
に示す。この図の全クラス定義集合TSET410は、
クラス定義411、412及び413を含む。クラス定
義411、412及び413は、それぞれそのクラス名
が「X」、「Y」、「Z」である。 (クラス定義ファイル記憶部16)クラス定義ファイル
記憶部16は、クラス定義ファイルを有しており、クラ
ス定義ファイルは、クラス名とファイル名との組を含ん
でいる。
【0038】クラス定義ファイルの一例を図7に示す。
この図に示すように、クラス定義ファイル400は、ク
ラス名とファイル名との組401、402、403を含
んでいる。組401は、クラス名「X」とファイル名
「filex.h」とからならなり、組402は、クラ
ス名「Y」とファイル名「filey.h」とからなら
なり、組403は、クラス名「Z」とファイル名「fi
lez.cc」とからならなる。 (継承関係抽出部17)継承関係抽出部17は、クラス
定義抽出部14からクラス定義集合DSETを受け取
る。
【0039】継承関係抽出部17は、前記受け取ったク
ラス定義集合DSETにクラス定義が含まれているか否
かを判断し、クラス定義が含まれていなければ、処理を
終了する。クラス定義が含まれていれば、継承関係抽出
部17は、クラス定義集合DSETから1つのクラス定
義C1を取得し、クラス定義C1により定義されるクラ
スが他のクラスを継承しているか否かを判断する。
【0040】クラス定義C1により定義されるクラスが
他のクラスを継承しているか否かの判断は、クラス定義
中に、基底クラスのクラス名が含まれているか否かを見
ることにより行う。基底クラスのクラス名が含まれてい
るときは、他のクラスを継承しており、基底クラスのク
ラス名が含まれていないときは、他のクラスを継承して
いないと判断する。
【0041】継承関係抽出部17が、クラス定義C1に
より定義されるクラスが他のクラスを継承していると判
断する場合は、クラス定義C1内で基底クラスとして定
義されているクラスのクラス名を被継承クラス集合記憶
部18が有する被継承クラス集合ISETへ書き込む。
次に、継承関係抽出部17は、前記受け取ったクラス定
義集合DSETから取得したクラス定義C1を削除す
る。
【0042】継承関係抽出部17は、クラス定義集合D
SETにクラス定義が含まれなくなるまで、クラス定義
集合DSETから1つのクラス定義C1の取得と、クラ
ス定義C1により定義されるクラスが他のクラスを継承
しているか否かの判断と、クラス定義C1により定義さ
れるクラスが他のクラスを継承していると判断する場合
のクラス定義C1内で基底クラスとして定義されている
クラスのクラス名の被継承クラス集合ISETへの書込
みと、クラス定義C1の削除とを繰り返す。 (被継承クラス集合記憶部18)被継承クラス集合記憶
部18は、被継承クラス集合ISETを有している。被
継承クラス集合ISETは、クラス名を含んでいる。
【0043】被継承クラス集合ISETの一例として、
図8に被継承クラス集合ISET430を示す。被継承
クラス集合ISET430は、クラス名431「X」を
含んでいる。 (継承関係解析部19)継承関係解析部19は、入力部
12から動作指示を受け取る。
【0044】継承関係解析部19が入力部12から動作
指示を受け取る時点において、全クラス定義集合記憶部
15が有する全クラス定義集合TSETは、入力部12
が入力を受け付けた全てのファイル及びこれらのファイ
ルのincludeファイルに含まれる全てのクラス定
義を含んでいる。また、被継承クラス集合記憶部18が
有する被継承クラス集合ISETは、入力部12が入力
を受け付けた全てのファイル及びこれらのinclud
eファイルに含まれる全てのクラス定義のうち、他のい
ずれかのクラスにより継承されている全てのクラス定義
のクラス名を含んでいる。ここで、ファイルのincl
udeファイルは、ファイルに#include行が含
まれる場合に、前記#include行を構成するファ
イル名により示される2次ファイルである。さらに、前
記2次ファイルに#include行が含まれる場合
に、前記2次ファイルに含まれる#include行を
構成するファイル名により示される3次ファイルであ
る。以下同様である。
【0045】継承関係解析部19が動作指示を受け取る
と、継承関係解析部19は、全クラス定義集合記憶部1
5が有する全クラス定義集合TSETに含まれている全
てのクラス定義を読み出し、被継承クラス集合記憶部1
8が有する被継承クラス集合ISETに含まれている全
てのクラス名を読み出す。次に、継承関係解析部19
は、読み出した全クラス定義集合TSETに含まれてい
る全てのクラス定義から、読み出した被継承クラス集合
ISETに含まれている全てのクラス名で示されるクラ
ス定義を削除する。残ったクラス定義を終端クラス集合
FSETと呼ぶ。
【0046】継承関係解析部19は、終端クラス集合F
SETを終端クラス集合記憶部20へ書き込む。 (終端クラス集合記憶部20)終端クラス集合記憶部2
0は、終端クラス集合FSETを記憶する。終端クラス
集合FSETは、クラス定義を含む。 (最適化情報付加部21)最適化情報付加部21は、終
端クラス集合記憶部20が有する終端クラス集合FSE
Tにクラス定義が含まれていないかどうかを判断する。
クラス定義が含まれていない場合は、処理を終了する。
【0047】クラス定義が含まれている場合は、最適化
情報付加部21は、終端クラス集合FSETから1つの
クラス定義C2を読み出し、クラス定義C2に含まれる
クラス名を取得する。次に、前記取得したクラス名に対
応するファイル名をクラス定義ファイル記憶部16が有
するクラス定義ファイルから読み出し、読み出したファ
イル名により示されるファイルf3をプログラム記憶部
11から読み出す。
【0048】最適化情報付加部21は、ファイルf3内
に記録されているクラス定義の前に最適化情報として、
文字列「#pragma _finalclass」
と、前記取得したクラス名とから構成される文字列を挿
入し、最適化情報が挿入されたファイルf3を、前記読
み出したファイル名と同じファイル名を用いて、変更フ
ァイル集合記憶部22へ書き込む。
【0049】最適化情報付加部21は、終端クラス集合
から前記読み出したクラス定義C2を削除する。最適化
情報付加部21は、終端クラス集合FSETにクラス定
義が含まれなくなるまで、クラス定義C2の読出しと、
ファイル名の読出しと、ファイルf3の読出しと、最適
化情報の挿入と、ファイルf3の変更ファイル集合記憶
部22へ書込みと、クラス定義C2の削除とを繰り返
す。 (変更ファイル集合記憶部22)変更ファイル集合記憶
部22は、最適化情報が挿入されたファイルを記憶す
る。 (出力部23)出力部23は、変更ファイル集合記憶部
22に記憶されている各ファイルを読み出し、読み出し
たファイルをプログラム記憶部11に記憶されている同
じファイル名のファイルと置き換える。このとき、出力
部23は、元々プログラム記憶部11に記憶されている
同じファイル名のファイルを、バックアップ用のファイ
ルとして別のファイル名に変更する。
【0050】プログラム記憶部11に記憶されているフ
ァイルの一例を図9に示す。この図に示すように、プロ
グラム記憶部11は、ファイル201、202a、20
3aを記憶している。ファイル202a、203aは、
出力部23により置き換えられたファイルである。ファ
イル202aにおける行223及びファイル203aに
おける行234が、最適化情報付加部21により挿入さ
れた最適化情報である。
【0051】行223は、「#pragma _fin
alclass」と「Y」とから構成され、行224
は、「#pragma _finalclass」と
「Z」とから構成される。 1.2 最適化情報付加装置100の動作 最適化情報付加装置100の動作について説明する。 (最適化情報付加装置100の全体の動作)最適化情報
付加装置100の全体の動作について、図10に示すフ
ローチャートを用いて説明する。
【0052】入力部12は、操作者による文字列の入力
を受け付け、前記入力を受け付けた文字列に含まれるフ
ァイル名を有するファイルをプログラム記憶部11から
読み出し、読み出したファイルを同じファイル名を用い
て未読ファイル集合記憶部13へ書き込む(ステップS
101)。入力部12は、未読ファイル集合記憶部13
に記憶されているファイルf1を読み出し(ステップS
102)、入力部12が未読ファイル集合記憶部13の
全てのファイルの読出しを終了したならば(ステップS
103)、継承関係解析部19は、継承関係解析処理を
実行し(ステップS112)、最適化情報付加部21
は、最適化情報付加処理を実行し(ステップS11
3)、出力部23は、変更ファイル集合記憶部22に記
憶されている各ファイルを読み出し、プログラム記憶部
11に記憶されている同じファイル名のファイルを読み
出したファイルに置き換え(ステップS114)、処理
を終了する。
【0053】入力部12は、未読ファイル集合記憶部1
3の全てのファイルの読出しを終了していないならば
(ステップS103)、読み出したファイルf1とその
ファイル名とをクラス定義抽出部14へ出力し(ステッ
プS119)、前記読み出したファイルf1内に、#i
nclude行が含まれているかどうかを判断し、#i
nclude行が含まれていると判断する場合に(ステ
ップS104)、前記#includeを構成するファ
イル名を取得し、取得したファイル名と同じファイル名
を有するファイルf2をプログラム記憶部11から読み
出し、読み出したファイルf2を同じファイル名を用い
て未読ファイル集合記憶部13へ書き込む(ステップS
105)。
【0054】次に、クラス定義抽出部14は、クラス定
義抽出処理を実行する(ステップS106)。継承関係
抽出部17は、クラス定義抽出部14からクラス定義集
合DSETを受け取り、クラス定義集合DSETにクラ
ス定義が含まれているか否かを判断し、クラス定義が含
まれていなければ(ステップS107)、未読ファイル
集合からファイルf1を削除し(ステップS115)、
ステップS102へ制御を戻し、未読ファイル集合の全
てのファイルの読出しが終了するまで、上記処理を繰り
返す。
【0055】クラス定義が含まれていれば(ステップS
107)、継承関係抽出部17は、クラス定義集合DS
ETから1つのクラス定義C1を取得する(ステップS
108)。クラス定義C1により定義されるクラスが他
のクラスを継承しているか否かを判断し、クラス定義C
1により定義されるクラスが他のクラスを継承している
と判断する場合は(ステップS109)、クラス定義C
1内で基底クラスとして定義されているクラスのクラス
名を被継承クラス集合記憶部18が有する被継承クラス
集合ISETへ書き込む(ステップS110)。次に、
継承関係抽出部17は、クラス定義集合DSETに含ま
れるクラス定義C1を削除し(ステップS111)、制
御をステップS107へ戻し、継承関係抽出部17は、
クラス定義集合DSETにクラス定義が含まれなくなる
まで、上記処理を繰り返す。 (クラス定義抽出部14の動作)クラス定義抽出部14
の動作について、図11に示すフローチャートを用いて
説明する。
【0056】クラス定義抽出部14は、入力部12から
ファイルf1とそのファイル名とを受け取り、ファイル
f1内に定義されている全てのクラス定義を取得し、ク
ラス定義集合DSETを生成し、生成したクラス定義集
合DSETを継承関係抽出部17へ出力する(ステップ
S121)。次に、クラス定義抽出部14は、クラス定
義集合DSETの各要素Eのクラス名と、要素Eが定義
されている前記ファイルf1のファイル名との組をクラ
ス定義ファイル記憶部16へ書き込む(ステップS12
2)。
【0057】さらに、クラス定義抽出部14は、クラス
定義集合DSETから1つの要素Eを取得し(ステップ
S123)、取得が終了していれば(ステップS12
4)、処理を終了する。取得が終了していなければ(ス
テップS124)、クラス定義抽出部14は、要素Eが
全クラス定義集合TSETに含まれているか否かを判断
し、全クラス定義集合TSETに含まれていないと判断
する場合に(ステップS125)、要素Eを全クラス定
義集合TSETに書き込む(ステップS126)。次
に、制御をステップS123へ移し、要素Eの取得が終
了するまで、上記を繰り返す。 (継承関係解析部19の動作)継承関係解析部19の動
作について、図12に示すフローチャートを用いて説明
する。
【0058】継承関係解析部19が動作指示を受け取る
と、継承関係解析部19は、全クラス定義集合記憶部1
5が有する全クラス定義集合TSETに含まれている全
てのクラス定義を読み出し(ステップS131)、被継
承クラス集合記憶部18が有する被継承クラス集合IS
ETに含まれている全てのクラス名を読み出す(ステッ
プS132)。次に、継承関係解析部19は、読み出し
た全クラス定義集合TSETに含まれている全てのクラ
ス定義から、読み出した被継承クラス集合ISETに含
まれている全てのクラス名で示されるクラス定義を削除
して、終端クラス集合FSETを生成し、生成した終端
クラス集合FSETを終端クラス集合記憶部20へ書き
込む(ステップS133)。 (最適化情報付加部21の動作)最適化情報付加部21
の動作について、図13に示すフローチャートを用いて
説明する。
【0059】最適化情報付加部21は、終端クラス集合
記憶部20が有する終端クラス集合FSETにクラス定
義が含まれていないかどうかを判断し、クラス定義が含
まれていない場合は(ステップS141)、処理を終了
する。クラス定義が含まれている場合は(ステップS1
41)、最適化情報付加部21は、終端クラス集合FS
ETから1つのクラス定義C2を読み出し、クラス定義
C2に含まれるクラス名を取得し(ステップS14
2)、前記取得したクラス名に対応するファイル名をク
ラス定義ファイル記憶部16が有するクラス定義ファイ
ルから読み出し(ステップS143)、読み出したファ
イル名により示されるファイルf3をプログラム記憶部
11から読み出し(ステップS144)、ファイルf3
内のクラス定義の前の行に最適化情報を挿入し(ステッ
プS145)、最適化情報が挿入されたファイルf3を
変更ファイル集合記憶部22へ書き込み(ステップS1
46)、終端クラス集合の前記読み出したクラス定義C
2を削除し(ステップS147)、ステップS141へ
制御を移し、終端クラス集合FSETにクラス定義が含
まれなくなるまで、処理を繰り返す。 2.コンパイラ装置110 ここでは、コンパイラ装置110について説明する。 2.1 コンパイラ装置110の構成 コンパイラ装置110は、図14に示すように、プログ
ラム記憶部11、入力部31、第1記憶部32、構文解
析部33、第2記憶部34、終端クラス記憶部35、中
間コード生成部36、第3記憶部37、最適化部38、
第4記憶部39、資源割付部40、第5記憶部41、コ
ード生成部42、生成コード記憶部43から構成され
る。 (プログラム記憶部11)プログラム記憶部11は、最
適化情報付加装置100のプログラム記憶部11と同じ
であり、C++言語の規格に基づいて記述されたソース
プログラムをデータとして含むファイルを記憶してい
る。これらのファイルは、最適化情報付加装置100に
より最適化情報が付加されているファイルを含む。 (入力部31)入力部31は、入力部12と同様に、操
作者による文字列の入力を受け付け、入力を受け付けた
文字列を分解して、1個のコマンド名と少なくとも1個
のファイル名とを生成し、前記生成した少なくとも1個
のファイル名を有する少なくとも1個のファイルをプロ
グラム記憶部11から読み出す。
【0060】入力部31は、読み出した少なくとも1個
のファイルに#include行が含まれているなら
ば、#include行を構成するファイル名と同じフ
ァイル名を有するファイルをプログラム記憶部11から
読み出し、前記#include行を読み出したファイ
ルの内容と置き換える。読み出したファイル内に#in
clude行が含まれているならば、さらに置換えを行
う。#include行がファイル内に含まれなくなる
まで、前記置換えを繰り返す。
【0061】入力部31は、前記置換えの行われたファ
イルを含む前記少なくとも1個のファイルを第1記憶部
32へ書き込む。一例として、ファイル名「file
z.cc」が入力部12により生成されたならば、プロ
グラム記憶部11からファイル「filez.cc」を
読み出し、ファイル「filez.cc」に含まれる#
include行を構成するファイル名「filey.
h」と同じファイル名を有するファイルをプログラム記
憶部11から読み出し、前記#include行を読み
出したファイルの内容に置き換える。以上のようにして
ファイル「filez.cc」の中に、「filey.
h」、「filex.h」が置き換えられたプログラム
が得られる。 (第1記憶部32)第1記憶部32は、入力部31によ
り置換えの行われたファイルを含む少なくとも1個のフ
ァイルを記憶する。 (構文解析部33)構文解析部33は、第1記憶部32
に記憶されている全てのファイルについて、以下に示す
構文解析処理を繰り返す。
【0062】構文解析部33は、第1記憶部32に記憶
されている各ファイルから、字句を読み出す。ここで、
字句とは、プログラムを構成し、構文上の基本単位とな
る文字列である。例えば、予約語などの識別子、定数、
演算子などである。構文解析部33は、読み出した字句
が「#pragma」であり、「#pragma」に続
く字句が「_finalclass」である場合、「_
finalclass」に続く字句を終端クラスを示す
クラス名として、終端クラス記憶部35が有する終端ク
ラステーブルへ書き込む。終端クラステーブルの一例を
図15に示す。この図に示す終端クラステーブル501
は、終端クラス502「Y」と終端クラス503「Z」
とを記憶している。
【0063】構文解析部33は、読み出した字句が「#
pragma」であり、「#pragma」に続く字句
が「_finalclass」でない場合、又は読み出
した字句が「#pragma」でない場合、通常の構文
解析を行い、解析結果を第2記憶部34へ書き込む。な
お、通常の構文解析については、公知であるので、説明
を省略する。
【0064】構文解析部33は、第1記憶部32に記憶
されている各ファイルから、字句の読出しを終了するま
で、上記の終端クラステーブルへの書込み、又は通常の
構文解析及び解析結果の第2記憶部34への書込みを、
繰り返す。 (第2記憶部34)第2記憶部34は、構文解析部33
による解析結果を記憶する。 (終端クラス記憶部35)終端クラス記憶部35は、終
端クラステーブルを有している。終端クラステーブル
は、クラス名を含んでいる。 (中間コード生成部36)中間コード生成部36は、第
2記憶部34に記憶されている構文解析部33による解
析結果を読み出し、読み出した解析結果を基にして、内
部表現のコードである中間コードを生成し、生成した中
間コードを第3記憶部37へ書き込む。
【0065】中間コード生成部36は、第2記憶部34
に記憶されている全ての解析結果の読出しが終了するま
で、解析結果の読出しと、中間コードの生成と、第3記
憶部37への書込とを繰り返す。なお、解析結果を基に
した中間コードの生成については公知であるので、説明
を省略する。
【0066】中間コードの一例を図16に示す。この図
において、中間コード521、531、541は、それ
ぞれ図3に示す関数呼出し234a、235a、236
aを基にして生成されたものである。中間コード521
は、コマンド名522「CALL」、関数名523
「g」、仮想関数フラグ524「virtual」、オ
ブジェクト名525「obj_x」、クラス型526
「X」、引数型527「int」、引数値528「1
0」から構成されている。中間コード531は、コマン
ド名532「CALL」、関数名533「g」、仮想関
数フラグ534「virtual」、オブジェクト名5
35「obj_y」、クラス型536「Y」、引数型5
37「int」、引数値538「10」から構成されて
いる。中間コード541は、コマンド名542「CAL
L」、関数名543「g」、仮想関数フラグ544「v
irtual」、オブジェクト名545「obj_
z」、クラス型546「Z」、引数型547「in
t」、引数値548「10」から構成されている。
【0067】中間コード521において、コマンド名5
22「CALL」は、中間コード521が関数呼出しで
あることを示し、関数名523「g」は、呼び出される
関数名を示し、仮想関数フラグ524「virtua
l」は、呼び出される関数が仮想関数であることを示
し、オブジェクト名525「obj_x」は、呼び出さ
れる関数の起動オブジェクト名を示し、クラス型526
「X」は、前記オブジェクトのクラス型を示し、引数型
527「int」は、関数の引数の型を示し、引数値5
28「10」は、関数の引数値を示している。
【0068】中間コード531、541においても同様
である。 (第3記憶部37)第3記憶部37は、中間コード生成
部36により生成された中間コードを記憶する。 (最適化部38)最適化部38は、第3記憶部37に記
憶されている中間コードを読み出し、読み出した中間コ
ードのコマンド名が関数呼出しであるか否か及び、仮想
関数フラグがvirtualであるか否かを判断する。
【0069】最適化部38は、読み出した中間コードの
コマンド名が関数呼出しであることを示す「CALL」
であり、仮想関数フラグがvirtualである場合、
前記読み出した中間コードに含まれるクラス型が終端ク
ラス記憶部35が有する終端クラステーブル内に存在す
るか否かを判断し、終端クラステーブル内に存在するな
らば、前記読み出した中間コードに含まれる仮想関数フ
ラグを関数が仮想関数でないことを示す「real」に
書き換え、前記中間コードを第4記憶部39に書き込
む。
【0070】最適化部38は、読み出した中間コードの
コマンド名が関数呼出しであることを示す「CALL」
でない場合、又は、読み出した中間コードのコマンド名
が関数呼出しであることを示す「CALL」であり、仮
想関数フラグがvirtualである場合であって、前
記読み出した中間コードに含まれるクラス型が終端クラ
ス記憶部35が有する終端クラステーブル内に存在しな
い場合、前記中間コードに対して通常の最適化処理を施
し、通常の最適化処理の施された中間コードを第4記憶
部39に書き込む。
【0071】最適化部38は、第3記憶部37に記憶さ
れている全ての中間コードの読出しが終了するまで、中
間コードの読出しと、仮想関数フラグの書換え又は通常
の最適化処理と、第4記憶部39への書込みとを繰り返
す。なお、通常の最適化処理については、公知であるの
で、説明を省略する。 (第4記憶部39)第4記憶部39は、最適化部38に
より最適化処理の施された中間コードを記憶する。 (資源割付部40)資源割付部40は、第4記憶部39
に記憶されている中間コードを読み出し、読み出した中
間コードのオペランドに対してハードウェア資源の割付
けを行い、ハードウェア資源の割付けの行われた中間コ
ードを第5記憶部41に書き込む。
【0072】資源割付部40は、第4記憶部39に記憶
されている全ての中間コードの読出しが終了するまで、
中間コードの読出しと、ハードウェア資源の割付けと、
第5記憶部41への書込みとを繰り返す。なお、ハード
ウェア資源の割付け処理については公知であるので、説
明を省略する。 (第5記憶部41)第5記憶部41は、資源割付部40
によりハードウェア資源の割付けの行われた中間コード
を記憶する。 (コード生成部42)コード生成部42は、第5記憶部
41に記憶されている中間コードを読み出し、読み出し
た中間コードのコマンド名が関数呼出しであるか否かを
判断する。
【0073】コード生成部42は、読み出した中間コー
ドのコマンド名が関数呼出しであることを示す「CAL
L」である場合、さらに、前記読み出した中間コードに
含まれる仮想関数フラグが「virtual」であるか
否かを判断する。仮想関数フラグが「virtual」
であるとき、仮想関数表のアドレスをセットする実行形
式命令を生成し、仮想関数のアドレスをセットする実行
形式命令を生成し、引数の値をセットする実行形式命令
を生成し、仮想関数へジャンプする実行形式命令を生成
する。仮想関数フラグが「virtual」でないと
き、引数の値をセットする実行形式命令を生成し、関数
へ直接ジャンプする実行形式命令を生成する。コード生
成部42は、生成した実行形式命令を生成コード記憶部
43へ書き込む。
【0074】コード生成部42は、読み出した中間コー
ドのコマンド名が関数呼出しであることを示す「CAL
L」でない場合、関数呼出し以外の通常のコード生成処
理を行って実行形式命令を生成し、生成した実行形式命
令を生成コード記憶部43へ書き込む。コード生成部4
2は、第5記憶部41に記憶されている全ての中間コー
ドの読出しが終了するまで、中間コードの読出しと、関
数呼出しである場合の実行形式命令の生成又は関数呼出
しでない場合の通常のコード生成処理による実行形式命
令の生成と、生成コード記憶部43へ書込みとを繰り返
す。
【0075】なお、通常のコード生成処理については公
知であるので、説明を省略する。コード生成部42によ
り生成された実行形式プログラムの一例を、図17に示
す。この図において、実行形式プログラム560は、図
3に示すソースプログラム233を基にして生成された
ものである。ソース命令234における関数gは、仮想
関数である。一方、及びソース命令235における関数
g及びソース命令236における関数gは、直接呼出し
を行う関数である。
【0076】ソース命令234は、実行形式命令群56
1に対応し、ソース命令235は、実行形式命令群57
1に対応し、ソース命令236は、実行形式命令群58
7に対応している。実行形式命令群561は、実行形式
命令562〜566から構成されている。実行形式命令
562により、仮想関数表のアドレスをセットし、実行
形式命令563により、仮想関数のアドレスをセット
し、実行形式命令564により、引数の値をセットし、
実行形式命令565により、仮想関数へジャンプする。
実行形式命令566は、仮想関数のリターン値をセット
する。
【0077】実行形式命令群571は、実行形式命令5
72、573を含む。実行形式命令572により、引数
の値をセットし、実行形式命令573により、関数へ直
接ジャンプする。実行形式命令群587は、実行形式命
令588、589から構成されている。実行形式命令5
88により、引数の値をセットし、実行形式命令589
により、関数へ直接ジャンプする。 (生成コード記憶部43)生成コード記憶部43は、コ
ード生成部42により生成された実行形式命令を記憶す
る。 2.2 コンパイラ装置110の動作 コンパイラ装置110の動作について説明する。 (コンパイラ装置110の全体の動作)コンパイラ装置
110の全体の動作について、図18に示すフローチャ
ートを用いて説明する。
【0078】コンパイラ装置110は、入力部31によ
る入力処理を行い(ステップS201)、構文解析部3
3による構文解析処理を行い(ステップS202)、中
間コード生成部36による中間コード生成処理を行い
(ステップS203)、最適化部38による最適化処理
を行い(ステップS204)、資源割付部40による資
源割付処理を行い(ステップS205)、コード生成部
42によるコード生成処理を行う(ステップS20
6)。 (構文解析部33の動作)構文解析部33の動作につい
て、図19に示すフローチャートを用いて説明する。
【0079】構文解析部33は、第1記憶部32に記憶
されている全てのファイルについて、以下に示す構文解
析処理を繰り返す。構文解析部33は、第1記憶部32
に記憶されている各ファイルから、字句を読み出し(ス
テップS211)、字句の読出しが終了したか否かを判
断し、終了したと判断する場合は(ステップS21
2)、処理を終了する。
【0080】構文解析部33は、終了していないと判断
する場合は(ステップS212)、読み出した字句が
「#pragma」であるか否かを判断し、「#pra
gma」でないと判断するとき(ステップS213)、
通常の構文解析処理を行い、解析結果を第2記憶部34
へ書き込み(ステップS218)、制御をステップS2
11へ移して、処理を繰り返す。
【0081】構文解析部33は、「#pragma」で
あると判断するとき(ステップS213)、次の字句を
読み出し(ステップS214)、読み出した字句が「_
finalclass」でないなら(ステップS21
5)、通常の構文解析処理を行い、解析結果を第2記憶
部34へ書き込み(ステップS218)、制御をステッ
プS211へ移して、処理を繰り返す。
【0082】構文解析部33は、読み出した字句が「_
finalclass」であるなら(ステップS21
5)、次の字句を読み出し(ステップS216)、読み
出した字句を終端クラスを示すクラス名として、終端ク
ラス記憶部35が有する終端クラステーブルへ書き込み
(ステップS217)、制御をステップS211へ移し
て、処理を繰り返す。 (最適化部38の動作)最適化部38の動作について、
図20に示すフローチャートを用いて説明する。
【0083】最適化部38は、第3記憶部37に記憶さ
れている中間コードを読み出し(ステップS231)、
読出しが終了したか否かを判断し、終了したと判断する
場合に(ステップS232)、処理を終了する。最適化
部38は、終了していないと判断する場合に(ステップ
S232)、読み出した中間コードのコマンド名が関数
呼出しであり、仮想関数フラグがvirtualである
か否かを判断し、仮想関数呼出しであるとき(ステップ
S233)、前記読み出した中間コードに含まれるクラ
ス型が終端クラス記憶部35が有する終端クラステーブ
ル内に存在するか否かを判断し、終端クラステーブル内
に存在するならば(ステップS234)、前記読み出し
た中間コードに含まれる仮想関数フラグを「real」
に書き換え、前記中間コードを第4記憶部39に書き込
み(ステップS235)、制御をステップS231へ移
し、処理を繰り返す。
【0084】最適化部38は、前記読み出した中間コー
ドに含まれるクラス型が終端クラステーブル内に存在し
ないならば(ステップS234)、前記中間コードに対
して通常の最適化処理を施し、通常の最適化処理の施さ
れた中間コードを第4記憶部39に書き込み(ステップ
S236)、制御をステップS231へ移し、処理を繰
り返す。
【0085】最適化部38は、読み出した中間コードの
コマンド名が関数呼出しであり、仮想関数フラグがvi
rtualであるか否かを判断し、仮想関数呼出しでな
いとき(ステップS233)、前記中間コードに対して
通常の最適化処理を施し、通常の最適化処理の施された
中間コードを第4記憶部39に書き込み(ステップS2
36)、制御をステップS231へ移し、処理を繰り返
す。 (コード生成部42の動作)コード生成部42の動作に
ついて、図21に示すフローチャートを用いて説明す
る。
【0086】コード生成部42は、第5記憶部41に記
憶されている中間コードを読み出し(ステップS25
1)、読出しが終了したか否かを判断し、終了したと判
断する場合(ステップS252)、処理を終了する。コ
ード生成部42は、終了していないと判断する場合(ス
テップS252)、、読み出した中間コードのコマンド
名が関数呼出しであるか否かを判断し、関数呼出しであ
ると判断する場合(ステップS253)、さらに、前記
読み出した中間コードに含まれる仮想関数フラグが「v
irtual」であるか否かを判断し、仮想関数フラグ
が「virtual」であるとき(ステップS25
4)、仮想関数表のアドレスをセットする実行形式命令
を生成し(ステップS261)、仮想関数のアドレスを
セットする実行形式命令を生成し(ステップS26
2)、引数の値をセットする実行形式命令を生成し(ス
テップS263)、仮想関数へジャンプする実行形式命
令を生成する(ステップS264)。仮想関数フラグが
「virtual」でないとき(ステップS254)、
引数の値をセットする実行形式命令を生成し(ステップ
S255)、関数へ直接ジャンプする実行形式命令を生
成する(ステップS256)。次に、コード生成部42
は、生成した実行形式命令を生成コード記憶部43へ書
き込み(ステップS257)、制御をステップS251
へ移して、処理を繰り返す。
【0087】コード生成部42は、関数呼出しでないと
判断する場合(ステップS253)、関数呼出し以外の
通常のコード生成処理を行い(ステップS265)、生
成した実行形式命令を生成コード記憶部43へ書き込
(ステップS257)、制御をステップS251へ移し
て、処理を繰り返す。 3.まとめ 以上説明したように、本発明の最適化情報付加装置によ
り継承されないクラスの解析を行ない、継承されないク
ラスに対して最適化情報を付加し、更に本発明のコンパ
イラ装置により継承されないクラスの仮想関数呼び出し
を関数の直接呼出しに変換することによって、最適化処
理を適用できる機会が増え、生成される実行形式命令を
少なくすることができる。
【0088】なお、本発明を上記の実施の形態に基づい
て説明してきたが、本発明は、上記の実施の形態に限定
されないのはもちろんである。以下のような場合も本発
明に含まれる。 (1)更にここで、最適化処理で行なう最適化の一種で
あるインライン関数展開を図3の行235、236に示
す仮想関数呼び出しを関数の直接呼出しに変更した中間
コードに対して適用できる。
【0089】行235に示す関数の直接呼出しに対し
て、関数のインライン展開を適用すると、クラスYのメ
ンバ関数gは引数の値を2乗する処理を行なうので、関
数gを呼び出した結果、その戻り値は100となり、変
数yに100を代入するコードとなる。同様に、行23
6に示す関数の直接呼出しに対して、関数のインライン
展開を適用すると、クラスZのメンバ関数gは引数の値
を3乗する処理を行なうので、関数gを呼び出した結
果、その戻り値は1000となり、変数zに1000を
代入するコードとなる。
【0090】従って、関数funcの戻り値であるx+
y+zの値は変数xの値に1100を加算した値とな
る。以上のように最適化処理を行なった中間コードに対
して、資源割付部40による資源割付けを行ない、コー
ド生成部42によるコード生成を行って生成される実行
形式プログラムを、図22に示す。この図において、実
行形式プログラム601は、ソースプログラム233に
基づいて生成されたものである。
【0091】実行形式命令602は、ソース命令234
に対応し、実行形式命令603は、ソース命令235〜
237に対応している。このように、さらに、関数のイ
ンライン展開を適用することにより、生成コードを小さ
くすることができる。 (2)上記実施の形態において、本発明の最適化情報付
加装置により、最適化情報がいずれのクラスへも継承さ
れないクラスのクラス定義に付加されるとしているが、
いずれのクラスへも継承されないクラスのクラス定義に
属する仮想メンバ関数に付加するととしてもよい。 (3)上記実施の形態において、本発明の最適化情報付
加装置により、最適化情報として、「#pragma
_finalclass クラス名」が付加されるとし
ているが、そのクラス定義がいずれのクラスからも継承
されないことを示す予約語を使用してもよい。例えば、
Java言語において、予約語「final」を使用し
てもよい。
【0092】また、最適化情報として、本発明の最適化
情報付加装置及びコンパイラ装置に固有の文字列であっ
て、他のコンパイラ装置において注釈行として解釈され
る文字列を用いるとしてもよい。 (4)上記実施の形態においては、他のクラスへ継承さ
れないクラスを含むクラス定義に対応して、最適化情報
を付加するとしているが、他のクラスへ継承されないク
ラスを含むクラス定義に含まれる関数に対応して、最適
化情報を付加するとしてもよい。 (5)入力部31は、入力部31における操作者による
文字列の入力の受付けに代えて、入力部12により入力
を受け付けた文字列を受け取るとしてもよい。これによ
り、コンパイラ装置110は、最適化情報付加装置10
0の入力部12により入力を受け付けた全てのファイル
に対して、コンパイルを行うことができる。 II 第2の実施の形態 本発明に係る別の実施の形態としてのプログラム変換装
置120a(図示していない)について説明する。
【0093】プログラム変換装置120aは、プログラ
ム変換装置120と同様に、最適化情報付加装置100
aとコンパイラ装置110a(図示していない)とから
構成される。 1.最適化情報付加装置100a ここでは、最適化情報付加装置100aについて説明す
る。 1.1 最適化情報付加装置100aの構成 最適化情報付加装置100aは、図29に示すように、
プログラム記憶部11a、入力部12a、仮想関数解析
部26、仮想関数集合記憶部27、オーバーライド集合
記憶部28、最適化情報付加部21a、変更ファイル集
合記憶部22、出力部23aから構成されている。 (プログラム記憶部11a)プログラム記憶部11a
は、プログラム記憶部11と同様に、C++言語の規格
に基づいて記述されたソースプログラムをデータとして
含むファイルを記憶している。
【0094】プログラム記憶部11aが記憶しているフ
ァイルの一例を図30に示す。この図に示すように、プ
ログラム記憶部11は、ファイル1101、1102及
び1103を記憶している。ファイル1101、110
2及び1103のファイル名は、それぞれ、「file
x.h」、「filey.h」、「filez.cc」
である。
【0095】ファイル1101は、クラス定義1111
を含む。ファイル1102は、#include行11
21とクラス定義1122とを含む。ファイル1103
は、#include行1131と関数定義1132と
を含む。 (入力部12a)入力部12aは、入力部12と同様
に、操作者による文字列の入力を受け付け、入力を受け
付けた文字列を分解して1個のコマンド名と少なくとも
1個のファイル名とを生成し、コマンド名が「run」
であるなら、以下に示す入力処理を実行する。
【0096】入力部12aは、前記生成された少なくと
も1個のファイル名を有する少なくとも1個のファイル
をプログラム記憶部11aから読み出す。読み出しは、
ファイルを構成する文毎に行う。読み出した文が#in
clude文である場合には、#include文によ
り示されているファイルをその#include文が記
述されている位置において展開するように、そのファイ
ルを読み出す。
【0097】入力部12aは、読み出した文が、クラス
定義文であるか否かを判断し、クラス定義文であると判
断する場合には、読み出した文を仮想関数解析部26へ
出力し、クラス定義文でないと判断する場合には、さら
に次の文を読み出す。このようにして、入力部12a
は、操作者により入力を受け付けたファイル名により指
定されるファイルの読み出しを終了するまで、文の読出
しと、前記判断と、読み出した文の仮想関数解析部26
への出力とを繰り返す。 (仮想関数集合記憶部27)仮想関数集合記憶部27
は、仮想関数集合を記憶する。仮想関数集合は、クラス
名と、クラス名と仮想関数名とからなる1以上の組から
構成され、前記クラス名で示されるクラスにより定義さ
れている仮想関数を示している。
【0098】仮想関数集合記憶部27に記憶されている
仮想関数集合の一例を図31に示す。この図に示すよう
に、仮想関数集合記憶部27は、仮想関数集合1151
と1161を記憶している。仮想関数集合1151に
は、クラス名1152と組1153と1154とが含ま
れ、組1153と1154とは、それぞれクラス名と関
数名とからなる。また、仮想関数集合1161には、ク
ラス名1162と組1163と1164とが含まれ、組
1163と1164とは、それぞれクラス名と関数名と
からなる。 (仮想関数解析部26)仮想関数解析部26は、内部で
用いられる変数として、仮想関数集合VFSETを有す
る。仮想関数集合VFSETは、クラス名と1以上の組
とが格納される領域を有し、前記組は、クラス名と関数
名とからなる。
【0099】仮想関数解析部26は、入力部12aから
クラス定義文を受け取り、受け取ったクラス定義文に基
底クラスが記述されているか否かを判断する。基底クラ
スが記述されていない場合には、仮想関数集合VFSE
Tのクラス名が格納される領域に、前記クラス定義文に
定義されているクラス名C1を格納し、仮想関数集合V
FSETの各組が格納される領域を空とする。基底クラ
スが記述されている場合には、前記クラス定義に記述さ
れている基底クラスC2をクラス名として有する仮想関
数集合を仮想関数集合記憶部27から取得し、取得した
仮想関数集合を仮想関数集合VFSETとし、仮想関数
集合VFSETのクラス名が格納される領域に、基底ク
ラスC2に代えて、前記クラス定義文に定義されている
クラス名C1を格納する。
【0100】次に、仮想関数解析部26は、入力部12
aから受け取ったクラス定義文に記述されている仮想関
数VF毎に、前記仮想関数VFが、仮想関数集合VFS
ET内に存在するか否かを判断する。仮想関数集合VF
SET内に存在すると判断する場合に、仮想関数集合V
FSET内に存在する前記仮想関数VFと同じ仮想関数
名VF’と、前記仮想関数VF’と1つの組をなすクラ
ス名とからなる組をオーバーライド集合記憶部28のオ
ーバーライド集合OVSETへ書き込み、仮想関数集合
VFSET内の仮想関数名VF’と、前記仮想関数V
F’と1つの組をなすクラス名とからなる組を消去し、
代わりに前記仮想関数VFと前記クラス定義文に定義さ
れているクラス名C1との組を仮想関数集合VFSET
に書き込む。
【0101】仮想関数集合VFSET内に存在しないと
判断する場合に、仮想関数集合VFSETの組が格納さ
れる領域に前記クラス定義文に定義されているクラス名
C1と仮想関数VFとからなる組を書き込む。次に、仮
想関数解析部26は、仮想関数集合VFSETを仮想関
数集合記憶部27へ書き込む。
【0102】このようにして、図30に示すファイル1
101から、図31に示す仮想関数集合1151が形成
され、図32に示すオーバーライト集合が形成される。
また、図30に示すファイル1102から、図31に示
す仮想関数集合1161が形成される。 (オーバーライド集合記憶部28)オーバーライド集合
記憶部28は、オーバーライド集合OVSETを記憶し
ており、オーバーライド集合OVSETは、クラス名と
仮想関数名とからなる。オーバーライド集合OVSET
の一例を図32に示す。 (最適化情報付加部21a)入力部12aが、操作者に
より入力を受け付けたファイル名により指定されるファ
イルの読み出しを終了すると、最適化情報付加部21a
は、オーバーライド集合記憶部28に記憶されているオ
ーバーライド集合OVSETが空集合であるか否かを判
断し、空集合である場合には、処理を終了する。
【0103】最適化情報付加部21aは、オーバーライ
ド集合OVSETが空集合でない場合には、オーバーラ
イド集合OVSETに含まれるクラス名と仮想関数VF
1を抽出し、抽出したクラス名と仮想関数VF1が宣言
されているファイルをプログラム記憶部11aから読み
出し、文字列「#pragma_ovfunc」と、前
記抽出したクラス名と、仮想関数VF1とを結合して、
最適化情報を形成し、読み出したファイルに形成した前
記最適化情報を付加して、変更ファイル集合記憶部22
へ出力する。
【0104】最適化情報が付加されたプログラムの一例
を図33に示す。この図において、ファイル1101a
は、最適化情報1112が付加されたプログラムであ
る。ファイル1102、1103には最適化情報は付加
されていない。 (変更ファイル集合記憶部22)変更ファイル集合記憶
部22は、最適化情報付加装置100の変更ファイル集
合記憶部22と同様であり、最適化情報の付加されたフ
ァイルを記憶する。 (出力部23a)出力部23aは、最適化情報付加装置
100の出力部23と同様であり、変更ファイル集合記
憶部22から最適化情報が付加されたファイルを読み出
し、読み出したファイルを、出力部23と同様にして、
プログラム記憶部11aへ書き込む。 1.2 最適化情報付加装置100aの動作 (最適化情報付加装置100aの全体の動作)最適化情
報付加装置100aの動作について、図34に示すフロ
ーチャートを用いて説明する。
【0105】入力部12aは、操作者からコマンド名と
ファイル名との文字列の入力を受け付け(ステップS3
01)、プログラム記憶部11aから前記ファイルを読
み出し、全てのファイルの読み出しが終了すれば(ステ
ップS302)、最適化情報付加処理を実施し(ステッ
プS307)、出力部23aは、変更ファイル集合記憶
部22から最適化情報が付加されたファイルを読み出
し、読み出したファイルを、プログラム記憶部11aへ
書き込む(ステップS308)。
【0106】入力部12aは、前記ファイルの読み出し
が全て終了していなければ(ステップS302)、ファ
イルを構成する文毎に読み出しを行い(ステップS30
3)、ファイルの最後まで読み出しが終了すれば(ステ
ップS304)、ステップS301へ戻って再度操作者
からの入力を受け付ける。ファイルの最後まで読み出し
が終了していなければ(ステップS304)、読み出し
た文が、クラス定義文であるか否かを判断し、クラス定
義文であると判断する場合には(ステップS305)、
読み出した文を仮想関数解析部26へ出力して仮想関数
解析処理を実行し(ステップS306)、クラス定義文
でないと判断する場合には(ステップS305)、ステ
ップS303へ戻って、さらに次の文を読み出す。 (仮想関数解析処理の詳細動作)仮想関数解析処理の詳
細動作について、図35に示すフローチャートを用いて
説明する。
【0107】仮想関数解析部26は、入力部12aから
クラス定義文を受け取り、受け取ったクラス定義文に基
底クラスが記述されているか否かを判断し、基底クラス
が記述されていない場合には(ステップS321)、仮
想関数集合VFSETのクラス名が格納される領域に、
前記クラス定義文に定義されているクラス名C1を格納
し、仮想関数集合VFSETの各組が格納される領域を
空とする(ステップS323)。基底クラスが記述され
ている場合には(ステップS321)、前記クラス定義
に記述されている基底クラスC2をクラス名として有す
る仮想関数集合を仮想関数集合記憶部27から取得し、
取得した仮想関数集合を仮想関数集合VFSETとし、
仮想関数集合VFSETのクラス名が格納される領域
に、基底クラスC2に代えて、前記クラス定義文に定義
されているクラス名C1を格納する(ステップS32
2)。
【0108】次に、仮想関数解析部26は、入力部12
aから受け取ったクラス定義文に記述されている仮想関
数VF毎に、ステップS325〜S328を繰り返す。
ステップS325〜S328において、前記仮想関数V
Fが、仮想関数集合VFSET内に存在するか否かを判
断し、仮想関数集合VFSET内に存在すると判断する
場合に(ステップS325)、仮想関数集合VFSET
内に存在する前記仮想関数VFと同じ仮想関数名VF’
と、前記仮想関数VF’と1つの組をなすクラス名とか
らなる組をオーバーライド集合記憶部28のオーバーラ
イド集合OVSETへ書き込み(ステップS326)、
仮想関数集合VFSET内の仮想関数名VF’と、前記
仮想関数VF’と1つの組をなすクラス名とからなる組
を消去し、代わりに前記仮想関数VFと前記クラス定義
文に定義されているクラス名C1との組を仮想関数集合
VFSETに書き込む(ステップS327)。
【0109】仮想関数集合VFSET内に存在しないと
判断する場合に(ステップS325)、仮想関数集合V
FSETの組が格納される領域に前記クラス定義文に定
義されているクラス名C1と仮想関数VFとからなる組
を書き込む(ステップS328)。次に、仮想関数解析
部26は、仮想関数集合VFSETを仮想関数集合記憶
部27へ書き込む(ステップS330)。 (最適化情報付加処理の詳細動作)最適化情報付加処理
の詳細動作について、図36に示すフローチャートを用
いて説明する。
【0110】入力部12aが、操作者により入力を受け
付けたファイル名により指定されるファイルの読み出し
を終了すると、最適化情報付加部21aは、オーバーラ
イド集合記憶部28に記憶されているオーバーライド集
合OVSETが空集合であるか否かを判断し、空集合で
ある場合には(ステップS341)、処理を終了する。
【0111】最適化情報付加部21aは、オーバーライ
ド集合OVSETが空集合でない場合には(ステップS
341)、オーバーライド集合OVSETに含まれるク
ラス名と仮想関数VF1を抽出し(ステップS34
2)、抽出したクラス名と仮想関数VF1が宣言されて
いるファイルをプログラム記憶部11aから読み出し、
文字列「#pragma_ovfunc」と、前記抽出
したクラス名と、仮想関数VF1とを結合して、最適化
情報を形成し、読み出したファイルに形成した前記最適
化情報を付加し(ステップS343)、変更ファイル集
合記憶部22へ出力する(ステップS344)。 2.コンパイラ装置110a ここでは、コンパイラ装置110aについて説明する。 2.1 コンパイラ装置110aの構成 コンパイラ装置110aは、コンパイラ装置110と同
様に、プログラム記憶部11a、入力部31、第1記憶
部32、構文解析部33、第2記憶部34、オーバーラ
イド集合記憶部35a、中間コード生成部36、第3記
憶部37、最適化部38、第4記憶部39、資源割付部
40、第5記憶部41、コード生成部42、生成コード
記憶部43から構成されており、コンパイラ装置110
のプログラム記憶部11に代えて、プログラム記憶部1
1aを備え、コンパイラ装置110の終端クラス記憶部
35に代えて、オーバーライド集合記憶部35aを備え
ている。
【0112】また、コンパイラ装置110aを構成する
構成要素のうち、コンパイラ装置110の構成要素と同
じ符号を有するものは、コンパイラ装置110aを構成
する構成要素と同様である。以下において、コンパイラ
装置110を構成する構成要素との相違点を中心として
説明する。 (プログラム記憶部11a)最適化情報付加装置100
aが備えるプログラム記憶部11aと同一であり、最適
化情報付加装置100aにより生成された最適化情報が
付加されたファイルを記憶している。 (オーバーライド集合記憶部35a)オーバーライド集
合記憶部35aは、オーバーライド関数を記憶する。オ
ーバーライド関数は、クラス名と仮想関数名との組から
なる。 (構文解析部33)構文解析部33は、第1記憶部32
に記憶されている各ファイルから、字句を読み出し、読
み出した字句が「#pragma」であり、「#pra
gma」に続く字句が「_ovfunc」である場合、
「_ovfunc」に続く字句をクラス名と仮想関数名
との組として、オーバーライド集合記憶部35aへ書き
込む。 (最適化部38)最適化部38は、第3記憶部37に記
憶されている中間コードを読み出し、読み出した中間コ
ードのコマンド名が仮想関数呼び出しである場合に、前
記中間コードに含まれるクラス名と関数名とが、オーバ
ーライド集合記憶部35aに記憶されているか否かを判
断し、記憶されている場合には、通常の最適化処理を行
い、記憶されていない場合には、前記読み出した中間コ
ードに含まれる仮想関数フラグを関数が仮想関数でない
ことを示す「real」に書き換え、前記中間コードを
第4記憶部39に書き込む。
【0113】図32に示すオーバーライド集合の例によ
ると、クラスは「X」であり、関数は「f」である。一
方、図30のファイル1103において、変数x1、x
2、y1、y2への代入文で仮想関数呼出しが行われて
いる。変数x1への代入文の右辺において呼び出される
仮想関数は、クラスXに属する関数fであるので、前記
のオーバーライド集合に含まれており、通常の仮想関数
呼出しを行う。
【0114】また、変数x2、y1、y2への代入文の
右辺において呼び出される仮想関数は、それぞれ、クラ
スXに属する関数g、クラスYに属する関数f、クラス
Yに属する関数gであるので、前記のオーバーライド集
合に含まれておらず、これらの仮想関数呼び出しを直接
呼出しに書き換える。 2.2 コンパイラ装置110aの動作 コンパイラ装置110aの全体の動作については、コン
パイラ装置110の全体の動作と同じであるので、説明
は省略し、以下において、構文解析部33と最適化部3
8との詳細の動作について説明する。 (構文解析部33の動作)構文解析部33の動作につい
て、図37に示すフローチャートを用いて説明する。
【0115】構文解析部33は、第1記憶部32に記憶
されている全てのファイルについて、以下に示す構文解
析処理を繰り返す。構文解析部33は、第1記憶部32
に記憶されている各ファイルから字句の読出しが終了し
たか否かを判断し、終了したと判断する場合は(ステッ
プS361)、処理を終了する。終了していない場合は
(ステップS361)、次の字句を読み出し(ステップ
S362)、読み出した字句が「#pragma」であ
るか否かを判断し、「#pragma」でないと判断す
るとき(ステップS363)、通常の構文解析処理を行
い、解析結果を第2記憶部34へ書き込み(ステップS
368)、制御をステップS361へ移して、処理を繰
り返す。
【0116】構文解析部33は、「#pragma」で
あると判断するとき(ステップS363)、次の字句を
読み出し(ステップS364)、読み出した字句が「_
ovfunc」でないなら(ステップS365)、通常
の構文解析処理を行い、解析結果を第2記憶部34へ書
き込み(ステップS368)、制御をステップS361
へ移して、処理を繰り返す。
【0117】構文解析部33は、読み出した字句が「_
ovfunc」であるなら(ステップS365)、次の
字句を読み出し(ステップS366)、読み出した字句
をクラス名と仮想関数名との組として、オーバーライド
集合記憶部35aへ書き込み(ステップS367)、制
御をステップS361へ移して、処理を繰り返す。 (最適化部38の動作)最適化部38の動作について、
図38に示すフローチャートを用いて説明する。
【0118】最適化部38は、第3記憶部37に記憶さ
れている中間コードを読み出し、読み出した中間コード
のコマンド名が関数呼出しであり、仮想関数フラグがv
irtualであるか否かを判断し、仮想関数呼出しで
あるとき(ステップS381)、前記中間コードに含ま
れるクラス名と関数名とが、オーバーライド集合記憶部
35aに記憶されているか否かを判断し、記憶されてい
ない場合には(ステップS382)、前記読み出した中
間コードに含まれる仮想関数フラグを「real」に書
き換え、前記中間コードを第4記憶部39に書き込み
(ステップS383)、再度処理を繰り返す。
【0119】最適化部38は、前記中間コードに含まれ
るクラス名と関数名とが、オーバーライド集合記憶部3
5aに記憶されている場合には(ステップS382)、
前記中間コードに対して通常の最適化処理を施し、通常
の最適化処理の施された中間コードを第4記憶部39に
書き込み(ステップS384)、再度処理を繰り返す。 3.まとめ 以上説明したように、関数の置き換え(オーバーライ
ド)が行われない仮想関数の呼出しを直接呼出しに変換
することにより、最適化処理を適用できる機会が増え、
生成される実行形式命令を少なくすることができる。
【0120】図30に示すファイル1103から、仮想
関数呼び出しをそのままにして生成した実行形式命令を
図39(a)に示し、関数の置き換え(オーバーライ
ド)が行われない仮想関数の呼出しを直接呼出しに変換
することにより、前記最適化処理を適用し、さらに、関
数のインライン展開を適用することにより、ファイル1
103から生成した実行形式命令を図39(b)に示
す。この図に示すように、生成される実行形式命令は少
なくなっている。 III 第3の実施の形態 本発明に係る第3の実施の形態としてのプログラム変換
装置120b(図示していない)について説明する。
【0121】プログラム変換装置120bは、最適化情
報解析装置130とコンパイラ装置110bとから構成
され、最適化情報としてクラスの継承関係に関する情報
を収集し、中間コード形式のプログラムコードを生成
し、収集した情報及び生成したプログラムコードを用い
て最適化を行なう。 1.最適化情報解析装置130 ここでは、最適化情報解析装置130について説明す
る。 1.1 最適化情報解析装置130の構成 最適化情報解析装置130は、図40に示すように、プ
ログラム記憶部11、入力部12b、未読ファイル集合
記憶部13、第1記憶部32b、構文解析部33b、第
2記憶部34、中間コード生成部36、継承関係抽出部
50、継承関係記憶部51、中間コード記憶部54から
構成されている。継承関係記憶部51は、全クラス定義
集合記憶部15及び被継承クラス集合記憶部18から構
成されている。
【0122】なお、最適化情報解析装置130を構成す
る構成要素のうち、最適化情報付加装置100の構成要
素と同じ符合を有するものは、最適化情報付加装置10
0を構成する構成要素と同様であり、コンパイラ装置1
10の構成要素と同じ符合を有するものは、コンパイラ
装置110を構成する構成要素と同様である。以下にお
いて、相違点を中心に説明する。 (入力部12b)入力部12bは、入力部12と同様
に、操作者から1個のコマンド名「run」と少なくと
も1個のファイル名との入力を受け付ける。
【0123】入力部12bは、前記入力を受け付けたフ
ァイル名を有するファイルをプログラム記憶部11から
読み出す。読み出しは、ファイルを構成する文毎に行
う。読み出した文が#include文である場合に
は、#include文により示されているファイルを
読み出し、読み出したファイルの内容を前記#incl
ude文が記述されている位置において展開する。
【0124】入力部12bは、前記読み出したファイル
を同じファイル名を用いて未読ファイル集合記憶部13
へ書き込む。入力部12bにより未読ファイル集合記憶
部13へ書き込まれたファイルからなる集合を、未読フ
ァイル集合TFと呼ぶ。次に、入力部12bは、未読フ
ァイル集合記憶部13に記憶されているファイルf1を
1個ずつ順に読み出し、読み出したファイルf1を第1
記憶部32へ書き込み、未読ファイル集合TFから読み
出したファイルf1を削除する。
【0125】入力部12bは、未読ファイル集合記憶部
13に記憶されている全てのファイルの読み出しが終了
するまで、ファイルf1の読み出しと、ファイルf1の
削除とファイルf1の書込みとを繰り返す。 (第1記憶部32b)第1記憶部32bは、入力部12
bから出力されたファイルを記憶する。 (構文解析部33b)構文解析部33bは、第1記憶部
32bに記憶されているファイルから字句を順次読み出
し、通常の構文の解析を行い、解析結果の情報にファイ
ル名を付して第2記憶部34へ書き込む。通常の構文解
析については、公知であるので、説明を省略する。
【0126】構文解析部33bは、解析した構文がクラ
ス定義である場合、定義されたクラス定義C1と、前記
クラス定義C1の基底クラス集合BSETとを抽出し、
抽出したクラス定義C1と、基底クラス集合BSETと
を継承関係抽出部50へ出力する。構文解析部33b
は、第1記憶部32bに記憶されている各ファイルか
ら、字句の読出しを終了するまで、字句の読出しと、通
常の構文解析と、解析した構文がクラス定義である場合
のクラス定義C1及び基底クラス集合BSETの抽出及
び出力と、解析結果の書込みとを繰り返す。 (全クラス定義集合記憶部15)全クラス定義集合記憶
部15は、第1の実施形態の全クラス定義集合記憶部1
5と同様に、全クラス定義集合TSETを有し、全クラ
ス定義集合TSETは、クラス定義を含む。 (被継承クラス集合記憶部18)被継承クラス集合記憶
部18は、第1の実施形態の被継承クラス集合記憶部1
8と同様に、被継承クラス集合ISETを有し、被継承
クラス集合ISETは、クラス名を含む。 (継承関係抽出部50)継承関係抽出部50は、構文解
析部33bからクラス定義C1と基底クラス集合BSE
Tを受け取る。
【0127】継承関係抽出部50は、前記受け取ったク
ラス定義C1が、全クラス定義集合記憶部52が有する
全クラス定義集合TSETに含まれているか否かを判断
し、全クラス定義集合TSETに含まれていないと判断
する場合に、クラス定義C1を全クラス定義集合TSE
Tに書き込む。継承関係抽出部50は、前記受け取った
基底クラス集合BSETの各要素C2が、被継承クラス
集合記憶部18が有する被継承クラス集合ISETに含
まれているか否かを判断し、被継承クラス集合ISET
に含まれていないと判断する場合に要素C2を被継承ク
ラス集合ISETへ書き込む。 (中間コード生成部36)中間コード生成部36は、第
2記憶部34から解析結果の情報を読み出して、中間コ
ードを生成し、生成した中間コードにファイル名を付し
て中間コード記憶部54へ書き込む。 (中間コード記憶部54)中間コード記憶部54は、生
成された中間コードを記憶する。 1.2 最適化情報解析装置130の動作 最適化情報解析装置130の動作について説明する。 (最適化情報解析装置130の全体の動作)最適化情報
解析装置130の全体の動作について、図41に示すフ
ローチャートを用いて説明する。
【0128】入力部12bは、操作者による文字列の入
力を受け付け、前記入力を受け付けた文字列に含まれる
ファイル名を有するファイルをプログラム記憶部11か
ら読み出し、読み出したファイルを同じファイル名を用
いて未読ファイル集合記憶部13へ書き込む(ステップ
S401)。入力部12bは、未読ファイル集合記憶部
13に記憶されているファイルf1を読み出し(ステッ
プS402)、入力部12bが未読ファイル集合記憶部
13の全てのファイルの読出しを終了したならば(ステ
ップS403)、処理を終了する。
【0129】入力部12bは、未読ファイル集合記憶部
13の全てのファイルの読出しを終了していないならば
(ステップS403)、構文解析部33bは、読み出し
たファイルf1に対して通常の構文の解析を行い解析結
果の情報を書き込む(ステップS404)。次に、構文
解析部33bは、解析した文がクラス定義か否かを判断
し、クラス定義であるならば(ステップS405)、構
文解析部33bは、継承関係抽出部50へクラス定義C
1と基底クラス集合BSETを出力し、継承関係抽出部
50は、継承関係抽出処理を実行する(ステップS40
6)。
【0130】次に、中間コード生成部36は、解析結果
の情報を読み出して中間コードを生成し、生成した中間
コードを中間コード記憶部54へ書き込む(ステップS
407)。次に、構文解析部33bは、ファイルの最後
まで処理したか否かを判断し、ファイルの最後まで処理
していないならば(ステップS408)、ステップS4
04へ制御を戻し、ファイルの最後まで処理が終了する
まで、上記の通常の構文解析、クラス定義の場合の継承
関係抽出処理及び中間コードの生成処理を繰り返す。
【0131】ファイルの最後まで処理したならば(ステ
ップS408)、ステップS402へ制御を戻し、未読
ファイル集合の全てのファイルの読み出しが終了するま
で、上記処理を繰り返す。 (継承関係抽出部50の動作)継承関係抽出部50の動
作について、図42に示すフローチャートを用いて説明
する。
【0132】継承関係抽出部50は構文解析部33bか
ら、構文解析部33bが解析したクラス定義C1と前記
クラス定義C1が継承している基底クラスの集合BSE
Tを受け取る(ステップS410)。次に、受け取った
クラス定義C1が全クラス定義集合TSETに含まれる
か否かを判断し、全クラス定義集合TSETに含まれて
いるならば(ステップS411)、ステップS413に
制御を移し、全クラス定義集合TSETに含まれていな
いならば(ステップS411)、クラス定義C1を全ク
ラス定義集合TSETに書き込む(ステップS41
2)。
【0133】次に、継承関係抽出部50は、受け取った
基底クラス集合BSETに含まれる各クラスC2につい
て、ステップS413からステップS416までのルー
プ1を繰り返す。基底クラス集合BSETに含まれる全
てのクラスについて処理を終了すると、継承関係抽出部
50は処理を終了する。継承関係抽出部50は、クラス
C2が被継承クラス集合ISETに含まれるか否かを判
断する。クラスC2が被継承クラス集合ISETに含ま
れているならば(ステップS414)、ステップS41
6に制御を移す。クラスC2が被継承クラス集合ISE
Tに含まれていないならば(ステップS414)、クラ
スC2を被継承クラス集合ISETに書き込む(ステッ
プS415)。 2.コンパイラ装置110b ここでは、コンパイラ装置110bについて説明する。 2.1 コンパイラ装置110bの構成 コンパイラ装置110bは、図43に示すように、中間
コード記憶部54、継承関係記憶部51、中間コード入
力部55、第3記憶部37、継承関係解析部56、終端
クラス記憶部35、最適化部38、第4記憶部39、資
源割付部40、第5記憶部41、コード生成部42及び
生成コード記憶部43から構成される。
【0134】中間コード記憶部54及び継承関係記憶部
51は、それぞれ、最適化情報解析装置130の中間コ
ード記憶部54及び継承関係記憶部51と同じである。
また、コンパイラ装置110bを構成する構成要素のう
ち、コンパイラ装置110の構成要素と同じ符合を有す
るものは、コンパイラ装置110を構成する構成要素と
同様である。以下において、相違点を中心に説明する。 (中間コード入力部55)中間コード入力部55は、入
力部12bと同様に、操作者による文字列の入力を受け
付け、入力を受け付けた文字列を分解して、1個のコマ
ンド名と少なくとも1個のファイル名とを生成する。こ
こで、入力されるファイル名は、一例として、「fil
ez.cc」である。ファイル名は、ファイルを個別に
識別するファイル識別子とセパレータ「.」とファイル
の種類を示すファイル種別とから構成される。「fil
ez」は、ファイル識別子であり、「cc」は、ファイ
ル種別である。次に、中間コード入力部55は、前記生
成した少なくとも1個のファイル名から中間コードファ
イルのファイル名に変換する。中間コードファイルを示
すファイル名は、一例として、「filez.m」であ
り、前記変換の一例は、ファイル名「filez.c
c」中のファイル種別「cc」をファイル種別「m」に
置き換える変換である。次に、前記変換した少なくとも
1個のファイル名を有する少なくとも1個のファイルを
中間コード記憶部54から読み出し、読み出したファイ
ルに同じファイル名を付して第3記憶部37に書き込
む。更に、継承関係記憶部51の全クラス定義集合記憶
部15から全クラス定義集合TSETを読み出し、読み
出した全クラス定義集合TSETを第3記憶部37に書
き込み、被継承クラス集合記憶部18から被継承クラス
集合ISETを読み出し、読み出した被継承クラス集合
ISETを第3記憶部37に書き込む。
【0135】なお、中間コード入力部55は、操作者か
らのファイル名の入力を受け付け、中間コードを読み出
す代わりに、中間コード記憶部54に記憶されている全
ての中間コードファイルを読み出すとしてもよい。 (第3記憶部37)第3記憶部37は、中間コード形式
のファイル、全クラス定義集合TSET及び被継承クラ
ス集合ISETを記憶する。 (継承関係解析部56)継承関係解析部56は、第1の
実施形態の継承関係解析部19と同様であり、第3記憶
部37に記憶されている全クラス定義集合TSETに含
まれている全てのクラス定義を読み出し、被継承クラス
集合ISETに含まれている全てのクラス名を読み出
す。
【0136】次に、継承関係解析部56は、読み出した
全クラス定義集合TSETに含まれている全てのクラス
定義から、読み出した被継承クラス集合ISETに含ま
れている全てのクラス名で示されるクラス定義を削除
し、残ったクラス定義を終端クラス集合FSETとす
る。継承関係解析部56は、終端クラス集合FSETを
終端クラス記憶部35へ書き込む。 2.2 コンパイラ装置110bの動作 コンパイラ装置110bの全体の動作について、図44
に示すフローチャートを用いて説明する。
【0137】なお、図44に示すフローチャートのステ
ップS204〜S206は、それぞれ図18に示すフロ
ーチャートのステップS204〜S206と同じである
ので説明を省略する。ステップS501において、コン
パイラ装置110bの中間コード入力部55は、操作者
からファイル名の入力を受け付け、中間コードファイル
のファイル名に変換し(ステップS511)、中間コー
ド記憶部54から読み出し、読み出したファイルを第3
記憶部37に書き込み(ステップS512)、継承関係
記憶部51の全クラス定義集合記憶部15から全クラス
定義集合TSETを読み出し、読み出した全クラス定義
集合TSETを第3記憶部37に書込み(ステップS5
13)、被継承クラス集合記憶部18から被継承クラス
集合ISETを読み出し、読み出した被継承クラス集合
ISETを第3記憶部37に書き込む(ステップS51
4)。
【0138】次に、ステップS502において、継承関
係解析部56は、第3記憶部37に記憶されている全ク
ラス定義集合TSETに含まれている全てのクラス定義
を読み出し(ステップS521)、被継承クラス集合I
SETに含まれている全てのクラス名を読み出し(ステ
ップS522)、読み出した全クラス定義集合TSET
に含まれている全てのクラス定義から、読み出した被継
承クラス集合ISETに含まれている全てのクラス名で
示されるクラス定義を削除し(ステップS523)、残
ったクラス定義を終端クラス集合FSETとして終端ク
ラス記憶部35へ書き込む(ステップS524)。 3.まとめ 以上説明したように、本発明の最適化情報解析装置によ
り、中間コードを生成し、全クラス定義集合と被継承ク
ラス集合とを生成し、更に本発明のコンパイラ装置によ
り、生成した前記全クラス定義集合と前記被継承クラス
集合とから継承されないクラスを抽出し、生成された前
記中間コード内において、抽出された継承されないクラ
スの仮想関数呼び出しを関数の直接呼出しに変換する。
これにより、最適化処理を適用できる機会が増え、生成
される実行形式命令を少なくすることができる。 IV 第4の実施の形態 本発明に係る第4の実施の形態としてのプログラム変換
装置120c(図示していない)について説明する。
【0139】プログラム変換装置120cは、プログラ
ム変換装置120bと同様に、最適化情報解析装置13
0cとコンパイラ装置110cとから構成され、最適化
情報として仮想関数に関する情報を収集し、中間コード
形式のプログラムコードを生成し、収集した情報及び生
成したプログラムコードを用いて最適化を行う。 1.最適化情報解析装置130c ここでは、最適化情報解析装置130cについて説明す
る。 1.1 最適化情報解析装置130cの構成 最適化情報解析装置130cは、図45に示すように、
プログラム記憶部11、入力部12b、未読ファイル集
合記憶部13、第1記憶部32b、構文解析部33c、
第2記憶部34、中間コード生成部36、仮想関数解析
部57、仮想関数記憶部58、中間コード記憶部54か
ら構成されている。仮想関数記憶部58は、仮想関数集
合記憶部27とオーバーライド集合記憶部28とから構
成されている。
【0140】最適化情報解析装置130cは、最適化情
報解析装置130を構成する構文解析部33bに代えて
構文解析部33cを有し、継承関係抽出部50に代えて
仮想関数解析部57を有し、継承関係記憶部51に代え
て仮想関数記憶部58を有する。以下において、最適化
情報解析装置130を構成する各構成要素との相違点を
中心として説明する。 (構文解析部33c)構文解析部33cは、第1記憶部
32bに記憶されているファイルから字句を順次読み出
し、通常の構文の解析を行い、解析結果の情報にファイ
ル名を付して第2記憶部34へ書き込む。通常の構文解
析については、公知であるので、説明を省略する。
【0141】構文解析部33cは、解析した構文がクラ
ス定義文である場合、解析して得られたクラス定義文内
において宣言されている仮想関数VFを全て含む集合V
FSET1を生成し、解析して得られた前記クラス定義
文と生成した仮想関数の集合VFSET1を仮想関数解
析部57へ出力する。構文解析部33cは、第1記憶部
32bに記憶されている各ファイルから、字句の読出し
を終了するまで、字句の読出しと、通常の構文解析と、
解析した構文がクラス定義である場合の集合VFSET
1の生成及びクラス定義文と集合VFSET1との出力
と、解析結果の書込みとを繰り返す。 (仮想関数集合記憶部27、オーバーライド集合記憶部
28)仮想関数集合記憶部27及びオーバーライド集合
記憶部28は、それぞれ、最適化情報付加装置100a
の仮想関数集合記憶部27及びオーバーライド集合記憶
部28と同じであるので、説明を省略する。 (仮想関数解析部57)仮想関数解析部57は、内部で
用いられる変数として、最適化情報付加装置100aの
仮想関数解析部26が有する仮想関数集合VFSETと
同じ仮想関数集合VFSETを有する。
【0142】仮想関数解析部57は、構文解析部33c
からクラス定義文と仮想関数集合VFSET1を受け取
り、受け取ったクラス定義文に基底クラスが含まれてい
るか否かを判断する。基底クラスが含まれていない場合
には、仮想関数解析部57は、仮想関数集合VFSET
のクラス名が格納される領域に、受け取ったクラス定義
文に含まれるクラス名C1を格納し、仮想関数集合VF
SET内のクラス名と関数名とからなる各組が格納され
る領域を空とする。
【0143】基底クラスが含まれている場合には、仮想
関数解析部57は、前記クラス定義に含まれている基底
クラスC2をクラス名として有する仮想関数集合を仮想
関数集合記憶部27から取得し、取得した仮想関数集合
を仮想関数集合VFSETとし、仮想関数集合VFSE
Tのクラス名が格納される領域に、基底クラスC2に代
えて、前記クラス定義文に含まれているクラス名C1を
格納する。
【0144】次に、仮想関数解析部57は、構文解析部
33cから受け取った仮想関数の集合VFSET1に記
述されている仮想関数VF毎に、前記仮想関数VFが、
仮想関数集合VFSET内に存在するか否かを判断す
る。仮想関数集合VFSET内に存在すると判断する場
合に、仮想関数解析部57は、仮想関数集合VFSET
内に存在する前記仮想関数VFと同じ仮想関数名VF’
と、前記仮想関数VF’と1つの組をなすクラス名とか
らなる組をオーバーライド集合記憶部28のオーバーラ
イド集合OVSETへ書き込み、仮想関数集合VFSE
T内の仮想関数名VF’と、前記仮想関数VF’と1つ
の組をなすクラス名とからなる組を消去し、代わりに前
記仮想関数VFと前記クラス定義文に定義されているク
ラス名C1との組を仮想関数集合VFSETに書き込
む。
【0145】仮想関数集合VFSET内に存在しないと
判断する場合に、仮想関数解析部57は、仮想関数集合
VFSET内の組が格納される領域に前記クラス定義文
に定義されているクラス名C1と仮想関数VFとからな
る組を書き込む。次に、仮想関数解析部57は、仮想関
数集合VFSETを仮想関数集合記憶部27へ書き込
む。
【0146】このようにして、第2の実施形態と同様
に、図30に示すファイル1101から、図31に示す
仮想関数集合1151が形成され、図32に示すオーバ
ーライト集合が形成される。また、図30に示すファイ
ル1102から、図31に示す仮想関数集合1161が
形成される。 1.2 最適化情報解析装置130cの動作 (最適化情報解析装置130cの全体の動作)最適化情
報解析装置130cの全体の動作は、以下に示す記載を
除いて、図41のフローチャートに示す最適化情報解析
装置130の全体の動作と同様であるので、異なる点に
ついて説明する。
【0147】ステップS406において、最適化情報解
析装置130の構文解析部33bは、継承関係抽出部5
0へクラス定義C1と基底クラス集合BSETを出力
し、継承関係抽出部50は、継承関係抽出処理を実行す
る。これに代えて、最適化情報解析装置130cの構文
解析部33cは、クラス定義文と仮想関数の集合VFS
ET1とを仮想関数解析部57へ出力し、仮想関数解析
部57は、以下に示す仮想関数の解析を行う。 (仮想関数解析部57の動作)仮想関数解析部57の動
作は第2の実施形態の仮想関数解析部26と同様であ
り、図35に示すフローチャートを用いて説明する。
【0148】仮想関数解析部57は、構文解析部33c
からクラス定義文と仮想関数集合VFSET1を受け取
り、受け取ったクラス定義文に基底クラスが記述されて
いるか否かを判断する。基底クラスが記述されていない
場合には(ステップS321)、仮想関数集合VFSE
Tのクラス名が格納される領域に、前記クラス定義文に
定義されているクラス名C1を格納し、仮想関数集合V
FSETの各組が格納される領域を空とする(ステップ
S323)。基底クラスが記述されている場合には(ス
テップS321)、前記クラス定義に記述されている基
底クラスC2をクラス名として有する仮想関数集合を仮
想関数集合記憶部27から取得し、取得した仮想関数集
合を仮想関数集合VFSETとし、仮想関数集合VFS
ETのクラス名が格納される領域に、基底クラスC2に
代えて、前記クラス定義文に定義されているクラス名C
1を格納する(ステップS322)。
【0149】次に、仮想関数解析部57は、構文解析部
33cから受け取った仮想関数集合VFSET1に含ま
れる仮想関数VF毎に、ステップS325〜S328を
繰り返す。ステップS325〜S328において、前記
仮想関数VFが、仮想関数集合VFSET内に存在する
か否かを判断し、仮想関数集合VFSET内に存在する
と判断する場合に(ステップS325)、仮想関数集合
VFSET内に存在する前記仮想関数VFと同じ仮想関
数名VF’と、前記仮想関数VF’と1つの組をなすク
ラス名とからなる組をオーバーライド集合記憶部28の
オーバーライド関数集合OVSETへ書き込み(ステッ
プS326)、仮想関数集合VFSET内の仮想関数名
VF’と、前記仮想関数VF’と1つの組をなすクラス
名とからなる組を消去し、代わりに前記仮想関数VFと
前記クラス定義文に定義されているクラス名C1との組
を仮想関数集合VFSETに書き込む(ステップS32
7)。
【0150】仮想関数集合VFSET内に存在しないと
判断する場合に(ステップS325)、仮想関数集合V
FSETの組が格納される領域に前記クラス定義文に定
義されているクラス名C1と仮想関数VFとからなる組
を書き込む(ステップS328)。次に、仮想関数解析
部57は、仮想関数集合VFSETを仮想関数集合記憶
部27へ書き込む(ステップS330)。 2.コンパイラ装置110c ここでは、コンパイラ装置110cについて説明する。 2.1 コンパイラ装置110cの構成 コンパイラ装置110cは、図46に示すように、中間
コード記憶部54、仮想関数記憶部58、中間コード入
力部55c、第3記憶部37、オーバーライド集合記憶
部35c、最適化部38、第4記憶部39、資源割付部
40、第5記憶部41、コード生成部42及び生成コー
ド記憶部43を備え、コンパイラ装置110bの継承関
係解析部56及び終端クラス記憶部35に代えて、オー
バーライド集合記憶部35cを備えており、中間コード
入力部55に代えて、中間コード入力部55cを備えて
いる。
【0151】また、コンパイラ装置110cを構成する
構成要素のうち、コンパイラ装置110bの構成要素と
同じ符号を有するものは、コンパイラ装置110bを構
成する構成要素と同様である。以下において、コンパイ
ラ装置110bを構成する構成要素との相違点を中心と
して説明する。 (仮想関数記憶部58)仮想関数記憶部58は、最適化
情報解析装置130cの仮想関数記憶部58と同じであ
り、仮想関数集合記憶部27及びオーバーライド集合記
憶部28から構成されており、仮想関数集合記憶部27
及びオーバーライド集合記憶部28は、仮想関数解析部
57によって解析された結果を記憶している。 (中間コード入力部55c)中間コード入力部55c
は、中間コード入力部55と同様に、操作者による文字
列の入力を受け付け、入力を受け付けた文字列を分解し
て、1個のコマンド名と少なくとも1個のファイル名と
を生成し、前記生成した少なくとも1個のファイル名か
ら中間コードファイルのファイル名に変換し、前記変換
した少なくとも1個のファイル名を有する少なくとも1
個のファイルを中間コード記憶部54から読み出し、第
3記憶部37に書き込む。更に、仮想関数記憶部58の
オーバーライド集合記憶部28からオーバーライド集合
OVSETを読み出し、読み出したオーバーライド集合
OVSETをオーバーライド集合記憶部35cに書き込
む。
【0152】なお、中間コード入力部55cは、操作者
からのファイル名の入力を受け付け、中間コードを読み
出す代わりに、中間コード記憶部54に記憶されている
全ての中間コードファイルを読み出すとしてもよい。 (オーバーライド集合記憶部35c)オーバーライド集
合記憶部35cは、オーバーライド関数を記憶する。オ
ーバーライド関数は、クラス名と仮想関数名との組から
なる。 (最適化部38)最適化部38は、第2の実施形態の最
適化部38と同様であり、第3記憶部37に記憶されて
いる中間コードを読み出し、読み出した中間コードのコ
マンド名が仮想関数呼び出しである場合に、前記中間コ
ードに含まれるクラス名と関数名とが、オーバーライド
集合記憶部35cに記憶されているか否かを判断し、記
憶されている場合には、通常の最適化処理を行い、記憶
されていない場合には、前記読み出した中間コードに含
まれる仮想関数フラグを関数が仮想関数でないことを示
す「real」に書き換え、前記中間コードを第4記憶
部39に書き込む。
【0153】第2の実施形態と同じく、図32に示すオ
ーバーライド集合の例によると、クラスは「X」であ
り、関数は「f」である。一方、図30のファイル11
03において、変数x1、x2、y1、y2への代入文
で仮想関数呼出しが行われている。変数x1への代入文
の右辺において呼び出される仮想関数は、クラスXに属
する関数fであるので、前記のオーバーライド集合に含
まれており、通常の仮想関数呼出しを行う。
【0154】また、変数x2、y1、y2への代入文の
右辺において呼び出される仮想関数は、それぞれ、クラ
スXに属する関数g、クラスYに属する関数f、クラス
Yに属する関数gであるので、前記のオーバーライド集
合に含まれておらず、これらの仮想関数呼び出しを直接
呼出しに書き換える。 2.2 コンパイラ装置110cの動作 コンパイラ装置110cの動作について説明する。 (コンパイラ装置110cの全体の動作)コンパイラ装
置110cの全体の動作について、図47に示すフロー
チャートを用いて説明する。
【0155】なお、図47に示すフローチャートのステ
ップS205〜S206は、それぞれ図18に示すフロ
ーチャートのステップS205〜S206と同じである
ので説明を省略する。ステップS701において、コン
パイラ装置110cの中間コード入力部55cは、操作
者からファイル名の入力を受け付け、中間コードファイ
ルのファイル名に変換し(ステップS711)、中間コ
ード記憶部54から読み出し、読み出したファイルを第
3記憶部37に書き込み(ステップS712)、仮想関
数記憶部58のオーバーライド集合記憶部28からオー
バーライド集合OVSETを読み出し、読み出したオー
バーライド集合OVSETをオーバーライド集合記憶部
35cに書き込む(ステップS713)。
【0156】次に、コンパイラ装置110cの最適化部
38は、以下に示す最適化処理を行う(ステップS70
2)。 (最適化部38の動作)最適化部38の動作は、第2の
実施形態と同様であり、図38に示すフローチャートを
用いて説明する。
【0157】最適化部38は、第3記憶部37に記憶さ
れている中間コードを読み出し、読み出した中間コード
のコマンド名が関数呼出しであり、仮想関数フラグがv
irtualであるか否かを判断し、仮想関数呼出しで
あるとき(ステップS381)、前記中間コードに含ま
れるクラス名と関数名とが、オーバーライド集合記憶部
35cに記憶されているか否かを判断し、記憶されてい
ない場合には(ステップS382)、前記読み出した中
間コードに含まれる仮想関数フラグを「real」に書
き換え、前記中間コードを第4記憶部39に書き込み
(ステップS383)、再度処理を繰り返す。
【0158】最適化部38は、前記中間コードに含まれ
るクラス名と関数名とが、オーバーライド集合記憶部3
5cに記憶されている場合には(ステップS382)、
前記中間コードに対して通常の最適化処理を施し、通常
の最適化処理の施された中間コードを第4記憶部39に
書き込み(ステップS384)、再度処理を繰り返す。 3.まとめ 以上説明したように、関数の置き換え(オーバーライ
ド)が行われない仮想関数の呼出しを直接呼出しに変換
することにより、最適化処理を適用できる機会が増え、
生成される実行形式命令を少なくすることができる。
【0159】第2の実施形態と同様に、図30に示すフ
ァイル1103から、仮想関数呼び出しをそのままにし
て生成した実行形式命令を図39(a)に示し、関数の
置き換え(オーバーライド)が行われない仮想関数の呼
出しを直接呼出しに変換することにより、前記最適化処
理を適用し、さらに、関数のインライン展開を適用する
ことにより、ファイル1103から生成した実行形式命
令を図39(b)に示す。この図に示すように、生成さ
れる実行形式命令は少なくなっている。 V その他の変形例 なお、本発明を上記の実施の形態に基づいて説明してき
たが、本発明は、上記の実施の形態に限定されないのは
もちろんである。以下のような場合も本発明に含まれ
る。 (1)本発明は、上記に示す方法であるとしてもよい。
また、本発明はコンピュータプログラムによって実現
し、前記プログラムをフロッピー(登録商標)ディスク
等のコンピュータ読み取り可能な記録媒体に記録して移
送することにより、又は前記プログラムをネットワーク
を経由して移送することにより、独立した他のコンピュ
ータシステムで容易に実施することができる。 (2)上記の実施の形態及び上記変形例を、それぞれ組
み合わせるとしてもよい。
【0160】
【発明の効果】上記の目的を達成するために、本発明
は、オブジェクト指向言語に基づくソースプログラムか
ら1以上の実行形式命令を生成するプログラム変換装置
であって、複数のクラス定義と呼出命令とを含むソース
プログラムを記憶している記憶手段と、前記呼出命令
は、1個の仮想的関数を識別する関数名を含み、各クラ
ス定義は、クラスと、前記クラスと他のクラスとの継承
関係と、前記関数名で識別され前記クラスに属する仮想
的関数とを定義し、前記呼出命令の実行時に複数のクラ
スで定義される仮想的関数のうち1個の仮想的関数のみ
が実行され、前記呼出命令に含まれる関数名により識別
される仮想的関数について、前記複数のクラス定義で定
義されている前記複数の仮想的関数のうちの1個の仮想
的関数のみが呼び出されると確定できるか否かを、前記
呼出命令を実行することなく前記ソースプログラムを用
いて、判断する判断手段と、前記判断手段により確定で
きると判断される場合に、前記1個の仮想的関数に対応
する実行形式命令群を直接呼び出す実行形式命令を生成
する生成手段とを備える。
【0161】この構成によると、呼出命令により呼び出
される仮想的関数について、複数の関数のうちの1個の
関数のみが呼び出されると確定できる場合に、仮想的関
数を直接呼び出す実行形式命令群を生成するので、生成
される実行形式命令数を少なくすることができ、実行形
式命令の生成効率を向上することができる。ここで、前
記判断手段は、前記ソースプログラムに含まれる各クラ
ス定義を用いて、前記呼出命令に含まれる関数名により
識別される仮想的関数が、他のクラスにより継承されな
いクラスに属するか否かを判断することにより、確定で
きるか否かを判断し、前記生成手段は、前記判断手段に
より、前記呼出命令に含まれる関数名により識別される
仮想的関数が他のクラスにより継承されないクラスに属
すると判断される場合に、前記実行形式命令を生成する
ように構成してもよい。
【0162】この構成によると、前記ソースプログラム
に含まれるクラス定義を用いて、前記呼出命令により呼
び出される仮想的関数が、他のクラスにより継承されな
いクラスに属するか否かを判断することにより、1個の
関数のみが呼び出されると確定できるので、前記確定判
断を確実に行うことができる。ここで、前記記憶手段が
記憶しているソースプログラムにおいて、各クラス定義
は、各クラスが他のクラスを継承する場合に、前記他の
クラスを示す基底クラスを含み、これによりクラスが他
のクラスを継承するか否かを示し、前記判断手段は、前
記ソースプログラムに含まれる全てのクラス定義を読み
出し、読み出したクラス定義からクラスを抽出し、抽出
したクラスを記憶するクラス抽出手段と、前記ソースプ
ログラムに含まれる全てのクラス定義を読み出し、読み
出したクラス定義から基底クラスを抽出し、抽出した基
底クラスを記憶する継承関係抽出手段と、前記クラス抽
出手段に記憶されているクラスから、前記継承関係抽出
手段に記憶されている基底クラスを除いた残りのクラス
を抽出し、抽出したクラスを記憶する継承関係解析手段
と、前記継承関係解析手段に記憶されているクラスを含
むクラス定義を含む前記ソースプログラムに、最適化情
報を書き込む最適化情報付加手段と、前記ソースプログ
ラムに書き込まれた前記最適化情報を用いて、前記呼出
命令に含まれる関数名により識別される仮想的関数が、
他のクラスにより継承されないクラスに属するか否かを
判断するクラス判断手段とを含むように構成してもよ
い。
【0163】この構成によると、他のクラスへ継承され
ないクラスを示す最適化情報を、クラス定義を含むソー
スプログラムに付加するので、付加されたソースプログ
ラムを再利用する場合に、最適化情報の付加処理を省略
することができる。ここで、前記最適化情報付加手段
は、前記記憶手段に記憶されているソースプログラム内
のクラス定義であって、前記継承関係解析手段に記憶さ
れているクラスを定義しているものに対応して前記最適
化情報を書き込むように構成してもよい。
【0164】この構成によると、継承関係解析手段に記
憶されているクラスを含むクラス定義に対応して最適化
情報を付加するので、最適化情報が付加されたクラス定
義の検出が容易となる。ここで、前記最適化情報付加手
段は、前記記憶手段に記憶されているソースプログラム
内のクラス定義に含まれる仮想的関数であって、前記継
承関係解析手段に記憶されているクラスを定義している
クラス定義内のものに対応して、前記最適化情報を書き
込むように構成してもよい。
【0165】この構成によると、継承関係解析手段に記
憶されているクラスを含むクラス定義内の仮想的関数に
対応して最適化情報を付加するので、最適化情報が付加
された仮想的関数の検出が容易となる。ここで、前記最
適化情報は、オブジェクト指向言語における予約語であ
るように構成してもよい。
【0166】この構成によると、最適化情報はオブジェ
クト指向言語における予約語であるので、プログラムの
汎用性を失うことなく、かつこのキーワードを解釈する
全てのコンパイラによって最適化情報を認識することが
出来る。ここで、前記最適化情報は、前記プログラム変
換装置に固有の文字列であるように構成してもよい。
【0167】この構成によると、特定のコンパイラ装置
のみが固有の最適化情報を認識し、その他のコンパイラ
は最適化情報を無視するので、特定のコンパイラ装置に
対する最適化情報を持ちながらもプログラムの正当性が
維持される。ここで、前記プログラム変換装置は、ソー
スプログラムから中間形式プログラムを介して実行形式
プログラムを生成し、前記記憶手段が記憶しているソー
スプログラムにおいて、各クラス定義は、クラス定義に
より定義されているクラスが他のクラスを継承する場合
に、前記他のクラスを示す基底クラスを含み、これによ
り定義されているクラスが他のクラスを継承するか否か
を示し、前記判断手段は、前記ソースプログラムに含ま
れる全てのクラス定義を読み出し、読み出したクラス定
義からクラスを抽出するクラス抽出手段と、前記ソース
プログラムに含まれる全てのクラス定義を読み出し、読
み出したクラス定義から基底クラスを抽出する継承関係
抽出手段と、前記クラス抽出手段により抽出されたクラ
スから、前記継承関係抽出手段により抽出された基底ク
ラスを除いた残りのクラスを抽出する継承関係解析手段
と、前記ソースプログラムに含まれる前記呼出命令か
ら、前記仮想的関数を呼び出す中間形式の呼出命令を生
成する中間形式生成手段と、前記生成された中間形式の
呼出命令に含まれる関数名により識別される仮想的関数
が、前記継承関係解析手段により抽出されたクラスに属
するか否かを判断する中間形式判断手段とを備え、前記
生成手段は、前記中間形式判断手段により、前記クラス
に属すると判断される場合に、前記実行形式命令を生成
するように構成してもよい。
【0168】この構成によると、ソースプログラムを改
変することなく、前記呼出命令により呼び出される仮想
的関数が、他のクラスにより継承されないクラスに属す
るか否かを判断することができるので、ソースプログラ
ムの一元的な管理が容易となる。ここで、前記判断手段
は、前記ソースプログラムに含まれるクラス定義を用い
て、前記呼出命令に含まれる関数名により識別される仮
想的関数の置き換えが行われるか否かを判断することに
より、確定できるか否かを判断し、前記生成手段は、前
記判断手段により置き換えが行われないと判断される場
合に、前記実行形式命令を生成するように構成してもよ
い。
【0169】この構成によると、前記ソースプログラム
に含まれるクラス定義を用いて、前記呼出命令により呼
び出される仮想的関数の置き換えが行われるか否かを判
断することにより、1個の関数のみが呼び出されると確
定できるので、前記確定判断を確実に行うことができ
る。ここで、前記記憶手段が記憶しているソースプログ
ラムにおいて、各クラス定義は、定義されているクラス
が他のクラスを継承する場合に、前記他のクラスを示す
基底クラスを含み、これにより定義されているクラスが
他のクラスを継承するか否かを示し、前記判断手段は、
前記ソースプログラムに含まれる全てのクラス定義を読
み出し、読み出したクラス定義を用いて、置き換えの行
われる仮想的関数を抽出する置換関数抽出手段を含み、
前記置換関数抽出手段は、前記ソースプログラムに含ま
れるクラス定義を読み出し、読み出したクラス定義に基
底クラスが含まれているか否かを判断する読出判断部
と、読み出したクラス定義に基底クラスが含まれない場
合に、前記クラス定義に含まれている仮想的関数を、読
み出したクラス定義により定義されているクラスに属す
る仮想的関数であると決定する第1決定部と、読み出し
たクラス定義に基底クラスが含まれる場合に、基底クラ
スに属すると決定された仮想的関数を、読み出したクラ
ス定義により定義されているクラスに属する仮想的関数
であると仮に決定し、読み出した前記クラス定義に含ま
れている仮想的関数が、前記仮に決定された仮想的関数
と一致するか否かを判断し、一致すると判断する場合
に、仮に決定された仮想的関数の代わりに、読み出した
前記クラス定義に含まれている仮想的関数を、読み出し
た前記クラス定義により定義されているクラスに属する
仮想的関数であると決定し、前記仮に決定された仮想的
関数を置き換えの行われる仮想的関数として抽出する第
2決定部と、前記ソースプログラムに、抽出された置き
換えの行われる仮想的関数を示す最適化情報を書き込む
最適化情報付加手段と、前記ソースプログラムに書き込
まれた前記最適化情報を用いて、前記呼出命令に含まれ
る関数名により識別される仮想的関数が、置き換えの行
われる仮想的関数であるか否かを判断する置換判断手段
とを含み、前記生成手段は、前記置換判断手段により、
置き換えの行われる仮想的関数であると判断される場合
に、前記実行形式命令を生成するように構成してもよ
い。
【0170】この構成によると、置き換えが行われる仮
想的関数を示す最適化情報をソースプログラムに付加す
るので、付加されたソースプログラムを再利用する場合
に、最適化情報の付加処理を省略することができる。こ
こで、前記プログラム変換装置は、前記ソースプログラ
ムから中間形式プログラムを介して実行形式プログラム
を生成し、前記記憶手段が記憶しているソースプログラ
ムにおいて、各クラス定義は、定義されているクラスが
他のクラスを継承する場合に、前記他のクラスを示す基
底クラスを含み、これにより定義されているクラスが他
のクラスを継承するか否かを示し、前記判断手段は、前
記ソースプログラムに含まれる全てのクラス定義を読み
出し、読み出したクラス定義を用いて、置き換えの行わ
れる仮想的関数を抽出する置換関数抽出手段を含み、前
記置換関数抽出手段は、前記ソースプログラムに含まれ
るクラス定義を読み出し、読み出したクラス定義に基底
クラスが含まれているか否かを判断する読出判断部と、
読み出したクラス定義に基底クラスが含まれない場合
に、前記クラス定義に含まれている仮想的関数を、読み
出したクラス定義により定義されているクラスに属する
仮想的関数であると決定する第1決定部と、読み出した
クラス定義に基底クラスが含まれる場合に、基底クラス
に属すると決定された仮想的関数を、読み出したクラス
定義により定義されているクラスに属する仮想的関数で
あると仮に決定し、読み出した前記クラス定義に含まれ
ている仮想的関数が、前記仮に決定された仮想的関数と
一致するか否かを判断し、一致すると判断する場合に、
仮に決定された仮想的関数の代わりに、読み出した前記
クラス定義に含まれている仮想的関数を、読み出した前
記クラス定義により定義されているクラスに属する仮想
的関数であると決定し、前記仮に決定された仮想的関数
を置き換えの行われる仮想的関数として抽出する第2決
定部と、前記ソースプログラムに含まれる前記呼出命令
から、前記仮想的関数を識別する関数名を含む中間形式
の呼出命令を生成する中間形式生成手段と、前記生成さ
れた中間形式の呼出命令に含まれる関数名により識別さ
れる仮想的関数が、置き換えの行われる仮想的関数であ
るか否かを判断する中間形式判断手段とを含み、前記生
成手段は、前記中間形式判断手段により、置き換えの行
われる仮想的関数であると判断される場合に、前記実行
形式命令を生成するように構成してもよい。
【0171】この構成によると、ソースプログラムを改
変することなく、前記呼出命令により呼び出される仮想
的関数の置き換えが行われるか否かを判断することがで
きるので、ソースプログラムの一元的な管理が容易とな
る。
【図面の簡単な説明】
【図1】本発明の1つの実施の形態としてのプログラム
変換装置120の構成を示すブロック図である。
【図2】本発明の最適化情報付加装置100の構成を示
すブロック図である。
【図3】プログラム記憶部11が記憶しているファイル
の一例を示す。
【図4】入力部12が入力を受け付けた文字列を表示す
る様子を示す一例である。
【図5】クラス定義集合DSET420の一例を示す。
【図6】全クラス定義集合TSETの一例を示す。
【図7】クラス定義ファイルの一例を示す。
【図8】被継承クラス集合ISETの一例を示す。
【図9】最適化情報が付加された後のプログラム記憶部
11に記憶されているファイルの一例を示す。
【図10】最適化情報付加装置100の全体の動作を示
すフローチャートである。
【図11】クラス定義抽出部14の動作を示すフローチ
ャートである。
【図12】継承関係解析部19の動作を示すフローチャ
ートである。
【図13】最適化情報付加部21の動作を示すフローチ
ャートである。
【図14】コンパイラ装置110の構成を示すブロック
図である。
【図15】終端クラステーブルの一例を示す。
【図16】中間コードの一例を示す。
【図17】コード生成部42により生成された実行形式
プログラムの一例を示す。
【図18】コンパイラ装置110の全体の動作を示すフ
ローチャートである。
【図19】構文解析部33の動作を示すフローチャート
である。
【図20】最適化部38の動作を示すフローチャートで
ある。
【図21】コード生成部42の動作を示すフローチャー
トである。
【図22】最適化処理を行なった中間コードに対して、
資源割付部40による資源割付けを行ない、コード生成
部42によるコード生成を行って生成される実行形式プ
ログラムの一例を示す。
【図23】C++言語の規格に基づくクラス定義の一例
を示す。
【図24】図23に示す3つのクラスX、Y、Zの継承
関係をに示す。
【図25】ポインタが指し示すオブジェクトと、クラス
との関係を示す一例である。
【図26】実行される関数が動的に決定される場合のコ
ーディングの一例である。
【図27】仮想関数が宣言されているクラスのオブジェ
クト及び仮想関数表の構成の一例を示す。
【図28】C++言語による仮想関数の呼出しを行うソ
ースプログラムと、前記ソースプログラムを基にして生
成された実行形式プログラムとを示す。
【図29】本発明の別の実施の形態としてのプログラム
変換装置120の最適化情報付加装置100aの構成を
示すブロック図である。
【図30】プログラム記憶部11aが記憶しているファ
イルの一例を示す。
【図31】仮想関数集合記憶部27が記憶しているデー
タの一例を示す。
【図32】オーバーライド集合記憶部28が記憶してい
るデータの一例を示す。
【図33】最適化情報が付加された後のプログラムの一
例を示す。
【図34】最適化情報付加装置100aの全体の動作を
示すフローチャートである。
【図35】最適化情報付加装置100aの仮想関数解析
処理の動作を示すフローチャートである。
【図36】最適化情報付加装置100aの最適化情報付
加処理の動作を示すフローチャートである。
【図37】コンパイラ装置110aの構文解析処理の動
作を示すフローチャートである。
【図38】コンパイラ装置110aの最適化処理の動作
を示すフローチャートである。
【図39】(a)ファイル1103から、仮想関数呼び
出しをそのままにして生成した実行形式命令を示す。 (b)関数の置き換え(オーバーライド)が行われない
仮想関数の呼出しを直接呼出しに変換することにより、
前記最適化処理を適用し、さらに、関数のインライン展
開を適用することにより、ファイル1103から生成し
た実行形式命令を示す。
【図40】本発明の第3の実施形態としてのプログラム
変換装置120bの最適化情報解析装置130の構成を
示すブロック図である。
【図41】最適化情報解析装置130の全体の動作を示
すフローチャートである。
【図42】継承関係抽出部50の動作を示すフローチャ
ートである。
【図43】コンパイラ装置110bの構成を示すブロッ
ク図である。
【図44】コンパイラ装置110bの全体の動作を示す
フローチャートである。
【図45】本発明の第4の実施形態としてのプログラム
変換装置120cの最適化情報解析装置130cの構成
を示すブロック図である。
【図46】プログラム変換装置120cのコンパイラ装
置110cの構成を示すブロック図である。
【図47】コンパイラ装置110cの全体の動作を示す
フローチャートである。
【符号の説明】
11 11a プログラム記憶部 12 12a 12b 入力部 13 未読ファイル集合記憶部 14 クラス定義抽出部 15 全クラス定義集合記憶部 16 クラス定義ファイル記憶部 17 継承関係抽出部 18 被継承クラス集合記憶部 19 継承関係解析部 20 終端クラス集合記憶部 21 21a 最適化情報付加部 22 変更ファイル集合記憶部 23 23a 出力部 26 仮想関数解析部 27 仮想関数集合記憶部 28 オーバーライド集合記憶部 31 入力部 32 32b 第1記憶部 33 33b 33c 構文解析部 34 第2記憶部 35 終端クラス記憶部 35a 35c オーバーライド集合記憶部 36 中間コード生成部 37 第3記憶部 38 最適化部 39 第4記憶部 40 資源割付部 41 第5記憶部 42 コード生成部 43 生成コード記憶部 50 継承関係抽出部 51 継承関係記憶部 52 全クラス定義集合記憶部 54 中間コード記憶部 55 55c 中間コード入力部 56 継承関係解析部 57 仮想関数解析部 58 仮想関数記憶部 100 100a 最適化情報付加装置 110 110a 110b 110c コンパイラ
装置 120 120a 120b 120c プログラム
変換装置 130 130c 最適化情報解析装置

Claims (20)

    【特許請求の範囲】
  1. 【請求項1】 オブジェクト指向言語に基づくソースプ
    ログラムから1以上の実行形式命令を生成するプログラ
    ム変換装置であって、 複数のクラス定義と呼出命令とを含むソースプログラム
    を記憶している記憶手段と、 前記呼出命令は、1個の仮想的関数を識別する関数名を
    含み、 各クラス定義は、クラスと、前記クラスと他のクラスと
    の継承関係と、前記関数名で識別され前記クラスに属す
    る仮想的関数とを定義し、 前記呼出命令の実行時に複数のクラスで定義される仮想
    的関数のうち1個の仮想的関数のみが実行され、 前記呼出命令に含まれる関数名により識別される仮想的
    関数について、前記複数のクラス定義で定義されている
    前記複数の仮想的関数のうちの1個の仮想的関数のみが
    呼び出されると確定できるか否かを、前記呼出命令を実
    行することなく前記ソースプログラムを用いて、判断す
    る判断手段と、 前記判断手段により確定できると判断される場合に、前
    記1個の仮想的関数に対応する実行形式命令群を直接呼
    び出す実行形式命令を生成する生成手段とを備えること
    を特徴とするプログラム変換装置。
  2. 【請求項2】 前記判断手段は、前記ソースプログラム
    に含まれる各クラス定義を用いて、前記呼出命令に含ま
    れる関数名により識別される仮想的関数が、他のクラス
    により継承されないクラスに属するか否かを判断するこ
    とにより、確定できるか否かを判断し、 前記生成手段は、前記判断手段により、前記呼出命令に
    含まれる関数名により識別される仮想的関数が他のクラ
    スにより継承されないクラスに属すると判断される場合
    に、前記実行形式命令を生成することを特徴とする請求
    項1に記載のプログラム変換装置。
  3. 【請求項3】 前記記憶手段が記憶しているソースプロ
    グラムにおいて、各クラス定義は、各クラスが他のクラ
    スを継承する場合に、前記他のクラスを示す基底クラス
    を含み、これによりクラスが他のクラスを継承するか否
    かを示し、 前記判断手段は、 前記ソースプログラムに含まれる全てのクラス定義を読
    み出し、読み出したクラス定義からクラスを抽出し、抽
    出したクラスを記憶するクラス抽出手段と、 前記ソースプログラムに含まれる全てのクラス定義を読
    み出し、読み出したクラス定義から基底クラスを抽出
    し、抽出した基底クラスを記憶する継承関係抽出手段
    と、 前記クラス抽出手段に記憶されているクラスから、前記
    継承関係抽出手段に記憶されている基底クラスを除いた
    残りのクラスを抽出し、抽出したクラスを記憶する継承
    関係解析手段と、 前記継承関係解析手段に記憶されているクラスを含むク
    ラス定義を含む前記ソースプログラムに、最適化情報を
    書き込む最適化情報付加手段と、 前記ソースプログラムに書き込まれた前記最適化情報を
    用いて、前記呼出命令に含まれる関数名により識別され
    る仮想的関数が、他のクラスにより継承されないクラス
    に属するか否かを判断するクラス判断手段とを含むこと
    を特徴とする請求項2に記載のプログラム変換装置。
  4. 【請求項4】 前記最適化情報付加手段は、前記記憶手
    段に記憶されているソースプログラム内のクラス定義で
    あって、前記継承関係解析手段に記憶されているクラス
    を定義しているものに対応して前記最適化情報を書き込
    むことを特徴とする請求項3に記載のプログラム変換装
    置。
  5. 【請求項5】 前記最適化情報付加手段は、前記記憶手
    段に記憶されているソースプログラム内のクラス定義に
    含まれる仮想的関数であって、前記継承関係解析手段に
    記憶されているクラスを定義しているクラス定義内のも
    のに対応して、前記最適化情報を書き込むことを特徴と
    する請求項3に記載のプログラム変換装置。
  6. 【請求項6】 前記最適化情報は、オブジェクト指向言
    語における予約語であることを特徴とする請求項5に記
    載のプログラム変換装置。
  7. 【請求項7】 前記最適化情報は、前記プログラム変換
    装置に固有の文字列であることを特徴とする請求項5に
    記載のプログラム変換装置。
  8. 【請求項8】 前記プログラム変換装置は、ソースプロ
    グラムから中間形式プログラムを介して実行形式プログ
    ラムを生成し、 前記記憶手段が記憶しているソースプログラムにおい
    て、各クラス定義は、クラス定義により定義されている
    クラスが他のクラスを継承する場合に、前記他のクラス
    を示す基底クラスを含み、これにより定義されているク
    ラスが他のクラスを継承するか否かを示し、 前記判断手段は、 前記ソースプログラムに含まれる全てのクラス定義を読
    み出し、読み出したクラス定義からクラスを抽出するク
    ラス抽出手段と、 前記ソースプログラムに含まれる全てのクラス定義を読
    み出し、読み出したクラス定義から基底クラスを抽出す
    る継承関係抽出手段と、 前記クラス抽出手段により抽出されたクラスから、前記
    継承関係抽出手段により抽出された基底クラスを除いた
    残りのクラスを抽出する継承関係解析手段と、 前記ソースプログラムに含まれる前記呼出命令から、前
    記仮想的関数を呼び出す中間形式の呼出命令を生成する
    中間形式生成手段と、 前記生成された中間形式の呼出命令に含まれる関数名に
    より識別される仮想的関数が、前記継承関係解析手段に
    より抽出されたクラスに属するか否かを判断する中間形
    式判断手段とを備え、 前記生成手段は、前記中間形式判断手段により、前記ク
    ラスに属すると判断される場合に、前記実行形式命令を
    生成することを特徴とする請求項2に記載のプログラム
    変換装置。
  9. 【請求項9】 前記判断手段は、前記ソースプログラム
    に含まれるクラス定義を用いて、前記呼出命令に含まれ
    る関数名により識別される仮想的関数の置き換えが行わ
    れるか否かを判断することにより、確定できるか否かを
    判断し、 前記生成手段は、前記判断手段により置き換えが行われ
    ないと判断される場合に、前記実行形式命令を生成する
    ことを特徴とする請求項1に記載のプログラム変換装
    置。
  10. 【請求項10】 前記記憶手段が記憶しているソースプ
    ログラムにおいて、各クラス定義は、定義されているク
    ラスが他のクラスを継承する場合に、前記他のクラスを
    示す基底クラスを含み、これにより定義されているクラ
    スが他のクラスを継承するか否かを示し、 前記判断手段は、前記ソースプログラムに含まれる全て
    のクラス定義を読み出し、読み出したクラス定義を用い
    て、置き換えの行われる仮想的関数を抽出する置換関数
    抽出手段を含み、 前記置換関数抽出手段は、 前記ソースプログラムに含まれるクラス定義を読み出
    し、読み出したクラス定義に基底クラスが含まれている
    か否かを判断する読出判断部と、 読み出したクラス定義に基底クラスが含まれない場合
    に、前記クラス定義に含まれている仮想的関数を、読み
    出したクラス定義により定義されているクラスに属する
    仮想的関数であると決定する第1決定部と、 読み出したクラス定義に基底クラスが含まれる場合に、
    基底クラスに属すると決定された仮想的関数を、読み出
    したクラス定義により定義されているクラスに属する仮
    想的関数であると仮に決定し、 読み出した前記クラス定義に含まれている仮想的関数
    が、前記仮に決定された仮想的関数と一致するか否かを
    判断し、 一致すると判断する場合に、仮に決定された仮想的関数
    の代わりに、読み出した前記クラス定義に含まれている
    仮想的関数を、読み出した前記クラス定義により定義さ
    れているクラスに属する仮想的関数であると決定し、前
    記仮に決定された仮想的関数を置き換えの行われる仮想
    的関数として抽出する第2決定部と、 前記ソースプログラムに、抽出された置き換えの行われ
    る仮想的関数を示す最適化情報を書き込む最適化情報付
    加手段と、 前記ソースプログラムに書き込まれた前記最適化情報を
    用いて、前記呼出命令に含まれる関数名により識別され
    る仮想的関数が、置き換えの行われる仮想的関数である
    か否かを判断する置換判断手段とを含み、 前記生成手段は、前記置換判断手段により、置き換えの
    行われる仮想的関数であると判断される場合に、前記実
    行形式命令を生成することを特徴とする請求項9に記載
    のプログラム変換装置。
  11. 【請求項11】 前記プログラム変換装置は、前記ソー
    スプログラムから中間形式プログラムを介して実行形式
    プログラムを生成し、 前記記憶手段が記憶しているソースプログラムにおい
    て、各クラス定義は、定義されているクラスが他のクラ
    スを継承する場合に、前記他のクラスを示す基底クラス
    を含み、これにより定義されているクラスが他のクラス
    を継承するか否かを示し、 前記判断手段は、前記ソースプログラムに含まれる全て
    のクラス定義を読み出し、読み出したクラス定義を用い
    て、置き換えの行われる仮想的関数を抽出する置換関数
    抽出手段を含み、 前記置換関数抽出手段は、 前記ソースプログラムに含まれるクラス定義を読み出
    し、読み出したクラス定義に基底クラスが含まれている
    か否かを判断する読出判断部と、 読み出したクラス定義に基底クラスが含まれない場合
    に、前記クラス定義に含まれている仮想的関数を、読み
    出したクラス定義により定義されているクラスに属する
    仮想的関数であると決定する第1決定部と、 読み出したクラス定義に基底クラスが含まれる場合に、
    基底クラスに属すると決定された仮想的関数を、読み出
    したクラス定義により定義されているクラスに属する仮
    想的関数であると仮に決定し、 読み出した前記クラス定義に含まれている仮想的関数
    が、前記仮に決定された仮想的関数と一致するか否かを
    判断し、 一致すると判断する場合に、仮に決定された仮想的関数
    の代わりに、読み出した前記クラス定義に含まれている
    仮想的関数を、読み出した前記クラス定義により定義さ
    れているクラスに属する仮想的関数であると決定し、前
    記仮に決定された仮想的関数を置き換えの行われる仮想
    的関数として抽出する第2決定部と、 前記ソースプログラムに含まれる前記呼出命令から、前
    記仮想的関数を識別する関数名を含む中間形式の呼出命
    令を生成する中間形式生成手段と、 前記生成された中間形式の呼出命令に含まれる関数名に
    より識別される仮想的関数が、置き換えの行われる仮想
    的関数であるか否かを判断する中間形式判断手段とを含
    み、 前記生成手段は、前記中間形式判断手段により、置き換
    えの行われる仮想的関数であると判断される場合に、前
    記実行形式命令を生成することを特徴とする請求項9に
    記載のプログラム変換装置。
  12. 【請求項12】 オブジェクト指向言語に基づくソース
    プログラムから1以上の実行形式命令を生成し、複数の
    クラス定義と呼出命令とを含むソースプログラムを記憶
    している記憶手段を備えるプログラム変換装置で用いら
    れるプログラム変換方法であって、 前記呼出命令は、1個の仮想的関数を識別する関数名を
    含み、 各クラス定義は、クラスと、前記クラスと他のクラスと
    の継承関係と、前記関数名で識別され前記クラスに属す
    る仮想的関数とを定義し、 前記呼出命令の実行時に複数のクラスで定義される仮想
    的関数のうち1個の仮想的関数のみが実行され、 前記プログラム変換プログラムは、 前記呼出命令に含まれる関数名により識別される仮想的
    関数について、前記複数のクラス定義で定義されている
    前記複数の仮想的関数のうちの1個の仮想的関数のみが
    呼び出されると確定できるか否かを、前記呼出命令を実
    行することなく前記ソースプログラムを用いて、判断す
    る判断ステップと、 前記判断ステップにより確定できると判断される場合
    に、前記1個の仮想的関数に対応する実行形式命令群を
    直接呼び出す実行形式命令を生成する生成ステップと、 を含むことを特徴とするプログラム変換方法。
  13. 【請求項13】 オブジェクト指向言語に基づくソース
    プログラムから1以上の実行形式命令を生成し、複数の
    クラス定義と呼出命令とを含むソースプログラムを記憶
    している記憶手段を備えるコンピュータで用いられるプ
    ログラム変換プログラムを記録しているコンピュータ読
    み取り可能な記録媒体であって、 前記呼出命令は、1個の仮想的関数を識別する関数名を
    含み、 各クラス定義は、クラスと、前記クラスと他のクラスと
    の継承関係と、前記関数名で識別され前記クラスに属す
    る仮想的関数とを定義し、 前記呼出命令の実行時に複数のクラスで定義される仮想
    的関数のうち1個の仮想的関数のみが実行され、 前記プログラム変換プログラムは、 前記呼出命令に含まれる関数名により識別される仮想的
    関数について、前記複数のクラス定義で定義されている
    前記複数の仮想的関数のうちの1個の仮想的関数のみが
    呼び出されると確定できるか否かを、前記呼出命令を実
    行することなく前記ソースプログラムを用いて、判断す
    る判断ステップと、 前記判断ステップにより確定できると判断される場合
    に、前記1個の仮想的関数に対応する実行形式命令群を
    直接呼び出す実行形式命令を生成する生成ステップとを
    含むことを特徴とする記録媒体。
  14. 【請求項14】 前記判断ステップは、前記ソースプロ
    グラムに含まれる各クラス定義を用いて、前記呼出命令
    に含まれる関数名により識別される仮想的関数が、他の
    クラスにより継承されないクラスに属するか否かを判断
    することにより、確定できるか否かを判断し、 前記生成ステップは、前記判断ステップにより、前記呼
    出命令に含まれる関数名により識別される仮想的関数が
    他のクラスにより継承されないクラスに属すると判断さ
    れる場合に、前記実行形式命令を生成することを特徴と
    する請求項13に記載の記録媒体。
  15. 【請求項15】 前記記憶手段が記憶しているソースプ
    ログラムにおいて、各クラス定義は、各クラスが他のク
    ラスを継承する場合に、前記他のクラスを示す基底クラ
    スを含み、これによりクラスが他のクラスを継承するか
    否かを示し、 前記判断ステップは、 前記ソースプログラムに含まれる全てのクラス定義を読
    み出し、読み出したクラス定義からクラスを抽出し、抽
    出したクラスを記憶するクラス抽出ステップと、 前記ソースプログラムに含まれる全てのクラス定義を読
    み出し、読み出したクラス定義から基底クラスを抽出
    し、抽出した基底クラスを記憶する継承関係抽出ステッ
    プと、 前記クラス抽出ステップに記憶されているクラスから、
    前記継承関係抽出ステップに記憶されている基底クラス
    を除いた残りのクラスを抽出し、抽出したクラスを記憶
    する継承関係解析ステップと、 前記継承関係解析ステップに記憶されているクラスを含
    むクラス定義を含む前記ソースプログラムに、最適化情
    報を書き込む最適化情報付加ステップと、 前記ソースプログラムに書き込まれた前記最適化情報を
    用いて、前記呼出命令に含まれる関数名により識別され
    る仮想的関数が、他のクラスにより継承されないクラス
    に属するか否かを判断するクラス判断ステップとを含む
    ことを特徴とする請求項14に記載の記録媒体。
  16. 【請求項16】 前記最適化情報付加ステップは、前記
    記憶手段に記憶されているソースプログラム内のクラス
    定義であって、前記継承関係解析ステップに記憶されて
    いるクラスを定義しているものに対応して前記最適化情
    報を書き込むことを特徴とする請求項15に記載の記録
    媒体。
  17. 【請求項17】 前記プログラム変換装置は、ソースプ
    ログラムから中間形式プログラムを介して実行形式プロ
    グラムを生成し、 前記記憶手段が記憶しているソースプログラムにおい
    て、各クラス定義は、クラス定義により定義されている
    クラスが他のクラスを継承する場合に、前記他のクラス
    を示す基底クラスを含み、これにより定義されているク
    ラスが他のクラスを継承するか否かを示し、 前記判断ステップは、 前記ソースプログラムに含まれる全てのクラス定義を読
    み出し、読み出したクラス定義からクラスを抽出するク
    ラス抽出ステップと、 前記ソースプログラムに含まれる全てのクラス定義を読
    み出し、読み出したクラス定義から基底クラスを抽出す
    る継承関係抽出ステップと、 前記クラス抽出ステップにより抽出されたクラスから、
    前記継承関係抽出ステップにより抽出された基底クラス
    を除いた残りのクラスを抽出する継承関係解析ステップ
    と、 前記ソースプログラムに含まれる前記呼出命令から、前
    記仮想的関数を呼び出す中間形式の呼出命令を生成する
    中間形式生成ステップと、 前記生成された中間形式の呼出命令に含まれる関数名に
    より識別される仮想的関数が、前記継承関係解析ステッ
    プにより抽出されたクラスに属するか否かを判断する中
    間形式判断ステップとを備え、 前記生成ステップは、前記中間形式判断ステップによ
    り、前記クラスに属すると判断される場合に、前記実行
    形式命令を生成することを特徴とする請求項14に記載
    の記録媒体。
  18. 【請求項18】 前記判断ステップは、前記ソースプロ
    グラムに含まれるクラス定義を用いて、前記呼出命令に
    含まれる関数名により識別される仮想的関数の置き換え
    が行われるか否かを判断することにより、確定できるか
    否かを判断し、 前記生成ステップは、前記判断ステップにより置き換え
    が行われないと判断される場合に、前記実行形式命令を
    生成するを含むことを特徴とする請求項13に記載の記
    録媒体。
  19. 【請求項19】 前記記憶手段が記憶しているソースプ
    ログラムにおいて、各クラス定義は、定義されているク
    ラスが他のクラスを継承する場合に、前記他のクラスを
    示す基底クラスを含み、これにより定義されているクラ
    スが他のクラスを継承するか否かを示し、 前記判断ステップは、前記ソースプログラムに含まれる
    全てのクラス定義を読み出し、読み出したクラス定義を
    用いて、置き換えの行われる仮想的関数を抽出する置換
    関数抽出ステップを含み、 前記置換関数抽出ステップは、 前記ソースプログラムに含まれるクラス定義を読み出
    し、読み出したクラス定義に基底クラスが含まれている
    か否かを判断する読出判断サブステップと、 読み出したクラス定義に基底クラスが含まれない場合
    に、前記クラス定義に含まれている仮想的関数を、読み
    出したクラス定義により定義されているクラスに属する
    仮想的関数であると決定する第1決定サブステップと、 読み出したクラス定義に基底クラスが含まれる場合に、
    基底クラスに属すると決定された仮想的関数を、読み出
    したクラス定義により定義されているクラスに属する仮
    想的関数であると仮に決定し、 読み出した前記クラス定義に含まれている仮想的関数
    が、前記仮に決定された仮想的関数と一致するか否かを
    判断し、 一致すると判断する場合に、仮に決定された仮想的関数
    の代わりに、読み出した前記クラス定義に含まれている
    仮想的関数を、読み出した前記クラス定義により定義さ
    れているクラスに属する仮想的関数であると決定し、前
    記仮に決定された仮想的関数を置き換えの行われる仮想
    的関数として抽出する第2決定サブステップと、 前記ソースプログラムに、抽出された置き換えの行われ
    る仮想的関数を示す最適化情報を書き込む最適化情報付
    加ステップと、 前記ソースプログラムに書き込まれた前記最適化情報を
    用いて、前記呼出命令に含まれる関数名により識別され
    る仮想的関数が、置き換えの行われる仮想的関数である
    か否かを判断する置換判断ステップとを含み、 前記生成ステップは、前記置換判断ステップにより、置
    き換えの行われる仮想的関数であると判断される場合
    に、前記実行形式命令を生成するを含むことを特徴とす
    る請求項18に記載の記録媒体。
  20. 【請求項20】 前記プログラム変換装置は、前記ソー
    スプログラムから中間形式プログラムを介して実行形式
    プログラムを生成し、 前記記憶手段が記憶しているソースプログラムにおい
    て、各クラス定義は、定義されているクラスが他のクラ
    スを継承する場合に、前記他のクラスを示す基底クラス
    を含み、これにより定義されているクラスが他のクラス
    を継承するか否かを示し、 前記判断ステップは、前記ソースプログラムに含まれる
    全てのクラス定義を読み出し、読み出したクラス定義を
    用いて、置き換えの行われる仮想的関数を抽出する置換
    関数抽出ステップを含み、 前記置換関数抽出ステップは、 前記ソースプログラムに含まれるクラス定義を読み出
    し、読み出したクラス定義に基底クラスが含まれている
    か否かを判断する読出判断サブステップと、 読み出したクラス定義に基底クラスが含まれない場合
    に、前記クラス定義に含まれている仮想的関数を、読み
    出したクラス定義により定義されているクラスに属する
    仮想的関数であると決定する第1決定サブステップと、 読み出したクラス定義に基底クラスが含まれる場合に、
    基底クラスに属すると決定された仮想的関数を、読み出
    したクラス定義により定義されているクラスに属する仮
    想的関数であると仮に決定し、 読み出した前記クラス定義に含まれている仮想的関数
    が、前記仮に決定された仮想的関数と一致するか否かを
    判断し、 一致すると判断する場合に、仮に決定された仮想的関数
    の代わりに、読み出した前記クラス定義に含まれている
    仮想的関数を、読み出した前記クラス定義により定義さ
    れているクラスに属する仮想的関数であると決定し、前
    記仮に決定された仮想的関数を置き換えの行われる仮想
    的関数として抽出する第2決定サブステップと、 前記ソースプログラムに含まれる前記呼出命令から、前
    記仮想的関数を識別する関数名を含む中間形式の呼出命
    令を生成する中間形式生成ステップと、 前記生成された中間形式の呼出命令に含まれる関数名に
    より識別される仮想的関数が、置き換えの行われる仮想
    的関数であるか否かを判断する中間形式判断ステップと
    を含み、 前記生成ステップは、前記中間形式判断ステップによ
    り、置き換えの行われる仮想的関数であると判断される
    場合に、前記実行形式命令を生成することを特徴とする
    請求項18に記載の記録媒体。
JP2000257814A 1999-09-13 2000-08-28 プログラム変換装置 Pending JP2001154855A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2000257814A JP2001154855A (ja) 1999-09-13 2000-08-28 プログラム変換装置

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
JP25954299 1999-09-13
JP11-259542 1999-09-13
JP2000257814A JP2001154855A (ja) 1999-09-13 2000-08-28 プログラム変換装置

Publications (1)

Publication Number Publication Date
JP2001154855A true JP2001154855A (ja) 2001-06-08

Family

ID=26544178

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2000257814A Pending JP2001154855A (ja) 1999-09-13 2000-08-28 プログラム変換装置

Country Status (1)

Country Link
JP (1) JP2001154855A (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2014002790A (ja) * 2006-02-28 2014-01-09 Oracle America Inc 高速パッチベースメソッドコール

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2014002790A (ja) * 2006-02-28 2014-01-09 Oracle America Inc 高速パッチベースメソッドコール

Similar Documents

Publication Publication Date Title
US5675805A (en) Programming system for generating client and server programs from an undistributed application program
US6901579B1 (en) Generation of source code from classes and maintaining the comment that indicates the role of the class in the generated source code
US4974191A (en) Adaptive natural language computer interface system
JP3110040B2 (ja) 手順間レジスタ割付けを伴うコンピュータプログラムのコンパイル方法及び装置
JP2002518732A (ja) パラメータなし既存ライブラリ互換パラメータ付き型実装方法
US8327346B2 (en) Run-time type conversion
US11579856B2 (en) Multi-chip compatible compiling method and device
CN112394942B (zh) 基于云计算的分布式软件开发编译方法及软件开发平台
US20060026559A1 (en) Automatic content completion of valid values for method argument variables
CN109086215B (zh) 一种嵌入式软件单元测试用例生成方法及系统
JPH01166141A (ja) デバッグ情報提供方法
US6675377B1 (en) Program conversion apparatus
US20040003382A1 (en) Unification-based points-to-analysis using multilevel typing
US8935657B2 (en) Model-to-model transformation by kind
CN113703779A (zh) 一种跨平台的多语言编译方法和超轻量物联网虚拟机
US7496889B2 (en) Whitespace keywords
JP2001154855A (ja) プログラム変換装置
CN114217773B (zh) 一种c/c++语言软件包二进制接口兼容性自动化判别方法
EP1862924A1 (en) Object-oriented system for mapping structered information to different structured information
CN114371958A (zh) 一种镜像主体自动保存方法、装置、设备及存储介质
CN114444032A (zh) 自定义规则混淆代码的方法及装置
JPH07182179A (ja) オブジェクト指向データベース管理装置
US7958330B2 (en) Compiler program, compiler program recording medium, compile method, and program processing system
US11113190B2 (en) Mutable type builder
CN116560667B (zh) 一种基于预编译延迟执行的拆分调度系统及方法

Legal Events

Date Code Title Description
A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20041116

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20050114

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20050222

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20050422

A911 Transfer of reconsideration by examiner before appeal (zenchi)

Free format text: JAPANESE INTERMEDIATE CODE: A911

Effective date: 20050525

A912 Removal of reconsideration by examiner before appeal (zenchi)

Free format text: JAPANESE INTERMEDIATE CODE: A912

Effective date: 20050617