JP3604936B2 - 最適化方法,最適化装置及び記録媒体 - Google Patents
最適化方法,最適化装置及び記録媒体 Download PDFInfo
- Publication number
- JP3604936B2 JP3604936B2 JP00911899A JP911899A JP3604936B2 JP 3604936 B2 JP3604936 B2 JP 3604936B2 JP 00911899 A JP00911899 A JP 00911899A JP 911899 A JP911899 A JP 911899A JP 3604936 B2 JP3604936 B2 JP 3604936B2
- Authority
- JP
- Japan
- Prior art keywords
- module
- program
- inter
- optimization
- function
- 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 - Fee Related
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Description
【発明の属する技術分野】
本発明は、プログラムを構成するモジュールをプログラムの実行時にリンクするプログラミングを作成可能なプログラミング言語の最適化方法,最適化装置及び記録媒体に係り、特に、モジュール間にまたがる情報を利用して最適化を施すに好適な最適化方法,最適化装置及び記録媒体に関する。
【0002】
【従来の技術】
オブジェクト指向プログラミング言語などでは、プログラムを構成するモジュールをプログラムの実行時にリンクすることがある。モジュールに、プログラムの実行を開始する前にモジュール間最適化を施す方法としては、例えば、「Proceedings of the SIGPLAN ’86 Symposium on Compiler Construction,”Interprocedual Optimization: Eliminating Unnecessary Recompilation”,(1986年6月),K. D. Cooper, K. Kenedy and L. Torczon, pp.58−67」に記載されたコンパイラを用いる方法が知られている。
【0003】
しかしながら、このコンパイラを用いて、プログラムの実行開始前にモジュール間最適化を行った後、モジュールの内容に変更が加えられた場合、コンパイル時にモジュール間最適化を実行するとき参照したモジュールの内容と、プログラムの実行時に実際にリンクしたモジュールの内容が異なるため、プログラムの正確な実行が行えず、正確な実行結果が得られなくなるという問題があった。即ち、従来のコンパイラでは、プログラムの実行時にリンクされるモジュールを構成する関数に、最適化後のモジュールの変更を考慮してモジュール間最適化を施すことができないという問題があった。
【0004】
このようなモジュールの変更に対処して、プログラムの実行時にリンクされるモジュールについて、モジュール間最適化を施せる最適化方法としては、例えば、「Proceedings of OOPSLA 94, ”Third−Generation SELF Implementation: Reconciling Responsiveness with Performance”,(1994年10月23−27日),Urs Hoelzle and David Ungar,pp.229−243」に記載されている動的コンパイラが知られている。動的コンパイラとは、プログラムの実行中にプログラムをコンパイルするコンパイラである。動的コンパイラでは、プログラムの実行中に、モジュールがプログラムにリンクされてからモジュール間最適化を施すため、コンパイル以前にモジュールの変更がなされていても、その変更の影響なく、プログラムの正確な実行が行えるものである。
【0005】
【発明が解決しようとする課題】
しかしながら、動的コンパイラは、プログラムの実行中にプログラムをコンパイルするために、時間を要するので、プログラムの実行速度が遅くなるという問題があった。
【0006】
本発明の目的は、プログラムの実行速度を速くでき、しかも、プログラム実行前にコンパイルしても、プログラム実行時に問題の生じないモジュール間最適化方法,モジュール間最適化装置及び記録媒体を提供することにある。
【0007】
【課題を解決するための手段】
上記目的を達成するために、本発明は、プログラムpの実行中に、このプログラムpとリンクされるモジュールaを構成する関数fに、プロセッサが、上記プログラムpの実行を開始する前にモジュール間最適化を施す最適化方法において、上記プログラムpに上記モジュールaと共にリンクされるモジュールの内容のうち、上記関数fにモジュール間最適化を施すために必要な内容Mを上記プロセッサが予測し、予測した内容Mを用いて、上記関数fにモジュール間最適化を施した関数f’を含むモジュール間最適化済みモジュールと、モジュール間最適化に用いた内容Mを特定するための予測モジュール情報Iを上記プロセッサが生成するようにしたものである。
かかる方法により、プログラムの実行を開始する前にプログラムをコンパイルすることで、プログラムの実行中にプログラムをコンパイルするために時間を割くことを止め、プログラムの実行の高速化を図ることができ、また、プログラムの実行時には、情報Iを用いて、プログラムが実行時にリンクするモジュールの内容を監視して、プログラムの実行時にモジュールaとモジュール間最適化時に参照したのと同一の内容をもつモジュール群がリンクされた場合には、関数fにモジュール間最適化を施した関数f’を利用することでプログラムの実行の高速化を図ることが可能になり、なおかつ、モジュールaとモジュール間最適化時に参照したのとは異なる内容をもつモジュール群がリンクされた場合には、誤った予測に基づいて最適化を施した関数f’がプログラムにリンクされることがなくなり、問題が起きないものとなる。
【0008】
【発明の実施の形態】
以下、図1〜図19を用いて、本発明の一実施形態による最適化方法について説明する。
最初に、図1を用いて、本実施形態による最適化方法を適用する計算機システムの構成について説明する。
【0009】
本実施形態による計算機システムは、コンパイラやインタプリタのような言語処理系のプログラムが動作するものである。計算機システムは、プロセッサ10と、主記憶20と、ディスク装置30と、媒体駆動装置40とから構成されており、これらは、バス50によって接続されている。
【0010】
ディスク装置40に記憶されている言語処理系のプログラムは、バス50を介して、主記憶20に取り込まれ、プロセッサ10によって実行される。また、言語処理系のプログラムが記憶された記憶媒体42からは、媒体駆動装置40によってその記憶内容であるプログラムが読み出され、ディスク装置30に格納される。ここで、記憶媒体42としては、CD−ROM、DVD−ROM、フロッピーディスク(FD)等が用いられる。
【0011】
次に、図2を用いて、本実施形態によるディスク装置に記憶されているコンパイラとリンカを含む言語処理系の構成について説明する。
本実施形態による処理系では、コンパイラ100は、ソースモジュール210をコンパイルし、モジュール間最適化済みオブジェクトモジュール220と、予測モジュール情報230を生成する。予測モジュール情報230は、コンパイラ100がソースモジュール210を構成する関数にモジュール間最適化を施すにあたり、ソースモジュール210がプログラムの実行時に、どのような内容をもつモジュールとリンクされると予測したかを表わす情報である。
なお、コンパイラ100の詳細については、図3を用いて後述する。また、予測モジュール情報230の詳細については、図12及び図13を用いて後述する。
なお、コンパイラ100への入力は、ソースモジュール210の代わりに、中間コードのモジュールや、オブジェクトモジュールであってもよいものである。
【0012】
プログラム400は、実行時にリンカ300を呼び出し、ソースモジュール210をプログラム400にリンクするよう要求する。リンカ300は、プログラム400に要求されたソースモジュール210をプログラム400にリンクし、リンク済ソースモジュール一覧表240に登録する。リンカ300は、さらに、予測モジュール情報230を参照し、可能であるときにはソースモジュールの代わりに、モジュール間最適化済みオブジェクトモジュール220中の関数をリンクすることで、プログラムの実行の高速化を図る。リンクは、モジュール中の関数を、リンクテーブル250に登録することでおこなう。なお、リンカ300の詳細については、図14を用いて後述する。
【0013】
プログラム400は、リンクテーブルに登録された関数がモジュール間最適化済みオブジェクトモジュール220中のものである場合、プログラム中の関数を、プロセッサ10で直接実行する。これによって、すでにコンパイラ110によって最適化済みのモジュールを使用できるので、プログラムの実行を高速で行うことができる。
一方、リンクテーブルに登録された関数がソースモジュール210中のものである場合、そのままプログラムを実行すると誤った実行結果が得られて問題となるため、プログラム中の関数を、インタプリタ500で実行することにより問題が発生することを回避している。
【0014】
次に、図3を用いて、本実施形態による最適化方法に用いるコンパイラ100の構成について説明する。
コンパイラ100は、ソース解析部110と、最適化部120と、コード生成部130とを備えている。ソース解析部110は、ソースモジュール120を解析し、最適化部120は、解析したソースモジュールに対して、モジュール間最適化などの最適化を施し、コード生成部130は、モジュール間最適化済みオブジェクトモジュール220を生成する。
また、最適化部120は、モジュール間最適化部12と、モジュール予測部124とを備えている。モジュール間最適化部122は、モジュール予測部124が予測したソースモジュール210Aが、コンパイル中のソースモジュールとプログラムの実行時にリンクされるものとして、モジュール間最適化を実行すると共に、予測モジュール情報230を生成する。なお、モジュール間最適化部12の詳細処理内容については、図4を用いて後述し、モジュール予測部124の詳細処理内容については、図5を用いて後述する。
【0015】
次に、図4を用いて、本実施形態による最適化方法に用いるモジュール間最適化部122の処理内容について説明し、また、図5を用いて、本実施形態による最適化方法に用いるモジュール予測部124の処理内容について説明する。
図4は、本発明の一実施形態による最適化方法に用いるモジュール間最適化部の処理内容を示すフローチャートであり、図5は、本発明の一実施形態による最適化方法に用いるモジュール予測部の処理内容を示すフローチャートである。
【0016】
最初に、図4を用いて、本実施形態によるモジュール間最適化部122の処理内容について説明する。本実施形態においては、インライン展開というモジュール間最適化を実行するものである。なお、インライン展開以外のモジュール間最適化も、図4と同様の方法で実行できる。
【0017】
本実施形態においては、図3に示したソースモジュール210として、図6に示すモジュール(C)210を、図3に示したソースモジュール210Aとして、図7及び図8に示したモジュール(A)210A1,モジュール(B)210A2とコンパイルするものとし、特に、モジュール間最適化部122がソースモジュール(C)210中の関数「woo()」を最適化する過程を例にとって説明する。
図6,図7及び図8は、本発明の一実施形態による最適化方法によって最適化されるソースモジュールの一例の構成図である。
【0018】
図4のステップ1010において、モジュール間最適化部122は、集合Fを空にする。
次に、ステップ1020において、モジュール間最適化部122は、最適化対象の関数の中の文をすべて集合Fに収める。即ち、ステップ1010において、集合Fを空集合とした上で、ステップ1020において、文「return (foo());」を、集合Fに収める。
【0019】
次に、ステップ1030において、モジュール間最適化部122は、集合Fが空集合であるか否かを調べ、空集合であるならば最適化の処理を終了し、空集合でないならばステップ1040に進む。ここでは、文「return (foo());」が、集合Fに含まれているため、ステップ1040に進むものとする。
次に、ステップ1040において、モジュール間最適化部122は、集合Fから文を一つ取り出して文sとする。即ち、文「return (foo());」を、文sとする。
【0020】
次に、ステップ1050において、モジュール間最適化部122は、文sが関数呼出しかどうか判定し、関数呼出しでないならばステップ1030に戻り、関数呼出しであるならばステップ1060に進む。ここでは、文sが、関数呼出し「foo()」を含むことからステップ1060に進むものとする。
次に、ステップ1060において、モジュール間最適化部122は、文sが呼び出す関数の名前nを取得する。即ち、名前nとして、「n=foo」とする。
【0021】
次に、ステップ1070において、モジュール間最適化部122は、コンパイル中のモジュールが、名前がnの関数fを含むかどうか調べ、含むならばステップ1080に進み、含まないならばステップ1100に進む。ここでは、図6に示すソースモジュール(C)210は、関数「foo()」を含まないことから処理1100に進む。例えば、ソースモジュール(C)210の関数「woo()」の文が、「return (foo());」ではなく、「return (buz());」であるとすると、名前n=buzの関数「buz()」は、図6のソースモジュール(C)210に含まれるため、ステップ1080に進むことになる。ここでは、上述したように、ステップ1100に進むものとして説明を続け、ステップ1080以降の処理については後述する。
【0022】
次に、ステップ1100において、モジュール予測部124には、コンパイル中のモジュールとプログラムの実行時にリンクされ、名前がnの関数fを含むモジュールmを予測させる。モジュール予測部124を呼出して、foo()を含むソースモジュールを予測させる。すなわち、このステップ1100は、モジュール予測部124の処理であり、その詳細については、図5を用いて説明する。モジュール予測部124は、モジュール最適化部122からの依頼により、名前がnの関数fを含むソースモジュールを検索する。ここで、関数fは、コンパイル中のモジュールとプログラムの実行時にリンクされると予測されるものである。
図5のステップ1101において、モジュール予測部124は、集合Sを空集合とし、さらに、ステップ1102において、ユーザが指定したディレクトリにあるソースモジュールを全て集合Sに収める。即ち、モジュール予測部124は、集合Sを空集合とした後、ユーザが指定したディレクトリが、「/usr/classlib」であるとすれば、図6,図7,図8に示すように、この指定されたディレクトリ中には、3つのソースモジュール(A)210A1,(B)210A2,(C)210が存在するので、集合S={A,B,C}となる。
【0023】
次に、ステップ1103において、モジュール予測部124は、集合Sが空集合かどうか検証し、空集合であるならば、ステップ1107においてNULLを返戻して予測の処理を終了し、空集合でなければ、ステップ1104に進む。ここでは、集合S={A,B,C}であり、空集合でないので、ステップ1104に進むものとする。
次に、ステップ1104において、モジュール予測部124は、集合Sからソースモジュールを一つ取り出し、mとする。例えば、「m=A」とする。
【0024】
次に、ステップ1105において、モジュール予測部124は、ソースモジュールmが名前がnの関数fを含むか調べ、含むならばステップ1106に進んでソースモジュールmを返戻して予測の処理を終了し、含まないならばステップ1103に戻る。ここでは、ソースモジュール(A)210A1が関数「foo()」を含むことから、ステップ1106に進んで、ソースモジュール(A)210A1を返戻し、予測の処理を終了する。
【0025】
次に、図4のステップ1110に戻り、モジュール間最適化部122は、モジュールmの予測結果を調べ、適当なモジュールが見つからなかった(モジュール予測部124がNULLを返戻した)場合にはステップ1030に戻り、見つかった場合にはステップ1120に進む。ここでは、図5のステップ1106において、適当なモジュールとして、ソースモジュール(A)210A1が見つかったので、ステップ1120に進むものとする。
【0026】
次に、ステップ1120において、モジュール間最適化部122は、関数fがインライン展開の対象として適当か調べる。ここで、インライン展開の対象として適当である場合とは、例えば、図7に示す関数「foo()」のように行数が少なく、例えば、関数fの行数が10行以下の場合や、C++.言語で記述されているプログラムの場合にインライン展開するようプログラム上明記されている場合等である。これら以外の場合には、インライン展開の対象として適当でないと判断する。なお、判断基準は、任意に決められるものである。そして、適当でなかった場合にはステップ1030に戻り、適当である場合にはステップ1130に進む。ここでは、ソースモジュール(A)210Aを構成する関数「foo()」は、「return(1);」の1行だけであるので、インライン展開の対象として適当であると判断されるものとする。
【0027】
次に、ステップ1130において、モジュール間最適化部122は、文sに関数fの内容を展開する。図6に示した文「int woo(){return (foo);}」に、図7に示した関数「foo()」の内容である「return(1);」を展開すると、図9に示すプログラムのようになる。
【0028】
同様の処理により、図6に示したソースモジュール(C)210のもう一つの文である「int buz(){return (boo);}」に、図8に示した関数「boo()」の内容である「return(foo());」を展開すると、図10に示すようになる。この状態では、まだ、関数「foo()」を含んでいるため、さらに、処理を繰り返して、図7に示した関数「foo()」の内容である「return(1);」を展開すると、図11に示すプログラムようになる。
図9,図10及び図11は、本発明の一実施形態による最適化方法によって最適化されたソースモジュールの例図である。
【0029】
次に、図4に戻り、ステップ1140において、モジュール間最適化部122は、モジュールmを予測モジュール情報230に書き出した上で、ステップ1030に戻る。
【0030】
ここで、図12を用いて、本実施形態による最適化方法に用いる予測情報230の一例について説明する。
予測モジュール情報230は、モジュール内の関数ごとに、関数にモジュール間最適化を施すにあたって参照したソースモジュールに関する情報を有している。このため、予測モジュール情報230は、関数名231と、モジュール名232と、ファイル名233と、ファイル作成日時234と、ファイルサイズ1205から構成されている。
【0031】
ソースモジュール(C)210中の関数「woo()」を、図9に示すコードにまで最適化する間に、ソースモジュール(A)210A1中の関数「foo()」を参照していることから、ソースモジュール(C)210中の関数「woo()」をコンパイルするにあたって作成した予測モジュール情報は、モジュール名232が「A」となる。
【0032】
また、ソースモジュール(C)210中の関数「buz()」を、図11に示すコードにまで最適化する間に、ソースモジュール(B)210A2中の関数「boo()」と、ソースモジュール(A)210A1中の関数「foo()」を参照していることから、ソースモジュール(C)210中の関数「buz()」をコンパイルするにあたって作成した予測モジュール情報は、モジュール名232が「A」と「B」となる。
【0033】
リンカ300は、これらの情報を利用して、コンパイラ100がプログラムにリンクされると予測したソースモジュール210の内容と、プログラムの実行中に実際にプログラムにリンクされたソースモジュールの内容が一致するか検証する。例えば、ソースモジュールの内容を比較した際、ファイル作成日時234やファイルサイズ235が異なっている場合には、ソースモジュールが一致していないと検証できる。
【0034】
ここで、図13を用いて、本実施形態による最適化方法に用いる予測情報230Aの他の例について説明する。
予測モジュール情報230Aは、ソースモジュール(C)にモジュール間最適化を施すにあたって参照したソースモジュール210Aを記録したデータである。予測モジュール情報230Aは、ソースモジュール(C)を最適化するにあたって、ソースモジュール(A)とソースモジュール(B)を参照したことを表わし、モジュール名232と、ソースモジュールのファイル名233と、ファイル作成日時234と、ファイルサイズ235との情報を有している。即ち、図12の例と比較するように、関数名231を持たないようにすることもできる。
【0035】
ここで、図13に示す形式の予測モジュール情報230Aでは、リンカ300は、モジュール単位でしかプログラムにモジュール間最適化済みオブジェクトモジュール220をリンクできない。それに対して、図12に示す形式の予測モジュール情報230では、リンカ300は、モジュール中の個々の関数単位でプログラムにモジュール間最適化済みオブジェクトモジュール220をリンクできる。
【0036】
例えば、プログラムにソースモジュール(A),(B),(C)がリンクされており、ソースモジュール(C)の予測モジュール情報が図13に示すものであるとし、さらに、プログラムにリンクされているソースモジュール(A),(B)について、ソースモジュール(A)が図13の予測モジュール情報230Aに記載のあるとおりのものであるのに対し、ソースモジュール(B)が図13の予測モジュール情報230Aに記載のあるものとは異なるとする。このとき、リンカ300は、ソースモジュール(B)として予測とは異なるモジュールがリンクされているために、ソースモジュール(C)に対応するモジュール間最適化済みオブジェクトモジュールC’の全体をプログラムにリンクできなくなる。これに対し、もし、ソースモジュール(C)の予測モジュール情報230が、図12に示すものであったならば、モジュール間最適化済みオブジェクトモジュールC’の中の関数「woo()}を最適化したときには、ソースモジュール(A)しか参照しなかったことがわかるので、関数「woo()」については最適化済みのコードをリンクし、プログラムの実行の高速化を図ることができる。一方、図13の形式の予測モジュール情報230Aは、図12の形式に比べて保存すべき情報の量を低減することができる。
【0037】
次に、再び、図4に戻り、ステップ1080以降の処理について説明する。
図4のステップ1070において、モジュール間最適化部122は、コンパイル中のモジュールが、名前がnの関数fを含むならばステップ1080に進む。例えば、図6に示すソースモジュール(C)210の関数「woo()」の文が、「return (foo());」ではなく、「return (buz());」であるとすると、名前n=buzの関数「buz()」は、図6のソースモジュール(C)210に含まれるため、ステップ1080に進むことになる。
【0038】
ステップ1080において、モジュール間最適化部122は、ステップ1120と同様にして、関数fがインライン展開の対象として適当かどうか調べる。サイズの大きな関数などは、インライン展開の対象として適当でない。適当でなければステップ1030に戻り、適当であるならばステップ1090に進む。
【0039】
そして、ステップ1090において、モジュール間最適化部122は、ステップ1130と同様にして、文sに関数fの内容を展開した上で、ステップ1030に戻る。
以上で、図3に示した最適化部120の処理が終了する。
【0040】
次に、最適化の処理が終了すると、図3に示すコパイラ100のコード生成部130は、ソースモジュール(C)210のコンパイル結果であるモジュール間最適化済みオブジェクトモジュールC’を生成する。生成したモジュール間最適化済みオブジェクトモジュールは、モジュール間最適化済オブジェクトモジュール220として保存しておく。
【0041】
次に、図14を用いて、本実施形態による最適化方法に用いるリンカ300の処理内容について説明する。
図14は、本発明の一実施形態による最適化方法に用いるリンカの処理内容を示すフローチャートである。
【0042】
図3に示したリンカ300は、プログラム400にソースモジュール(C)210をリンクするものである。プログラム400が、リンカ300にソースモジュールSをプログラムにリンクするよう命じると、ステップ3010以降の処理を実行する。
ここで、プログラム400が、リンカ300にソースモジュール(C)210をリンクするよう求めた時点で、リンクテーブル250Xが図15の状態にあり、リンク済みソースモジュール一覧表240Aが図18の状態にあったものとする。
【0043】
ここで、図15〜17は、本発明の一実施形態による最適化方法に用いるリンカの処理で使用するリンクテーブル250の構成の説明図であり、図18及び図19は、本発明の一実施形態による最適化方法に用いるリンカの処理で使用するリンク済みソースモジュール一覧表240の構成の説明図である。
【0044】
図15〜17に示すように、リンクテーブル250は、関数名251と、実行方式252と、関数本体のアドレス253と、予測モジュール情報のアドレス254とから構成されている。
実行方式252は、関数を実行する手段を表わしている。プログラム400は関数呼出しにあたって、リンクテーブル250を調べ、目的の関数の実行方式が「インタプリタ」である場合には、関数をインタプリタ500によって実行する実行方式が「直接」の場合は、関数をプロセッサ10によって直接実行する。予測モジュール情報のアドレス254は、リンクテーブル250にエントリされた関数に対応する予測モジュール情報230のアドレスを表わす。
【0045】
また、リンク済みソースモジュール一覧表240は、モジュール名241と、ファイル名242と、ファイル作成日時243と、ファイルサイズ244とから構成されている。リンク済みソースモジュール一覧表240Bの情報は、リンカがリンク済みのソースモジュールの内容が予測通りのものか検証するときに利用する。
【0046】
図14のステップ3010において、リンカ300は、ユーザが指定したディレクトリからソースモジュールSを読み込む。ここでは、ソースモジュール(C)210を読み込むものとする。
【0047】
次に、ステップ3020において、リンカ300は、ソースモジュールSの中にある全ての関数をリンクテーブル250に登録し、登録した関数のリンクテーブル250上のエントリの実行方式の欄に、「インタプリタ」と記入する。図16は、登録終了した時点におけるリンクテーブル250Yの具体例を示している。実行方式の欄に「インタプリタ」と記入することは、登録した関数がソースモジュール中のもので、インタプリタをつかって実行する必要があるということを意味している。図15と図16を比較すると理解されるように、ステップ3020の処理で、新たに、図6に示したソースモジュール(C)210の中のすべての関数「woo()」と関数「buz()」が登録されている。
【0048】
また、ステップ3020では、リンカ300は、ソースモジュールSをリンク済みソースモジュール一覧表240に登録する。ソースモジュールCをリンク済みソースモジュール一覧表240に登録する。図19は、ステップ3020が終了した時点におけるリンク済みソースモジュール一覧表240Bを示している。図18と図19を比較すると理解されるように、ステップ3020の処理で、新たに、図6に示したソースモジュール(C)210が登録されている。
【0049】
次に、ステップ3030以降の処理において、リンカ300は、モジュール間最適化済みオブジェクトモジュール中のコードをプログラムにリンクすることを試み、プログラムの実行の高速化を図る。
そのため、ステップ3030において、リンカ300は、集合Eを空集合とし、ステップ3040において、リンクテーブル250上のエントリをすべて集合Eに登録する。即ち、ステップ3030において集合Eを空集合とし、ステップ3040において集合Eを{boo(),foo(),woo(),buz()}とする。
【0050】
次に、ステップ3050において、リンカ300は、集合Eが空集合かどうか調べ、そうであるならばリンクの処理を終了し、そうでないならばステップ3060に進む。ここでは、集合E={boo(),foo(),woo(),buz()}であり、空集合でないので、ステップ3060に進むものとする。
次に、ステップ3060において、リンカ300は、集合Eからエントリを一つ取り出してfとする。例えば、「f=boo()」とする。
【0051】
次に、ステップ3070において、リンカ300は、fの実行方式がインタプリタか調べ、そうでないならばステップ3050に戻り、そうであるならばステップ3080に進む。ステップ3070において、「boo()」の実行方式が直接であることからステップ3050に戻る。同様にして、ステップ3050,3060を繰り返して、次の関数を取り出して、例えば、「f=foo()」とすると、同様に、「foo()」の実行方式が直接であることからステップ3050に戻る。しかし、次に、関数を取り出して、例えば、「f=woo()」とすると、同様に、「woo()」の実行方式は、図16に示すように、「インタプリタ」であることからステップ3080に進む。
【0052】
次に、ステップ3080において、リンカ300は、fに対応するモジュール間最適化済みオブジェクトモジュールが存在するか調べ、ないならばステップ3050に戻り、あるならばステップ3090に進む。ここでは、「woo()」を含むモジュール間最適化済みオブジェクトモジュールC’が存在することから、ステップ3090に進む。
【0053】
次に、ステップ3090において、リンカ300は、fの予測モジュール情報に登録された内容と一致する全てのソースモジュールがプログラムにリンクされているか、リンク済みソースモジュール一覧表を参照して調べ、リンクされていないならばステップ3050に戻り、リンクされているならばステップ3100に進む。ここで、「woo()」の予測モジュール情報230(図12)とリンク済みソースモジュール一覧表240B(図19))を照らし合わせると、予測モジュール情報230どおりの内容をもつソースモジュールAがリンクされていることから処理1410に進む。
【0054】
次に、ステップ3100において、リンカ300は、fのコードとしてモジュール間最適化済みオブジェクトモジュール240中のコードをリンクする。すなわち、fに対応するモジュール間最適化済みオブジェクトモジュール240を読み込み、読み込んだモジュール240中のfに対応する関数のアドレスをfの関数のアドレスの欄に書き込み、さらに、fの実行方式を「直接」に変更する。そして、ステップ3050に戻る。即ち、リンクテーブル上の「woo()」の関数のアドレスを、図17に示すように、モジュール間最適化済みオブジェクトモジュール250Zに変更し、実行方式を「直接」に変更して、ステップ3050に戻る。
【0055】
また、関数「buz()」についても、同様に変更を行い、リンクの処理を終了する。リンクの処理が終了した時点におけるリンクテーブル250の内容は、図17に示すようになっている。図17のリンクテーブルでは、関数「woo()」,「buz()」のコードとして、モジュール間最適化済みオブジェクトモジュール240中のコードがリンクされており、プログラムの実行の高速化が図られている。
【0056】
以上説明したように、本実施形態によれば、コンパイラを用いて、プログラム実行前に予めモジュール間最適化を実行しているので、プログラムの実行を高速化することができる。
また、プログラムの実行時には、リンカは、予測モジュール情報を用いて登録したリンク済みソースモジュール一覧表によって、リンク済みソースモジュールが予想通りのものか否かを検証することにより、コンパイル後のモジュールの変更を知ることができるので、プログラム実行に問題が生じることを防止できる。そして、モジュールの変更があった際には、インタプリタによりプログラムを実行することができる。
【0057】
次に、図20及び図21を用いて、本発明の他の実施形態による最適化方法について説明する。なお、本実施形態による最適化方法を適用する計算機システムの構成は、図1に示したものと同様である。
【0058】
最初に、図20を用いて、本実施形態によるディスク装置に記憶されているコンパイラとリンカを含む言語処理系の構成について説明する。なお、図2と同一符号は、同一部分を示している。
本実施形態においては、図2に示したコンパイラ100に代えて、動的コンパイラ100Xを用いている。そして、プログラム400がソースモジュール210中の関数を実行するときには、関数を動的コンパイラ100Xによってモジュール間最適化済みオブジェクトモジュール220に変換してから実行するようにしている。それ以外の構成・動作は、図2に示した実施形態と同様である。
【0059】
動的コンパイラ100Xは、プログラム400を最初に予備的に実行し、ソースモジュール210をコンパイルしてモジュール間最適化済みオブジェクトモジュール220と予測モジュール情報230を生成し、保存する。そして、プログラム400を2回目以降に実行するときに、最初の実行で動的コンパイラ100Xが生成したモジュール間最適化済みモジュールを利用して、プログラム400を実行する。従って、本実施形態では、プログラムを2回目以降に実行するときに、コンパイル時間を削減できるものである。
【0060】
動的コンパイラ100Xの構成は、図3に示したコンパイラ100の構成と同様であり、ソース解析部110と、最適化部120と、コード生成部130とから構成されている。また、最適化部120は、モジュール間最適化部122と、モジュール予測部124とから構成されている。
【0061】
モジュール間最適化部122の処理内容は、図4のフローチャートに示したとおりである。しかし、モジュール予測部124の処理内容は、図5のフローチャートに示したものと一部相違しており、この点については、図21を用いて説明する。
【0062】
ここで、図21を用いて、本実施形態による最適化方法に用いるモジュール予測部の処理内容について説明する。
図21は、本発明の他の実施形態による最適化方法に用いるモジュール予測部の処理内容を示すフローチャートである。
【0063】
本実施形態によるモジュール予測部は、モジュール間最適化部122から要求された名前がnの関数fを含むソースモジュールを、プログラムの実行中に実際にプログラムにリンクされたソースモジュール(リンクされたソースモジュール一覧表に記載されたモジュール)から探すようにしている。
図21のステップ1101において、モジュール予測部は、集合Sを空集合とし、さらに、ステップ1102Xにおいて、リンクされたソースモジュール一覧表に記載されたモジュールを収める。
【0064】
続くステップ1103以降の処理は、図5に示したコンパイラ100のモジュール予測部124と同様である。
【0065】
ここで、図20に示した本実施形態による言語処理系を用いて、図6のソースモジュール(C)210をコンパイルし、リンクする過程について説明する。
プログラム400が、リンカ250に、ソースモジュール(C)210をプログラム400にリンクするよう求め、このときリンクテーブル250が図18の状態にあり、リンク済みソースモジュール一覧表が図18の状態にあったとする。リンカ250の処理内容は、図14に示したものと同様であり、ソースモジュール(C)210に対応するモジュール間最適化済みオブジェクトC’が存在すれば、リンカ250は、図14に示した処理過程と同一の過程でリンクをおこない、存在しなければ、ソースモジュール(C)210中の関数「woo(),buz()」のエントリの実行方式はインタプリタのままであり、リンクテーブル250は図16に示した状態になる。
【0066】
リンクテーブル250が図16に示す状態で、プログラム400が関数「woo()」を実行しようとすると、関数「woo()」の実行方式が「インタプリタ」であることから、プログラム400は、関数「woo()」を動的コンパイラ100Xによってコンパイルし、結果をリンクテーブル250に登録してから関数「woo()」をプロセッサ10で直接実行する。
【0067】
関数「woo()」を動的コンパイラ100Xでコンパイルする過程も、コンパイラ100と同様であるが、モジュール予測部124の動作だけが異なっている。
モジュール予測部は、モジュール間最適化部122に、関数「foo()」を含むモジュールを予測するよう求められると、図21のステップ1101において、集合Sを空集合とし、ステップ1102において、リンク済みソースモジュール一覧表240を参照して、集合S={A、B、C}とする。
【0068】
次に、ステップ1103において、集合Sが空集合でないことから、ステップ1104に進んで、「m=A」とする。
次に、ステップ1105において、リンク済みのソースモジュール(A)210Aが、関数「foo()」を含むことから、ステップ1106に進み、ソースモジュール(A)210A1を返戻して、モジュールの予測の処理を終了する。
【0069】
以上のように、動的コンパイラは、プログラムを最初に予備的に実行し、ソースモジュールをコンパイルしてモジュール間最適化済みオブジェクトモジュールと予測モジュール情報を生成し、保存するので、プログラムを2回目以降に実行するときに、最初の実行で動的コンパイラが生成したモジュール間最適化済みモジュールを利用して、プログラムを実行する。従って、本実施形態では、プログラムを2回目以降に実行するときに、コンパイル時間を削減できる。
また、プログラムの実行時には、リンカは、予測モジュール情報を用いて登録したリンク済みソースモジュール一覧表によって、リンク済みソースモジュールが予想通りのものか否かを検証することにより、コンパイル後のモジュールの変更を知ることができるので、プログラム実行に問題が生じることを防止できる。そして、モジュールの変更があった際には、インタプリタによりプログラムを実行することができる。
【0070】
【発明の効果】
本発明によれば、プログラムの実行速度を速くでき、しかも、プログラム実行前にコンパイルしても、プログラム実行時に問題の生じないものである。
【図面の簡単な説明】
【図1】本発明の一実施形態による最適化方法を適用する計算機システムの構成を示すブロック図である。
【図2】本発明の一実施形態によるディスク装置に記憶されているコンパイラとリンカを含む言語処理系の構成を示すブロック図である。
【図3】本発明の一実施形態による最適化方法に用いるコンパイラの構成を示すブロック図である。
【図4】本発明の一実施形態による最適化方法に用いるモジュール間最適化部の処理内容を示すフローチャートである。
【図5】本発明の一実施形態による最適化方法に用いるモジュール予測部の処理内容を示すフローチャートである。
【図6】本発明の一実施形態による最適化方法によって最適化されるソースモジュールの一例の構成図である。
【図7】本発明の一実施形態による最適化方法によって最適化されるソースモジュールの一例の構成図である。
【図8】本発明の一実施形態による最適化方法によって最適化されるソースモジュールの一例の構成図である。
【図9】本発明の一実施形態による最適化方法によって最適化されたソースモジュールの例図である。
【図10】本発明の一実施形態による最適化方法によって最適化されたソースモジュールの例図である。
【図11】本発明の一実施形態による最適化方法によって最適化されたソースモジュールの例図である。
【図12】本発明の一実施形態による最適化方法に用いる予測情報の一例の説明図である。
【図13】本発明の一実施形態による最適化方法に用いる予測情報の他の例の説明図である。
【図14】本発明の一実施形態による最適化方法に用いるリンカの処理内容を示すフローチャートである。
【図15】本発明の一実施形態による最適化方法に用いるリンカの処理で使用するリンクテーブルの構成の説明図であり、
【図16】本発明の一実施形態による最適化方法に用いるリンカの処理で使用するリンクテーブルの構成の説明図であり、
【図17】本発明の一実施形態による最適化方法に用いるリンカの処理で使用するリンクテーブルの構成の説明図であり、
【図18】本発明の一実施形態による最適化方法に用いるリンカの処理で使用するリンク済みソースモジュール一覧表の構成の説明図である。
【図19】本発明の一実施形態による最適化方法に用いるリンカの処理で使用するリンク済みソースモジュール一覧表の構成の説明図である。
【図20】本発明の他の実施形態によるディスク装置に記憶されているコンパイラとリンカを含む言語処理系の構成を示すブロック図である。
【図21】本発明の他の実施形態による最適化方法に用いるモジュール予測部の処理内容を示すフローチャートである。
【符号の説明】
10…プロセッサ
20…主記憶
30…ディスク駆動装置
40…媒体駆動装置
42…記憶媒体
100…コンパイラ
100X…動的コンパイラ
210…ソースモジュール
220…モジュール間最適化済みオブジェクトモジュール
230…予測モジュール情報
240…リンク済ソースモジュール一覧表
250…リンクテーブル
300…リンカ
400…プログラム
500…インタプリタ
Claims (4)
- プログラムpの実行中に、このプログラムpとリンクされるモジュールaを構成する関数fに、プロセッサが、上記プログラムpの実行を開始する前にモジュール間最適化を施す最適化方法において、
上記プログラムpに上記モジュールaと共にリンクされるモジュールの内容のうち、上記関数fにモジュール間最適化を施すために必要な内容Mを上記プロセッサが予測し、
予測した内容Mを用いて、上記関数fにモジュール間最適化を施した関数f’を含むモジュール間最適化済みモジュールと、モジュール間最適化に用いた内容Mを特定するための予測モジュール情報Iを上記プロセッサが生成することを特徴とする最適化方法。 - 請求項1記載の最適化方法において、
上記プロセッサは、上記プログラムpの実行時に、上記プログラムpに上記モジュールaとともにリンクされたモジュールについて、このモジュールの内容のうち、上記内容Mに相当する部分が、上記内容Mと一致するか上記情報Iを用いて検証し、一致する場合に、上記プログラムpに上記モジュールaの関数fに代えて、上記関数f’をリンクすることを特徴とする最適化方法。 - プログラムpの実行中にこのプログラムpとリンクされるモジュールaを構成する関数fに、上記プログラムpの実行を開始する前にモジュール間最適化を施す最適化装置において、
上記プログラムpに上記モジュールaと共にリンクされるモジュールの内容のうち、上記関数fにモジュール間最適化を施すために必要な内容Mを予測するモジュール予測手段と、
このモジュール予測手段により予測した内容Mを用いて、モジュール間最適化に用いた内容Mを特定するための予測モジュール情報Iを生成するモジュール間最適化手段と、
上記モジュール予測手段により予測した内容Mを用いて、上記関数fにモジュール間最適化を施した関数f’であるモジュール間最適化済みモジュールを生成するコード生成手段を備えたことを特徴とする最適化装置。 - プロセッサに、プログラムpの実行中にこのプログラムpとリンクされるモジュールaを構成する関数fに、上記プログラムpの実行を開始する前にモジュール間最適化を施す最適化方法を実現するためのプログラムを記録する記録媒体において、
上記プロセッサに、上記プログラムpに上記モジュールaと共にリンクされるモジュールの内容のうち、上記関数fにモジュール間最適化を施すために必要な内容Mを予測し、
予測した内容Mを用いて、上記関数fにモジュール間最適化を施した関数f’であるモジュール間最適化済みモジュールと、モジュール間最適化に用いた内容Mを特定するための予測モジュール情報Iを生成する最適化方法を実現するためのプログラムを記録することを特徴とする記録媒体。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP00911899A JP3604936B2 (ja) | 1999-01-18 | 1999-01-18 | 最適化方法,最適化装置及び記録媒体 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP00911899A JP3604936B2 (ja) | 1999-01-18 | 1999-01-18 | 最適化方法,最適化装置及び記録媒体 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2000207225A JP2000207225A (ja) | 2000-07-28 |
JP3604936B2 true JP3604936B2 (ja) | 2004-12-22 |
Family
ID=11711731
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP00911899A Expired - Fee Related JP3604936B2 (ja) | 1999-01-18 | 1999-01-18 | 最適化方法,最適化装置及び記録媒体 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP3604936B2 (ja) |
-
1999
- 1999-01-18 JP JP00911899A patent/JP3604936B2/ja not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JP2000207225A (ja) | 2000-07-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7472375B2 (en) | Creating managed code from native code | |
US6922827B2 (en) | Iterative software development environment with prioritized build rules | |
US6233733B1 (en) | Method for generating a Java bytecode data flow graph | |
US6412109B1 (en) | Method for optimizing java bytecodes in the presence of try-catch blocks | |
US7793270B2 (en) | Method and apparatus for performing incremental validation of program code conversion | |
US6484313B1 (en) | Compiling and persisting of intermediate language code | |
JPH07105012A (ja) | 言語処理プログラムのコンパイル処理方式 | |
JP2008505423A (ja) | 最適化されたプログラムのためのアンワインド情報の生成 | |
JP2000242501A (ja) | 情報処理装置、情報処理方法及びプログラム書込み装置 | |
US20040083467A1 (en) | System and method for executing intermediate code | |
Strumpen | Compiler technology for portable checkpoints | |
KR0125605B1 (ko) | 프로그램의 아키덱쳐 변환방법 및 장치와 그 방법 및 장치를 사용하여 프로그램의 동작을 검증하는 방법 및 장치 | |
JPH03118635A (ja) | ソースコード発展システム用増分コンパイラ | |
JP3604936B2 (ja) | 最適化方法,最適化装置及び記録媒体 | |
KR900006667B1 (ko) | 부분적 프로그램 결합 시스템 | |
US20050125783A1 (en) | Program optimization with intermediate code | |
JP3196675B2 (ja) | 言語処理方式 | |
JPH10320212A (ja) | キャッシュ向け最適化方法 | |
JP3461185B2 (ja) | ロードモジュールへのソースコード行番号登録方法および装置 | |
US20040045018A1 (en) | Using address space bridge in postoptimizer to route indirect calls at runtime | |
JP3439353B2 (ja) | ソフトウェア・シミュレータシステム及びプログラムを記録した記録媒体 | |
JP3210203B2 (ja) | プログラム試験方法及びsqlシミュレータ | |
JP2002082811A (ja) | コンパイル方法および記録媒体 | |
JP3018783B2 (ja) | コンパイル方式 | |
JP2005301415A (ja) | コンパイル方式、シミュレータ、エミュレータおよびプログラム開発支援システム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20040614 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20040706 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20040816 |
|
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: 20040928 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20040930 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
LAPS | Cancellation because of no payment of annual fees |