(57)【要約】【課題】  オブジェクトコードのコードサイズあるいは実行速度を実際に実行される命令の回数に基づいて最適化することが可能な言語処理装置を提供する。【解決手段】  言語処理装置１は、オブジェクトコード１００を探索して同じ実行順の並びからなる命令列の共通部分を抽出する共通命令列抽出部１１と、オブジェクトコード１００の実行結果が記録されたトレースデータ２００を解析して共通命令列抽出部１１で抽出された共通命令列の実行回数を計数する実行回数計数部１２と、実行回数計数部１２で計数された共通命令列の実行回数を予め定めたしきい値と比較する比較部１３と、共通命令列の実行回数がしきい値以下のときは、オブジェクトコード１００に対して共通命令列抽出部１１で抽出された共通命令列を１箇所にまとめる命令共通化処理を行い、処理後オブジェクトコード３００を出力する命令共通化処理部１４とを有する。【選択図】  図１
2007018254.tif 000002
【特許請求の範囲】
【請求項１】
オブジェクトコードの実行結果を記録したトレースデータを解析して前記オブジェクトコード中に記述された同じ実行順の命令列の並びからなる共通部分の実行回数データを生成し、前記実行回数データに基づいて前記オブジェクトコードに対して前記共通部分をまとめる処理を行うことを特徴とする言語処理装置。
【請求項２】
オブジェクトコードを探索して同じ実行順の命令列の並びからなる共通部分を抽出する抽出手段と、
前記オブジェクトコードの実行結果を記録したトレースデータを解析して前記共通部分の実行回数を計数する計数手段と、
前記実行回数を予め定めたしきい値と比較する比較手段と、
前記比較の結果、前記実行回数が前記しきい値以下のときは、前記共通部分を１箇所にまとめて記述するよう前記オブジェクトコードを書き直す命令共通化処理手段と
を有することを特徴とする言語処理装置。
【請求項３】
前記オブジェクトコードの前記探索範囲の最小値を予め指定することを特徴とする請求項２に記載の言語処理装置。
【請求項４】
オブジェクトコードの実行結果を記録したトレースデータを解析して命令列の実行回数データを生成し、前記命令列の実行回数データに基づいて前記オブジェクトコードに含まれる関数のインライン化処理を行うことを特徴とする言語処理装置。
【請求項５】
オブジェクトコードの実行結果を記録したトレースデータを解析して命令列ごとの実行回数を計数する計数手段と、
前記実行回数を予め定めたしきい値と比較する比較手段と、
前記実行回数が前記しきい値を超えた命令列が関数呼び出し命令を含むかどうかを検査する検査手段と、
前記検査により前記関数呼び出し命令を含むことが判明した前記実行回数が前記しきい値を超える命令列に含まれる前記関数呼び出し命令をインライン化するよう前記オブジェクトコードを書き直すインライン化処理手段と
を有することを特徴とする言語処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、高級言語で書かれるプログラムの言語処理装置に関し、特にコンパイラから出力されるオブジェクトコードを処理する言語処理装置に関する。
【背景技術】
【０００２】
Ｃ言語などの高級言語で記述されたソースプログラムは、コンパイラで実行形式のオブジェクトコードに変換される。このとき、オブジェクトコードのサイズができるだけ小さいことが望まれることがある。その場合、コンパイラは、ソースプログラムの複数の場所で同じ命令列が使用されていた場合、その命令列を1つにまとめることでオブジェクトコードのコードサイズを小さくすることができる。この場合、元の命令列の場所にはジャンプ命令などが挿入され、共通化された命令列に制御を移すようにすることが一般的に行われる。しかし、このようにして生成されたオブジェクトコードは、コードサイズは小さくなるが、ジャンプ命令などが挿入された分だけ実行速度が遅くなる。
【０００３】
これに対して、実行速度を速めるためのコンパイル処理として、関数のインライン化がある（例えば、特許文献１参照。）。インライン化処理では、関数の呼び出しの代わりに、関数のコードが関数の呼び出し位置に埋め込まれる。関数の呼び出しを行わないので実行速度は速くなるが、関数のコードが埋め込まれた分だけオブジェクトコードのコードサイズが大きくなる。
【０００４】
そこで、オブジェクトコードには、コードサイズと実行速度のバランスのとれた最適化が望まれる。しかし、従来のコンパイラはソースプログラムの静的解析により最適化を図っているため、実行速度の低下を防ぎながら同時に命令列の共通化を図ることができないという問題があった。これは、ソースプログラムの静的解析では、命令が実際に実行される回数が把握できないためである。
【特許文献１】特開２００４−６２２３４号公報  （第４ページ、図１）
【発明の開示】
【発明が解決しようとする課題】
【０００５】
そこで、本発明の目的は、オブジェクトコードのコードサイズあるいは実行速度を実際に実行される命令の回数に基づいて最適化することが可能な言語処理装置を提供することにある。
【課題を解決するための手段】
【０００６】
本発明の一態様によれば、オブジェクトコードの実行結果を記録したトレースデータを解析して前記オブジェクトコード中に記述された同じ実行順の命令列の並びからなる共通部分の実行回数データを生成し、前記実行回数データに基づいて前記オブジェクトコードに対して前記共通部分をまとめる処理を行うことを特徴とする言語処理装置が提供される。
【０００７】
また、本発明の別の一態様によれば、オブジェクトコードを探索して同じ実行順の命令列の並びからなる共通部分を抽出する抽出手段と、前記オブジェクトコードの実行結果を記録したトレースデータを解析して前記共通部分の実行回数を計数する計数手段と、前記実行回数を予め定めたしきい値と比較する比較手段と、前記比較の結果、前記実行回数が前記しきい値以下のときは、前記共通部分を１箇所にまとめて記述するよう前記オブジェクトコードを書き直す命令共通化処理手段とを有することを特徴とする言語処理装置が提供される。
【０００８】
さらに、本発明の別の一態様によれば、オブジェクトコードの実行結果を記録したトレースデータを解析して命令列の実行回数データを生成し、前記命令列の実行回数データに基づいて前記オブジェクトコードに含まれる関数のインライン化処理を行うことを特徴とする言語処理装置が提供される。
【０００９】
また、本発明の別の一態様によれば、オブジェクトコードの実行結果を記録したトレースデータを解析して命令列ごとの実行回数を計数する計数手段と、前記実行回数を予め定めたしきい値と比較する比較手段と、前記実行回数が前記しきい値を超えた命令列が関数呼び出し命令を含むかどうかを検査する検査手段と、前記検査により前記関数呼び出し命令を含むことが判明した前記実行回数が前記しきい値を超える命令列に含まれる前記関数呼び出し命令をインライン化するよう前記オブジェクトコードを書き直すインライン化処理手段とを有することを特徴とする言語処理装置が提供される。
【発明の効果】
【００１０】
本発明によれば、実際に実行される命令の回数に基づいて命令の共通化あるいは関数のインライン化を行うので、オブジェクトコードのコードサイズあるいは実行速度を最適化することができる。
【発明を実施するための最良の形態】
【００１１】
以下、本発明の実施例を図面を参照して説明する。
【実施例１】
【００１２】
図１は、本発明の実施例１に係る言語処理装置の構成を示すブロック図である。
【００１３】
本実施例の言語処理装置１は、オブジェクトコード１００をアドレスの小さい方から探索して同じ実行順の並びからなる命令列の共通部分を抽出する共通命令列抽出部１１と、オブジェクトコード１００の実行結果が記録されたトレースデータ２００を解析して共通命令列抽出部１１で抽出された共通命令列の実行回数を計数する実行回数計数部１２と、実行回数計数部１２で計数された共通命令列の実行回数を予め定めたしきい値と比較する比較部１３と、共通命令列の実行回数がしきい値以下のときは、オブジェクトコード１００に対して共通命令列抽出部１１で抽出された共通命令列を１箇所にまとめる命令共通化処理を行い、処理後オブジェクトコード３００を出力する命令共通化処理部１４とを有する。
【００１４】
共通命令列抽出部１１は、一般的な静的探索アルゴリズムを用い、共通部分として抽出する共通命令列の範囲が、予め指定された最小値以上のできるだけ広い範囲となるようオブジェクトコード１００をアドレスの小さい方から探索する。ここで、探索範囲の最小値を指定するのは、偶然並んだ短いコード列の並びが共通部分として抽出されるのを防ぐためである。探索の結果として、共通命令列が配置されているアドレス範囲を総て記録する。すなわち、共通命令列が複数の場所に配置されているときは、その配置されている複数の場所のアドレス範囲を総て記録する。ただし、抽出する共通命令列には、ジャンプ命令、分岐命令は含まないようにする。
【００１５】
実行回数計数部１２は、トレースデータ２００に記録されているアドレスデータを解析し、共通命令列抽出部１１で抽出された共通命令列が配置されているアドレス範囲の現れる回数を計数する。
【００１６】
比較部１３は、実行回数計数部１２で計数された共通命令列の実行回数を予め定めたしきい値と比較し、共通命令列の実行回数がしきい値以下のときは、命令共通化処理部１４へ命令共通化を指示する。
【００１７】
このとき、しきい値は任意に定めることができる。このしきい値を大きくすると、命令共通化処理部１４で共通化する命令列が増え、コードサイズを小さくすることができるが。しかし、共通化する命令列が増えると、実行時の共通命令列の呼び出しの回数が増加し、実行速度は低下する。そこで、実行速度の低下を抑えたいときは、比較部１３に与えるしきい値を小さくする。
【００１８】
命令共通化処理部１４は、オブジェクトコード１００の中の複数の場所に記述されていた共通命令列を１つの共通命令列部分に記述する。その代わり、共通命令列が記述されていた元の場所には共通命令列部分へのジャンプ命令を記述する。また、共通命令列部分の処理が終了したときに共通命令列が記述されていた元の場所へ戻るためのリターン命令を共通命令列部分の最後に記述する。このようにオブジェクトコード１００を書き直して、処理後オブジェクトコード３００を生成する。
【００１９】
次に、本実施例の言語処理装置１の処理例を図２〜図６を用いて説明する。なお、ここでは、比較部１３に与えるしきい値を１０として説明する。
【００２０】
図２〜図４に、言語処理装置１が、オブジェクトコード１００から共通命令列を抽出し、命令共通化処理を行って処理後オブジェクトコード３００を生成したときの例を示す。
【００２１】
図２は、共通命令列抽出部１１がオブジェクトコード１００から共通命令列Ａを抽出した例を示す。
【００２２】
共通命令列抽出部１１は、図２（ａ）に示したオブジェクトコード１００をアドレスの小さい方から探索し、アドレス０ｘ００２０〜アドレス０ｘ００４０の範囲に記述された処理Ａ１、アドレス０ｘ００６０〜アドレス０ｘ００８０の範囲に記述された処理Ａ２およびアドレス０ｘ００ａ０〜アドレス０ｘ００ｃ０の範囲に記述された処理Ａ３が、図２（ｂ）に示す共通命令列Ａであることを抽出する。
【００２３】
共通命令列抽出部１１は、抽出結果として、処理Ａ１、処理Ａ２、処理Ａ３が記述されていたアドレス範囲０ｘ００２０〜０ｘ００４０、０ｘ００６０〜０ｘ００８０、０ｘ００ａ０〜０ｘ００ｃ０を記録する。これらのアドレス範囲は、オブジェクトコード１００を実行するときに、各処理が配置されるメモリのアドレスを示す。
【００２４】
図３は、実行回数計数部１２の動作を示す図である。
【００２５】
トレースデータ２００に記録されているアドレスデータを解析し、共通命令列抽出部１１の抽出結果として記録されたアドレス範囲０ｘ００２０〜０ｘ００４０、０ｘ００６０〜０ｘ００８０、０ｘ００ａ０〜０ｘ００ｃ０が現れる回数を計数する。
【００２６】
図３に示す例では、アドレス範囲０ｘ００２０〜０ｘ００４０、０ｘ００６０〜０ｘ００８０、０ｘ００ａ０〜０ｘ００ｃ０が１回ずつ現れたため、実行回数計数部１２は計数結果３を出力する。
【００２７】
比較部１３は、この計数結果３をしきい値１０と比較する。計数結果３がしきい値１０以下であるため、比較部１３は命令共通化処理部１４へ命令共通化を指示する。
【００２８】
この指示を受けて、命令共通化処理部１４は、オブジェクトコード１００に対して、共通命令列抽出部１１で抽出された共通命令列Ａを１箇所にまとめる命令共通化処理を行う。
【００２９】
図４は、命令共通化処理部１４による命令共通化処理が行われて生成された処理後オブジェクトコード３００の例を示す図である。
【００３０】
共通命令列Ａに記述されていた命令列は、common_1というラベルが付けられた共通命令列部分に記述される。この共通命令列部分に共通命令列Ａを記述する代わりに、元の処理Ａ１、処理Ａ２、処理Ａ３が記述されていた場所には、common_1へのジャンプ命令（ｊ  common_1）が記述される。
【００３１】
これにより、処理Ａ１、処理Ａ２、処理Ａ３でジャンプ命令（ｊ  common_1）が実行されると、処理はcommon_1に記述された共通命令列Ａの処理に移る。この共通命令列Ａの処理が終わると、処理Ａ１、処理Ａ２、処理Ａ３の処理を戻す必要がある。そこで、共通命令列Ａの後に処理Ａ１、処理Ａ２、処理Ａ３へ処理を戻すためのリターン命令（jr  r30）が追加される。ここで、r30は、戻り位置が書き込まれたレジスタの名前である。
【００３２】
このように、この例では、命令共通化処理部１４による命令共通化処理が行われ、元のオブジェクトコード１００では３箇所に書かれていた共通命令列Ａは、処理後オブジェクトコード３００では１箇所にまとめられる。従って、元のオブジェクトコード１００に対して処理後オブジェクトコード３００は小さくなる。一方、実行速度面で見ると、実行速度を低下させる要因となるジャンプ命令を３回しか使わない。そのため、実行速度の低下が少なくて済む。
【００３３】
これに対して、命令共通化処理部１４による命令共通化処理が行われない例を図５〜図６に示す。
【００３４】
図５は、共通命令列抽出部１１がオブジェクトコード１００から共通命令列Ｂを抽出した例を示す。
【００３５】
共通命令列抽出部１１は、図５（ａ）に示したオブジェクトコード１００をアドレスの小さい方から探索し、アドレス０ｘ００００〜アドレス０ｘ００１４の範囲に記述された処理Ｂ１、アドレス０ｘ００２８〜アドレス０ｘ００３ｃの範囲に記述された処理Ｂ２、アドレス０ｘ００６８〜アドレス０ｘ００７ｃの範囲に記述された処理Ｂ３およびアドレス０ｘ００ａ８〜アドレス０ｘ００ｂｃの範囲に記述された処理Ｂ４が、図５（ｂ）に示す共通命令列Ｂであることを抽出する。
【００３６】
共通命令列抽出部１１は、抽出結果として、処理Ｂ１、処理Ｂ２、処理Ｂ３、処理Ｂ４が記述されていたアドレス範囲０ｘ００００〜０ｘ００１４、０ｘ００２８〜０ｘ００３ｃ、０ｘ００６８〜０ｘ００７ｃ、０ｘ００ａ８〜０ｘ００ｂｃを記録する。
【００３７】
図３は、実行回数計数部１２の動作を示す図である。
【００３８】
トレースデータ２００に記録されているアドレスデータを解析し、共通命令列抽出部１１の抽出結果として記録されたアドレス範囲０ｘ００００〜０ｘ００１４、０ｘ００２８〜０ｘ００３ｃ、０ｘ００６８〜０ｘ００７ｃ、０ｘ００ａ８〜０ｘ００ｂｃが現れる回数を計数する。
【００３９】
図３に示す例では、アドレス範囲０ｘ００２０〜０ｘ００４０が１２回、アドレス範囲０ｘ００６０〜０ｘ００８０、０ｘ００ａ０〜０ｘ００ｃ０が各１回ずつ現れたため、実行回数計数部１２は計数結果１５を出力する。
【００４０】
比較部１３は、この計数結果１５をしきい値１０と比較する。計数結果１５がしきい値１０を超えたため、比較部１３は命令共通化処理部１４に対して命令共通化の指示を出さない。したがって、この場合、処理後オブジェクトコード３００は、元のオブジェクトコード１００と同じものとなる。
【００４１】
このように、実行回数計数部１２の計数結果がしきい値を超える場合に命令共通化を行わないのは、命令共通化に伴う多数回のジャンプ処理の挿入により実行速度が大幅に低下するのを防止するためである。
【００４２】
このような本実施例の言語処理装置によれば、命令共通化に伴って挿入されるジャンプ命令の回数を任意に設定可能なしきい値により制限できるため、命令共通化による実行速度の低下を所望の範囲内に収めることができる。
【実施例２】
【００４３】
図７は、本発明の実施例２に係る言語処理装置の構成を示すブロック図である。
【００４４】
本実施例の言語処理装置２は、トレースデータ２００を解析して命令列ごとの実行回数を計数する実行回数計数部２１と、実行回数計数部２１で計数された命令列ごとの実行回数を予め定めたしきい値と比較する比較部２２と、実行回数がしきい値を超えた命令列が関数呼出し命令を含むかどうかを検査する関数呼び出し命令検査部２３と、実行回数がしきい値を超えた命令列の関数呼び出し命令をインライン展開するようオブジェクトコード１００を書き直して処理後オブジェクトコード４００を出力するインライン化処理部２４とを有する。
【００４５】
実行回数計数部２１は、トレースデータ２００に記録されているアドレスデータを解析し、命令列のアドレスごとの実行回数を計数する。
【００４６】
比較部２２は、実行回数計数部２１で計数された命令列の実行回数を予め定めたしきい値と比較し、命令列の実行回数がしきい値を超える命令列のアドレスを抽出する。
【００４７】
このとき、しきい値は任意に定めることができる。このしきい値を小さくすると、インライン化処理部２４でインライン化する命令列が増え、実行速度を速くすることができる。しかし、インライン化する命令列が増えると、オブジェクトコードのコードサイズは増加する。そこで、コードサイズの増加を抑えたいときは、比較部２２に与えるしきい値を大きくする。
【００４８】
関数呼び出し命令検査部２３は、オブジェクトコード１００に記述されているアドレスの値を探索し、比較部２２で抽出されたアドレスに一致するアドレスに記述されている命令列が関数呼び出し命令を含むかどうかを検査する。
【００４９】
インライン化処理部２４は、関数呼び出し命令検査部２３の検査により関数呼び出し命令を含むことが判明した命令列に含まれる関数呼び出し命令をインライン化するよう前記オブジェクトコードを書き直して、処理後オブジェクトコード４００を生成する。
【００５０】
次に、本実施例の言語処理装置２の処理例を図８〜図１０を用いて説明する。なお、ここでは、比較部２２に与えるしきい値を１０として説明する。
【００５１】
図８は、実行回数計数部２１が、トレースデータ２００に記録されているアドレスデータ解析し、命令列のアドレスごとの実行回数を計数した例を示す。
【００５２】
図８（ａ）に示すトレースデータ２００には、アドレス０ｘ００ｃ１〜０ｘ００ｃｃに配置される命令列Ｃ、アドレス０ｘ００ｄ１〜０ｘ００ｄｄに配置される命令列Ｄ、アドレス０ｘ００ｅ１〜０ｘ００ｅｅに配置される命令列Ｅの実行結果が記録されているものとする。
【００５３】
図８（ｂ）に、実行回数計数部２１がこのトレースデータ２００を解析し、命令列のアドレスごとの実行回数を計数した例を示す。この例では、アドレス０ｘ００ｃ１〜０ｘ００ｃｃの命令列が１３回、アドレス０ｘ００ｄ１〜０ｘ００ｄｄの命令列が１１回、アドレス０ｘ００ｅ１〜０ｘ００ｅｅの命令列が２回実行されている。
【００５４】
比較部２２は、実行回数計数部２１で計数された命令列の実行回数を予め定めたしきい値１０と比較し、命令列の実行回数がしきい値１０を超える命令列のアドレス０ｘ００ｃ１〜０ｘ００ｃｃおよび０ｘ００ｄ１〜０ｘ００ｄｄを抽出する。
【００５５】
関数呼び出し命令検査部２３は、オブジェクトコード１００に記述されているアドレスの値を探索し、比較部２２で抽出されたアドレス０ｘ００ｃ１〜０ｘ００ｃｃおよび０ｘ００ｄ１〜０ｘ００ｄｄに一致するアドレスに記述されている命令列が関数呼び出し命令を含むかどうかを検査する。
【００５６】
その結果、図９に示すように、アドレス０ｘ００ｃ１〜０ｘ００ｃｃに記述されている命令列Ｃは関数呼び出し命令を含み、アドレス０ｘ００ｄ１〜０ｘ００ｄｄに記述されている命令列Ｄは関数呼び出し命令を含まないことが判明する。
【００５７】
そこで、インライン化処理部２４は、アドレス０ｘ００ｃ１〜０ｘ００ｃｃに記述されている命令列Ｃに含まれる関数呼び出し命令をインライン化する処理を行う。
【００５８】
図１０は、インライン化処理部２４によるインライン化処理が行われて生成された処理後オブジェクトコード４００の例を示す図である。
【００５９】
このように、インライン化処理によりオブジェクトコードのコードサイズは増加するが、関数呼び出しの回数が減るため実行速度は向上する。
【００６０】
このような本実施例の言語処理装置によれば、インライン化する関数呼び出し命令の数を任意に設定可能なしきい値により制限できるため、関数呼び出し命令のインライン化によるコードサイズの増加を所望の範囲内に収めることができる。
【図面の簡単な説明】
【００６１】
【図１】本発明の実施例１に係る言語処理装置の構成を示すブロック図。
【図２】実施例１の言語処理装置における共通命令列の抽出例を示す図。
【図３】実施例１の言語処理装置における共通命令列の実行回数計数の例を示す図。
【図４】実施例１の言語処理装置による命令共通化処理後のオブジェクトコードの例を示す図。
【図５】実施例１の言語処理装置における共通命令列の抽出例を示す図。
【図６】実施例１の言語処理装置における共通命令列の実行回数計数の例を示す図。
【図７】本発明の実施例２に係る言語処理装置の構成を示すブロック図。
【図８】実施例２の言語処理装置における命令列ごとの実行回数計数の例を示す図。
【図９】実施例２の言語処理装置における関数呼び出し命令検査の例を示す図。
【図１０】実施例２の言語処理装置によるインライン化処理後のオブジェクトコードの例を示す図。
【符号の説明】
【００６２】
１、２  言語処理装置
１１  共通命令列抽出部
１２、２１  実行回数計数部
１３、２２  比較部
１４  命令共通化処理部
２３  関数呼び出し命令検査部
２４  インライン化処理部
【図１】
2007018254.tif 000003
【図２】
2007018254.tif 000004
【図３】
2007018254.tif 000005
【図４】
2007018254.tif 000006
【図５】
2007018254.tif 000007
【図６】
2007018254.tif 000008
【図７】
2007018254.tif 000009
【図８】
2007018254.tif 000010
【図９】
2007018254.tif 000011
【図１０】
2007018254.tif 000012