(57)【要約】【課題】ユーザが定義した組込関数を用いた処理動作と同等の動作を行う命令文を、ユーザが定義した組込関数に応じた機械語に最適化すること。【解決手段】ソースプログラム１に記述された命令について文法規則への適合性を解析し、上記命令の組み合わせが組込関数及び該組込関数の動作内容を定義しているか否かを解析する構文解析部１２と、構文解析部１２で解析された組込関数及び該組込関数の動作内容の定義を記憶する記号表２０と、構文解析部１２の処理結果に基づいて、ソースプログラム１から機械語を生成するコード生成部１５と、コード生成部１５により生成された機械語が記号表２０に記憶されている組込関数の動作内容と一致する場合、当該機械語を組込関数の動作内容に応じた機械語に最適化するコード最適化部１６とを備えることによる。【選択図】      図１
2004295398.tif 000002
【特許請求の範囲】
【請求項１】
入力したソースプログラムからオブジェクトコードを生成するコンパイラであって、
前記ソースプログラム内に記述された命令について文法規則への適合性を解析し、前記命令の組み合わせが組込関数及び該組込関数の動作内容を定義しているか否かを解析する構文解析部と、
前記構文解析部で解析された前記組込関数及び該組込関数の動作内容の定義を記憶する組込関数定義記憶部と、
前記構文解析部の処理結果に基づいて、前記ソースプログラムから機械語を生成するコード生成部と、
前記コード生成部により生成された前記機械語が前記組込関数定義記憶部に記憶されている前記組込関数の動作内容と一致する場合、当該機械語を前記組込関数の動作内容に応じた機械語に最適化するコード最適化部と
を備えることを特徴とするコンパイラ。
【請求項２】
前記ソースプログラム内に記述された命令をトークンに分割する字句解析部を備え、
前記構文解析部は、前記トークンについて文法規則への適合性を解析し、前記トークンの組み合わせが前記組込関数及び該組込関数の動作内容を定義しているか否かを解析することを特徴とする請求項１に記載のコンパイラ。
【請求項３】
前記字句解析部は前記組込関数及びその動作内容の定義を外部ファイルから入力することを特徴とする請求項１又は請求項２に記載のコンパイラ。
【請求項４】
前記組込関数の定義には、仮引数型と識別子名とが含まれることを特徴とする請求項１乃至請求項３のいずれか１項に記載のコンパイラ。
【請求項５】
前記組込関数定義記憶部には、１つの組込関数に対して複数種類の動作内容を定義できることを特徴とする請求項１乃至請求項４のいずれか１項に記載のコンパイラ。
【請求項６】
前記組込関数の動作内容には、機械語列が含まれることを特徴とする請求項１乃至請求項５のいずれか１項に記載のコンパイラ。
【請求項７】
前記組込関数及びその動作内容の定義は、ハードウェア記述言語で記述されていることを特徴とする請求項１乃至請求項６のいずれか１項に記載のコンパイラ。
【請求項８】
入力したソースプログラムからオブジェクトコードを生成するコンパイラによるコンパイル方法であって、
前記ソースプログラム内に記述された命令の文法規則への適合性を解析し、前記命令の組み合わせが組込関数及び該組込関数の動作内容を定義しているか否かを構文解析部が解析する段階と、
前記構文解析部により解析された前記組込関数及び該組込関数の動作内容の定義を組込関数定義記憶部に記憶する段階と、
前記構文解析部の処理結果に基づいて、コード生成部が前記ソースプログラムから機械語を生成する段階と、
前記コード生成部により生成された前記機械語が前記組込関数定義記憶部に記憶された前記組込関数の動作内容と一致する場合、コード最適化部が当該機械語を前記組込関数の動作内容に応じた機械語に最適化する段階と
を含むことを特徴とするコンパイル方法。
【請求項９】
前記ソースプログラム内に記述された命令を字句解析部がトークンに分割する段階を含み、
前記構文解析部による解析段階において、前記トークンについて文法規則への適合性を解析し、前記トークンの組み合わせが前記組込関数及び該組込関数の動作内容を定義しているか否かを解析することを特徴とする請求項８に記載のコンパイル方法。
【請求項１０】
前記字句解析部は前記組込関数及びその動作内容の定義を外部ファイルから入力することを特徴とする請求項８又は請求項９に記載のコンパイル方法。
【請求項１１】
前記構文解析部が解析し、前記組込関数定義記憶部に記憶する前記組込関数の定義には、仮引数型と識別子名とが含まれることを特徴とする請求項８乃至請求項１０のいずれか１項に記載のコンパイル方法。
【請求項１２】
前記組込関数定義記憶部には、１つの組込関数に対して複数種類の動作内容を定義できることを特徴とする請求項８乃至請求項１１のいずれか１項に記載のコンパイル方法。
【請求項１３】
前記構文解析部が解析し、前記組込関数定義記憶部に記憶する前記組込関数の動作内容には、機械語列が含まれることを特徴とする請求項８乃至請求項１２のいずれか１項に記載のコンパイル方法。
【請求項１４】
前記構文解析部は、ハードウェア記述言語で記述されている前記組込関数及びその動作内容の定義を解析することを特徴とする請求項８乃至請求項１３のいずれか１項に記載のコンパイル方法。
【請求項１５】
ユーザ定義のハードウェアを導入したプロセッサのためのアプリケーションプログラムを設計するためのプログラム開発ツールであって、前記アプリケーションプログラム内に記述された命令をトークンに分割する字句解析部と、前記トークンについて文法規則への適合性を解析し、ユーザ定義命令のハードウェア定義を入力して組込関数及び該組込関数の動作内容の定義に変換する構文解析部と、前記構文解析部で変換された前記組込関数及び該組込関数の動作内容の定義を記憶する組込関数定義記憶部と、前記字句解析部及び前記構文解析部の処理結果に基づいて、前記アプリケーションプログラムから機械語を生成するコード生成部と、前記コード生成部により生成された前記機械語が前記組込関数定義記憶部に記憶されている前記組込関数の動作内容と一致する場合、当該機械語を前記組込関数の動作内容に応じた機械語に最適化するコード最適化部とを含むコンパイラと、
前記コンパイラによりコンパイルされた前記アプリケーションプログラムをデバッグするシミュレータと
を備えることを特徴とするプログラム開発ツール。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
プログラミング言語により記述されたソースプログラムを、機械語によるオブジェクトコードに変換（コンパイル）するコンパイラ、コンパイル方法、及び該コンパイラを備えたプログラム開発ツールに係り、特に、ユーザによる拡張仕様を定義した関数を組み込む技術に関する。
【０００２】
【従来の技術】
一般に、ソースプログラムを機械語であるオブジェクトコードに変換するコンパイラは、プロセッサ・アーキテクチャごとに用意され、関数の処理手順もコンパイラ内部に組み込まれていて、ユーザが独自に変更できない。従って、ユーザが仕様（プロセッサ・アーキテクチャおよび命令セット）を拡張可能なプロセッサでアプリケーションプログラム等を動作させるためには、ユーザ仕様に対応したコンパイラが必要となる。
【０００３】
そこで、本出願人は、組込関数（ｉｎｔｒｉｎｓｉｃ  ｆｕｎｃｔｉｏｎ）をユーザの拡張仕様に応じてカスタマイズできるコンパイラを提案している（例えば、特許文献１参照）。
【０００４】
【特許文献１】
特開２００２−２４０２９号公報
【０００５】
【発明が解決しようとする課題】
しかしながら、特許文献１に記載のコンパイラでは、ユーザが定義した組込関数を用いた処理動作と同等の動作を行う命令文を、ソースプログラム中にプログラミング言語で記述したとしても、その命令文をユーザ定義の組込関数に応じた機械語に変換することができなかった。
【０００６】
例えば、ソースレジスタに”１０”を加算して、”＿＿ｉｍｍ”でマスクした値をデスティネーションレジスタに格納する処理として、図１９（ａ）に示すような組込関数”ｕｃｉ”（組込関数Ｆ９１）をソースプログラム中に宣言した場合、コンパイラは、ソースプログラム中で組込関数”ｕｃｉ”を明示的に呼び出す命令文Ｔ９１から、ユーザの定義に応じた命令語”ｕｃｉ”を用いた機械語（図１９（ｂ）における機械語Ｍ９１）へ変換することが可能である。
【０００７】
ところが、命令文Ｔ９１が組込関数”ｕｃｉ”を用いて実行する処理動作（ソースレジスタに”１０”を加算して、”＿＿ｉｍｍ”でマスクした値をデスティネーションレジスタに格納する処理動作）と同等の処理動作を実行する命令文Ｔ９２がソースプログラム中に記述されていたとしても、コンパイラは命令文Ｔ９２をユーザ定義の命令語”ｕｃｉ”を用いた機械語へ変換することができず、命令語”ａｄｄ”を用いた従来の機械語（図１９（ｂ）における機械語Ｍ９２）を生成してしまう。命令文Ｔ９２をユーザ定義の命令語”ｕｃｉ”を用いた機械語へ変換させるためには、ユーザは、命令文Ｔ９２の記述を、組込関数”ｕｃｉ”を明示的に呼び出す命令文Ｔ９１に書き改める必要がある。
【０００８】
このように、ユーザは、ソースプログラムを記述する時に、ユーザが定義した組込関数について熟知していなければならなかったり、プロセッサの仕様を拡張した時に、ソースプログラム中の記述の中から該当する動作部分をユーザが定義した組込関数に書き換える必要があったりして、プロセッサあるいはそのアプリケーションプログラムの設計に多大な時間やコストを要するという問題があった。
【０００９】
本発明は、以上のような問題を鑑みてなされたものであり、ユーザが仕様を拡張可能なプロセッサにおいて、ユーザが定義した組込関数を用いた処理動作と同等の動作を行う命令文を、ユーザが定義した組込関数に応じた機械語に最適化することができるコンパイラ、コンパイル方法、及び該コンパイラを用いたプログラム開発ツールを提供することを目的とする。
【００１０】
【課題を解決するための手段】
上記課題を解決するために、本発明の一態様によるコンパイラは、入力したソースプログラムからオブジェクトコードを生成するコンパイラであって、ソースプログラム内に記述された命令について文法規則への適合性を解析し、上記命令の組み合わせが組込関数及び該組込関数の動作内容を定義しているか否かを解析する構文解析部と、構文解析部で解析された組込関数及び該組込関数の動作内容の定義を記憶する組込関数定義記憶部と、構文解析部の処理結果に基づいて、ソースプログラムから機械語を生成するコード生成部と、コード生成部により生成された機械語が組込関数定義記憶部に記憶されている組込関数の動作内容と一致する場合、当該機械語を組込関数の動作内容に応じた機械語に最適化するコード最適化部とを備える。
【００１１】
本発明の一態様によるコンパイル方法は、入力したソースプログラムからオブジェクトコードを生成するコンパイラによるコンパイル方法であって、ソースプログラム内に記述された命令の文法規則への適合性を解析し、上記命令の組み合わせが組込関数及び該組込関数の動作内容を定義しているか否かを構文解析部が解析する段階と、構文解析部により解析された組込関数及び該組込関数の動作内容の定義を組込関数定義記憶部に記憶する段階と、構文解析部の処理結果に基づいて、コード生成部がソースプログラムから機械語を生成する段階と、コード生成部により生成された機械語が組込関数定義記憶部に記憶された組込関数の動作内容と一致する場合、コード最適化部が当該機械語を組込関数の動作内容に応じた機械語に最適化する段階とを含む。
【００１２】
本発明の一態様によるプログラム開発ツールは、ユーザ定義のハードウェアを導入したプロセッサのためのアプリケーションプログラムを設計するためのプログラム開発ツールであって、（ａ）アプリケーションプログラム内に記述された命令をトークンに分割する字句解析部と、トークンについて文法規則への適合性を解析し、ユーザ定義命令のハードウェア定義を入力して組込関数及び該組込関数の動作内容の定義に変換する構文解析部と、構文解析部で変換された組込関数及び該組込関数の動作内容の定義を記憶する組込関数定義記憶部と、字句解析部及び構文解析部の処理結果に基づいて、アプリケーションプログラムから機械語を生成するコード生成部と、コード生成部により生成された機械語が組込関数定義記憶部に記憶されている組込関数の動作内容と一致する場合、当該機械語を組込関数の動作内容に応じた機械語に最適化するコード最適化部とを含むコンパイラと、（ｂ）コンパイラによりコンパイルされたアプリケーションプログラムをデバッグするシミュレータとを備える。
【００１３】
ユーザがソースプログラムを記述する際に、ユーザ定義の組み込み関数を明示的に呼び出さなくても、ユーザ定義の組込関数を用いた処理動作と同等の処理動作を行う命令文を、その組込関数に応じた機械語に最適化することができる。
【００１４】
【発明の実施の形態】
以下、本発明の実施形態を図面に基づいて説明する。尚、各図面を通じて同一もしくは同等の部位や構成要素には、同一もしくは同等の参照符号を付し、その説明を省略もしくは簡略化する。
【００１５】
図１は、本発明の実施形態におけるコンパイラ１０の構成を例示する概略ブロック図である。コンパイラ１０は、アプリケーションプログラム開発ツール等のコンピュータシステムに搭載され、プログラミング言語で記述されたソースプログラム１を機械言語に翻訳する翻訳プログラムであり、字句解析部１１、構文解析部１２、中間コード生成部１３、中間コード最適化部１４、コード生成部１５、コード最適化部１６、コード出力部１７などを含んでいる。
【００１６】
まず、字句解析部１１がソースプログラム１を入力して字句解析を行う。字句解析部１１は、ソースプログラム１に高級言語で記述された記述された命令文を意味のある最小の単位であるトークン（ｔｏｋｅｎ）に分割する「字句解析」を行う。「トークン」の代表例は、プログラミング言語のキーワード、演算子、変数名、定数、区切り記号等である。
【００１７】
次に、構文解析部１２は、字句解析部１１の処理結果を入力して構文解析を行う。構文解析部１２が行う「構文解析」では、字句解析部１１によって変数名や記号などのトークンに分割された命令について、それぞれのプログラミング言語で定められた文法規則に適合しているか否かがチェックされる。更に、構文解析部１２は、トークンに分割された命令若しくはこれら命令の組み合わせが、ユーザ定義の組込関数及び該組込関数の動作内容を定義しているか否かを解析し、解析した組込関数及びその動作内容の定義を組込関数定義記憶部である記号表２０に記憶する。
【００１８】
その後、中間コード生成部１３による中間コードの生成、中間コード最適化部１４による中間コードの最適化を経て、コード生成部１５によるコード生成が行われる。コード生成部１５による「コード生成」では、それまでに行われたソースプログラム１の最小単位への分割、構文エラーのチェックなどの結果を受けて、コード・ジェネレータの機能を用いてソースプログラム１を、アセンブラ形式や２進数形式などの機械語へ変換する処理が行われる。
【００１９】
更に、コード最適化部１６によるコード最適化が行われる。コード最適化部１６による「コード最適化」では、直前のコード生成部１５により変換された機械語に、実際の処理効率を向上させるための変更が加えられる。また、コード最適化部１６は、コード生成部１５により生成された機械語が、組込関数定義記憶部（記号表２０）に記憶されているユーザが定義した組込関数の動作内容と一致する場合、その機械語をユーザが定義した組込関数の動作内容に応じた機械語に最適化する。
【００２０】
そして、コード出力部１７は、コード最適化部１６によるコード最適化結果に基づいてオブジェクトコード２を生成する。
【００２１】
ここで、コンパイラ１０が中間コード生成部１３及び中間コード最適化部１４によって中間コードの生成を行うのは、構文解析の直後にコード生成をすると、生成されるプログラム・サイズが大きくなり、変換処理が効率よく行われない場合があるため、ソースプログラム１ａと等価で、しかも簡潔な言語である中間コードに変換してから翻訳処理を行う。中間コード生成及び中間コード最適化を省略してもオブジェクトコード２は得られる。
【００２２】
図２は、中間コードを生成しないでソースプログラム１からオブジェクトコード２を生成するコンパイラ１０ａの構成を示す概略ブロック図である。図２に示すように、コンパイラ１０ａは、字句解析部１１ａ、構文解析部１２ａ、コード生成部１５ａ、コード最適化部１６ａ、コード出力部１７ａを経て、ソースプログラム１からオブジェクトコード２を生成する。構文解析部１２ａは、字句解析部１１ａによって分割されたトークンの組み合わせが、ユーザが定義した組込関数及び該組込関数の動作内容を定義しているか否かを解析し、解析した組込関数及びその動作内容の定義を記号表２０ａに記憶する。コード最適化部１６ａは、コード生成部１５ａにより生成された機械語が、記号表２０ａに記憶されているユーザが定義した組込関数の動作内容と一致する場合、その機械語をユーザが定義した組込関数動作内容に応じた機械語に最適化する。
【００２３】
［第１実施例］
プロセッサ・アーキテクチャや命令セットなどの仕様をユーザが拡張可能なプロセッサにおいて、拡張した仕様に応じたハードウェア動作を実現するために、ユーザが独自に組込関数を定義できるようにする。以下、第１の実施例では、プログラミング言語としてＣ言語をモデルにして説明する。
【００２４】
図４（ａ）及び（ｂ）は、ユーザが拡張した仕様に応じて組込関数を定義した例を示している。また、図５（ａ）は、図４に示したユーザ定義の組込関数を明示的に呼び出す命令列の記述例を示しており、図５（ｂ）は、図５（ａ）に示す命令列から生成される機械語列を例示している。図６（ａ）は、図４に示したユーザ定義の組込関数と同等の処理動作を実行する命令列を例示しており、図６（ｂ）は、図６（ａ）に示す命令列から生成される最適化前の機械語列、図６（ｃ）は最適化後の機械語列を例示している。
【００２５】
図４（ａ）の組込関数定義Ｆ１１では、予約語”＿＿ａｓｍ”，”＿＿ｒｅｇ＿ｓｒｃ”を用いて、組込関数”ｕｃｉ”を宣言し仮引数等の属性を定義すると共に、この組込関数”ｕｃｉ”の動作内容Ｐ１１をプログラミング言語で定義する。図４（ｂ）の組込関数定義Ｆ１２は、図４（ａ）の組込関数定義Ｆ１１を再定義したものであり、図４（ａ）の動作内容Ｐ１１と異なる記述で動作内容Ｐ１２を定義している。つまり、図４（ａ）〜（ｂ）に示す組込関数はその動作内容の記述方法が異なるだけで、結果的に同等の動作内容を有している。
【００２６】
このように、１つのユーザ定義の組込関数を何度でも（何種類でも）再定義可能とし、再定義された定義の数が増えれば増えるほど、コンパイラ１０のコード最適化部１６が最適化可能と判定できる命令列の特定を容易にすることができる。
【００２７】
コンパイラ１０は、図４に示したようなユーザ定義の組込関数の記述に対して、オブジェクトコード２を生成しない。従って、このような組込関数定義をソースプログラム１のヘッダファイルに記述しても良いし、あるいは図３に示すように組込関数定義をソースプログラム１とは別のファイル（組込関数情報ファイル３）に格納しておき、コンパイラ１０は組込関数情報ファイル３からユーザ定義の組込関数定義を読み込んでコンパイルしてもよい。
【００２８】
ユーザ定義の組込関数の定義は、わずかな予約語（”＿＿ａｓｍ”，”＿＿ｒｅｇ＿ｓｒｃ”など）を追加しただけであるため、組込関数定義をソースプログラム１中に記述するようにすると、ユーザは組込関数の内容を理解でき、組込関数の動作定義から最適化が容易なプログラミングが容易となる。更に、ソースプログラム１の管理も容易となる。
【００２９】
図７はコンパイラ１０の構文解析部１２の詳細な処理動作を例示するフローチャートである。
【００３０】
構文解析部１２は、字句解析部１１の処理結果を入力し、入力した各トークンについて、図７に示すような解析処理を実行する。構文解析部１２はステップＳ０１において、入力したトークンが関数宣言であるか否かを判定する。判定の結果、関数宣言でない場合、ステップＳ０２へ進み、構文解析部１２は通常の構文解析処理を実行する。
【００３１】
ステップＳ０１の判定の結果、関数宣言である場合、構文解析部１２はステップＳ０３において、関数宣言に独自の予約語”＿＿ａｓｍ”が付加されているか否かを判定する。判定の結果、予約語”＿＿ａｓｍ”が付加されていなければ、構文解析部１２はユーザが拡張定義した組込関数ではないと判断し、ステップＳ０４の通常の関数宣言処理へ移行する。
【００３２】
ステップＳ０３の判定の結果、予約語”＿＿ａｓｍ”が付加されている場合、構文解析部１２は、ユーザが定義した組込関数であると判断し、ステップＳ０５において、その組込関数の宣言がプロトタイプ宣言なのか、関数定義なのかを判定する。ここで、「プロトタイプ宣言」とはユーザ定義の組込関数のうち、仮引数の型情報や識別子の名前の定義のみで、動作内容の定義を持たない組込関数の宣言をいう。
【００３３】
ステップＳ０５の判定の結果、そのユーザ定義の組込関数の宣言がプロトタイプ宣言である場合、構文解析部１２はステップＳ０６において、組込関数の仮引数の型情報や識別子の名前の解釈を行い、仮引数の型情報や識別子の名前の指定方法に誤りがあるか否かを判定する。判定の結果、仮引数の型情報や識別子の名前の指定方法に誤りがなければ、構文解析部１２はステップＳ０７においてユーザ定義の組込関数の定義内容を記号表２０へ登録する。逆に、仮引数の型情報や識別子の名前の指定方法に誤りがあれば、構文解析部１２はステップＳ０８においてエラーメッセージを出力する。
【００３４】
一方、ステップＳ０５の判定の結果、ユーザ定義の組込関数の宣言がプロトタイプ宣言でない場合、構文解析部１２はステップＳ１０において、組込関数の仮引数の型情報や識別子の名前の解釈を行い、仮引数の型情報や識別子の名前の指定方法に誤りがあるか否か、組込関数の動作内容の定義に文法的な誤りがあるか否かを判定する。判定の結果、仮引数の型情報や識別子の名前の指定方法や動作内容の定義に誤りがある場合、ステップＳ０８においてエラーメッセージを出力する。
【００３５】
ステップＳ１０の判定の結果、仮引数の型情報や識別子の名前の指定方法や動作内容の定義に誤りがない場合、ステップＳ１１において、構文解析部１２は、このユーザ定義の組込関数が、既に記号表２０に定義済みの組込関数の再定義であるか否かを判定する。判定の結果、既に定義済みの組込関数の再定義でない場合、ステップＳ１２において、構文解析部１２は、ユーザ定義の組込関数及び定義内容の定義を記号表２０へ登録する。
【００３６】
ステップＳ１１の判定の結果、このユーザ定義の組込関数が既に記号表２０に定義済みの組込関数の再定義である場合、構文解析部１２はステップＳ１３において、この組込関数と定義済みの組込関数の動作定義が実質的に一致しているか否かを判定し、例えば、図４（ａ）の関数定義と図４（ｂ）の関数定義のように動作定義が実質的に一致している場合は、ステップＳ１３において、組込関数及び定義内容の定義を記号表２０へ登録する。逆に、一致していない場合は、ステップＳ１４においてエラーメッセージを出力する。尚、ステップＳ１１における再定義された関数の動作内容と実質的に同じであるか否かの判定処理は、一般的なコンパイラで用いられている「共通式の検出」技術により実現できる。
【００３７】
図４（ａ）及び図４（ｂ）に示した組込関数定義に対して、以上の構文解析部１２による処理を実行すると、結果として図８に例示するようなデータが記号表２０に登録される。
【００３８】
図８に示すように、記号表２０のハッシュテーブル２１内のハッシュ値が指し示す先に組込関数の定義テーブル２２１，２２２，…が格納されている。各定義テーブル２２１，２２２，…は、ハッシュ値、先頭の機械語、組込関数名、引数、引数の種類、動作定義内容２３１，２２２，…、最適化結果などが格納されている。動作定義内容２３１，２２２，…には、動作内容を示す機械語列が動作順序に並べられて格納されており、構文解析部１２及びコード最適化部１６におけるユーザ定義の組込関数の機械語への変換処理を実現している。
【００３９】
図９は、コード最適化部１６が実行する処理の手順例を示すフローチャートである。
【００４０】
まず、ステップＳ２１において、コード最適化部１６はコード生成部１５により生成された機械語が、ユーザが定義した組込関数の明示的呼び出しであるか否かを判定する。判定の結果、図５（ａ）に例示するような組込関数の明示的呼び出しである場合、コード最適化部１６は、図５（ｂ）に例示するようなユーザが定義した組込関数”ｕｃｉ”の動作内容に応じた機械語に最適化する。
【００４１】
ステップＳ２１の判定の結果、図６（ａ）に例示するような組込関数の明示的呼び出しでない場合、コード最適化部１６はステップＳ２２において、図６（ａ）の命令文Ｔ２１，Ｔ２２にそれぞれ対応する機械語Ｍ２１，Ｍ２２が、記号表２０に登録されている組込関数の定義内容とそれぞれ一致するかどうか検査する。機械語列Ｍ２１について具体的に説明すると、先頭の機械語列”ａｄｄ  ＄３，＄１，１０”に対して、ハッシュ検索を行うことにより、図８の記号表２０に登録された組込関数”ｕｃｉ”の第一の定義（＃ｎｕｍ１）に対応する定義内容に一致し、次に、機械語列”ａｄｄ  ＄４，＄０，１０”に対して、ハッシュ検索を行うことにより、同じく組込関数”ｕｃｉ”の第一の定義（＃ｎｕｍ１）に対応する定義内容に一致する。従って、機械語列Ｍ２１は、ステップＳ２３において、図６（ｃ）の機械語列Ｍ２３に最適化され、出力される。同様に、機械語列Ｍ２２は、ステップＳ２３において、組込関数”ｕｃｉ”の動作内容に応じた、図６（ｃ）の機械語列Ｍ２４に最適化されて、出力される。
【００４２】
ステップＳ２２の検査の結果、機械語の組み合わせが記号表２０に登録されている組込関数の定義内容と一致しない場合は、通常の機械語であると判断し、通常の機械語を生成する。図６に示した例であれば、図６（ｂ）の機械語列Ｍ２１，Ｍ２２がそのまま生成される。
【００４３】
以上説明したコンパイラ１０による処理結果として、入力のソースプログラム１の例を図１０に示し、生成されるオブジェクトコード２（アセンブラ）の例を図１１に示す。
【００４４】
以上説明したように、第１実施例によれば、ユーザがソースプログラム１を記述する際に、ユーザ定義の組み込み関数を明示的に呼び出さなくても、ユーザが定義した組込関数を用いた処理動作と同等の処理動作を行う命令文を、その組込関数に応じた機械語に最適化することができる。
【００４５】
更に、ユーザ定義の組込関数の定義を、何度でも（何種類でも）再定義可能とすることで、ユーザ定義の組込関数の機械語への変換において変換候補となる命令文が増え、より効果的な最適化が実現できる。
【００４６】
［第２実施例］
第１実施例では、Ｃ言語によってユーザ定義の組込関数を記述する例を示したが、ユーザ定義の組込関数を記述するプログラミング言語はＣ言語に限らない。
【００４７】
そこで、第２実施例では、ハードウェア記述言語（例えば、ＶｅｒｉｌｏｇＨＤＬ）で記述されたユーザ定義の組込関数を入力して、記号表２０を作成・登録し、ソースプログラム１中の同等の処理動作を行う命令文をユーザ定義の組込関数に応じた機械語に最適化するコンパイラ１０の例を示す。
【００４８】
図１２は、ＶｅｒｉｌｏｇＨＤＬで記述されたユーザ定義の組込関数（命令動作定義）の例（命令動作定義ファイル名は”ａｄｄ１０＿ａｎｄ＿１．ｖ”）を示しており、動作内容の命令語列Ｐ４１を含んだ記述となっている。同様に、図１３は、ＶｅｒｉｌｏｇＨＤＬで記述された命令動作定義の例（命令動作定義ファイル名は”ａｄｄ１０＿ａｎｄ＿２．ｖ”）を示しており、動作内容の命令語列Ｐ４２を含んでいる。
【００４９】
尚、図１２における動作内容の命令語列Ｐ４１は、第１実施例の図１０における動作内容の命令語列Ｐ１１と同等の処理を実現し、図１３における動作内容の命令語列Ｐ４２は、図１０における動作内容の命令語列Ｐ１２と同等の処理を実現する。つまり、第１実施例と同様に、ＶｅｒｉｌｏｇＨＤＬで記述された命令動作定義の再定義が可能である。
【００５０】
図１４（ａ）は、コンパイラ１０が入力するソースプログラム１の例を示している。ソースプログラム１中には、ＶｅｒｉｌｏｇＨＤＬで記述された命令動作定義ファイルの宣言Ｈ４１，Ｈ４２と、ユーザが定義した組込関数の明示的呼び出しを行う命令文Ｔ４１、命令文Ｔ４１と同等の処理を実現する命令文Ｔ４２がＣ言語で記述されている。このようなソースプログラム１を入力したコンパイラ１０の構文解析部１２の処理動作例を図１５に例示する。
【００５１】
図１５に示すように、構文解析部１２は字句解析部１１の処理結果を入力し、ステップＳ３１において、入力したトークンがＶｅｒｉｌｏｇＨＤＬの命令動作定義ファイルの宣言（”＃ｐｒａｇｍａ  ｉｎｐｕｔ  ＨＤＬ”）であるか否かを判定する。判定の結果、ＶｅｒｉｌｏｇＨＤＬの命令動作定義ファイルの宣言でない場合、構文解析部１２はステップＳ３２において通常の構文解析処理を実行する。
【００５２】
ステップＳ３１の判定の結果、ＶｅｒｉｌｏｇＨＤＬの命令動作定義ファイルの宣言である場合、構文解析部１２はステップＳ３３において、ＶｅｒｉｌｏｇＨＤＬの命令動作定義ファイルを入力する。そして、構文解析部１２はステップＳ３４において、入力した命令動作定義ファイルに記述されている命令動作定義に、文法的な誤りがあるか否か判定する。
【００５３】
ステップＳ３４の判定の結果、命令動作定義に誤りがあれば、構文解析部１２はステップＳ０８においてエラーメッセージを出力し、命令動作定義に誤りがなければ、構文解析部１２はステップＳ３６において、ＶｅｒｉｌｏｇＨＤＬの命令動作定義の記述をユーザ定義の組み込み関数定義に記述に変換する。例えば、図１１に示した命令動作定義は、図１０における関数定義Ｆ１１に変換され、図１２に示した命令動作定義は、図１０における関数定義Ｆ１２に変換される。
【００５４】
ステップＳ３６の変換処理が正常に行われなかった場合、構文解析部１２はステップＳ３８においてエラーメッセージを出力する。
【００５５】
逆に、ステップＳ３６の変換処理が正常に行われた場合、構文解析部１２はステップＳ４１において、変換された組込関数が記号表２０に既に定義済みの組込関数の再定義であるか否かを判定する。判定の結果、この組込関数が既に定義済みの組込関数の再定義でない場合、ステップＳ４２において、構文解析部１２はこの組込関数及び定義内容の定義を記号表２０へ登録する。
【００５６】
ステップＳ４１の判定の結果、この組込関数が既に記号表２０に定義済みの組込関数の再定義である場合、構文解析部１２はステップＳ４３において、この組込関数と定義済みの組込関数の動作定義が実質的に一致しているか否かを判定し、実質的に一致している場合は、ステップＳ１３において、この組込関数及び定義内容の定義を記号表２０へ登録する。逆に、一致していない場合は、ステップＳ１４においてエラーメッセージを出力する。
【００５７】
以上の構文解析部１２による処理を実行した結果、図１６に例示するようなデータが記号表２０に登録される。結果的に、図８に示した記号表２０とほぼ同等な内容になっている。
【００５８】
尚、第２実施例におけるコンパイラ１０の構成要素のうち、構文解析部１２以外の各構成要素は、図１に示したコンパイラ１０の各構成要素と同様である。
【００５９】
以上説明したコンパイラ１０による処理結果として、図１４（ａ）に示した入力のソースプログラム１が、図１４（ｂ）に示すオブジェクトコード２（アセンブラ）に最適化されて生成される。
【００６０】
このように、第２実施例によれば、ハードウェア記述言語によって記述されたユーザ定義の組込関数と同等の処理動作を行う命令文を、ユーザの拡張定義の組込関数に応じた機械語に最適化することができる。
【００６１】
また、ユーザは、プログラミングの際にハードウェア記述言語によって記述されたユーザ定義の組込関数の定義を読むことで、ハードウェアの実装方法が容易に理解できるため、ユーザが拡張した仕様に基づいたプログラムの動作時の最適化を図ることができる。
【００６２】
尚、図１５に示したＨＤＬファイルの入力処理（ステップＳ３３）の後で、字句解析や構文解析の処理（ステップＳ３４）を行う例を示したが、ソースプログラム１中にＶｅｒｉｌｏｇＨＤＬの記述を混在可能とするために、字句解析部１１や構文解析部１２にＶｅｒｉｌｏｇＨＤＬの字句解析や構文解析処理機能を持たせるようにしてもよい。
【００６３】
［第３実施例］
第３実施例では、第２実施例で説明したコンパイラ１０を用いたプログラム開発ツールについて詳細に説明する。このプログラム開発ツールは、例えば、ユーザ定義のハードウェアを導入したプロセッサと、そのプロセッサのためのアプリケーションプログラムを設計するための開発ツールとして用いることができる。
【００６４】
初めに、比較例として、特許文献１に記載のコンパイラを利用したプログラム開発ツールの処理動作例を図１７に示す。
【００６５】
図１７に示すように、開発対象のアプリケーションプログラムを作成し（ステップＳ５１）、作成した開発対象プログラムのユーザ定義命令の該当個所を、ユーザ定義命令を記述した組込関数へ置き換える修正を施す（ステップＳ５２）。そして、修正した開発対象のアプリケーションプログラムを特許文献１に記載のコンパイラによりコンパイルし（ステップＳ５３ａ）、シミュレーションによるデバッグを行う（ステップＳ５３ｂ）。
【００６６】
ステップＳ５３のシミュレーション結果が”ＯＫ”でない場合、再度ステップＳ５２へ戻って、ユーザ定義命令の組込関数への置き換えからやり直す。
【００６７】
ステップＳ５３のシミュレーション結果が”ＯＫ”の場合は、修正した開発対象のアプリケーションプログラムから生成された実行形式のオブジェクトコード２が得られる（ステップＳ５５）。また、他方で、出来上がった開発対象のアプリケーションプログラムに基づいて、ユーザ定義命令のハードウェア定義の記述を行い（ステップＳ５６）、シミュレーションによるデバッグを行う（ステップＳ５７）。
【００６８】
ステップＳ５７のシミュレーション結果が”ＯＫ”でない場合、再度ステップＳ５２へ戻って、ユーザ定義命令の組込関数への置き換えからやり直すか、ステップＳ５６へ戻って、ユーザ定義命令のハードウェア定義の記述からやり直す。
【００６９】
ステップＳ５６のシミュレーション結果が”ＯＫ”の場合、出来上がったユーザ定義命令のハードウェア定義が得られる（ステップＳ５９）。
【００７０】
以上のような比較例のプログラム開発ツールに対し、次に、第３実施例におけるプログラム開発ツールについて、図１８のフローチャートに従って説明する。
【００７１】
図１８に示すように、第３実施例におけるプログラム開発ツールでは、例えば図１４（ａ）に示したような開発対象のアプリケーションプログラムを作成する（ステップＳ７１）。一方で、図１２及び図１３に示したようなユーザ定義命令のハードウェア定義の記述を行う（ステップＳ７２）。
【００７２】
そして、第２実施例で説明したコンパイラ１０を用いて、ステップＳ７１で作成した開発対象のアプリケーションプログラムをコンパイルする（ステップＳ７３ａ）。具体的には、構文解析部１２がユーザ定義命令のハードウェア定義を入力して組込関数の定義内容に変換し、変換した組込関数及び該組込関数の動作内容の定義を記号表２０に記憶する。そして、コード最適化部１６がコード生成部１５により生成された機械語が記号表２０に記憶された組込関数の動作内容と一致するか否かを判定し、一致する場合、当該機械語を組込関数の定義内容に応じた機械語に最適化する。
【００７３】
このようにしてコンパイルされた開発対象のアプリケーションプログラムについて、シミュレーションによるデバッグを行う（ステップＳ７３ｂ）。
【００７４】
ステップＳ７３のシミュレーション結果が”ＯＫ”でない場合、再度ステップＳ７２へ戻って、ユーザ定義命令のハードウェア定義の記述からやり直す。
【００７５】
ステップＳ７３のシミュレーション結果が”ＯＫ”である場合、出来上がった開発対象のアプリケーションプログラムから生成された実行形式のオブジェクトコード２が得られ（ステップＳ７６）、ユーザ定義命令のハードウェア定義も得られる（ステップＳ７５）。
【００７６】
このように、第３実施例におけるプログラム開発ツールによれば、比較例に示したプログラム開発ツールに比べて、極めて簡単な処理手順で、ユーザ定義のハードウェアを導入したプロセッサと、そのプロセッサのためのアプリケーションプログラムを設計することができる。
【００７７】
ユーザは、ソースプログラム１をプログラミングする時に、ユーザ定義のハードウェアを意識しないでプログラミングすることができる。更に、ユーザ定義のハードウェアをプロセッサの仕様に導入した後、ユーザが定義した部分に該当するプログラム記述を、組込関数に置き換える必要がないため、置き換えに伴うミスなどを防止することができ、しかも作業時間を短縮することができる。
【００７８】
以上、第１実施例〜第３実施例について詳細に説明したが、本発明は、その精神または主要な特徴から逸脱することなく、他の色々な形で実施することができる。
【００７９】
例えば、前述の各実施例では、Ｃ言語を用いて記述されたソースプログラム１をコンパイルするコンパイラ１０を例示したが、プログラミング言語はこれに限定されず、例えばＣ＋＋言語によって記述されたソースプログラムも同様にしてコンパイルできる。
【００８０】
また、前述の各実施例では、予約語”＿＿ａｓｍ”や予約語”＿＿ｒｅｇ＿ｓｒｃ”を用いてユーザ定義の組込関数を定義する例を示したが、使用するプログラミング言語に規定されている予約語以外の語句であれば、他の語句を用いてユーザ定義の組込関数を定義することができる。
【００８１】
このように、前述の各実施例はあらゆる点で単なる例示に過ぎず、限定的に解釈してはならない。本発明の範囲は、特許請求の範囲によって示すものであって、明細書本文には何ら拘束されない。更に、特許請求の範囲の均等範囲に属する変形や変更は、全て本発明の範囲内のものである。
【００８２】
【発明の効果】
本発明によれば、ソースプログラム中でユーザ定義の組み込み関数を明示的に呼び出さなくても、ユーザが定義した組込関数を用いた処理動作と同等の動作を行う命令文を、その組込関数に応じた機械語に最適化できるコンパイラ、コンパイル方法及びプログラム開発ツールを提供することができる。
【図面の簡単な説明】
【図１】本実施形態におけるコンパイラの構成を例示する概略ブロック図である。
【図２】中間コードを生成しないでコンパイルを実行するコンパイラの構成を例示する概略ブロック図である。
【図３】組込関数定義を組込関数情報ファイル３から入力してコンパイルを実行するコンパイラを例示する概略図である。
【図４】Ｃ言語を用いてユーザ定義の組込関数を記述した例を示したイメージ図であり、（ａ）は第１の定義例、（ｂ）は再定義した第２の定義例を示している。
【図５】図５（ａ）は、図４に示したユーザ定義の組込関数を明示的に呼び出す命令列の記述例を示したイメージ図であり、図５（ｂ）は、図５（ａ）に示す命令列から生成される機械語列を例示したイメージ図である。
【図６】図６（ａ）は、図４に示したユーザ定義の組込関数と同等の処理動作を実行する命令列を例示したイメージ図であり、図６（ｂ）は、図６（ａ）に示す命令列から生成される最適化前の機械語列、図６（ｃ）は最適化後の機械語列を例示したイメージ図である。
【図７】第１実施例のコンパイラにおける構文解析部による処理手順例を示すフローチャートである。
【図８】図８に示した構文解析部の処理により作成される記号表の一例を示す図である。
【図９】第１実施例のコンパイラにおけるコード最適化部による処理手順例を示すフローチャートである。
【図１０】第１実施例のコンパイラがコンパイルするソースプログラムの記述例を示すイメージ図である。
【図１１】図１０に示すソースプログラムを第１実施例のコンパイラがコンパイルした結果生成されるオブジェクトコードの例を示すイメージ図である。
【図１２】ハードウェア記述言語（ＶｅｒｉｌｏｇＨＤＬ）を用いてユーザ定義の組込関数を記述した例を示したイメージ図である。
【図１３】ハードウェア記述言語（ＶｅｒｉｌｏｇＨＤＬ）を用いてユーザ定義の組込関数を記述した例を示したイメージ図である。
【図１４】（ａ）は第２実施例のコンパイラがコンパイルするソースプログラムの記述例を示し、（ｂ）はコンパイルの結果生成されるオブジェクトコードの例を示すイメージ図である。
【図１５】第２実施例のコンパイラにおける構文解析部による処理手順例を示すフローチャートである。
【図１６】図１４に示した構文解析部の処理により作成される記号表の一例を示す図である。
【図１７】比較例におけるプログラム開発ツールの処理手順例を示すフローチャートである。
【図１８】第３実施例におけるプログラム開発ツールの処理手順例を示すフローチャートである。
【図１９】（ａ）は一般的なソースプログラムの記述例を示し、（ｂ）はコンパイルの結果生成されるオブジェクトコードの例を示すイメージ図である。
【符号の説明】
１，１ａ…ソースプログラム
２…オブジェクトコード
３…組込関数情報ファイル
１０，１０ａ…コンパイラ
１１，１１ａ…字句解析部
１２，１２ａ…構文解析部
１３…中間コード生成部
１４…中間コード最適化部
１５，１５ａ…コード生成部
１６，１６ａ…コード最適化部
１７，１７ａ…コード出力部
２０，２０ａ…記号表
２１…ハッシュテーブル
２２１，２２２…定義テーブル
２３１，２２２…動作定義内容
【図１】
2004295398.tif 000003
【図２】
2004295398.tif 000004
【図３】
2004295398.tif 000005
【図４】
2004295398.tif 000006
【図５】
2004295398.tif 000007
【図６】
2004295398.tif 000008
【図７】
2004295398.tif 000009
【図８】
2004295398.tif 000010
【図９】
2004295398.tif 000011
【図１０】
2004295398.tif 000012
【図１１】
2004295398.tif 000013
【図１２】
2004295398.tif 000014
【図１３】
2004295398.tif 000015
【図１４】
2004295398.tif 000016
【図１５】
2004295398.tif 000017
【図１６】
2004295398.tif 000018
【図１７】
2004295398.tif 000019
【図１８】
2004295398.tif 000020
【図１９】
2004295398.tif 000021
【手続補正書】
【提出日】平成16年4月28日(2004.4.28)
【手続補正１】
【補正対象書類名】明細書
【補正対象項目名】特許請求の範囲
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
入力したソースプログラムからオブジェクトコードを生成するコンパイラであって、
前記ソースプログラム内に記述された命令について文法規則への適合性を解析し、前記命令の組み合わせが組込関数及び該組込関数の動作内容を定義しているか否かを解析する構文解析部と、
前記構文解析部で解析された前記組込関数及び該組込関数の動作内容の定義を記憶する組込関数定義記憶部と、
前記構文解析部の処理結果に基づいて、前記ソースプログラムから機械語を生成するコード生成部と、
前記コード生成部により生成された前記機械語が前記組込関数定義記憶部に記憶されている前記組込関数の動作内容と一致する場合、当該機械語を前記組込関数の動作内容に応じた機械語に最適化するコード最適化部と
を備えることを特徴とするコンパイラ。
【請求項２】
前記ソースプログラム内に記述された命令をトークンに分割する字句解析部を備え、
前記構文解析部は、前記トークンについて文法規則への適合性を解析し、前記トークンの組み合わせが前記組込関数及び該組込関数の動作内容を定義しているか否かを解析することを特徴とする請求項１に記載のコンパイラ。
【請求項３】
入力したソースプログラムからオブジェクトコードを生成するコンパイラによるコンパイル方法であって、
前記ソースプログラム内に記述された命令の文法規則への適合性を解析し、前記命令の組み合わせが組込関数及び該組込関数の動作内容を定義しているか否かを構文解析部が解析する段階と、
前記構文解析部により解析された前記組込関数及び該組込関数の動作内容の定義を組込関数定義記憶部に記憶する段階と、
前記構文解析部の処理結果に基づいて、コード生成部が前記ソースプログラムから機械語を生成する段階と、
前記コード生成部により生成された前記機械語が前記組込関数定義記憶部に記憶された前記組込関数の動作内容と一致する場合、コード最適化部が当該機械語を前記組込関数の動作内容に応じた機械語に最適化する段階と
を含むことを特徴とするコンパイル方法。
【請求項４】
前記ソースプログラム内に記述された命令を字句解析部がトークンに分割する段階を含み、
前記構文解析部による解析段階において、前記トークンについて文法規則への適合性を解析し、前記トークンの組み合わせが前記組込関数及び該組込関数の動作内容を定義しているか否かを解析することを特徴とする請求項３に記載のコンパイル方法。
【請求項５】
ユーザ定義のハードウェアを導入したプロセッサのためのアプリケーションプログラムを設計するためのプログラム開発ツールであって、
前記アプリケーションプログラム内に記述された命令をトークンに分割する字句解析部と、前記トークンについて文法規則への適合性を解析し、ユーザ定義命令のハードウェア定義を入力して組込関数及び該組込関数の動作内容の定義に変換する構文解析部と、前記構文解析部で変換された前記組込関数及び該組込関数の動作内容の定義を記憶する組込関数定義記憶部と、前記字句解析部及び前記構文解析部の処理結果に基づいて、前記アプリケーションプログラムから機械語を生成するコード生成部と、前記コード生成部により生成された前記機械語が前記組込関数定義記憶部に記憶されている前記組込関数の動作内容と一致する場合、当該機械語を前記組込関数の動作内容に応じた機械語に最適化するコード最適化部とを含むコンパイラと、
前記コンパイラによりコンパイルされた前記アプリケーションプログラムをデバッグするシミュレータと
を備えることを特徴とするプログラム開発ツール。