(57)【要約】【課題】  固定小数点のデータ型変数の演算操作を、標準データ型変数と同様に演算表記でき、固定小数点のデータ型をユーザ定義ができ、再定義された固定小数点のデータ型に基づいて機械語に変換することができるコンパイラ装置及びコンパイル方法を提供する。【解決手段】  コンパイラ装置１００は、記憶装置２及びＣＰＵ３等から構成され、記憶装置２は、コンパイルプログラム部２４、型情報記憶部２６及び変数記憶部２７等を備え、ＣＰＵ３は、コンパイラ処理に使用する字句解析手段１１、構文解析手段１２、コード生成手段１５、コード最適化手段１６及びコード出力手段１７を備え、構文解析手段１２は、コンパイラ指示子等を構文解析してデータサイズ、整数部のビット数、小数部のビット数等のデータを得るデータ型情報処理手段１２ａ及び変数の型番号等を得る変数情報処理手段１２ｂを備える。【選択図】    図１
2005141410.tif 000002
【特許請求の範囲】
【請求項１】
ソースプログラム中に記載された固定小数点のデータ型の定義文を解析して、解析の結果定義された前記固定小数点のデータ型の型番号、データ種類、符号、データサイズ、整数部のビット数、小数部のビット数を含むデータ型情報を取得するデータ型情報処理手段と、
前記データ型情報を格納する型情報記憶部と、
前記固定小数点のデータ型の変数宣言文を解析して、解析の結果得られた変数名と前記型番号を含む変数情報を得る変数情報処理手段と、
前記変数情報を格納する変数記憶部と、
前記ソースプログラム中に記載された前記変数を含む演算式データを読み込むと、前記変数記憶部から前記変数に対応する前記型番号を取得し、前記型番号に対応する前記データ型情報を前記型情報記憶部から取得し、取得した前記データ型情報を伴う前記演算式データを予めプロセッサに組み込まれた関数呼び出し命令若しくは固定小数点演算命令の機械語へ変換するコード生成手段
とを備えることを特徴とするコンパイラ装置。
【請求項２】
前記固定小数点のデータ型の定義文は、前記ソースプログラム中に記載されるコンパイラ指示子、コンパイルオプション及び変数宣言のいずれか１箇所以上によって行われることを特徴とする請求項１に記載のコンパイラ装置。
【請求項３】
前記コード生成手段は、前記固定小数点データ型の演算式を機械語に変換する前に、前記演算式に含まれる第１の固定小数点データと第２の固定小数点データの両者のオペランドの型を比較し、整数部は前記第１の固定小数点データのビット数が多く小数部は前記第２の固定小数点データのビット数が多い場合若しくは整数部は前記第２の固定小数点データのビット数が多く小数部は前記第１の固定小数点データのビット数が多い場合に、いずれかビット数が多い方の前記整数部及び前記小数部の精度に合わせた新たな固定小数点データのオペランド型を生成し、前記両者のオペランド型を前記新たな固定小数点データのオペランド型に変換することを特徴とする請求項１又は２に記載のコンパイラ装置。
【請求項４】
前記固定小数点のデータ型の定義文の情報は、コンパイルされたオブジェクトコードにデバッグの際に使用可能な情報として付加されることを特徴とする請求項１から請求項３のいずれか１項に記載のコンパイラ装置。
【請求項５】
ソースプログラム中に記載された固定小数点のデータ型の定義文を解析して、解析の結果定義された前記固定小数点のデータ型の型番号、データ種類、符号、データサイズ、整数部のビット数、小数部のビット数を含むデータ型情報を取得して前記データ型情報を型情報記憶部に格納し、
前記固定小数点のデータ型の変数宣言文を解析して、解析の結果得られた変数名と前記型番号を含む変数情報を取得して前記変数情報を変数記憶部に格納し、
前記ソースプログラム中に記載された前記変数を含む演算式データを読み込むと、前記変数記憶部から前記変数に対応する前記型番号を取得し、前記型番号に対応する前記データ型情報を前記型情報記憶部から取得し、取得した前記データ型情報を伴う前記演算式データを予めプロセッサに組み込まれた関数呼び出し命令若しくは固定小数点演算命令の機械語へ変換する
ことを特徴とするコンパイル方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、Ｃ言語などの高級言語を機械語に変換するコンパイル技術に係り、特に、固定小数点のデータ型をコンパイラ装置の起動時または動作中に任意に定義可能とするコンパイラ装置及びコンパイル方法に関する。
【背景技術】
【０００２】
音声や映像を含むマルチメディアのデータを処理する場合、浮動小数点のデータ型ではなく固定小数点のデータ型で処理すれば、高速で十分な精度の結果データが得られることは知られている。
【０００３】
従来のコンパイラ装置の多くは、固定小数点のデータ型を直接扱うことができない。このため、固定小数点データ型のデータを扱う場合には、ソースプログラムの入出力部において固定小数点データ型のデータと整数データ型のデータとを変換し、内部のプログラムでは整数データ型のデータとして処理する手法や、ユーザが固定小数点のデータを、例えば整数データ型のデータを用いて処理する関数を用意して処理する手法をとる。
【０００４】
コンパイラ装置としては、固定小数点データの演算回路や演算を支援する回路を有するプロセッサ用の固定小数点データ型が扱えるものも知られている（例えば、非特許文献１参照。）。
【０００５】
また、Ｃ＋＋言語のクラスを用いてハードウェアも記述できるシステム設計言語のＳｙｓｔｅｍＣ用のコンパイラ装置を用いると、Ｃ＋＋のクラスとして固定小数点データ型のデータを処理でき、更にデータ型を変更することもできる。
【非特許文献１】ユーザーズ・マニュアル「CC77016  μPD77016  ファミリ用Ｃコンパイラ装置」、ＮＥＣ  Ｅｌｅｃｔｒｉｃ  Ｃｏｒｐ、２００３年１月発行、第４８頁−５１頁
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、固定小数点を扱えるコンパイラが存在しても、それはプロセッサの扱う固定小数点の仕様に沿ったものであった。又、固定小数点をデフォルトで扱わないプロセッサ、つまり専用命令を使わずに固定小数点演算を行うプロセッサや、固定小数点演算の専用命令を保持するユーザ定義モジュールを追加可能なプロセッサ用のコンパイラにとっては、ユーザの要求に従って、固定小数点のデータ型を変えることには支障があった。
【０００７】
具体的には、内部のプログラムでは整数のデータ型のデータとして処理する手法や、ユーザが固定小数点のデータを関数を用意して処理する手法をとる場合、プログラム開発時間が増加する問題や、ソースプログラムの演算記述が固定小数点のデータを扱う部分だけが異なることにより保守性が悪くなる問題、又、再利用が困難となる問題等があった（第１の問題点）。
【０００８】
固定小数点のデータの演算回路や演算を支援する回路を有するプロセッサ用の固定小数点のデータ型が扱えるコンパイラ装置においては、固定小数点のデータ型が固定であるため、データ処理において必要以上の精度の演算となり、実行性能が低下したりする問題、コンパイラ装置の生成するオブジェクトのコードサイズが増大する問題等があった（第２の問題点）。
【０００９】
Ｃ＋＋コンパイラ装置は、クラスのオブジェクトの演算に対して関数呼び出しの形のオブジェクトコードを生成するため、ＳｙｓｔｅｍＣのプログラム内の固定小数点演算も同様に関数呼び出しのオブジェクトコードとなる。このため、プロセッサが固定小数点演算を行う命令を有していても、その命令を用いて最適化することができない問題等があった（第３の問題点）。
【００１０】
本発明は、上記問題点を解決する為になされたものであり、固定小数点のデータ型の変数を含む演算操作を、他の標準データ型の変数と同様に演算表記でき、ユーザによって固定小数点のデータ型を定義ができ、コンパイラがソースプログラムの高級言語記述を機械語に変換する時に、高級言語の固定小数点変数を含む演算記述を再定義された固定小数点のデータ型に基づいて機械語に変換することができるコンパイラ装置及びコンパイル方法を提供することを目的とする。
【課題を解決するための手段】
【００１１】
上記問題点を解決する為、本発明の第１の特徴は、（イ）ソースプログラム中に記載された固定小数点のデータ型の定義文を解析して、解析の結果定義された固定小数点のデータ型の型番号、データ種類、符号、データサイズ、整数部のビット数、小数部のビット数を含むデータ型情報を取得するデータ型情報処理手段と、（ロ）データ型情報を格納する型情報記憶部と、（ハ）固定小数点のデータ型の変数宣言文を解析して、解析の結果得られた変数名と型番号を含む変数情報を得る変数情報処理手段と、（ニ）変数情報を格納する変数記憶部と、（ホ）ソースプログラム中に記載された変数を含む演算式データを読み込むと、変数記憶部から変数に対応する型番号を取得し、型番号に対応するデータ型情報を型情報記憶部から取得し、取得したデータ型情報を伴う演算式データを予めプロセッサに組み込まれた関数呼び出し命令若しくは固定小数点演算命令の機械語へ変換するコード生成手段とを備えるコンパイラ装置であることを要旨とする。
【００１２】
本発明の第２の特徴は、（イ）ソースプログラム中に記載された固定小数点のデータ型の定義文を解析して、解析の結果定義された固定小数点のデータ型の型番号、データ種類、符号、データサイズ、整数部のビット数、小数部のビット数を含むデータ型情報を取得してデータ型情報を型情報記憶部に格納し、（ロ）固定小数点のデータ型の変数宣言文を解析して、解析の結果得られた変数名と型番号を含む変数情報を取得して変数情報を変数記憶部に格納し、（ハ）ソースプログラム中に記載された変数を含む演算式データを読み込むと、変数記憶部から変数に対応する型番号を取得し、型番号に対応するデータ型情報を型情報記憶部から取得し、取得したデータ型情報を伴う演算式データを予めプロセッサに組み込まれた関数呼び出し命令若しくは固定小数点演算命令の機械語へ変換するコンパイル方法であることを要旨とする。
【発明を実施するための最良の形態】
【００１３】
次に、図面を参照して、本発明の実施の形態を説明する。以下の図面の記載において、同一又は類似の部分には同一又は類似の符号を付している。ただし、図面は模式的なものであることに留意すべきである。
【００１４】
（コンパイラ装置）
本発明の実施の形態に係るコンパイラ装置１００は、図２に示すように、記憶装置２及びＣＰＵ（セントラルプロセッシングユニット）３と、両者を接続するシステムバス４等から構成される。
【００１５】
記憶装置２は、作業領域２１、ソースプログラム格納部２２、コンパイラ部２３及びオブジェクトコード格納部２５等を備え、コンパイラ部２３は、コンパイルプログラム部２４、型情報記憶部２６及び変数記憶部２７等より構成される。
【００１６】
作業領域２１は、演算処理実行中に使用する作業用の領域である。ソースプログラム格納部２２は、Ｃ言語等の高水準言語プログラムで記述されたソースプログラムを格納する。コンパイルプログラム部２４は、コンパイラ処理に使用するコンパイルプログラムを格納する。オブジェクトコード格納部２５は、コンパイルされたオブジェクトコードを格納する。型情報記憶部２６は、図７に示すような、型番号、データ種類、符号、サイズ、整数部、小数部等のデータ型に関する情報を格納する。変数記憶部２７は、図８に示すような、変数名、型番号等の情報を格納する。各変数には型番号のインデックスを付し、図７の型情報記憶部２６と情報をリンクさせてある。
【００１７】
ＣＰＵ３は、演算実行部３１、レジスタ３２、命令デコーダ部３３、制御部３４及び条件コードレジスタ部３５等より構成される。条件コードレジスタ部３５とは、算術演算、論理演算、比較演算等を行う際に、その演算結果によって設定する条件コードを保持するレジスタであり、フラグレジスタ等を指す。条件コードとは、演算や比較等の命令を実行したとき、その結果（２数の大小関係等）を表すコードである。演算命令では演算結果により正、ゼロ、負を示すコードをセットし、比較命令ではオペランドの大小を示すコードをセットする。
【００１８】
ＣＰＵ３は、コンパイルプログラム部２４内のコンパイラ処理に使用するコンパイルプログラム、具体的には、図１の字句解析手段１１、構文解析手段１２、コード生成手段１５、コード最適化手段１６及びコード出力手段１７等を適宜ロードし、演算実行することにより、コンパイル処理を実行する。
【００１９】
字句解析手段１１は、ソースプログラムの字句解析を行うモジュールである。構文解析手段１２は、字句解析結果が文法的に正しいかどうかを解析するモジュールであり、又、コンパイラ指示子等を構文解析して、データサイズ、整数部のビット数、小数部のビット数などのデータを得る。構文解析手段１２は、データ型情報処理手段１２ａ及び変数情報処理手段１２ｂを備える。データ型情報処理手段１２ａは、ソースプログラム中に記載された固定小数点のデータ型の宣言文を解析して、定義された固定小数点のデータ型の型番号、変数のサイズ、整数部のビット数、小数部のビット数等の情報を型情報記憶部２６に格納するモジュールである。変数情報処理手段１２ｂは、例えば、図６のソースプログラム３行目に記載された固定小数点のデータ型の変数宣言文を解析して、変数名と型番号などの情報を図８の変数記憶部２７に格納するモジュールである。
【００２０】
コード生成手段１５は、変数記憶部２７から得られる変数の型番号から、変数のサイズ、整数部のビット数、小数部のビット数などのデータ型情報を型情報記憶部２６から得て、演算データを、コンパイラに組み込まれたライブラリ関数呼び出し命令またはプロセッサが有する固定小数点演算命令の機械語へ変換するモジュールである。
【００２１】
コード最適化手段１６は、高速実行可能なように、生成するコードを変更するモジュールである。コード出力手段１７は、最適化されたコードをオブジェクトコードとして出力するモジュールである。
【００２２】
（コンパイル方法）
本発明の実施の形態に係るコンパイラ装置は、図１の処理の矢印に沿った手順でソースプログラムを機械語のオブジェクトコード（オブジェクトプログラム）に変換する。
【００２３】
図１の手順においては、仮想的に設計された単純なＣＰＵの機械語（中間コード）に変換することなく最適化を行い、機械語のオブジェクトコードに変換しているが、図１０に示すように、最適化効率向上のために、一度中間コードに変換してからオブジェクトコードを作成しても良い。
【００２４】
以下に図６のソースプログラムを図１の手順に従ってコンパイルする際の具体的動作例を示す。
【００２５】
（ａ）字句解析手段１１は、固定小数点のデータ型を宣言された図６のソースプログラムをコンパイラする時、図６の１行目に示されるコンパイラ指示子
#pragma fx_format short:1,10 long:2,20
を読み込み、宣言された固定小数点のデータ型を取得する。
【００２６】
（ｂ）構文解析手段１２のデータ型情報処理手段１２ａは、字句解析手段１１より字句解析結果を得ると、図３に示すように、ステップＳ１０１として、#pragma指令であるか否かを判断する。#pragma指令で有る場合、ステップＳ１０２へ進む。#pragma指令ではない場合、ステップＳ１０９へ進み通常の構文解析を行う。
【００２７】
ステップＳ１０２においては、最初のトークンがfx_format、つまりフォーマットが固定であるか否かの判断をする。トークンがfx_formatで有る場合、ステップＳ１０３へ進み、トークンがfx_formatでない場合、他の#pragma指令としての処理を行う。
【００２８】
ステップＳ１０３においては、コンパイラ指示子よりデータサイズ、整数部のビット数、小数部のビット数を得る。ステップＳ１０４においては、データサイズがlongサイズか否かを判断する。longサイズであった場合ステップＳ１０５へ進み、shortサイズであった場合ステップＳ１０７へ進む。
【００２９】
ステップＳ１０５においては、ｌｏｎｇサイズのビット数と既登録のｓｈｏｒｔサイズのビット数を比較してｌｏｎｇサイズで定義されたビット数がｓｈｏｒｔサイズで定義されたビット数より大きいかの検査を行う。検査エラーが無ければ、ステップＳ１０６へ進む。
【００３０】
ステップＳ１０７においては、既登録のｌｏｎｇサイズのビット数とｓｈｏｒｔサイズのビット数を比較してｓｈｏｒｔサイズで定義されたビット数がｌｏｎｇサイズで定義されたビット数より小さいかの検査を行う。検査エラーが無ければ、ステップＳ１０６へ進む。検査エラーが出た場合ステップＳ１０８へ進み、エラーメッセージを出力する。
【００３１】
ステップＳ１０６において、図７の型情報記憶部２６に読み込まれたコンパイル指示子のデータサイズ、整数部のビット数、小数部のビット数を登録する。変数の符号の有無は、符号の有無に対応して２通りの型番号が異なるデータ型情報を登録する。
【００３２】
（ｃ）次に、構文解析手段１２の変数情報処理手段１２ｂの動作について図４を用いて説明する。ステップＳ２０１において、図６に示すソースプログラムの２行目の関数定義の開始を読み込むと、３行目に示す固定小数点のデータ型の変数宣言、
short _Accum x,y,z;
を読み込む。
【００３３】
ステップＳ２０２において、変数情報処理手段１２ｂは、読み込んだ変数が固定小数点であるか否かを判断する。固定小数点で有る場合、ステップＳ２０３へ進む。固定小数点でない場合、ステップＳ２０６へ進み、他の構文解析であるとして処理を転送する。
【００３４】
ステップＳ２０３では、データサイズが既に図３のステップＳ１０１〜Ｓ１１０の手順で図７の型情報記憶部２６に登録されたものであるかを調べる。データサイズが型情報記憶部２６に登録されていれば、ステップＳ２０４へ進む。データサイズが型情報記憶部２６に登録されていなければ、ステップＳ２０７へ進み、エラーメッセージを出力する。
【００３５】
ステップＳ２０４においては、型情報記憶部２６より型番号を得る。更に、ステップＳ２０５において、変数名と型番号を、図８の変数記憶部２７に登録する。
【００３６】
（ｄ）コード生成手段１５は、中間コード最適化結果または構文解析結果の「文」を受け取り、固定小数点のデータ型の変数を含む演算であるか否かを判断する。固定小数点のデータ型の変数を含む演算の場合は、演算式に用いる変数の型番号から、演算が固定小数点の変数を用いる演算であること、論理演算のような固定小数点の変数が適用できない演算でないこと等を確認し、変数記憶部２７から得られる変数の型番号をインデックスとして、変数のサイズ、整数部のビット数、小数部のビット数等のデータ型情報を型情報記憶部２６から得る。以下、図５を参照して詳細に説明する。
【００３７】
ステップＳ３０１にて、コード生成手段１５は、中間コード最適化結果または構文解析結果の文が、固定小数点のデータ型の変数を含む演算であるか否かを判断する。これは例えば、図６のｎ行目に示すように、
ｘ＝ｙ＋ｚ  
という演算式記述がある場合、ｘ，ｙ，ｚのいずれかが固定小数点のデータ型であるか否かについて判断する。固定小数点のデータ型の変数を含む演算の場合は、ステップＳ３０２へ進み、コード生成手段１５は、ステップＳ３０２にて、変数記憶部２７から変数の型番号を得る。固定小数点のデータ型の変数を含む演算でない場合は、ステップＳ３１０へ進み、他のコード生成処理に転送する。
【００３８】
ステップＳ３０３においては、全ての変数の型番号が得られたかの判断を行う。全ての変数の型番号が得られた場合、ステップＳ３０４へ進む。全ての変数の型番号が得られていない場合、ステップＳ３１１へ進みエラーメッセージを出力する。
【００３９】
ステップＳ３０４においては、固定小数点の型番号の変数が有るか判断する。固定小数点の型番号の変数が有る場合、ステップＳ３０４へ進み、固定小数点の型番号の変数がない場合ステップＳ３１２へ進み、他の演算コードとして生成処理を行う。
【００４０】
ステップＳ３０５においては、この演算が固定小数点変数を処理可能か否かを判断する。固定小数点変数を処理可能である場合、ステップＳ３０６へ進み、
固定小数点変数の処理不可能である場合、ステップＳ３１３へ進みエラーメッセージを出力する。
【００４１】
ステップＳ３０６においては、ステップＳ３０２において得た変数の型番号を基に、型情報記憶部２６よりデータの整数部と小数部のビット数を含む型情報を得る。
【００４２】
ステップＳ３０７においては、コンパイラに組み込まれたライブラリ関数呼び出し命令またはプロセッサが有する固定小数点演算命令の機械語へ変換する際に、固定小数点変数の演算を行う機械命令が有るかを判断する。固定小数点変数の演算を行う機械命令がない場合、ステップＳ３０８へ進み、引数渡しの機械命令、関数呼出の機械命令、関数戻り値を受け取る機械命令から成るコードを生成する。例えば図９に示すようなコンパイラに予め組み込まれている固定小数点演算ライブラリ（関数）を呼び出す手順のオブジェクトコードを生成する。
【００４３】
オブジェクトコードについて説明すると、最初の４つのmov命令が引数渡しの為の機械命令であり、Ｒ１０とＲ１１に固定小数点演算を構成するオペランドの値を格納する。また“１”は整数部、“１０”は小数部のビット数である。次のjal命令によってライブラリ関数を呼び出し、最後のmov命令によって関数の戻り値を受ける。この手順によりオブジェクトコードが生成される。
【００４４】
固定小数点変数の演算を行う機械命令が有る場合、ステップＳ３０９へ進み、データのビット数をオペランドとして設定し、固定小数点演算命令のコードを生成する。コンパイル対象となるプロセッサが固定小数点のデータ型のデータの演算を行う機械命令を持っている場合は、その機械命令のフォーマットに従ってコードを生成する。例えば、
ｆａｄｄ  Ｒ０，Ｒ１，Ｎ１，Ｎ２
（Ｎ１は、整数部のビット数、Ｎ２は、小数部のビット数）のように固定小数点のデータを構成するビット数を命令のオペランドに記述する機械命令の場合は、整数部が１ビットで小数部が１０ビットであれば、
ｆａｄｄ  Ｒ０，Ｒ１，１，１０
と表記する機械命令のオブジェクトコードを生成する。
【００４５】
（ｅ）この後、コード最適化手段１６は、生成されたコードを受け取り、最適な配列に並び替える。コード出力手段１７は、最適化されたコードをオブジェクトコードとして出力する。オブジェクトコードはオブジェクトコード格納部２５に格納される。
【００４６】
尚、生成されたオブジェクトコードのファイルには、ユーザが定義した固定小数点のデータ型情報を次のようにオブジェクトコードの擬似命令として付加する。
【００４７】
．ｄｅｂｕｇ  ｆｘ，ｓ，１，１０
．ｄｅｂｕｇ  ｆｘ，ｌ，２，２０
（ｓは“short”を指し、ｌは“long”を指す）
一例として、デバッグ中に固定小数点型の変数xの値を参照する場合を考えてみる。参照するときの変数ｘのビットパターンが“０ｘ２０００００００”のとき、その変数ｘの固定小数点型のビット数がデフォルトの場合は変数ｘは１６３８４．０になり、ユーザに整数部１ビット、小数部１０ビットと定義されていた場合は０．５になる。このように同じビットパターンであっても整数部と小数部のビット数により小数の値は変わるが、オブジェクトコードのファイルには、ユーザが定義した固定小数点のデータ型情報を参照することにより、デバッガは固定小数点のビット数を正確に知ることができる。
【００４８】
上述したように本発明の実施の形態によると、固定小数点データにデータ型情報及び変数情報を付することにより、ユーザが定義する固定小数点のデータ型の変数をプログラム中で他のデータ型の変数と同様に扱って記述できる。これにより、プログラムの読み取りが容易となり、プログラムの開発効率や保守性を向上させ、再利用を容易とさせる。更に、アプリケーションに適した固定小数点のデータ型のデータで処理するため、実行性能が良く、オブジェクトサイズが小さなプログラムを生成することが可能となる。
【００４９】
疑似命令を有するオブジェクトコード介してデバッガに固定小数点のビット数の情報を渡すことにより、より正確な固定小数点を得ることが出来る。オブジェクトコードにもデータ型情報を付加することで、デバッガは、その固定小数点データ型のデバック情報を基にして、ユーザに定義された固定小数点データ型の変数を正しく１０進法捧持することが出来、デバッガでの解析作業の効率が向上する。
【００５０】
更に、各固定小数点データのオペラント型の、整数部及び小数部よりなる組み合わせパターンに制約を持たせずに演算処理を行うことが可能で、使用するメモリや命令を少なくし、結果使用メモリ量の削減や、演算の高速化を図ることが出来る。
【００５１】
例えば、shortサイズのデフォルトの固定小数点型の場合、整数部は１６ビット、小数部は１５ビットとなり、shortサイズのデフォルトの固定小数点型の変数一つに対して使用されるメモリは４バイトとなる。使用されるメモリは１バイト、２バイト、４バイト、８バイト単位で区切る必要があるため、整数部と小数部の合計サイズが１５ビット以内に変更されれば２バイトのコードサイズ低下、７ビット以内に変更されれば３バイトのコードサイズ低下となる。longサイズのデフォルトの固定小数点型の場合、整数部は３２ビット、小数部は３１ビットとなり、longサイズのデフォルトの固定小数点型の変数一つに対して使用されるメモリは８バイトとなる。使用されるメモリは１バイト、２バイト、４バイト、８バイト単位で区切る必要があるため、整数部と小数部の合計サイズが３１ビット以内に変更されれば４バイトのコードサイズ低下、１５ビット以内に変更されれば６バイトのコードサイズ低下、７ビット以内に変更されれば７バイトのコードサイズ低下となる。
【００５２】
また、例えばlongサイズの固定小数点の加算をライブラリ関数で行う場合、６４ビットの加算命令があれば固定小数点の加算を１命令で行うことができるが、６４ビットの加算命令がない場合は６４ビットの加算を行うライブラリ関数をさらに呼び出すことになる。言い換えると、longサイズの固定小数点の整数部と小数部のビット数を３１ビット以下に変更すると、固定小数点の加算の中で６４ビットの加算用のライブラリ関数を呼び出す必要がなくなるため、固定小数点の加算に対する速度があがる。現段階にて、実装しているコンパイラが対象としているプロセッサは６４ビットの加算命令を持っていないため、longサイズのデフォルトの固定小数点の加算の時に６４ビットの加算用ライブラリ関数を呼び出す。その際、固定小数点の加算にかかる命令数はデフォルトと、変更時とでは「デフォルト:４９命令」、「整数部と小数部の合計が３１ビット以内になるように変更した時:９命令」のように異なる。
【００５３】
（変更例１）
字句解析手段１１は、固定小数点のデータ型を宣言された図６のソースプログラムをコンパイラする時、図６の１行目に示される、コンパイラ指示子によって宣言された固定小数点のデータ型を取得するとされているが、これはコンパイラ識別子によって宣言されるものに限られない。例えば、ユーザに、固定小数点のデータ型の変数を用いてソースプログラムを記述させる際、コンパイラ起動コマンドを、
ｃｃ  −Ｘｆｘ  ｓｈｏｒｔ：１，１０  −Ｘｆｘ  ｌｏｎｇ：２，２０
のように入力させることによっても、コンパイルオプションで固定小数点のデータ型を定義することが可能である。
【００５４】
このようにコンパイルオプションで固定小数点のデータ型を定義した場合、定義される固定小数点のデータ型の変数をプログラム中で他のデータ型の変数と同様に扱って記述可能であるため、コンパイラ指示子によって宣言する場合と同様の効果を得ることが出来る。
【００５５】
更に、データ型の定義をコンパイルオプションで指定する場合は、ソースプログラムの書き換えを行うことなく定義が変更できるので、アプリケーションプログラムの実行結果の誤差でエラーとならない範囲でビット数が最小のデータ型の定義を求める作業を効率よく行うことが可能となる。
【００５６】
固定小数点のデータ型のビット数を少なくすると、実行速度があがり、オブジェクトコードが小さくなる反面、アプリケーションプログラムの実行結果に誤差が生じて精度が悪化することがある。しかしコンパイルオプションでデータ型の定義をすると、ビット数の最小値を求める場合に、データ型の定義を変更してコンパイル、リンク、シミュレーション、評価の作業を繰返し行い、定義を変更する都度ソースプログラムを書き換える作業などが不要となり、作業効率が向上する。
【００５７】
（変更例２）
変更例１のコンパイルオプションで定義する代わりに、固定小数点のデータ型を定義してユーザにソースプログラムを記述させる際、変数宣言時の固定小数点のデータ型を、
ｓｈｏｒｔ  ＿Ａｃｃｕｍ（１，１０）ｘ；
ｌｏｎｇ  ＿Ａｃｃｕｍ（２，２０）ｙ；
のよう入力させることによっても固定小数点のデータ型を定義することが可能である。
【００５８】
本発明の実施の形態と同様に、ユーザが定義する固定小数点のデータ型の変数をプログラム中で他のデータ型の変数と同様に扱って記述できるため、プログラムの読み取りが容易になり、プログラムの開発効率や保守性が向上し、再利用も容易となるとともに、アプリケーションに適した固定小数点のデータ型のデータで処理するため、実行性能が良く、オブジェクトサイズが小さなプログラムとすることが可能となる。
【００５９】
更に、固定小数点のデータ型の定義を変数の宣言と同時に行うことができるため、プログラムの必要な処理で必要とされる演算精度に応じて変数のデータ型を定義できるため、実行性能が良く、オブジェクトコードが小さなプログラムの開発効率が向上する。
【００６０】
（第２の実施の形態）
一般的にコンパイラは、演算を構成するオペランドの精度が違う場合は、より大きい精度に合わせる仕様となっている。例えば、浮動小数点演算の場合、一方のオペランドが単精度(float)、他方が倍精度(double)の場合は、演算前に単精度のオペランドを倍精度に変換する機械命令を生成するよう言語仕様で定められている。
【００６１】
上記を考慮し、本発明の第２の実施の形態では、コード生成手段１５ａが、固定小数点演算のオペランドのビット数を比較して結果が異なる場合には、より精度の大きいオペランドの固定小数点型に精度の小さい方のオペランドを変換する。尚、使用する装置及び処理手順等は図２及び図１と同様であるため説明を省略する。
【００６２】
コード生成手段１５ａの動作について、図１１のフロー図を参照して説明する。尚、ステップＳ４０１〜ステップＳ４０７はステップＳ３０１〜Ｓ３０７の動作と、ステップＳ４１５〜Ｓ４１８はステップＳ３１０〜３１３の動作と同様であるため説明を省略する。
【００６３】
（ａ）ステップＳ４０７において、固定小数点変数の演算を行う機械命令が有ると判断された場合、ステップＳ４０８へ進み、ステップＳ４０８にて固定小数点演算のオペランドのビット数を比較して、オペランドの型の変換が必要であるか否かの判断を行う。例えば、固定小数点演算“ａ＋ｂ”において、オペランドａは整数部１ビット、小数部１０ビット、オペランドｂは整数部２ビット、小数部２０ビットの場合、加算“＋”前にオペランドａをオペランドｂと同じ型に変換するほうが好ましいと判断できる。これはオペランドｂの固定小数点型の方がオペランドａの固定小数点型よりも精度が高いためである。オペランドの型の変換が必要な場合はステップＳ４１０へ進み、オペランドの型の変換が不要な場合はステップＳ４１１へ進む。
【００６４】
（ｂ）ステップＳ４１０においては、オペランド型変換のため、引数渡しの機械命令、関数呼び出しの機械命令、関数戻り値を受け取る機械命令から成るコードを生成する。更に、ステップＳ４１１において、演算を実行するため、引数渡しの機械命令、関数呼び出しの機械命令、関数戻り値を受け取る機械命令から成るコードを生成する。生成されたコードはコード最適化手段１６へ渡される。
【００６５】
（ｃ）ステップＳ４０７において、固定小数点変数の演算を行う機械命令が無いと判断された場合、ステップＳ４１２へ進み、ステップＳ４１２にて固定小数点演算のオペランドのビット数を比較して、オペランドの型の変換が必要であるか否かの判断を行う。変換が必要な場合はステップＳ４１３へ進み、変換が不要な場合はステップＳ４１４へ進む。
【００６６】
（ｄ）ステップＳ４１３では、オペランドの型を変換するための機械命令から成るコードを生成する。ステップＳ４１４においては、データのビット数をオペランドとして設定し、固定小数点演算命令のコードを生成する。
【００６７】
尚、固定小数点演算のオペランドのビット数が異なるが、一方のオペランドが他方のオペランドよりも精度が高いとは言えない場合、例えば整数部は一方のオペランドが多いが、小数部は他方のオペランドが多い場合には、コンパイラ装置１００が新しいビット数を持つ固定小数点型を生成し、演算前のその型へ変換する機械命令を生成する。例えば固定小数点演算“ｃ＋ｄ”において、オペランドｃは整数部１ビット、小数部２０ビット、オペランドｄは整数部２ビット、小数部１０ビットの場合、コンパイラ装置１００は整数部２ビット、小数部２０ビットの固定小数点型を新たに用意し、加算“＋”前にオペランドｃとｄを両方ともその型に変換する。
【００６８】
本発明の第２の実施の形態によると、ユーザによりビット数が変更されてもコンパイラ装置１００は整数部と小数部のビット数から精度の高い方を選択し、必要に応じて演算前にデータ型変換を行う機械命令を生成することが出来る。更に、変換後のデータ型がユーザにより未定義の場合は、コンパイラ装置１００自身がそのデータ型を生成することも可能である。
【図面の簡単な説明】
【００６９】
【図１】本発明の実施の形態に係るコンパイラ装置の構造図である。
【図２】本発明の実施の形態に係るコンパイラ装置の機能ブロック図である。
【図３】データ型情報処理手段が#pragma指令文を処理する動作を示すフローチャートである。
【図４】変数情報処理手段が固定小数点の変数定義の文を処理する動作を示すフローチャートである。
【図５】コード生成手段が固定小数点の演算を処理する動作を示すフローチャートである。
【図６】本発明の実施の形態において使用されるプログラムの一例である。
【図７】型情報記憶部内のデータ構成を示す図である。
【図８】変数記憶部内のデータ構成を示す図である。
【図９】本発明の実施の形態において使用される演算ライブラリプログラムの一例である。
【図１０】本発明の実施の形態に係るコンパイラ装置の機能ブロック図である。
【図１１】コード生成手段が固定小数点の演算を処理する動作を示すフローチャートである。
【符号の説明】
【００７０】
２…記憶装置
３…ＣＰＵ
４…システムバス
１１…字句解析手段
１２…構文解析手段
１２ａ…データ型情報処理手段
１２ｂ…変数情報処理手段
１５，１５ａ…コード生成手段
１６…コード最適化手段
１７…コード出力手段
２０…小数部
２１…作業領域
２２…機械語プログラム格納部
２３…ソースプログラム格納部
２４…コンパイラ格納部
２５…オブジェクトコード格納部
２６…型情報記憶部
２７…変数記憶部
３１…演算実行部
３２…レジスタ
３３…命令デコーダ部
３４…制御部
３５…条件コードレジスタ部
１００…コンパイラ装置
【図１】
2005141410.tif 000003
【図２】
2005141410.tif 000004
【図３】
2005141410.tif 000005
【図４】
2005141410.tif 000006
【図５】
2005141410.tif 000007
【図６】
2005141410.tif 000008
【図７】
2005141410.tif 000009
【図８】
2005141410.tif 000010
【図９】
2005141410.tif 000011
【図１０】
2005141410.tif 000012
【図１１】
2005141410.tif 000013