(57)【特許請求の範囲】
【請求項１】
プログラム実行時の挙動を表わすＰＡ情報を取得する該プログラム上の範囲を表わすＰＡレンジが記述されたＰＡ位置ファイルと、プログラム言語を用いて作成されたソースプログラムとを取得する取得手段と、
前記取得手段で取得したソースプログラムを中間言語で記述された第１のプログラムに変換する第１変換手段と、
前記ＰＡ位置ファイルから前記ＰＡレンジを読み出して、該ＰＡレンジを前記第１のプログラム上に設定する第１設定手段と、
前記第１設定手段で前記ＰＡレンジが設定された前記第１のプログラムに最適化処理を施して、該第１のプログラム上に設定された前記ＰＡレンジを引き継いだ第２のプログラムを生成する最適化手段と、
前記第１のプログラム上の前記ＰＡレンジ内のループ又は処理ブロックの数と比べたときの前記第２のプログラム上の前記ＰＡレンジ内のループ又は処理ブロックの数の増加の有無を調べ、該第２のプログラム上の該ＰＡレンジ内のループ又は処理ブロックの数が増加していた場合に、該第２のプログラム上の前記ＰＡレンジ内の各ループ又は各処理ブロックに新たなＰＡレンジを設定する第２設定手段と、
前記第２のプログラムに、前記ＰＡ情報取得のためのＰＡ情報取得関数を、該第２のプログラムに設定された前記ＰＡレンジ毎に埋め込む関数埋込手段と、
前記ＰＡ情報取得関数が埋め込まれた状態の前記第２のプログラムを、コンピュータ上で実行可能なオブジェクトプログラムに変換する第２変換手段とを有することを特徴とするコンパイル装置。
【請求項２】
前記ＰＡ位置ファイルは、前記ＰＡレンジとともに、前記第２設定手段で新たなＰＡレンジを設定する場合の該新たなＰＡレンジ設定箇所を指定するＰＡレンジ設定箇所指定情報が記述されたものであって、
前記第２設定手段は、前記第２のプログラム上に、前記新たなＰＡレンジを、前記ＰＡレンジ設定箇所指定情報に基づいて設定するものであることを特徴とする請求項１記載のコンパイル装置。
【請求項３】
プログラムを実行する、またはコンパイルを行う演算処理装置内で実行され、該演算処理装置内に、
プログラム実行時の挙動を表わすＰＡ情報を取得する該プログラム上の範囲を表わすＰＡレンジが記述されたＰＡ位置ファイルと、プログラム言語を用いて作成されたソースプログラムとを取得する取得手段と、
前記取得手段で取得したソースプログラムを中間言語で記述された第１のプログラムに変換する第１変換手段と、
前記ＰＡ位置ファイルから前記ＰＡレンジを読み出して、該ＰＡレンジを前記第１のプログラム上に設定する第１設定手段と、
前記第１設定手段で前記ＰＡレンジが設定された前記第１のプログラムに最適化処理を施して、該第１のプログラム上に設定された前記ＰＡレンジを引き継いだ第２のプログラムを生成する最適化手段と、
前記第１のプログラム上の前記ＰＡレンジ内のループ又は処理ブロックの数と比べたときの前記第２のプログラム上の前記ＰＡレンジ内のループ又は処理ブロックの数の増加の有無を調べ、該第２のプログラム上の該ＰＡレンジ内のループ又は処理ブロックの数が増加していた場合に、該第２のプログラム上の前記ＰＡレンジ内の各ループ又は各処理ブロックに新たなＰＡレンジを設定する第２設定手段と、
前記第２のプログラムに、前記ＰＡ情報取得のためのＰＡ情報取得関数を、該第２のプログラムに設定された前記ＰＡレンジ毎に埋め込む関数埋込手段と、
前記ＰＡ情報取得関数が埋め込まれた状態の前記第２のプログラムを、コンピュータ上で実行可能なオブジェクトプログラムに変換する第２変換手段とを有するコンパイル装置を構築することを特徴とするコンパイルプログラム。
【請求項４】
前記ＰＡ位置ファイルは、前記ＰＡレンジとともに、前記第２設定手段で新たなＰＡレンジを設定する場合の該新たなＰＡレンジ箇所を指定するＰＡレンジ設定箇所指定情報が記述されたものであって、
前記第２設定手段は、前記第２のプログラム上に、前記新たなＰＡレンジを、前記ＰＡレンジ設定箇所指定情報に基づいて設定するものであることを特徴とする請求項３記載のコンパイルプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本願は、コンパイル装置およびコンパイルプログラムに関する。
【背景技術】
【０００２】
プログラムの実行性能のボトルネックとなっている箇所の特定や改善方法を短期間で見つけ出すための技術として「プロファイラ」と呼ばれる技術が存在する。このプロファイラは、プログラム実行時に、関数の呼び出し回数、サイクル数、キャッシュミスの数など、プログラム実行時の挙動を表わすＰＡ（Ｐｒｏｆｉｌｅ  Ａｎａｌｙｓｉｓ）情報（性能解析情報、ハードウエア情報）を取得する技術である。このプロファイラには、大別して以下の２種類が存在する。
【０００３】
・実行時に、一定間隔の割込みにより、全体の大まかなＰＡ情報を取得する。
【０００４】
・ソースプログラムに、ＰＡ情報取得のための関数呼び出しを手作業で加え、そのソースプログラムの中の一部分について詳細なＰＡ情報を取得する。
【０００５】
詳細なＰＡ情報を取得するためには後者の方法が選択されるが、コンパイルの際の最適化処理によってソースプログラムには表現されないループや処理ブロックが生成されることがある。この場合、ＰＡ情報取得関数をソースプログラム上に書き加えておいてもコンパイルの際に生成される新たなループや処理ブロックにおける詳細なＰＡ情報を取得することができないおそれがある。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平９−６２５４４号公報
【特許文献２】特開２０００−１９４５６６号公報
【特許文献３】特開２００４−１１０８２４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
１つの側面では、本発明は、コンパイルの際に新たに生成されたループや処理ブロックについてもＰＡ情報を取得できるオブジェクトプログラムを生成することにある。
【課題を解決するための手段】
【０００８】
本件開示のコンパイル装置は、取得手段と、第１変換手段と、第１設定手段と、最適化手段と、第２設定手段と、関数埋込手段と、第２変換手段とを有する。
【０００９】
ここで、取得手段は、ＰＡ位置ファイルとソースプログラムとを取得する。ＰＡ位置ファイルは、プログラム実行時の挙動を表わすＰＡ情報を取得する、そのプログラム上の範囲を表わすＰＡレンジが記述されたファイルである。また、ソースプログラムは、プログラム言語を用いて作成されたプログラムである。
【００１０】
また、第１変換手段は、取得手段で取得したソースプログラムを中間言語で記述された第１のプログラムに変換する。
【００１１】
第１設定手段は、取得手段が取得したＰＡ位置ファイルからＰＡレンジを読み出して、そのＰＡレンジを上記の第１のプログラム上に設定する。
【００１２】
最適化手段は、第１設定手段でＰＡレンジが設定された第１のプログラムに最適化処理を施して、その第１のプログラム上に設定されたＰＡレンジを引き継いだ第２のプログラムを生成する。
【００１３】
第２設定手段は、第１のプログラム上のＰＡレンジ内のループ又は処理ブロックの数と比べたときの第２のプログラム上のＰＡレンジ内のループ又は処理ブロックの数の増加の有無を調べる。そして、第２のプログラム上のＰＡレンジ内のループ又は処理ブロックの数が増加していた場合に、この第２設定手段は、その第２のプログラム上のＰＡレンジ内の各ループ又は各処理ブロックに新たなＰＡレンジを設定する。
【００１４】
関数埋込手段は、上記の第２のプログラムに、ＰＡ情報取得のためのＰＡ情報取得関数を、その第２のプログラムに設定されたＰＡレンジ毎に埋め込む。
【００１５】
さらに、第２変換手段は、ＰＡ情報取得関数が埋め込まれた状態の第２のプログラムを、コンピュータ上で実行可能なオブジェクトプログラムに変換する。
【００１６】
また、本件開示のコンパイルプログラムは、プログラムをコンパイルする演算処理装置内で実行され、その演算処理装置内に、本件のコンパイル装置を構築するプログラムである。
【発明の効果】
【００１７】
本件開示のコンパイル装置およびコンパイルプログラムによれば、コンパイルの際に生成された新たなループや処理ブロックについても詳細なＰＡ情報を取得することができる。したがってプログラムの実行性能の詳細な分析が可能となる。
【図面の簡単な説明】
【００１８】
【図１】最適化処理においてＳＩＭＤ化が行なわれ、その結果、複数のループが生成される例を示した図である。
【図２】最適化処理によりループ分配が行なわれた例を示した図である。
【図３】コンパイル装置の一実施形態として動作するコンピュータの外観図である。
【図４】図３に外観を示すコンピュータのハードウエア構成図である。
【図５】実施形態としてのコンパイル装置の機能説明図である。
【図６】ＰＡ位置ファイルの記述内容を示す図である。
【図７】最適化情報を示す図である。
【図８】ソースプログラムを取得して中間言語による第１のプログラムに変換する処理のイメージを示した図である。
【図９】図５のＰＡ位置ファイル解析部１３での処理を示すフローチャートである。
【図１０】ＰＡ位置ファイル解析部１３での処理のイメージを示す図である。
【図１１】最適化処理により生成された第２のプログラムを示すイメージ図である。
【図１２】図５のＰＡ取得関数挿入部１５の処理を示すフローチャートの前半部分を示す図である。
【図１３】図５のＰＡ取得関数挿入部１５の処理を示すフローチャートの後半部分を示す図である。
【図１４】ループ数の増加が認識された段階の第２のプログラムのイメージ図である。
【図１５】第２のプログラム上に新たなＰＡレンジが設定された状態を示すイメージ図である。
【図１６】第２のプログラムにＰＡ情報取得関数が埋め込まれた状態を示すイメージ図である。
【図１７】ソースプログラム上に、図６の中間言語イメージ上のＰＡ取得関数と同じ内容を書き下したときのイメージ図である。
【図１８】「ａｌｌ」以外の「ＰＡレンジ設定箇所指定情報」が指定された場合の、ソースコードイメージを示した図である。
【図１９】コンパイル実行時の表示画面例を示す図である。
【図２０】実行ファイルに格納された、ＰＡ情報取得関数が埋め込まれたオブジェクトプログラムの実行により得られるＰＡ情報の表示イメージを示した図である。
【発明を実施するための形態】
【００１９】
以下、コンパイル時の最適化処理によってループや処理ブロックが増加する場合を例示し、その後、実施形態を説明する。
【００２０】
図１は、最適化処理においてＳＩＭＤ化が行なわれ、その結果、複数のループが生成される例を示した図である。最適化処理はコンパイル装置内で取り扱うのに適した中間言語上で行なわれるが、この図１では、分かり易さのため、ソースプログラムであるか中間言語を用いたプログラムであるかを問わず、ソースプログラムの形式で示している。
【００２１】
図１（Ａ）のソースプログラム中の（１）行目の「ｄｏ  ｉ＝１，１００」は、以下の処理を行なうことを意味している。
【００２２】
・先ずｉ＝１と置いて、（３）行目の「ｅｎｄ  ｄｏ」までの間の処理を実行する。
【００２３】
・その後ｉを１ずつインクリメントしながらｉ＝１００になるまで「ｅｎｄ  ｄｏ」までの間の処理を繰り返す。
【００２４】
また、（２）行目の「ａ（ｉ）＝３」は、配列ａの中のａ（ｉ）に３を代入することを意味している。
【００２５】
さらに、（３）行目の「ｅｎｄ  ｄｏ」は、（１）行目の「ｄｏ  ｉ＝１，１００」を開始位置とするループの終了位置であることを意味している。
【００２６】
ここでは、この図１（Ａ）に示す単純なループを例に挙げて説明する。
【００２７】
図１（Ｂ）は、図１（Ａ）のプログラムを元にコンパイルにおける最適化処理により作成されたプログラムを示している。
【００２８】
図１（Ｂ）の（１）行目の「ｉｆ」文は、配列ａが８バイトの境界上にある場合に、（５）行目の「ｅｌｓｅ」よりも手前（（４）行目まで）の処理を実行し、そうでない場合には、（５）行目の「ｅｌｓｅ」以降の処理を実行することを意味している。
【００２９】
ここでは、メモリのアクセスが８バイト単位であって、かつアクセスの境界がハードウェア的に決まっていることを想定している。ただし、ここでは、この条件自体に大きな意味はなく、詳細説明は省略する。
【００３０】
また、（２）行目の「ｄｏ  ｉ＝１，９９，２」は、先ずｉ＝１と置いて（４）行目の「ｅｎｄ  ｄｏ」までの処理を実行し、その後ｉを２ずつインクリメントしながら（４）行目「ｅｎｄ  ｄｏ」までの処理をｉ＝９９まで繰り返すことを意味している。
【００３１】
また、（３）行目の「ａ（ｉ：ｉ＋１）＝３」は、ａ（ｉ）とａ（ｉ＋１）の双方に３を代入することを意味している。
【００３２】
この（３）行目の処理のように１つの命令で複数のデータを処理（ここではａ（ｉ）＝３の処理とａ（ｉ＋１）＝３の処理）を実行することをＳＩＭＤ（Ｓｉｎｇｌｅ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｍｕｌｔｉｐｌｅ  Ｄａｔａ）と呼ぶ。このＳＩＭＤによれば高速処理が期待できる。
【００３３】
（４）行目の「ｅｎｄ  ｄｏ」は、（２）行目の「ｄｏ  ｉ＝１，９９，２」を開始位置とするループの終了位置であることを意味している。
【００３４】
（５）行目は、（１）行目の「ｉｆ」文での実例（ここでは「配列ａが８バイトの境界上にある」という条件）を満たさない場合に、この「ｅｌｓｅ」文以下の処理を行なうことを意味している。
【００３５】
（６）行目の「ｄｏ  ｉ＝１，１００，１」は、先ずｉ＝１と置いて（８）行目の「ｅｎｄ  ｄｏ」までの間の処理を実行し、その後ｉを１ずつインクリメントしながら（８）行目までの間の処理をｉ＝１００まで繰り返すことを意味している。
【００３６】
（７）行目の「ａ（ｉ）＝３」は、配列ａの中のａ（ｉ）に３を代入することを意味している。
【００３７】
（８）行目の「ｅｎｄ  ｄｏ」は、（６）行目の「ｄｏ  ｉ＝１，１００，１」を開始位置とするループの終了位置であることを意味している。
【００３８】
（９）行目の「ｅｎｄ  ｉｆ」は、（１）行目の「ｉｆ」文を開始位置とする処理の終了位置であることを意味している。
【００３９】
すなわち、この図１（Ｂ）は、配列ａが８バイトの境界上にある場合は、（３）行目のＳＩＭＤにより処理の高速化を図り、そうでない場合は、単純な逐次処理が行なわれるプログラムを表わしている。
【００４０】
この図１（Ｂ）のプログラムの場合、図１（Ｂ）に示した（ｃ）のｉｆとｅｎｄｉｆとに囲まれたブロックが図１（Ａ）のループに相当する。図１（Ａ）の場合は単純な１つのループで構成されているが、図１（Ｂ）の場合はｉｆ−ｅｌｓｅ文のｉｆ配下とｅｌｓｅ配下それぞれにループが生成されている。すなわちこの図１（Ｂ）には、（ｃ）のブロック内に（ａ）と（ｂ）の２つのループが存在する。
【００４１】
図１（Ａ）のループに関しＰＡ情報を取得するための関数を図１（Ａ）のソースプログラムに埋め込んだ場合、単純には、図１（Ｂ）の（ｃ）のブロック全体についてのＰＡ情報が得られ、（ａ）や（ｂ）のループ単独でのＰＡ情報を得ることはできない。（ｃ）のブロックのＰＡ情報を取得しても（ａ）のループと（ｂ）のループのどちらが実行されたのか不明ともなりかねず、プログラムの実行性能の分析が不十分となるおそれがある。
【００４２】
後述する実施形態の場合、（ａ）のループや（ｂ）のループのそれぞれについて分離したＰＡ情報を取得することが可能であり、プログラムの実行性能の詳細な分析を行なうことが可能となる。
【００４３】
ここでは、最適化処理によりｉｆ−ｅｌｓｅ文のｉｆ配下とｅｌｓｅ配下それぞれにループが生成される例について説明したが、そのプログラムの記述によっては、処理ブロックが生成されることもある。実際のプログラムは通常はもっと複雑な記述となっているが、図１の例で処理ブロックを説明すると、例えば以下のように説明される。すなわち、図２（Ｂ）に示す（ｂ）のループに代わり、「ａ（１）＝３」，「ａ（２）＝３」，「ａ（３）＝３」の３つの処理が逐次的に行なわれるように記述されたプログラムが生成される可能性がある。このような場合、「ａ（１）＝３」，「ａ（２）＝３」，「ａ（３）＝３」の３つの処理の連続を１つの処理ブロックとして捉え、後述する実施形態ではそのような処理ブロックについても、ループと同様、その処理ブロックについての独立したＰＡ情報を取得することが可能である。
【００４４】
図２は、最適化処理によりループ分配が行なわれた例を示した図である。
【００４５】
図２（Ａ）はソースプログラムであって、その（１）行目の「ｄｏ  ｉ＝１，ｎ」は、以下の処理を行なうことを意味している。
【００４６】
・先ずｉ＝１を置いて（４）行目の「ｅｎｄ  ｄｏ」までの間の処理を実行する。
【００４７】
・その後ｉを１つずつインクリメントしながらｉ＝ｎに達するまで、（４）行目の「ｅｎｄ  ｄｏ」までの間の処理を繰り返す。
【００４８】
また、図２（Ａ）の（２）行目のａ（ｉ）＝ｉは、配列ａのうちのａ（ｉ）にｉを代入することを意味している。
【００４９】
また、３行目のｂ（ｉ）＝ｂ（ｉ−１）＋ａ（ｉ）は、配列ｂのうちのｂ（ｉ−１）の値とａ（ｉ）の値とを足し算して、ｂ（ｉ）に代入することを意味している。
【００５０】
さらに、（４）行目の「ｅｎｄ  ｄｏ」は、（１）行目の「ｄｏ  ｉ＝１，ｎ」を開始位置とするループの終了位置であることを意味している。
【００５１】
図２（Ｂ）は、最適化処理により図２（Ａ）のソースプログラムを元にして作成されたプログラムを示している。
【００５２】
この図２（Ｂ）の（１）行目の「ｄｏ  ｉ＝１，ｎ」は、図２（Ａ）の１行目と同様である。
【００５３】
図２（Ｂ）の（２）行目の「ａ（ｉ）＝ｉ」は、図２（Ａ）の（２）行目と同じである。
【００５４】
また、図２（Ｂ）の（４）行目の「ｄｏ  ｉ＝１，ｎ」は、（１）行目の「ｄｏ  ｉ＝１，ｎ」と同様である。ただし、この（４）行目を開始位置とするループの終了位置は（６）行目の「ｅｎｄ  ｄｏ」である。
【００５５】
また、図２（Ｂ）の（５）行目の「ｂ（ｉ）＝ｂ（ｉ−１）＋ａ（ｉ）」は、図２（Ａ）の（３）行目と同じである。ずなわち、この図２の場合、図２（Ａ）の（１）行目〜（４）行目の全域からなるループは、図２（Ｂ）の（ｃ）で示す範囲の全域に相当する。図２（Ａ）の場合は単純な１つのループで構成されているが、図２（Ｂ）の場合ループ分配が行なわれ、（ｃ）で示す範囲の中に（ａ）と（ｂ）の２つのループが存在する。
【００５６】
ここでは、簡単なソースプログラムを用いて例示しているが、例えば演算のためのレジスタが不足するような複雑な演算処理を行なうループの場合、図２（Ｂ）にようにループを複数に分離した方が効率の良い演算処理を行なうことができる場合がある。最適化処理によりループ分配した方が効率的と判断されると図２（Ｂ）のようなループ分配が行なわれることがある。
【００５７】
この図２の場合も図１の場合と同様であり、ＰＡ情報取得のための関数を図２（Ａ）のソースプログラムに埋め込んだ場合、単純には、図２（Ｂ）の（ｃ）の範囲全体についてのＰＡ情報の取得が行なわれることになる。この場合、（ａ）や（ｂ）のループ単独でのＰＡ情報を得ることはできない。したがって、（ｃ）の範囲での実行性能が悪い場合、（ａ）のループに問題があるのか（ｂ）のループに問題があるのか詳細な分析が不充分となるおそれがある。
【００５８】
そこで以下では、図１（Ｂ）や図２（Ｂ）の（ａ）や（ｂ）のループについても独立したＰＡ情報を取得できるようにした実施形態を説明する。
【００５９】
図３は、コンパイル装置の一実施形態として動作するコンピュータの外観図、図４は、図３に外観を示すコンピュータのハードウエア構成図である。
【００６０】
図３に示すコンピュータ１００は、後述するＣＰＵ（Ｃｏｎｔｒｏｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）、メモリ、ハードディスク装置等を内蔵した本体部１１０を有する。またこのコンピュータ１００は、その本体部１１０からの指示により表示画面１２１上に画像を表示する画像表示部１２０を有する。さらに、このコンピュータ１００は、ユーザによるキー操作に応じてこのコンピュータ１００内に指示や文字情報等を入力するキーボード１３０を有する。さらに、このコンピュータ１００は、ユーザ操作により、表示画面１２１上に表示されたカーソルの移動や、表示画面１２１上に表示されたアイコン等の指定による指示入力等を行なうマウス１４０を有する。
【００６１】
本体部１１０は、ＣＤ（Ｃｏｍｐａｃｔ  Ｄｉｓｋ）やＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）（以下では、ＣＤとＤＶＤを区別せずにＣＤ／ＤＶＤと称する）が装填されるＣＤ／ＤＶＤ装填口１１１を有する。その本体部１１０の内部には、そのＣＤ／ＤＶＤ装填口１１１から装填されたＣＤ／ＤＶＤをドライブする、ＣＤ／ＤＶＤドライブが内蔵されている。
【００６２】
本体部１１０には、さらに、図４に示すように、ＣＰＵ（Ｃｏｎｔｒｏｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）１１２、メモリ１１３、ハードディスク装置１１４およびネットワークインタフェイス１１５を有する。また、この図５には、ＣＤ／ＤＶＤ１１７をドライブする上述のＣＤ／ＤＶＤドライブ１１６も示されている。
【００６３】
これらの各要素の相互間、さらに、これらの各要素と、図４に外観を示した画像表示部１２０、キーボード１３０およびマウス１４０との相互間は、バス１５０で接続されている。
【００６４】
ここで、ハードディスク装置１１４には、各種プログラムやデータ等が保存されている。このハードディスク装置１１４に保存されているプログラムが読み出されてメモリ１１３に展開され、そのメモリ１１３上に展開されたプログラムがＣＰＵ１１２で実行される。また、ネットワークインタフェイス１１５は、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）やインタネット等を介して外部と通信する要素である。
【００６５】
ここでハードディスク装置１１４には、ソースプログラム（例えば図１（Ａ），図２（Ａ）参照）を元にオブジェクトプログラムを作成するコンパイルプログラムが保存されている。
【００６６】
ソースプログラムは、ＣＤ／ＤＶＤ１１７に格納されてＣＤ／ＤＶＤドライブ１１６で読み込まれる。あるいは、ネットワークインタフェース１１５を介して受信してもよい。ハードディスク装置１１４に保存されているコンパイルプログラムがメモリ１１３に展開されＣＰＵ１１２で実行されると、このコンピュータ１００はコンパイル装置の一例として動作する。このコンピュータ１００がコンパイル装置として動作すると、上記のようにして取得したソースプログラムを元にオブジェクトプログラムが作成される。作成されたオブジェクトプログラムは一旦はハードディスク装置１１４内に保存された後、ＣＤ／ＤＶＤドライブ１１６によりＣＤ／ＤＶＤに書き込まれたり、あるいは、ネットワークインタフェース１１５を介して送信される。このようにして、そのオブジェクトプログラムが実行先のコンピュータ（図示せず）に渡され、そのコンピュータで実行される。
【００６７】
図５は、実施形態としてのコンパイル装置の機能説明図である。
【００６８】
この図５のコンパイル装置１０は、図３，図４に示すコンピュータ内でのコンパイルプログラムの実行によりそのコンピュータ内に実現する機能を表わしたものである。
【００６９】
この図５のコンパイル装置１０は、プログラム言語で作成されたソースプログラム１を取り込み、そのソースプログラム１を、実行予定のコンピュータ上で実行可能なオブジェクトプログラム２に変換するコンパイルを実行する装置である。ここで、このオブジェクトプログラム２が実行されるコンピュータは、このコンパイル装置１０の機能実現に用いるコンピュータと同一のコンピュータであることを妨げるものではないが、別のコンピュータであってもよい。
【００７０】
ここで、本実施形態の場合、コンパイル装置１０にはソースプログラム１のほかＰＡ位置ファイル３も取り込まれ、そのＰＡ位置ファイル３の記述を元にＰＡ情報取得のための関数が埋め込まれたオブジェクトプログラム２が生成される。本実施形態ではＰＡ情報として、ＰＡレンジで指定された区間内での「サイクル数」、「命令数」、「キャッシュミス」などを取得する関数が埋め込まれる。
【００７１】
このコンパイル装置１０は、ソースプログラム／ＰＡ位置ファイル取得部１１と、構文解析部１２と、ＰＡ位置ファイル解析部１３と、最適化部１４と、ＰＡ取得関数挿入部１５と、コード生成部１６とを有する。また、このうちのＰＡ取得関数挿入部１５は、ＰＡレンジ設定部１５１と、関数埋込部１５２とを有する。
【００７２】
ソースプログラム／ＰＡ位置ファイル取得部１１は、取得手段の一例であり、このコンパイル装置１０にソースプログラム１とＰＡ位置ファイル２とを取り込む。ソースプログラム１は、フォートラン言語やＣ言語、Ｃ＋＋言語などのプログラム言語で作成されたプログラムである。また、ＰＡ位置ファイル３は、プログラム実行時の挙動を表わすＰＡ情報を取得する、プログラム上の範囲を表わすＰＡレンジが記述されたファイルである。また、このＰＡ位置ファイル３には、そのＰＡレンジとともに、後述するＰＡレンジ設定部１５１で新たなＰＡレンジを設定する場合の、その新たなＰＡレンジ設定箇所を指定するＰＡレンジ設定箇所指定情報も記述されている。
【００７３】
図６は、本実施形態におけるＰＡ位置ファイルの記述内容を示す図である。１行目には、「＊」印に続き、「ＰＡレンジ設定箇所指定情報」のいずれかが記述されている。このＰＡレンジ設定箇所指定情報には、
「ａｌｌ」
「ｅｎｔｉｒｅｔｙ−ｌｏｏｐ−ｏｎｌｙ」
「ｍａｉｎ−ｌｏｏｐ−ｏｎｌｙ」
「ｍｏｄ−ｌｏｏｐ−ｏｎｌｙ」
の４種類が存在する。
【００７４】
これらについて、図１（Ｂ），図２（Ｂ）を参照しながら説明する。
【００７５】
「ａｌｌ」は、図１（Ｂ），図２（Ｂ）の（ａ），（ｂ），（ｃ）の全てのループについてＰＡ情報を取得することを意味している。
【００７６】
また、「ｅｎｔｉｒｅｔｙ−ｏｎｌｙ」は、（ｃ）のループについてのみＰＡ情報を取得し、（ａ），（ｂ）の個々のループについての独立したＰＡ情報の取得は不要であることを意味している。
【００７７】
また、「ｍａｉｎ−ｌｏｏｐ−ｏｎｌｙ」は、子ループのうちの最初のループ、すなわち（ａ）のループについてのみＰＡ情報を取得し、（ｂ），（ｃ）のループについてのＰＡ情報の取得は不要であることを意味している。
【００７８】
さらに、「ｍｏｄ−ｌｏｏｐ−ｏｎｌｙ」は、子ループのうちの最初のループを除く各ループ（図１（Ｂ），図２（Ｂ）の場合は（ｂ）のループ）についてのＰＡ情報を取得し、（ａ），（ｃ）のループについてのＰＡ情報の取得は不要であることを意味している。
【００７９】
また、ＰＡ位置ファイル内の記述内容のうちの２行目は以下のことを意味している。
【００８０】
「ソースファイル名」はＰＡ情報取得対象のソースプログラムが記述されたソースファイルの名前、「モジュール名」は、そのソースファイル中の、ＰＡ情報を取得するモジュールの名前である。さらに、「始点行番号，終点行番号」は、そのモジュール中のＰＡ取得範囲の、それぞれ開始位置，終了位置を表わす始点行番号，終点行番号である。これら開始位置と終了位置とに挟まれる範囲を、ここでは「ＰＡレンジ」と称している。
【００８１】
図６では、ＰＡ位置ファイルは２行で記述されているが、３行目以降にも２行目と同様の記述を行ない、１つのＰＡ位置ファイルで複数のＰＡレンジを指定することも可能である。
【００８２】
図５に戻って説明を続ける。
【００８３】
図５に示すコンパイル装置１０の構文解析部１２は、第１変換手段の一例であり、ソースプログラム／ＰＡ位置ファイル取得部１１で取得したソースプログラムを、このコンパイル装置１０での取扱いに適した中間言語で記述された第１のプログラムに変換する。
【００８４】
また、ＰＡ位置ファイル解析部１３は、第１設定手段の一例である。すなわち、このＰＡ位置ファイル解析部１３は、ＰＡ位置ファイルから、ＰＡ取得範囲の開始位置を終了位置とで規定されるＰＡレンジを読み出して、そのＰＡレンジ（開始位置と終了位置）を上記の第１のプログラム上に設定する。
【００８５】
また最適化部１４は、最適化手段の一例であり、ＰＡレンジが設定された第１のプログラムに最適化処理を施して、その第１のプログラム上に設されたＰＡレンジを引き継いだ第２のプログラムを生成する。ここでの最適化処理は、例えば図１，図２に示すＳＩＭＤ化やループ分配など、第１のプログラムに、そのプログラムがより効率的に実行されるように変更を加える処理をいう。
【００８６】
この最適化部１４による最適化処理内容は、最適化情報１４１として書き残される。
【００８７】
図７は最適化情報を示す図である。
【００８８】
ここでは、「ソースファイル名」と「モジュール名」と「対象行番号」とにより、最適化処理によるプログラムの変更が加えられた位置が特定される。また、「最適化種別」により、最適化処理によって行なわれたプログラムの変更の種別が特定される。「最適化種別」には、例えば、「ＳＩＭＤ化」（図１参照）や「ループ分配」（図２参照）などが含まれる。
【００８９】
また図５に示すＰＡ取得関数挿入部１５を構成するＰＡレンジ設定部１５１は、第２設定手段の一例であり、第１のプログラムと比べたときの、第２のプログラム上のＰＡレンジ内のループ又は処理ブロックの数の増加の有無を調べる。そして増加していた場合に、第２のプログラム上のＰＡレンジ内の各ループ又は処理ブロックに新たなＰＡレンジを設定する。この新たなＰＡレンジを設定するにあたっては、ＰＡ位置ファイル３に記述された「ＰＡレンジ設定箇所指定情報」に基づいて新たなＰＡレンジが設定される。
【００９０】
また、ＰＡ取得関数挿入部１５を構成する関数埋込部１５２は、関数埋込手段の一例であって、第２のプログラムに、ＰＡ情報取得のためのＰＡ情報取得関数を、第２のプログラムに設定されたＰＡレンジごとに埋め込む。
【００９１】
さらに、コード生成部１６は、第２の変換手段の一例であり、ＰＡ情報取得関数が埋め込まれた第２のプログラムを、コンピュータ上で実行可能なオブジェクトプログラム２に変換する。ソースプログラム１が、メインルーチンとサブルーチンなど複数のプログラムに分かれている場合もある。このとき、コード生成部１６は、それら複数のプログラムについてオブジェクトプログラムを作成する。その後、リンカ１７によって、複数のオブジェクトプログラムを統合し、最終的に実行可能なオブジェクトプログラムを作成する。
【００９２】
以下、ソースプログラムおよびＰＡ位置ファイルの例を挙げながら、図５に示すコンパイル装置１１の各部の動作についてさらに記述する。
【００９３】
図８は、ソースプログラムを取得して中間言語による第１のプログラムに変換する処理のイメージを示した図である。
【００９４】
図８（Ａ）はソースプログラムの一例、図８（Ｂ）はＰＡ位置ファイルの一例、図８（Ｃ）は、中間言語による第１プログラムの一例を示している。
【００９５】
図８（Ａ）に記載されている「ソースプログラム（ａ．ｆ９０）」は、このソースプログラムが記述されているソースファイルの名前が「ａ．ｆ９０」であることを意味している。
【００９６】
また、このソースプログラムの（１）行目の「ｓｕｂｒｏｕｔｉｎｅ  ｓｕｂ１（ａ，ｂ，ｎ）」は、この（１）行目以降が、「ｓｕｂ１」と名づけられａ，ｂ，ｎを引数とするサブルーチンであることを表わしている。
【００９７】
また、（２）行目の「ｉｎｔｅｇｅｒ：：ｎ」は、ｎが整数であることを表わしている。
【００９８】
また、（３）行目の「ｒｅａｌ，ｄｉｍｅｎｓｉｏｎ（１０００）：：ａ，ｂ」は、ａ，ｂのそれぞれが実数であって、かつそれぞれが１０００個の要素を持つ配列であることを表わしている。
【００９９】
また、（４）〜（７）行目については、図２（Ａ）の（１）〜（４）行目とそれぞれ同一であり、ここでの重複説明は省略する。
【０１００】
さらに（８）行目の「ｅｎｄ  ｓｕｂｒｏｕｔｉｎｅ  ｓｕｂ１」は、「ｓｕｂ１」と名づけられたサブルーチンの終了位置であることを表わしている。
【０１０１】
また、図８（Ｂ）の「ＰＡ位置ファイル（ｐａｒａｎｇｅ．ｔｘｔ）」は、このＰＡ位置ファイルのファイル名が「ｐａｒａｎｇｅ．ｔｘｔ」であることを意味している。
【０１０２】
また、図８（Ｂ）のＰＡ位置ファイル中の１行目の「＊ａｌｌ」は、図６を参照して説明した「ＰＡレンジ設定箇所指定情報」が「ａｌｌ」であることを表わしている。
【０１０３】
また、図８（Ｂ）のＰＡ位置ファイル中の２行目の「ａ．ｆ９０」，「ｓｕｂ１」，「４」，「７」は、ソースファイル名が「ａ．ｆ９０」（図８（Ａ）参照）、モジュール名が「ｓｕｂ１」、ＰＡレンジが４行目から７行目までであることを表わしている。
【０１０４】
ここでは、図５に示すコンパイル装置１０のソースプログラム／ＰＡ位置ファイル取得部１１で、図８（Ａ）のソースプログラムおよび図８（Ｂ）のＰＡ位置ファイルが取得されたものとする。
【０１０５】
このとき、図５の構文解析部１２では、図８（Ａ）に示すソースプログラムを元にして、図８（Ｃ）にイメージを示す、中間言語で記述された第１のプログラムが作成される。
【０１０６】
図８（Ｃ）の、「基本処理ブロック（Ｌｉｎｅ１）」，「基本処理ブロック（Ｌｉｎｅ２），「基本処理ブロック（Ｌｉｎｅ３），および「基本処理ブロック（Ｌｉｎｅ８）は、図８（Ａ）のソースプログラムの、それぞれ（１）行目、（２）行目、（３）行目、および（８）行目の命令が中間言語に変換された部分である。また、図８（Ｃ）の「ループ（ｌｉｎｅ４−７）」は、図８（Ａ）の（４）行目から（７）行目までのループが中間言語で記述された部分である。その「ループ（ｌｉｎｅ４−７）」は、Ｌｉｎｅ４のブロック、Ｌｉｎｅ５，６のブロック、Ｌｉｎｅ５，６を指定回数繰り返すためのカウンタのブロック、およびＬｉｎｅ７のブロックからなる。Ｌｉｎｅ４のブロックは、図８（Ａ）の（４）行目に対応し、Ｌｉｎｅ５，６のブロックは、図８（Ａ）の（５），（６）行目に対応する。カウンタのブロックは、ｉを１からｎまでカウントしながらＬｉｎｅ５，６の処理を繰り返させるためのブロックである。Ｌｉｎｅ７のブロックは、図８（Ａ）の（７）行目に対応するブロックである。カウンタのブロックからＬｉｎｅ５，６のブロックに向かう矢印は処理の繰り返しを表わしている。また、Ｌｉｎｅ４のブロックからＬｉｎｅ７のブロックに向かう矢印は、例えばｎ＝０又はｎ＜０など、図８（Ａ）の（４）行目から（７）行目の間のループ処理の条件を満足しない場合に、（４）行目から（７）行目にスキップすることを表わしている。図８（Ｃ）の「ループ（ｌｉｎｅ４−７）」は、１つのまとまった処理を実行する複数の基本処理ブロックからなる「処理ブロック」の１つである。
【０１０７】
図９は、図５のＰＡ位置ファイル解析部１３での処理を示すフローチャートである。
【０１０８】
また図１０は、ＰＡ位置ファイル解析部１３での処理のイメージを示す図である。
【０１０９】
ＰＡ位置ファイル解析部１３では、図９に示すように、先ずＰＡ位置ファイル（図８（Ｂ）参照）から、そこに記述された、「ソースファイル名」「モジュール名」「ＰＡレンジ（開始位置と終了位置）」が読み取られる（ステップＳ１１）。そして、中間言語で記述された第１のプログラム（図８（Ｃ）参照）を辿り、ＰＡレンジの開始位置、終了位置として指定された行番号を探索する（ステップＳ１２）。この探索により見つけた行番号に対応づけて開始位置、終了位置を表わす属性値を設定する（ステップＳ１３）。またここでは、その開始位置から終了位置までの間に存在する処理ブロックやループの数も計数して設定しておく。
【０１１０】
この処理を、図８に示す例の続きで説明すると、図１０に示すように、Ｌｉｎｅ４のブロックに「ＰＡ（１）ｓｔａｒｔ／ａｌｌ／ｂｌｏｃｋＮｕｍ：１」なる属性値が設定され、Ｌｉｎｅ７のブロックに「ＰＡ（1）ｅｎｄ／ａｌｌ」なる属性値が設定される。
【０１１１】
Ｌｉｎｅ４のブロックに設定された属性値のうちの「ＰＡ（１）ｓｔａｒｔ」は、通し番号（１）のＰＡレンジの開始位置であることを表わしている。また、「ａｌｌ」は、図６を参照して説明した「ＰＡレンジ設定箇所指定情報」が「ａｌｌ」であることを表わしている。さらに、「ｂｌｏｃｋＮｕｍ：１」は、このＰＡレンジ内にある処理ブロック又はループの数が１であることを表わしている。
【０１１２】
Ｌｉｎｅ７のブロックに設定された属性値のうちの「ＰＡ（１）ｅｎｄ」は、通し番号（１）のＰＡレンジの終了位置であることを表わしている。「ａｌｌ」は、Ｌｉｎｅ４のブロックの属性値のうちの「ａｌｌ」が繰り返されている。
【０１１３】
図９のステップＳ１４では、ＰＡ位置ファイルから全てのＰＡレンジについての設定が終了したか否かが判定され、未設定のＰＡレンジが存在するときはステップＳ１１に戻ってその未設定のＰＡレンジについての処理が繰り返される。
【０１１４】
ここで、図８（Ｂ）に示すＰＡ位置ファイルは２行で構成されており、ＰＡレンジはその２行目に記載された１つのみである。ただし、前述した通り２行目と同様の記述を３行目以降に記載することにより、１つのＰＡ位置ファイルで複数のＰＡレンジを設定することもできる。図９のステップＳ１４は、複数のＰＡレンジが設定されている場合があることを考慮したステップである。
【０１１５】
全てのＰＡレンジについて属性値の設定が終了すると（図９のステップＳ１４）、それらの属性値が設定された第１のプログラム（図１０参照）が図５に示す最適化部１４に渡される（ステップＳ１５）。
【０１１６】
図５の最適化部１４では、ＰＡ位置ファイル解析部１３から受け取った第１のプログラムに最適化処理が施される。ここでは、最適化処理の結果、ループ分配（図２参照）が行なわれたものとする。
【０１１７】
このとき、最適化部１４は、ソースファイル名「ａ．ｆ９０」、モジュール名「ｓｕｂ１」、対象行番号「４，７」、および最適化種別「ループ分配」なる最適化情報１４１を生成する（図５，図７参照）。
【０１１８】
図１１は、最適化処理により生成された第２のプログラムを示すイメージ図である。
【０１１９】
ここには、「ループ（ｌｉｎｅ４−７）」が２つ存在する。上側のループは、図８（Ａ）の（５）行目の処理を担当するループ、下側のループは図８（Ａ）の（６）行目の処理を担当するループである。また、上側のループ、下側のループのいずれにも「Ｌ−ｄｓｔ」が記載されている。この「Ｌ−ｄｓｔ」は、そのループに関する最適化情報１４１（図５参照）を示している。また、この第２のプログラムは、最適化前の第１のプログラム（図１０参照）のＰＡレンジに関する属性値を引き継いでいる。ＰＡレンジの開始位置に関する属性値は、２つのループのうちの上側のループのＬｉｎｅ４のブロックに対応づけられている。また、ＰＡレンジの終了位置に関する属性値は２つのループのうちの下側のループのＬｉｎｅ７のブロックに対応づけられている。
【０１２０】
この段階では、ＰＡレンジは、上側のループの先頭から下側のループの最終までが１つのＰＡレンジ（ここでは、「ＰＡレンジ＜１＞」と称する）が設定されていることになる。
【０１２１】
図１２，図１３は、図５のＰＡ取得関数挿入部１５の処理を示すフローチャートの、それぞれ前半部分、後半部分を示す図である。
【０１２２】
ＰＡ取得関数挿入部１５では、最適化処理の行なわれた第２のプログラムに関し、図１２，図１３の処理を行なう。
【０１２３】
ここでは先ず、最適化情報１４１（図５参照）が調べられて、ループに関する最適化処理が行なわれたか否かが判定される（ステップＳ２１）。そしてループに関する最適化処理が行なわれた場合、その最適化処理が行なわれたループがＰＡレンジに含まれるループであるか否かが判定される（ステップＳ２２）。ループに関する最適化処理が行なわれていない場合（ステップＳ２１）、あるいは、ループに関する最適化処理が行なわれていてもＰＡレンジ内のループに関して最適化処理が行なわれていない場合（ステップＳ２２）は、図１３のステップＳ３３に進む。ステップＳ３３については後述する。
【０１２４】
ＰＡレンジ内のループに関し最適化処理が行なわれている場合（ステップＳ２２）は、ステップＳ２３に進み、そのＰＡレンジ内の処理フローを辿り、処理ブロックやループの数が数えられる。その数が増加していないときは（ステップＳ２４）、ステップＳ３３に進む。
【０１２５】
図１４は、ループ数の増加が認識された段階の第２のプログラムのイメージ図である。
【０１２６】
ここでは、元々は１つが存在していなかったループが２つに増加しており、ＰＡレンジ＜１＞を親のＰＡレンジとしたときに、その親のＰＡレンジ＜１＞の下に２つの子のＰＡレンジ＜１．１＞，＜１．２＞が存在することが認識される。
【０１２７】
ループ又は処理ブロックの数が増加したことが認識されると（図１２，ステップＳ２４）、ステップＳ２５に進み、第２のプログラム上に新たなＰＡレンジが設定される。
【０１２８】
図１５は、第２のプログラム上に新たなＰＡレンジが設定された状態を示すイメージ図である。
【０１２９】
ここには、上下２つのループのうちの上側のループのＬｉｎｅ４のブロックには、ＰＡレンジに関する属性値として「ＰＡ（１，１．１）ｓｔａｒｔ／ａｌｌ」が設定されている。また、上側のループのＬｉｎｅ７のブロックには、「ＰＡ（１．１）ｅｎｄ／ａｌｌ」、下側のループのＬｉｎｅ４のブロックには「ＰＡ（１．２）ｓｔａｒｔ／ａｌｌ」、下側のループのＬｉｎｅ７のブロックには「ＰＡ（１，１．２）ｅｎｄ／ａｌｌ」の属性値が設定されている。
【０１３０】
上側のループのＬｉｎｅ４のブロックに設定されている属性値のうちの、「ＰＡ（１，１．１）ｓｔａｒｔ」は、親のＰＡレンジ＜１＞と子のＰＡレンジ＜１．１＞の双方のＰＡレンジの開始位置であることを表わしている。「ａｌｌ」については説明済であり、ここでの説明は省略する。
【０１３１】
上側のループのＬｉｎｅ７のブロックに設定されている属性値のうちの「ＰＡ（１．１）ｅｎｄ」は、子のＰＡレンジ＜１．１＞の終了位置であることを表わしている。
【０１３２】
また、下側のループのＬｉｎｅ４のブロックに設定されている属性値のうちの「ＰＡ（１．２）ｓｔａｒｔ」は子のＰＡレンジ＜１．２＞の開始位置であることを表わしている。
【０１３３】
さらに、下側のループのＬｉｎｅ７のブロックに設定されている属性値のうちの「ＰＡ（１，１．２）ｅｎｄ」は、親のＰＡレンジ＜１＞および子のＰＡレンジ＜１．２＞の双方のＰＡレンジの終了位置であることを表わしている。
【０１３４】
ここでは、このように、親のＰＡレンジ＜１＞、および２つの子のＰＡレンジ＜１．１＞，＜１．２＞が、互いの親子関係が分かるように設定されている。
【０１３５】
図１２のステップＳ２６では、ＰＡ位置ファイルから「ＰＡレンジ設定箇所指定情報」が読み込まれる。前述の通り、この「ＰＡレンジ設定箇所指定情報」には、ここで例示している「ａｌｌ」のほか、「ｅｎｔｉｒｅｔｙ−ｏｎｌｙ」、「ｍａｉｎ−ｌｏｏｐ−ｏｎｌｙ」、および「ｍｏｄ−ｌｏｏｐ−ｏｎｌｙ」の合計４種類存在する。
【０１３６】
ステップＳ２７では、その読み込んだ「ＰＡレンジ設定箇所指定情報」が「ｅｎｔｉｒｅｔｙ−ｏｎｌｙ」であるか否かが判定され、「ｅｎｔｉｒｅｔｙ−ｏｎｌｙ」であったときは子のＰＡレンジに関する属性値が削除される（ステップＳ２８）。
【０１３７】
「ｅｎｔｉｒｅｔｙ−ｏｎｌｙ」は、子のＰＡレンジについての個別のＰＡ情報は不要であって、親のＰＡレンジについて一括してＰＡ情報を取得することを指示する情報だからである。
【０１３８】
また、その「ＰＡレンジ設定箇所指定情報」が「ｍａｉｎ−ｌｏｏｐ−ｏｎｌｙ」のときは、子のＰＡレンジのうちの２番目以降の子のＰＡレンジに関する属性値が削除される（ステップＳ３０）。ここで、２番目以降と表現しているのは、親のＰＡレンジ内に３つ以上のループ又は処理ブロックが存在することもあるからである。
【０１３９】
さらに、その「ＰＡレンジ設定箇所指定情報」が「ｍｏｄ−ｌｏｏｐ−ｏｎｌｙ」のときは（ステップＳ３１）、子のＰＡレンジのうちの１番目の子のＰＡレンジに関する属性値が削除される（ステップＳ３２）。
【０１４０】
尚、ここで示している具体例（図１５参照）では「ａｌｌ」が指定されているため、ステップＳ２７，Ｓ２９，Ｓ３１のいずれも「ｎｏ」であり、子のＰＡレンジの属性値はいずれも削除されることなく残される。
【０１４１】
図１２，図１３に示す処理のうち、ステップＳ３２までの処理が、図５のＰＡレンジ設定部１５１の処理に相当し、以下のステップＳ３３以降の処理が図５の関数埋込部１５２の処理に相当する。
【０１４２】
ステップＳ３３では、ＰＡ情報取得関数挿入処理が行なわれる。ここでは、ＰＡレンジに関する属性値が参照されて、各ＰＡレンジについて第２のプログラム内にＰＡ情報取得のための関数が埋め込まれる。
【０１４３】
図１６は、第２のプログラムにＰＡ情報取得関数が埋め込まれた状態を示すイメージ図である。
【０１４４】
上下２つのループのうちの上側のループのＬｉｎｅ４のブロックには、「Ｃａｌｌ  ＰＡ＿ｓｔａｒｔ（１．１）」が埋め込まれ、上側のループのＬｉｎｅ７のブロックには「Ｃａｌｌ  ＰＡ＿ｅｎｄ（１．１）」が埋め込まれている。
【０１４５】
また、下側のループのＬｉｎｅ４のブロックには、「Ｃａｌｌ  ＰＡ＿ｓｔａｒｔ（１．２）」が埋め込まれ、下側のループのＬｉｎｅ７のブロックには「Ｃａｌｌ  ＰＡ＿ｅｎｄ（１．２）」が埋め込まれている。
【０１４６】
上側のループのＬｉｎｅ４のブロックに埋め込まれている「Ｃａｌｌ  ＰＡ＿ｓｔａｒｔ（１．１）」は、ＰＡ情報の取得の開始を実行する関数を呼び出す命令である。また、上側のループのＬｉｎｅ７のブロックに埋め込まれている「Ｃａｌｌ  ＰＡ＿ｅｎｄ（１．１）」は、「Ｃａｌｌ  ＰＡ＿ｓｔａｒｔ（１．１）」で開始したＰＡ情報の取得の停止を実行する関数を呼び出す命令である。
【０１４７】
又、これと同じく、下側のループのＬｉｎｅ４のブロックに埋め込まれている「Ｃａｌｌ  ＰＡ＿ｓｔａｒｔ（１．２）」、およびＬｉｎｅ７のブロックに埋め込まれている「Ｃａｌｌ  ＰＡ＿ｅｎｄ（１．２）」は、それぞれ、ＰＡ情報の取得の開始、ＰＡ情報の取得の終了を実行する各関数を呼び出す命令である。２つのＰＡレンジに＜１．１＞、＜１．２＞という番号を付すことにより、それら２つのＰＡレンジを合算したＰＡレンジが親のＰＡレンジ＜１＞であることが分かるように関連づけている。
【０１４８】
図１３のステップＳ３３で、例えば図１６に示すようにＰＡ情報取得関数の埋込みが行なわれると、ＰＡ取得関数が埋め込まれた第２のプログラムがコード生成部１６（図５参照）に渡される。
【０１４９】
コード生成部１６は、ＰＡ取得情報が埋め込まれた第２のプログラムを受け取り、コンピュータで実行可能なオブジェクトプログラムを生成する。また、メインルーチンとサブルーチンなど複数のプログラムが存在するときは、コード生成部１６、リンカ１７によって、それら複数のプログラムの結合も行なわれて、最終的に実行可能なオブジェクトプログラムが生成される。
【０１５０】
図１７は、ソースプログラム上に、図１６の中間言語イメージ上のＰＡ取得関数と同じ内容を書き下したときのイメージ図である。
【０１５１】
ここでは、（３）行目〜（５）行目のループと（８）行目〜（１０）行目のループとの２つのループにループ分配されている。ここで、（１）行目に親のＰＡレンジ（１）のＰＡ情報取得開始を実行する関数を呼び出す命令が記述されている。また、（２）行目には子のＰＡレンジ（１．１）のＰＡ情報取得開始を実行する関数を呼び出す命令が記述されている。さらに、（６）行目には子のＰＡレンジ（１．１）のＰＡ情報の取得の停止を実行する関数を呼び出す命令が記述されている。さらに、（７）行目には子のＰＡレンジ（１．２）のＰＡ情報の取得を開始する関数を呼び出す命令が記述されている。さらに、（１１）行目には子のＰＡレンジ（１．２）のＰＡ情報の取得を停止する関数を呼び出す命令が記述され、（１２）行目には親のＰＡレンジ（１）のＰＡ情報の取得を停止する関数を呼び出す命令が記述されている。
【０１５２】
ここで、図１６では、親のＰＡレンジに関するＰＡ情報取得関数は明示的には埋め込まれていない。上述の通り、親子関係が分かっており、親のＰＡ情報は２つの子のＰＡ情報の和として自動的に求められる。
【０１５３】
これに対し、図１７の場合、プログラマが書き下すことが想定されており、プログラマが自分でループ分配を行ない、ＰＡ取得関数も自分で埋め込んでいる。
【０１５４】
このように、従来はＰＡレンジの親子関係が自動認識されることもなく、ＰＡレンジ＜１＞と、ＰＡレンジ＜１．１＞と、ＰＡレンジ＜１．２＞はそれぞれ別々のＰＡレンジとして認識される。したがってプログラマが全てのＰＡレンジについてＰＡ情報取得関数を記述しておく必要がある。
【０１５５】
図１８は、「ａｌｌ」以外の「ＰＡレンジ設定箇所指定情報」が指定された場合の、ソースコードイメージを示した図である。
【０１５６】
図１８（Ａ）は、「ｅｎｔｉｒｅｔｙ−ｏｎｌｙ」が指定された場合であり、複数のループ全体を含むようにＰＡ情報取得関数が埋め込まれている。
【０１５７】
図１８（Ｂ）は、「ｍａｉｎ−ｌｏｏｐ−ｏｎｌｙ」が指定された場合であり、ＰＡ情報取得関数が１番目のループのみ含むように埋め込まれている。
【０１５８】
図１８（Ｃ）は、「ｍｏｄ−ｌｏｏｐ−ｏｎｌｙ」が指定された場合であり、ＰＡ情報取得関数が２番目のループのみ含むように埋め込まれている。尚、ここには、ループ２つのみの場合が示されているが、３つ以上のループが存在する場合、「ｍｏｄ−ｌｏｏｐ−ｏｎｌｙ」では２番目以降の各ループそれぞれについて独立してＰＡ情報が得られるように、ＰＡ情報取得関数が埋め込まれる。
【０１５９】
図１９は、コンパイル実行時の表示画面例を示す図である。
【０１６０】
１行目の「ｆｒｔ  ａ．ｆ９０  −ｐａ＿ｒａｎｇｅ“ｐａｒａｎｇｅ．ｔｘｔ”  −ｏ  ａ．ｅｘｅ」は、オペレータによるキーボード１３０（図３参照）等の操作により入力される。ここで、「ｆｒｔ」は、フォートラン（Ｆｏｒｔｒａｎ）言語で記述されたソースプログラムをコンパイルするためのコマンドである。また、「ａ．ｆ９０」はソースプログラムが記述されたソースファイルの名前である（図８（Ａ）参照）。また、−ｐａ＿ｒａｎｇｅ“ｐａｒａｎｇｅ．ｔｘｔ”は、そのソースファイル「ａ．ｆ９０」と結びつけるべきＰＡ位置ファイルのファイル名が「ｐａｒａｎｇｅ．ｔｘｔ」であることを表わしている（図８（Ｂ）参照）。さらに、「−ｏ  ａ．ｅｘｅ」は、最終的なオブジェクトプログラムが格納される実行ファイルの名称が「ａ．ｅｘｅ」であることを表わしている。
【０１６１】
すなわち、この１行目は、フォートラン言語で記述された、「ａ．ｆ９０」のファイルに格納されているソースプログラムに、ＰＡ位置ファイル「ｐａｒａｎｇｅ．ｔｘｔ」を参照しながらＰＡ情報取得関数を埋め込んでオブジェクトプログラムを生成することを指示するオペレータの命令を表わしている。また、この１行目はさらに、その生成したオブジェクトプログラムを「ａ．ｅｘｅ」のファイルに格納することを指示している。
【０１６２】
２行目以降は、コンパイル装置でのコンパイルの実行の進度に応じて順次表示される情報である。最終行の「実行ファイル完成（ａ．ｅｘｅ）」まで表示されることで、コンパイルが完了したことが分かる。
【０１６３】
図２０は、実行ファイルに格納された、ＰＡ情報取得関数が埋め込まれたオブジェクトプログラムの実行により得られるＰＡ情報の表示イメージを示した図である。
【０１６４】
１行目は、親のＰＡレンジ＜１＞に関するＰＡ情報である。この親のＰＡレンジ＜１＞のＰＡ情報は２行目の子のＰＡレンジ＜１．１＞のＰＡ情報と３行目の子のＰＡレンジ＜１．２＞のＰＡ情報との和となっている。
【０１６５】
「ｉｎｔｅｒｖａｌ」はＰＡレンジを示している。１行目の「４−７／ｂｌｏｃｋ１（ａ．ｆ９０−ｓｕｂ１）」は、ａ．ｆ９０／ｓｕｂ１の４行目から７行目までの処理ブロックに関するＰＡ情報であることを意味している。２行目、３行目についても同様である。「ｃｙｃｌｅ」、「ｉｎｓｔｒｕｃｔｉｏｎｓ」「ｃａｃｈｅｍｉｓｓ」は、各処理ブロック実行時における、それぞれ、サイクル数、命令数、およびキャッシュミスの数を表わしている。
【０１６６】
このように、本実施形態では、最適化処理によりループ又は処理ブロックが増えた場合であっても、各ループ又は各処理ブロックについての詳細なＰＡ情報を取得することができる。したがってプログラムの実行性能の詳細な分析が可能となる。
【符号の説明】
【０１６７】
１    ソースプログラム
２    オブジェクトプログラム
３    ＰＡ位置ファイル
１０    コンパイル装置
１１    ソースプログラム／ＰＡ位置ファイル取得部
１２    構文解析部
１３    ＰＡ位置ファイル解析部
１４    最適化部
１５    ＰＡ取得関数挿入部
１６    コード生成部
１７    リンカ
１００    コンピュータ
１１０    本体部
１１１    ＣＤ／ＤＶＤ装填口
１１２    ＣＰＵ
１１３    メモリ
１１４    ハードディスク装置
１１５    ネットワークインタフェイス
１１６    ＣＤ／ＤＶＤドライブ
１１７    ＣＤ／ＤＶＤ
１２０    画像表示部
１３０    キーボード
１２１    表示画面
１４０    マウス
１４１    最適化情報
１５０    バス
１５１    ＰＡレンジ設定部
１５２    関数埋込部
【図１】
0005477206.tif 000002
【図２】
0005477206.tif 000003
【図３】
0005477206.tif 000004
【図４】
0005477206.tif 000005
【図５】
0005477206.tif 000006
【図６】
0005477206.tif 000007
【図７】
0005477206.tif 000008
【図８】
0005477206.tif 000009
【図９】
0005477206.tif 000010
【図１０】
0005477206.tif 000011
【図１１】
0005477206.tif 000012
【図１２】
0005477206.tif 000013
【図１３】
0005477206.tif 000014
【図１４】
0005477206.tif 000015
【図１５】
0005477206.tif 000016
【図１６】
0005477206.tif 000017
【図１７】
0005477206.tif 000018
【図１８】
0005477206.tif 000019
【図１９】
0005477206.tif 000020
【図２０】
0005477206.tif 000021