(57)【要約】【課題】  プログラマに高いスキルと大きな工数とを要求することなく、最適化ヒント情報の正当性を判定することができるコンパイル装置を提供する。【解決手段】  機械語命令列の最適化のためのコンパイル装置１０２に対する指示に基づいて、ソースプログラム１０１を最適化された機械語命令列１０７ａに翻訳するコード最適化部と、前記指示を、ソースプログラム１０１中より検出する最適化ヒント情報記述検出部１０３と、検出された前記指示に基づいて、当該指示が不正か否かを判断可能な前記機械語命令列上の位置を検出するエラーチェックポイント検出部１０５と、前記指示の前記ソースプログラム中での記述位置と、前記位置と、前記指示が不正か否かを判断するために必要な情報とを含む最適化ヒント情報記述デバッグ情報１０７ｂを生成する最適化ヒント記述デバッグ情報生成部１０６とを備える。【選択図】      図１
2006155386.tif 000002
【特許請求の範囲】
【請求項１】
高級言語で記述されたソースプログラムを機械語命令列に翻訳するコンパイル装置であって、
機械語命令列の最適化のためのコンパイル装置に対する指示に基づいて、ソースプログラムを最適化された機械語命令列に翻訳する翻訳手段と、
前記指示を、ソースプログラム中より検出する指示検出手段と、
検出された前記指示に基づいて、当該指示が不正か否かを判断可能な前記機械語命令列上の位置を検出する位置検出手段と、
前記指示の前記ソースプログラム中での記述位置と、前記位置と、前記指示が不正か否かを判断するために必要な情報とを含むデバッグ情報を生成するデバッグ情報生成手段と
を備えることを特徴とするコンパイル装置。
【請求項２】
前記指示は、Ｃ９９言語（ＩＳＯ（International Organization for Standardization）／ＩＥＣ（International Electrotechnical Commission）  ９８９９：１９９９  Ｐｒｏｇｒａｍｍｉｎｇ  ｌａｎｇｕａｇｅ  Ｃ）のｒｅｓｔｒｉｃｔ記述であり、
前記位置検出手段は、前記ｒｅｓｔｒｉｃｔ記述により指定されたポインタ変数を介してメモリアクセスする命令の位置を検出し、
前記指示が不正か否かを判断するために必要な情報は、前記変数と前記命令とを対応づける情報である
ことを特徴とする請求項１に記載のコンパイル装置。
【請求項３】
前記指示は、関数におけるポインタ型の仮引数の指すメモリ領域のアラインメント値を指定するプラグマ指令であり、
前記位置検出手段は、前記プラグマ指令で修飾された関数の先頭の命令の位置を検出し、
前記指示が不正か否かを判断するために必要な情報は、前記プラグマ指令で指定されたアラインメント値である
ことを特徴とする請求項１に記載のコンパイル装置。
【請求項４】
前記指示は、ループのイタレーション回数を指定するプラグマ指令であり、
前記位置検出手段は、前記プラグマ指令で修飾されたループの直前の命令の位置を検出し、
前記指示が不正か否かを判断するために必要な情報は、前記プラグマ指令で指定される前記ループの直前で満たされるべき条件である
ことを特徴とする請求項１に記載のコンパイル装置。
【請求項５】
前記デバッグ情報生成手段は、最適化で利用された前記指示に対するデバッグ情報のみを生成する
ことを特徴とする請求項１に記載のコンパイル装置。
【請求項６】
さらに、前記指示が最適化で利用されたか否かを表示する表示手段を備える
ことを特徴とする請求項１に記載のコンパイル装置。
【請求項７】
高級言語で記述されたソースプログラムを、機械語命令列の最適化のためのコンパイル装置に対する指示に基づいて翻訳した結果である機械語命令列を実行しながら当該機械語命令列の誤りを検出するデバッグ装置であって、
機械語命令列を読み込む機械語命令列読み込み手段と、
前記指示の前記ソースプログラム中での記述位置と、当該指示が不正か否かを判断可能な前記機械語命令列上の位置と、前記指示が不正か否かを判断するために必要な情報とを含むデバッグ情報を読み込むデバッグ情報読み込み手段と、
前記機械語命令列読み込み手段で読み込まれた前記機械語命令列を実行する実行手段と、
前記デバッグ情報に基づいて、前記指示が不正か否かを判断可能な前記機械語命令列上の位置における機械語命令の実行時に、前記指示が不正か否かを判断する判断手段と
を備えることを特徴とするデバッグ装置。
【請求項８】
前記指示は、Ｃ９９言語のｒｅｓｔｒｉｃｔ記述であり、
前記判断手段は、
前記デバッグ情報に基づいて、前記ｒｅｓｔｒｉｃｔ記述により指定されたポインタ変数を介してメモリアクセスする命令の実行時に、前記ｒｅｓｔｒｉｃｔ記述により指定されるポインタ変数を介してアクセスされるメモリ領域が、他のポインタ変数を介してアクセスされるメモリ領域と重なるか否かを判断する重なり判断部と、
前記重なり判断部でメモリ領域同士が重なりを有すると判断された場合には、前記ｒｅｓｔｒｉｃｔ記述が不正であると判断する不正判断部とを有する
ことを特徴とする請求項７に記載のデバッグ装置。
【請求項９】
前記指示は、関数におけるポインタ型の仮引数の指すメモリ領域のアラインメント値を指定するプラグマ指令であり、
前記指示が不正か否かを判断するために必要な情報は、前記プラグマ指令で指定されたアラインメント値であり、
前記判断手段は、
前記デバッグ情報に基づいて、前記プラグマ指令で修飾された関数の先頭の命令の実行時に、前記仮引数の指すメモリ領域のアライメント値が前記プラグマ指令で指定されたアライメント値の倍数であるか否かを判断する倍数判断部と、
前記倍数判断部で前記仮引数の指すメモリ領域のアライメント値が前記プラグマ指令で指定されたアライメント値の倍数でないと判断された場合には、前記プラグマ指令が不正であると判断する不正判断部とを有する
ことを特徴とする請求項７に記載のデバッグ装置。
【請求項１０】
前記指示は、ループのイタレーション回数を指定するプラグマ指令であり、
前記指示が不正か否かを判断するために必要な情報は、前記プラグマ指令で指定される前記ループの直前で満たされるべき条件であり、
前記判断手段は、
前記デバッグ情報に基づいて、前記プラグマ指令で修飾されたループの直前の命令の実行時に、前記ループのイタレーション回数が前記ループの直前で満たされるべき条件を満たしているか否かを判断する条件判断部と、
前記条件判断部で前記条件を満たしていないと判断された場合には、前記プラグマ指令が不正であると判断する不正判断部とを有する
ことを特徴とする請求項７に記載のデバッグ装置。
【請求項１１】
さらに、前記判断手段で前記指示が不正であると判断された場合には、前記指示の前記ソースプログラム中での記述位置を含むエラーメッセージを出力するエラーメッセージ出力手段を備える
ことを特徴とする請求項７〜１０のいずれか１項に記載のデバッグ装置。
【請求項１２】
さらに、前記判断手段による判断処理を行なうかまたは行なわないかを切り替えるための切り替え手段を備える
ことを特徴とする請求項７〜１１のいずれか１項に記載のデバッグ装置。
【請求項１３】
さらに、前記機械語命令列読み込み手段が読み込む機械語命令列に対応するソースプログラムと、前記デバッグ情報読み込み手段が読み込むデバッグ情報との指定を受け付ける受け付け手段を備え、
前記デバッグ情報読み込み手段は、前記受け付け手段で指定されたデバッグ情報を読み込み、
前記判断手段は、前記デバッグ情報に基づいて、前記指示が不正か否かを判断可能な前記ソースプログラムに対応する前記機械語命令列上の位置における機械語命令の実行時に、前記指示が不正か否かを判断する
ことを特徴とする請求項７〜１２のいずれか１項に記載のデバッグ装置。
【請求項１４】
さらに、前記ソースプログラム中の関数の指定を受け付ける関数指定受け付け手段を備え、
前記判断手段は、前記デバッグ情報に基づいて、前記関数指定受け付け手段で指定された関数のみに対して、前記指示が不正か否かを判断可能な前記機械語命令列上の位置における機械語命令の実行時に、前記指示が不正か否かを判断する
ことを特徴とする請求項７〜１２のいずれか１項に記載のデバッグ装置
【請求項１５】
高級言語で記述されたソースプログラムを、機械語命令列の最適化のためのコンパイル装置に対する指示に基づいて翻訳した結果である機械語命令列を実行しながら当該機械語命令列の誤りを検出するデバッグ装置であって、
機械語命令列を読み込む機械語命令列読み込み手段と、
前記指示の前記ソースプログラム中での記述位置と、当該指示が不正か否かを判断可能な前記機械語命令列上の位置と、前記指示が不正か否かを判断するために必要な情報とを含むデバッグ情報を読み込むデバッグ情報読み込み手段と、
前記機械語命令列読み込み手段で読み込まれた前記機械語命令列を実行する実行手段と、
前記デバッグ情報に基づいて、前記指示が不正か否かを判断可能な前記機械語命令列上の位置における機械語命令の実行時に、前記指示が不正か否かを判断するための情報を前記機械語命令の実行結果より収集する収集手段と
を備えることを特徴とするデバッグ装置。
【請求項１６】
高級言語で記述されたソースプログラムを機械語命令列に翻訳するコンパイルシステムであって、
高級言語で記述されたソースプログラムを機械語命令列に翻訳し、かつ機械語命令列の最適化のためのコンパイル装置に対する指示の正当性を判断するためのデバッグ情報を生成するコンパイル装置と、
前記機械語命令列および前記デバッグ情報に基づいて、前記指示の誤りを検出するデバッグ装置とを備え、
前記コンパイル装置は、
機械語命令列の最適化のためのコンパイル装置に対する指示に基づいて、ソースプログラムを最適化された機械語命令列に翻訳する翻訳手段と、
前記指示を、ソースプログラム中より検出する指示検出手段と、
検出された前記指示に基づいて、当該指示が不正か否かを判断可能な前記機械語命令列上の位置を検出する位置検出手段と、
前記指示の前記ソースプログラム中での記述位置と、前記位置と、前記指示が不正か否かを判断するために必要な情報とを含むデバッグ情報を生成するデバッグ情報生成手段とを有し、
前記デバッグ装置は、
前記機械語命令列を読み込む機械語命令列読み込み手段と、
前記指示の前記ソースプログラム中での記述位置と、当該指示が不正か否かを判断可能な前記機械語命令列上の位置と、前記指示が不正か否かを判断するために必要な情報とを含むデバッグ情報を読み込むデバッグ情報読み込み手段と、
前記機械語命令列読み込み手段で読み込まれた前記機械語命令列を実行する実行手段と、
前記デバッグ情報に基づいて、前記指示が不正か否かを判断可能な前記機械語命令列上の位置における機械語命令の実行時に、前記指示が不正か否かを判断する判断手段とを有する
ことを特徴とするコンパイルシステム。
【請求項１７】
前記指示は、Ｃ９９言語のｒｅｓｔｒｉｃｔ記述であり、
前記指示が不正か否かを判断するために必要な情報は、前記変数と前記命令とを対応づける情報であり、
前記位置検出手段は、前記ｒｅｓｔｒｉｃｔ記述により指定されたポインタ変数を介してメモリアクセスする命令の位置を検出し、
前記判断手段は、
前記デバッグ情報に基づいて、前記ｒｅｓｔｒｉｃｔ記述により指定されたポインタ変数を介してメモリアクセスする命令の実行時に、前記ｒｅｓｔｒｉｃｔ記述により指定されるポインタ変数を介してアクセスされるメモリ領域が、他のポインタ変数を介してアクセスされるメモリ領域と重なるか否かを判断する重なり判断部と、
前記重なり判断部でメモリ領域同士が重なりを有すると判断された場合には、前記ｒｅｓｔｒｉｃｔ記述が不正であると判断する不正判断部とを有する
ことを特徴とする請求項１６に記載のコンパイルシステム。
【請求項１８】
前記指示は、関数におけるポインタ型の仮引数の指すメモリ領域のアラインメント値を指定するプラグマ指令であり、
前記指示が不正か否かを判断するために必要な情報は、前記プラグマ指令で指定されたアラインメント値であり、
前記位置検出手段は、前記プラグマ指令で修飾された関数の先頭の命令の位置を検出し、
前記判断手段は、
前記デバッグ情報に基づいて、前記プラグマ指令で修飾された関数の先頭の命令の実行時に、前記仮引数の指すメモリ領域のアライメント値が前記プラグマ指令で指定されたアライメント値の倍数であるか否かを判断する倍数判断部と、
前記倍数判断部で前記仮引数の指すメモリ領域のアライメント値が前記プラグマ指令で指定されたアライメント値の倍数でないと判断された場合には、前記プラグマ指令が不正であると判断する不正判断部とを有する
ことを特徴とする請求項１６に記載のコンパイルシステム。
【請求項１９】
前記指示は、ループのイタレーション回数を指定するプラグマ指令であり、
前記指示が不正か否かを判断するために必要な情報は、前記プラグマ指令で指定される前記ループの直前で満たされるべき条件であり、
前記位置検出手段は、前記プラグマ指令で修飾されたループの直前の命令の位置を検出し、
前記判断手段は、
前記デバッグ情報に基づいて、前記プラグマ指令で修飾されたループの直前の命令の実行時に、前記ループのイタレーション回数が前記ループの直前で満たされるべき条件を満たしているか否かを判断する条件判断部と、
前記条件判断部で前記条件を満たしていないと判断された場合には、前記プラグマ指令が不正であると判断する不正判断部とを有する
ことを特徴とする請求項１６に記載のコンパイルシステム。
【請求項２０】
高級言語で記述されたソースプログラムを機械語命令列に翻訳するコンパイル方法であって、
機械語命令列の最適化のためのコンパイル方法に対する指示に基づいて、ソースプログラムを最適化された機械語命令列に翻訳する翻訳ステップと、
前記指示を、ソースプログラム中より検出する指示検出ステップと、
検出された前記指示に基づいて、当該指示が不正か否かを判断可能な前記機械語命令列上の位置を検出する位置検出ステップと、
前記指示の前記ソースプログラム中での記述位置と、前記位置と、前記指示が不正か否かを判断するために必要な情報とを含むデバッグ情報を生成するデバッグ情報生成ステップと
を含むことを特徴とするコンパイル方法。
【請求項２１】
高級言語で記述されたソースプログラムを、機械語命令列の最適化のためのコンパイル装置に対する指示に基づいて翻訳した結果である機械語命令列を実行しながら当該機械語命令列の誤りを検出するデバッグ方法であって、
機械語命令列を読み込む機械語命令列読み込みステップと、
前記指示の前記ソースプログラム中での記述位置と、当該指示が不正か否かを判断可能な前記機械語命令列上の位置と、前記指示が不正か否かを判断するために必要な情報とを含むデバッグ情報を読み込むデバッグ情報読み込みステップと、
前記機械語命令列読み込み手段で読み込まれた前記機械語命令列を実行する実行ステップと、
前記デバッグ情報に基づいて、前記指示が不正か否かを判断可能な前記機械語命令列上の位置における機械語命令の実行時に、前記指示が不正か否かを判断する判断ステップと
を含むことを特徴とするデバッグ方法。
【請求項２２】
高級言語で記述されたソースプログラムを機械語命令列に翻訳するコンパイラであって、
機械語命令列の最適化のためのコンパイラに対する指示に基づいて、ソースプログラムを最適化された機械語命令列に翻訳する翻訳ステップと、
前記指示を、ソースプログラム中より検出する指示検出ステップと、
検出された前記指示に基づいて、当該指示が不正か否かを判断可能な前記機械語命令列上の位置を検出する位置検出ステップと、
前記指示の前記ソースプログラム中での記述位置と、前記位置と、前記指示が不正か否かを判断するために必要な情報とを含むデバッグ情報を生成するデバッグ情報生成ステップと
をコンピュータに実行させることを特徴とするコンパイラ。
【請求項２３】
高級言語で記述されたソースプログラムを、機械語命令列の最適化のためのコンパイル装置に対する指示に基づいて翻訳した結果である機械語命令列を実行しながら当該機械語命令列の誤りを検出するデバッガであって、
機械語命令列を読み込む機械語命令列読み込みステップと、
前記指示の前記ソースプログラム中での記述位置と、当該指示が不正か否かを判断可能な前記機械語命令列上の位置と、前記指示が不正か否かを判断するために必要な情報とを含むデバッグ情報を読み込むデバッグ情報読み込みステップと、
前記機械語命令列読み込み手段で読み込まれた前記機械語命令列を実行する実行ステップと、
前記デバッグ情報に基づいて、前記指示が不正か否かを判断可能な前記機械語命令列上の位置における機械語命令の実行時に、前記指示が不正か否かを判断する判断ステップと
をコンピュータに実行させることを特徴とするデバッガ。
【請求項２４】
コンピュータ読み取り可能な記録媒体であって、
請求項２２に記載のコンパイラまたは請求項２３に記載のデバッガを記録した
ことを特徴とするコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースプログラムのエラーチェック機能を備えたコンパイル装置およびデバッグ装置に関し、特に、プログラマが情報の正当性を保証しなければならない最適化ヒント情報記述のエラーチェック機能を備えたコンパイル装置およびデバッグ装置に関する。
【背景技術】
【０００２】
一般的に、コンパイル装置が高級言語で記述されたソースプログラムから変換したアセンブラコードは、熟練したアセンブラコードのプログラマが作成したアセンブラコードと比較した場合、実行性能とコードサイズとの面で劣る。
【０００３】
しかし、近年、コンパイル装置を用いて高級言語で記述されたソースプログラムから生成されたアセンブラコードであっても、熟練したアセンブラコードのプログラマが作成したアセンブラコードに匹敵する実行性能とコードサイズとを実現するために、アセンブラコードのプログラマがアセンブラコードの記述時に利用している情報を、最適化ヒント情報としてソースプログラム中に記述し、コンパイル装置へ受け渡す枠組みが導入されてきている。
【０００４】
例えば、以下に示すような最適化ヒント情報が知られている。
（ｉ）  ポインタ変数を修飾し、当該ポインタ変数を介してアクセスされる領域は、その領域へのアクセスがすべてそのポインタに限定されることをプログラマがコンパイル装置に知らせるＣ９９言語（ＩＳＯ（International Organization for Standardization）／ＩＥＣ（International Electrotechnical Commission）  ９８９９：１９９９  Ｐｒｏｇｒａｍｍｉｎｇ  ｌａｎｇｕａｇｅ  Ｃ）のｒｅｓｔｒｉｃｔ記述
（ｉｉ）  ポインタ変数の指すメモリ領域のアラインメントをコンパイル装置に知らせるプラグマ指令
（ｉｉｉ）  最小繰り返し回数などのループに回数に関する情報をコンパイル装置に知らせるプラグマ指令
コンパイル装置は、これら最適化ヒント情報を用いて、コードの最適化を実施することにより、最適化ヒント情報の記述がない場合に比べ、実行性能が高く、サイズの小さなアセンブラコードを生成できる。
【０００５】
しかし、これら最適化ヒント情報の記述は、プログラマが最適化ヒント情報の正当性を保証しなければならず、コンパイル装置は最適化ヒント情報が正しいものとして最適化を行う。このため、最適化ヒント情報が誤っていた場合、不正なアセンブラコードを生成するという問題があり、最適化ヒント情報の記述の利用は不具合の原因となりやすい。また、コンパイル時に静的に最適化ヒント情報の正当性を判断することは非常に困難である。
【０００６】
この問題を解決するための従来の方法として、プログラマがエラーチェックのためのデッバグコードをソースプログラム中に記述し、デバッグ装置がそのデバッグコードを実行することにより、エラーチェックを行う方法が提案されている（例えば、特許文献１〜３参照。）。
【特許文献１】特開平１１−１１０２５６号公報
【特許文献２】特開２０００−７６０９４号公報
【特許文献３】特開２００３−５８３９２号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかしながら、従来の方法では、プログラマが最適化ヒント情報の正当性を判定するためには、最適化ヒント情報の記述箇所毎にデバッグコードを設計し、ソースプログラム中に記述しなければならない。そのための高いスキルと大きな工数が必要であるという課題を有している。
【０００８】
また、デバッグコードを記述する方法では、汎用的にデバッグコードを記述できる反面、エラーチェック箇所が多い場合には、デバッグコードのサイズが大きくなり、デバッグにも時間がかかるという課題を有している。
【０００９】
さらに、最適化ヒント情報の記述が、コンパイル装置での最適化に使用されない場合には、プログラマは、その記述を削除して、エラーチェックを行わないようにすることもできるが、従来の方法では、最適化ヒント情報がコンパイル装置で最適化時に使用されたか否かが不明である。このため、そのようなことが不可能であった。
【００１０】
本発明は、従来の課題を解決するためになされたものであり、プログラマに高いスキルと大きな工数とを要求することなく、最適化ヒント情報の正当性を判定することができるコンパイル装置等を提供することを目的とする。
【００１１】
また、デバッグコードのサイズが小さく、短時間で最適化ヒント情報の記述のエラーチェックを行なうことができるコンパイル装置等を提供することも目的とする。
【００１２】
さらに、最適化ヒント情報が最適化で使用されない場合には、当該最適化ヒント情報を削除することができるコンパイル装置等を提供することも目的とする。
【課題を解決するための手段】
【００１３】
本発明に係るコンパイル装置は、高級言語で記述されたソースプログラムを機械語命令列に翻訳するコンパイル装置であって、機械語命令列の最適化のためのコンパイル装置に対する指示に基づいて、ソースプログラムを最適化された機械語命令列に翻訳する翻訳手段と、前記指示を、ソースプログラム中より検出する指示検出手段と、検出された前記指示に基づいて、当該指示が不正か否かを判断可能な前記機械語命令列上の位置を検出する位置検出手段と、前記指示の前記ソースプログラム中での記述位置と、前記位置と、前記指示が不正か否かを判断するために必要な情報とを含むデバッグ情報を生成するデバッグ情報生成手段とを備えることを特徴とする。
【００１４】
この構成によると、デバッグ装置が上記デバッグ情報を利用してエラーチェックを行うことにより、プログラマがデバッグコードを記述しなくても、上記指示（最適化ヒント情報）が不正か否かを判断することができる。このため、プログラマに高いスキルと大きな工数とを要求することなく、最適化ヒント情報の正当性を判定することができる。
【００１５】
好ましくは、前記指示は、Ｃ９９言語（ＩＳＯ（International Organization for Standardization）／ＩＥＣ（International Electrotechnical Commission）  ９８９９：１９９９  Ｐｒｏｇｒａｍｍｉｎｇ  ｌａｎｇｕａｇｅ  Ｃ）のｒｅｓｔｒｉｃｔ記述であり、前記位置検出手段は、前記ｒｅｓｔｒｉｃｔ記述により指定されたポインタ変数を介してメモリアクセスする命令の位置を検出し、前記指示が不正か否かを判断するために必要な情報は、前記変数と前記命令とを対応づける情報であることを特徴とする。
【００１６】
これにより、ｒｅｓｔｒｉｃｔ記述のエラーチェックが可能となる。
また、前記指示は、関数におけるポインタ型の仮引数の指すメモリ領域のアラインメント値を指定するプラグマ指令であり、前記位置検出手段は、前記プラグマ指令で修飾された関数の先頭の命令の位置を検出し、前記指示が不正か否かを判断するために必要な情報は、前記プラグマ指令で指定されたアラインメント値であってもよい。
【００１７】
これにより、上記プラグマ指令のエラーチェックが可能となる。
これにより、メモリ領域に関するプラグマ指令のエラーチェックが可能となる。
【００１８】
さらに、前記指示は、ループのイタレーション回数を指定するプラグマ指令であり、前記位置検出手段は、前記プラグマ指令で修飾されたループの直前の命令の位置を検出し、前記指示が不正か否かを判断するために必要な情報は、前記プラグマ指令で指定される前記ループの直前で満たされるべき条件であってもよい。
これにより、繰り返し回数の情報を指定したプラグマ指令のエラーチェックが可能となる。
【００１９】
さらに好ましくは、前記デバッグ情報生成手段は、最適化で利用された前記指示に対するデバッグ情報のみを生成するようにしてもよい。
【００２０】
これにより、不要なデバッグ情報の生成がなされず、デバッグ情報のサイズが削減できる。
【００２１】
さらに好ましくは、上述のコンパイル装置は、さらに、前記指示が最適化で利用されたか否かを表示する表示手段を備えていてもよい。
【００２２】
これにより、最適化ヒント情報記述がコンパイル装置で利用されたか否かが分かるので、プログラマは利用されない部分の最適化ヒント情報記述に関するテストを省略することができる。
【００２３】
本発明の他の局面に係るデバッグ装置は、高級言語で記述されたソースプログラムを、機械語命令列の最適化のためのコンパイル装置に対する指示に基づいて翻訳した結果である機械語命令列を実行しながら当該機械語命令列の誤りを検出するデバッグ装置であって、機械語命令列を読み込む機械語命令列読み込み手段と、前記指示の前記ソースプログラム中での記述位置と、当該指示が不正か否かを判断可能な前記機械語命令列上の位置と、前記指示が不正か否かを判断するために必要な情報とを含むデバッグ情報を読み込むデバッグ情報読み込み手段と、前記機械語命令列読み込み手段で読み込まれた前記機械語命令列を実行する実行手段と、前記デバッグ情報に基づいて、前記指示が不正か否かを判断可能な前記機械語命令列上の位置における機械語命令の実行時に、前記指示が不正か否かを判断する判断手段とを備えることを特徴とする。
【００２４】
この構成によると、最適化ヒント情報の記述のエラーチェックをデバッグ装置により自動で行うことができ、エラーが検出された場合、ソースプログラムの該当箇所を特定することができる。
【００２５】
また、上述のデバッグ装置は、さらに、前記判断手段による判断処理を行なうかまたは行なわないかを切り替えるための切り替え手段を備えていてもよい。
【００２６】
また、上述のデバッグ装置は、さらに、前記機械語命令列読み込み手段が読み込む機械語命令列に対応するソースプログラムと、前記デバッグ情報読み込み手段が読み込むデバッグ情報との指定を受け付ける受け付け手段を備え、前記デバッグ情報読み込み手段は、前記受け付け手段で指定されたデバッグ情報を読み込み、前記判断手段は、前記デバッグ情報に基づいて、前記指示が不正か否かを判断可能な前記ソースプログラムに対応する前記機械語命令列上の位置における機械語命令の実行時に、前記指示が不正か否かを判断するようにしてもよい。
【００２７】
また、上述のデバッグ装置は、さらに、前記ソースプログラム中の関数の指定を受け付ける関数指定受け付け手段を備え、前記判断手段は、前記デバッグ情報に基づいて、前記関数指定受け付け手段で指定された関数のみに対して、前記指示が不正か否かを判断可能な前記機械語命令列上の位置における機械語命令の実行時に、前記指示が不正か否かを判断するようにしてもよい。
【００２８】
これにより、必要な部分のみエラーチェックが可能となり、デバッグ効率を改善できる。
【００２９】
なお、本発明は、このような特徴的な手段を備えるコンパイル装置やデバッグ装置として実現することができるだけでなく、コンパイル装置とデバッグ装置とを備えるコンパイルシステムとして実現したり、コンパイル装置やデバッグ装置が備える特徴的な手段をステップとするコンパイル方法やデバッグ方法として実現したりすることもできる。また、コンパイル方法やデバッグ方法に含まれる特徴的なステップをコンピュータに実行させるコンパイラやデバッガとして実現することもできる。そして、そのようなコンパイラやデバッガは、ＣＤ−ＲＯＭ等の記録媒体やインターネット等の通信ネットワークを介して流通させることができるのは言うまでもない。
【発明の効果】
【００３０】
本発明によると、プログラマに高いスキルと大きな工数とを要求することなく、最適化ヒント情報の正当性を判定することができるコンパイル装置等を提供することができる。
【００３１】
また、デバッグコードのサイズが小さく、短時間で最適化ヒント情報の記述のエラーチェックを行なうことができるコンパイル装置等を提供するができる。
【００３２】
さらに、最適化ヒント情報が最適化で使用されない場合には、当該最適化ヒント情報を削除することができるコンパイル装置等を提供することができる。
【発明を実施するための最良の形態】
【００３３】
以下本発明を実施するための最良の形態について、図面を参照しながら説明する。
図１は、本発明の実施の形態に係るコンパイルシステムの構成を示す機能ブロック図である。便宜上、図１にはソースプログラム１０１およびソースプログラムの翻訳結果である機械語プログラム１０７も併せて記載している。
【００３４】
コンパイルシステム１００は、ソースプログラムを機械語命令列に翻訳すると同時に、ソースプログラムに含まれる最適化ヒント情報の記述に誤りがないかをチェックするシステムであり、コンパイル装置１０２と、デバッグ装置１０８とを備えている。
【００３５】
コンパイル装置１０２は、ソースプログラム１０１を入力として、機械語命令列１０７ａに翻訳して機械語プログラム１０７として出力するとともに、最適化ヒント情報の記述のエラーチェックを行うための最適化ヒント情報記述デバッグ情報１０７ｂも併せて出力する装置であり、最適化ヒント情報記述検出部１０３と、コード最適化部１０４と、エラーチェックポイント検出部１０５と、最適化ヒント記述デバッグ情報生成部１０６とを備えている。
【００３６】
最適化ヒント情報記述検出部１０３は、ソースプログラム含まれる最適化ヒント情報記述を検出する処理部である。
【００３７】
コード最適化部１０４は、最適化ヒント情報記述検出部１０３で検出された最適化ヒント情報を利用して、コードの最適化を行う処理部である。
【００３８】
エラーチェックポイント検出部１０５は、コード最適化部１０４で最適化されたコードのうち、最適化ヒント情報記述検出部１０３で検出された最適化ヒント情報記述が不正か否かをチェックできる命令のアドレスを検出する処理部である。
【００３９】
最適化ヒント情報記述デバッグ情報生成部１０６は、最適化ヒント情報記述検出部１０３で検出された最適化ヒント情報の記述場所と、エラーチェックポイント検出部１０５で検出された命令のアドレスと、エラーチェックを行うのに必要な情報とからなる最適化ヒント情報記述デバッグ情報１０７ｂを生成する処理部である。
【００４０】
デバッグ装置１０８は、機械語命令列１０７ａをデバッグするとともに、最適化ヒント情報の記述に誤りがないかをチェックする装置であり、入力部１０９と、実行エンジン１１０と、機械語命令列記憶部１１１と、デバッグ情報記憶部１１２と、エラーチェック部１１３と、エラーメッセージ表示部１１４とを備えている。
【００４１】
機械語命令列記憶部１１１は、機械語命令列１０７ａを記憶する記憶装置である。
デバッグ情報記憶部１１２は、デバッグ装置１０８で取り扱いやすいように変換された最適化ヒント情報記述デバッグ情報１１２ｂを記憶する記憶装置である。
【００４２】
入力部１０９は、機械語プログラム１０７を読み込み、機械語プログラム１０７に含まれる機械語命令列１０７ａを機械語命令列記憶部１１１に格納するとともに、最適化ヒント情報記述デバッグ情報１０７ｂをデバッグ装置１０８が取り扱い形に変換し、最適化ヒント情報記述デバッグ情報１１２ｂとして格納する処理部である。
【００４３】
実行エンジン１１０は、機械語命令列記憶部１１１に格納された機械語命令列１０７ａを順番に実行する処理部である。
【００４４】
エラーチェック部１１３は、実行エンジン１０９で実行される機械語命令列１０７ａの実行アドレスが、デバッグ情報記憶部１１２に記憶されている最適化ヒント情報記述デバッグ情報１１２ｂのエラーチェックポイントのアドレスと一致した際に起動され、デバッグ情報記憶部１１２に格納されている最適化ヒント情報記述デバッグ情報１１２ｂを利用して、最適化ヒント情報の記述のエラーチェックを行う処理部である。
【００４５】
エラーメッセージ表示部１１４は、エラーチェック部１１３でエラーが検出された場合に起動され、最適化ヒント情報記述デバッグ情報１１２ｂに含まれるソースプログラム１０１の行番号を含むエラーメッセージを出力する。
【００４６】
次に、上述の構成を備えるコンパイルシステム１００の動作について、説明する。
（動作例１）
まず、最適化ヒント情報の記述としてＣ９９言語のｒｅｓｔｒｉｃｔ記述を含むソースプログラム１０１を一例として、コンパイルシステム１００の動作について説明する。
【００４７】
図２は、ｒｅｓｔｒｉｃｔ記述を含むソースプログラム１０１の一例を示す図である。ソースプログラム１０１のｌ０１行目に示されているｒｅｓｔｒｉｃｔ記述は、ポインタｐを介したメモリアクセスｐ［ｉ］と、ポインタｑを介したメモリアクセスｑ［ｉ］とで、アクセスするメモリ領域が重ならないことを、プログラマが保証してコンパイル装置１０２に知らせるためのものである。
【００４８】
図３は、ｒｅｓｔｒｉｃｔ記述の情報を利用しないで、ソースプログラム１０１を翻訳した結果の機械語命令列を示す図である。また、図４は、ｒｅｓｔｒｉｃｔ記述の情報を利用して、ソースプログラム１０１をコンパイルした結果の機械語命令列１０７ａを示す図である。ここで、機械語命令列が動作するアーキテクチャマシンは、命令レベルで並列実行が３命令まで可能なマシンであるとする。
【００４９】
コンパイル装置１０２が機械語命令列の並び方を最適にすることにより、並列実行の割合を増やすことができ、機械語命令列の実行性能を向上させることが可能となる。ここで、機械語命令の意味は、以下の通りである。
【００５０】
「Ｍｏｖ  ｒ３，０」は、定数０をレジスタｒ３に格納する。
「Ｌｄ  ｒ２，（ｒ１＋）」は、レジスタｒ１の指し示すメモリ領域の内容をレジスタｒ２にロードした後、レジスタｒ１の値を次のメモリ領域を指すように更新する。
【００５１】
「Ａｄｄ  ｒ３，ｒ３，１」は、レジスタｒ３の値に１加算した値をレジスタｒ３に格納する。
【００５２】
「Ｃｍｐ  ｒ３，１００」は、レジスタｒ３の値と１００とを比較する。
「Ｓｔ  （ｒ０＋），ｒ２」は、レジスタｒ２の値をレジスタｒ０の指し示すメモリ領域にストアした後、レジスタｒ０の値を次のメモリ領域を指すように更新する。
【００５３】
「Ｂｒｌｔ  Ｌａｂｅｌ１」は、Ｃｍｐ命令の比較結果において、第１オペランドの値よりも第２オペランドの値のほうが大きかった場合には、Ｌａｂｅｌ１に分岐する。
【００５４】
ここで、ｒｅｓｔｒｉｃｔ記述の情報を利用しない場合には、Ｌｄ命令とＳｔ命令の順序を入れかえることができない。ため、図１のソースプログラム１０１は、図３の機械語命令列に翻訳される。この場合、アドレスａ３０２〜ａ３０７で示されるループの実行サイクル数は、３００サイクルとなる。これは、アドレスａ３０２の命令とアドレスａ３０３の命令とが並列実行可能であり、また、アドレスａ３０４の命令とアドレスａ３０５の命令とが並列実行可能であり、さらにアドレスａ３０６の命令とアドレスａ３０７の命令とが並列実行可能であるため、３＊１００＝３００という計算式により求められる。それに、アドレスａ３０１のＭｏｖ命令を実行するために必要な１サイクルを加えた３０１サイクルが、図３に示された機械語命令列を実行するために必要なサイクル数である。
【００５５】
一方、ｒｅｓｔｒｉｃｔ記述の情報を利用して最適化を行った場合は、Ｌｄ命令とＳｔ命令の順序変更が可能となる。このため、図１に示されるソースプログラム１０１は、図４に示される機械語命令列１０７ａに翻訳される。ここで行われている最適化技術は、「ソフトウェアパイプライニング」と呼ばれる既存の技術である。このため、その詳しい説明は省略する。
【００５６】
ソフトウェアパイプライニングによる最適化を行なうことにより、（ｎ＋１）回目のループイタレーションにおけるＬｄ命令をｎ回目のループイタレーションにおけるＳｔ命令よりも先に行うことが可能となる。このため、図４に示されるような機械語命令列１０７ａが生成される。この場合、機械語命令列１０７ａを実行するために必要なサイクル数は、２０２サイクルとなる。これは、以下のようにして求められる。すなわち、アドレスａ４０４〜ａ４０６に配置された３つの命令は並列に実行可能であり、アドレスａ４０７〜ａ４０９に配置された３つの命令も並列実行可能であり、それら６命令のイタレーションが９９回行なわれる。また、イタレーション以外の処理として、ａ４０１〜ａ４０３と、ａ４１０と、ａ４２０の５つの命令があるが、このうち、ａ４０２とａ４０３とは並列実行可能であるため、これらの５つの命令は４サイクルで実行可能である。したがって、上述のサイクル数は、２＊９９＋４＝２０２サイクルとして求められる。
【００５７】
サイクル数を比較すると、図３の機械語命令列に比べて、図４の機械語命令列のほうが実行性能が向上している。しかし、ｒｅｓｔｒｉｃｔ記述が誤っており、順番をかえてはいけない命令の順番をかえてしまっていた場合には、実行結果が不正となる。このため、ｒｅｓｔｒｉｃｔ記述が誤っているか否かをチェックするために、コンパイルシステム１００の各処理部は以下に示すような処理を実行する。
【００５８】
図５は、最適化ヒント情報記述検出部１０３の動作を示すフローチャートである。
最適化ヒント情報記述検出部１０３は、ソースプログラム１０１を１行ずつ読み込む（ステップＳ５０１）。
【００５９】
最適化ヒント情報記述検出部１０３は、ソースプログラム１０１中にｒｅｓｔｒｉｃｔ記述が存在するか否かを検出する（ステップＳ５０２）。ｒｅｓｔｒｉｃｔ記述を検出した場合には（ステップＳ５０２でｙｅｓ）、その記述行と指定された変数の情報とを記憶する（ステップＳ５０３）。図２に示したソースプログラム１０１の場合には、ｌ０１行目のポインタ変数ｐとｑのｒｅｓｔｒｉｃｔ記述が検出され、記憶される。これをソースプログラム１０１の読み込みが終了するまで、１行ずつ繰り返す（ステップＳ５０４）。
【００６０】
コード最適化部１０４では、最適化ヒント情報記述検出部１０３で検出したｒｅｓｔｒｉｃｔ記述の情報を利用して、コード最適化を行い、図２のソースプログラム１０１を図４の機械語命令列１０７ａに変換する。ここで、コード最適化部１０４の処理は、一般のコンパイル装置の処理と同様であるので、詳細な説明は省略する。
【００６１】
図６は、エラーチェックポイント検出部１０５の動作を示すフローチャートである。
エラーチェックポイント検出部１０５は、コード最適化部１０４で、最適化を行った結果の機械語命令に１行ずつ着目する（ステップＳ６０１）。
【００６２】
エラーチェックポイント検出部１０５は、着目した機械語命令がメモリアクセス命令か否かを判定する（ステップＳ６０２）。メモリアクセス命令の場合には（Ｓ６０２でｙｅｓ）、そのメモリアクセスがｒｅｓｔｒｉｃｔ記述で指定されたポインタ変数を介したメモリアクセスに相当する命令か否かを判定する（ステップＳ６０３）。この判定は、変数割り付け等の資源割り付けを行なった結果の情報を利用して行なわれる。
【００６３】
ｒｅｓｔｒｉｃｔ記述指定されたポインタ変数を介したメモリアクセスであった場合には（Ｓ６０３でｙｅｓ）、命令のアドレスをそのｒｅｓｔｒｉｃｔ記述で指定されたポインタ変数のエラーチェックポイントとして記憶する（ステップＳ６０４）。図４の機械語命令列１０７ａの場合は、アドレスａ４０７とアドレスａ４２０のＳｔ命令が、図２のｒｅｓｔｒｉｃｔ記述で指定されたポインタ変数ｐを介したメモリアクセスであるので、ポインタ変数ｐのエラーチェックポイントとして、記憶される。また、アドレスａ４０２とアドレスａ４０６のＬｄ命令が、図２のｒｅｓｔｒｉｃｔ記述で指定されたポインタ変数ｑを介したメモリアクセス命令であるので、ポインタ変数ｑのエラーチェックポイントとして記憶される。
【００６４】
以上の処理により、最適化ヒント情報記述デバッグ情報生成部１０３で生成される、図２のソースプログラム１０１のｒｅｓｔｒｉｃｔ記述に対する最適化ヒント情報記述デバッグ情報の概念図は、図７のようになる。すなわち、ｒｅｓｔｒｉｃｔ記述がされているソースプログラム１０１中の行情報として、ソースプログラム１０１のファイル名と行番号との組「ＦｉｌｅＮａｍｅ：ｌ０１」とが記憶されている。また、その行に含まれるｒｅｓｔｒｉｃｔ記述で指定されたポインタ変数としてｐおよびｑが記憶されている。さらに、ポインタ変数ｐのエラーチェックポイントとして、アドレスａ４０７およびａ４０２が、メモリアクセス命令アドレス情報に格納され、ポインタ変数ｑのエラーチェックポイントとして、アドレスａ４０２およびａ４０６が、メモリアクセス命令アドレス情報に格納されている。
【００６５】
コンパイル装置１０２は、ソースプログラム１０１の翻訳結果として、図４に示される機械語命令列１０７ａと図７に示される最適化ヒント情報記述デバッグ情報１０７ｂとが格納された機械語プログラム１０７を出力する。
【００６６】
次に、デバッグ装置１０８の実行する処理について説明する。
デバッグ装置１０８の入力部１０９は、図４に示される機械語命令列１０７ａと図７に示される最適化ヒント情報記述デバッグ情報１０７ｂとが格納された機械語プログラム１０７を読み込み、機械語命令列１０７ａを機械語命令列記憶部１１１に格納する。また、入力部１０９は、図７に示される最適化ヒント情報記述デバッグ情報１０７ｂを、図８に示されるデバッグ装置でエラーチェックが行える形式の最適化ヒント情報記述デバッグ情報１１２ｂに変換して、デバッグ情報記憶部１１２に格納する。デバッグ情報記憶部１１２には、メモリアクセス情報も格納される。ここで、メモリアクセス情報は、エラーチェックに使われる情報で、最初は何の情報も格納されていない。たとえば、図８に示されるメモリアクセス情報には、アドレスａ４０７で示される命令実行時にアクセスされるメモリ情報等が格納されることになるが、最初は何の情報も記憶されていない。
【００６７】
図９は、実行エンジン１１０による機械語命令列実行時の動作を示すフローチャートである。
【００６８】
実行エンジン１１０は、機械語命令列記憶部１１１に格納されている機械語命令列１０７ａのアドレスを順次取得する（ステップＳ９０１）。
【００６９】
実行エンジン１１０は、取得したアドレスが、最適化ヒント情報記述デバッグ情報１１２ｂに格納されているエラーチェックポイントのアドレスに一致するか否かを判定する（ステップＳ９０２）。
【００７０】
判定結果が真であれば（ステップＳ９０２でｙｅｓ）、実行エンジン１１０は、エラーチェック部１１３を起動する（ステップＳ９０３）。その後、実行エンジン１１０は、取得されたアドレスで示される機械語命令を実行する（ステップＳ９０４）。実行の結果、機械語命令列１０７ａの処理が終了していなければ（Ｓ９０５でｎｏ）、次に実行される機械語命令のアドレスを取得し（Ｓ９０２）、同様の処理を、機械語命令列１０７ａの処理が終了するまで繰り返す。
【００７１】
図４に示した機械語命令列１０７ａの例では、アドレスａ４０２，ａ４０６，ａ４０７およびａ４０９がエラーチェックポイントのアドレスである。このため、それぞれのアドレスで示される命令の実行前に、エラーチェック部１１３が起動される。
【００７２】
図１０は、エラーチェック部１１３の動作を示すフローチャートである。エラーチェック部１１３は、最初に、機械語命令がアクセスするメモリ領域を取得する（ステップＳ１０１）。ｒｅｓｔｒｉｃｔ記述の場合は、エラーチェックポイントに存在する命令は、メモリアクセス命令であるので、必ずアクセスするメモリ領域が取得できる。
【００７３】
次に、エラーチェック部１１３は、最適化ヒント情報記述デバッグ情報１１２ｂのうち、上述の機械語命令のアドレスに対応するメモリアクセス情報以外のメモリアクセス情報に着目する（ステップＳ１０２）。たとえば、機械語命令のアドレスがａ４０７の場合には、アドレスａ４０２およびａ４０６に対応するメモリアクセス情報に着目する。
【００７４】
エラーチェック部１１３は、上述の機械語命令のアドレスに対応するメモリアクセス情報と、それ以外のメモリアクセス情報とを比較し、メモリアクセス領域に重なりがあるか否かを判定する（ステップＳ１０３）。
【００７５】
重なりがあると判定された場合には（ステップＳ１０３でｙｅｓ）、対応するｒｅｓｔｒｉｃｔ記述の不正が検出されたということなので、エラーチェック部１１３は、エラーメッセージ表示部１１４を起動する（ステップＳ１０６）。
【００７６】
重なりがないと判定された場合には（ステップＳ１０３でｎｏ）、上述の機械語命令のアドレスに対応するメモリアクセス情報以外のすべてのメモリアクセス情報について着目済みか否かを判断する（ステップＳ１０４）。未着目のメモリアクセス情報が存在する場合には（Ｓ１０４でｎｏ）、Ｓ１０２以降の処理を繰り返す。
【００７７】
不正が検出されなかった場合には（Ｓ１０４でｙｅｓ）、上述の機械語命令のアドレスに対応するメモリアクセス情報に、その機械語命令でアクセスするメモリ領域を追加する（ステップＳ１０５）。
【００７８】
たとえば、図４の機械語命令列１０７ａにおいて、アドレスａ４０１で示される命令実行前のレジスタｒ０の値を０ｘ８００４、レジスタｒ１の値を０ｘ８０００とする。最初に、アドレスａ４０２で示される命令の実行前に、エラーチェック部１１３が呼び出されるが、その場合の最適化ヒント情報記述デバッグ情報１１２ｂは、図８に示すような状態である。このため、ポインタ変数ｐが指す領域と、ポインタ変数ｑが指す領域との重なりは存在せず、メモリアクセス情報が更新され、最適化ヒント情報記述デバッグ情報１１２ｂが図１１に示されるようなものになる。ここで、（０ｘ８０００，４）は、０ｘ８０００番地から、４バイト分のメモリ領域がアクセスされることを表す。
【００７９】
次に、アドレスａ４０６の命令実行前に、エラーチェック部１１３が呼び出されるが、その場合の最適化ヒント情報記述デバッグ情報１１２ｂは、図１１の状態なので、ポインタ変数ｐが指す領域と、ポインタ変数ｑが指す領域との重なりは存在せず、メモリアクセス情報が更新され、最適化ヒント情報記述デバッグ情報１１２ｂの情報は図１２に示されるものとなる。
【００８０】
次に、アドレスａ４０７実行前に、エラーチェック部１１３が呼び出されるが、その場合の最適化ヒント情報記述デバッグ情報１１２ｂは、図１２の状態なので、ポインタ変数ｐが指す領域と、ポインタ変数ｑが指す領域との重なりが存在するため、エラーメッセージ表示部１１４が起動される。
【００８１】
エラーメッセージ表示部１１４は、エラーを検出したｒｅｓｔｒｉｃｔ記述が記述されているソースプログラム１０１のファイル名、行情報を最適化ヒント情報記述デバッグ情報１１２ｂから取得し、ファイル名、行情報を含むエラーメッセージを表示する。
【００８２】
なお、エラーメッセージを表示する変わりに、該当ソースプログラム１０１を表示して、該当行の文字を反転させるなどして、プログラマにエラー箇所を知らせるようにしてもよい。
【００８３】
以上のような処理を行なうことにより、誤ったｒｅｓｔｒｉｃｔ記述を検出することができる。
（動作例２）
次に、最適化ヒント情報記述としてポインタ型の仮引数の指すメモリ領域のアラインメントを指定するプラグマ指令がソースプログラム１０１に含まれている場合のコンパイルシステム１００の動作について説明する。
【００８４】
図１３は、上述のプラグマ指令を含むソースプログラムの一例を示す図である。
ソースプログラム１０１中のプラグマ指令「＃ｐｒａｇｍａ  ＿ｐｏｉｎｔｉｎｇ＿ａｌｉｇｎ＝４  ａ」は、ポインタ型仮引数ａの指すメモリ領域が、関数が呼び出された時点で４バイトアラインメントされていることをプログラマがコンパイル装置１０２に知らせるためのものである。
【００８５】
図１４は、プラグマ指令の情報を利用しないで、翻訳した結果の機械語命令列を示す図である。また、図１５は、プラグマ指令の情報を利用してコンパイルした結果の機械語命令列１０７ａを示す図である。ここで、機械語命令の意味は、以下の通りである。
【００８６】
「Ｌｄｂ  ｒ２，（ｒ１＋）」は、レジスタｒ１の指し示す１バイトのメモリ領域の内容をレジスタｒ２にロードした後、レジスタｒ１の値を次のメモリ領域を指すように更新する。
【００８７】
「Ｓｔｂ  （ｒ０＋），ｒ２」は、レジスタｒ２の値をレジスタｒ０の指し示す１バイトのメモリ領域にストアした後、レジスタｒ０の値を次のメモリ領域を指すように更新する。１バイトのロード、ストアの場合は、アクセスするメモリ領域に何の制約もない。
【００８８】
「Ｌｄ  ｒ２，（ｒ１＋）」は、レジスタｒ１の指し示す４バイトのメモリ領域の内容をレジスタｒ２にロードした後、レジスタｒ１の値を次のメモリ領域を指すように更新する。
【００８９】
「Ｓｔ  （ｒ０＋），ｒ２」は、レジスタｒ２の値をレジスタｒ０の指し示すメモリ領域にストアした後、レジスタｒ０の値を次のメモリ領域を指すように更新する。
【００９０】
４バイト単位でのロード命令およびストア命令の場合には、アクセスするメモリ領域は４バイトアラインメントされていないと正しく動作しないという制約が存在する。ここで、プラグマ指令のアラインメント情報を利用しない場合には、配列の先頭のアラインメントが不明なため、配列のコピーは１バイトずつ行わなければならず、図１３のソースプログラム１０１は、図１４の機械語命令列に翻訳される。この場合、ループの繰り返し回数は２５６回となる。
【００９１】
一方、プラグマ指令のアラインメント情報を利用して最適化を行った場合は、配列の先頭のアラインメントが４であることを利用して、配列のコピーは４バイトずつ行うことができる。このため、図１３のソースプログラム１０１は、図１５の機械語命令列１０７ａに翻訳される。この場合、ループの繰り返し回数は２５６／４＝６４回となり、実行性能が向上する。しかし、プラグマ指令のアラインメント情報が誤っており、配列の先頭がアラインメントの制約を満たしていない場合は、実行結果が不正なものとなる。
【００９２】
このような場合に、上記プラグマ指令のエラーチェックを行うには、関数の先頭での仮引数ａおよびｂのアラインメントの情報が分かればよい。関数の先頭の命令をアドレスａ１５１の命令とし、仮引数ａおよびｂの値の格納されているレジスタをそれぞれレジスタｒ０、レジスタｒ１とすると、コンパイル装置１０２で生成される最適化ヒント情報記述デバッグ情報１０７ｂは、図１６に示されるようになる。すなわち、関数の先頭で仮引数ａおよびｂの指すメモリ領域が４バイトアラインメントされていなければならないことが示されている。
【００９３】
デバッグ装置１０８は、上述の動作例１と同様の処理を行なうが、エラーチェック部１１３の実行する処理が異なる。
【００９４】
図１７は、エラーチェック部１１３の動作を示すフローチャートである。エラーチェック部１１３は、エラーチェックポイントにおいて、レジスタの値を取得する（ステップＳ２０１）。ここでは、図１６に示した最適化ヒント情報記述デバッグ情報１０７ｂ（１１２ｂ）に従い、レジスタｒ０およびレジスタｒ１の値を取得する。
【００９５】
次に、エラーチェック部１１３は、取得したレジスタの値が指定したアライメント値の倍数であるか否かを判断する（ステップＳ２０２）。ここでは、レジスタｒ０およびレジスタｒ１の値が４の倍数であるか否かを判断する。
【００９６】
上述の判断結果が偽の場合には（ステップＳ２０２でｎｏ）、エラーチェック部１１３は、エラーメッセージ表示部１１４を起動し、エラー表示を行なわせる（ステップＳ２０３）。
【００９７】
以上のような処理を行なうことにより、誤ったポインタ型の仮引数の指すメモリ領域のアラインメントを指定するプラグマ指令を検出することができる。
（動作例３）
次に、最適化ヒント情報記述として、繰り返し文の最小繰り返し回数を指定するプラグマ指令がソースプログラム１０１に含まれている場合のコンパイルシステム１００の動作について説明する。
【００９８】
図１８は、上述のプラグマ指令を含むソースプログラムの一例を示す図である。
ソースプログラム１０１中のプラグマ指令「＃ｐｒａｇｍａ  ＿ｍｉｎｉｍｕｍ＿ｔｉｍｅｓ＝４」は、ｆｏｒループの繰り返し回数が必ず４以上であることをプログラマがコンパイル装置１０２に知らせるためのものである。
【００９９】
図１９にプラグマ指令の情報を利用しないで、翻訳した結果の機械語命令列を示す図である。また、図２０にプラグマ指令の情報を利用してコンパイルした結果の機械語命令列１０７ａを示す図である。
【０１００】
プラグマ指令の最小繰り返し回数の情報を利用しない場合は、ループ回数が０回および１回の場合も可能性としてある。このため、ループ回数が２回以上の場合に適用可能なソフトウェアパイプライニングによる最適が行えない。よって、図１８のソースプログラム１０１は、図１９の機械語命令列に翻訳される。
【０１０１】
一方、プラグマ指令の最小繰り返し回数の情報を利用して最適化を行った場合は、ループ回数が２回以上で行えるソフトウェアパイプライニング最適を適用でき、図１８のソースプログラム１０１は、図１９の機械語命令列に翻訳される。これによって、実行性能が向上する。しかし、ループ回数が０回または１回の場合には、実行結果が不正となる。
【０１０２】
この場合に上記プラグマ指令のエラーチェックを行うには、ループの実行前に、ループの繰り返し回数の最低回数が満たすべき条件の情報が分かればよい。図２０の例では、ループの実行前の命令のアドレスがａ１９２で、そのときプラグマ指令が正しいために成立していなければならない条件は、レジスタｒ０（ソースプログラム１０１の関数ｈの仮引数ｎの値を保持しているレジスタ）の値が、４以上であることである。このため、コンパイル装置１０２で生成される最適化ヒント情報記述デバッグ情報１０７ｂは、図２１に示されるようになる。
【０１０３】
すなわち、最適化ヒント情報記述デバッグ情報１０７ｂには、エラーチェックポイントのアドレス「ａ１９３」と、そのときに成立しなければならない条件（以下、「ループ先頭成立条件」という。）と、プラグマが記述されているソースプログラム１０１のファイル名と行番号の組である行情報とが含まれる。
【０１０４】
デバッグ装置１０８は、上述の動作例１と同様の処理を行なうが、エラーチェック部１１３の実行する処理が異なる。
【０１０５】
図２２は、エラーチェック部１１３の動作を示すフローチャートである。エラーチェック部１１３は、エラーチェックポイントにおいて、レジスタの値を取得する（ステップＳ３０１）。ここでは、図２１に示される最適化ヒント情報記述デバッグ情報１０７ｂ（１１２ｂ）に従い、レジスタｒ０の値を取得する。
【０１０６】
次に、エラーチェック部１１３は、取得したレジスタの値がループ先頭成立条件を満たすか否かを判断する（ステップＳ３０２）。ここでは、レジスタｒ０の値が４以上であるか否かを判断する。
【０１０７】
上述の判断結果が偽の場合には（ステップＳ３０２でｎｏ）、エラーチェック部１１３は、エラーメッセージ表示部１１４を起動し、エラー表示を行なわせる（ステップＳ３０３）。
【０１０８】
以上のような処理を行なうことにより、誤った繰り返し文の最小繰り返し回数を指定するプラグマ指令を検出することができる。
【０１０９】
以上説明したように本発明の実施の形態によると、デバッグ装置が上記最適化ヒント情報記述デバッグ情報を利用してエラーチェックを行うことにより、プログラマがデバッグコードを記述しなくても、最適化ヒント情報が不正か否かを判断することができる。このため、プログラマに高いスキルと大きな工数とを要求することなく、最適化ヒント情報の正当性を判定することができる。
【０１１０】
以上、本発明に係るコンパイルシステムについて、実施の形態に基づいて説明したが、本発明は、この実施の形態に限定されるものではない。
【０１１１】
例えば、最適化ヒント情報の記述がコード最適化部１０４で最適化に利用されたときにのみ、最適化ヒント情報記述デバッグ情報生成部１０６が、最適化ヒント情報の記述に対する最適化ヒント情報記述デバッグ情報１０７ｂを生成するようにしてもよい。これにより、最適化ヒント情報記述デバッグ情報１０７ｂのサイズを削減することができ、デバッグ装置１０８でエラーチェックに要する時間も短縮できる。
【０１１２】
また、コンパイル装置１０２は、最適化ヒント情報の記述がコード最適化部１０４で最適化に利用されたか否かを表示する表示部を備えてもよい。これにより、プログラマは、コンパイル装置２１２で利用されていない最適化ヒント情報の記述を認識でき、利用されない部分の最適化ヒント情報記述に関するテストを省略することができる。よって、プログラム開発効率を向上させることが可能となる。
【０１１３】
また、デバッグ装置１０８は、さらに、エラーチェック部１１３によるエラーチェック機能を有効または無効にする切り替え部を備えるようにしてもよい。この場合、エラーチェックが不要のときは、エラーチェック機能を無効にできるため、プログラムのデバッグ効率が向上する。
【０１１４】
また、デバッグ装置１０８は、さらに、ユーザからの機械語プログラム１０７のファイル名の指定を受け付けるファイル名受け付け部を備え、エラーチェック部１１３は、指定されたファイル名の機械語プログラム１０７に対してのみエラーチェックを行うようにしてもよい。このような処理を行なうことにより、特定のソースプログラム１０１の最適化ヒント情報の記述のみを変更した場合に、そのソースプログラム１０１に対応する機械語プログラム１０７だけをエラーチェックすることができ、デバッグ効率が向上する。
【０１１５】
また、デバッグ装置１０８は、ソースプログラム１０１中の関数を指定する関数指定部を備え、エラーチェック部１１３は、指定された関数の定義に含まれる最適化ヒント情報の記述に対してのみエラーチェックを行うようにしてもよい。こうすることにより、特定の関数の最適化ヒント情報の記述のみを変更した場合に、その関数だけをエラーチェックすることができ、デバッグ効率が向上する。
【０１１６】
また、本実施の形態に係るデバッグ装置１０８では、最適化ヒント情報のエラー判定を行う構成としているが、エラー判定をデバッグ装置１０８では行わず、デバッグ装置は、エラー判定に必要な実行時情報の収集のみを行い、その情報を出力するようにしてもよい。その場合には、エラー判定は別の装置で行なわれる。
【０１１７】
また、最適化ヒント情報の他の例としては、ループの回数が偶数回数または奇数回数であることを指定するプラグマもある。このプラグマは、ループアンローリングの指定の際に用いられる
また、実施の形態におけるコンパイル装置およびデバッグ装置を機械語プログラムにより実現し、これを記憶媒体に記憶して流通・販売の対象にしてもよい。このような記憶媒体には、ＩＣカード、光ディスクフレキシブルディスク、ＲＯＭ等があるが、これらに記憶された機械語プログラムは、汎用のコンピュータにインストールされることにより利用に供される。即ち、汎用のコンピュータは、インストールした上記機械語プログラムを逐次実行して、実施の形態に示したようなコンパイル装置およびデバッグ装置を実現する。また、汎用のコンピュータに上述のコンパイル装置およびデバッグ装置を実行させるためのコンピュータプログラムは、ハードディスク等の記憶媒体および通信回線等を介してオンラインで流通させ頒布することもできる。
【産業上の利用可能性】
【０１１８】
本発明に係るコンパイル装置およびデバッグ装置によると、ソースプログラムの最適化ヒント情報記述のエラーチェックが可能となるので、ソフトウェア開発環境等として有用である。
【図面の簡単な説明】
【０１１９】
【図１】本発明の実施の形態に係るコンパイルシステムの構成を示す機能ブロック図である。
【図２】ｒｅｓｔｒｉｃｔ記述を含むソースプログラムの一例を示す図である。
【図３】ｒｅｓｔｒｉｃｔ記述の情報を利用しないで、ソースプログラムを翻訳した結果の機械語命令列を示す図である。
【図４】ｒｅｓｔｒｉｃｔ記述の情報を利用して、ソースプログラムをコンパイルした結果の機械語命令列を示す図である。
【図５】最適化ヒント情報記述検出部の動作を示すフローチャートである。
【図６】エラーチェックポイント検出部の動作を示すフローチャートである。
【図７】図２のソースプログラムのｒｅｓｔｒｉｃｔ記述に対する最適化ヒント情報記述デバッグ情報の一例を示す図である。
【図８】デバッグ装置でエラーチェックが行える形式の最適化ヒント情報記述デバッグ情報の一例を示す図である。
【図９】実行エンジンによる機械語命令列実行時の動作を示すフローチャートである。
【図１０】エラーチェック部の動作を示すフローチャートである。
【図１１】図４に示す機械語命令列のアドレスａ４０２でのエラーチェック後の最適化ヒント情報記述デバッグ情報の一例を示す図である。
【図１２】図４に示す機械語命令列のアドレスａ４０６でのエラーチェック後の最適化ヒント情報記述デバッグ情報の一例を示す図である。
【図１３】ポインタ型の仮引数の指すメモリ領域のアラインメントを指定するプラグマ指令を含むソースプログラムの一例を示す図である。
【図１４】プラグマ指令の情報を利用しないで図１３に示すソースプログラムを翻訳した結果の機械語命令列を示す図である。
【図１５】プラグマ指令の情報を利用して図１３に示すソースプログラムを翻訳した結果の機械語命令列を示す図である。
【図１６】図１５の機械語命令列に対する、最適化ヒント情報記述デバッグ情報の一例を示す図である。
【図１７】エラーチェック部の動作を示す他のフローチャートである。
【図１８】繰り返し文の最小繰り返し回数を指定するプラグマ指令を含むソースプログラムの一例を示す図である。
【図１９】プラグマ指令の情報を利用しないで図１８に示すソースプログラムを翻訳した結果の機械語命令列を示す図である。
【図２０】プラグマ指令の情報を利用して図１８に示すソースプログラムを翻訳した結果の機械語命令列を示す図である。
【図２１】図２０の機械語命令列に対する、最適化ヒント情報記述デバッグ情報の一例を示す図である。
【図２２】エラーチェック部の動作を示すさらに他のフローチャートである。
【符号の説明】
【０１２０】
１００  コンパイルシステム
１０１  ソースプログラム
１０２  コンパイル装置
１０３  最適化ヒント情報記述検出部
１０４  コード最適化部
１０５  エラーチェックポイント検出部
１０６  最適化ヒント情報記述デバッグ情報生成部
１０７  機械語プログラム
１０７ａ  機械語命令列
１０７ｂ，１１２ｂ  最適化ヒント情報記述デバッグ情報
１０８  デバッグ装置
１０９  入力部
１１０  実行エンジン
１１１  機械語命令列記憶部
１１２  デバッグ情報記憶部
１１３  エラーチェック部
１１４  エラーメッセージ表示部
【図１】
2006155386.tif 000003
【図２】
2006155386.tif 000004
【図３】
2006155386.tif 000005
【図４】
2006155386.tif 000006
【図５】
2006155386.tif 000007
【図６】
2006155386.tif 000008
【図７】
2006155386.tif 000009
【図８】
2006155386.tif 000010
【図９】
2006155386.tif 000011
【図１０】
2006155386.tif 000012
【図１１】
2006155386.tif 000013
【図１２】
2006155386.tif 000014
【図１３】
2006155386.tif 000015
【図１４】
2006155386.tif 000016
【図１５】
2006155386.tif 000017
【図１６】
2006155386.tif 000018
【図１７】
2006155386.tif 000019
【図１８】
2006155386.tif 000020
【図１９】
2006155386.tif 000021
【図２０】
2006155386.tif 000022
【図２１】
2006155386.tif 000023
【図２２】
2006155386.tif 000024