JP2009169864A - コンパイル方法およびコンパイルプログラム - Google Patents

コンパイル方法およびコンパイルプログラム Download PDF

Info

Publication number
JP2009169864A
JP2009169864A JP2008009787A JP2008009787A JP2009169864A JP 2009169864 A JP2009169864 A JP 2009169864A JP 2008009787 A JP2008009787 A JP 2008009787A JP 2008009787 A JP2008009787 A JP 2008009787A JP 2009169864 A JP2009169864 A JP 2009169864A
Authority
JP
Japan
Prior art keywords
class
constructor
destructor
code
partial
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
JP2008009787A
Other languages
English (en)
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 Corp
Original Assignee
Panasonic Corp
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 Panasonic Corp filed Critical Panasonic Corp
Priority to JP2008009787A priority Critical patent/JP2009169864A/ja
Priority to US12/329,014 priority patent/US20090187897A1/en
Priority to CNA2009100034882A priority patent/CN101488095A/zh
Publication of JP2009169864A publication Critical patent/JP2009169864A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • 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/4492Inheritance

Landscapes

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

Abstract

【課題】クラスオブジェクトの生成有無や呼びだしの有無に関わらず、冗長に生成される関数を削除することが可能なコンパイル方法コンパイル方法およびコンパイルプログラムを提供する。
【解決手段】オブジェクト指向言語で記述され、少なくとも1つのクラスを有する入力プログラムを目的プログラムに変換するコンパイル方法であって、前記入力プログラム中の前記クラスが仮想継承で定義されているかどうかを解析する仮想継承解析ステップS10と、前記仮想継承解析ステップで解析された結果、前記クラスが仮想継承で定義されていない場合、前記クラスの複数のコンストラクタおよび複数のデストラクタの少なくとも一方を共通化するコードを生成する特殊関数共通化ステップS11と、特殊関数共通化ステップで生成された前記コードを含ませて目的プログラムを生成する生成ステップS6とを含む。
【選択図】図1

Description

本発明は、コンパイル方法およびコンパイルプログラムに関し、特にオブジェクト指向言語で記述され、少なくとも1つのクラスを有する入力プログラムを目的プログラムに変換するコンパイル方法およびコンパイルプログラムに関する。
近年のソフトウェア開発において、プログラムの規模が大規模化してきている。そのため、保守性および再利用性の高いオブジェクト指向言語が注目されている。ここで、オブジェクト指向言語とは、オブジェクトの振る舞いを記述し、そのオブジェクトの組み合わせとしてプログラムを記述する言語である。また、オブジェクトとは、データとそれを操作する手続き(メソッド)とが一体化されたひとまとまりの単位である。
オブジェクト指向言語として、例えば「C++」がある。「C++」は、また、手続き型のプログラミング言語である「C」に、オブジェクト指向的な拡張を施したプログラミング言語である。さらに、「C++」は、長年プログラミングに広く使用されている「C」に替わるものとして注目されており、「C」から「C++」へプログラミング移行が各所で行われている。
しかし「C++」は、「C」と比較してさまざまな機能が強化されている一方、冗長なコードが生成されてしまう。そこで、この冗長なコードを削減するさまざまな技術が提案されている(例えば、特許文献1または特許文献2)。
特許文献1では、オブジェクトが生成されないクラスについての関数を削除する方法が開示されている。
ここで、クラスとは、オブジェクト指向プログラミングにおいて、データとその操作手順であるメソッドをまとめたオブジェクトの雛型を定義したものである。これを定義することで、同種のオブジェクトをまとめて扱うことができるようになる。
特許文献2では、呼び出しが行われないメソッドの関数定義を生成しない方法が開示されている。
ここで、関数とは、引数と呼ばれるデータを受取り、定められた通りの処理を実行して結果を返す一連の命令群である。関数は、多くのプログラミング言語でプログラムを構成する要素となっている。
特開2005−18425号公報 特開2006−285584号公報
しかしながら、上記特許文献1で開示されている方法は、オブジェクトが生成されないクラスに限定されており、オブジェクトが生成されるクラスにおける冗長な関数を削除することはできない。また、上記特許文献2で開示されている方法では、呼び出しが行われないメソッドに限定されており、呼び出しが行われかつ冗長な関数定義が存在する場合には対応できない。
本発明は、かかる課題に鑑みてなされたものであり、クラスオブジェクトの生成有無や呼びだしの有無に関わらず、冗長に生成される関数を削除することが可能なコンパイル方法およびコンパイルプログラムを提供することを目的とする。
上記の課題を解決するために、本発明に係るコンパイル方法は、オブジェクト指向言語で記述され、少なくとも1つのクラスを有する入力プログラムを目的プログラムに変換するコンパイル方法であって、前記入力プログラム中の前記クラスが仮想継承で定義されているかどうかを解析する仮想継承解析ステップと、前記仮想継承解析ステップで解析された結果、前記クラスが仮想継承で定義されていない場合、前記クラスの複数のコンストラクタおよび複数のデストラクタの少なくとも一方を共通化するコードを生成する特殊関数共通化ステップと、特殊関数共通化ステップで生成された前記コードを含ませて目的プログラムを生成する生成ステップとを含むことを特徴とする。
この方法によれば、仮想継承で定義されていないクラスに対し、クラスオブジェクトの生成有無に関わらず、また呼びだしの有無に関わらず、冗長に生成される関数(特に、コンストラクタ、デストラクタ)の削除ができ、コード生成効率が向上する。それにより、クラスオブジェクトの生成有無や呼びだしの有無に関わらず、冗長に生成される関数を削除することが可能なコンパイル方法を実現できる。
好ましくは、前記仮想継承解析ステップは、前記入力プログラム中に記述されたクラス定義に基づいて、前記クラスが仮想継承で定義されているかどうかを解析する。
この方法によれば、プログラム中で定義されているクラスのうち、仮想継承で定義されていないクラスに対して冗長に生成されている関数のコンストラクタとデストラクタとを削除することができ、コード生成効率が向上する。
さらに好ましくは、前記仮想継承解析ステップは、言語仕様に則り前記入力プログラム中に記述された制御文である言語仕様制御文に基づいて、前記クラスが仮想継承で定義されているかどうかを解析する。
この方法によれば、例えばプログラマが入力プログラムに#pragma指令による言語仕様制御文を記述することで、もともと入力プログラムに記述されているクラス定義を解析する必要なく、高速に仮想継承で定義されていないクラスに対して冗長に生成されている関数のコンストラクタとデストラクタとを削除することができ、コード生成効率が向上する。
さらに好ましくは、前記仮想継承解析ステップは、前記入力プログラムをコンパイルするコンパイルシステムの言語仕様に則り記述された制御命令である言語仕様制御命令に基づいて、クラスが仮想継承で定義されているかどうかを解析する。
この方法によれば、例えばプログラマがコンパイラシステムのオプションによって言語仕様制御命令を与えることで、もともと入力プログラムに記述されているクラス定義を解析する必要なしに、高速に仮想継承で定義されていないクラスに対して冗長に生成されている関数のコンストラクタとデストラクタとを削除することができ、コード生成効率が向上する。
さらに好ましくは、前記特殊関数共通化ステップは、仮想継承で定義されていない前記クラスの複数のコンストラクタのうち、クラスオブジェクトを構成する部分クラスオブジェクトではない完全なクラスオブジェクトを生成するときに呼び出されるコンストラクタである完全コンストラクタとクラスオブジェクトを構成する部分クラスオブジェクトを生成するときに呼び出されるコンストラクタである部分コンストラクタとを共通化するコードを生成する。前記特殊関数共通化ステップは、仮想継承で定義されていない前記クラスの複数のデストラクタのうちの、クラスオブジェクトを構成する部分クラスオブジェクトではない完全なクラスオブジェクトを生成するときに呼び出されるデストラクタである完全デストラクタとクラスオブジェクトを構成する部分クラスオブジェクトを生成するときに呼び出されるデストラクタである部分デストラクタとを共通化するコードを生成する。
さらに好ましくは、前記特殊関数共通化ステップは、仮想継承で定義されていない前記クラスの複数のコンストラクタのうちの完全コンストラクタと部分コンストラクタとのいずれか一方の呼びだし命令を他方の呼びだし命令に置きかえ、置きかえられた呼びだし命令のコンストラクタである前記一方のコンストラクタのコードを削除することにより、前記クラスの完全コンストラクタと部分コンストラクタとを共通化するコードを生成する。前記特殊関数共通化ステップは、仮想継承で定義されていない前記クラスの複数のデストラクタのうちの完全デストラクタと部分デストラクタとのいずれか一方の呼びだし命令を他方の呼びだし命令に置きかえ、置きかえ前の呼びだし命令のデストラクタである前記一方のデストラクタのコードを削除することにより、前記クラスの完全デストラクタと部分デストラクタとを共通化するコードを生成する。
さらに好ましくは、前記特殊関数共通化ステップは、仮想継承で定義されていない前記クラスの複数のコンストラクタのうちの完全コンストラクタと部分コンストラクタとのいずれか一方のコードを削除し、削除されない他方のコードの先頭に完全コンストラクタの先頭アドレスを示すラベルと、部分コンストラクタの先頭アドレスを示すラベルとを配置することにより、前記クラスの完全コンストラクタと部分コンストラクタとを共通化するコードを生成する。前記特殊関数共通化ステップは、仮想継承で定義されていない前記クラスの複数のデストラクタのうちの完全デストラクタと部分デストラクタとのいずれか一方のコードを削除し、削除されない他方のコードの先頭に完全デストラクタの先頭アドレスを示すラベルと、部分デストラクタの先頭アドレスを示すラベルとを配置することにより、前記クラスの完全デストラクタと部分デストラクタとを共通化するコードを生成する。
これらの方法によれば、冗長に生成されている関数の完全コンストラクタと部分コンストラクタとのどちらか一方を削除することができ、コード生成効率が向上する。
なお、本発明は、このような特徴的なステップを有するコンパイル方法として実現することができるだけでなく、当該コンパイル方法に含まれる特徴的なステップを手段とするコンパイラ装置として実現したり、当該コンパイル方法に含まれる特徴的なステップをコンピュータに実行させるコンパイラ(コンパイルプログラム)として実現したりすることもできる。そして、そのようなコンパイラは、Compact Disc−Read Only Memory (CD−ROM)などの記憶媒体やインターネット等の伝送媒体を介して流通させることができるのは言うまでもない。
本発明によれば、クラスオブジェクトの生成有無や呼びだしの有無に関わらず、冗長に生成される関数を削除することが可能なコンパイル方法およびコンパイルプログラムを提供することが可能となる。それにより、コード生成効率が向上する効果を奏する。
以下、本発明の実施の形態に係るコンパイル方法について図面を参照しながら説明する。
なお、以下の実施の形態例は本発明を具体化した1例であって、本発明の技術範囲を限定するものではない。
図1は、コンパイラにより実行される処理内容の1例を示すフローチャートである。
ここで、コンパイラとは、人間がプログラミング言語で記述したソフトウェアの設計図(ソースプログラム)を、コンピュータが実行できる形式(オブジェクトコード)に変換するソフトウェア(コンパイルプログラム)である。
まず、コンパイラは、例えばプログラム記憶部1に記憶されているヘッダファイルおよびソースプログラムを読み込む入力ステップを行う(S1)。
次に、コンパイラは、入力ステップS1で読み込んだソースプログラムの構文を解析し、シンボルテーブルや構文木を生成する構文解析ステップを行う(S2)。
ここで、シンボルテーブルとは、解析時に検出されたすべての識別子とそれらのプログラム中の位置と属性とからなるリストであり、コンパイラが識別子の使い方を判断するために用いるためのリストである。また、構文木とは、プログラミング言語の構文を表す木構造である。
次に、コンパイラは、生成された構文木に基づいて、中間コードを生成する中間コード生成ステップを行う(S3)。
次に、コンパイラは、中間コード生成ステップS3で生成された中間コードに対して各種最適化を施す最適化ステップを行う(S4)。
次に、コンパイラは、最適化ステップS4で最適化された中間コードに含まれるすべての変数に対してレジスタやメモリなどのハードウェア資源を割り付ける資源割付ステップを行う(S5)。
次に、資源割付ステップS5で資源割付された中間コードをオブジェクトコードに変換し、オブジェクトプログラムとして生成コード記憶部2に出力する出力ステップを行う(S6)。出力ステップS6で出力されたオブジェクトプログラムは、生成コード記憶部2に記憶される。
最適化ステップS4は、図1に示すように、仮想継承解析ステップS10と、特殊関数共通化ステップS11と、その他の最適化ステップS12とを含む。
仮想継承解析ステップS10は、中間コードを解析し、プログラム中に存在するクラスが仮想継承で定義されているかどうかを解析する。
ここで、仮想継承とは、複数の親クラスからクラスの性質を継承する多重継承を行いつつ、基底クラスの重複継承をさけるためのクラス継承手段である。例えば、あるクラスを継承したクラスが2つあり、その2つのクラスを多重継承した場合、大元のクラス(基底クラス)を2回継承することになる。仮想継承では、2回継承した大元のクラスである基底クラスを仮想基本クラスとして宣言し、そのインスタンスを区別しないことによって継承が重複することを防いでいる。
特殊関数共通化ステップS11は、仮想継承解析ステップS10の解析結果に応じて、冗長に生成されている複数のコンストラクタまたは複数のデストラクタを共通化する。
ここで、コンストラクタとは、オブジェクト指向のプログラミング言語で新たなオブジェクトを生成する際に呼び出されて内容の初期化などを行う関数であり、構築子とも呼ばれる。また、デストラクタとはオブジェクト指向のプログラミング言語でオブジェクトを消去する際に呼び出されて後処理などを行う関数であり、消去子とも呼ばれる。
仮想継承解析ステップS10ならびに特殊関数共通化ステップS11の詳細については後述する。
なお、その他の最適化ステップS12は、一般的な最適化ステップであり、本発明の要旨ではないため、その説明は省略する。
また、入力ステップS1、構文解析ステップS2、中間コード生成ステップS3、資源割付ステップS5、オブジェクト出力ステップS6、およびその他の最適化ステップS12については、既存の処理と同様の処理であり本発明の主眼ではない。よって詳細な説明は省略する。
また、本発明での仮想継承解析ステップS10ならびに特殊関数共通化ステップS11は、必ずしも中間コード生成ステップS3と資源割付ステップS5の間の最適化ステップS4内に限定されるものではなく、コンパイルステップ内の区間で解析や共通化が可能な状態であれば、それぞれどの区間内(S1〜S6の区間内)で行われてもよい。
以下、本発明の主眼である仮想継承解析ステップS10ならびに特殊関数共通化ステップS11について説明する。
図2は、仮想継承解析ステップS10で実行される処理内容の第1の例を示すフローチャートである。
仮想継承解析ステップS10では、入力ステップS1で入力されたソースプログラム(入力プログラム)に対応する各クラス定義毎、すなわち中間コード生成ステップS3で生成された中間コード内に記述された各クラス定義毎に対して以下の処理(図2中ループAと記載。)を繰り返す。
まず、入力プログラムに対して、解析対象であるクラス定義が存在するかどうか確認する。
解析対象(クラス定義)が存在する場合には、中間コード内に記述されたクラス(継承元のクラスを含む)が、仮想継承によりクラス定義が行われているかどうか解析する(S1021)。
仮想継承によりクラス定義が行われていない場合には(S1021のNoの場合)、解析したそのクラスのすべてのコンストラクタまたはデストラクタを共通化対象とする(S1022)。それは例えば、共通化対象とする旨を示す共通化判定フラグ等で制御することができる。
仮想継承によりクラス定義が行われている場合には(S1021のYesの場合)、解析したそのクラスのすべてのコンストラクタまたはデストラクタを共通化対象としない(S1023)。それは例えば、共通化対象としない旨を示す共通化判定フラグ等で制御することができる。
次に、入力プログラムに対して、解析対象で解析していない別のクラス定義があるかを確認する。解析対象で解析していない別のクラス定義がある場合には、解析対象であるクラス定義がなくなるまでループAを繰り返す。解析対象で解析していない別のクラス定義がない場合には、ループAは終わりであるので、処理を終了する。
以上のように、仮想継承解析ステップS10では、中間コードを解析し、プログラムに存在するクラスが仮想継承で定義されているかどうかを解析する。
なお、共通化対象であるかどうかを示す情報の形態は、特殊関数共通化ステップS11において参照可能であれば、中間コード内のデータであっても、クラスと関連付けられている独立したデータであってもよい。
図3は、仮想継承解析ステップS10で実行される処理内容の第2の例を示すフローチャートである。
仮想継承解析ステップS10では、図2同様に、入力プログラムに対応する各クラス定義毎に対して以下の処理(図3中ループBと記載。)を繰り返す。
まず、入力プログラムに対して、解析対象であるクラス定義が存在するかどうか確認する。
解析対象(クラス定義)が存在する場合には、入力プログラム中の記述に、言語仕様制御文により、仮想継承を含まない言語仕様に制御されているかどうか解析する(S1031)。ここで、言語仕様制御文は、言語仕様に則り入力プログラム中に記述された制御文である。例えば#pragma指令のような言語仕様に用意されている特殊な機能を有効にするよう指示するための制御文をソースプログラムに記述することで、コンパイラに対して直接言語仕様に関する情報を与える制御をするものである。
言語仕様制御文により、仮想継承を含まない言語仕様に制御されている場合は(S1031のNoの場合)、そのクラスのすべてのコンストラクタまたはデストラクタを共通化対象とする(S1032)。
そうではない場合、すなわち、言語仕様制御文により、仮想継承を含まない言語仕様に制御されていない場合は(S1031のYesの場合)、そのクラスのすべてのコンストラクタまたはデストラクタを共通化対象としない(S1033)。
次に、入力プログラムに対して、解析対象で解析していない別のクラス定義があるかを確認する。解析対象で解析していない別のクラス定義がある場合には、解析対象であるクラス定義がなくなるまでループBを繰り返す。解析対象で解析していない別のクラス定義がない場合には、ループBは終わりであるので、処理を終了する。
以上のように、仮想継承解析ステップS10では、中間コードを解析し、プログラムに存在するクラスが仮想継承で定義されているかどうかを解析する。
図4は、仮想継承解析ステップS10で実行される処理内容の第3の例を示すフローチャートである。
仮想継承解析ステップS10では、図3同様に、入力プログラムに対応する各クラス定義毎に対して以下の処理(図3中ループCと記載。)を繰り返す。
まず、入力プログラムに対して、解析対象であるクラス定義が存在するかどうか確認する。
解析対象(クラス定義)が存在する場合には、入力プログラム中の記述に、言語仕様制御命令により、仮想継承を含まない言語仕様に制御されているかどうか解析する(S1041)。ここで、言語仕様制御命令は、入力プログラムをコンパイルするコンパイルシステムの言語仕様に則り記述された制御命令である。例えばコマンドラインオプションのようなコンパイラに用意されている特殊な機能を有効にするよう指示するためのコマンドをソースプログラムに記述することで、コンパイラシステムに対して直接言語仕様に関する情報を与える制御をするものである。
言語仕様制御命令により、仮想継承を含まない言語仕様に制御されている場合は(S1041のYesの場合)、そのクラスのすべてのコンストラクタまたはデストラクタを共通化対象とする(S1042)。
そうではない場合、すなわち、言語仕様制御命令により、仮想継承を含まない言語仕様に制御されていない場合は(S1041のNoの場合)、そのクラスのすべてのコンストラクタまたはデストラクタを共通化対象としない(S1043)。
次に、入力プログラムに対して、解析対象で解析していない別のクラス定義があるかを確認する。解析対象で解析していない別のクラス定義がある場合には、解析対象であるクラス定義がなくなるまでループCを繰り返す。解析対象で解析していない別のクラス定義がない場合には、ループCは終わりであるので、処理を終了する。
以上のように、仮想継承解析ステップS10では、中間コードを解析し、プログラムに存在するクラスが仮想継承で定義されているかどうかを解析する。
なお、図2から図4で説明する仮想継承解析ステップS10の第1〜第3の処理内容は、例えば優先度をつけることで図2から図4のすべてのステップを含む一つの仮想継承解析ステップS10としてもよく、組み合わせも自由に選択してもよい。
次に、特殊関数共通化ステップS11について説明する。
図5は、特殊関数共通化ステップS11で実行される処理内容の第1の例を示すフローチャートである。
特殊関数共通化ステップS11では、仮想継承解析ステップS10での解析結果に応じて、中間コード生成ステップS3で生成された中間コード内に記述された各クラスのコンストラクタに対する処理(ループD)とデストラクタに対する処理(ループE)とを行う。
まず、仮想継承解析ステップS10で解析された中間コード内に記述された各クラスに対して、コンストラクタが存在するかどうか確認する。
コンストラクタが存在する場合には、そのコンストラクタが共通化対象であるかどうかを判定する(S1151)。
そのコンストラクタが共通化対象であれば(S1151のYesの場合)、そのコンストラクタに対する完全コンストラクタと部分コンストラクタのどちらか一方の呼び出し命令を他方の呼び出し命令に置きかえる(S1152)。そして、置きかえられた側の(完全もしくは部分)コンストラクタのコードを削除する(S1153)。
ここで、完全コンストラクタとは、クラスオブジェクトを構成する部分クラスオブジェクトではない完全なクラスオブジェクトを生成するときに呼び出されるコンストラクタである。また、部分コンストラクタは、クラスオブジェクトを構成する部分クラスオブジェクトを生成するときに呼び出されるコンストラクタである。
次に、仮想継承解析ステップS10で解析された中間コード内に記述された各クラスに対して、さらにコンストラクタが存在するかを確認する。さらにコンストラクタがある場合には、各クラスのコンストラクタに対してループDで示した処理内容を繰り返す。コンストラクタがない場合には、ループDは終わりであるので、ループDで示す処理を終了する。
また、S1151において、そのコンストラクタ共通化対象でなければ何もしない(S1151のNoの場合)。そして、ループDの処理を終了する。
次に、ループEで示すデストラクタに対する処理を行う。
まず、仮想継承解析ステップS10で解析された中間コード内に記述された各クラスに対して、デストラクタが存在するかどうか確認する。
デストラクタが存在する場合には、そのデストラクタが共通化対象であるかどうかを判定する(S1154)。
そのデストラクタが共通化対象であれば(S1154のYesの場合)、そのデストラクタに対する完全デストラクタと部分デストラクタのどちらか一方の呼び出し命令を他方の呼び出し命令に置きかえる(S1155)。そして、置きかえられた側の(完全、もしくは部分)デストラクタのコードを削除する(S1156)。
ここで、完全デストラクタとは、クラスオブジェクトを構成する部分クラスオブジェクトではない完全なクラスオブジェクトを生成するときに呼び出されるデストラクタである。また、部分デストラクタは、クラスオブジェクトを構成する部分クラスオブジェクトを生成するときに呼び出されるデストラクタである。
次に、仮想継承解析ステップS10で解析された中間コード内に記述された各クラスに対して、さらにデストラクタが存在するかを確認する。さらにデストラクタがある場合には、各クラスのデストラクタに対してループEで示した処理内容を繰り返す。デストラクタがない場合には、ループEは終わりであるので、ループEで示す処理を終了する。
また、S1154において、そのデストラクタが共通化対象でなければ何もしない(S1154のNoの場合)。そして、ループEの処理を終了する。
以上のように、特殊関数共通化ステップS11では、仮想継承解析ステップS10の解析結果に応じて、冗長に生成されている複数のコンストラクタまたは複数のデストラクタを共通化する。それにより、冗長に生成されている関数の完全コンストラクタと部分コンストラクタとのどちらか一方を削除することができ、コード生成効率が向上する。
図6は、特殊関数共通化ステップS11で実行される処理内容の第2の例を示すフローチャートである。
図5と同様に特殊関数共通化ステップS11では、仮想継承解析ステップS10での解析結果に応じて、中間コード生成ステップS3で生成された中間コード内に記述された各クラスのコンストラクタに対する処理(ループF)とデストラクタに対する処理(ループG)とを行う。
まず、仮想継承解析ステップS10で解析された中間コード内に記述された各クラスに対して、コンストラクタが存在するかどうか確認する。
コンストラクタが存在する場合には、そのコンストラクタが共通化対象であるかどうかを判定する(S1161)。
そのコンストラクタが共通化対象であれば(S1161のYesの場合)、そのコンストラクタに対する完全コンストラクタと部分コンストラクタのどちらか一方のコードを削除する(S1162)。そして、他方のコードの先頭に完全コンストラクタの先頭アドレスを示すラベルと、部分コンストラクタの先頭アドレスを示すラベルを配置する(S1163)。
次に、仮想継承解析ステップS10で解析された中間コード内に記述された各クラスに対して、さらにコンストラクタが存在するかを確認する。さらにコンストラクタがある場合には、各クラスのコンストラクタに対してループFで示した処理内容を繰り返す。コンストラクタがない場合には、ループFは終わりであるので、ループFで示す処理を終了する。
また、S1161において、そのコンストラクタが共通化対象でなければ何もしない(S1161のNoの場合)。そして、ループDの処理を終了する。
次に、ループGで示すデストラクタに対する処理を行う。
まず、仮想継承解析ステップS10で解析された中間コード内に記述された各クラスに対して、デストラクタが存在するかどうか確認する。
デストラクタが存在する場合には、そのデストラクタが共通化対象であるかどうかを判定する(S1164)。
そのデストラクタが共通化対象であれば(S1164のYesの場合)、そのデストラクタに対する完全デストラクタと部分デストラクタのどちらか一方のコードを削除する(S1165)。そして他方のコードの先頭に完全デストラクタの先頭アドレスを示すラベルと、部分デストラクタの先頭アドレスを示すラベルを配置する(S1165)。
次に、仮想継承解析ステップS10で解析された中間コード内に記述された各クラスに対して、さらにデストラクタが存在するかを確認する。さらにデストラクタがある場合には、各クラスのデストラクタに対してループGで示した処理内容を繰り返す。デストラクタがない場合には、ループGは終わりであるので、ループGで示す処理を終了する。
また、S1164において、そのデストラクタが共通化対象でなければ何もしない(S1164のNoの場合)。そして、ループGの処理を終了する。
以上のように、特殊関数共通化ステップS11では、仮想継承解析ステップS10の解析結果に応じて、冗長に生成されている複数のコンストラクタまたは複数のデストラクタを共通化する。それにより、冗長に生成されている関数の完全コンストラクタと部分コンストラクタとのどちらか一方を削除することができ、コード生成効率が向上する。
以上、仮想継承解析ステップS10と、特殊関数共通化ステップS11を含む最適化ステップS4を行うことにより、仮想継承で定義されていないクラスに対し、クラスオブジェクトの生成有無に関わらず、また呼びだしの有無に関わらず、冗長に生成される関数(特に、コンストラクタ、デストラクタ)の削除ができ、コード生成効率が向上する。それにより、クラスオブジェクトの生成有無や呼びだしの有無に関わらず、冗長に生成される関数を削除することが可能なコンパイル方法を実現できる。
(実施例)
以下、本発明のコンパイル方法について、C++言語を使用した例を示すことで詳細に説明する。
図7は、プログラム記憶部1に記憶されているソースプログラムの1例を示す図である。
以下では、図7で示すソースプログラムを入力した場合のコンパイル方法を説明する。ここで、前提として、<ex.cpp>はC++モードでコンパイルするものとする。
図7に示すソースファイル<ex.cpp>では、4つのクラス(X、Y、Z、U)を定義している。図7において、4つのクラス(X、Y、Z、U)に対してそれぞれコンストラクタを(1)〜(4)で示すように定義している。同様に、4つのクラス(X、Y、Z、U)に対してそれぞれデストラクタを(5)〜(6)で示すように定義している。
図8〜図10は、従来の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。また、図8〜図10は、gccバージョン3.3.6release コンパイラで最適化オプション「−O」を付加させた場合のアセンブラ出力結果である。ここでは、以下の説明を容易にするため、「.L」で始まるラベルを除外している。
従来の方法では、図8〜図10に示すように、各クラスのコンストラクタ定義やデストラクタ定義は、それぞれ完全コンストラクタおよび部分コンストラクタと、完全デストラクタおよび部分デストラクタとのコードに無条件に変換される。図7で示すコンストラクタおよびデストラクタと、図8〜図10で示す完全コンストラクタおよび部分コンストラクタと、完全デストラクタおよび部分デストラクタとの対応は以下の[表1]および[表2]で示される通りである。
Figure 2009169864
Figure 2009169864
図8〜図10から、「_ZN1XC1Ev」および「_Z1XC2Ev」のコードと、「_ZN1ZC1Ev」および「_ZN1ZC2Ev」とのコードと、「_ZN1XD1Ev」および「_Z1XD2Ev」のコードと、「_ZN1ZD1Ev」および「_ZN1ZD2Ev」のコードとは、それぞれ全く同じアセンブリコードが生成されており、コードが冗長に生成されていることがわかる。
次に、本実施の形態におけるコンパイル方法について、C++言語を使用した例を示す。
中間コード生成ステップにより生成された中間コードは、仮想継承解析ステップS10において、クラス定義毎に図2で示すループAの処理内容が実施される。本実施例では、図7で示した4つのクラス定義(X、Y、Z、U)が対象となる。
図7において、クラスXは、仮想継承によりクラス定義が行われていないので、クラスXのコンストラクタ「X::X()」ならびにデストラクタ「X::〜X()」が共通化対象であるとして記録される。
図11は、共通化対象かどうかを示す共通化対象判定フラグの内容を示す図である。
図11に示されるように、クラスXのコンストラクタ中間コードおよびクラスXのデストラクタ中間コードの共通化対象判定フラグに「TRUE」と記録される。このように、共通化対象とする旨を示す共通化判定フラグが記録されることで、クラスXのコンストラクタ「X::X()」ならびにデストラクタ「X::〜X()」が共通化対象であるとして記録される。
また、図7において、クラスYは、キーワード「virtual」を用いてクラスXから仮想継承によりクラス定義が行われているので、クラスYのコンストラクタ「Y::Y()」ならびにデストラクタ「Y::〜Y()」が共通化対象ではないとして記録される。
ここで、例えば図11に示すように、クラスYのコンストラクタ中間コードおよびクラスYデストラクタ中間コードの共通化対象判定フラグに「FALSE」と記録されることで、共通化対象でない旨が記録される。
また、図7において、クラスZは、クラスXから継承されているが、仮想継承ではなく、また継承元のクラスXも仮想継承によりクラス定義が行われていないので、クラスZのコンストラクタ「Z::Z()」ならびにデストラクタ「Z::〜Z()」が共通化対象であるとして記録される。
ここで、例えば図11に示すように、クラスZのコンストラクタ中間コードおよびクラスZのデストラクタ中間コードの共通化対象判定フラグに「TRUE」と記録されることで、共通化対象である旨が記録される。
また、図7において、クラスUは、クラスYとクラスZから継承されており仮想継承は行われていないが、継承元であるクラスYが仮想継承により定義されている。したがって、クラスUのコンストラクタ「U::U()」ならびにデストラクタ「U::〜U()」が共通化対象ではないとして記録される。
ここで、例えば図11に示すように、クラスUのコンストラクタ中間コードおよびクラスUのデストラクタ中間コードの共通化対象判定フラグに「FALSE」と記録されることで、共通化対象でない旨が記録される。
なお、図11で示す共通化対象判定フラグは、共通化対象であるかどうかを示す情報の1形態であり、特殊関数共通化ステップS11において参照可能であれば、上述例のような中間コード内のデータであっても、クラスと関連付けられている独立したデータであってもよい。
次に、上述の仮想継承解析ステップS10における解析結果に応じて特殊関数共通化ステップS11が実施される。
図5における特殊関数共通化ステップS11で実行される処理内容の第1の例では、ループDの処理内容とループEの処理内容が実施される。本実施例では、特殊関数共通化ステップS11において、図11で示す共通化判定フラグを参照することにより、仮想継承解析ステップS10の解析結果から冗長に生成されている複数のコンストラクタまたは複数のデストラクタを共通化する。図11から、クラスXおよびクラスZのコンストラクタとデストラクタとが共通化対象となる。
よって、完全コンストラクタと部分コンストラクタとのどちらか一方の呼びだし命令を他方の呼びだし命令に置きかえた後、置きかえられたコンストラクタのコードを削除する。
本実施例では、部分コンストラクタ呼び出しを完全コンストラクタ呼び出しに置き換え、部分コンストラクタを削除する(ループDの処理)。デストラクタについても同様の処理を行う(ループEの処理)。上記処理を行った結果を図12〜図14に示す。
図12〜図14は、本発明における方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。
図中★印および下線箇所で示されたところが置きかえられた完全コンストラクタ呼びだし命令ならびに完全デストラクタ呼び出し命令である。
また、線で囲まれた部分が、特殊関数共通化ステップS11において、削除された部分コンストラクタコードならびに部分デストラクタコードである。
図12〜図14のアセンブリ出力結果から、冗長なコードが削除されていることがわかる。
また、特殊関数共通化ステップS11が図6の第2の例についても以下説明する。図6における特殊関数共通化ステップS11で実行される処理内容の第2の例では、まず、ループFの処理内容とループGの処理内容が実施される。図5と同様、本実施例では、特殊関数共通化ステップS11において、図11で示す共通化判定フラグを参照することにより、仮想継承解析ステップS10の解析結果から冗長に生成されている複数のコンストラクタまたは複数のデストラクタを共通化する。図11から、クラスXおよびクラスZのコンストラクタとデストラクタとが共通化対象となる。
よって、完全コンストラクタと部分コンストラクタとのどちらか一方のコードを削除した後、他方のコードの先頭に、完全コンストラクタの先頭アドレスを示すラベルと部分コンストラクタの先頭アドレスを示すラベルとを配置する。本具体例では部分コンストラクタを削除する(ループFの処理)。デストラクタについても同様の処理を行う(ループGの処理)。上記処理を行った結果を図15〜図17に示す。
図15〜図17は、本発明における方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。
図中、線で囲まれた部分が削除された部分コンストラクタコードならびに部分デストラクタコードであり、★印および下線箇所で示されたところが新たに配置した部分コンストラクタまたは部分デストラクタの先頭アドレスを示すラベルである。
図15〜図17のアセンブリ出力結果から、冗長なコードが削除されていることがわかる。
なお、仮想継承解析ステップS10が、図3および図4で示した処理内容である場合、ユーザから制御されている言語仕様が仮想継承を含むかどうかでコンストラクタやデストラクタを共通化対象とすること以外は図2の形態と変わらない。
図3で示した処理内容の具体例としては、例えばプログラム中にEC++(embedded_c++)言語仕様内で記述されていることを保証するプラグマである「#pragma _embedded_c++」のような言語仕様制御文が存在した場合、仮想継承はEC++言語仕様から外れているので、すべてのクラスのコンストラクタおよびデストラクタを共通化対象とすることになる。したがって、上述した実施例と同様に特殊関数共通化ステップS11を行うことで冗長なコードが削除できる。
図4で示した処理内容の具体例としては、例えばコンパイラに対してEC++言語モードでコンパイルを行うことを指定するオプションである「−−embedded_c++ 」のような言語仕様制御命令が与えられた場合、仮想継承はEC++言語仕様から外れているので、すべてのクラスのコンストラクタおよびデストラクタを共通化対象とすることになる。したがって、上述した同様に特殊関数共通化ステップS11を行うことで冗長なコードが削除できる。
以上、本発明のコンパイル方法およびコンパイルプログラムによれば、仮想継承解析ステップS10と、特殊関数共通化ステップS11を含む最適化ステップS4を行うことにより、クラスオブジェクトの生成有無や呼びだしの有無に関わらず、冗長に生成される関数を削除することが可能なコンパイル方法を実現できる。
以上、本発明のコンパイル方法およびコンパイルプログラムについて、実施の形態に基づいて説明したが、本発明は、この実施の形態に限定されるものではない。本発明の趣旨を逸脱しない限り、当業者が思いつく各種変形を本実施の形態に施したものや、異なる実施の形態における処理内容を組み合わせて構築される形態も、本発明の範囲内に含まれる。
本発明は、コンパイル方法およびコンパイルプログラムに利用でき、特に、携帯電話やPDA(Personal Digital Assistant)等のコードサイズの小さなオブジェクトコードを必要とする組み込み機器用のプログラムのコンパイル方法およびコンパイルプログラムに利用することができる。
本発明の実施の形態に係るコンパイラにより実行される処理内容の1例を示すフローチャートである。 仮想継承解析ステップS10で実行される処理内容の第1の例を示すフローチャートである。 仮想継承解析ステップS10で実行される処理内容の第2の例を示すフローチャートである。 仮想継承解析ステップS10で実行される処理内容の第3の例を示すフローチャートである。 特殊関数共通化ステップS11で実行される処理内容の第1の例を示すフローチャートである。 特殊関数共通化ステップS11で実行される処理内容の第2の例を示すフローチャートである。 プログラム記憶部1に記憶されているソースプログラムの1例を示す図である。 従来の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。 従来の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。 従来の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。 共通化対象かどうかを示す共通化対象判定フラグの内容を示す図である。 本発明の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。 本発明の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。 本発明の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。 本発明の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。 本発明の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。 本発明の方法でコンパイルを行った場合のアセンブラ出力結果を示す図である。
符号の説明
1 プログラム記憶部
2 生成コード記憶部

Claims (21)

  1. オブジェクト指向言語で記述され、少なくとも1つのクラスを有する入力プログラムを目的プログラムに変換するコンパイル方法であって、
    前記入力プログラム中の前記クラスが仮想継承で定義されているかどうかを解析する仮想継承解析ステップと、
    前記仮想継承解析ステップで解析された結果、前記クラスが仮想継承で定義されていない場合、前記クラスの複数のコンストラクタおよび複数のデストラクタの少なくとも一方を共通化するコードを生成する特殊関数共通化ステップと、
    特殊関数共通化ステップで生成された前記コードを含ませて目的プログラムを生成する生成ステップとを含む
    ことを特徴とするコンパイル方法。
  2. 前記仮想継承解析ステップは、前記入力プログラム中に記述されたクラス定義に基づいて、前記クラスが仮想継承で定義されているかどうかを解析する
    ことを特徴とする請求項1に記載のコンパイル方法。
  3. 前記仮想継承解析ステップは、言語仕様に則り前記入力プログラム中に記述された制御文である言語仕様制御文に基づいて、前記クラスが仮想継承で定義されているかどうかを解析する
    ことを特徴とする請求項1に記載のコンパイル方法。
  4. 前記仮想継承解析ステップは、
    前記入力プログラムをコンパイルするコンパイルシステムの言語仕様に則り記述された制御命令である言語仕様制御命令に基づいて、クラスが仮想継承で定義されているかどうかを解析する
    ことを特徴とする請求項1に記載のコンパイル方法。
  5. 前記特殊関数共通化ステップは、
    仮想継承で定義されていない前記クラスの複数のコンストラクタのうち、クラスオブジェクトを構成する部分クラスオブジェクトではない完全なクラスオブジェクトを生成するときに呼び出されるコンストラクタである完全コンストラクタとクラスオブジェクトを構成する部分クラスオブジェクトを生成するときに呼び出されるコンストラクタである部分コンストラクタとを共通化するコードを生成する
    ことを特徴とする請求項1〜4のいずれか1項に記載のコンパイル方法。
  6. 前記特殊関数共通化ステップは、
    仮想継承で定義されていない前記クラスの複数のデストラクタのうちの、クラスオブジェクトを構成する部分クラスオブジェクトではない完全なクラスオブジェクトを生成するときに呼び出されるデストラクタである完全デストラクタとクラスオブジェクトを構成する部分クラスオブジェクトを生成するときに呼び出されるデストラクタである部分デストラクタとを共通化するコードを生成する
    ことを特徴とする請求項1〜5のいずれか1項に記載のコンパイル方法。
  7. 前記特殊関数共通化ステップは、
    仮想継承で定義されていない前記クラスの複数のコンストラクタのうちの完全コンストラクタと部分コンストラクタとのいずれか一方の呼びだし命令を他方の呼びだし命令に置きかえ、置きかえられた呼びだし命令のコンストラクタである前記一方のコンストラクタのコードを削除することにより、前記クラスの完全コンストラクタと部分コンストラクタとを共通化するコードを生成する
    ことを特徴とする請求項5に記載のコンパイル方法。
  8. 前記特殊関数共通化ステップは、
    仮想継承で定義されていない前記クラスの複数のデストラクタのうちの完全デストラクタと部分デストラクタとのいずれか一方の呼びだし命令を他方の呼びだし命令に置きかえ、置きかえ前の呼びだし命令のデストラクタである前記一方のデストラクタのコードを削除することにより、前記クラスの完全デストラクタと部分デストラクタとを共通化するコードを生成する
    ことを特徴とする請求項6に記載のコンパイル方法。
  9. 前記特殊関数共通化ステップは、
    仮想継承で定義されていない前記クラスの複数のコンストラクタのうちの完全コンストラクタと部分コンストラクタとのいずれか一方のコードを削除し、削除されない他方のコードの先頭に完全コンストラクタの先頭アドレスを示すラベルと、部分コンストラクタの先頭アドレスを示すラベルとを配置することにより、前記クラスの完全コンストラクタと部分コンストラクタとを共通化するコードを生成する
    ことを特徴とする請求項5に記載のコンパイル方法。
  10. 前記特殊関数共通化ステップは、
    仮想継承で定義されていない前記クラスの複数のデストラクタのうちの完全デストラクタと部分デストラクタとのいずれか一方のコードを削除し、削除されない他方のコードの先頭に完全デストラクタの先頭アドレスを示すラベルと、部分デストラクタの先頭アドレスを示すラベルとを配置することにより、前記クラスの完全デストラクタと部分デストラクタとを共通化するコードを生成する
    ことを特徴とする請求項6に記載のコンパイル方法。
  11. オブジェクト指向言語で記述され、少なくとも1つのクラスを有する入力プログラムを目的プログラムに変換するコンパイルをするためのコンパイルプログラムであって、
    前記入力プログラム中の前記クラスが仮想継承で定義されているかどうかを解析する仮想継承解析ステップと、
    前記仮想継承解析ステップで解析された結果、前記クラスが仮想継承で定義されていない場合、前記クラスの複数のコンストラクタおよび複数のデストラクタの少なくとも一方を共通化するコードを生成する特殊関数共通化ステップと、
    特殊関数共通化ステップで生成された前記コードを含ませて目的プログラムを生成する生成ステップとを
    コンピュータに実行させるためのコンパイルプログラム。
  12. 前記仮想継承解析ステップは、前記入力プログラム中に記述されたクラス定義に基づいて、前記クラスが仮想継承で定義されているかどうかを解析する
    ことを特徴とする請求項11に記載のコンパイルプログラム。
  13. 前記仮想継承解析ステップは、言語仕様に則り前記入力プログラム中に記述された制御文である言語仕様制御文に基づいて、前記クラスが仮想継承で定義されているかどうかを解析する
    ことを特徴とする請求項11に記載のコンパイルプログラム。
  14. 前記仮想継承解析ステップは、前記入力プログラムをコンパイルするコンパイルシステムの言語仕様に則り記述された制御命令である言語仕様制御命令に基づいて、クラスが仮想継承で定義されているかどうかを解析する
    ことを特徴とする請求項11に記載のコンパイルプログラム。
  15. 前記特殊関数共通化ステップは、
    仮想継承で定義されていない前記クラスの複数のコンストラクタのうちの、クラスオブジェクトを構成する部分クラスオブジェクトではない完全なクラスオブジェクトを生成するときに呼び出されるコンストラクタである完全コンストラクタとクラスオブジェクトを構成する部分クラスオブジェクトを生成するときに呼び出されるコンストラクタである部分コンストラクタとを共通化するコードを生成する
    ことを特徴とする請求項11〜14のいずれか1項に記載のコンパイルプログラム。
  16. 前記特殊関数共通化ステップは、
    仮想継承で定義されていない前記クラスの複数のデストラクタのうちの、クラスオブジェクトを構成する部分クラスオブジェクトではない完全なクラスオブジェクトを生成するときに呼び出されるデストラクタである完全デストラクタとクラスオブジェクトを構成する部分クラスオブジェクトを生成するときに呼び出されるデストラクタである部分デストラクタとを共通化するコードを生成する
    ことを特徴とする請求項11〜15のいずれか1項に記載のコンパイルプログラム。
  17. 前記特殊関数共通化ステップは、
    仮想継承で定義されていない前記クラスの複数のコンストラクタのうちの完全コンストラクタと部分コンストラクタとのいずれか一方の呼びだし命令を他方の呼びだし命令に置きかえ、置きかえられた呼びだし命令のコンストラクタである前記一方のコンストラクタのコードを削除することにより、前記クラスの完全コンストラクタと部分コンストラクタとを共通化するコードを生成する
    ことを特徴とする請求項15に記載のコンパイルプログラム。
  18. 前記特殊関数共通化ステップは、
    仮想継承で定義されていない前記クラスの複数のデストラクタのうちの完全デストラクタと部分デストラクタとのいずれか一方の呼びだし命令を他方の呼びだし命令に置きかえ、置きかえられた呼びだし命令のデストラクタである前記一方のデストラクタのコードを削除することにより、前記クラスの完全デストラクタと部分デストラクタとを共通化するコードを生成する
    ことを特徴とする請求項16に記載のコンパイルプログラム。
  19. 前記特殊関数共通化ステップは、
    仮想継承で定義されていない前記クラスの複数のコンストラクタのうちの完全コンストラクタと部分コンストラクタとのいずれか一方のコードを削除し、削除されない他方のコードの先頭に完全コンストラクタの先頭アドレスを示すラベルと、部分コンストラクタの先頭アドレスを示すラベルとを配置することにより、前記クラスの完全コンストラクタと部分コンストラクタとを共通化するコードを生成する
    ことを特徴とする請求項15に記載のコンパイルプログラム。
  20. 前記特殊関数共通化ステップは、
    仮想継承で定義されていない前記クラスの複数のデストラクタのうちの完全デストラクタと部分デストラクタとのいずれか一方のコードを削除し、削除されない他方のコードの先頭に完全デストラクタの先頭アドレスを示すラベルと、部分デストラクタの先頭アドレスを示すラベルとを配置することにより、前記クラスの完全デストラクタと部分デストラクタとを共通化するコードを生成する
    ことを特徴とする請求項16に記載のコンパイルプログラム。
  21. オブジェクト指向言語で記述され、少なくとも1つのクラスを有する入力プログラムを目的プログラムに変換するコンパイル方法を実行するコンパイラ装置であって、
    前記入力プログラム中の前記クラスが仮想継承で定義されているかどうかを解析する仮想継承解析手段と、
    前記仮想継承解析手段で解析された結果、前記クラスが仮想継承で定義されていない場合、前記クラスの複数のコンストラクタおよび複数のデストラクタの少なくとも一方を共通化するコードを生成する特殊関数共通化手段と、
    特殊関数共通化ステップで生成された前記コードを含ませて目的プログラムを生成する生成手段とを備える
    ことを特徴とするコンパイラ装置。
JP2008009787A 2008-01-18 2008-01-18 コンパイル方法およびコンパイルプログラム Pending JP2009169864A (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP2008009787A JP2009169864A (ja) 2008-01-18 2008-01-18 コンパイル方法およびコンパイルプログラム
US12/329,014 US20090187897A1 (en) 2008-01-18 2008-12-05 Compiling method and compiling program
CNA2009100034882A CN101488095A (zh) 2008-01-18 2009-01-15 编译方法以及编译程序

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2008009787A JP2009169864A (ja) 2008-01-18 2008-01-18 コンパイル方法およびコンパイルプログラム

Publications (1)

Publication Number Publication Date
JP2009169864A true JP2009169864A (ja) 2009-07-30

Family

ID=40877471

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2008009787A Pending JP2009169864A (ja) 2008-01-18 2008-01-18 コンパイル方法およびコンパイルプログラム

Country Status (3)

Country Link
US (1) US20090187897A1 (ja)
JP (1) JP2009169864A (ja)
CN (1) CN101488095A (ja)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101697135B (zh) * 2009-10-28 2012-06-27 东方网力科技股份有限公司 一种编译程序的方法及装置
US8832686B2 (en) * 2010-10-29 2014-09-09 Microsoft Corporation Inherited product activation for virtual machines
DE102012006310A1 (de) * 2012-03-28 2013-10-02 Lear Corporation Gmbh Kraftfahrzeugsteuergerät und zugehörige Anwendung mit verringertem Speicherbedarf
EP3065051A1 (en) * 2015-03-05 2016-09-07 Ingo Josopait Flow control for language-embedded programming in general-purpose computing on graphics processing units
US11163546B2 (en) * 2017-11-07 2021-11-02 Intel Corporation Method and apparatus for supporting programmatic control of a compiler for generating high-performance spatial hardware
CN108459552B (zh) * 2018-01-31 2021-07-23 南京拓控信息科技股份有限公司 一种智能化面向对象的可编程的自动化控制方法

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2000259427A (ja) * 1999-03-11 2000-09-22 Matsushita Electric Ind Co Ltd プログラム変換装置
JP2003050700A (ja) * 2001-08-06 2003-02-21 Matsushita Electric Ind Co Ltd プログラム変換方法
JP2007304840A (ja) * 2006-05-11 2007-11-22 Matsushita Electric Ind Co Ltd コンパイル方法、デバッグ方法、コンパイルプログラムおよびデバッグプログラム

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5867709A (en) * 1995-10-18 1999-02-02 Kapre Software, Inc. Method and system for reusing customizations to a software product
JP2002116917A (ja) * 2000-10-05 2002-04-19 Fujitsu Ltd オブジェクト指向型プログラミング言語によるソース・プログラムをコンパイルするコンパイラ
US7346897B2 (en) * 2002-11-20 2008-03-18 Purenative Software Corporation System for translating programming languages
JP2005018425A (ja) * 2003-06-26 2005-01-20 Matsushita Electric Ind Co Ltd プログラム変換方法、プログラムおよび記憶媒体
JP2005141380A (ja) * 2003-11-05 2005-06-02 Matsushita Electric Ind Co Ltd テンプレートコンパイル方法
JP2006146613A (ja) * 2004-11-19 2006-06-08 Matsushita Electric Ind Co Ltd プログラム変換方法
JP4768984B2 (ja) * 2004-12-06 2011-09-07 パナソニック株式会社 コンパイル方法、コンパイルプログラムおよびコンパイル装置
JP4822817B2 (ja) * 2005-11-22 2011-11-24 パナソニック株式会社 コンパイルシステム
CN1896954A (zh) * 2006-04-27 2007-01-17 南京联创科技股份有限公司 用于复杂多业务的动态编译器的构件化实现

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2000259427A (ja) * 1999-03-11 2000-09-22 Matsushita Electric Ind Co Ltd プログラム変換装置
JP2003050700A (ja) * 2001-08-06 2003-02-21 Matsushita Electric Ind Co Ltd プログラム変換方法
JP2007304840A (ja) * 2006-05-11 2007-11-22 Matsushita Electric Ind Co Ltd コンパイル方法、デバッグ方法、コンパイルプログラムおよびデバッグプログラム

Also Published As

Publication number Publication date
US20090187897A1 (en) 2009-07-23
CN101488095A (zh) 2009-07-22

Similar Documents

Publication Publication Date Title
KR102059705B1 (ko) 적응식 이식가능 라이브러리
JP4794437B2 (ja) 編集処理中にプログラムコンポーネントの整合性を表現しチェックするための拡張型システム
CN110149800B (zh) 一种用于处理与源程序的源代码相关联的抽象语法树的装置
US11579856B2 (en) Multi-chip compatible compiling method and device
CN108139891A (zh) 针对外部文件的缺失包括建议
JP4638484B2 (ja) データ処理装置におけるデータ整合性
CN109408354B (zh) 应用组件的数据处理方法和装置
US20090328016A1 (en) Generalized expression trees
KR20130101037A (ko) 사용자 정의 유형을 위한 컴파일 타임 경계 검사
CN110825386B (zh) 代码的编译方法和装置、存储介质
JP2009169864A (ja) コンパイル方法およびコンパイルプログラム
JP2010097426A (ja) コンピュータプログラム、ソースプログラム入力受付装置及びソースプログラム入力受付方法
CN105849698B (zh) 动态编程中的执行防护
JP2005141380A (ja) テンプレートコンパイル方法
CN114138281A (zh) 软件工程的编译方法、装置、设备及介质
US9141356B2 (en) Process for generating dynamic type
Su et al. An efficient GPU implementation of inclusion-based pointer analysis
JP2006301989A (ja) 計算機言語によるプログラムをブロック図から自動生成する方法と装置とプログラム
JP2008276735A (ja) プログラムコード変換装置及びプログラムコード変換方法
JP4768984B2 (ja) コンパイル方法、コンパイルプログラムおよびコンパイル装置
CN114518884A (zh) 修复弱内存序问题的方法及装置
US20130111432A1 (en) Validation of a system model including an activity diagram
JP2008305337A (ja) プログラム変換装置、プログラム変換方法、プログラム、記憶媒体、デバッグ装置、デバッグ方法及びプログラム開発システム
JP5399601B2 (ja) 実装コード開発システム、及び実装コード開発プログラム
JP2007122187A (ja) プログラム・コード生成装置

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20101109

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20120413

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120515

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20120918