(57)【要約】【課題】リアルタイム応答性が比較的高く要求される製品にも搭載可能なプログラムを適切に生成する。【解決手段】プログラムコードの定数を数値に変換するプログラムの定数変換装置１において、プリプロセッサ３は、プログラムコードの中から特定のキーワードを検出するキーワード検出部３ａと、特定のキーワードが検出されると、外部プロシージャ７を起動し、その特定のキーワードに対応する入力値を演算する外部プロシージャ起動部３ｂと、入力値が演算されると、その演算結果である出力値を入力値と置換する演算結果置換部３ｃと、を備える。【選択図】図１
2018128959.tif 000002
【特許請求の範囲】
【請求項１】
プログラムコードの定数を数値に変換するプログラムの定数変換装置（１）において、
プリプロセッサ（３）は、
プログラムコードの中から特定のキーワードを検出するキーワード検出部（３ａ）と、
特定のキーワードが検出されると、外部プロシージャ（７）を起動し、その特定のキーワードに対応する入力値を演算する外部プロシージャ起動部（３ｂ）と、
入力値が演算されると、その演算結果である出力値を入力値と置換する演算結果置換部（３ｃ）と、を備えたプログラムの定数変換装置。
【請求項２】
前記外部プロシージャ起動部は、外部プロシージャの命令シミュレータと、コンパイラ付属の関数ライブラリ（８）とを用い、入力値を演算する請求項１に記載のプログラムの定数変換装置。
【請求項３】
前記プリプロセッサにおいて、前記キーワード検出部と、前記外部プロシージャ起動部と、前記演算結果置換部とを、マクロ展開部（３ｄ）や定数展開部（３ｅ）よりも先に実行する請求項１又は２に記載のプログラムの定数変換装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの定数変換装置に関する。
【背景技術】
【０００２】
Ｃ言語のプログラムを生成する手順では、Ｃ言語で記述された高等言語からアセンブラコードをコンパイラにより生成し、その生成したアセンブラコードをアセンブラにより機械語の表現によるオブジェクトコードに変換し、その変換したオブジェクトコードをリンカにより結合して実行形式ファイルを生成する。コンパイラの前処理であるプリプロセッサでは、プログラムコードにおける定数から数値への変換を四則演算では行えるが、例えばsqrt（平方根）のように一般的にライブラリとして提供されている数学関数を用いる演算では行えない。プログラムコードにおいて例えば「const float a = sqrt(4.0F);」と記述すると、プリプロセッサでは演算を行えずにエラーとなる。
【０００３】
このような事情から、従来では、main()の変数を算出する式の中にsqrt()を呼び出す関数を記述している。しかしながら、このような従来の方法でプログラムコードを記述したプログラムは、sqrt()を呼び出す処理を実行することに伴い、実行時間が長くなる。そのため、例えば自動車のエンジン制御を行う電子制御装置のようにリアルタイム応答性が比較的高く要求される製品には搭載し難い。
【０００４】
一方、例えば特許文献１には、プログラムコードに埋め込まれたインラインアセンブラがあると最適化やコードの正しさに問題が生じる事情を考慮し、ある特定の制約文字を検出すると、Ｃ言語で生成した中間言語とアセンブラブロックとの間で最適化を行う技術が開示されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特許第３６３００８６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
特許文献１の技術では、ある特定の制約文字を構文解析部で検出し、コンパイラで最適化を行う技術であり、数学関数を用いる演算をプリプロセッサが行えないという問題を解決するには至らない。よって、特許文献１の技術を採用してプログラムコードを記述したとしても、リアルタイム応答性が比較的高く要求される製品に搭載し難いという問題は依然として残る。
【０００７】
本発明は、上記した事情に鑑みてなされたものであり、その目的は、リアルタイム応答性が比較的高く要求される製品に搭載可能なプログラムを適切に生成することができるプログラムの定数変換装置を提供することにある。
【課題を解決するための手段】
【０００８】
請求項１に記載した発明によれば、プリプロセッサ（３）において、キーワード検出部（３ａ）は、プログラムコードの中から特定のキーワードを検出する。外部プロシージャ起動部（３ｂ）は、特定のキーワードが検出されると、外部プロシージャ（７）を起動し、その特定のキーワードに対応する入力値を演算する。演算結果置換部（３ｃ）は、入力値が演算されると、その演算結果である出力値を入力値と置換する。
【０００９】
プログラムコードにおいて数学関数を用いる演算を、特定のキーワードを付与して記述することで、その数学関数を用いる演算をプリプロセッサで行うことができる。生成されるプログラムにおいて数学関数を呼び出す処理を実行する必要がなくなり、生成されるプログラムの実行時間を短縮することができる。これにより、リアルタイム応答性が比較的高く要求される製品に搭載可能なプログラムを適切に生成することができる。
【図面の簡単な説明】
【００１０】
【図１】本発明の一実施形態を示し、Ｃ言語のプログラムを生成する手順を示す図
【図２】外部プロシージャ及び数学関数ライブラリを示す図
【図３】処理の流れを示す図（その１）
【図４】処理の流れを示す図（その２）
【図５】処理の流れを示す図（その３）
【発明を実施するための形態】
【００１１】
以下、本発明の一実施形態について図面を参照して説明する。
プログラムの生成装置１は、字句解析２、プリプロセッサ３、コンパイラ４、アセンブラ５、リンカ６の手順にしたがってプログラムを生成する。字句解析２からリンカ６までの手順はコンパイラパッケージ全体の手順を意味する。字句解析２では、プログラムコードの文字を読み込んでトークン文字列を生成する。プリプロセッサ３では、マクロ展開、定数展開、includeファイルの読み込みを行う。
【００１２】
コンパイラ４は、構文解析部４ａ、意味解析部４ｂ、中間表現の生成部４ｃ、最適化部４ｄ、コード生成部４ｅを含む。構文解析部４ａでは、トークン文字列から抽象構文ツリーを生成する。意味解析部４ｂでは、プログラムの意味が正しいか否かをチェックしてシンボルツリーを生成する。中間表現の生成部４ｃでは、構文ツリーとシンボルツリーとを用いて中間表現を生成する。最適化部４ｄでは、中間表現から不要命令の削除やレジスタの割付等を実行する。コード生成部４ｅでは、アセンブラコードを生成する。アセンブラ５では、アセンブラコードを機械語の表現によるオブジェクトコードに変換する。リンカ６では、オブジェクトコードを結合して実行形式ファイルを生成する。上記した手順では、字句解析２からリンカ６までを広義のコンパイラと称し、コンパイラ４のみを狭義のコンパイラと称することもある。
【００１３】
［背景技術］で記載したように、従来のプリプロセッサでは、プログラムコードにおける定数から数値への変換を四則演算では行えるが、数学関数を用いる演算では行えない。このような事情を考慮し、本実施形態のプリプロセッサ３は、従来のマクロ展開部３ｄ、定数展開部３ｅ、includeファイルの読み込み部３ｆの前処理として、キーワード検出部３ａ、外部プロシージャ起動部３ｂ、演算結果置換部３ｃを含む。キーワード検出部３ａは、プログラムコードの中から特定のキーワードを検出する。
【００１４】
外部プロシージャ起動部３ｂは、特定のキーワードがキーワード検出部３ａにより検出されると、図２に示すように、外部プロシージャ７を起動する。外部プロシージャ７は、入力、出力、命令シミュレータの３要素を含む。外部プロシージャ起動部３ｂは、外部プロシージャ７の命令シミュレータと、コンパイラ付属の関数ライブラリ８とを用い、命令シミュレータが数学関数ライブラリ８ａを参照することで、その特定のキーワードに対応する入力値を演算する。数学関数ライブラリ８ａは、例えばsin、cos、tan等の三角関数や、sqrt（平方根）、pow（べき乗）、exp（指数）、log（対数）等の関数を含む。演算結果置換部３ｃは、入力値が外部プロシージャ起動部３ｂにより演算されると、その演算結果である出力値を入力値と置換する。マクロ展開部３ｄ、定数展開部３ｅ、includeファイルの読み込み部３ｆは、従来と同様である。即ち、プリプロセッサ３は、キーワード検出部３ａ、外部プロシージャ起動部３ｂ、演算結果置換部３ｃを、マクロ展開部３ｄ、定数展開部３ｅ、includeファイルの読み込み部３ｆよりも先に実行することで、従来のマクロ展開、定数展開、includeファイルの読み込みを実行する前に、キーワードの検出、外部プロシージャ７の起動、演算結果の置換を実行する。
【００１５】
次に、上記した構成の作用について、図３から図５を参照して説明する。図３及び図４は本実施形態のプリプロセッサ３を用いた処理を示し、図５は従来のプリプロセッサを用いた処理を示す。
【００１６】
プログラムコードにおいて、float型の変数fa、fbは初期値付きの浮動小数点型の変数である。変数faの右辺の値は浮動小数点型の4.0Fであるので、ＩＥＥＥ７５４規格での浮動小数点１６進数表記は0x4080000となり、メモリダンプ上での変数faのアドレス0x00001000に、0x40800000がロードされるようなコードをコンパイラ４及びリンカ６が生成する。
【００１７】
一方、変数fbの右辺の値はsqrt(平方根）関数で表記されている。sqrt(4.0F)の演算結果では2.0となるが、従来のプリプロセッサでは四則演算以外の演算を行えずにエラーとなる。エラーを回避するためには、コンパイラ付属の数学関数ライブラリを呼び出す命令をプログラムコード中に記述し、数学関数ライブラリを毎回呼び出して演算結果を取得するか、又は電卓等でsqrt(4.0F)を予め演算しておき、fb=(float)(2.0F)といった形で数値化するという方法に変更せざるを得ない。
【００１８】
これに対し、本実施形態では、変数fbの右辺のsqrt(4.0F)を“__ppcal()”というキーワードで括って記述している。“__ppcal()”のキーワードがキーワード検出部３ａにより検出されると、外部プロシージャ起動部３ｂは、外部プロシージャ７を起動する。外部プロシージャ７は、起動すると、__ppcalの中身である“sqrt(4.0F)”を入力値として入力し、その入力した“sqrt(4.0F)”を命令シミュレータによりシミュレーションするが、その際にコンパイラ付属の数学関数ライブラリのsqrt関数を用いる。外部プロシージャ７は、sqrt関数を用いて“sqrt(4.0F)”をシミュレートして得られた演算結果である“2.0”を出力値として演算結果置換部８ｃに出力する。演算結果置換部８ｃは、変数fbの右辺のコードを“__ppcal(sqrt(4.0F))”から“(2.0)”に置換する。
【００１９】
従来のプリプロセッサ、即ちキーワード検出部３ａ、外部プロシージャ起動部３ｂ、演算結果置換部３ｃを有しないプリプロセッサを用いた処理では、図５に示すように、２行目にsqrt関数を参照するためのヘッダファイルのインクルードを記述し、プリプロセッサでsqrt()を扱えないので、main()の２行目の変数fcを算出する式の中でsqrt()を呼び出す。本実施形態のプリプロセッサ３を用いて生成したプログラムを実行する場合と従来のプリプロセッサを用いて生成したプログラムを実行する場合とを比較すると、実行結果は一致するが、プログラムの実行時間は相違する。
【００２０】
従来のプリプロセッサを用いた場合のコンパイル後のアセンブラコードでは、sqrt()を呼び出すコードが生成されるので、３行目に“jarl__sqrt, r30”という命令が生成される。尚、アセンブラコードに用いた命令は、ルネサスエレクトロニクス社製マイコンのV850-CPUアセンブラコードを使用している。この命令は“__sqrt”というシンボルの番地にジャンプするという命令であり、カンマの後の“r30”は本命令の次の番地、即ち戻り番地をr30に記録するという意味になる。コンパイラの種類やＣＰＵのアセンブラ命令の種類により若干の差はあるが、一般的なコンパイラの場合ではsqrt()関数を実行するのに約８０命令が必要となる。ＲＩＳＣマイコンの理想は１命令に対して１サイクルであるが、メモリレイテンシやＣＰＵのパイプラインハザード等により理想通りにはならず、実際には１．５〜２倍程度のサイクルを要する。ここでは厳しく見積もって仮に８０命令に対して８０〜１００サイクルとしている。仮に動作周波数が１００［ＭＨｚ］のマイコンを使用していた場合、１命令サイクルに要する時間は、
１／１００［ＭＨｚ］＝１０［ｎｓ］
となる。sqrt()の実行に要する時間は、総命令サイクル数に１命令あたりの時間を掛け算したものになるので、
８０〜１００×１０［ｎｓ］＝８００〜１０００［ｎｓ］
となる。
【００２１】
これに対し、本実施形態のプリプロセッサ３を用いた場合のコンパイル後のアセンブラコードでは、３行目に“ld.w lo(__fb), r7”という命令が生成される。この命令は、メモリ上にある変数fbをr7へロードするという命令であり、メモリレイテンシにより異なるが仮に１〜２サイクルのレイテンシを要するとすると１０〜２０［ｎｓ］で済む。即ち、本実施形態のプリプロセッサ３を用いることで、コンパイルの前にプリプロセッサ３でsqrt(4.0F)の結果を算出して代入することができ、その結果が代入されている変数fbを参照するのに1〜2命令で実行完了とすることができる。このように本実施形態のプリプロセッサ３を用いることで、従来のプリプロセッサを用いた場合の８００〜１０００［ｎｓ］から１０〜２０［ｎｓ］へとプログラムの実行時間を大幅に短縮することができる。
【００２２】
以上に説明したように本実施形態によれば、次に示す効果を得ることができる。
プリプロセッサ３において、プログラムコードの中から特定のキーワードを検出すると、外部プロシージャ７を起動し、その特定のキーワードに対応する入力値を演算し、その演算結果である出力値を入力値と置換するようにした。プログラムコードにおいて数学関数を用いる演算を、特定のキーワードを付与して記述することで、その数学関数を用いる演算をプリプロセッサ３で行うことができる。生成されるプログラムにおいて数学関数を呼び出す処理を実行する必要がなくなり、生成されるプログラムの実行時間を短縮することができる。これにより、リアルタイム応答性が比較的高く要求される製品に搭載可能なプログラムを適切に生成することができる。又、特定のキーワードを付与すれば良く、数学関数の記述をそのまま残せるので、可読性を損なうこともない。
【００２３】
又、プリプロセッサ３において、キーワード検出部３ａ、外部プロシージャ起動部３ｂ、演算結果置換部３ｃを、マクロ展開部３ｄ、定数展開部３ｅよりも先に実行することで、演算結果の置換をマクロ展開や定数展開に応用することもできる。
【００２４】
本開示は、実施例に準拠して記述されたが、当該実施例や構造に限定されるものではないと理解される。本開示は、様々な変形例や均等範囲内の変形をも包含する。加えて、様々な組み合わせや形態、更には、それらに一要素のみ、それ以上、或いはそれ以下を含む他の組み合わせや形態をも、本開示の範疇や思想範囲に入るものである。
“__ppcal()”以外のキーワードを記述しても良い。
sqrt（平方根）を用いる場合を例示したが、sin、cos、tan、pow（べき乗）、exp（指数）、log（対数）を用いる場合も同様である。
【符号の説明】
【００２５】
図面中、１はプログラムの定数変換装置、３はプリプロセッサ、３ａはキーワード検出部、３ｂは外部プロシージャ起動部、３ｃは演算結果置換部、７は外部プロシージャ、８は関数ライブラリである。
【図１】
2018128959.tif 000003
【図２】
2018128959.tif 000004
【図３】
2018128959.tif 000005
【図４】
2018128959.tif 000006
【図５】
2018128959.tif 000007