(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024142758
(43)【公開日】2024-10-11
(54)【発明の名称】コンパイルシステム及びコンパイル実行方法
(51)【国際特許分類】
G06F 8/30 20180101AFI20241003BHJP
【FI】
G06F8/30
【審査請求】未請求
【請求項の数】8
【出願形態】OL
(21)【出願番号】P 2023055069
(22)【出願日】2023-03-30
(71)【出願人】
【識別番号】320012037
【氏名又は名称】ラピステクノロジー株式会社
(74)【代理人】
【識別番号】110001025
【氏名又は名称】弁理士法人レクスト国際特許事務所
(72)【発明者】
【氏名】渡部 五常
(72)【発明者】
【氏名】大西 誠
【テーマコード(参考)】
5B376
【Fターム(参考)】
5B376BC31
5B376BC57
5B376BC73
5B376DA16
(57)【要約】
【課題】
コンパイルの回数を減らして開発効率の向上を図ることができるコンパイルシステムを提供する。
【解決手段】
関数毎に引数を渡し、関数毎の戻り値を受け取り、かつ関数毎の戻り値をモニタ用のグローバル変数に格納するためのソースコードを生成するソースコード生成装置と、ソースコードに対して互いに異なる態様のコンパイルを施して第1及び第2の実行ファイルを生成するコンパイラと、第1の実行ファイルに記録されたプログラムを実行し、関数毎のグローバル変数の値を示す第1のログファイルを生成し、かつ第2の実行ファイルに記録されたプログラムを実行し、関数毎のグローバル変数の値を示す第2のログファイルを生成する実行装置と、第1及び第2のログファイルが示す関数毎のグローバル変数の値を比較してその比較結果を示す結果比較ファイルを生成する結果比較装置と、を含む。
【選択図】
図1
【特許請求の範囲】
【請求項1】
関数毎に引数を渡し、前記関数毎の戻り値を受け取り、かつ前記関数毎の前記戻り値をモニタ用のグローバル変数に格納するための第1のソースコードを生成するソースコード生成装置と、
前記第1のソースコードに対して互いに異なる態様のコンパイルを施して第1及び第2の実行ファイルを生成する第1のコンパイラと、
前記第1の実行ファイルに記録されたプログラムを実行し、前記関数毎の前記グローバル変数の値を示す第1のログファイルを生成し、かつ前記第2の実行ファイルに記録されたプログラムを実行し、前記関数毎の前記グローバル変数の値を示す第2のログファイルを生成する実行装置と、
前記第1及び第2のログファイルが示す前記関数毎の前記グローバル変数の値を比較してその比較結果を示す結果比較ファイルを生成する結果比較装置と、を含むことを特徴とするコンパイルシステム。
【請求項2】
前記ソースコード生成装置は、前記関数毎に前記引数を渡し、前記関数毎の前記戻り値を受け取るための第2のソースコードに、前記関数毎の前記戻り値を前記モニタ用のグローバル変数に格納するためのコードを追加して前記第1のソースコードを生成するソースコード変換装置からなることを特徴とする請求項1記載のコンパイルシステム。
【請求項3】
前記ソースコード生成装置は、前記引数に応じて前記関数毎の前記関数の処理を行って前記戻り値を生成するための第3のソースコードに基づいて、前記第1のソースコードを自動生成するユースケース自動生成装置からなることを特徴とする請求項1記載のコンパイルシステム。
【請求項4】
前記第1のソースコードは、前記関数毎に最小値及び最大値の引数を渡し、前記最小値及び前記最大値の引数に対する前記関数毎の前記戻り値を受け取るためのソースコードであることを特徴とする請求項3記載のコンパイルシステム。
【請求項5】
前記互いに異なる態様のコンパイルには最適化なしのコンパイルと、最適化ありのコンパイルとが含まれ、
前記第1のコンパイラは、前記最適化なしのコンパイルにより前記第1の実行ファイルを生成し、前記最適化ありのコンパイルにより前記第2の実行ファイルを生成することを特徴とする請求項1記載のコンパイルシステム。
【請求項6】
前記結果比較装置は、前記第1及び第2のログファイルが示す前記グローバル変数の値が互いに等しい関数に対しては最適化が有効であると判定し、前記第1及び第2のログファイルが示す前記グローバル変数の値が互いに異なる関数に対しては最適化が無効であると判定し、前記関数毎に最適化が前記有効及び前記無効のいずれであるかを示す前記結果比較ファイルを生成することを特徴とする請求項5記載のコンパイルシステム。
【請求項7】
前記関数毎に前記引数を渡し、前記関数毎の前記戻り値を受け取って処理するための第4のソースコードと、前記引数に応じて前記関数毎の前記関数の処理を行って前記戻り値を生成するための第5のソースコードと、前記結果比較ファイルとを受け入れ、前記第4のソースコード及び前記第5のソースコードのコンパイル時に、前記結果比較ファイルが最適化の前記有効を示す関数に対して前記最適化ありのコンパイルを施し、前記結果比較ファイルが最適化の前記無効を示す関数に対して前記最適化なしのコンパイルを施す第2のコンパイラを更に含むことを特徴とする請求項6記載のコンパイルシステム。
【請求項8】
ソースコード生成装置が、関数毎に引数を渡し、前記関数毎の戻り値を受け取り、かつ前記関数毎の前記戻り値をモニタ用のグローバル変数に格納するための第1のソースコードを生成するステップと、
コンパイラが、前記第1のソースコードに対して互いに異なる態様のコンパイルを施して第1及び第2の実行ファイルを生成するステップと、
実行装置が、前記第1の実行ファイルに記録されたプログラムを実行し、前記関数毎の前記グローバル変数の値を示す第1のログファイルを生成し、かつ前記第2の実行ファイルに記録されたプログラムを実行し、前記関数毎の前記グローバル変数の値を示す第2のログファイルを生成するステップと、
結果比較装置が、前記第1及び第2のログファイルが示す前記グローバル変数の値を比較してその比較結果を示す結果比較ファイルを生成するステップと、を含むことを特徴とするコンパイルシステムのコンパイル実行方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ソースプログラム(ソースコード)の最適化を行うコンパイルシステム及びコンパイル実行方法に関する。
【背景技術】
【0002】
ソースプログラムのコンパイル際にソースプログラムの最適化を行うコンパイラを用いることは既に知られている。
【0003】
一般に、ソースプログラムのパフォーマンスを向上させるためにプログラムの作成者はコンパイラを用いてソースプログラムのコンパイルを行う際にプログラムの最適化を実行させる。プログラムの最適化は例えば、プログラム内の無駄を取り除いてコードサイズの縮小や実行時間の短縮を図るものである。
【0004】
例えば、特許文献1には、並列処理を許容する言語で集積回路の機能を記述したソースコードをハードウェア依存のコードに変換するコンパイラが開示されている。そのコンパイラには集積回路内の通信の時間的順序を変えることなく該通信の再スケジューリングを行うことにより、集積回路の性能またはコストを最適化する最適化器と、その最適化器の出力に基づいて、集積回路の回路構成を表す出力コードを生成する生成器とが備えられている。
【先行技術文献】
【特許文献】
【0005】
【発明の概要】
【発明が解決しようとする課題】
【0006】
ところで、プログラムの最適化によっては意図せずプログラムの動作が変わってしまうという懸念がある。この懸念に対処するためにプログラムの作成者は、従来、所望のパフォーマンスを得るように次の(1)~(4)の操作を繰り返すという手法をとっている。
(1)最適化オプションの選択、最適化制御用のプラグマの挿入
(2)プログラムのコンパイル
(3)プログラムの実行
(4)パフォーマンスの評価
しかしながら、このような従来の手法では、最適化の種類を切り替える度に、コンパイルをやり直す必要があるので、コンパイル時間が非常に長い場合には、コンパイルを繰り返すことは開発効率の低下にもつながるという課題があった。そのためプログラムの作成者には可能な限りプログラムの最適化の際にコンパイル回数を少なくして高パフォーマンスが得られる最適化を選定することが望まれていた。
【0007】
そこで、本発明の目的は、コンパイルの回数を減らして開発効率の向上を図ることができるコンパイルシステム及びコンパイルシステムのコンパイル実行方法を提供することである。
【課題を解決するための手段】
【0008】
本発明のコンパイルシステムは、関数毎に引数を渡し、前記関数毎の戻り値を受け取り、かつ前記関数毎の前記戻り値をモニタ用のグローバル変数に格納するための第1のソースコードを生成するソースコード生成装置と、前記第1のソースコードに対して互いに異なる態様のコンパイルを施して第1及び第2の実行ファイルを生成する第1のコンパイラと、前記第1の実行ファイルに記録されたプログラムを実行し、前記関数毎の前記グローバル変数の値を示す第1のログファイルを生成し、かつ前記第2の実行ファイルに記録されたプログラムを実行し、前記関数毎の前記グローバル変数の値を示す第2のログファイルを生成する実行装置と、前記第1及び第2のログファイルが示す前記関数毎の前記グローバル変数の値を比較してその比較結果を示す結果比較ファイルを生成する結果比較装置と、を含むことを特徴としている。
【0009】
本発明のコンパイルシステムのコンパイル実行方法は、ソースコード生成装置が、関数毎に引数を渡し、前記関数毎の戻り値を受け取り、かつ前記関数毎の前記戻り値をモニタ用のグローバル変数に格納するための第1のソースコードを生成するステップと、コンパイラが、前記第1のソースコードに対して互いに異なる態様のコンパイルを施して第1及び第2の実行ファイルを生成するステップと、実行装置が、前記第1の実行ファイルに記録されたプログラムを実行し、前記関数毎の前記グローバル変数の値を示す第1のログファイルを生成し、かつ前記第2の実行ファイルに記録されたプログラムを実行し、前記関数毎の前記グローバル変数の値を示す第2のログファイルを生成するステップと、結果比較装置が、前記第1及び第2のログファイルが示す前記グローバル変数の値を比較してその比較結果を示す結果比較ファイルを生成するステップと、を含むことを特徴としている。
【発明の効果】
【0010】
本発明のコンパイルシステム及びコンパイルシステムのコンパイル実行方法によれば、ソースコードに対して互いに異なる態様のコンパイルを施して関数毎に戻り値を比較し、その結果比較から関数毎にどの態様のコンパイルが有効又は無効であるかが分かるので、プログラムの作成者が再コンパイルしながら動作を確認するという手間が省け、これにより開発効率の向上が期待できる。
【図面の簡単な説明】
【0011】
【
図1】本発明の実施例1のコンパイルシステムの概念図である。
【
図3】本発明の実施例2のコンパイルシステムの概念図である。
【発明を実施するための形態】
【0012】
以下、本発明の実施例を、図面を参照しつつ詳細に説明する。
【実施例0013】
図1及び
図2は本発明の実施例1としてコンパイルシステムの概念図を示している。この本発明のコンパイルシステムでは、例として3つのC言語で記述されたソースファイル1-1、1-2、1-3をコンパイルする場合を説明する。
【0014】
図1において、ソースファイル1-1はmain関数を含むソースコードを示す第2のソースファイルである。ソースファイル1-2、1-3はソースファイル1-1のコンパイルの際に呼び出され、引数を入力値として受けて関数処理して戻り値を生成する関数を示すソースファイルである。また、ソースファイル1-2、1-3は互いに異なる関数の処理を行う。
【0015】
ソースファイル1-1はソースコード変換装置11に供給される。ソースコード変換装置11は、ソースファイル1-1が示すソースコードに、関数の戻り値をモニタ用のグローバル変数に格納するコードを追加したソースコード(第1のソースコード)を生成するソースコード生成装置である。モニタ用のグローバル変数に格納するコードを追加したソースコードはソースファイル1-4として出力される。
【0016】
ソースファイル1-4はソースファイル1-2、1-3と共にコンパイラ12に供給される。コンパイラ12はソースファイル1-4のソースコードをソースファイル1-2、1-3の各々の関数を利用してコンパイルして機械語に変換する。コンパイラ12は互いに異なる態様のコンパイルを実行する。すなわち、プログラムの最適化なしで機械語に変換する処理と、最適化して機械語に変換する処理とが実行される。コンパイラ12は最適化なしの処理により実行ファイル1-5(第1の実行ファイル)を生成し、最適化ありの処理により実行ファイル1-6(第2の実行ファイル)を生成する。よって、実行ファイル1-5には最適化なしの機械語が記録され、実行ファイル1-6には最適化ありの機械語が記録される。
【0017】
実行ファイル1-5、1-6は実行装置13に供給される。実行装置13は実行ファイル1-5、1-6の機械語を各々読み込んで実行する。また、実行装置13は実行結果として、実行ファイル1-5、1-6に埋め込まれたモニタ用のグローバル変数の値を示すログファイル1-7、1-8を各々出力する。
【0018】
ログファイル1-7、1-8は結果比較装置14に供給される。結果比較装置14には実行ファイル1-5、1-6も供給される。結果比較装置14はプログラムの最適化なし及びありの実行ファイル1-5、1-6及びログファイル1-7、1-8を各々比較し、比較結果ファイル1-9を出力する。比較結果ファイル1-9は呼び出される関数毎に最適化なし及びありで同一の戻り値が得られたらOK(有効)を示し、同一の戻り値が得られなかったらNG(無効)を示すファイルである。
【0019】
図2において、ソースファイル1-1、1-2、1-3及び比較結果ファイル1-9はコンパイラ21に供給される。コンパイラ21はソースファイル1-1、1-2、1-3を実行ファイル2-1に変換し、その変換においては比較結果のファイル1-9がOKを示す関数に対してのみ最適化を行う。NGを示す関数に対する最適化は行われない。コンパイラ21はコンパイル結果の実行ファイル2-1を出力する。
【0020】
なお、上述したソースコード変換装置11、コンパイラ12、実行装置13、結果比較装置14、及びコンパイラ21の各々はコンピュータによって構成することができる。
【0021】
次に、main関数を持つソースファイル1-1のコンパイルの際に呼び出される関数をfunc1()、func2()として実施例1のコンパイルシステムの動作例を説明する。
【0022】
ソースファイル1-1には、
void main(){
int func1_ret = func1();
int func2_ret = func2();
}
というソースコード(ソースプログラム)が記録されているとする。
【0023】
ソースファイル1-2には、呼び出される関数が、
int func1()
と定義される。同様に、ソースファイル1-3には、呼び出される関数が、
int func2()
と定義される。なお、func1()及びfunc2()の前に置かれたintは戻り値の型が整数であることを示している。
【0024】
ソースファイル1-1はソースコード変換装置11によってモニタ用グローバル変数が追加され、ソースファイル1-4となる。ソースコード変換装置11はソースファイル1-1に戻り値のある関数func1(),func2()の呼び出しを見つけると、モニタ用のグローバル変数func1_mon、func2_monと、関数func1()、func2()をモニタ用のグローバル変数へ格納するコードfunc1_mon = func1_ret、func2_mon = func2_retを自動生成する。
【0025】
ソースファイル1-4には、
int func1_mon;
int func2_mon;
void main(){
int func1_ret = func1();
func1_mon = func1_ret;
int func2_ret = func2();
func2_mon = func2_ret;
}
というソースコードが記載される。これによりソースファイル1-4では関数func1()、func2()の戻り値をグローバル変数func1_mon、func2_monに格納することが指定されている。
【0026】
コンパイラ12ではソースファイル1-4がソースファイル1-2、1-3を用いて最適化ありと最適化なしの双方の態様でコンパイルが行われる。コンパイル結果の実行ファイル1-5は最適化なしの実行ファイルであり、実行ファイル1-6は最適化ありの実行ファイルである。
【0027】
実行ファイル1-5、1-6は実行装置13によって各々実行され、その実行結果としてログファイル1-7、1-8が得られる。ログファイル1-7には最適化なしの場合の関数func1()、func2()の戻り値がfunc1_mon値、func2_mon値として記載され、ログファイル1-8には最適化ありの場合の関数func1()、func2()の戻り値がfunc1_mon値、func2_mon値として記載される。
【0028】
このようなログファイル1-7、1-8が実行ファイル1-5、1-6と共に結果比較装置14に供給されると、結果比較装置14では最適化なし及びありの実行ファイル1-5、1-6及びログファイル1-7、1-8が各々比較され、比較結果ファイル1-9が出力される。
【0029】
ここで、例として、ログファイル1-7では最適化なしの場合に
func1_mon = 1
func2_mon = 2
が得られ、ログファイル1-8では最適化ありの場合に
func1_mon = 1
func2_mon = 0
が得られたとする。結果比較装置14では、関数func1()、func2()の各々について戻り値が比較される。最適化なしの場合のfunc1_mon = 1と最適化ありの場合のfunc1_mon = 1とが等しいので、関数func1()についてはOKの判定がされる。一方、最適化なしの場合のfunc2_mon = 2と最適化ありの場合のfunc2_mon = 0とは異なるので、関数func2()についてはNGの判定がされる。よって、比較結果ファイル1-9には例えば、次のように比較結果が示される。
func1() (1 vs 1): OK
func2() (2 vs 0): NG
ソースファイル1-1、1-2、1-3及び比較結果ファイル1-9はコンパイラ21に読み込まれる。コンパイラ21では、ソースファイル1-1に示された関数のうち比較結果ファイル1-9に示されたOKの関数に対しては最適化を有効としてコンパイルが行われ、比較結果ファイル1-9に示されたNGの関数に対しては最適化を無効としてコンパイルが行われ、コンパイル結果の実行ファイル2-1が生成される。上記した例では、関数func1()に対しては最適化してコンパイルが実行される一方、関数func2()に対しては最適化することなくコンパイルが実行されることになる。
【0030】
このように実施例1によれば、最適化によって動作結果が変わってしまう関数に対してはコンパイルにおける最適化を無効にするので、プログラムの作成者が再コンパイルしながら動作を確認するという手間が省け、これにより開発効率の向上が期待できる。
ソースファイル3-1、3-2はユースケース自動生成装置31に供給される。ユースケース自動生成装置31は、入力されたソースファイル3-1、3-2を解析し、そのソースファイル3-1、3-2の各々が示す関数の引数入力値としてmin値(最小値)とmax値(最大値)とを自動的に判定し、そのmin値とmax値とを入力値としてその関数を呼び出すmain関数を含むソースコード(第1のソースコード)を示すソースファイル3-3を自動で生成する。ソースファイル3-3のソースコードには、min値及びmax値に対する関数の戻り値をモニタ用のグローバル変数に格納するコードが含まれる。
ソースファイル3-3はソースファイル3-1、3-2と共にコンパイラ32に供給される。コンパイラ32は、実施例1のコンパイラ12と同様に、コンパイルの際にプログラムの最適化なしの実行ファイルと、最適化ありの実行ファイルとを生成する。よって、コンパイラ32はソースファイル3-3、3-1、3-2を実行ファイル3-4、3-5へ変換する。ここで、実行ファイル3-4はプログラムの最適化なしの第1の実行ファイルであり、実行ファイル3-5はプログラムの最適化ありの第2の実行ファイルである。
実行ファイル3-4、3-5は実行装置33に供給される。実行装置33は実行ファイル3-4、3-5を読み込んで実行する。また、実行装置33は実行結果として、実行ファイル3-4、3-5に埋め込まれたモニタ用のグローバル変数の値を示すログファイル3-6、3-7を各々出力する。
ログファイル3-6、3-7は結果比較装置34に供給される。結果比較装置34には実行ファイル3-4、3-5も供給される。結果比較装置34は、実施例1の結果比較装置14と同様に、プログラムの最適化なし及びありの実行ファイル3-4、3-5及びログファイル3-6、3-7を各々比較し、比較結果ファイル3-8を出力する。比較結果ファイル3-8は、実施例1の比較結果ファイル1-9と同様に、呼び出される関数毎に最適化なし及びありで同一の戻り値が得られたらOKを示し、同一の戻り値が得られなかったらNGを示すファイルである。
なお、上述したユースケース自動生成装置31、コンパイ32、実行装置33、結果比較装置24、及びコンパイラ41の各々はコンピュータによって構成することができる。
次に、ソースファイル3-1には関数がint func1(int in1)と定義され、ソースファイル3-2には関数がint func2(long in2)と定義されているとして実施例2のコンパイルシステムの動作例を説明する。
ここで、ソースファイル3-1のint func1(int in1)の括弧内はint(整数)型の引数in1を表し、ソースファイル3-2のint func2(long in2)の括弧内はlong(長整数)型の引数in2を表している。
ソースファイル3-1、3-2はユースケース自動生成装置31に供給され、ユースケース自動生成装置31によってソースファイル3-1、3-2に記載された関数を呼び出すmain関数を示すソースファイル3-3が自動作成される。表1に示すように、呼び出しの入力値は関数func1(int in1)に対してはmin値がin1_min、max値がin1_maxであり、関数func2(long in2)に対してはmin値がin2_min、max値がin2_maxである。
これらのmin値及びmax値は例えば、関数func1(int in1)、func2(long in2)が引数の値として代入可能な最小値及び最大値であり、予め定められているとする。
コンパイラ32ではソースファイル3-3がソースファイル3-1、3-2を用いて最適化ありと最適化なしの双方でコンパイルが行われる。コンパイル結果の実行ファイル3-4は最適化なしの実行ファイルであり、実行ファイル3-5は最適化ありの実行ファイルである。
実行ファイル3-4、3-5は実行装置33によって各々実行され、その実行結果としてログファイル3-6、3-7が得られる。ログファイル3-6には最適化なしの場合の戻り値がfunc1_mon_min値、func1_mon_max値、func2_mon_min値、func2_mon_max値として記載され、ログファイル3-7には最適化ありの場合の戻り値が同様にfunc1_mon_min値、func1_mon_max値、func2_mon_min値、func2_mon_max値として記載される。
このようなログファイル3-6、3-7が実行ファイル3-4、3-5と共に結果比較装置34に供給されると、結果比較装置34では最適化なし及びありの実行ファイル3-4、3-5及びログファイル3-6、3-7が各々比較され、比較結果ファイル3-8が出力される。
ソースファイル4-1、3-1、3-2及び比較結果ファイル3-9はコンパイラ41に読み込まれる。コンパイラ41では、ソースファイル4-1に示された関数のうち比較結果ファイル1-9に示されたOKの関数に対しては最適化を有効としてコンパイルが行われ、比較結果ファイル1-9に示されたNGの関数に対しては最適化を無効としてコンパイルが行われ、コンパイル結果の実行ファイル4-2が生成される。上記した例では、関数func1(int in1)に対しては最適化してコンパイルが行われる一方、関数func2(long in2)に対しては最適化することなくコンパイルが行われることになる。
このように実施例2によれば、各関数の引数の値を自動で生成し、関数毎に最適化によって動作結果が変わってしまうか否かを判定することができ、動作結果が変わってしまう関数に対してはコンパイルにおける最適化を無効にするので、プログラムの作成者が何度も再コンパイルしながら動作を確認するという手間が省け、これにより開発効率の向上が期待できる。
なお、上記した実施例1及び2では、互いに異なる態様のコンパイルの例としてコンパイルにおける最適化なしと最適化ありを説明しているが、最適化の種類を変えても良い。
また、上記した実施例1及び2では、例として最適化なしと最適化ありとを1対1の関係で比較をしているが、最適化なしに対してコードサイズ最適化及び速度最適化のような複数の種類の最適化との比較のように1対複数の関係で同時に比較しても良い。
上記した実施例1及び2では、結果比較装置でログファイルの戻り値を比較しているが、実行ファイルを比較の対象として扱っても良い。例えば、第1及び第2の実行ファイルの実行速度やサイズを比較しても良い。
上記した実施例1及び2では、ソースコードにモニタ用のグローバル変数を追加し、プログラム実行後のモニタ用のグローバル変数の値を比較対象に用いるが、関数の入力値に対する期待動作が分かるのであれば、モニタ用のグローバル変数を追加せず、その期待動作を比較対象に用いることもできる。例えば、関数内でグローバル変数に値を格納するような動作がある場合にはそのグローバル変数の値を比較対象にしても良い。
同様に、実施例2では、ユースケース自動生成装置31がコンパイラ32の前段で処理をしているが、ユースケース自動生成装置31の機能をコンパイラ32に組み込んでも良い。