(57)【特許請求の範囲】
【請求項１】
プログラムｐの実行中に、このプログラムｐとリンクされるモジュールａを構成する関数ｆに、プロセッサが、上記プログラムｐの実行を開始する前にモジュール間最適化を施す最適化方法において、
上記プログラムｐに上記モジュールａと共にリンクされるモジュールの内容のうち、上記関数ｆにモジュール間最適化を施すために必要な内容Ｍを上記プロセッサが予測し、
予測した内容Ｍを用いて、上記関数ｆにモジュール間最適化を施した関数ｆ’を含むモジュール間最適化済みモジュールと、モジュール間最適化に用いた内容Ｍを特定するための予測モジュール情報Ｉを上記プロセッサが生成することを特徴とする最適化方法。
【請求項２】
請求項１記載の最適化方法において、
上記プロセッサは、上記プログラムｐの実行時に、上記プログラムｐに上記モジュールａとともにリンクされたモジュールについて、このモジュールの内容のうち、上記内容Ｍに相当する部分が、上記内容Ｍと一致するか上記情報Ｉを用いて検証し、一致する場合に、上記プログラムｐに上記モジュールａの関数ｆに代えて、上記関数ｆ’をリンクすることを特徴とする最適化方法。
【請求項３】
プログラムｐの実行中にこのプログラムｐとリンクされるモジュールａを構成する関数ｆに、上記プログラムｐの実行を開始する前にモジュール間最適化を施す最適化装置において、
上記プログラムｐに上記モジュールａと共にリンクされるモジュールの内容のうち、上記関数ｆにモジュール間最適化を施すために必要な内容Ｍを予測するモジュール予測手段と、
このモジュール予測手段により予測した内容Ｍを用いて、モジュール間最適化に用いた内容Ｍを特定するための予測モジュール情報Ｉを生成するモジュール間最適化手段と、
上記モジュール予測手段により予測した内容Ｍを用いて、上記関数ｆにモジュール間最適化を施した関数ｆ’であるモジュール間最適化済みモジュールを生成するコード生成手段を備えたことを特徴とする最適化装置。
【請求項４】
プロセッサに、プログラムｐの実行中にこのプログラムｐとリンクされるモジュールａを構成する関数ｆに、上記プログラムｐの実行を開始する前にモジュール間最適化を施す最適化方法を実現するためのプログラムを記録する記録媒体において、
上記プロセッサに、上記プログラムｐに上記モジュールａと共にリンクされるモジュールの内容のうち、上記関数ｆにモジュール間最適化を施すために必要な内容Ｍを予測し、
予測した内容Ｍを用いて、上記関数ｆにモジュール間最適化を施した関数ｆ’であるモジュール間最適化済みモジュールと、モジュール間最適化に用いた内容Ｍを特定するための予測モジュール情報Ｉを生成する最適化方法を実現するためのプログラムを記録することを特徴とする記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、プログラムを構成するモジュールをプログラムの実行時にリンクするプログラミングを作成可能なプログラミング言語の最適化方法，最適化装置及び記録媒体に係り、特に、モジュール間にまたがる情報を利用して最適化を施すに好適な最適化方法，最適化装置及び記録媒体に関する。
【０００２】
【従来の技術】
オブジェクト指向プログラミング言語などでは、プログラムを構成するモジュールをプログラムの実行時にリンクすることがある。モジュールに、プログラムの実行を開始する前にモジュール間最適化を施す方法としては、例えば、「Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ｔｈｅ  ＳＩＧＰＬＡＮ  ’８６  Ｓｙｍｐｏｓｉｕｍ  ｏｎ  Ｃｏｍｐｉｌｅｒ  Ｃｏｎｓｔｒｕｃｔｉｏｎ，”Ｉｎｔｅｒｐｒｏｃｅｄｕａｌ  Ｏｐｔｉｍｉｚａｔｉｏｎ：  Ｅｌｉｍｉｎａｔｉｎｇ  Ｕｎｎｅｃｅｓｓａｒｙ  Ｒｅｃｏｍｐｉｌａｔｉｏｎ”，（１９８６年６月），Ｋ．  Ｄ．  Ｃｏｏｐｅｒ，  Ｋ．  Ｋｅｎｅｄｙ  ａｎｄ  Ｌ．  Ｔｏｒｃｚｏｎ，  ｐｐ．５８−６７」に記載されたコンパイラを用いる方法が知られている。
【０００３】
しかしながら、このコンパイラを用いて、プログラムの実行開始前にモジュール間最適化を行った後、モジュールの内容に変更が加えられた場合、コンパイル時にモジュール間最適化を実行するとき参照したモジュールの内容と、プログラムの実行時に実際にリンクしたモジュールの内容が異なるため、プログラムの正確な実行が行えず、正確な実行結果が得られなくなるという問題があった。即ち、従来のコンパイラでは、プログラムの実行時にリンクされるモジュールを構成する関数に、最適化後のモジュールの変更を考慮してモジュール間最適化を施すことができないという問題があった。
【０００４】
このようなモジュールの変更に対処して、プログラムの実行時にリンクされるモジュールについて、モジュール間最適化を施せる最適化方法としては、例えば、「Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ＯＯＰＳＬＡ  ９４，  ”Ｔｈｉｒｄ−Ｇｅｎｅｒａｔｉｏｎ  ＳＥＬＦ  Ｉｍｐｌｅｍｅｎｔａｔｉｏｎ：  Ｒｅｃｏｎｃｉｌｉｎｇ  Ｒｅｓｐｏｎｓｉｖｅｎｅｓｓ  ｗｉｔｈ  Ｐｅｒｆｏｒｍａｎｃｅ”，（１９９４年１０月２３−２７日），Ｕｒｓ  Ｈｏｅｌｚｌｅ  ａｎｄ  Ｄａｖｉｄ  Ｕｎｇａｒ，ｐｐ．２２９−２４３」に記載されている動的コンパイラが知られている。動的コンパイラとは、プログラムの実行中にプログラムをコンパイルするコンパイラである。動的コンパイラでは、プログラムの実行中に、モジュールがプログラムにリンクされてからモジュール間最適化を施すため、コンパイル以前にモジュールの変更がなされていても、その変更の影響なく、プログラムの正確な実行が行えるものである。
【０００５】
【発明が解決しようとする課題】
しかしながら、動的コンパイラは、プログラムの実行中にプログラムをコンパイルするために、時間を要するので、プログラムの実行速度が遅くなるという問題があった。
【０００６】
本発明の目的は、プログラムの実行速度を速くでき、しかも、プログラム実行前にコンパイルしても、プログラム実行時に問題の生じないモジュール間最適化方法，モジュール間最適化装置及び記録媒体を提供することにある。
【０００７】
【課題を解決するための手段】
上記目的を達成するために、本発明は、プログラムｐの実行中に、このプログラムｐとリンクされるモジュールａを構成する関数ｆに、プロセッサが、上記プログラムｐの実行を開始する前にモジュール間最適化を施す最適化方法において、上記プログラムｐに上記モジュールａと共にリンクされるモジュールの内容のうち、上記関数ｆにモジュール間最適化を施すために必要な内容Ｍを上記プロセッサが予測し、予測した内容Ｍを用いて、上記関数ｆにモジュール間最適化を施した関数ｆ’を含むモジュール間最適化済みモジュールと、モジュール間最適化に用いた内容Ｍを特定するための予測モジュール情報Ｉを上記プロセッサが生成するようにしたものである。
かかる方法により、プログラムの実行を開始する前にプログラムをコンパイルすることで、プログラムの実行中にプログラムをコンパイルするために時間を割くことを止め、プログラムの実行の高速化を図ることができ、また、プログラムの実行時には、情報Ｉを用いて、プログラムが実行時にリンクするモジュールの内容を監視して、プログラムの実行時にモジュールａとモジュール間最適化時に参照したのと同一の内容をもつモジュール群がリンクされた場合には、関数ｆにモジュール間最適化を施した関数ｆ’を利用することでプログラムの実行の高速化を図ることが可能になり、なおかつ、モジュールａとモジュール間最適化時に参照したのとは異なる内容をもつモジュール群がリンクされた場合には、誤った予測に基づいて最適化を施した関数ｆ’がプログラムにリンクされることがなくなり、問題が起きないものとなる。
【０００８】
【発明の実施の形態】
以下、図１〜図１９を用いて、本発明の一実施形態による最適化方法について説明する。
最初に、図１を用いて、本実施形態による最適化方法を適用する計算機システムの構成について説明する。
【０００９】
本実施形態による計算機システムは、コンパイラやインタプリタのような言語処理系のプログラムが動作するものである。計算機システムは、プロセッサ１０と、主記憶２０と、ディスク装置３０と、媒体駆動装置４０とから構成されており、これらは、バス５０によって接続されている。
【００１０】
ディスク装置４０に記憶されている言語処理系のプログラムは、バス５０を介して、主記憶２０に取り込まれ、プロセッサ１０によって実行される。また、言語処理系のプログラムが記憶された記憶媒体４２からは、媒体駆動装置４０によってその記憶内容であるプログラムが読み出され、ディスク装置３０に格納される。ここで、記憶媒体４２としては、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、フロッピーディスク（ＦＤ）等が用いられる。
【００１１】
次に、図２を用いて、本実施形態によるディスク装置に記憶されているコンパイラとリンカを含む言語処理系の構成について説明する。
本実施形態による処理系では、コンパイラ１００は、ソースモジュール２１０をコンパイルし、モジュール間最適化済みオブジェクトモジュール２２０と、予測モジュール情報２３０を生成する。予測モジュール情報２３０は、コンパイラ１００がソースモジュール２１０を構成する関数にモジュール間最適化を施すにあたり、ソースモジュール２１０がプログラムの実行時に、どのような内容をもつモジュールとリンクされると予測したかを表わす情報である。
なお、コンパイラ１００の詳細については、図３を用いて後述する。また、予測モジュール情報２３０の詳細については、図１２及び図１３を用いて後述する。
なお、コンパイラ１００への入力は、ソースモジュール２１０の代わりに、中間コードのモジュールや、オブジェクトモジュールであってもよいものである。
【００１２】
プログラム４００は、実行時にリンカ３００を呼び出し、ソースモジュール２１０をプログラム４００にリンクするよう要求する。リンカ３００は、プログラム４００に要求されたソースモジュール２１０をプログラム４００にリンクし、リンク済ソースモジュール一覧表２４０に登録する。リンカ３００は、さらに、予測モジュール情報２３０を参照し、可能であるときにはソースモジュールの代わりに、モジュール間最適化済みオブジェクトモジュール２２０中の関数をリンクすることで、プログラムの実行の高速化を図る。リンクは、モジュール中の関数を、リンクテーブル２５０に登録することでおこなう。なお、リンカ３００の詳細については、図１４を用いて後述する。
【００１３】
プログラム４００は、リンクテーブルに登録された関数がモジュール間最適化済みオブジェクトモジュール２２０中のものである場合、プログラム中の関数を、プロセッサ１０で直接実行する。これによって、すでにコンパイラ１１０によって最適化済みのモジュールを使用できるので、プログラムの実行を高速で行うことができる。
一方、リンクテーブルに登録された関数がソースモジュール２１０中のものである場合、そのままプログラムを実行すると誤った実行結果が得られて問題となるため、プログラム中の関数を、インタプリタ５００で実行することにより問題が発生することを回避している。
【００１４】
次に、図３を用いて、本実施形態による最適化方法に用いるコンパイラ１００の構成について説明する。
コンパイラ１００は、ソース解析部１１０と、最適化部１２０と、コード生成部１３０とを備えている。ソース解析部１１０は、ソースモジュール１２０を解析し、最適化部１２０は、解析したソースモジュールに対して、モジュール間最適化などの最適化を施し、コード生成部１３０は、モジュール間最適化済みオブジェクトモジュール２２０を生成する。
また、最適化部１２０は、モジュール間最適化部１２と、モジュール予測部１２４とを備えている。モジュール間最適化部１２２は、モジュール予測部１２４が予測したソースモジュール２１０Ａが、コンパイル中のソースモジュールとプログラムの実行時にリンクされるものとして、モジュール間最適化を実行すると共に、予測モジュール情報２３０を生成する。なお、モジュール間最適化部１２の詳細処理内容については、図４を用いて後述し、モジュール予測部１２４の詳細処理内容については、図５を用いて後述する。
【００１５】
次に、図４を用いて、本実施形態による最適化方法に用いるモジュール間最適化部１２２の処理内容について説明し、また、図５を用いて、本実施形態による最適化方法に用いるモジュール予測部１２４の処理内容について説明する。
図４は、本発明の一実施形態による最適化方法に用いるモジュール間最適化部の処理内容を示すフローチャートであり、図５は、本発明の一実施形態による最適化方法に用いるモジュール予測部の処理内容を示すフローチャートである。
【００１６】
最初に、図４を用いて、本実施形態によるモジュール間最適化部１２２の処理内容について説明する。本実施形態においては、インライン展開というモジュール間最適化を実行するものである。なお、インライン展開以外のモジュール間最適化も、図４と同様の方法で実行できる。
【００１７】
本実施形態においては、図３に示したソースモジュール２１０として、図６に示すモジュール（Ｃ）２１０を、図３に示したソースモジュール２１０Ａとして、図７及び図８に示したモジュール（Ａ）２１０Ａ１，モジュール（Ｂ）２１０Ａ２とコンパイルするものとし、特に、モジュール間最適化部１２２がソースモジュール（Ｃ）２１０中の関数「ｗｏｏ（）」を最適化する過程を例にとって説明する。
図６，図７及び図８は、本発明の一実施形態による最適化方法によって最適化されるソースモジュールの一例の構成図である。
【００１８】
図４のステップ１０１０において、モジュール間最適化部１２２は、集合Ｆを空にする。
次に、ステップ１０２０において、モジュール間最適化部１２２は、最適化対象の関数の中の文をすべて集合Ｆに収める。即ち、ステップ１０１０において、集合Ｆを空集合とした上で、ステップ１０２０において、文「ｒｅｔｕｒｎ  （ｆｏｏ（））；」を、集合Ｆに収める。
【００１９】
次に、ステップ１０３０において、モジュール間最適化部１２２は、集合Ｆが空集合であるか否かを調べ、空集合であるならば最適化の処理を終了し、空集合でないならばステップ１０４０に進む。ここでは、文「ｒｅｔｕｒｎ  （ｆｏｏ（））；」が、集合Ｆに含まれているため、ステップ１０４０に進むものとする。
次に、ステップ１０４０において、モジュール間最適化部１２２は、集合Ｆから文を一つ取り出して文ｓとする。即ち、文「ｒｅｔｕｒｎ  （ｆｏｏ（））；」を、文ｓとする。
【００２０】
次に、ステップ１０５０において、モジュール間最適化部１２２は、文ｓが関数呼出しかどうか判定し、関数呼出しでないならばステップ１０３０に戻り、関数呼出しであるならばステップ１０６０に進む。ここでは、文ｓが、関数呼出し「ｆｏｏ（）」を含むことからステップ１０６０に進むものとする。
次に、ステップ１０６０において、モジュール間最適化部１２２は、文ｓが呼び出す関数の名前ｎを取得する。即ち、名前ｎとして、「ｎ＝ｆｏｏ」とする。
【００２１】
次に、ステップ１０７０において、モジュール間最適化部１２２は、コンパイル中のモジュールが、名前がｎの関数ｆを含むかどうか調べ、含むならばステップ１０８０に進み、含まないならばステップ１１００に進む。ここでは、図６に示すソースモジュール（Ｃ）２１０は、関数「ｆｏｏ（）」を含まないことから処理１１００に進む。例えば、ソースモジュール（Ｃ）２１０の関数「ｗｏｏ（）」の文が、「ｒｅｔｕｒｎ  （ｆｏｏ（））；」ではなく、「ｒｅｔｕｒｎ  （ｂｕｚ（））；」であるとすると、名前ｎ＝ｂｕｚの関数「ｂｕｚ（）」は、図６のソースモジュール（Ｃ）２１０に含まれるため、ステップ１０８０に進むことになる。ここでは、上述したように、ステップ１１００に進むものとして説明を続け、ステップ１０８０以降の処理については後述する。
【００２２】
次に、ステップ１１００において、モジュール予測部１２４には、コンパイル中のモジュールとプログラムの実行時にリンクされ、名前がｎの関数ｆを含むモジュールｍを予測させる。モジュール予測部１２４を呼出して、ｆｏｏ（）を含むソースモジュールを予測させる。すなわち、このステップ１１００は、モジュール予測部１２４の処理であり、その詳細については、図５を用いて説明する。モジュール予測部１２４は、モジュール最適化部１２２からの依頼により、名前がｎの関数ｆを含むソースモジュールを検索する。ここで、関数ｆは、コンパイル中のモジュールとプログラムの実行時にリンクされると予測されるものである。
図５のステップ１１０１において、モジュール予測部１２４は、集合Ｓを空集合とし、さらに、ステップ１１０２において、ユーザが指定したディレクトリにあるソースモジュールを全て集合Ｓに収める。即ち、モジュール予測部１２４は、集合Ｓを空集合とした後、ユーザが指定したディレクトリが、「／ｕｓｒ／ｃｌａｓｓｌｉｂ」であるとすれば、図６，図７，図８に示すように、この指定されたディレクトリ中には、３つのソースモジュール（Ａ）２１０Ａ１，（Ｂ）２１０Ａ２，（Ｃ）２１０が存在するので、集合Ｓ＝｛Ａ，Ｂ，Ｃ｝となる。
【００２３】
次に、ステップ１１０３において、モジュール予測部１２４は、集合Ｓが空集合かどうか検証し、空集合であるならば、ステップ１１０７においてＮＵＬＬを返戻して予測の処理を終了し、空集合でなければ、ステップ１１０４に進む。ここでは、集合Ｓ＝｛Ａ，Ｂ，Ｃ｝であり、空集合でないので、ステップ１１０４に進むものとする。
次に、ステップ１１０４において、モジュール予測部１２４は、集合Ｓからソースモジュールを一つ取り出し、ｍとする。例えば、「ｍ＝Ａ」とする。
【００２４】
次に、ステップ１１０５において、モジュール予測部１２４は、ソースモジュールｍが名前がｎの関数ｆを含むか調べ、含むならばステップ１１０６に進んでソースモジュールｍを返戻して予測の処理を終了し、含まないならばステップ１１０３に戻る。ここでは、ソースモジュール（Ａ）２１０Ａ１が関数「ｆｏｏ（）」を含むことから、ステップ１１０６に進んで、ソースモジュール（Ａ）２１０Ａ１を返戻し、予測の処理を終了する。
【００２５】
次に、図４のステップ１１１０に戻り、モジュール間最適化部１２２は、モジュールｍの予測結果を調べ、適当なモジュールが見つからなかった（モジュール予測部１２４がＮＵＬＬを返戻した）場合にはステップ１０３０に戻り、見つかった場合にはステップ１１２０に進む。ここでは、図５のステップ１１０６において、適当なモジュールとして、ソースモジュール（Ａ）２１０Ａ１が見つかったので、ステップ１１２０に進むものとする。
【００２６】
次に、ステップ１１２０において、モジュール間最適化部１２２は、関数ｆがインライン展開の対象として適当か調べる。ここで、インライン展開の対象として適当である場合とは、例えば、図７に示す関数「ｆｏｏ（）」のように行数が少なく、例えば、関数ｆの行数が１０行以下の場合や、Ｃ＋＋．言語で記述されているプログラムの場合にインライン展開するようプログラム上明記されている場合等である。これら以外の場合には、インライン展開の対象として適当でないと判断する。なお、判断基準は、任意に決められるものである。そして、適当でなかった場合にはステップ１０３０に戻り、適当である場合にはステップ１１３０に進む。ここでは、ソースモジュール（Ａ）２１０Ａを構成する関数「ｆｏｏ（）」は、「ｒｅｔｕｒｎ（１）；」の１行だけであるので、インライン展開の対象として適当であると判断されるものとする。
【００２７】
次に、ステップ１１３０において、モジュール間最適化部１２２は、文ｓに関数ｆの内容を展開する。図６に示した文「ｉｎｔ  ｗｏｏ（）｛ｒｅｔｕｒｎ  （ｆｏｏ）；｝」に、図７に示した関数「ｆｏｏ（）」の内容である「ｒｅｔｕｒｎ（１）；」を展開すると、図９に示すプログラムのようになる。
【００２８】
同様の処理により、図６に示したソースモジュール（Ｃ）２１０のもう一つの文である「ｉｎｔ  ｂｕｚ（）｛ｒｅｔｕｒｎ  （ｂｏｏ）；｝」に、図８に示した関数「ｂｏｏ（）」の内容である「ｒｅｔｕｒｎ（ｆｏｏ（））；」を展開すると、図１０に示すようになる。この状態では、まだ、関数「ｆｏｏ（）」を含んでいるため、さらに、処理を繰り返して、図７に示した関数「ｆｏｏ（）」の内容である「ｒｅｔｕｒｎ（１）；」を展開すると、図１１に示すプログラムようになる。
図９，図１０及び図１１は、本発明の一実施形態による最適化方法によって最適化されたソースモジュールの例図である。
【００２９】
次に、図４に戻り、ステップ１１４０において、モジュール間最適化部１２２は、モジュールｍを予測モジュール情報２３０に書き出した上で、ステップ１０３０に戻る。
【００３０】
ここで、図１２を用いて、本実施形態による最適化方法に用いる予測情報２３０の一例について説明する。
予測モジュール情報２３０は、モジュール内の関数ごとに、関数にモジュール間最適化を施すにあたって参照したソースモジュールに関する情報を有している。このため、予測モジュール情報２３０は、関数名２３１と、モジュール名２３２と、ファイル名２３３と、ファイル作成日時２３４と、ファイルサイズ１２０５から構成されている。
【００３１】
ソースモジュール（Ｃ）２１０中の関数「ｗｏｏ（）」を、図９に示すコードにまで最適化する間に、ソースモジュール（Ａ）２１０Ａ１中の関数「ｆｏｏ（）」を参照していることから、ソースモジュール（Ｃ）２１０中の関数「ｗｏｏ（）」をコンパイルするにあたって作成した予測モジュール情報は、モジュール名２３２が「Ａ」となる。
【００３２】
また、ソースモジュール（Ｃ）２１０中の関数「ｂｕｚ（）」を、図１１に示すコードにまで最適化する間に、ソースモジュール（Ｂ）２１０Ａ２中の関数「ｂｏｏ（）」と、ソースモジュール（Ａ）２１０Ａ１中の関数「ｆｏｏ（）」を参照していることから、ソースモジュール（Ｃ）２１０中の関数「ｂｕｚ（）」をコンパイルするにあたって作成した予測モジュール情報は、モジュール名２３２が「Ａ」と「Ｂ」となる。
【００３３】
リンカ３００は、これらの情報を利用して、コンパイラ１００がプログラムにリンクされると予測したソースモジュール２１０の内容と、プログラムの実行中に実際にプログラムにリンクされたソースモジュールの内容が一致するか検証する。例えば、ソースモジュールの内容を比較した際、ファイル作成日時２３４やファイルサイズ２３５が異なっている場合には、ソースモジュールが一致していないと検証できる。
【００３４】
ここで、図１３を用いて、本実施形態による最適化方法に用いる予測情報２３０Ａの他の例について説明する。
予測モジュール情報２３０Ａは、ソースモジュール（Ｃ）にモジュール間最適化を施すにあたって参照したソースモジュール２１０Ａを記録したデータである。予測モジュール情報２３０Ａは、ソースモジュール（Ｃ）を最適化するにあたって、ソースモジュール（Ａ）とソースモジュール（Ｂ）を参照したことを表わし、モジュール名２３２と、ソースモジュールのファイル名２３３と、ファイル作成日時２３４と、ファイルサイズ２３５との情報を有している。即ち、図１２の例と比較するように、関数名２３１を持たないようにすることもできる。
【００３５】
ここで、図１３に示す形式の予測モジュール情報２３０Ａでは、リンカ３００は、モジュール単位でしかプログラムにモジュール間最適化済みオブジェクトモジュール２２０をリンクできない。それに対して、図１２に示す形式の予測モジュール情報２３０では、リンカ３００は、モジュール中の個々の関数単位でプログラムにモジュール間最適化済みオブジェクトモジュール２２０をリンクできる。
【００３６】
例えば、プログラムにソースモジュール（Ａ），（Ｂ），（Ｃ）がリンクされており、ソースモジュール（Ｃ）の予測モジュール情報が図１３に示すものであるとし、さらに、プログラムにリンクされているソースモジュール（Ａ），（Ｂ）について、ソースモジュール（Ａ）が図１３の予測モジュール情報２３０Ａに記載のあるとおりのものであるのに対し、ソースモジュール（Ｂ）が図１３の予測モジュール情報２３０Ａに記載のあるものとは異なるとする。このとき、リンカ３００は、ソースモジュール（Ｂ）として予測とは異なるモジュールがリンクされているために、ソースモジュール（Ｃ）に対応するモジュール間最適化済みオブジェクトモジュールＣ’の全体をプログラムにリンクできなくなる。これに対し、もし、ソースモジュール（Ｃ）の予測モジュール情報２３０が、図１２に示すものであったならば、モジュール間最適化済みオブジェクトモジュールＣ’の中の関数「ｗｏｏ（）｝を最適化したときには、ソースモジュール（Ａ）しか参照しなかったことがわかるので、関数「ｗｏｏ（）」については最適化済みのコードをリンクし、プログラムの実行の高速化を図ることができる。一方、図１３の形式の予測モジュール情報２３０Ａは、図１２の形式に比べて保存すべき情報の量を低減することができる。
【００３７】
次に、再び、図４に戻り、ステップ１０８０以降の処理について説明する。
図４のステップ１０７０において、モジュール間最適化部１２２は、コンパイル中のモジュールが、名前がｎの関数ｆを含むならばステップ１０８０に進む。例えば、図６に示すソースモジュール（Ｃ）２１０の関数「ｗｏｏ（）」の文が、「ｒｅｔｕｒｎ  （ｆｏｏ（））；」ではなく、「ｒｅｔｕｒｎ  （ｂｕｚ（））；」であるとすると、名前ｎ＝ｂｕｚの関数「ｂｕｚ（）」は、図６のソースモジュール（Ｃ）２１０に含まれるため、ステップ１０８０に進むことになる。
【００３８】
ステップ１０８０において、モジュール間最適化部１２２は、ステップ１１２０と同様にして、関数ｆがインライン展開の対象として適当かどうか調べる。サイズの大きな関数などは、インライン展開の対象として適当でない。適当でなければステップ１０３０に戻り、適当であるならばステップ１０９０に進む。
【００３９】
そして、ステップ１０９０において、モジュール間最適化部１２２は、ステップ１１３０と同様にして、文ｓに関数ｆの内容を展開した上で、ステップ１０３０に戻る。
以上で、図３に示した最適化部１２０の処理が終了する。
【００４０】
次に、最適化の処理が終了すると、図３に示すコパイラ１００のコード生成部１３０は、ソースモジュール（Ｃ）２１０のコンパイル結果であるモジュール間最適化済みオブジェクトモジュールＣ’を生成する。生成したモジュール間最適化済みオブジェクトモジュールは、モジュール間最適化済オブジェクトモジュール２２０として保存しておく。
【００４１】
次に、図１４を用いて、本実施形態による最適化方法に用いるリンカ３００の処理内容について説明する。
図１４は、本発明の一実施形態による最適化方法に用いるリンカの処理内容を示すフローチャートである。
【００４２】
図３に示したリンカ３００は、プログラム４００にソースモジュール（Ｃ）２１０をリンクするものである。プログラム４００が、リンカ３００にソースモジュールＳをプログラムにリンクするよう命じると、ステップ３０１０以降の処理を実行する。
ここで、プログラム４００が、リンカ３００にソースモジュール（Ｃ）２１０をリンクするよう求めた時点で、リンクテーブル２５０Ｘが図１５の状態にあり、リンク済みソースモジュール一覧表２４０Ａが図１８の状態にあったものとする。
【００４３】
ここで、図１５〜１７は、本発明の一実施形態による最適化方法に用いるリンカの処理で使用するリンクテーブル２５０の構成の説明図であり、図１８及び図１９は、本発明の一実施形態による最適化方法に用いるリンカの処理で使用するリンク済みソースモジュール一覧表２４０の構成の説明図である。
【００４４】
図１５〜１７に示すように、リンクテーブル２５０は、関数名２５１と、実行方式２５２と、関数本体のアドレス２５３と、予測モジュール情報のアドレス２５４とから構成されている。
実行方式２５２は、関数を実行する手段を表わしている。プログラム４００は関数呼出しにあたって、リンクテーブル２５０を調べ、目的の関数の実行方式が「インタプリタ」である場合には、関数をインタプリタ５００によって実行する実行方式が「直接」の場合は、関数をプロセッサ１０によって直接実行する。予測モジュール情報のアドレス２５４は、リンクテーブル２５０にエントリされた関数に対応する予測モジュール情報２３０のアドレスを表わす。
【００４５】
また、リンク済みソースモジュール一覧表２４０は、モジュール名２４１と、ファイル名２４２と、ファイル作成日時２４３と、ファイルサイズ２４４とから構成されている。リンク済みソースモジュール一覧表２４０Ｂの情報は、リンカがリンク済みのソースモジュールの内容が予測通りのものか検証するときに利用する。
【００４６】
図１４のステップ３０１０において、リンカ３００は、ユーザが指定したディレクトリからソースモジュールＳを読み込む。ここでは、ソースモジュール（Ｃ）２１０を読み込むものとする。
【００４７】
次に、ステップ３０２０において、リンカ３００は、ソースモジュールＳの中にある全ての関数をリンクテーブル２５０に登録し、登録した関数のリンクテーブル２５０上のエントリの実行方式の欄に、「インタプリタ」と記入する。図１６は、登録終了した時点におけるリンクテーブル２５０Ｙの具体例を示している。実行方式の欄に「インタプリタ」と記入することは、登録した関数がソースモジュール中のもので、インタプリタをつかって実行する必要があるということを意味している。図１５と図１６を比較すると理解されるように、ステップ３０２０の処理で、新たに、図６に示したソースモジュール（Ｃ）２１０の中のすべての関数「ｗｏｏ（）」と関数「ｂｕｚ（）」が登録されている。
【００４８】
また、ステップ３０２０では、リンカ３００は、ソースモジュールＳをリンク済みソースモジュール一覧表２４０に登録する。ソースモジュールＣをリンク済みソースモジュール一覧表２４０に登録する。図１９は、ステップ３０２０が終了した時点におけるリンク済みソースモジュール一覧表２４０Ｂを示している。図１８と図１９を比較すると理解されるように、ステップ３０２０の処理で、新たに、図６に示したソースモジュール（Ｃ）２１０が登録されている。
【００４９】
次に、ステップ３０３０以降の処理において、リンカ３００は、モジュール間最適化済みオブジェクトモジュール中のコードをプログラムにリンクすることを試み、プログラムの実行の高速化を図る。
そのため、ステップ３０３０において、リンカ３００は、集合Ｅを空集合とし、ステップ３０４０において、リンクテーブル２５０上のエントリをすべて集合Ｅに登録する。即ち、ステップ３０３０において集合Ｅを空集合とし、ステップ３０４０において集合Ｅを｛ｂｏｏ（），ｆｏｏ（），ｗｏｏ（），ｂｕｚ（）｝とする。
【００５０】
次に、ステップ３０５０において、リンカ３００は、集合Ｅが空集合かどうか調べ、そうであるならばリンクの処理を終了し、そうでないならばステップ３０６０に進む。ここでは、集合Ｅ＝｛ｂｏｏ（），ｆｏｏ（），ｗｏｏ（），ｂｕｚ（）｝であり、空集合でないので、ステップ３０６０に進むものとする。
次に、ステップ３０６０において、リンカ３００は、集合Ｅからエントリを一つ取り出してｆとする。例えば、「ｆ＝ｂｏｏ（）」とする。
【００５１】
次に、ステップ３０７０において、リンカ３００は、ｆの実行方式がインタプリタか調べ、そうでないならばステップ３０５０に戻り、そうであるならばステップ３０８０に進む。ステップ３０７０において、「ｂｏｏ（）」の実行方式が直接であることからステップ３０５０に戻る。同様にして、ステップ３０５０，３０６０を繰り返して、次の関数を取り出して、例えば、「ｆ＝ｆｏｏ（）」とすると、同様に、「ｆｏｏ（）」の実行方式が直接であることからステップ３０５０に戻る。しかし、次に、関数を取り出して、例えば、「ｆ＝ｗｏｏ（）」とすると、同様に、「ｗｏｏ（）」の実行方式は、図１６に示すように、「インタプリタ」であることからステップ３０８０に進む。
【００５２】
次に、ステップ３０８０において、リンカ３００は、ｆに対応するモジュール間最適化済みオブジェクトモジュールが存在するか調べ、ないならばステップ３０５０に戻り、あるならばステップ３０９０に進む。ここでは、「ｗｏｏ（）」を含むモジュール間最適化済みオブジェクトモジュールＣ’が存在することから、ステップ３０９０に進む。
【００５３】
次に、ステップ３０９０において、リンカ３００は、ｆの予測モジュール情報に登録された内容と一致する全てのソースモジュールがプログラムにリンクされているか、リンク済みソースモジュール一覧表を参照して調べ、リンクされていないならばステップ３０５０に戻り、リンクされているならばステップ３１００に進む。ここで、「ｗｏｏ（）」の予測モジュール情報２３０（図１２）とリンク済みソースモジュール一覧表２４０Ｂ（図１９））を照らし合わせると、予測モジュール情報２３０どおりの内容をもつソースモジュールＡがリンクされていることから処理１４１０に進む。
【００５４】
次に、ステップ３１００において、リンカ３００は、ｆのコードとしてモジュール間最適化済みオブジェクトモジュール２４０中のコードをリンクする。すなわち、ｆに対応するモジュール間最適化済みオブジェクトモジュール２４０を読み込み、読み込んだモジュール２４０中のｆに対応する関数のアドレスをｆの関数のアドレスの欄に書き込み、さらに、ｆの実行方式を「直接」に変更する。そして、ステップ３０５０に戻る。即ち、リンクテーブル上の「ｗｏｏ（）」の関数のアドレスを、図１７に示すように、モジュール間最適化済みオブジェクトモジュール２５０Ｚに変更し、実行方式を「直接」に変更して、ステップ３０５０に戻る。
【００５５】
また、関数「ｂｕｚ（）」についても、同様に変更を行い、リンクの処理を終了する。リンクの処理が終了した時点におけるリンクテーブル２５０の内容は、図１７に示すようになっている。図１７のリンクテーブルでは、関数「ｗｏｏ（）」，「ｂｕｚ（）」のコードとして、モジュール間最適化済みオブジェクトモジュール２４０中のコードがリンクされており、プログラムの実行の高速化が図られている。
【００５６】
以上説明したように、本実施形態によれば、コンパイラを用いて、プログラム実行前に予めモジュール間最適化を実行しているので、プログラムの実行を高速化することができる。
また、プログラムの実行時には、リンカは、予測モジュール情報を用いて登録したリンク済みソースモジュール一覧表によって、リンク済みソースモジュールが予想通りのものか否かを検証することにより、コンパイル後のモジュールの変更を知ることができるので、プログラム実行に問題が生じることを防止できる。そして、モジュールの変更があった際には、インタプリタによりプログラムを実行することができる。
【００５７】
次に、図２０及び図２１を用いて、本発明の他の実施形態による最適化方法について説明する。なお、本実施形態による最適化方法を適用する計算機システムの構成は、図１に示したものと同様である。
【００５８】
最初に、図２０を用いて、本実施形態によるディスク装置に記憶されているコンパイラとリンカを含む言語処理系の構成について説明する。なお、図２と同一符号は、同一部分を示している。
本実施形態においては、図２に示したコンパイラ１００に代えて、動的コンパイラ１００Ｘを用いている。そして、プログラム４００がソースモジュール２１０中の関数を実行するときには、関数を動的コンパイラ１００Ｘによってモジュール間最適化済みオブジェクトモジュール２２０に変換してから実行するようにしている。それ以外の構成・動作は、図２に示した実施形態と同様である。
【００５９】
動的コンパイラ１００Ｘは、プログラム４００を最初に予備的に実行し、ソースモジュール２１０をコンパイルしてモジュール間最適化済みオブジェクトモジュール２２０と予測モジュール情報２３０を生成し、保存する。そして、プログラム４００を２回目以降に実行するときに、最初の実行で動的コンパイラ１００Ｘが生成したモジュール間最適化済みモジュールを利用して、プログラム４００を実行する。従って、本実施形態では、プログラムを２回目以降に実行するときに、コンパイル時間を削減できるものである。
【００６０】
動的コンパイラ１００Ｘの構成は、図３に示したコンパイラ１００の構成と同様であり、ソース解析部１１０と、最適化部１２０と、コード生成部１３０とから構成されている。また、最適化部１２０は、モジュール間最適化部１２２と、モジュール予測部１２４とから構成されている。
【００６１】
モジュール間最適化部１２２の処理内容は、図４のフローチャートに示したとおりである。しかし、モジュール予測部１２４の処理内容は、図５のフローチャートに示したものと一部相違しており、この点については、図２１を用いて説明する。
【００６２】
ここで、図２１を用いて、本実施形態による最適化方法に用いるモジュール予測部の処理内容について説明する。
図２１は、本発明の他の実施形態による最適化方法に用いるモジュール予測部の処理内容を示すフローチャートである。
【００６３】
本実施形態によるモジュール予測部は、モジュール間最適化部１２２から要求された名前がｎの関数ｆを含むソースモジュールを、プログラムの実行中に実際にプログラムにリンクされたソースモジュール（リンクされたソースモジュール一覧表に記載されたモジュール）から探すようにしている。
図２１のステップ１１０１において、モジュール予測部は、集合Ｓを空集合とし、さらに、ステップ１１０２Ｘにおいて、リンクされたソースモジュール一覧表に記載されたモジュールを収める。
【００６４】
続くステップ１１０３以降の処理は、図５に示したコンパイラ１００のモジュール予測部１２４と同様である。
【００６５】
ここで、図２０に示した本実施形態による言語処理系を用いて、図６のソースモジュール（Ｃ）２１０をコンパイルし、リンクする過程について説明する。
プログラム４００が、リンカ２５０に、ソースモジュール（Ｃ）２１０をプログラム４００にリンクするよう求め、このときリンクテーブル２５０が図１８の状態にあり、リンク済みソースモジュール一覧表が図１８の状態にあったとする。リンカ２５０の処理内容は、図１４に示したものと同様であり、ソースモジュール（Ｃ）２１０に対応するモジュール間最適化済みオブジェクトＣ’が存在すれば、リンカ２５０は、図１４に示した処理過程と同一の過程でリンクをおこない、存在しなければ、ソースモジュール（Ｃ）２１０中の関数「ｗｏｏ（），ｂｕｚ（）」のエントリの実行方式はインタプリタのままであり、リンクテーブル２５０は図１６に示した状態になる。
【００６６】
リンクテーブル２５０が図１６に示す状態で、プログラム４００が関数「ｗｏｏ（）」を実行しようとすると、関数「ｗｏｏ（）」の実行方式が「インタプリタ」であることから、プログラム４００は、関数「ｗｏｏ（）」を動的コンパイラ１００Ｘによってコンパイルし、結果をリンクテーブル２５０に登録してから関数「ｗｏｏ（）」をプロセッサ１０で直接実行する。
【００６７】
関数「ｗｏｏ（）」を動的コンパイラ１００Ｘでコンパイルする過程も、コンパイラ１００と同様であるが、モジュール予測部１２４の動作だけが異なっている。
モジュール予測部は、モジュール間最適化部１２２に、関数「ｆｏｏ（）」を含むモジュールを予測するよう求められると、図２１のステップ１１０１において、集合Ｓを空集合とし、ステップ１１０２において、リンク済みソースモジュール一覧表２４０を参照して、集合Ｓ＝｛Ａ、Ｂ、Ｃ｝とする。
【００６８】
次に、ステップ１１０３において、集合Ｓが空集合でないことから、ステップ１１０４に進んで、「ｍ＝Ａ」とする。
次に、ステップ１１０５において、リンク済みのソースモジュール（Ａ）２１０Ａが、関数「ｆｏｏ（）」を含むことから、ステップ１１０６に進み、ソースモジュール（Ａ）２１０Ａ１を返戻して、モジュールの予測の処理を終了する。
【００６９】
以上のように、動的コンパイラは、プログラムを最初に予備的に実行し、ソースモジュールをコンパイルしてモジュール間最適化済みオブジェクトモジュールと予測モジュール情報を生成し、保存するので、プログラムを２回目以降に実行するときに、最初の実行で動的コンパイラが生成したモジュール間最適化済みモジュールを利用して、プログラムを実行する。従って、本実施形態では、プログラムを２回目以降に実行するときに、コンパイル時間を削減できる。
また、プログラムの実行時には、リンカは、予測モジュール情報を用いて登録したリンク済みソースモジュール一覧表によって、リンク済みソースモジュールが予想通りのものか否かを検証することにより、コンパイル後のモジュールの変更を知ることができるので、プログラム実行に問題が生じることを防止できる。そして、モジュールの変更があった際には、インタプリタによりプログラムを実行することができる。
【００７０】
【発明の効果】
本発明によれば、プログラムの実行速度を速くでき、しかも、プログラム実行前にコンパイルしても、プログラム実行時に問題の生じないものである。
【図面の簡単な説明】
【図１】本発明の一実施形態による最適化方法を適用する計算機システムの構成を示すブロック図である。
【図２】本発明の一実施形態によるディスク装置に記憶されているコンパイラとリンカを含む言語処理系の構成を示すブロック図である。
【図３】本発明の一実施形態による最適化方法に用いるコンパイラの構成を示すブロック図である。
【図４】本発明の一実施形態による最適化方法に用いるモジュール間最適化部の処理内容を示すフローチャートである。
【図５】本発明の一実施形態による最適化方法に用いるモジュール予測部の処理内容を示すフローチャートである。
【図６】本発明の一実施形態による最適化方法によって最適化されるソースモジュールの一例の構成図である。
【図７】本発明の一実施形態による最適化方法によって最適化されるソースモジュールの一例の構成図である。
【図８】本発明の一実施形態による最適化方法によって最適化されるソースモジュールの一例の構成図である。
【図９】本発明の一実施形態による最適化方法によって最適化されたソースモジュールの例図である。
【図１０】本発明の一実施形態による最適化方法によって最適化されたソースモジュールの例図である。
【図１１】本発明の一実施形態による最適化方法によって最適化されたソースモジュールの例図である。
【図１２】本発明の一実施形態による最適化方法に用いる予測情報の一例の説明図である。
【図１３】本発明の一実施形態による最適化方法に用いる予測情報の他の例の説明図である。
【図１４】本発明の一実施形態による最適化方法に用いるリンカの処理内容を示すフローチャートである。
【図１５】本発明の一実施形態による最適化方法に用いるリンカの処理で使用するリンクテーブルの構成の説明図であり、
【図１６】本発明の一実施形態による最適化方法に用いるリンカの処理で使用するリンクテーブルの構成の説明図であり、
【図１７】本発明の一実施形態による最適化方法に用いるリンカの処理で使用するリンクテーブルの構成の説明図であり、
【図１８】本発明の一実施形態による最適化方法に用いるリンカの処理で使用するリンク済みソースモジュール一覧表の構成の説明図である。
【図１９】本発明の一実施形態による最適化方法に用いるリンカの処理で使用するリンク済みソースモジュール一覧表の構成の説明図である。
【図２０】本発明の他の実施形態によるディスク装置に記憶されているコンパイラとリンカを含む言語処理系の構成を示すブロック図である。
【図２１】本発明の他の実施形態による最適化方法に用いるモジュール予測部の処理内容を示すフローチャートである。
【符号の説明】
１０…プロセッサ
２０…主記憶
３０…ディスク駆動装置
４０…媒体駆動装置
４２…記憶媒体
１００…コンパイラ
１００Ｘ…動的コンパイラ
２１０…ソースモジュール
２２０…モジュール間最適化済みオブジェクトモジュール
２３０…予測モジュール情報
２４０…リンク済ソースモジュール一覧表
２５０…リンクテーブル
３００…リンカ
４００…プログラム
５００…インタプリタ
【図１】
0003604936.tif 000002
【図２】
0003604936.tif 000003
【図３】
0003604936.tif 000004
【図４】
0003604936.tif 000005
【図５】
0003604936.tif 000006
【図６】
0003604936.tif 000007
【図７】
0003604936.tif 000008
【図８】
0003604936.tif 000009
【図９】
0003604936.tif 000010
【図１０】
0003604936.tif 000011
【図１１】
0003604936.tif 000012
【図１２】
0003604936.tif 000013
【図１３】
0003604936.tif 000014
【図１４】
0003604936.tif 000015
【図１５】
0003604936.tif 000016
【図１６】
0003604936.tif 000017
【図１７】
0003604936.tif 000018
【図１８】
0003604936.tif 000019
【図１９】
0003604936.tif 000020
【図２０】
0003604936.tif 000021
【図２１】
0003604936.tif 000022