JP4652680B2 - コンパイル方法および装置、ならびにコンパイラ - Google Patents

コンパイル方法および装置、ならびにコンパイラ Download PDF

Info

Publication number
JP4652680B2
JP4652680B2 JP2003424043A JP2003424043A JP4652680B2 JP 4652680 B2 JP4652680 B2 JP 4652680B2 JP 2003424043 A JP2003424043 A JP 2003424043A JP 2003424043 A JP2003424043 A JP 2003424043A JP 4652680 B2 JP4652680 B2 JP 4652680B2
Authority
JP
Japan
Prior art keywords
function
argument
passing
value
pass
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.)
Expired - Lifetime
Application number
JP2003424043A
Other languages
English (en)
Other versions
JP2005182562A (ja
Inventor
忍 浅尾
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
Panasonic Holdings Corp
Original Assignee
Panasonic Corp
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 Panasonic Corp, Matsushita Electric Industrial Co Ltd filed Critical Panasonic Corp
Priority to JP2003424043A priority Critical patent/JP4652680B2/ja
Priority to US11/016,934 priority patent/US7458071B2/en
Priority to CNB2004101037298A priority patent/CN100476732C/zh
Publication of JP2005182562A publication Critical patent/JP2005182562A/ja
Application granted granted Critical
Publication of JP4652680B2 publication Critical patent/JP4652680B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • 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/4482Procedural
    • G06F9/4484Executing subprograms

Landscapes

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

Description

本発明は、コンパイル方法に関し、特に、C++言語に代表されるオブジェクト指向高級言語で記述されたソースプログラムをオブジェクトプログラムに変換するコンパイル方法に関する。
近年のソフトウェア開発においては、プログラムの規模が大規模化してきており、それに伴って保守性、再利用性の高いオブジェクト指向言語が注目されている。代表的なオブジェクト指向言語にC++言語が挙げられる。C++言語は、移植性の優れた高級言語であるC言語をオブジェクト指向が自然と記述できるように仕様拡張したものである。C++言語では、プログラム中で関数を定義し、必要な箇所でその関数を呼び出して処理を実行することができる。関数に対して引数を与える場合、その方法として値渡しと参照渡し(ポインタ渡し)とが存在する。
従来のC++言語では、関数に対して引数を与える場合、与えた引数のコピーを生成してメモリに格納している。値渡しの場合は、引数として渡す対象を完全にコピーしてメモリに格納する。例えば対象がクラスオブジェクトの場合であれば、まずそのクラスオブジェクトのコピーを生成する処理を行ない、生成したクラスオブジェクトをメモリに格納する。一方、参照渡しの場合は、対象がポインタ値(オブジェクトのアドレス値)であるので、そのポインタ値をコピーしてメモリに格納する。
非特許文献1の22項によれば、値渡しにおけるクラスオブジェクトのコピーは、暗黙的に多くのコピーコンストラクタの呼び出しを引き起こす可能性があり、コンパイル結果のコードサイズ増加の原因となり得る。また、一般的に値渡しよりも参照渡し(リファレンス渡し)を使用するほうがコード生成効率がよいため、プログラマはできるだけ参照渡しを意識したプログラミングを行なうことが重要であるとしている。
Scott Meyers著、吉川邦夫訳、「Effective C++ 改訂2版」、アスキー、1998年5月1日、22項「値渡しよりも、リファレンス渡しを使おう」
しかしながら、非特許文献1の22項に記載されている内容は、あくまでプログラマが参照渡しを意識してプログラミングを行なうべきであるということを明記したものであり、プログラマにコード生成効率を考慮したプログラミングを強いることにほかならない。
また、参照渡しを使用すると、エイリアシング問題(同じオブジェクトに対して複数の名前が使用されるため、意図せずにオブジェクトの状態を変更させる危険性がある問題)を引き起こす可能性がある。よって、プログラムにバグが混入しやすいという課題がある。
本発明は、かかる課題に鑑みてなされたものであり、プログラマが参照渡しを意識してプログラミングを行なう必要性をなくし、値渡しを使用した場合でもコード生成効率のよいコンパイル方法を提供することを目的とする。
本発明のある局面に係るコンパイル方法は、高級言語で記述されたソースプログラムをオブジェクトコードに変換するコンパイル方法であって、ソースプログラムから中間コードを生成する中間コード生成ステップと、値渡し引数を持つ関数を間接的に呼び出す可能性のある関数がなく、かつ前記値渡し引数が当該値渡し引数を持つ関数の定義内で更新されていない場合に、前記値渡し引数を持つ関数を呼び出す関数を参照渡し引数を持つ関数を呼び出す関数に変換することにより、前記中間コードを最適化する最適化ステップと、最適化された前記中間コードをオブジェクトコードに変換するオブジェクトコード変換ステップとを含む。好ましくは、前記最適化ステップは、前記中間コードから、少なくとも、値渡し引数を持つ関数と、当該値渡し引数を持つ関数を直接呼び出す関数と、当該値渡し引数を持つ関数を間接的に呼び出す可能性のある関数と、当該値渡し引数を持つ関数の値渡し引数と、当該値渡し引数が値渡し引数を持つ関数の定義内で更新されているか否かを示す更新判定情報とを含む値渡し引数更新情報を抽出する値渡し引数更新情報抽出サブステップと、前記値渡し引数更新情報に基づいて、値渡し引数を持つ関数を間接的に呼び出す可能性のある関数がなく、かつ前記値渡し引数が当該値渡し引数を持つ関数の定義内で更新されていない場合に、値渡し引数を持つ関数を呼び出す関数を参照渡し引数を持つ関数を呼び出す関数に変換する変換サブステップとを含む。
この方法によれば、値渡しでプログラムを記載したとしても、参照渡しのプログラムに変換される。このため、プログラマが参照渡しを意識してプログラミングを行なう必要がなくなる。
好ましくは、前記変換サブステップでは、値渡し引数を持つ関数を呼び出す関数を参照渡し引数を持つ関数を呼び出す関数に強制的に変換せよとの指定がない場合には、前記値渡し引数更新情報に基づいて、前記値渡し引数を持つ関数を間接的に呼び出す可能性のある関数がなく、かつ前記値渡し引数が値渡し引数を持つ関数の定義内で更新されていない場合に、前記値渡し引数を持つ関数を直接呼び出す関数を参照渡し引数を持つ関数を直接呼び出す関数に変換する。
この方法によれば、値渡し引数をもつ関数が定義内で引数を更新していなかった場合に、冗長である関数呼び出し側のコピー生成コードを削除することができ、効率のよいコードを生成することができる。
さらに好ましくは、前記変換サブステップでは、値渡し引数を持つ関数を呼び出す関数を参照渡し引数を持つ関数を呼び出す関数に強制的に変換せよとの指定がある場合には、当該指定がある値渡し引数を持つ関数について、前記値渡し引数更新情報に基づいて、前記値渡し引数を持つ関数を直接呼び出す関数および前記値渡し引数を持つ関数を間接的に呼び出す可能性のある関数を、参照渡し引数を持つ関数を直接呼び出す関数および参照渡し引数を持つ関数を間接的に呼び出す可能性のある関数にそれぞれ変換する。
この方法によれば、値渡し引数をもつ関数が定義内で引数を更新していた場合でも、冗長である関数呼び出し側のコピー生成コードを削除することができ、効率のよいコードを生成することができる。
本発明の他の局面に係るコンパイル方法は、高級言語で記述されたソースプログラムをオブジェクトコードに変換するコンパイル方法であって、ソースプログラムから中間コードを生成する中間コード生成ステップと、値渡し引数を持つ関数を間接的に呼び出す可能性のある関数がなく、かつ前記値渡し引数が当該値渡し引数を持つ関数の定義内で更新されていない場合に、値渡し引数を持つ関数の値渡しによる引数受け渡しを参照渡しによる引数受け渡しに変換することにより、前記中間コードを最適化する最適化ステップと、最適化された前記中間コードをオブジェクトコードに変換するオブジェクトコード変換ステップとを含む。好ましくは、前記最適化ステップは、前記中間コードから、少なくとも、値渡し引数を持つ関数と、当該値渡し引数を持つ関数を直接呼び出す関数と、当該値渡し引数を持つ関数を間接的に呼び出す可能性のある関数と、当該値渡し引数を持つ関数の値渡し引数と、当該値渡し引数が値渡し引数を持つ関数の定義内で更新されているか否かを示す更新判定情報とを含む値渡し引数更新情報を抽出する値渡し引数更新情報抽出サブステップと、前記値渡し引数更新情報に基づいて、値渡し引数を持つ関数を間接的に呼び出す可能性のある関数がなく、かつ前記値渡し引数が当該値渡し引数を持つ関数の定義内で更新されていない場合に、値渡し引数を持つ関数の値渡しによる引数受け渡しを参照渡しによる引数受け渡しに変換する変換サブステップとを含む。
この方法によれば、値渡しでプログラムを記載したとしても、参照渡しのプログラムに変換される。このため、プログラマが参照渡しを意識してプログラミングを行なう必要がなくなる。
好ましくは、前記変換サブステップでは、値渡し引数を持つ関数の値渡しによる引数受け渡しを参照渡しによる引数受け渡しに強制的に変換せよとの指定がない場合には、前記値渡し引数更新情報に基づいて、前記値渡し引数を持つ関数を間接的に呼び出す可能性のある関数がなく、かつ前記値渡し引数が値渡し引数を持つ関数の定義内で更新されていない場合に、前記値渡し引数を持つ関数の値渡しによる引数受け渡しを参照渡しによる引数受け渡しに変換する。
この方法によれば、値渡し引数をもつ関数が定義内で引数を更新していなかった場合に、値渡し引数を持つ関数定義における引数に対するアクセスが参照渡し引数を持つ関数定義と同等のアクセスになるため、効率のよいコードを生成することができる。
さらに好ましくは、前記変換サブステップでは、値渡し引数を持つ関数の値渡しによる引数受け渡しを参照渡しによる引数受け渡しに強制的に変換せよとの指定がある場合には、当該指定がある値渡し引数を持つ関数について、前記値渡し引数更新情報に基づいて、前記値渡し引数を持つ関数の値渡しによる引数受け渡しを参照渡しによる引数受け渡しに変換し、前記値渡し引数が関数定義内で更新されていれば、前記中間コードにおいて実際に値が更新される部分よりも前に、変換された参照渡し引数から引数値を参照してそのコピーを生成し、当該コピーを参照先に設定する。
この方法によれば、値渡し引数をもつ関数が定義内で引数を更新していた場合でも、値渡し引数を持つ関数定義における引数に対するアクセスが参照渡し引数を持つ関数定義と同等のアクセスになるため、効率のよいコードを生成することができる。
なお、本発明は、このような特徴的なステップを有するコンパイル方法として実現することができるだけでなく、当該コンパイル方法に含まれる特徴的なステップを手段とするコンパイラ装置として実現したり、当該コンパイル方法に含まれる特徴的なステップをコンピュータに実行させるコンパイラとして実現したりすることもできる。そして、そのようなコンパイラは、CD−ROM等の記録媒体やインターネット等の伝送媒体を介して流通させることができるのは言うまでもない。
本発明のコンパイル方法によれば、プログラマが参照渡しを意識してプログラミングを行なう必要性がなくなる。
また、値渡しを使用した場合でも、コードサイズの小さいオブジェクトコードを生成することができる。
なお、ユーザーが高級言語プログラム内に直接アセンブラ言語を記述する構文(asm文構文など)を用いて、値渡し引数を持つ関数を呼び出す関数を参照渡し引数を持つ関数を呼び出す関数に変換することにより中間コードを最適化するステップおよび値渡し引数を持つ関数の値渡しによる引数受け渡しを参照渡しによる引数受け渡しに変換することにより中間コードを最適化するステップのいずれか一方に準拠したアセンブラコードをソースプログラムを記述した場合であっても同様の効果が得られる。
以下、本発明の実施の形態に係るコンパイラについて図面を参照しながら説明する。
図1は、コンパイラを実行するコンパイラ装置の外観図である。コンパイラ装置22は、コンピュータ34と、モニタ装置32と、キーボード36と、マウス38と、CD−ROM(Compact Disc-Read Only Memory)装置40とを備えている。
コンピュータ34は、コンパイラ等のプログラムを実行する処理装置である。モニタ装置32は、処理結果等を表示するための表示装置である。キーボード36およびマウス38の各々は、コンピュータ34に接続され、コンピュータ34に対して指示等を入力するための入力装置である。CD−ROM装置40は、CD−ROM42に記録されたコンパイラ等のプログラムを読み込むための装置である。
図2は、コンパイラ装置22のハードウェア構成を示すブロック図である。コンパイラ装置22を構成するコンピュータ34は、CPU(Central Processing Unit)44と、ROM(Read Only Memory)46と、RAM(Random Access Memory)48と、ハードディスク50と、通信モデム52と、バス54とを備えている。
CPU44は、コンパイラ等の各種プログラムを実行する処理部である。ROM46は、各種プログラムや各種データを記憶する記憶部である。RAM48は、CPU44で実行されるプログラムや、当該プログラム実行時に生成されるデータを一時的に記憶する記憶部である。ハードディスク50は、各種プログラムや、各種データを記憶する記憶装置であり、ヘッダファイルやソースプログラムを記憶するプログラム記憶部56と、後述する値渡し引数更新情報を記憶する値渡し引数更新情報記憶部58と、オブジェクトプログラムを記憶する生成コード記憶部60とを含む。通信モデム52は、インターネット等のネットワークを介してプログラムをダウンロードするための装置である。バス54は、コンピュータ34の各処理部を接続するための信号線である。
図3は、コンパイラの処理のフローチャートである。
コンパイラは、プログラム記憶部56に記憶されているヘッダファイルおよびソースプログラムを読み込む(S1)。コンパイラは、読み込んだソースプログラムの構文を解析し、シンボルテーブルの生成や構文木の生成などを行なう(S2)。次に、コンパイラは、生成された構文木を元に、中間コードを生成する(S3)。その後、コンパイラは、生成された中間コードに対して各種最適化を実行する(S4)。また、コンパイラは、最適化された中間コードに含まれるすべての変数に対してレジスタやメモリなどのハードウェア資源を割り付け(S5)、資源割付された中間コードをオブジェクトコードに変換してオブジェクトプログラムを生成コード記憶部60に出力する(S6)。
最適化処理(S4)は、値渡し引数更新情報抽出処理(S11)と、値渡し関数呼び出し参照渡し変換処理(S12)と、値渡し関数定義参照渡し変換処理(S13)と、その他の最適化処理(S14)とを含む。
値渡し引数更新情報抽出処理(S11)は、中間コードに基づいて、「値渡し引数を持つ関数」と、「値渡し引数を持つ関数を直接呼び出す関数」と、「値渡し引数を持つ関数を間接的に呼び出す可能性のある関数」と、「値渡し引数」と、値渡し引数が関数定義内で更新されているかどうかを示す「更新判定情報」とを抽出する処理である。
値渡し関数呼び出し参照渡し変換処理(S12)は、値渡し引数更新情報抽出処理(S11)で抽出された情報を元に、参照渡し変換が可能かどうかを判定し、値渡し関数の呼び出しを参照渡し関数の呼び出しに変換する処理である。
値渡し関数定義参照渡し変換処理(S13)は、値渡し引数更新情報抽出処理(S11)で抽出された情報を元に、参照渡し変換が可能かどうかを判定し、値渡し関数の値による引数受け渡しを、参照による引数受け渡しに変換する処理である。
値渡し引数更新情報抽出処理(S11)、値渡し関数呼び出し参照渡し変換処理(S12)および値渡し関数定義参照渡し変換処理(S13)の詳細については後述する。
なお、値渡し関数呼び出し参照渡し変換処理(S12)および値渡し関数定義参照渡し変換処理(S13)は順序に依存せず、どちらから先に行なっても構わない。
その他の最適化処理(S14)は、一般的な最適化処理であり、本発明の要旨ではないため、その説明は省略する。
図4は、値渡し引数更新情報記憶部58に記憶されている値渡し引数更新情報62の内容を説明するための図である。値渡し引数更新情報62には、「値渡し引数を持つ関数」と、「値渡し引数を持つ関数を直接呼び出す関数」と、「値渡し引数を持つ関数を間接的に呼び出す可能性のある関数」と、「値渡し引数」と、「更新判定情報」と、「参照渡し変換判定情報」とが含まれる。これらの詳細な説明は、後述する処理の中で適宜説明する。
なお、ソースプログラム入力処理(S1)、構文解析処理(S2)、中間コード生成処理(S3)、その他の最適化処理(S14)、資源割付処理(S5)、およびオブジェクト出力処理(S6)については、既存の処理と同様の処理であり本発明の主眼ではない。よって詳細な説明は省略する。
以下、本発明の主眼である値渡し引数更新情報抽出処理(S11)、値渡し関数呼び出し参照渡し変換処理(S12)および値渡し関数定義参照渡し変換処理(S13)について順次説明する。
図5は、値渡し引数更新情報抽出処理(S11)の詳細を示すフローチャートである。
コンパイラは、現コンパイル対象の中間コードからすべての関数宣言、定義の情報を抽出する(S21)。この場合のコンパイル対象は、単一の翻訳単位(単一のソースプログラム)に対するコンパイルであっても、複数にわたる翻訳単位(複数のソースプログラム)に対するコンパイルであっても構わない。
コンパイラは、抽出した関数宣言、定義から「値渡し引数を持つ関数」を抽出し、値渡し引数更新情報62に記録する(S22)。次に、記録した各値渡し関数を直接呼び出す(関数名などを使用した呼び出しであり、コンパイル時にどの関数が呼び出されているかが一意に決定する)関数を抽出し、値渡し引数更新情報62に記録する(S23)。同様に、記録した各値渡し関数を間接的に呼び出す(関数へのポインタなどを使用した呼び出しであり、コンパイル時にどの関数が呼び出されているかが一意には決まらない)可能性のある関数を抽出し、値渡し引数更新情報62に記録する(S24)。
図6は、値渡し関数を間接的に呼び出す可能性のある関数を含むソースプログラムの一例を示す図である。関数fucn1の定義の中で、構造体Aの値渡し引数を持つ関数の関節呼び出しp(x)が存在する。この関数呼び出しp(x)では、構造体Aの値渡し引数を持つ関数func2、func3およびfunc4のいずれを実際に呼び出しているかは一意に特定することができない。このため、図7(a)〜図7(c)に示すように、関数func2、func3およびfunc4の各々の値渡し引数更新情報62に、値渡し関数を間接的に呼び出す可能性のある関数としてfunc1が記録されることになる。
次に、コンパイラは、記録した各値渡し関数の各値渡し引数に対して以下に続く処理を行なう(S25)。値渡し引数が関数定義内で更新されている可能性があるかどうか判定し(S26)、更新される可能性がなければ(S26でNo)、値渡し引数は更新されていないとの更新判定情報を値渡し引数更新情報62に記録し(S27)、更新される可能性があれば(S26でYes)、値渡し引数は更新されているとの更新判定情報を値渡し引数更新情報62に記録する(S28)。
以上の処理を実施することにより、現コンパイル対象における値渡し引数更新情報62の「値渡し引数を持つ関数」、「値渡し引数を持つ関数を直接呼び出す関数」、「値渡し引数を持つ関数を間接的に呼び出す可能性のある関数」、「値渡し引数」および「更新判定情報」が抽出される。
次に、値渡し関数呼び出し参照渡し変換処理(S12)の詳細について説明する。図8は、値渡し関数呼び出し参照渡し変換処理(S12)の詳細を示すフローチャートである。
まず、コンパイラは、値渡しの関数を参照渡しの関数に強制的に変換するかどうかの判定を行なう(S31)。ここで、強制的に変換するかどうかは、コマンドラインオプションやプラグマなどのユーザーの指示によるものや、コンパイラ内部で別途行なわれる最適化評価結果(オブジェクトプログラムをシミュレーションした後のプロファイル情報等)によるものである。コードサイズを小さくしたい場合には、参照渡しに強制的に変換する。
強制的な変換を行なわない場合は(S31でNo)、登録されている各値渡し引数更新情報62について、以下のループ処理(S32)を繰り返す。コンパイラは、着目している値渡し引数更新情報62に含まれる「値渡し引数を持つ関数を直接呼び出す関数」および「値渡し引数を持つ関数を間接的に呼び出す可能性のある関数」がasm文等のアセンブラ記述により参照渡しによる呼び出しに変換されているか否かを調べる(S33)。参照渡しによる呼び出しに変換されている場合には(S33でYes)、次の値渡し引数更新情報62に着目してループ処理(S32)を繰り返す。
アセンブラ記述により参照渡しによる呼び出しに変換されていなければ(S33でNo)、コンパイラは、着目している「値渡し引数を持つ関数」を間接呼び出しする可能性があるかどうかを判定する(S34)。すなわち、値渡し引数更新情報62の「値渡し引数を持つ関数を間接的に呼び出す可能性のある関数」の欄に関数名が記入されているか否かを調べる(S34)。
間接的に呼び出す可能性のある関数が存在する場合には(S34でYes)、参照渡し変換の対象にならないので次の値渡し引数更新情報62に処理を移す。
間接的に呼び出す可能性のある関数が存在しない場合には(S34でNo)、各「値渡し引数」について、ループ処理(S35)を実行する。ループ処理(S35)では、値渡し引数が更新されているかどうかの判定を行なう(S36)。値渡し引数が更新されていれば(S36でYes)、参照渡し変換不可能と判定して、判定結果を値渡し引数更新情報62の「参照渡し変換判定情報」に記録する(S38)。値渡し引数が更新されていなければ(S36でNo)、参照渡し変換可能と判定して、判定結果を値渡し引数更新情報62の「参照渡し変換判定情報」に記録する(S37)。
次に、参照変換可能と判定された引数を持つ関数の各直接呼出し関数について、ループ処理(S39)を実行する。ループ処理(S39)では、値渡し引数による呼び出しを参照渡しによる呼び出しに変換する(S40)。
一方、強制的な変換を行なう場合は(S31でYes)、登録されている値渡し引数更新情報62のすべての値渡し引数に対して、「参照渡し変換判定情報」に参照渡し変換可能である情報を記録し、値渡し引数による呼び出しを参照渡しによる呼び出しに変換する(S41,S42,S43,S44,S45)。
以上の処理を実施することで、変換候補となる値渡し引数による呼び出しを参照渡しによる呼び出しに変換することができる。
次に、値渡し関数定義参照渡し変換処理(S13)の詳細について説明する。図9は、値渡し関数定義参照渡し変換処理(S13)の詳細を示すフローチャートである。図9に示す処理のうち、値渡し引数更新情報62の「参照渡し変換判定情報」を求めるための処理(S51、S53、S52、S54、S55、S56、S57、S58、S61、S62、S63)は、図8に示した処理(S31、S33、S32、S34、S35、S36、S37、S38、S41、S42、S43)と同一の処理であるので説明を省略する。これらは値渡しが参照渡しに変換可能かどうかを値渡し引数更新情報62に記録する処理である。これらの同一の処理は、コンパイラの最適化処理(S4)において、値渡し関数呼び出し参照渡し変換処理(S12)と値渡し関数定義参照渡し変換処理(S13)とのどちらを先に行なっても構わないようにするためである。このため、どちらか一方がすでに実施されて値渡し引数更新情報62の「参照渡し変換判定情報」がすでに記録されている場合、これらの参照渡しに変換可能かどうかを判定して記録する処理を省略しても構わない。
参照渡しに強制的に変換しない場合で(S51でNo)、値渡しが参照渡しに変換可能か否かの判定結果が値渡し引数更新情報62の「参照渡し変換判定情報」に記録された後では、参照渡し変換可能と判定された引数を持つ関数についてループ処理(S59)を行う。ループ処理(S59)では、値渡し引数による引数受け渡しを参照渡しによる引数受け渡しに変換する(S60)。
一方、強制的な変換を行なう場合で(S51でYes)、値渡しが参照渡しに変換可能かの判定結果が値渡し引数更新情報62の「参照渡し変換判定情報」に記録された後では、参照渡し変換可能と判定された引数を持つ関数についてループ処理(S64)を行う。ループ処理(S64)では、値渡し引数による引数受け渡しを参照渡しによる引数受け渡しに変換する(S65)。次に、変換した参照渡し引数について、ループ処理(S66)を行う。ループ処理(S66)では、値渡し引数が関数定義内で更新されているかどうかの判定結果を「更新判定情報」より調べる(S67)。値渡し引数が更新されていれば(S67でYes)、中間コードにおいて実際に値が更新される部分よりも前に、変換された参照渡し引数から引数値を参照してそのコピーを生成し、さらにそのコピーを参照先に再設定する(S68)。この処理は、もともと値渡しによる引数受け渡しであるので関数呼び出し先での引数に対する更新が呼び出し元に反映されてはいけないが、参照渡しによる引数受け渡しに変換した結果、呼び出し元に更新結果が反映されてしまうことを防ぐために行なわれる。つまり、引数に対して更新が行なわれる場合は、従来関数呼び出し元で生成していた引数コピーを関数呼び出し先で生成するようにしていることになる。
このようにすることにより、呼び出す側で一時変数を作ると、呼び出すたびに一時変数を作り出さなければならないが、呼び出される側で一時変数を作ると、一時変数を作成するコードは1箇所にまとめられる。よって、コードサイズを小さくすることができる。
以上の処理を実施することにより、変換候補となる値渡し引数による引数受け渡しを参照渡しによる引数受け渡しに変換することができる。
以上のような値渡し引数更新情報抽出処理(S11)、値渡し関数呼び出し参照渡し変換処理(S12)および値渡し関数定義参照渡し変換処理(S13)と、その他の最適化処理(S14)とを含む最適化処理(S4)を施した中間コードに対して、資源割付処理(S5)およびオブジェクトプログラム出力処理(S6)を行なうことにより、最終的に生成されるオブジェクトプログラムのオブジェクトコードのサイズが削減される。
以下、具体例を参照しながら値渡し引数の関数を参照渡し引数の関数に変換する最適化処理についてより詳細に説明する。
(具体例1)
図10(a)は、プログラム記憶部56に記憶されているヘッダファイルの一例を示し、図10(b)は、プログラム記憶部56に記憶されているソースプログラムの一例を示す。以下では、このヘッダファイルおよびソースプログラムを入力した場合のコンパイラの動作を説明する。
図10(a)に示すヘッダファイル「struct.h」には構造体Aの定義が記載されている。図10(b)に示すソースプログラム「prog1.cc」にはヘッダファイル「struct.h」の読み込み処理、値渡し引数関数「void f(A obj)」の定義、関数fを呼び出す関数「void g(void)」および関数「void h(void)」の定義が記述されている。
まず従来の方法による具体例を示す。関数fは「値渡し引数を持つ関数」であるので、関数gや関数hから関数fを呼び出すときは、引数の受け渡しは値渡しによる方法となる。
図11は関数gから関数fを呼び出す場合のスタックフレーム例を示す。図10(b)に示す関数gの定義においては、局所引数xを値渡し引数として関数fを呼び出している。この場合のスタックフレーム構成は、図11に示すように、局所変数を確保している領域(関数g実行時のSP(スタックポインタの値)+16からSP+24)から引数値のコピーが実引数を確保する領域(関数g実行時のSP+4からSP+12)に格納されることになる。関数fに実行が移れば、引数へのアクセスは仮引数を確保する領域(関数f実行時のSP+16からSP+24)に対してアクセスすることで実現される。
図12は、従来の方法で実施された場合の、関数fおよび関数gの定義を表すアセンブラコードを示す。関数fの定義に示すように、仮引数obj.x,obj.y,obj.zの値はそれぞれスタックフレームのSP+16、SP+20、SP+24から読み込みを行なっている。また関数gの定義に示すように、関数fの呼び出しを行なう前に、局所変数領域(SP+16からSP+24)から実引数領域(SP+4からSP12)へ値のコピーを実施していることがわかる。
次に、本実施の形態における具体例を示す。まず値渡し引数更新情報抽出処理(S11)が実施されると、図13(a)に示す値渡し引数更新情報62が抽出される。つまり、「値渡し引数を持つ関数」としてvoid f(A obj)、「値渡し引数を持つ関数を直接呼び出す関数」としてvoid g(void)、void h(void)、「値渡し引数を持つ関数を間接的に呼び出す可能性がある関数」は存在しない、関数fで値渡し対象となっている「値渡し引数」は第1引数A obj、関数定義内で引数の更新はされていないとの情報がが抽出される。
次に、値渡し関数呼び出し参照渡し変換処理(S12)が実施されると、関数fの値渡し引数「A obj」は関数定義内で参照はされているものの更新は行なわれていないので、強制的な参照渡しを行うか否かの判定処理(S31)の結果に関わらず、図13(b)に示すように、第1引数の「参照渡し変換判定情報」が「可能」と記録される。よって、値渡し関数呼び出しが参照渡し関数呼び出しに変換される。
値渡し関数定義参照渡し変換処理(S13)が実施される場合も同様で、強制的な参照渡しを行うか否かの判定処理(S51)の結果に関わらず、結果的に参照渡し変換可能と記録されるので、関数fの値渡しによる引数受け渡しが、参照渡しによる関数受け渡しに変換される。
図14に、値渡し引数を参照渡し引数に変換した場合のスタックフレーム例を示す。実引数領域(関数g実行時のSP+4)には、引数値ではなく、引数への参照(つまりアドレス)に変更されていることがわかる。このため、スタックの使用領域が削減されていることがわかる。
図15に、値渡し引数を参照渡し引数に変換した場合の、関数f、関数gの定義を表すアセンブラコードを示す。関数fの定義に示すように、仮引数は引数値そのものではなく、引数値への参照(つまりアドレス)が渡されているとみなすので、仮引数へのアクセスは仮引数領域(関数f実行時のSP+16)に格納されている引数アドレスを経由して行なわれていることがわかる。また、関数gの定義に示すように、実引数領域(関数g実行時のSP+4)に局所変数オブジェクトの先頭アドレス(関数g実行時のSP+8のアドレス値)が設定されていることがわかる。このように参照渡しによる引数受け渡し方法に変換されているため、従来の方法における具体例を示した図12のように、引数値のコピーを行なう必要がなくなる。よって、コードサイズが削減できていることがわかる。
(具体例2)
図16(a)は、プログラム記憶部56に記憶されているヘッダファイルの一例を示し、図16(b)は、プログラム記憶部56に記憶されているソースプログラムの一例を示す。以下では、このヘッダファイルおよびソースプログラムを入力した場合のコンパイラの動作を説明する。
図16(a)に示すヘッダファイル「class.h」にはクラスAの定義が記載されている。クラスAには、メンバ変数x,yおよびzと、デフォルトコンストラクタA(void)と、コピーコンストラクタA(A &obj)とメンバ関数get_x,get_y,get_z,set_x,set_yおよびset_zとが定義されている。図16(b)に示すソースプログラム「prog2.cc」にはヘッダファイル「class.h」の読み込み処理、値渡し引数関数「void f(A obj)」の定義、関数fを呼び出す関数「void g(void)」および関数「void h(void)」の定義が記述されている。
まず従来の方法による具体例を示す。具体例1と同様に、関数fは「値渡し引数を持つ関数」であるので、関数gや関数hから関数fを呼び出すときは、引数の受け渡しは値渡しによる方法となる。図17に関数gから関数fを呼び出す場合のスタックフレーム例を示す。図10の関数gの定義において、局所引数xを値渡し引数として関数fを呼び出している。局所引数xはクラスAにコピーコンストラクタ(class.hのA(A &obj))が定義されているので、値渡しによる引数受け渡しの場合は、暗黙的にコピーコンストラクタ呼び出しによる一時変数(tmp.x,tmp.yおよびtmp.z)の生成が行なわれる。この場合のスタックフレーム構成は、図17に示すようになる。すなわち、局所変数を確保している領域(関数g実行時のSP+28からSP+36)からコピーコンストラクタ呼び出しによって生成される値が、一時変数を格納する領域(関数g実行時のSP+16からSP+24)に格納される。その後、一時変数(引数値)のコピーが実引数を確保する領域(関数g実行時のSP+4からSP+12)に格納されることになる。関数fに実行が移れば、引数へのアクセスは仮引数を確保する領域(関数f実行時のSP+16からSP+24)に対してアクセスすることで実現される。
図18に、従来の方法で実施された場合の、関数f、関数gの定義を表すアセンブラコードを示す。関数fの定義に示すように、仮引数obj.x,obj.y,obj.zはそれぞれスタックフレームのSP+16、SP+20、SP+24から読み込みを行なっている。また関数gの定義に示すように、関数fの呼び出しを行なう前に、コピーコンストラクタ呼び出しを行い、コピーコンストラクタ呼び出しにより生成される値を一時変数領域に格納した後、一時変数領域(SP+16からSP+24)から実引数領域(SP+4からSP12)へ値のコピーを実施していることがわかる。
次に本実施の形態における具体例を示す。まず値渡し引数更新情報抽出処理(S11)が実施されると、図19(a)に示す値渡し引数更新情報62が抽出される。つまり、「値渡し引数を持つ関数」としてvoid f(A obj)、「値渡し引数を持つ関数を直接呼び出す関数」としてvoid g(void)、void h(void)、「値渡し引数を持つ関数を間接的に呼び出す可能性がある関数」は存在しない、関数fで値渡し対象となっている「値渡し引数」は第1引数A obj、関数定義内で引数の更新はされていないとの情報が抽出される。
次に、値渡し関数呼び出し参照渡し変換処理(S12)が実施されると、関数fの値渡し引数「A obj」は関数定義内で参照はされているものの更新は行なわれていないので、強制的な参照渡しを行なうか否か判定処理(S31)の結果に関わらず、図19(b)に示すように、第1引数の「参照渡し変換判定情報」が「可能」と記録される。よって、値渡し関数呼び出しが参照渡し関数呼び出しに変換される。
値渡し関数定義参照渡し変換処理(S13)が実施される場合も同様で、強制的な参照渡しを行なうか否かの判定処理(S51)の結果に関わらず、結果的に参照渡し可能と記録されるので、関数fの値渡しによる引数受け渡しが、参照渡しによる関数受け渡しに変換される。
値渡しによる引数受け渡しを参照渡しによる受け渡しに変換しているので、スタックフレームは具体例1と同じく図14に示すようになる。
図16(a)および図16(b)のプログラム例で示すクラスAは、図10(a)および図10(b)で示す構造体Aとデータ構造が等しい。また、図19(b)の値渡し引数更新情報62も図13(b)と等しくなるので、関数f、関数gの定義を表すアセンブラコードは具体例1と同じ図15に示すようになる。このように参照渡しによる引数受け渡し方法に変換されているため、図18に示す従来の方法におけるアセンブラコードのように、コピーコンストラクタによる引数値のコピー生成およびコピー値の実引数領域への格納処理を行なう必要がなくなる。このため、コードサイズが削減できていることがわかる。
(具体例3)
図20(a)は、プログラム記憶部56に記憶されているヘッダファイルの一例を示し、図20(b)は、プログラム記憶部56に記憶されているソースプログラムの一例を示す。以下では、このヘッダファイルおよびソースプログラムを入力した場合のコンパイラの動作を説明する。
図20(a)に示すヘッダファイル「struct.h」は、図10(a)に示すヘッダファイル「struct.h」と同じである。また、図20(b)に示すソースプログラム「prog3.cc」は、図10(b)に示すソースプログラム「prog1.cc」とほぼ同じであるが、関数fの定義において、引数objを更新している(「obj.x = b;」,「obj.y = c;」,「obj.z = a;」)点が異なる。この場合のスタックフレーム例は、図11と同様になる。図21に、従来の方法で実施された場合の、関数f、関数gの定義を表すアセンブラコードを示す。図12とほぼ同じであるが、関数fの定義において、引数objを更新している処理が追加されている。
次に本実施の形態における具体例を示す。まず値渡し引数更新情報抽出処理(S11)が実施されると、図22(a)に示す値渡し引数更新情報62が抽出される。つまり、「値渡し引数を持つ関数」としてvoid f(A obj)、「値渡し引数を持つ関数を直接呼び出す関数」としてvoid g(void)、void h(void)、「値渡し引数を持つ関数を間接的に呼び出す可能性がある関数」は存在しない、関数fで値渡し対象となっている「値渡し引数」は第1引数A obj、関数定義内で引数の更新はされているとの情報が抽出される。
次に、値渡し関数呼び出し参照渡し変換処理(S12)が実施されると、関数fの値渡し引数「A obj」は関数定義内で更新が行なわれているので、強制的な参照渡しの判定(S31)で強制変換を行なわないとした場合は、図22(b)のように第1引数の「参照渡し変換判定情報」が「不可能」と記録され変換が行なわれない。一方、強制変換を行なうとした場合は、図22(c)に示すように、第1引数の「参照渡し変換判定情報」が「可能」と記録され、値渡し関数呼び出しが参照渡し関数呼び出しに変換される。
値渡し関数定義参照渡し変換処理(S13)が実施される場合も同様で、強制的な参照渡しを行なわないとした場合は(S51でNo)、「参照渡し変換判定情報」が「不可能」と記録され変換が行われない。一方、強制変換を行なうとした場合は(S51でYes)、参照渡しへの変換が「可能」と記録され、関数fの値渡しによる引数受け渡しが参照渡しによる関数受け渡しに変換される。加えて、値渡しの更新が存在するので図9のS68の処理が実施され、更新処理前に、変換された参照渡し引数から引数値を参照してコピーを生成し、そのコピーが参照先として設定されることになる。
図23に、値渡し引数が関数定義内で更新されている場合で、強制的に参照渡しに変換する場合のスタックフレーム例を示す。従来の方法における具体例では関数呼び出し元で引数値のコピーが生成されるため、図17のように関数呼び出し元(つまり関数gのアクセス領域)にコピーが確保されているのに対し、本発明では、関数呼び出し先で引数値のコピーが生成されるため、図23のように関数呼び出し先(つまり関数fのアクセス領域)にコピーが確保されているのがわかる。
図24に、値渡し引数を参照渡し引数に強制的に変換した場合の、関数f、関数gの定義を表すアセンブラコードを示す。従来の方法による具体例である図12では、関数gの定義中ならびに関数hの定義中でも引数値のコピーを生成して引数受け渡しを行なっているのに対して、本発明では図24に示すように関数gや関数hでは引数値へのアドレスを用いた参照での引数受け渡しを実施し、関数fの定義中で引数値のコピーを生成して引数値に設定していることがわかる。このように引数値のコピーを呼び出し元の関数から呼び出し先の関数へ移動することで、値渡しの関数呼び出しが発生するたびに引数値のコピーを生成しなればならなかったものを、値渡し関数呼び出し先の一度のコピー生成にまとめることができる。このため、コードサイズを削減できていることがわかる。この効果は関数が呼び出される回数が多ければ多いほど高い。
以上説明したように、本実施の形態によると値渡し引数の関数および当該関数を呼び出す関数を参照渡し引数の関数および当該関数を呼び出す関数に変換している。このため、スタックフレームに引数をコピーする必要がなく、オブジェクトプログラムのコードサイズを小さくすることができる。
以上、本発明の実施の形態に係るコンパイラについて説明したが、本発明は、この実施の形態に限定されるものではない。
例えば、上述の実施の形態では、スタックフレームを用いた引数渡しについての具体例を挙げたが、コンパイル環境に応じては、レジスタなどを用いた引数渡しを使用しても構わない。
本発明にかかるコンパイル方法は、携帯電話やPDA(Personal Digital Assistant)等のコードサイズの小さなオブジェクトコードを必要とする組み込み機器用のコンパイル方法等に適用可能である。
本発明の実施の形態に係るコンパイラを実行するコンパイラ装置の外観図である。 図1に示したコンパイラ装置のハードウェア構成を示すブロック図である。 本発明の実施の形態に係るコンパイラの処理のフローチャートである。 値渡し引数更新情報記憶部に記憶されている値渡し引数更新情報の内容を説明するための図である。 値渡し引数更新情報抽出処理の詳細を示すフローチャートである。 値渡し関数を間接的に呼び出す可能性のある関数を含むソースプログラムの一例を示す図である。 値渡し関数を間接的に呼び出す可能性のある関数を含むソースプログラムに対する値渡し引数更新情報の一例を示す図である。 値渡し関数呼び出し参照渡し変換処理の詳細を示すフローチャートである。 値渡し関数定義参照渡し変換処理の詳細を示すフローチャートである。 具体例1で用いられるプログラム記憶部に記憶されているファイルの一例を示す図であり、(a)は、ヘッダファイルの一例を示す図であり、(b)は、ソースプログラムの一例を示す図である。 具体例1において引数を値渡しする場合のスタックフレームの一例を示す図である。 図10に示すファイルを従来の方法を用いてコンパイルした場合のアセンブラコードの一例を示す図である。 具体例1における値渡し引数更新情報の一例を示す図である。 具体例1および具体例2において、引数を参照渡しに変換した後のスタックフレームの一例を示す図である。 具体例1および具体例2において、引数を参照渡しに変換した後のアセンブラコードの一例を示す図である。 具体例2で用いられるプログラム記憶部に記憶されているファイルの一例を示す図であり、(a)は、ヘッダファイルの一例を示す図であり、(b)は、ソースプログラムの一例を示す図である。 具体例2において引数を値渡しする場合のスタックフレームの一例を示す図である。 図16に示すファイルを従来の方法を用いてコンパイルした場合のアセンブラコードの一例を示す図である。 具体例2における値渡し引数更新情報の一例を示す図である。 具体例3で用いられるプログラム記憶部に記憶されているファイルの一例を示す図であり、(a)は、ヘッダファイルの一例を示す図であり、(b)は、ソースプログラムの一例を示す図である。 図20に示すファイルを従来の方法を用いてコンパイルした場合のアセンブラコードの一例を示す図である。 具体例3における値渡し引数更新情報の一例を示す図である。 具体例3において、値渡し引数が関数定義内で更新されている場合に、強制的に参照渡しに変換する場合のスタックフレームの一例を示す図である。 具体例3において、値渡し引数が関数定義内で更新されている場合に、強制的に参照渡しに変換する場合のアセンブラコードの一例を示す図である。
符号の説明
56 プログラム記憶部
58 値渡し引数更新情報記憶部
60 生成コード記憶部
62 値渡し引数更新情報

Claims (14)

  1. コンパイル装置が、高級言語で記述されたソースプログラムをオブジェクトコードに変換するコンパイル方法であって、
    前記コンパイル装置の中間コード生成手段が、プログラム記憶部に記憶されているソースプログラムから中間コードを生成し、生成した前記中間コードをメモリに記憶する中間コード生成ステップと、
    前記コンパイル装置の値渡し関数呼び出し参照渡し変換手段が、前記メモリに記憶されている前記中間コードにおいて、値渡し引数を持つ関数を間接的に呼び出す可能性のある関数がなく、かつ前記値渡し引数が当該値渡し引数を持つ関数の定義内で更新されていない場合に、前記値渡し引数を持つ関数を呼び出す関数を参照渡し引数を持つ関数を呼び出す関数に変換する値渡し関数呼び出し参照渡し変換ステップと、
    前記コンパイル装置の値渡し関数定義参照渡し変換手段が、前記メモリに記憶されている前記中間コードにおいて、値渡し引数を持つ関数を間接的に呼び出す可能性のある関数がなく、かつ前記値渡し引数が当該値渡し引数を持つ関数の定義内で更新されていない場合に、値渡し引数を持つ関数の値渡しによる引数受け渡しを参照渡しによる引数受け渡しに変換する値渡し関数定義参照渡し変換ステップと、
    前記コンパイル装置のオブジェクトコード変換手段が、前記メモリに記憶されている前記中間コードをオブジェクトコードに変換し、前記オブジェクトコードを生成コード記憶部に記憶するオブジェクトコード変換ステップとを含む
    ことを特徴とするコンパイル方法。
  2. 前記コンパイル方法は、さらに、
    前記コンパイル装置の値渡し引数更新情報抽出部が、前記メモリに記憶されている前記中間コードから、少なくとも、値渡し引数を持つ関数と、当該値渡し引数を持つ関数を直接呼び出す関数と、当該値渡し引数を持つ関数を間接的に呼び出す可能性のある関数と、当該値渡し引数を持つ関数の値渡し引数と、当該値渡し引数が値渡し引数を持つ関数の定義内で更新されているか否かを示す更新判定情報とを含む値渡し引数更新情報を抽出し、抽出した前記値渡し引数更新情報を値渡し引数更新情報記憶部に書き込む値渡し引数更新情報抽出ステップを含み、
    前記値渡し関数定義参照渡し変換ステップでは前記値渡し関数定義参照渡し変換手段が、前記値渡し関数呼び出し参照渡し変換ステップでは前記値渡し関数呼び出し参照渡し変換手段が、それぞれ、前記値渡し引数更新情報記憶部に記憶されている前記値渡し引数更新情報に基づき、値渡し引数を持つ関数を間接的に呼び出す可能性のある関数がなく、かつ前記値渡し引数が当該値渡し引数を持つ関数の定義内で更新されていない場合を特定する
    ことを特徴とする請求項1に記載のコンパイル方法。
  3. 前記値渡し関数呼び出し参照渡し変換ステップでは、値渡し引数を持つ関数を呼び出す関数を参照渡し引数を持つ関数を呼び出す関数に強制的に変換せよとの指定がない場合には、前記値渡し関数呼び出し参照渡し変換手段が前記値渡し引数更新情報記憶部に記憶されている前記値渡し引数更新情報に基づいて、前記値渡し引数を持つ関数を間接的に呼び出す可能性のある関数がなく、かつ前記値渡し引数が値渡し引数を持つ関数の定義内で更新されていない場合に、前記値渡し引数を持つ関数を直接呼び出す関数を参照渡し引数を持つ関数を直接呼び出す関数に変換する
    ことを特徴とする請求項2に記載のコンパイル方法。
  4. 前記値渡し関数呼び出し参照渡し変換ステップでは、値渡し引数を持つ関数を呼び出す関数を参照渡し引数を持つ関数を呼び出す関数に強制的に変換せよとの指定がある場合には、当該指定がある値渡し引数を持つ関数について、前記値渡し関数呼び出し参照渡し変換手段が前記値渡し引数更新情報記憶部に記憶されている前記値渡し引数更新情報に基づいて、前記値渡し引数を持つ関数を直接呼び出す関数および前記値渡し引数を持つ関数を間接的に呼び出す可能性のある関数を、参照渡し引数を持つ関数を直接呼び出す関数および参照渡し引数を持つ関数を間接的に呼び出す可能性のある関数にそれぞれ変換する
    ことを特徴とする請求項2または3に記載のコンパイル方法。
  5. 前記値渡し関数定義参照渡し変換ステップでは、値渡し引数を持つ関数の値渡しによる引数受け渡しを参照渡しによる引数受け渡しに強制的に変換せよとの指定がない場合には、前記値渡し関数定義参照渡し変換手段が、前記値渡し引数更新情報記憶部に記憶されている前記値渡し引数更新情報に基づいて、前記値渡し引数を持つ関数を間接的に呼び出す可能性のある関数がなく、かつ前記値渡し引数が値渡し引数を持つ関数の定義内で更新されていない場合に、前記値渡し引数を持つ関数の値渡しによる引数受け渡しを参照渡しによる引数受け渡しに変換する
    ことを特徴とする請求項2に記載のコンパイル方法。
  6. 前記値渡し関数定義参照渡し変換ステップでは、値渡し引数を持つ関数の値渡しによる引数受け渡しを参照渡しによる引数受け渡しに強制的に変換せよとの指定がある場合には、当該指定がある値渡し引数を持つ関数について、前記値渡し関数定義参照渡し変換手段が、前記値渡し引数更新情報記憶部に記憶されている前記値渡し引数更新情報に基づいて、前記値渡し引数を持つ関数の値渡しによる引数受け渡しを参照渡しによる引数受け渡しに変換し、前記値渡し引数が関数定義内で更新されていれば、前記中間コードにおいて実際に値が更新される部分よりも前に、変換された参照渡し引数から引数値を参照してそのコピーを生成し、当該コピーを参照先に設定する
    ことを特徴とする請求項2または5に記載のコンパイル方法。
  7. 高級言語で記述されたソースプログラムをオブジェクトコードに変換するコンパイラであって、
    請求項1〜6のいずれか1項に記載のコンパイル方法に含まれる各ステップをコンピュータに実行させる
    ことを特徴とするコンパイラ。
  8. 請求項7に記載のコンパイラを記録したコンピュータ読取可能な記録媒体。
  9. 高級言語で記述されたソースプログラムをオブジェクトコードに変換するコンパイル装置であって、
    プログラム記憶部に記憶されているソースプログラムから中間コードを生成し、生成した前記中間コードをメモリに記憶する中間コード生成手段と、
    前記メモリに記憶されている前記中間コードにおいて、値渡し引数を持つ関数を間接的に呼び出す可能性のある関数がなく、かつ前記値渡し引数が当該値渡し引数を持つ関数の定義内で更新されていない場合に、前記値渡し引数を持つ関数を呼び出す関数を参照渡し引数を持つ関数を呼び出す関数に変換する値渡し関数呼び出し参照渡し変換手段と、
    前記メモリに記憶されている前記中間コードにおいて、値渡し引数を持つ関数を間接的に呼び出す可能性のある関数がなく、かつ前記値渡し引数が当該値渡し引数を持つ関数の定義内で更新されていない場合に、値渡し引数を持つ関数の値渡しによる引数受け渡しを参照渡しによる引数受け渡しに変換する値渡し関数定義参照渡し変換手段と、
    前記メモリに記憶されている前記中間コードをオブジェクトコードに変換し、前記オブジェクトコードを生成コード記憶部に記憶するオブジェクトコード変換手段とを備える
    ことを特徴とするコンパイル装置。
  10. 前記コンパイル装置は、さらに、
    前記メモリに記憶されている前記中間コードから、少なくとも、値渡し引数を持つ関数と、当該値渡し引数を持つ関数を直接呼び出す関数と、当該値渡し引数を持つ関数を間接的に呼び出す可能性のある関数と、当該値渡し引数を持つ関数の値渡し引数と、当該値渡し引数が値渡し引数を持つ関数の定義内で更新されているか否かを示す更新判定情報とを含む値渡し引数更新情報を抽出し、抽出した前記値渡し引数更新情報を値渡し引数更新情報記憶部に記憶する値渡し引数更新情報抽出部を備え、
    前記値渡し関数定義参照渡し変換手段および前記値渡し関数呼び出し参照渡し変換手段は、それぞれ、前記値渡し引数更新情報記憶部に記憶されている前記値渡し引数更新情報に基づき、値渡し引数を持つ関数を間接的に呼び出す可能性のある関数がなく、かつ前記値渡し引数が当該値渡し引数を持つ関数の定義内で更新されていない場合を特定する
    ことを特徴とする請求項9に記載のコンパイル装置。
  11. 前記値渡し関数呼び出し参照渡し変換手段は、値渡し引数を持つ関数を呼び出す関数を参照渡し引数を持つ関数を呼び出す関数に強制的に変換せよとの指定がない場合には、前記値渡し引数更新情報記憶部に記憶されている前記値渡し引数更新情報に基づいて、前記値渡し引数を持つ関数を間接的に呼び出す可能性のある関数がなく、かつ前記値渡し引数が値渡し引数を持つ関数の定義内で更新されていない場合に、前記値渡し引数を持つ関数を直接呼び出す関数を参照渡し引数を持つ関数を直接呼び出す関数に変換する
    ことを特徴とする請求項10に記載のコンパイル装置。
  12. 前記値渡し関数呼び出し参照渡し変換手段は、値渡し引数を持つ関数を呼び出す関数を参照渡し引数を持つ関数を呼び出す関数に強制的に変換せよとの指定がある場合には、当該指定がある値渡し引数を持つ関数について、前記値渡し引数更新情報記憶部に記憶されている前記値渡し引数更新情報に基づいて、前記値渡し引数を持つ関数を直接呼び出す関数および前記値渡し引数を持つ関数を間接的に呼び出す可能性のある関数を、参照渡し引数を持つ関数を直接呼び出す関数および参照渡し引数を持つ関数を間接的に呼び出す可能性のある関数にそれぞれ変換する
    ことを特徴とする請求項10または11に記載のコンパイル装置。
  13. 前記値渡し関数定義参照渡し変換手段は、値渡し引数を持つ関数の値渡しによる引数受け渡しを参照渡しによる引数受け渡しに強制的に変換せよとの指定がない場合には、前記値渡し引数更新情報記憶部に記憶されている前記値渡し引数更新情報に基づいて、前記値渡し引数を持つ関数を間接的に呼び出す可能性のある関数がなく、かつ前記値渡し引数が値渡し引数を持つ関数の定義内で更新されていない場合に、前記値渡し引数を持つ関数の値渡しによる引数受け渡しを参照渡しによる引数受け渡しに変換する
    ことを特徴とする請求項10に記載のコンパイル装置。
  14. 前記値渡し関数定義参照渡し変換手段は、値渡し引数を持つ関数の値渡しによる引数受け渡しを参照渡しによる引数受け渡しに強制的に変換せよとの指定がある場合には、当該指定がある値渡し引数を持つ関数について、前記値渡し引数更新情報記憶部に記憶されている前記値渡し引数更新情報に基づいて、前記値渡し引数を持つ関数の値渡しによる引数受け渡しを参照渡しによる引数受け渡しに変換し、前記値渡し引数が関数定義内で更新されていれば、前記メモリに記憶されている前記中間コードにおいて実際に値が更新される部分よりも前に、変換された参照渡し引数から引数値を参照してそのコピーを生成し、当該コピーを参照先に設定する
    ことを特徴とする請求項10または13に記載のコンパイル装置。
JP2003424043A 2003-12-22 2003-12-22 コンパイル方法および装置、ならびにコンパイラ Expired - Lifetime JP4652680B2 (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP2003424043A JP4652680B2 (ja) 2003-12-22 2003-12-22 コンパイル方法および装置、ならびにコンパイラ
US11/016,934 US7458071B2 (en) 2003-12-22 2004-12-21 Compilation method, compiler apparatus and compiler
CNB2004101037298A CN100476732C (zh) 2003-12-22 2004-12-22 编译方法、编译装置及编译程序

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2003424043A JP4652680B2 (ja) 2003-12-22 2003-12-22 コンパイル方法および装置、ならびにコンパイラ

Publications (2)

Publication Number Publication Date
JP2005182562A JP2005182562A (ja) 2005-07-07
JP4652680B2 true JP4652680B2 (ja) 2011-03-16

Family

ID=34675385

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2003424043A Expired - Lifetime JP4652680B2 (ja) 2003-12-22 2003-12-22 コンパイル方法および装置、ならびにコンパイラ

Country Status (3)

Country Link
US (1) US7458071B2 (ja)
JP (1) JP4652680B2 (ja)
CN (1) CN100476732C (ja)

Families Citing this family (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100683853B1 (ko) * 2005-02-04 2007-02-16 삼성전기주식회사 프리 컴파일링 장치
US7861234B1 (en) * 2005-02-23 2010-12-28 Oracle America, Inc. System and method for binary translation to improve parameter passing
US7802239B2 (en) * 2005-11-09 2010-09-21 Oracle America, Inc. Supporting method references in the JAVA language
EP1818814A1 (en) * 2006-02-07 2007-08-15 Alexandr Savinov Method for indirect representation and access in an object-oriented programming language
US20080127142A1 (en) * 2006-11-28 2008-05-29 Microsoft Corporation Compiling executable code into a less-trusted address space
US8806503B2 (en) * 2011-01-24 2014-08-12 Nec Laboratories America, Inc. Method and system for memory aware runtime to support multitenancy in heterogeneous clusters
EP2687981B1 (en) * 2012-07-18 2017-12-27 MStar Semiconductor, Inc. Automated compiler specialisation for global optimisation
CN104756078B (zh) * 2012-08-20 2018-07-13 唐纳德·凯文·卡梅伦 处理资源分配的装置和方法
US9329844B2 (en) * 2014-05-30 2016-05-03 Apple Inc. Programming system and language for application development
CN107003884B (zh) * 2014-12-04 2019-12-24 华为技术有限公司 编译器以及用于编译源代码的方法
JP6651974B2 (ja) 2016-05-10 2020-02-19 富士通株式会社 情報処理装置、コンパイル方法及びコンパイラプログラム
US10241764B2 (en) 2017-05-05 2019-03-26 National Instruments Corporation Automatically transform pass-by-value semantics into pass-by-reference implementation
CN109240666B (zh) * 2018-06-22 2020-08-25 北京大学 基于调用栈和依赖路径的函数调用代码生成方法及系统
CN109491667A (zh) * 2018-12-21 2019-03-19 芯海科技(深圳)股份有限公司 一种c语言编译效率优化的方法

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0535491A (ja) * 1991-07-31 1993-02-12 Oki Electric Ind Co Ltd Fortran言語からc言語への変換における引数変換方法
US6481007B1 (en) * 1999-06-03 2002-11-12 Oracle Corporation Optimizing parameter passing
JP2003050700A (ja) * 2001-08-06 2003-02-21 Matsushita Electric Ind Co Ltd プログラム変換方法

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7155728B1 (en) * 2001-06-28 2006-12-26 Microsoft Corporation Remoting features
US7356812B2 (en) * 2003-09-30 2008-04-08 Intel Corporation Passing parameters by implicit reference

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0535491A (ja) * 1991-07-31 1993-02-12 Oki Electric Ind Co Ltd Fortran言語からc言語への変換における引数変換方法
US6481007B1 (en) * 1999-06-03 2002-11-12 Oracle Corporation Optimizing parameter passing
JP2003050700A (ja) * 2001-08-06 2003-02-21 Matsushita Electric Ind Co Ltd プログラム変換方法

Also Published As

Publication number Publication date
US20050138612A1 (en) 2005-06-23
CN100476732C (zh) 2009-04-08
CN1637708A (zh) 2005-07-13
JP2005182562A (ja) 2005-07-07
US7458071B2 (en) 2008-11-25

Similar Documents

Publication Publication Date Title
JP4652680B2 (ja) コンパイル方法および装置、ならびにコンパイラ
US6931627B2 (en) System and method for combinatorial test generation in a compatibility testing environment
JP3762867B2 (ja) コンパイラ装置、コンパイル方法、およびそのためのプログラムを格納した記憶媒体
US20070039010A1 (en) Automatic generation of software code to facilitate interoperability
US20060282452A1 (en) System and method for mapping structured document to structured data of program language and program for executing its method
JP2007521567A (ja) 編集処理中にプログラムコンポーネントの整合性を表現しチェックするための拡張型システム
US20070271553A1 (en) Method and system for translating assembler code to a target language
US20120110444A1 (en) Help Document Animated Visualization
US7624390B2 (en) Optimizing compiling of object oriented source code
US20090328016A1 (en) Generalized expression trees
JP2007304840A (ja) コンパイル方法、デバッグ方法、コンパイルプログラムおよびデバッグプログラム
CN115437684A (zh) 一种针对Linux内核源代码的文件级裁剪方法和系统
US7624381B1 (en) Portable detection of start and completion of object construction
JP2009176064A (ja) ソフトウェアリファクタリング支援装置および方法
KR20040077410A (ko) 마크업 내부에서 명시적으로 서브클래스를 정의하고이용하는 시스템 및 방법
JP2002116917A (ja) オブジェクト指向型プログラミング言語によるソース・プログラムをコンパイルするコンパイラ
WO2007116490A1 (ja) ソースコード生成プログラム、ソースコード生成方法およびソースコード生成装置
JP2006107339A (ja) プログラム処理装置
JP5399601B2 (ja) 実装コード開発システム、及び実装コード開発プログラム
JP3266097B2 (ja) 非リエントラントプログラムの自動リエントラント化方法及びシステム
JP7059757B2 (ja) Api処理方法、端末、api処理プログラム
KR100846203B1 (ko) 모바일 어플리케이션의 생성 방법 및 이를 구현하기 위한프로그램을 기록한 기록매체
CN110737431B (zh) 软件开发方法、开发平台、终端设备及存储介质
JP2021184246A (ja) 命令変換支援プログラム、命令変換支援方法および情報処理装置
CN107562430B (zh) 一种针对移动π演算语言的文件处理功能的编译方法

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20061011

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20090105

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20091208

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20100128

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20101005

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20101110

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: 20101130

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: 20101216

R150 Certificate of patent or registration of utility model

Ref document number: 4652680

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150

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

Free format text: PAYMENT UNTIL: 20131224

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

EXPY Cancellation because of completion of term