JP2006163686A - コンパイル方法、コンパイルプログラム、コンパイル装置およびコンパイル用の記録媒体 - Google Patents

コンパイル方法、コンパイルプログラム、コンパイル装置およびコンパイル用の記録媒体 Download PDF

Info

Publication number
JP2006163686A
JP2006163686A JP2004352558A JP2004352558A JP2006163686A JP 2006163686 A JP2006163686 A JP 2006163686A JP 2004352558 A JP2004352558 A JP 2004352558A JP 2004352558 A JP2004352558 A JP 2004352558A JP 2006163686 A JP2006163686 A JP 2006163686A
Authority
JP
Japan
Prior art keywords
address storage
storage table
class
method address
derived
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.)
Granted
Application number
JP2004352558A
Other languages
English (en)
Other versions
JP4768984B2 (ja
Inventor
Shinobu Asao
忍 浅尾
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 JP2004352558A priority Critical patent/JP4768984B2/ja
Priority to US11/289,678 priority patent/US7624390B2/en
Publication of JP2006163686A publication Critical patent/JP2006163686A/ja
Application granted granted Critical
Publication of JP4768984B2 publication Critical patent/JP4768984B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/449Object-oriented method invocation or resolution

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

【課題】従来の方法で実行時確定メソッドをコンパイルすると、異なるクラス間でメソッドアドレス格納テーブルが冗長に生成されてしまう。
【解決手段】中間コードからメソッドアドレス格納テーブル情報と、クラス情報と、関数参照情報とを抽出して解析し、あるクラスに対して、他のクラスが実行時確定メソッドを1つもオーバーライドしていない場合に、それぞれのクラスのメソッドアドレス格納テーブルを削除し、両方のクラスに共通に使用可能なメソッドアドレス格納テーブルを生成し、両方のクラスのメソッドアドレス格納テーブルポインタを、生成した両方のクラスに共通に使用可能なメソッドアドレス格納テーブルの先頭アドレス値に更新することで、異なるクラス間で冗長に生成されるメソッドアドレス格納テーブルを削除し、オブジェクトコードサイズを削減することができる。
【選択図】図1

Description

本発明は、コンパイル方法、コンパイルプログラム、コンパイル装置およびコンパイル用の記録媒体に関し、特に、C++言語に代表されるオブジェクト指向言語で記述されたソースプログラムをオブジェクトコードに変換する技術に関する。
近年のソフトウェア開発においては、プログラムの規模が大規模化してきており、それに伴って保守性、再利用性の高いオブジェクト指向言語が注目されている。オブジェクト指向言語には、起動すべきメソッド(ある機能をオブジェクト指向言語で記述したコード部分)を実行時に決定する機能がある。代表的なオブジェクト指向言語の1つであるC++で言えば、仮想関数(virtual function)が該当する。
一般的に、実行時確定メソッドの機能を実装する場合は、出力させるオブジェクトコード内に静的に生成されるメソッドアドレス格納テーブル(各メソッドの先頭アドレスを記録している表)を生成し、各クラスオブジェクトがそのクラスに対応するメソッドアドレス格納テーブルを参照するポインタ(以降、メソッドアドレス格納テーブルポインタと記述)を用いてメソッドアドレス格納テーブルを参照し、さらに実行時確定メソッド毎に決められたインデックス値(以降、メソッドインデックス番号と記述)を用いて動的にメソッド呼び出しを行うことで実現している。
上述した通りメソッドアドレス格納テーブルはコード内に生成されるため、テーブルのサイズが大きくなればなるほど、出力されるオブジェクトコードも比例して大きくなる。出力されるオブジェクトコードのサイズ増加を抑えるため、メソッドアドレス格納テーブルは冗長に生成されないようにしなければならない。
従来のコンパイル方法は、クラス宣言の意味解析処理時に実行時確定メソッドの所属するクラス名と入力ファイル名とを比較し、一致すればメソッドアドレス格納テーブルの実体および宣言をオブジェクトコード内に生成し、一致しなければメソッドアドレス格納テーブルの宣言のみオブジェクトコード内に生成している(例えば、特許文献1参照。図26参照)。
特開平6−266562号公報(第4−5頁、第1図)
しかしながら従来のコンパイル方法では、クラス名と入力ファイル名との比較による冗長生成の抑制であるので、入力ファイル間で同じクラスに対するメソッドアドレス格納テーブルの冗長生成に対しては対応できるものの、異なるクラス間に対する冗長生成に対しては対応できていない。
本発明は、かかる課題に鑑みてなされたものであり、異なるクラス間に対してもメソッドアドレス格納テーブルの冗長な出力を削除することにより、コード生成効率の良いコンパイル方法を提供することを目的とする。
本発明のある局面にかかわるオブジェクト指向言語のコンパイル方法は、オブジェクト指向言語で記述されたソースプログラムをオブジェクトコードに変換するコンパイル方法であって、
前記ソースプログラムから中間コードを生成する中間コード生成ステップと、
前記中間コードから少なくともメソッドアドレス格納テーブル、前記メソッドアドレス格納テーブルを指しているメソッドアドレス格納テーブルポインタ、前記メソッドアドレス格納テーブルに対応するメソッドインデックス番号を含むメソッドアドレス格納テーブル情報と、少なくとも基底クラス名、派生クラス名、新規実行時確定メソッド名、オーバーライドメソッド名を含むクラス情報と、各メソッドがプログラム内で参照されているかどうかを示す関数参照情報とを抽出する解析対象情報抽出ステップと、
抽出した解析対象情報を解析し、あるクラスに対して、他のクラスが実行時確定メソッドを1つもオーバーライド(over ride:再定義)していない場合に、それぞれのクラスの前記メソッドアドレス格納テーブルを削除し、両方のクラスに共通に使用可能なメソッドアドレス格納テーブルを生成し、両方のクラスのメソッドアドレス格納テーブルポインタを、生成した前記両方のクラスに共通に使用可能なメソッドアドレス格納テーブルの先頭アドレス値に更新することにより前記中間コードを最適化するメソッドアドレス格納テーブル最適化ステップと、
最適化された前記中間コードをオブジェクトコードに変換するオブジェクトコード変換ステップとを含むものである。
この方法によれば、異なるクラス間において冗長に生成されているメソッドアドレス格納テーブルが共通化される。よって、コード生成効率が向上する。
上記のコンパイル方法において、好ましくは、前記解析対象情報抽出ステップは、少なくともファイル名、または関数名、またはクラス名を含む解析範囲限定情報がコンパイラに与えられた場合に、指定された解析範囲に限定して前記メソッドアドレス格納テーブル情報、クラス情報、関数参照情報を抽出することとする。
この方法によれば、解析範囲の限定が可能になることで解析時間の短縮が図られ、コンパイル時間を短縮することができる。
さらに好ましくは、前記解析対象情報抽出ステップは、定義はされているものの参照はされていない実行時確定メソッドが存在する場合に、定義はされているものの参照はされていないすべての実行時確定メソッドを、クラス情報から削除し、かつすべてのメソッドアドレス格納テーブルより削除し、さらに削除後のメソッドアドレス格納テーブルに対する実行時確定メソッドのインデックス番号を更新することとする。
この方法によれば、未参照メソッドの削除により、さらにメソッドアドレス格納テーブル共通化の効果が向上する。
さらに好ましくは、前記メソッドアドレス格納テーブル最適化ステップは、基底クラスに対して、少なくとも1つの派生クラスが前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない場合に、前記基底クラスのメソッドアドレス格納テーブルを削除し、さらに前記基底クラスのメソッドアドレス格納テーブルポインタを、前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない派生クラスのメソッドアドレス格納テーブルの先頭アドレス値に更新することにより、前記中間コードを最適化することとする。
この方法によれば、継承関係にあるクラス間において冗長に生成されているメソッドアドレス格納テーブルが共通化される。よって、コード生成効率が向上する。
さらに好ましくは、前記メソッドアドレス格納テーブル最適化ステップは、基底クラスに対して、少なくとも2つの派生クラスが前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない場合で、かつ両方の派生クラスが新規に実行時確定メソッドを定義していない場合に、新規に実行時確定メソッドを定義していない派生クラスのメソッドアドレス格納テーブルを削除し、さらにその派生クラスのメソッドアドレス格納テーブルポインタを、前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない他方の派生クラスのメソッドアドレス格納テーブルの先頭アドレス値に更新することにより、前記中間コードを最適化することとする。
また、好ましくは、前記メソッドアドレス格納テーブル最適化ステップは、基底クラスに対して、少なくとも2つの派生クラスが前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない場合で、かつ両方の派生クラスが新規に実行時確定メソッドを定義している場合で、かつ両方の派生クラスがさらに派生クラスを持たない場合に、派生クラスを持たない一方の派生クラスのメソッドアドレス格納テーブルに、他方の派生クラスで新規に定義した実行時確定メソッドのアドレスを追加したメソッドアドレス格納テーブルを新たに生成し、さらに両方の派生クラスのメソッドアドレス格納テーブルを削除し、さらに両方のメソッドアドレス格納テーブルポインタを、新たに生成したメソッドアドレス格納テーブルの先頭アドレス値に更新し、さらに新たに生成されたメソッドアドレス格納テーブルに対する実行時確定メソッドのインデックス値を更新することにより、前記中間コードを最適化することとする。
これらの方法によれば、兄弟関係にあるクラス間において冗長に生成されているメソッドアドレス格納テーブルが共通化される。よって、コード生成効率が向上する。
また、好ましくは、前記メソッドアドレス格納テーブル最適化ステップは、各クラスのメソッドアドレス格納テーブルを比較し、一方のメソッドアドレス格納テーブルに格納されているメソッドアドレス値が、他方のメソッドアドレス格納テーブルの先頭位置に包含されている場合に、包含されている側のメソッドアドレス格納テーブルを削除し、包含されているメソッドアドレス格納テーブルを指していたクラスのメソッドアドレス格納テーブルポインタを、包含している側のメソッドアドレス格納テーブルの先頭アドレス値に更新することにより、前記中間コードを最適化することとする。
この方法によれば、クラス情報を使用することなく高速にメソッドアドレス格納テーブルが共通化される。
さらに好ましくは、前記メソッドアドレス格納テーブル最適化ステップは、最適化実施内容を表示させる指令がコンパイラに与えられた場合に、少なくとも最適化の対象となった前記メソッドアドレス格納テーブルを参照していたクラス、最適化前の前記メソッドアドレス格納テーブル、最適化後の前記メソッドアドレス格納テーブルを標準出力に出力することにより、前記中間コードの最適化内容をユーザーに与えることとする。
この方法によれば、ユーザーが実際に行われた最適化の内容を確認することができる。
さらに好ましくは、前記オブジェクト指向言語をC++言語、前記実行時確定メソッドを仮想関数、前記メソッドアドレス格納テーブルを仮想関数テーブル、前記メソッドアドレス格納テーブルポインタを仮想関数テーブルポインタとする。
この方法によれば、C++言語で記述されたソースプログラムに対して、効率の良いコードを生成することができる。
なお、本発明は、このような特徴的なステップを有するコンパイル方法として実現することができるだけでなく、当該コンパイル方法に含まれる特徴的なステップを手段とするコンパイラ装置として実現したり、当該コンパイル方法に含まれる特徴的なステップをコンピュータに実行させるコンパイラとして実現したりすることもできる。そして、そのようなコンパイラは、CD−ROM(Compact Disc-Read Only Memory)などの記録媒体やインターネット等の伝送媒体を介して流通させることができるのは言うまでもない。
本発明のコンパイル方法によれば、異なるクラス間に対してメソッドアドレス格納テーブルの冗長な出力を削除することにより、コードサイズの小さいオブジェクトコードを生成することができる。
以下、本発明の実施の形態にかかわるコンパイラについて図面を参照しながら説明する。
図1は、コンパイラにより実行される処理のフローチャートである。
コンパイラは、プログラム記憶部D1に記憶されているヘッダファイルおよびソースプログラムを読み込む(S1)。コンパイラは、読み込んだソースプログラムの構文を解析し、シンボルテーブルの生成や構文木の生成を行う(S2)。次に、コンパイラは、生成された構文木を基に、中間コードを生成する(S3)。その後、コンパイラは、生成された中間コードに対して各種最適化を施す(S4)。また、コンパイラは、最適化された中間コードに含まれるすべての変数に対してレジスタやメモリなどのハードウェア資源を割り付け(S5)、資源割付された中間コードをオブジェクトコードに変換してオブジェクトプログラムを生成コード記憶部D2に出力する(S6)。
最適化ステップ(S4)は、解析対象情報抽出ステップ(S10)と、メソッドアドレス格納テーブル最適化ステップ(S11)と、その他の最適化ステップ(S12)とを含む。
解析対象情報抽出ステップ(S10)は、中間コードを解析し、少なくともメソッドアドレス格納テーブル、メソッドアドレス格納テーブルを指しているメソッドアドレス格納テーブルポインタ、メソッドアドレス格納テーブルに対応するメソッドインデックス番号を含むメソッドアドレス格納テーブル情報と、少なくとも基底クラス名、派生クラス名、新規実行時確定メソッド名、オーバーライドメソッド名を含むクラス情報と、各メソッドがプログラム内で参照されているかどうかを示す関数参照情報とを抽出する。
メソッドアドレス格納テーブル最適化ステップ(S11)は、解析対象情報抽出ステップで抽出した解析対象情報を解析し、あるクラスに対して、他のクラスが実行時確定メソッドを1つもオーバーライド(再定義)していない場合に、それぞれのクラスのメソッドアドレス格納テーブルを削除し、両方のクラスに共通に使用可能なメソッドアドレス格納テーブルを生成し、両方のクラスのメソッドアドレス格納テーブルポインタを、生成した両方のクラスに共通に使用可能なメソッドアドレス格納テーブルの先頭アドレス値に更新するステップである。
解析対象情報抽出ステップ(S10)ならびにメソッドアドレス格納テーブル最適化ステップ(S11)の詳細については後述する。
その他の最適化ステップ(S12)は、一般的な最適化ステップであり、本発明の要旨ではないため、その説明は省略する。
なお、ソースプログラム入力ステップ(S1)、構文解析ステップ(S2)、中間コード生成ステップ(S3)、その他の最適化ステップ(S12)、資源割付ステップ(S5)、およびオブジェクト出力ステップ(S6)については、既存の処理と同様の処理であり本発明の主眼ではない。よって詳細な説明は省略する。
以下、本発明の主眼である解析対象情報抽出ステップ(S10)ならびにメソッドアドレス格納テーブル最適化ステップ(S11)について説明する。
図2は、解析対象情報抽出ステップ(S10)の詳細を示すフローチャートである。
コンパイラは、メソッドアドレス格納テーブル最適化の解析範囲が限定されているか否か判定する。この場合の解析範囲限定の方法は、コマンドラインのオプション指定であってもソースプログラム中に記述するプラグマ指定であっても構わない。またこの場合の解析範囲対象は、翻訳単位(ソースプログラム)に対する範囲対象であっても、関数単位に対する範囲対象であっても、クラス単位に対する範囲対象であっても構わない。
解析範囲が限定されている場合には(S21でYes)、コンパイラは中間コードから指定範囲のメソッドアドレス格納テーブル情報、クラス情報、関数参照情報を抽出する(S22)。この場合のメソッドアドレス格納テーブル情報とは、少なくともテーブルに格納されているアドレスに該当する実行時確定メソッドと、各メソッドに対応するメソッドインデックス番号、テーブルを参照しているメソッドアドレス格納テーブルポインタを含む。またクラス情報は、少なくとも基底クラス名、派生クラス名、新規実行時確定メソッド名、オーバーライドされているメソッド名を含む。また関数参照情報は、少なくとも定義されているメソッド名が参照されているか否か、もしくは不明かを表す情報を含む。
解析範囲が限定されていない場合には(S21でNo)、コンパイラは中間コードからすべてのメソッドアドレス格納テーブル情報、クラス情報、関数参照情報を抽出する(S23)。
次に、コンパイラは、定義はされているものの参照はされていない実行時確定メソッドが存在するか否かを判定する(S24)。存在する場合には(S24でYes)、コンパイラは未参照の実行時確定メソッドのアドレスを、前ステップ(S22orS23)で抽出したすべてのクラス情報ならびにメソッドアドレス格納テーブル情報から削除し(S25)、削除後のメソッドアドレス格納テーブルのメソッドインデックス値を更新する(S26)。
次に、コンパイラは、メソッドアドレス格納テーブル最適化ステップ(S11)を実施する。
図3は、メソッドアドレス格納テーブル最適化ステップ(S11)の詳細を示すフローチャートである。
コンパイラは、メソッドアドレス格納テーブル最適化の解析にクラスの継承関係を使用するか否かを判定する(S27)。解析にクラスの継承関係を使用するか否かは、ユーザーによる指定(前記オプション指定やプラグマ指定)で選択しても構わないし、コンパイラが静的に動作を決めていても構わない。
クラスの継承関係を使用すると判定された場合には(S27でYes)、コンパイラは親子クラス解析サブステップ(S28)を実施する。
図4は、親子クラス解析サブステップ(S28)の詳細を示すフローチャートである。
コンパイラは、解析範囲の基底クラスと派生クラスの組み合わせについて、以下のループ処理(S40)を繰り返す。コンパイラは、基底クラスの実行時確定メソッドを1つもオーバーライドしていない派生クラスが少なくとも1つ存在するか否かを判定する(S41)。存在する場合には(S41でYes)、基底クラスのメソッドアドレス格納テーブルを削除し(S42)、基底クラスのメソッドアドレス格納テーブルポインタを含めた、削除したメソッドアドレス格納テーブルを参照していたすべてのメソッドアドレス格納テーブルポインタを、1つもオーバーライドしていない派生クラスのメソッドアドレス格納テーブルの先頭アドレス値に更新の後(S43)、次の基底クラスと派生クラスとの組み合わせについてループ処理(S40)を繰り返す。存在しない場合には(S41でNo)、次の基底クラスと派生クラスとの組み合わせについてループ処理(S40)を繰り返す。
次に、コンパイラは、兄弟クラス解析サブステップ(S29)を実施する。
図5および図6は、兄弟クラス解析サブステップ(S29)の詳細を示すフローチャートである。
コンパイラは、解析範囲の基底クラスと派生クラスの組み合わせについて、以下のループ処理(S50)を繰り返す。コンパイラは、基底クラスの実行時確定メソッドを1つもオーバーライドしていない派生クラスが少なくとも2つ存在するか否かを判定する(S51)。存在する場合には(S51でYes)、コンパイラは、オーバーライドしていない派生クラスの組み合わせについて、さらにループ処理(S52)を繰り返す。存在しない場合には(S51でNo)、次の基底クラスと派生クラスとの組み合わせについてループ処理(S50)を繰り返す。
ループ処理(S52)では、コンパイラは、両方の派生クラスが新規に実行時確定メソッドを定義しているか否かを判定する(S53)。両方の派生クラスが新規に実行時確定メソッドを定義している場合には(S53でYes)、コンパイラは、両方の派生クラスがさらに派生クラスを持つか否かを判定する(S56)。
両方の派生クラスが新規に実行時確定メソッドを定義していない場合には(S53でNo)、コンパイラは、新規に実行時確定メソッドを定義していない派生クラス(両方定義していない場合はどちらか一方)のメソッドアドレス格納テーブルを削除し(S54)、削除した側の派生クラスのメソッドアドレス格納テーブルポインタを含めた、削除したメソッドアドレス格納テーブルを参照していたすべてのメソッドアドレス格納テーブルポインタを、基底クラスの実行時確定メソッドを1つもオーバーライドしていない他方の派生クラスのメソッドアドレス格納テーブルの先頭アドレス値に更新した後(S55)、次のオーバーライドしていない派生クラスの組み合わせについて、ループ処理(S52)を繰り返す。
両方の派生クラスがさらに派生クラスを持つ場合には(S56でYes)、次のオーバーライドしていない派生クラスの組み合わせについて、ループ処理(S52)を繰り返す。
両方の派生クラスがさらに派生クラスを持たない場合には(S56でNo)、コンパイラは、派生クラスを持たない一方の派生クラス(両方派生クラスを持たない場合は、どちらか一方)のメソッドアドレス格納テーブルに、他方の派生クラスで新規に定義した実行時確定メソッドのアドレスを追加したメソッドアドレス格納テーブルを新たに生成する(S57)。次に、コンパイラは、両方の派生クラスのメソッドアドレス格納テーブルを削除する(S58)。次に、コンパイラは、両方のメソッドアドレス格納テーブルポインタを含めた、削除したメソッドアドレス格納テーブルを参照していたすべてのメソッドアドレス格納テーブルポインタを、新たに生成したメソッドアドレス格納テーブルの先頭アドレス値に更新する(S59)。次に、コンパイラは、新たに生成されたメソッドアドレス格納テーブルに対する実行時確定メソッドのメソッドインデックス値を更新し(S60)、次のオーバーライドしていない派生クラスの組み合わせについて、ループ処理(S52)を繰り返す。すべてのループ処理(S50、S52)を実施した後、判定処理(S31)に移る。
クラスの継承関係を使用しないと判定された場合には(S27でNo)、コンパイラはメソッドアドレス包含解析サブステップ(S30)を実施する。
図7は、メソッドアドレス包含解析サブステップ(S30)の詳細を示すフローチャートである。
コンパイラは、解析範囲のクラスのメソッドアドレス格納テーブルの組み合わせに対して、以下のループ処理(S70)を繰り返す。コンパイラは、一方のメソッドアドレス格納テーブルに格納されているメソッドアドレス値が、他方のメソッドアドレス格納テーブルの先頭位置に包含されているか否かを判定する(S71)。包含されている場合には(S71でYes)、包含されている側のメソッドアドレス格納テーブルを削除し(S72)、包含されているメソッドアドレス格納テーブルを指していたクラスのメソッドアドレス格納テーブルポインタを、包含している側のメソッドアドレス格納テーブルの先頭アドレス値に更新の後(73)、次のメソッドアドレス格納テーブルの組み合わせについてループ処理(S70)を繰り返す。包含されてない場合には(S71でNo)、次のメソッドアドレス格納テーブルの組み合わせについてループ処理(S70)を繰り返す。すべてのループ処理(S70)を実施した後、判定処理(S31)に移る。
判定処理(S31)は、最適化の内容を表示させるか否かを判定する。この場合の最適化内容表示指定の方法は、コマンドラインのオプション指定であってもソースプログラム中に記述するプラグマ指定であっても構わない。
最適化の内容を表示させる指令を与えている場合には(S31でYes)、コンパイラは、最適化の対象となったメソッドアドレス格納テーブルを参照していたクラス、最適化前のメソッドアドレス格納テーブル、最適化後のメソッドアドレス格納テーブルを標準出力に出力し、メソッドアドレス格納テーブル最適化ステップ(S11)を終了する。
最適化の内容を表示させる指令を与えていない場合には(S31でNo)、コンパイラはそのまま何もせずに、メソッドアドレス格納テーブル最適化ステップ(S11)を終了する。
以上のような解析対象情報抽出ステップ(S10)と、メソッドアドレス格納テーブル最適化ステップ(S11)と、その他の最適化ステップ(S12)とを含む最適化ステップ(S4)を施した中間コードに対して、資源割付処理(S5)およびオブジェクトプログラム出力処理(S6)を行うことにより、最終的に生成されるオブジェクトプログラムのオブジェクトコードのサイズが削減される。
以下、C++言語による具体例を参照しながらメソッドアドレス格納テーブル最適化ステップについてより詳細に説明する。具体例では、実行時確定メソッドは仮想関数、メソッドアドレス格納テーブルは仮想関数テーブル(vtbl)、メソッドアドレス格納テーブルポインタは仮想関数テーブルポインタ(vptr)として話を進める。
(具体例1)
図8は、プログラム記憶部D1に記憶されているヘッダファイルおよびソースプログラムの一例を示す。以下では、このヘッダファイルおよびソースプログラムを入力した場合のコンパイラの動作を説明する。
図8に示すヘッダファイル「class.h」には、クラスA、クラスB、クラスC、クラスD、クラスE、クラスFの定義が記載されている。各クラスには、それぞれのコンストラクタ、デストラクタが定義されている。クラスAでは、仮想関数vfunc1,vfunc2が定義されている。クラスBは、クラスAを継承しており、仮想関数vfunc3が定義されている。クラスCは、クラスBを継承している。クラスDは、クラスBを継承しており、仮想関数vfunc4が定義されている。クラスEは、クラスBを継承しており、仮想関数vfunc5が定義されている。クラスFは、クラスAを継承しており、クラスAで定義している仮想関数vfunc2をオーバーライド(再定義)している。
図8に示すソースファイル「file1.cpp」、「file2.cpp」では、最初に#inlude指令によって、「class.h」のヘッダファイルを読み込んでいる。また、外部関数f、g、h、i、mainが定義されており、関数内で仮想関数呼び出しが行われている。
従来の方法では、クラス間における仮想関数テーブルの最適化は実施されないので、各クラスに対して仮想関数テーブルがそのまま出力されることになる。図9に各クラスに対する仮想関数テーブルと、各クラスにおける仮想関数のインデックス番号を図示する。各クラスの仮想関数テーブルには、各クラスが呼び出すことのできる仮想関数のアドレスがすべて格納されていることがわかる。
次に、本実施の形態における具体例を示す。前提として、「file1.cpp」の範囲で解析すること、クラスの継承関係を使用すること、最適化内容を表示することが、ユーザーよりコンパイラに指令されているものとする。
まず解析対象情報抽出ステップ(S10)が実施されると、解析範囲が限定されているか否かの判定(S21)が行われる。前記した前提により限定がされているので、「file1.cpp」の範囲における仮想関数テーブル情報、クラス情報、関数参照情報が抽出される(S22)。図10に、抽出されたクラス情報、ならびに関数参照情報を示す。また、抽出された仮想関数テーブル情報は、図9と同じである。
次に、未参照の仮想関数が存在するか否かの判定が実施される(S24)。図10の関数参照情報が示すとおり、「file1.cpp」の範囲における解析では、vfunc1が参照されていることは判明しているものの、その他の仮想関数が参照されているかどうかは不明である。よって、特に仮想関数テーブルから仮想関数アドレスは削除されない。
次に、コンパイラは、メソッドアドレス格納テーブル最適化ステップ(S11)を実施する。まず、クラスの継承関係を使用するか否かの判定が実施される(S27)。前記した前提によりクラスの継承関係を使用するので、次の親子クラス解析サブステップ(S28)が実施される。
親子クラス解析サブステップ(S28)では、解析範囲の基底クラスと派生クラスの組み合わせに対して、以下の処理が実施される(S40)。まずクラスAとクラスB、クラスFの基底クラス、派生クラスの組み合わせについて、基底クラスの仮想関数を1つもオーバーライドしていない派生クラスが少なくとも1つ存在するか否かの判定が実施される(S41)。
図10のクラス情報によれば、クラスFは仮想関数vfunc2をオーバーライドしているものの、クラスBは1つもオーバーライドしていないので、図11に示すように、基底クラスであるクラスAの仮想関数テーブルが削除され(S42)、クラスAの仮想関数テーブルポインタ(vptr)を、クラスBの仮想関数テーブルを指すように更新される(S43)。
次にクラスBとクラスC、クラスD、クラスEの基底クラス、派生クラスの組み合わせについて、同様に判定処理(S41)を実施する。図10のクラス情報によれば、クラスC、クラスD、クラスE、すべてオーバーライドしていない。よって図12に示すように、基底クラスであるクラスBの仮想関数テーブルが削除され(S42)、クラスBの仮想関数テーブルポインタ、および削除された仮想関数テーブルを参照していたクラスAの仮想関数テーブルポインタを、ここでは検索対象の最初であったクラスCの仮想関数テーブルを指すように更新される(S43)。すべての対象に対してループ処理(S40)が終了したので、次に、兄弟クラス解析サブステップ(S29)が実施される。
兄弟クラス解析サブステップ(S29)では、解析範囲の基底クラスと派生クラスの組み合わせに対して、以下の処理が実施される(S50)。まずクラスAとクラスB、クラスFの基底クラス、派生クラスの組み合わせについて、基底クラスの仮想関数を1つもオーバーライドしていない派生クラスが少なくとも2つ存在するか否かの判定が実施される(S51)。
図10のクラス情報によれば、2つは存在しないことがわかるので、次の組み合わせであるクラスBと、クラスC、クラスD、クラスEの組み合わせについて、同様に判定(S51)を実施する。図10のクラス情報によれば、クラスC、クラスD、クラスEは、すべてオーバーライドしていない。よってオーバーライドしていない派生クラスの組み合わせであるクラスC、クラスD、クラスEについて、以下の処理を繰り返す(S52)。
まずクラスC、クラスD両方のクラスが、新規に仮想関数を定義しているか否かを判定する(S53)。図10のクラス情報によれば、クラスCは新規の仮想関数を定義していないので、この場合は図13に示すとおり、クラスCの仮想関数テーブルを削除し(S54)、クラスCの仮想関数テーブルポインタ、および削除された仮想関数テーブルを参照していたクラスA、クラスBの仮想関数テーブルポインタを、クラスDの仮想関数テーブルを指すように更新される(S55)。
次に、クラスD、クラスE両方のクラスが、新規に仮想関数を定義しているか否かを判定する(S53)。図10のクラス情報によれば、クラスD、クラスE、両方ともに新規の仮想関数を定義しているので、両方の派生クラスが、さらに派生クラスを持つか否かの判定が実施される(S56)。図10のクラス情報によれば、クラスD、クラスE、いずれも派生クラスを持たない。よって新規に仮想関数テーブルを生成する処理(S57)の基本となるクラスにどちらを選択してもよい。ここでは、図14に示すように、クラスDの仮想関数テーブルに、クラスEの仮想関数テーブルで新規に定義した仮想関数vfunc5のアドレスを追加した仮想関数テーブルを新たに生成し(S57)、両方のクラスの仮想関数テーブルを削除し(S58)、両方の仮想関数アドレスポインタおよび削除した仮想関数テーブルを参照していたクラスA、クラスB、クラスCの仮想関数アドレスポインタを、新たに生成した仮想関数テーブルを指すように更新するようにする。また、図14に示すように、関数インデックス番号についても、新たに生成した仮想関数テーブルをもとに更新を行う(S60)。すべての対象に対してループ処理(S50)が終了したので、次に、ユーザーが最適化内容を表示させる指令を与えているか否かを判定する処理(S31)が実施される。
前記した前提のとおり、最適化内容を表示させる指令が与えられているので、図15に示すように、最適化の対象となった仮想関数テーブルを参照していたクラス、最適化前の仮想関数テーブル、最適化後の仮想関数テーブルが標準出力に出力される。
以上の処理によってメソッドアドレス格納テーブルが最適化された中間コードを得ることができる。最適化を実施しなかった場合の中間コードと、最適化を実施した場合の中間コードからそれぞれアセンブラを出力させた結果を図16に示す。図16に示すとおり、最適化を実施したことにより、実施しない場合と比較して44byteのコードサイズ削減が実現できていることがわかる(コードサイズは“DD”の個数に「4」を掛算したものになる)。
このように、従来では各クラスに対してそれぞれ出力させていた仮想関数テーブルを、本最適化によりまとめて出力できていることがわかり、このためコードサイズが削減できていることがわかる。
(具体例2)
具体例1の前提条件のうち、クラスの継承関係を使用しないという前提の場合を考える。この場合、クラスの継承関係を使用するか否かの判定処理(S27)までは、具体例1と同様の処理が行われ、図9の仮想関数テーブル情報が抽出されている。次に、メソッドアドレス包含解析サブステップ(S30)が実施されることになる。
メソッドアドレス包含解析サブステップ(S30)では、解析範囲のクラスの各仮想関数テーブルの組み合わせに対して、以下の処理を繰り返す(S70)。
まず、クラスAとクラスBの仮想関数テーブルに対して、一方の仮想関数テーブルに格納されている仮想関数アドレスが、他方の仮想関数アドレステーブルの先頭位置に包含されているか否かの判定を行う(S71)。図9によれば、クラスAの仮想関数テーブルに格納されている仮想関数アドレスは、クラスBの仮想関数テーブルに包含されていることがわかる。よって、包含されている側のクラスAの仮想関数テーブルを削除し(S72)、削除したテーブルを参照していた仮想関数テーブルポインタを包含している側のクラスBの仮想関数テーブルを指すように更新する(S73)。この結果、具体例1で示した図11の結果と同じになる。同様に、クラスBとクラスCに対してS70を実施した結果が図12、クラスCとクラスDに対してS70を実施した結果が図13となる。
以上の処理によって、メソッドアドレス格納テーブルを共通化させた中間コードを得ることができる。最適化を実施しなかった場合の中間コードと、最適化を実施した場合の中間コードからそれぞれアセンブラを出力させた結果を図17に示す。図17に示すとおり、最適化を実施したことにより、実施しない場合と比較して32byteのコードサイズ削減が実現できていることがわかる。
このように、クラスの継承関係を使用しない場合は、継承関係を使用する場合と比較して最適化効率は劣るものの、処理アルゴリズムが単純であり、クラス継承関係を解析する必要がなくなるため、高速な最適化処理が可能である。
(具体例3)
具体例1の前提条件のうち、「file1.cpp」の範囲で解析する指令を取りやめ、ソースプログラム全体に対して解析を行う場合を考える。
まず解析対象情報抽出ステップ(S10)が実施されると、解析範囲が限定されているか否かの判定(S21)が行われる。前記した前提により限定は存在しないので、ソースプログラム全体に対する仮想関数テーブル情報、クラス情報、関数参照情報が抽出される(S23)。図18に、抽出されたクラス情報、ならびに関数参照情報を示す。また、この時点で抽出された仮想関数テーブル情報は、具体例1と同様の図9に示すとおりである。
次に、未参照の仮想関数が存在するか否かの判定が実施される(S24)。図18の関数参照情報が示すとおり、プログラム全体に対する解析では、仮想関数vfunc2が参照されていないことが判明している。よって、図18で示したクラス情報のうち、未参照仮想関数であるvfunc2の情報ならびに仮想関数テーブルから未参照仮想関数であるvfunc2の仮想関数アドレスが削除され(S25)、仮想関数インデックス番号が削除後の仮想関数テーブルをもとに更新される(S26)。図19に、未参照仮想関数を削除したクラス情報、図20に未参照仮想関数アドレスを仮想関数テーブルから削除し、インデックス番号を更新した結果を示す。
次に、コンパイラは、メソッドアドレス格納テーブル最適化ステップ(S11)を実施する。まず、クラスの継承関係を使用するか否かの判定が実施される(S27)。前記した前提により、クラスの継承関係を使用するので、次の親子クラス解析サブステップ(S28)が実施される。
親子クラス解析サブステップ(S28)では、解析範囲の基底クラスと派生クラスの組み合わせに対して、以下の処理が実施される(S40)。まずクラスAとクラスB、クラスFの基底クラス、派生クラスの組み合わせについて、基底クラスの仮想関数を1つもオーバーライドしていない派生クラスが少なくとも1つ存在するか否かの判定が実施される(S41)。図19のクラス情報によれば、クラスB、クラスFともに1つもオーバーライドしていない。よってここでは、具体例1と同様、基底クラスであるクラスAの仮想関数テーブルが削除され(S42)、クラスAの仮想関数テーブルポインタ(vptr)を、クラスBの仮想関数テーブルを指すように更新されるものとする(S43)。
同様に、クラスBとクラスC、クラスD、クラスEの基底クラス、派生クラスの組み合わせについて、判定処理(S41)を実施する。具体例1と同様に、基底クラスであるクラスBの仮想関数テーブルが削除され(S42)、クラスBの仮想関数テーブルポインタ、および削除された仮想関数テーブルを参照していたクラスAの仮想関数テーブルポインタを、ここでは検索対象の最初であったクラスCの仮想関数テーブルを指すように更新される(S43)。この時点での仮想関数テーブルは、図21に示すとおりである。すべての対象に対してループ処理(S40)が終了したので、次に、兄弟クラス解析サブステップ(S29)が実施される。
兄弟クラス解析サブステップ(S29)では、解析範囲の基底クラスと派生クラスの組み合わせに対して、以下の処理が実施される(S50)。まずクラスAとクラスB、クラスFの基底クラス、派生クラスの組み合わせについて、基底クラスの仮想関数を1つもオーバーライドしていない派生クラスが少なくとも2つ存在するか否かの判定が実施される(S51)。もともと未参照の仮想関数アドレスを削除する前のクラス情報(図18)での場合は、クラスFでvfunc2をオーバーライドしていたために判定結果が偽となっていた。しかし今回は未参照の仮想関数が削除されているため、図19のクラス情報により、クラスB、クラスF、ともにクラスAの仮想関数をオーバーライドしていないこととなり、2つ存在すると判定される。よって、クラスBとクラスFの組み合わせで、以下の処理(S52)が繰り返される。
まず、クラスB、クラスF両方のクラスが、新規に仮想関数を定義しているか否かを判定する(S53)。図19のクラス情報によれば、クラスFは新規の仮想関数を定義していないので、この場合はクラスFの仮想関数テーブルを削除し(S54)、クラスFの仮想関数テーブルポインタを、クラスCの仮想関数テーブル(この段階では、すでにクラスA、クラスBと共用の仮想関数テーブルとなっている)を指すように更新される(S55)。この段階での仮想関数テーブル情報を図22に示す。
同様に、次の組み合わせであるクラスBと、クラスC、クラスD、クラスEの組み合わせに対して、判定(S51)を実施する。図18のクラス情報によれば、クラスC、クラスD、クラスE、すべてオーバーライドしていない。よってオーバーライドしていない派生クラスの組み合わせであるクラスC、クラスD、クラスEについて、以下の処理を繰り返す(S52)。
まずクラスC、クラスD両方のクラスが、新規に仮想関数を定義しているか否かを判定する(S53)。図19のクラス情報によれば、クラスCは新規の仮想関数を定義していないので、この場合はクラスCの仮想関数テーブルを削除し(S54)、クラスCの仮想関数テーブルポインタ、および削除された仮想関数テーブルを参照していたクラスA、クラスB、クラスFの仮想関数テーブルポインタを、クラスDの仮想関数テーブルを指すように更新される(S55)。この段階での仮想関数テーブル情報を図23に示す。
次に、クラスD、クラスE両方のクラスが、新規に仮想関数を定義しているか否かを判定する(S53)。図19のクラス情報によれば、クラスD、クラスE、両方ともに新規の仮想関数を定義しているので、両方の派生クラスが、さらに派生クラスを持つか否かの判定が実施される(S56)。図19のクラス情報によれば、クラスD、クラスE、いずれも派生クラスを持たない。よって新規に仮想関数テーブルを生成する処理(S57)の基本となるクラスにどちらを選択してもよい。ここでは、図24に示すように、クラスDの仮想関数テーブルに、クラスEの仮想関数テーブルで新規に定義した仮想関数vfunc5のアドレスを追加した仮想関数テーブルを新たに生成し(S57)、両方のクラスの仮想関数テーブルを削除し(S58)、両方の仮想関数アドレスポインタおよび削除した仮想関数テーブルを参照していたクラスA、クラスB、クラスC、クラスFの仮想関数アドレスポインタを、新たに生成した仮想関数テーブルを指すように更新するようにする。また、図24に示すように、関数インデックス番号についても、新たに生成した仮想関数テーブルをもとに更新を行う(S60)。すべての対象に対してループ処理(S50)が終了したので、次に、ユーザーが最適化内容を表示させる指令を与えているか否かを判定する処理(S31)が実施される。以降の処理は、具体例1と同様であるので省略する。
以上の処理によってメソッドアドレス格納テーブルが最適化された中間コードを得ることができる。最適化を実施しなかった場合の中間コードと、最適化を実施した場合の中間コードからそれぞれアセンブラを出力させた結果を図25に示す。図25に示すとおり、最適化を実施したことにより、実施しない場合と比較して56byteのコードサイズ削減が実現できていることがわかる。
このように、未参照の仮想関数を削除することで仮想関数テーブルのサイズを小さくすることが可能となり、また具体例3のように、オーバーライドが行われている関数(vfunc2)が未参照の場合は、さらに仮想関数テーブルをまとめて出力できるためコードサイズが削減できていることがわかる。
以上説明したように、本実施の形態によると異なるクラス間に対してメソッドアドレス格納テーブルの冗長な出力を削除することにより、コードサイズの小さいオブジェクトコードを生成することができる。
本発明にかかるコンパイル方法は、携帯電話やPDA(Personal DigitalAssistant)等のコードサイズの小さなオブジェクトコードを必要とする組み込み機器用のコンパイル方法等に適用可能である。
本発明の実施の形態にかかるコンパイラにより実行される処理のフローチャート 本発明の実施の形態における解析対象情報抽出ステップの詳細を示すフローチャート 本発明の実施の形態におけるメソッドアドレス格納テーブル最適化ステップの詳細を示すフローチャート 本発明の実施の形態における親子クラス解析サブステップの詳細を示すフローチャート 本発明の実施の形態における兄弟クラス解析サブステップの詳細を示すフローチャート(その1) 本発明の実施の形態における兄弟クラス解析サブステップの詳細を示すフローチャート(その2) 本発明の実施の形態におけるメソッドアドレス包含解析サブステップの詳細を示すフローチャート 本発明の実施の形態における具体例1、2、3で用いられるプログラム記憶部に記憶されているソースプログラムの一例 本発明の実施の形態における最適化を実施する前の仮想関数テーブル情報の一例 本発明の実施の形態における具体例1、2のクラス情報の一例 本発明の実施の形態における具体例1の親子クラス解析サブステップのループ1回目実施後の仮想関数テーブル情報の一例、および具体例2のメソッドアドレス包含解析サブステップのループ1回目実施後の仮想関数テーブル情報の一例 本発明の実施の形態における具体例1の親子クラス解析サブステップのループ2回目実施後の仮想関数テーブル情報の一例、および具体例2におけるメソッドアドレス包含解析サブステップのループ2回目実施後の仮想関数テーブル情報の一例 本発明の実施の形態における具体例1の兄弟クラス解析サブステップのループ1回目実施後の仮想関数テーブル情報の一例、および具体例2におけるメソッドアドレス包含解析サブステップのループ3回目実施後の仮想関数テーブル情報の一例 本発明の実施の形態における具体例1の兄弟クラス解析サブステップのループ2回目実施後の仮想関数テーブル情報の一例 本発明の実施の形態における具体例1の最適化情報表示結果の一例 本発明の実施の形態における具体例1の最適化を実施する前の中間コードから生成したアセンブラコードの一例、ならびに最適化を実施した後の中間コードから生成したアセンブラコードの一例 本発明の実施の形態における具体例2の最適化を実施する前の中間コードから生成したアセンブラコードの一例、ならびに最適化を実施した後の中間コードから生成したアセンブラコードの一例 本発明の実施の形態における具体例3のクラス情報の一例 本発明の実施の形態における具体例3の未参照仮想関数削除後のクラス情報の一例 本発明の実施の形態における具体例3の未参照仮想関数削除後のメソッドアドレス格納テーブル情報の一例 本発明の実施の形態における具体例3の親子クラス解析サブステップのループ2回目実施後の仮想関数テーブル情報の一例 本発明の実施の形態における具体例3の親子クラス解析サブステップのループ3回目実施後の仮想関数テーブル情報の一例 本発明の実施の形態における具体例3の兄弟クラス解析サブステップのループ1回目実施後の仮想関数テーブル情報の一例 本発明の実施の形態における具体例3の兄弟クラス解析サブステップのループ2回目実施後の仮想関数テーブル情報の一例 本発明の実施の形態における具体例3の最適化を実施する前の中間コードから生成したアセンブラコードの一例、ならびに最適化を実施した後の中間コードから生成したアセンブラコードの一例 従来の技術の説明図
符号の説明
D1 プログラム記憶部
D2 生成コード記憶部

Claims (28)

  1. オブジェクト指向言語で記述されたソースプログラムをオブジェクトコードに変換するコンパイル方法であって、
    前記ソースプログラムから中間コードを生成する中間コード生成ステップと、
    前記中間コードから少なくともメソッドアドレス格納テーブル、前記メソッドアドレス格納テーブルを指しているメソッドアドレス格納テーブルポインタ、前記メソッドアドレス格納テーブルに対応するメソッドインデックス番号を含むメソッドアドレス格納テーブル情報と、少なくとも基底クラス名、派生クラス名、新規実行時確定メソッド名、オーバーライドメソッド名を含むクラス情報と、各メソッドがプログラム内で参照されているかどうかを示す関数参照情報とを抽出する解析対象情報抽出ステップと、
    抽出した解析対象情報を解析し、あるクラスに対して、他のクラスが実行時確定メソッドを1つもオーバーライドしていない場合に、それぞれのクラスの前記メソッドアドレス格納テーブルを削除し、両方のクラスに共通に使用可能なメソッドアドレス格納テーブルを生成し、両方のクラスのメソッドアドレス格納テーブルポインタを、生成した前記両方のクラスに共通に使用可能なメソッドアドレス格納テーブルの先頭アドレス値に更新することにより前記中間コードを最適化するメソッドアドレス格納テーブル最適化ステップと、
    最適化された前記中間コードをオブジェクトコードに変換するオブジェクトコード変換ステップとを含むことを特徴とするコンパイル方法。
  2. 前記解析対象情報抽出ステップは、少なくともファイル名、または関数名、またはクラス名を含む解析範囲限定情報がコンパイラに与えられた場合に、指定された解析範囲に限定して前記メソッドアドレス格納テーブル情報、クラス情報、関数参照情報を抽出する請求項1に記載のコンパイル方法。
  3. 前記解析対象情報抽出ステップは、定義はされているものの参照はされていない実行時確定メソッドが存在する場合に、定義はされているものの参照はされていないすべての実行時確定メソッドを、クラス情報から削除し、かつすべてのメソッドアドレス格納テーブルより削除し、さらに削除後のメソッドアドレス格納テーブルに対する実行時確定メソッドのインデックス番号を更新する請求項1または請求項2に記載のコンパイル方法。
  4. 前記メソッドアドレス格納テーブル最適化ステップは、基底クラスに対して、少なくとも1つの派生クラスが前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない場合に、前記基底クラスのメソッドアドレス格納テーブルを削除し、さらに前記基底クラスのメソッドアドレス格納テーブルポインタを、前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない派生クラスのメソッドアドレス格納テーブルの先頭アドレス値に更新することにより、前記中間コードを最適化する請求項1から請求項3までのいずれかに記載のコンパイル方法。
  5. 前記メソッドアドレス格納テーブル最適化ステップは、基底クラスに対して、少なくとも2つの派生クラスが前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない場合で、かつ両方の派生クラスが新規に実行時確定メソッドを定義していない場合に、新規に実行時確定メソッドを定義していない派生クラスのメソッドアドレス格納テーブルを削除し、さらにその派生クラスのメソッドアドレス格納テーブルポインタを、前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない他方の派生クラスのメソッドアドレス格納テーブルの先頭アドレス値に更新することにより、前記中間コードを最適化する請求項1から請求項3までのいずれかに記載のコンパイル方法。
  6. 前記メソッドアドレス格納テーブル最適化ステップは、基底クラスに対して、少なくとも2つの派生クラスが前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない場合で、かつ両方の派生クラスが新規に実行時確定メソッドを定義している場合で、かつ両方の派生クラスがさらに派生クラスを持たない場合に、派生クラスを持たない一方の派生クラスのメソッドアドレス格納テーブルに、他方の派生クラスで新規に定義した実行時確定メソッドのアドレスを追加したメソッドアドレス格納テーブルを新たに生成し、さらに両方の派生クラスのメソッドアドレス格納テーブルを削除し、さらに両方のメソッドアドレス格納テーブルポインタを、新たに生成したメソッドアドレス格納テーブルの先頭アドレス値に更新し、さらに新たに生成されたメソッドアドレス格納テーブルに対する実行時確定メソッドのインデックス値を更新することにより、前記中間コードを最適化する請求項1から請求項3までのいずれかに記載のコンパイル方法。
  7. 前記メソッドアドレス格納テーブル最適化ステップは、各クラスのメソッドアドレス格納テーブルを比較し、一方のメソッドアドレス格納テーブルに格納されているメソッドアドレス値が、他方のメソッドアドレス格納テーブルの先頭位置に包含されている場合に、包含されている側のメソッドアドレス格納テーブルを削除し、包含されているメソッドアドレス格納テーブルを指していたクラスのメソッドアドレス格納テーブルポインタを、包含している側のメソッドアドレス格納テーブルの先頭アドレス値に更新することにより、前記中間コードを最適化する請求項1から請求項3までのいずれかに記載のコンパイル方法。
  8. 前記メソッドアドレス格納テーブル最適化ステップは、最適化実施内容を表示させる指令がコンパイラに与えられた場合に、少なくとも最適化の対象となった前記メソッドアドレス格納テーブルを参照していたクラス、最適化前の前記メソッドアドレス格納テーブル、最適化後の前記メソッドアドレス格納テーブルを標準出力に出力する請求項1から請求項7までのいずれかに記載のコンパイル方法。
  9. 前記オブジェクト指向言語をC++言語、前記実行時確定メソッドを仮想関数、前記メソッドアドレス格納テーブルを仮想関数テーブル、前記メソッドアドレス格納テーブルポインタを仮想関数テーブルポインタとする請求項1から請求項8までのいずれかに記載のコンパイル方法。
  10. オブジェクト指向言語で記述されたソースプログラムをオブジェクトコードに変換するコンパイルプログラムであって、
    前記ソースプログラムから中間コードを生成する中間コード生成機能と、
    前記中間コードから少なくともメソッドアドレス格納テーブル、前記メソッドアドレス格納テーブルを指しているメソッドアドレス格納テーブルポインタ、前記メソッドアドレス格納テーブルに対応するメソッドインデックス番号を含むメソッドアドレス格納テーブル情報と、少なくとも基底クラス名、派生クラス名、新規実行時確定メソッド名、オーバーライドメソッド名を含むクラス情報と、各メソッドがプログラム内で参照されているかどうかを示す関数参照情報とを抽出する解析対象情報抽出機能と、
    抽出した解析対象情報を解析し、あるクラスに対して、他のクラスが実行時確定メソッドを1つもオーバーライドしていない場合に、それぞれのクラスの前記メソッドアドレス格納テーブルを削除し、両方のクラスに共通に使用可能なメソッドアドレス格納テーブルを生成し、両方のクラスのメソッドアドレス格納テーブルポインタを、生成した前記両方のクラスに共通に使用可能なメソッドアドレス格納テーブルの先頭アドレス値に更新することにより前記中間コードを最適化するメソッドアドレス格納テーブル最適化機能と、
    最適化された前記中間コードをオブジェクトコードに変換するオブジェクトコード変換機能とを含むことを特徴とするコンピュータ実行可能なコンパイルプログラム。
  11. 前記解析対象情報抽出機能は、少なくともファイル名、または関数名、またはクラス名を含む解析範囲限定情報がコンパイラに与えられた場合に、指定された解析範囲に限定して前記メソッドアドレス格納テーブル情報、クラス情報、関数参照情報を抽出する請求項10に記載のコンピュータ実行可能なコンパイルプログラム。
  12. 前記解析対象情報抽出機能は、定義はされているものの参照はされていない実行時確定メソッドが存在する場合に、定義はされているものの参照はされていないすべての実行時確定メソッドを、クラス情報から削除し、かつすべてのメソッドアドレス格納テーブルより削除し、さらに削除後のメソッドアドレス格納テーブルに対する実行時確定メソッドのインデックス番号を更新する請求項10または請求項11に記載のコンピュータ実行可能なコンパイルプログラム。
  13. 前記メソッドアドレス格納テーブル最適化機能は、基底クラスに対して、少なくとも1つの派生クラスが前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない場合に、前記基底クラスのメソッドアドレス格納テーブルを削除し、さらに前記基底クラスのメソッドアドレス格納テーブルポインタを、前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない派生クラスのメソッドアドレス格納テーブルの先頭アドレス値に更新することにより、前記中間コードを最適化する請求項10から請求項12までのいずれかに記載のコンピュータ実行可能なコンパイルプログラム。
  14. 前記メソッドアドレス格納テーブル最適化機能は、基底クラスに対して、少なくとも2つの派生クラスが前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない場合で、かつ両方の派生クラスが新規に実行時確定メソッドを定義していない場合に、新規に実行時確定メソッドを定義していない派生クラスのメソッドアドレス格納テーブルを削除し、さらにその派生クラスのメソッドアドレス格納テーブルポインタを、前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない他方の派生クラスのメソッドアドレス格納テーブルの先頭アドレス値に更新することにより、前記中間コードを最適化する請求項10から請求項12までのいずれかに記載のコンピュータ実行可能なコンパイルプログラム。
  15. 前記メソッドアドレス格納テーブル最適化機能は、基底クラスに対して、少なくとも2つの派生クラスが前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない場合で、かつ両方の派生クラスが新規に実行時確定メソッドを定義している場合で、かつ両方の派生クラスがさらに派生クラスを持たない場合に、派生クラスを持たない一方の派生クラスのメソッドアドレス格納テーブルに、他方の派生クラスで新規に定義した実行時確定メソッドのアドレスを追加したメソッドアドレス格納テーブルを新たに生成し、さらに両方の派生クラスのメソッドアドレス格納テーブルを削除し、さらに両方のメソッドアドレス格納テーブルポインタを、新たに生成したメソッドアドレス格納テーブルの先頭アドレス値に更新し、さらに新たに生成されたメソッドアドレス格納テーブルに対する実行時確定メソッドのインデックス値を更新することにより、前記中間コードを最適化する請求項10から請求項12までのいずれかに記載のコンピュータ実行可能なコンパイルプログラム。
  16. 前記メソッドアドレス格納テーブル最適化機能は、各クラスのメソッドアドレス格納テーブルを比較し、一方のメソッドアドレス格納テーブルに格納されているメソッドアドレス値が、他方のメソッドアドレス格納テーブルの先頭位置に包含されている場合に、包含されている側のメソッドアドレス格納テーブルを削除し、包含されているメソッドアドレス格納テーブルを指していたクラスのメソッドアドレス格納テーブルポインタを、包含している側のメソッドアドレス格納テーブルの先頭アドレス値に更新することにより、前記中間コードを最適化する請求項10から請求項12までのいずれかに記載のコンピュータ実行可能なコンパイルプログラム。
  17. 前記メソッドアドレス格納テーブル最適化機能は、最適化実施内容を表示させる指令がコンパイラに与えられた場合に、少なくとも最適化の対象となった前記メソッドアドレス格納テーブルを参照していたクラス、最適化前の前記メソッドアドレス格納テーブル、最適化後の前記メソッドアドレス格納テーブルを標準出力に出力する請求項10から請求項16までのいずれかに記載のコンピュータ実行可能なコンパイルプログラム。
  18. 前記オブジェクト指向言語をC++言語、前記実行時確定メソッドを仮想関数、前記メソッドアドレス格納テーブルを仮想関数テーブル、前記メソッドアドレス格納テーブルポインタを仮想関数テーブルポインタとする請求項10から請求項17までのいずれかに記載のコンピュータ実行可能なコンパイルプログラム。
  19. オブジェクト指向言語で記述されたソースプログラムをオブジェクトコードに変換するコンパイル装置であって、
    前記ソースプログラムから中間コードを生成する中間コード生成手段と、
    前記中間コードから少なくともメソッドアドレス格納テーブル、前記メソッドアドレス格納テーブルを指しているメソッドアドレス格納テーブルポインタ、前記メソッドアドレス格納テーブルに対応するメソッドインデックス番号を含むメソッドアドレス格納テーブル情報と、少なくとも基底クラス名、派生クラス名、新規実行時確定メソッド名、オーバーライドメソッド名を含むクラス情報と、各メソッドがプログラム内で参照されているかどうかを示す関数参照情報とを抽出する解析対象情報抽出手段と、
    抽出した解析対象情報を解析し、あるクラスに対して、他のクラスが実行時確定メソッドを1つもオーバーライドしていない場合に、それぞれのクラスの前記メソッドアドレス格納テーブルを削除し、両方のクラスに共通に使用可能なメソッドアドレス格納テーブルを生成し、両方のクラスのメソッドアドレス格納テーブルポインタを、生成した前記両方のクラスに共通に使用可能なメソッドアドレス格納テーブルの先頭アドレス値に更新することにより前記中間コードを最適化するメソッドアドレス格納テーブル最適化手段と、
    最適化された前記中間コードをオブジェクトコードに変換するオブジェクトコード変換手段とを備えたコンパイル装置。
  20. 前記解析対象情報抽出手段は、少なくともファイル名、または関数名、またはクラス名を含む解析範囲限定情報がコンパイラに与えられた場合に、指定された解析範囲に限定して前記メソッドアドレス格納テーブル情報、クラス情報、関数参照情報を抽出する請求項19に記載のコンパイル装置。
  21. 前記解析対象情報抽出手段は、定義はされているものの参照はされていない実行時確定メソッドが存在する場合に、定義はされているものの参照はされていないすべての実行時確定メソッドを、クラス情報から削除し、かつすべてのメソッドアドレス格納テーブルより削除し、さらに削除後のメソッドアドレス格納テーブルに対する実行時確定メソッドのインデックス番号を更新する請求項19または請求項20に記載のコンパイル装置。
  22. 前記メソッドアドレス格納テーブル最適化手段は、基底クラスに対して、少なくとも1つの派生クラスが前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない場合に、前記基底クラスのメソッドアドレス格納テーブルを削除し、さらに前記基底クラスのメソッドアドレス格納テーブルポインタを、前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない派生クラスのメソッドアドレス格納テーブルの先頭アドレス値に更新することにより、前記中間コードを最適化する請求項19から請求項21までのいずれかに記載のコンパイル装置。
  23. 前記メソッドアドレス格納テーブル最適化手段は、基底クラスに対して、少なくとも2つの派生クラスが前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない場合で、かつ両方の派生クラスが新規に実行時確定メソッドを定義していない場合に、新規に実行時確定メソッドを定義していない派生クラスのメソッドアドレス格納テーブルを削除し、さらにその派生クラスのメソッドアドレス格納テーブルポインタを、前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない他方の派生クラスのメソッドアドレス格納テーブルの先頭アドレス値に更新することにより、前記中間コードを最適化する請求項19から請求項21までのいずれかに記載のコンパイル装置。
  24. 前記メソッドアドレス格納テーブル最適化手段は、基底クラスに対して、少なくとも2つの派生クラスが前記基底クラスの実行時確定メソッドを1つもオーバーライドしていない場合で、かつ両方の派生クラスが新規に実行時確定メソッドを定義している場合で、かつ両方の派生クラスがさらに派生クラスを持たない場合に、派生クラスを持たない一方の派生クラスのメソッドアドレス格納テーブルに、他方の派生クラスで新規に定義した実行時確定メソッドのアドレスを追加したメソッドアドレス格納テーブルを新たに生成し、さらに両方の派生クラスのメソッドアドレス格納テーブルを削除し、さらに両方のメソッドアドレス格納テーブルポインタを、新たに生成したメソッドアドレス格納テーブルの先頭アドレス値に更新し、さらに新たに生成されたメソッドアドレス格納テーブルに対する実行時確定メソッドのインデックス値を更新することにより、前記中間コードを最適化する請求項19から請求項21までのいずれかに記載のコンパイル装置。
  25. 前記メソッドアドレス格納テーブル最適化手段は、各クラスのメソッドアドレス格納テーブルを比較し、一方のメソッドアドレス格納テーブルに格納されているメソッドアドレス値が、他方のメソッドアドレス格納テーブルの先頭位置に包含されている場合に、包含されている側のメソッドアドレス格納テーブルを削除し、包含されているメソッドアドレス格納テーブルを指していたクラスのメソッドアドレス格納テーブルポインタを、包含している側のメソッドアドレス格納テーブルの先頭アドレス値に更新することにより、前記中間コードを最適化する請求項19から請求項21までのいずれかに記載のコンパイル装置。
  26. 前記メソッドアドレス格納テーブル最適化手段は、最適化実施内容を表示させる指令がコンパイラに与えられた場合に、少なくとも最適化の対象となった前記メソッドアドレス格納テーブルを参照していたクラス、最適化前の前記メソッドアドレス格納テーブル、最適化後の前記メソッドアドレス格納テーブルを標準出力に出力する請求項19から請求項25までのいずれかに記載のコンパイル装置。
  27. 前記オブジェクト指向言語をC++言語、前記実行時確定メソッドを仮想関数、前記メソッドアドレス格納テーブルを仮想関数テーブル、前記メソッドアドレス格納テーブルポインタを仮想関数テーブルポインタとする請求項19から請求項26までのいずれかに記載のコンパイル装置。
  28. 請求項1から請求項9までのいずれかに記載のコンパイル方法における各ステップをプログラムとして記録したコンピュータ読み取り可能なコンパイル用の記録媒体。


JP2004352558A 2004-12-06 2004-12-06 コンパイル方法、コンパイルプログラムおよびコンパイル装置 Active JP4768984B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2004352558A JP4768984B2 (ja) 2004-12-06 2004-12-06 コンパイル方法、コンパイルプログラムおよびコンパイル装置
US11/289,678 US7624390B2 (en) 2004-12-06 2005-11-30 Optimizing compiling of object oriented source code

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2004352558A JP4768984B2 (ja) 2004-12-06 2004-12-06 コンパイル方法、コンパイルプログラムおよびコンパイル装置

Publications (2)

Publication Number Publication Date
JP2006163686A true JP2006163686A (ja) 2006-06-22
JP4768984B2 JP4768984B2 (ja) 2011-09-07

Family

ID=36575731

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2004352558A Active JP4768984B2 (ja) 2004-12-06 2004-12-06 コンパイル方法、コンパイルプログラムおよびコンパイル装置

Country Status (2)

Country Link
US (1) US7624390B2 (ja)
JP (1) JP4768984B2 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2011133919A (ja) * 2009-12-22 2011-07-07 Internatl Business Mach Corp <Ibm> オブジェクト生成地点記録方法およびプログラム

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB0607068D0 (en) * 2006-04-07 2006-05-17 Symbian Software Ltd Improvement relating to method of embedding software in computing devices
CN101395580B (zh) * 2006-03-01 2012-06-20 诺基亚公司 通过在库中描绘特定函数减小代码大小
US7926022B2 (en) * 2006-04-07 2011-04-12 Lawson Software, Inc. Surrogate-based and extends-based context look-up
JP2009169864A (ja) * 2008-01-18 2009-07-30 Panasonic Corp コンパイル方法およびコンパイルプログラム
JP5574394B2 (ja) * 2008-02-20 2014-08-20 日本電気株式会社 Osイメージ縮小プログラムおよびosイメージ縮小プログラムを記録した記録媒体
JP2010026851A (ja) * 2008-07-22 2010-02-04 Panasonic Corp コンパイラによる最適化方法
US20120102473A1 (en) * 2010-10-23 2012-04-26 International Business Machines Corporation Abstract method removal for reduced memory footprint with optimizer tool
US8707278B2 (en) * 2010-11-09 2014-04-22 Nec Laboratories America, Inc. Embedding class hierarchy into object models for multiple class inheritance
CN103443763B (zh) * 2012-08-08 2016-10-05 英特尔公司 包含对重写虚拟函数的调用的支持的isa桥接
US20220342655A1 (en) * 2021-04-22 2022-10-27 STMicroelectronics (Grand Ouest) SAS Microcontroller, computer program product, and method for adding an additional function to a computer program

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH06103085A (ja) * 1992-05-06 1994-04-15 Microsoft Corp オブジェクト指向型プログラム言語のためのコンパイラに仮想ファンクションテーブルをインプリメントする方法
JPH06266562A (ja) * 1993-03-15 1994-09-22 Nec Corp オブジェクト指向言語処理システムにおける目的コードサイズ最適化方式
JPH0934709A (ja) * 1995-07-17 1997-02-07 Hitachi Ltd クラス情報表示方法
JPH11212789A (ja) * 1998-01-21 1999-08-06 Matsushita Electric Ind Co Ltd プログラム翻訳装置、プロセッサ及びプログラム翻訳装置に適用されるプログラムを記録した記録媒体
JP2003280922A (ja) * 2002-03-26 2003-10-03 Hitachi Ltd コードサイズ削減方法
JP2004126863A (ja) * 2002-10-01 2004-04-22 Nippon Telegr & Teleph Corp <Ntt> オブジェクト管理装置とその方法、およびプログラム

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE19535519C2 (de) * 1995-09-25 1999-03-04 Ibm Verfahren zur Reduzierung des Umfanges von Computerprogrammen
US6760905B1 (en) * 2000-09-21 2004-07-06 Curl Corporation Lazy compilation of template-generated classes in dynamic compilation execution environments
JP2005141380A (ja) * 2003-11-05 2005-06-02 Matsushita Electric Ind Co Ltd テンプレートコンパイル方法
US7171649B1 (en) * 2004-01-12 2007-01-30 Sun Microsystems, Inc. Optimizing safe downcasting in an object-oriented programming language

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH06103085A (ja) * 1992-05-06 1994-04-15 Microsoft Corp オブジェクト指向型プログラム言語のためのコンパイラに仮想ファンクションテーブルをインプリメントする方法
JPH06266562A (ja) * 1993-03-15 1994-09-22 Nec Corp オブジェクト指向言語処理システムにおける目的コードサイズ最適化方式
JPH0934709A (ja) * 1995-07-17 1997-02-07 Hitachi Ltd クラス情報表示方法
JPH11212789A (ja) * 1998-01-21 1999-08-06 Matsushita Electric Ind Co Ltd プログラム翻訳装置、プロセッサ及びプログラム翻訳装置に適用されるプログラムを記録した記録媒体
JP2003280922A (ja) * 2002-03-26 2003-10-03 Hitachi Ltd コードサイズ削減方法
JP2004126863A (ja) * 2002-10-01 2004-04-22 Nippon Telegr & Teleph Corp <Ntt> オブジェクト管理装置とその方法、およびプログラム

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2011133919A (ja) * 2009-12-22 2011-07-07 Internatl Business Mach Corp <Ibm> オブジェクト生成地点記録方法およびプログラム
US8495647B2 (en) 2009-12-22 2013-07-23 International Business Machines Corporation Method and program for recording object allocation site

Also Published As

Publication number Publication date
JP4768984B2 (ja) 2011-09-07
US7624390B2 (en) 2009-11-24
US20060123198A1 (en) 2006-06-08

Similar Documents

Publication Publication Date Title
CN108139896B (zh) 扩展虚拟机指令集体系架构
JP4183399B2 (ja) 複数言語のコンパイル方法及びシステム
US8997040B2 (en) Variable closure
US5778212A (en) Interprocedural analysis user interface
CN108920133B (zh) 跨语言编程方法、装置、电子设备及存储介质
US8997070B2 (en) Extension mechanism for scripting language compiler
US8479178B2 (en) Compiler in a managed application context
US7624390B2 (en) Optimizing compiling of object oriented source code
US5812855A (en) System and method for constaint propagation cloning for unknown edges in IPA
US7823139B2 (en) Method and system for translating programming languages
JP4806060B2 (ja) コンパイラ・プログラム、コンパイル方法及びコンピュータ・システム
AU2892100A (en) Instruction selection in a multi-platform environment
AU2892200A (en) Automatic stub/adapter generator
US20090328016A1 (en) Generalized expression trees
US7747991B2 (en) Program converting method
US20100218174A1 (en) Dynamic compiling and loading at runtime
US7458071B2 (en) Compilation method, compiler apparatus and compiler
JP2003196106A (ja) プログラム変換方法、コンピュータ装置及びプログラム
US20090187897A1 (en) Compiling method and compiling program
US20110010696A1 (en) Duplicate virtual function table removal
US20100042982A1 (en) Optimization of imperative implementation of compositional content
JP2002116917A (ja) オブジェクト指向型プログラミング言語によるソース・プログラムをコンパイルするコンパイラ
CN109032572B (zh) 一种基于字节码的java程序方法内联的方法
US20200356384A1 (en) Intelligently determining a virtual machine configuration during runtime based on garbage collection characteristics
JP6651974B2 (ja) 情報処理装置、コンパイル方法及びコンパイラプログラム

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20071129

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20100216

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20110111

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20110223

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20110614

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20110617

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

Ref document number: 4768984

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20140624

Year of fee payment: 3

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313111

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250