JPH11154094A - 演算方法および装置、並びに伝送媒体 - Google Patents
演算方法および装置、並びに伝送媒体Info
- Publication number
- JPH11154094A JPH11154094A JP32263597A JP32263597A JPH11154094A JP H11154094 A JPH11154094 A JP H11154094A JP 32263597 A JP32263597 A JP 32263597A JP 32263597 A JP32263597 A JP 32263597A JP H11154094 A JPH11154094 A JP H11154094A
- Authority
- JP
- Japan
- Prior art keywords
- data member
- data
- code
- runtime
- searching
- 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.)
- Abandoned
Links
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
(57)【要約】
【課題】 変数を変更した場合にも実行時最適化を行う
ことができるようにする。 【解決手段】 プリプロセッサ2において、そのクラス
のメンバ関数によってだけ使用されるか、または変更さ
れるデータメンバを抽出し、その抽出された関数を変更
せずに利用している他の関数があれば、それを実行時定
数とする。また、抽出された関数を変更しているメンバ
関数がある場合には、そのメンバ関数に、抽出された関
数のランタイムマシンコードを無効にするコードを挿入
する。
ことができるようにする。 【解決手段】 プリプロセッサ2において、そのクラス
のメンバ関数によってだけ使用されるか、または変更さ
れるデータメンバを抽出し、その抽出された関数を変更
せずに利用している他の関数があれば、それを実行時定
数とする。また、抽出された関数を変更しているメンバ
関数がある場合には、そのメンバ関数に、抽出された関
数のランタイムマシンコードを無効にするコードを挿入
する。
Description
【0001】
【発明の属する技術分野】本発明は、演算方法および装
置、並びに伝送媒体に関し、特に、オブジェクト指向型
言語を実行時に最適化する演算方法および装置、並びに
伝送媒体に関する。
置、並びに伝送媒体に関し、特に、オブジェクト指向型
言語を実行時に最適化する演算方法および装置、並びに
伝送媒体に関する。
【0002】
【従来の技術】プログラムの実行時にマシンコードを生
成する方法は、実行時の変数の値に応じた最適化(実行
時最適化)を実施できるので、プログラムの性能を向上
させることができる。以下に、この実行時にマシンコー
ドを生成する方法を説明する。
成する方法は、実行時の変数の値に応じた最適化(実行
時最適化)を実施できるので、プログラムの性能を向上
させることができる。以下に、この実行時にマシンコー
ドを生成する方法を説明する。
【0003】図12は通常のプログラムの、コンパイル
から実行までの一連のプロセスを示す図である。ソース
プログラムは、コンパイラおよびリンカなどにより実行
可能ファイルに変換される。そして、得られた実行可能
ファイルは、ハードディスク装置などの外部メモリに格
納された後、必要に応じてRAM(Random Access Memo
ry)などの内部メモリに読み込まれる。読み込まれたフ
ァイルはCPU(Central Processing Uint)が実行可
能なマシンコードであり、このマシンコードを実行する
ことにより所望の処理がなされる。
から実行までの一連のプロセスを示す図である。ソース
プログラムは、コンパイラおよびリンカなどにより実行
可能ファイルに変換される。そして、得られた実行可能
ファイルは、ハードディスク装置などの外部メモリに格
納された後、必要に応じてRAM(Random Access Memo
ry)などの内部メモリに読み込まれる。読み込まれたフ
ァイルはCPU(Central Processing Uint)が実行可
能なマシンコードであり、このマシンコードを実行する
ことにより所望の処理がなされる。
【0004】図13は、実行時にコード生成を行うプロ
グラムの、コンパイルから実行までの一連のプロセスを
示す図である。図12における場合と同様に、ソースプ
ログラムは、コンパイラおよびリンカにより実行可能フ
ァイルに変換される。そして、得られた実行可能ファイ
ルは、ハードディスク装置などの外部メモリに格納され
た後、必要に応じてRAMなどの内部メモリに読み込ま
れる。内部メモリに読み込まれたファイルは、マシンコ
ードで記述されており、このマシンコードを実行する
と、例えば操作者の入力などのような実行時の定数をも
とに最適化されたマシンコードが更に生成され、その最
適化されたマシンコードをCPUが実行することにより
所望の処理が更に高速に実行される。
グラムの、コンパイルから実行までの一連のプロセスを
示す図である。図12における場合と同様に、ソースプ
ログラムは、コンパイラおよびリンカにより実行可能フ
ァイルに変換される。そして、得られた実行可能ファイ
ルは、ハードディスク装置などの外部メモリに格納され
た後、必要に応じてRAMなどの内部メモリに読み込ま
れる。内部メモリに読み込まれたファイルは、マシンコ
ードで記述されており、このマシンコードを実行する
と、例えば操作者の入力などのような実行時の定数をも
とに最適化されたマシンコードが更に生成され、その最
適化されたマシンコードをCPUが実行することにより
所望の処理が更に高速に実行される。
【0005】以上のように、実行時にコード生成を行う
プログラムでは、実行時定数に応じた最適化を行うこと
ができるので、処理を高速化することができる。
プログラムでは、実行時定数に応じた最適化を行うこと
ができるので、処理を高速化することができる。
【0006】このように実行時にマシンコードを生成す
る方法は、部分計算の一種であり、古くは自己改変コー
ドのような特殊な方法に用いられてきた。近年では、タ
ーゲットマシンに依存しない実行時コード生成ルーチン
の記述方法や言語が提案されており、一般的な方法にな
りつつある。また、実行時コード生成系をソースプログ
ラムから自動的に生成すれば、プログラマがコード生成
系の正しさを確かめる必要がなくなる。
る方法は、部分計算の一種であり、古くは自己改変コー
ドのような特殊な方法に用いられてきた。近年では、タ
ーゲットマシンに依存しない実行時コード生成ルーチン
の記述方法や言語が提案されており、一般的な方法にな
りつつある。また、実行時コード生成系をソースプログ
ラムから自動的に生成すれば、プログラマがコード生成
系の正しさを確かめる必要がなくなる。
【0007】
【発明が解決しようとする課題】しかしながら、従来の
実行時最適化方法においては、変更された値を含むデー
タメンバを実行時最適化処理することができない課題が
あった。
実行時最適化方法においては、変更された値を含むデー
タメンバを実行時最適化処理することができない課題が
あった。
【0008】本発明はこのような状況に鑑みてなされた
ものであり、変更された値を含むデータメンバであって
も、これを実行時最適化処理することができるようにす
るものである。
ものであり、変更された値を含むデータメンバであって
も、これを実行時最適化処理することができるようにす
るものである。
【0009】
【課題を解決するための手段】請求項1に記載の演算方
法は、変化の少ない第1のデータメンバのうち、第1の
データメンバのクラスにおいてのみ使用されるか、また
は、変更される第2のデータメンバを検索する検索ステ
ップと、第2のデータメンバを変更せずに使用している
データメンバを検索し、実行時最適化対象の第3のデー
タメンバとして決定する決定ステップと、第2のデータ
メンバを変更して使用している第4のデータメンバを検
索し、第4のデータメンバに、実行時最適化処理時に生
成されるマシンコードを無効にするコードを挿入する挿
入ステップとを備えることを特徴とする。
法は、変化の少ない第1のデータメンバのうち、第1の
データメンバのクラスにおいてのみ使用されるか、また
は、変更される第2のデータメンバを検索する検索ステ
ップと、第2のデータメンバを変更せずに使用している
データメンバを検索し、実行時最適化対象の第3のデー
タメンバとして決定する決定ステップと、第2のデータ
メンバを変更して使用している第4のデータメンバを検
索し、第4のデータメンバに、実行時最適化処理時に生
成されるマシンコードを無効にするコードを挿入する挿
入ステップとを備えることを特徴とする。
【0010】請求項4に記載の伝送媒体は、オブジェク
ト指向言語の実行時最適化の演算を行う演算方法に用い
るコンピュータプログラムであって、変化の少ない第1
のデータメンバのうち、第1のデータメンバのクラスに
おいてのみ使用されるか、または、変更される第2のデ
ータメンバを検索する検索ステップと、第2のデータメ
ンバを変更せずに使用しているデータメンバを検索し、
実行時最適化対象の第3のデータメンバとして決定する
決定ステップと、第2のデータメンバを変更して使用し
ている第4のデータメンバを検索し、第4のデータメン
バに、実行時最適化処理時に生成されるマシンコードを
無効にするコードを挿入する挿入ステップとを備えるコ
ンピュータプログラムを伝送することを特徴とする。
ト指向言語の実行時最適化の演算を行う演算方法に用い
るコンピュータプログラムであって、変化の少ない第1
のデータメンバのうち、第1のデータメンバのクラスに
おいてのみ使用されるか、または、変更される第2のデ
ータメンバを検索する検索ステップと、第2のデータメ
ンバを変更せずに使用しているデータメンバを検索し、
実行時最適化対象の第3のデータメンバとして決定する
決定ステップと、第2のデータメンバを変更して使用し
ている第4のデータメンバを検索し、第4のデータメン
バに、実行時最適化処理時に生成されるマシンコードを
無効にするコードを挿入する挿入ステップとを備えるコ
ンピュータプログラムを伝送することを特徴とする。
【0011】請求項5に記載の演算装置は、変化の少な
い第1のデータメンバのうち、第1のデータメンバのク
ラスにおいてのみ使用されるか、または、変更される第
2のデータメンバを検索する検索手段と、第2のデータ
メンバを変更せずに使用しているデータメンバを検索
し、実行時最適化対象の第3のデータメンバとして決定
する決定手段と、第2のデータメンバを変更して使用し
ている第4のデータメンバを検索し、第4のデータメン
バに、実行時最適化処理時に生成されるマシンコードを
無効にするコードを挿入する挿入手段とを備えることを
特徴とする。
い第1のデータメンバのうち、第1のデータメンバのク
ラスにおいてのみ使用されるか、または、変更される第
2のデータメンバを検索する検索手段と、第2のデータ
メンバを変更せずに使用しているデータメンバを検索
し、実行時最適化対象の第3のデータメンバとして決定
する決定手段と、第2のデータメンバを変更して使用し
ている第4のデータメンバを検索し、第4のデータメン
バに、実行時最適化処理時に生成されるマシンコードを
無効にするコードを挿入する挿入手段とを備えることを
特徴とする。
【0012】請求項1に記載の演算方法、請求項4に記
載の伝送媒体、および請求項5に記載の演算装置におい
ては、第1のデータメンバのクラスにおいてのみ使用さ
れるか、または、変更される第2のデータメンバを変更
せずに使用している第3のデータメンバが、実行時最適
化対象とされるとともに、第2のデータメンバを変更し
て使用している第4のデータメンバに、実行時最適化処
理時に生成されるマシンコードを無効にするコードが挿
入される。
載の伝送媒体、および請求項5に記載の演算装置におい
ては、第1のデータメンバのクラスにおいてのみ使用さ
れるか、または、変更される第2のデータメンバを変更
せずに使用している第3のデータメンバが、実行時最適
化対象とされるとともに、第2のデータメンバを変更し
て使用している第4のデータメンバに、実行時最適化処
理時に生成されるマシンコードを無効にするコードが挿
入される。
【0013】
【発明の実施の形態】本発明は、オブジェクト指向型言
語に対して実行時最適化を行うものである。以下では、
本発明の一実施の形態である演算方法の概略について説
明し、続いて具体的な構成例について説明する。
語に対して実行時最適化を行うものである。以下では、
本発明の一実施の形態である演算方法の概略について説
明し、続いて具体的な構成例について説明する。
【0014】オブジェクト指向型の言語では、データを
操作するためのインターフェース(Interface)と実装
(インプリメンテーション(Imprementation))とを明
確に分離しているため、データの操作方法やデータの操
作の順番を遅く決定することができる。従って、実行時
最適化を施すためには好適な言語であるということがで
きる。
操作するためのインターフェース(Interface)と実装
(インプリメンテーション(Imprementation))とを明
確に分離しているため、データの操作方法やデータの操
作の順番を遅く決定することができる。従って、実行時
最適化を施すためには好適な言語であるということがで
きる。
【0015】本発明では、実行時最適化の対象をオブジ
ェクトのメソッド(例えば、オブジェクト指向型の言語
の1つであるC++(登録商標)ではメンバ関数)とす
る。オブジェクトの公開されないインスタンス変数(C
++ではprivateメンバ)のうち、オブジェクト
の生成時を除いてどのメソッドでも変更されないもの
は、オブジェクト指向型言語のカプセル化機能によって
オブジェクトの一生の間、その値が変化しないことが保
証される。
ェクトのメソッド(例えば、オブジェクト指向型の言語
の1つであるC++(登録商標)ではメンバ関数)とす
る。オブジェクトの公開されないインスタンス変数(C
++ではprivateメンバ)のうち、オブジェクト
の生成時を除いてどのメソッドでも変更されないもの
は、オブジェクト指向型言語のカプセル化機能によって
オブジェクトの一生の間、その値が変化しないことが保
証される。
【0016】そこで、オブジェクトのインスタンスが生
成されるときに、値が変化しないインスタンス変数につ
いてメソッドを部分計算(実行時最適化)し、その結果
をマシンコードとしてオブジェクトのデータと共に格納
する。そして、メソッドが呼ばれた(参照された)場合
は、格納されているマシンコードを実行することにより
所望の処理を行うことが可能となる。
成されるときに、値が変化しないインスタンス変数につ
いてメソッドを部分計算(実行時最適化)し、その結果
をマシンコードとしてオブジェクトのデータと共に格納
する。そして、メソッドが呼ばれた(参照された)場合
は、格納されているマシンコードを実行することにより
所望の処理を行うことが可能となる。
【0017】このように、部分計算の結果を関数ではな
くオブジェクトに結びつけたため、変数の値が不変とな
るので、従来のように部分計算の対象となる変数の値が
変化する度にマシンコードの生成をやり直す必要がなく
なる。
くオブジェクトに結びつけたため、変数の値が不変とな
るので、従来のように部分計算の対象となる変数の値が
変化する度にマシンコードの生成をやり直す必要がなく
なる。
【0018】また、オブジェクト指向型の言語では、オ
ブジェクトの生成と消滅の管理が自動的に行われるた
め、変数の複数の値に対応した複数のマシンコードを持
つようにした場合でも、各々の値を記憶する領域の管理
を行う必要がなくなる。
ブジェクトの生成と消滅の管理が自動的に行われるた
め、変数の複数の値に対応した複数のマシンコードを持
つようにした場合でも、各々の値を記憶する領域の管理
を行う必要がなくなる。
【0019】更に、部分計算の候補となるオブジェクト
(のクラス)は、インスタンス変数の使い方を解析する
ことで自動的に検出することができる。すなわち、部分
計算によって実効速度が向上するか否かは、速度向上解
析などを応用することにより自動的に判別することがで
きる。従って、ターゲットマシンの種類によらず、プロ
グラムを最適化し、実行速度を向上させることができ
る。
(のクラス)は、インスタンス変数の使い方を解析する
ことで自動的に検出することができる。すなわち、部分
計算によって実効速度が向上するか否かは、速度向上解
析などを応用することにより自動的に判別することがで
きる。従って、ターゲットマシンの種類によらず、プロ
グラムを最適化し、実行速度を向上させることができ
る。
【0020】インスタンス生成時に行うマシンコードの
生成は、そのメソッドに特有の部分計算と考えることが
できる。従って、この部分計算を適用する(インスタン
ス生成時にマシンコードを生成する)ことにより、コン
パイルを行う際に、コード生成系を生成することができ
る。
生成は、そのメソッドに特有の部分計算と考えることが
できる。従って、この部分計算を適用する(インスタン
ス生成時にマシンコードを生成する)ことにより、コン
パイルを行う際に、コード生成系を生成することができ
る。
【0021】図1は、本発明が適用される演算装置の構
成例を示している。入力されたソースプログラムは、第
1のプリプロセッサ1により、#includeディレクティブ
で指示されるインクルードファイルの処理や、#define
ディレクティブで定義されるマクロの処理などが行われ
た後、file.cppからfile.iに変換される。このプリプロ
セッサ1における処理は、本発明においては、実質的に
寄与していないので、後述する例では、ソースプログラ
ムがそのまま出力されることになる。
成例を示している。入力されたソースプログラムは、第
1のプリプロセッサ1により、#includeディレクティブ
で指示されるインクルードファイルの処理や、#define
ディレクティブで定義されるマクロの処理などが行われ
た後、file.cppからfile.iに変換される。このプリプロ
セッサ1における処理は、本発明においては、実質的に
寄与していないので、後述する例では、ソースプログラ
ムがそのまま出力されることになる。
【0022】次のプリプロセッサ(RPCC.EXE)2は、ソー
スコードを中間表現に変換するトランスレータ、中間表
現のオプティマイザ、およびランタイムコード生成器の
生成器を有している。本発明においては、このプリプロ
セッサ2により入力されたソースプログラムfile.iが、
後述するように処理されて、file.outとして出力され
る。その出力file.outは、コンパイラ3により、実行可
能なファイルfile.exeに変換され、出力される。
スコードを中間表現に変換するトランスレータ、中間表
現のオプティマイザ、およびランタイムコード生成器の
生成器を有している。本発明においては、このプリプロ
セッサ2により入力されたソースプログラムfile.iが、
後述するように処理されて、file.outとして出力され
る。その出力file.outは、コンパイラ3により、実行可
能なファイルfile.exeに変換され、出力される。
【0023】コンパイル時においては、ソースプログラ
ム中のプリプロセッサ命令が最初に処理される。プリプ
ロセッサ(RPCC.EXE)2は、プログラムを、コード生成器
を埋め込むように、それらを引用するコードを挿入する
ように、そして、発生されたコードを引用または無効に
するように、プログラムを書き換える。プリプロセッサ
2の出力は、コンパイラ3により、実行可能なファイル
にコンパイルされる。ソースプログラムとその中間表現
は、このコンパイル時においてのみ不正に処理される。
ム中のプリプロセッサ命令が最初に処理される。プリプ
ロセッサ(RPCC.EXE)2は、プログラムを、コード生成器
を埋め込むように、それらを引用するコードを挿入する
ように、そして、発生されたコードを引用または無効に
するように、プログラムを書き換える。プリプロセッサ
2の出力は、コンパイラ3により、実行可能なファイル
にコンパイルされる。ソースプログラムとその中間表現
は、このコンパイル時においてのみ不正に処理される。
【0024】実行時においては、コード生成器がパラメ
ータとしての実行時定数により引用される。各コード生
成器は、1つのメンバ関数に特有のものである。1つの
コード生成器は、実行時定数の異なる値を有する複数の
マシンコードルーチンを生成する。このようにして生成
されたルーチンは、固定的にコンパイルされたものよ
り、より効果的であることが期待され、必要に応じて参
照される。
ータとしての実行時定数により引用される。各コード生
成器は、1つのメンバ関数に特有のものである。1つの
コード生成器は、実行時定数の異なる値を有する複数の
マシンコードルーチンを生成する。このようにして生成
されたルーチンは、固定的にコンパイルされたものよ
り、より効果的であることが期待され、必要に応じて参
照される。
【0025】次に、図2のフローチャートを参照して、
プリプロセッサ2の動作について説明するが、その前
に、本発明において使用されるC++の入力言語につい
て説明する。メンバ関数の宣言の前に配置されるキーワ
ードruntimeは、実行時コード生成の使用を意味する。
このシステムにおいては、メンバ関数において使用さ
れ、かつ、変更されていないknownのデータメンバは、
実行時定数とされる。データメンバが頻繁に変更される
場合、また、プログラマが生成されたコード中にその値
を埋め込むことを希望しない場合、プログラマは、メン
バの定義の前にdynamicのキーワードを付加する。
プリプロセッサ2の動作について説明するが、その前
に、本発明において使用されるC++の入力言語につい
て説明する。メンバ関数の宣言の前に配置されるキーワ
ードruntimeは、実行時コード生成の使用を意味する。
このシステムにおいては、メンバ関数において使用さ
れ、かつ、変更されていないknownのデータメンバは、
実行時定数とされる。データメンバが頻繁に変更される
場合、また、プログラマが生成されたコード中にその値
を埋め込むことを希望しない場合、プログラマは、メン
バの定義の前にdynamicのキーワードを付加する。
【0026】すなわち、プログラマは、実行時最適化処
理の対象とする関数をruntimeで特定し、対象としない
関数をdynamicで特定することができる。
理の対象とする関数をruntimeで特定し、対象としない
関数をdynamicで特定することができる。
【0027】図2において、最初にステップS1におい
て、dynamicではないデータメンバのうち、private(す
なわち、自分のクラス内からのみ参照可能なデータメン
バ),protected(自分、および自分を承継したクラス
からのみ参照可能なデータメンバ),const(変化しな
い定数のデータメンバ)であるもの(後述する図5の例
の場合、int a,int b)に対して、knownのマークを付加
する処理が実行される。そして、ステップS2におい
て、const以外のデータメンバ、すなわちprivateまたは
protectedであるデータメンバのうち、所定の条件を満
たすデータメンバのマークknownを消去する処理が実行
される(図5の例の場合、マークknownが消去される関
数はない)。この処理の詳細は、図3に示されている。
て、dynamicではないデータメンバのうち、private(す
なわち、自分のクラス内からのみ参照可能なデータメン
バ),protected(自分、および自分を承継したクラス
からのみ参照可能なデータメンバ),const(変化しな
い定数のデータメンバ)であるもの(後述する図5の例
の場合、int a,int b)に対して、knownのマークを付加
する処理が実行される。そして、ステップS2におい
て、const以外のデータメンバ、すなわちprivateまたは
protectedであるデータメンバのうち、所定の条件を満
たすデータメンバのマークknownを消去する処理が実行
される(図5の例の場合、マークknownが消去される関
数はない)。この処理の詳細は、図3に示されている。
【0028】図3において、最初にステップS11にお
いて、そのデータメンバのアドレスが、&演算子、また
は参照によって生成されるものであるか否かが判定され
る。この判定において、NOの判定結果が得られたとき、
特に処理は行われない。
いて、そのデータメンバのアドレスが、&演算子、また
は参照によって生成されるものであるか否かが判定され
る。この判定において、NOの判定結果が得られたとき、
特に処理は行われない。
【0029】ステップS11において、YESの判定が行
われた場合、ステップS12に進み、そのデータメンバ
のアドレスが、直接的または間接的に変数、引数または
戻り値として渡されるか否かが判定される。この判定に
おいて、NOの判定が行われた場合にも、特別の処理は行
われない。
われた場合、ステップS12に進み、そのデータメンバ
のアドレスが、直接的または間接的に変数、引数または
戻り値として渡されるか否かが判定される。この判定に
おいて、NOの判定が行われた場合にも、特別の処理は行
われない。
【0030】さらに、ステップS12でYESの判定がな
されたとき、ステップS13において、そのデータメン
バのアドレスが渡された先の変数、引数、または戻り値
の型はconstでないオブジェクトへのポインタまたは参
照であるか否かが判定される。この場合においても、NO
の判定が行われた場合、特に処理は行われない。
されたとき、ステップS13において、そのデータメン
バのアドレスが渡された先の変数、引数、または戻り値
の型はconstでないオブジェクトへのポインタまたは参
照であるか否かが判定される。この場合においても、NO
の判定が行われた場合、特に処理は行われない。
【0031】ステップS11乃至ステップS13におい
て、何れもYESの判定が行われたデータメンバについて
は、ステップS14において、そのデータメンバに付加
されていたマークknownが消去される(図5の例の場
合、int a,int bのいずれにも、マークknownが付加され
たままの状態になる。また、データメンバint aは関数r
untime int g(int x){return a*c-x;}でも使用されてお
り、変更されていないので、この関数の実行時定数とな
る)。
て、何れもYESの判定が行われたデータメンバについて
は、ステップS14において、そのデータメンバに付加
されていたマークknownが消去される(図5の例の場
合、int a,int bのいずれにも、マークknownが付加され
たままの状態になる。また、データメンバint aは関数r
untime int g(int x){return a*c-x;}でも使用されてお
り、変更されていないので、この関数の実行時定数とな
る)。
【0032】これらの処理により、マークknownが付加
されたままとなっているデータメンバの値は、明らか
に、そのクラスのメンバ関数によってのみ使用される
か、あるいは、変更されるものであるということにな
る。
されたままとなっているデータメンバの値は、明らか
に、そのクラスのメンバ関数によってのみ使用される
か、あるいは、変更されるものであるということにな
る。
【0033】なお、ステップS2におけるマークknown
を消去する処理の対象とされるのは、privateまたはpro
tectedだけであり、constについては、マークknownは付
加されたままの状態となる。
を消去する処理の対象とされるのは、privateまたはpro
tectedだけであり、constについては、マークknownは付
加されたままの状態となる。
【0034】次に、図2に戻って、ステップS3におい
て、runtimeのついているメンバ関数(図5の例の場
合、runtime int f(int x),runtime int g(int x))を
Fとし、knownのついているデータメンバ(図5の例の
場合、int aおよびint b)がXとされる。そして、ステ
ップS4において、データメンバXが関数Fにより使用
され、かつ、変更されていない場合には、データメンバ
Xが関数Fのコード生成器における実行時定数とされる
(図5の例の場合、int aおよびint bがruntimeint f(i
nt x){return a*b-x}で使用されており、変更されてい
ないので、実行時定数とされる)。すなわち、この場
合、関数Fは、実行時最適化の対象とされる。
て、runtimeのついているメンバ関数(図5の例の場
合、runtime int f(int x),runtime int g(int x))を
Fとし、knownのついているデータメンバ(図5の例の
場合、int aおよびint b)がXとされる。そして、ステ
ップS4において、データメンバXが関数Fにより使用
され、かつ、変更されていない場合には、データメンバ
Xが関数Fのコード生成器における実行時定数とされる
(図5の例の場合、int aおよびint bがruntimeint f(i
nt x){return a*b-x}で使用されており、変更されてい
ないので、実行時定数とされる)。すなわち、この場
合、関数Fは、実行時最適化の対象とされる。
【0035】次に、ステップS5において、他のメンバ
関数Gが、データメンバXを変更しているとき、関数F
のランタイムマシンコードを無効にするコードを、関数
Gに挿入する処理が実行される。これにより、メンバ関
数Gが実行されてデータメンバXを変更した場合には、
変更前のデータメンバXの値に基づいて関数Fのコード
生成器が生成したコードは無効となる。このため、次に
関数Fが実行されるときには、データメンバXの新しい
値に基づいて関数Fのコード生成器が生成したコードが
実行される。
関数Gが、データメンバXを変更しているとき、関数F
のランタイムマシンコードを無効にするコードを、関数
Gに挿入する処理が実行される。これにより、メンバ関
数Gが実行されてデータメンバXを変更した場合には、
変更前のデータメンバXの値に基づいて関数Fのコード
生成器が生成したコードは無効となる。このため、次に
関数Fが実行されるときには、データメンバXの新しい
値に基づいて関数Fのコード生成器が生成したコードが
実行される。
【0036】ランタイムコード生成器により生成された
マシンコードの最適化の中でも、コンパイル時に検出さ
れた最適化は、従来のコード最適化と同様に取り扱われ
る。コード生成時(すなわち、実行時)において検出さ
れた最適化は、ソースプログラムの中間表現を使用しな
いので、オプティマイザは、ランタイムコード生成器の
中に、確実に、コード化されるべきである。プリプロセ
ッサ(RPCC.EXE)2は、実行時最適化のためのコードを、
ローカルコンスタントプロパゲーション(局所定数伝
播)またはフォールディング(畳み込み)、強さの軽
減、冗長なコードの除去、および、必要な場合には、代
数的な簡略化のようにして、埋め込みを行う。また、プ
リプロセッサ2は、グローバルコンスタントプロパゲー
ション(大域的定数伝播)、完全なるループ展開、およ
び仮想関数のインライン展開のような、非自明の実行時
最適化を実現する。
マシンコードの最適化の中でも、コンパイル時に検出さ
れた最適化は、従来のコード最適化と同様に取り扱われ
る。コード生成時(すなわち、実行時)において検出さ
れた最適化は、ソースプログラムの中間表現を使用しな
いので、オプティマイザは、ランタイムコード生成器の
中に、確実に、コード化されるべきである。プリプロセ
ッサ(RPCC.EXE)2は、実行時最適化のためのコードを、
ローカルコンスタントプロパゲーション(局所定数伝
播)またはフォールディング(畳み込み)、強さの軽
減、冗長なコードの除去、および、必要な場合には、代
数的な簡略化のようにして、埋め込みを行う。また、プ
リプロセッサ2は、グローバルコンスタントプロパゲー
ション(大域的定数伝播)、完全なるループ展開、およ
び仮想関数のインライン展開のような、非自明の実行時
最適化を実現する。
【0037】次に、具体例について説明する。図4は、
グラフィックスオブジェクトのセットのクラスの例を表
している。この例においては、クラスobjectTableType
が、2つのprivateデータメンバであるcountとtableを
有している。tableは、コンストラクタとなっている。
また、このクラスは、addとintersect_allの2つのpubl
icメンバ関数を有している。
グラフィックスオブジェクトのセットのクラスの例を表
している。この例においては、クラスobjectTableType
が、2つのprivateデータメンバであるcountとtableを
有している。tableは、コンストラクタとなっている。
また、このクラスは、addとintersect_allの2つのpubl
icメンバ関数を有している。
【0038】もし、プログラマが、intersect_allがレ
ンダリング中に何回も実行されるという理由で、inters
ect_allの宣言の前に、実行時コード生成のために、キ
ーワードruntimeを挿入するものとすると、次のような
宣言が行われることになる。runtime const objectType
* intersect_all(rayType &, float &);
ンダリング中に何回も実行されるという理由で、inters
ect_allの宣言の前に、実行時コード生成のために、キ
ーワードruntimeを挿入するものとすると、次のような
宣言が行われることになる。runtime const objectType
* intersect_all(rayType &, float &);
【0039】このようにした場合、プリプロセッサ2
は、データメンバcountとtableが実行時定数であるもの
として、intersect_allのためのマシンコードを生成す
る。そして、データメンバcountとtableを変更するメン
バ関数addが引用されるとすると、その生成コードは無
効とされる。
は、データメンバcountとtableが実行時定数であるもの
として、intersect_allのためのマシンコードを生成す
る。そして、データメンバcountとtableを変更するメン
バ関数addが引用されるとすると、その生成コードは無
効とされる。
【0040】図5は、プリプロセッサ2への入力の例を
示している。そして、図6乃至図8は、このような入力
に対するプリプロセッサ2の出力の例を表している。プ
リプロセッサ2は、キーワードruntimeを有するメンバ
関数を処理し、C++における実行時コード生成器を生
成する。生成されたマシンコードルーチンに対するポイ
ンタは、データメンバとしてクラスに加えられ、コード
生成器がメンバ関数として加えられる。処理されたメン
バ関数は、必要に応じて、コード生成器を引用し、か
つ、生成されたコードを引用するコードフラグメント
(コードの小さな固まり)に置換される。
示している。そして、図6乃至図8は、このような入力
に対するプリプロセッサ2の出力の例を表している。プ
リプロセッサ2は、キーワードruntimeを有するメンバ
関数を処理し、C++における実行時コード生成器を生
成する。生成されたマシンコードルーチンに対するポイ
ンタは、データメンバとしてクラスに加えられ、コード
生成器がメンバ関数として加えられる。処理されたメン
バ関数は、必要に応じて、コード生成器を引用し、か
つ、生成されたコードを引用するコードフラグメント
(コードの小さな固まり)に置換される。
【0041】プリプロセッサ2は、また、デストラクタ
(〜(チルダ)A)において、および、生成されたマシ
ンコード中に埋め込まれたデータメンバを変更するメン
バ関数において、生成されたマシンコードを削除するコ
ードを挿入する。
(〜(チルダ)A)において、および、生成されたマシ
ンコード中に埋め込まれたデータメンバを変更するメン
バ関数において、生成されたマシンコードを削除するコ
ードを挿入する。
【0042】出力コード生成器は、C++上のものであ
るため、コード生成器自身(コード生成のためのルーチ
ンを、定数畳み込みをしながらインライン展開するこ
と)の最適化のほとんどが、C++コンパイラに任され
る。このことはまた、コード生成器の生成器の実装を単
純化する。
るため、コード生成器自身(コード生成のためのルーチ
ンを、定数畳み込みをしながらインライン展開するこ
と)の最適化のほとんどが、C++コンパイラに任され
る。このことはまた、コード生成器の生成器の実装を単
純化する。
【0043】プリプロセッサ2は、従来のコンパイラの
ような3つのフェーズを有している。これらのフェーズ
に使用されている中間表現のフォーマットは、実行時コ
ード生成器を生成するのに最適となるように設計されて
いる。条件演算子(&&,||,!,?:)と関数引用を除く
表現は、DAG(directed acyclic graphs)(向きのついた
辺を有するグラフのうちループのないもの)として表現
され、これは、C++表現の意味体系を保持する。DAG
を単純にたどると、シンボルテーブルにおいて、マーク
knownを使用して、言語の構造を、コンパイル時、コー
ド生成時、または実行時(execution time)(runtime
に生成されたコードが実行されるとき)に分類する。
ような3つのフェーズを有している。これらのフェーズ
に使用されている中間表現のフォーマットは、実行時コ
ード生成器を生成するのに最適となるように設計されて
いる。条件演算子(&&,||,!,?:)と関数引用を除く
表現は、DAG(directed acyclic graphs)(向きのついた
辺を有するグラフのうちループのないもの)として表現
され、これは、C++表現の意味体系を保持する。DAG
を単純にたどると、シンボルテーブルにおいて、マーク
knownを使用して、言語の構造を、コンパイル時、コー
ド生成時、または実行時(execution time)(runtime
に生成されたコードが実行されるとき)に分類する。
【0044】上記例の場合、ステップS3で設定される
関数Fには、クラスAの関数fが対応し、ステップS5
における関数Gには、クラスAの関数setbが対応する。
関数Fには、クラスAの関数fが対応し、ステップS5
における関数Gには、クラスAの関数setbが対応する。
【0045】次に、上記処理による評価について説明す
る。単精度の浮動小数点のマトリックス乗算器について
最初のテストを行った。この乗算法は、クラスVectorの
内積として実装された。マトリックスが少ない場合、実
行時最適化の余地がある。図9と図10は、これらの実
行時間を表している。図9においては、エレメントの9
0%が0である。全てのエレメントが実行時に決定され
る。図9におけるoriginalプログラムは、コンパイラ3
だけによりコンパイルされたものであり、optimizedプ
ログラムは、プリプロセッサ2とコンパイラ3により処
理された特性を表している。optimizedプログラムは、
マトリックスが充分大きい場合、高速となる。マトリッ
クスサイズが240×240である場合、スピードアッ
プ比は、約2.3となる。その分岐点は、約60×60
である。これは、かなり低いコード生成コストを示して
いる。optimizedプログラムにおける非0エレメントの
コードフラグメントは、originalプログラムにおける各
エレメントのコードフラグメントと非常に近似している
ので、スピードアップは殆ど実行時最適化に依存してい
る。生成されたコードを見ると、支配的な最適化は、実
行時定数畳み込みとループ展開を組み合わせたものであ
る。
る。単精度の浮動小数点のマトリックス乗算器について
最初のテストを行った。この乗算法は、クラスVectorの
内積として実装された。マトリックスが少ない場合、実
行時最適化の余地がある。図9と図10は、これらの実
行時間を表している。図9においては、エレメントの9
0%が0である。全てのエレメントが実行時に決定され
る。図9におけるoriginalプログラムは、コンパイラ3
だけによりコンパイルされたものであり、optimizedプ
ログラムは、プリプロセッサ2とコンパイラ3により処
理された特性を表している。optimizedプログラムは、
マトリックスが充分大きい場合、高速となる。マトリッ
クスサイズが240×240である場合、スピードアッ
プ比は、約2.3となる。その分岐点は、約60×60
である。これは、かなり低いコード生成コストを示して
いる。optimizedプログラムにおける非0エレメントの
コードフラグメントは、originalプログラムにおける各
エレメントのコードフラグメントと非常に近似している
ので、スピードアップは殆ど実行時最適化に依存してい
る。生成されたコードを見ると、支配的な最適化は、実
行時定数畳み込みとループ展開を組み合わせたものであ
る。
【0046】図10のグラフにおいては、マトリックス
は密である(どの要素も0ではない)。
は密である(どの要素も0ではない)。
【0047】この場合、optimizedプログラムは、僅か
にoriginalプログラムより下に位置する。これは、コー
ド生成コストによるものである。
にoriginalプログラムより下に位置する。これは、コー
ド生成コストによるものである。
【0048】図11は、他のテストの結果を表してい
る。最初のプログラムは、レイトレーサ(レイトレース
を実行するプログラム)であり、これは、実行時にシー
ンファイルを読み出し、画像を出力表示するものであ
る。このスピードアップは、殆ど仮想メンバ関数の決定
とインライン展開の組み合わせに依存している。第2番
目のプログラムは、箱詰めパズルを解くプログラムであ
る。
る。最初のプログラムは、レイトレーサ(レイトレース
を実行するプログラム)であり、これは、実行時にシー
ンファイルを読み出し、画像を出力表示するものであ
る。このスピードアップは、殆ど仮想メンバ関数の決定
とインライン展開の組み合わせに依存している。第2番
目のプログラムは、箱詰めパズルを解くプログラムであ
る。
【0049】これは、ボックスとピースを記述し、解決
策をプリントするパズル定義ファイルを読み出すもので
ある。実行時コード生成は、クラスPieceのメンバ関数p
utに適用された。そのインスタンス変数は、ピースの形
状を表現し、かつ、実行時定数である。スピードアップ
は、殆どループアンローリングとコンスタントフォール
ディングによって決定されている。第3のプログラム
は、実行時にパラメータが与えられる微分方程式の数値
積分器である。そのスピードアップは、殆ど実行時コン
スタントフォールディングによっている。
策をプリントするパズル定義ファイルを読み出すもので
ある。実行時コード生成は、クラスPieceのメンバ関数p
utに適用された。そのインスタンス変数は、ピースの形
状を表現し、かつ、実行時定数である。スピードアップ
は、殆どループアンローリングとコンスタントフォール
ディングによって決定されている。第3のプログラム
は、実行時にパラメータが与えられる微分方程式の数値
積分器である。そのスピードアップは、殆ど実行時コン
スタントフォールディングによっている。
【0050】なお、上記したような処理を行うコンピュ
ータプログラムをユーザに伝送する伝送媒体としては、
磁気ディスク、CD-ROM、固体メモリなどの記録媒体の
他、ネットワーク、衛星などの通信媒体を利用すること
ができる。
ータプログラムをユーザに伝送する伝送媒体としては、
磁気ディスク、CD-ROM、固体メモリなどの記録媒体の
他、ネットワーク、衛星などの通信媒体を利用すること
ができる。
【0051】
【発明の効果】以上の如く、請求項1に記載の演算方
法、請求項4に記載の伝送媒体、および請求項5に記載
の演算装置によれば、第1のデータメンバのクラスにお
いてのみ使用されるか、または、変更される第2のデー
タメンバを変更せずに使用しているデータメンバを、第
3のデータメンバとして、実行時最適化対象とするとと
もに、第2のデータメンバを変更して使用している第4
のデータメンバに、実行時最適化処理時に生成されるマ
シンコードを無効にするコードを挿入するようにしたの
で、変数を変更した場合にも最適化処理を実行すること
が可能となる。
法、請求項4に記載の伝送媒体、および請求項5に記載
の演算装置によれば、第1のデータメンバのクラスにお
いてのみ使用されるか、または、変更される第2のデー
タメンバを変更せずに使用しているデータメンバを、第
3のデータメンバとして、実行時最適化対象とするとと
もに、第2のデータメンバを変更して使用している第4
のデータメンバに、実行時最適化処理時に生成されるマ
シンコードを無効にするコードを挿入するようにしたの
で、変数を変更した場合にも最適化処理を実行すること
が可能となる。
【図1】本発明を適用した演算装置の構成例を示すブロ
ック図である。
ック図である。
【図2】図1の演算装置の動作を説明するフローチャー
トである。
トである。
【図3】図2のステップS2のより詳細な処理を説明す
るフローチャートである。
るフローチャートである。
【図4】クラスの例を説明する図である。
【図5】図1のプリプロセッサ2の入力を説明する図で
ある。
ある。
【図6】図1のプリプロセッサ2の出力を説明する図で
ある。
ある。
【図7】図1のプリプロセッサ2の出力を説明する図で
ある。
ある。
【図8】図1のプリプロセッサ2の出力を説明する図で
ある。
ある。
【図9】マトリックス乗算の特性を説明する図である。
【図10】マトリックス乗算の特性を説明する図であ
る。
る。
【図11】他の評価例を示す図である。
【図12】通常のソースプログラムをコンパイルし、実
行する場合のプロセスを示す図である。
行する場合のプロセスを示す図である。
【図13】実行時最適化を行うプログラムをコンパイル
し、実行する場合のプロセスを示す図である。
し、実行する場合のプロセスを示す図である。
1,2 プリプロセッサ, 3 コンパイラ
─────────────────────────────────────────────────────
【手続補正書】
【提出日】平成10年4月17日
【手続補正1】
【補正対象書類名】明細書
【補正対象項目名】0007
【補正方法】変更
【補正内容】
【0007】
【発明が解決しようとする課題】しかしながら、従来の
実行時最適化方法においては、コード生成器の呼び出
し、生成したコードの呼び出し、コードの無効化の処理
をプログラムが行わなければならないという課題があっ
た。また、前発明においては、オブジェクトのデータメ
ンバの値が変更される場合に、実行時最適化処理するこ
とができない課題があった。
実行時最適化方法においては、コード生成器の呼び出
し、生成したコードの呼び出し、コードの無効化の処理
をプログラムが行わなければならないという課題があっ
た。また、前発明においては、オブジェクトのデータメ
ンバの値が変更される場合に、実行時最適化処理するこ
とができない課題があった。
【手続補正2】
【補正対象書類名】明細書
【補正対象項目名】0015
【補正方法】変更
【補正内容】
【0015】本発明では、実行時最適化の対象をオブジ
ェクトのメソッド(例えば、オブジェクト指向型の言語
の1つであるC++ではメンバ関数)とする。オブジェ
クトの公開されないインスタンス変数(C++ではpr
ivateメンバ)のうち、オブジェクトの生成時を除
いてどのメソッドでも変更されないものは、オブジェク
ト指向型言語のカプセル化機能によってオブジェクトの
一生の間、その値が変化しないことが保証される。ま
た、公開されないインスタンス変数の値が変更されるな
ら、その場所は、そのオブジェクトのメソッド内に限定
される。
ェクトのメソッド(例えば、オブジェクト指向型の言語
の1つであるC++ではメンバ関数)とする。オブジェ
クトの公開されないインスタンス変数(C++ではpr
ivateメンバ)のうち、オブジェクトの生成時を除
いてどのメソッドでも変更されないものは、オブジェク
ト指向型言語のカプセル化機能によってオブジェクトの
一生の間、その値が変化しないことが保証される。ま
た、公開されないインスタンス変数の値が変更されるな
ら、その場所は、そのオブジェクトのメソッド内に限定
される。
【手続補正3】
【補正対象書類名】明細書
【補正対象項目名】0016
【補正方法】変更
【補正内容】
【0016】そこで、オブジェクトのインスタンスが生
成されるとき、あるいは、インスタンス変数の値が変更
されたとき、インスタンス変数についてメソッドを部分
計算(実行時最適化)し、その結果をマシンコードとし
てオブジェクトのデータと共に格納する。そして、メソ
ッドが呼ばれた(参照された)場合は、格納されている
マシンコードを実行することにより所望の処理を行うこ
とが可能となる。
成されるとき、あるいは、インスタンス変数の値が変更
されたとき、インスタンス変数についてメソッドを部分
計算(実行時最適化)し、その結果をマシンコードとし
てオブジェクトのデータと共に格納する。そして、メソ
ッドが呼ばれた(参照された)場合は、格納されている
マシンコードを実行することにより所望の処理を行うこ
とが可能となる。
【手続補正4】
【補正対象書類名】明細書
【補正対象項目名】0017
【補正方法】変更
【補正内容】
【0017】このように、部分計算の結果を関数ではな
くオブジェクトに結びつけたため、マシンコードの生成
のタイミングを自動的に判定できる。
くオブジェクトに結びつけたため、マシンコードの生成
のタイミングを自動的に判定できる。
【手続補正5】
【補正対象書類名】明細書
【補正対象項目名】0019
【補正方法】削除
【手続補正6】
【補正対象書類名】明細書
【補正対象項目名】0023
【補正方法】変更
【補正内容】
【0023】コンパイル時においては、ソースプログラ
ム中のプリプロセッサ命令が最初に処理される。プリプ
ロセッサ(RPCC.EXE)2は、プログラムを、コード生成器
を埋め込むように、それらを呼び出すコードを挿入する
ように、そして、発生されたコードを呼び出しまたは無
効にするように、プログラムを書き換える。プリプロセ
ッサ2の出力は、コンパイラ3により、実行可能なファ
イルにコンパイルされる。ソースプログラムとその中間
表現は、このコンパイル時においてのみ不正に処理され
る。
ム中のプリプロセッサ命令が最初に処理される。プリプ
ロセッサ(RPCC.EXE)2は、プログラムを、コード生成器
を埋め込むように、それらを呼び出すコードを挿入する
ように、そして、発生されたコードを呼び出しまたは無
効にするように、プログラムを書き換える。プリプロセ
ッサ2の出力は、コンパイラ3により、実行可能なファ
イルにコンパイルされる。ソースプログラムとその中間
表現は、このコンパイル時においてのみ不正に処理され
る。
【手続補正7】
【補正対象書類名】明細書
【補正対象項目名】0024
【補正方法】変更
【補正内容】
【0024】実行時においては、コード生成器がパラメ
ータとしての実行時定数により呼び出される。各コード
生成器は、1つのメンバ関数に特有のものである。1つ
のコード生成器は、実行時定数の異なる値を有する複数
のマシンコードルーチンを生成する。このようにして生
成されたルーチンは、固定的にコンパイルされたものよ
り、より効果的であることが期待され、必要に応じて参
照される。
ータとしての実行時定数により呼び出される。各コード
生成器は、1つのメンバ関数に特有のものである。1つ
のコード生成器は、実行時定数の異なる値を有する複数
のマシンコードルーチンを生成する。このようにして生
成されたルーチンは、固定的にコンパイルされたものよ
り、より効果的であることが期待され、必要に応じて参
照される。
【手続補正8】
【補正対象書類名】明細書
【補正対象項目名】0026
【補正方法】変更
【補正内容】
【0026】すなわち、プログラマは、実行時最適化処
理の対象とする関数をruntimeで特定し、対象としない
データメンバをdynamicで特定することができる。
理の対象とする関数をruntimeで特定し、対象としない
データメンバをdynamicで特定することができる。
【手続補正9】
【補正対象書類名】明細書
【補正対象項目名】0037
【補正方法】変更
【補正内容】
【0037】次に、具体例について説明する。図4は、
グラフィックスオブジェクトのセットのクラスの例を表
している。この例においては、クラスobjectTableType
が、2つのprivateデータメンバであるcountとtableを
有している。objectTableType()は、コンストラクタと
なっている。また、このクラスは、addとintersect_all
の2つのpublicメンバ関数を有している。
グラフィックスオブジェクトのセットのクラスの例を表
している。この例においては、クラスobjectTableType
が、2つのprivateデータメンバであるcountとtableを
有している。objectTableType()は、コンストラクタと
なっている。また、このクラスは、addとintersect_all
の2つのpublicメンバ関数を有している。
【手続補正10】
【補正対象書類名】明細書
【補正対象項目名】0039
【補正方法】変更
【補正内容】
【0039】このようにした場合、プリプロセッサ2
は、データメンバcountとtableが実行時定数であるもの
として、intersect_allのためのマシンコードを生成す
る。そして、データメンバcountとtableを変更するメン
バ関数addが呼び出されるとすると、その生成コードは
無効とされる。
は、データメンバcountとtableが実行時定数であるもの
として、intersect_allのためのマシンコードを生成す
る。そして、データメンバcountとtableを変更するメン
バ関数addが呼び出されるとすると、その生成コードは
無効とされる。
【手続補正11】
【補正対象書類名】明細書
【補正対象項目名】0040
【補正方法】変更
【補正内容】
【0040】図5は、プリプロセッサ2への入力の例を
示している。そして、図6乃至図8は、このような入力
に対するプリプロセッサ2の出力の例を表している。プ
リプロセッサ2は、キーワードruntimeを有するメンバ
関数を処理し、C++における実行時コード生成器を生
成する。生成されたマシンコードルーチンに対するポイ
ンタは、データメンバとしてクラスに加えられ、コード
生成器がメンバ関数として加えられる。処理されたメン
バ関数は、必要に応じて、コード生成器を呼び出し、か
つ、生成されたコードを呼び出すコードフラグメント
(コードの小さな固まり)に置換される。
示している。そして、図6乃至図8は、このような入力
に対するプリプロセッサ2の出力の例を表している。プ
リプロセッサ2は、キーワードruntimeを有するメンバ
関数を処理し、C++における実行時コード生成器を生
成する。生成されたマシンコードルーチンに対するポイ
ンタは、データメンバとしてクラスに加えられ、コード
生成器がメンバ関数として加えられる。処理されたメン
バ関数は、必要に応じて、コード生成器を呼び出し、か
つ、生成されたコードを呼び出すコードフラグメント
(コードの小さな固まり)に置換される。
【手続補正12】
【補正対象書類名】明細書
【補正対象項目名】0045
【補正方法】変更
【補正内容】
【0045】次に、上記処理による評価について説明す
る。単精度の浮動小数点のマトリックス乗算器について
最初のテストを行った。この乗算法は、クラスVectorの
内積として実装された。マトリックスが疎である場合、
実行時最適化の余地がある。図9と図10は、これらの
実行時間を表している。図9においては、エレメントの
90%が0である。全てのエレメントが実行時に決定さ
れる。図9におけるoriginalプログラムは、コンパイラ
3だけによりコンパイルされたものであり、optimized
プログラムは、プリプロセッサ2とコンパイラ3により
処理された特性を表している。optimizedプログラム
は、マトリックスが充分大きい場合、高速となる。マト
リックスサイズが240×240である場合、スピード
アップ比は、約2.3となる。その分岐点は、約60×
60である。これは、かなり低いコード生成コストを示
している。optimizedプログラムにおける非0エレメン
トのコードフラグメントは、originalプログラムにおけ
る各エレメントのコードフラグメントと非常に近似して
いるので、スピードアップは殆ど実行時最適化に依存し
ている。生成されたコードを見ると、支配的な最適化
は、実行時定数畳み込みとループ展開を組み合わせたも
のである。
る。単精度の浮動小数点のマトリックス乗算器について
最初のテストを行った。この乗算法は、クラスVectorの
内積として実装された。マトリックスが疎である場合、
実行時最適化の余地がある。図9と図10は、これらの
実行時間を表している。図9においては、エレメントの
90%が0である。全てのエレメントが実行時に決定さ
れる。図9におけるoriginalプログラムは、コンパイラ
3だけによりコンパイルされたものであり、optimized
プログラムは、プリプロセッサ2とコンパイラ3により
処理された特性を表している。optimizedプログラム
は、マトリックスが充分大きい場合、高速となる。マト
リックスサイズが240×240である場合、スピード
アップ比は、約2.3となる。その分岐点は、約60×
60である。これは、かなり低いコード生成コストを示
している。optimizedプログラムにおける非0エレメン
トのコードフラグメントは、originalプログラムにおけ
る各エレメントのコードフラグメントと非常に近似して
いるので、スピードアップは殆ど実行時最適化に依存し
ている。生成されたコードを見ると、支配的な最適化
は、実行時定数畳み込みとループ展開を組み合わせたも
のである。
【手続補正13】
【補正対象書類名】明細書
【補正対象項目名】0049
【補正方法】変更
【補正内容】
【0049】これは、ボックスとピースを記述したパズ
ル定義ファイルを読み出し、解をプリントするものであ
る。実行時コード生成は、クラスPieceのメンバ関数put
に適用された。そのインスタンス変数は、ピースの形状
を表現し、かつ、実行時定数である。スピードアップ
は、殆どループアンローリングとコンスタントフォール
ディングによって決定されている。第3のプログラム
は、実行時にパラメータが与えられる微分方程式の数値
積分器である。そのスピードアップは、殆ど実行時コン
スタントフォールディングによっている。
ル定義ファイルを読み出し、解をプリントするものであ
る。実行時コード生成は、クラスPieceのメンバ関数put
に適用された。そのインスタンス変数は、ピースの形状
を表現し、かつ、実行時定数である。スピードアップ
は、殆どループアンローリングとコンスタントフォール
ディングによって決定されている。第3のプログラム
は、実行時にパラメータが与えられる微分方程式の数値
積分器である。そのスピードアップは、殆ど実行時コン
スタントフォールディングによっている。
Claims (5)
- 【請求項1】 オブジェクト指向言語の実行時最適化の
演算を行う演算方法において、 変化の少ない第1のデータメンバのうち、前記第1のデ
ータメンバのクラスにおいてのみ使用されるか、また
は、変更される第2のデータメンバを検索する検索ステ
ップと、 前記第2のデータメンバを変更せずに使用しているデー
タメンバを検索し、前記実行時最適化対象の第3のデー
タメンバとして決定する決定ステップと、 前記第2のデータメンバを変更して使用している第4の
データメンバを検索し、前記第4のデータメンバに、前
記実行時最適化処理時に生成されるマシンコードを無効
にするコードを挿入する挿入ステップとを備えることを
特徴とする演算方法。 - 【請求項2】 前記第1のデータメンバに所定のマーク
を付加する付加ステップをさらに備え、 前記検索ステップでは、前記マークが付加された前記第
1のデータメンバから前記第2のデータメンバが検索さ
れることを特徴とする請求項1に記載の演算方法。 - 【請求項3】 前記検索ステップは、 前記マークが付加された前記第1のデータメンバのアド
レスが、メンバ関数によって取得されるとき、前記マー
クを消去する第1の消去ステップと、 前記マークが付加された前記第1のデータメンバのアド
レスが、直接または間接に、変数、引数、または戻り値
として渡されるとき、前記マークを消去する第2の消去
ステップと、 前記マークが付加された前記第1のデータメンバのアド
レスが渡された先のデータメンバの型が、constである
データメンバへのポインタまたは参照でないとき、前記
マークを消去する第3の消去ステップとを備えることを
特徴とする請求項2に記載の演算方法。 - 【請求項4】 オブジェクト指向言語の実行時最適化の
演算を行う演算方法に用いるコンピュータプログラムで
あって、 変化の少ない第1のデータメンバのうち、前記第1のデ
ータメンバのクラスにおいてのみ使用されるか、また
は、変更される第2のデータメンバを検索する検索ステ
ップと、 前記第2のデータメンバを変更せずに使用しているデー
タメンバを検索し、前記実行時最適化対象の第3のデー
タメンバとして決定する決定ステップと、 前記第2のデータメンバを変更して使用している第4の
データメンバを検索し、前記第4のデータメンバに、前
記実行時最適化処理時に生成されるマシンコードを無効
にするコードを挿入する挿入ステップとを備えるコンピ
ュータプログラムを伝送することを特徴とする伝送媒
体。 - 【請求項5】 オブジェクト指向言語の実行時最適化の
演算を行う演算装置において、 変化の少ない第1のデータメンバのうち、前記第1のデ
ータメンバのクラスにおいてのみ使用されるか、また
は、変更される第2のデータメンバを検索する検索手段
と、 前記第2のデータメンバを変更せずに使用しているデー
タメンバを検索し、前記実行時最適化対象の第3のデー
タメンバとして決定する決定手段と、 前記第2のデータメンバを変更して使用している第4の
データメンバを検索し、前記第4のデータメンバに、前
記実行時最適化処理時に生成されるマシンコードを無効
にするコードを挿入する挿入手段とを備えることを特徴
とする演算装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP32263597A JPH11154094A (ja) | 1997-11-25 | 1997-11-25 | 演算方法および装置、並びに伝送媒体 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP32263597A JPH11154094A (ja) | 1997-11-25 | 1997-11-25 | 演算方法および装置、並びに伝送媒体 |
Publications (1)
Publication Number | Publication Date |
---|---|
JPH11154094A true JPH11154094A (ja) | 1999-06-08 |
Family
ID=18145918
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP32263597A Abandoned JPH11154094A (ja) | 1997-11-25 | 1997-11-25 | 演算方法および装置、並びに伝送媒体 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JPH11154094A (ja) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2013228845A (ja) * | 2012-04-25 | 2013-11-07 | Internatl Business Mach Corp <Ibm> | コードを投機的に最適化するための方法、並びにそのコンピュータ及びコンピュータ・プログラム |
-
1997
- 1997-11-25 JP JP32263597A patent/JPH11154094A/ja not_active Abandoned
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2013228845A (ja) * | 2012-04-25 | 2013-11-07 | Internatl Business Mach Corp <Ibm> | コードを投機的に最適化するための方法、並びにそのコンピュータ及びコンピュータ・プログラム |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR100624248B1 (ko) | 어레이 정적 초기화 방법, 데이터 처리 시스템에서의 방법, 데이터 처리 시스템 및 컴퓨터 판독 가능한 매체 | |
US7571427B2 (en) | Methods for comparing versions of a program | |
JP2637914B2 (ja) | テスト・プログラム・ジェネレータ及びテスト・プログラムを生成する方法 | |
US4656583A (en) | Method for improving global common subexpression elimination and code motion in an optimizing compiler | |
US7725883B1 (en) | Program interpreter | |
US6314560B1 (en) | Method and apparatus for a translation system that aggressively optimizes and preserves full synchronous exception state | |
US8453128B2 (en) | Method and system for implementing a just-in-time compiler | |
US6968541B1 (en) | Apparatus and method for template instantiation with a cross compiler | |
US7823140B2 (en) | Java bytecode translation method and Java interpreter performing the same | |
KR19980080502A (ko) | 템플릿 오브젝트 파일들을 최적화하기 위한 시스템과 방법 | |
Brady et al. | Scrapping your inefficient engine: using partial evaluation to improve domain-specific language implementation | |
Griss et al. | PSL: a portable Lisp system | |
Plevyak et al. | Type directed cloning for object-oriented programs | |
CN116934330A (zh) | 一种调用智能合约的方法及执行方法、计算机设备及存储介质 | |
CN112631656A (zh) | 一种基于源代码的智能合约优化方法及装置 | |
JP5129904B2 (ja) | 実行時における関数の実行性能を増大させるための方法、計算機システム、実行時における関数の実行性能を増大させるための、コンピュータプログラムを格納するコンピュータ読み取り可能媒体 | |
Altenbernd et al. | Automatic Generation of Timing Models for Timing Analysis of High-Level Code. | |
US8010955B2 (en) | Reducing the run-time cost of incorporating custom tags in a server page | |
JPH11154094A (ja) | 演算方法および装置、並びに伝送媒体 | |
Wick | Automatic generation of assemblers. | |
Fujinami | Automatic run-time code generation in C++ | |
US20240012624A1 (en) | Non-transitory computer-readable storage medium with executable development program stored thereon, information processing system, information processing apparatus, and information processing method | |
US20240012625A1 (en) | Non-transitory computer-readable storage medium with executable development program stored thereon, information processing system, information processing apparatus, and information processing method | |
US7565646B2 (en) | Method for compression of object code interpreted by tree-structured expression factorization | |
Padaryan et al. | On the Representation of Results of Binary Code Reverse Engineering |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20040422 |
|
A977 | Report on retrieval |
Effective date: 20060925 Free format text: JAPANESE INTERMEDIATE CODE: A971007 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20060928 |
|
A762 | Written abandonment of application |
Free format text: JAPANESE INTERMEDIATE CODE: A762 Effective date: 20061113 |