(57)【要約】【課題】  拡張可能なプロセッサの性能を十分に活かし、且つ効率的にプログラムを開発可能なプログラム開発装置を提供する。【解決手段】  ソースプログラム中の最適化対象となるプログラム記述を定義した動作定義と、最適化後の命令列を記述したインライン節とを含む複合組込関数をソースプログラムの一部として記憶するソースプログラム記憶領域６０と、複合組込関数をソースプログラム記憶領域から読み出し、複合組込関数を構文解析して動作定義及びインライン節を検出する解析部１２と、ソースプログラム中の動作定義に一致するプログラム記述をインライン節中の命令列に最適化し、ソースプログラムからオブジェクトコードを生成するコード生成部１３ａとを備える。【選択図】  図１
2006243838.tif 000002
【特許請求の範囲】
【請求項１】
ソースプログラム中の最適化対象となるプログラム記述を定義した動作定義と、前記最適化後の命令列を記述したインライン節とを含む複合組込関数を前記ソースプログラムの一部として記憶するソースプログラム記憶領域と、
前記複合組込関数を前記ソースプログラム記憶領域から読み出し、前記複合組込関数を構文解析して前記動作定義及び前記インライン節を検出する解析部と、
前記ソースプログラム中の前記動作定義に一致するプログラム記述を前記インライン節中の命令列に最適化し、前記ソースプログラムからオブジェクトコードを生成するコード生成部
とを備えることを特徴とするプログラム開発装置。
【請求項２】
前記コード生成部は、前記最適化に使用した前記複合組込関数の履歴を作成し、前記履歴に存在する前記複合組込関数を優先的に使用することを特徴とする請求項１に記載のプログラム開発装置。
【請求項３】
前記コード生成部は、前記オブジェクトコードにデバッグ情報を選択的に付加することを特徴とする請求項１又は２に記載のプログラム開発装置。
【請求項４】
前記ソースプログラムからデータフローグラフを作成し、前記データフローグラフに基づいて前記ソースプログラム中の並列実行可能な命令を検出する並列化命令検出部と、
前記並列実行可能な命令から、ＶＬＩＷ型のコプロセッサに実行させるコプロセッサ命令を含むＶＬＩＷ命令を定義するＶＬＩＷ命令定義部と、
前記ＶＬＩＷ命令を前記インライン節中の命令列として記述し、前記ソースプログラム中の前記ＶＬＩＷ命令への最適化対象となるプログラム記述を前記動作定義として定義して前記複合組込関数を生成する複合組込関数生成部
とを更に備えることを特徴とする請求項１〜３のいずれか１項に記載のプログラム開発装置。
【請求項５】
前記並列化命令検出部は、前記コプロセッサの並列実行可能な命令数に応じて、前記並列化命令検出部が検出した前記並列実行可能な命令を前記コプロセッサ命令とするか否か判定することを特徴とする請求項４に記載のプログラム開発装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ユーザがプロセッサ・アーキテクチャ及び命令セット等の仕様を拡張可能なプロセッサに実行させるアプリケーション・プログラムの開発に用いられるプログラム開発装置に関する。
【背景技術】
【０００２】
近年、ユーザがプロセッサ・アーキテクチャ及び命令セット等の仕様を拡張可能なプロセッサが発表されてきている（例えば、特許文献１参照。）。拡張可能なプロセッサを使えば、アプリケーションに適した命令セットを構成でき、且つプロセッサの処理速度を向上させることができる。よって、アプリケーション実行の性能向上に非常に効果的である。一方、高級言語で記述されたプログラムをオブジェクトコード（機械語）に変換するコンパイラは、プロセッサ・アーキテクチャ毎に用意される。したがって、拡張可能なプロセッサには、ユーザ仕様に対応したコンパイラが必要となる。
【０００３】
拡張可能なプロセッサ特有の命令記述をコンパイルさせるための第１の背景技術として、ユーザが定義した組込関数を使用する手法が知られている（例えば、特許文献２参照）。第２の背景技術として、組込関数を明示的に呼び出さなくても、組込関数を用いた処理動作と同等の処理動作を行うプログラム記述を、組込関数に応じた機械語に最適化可能な手法が提案されている（例えば、特許文献３参照。）。
【０００４】
しかしながら、上述した第２の背景技術においては、組込関数を用いた処理動作と同等の処理動作を行う命令文をコンパイラが検出し、検出結果を１命令に置き換えることはできるが、複数の命令に置き換えることができない。ソースプログラムを書き換えることで対応可能であるが、移植性を維持しようとすると可読性の低いプログラムになる恐れがある。したがって、拡張可能なプロセッサの性能を十分に活かし、且つ効率的にプログラム開発を進めることができなかった。
【特許文献１】特開２００３−３２３４６３号公報
【特許文献２】特開２００２−２４０２９号公報
【特許文献３】特開２００４−２９５３９８号公報
【特許文献４】特開２００４−２４０９９９号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
本発明は、拡張可能なプロセッサの性能を十分に活かし、且つ効率的にプログラムを開発可能なプログラム開発装置を提供する。
【課題を解決するための手段】
【０００６】
本発明の一態様は、（イ）ソースプログラム中の最適化対象となるプログラム記述を定義した動作定義と、最適化後の命令列を記述したインライン節とを含む複合組込関数をソースプログラムの一部として記憶するソースプログラム記憶領域と、（ロ）複合組込関数をソースプログラム記憶領域から読み出し、複合組込関数を構文解析して動作定義及びインライン節を検出する解析部と、（ハ）ソースプログラム中の動作定義に一致するプログラム記述をインライン節中の命令列に最適化し、ソースプログラムからオブジェクトコードを生成するコード生成部とを備えるプログラム開発装置であることを要旨とする。
【発明の効果】
【０００７】
本発明によれば、拡張可能なプロセッサの性能を十分に活かし、且つ効率的にプログラムを開発可能なプログラム開発装置を提供できる。
【発明を実施するための最良の形態】
【０００８】
次に、図面を参照して、本発明の第１及び第２実施形態を説明する。以下の第１及び第２実施形態における図面の記載において、同一又は類似の部分には同一又は類似の符号を付している。
【０００９】
（第１実施形態）
本発明の第１実施形態に係るプログラム開発装置は、図１に示すように、中央演算処理装置（ＣＰＵ）１ａ、入力装置２、出力装置３、主記憶装置４、補助記憶装置５、及び記憶装置６等を備える。ＣＰＵ１ａは、Ｃ言語等の高級言語で記述されたソースプログラムをオブジェクトコード（機械語）に翻訳するコンパイラ１０ａの機能を実現する。以下の説明においては、ソースプログラムがＣ言語で記述されている場合を例に説明する。また、コンパイラ１０ａは、解析部１２及びコード生成部１３ａを備える。更に、記憶装置６には、例えば、ソースプログラム記憶領域６０、組込関数定義記憶領域６２、複合組込関数定義記憶領域６３、及びオブジェクトコード記憶領域６４等が備えられる。ソースプログラム記憶領域６０には、ソースプログラム中の最適化対象となるプログラム記述を定義した動作定義と、最適化後の命令列を記述したインライン節とを含む複合組込関数がソースプログラムの一部として記憶される。コンパイラ１０ａの解析部１２は、複合組込関数をソースプログラム記憶領域６０から読み出し、複合組込関数を構文解析して動作定義及びインライン節を検出する。コンパイラ１０ａのコード生成部１３ａは、ソースプログラム中の動作定義に一致するプログラム記述をインライン節中の命令列に最適化し、ソースプログラムからオブジェクトコードを生成する。
【００１０】
また、ソースプログラム記憶領域６０には、ソースプログラムと、ユーザ定義の組込関数又は複合組込関数、或いは組込関数及び複合組込関数の両方とが予め格納される。組込関数及び複合組込関数は、ソースプログラムのヘッダファイルとして格納される。ここで、複合組込関数は、図２（ａ）に示すような形式（文法）で記述される。これに対して組込関数は、図２（ｂ）に示すような形式で記述される。図２（ａ）に示す複合組込関数に関しては、関数修飾子として“＿ＡＳＭ”を指定可能にしている点と、関数本体にインライン節を指定する点が図２（ｂ）に示す組込関数と異なる。
【００１１】
図１に示すコード生成部１３ａは、図２（ａ）に示す動作定義に一致するプログラム記述がソースプログラム中に検出された場合に、動作定義に一致するプログラム記述をインライン節中の命令列、即ち図２（ｃ）に示す「文の並び」に最適化する。よって、ソースプログラムにおける動作定義に一致するプログラム記述を複数の命令に最適化可能である。尚、インライン節は、図２（ｃ）に示すような形式で記述される。動作定義は、図２（ｄ）に示すような形式で記述される。
【００１２】
これに対してコード生成部１３ａは、図２（ｂ）に示す組込関数の動作定義に一致するプログラム記述がソースプログラム中に検出された場合、動作定義に一致するプログラム記述を組込関数名（宣言子）に最適化する。この結果、ソースプログラムにおける動作定義に一致するプログラム記述が、１つのユーザ定義命令に最適化される。
【００１３】
また、図１に示す組込関数定義記憶領域６２には、解析部１２が検出した組込関数の関数名及び組込関数の動作定義等が格納される。複合組込関数定義記憶領域６３には、解析部１２が検出した複合組込関数のインライン節中の命令列及び複合組込関数の動作定義等が格納される。オブジェクトコード記憶領域６４には、コード生成部１３ａが生成したオブジェクトコードが格納される。
【００１４】
更に、図１に示すプログラム開発装置は、図３に示すようなプロセッサ７０をターゲット・ハードウェアとする。図３に示すプロセッサ７０は、例えば、プロセッサコア７１０、拡張部７２０、制御バス７３０、及びデータバス７４０等を備える。図１に示すプログラム開発装置が開発したアプリケーション・プログラム（ファームウェア）は、プロセッサ７０の外部のプログラムメモリ（図示省略）に格納される。プロセッサコア７１０は、プログラムメモリからアプリケーション・プログラムを読み出す。読み出されたアプリケーション・プログラムは、プロセッサコア７１０の内部の命令ＲＡＭ７１１に一旦格納される。
【００１５】
プログラムメモリに格納されたアプリケーション・プログラムにおいて、図１に示すコード生成部１３ａが組込関数又は複合組込関数を使用して最適化した１命令又は複数命令からなる命令列は、命令ＲＡＭ７１１から拡張部７２０に転送されて、拡張部７２０により実行される。拡張部７２０には、目標性能及び処理内容等に応じて、ユーザ・カスタム命令（ＵＣＩ）ユニット７２１、デジタル・シグナル・プロセッサ（ＤＳＰ）７２２、又はコプロセッサ７２３等、或いはこれらの組合せが実装される。尚、プロセッサコア７１０は、命令ＲＡＭ７１１に加えて、命令デコーダ７１２、算術演算ユニット（ＡＬＵ）７１３、及びデータＲＡＭ７１４等を備える。
【００１６】
拡張部７２０にＵＣＩユニット７２１が実装される場合、図１に示すソースプログラム記憶領域６０に格納されたソースプログラム中のＵＣＩユニット７２１に実行させたいプログラム記述を、例えば、図２（ｂ）に示す組込関数の動作定義として定義した組込関数をソースプログラム記憶領域６０に格納すれば良い。この結果、コンパイラ１０ａは、ソースプログラムをオブジェクトコードに変換すると共に、ＵＣＩユニット７２１に実行させる命令を選択的に生成する。ＵＣＩユニット７２１に実行させる命令は、実行時において、プロセッサコア７１０の命令ＲＡＭ７１１に一旦格納されてＵＣＩユニット７２１に転送される。
【００１７】
更に、拡張部７２０にＤＳＰ７２２又はコプロセッサ７２３が実装される場合、ソースプログラム中のＤＳＰ７２２又はコプロセッサ７２３に実行させたいプログラム記述を、例えば、図２（ａ）に示す組込関数の動作定義として定義し、ＤＳＰ７２２又はコプロセッサ７２３向けの命令列をインライン節に記述した複合組込関数をソースプログラムの一部としてソースプログラム記憶領域６０に格納すれば良い。この結果、コンパイラ１０ａは、ソースプログラムをオブジェクトコードに変換すると共に、ＤＳＰ７２２又はコプロセッサ７２３に実行させる命令列を選択的に自動生成する。ＤＳＰ７２２又はコプロセッサ７２３に実行させる命令列は、実行時において、プロセッサコア７１０の命令ＲＡＭ７１１に一旦格納されてＤＳＰ７２２又はコプロセッサ７２３にそれぞれ転送される。
【００１８】
このように、拡張部７２０がプロセッサコア７１０の負担を軽減することで、プロセッサ７０全体の処理速度を向上させることを可能としている。更に、拡張部７２０の構成を追加・変更した場合、複合組込関数及び組込関数を追加・変更することで対応可能であり、ソースプログラムを書き換える必要がない。よって、ソースプログラムの可読性を維持できる。更に、拡張部７２０の構成の追加・変更に伴うプログラム開発期間の増加を回避できる。
【００１９】
また、図１に示す解析部１２は、字句解析部１２１及び構文解析部１２２を備える。字句解析部１２１は、例えば、ソースプログラム記憶領域６０から組込関数及び複合組込関数を含むヘッダファイルと、ソースプログラムとを読み出す。解析部１２は、ソースプログラム及びヘッダファイルを意味のある最小の単位であるトークン（token）に分割する。「トークン」の代表例は、プログラミング言語のキーワード、演算子、変数名、定数、区切り記号等である。
【００２０】
構文解析部１２２は、変数名や記号などのトークンに分割された命令について、プログラミング言語で定められた文法規則に適合しているか否かをチェックする。また、構文解析部１２２は、トークンに分割された命令又はこれら命令の組合せから、組込関数又は複合組込関数を検出する。組込関数が検出された場合、組込関数の関数名及び動作定義等が組込関数定義記憶領域６２に格納される。複合組込関数が検出された場合、複合組込関数のインライン節及び動作定義等が複合組込関数定義記憶領域６３に格納される。
【００２１】
一例として、構文解析部１２２は、ソースプログラム記憶領域６０に図４（ａ）に示す組込関数が含まれる場合、動作定義“a = (a + 10) | b”、及び組込関数の関数名“ｕｃｉ”等の定義を組込関数定義記憶領域６２に格納する。一方、構文解析部１２２は、ソースプログラム記憶領域６０に図５（ａ）に示す複合組込関数が含まれる場合、動作定義“R3 = ((R1 << 1) | (R2 >> 1)) + 10”、及びインライン節中の命令列“dsp1(R1,R2)  dsp2(0)  dsp3(R3)”等の定義を複合組込関数定義記憶領域６３に格納する。尚、図５（ａ）に示すインライン節中の命令列“dsp1(R1,R2)  dsp2(0)  dsp3(R3)”は、例えば、図３に示すＤＳＰ７２２により実行される。
【００２２】
更に、図１に示すコード生成部１３ａは、中間コード生成部１３１、中間コード最適化部１３２、オブジェクトコード生成部１３３ａ、オブジェクトコード最適化部１３４ａ、及びオブジェクトコード出力部１３５を備える。中間コード生成部１３１は、構文解析後のソースプログラムを、ソースプログラムと等価であり、且つ簡潔な記述である中間コードに変換する。尚、中間コードは、構文解析の直後にオブジェクトコードを生成した場合に生成されるプログラムのサイズが大きくなり、変換処理が効率よく行われない場合があるために生成される。
【００２３】
また、中間コード生成部１３１は、図４（ｂ）に示すように、組込関数定義記憶領域６２に格納された組込関数の動作定義及び組込関数の関数名を中間コードに変換する。この結果、組込関数名の中間コードＡ１及び動作定義の中間コードＡ２が生成される。
【００２４】
同様に、中間コード生成部１３１は、図５（ｂ）に示すように、複合組込関数定義記憶領域６３に格納された複合組込関数の動作定義及びインライン節中の命令列を中間コードに変換する。この結果、インライン節中の命令列の中間コードＢ１及び動作定義の中間コードＢ２が生成される。
【００２５】
図４（ｂ）及び５（ｂ）に示すように、組込関数の関数名及び複合組込関数のインライン節は、動作定義への仮想の分岐命令“COMPLEX_INLINE_START”と、関数名及びインライン節の終了であることを意味する命令“COMPLEX_INLINE_END”により挟まれる。インライン節の終了であることを意味する命令“COMPLEX_INLINE_END”の直後に、“COMPLEX_INLINE_END”に無条件分岐する命令を置くことにより、データフロー解析を行う場合に、インライン節と動作定義を完全に分離できる。したがって、オペランドの属性と定義内容に矛盾があるか否かのチェックを一回のパスで行うことができる。
【００２６】
また、中間コード生成部１３１は、図１に示すように一致判定部１３２１及び最適化部１３２２を備える。一致判定部１３２１は、組込関数又は複合組込関数の動作定義と一致する中間コードを検出する。組込関数の動作定義と一致する中間コードが検出された場合、最適化部１３２２は、組込関数の動作定義と一致する中間コードを組込関数の関数名に最適化する。これに対して複合組込関数の動作定義と一致する中間コードが検出された場合、最適化部１３２２は、複合組込関数の動作定義と一致する中間コードをインライン節中の命令列に最適化する。
【００２７】
例えば、図６に示すソースプログラムに基づいて図７に示す中間コードが生成されている場合、一致判定部１３２１は、図５（ｂ）に示す動作定義の中間コードＢ２のオペランド“Ｐ０”，“Ｐ１”，及び“Ｐ２”と、図７の変数“Ｔ１”，“Ｔ１０”，及び“Ｔ５”とを対応させることにより、図５（ｂ）に示す動作定義の中間コードＢ２と図７の中間コードＣ１が一致すると判定する。
【００２８】
一致判定部１３２１が、図５（ｂ）に示す動作定義の中間コードＢ２と図７の中間コードＣ１が一致すると判定すると、最適化部１３２２は、図７の中間コードＣ１を図５（ｂ）に示すインライン節の中間コードＢ１に置換すると共に、図５（ｂ）に示す動作定義の中間コードＢ２の“Ｐ０”，“Ｐ１”，及び“Ｐ２”に対して“Ｔ１”，“Ｔ１０”，及び“Ｔ５”をそれぞれ代入する。この結果、図８に示すように、最適化後の中間コードＤ１が生成される。
【００２９】
図１に示すオブジェクトコード生成部１３３ａは、最適化された中間コードからオブジェクトコードを生成する。詳細には、オブジェクトコード生成部１３３は、それまでに行われたソースプログラムの最小単位への分割、構文エラーのチェックなどの結果を受けて、コード・ジェネレータの機能を用いて中間コードをオブジェクトコードに変換する。
【００３０】
オブジェクトコード最適化部１３４ａは、オブジェクトコード生成部１３３ａにより生成されたオブジェクトコードに、実際の処理効率を向上させるための変更を加える。オブジェクトコード出力部１３５は、オブジェクトコードをオブジェクトコード記憶領域６４に出力（格納）する。
【００３１】
図７に示す中間コードから生成されるオブジェクトコードは、図９に示すような記述になる。これに対して、図８に示す中間コードから生成されるオブジェクトコードは、図１０に示すような記述になる。図９に示す５命令からなる命令列Ｅ１は、図１０に示すように、３命令からなる命令列Ｆ１に最適化されている。
【００３２】
また、組込関数を利用する場合は、ソースプログラム中に、動作定義“R3 = ((R1 << 1) | (R2 >> 1)) + 10”を検出した場合、１命令に置き換えるだけであるが、複合組込関数を利用することにより、３命令からなる命令列“dsp1(R1,R2)  dsp2(0)  dsp3(R3)”に置き換え可能となる。
【００３３】
尚、図１に示す自動設計装置は、図示を省略するデータベース制御装置及び入出力制御装置を備える。データベース制御装置は、記憶装置６に対するファイルの格納場所の検索、及びデータの読み出し・書き込みを行う。これに対して入出力制御装置は、入力装置２からのデータを受け取り、ＣＰＵ１ａに伝達する。即ち入出力制御装置は、入力装置２、出力装置３、或いはＣＤ−ＲＯＭ、及びフレキシブルディスク等の補助記憶装置５の読取装置等をＣＰＵ１ａに接続するインターフェイスである。データの流れから見ると、入出力制御装置は、入力装置２、出力装置３、補助記憶装置５、及び外部記憶装置の読取装置と主記憶装置４とのインターフェイスとなる。また入出力制御装置は、ＣＰＵ１ａからのデータを受け取り、出力装置３及び補助記憶装置５等へ伝達する。
【００３４】
更に、図に示す入力装置２としては、例えば、キーボード、マウス、光学式文字読取装置（ＯＣＲ）等の認識装置、イメージスキャナ等の図形入力装置、及び音声認識装置等の特殊入力装置が使用できる。出力装置３としては、例えば、液晶ディスプレイ、ＣＲＴディスプレイ等の表示装置、インクジェットプリンタ、レーザープリンタなどの印刷装置が使用できる。主記憶装置４には、ＲＯＭ及びＲＡＭが組込まれている。ＲＯＭは、ＣＰＵ１ａにおいて実行されるプログラムを格納するプログラム記憶装置等として機能する。これに対してＲＡＭは、ＣＰＵ１ａにおけるプログラム実行処理中に利用されるデータ等を一時的に格納したり、作業領域として利用される一時的なデータメモリ等として機能する。
【００３５】
次に、図１１に示すフローチャートを参照して、第１実施形態に係るプログラム開発装置の処理手順例を説明する。
【００３６】
（Ａ）ステップＳ００において、図１に示す字句解析部１２１は、ソースプログラム記憶領域６０からソースプログラム及びヘッダファイルを読み出す。
【００３７】
（Ｂ）ステップＳ０１において、字句解析部１２１は、ソースプログラム及びヘッダファイルに対して字句解析を行う。
【００３８】
（Ｃ）ステップＳ０２において、構文解析部１２２は、字句解析部１２１の処理結果に対して構文解析を行う。この結果、組込関数の関数名及び動作定義等が検出され、複合組込関数のインライン節中の命令列及び動作定義等が検出される。構文解析部１２２は、組込関数の関数名及び動作定義等を組込関数定義記憶領域６２に格納し、複合組込関数のインライン節中の命令列及び動作定義等を複合組込関数定義記憶領域６３に格納する。構文解析部１２２の詳細な処理手順については後述する。
【００３９】
（Ｄ）ステップＳ０３において、中間コード生成部１３１は、構文解析後のソースプログラムを中間コードに変換する。また、中間コード生成部１３１は、組込関数定義記憶領域６２から組込関数の関数名及び動作定義等を読み出して中間コードに変換する。同様に、中間コード生成部１３１は、複合組込関数定義記憶領域６３から複合組込関数のインライン節中の命令列及び動作定義等を読み出して中間コードに変換する。
【００４０】
（Ｅ）ステップＳ０４において、中間コード最適化部１３２は、ステップＳ０３で生成されたソースプログラムについての中間コードに対して、組込関数及び複合組込関数についての中間コードを用いた最適化を行う。中間コード最適化部１３２の詳細な処理手順については後述する。
【００４１】
（Ｆ）ステップＳ０５において、オブジェクトコード生成部１３３ａは、最適化後の中間コードをオブジェクトコードに変換する。
【００４２】
（Ｇ）ステップＳ０６において、オブジェクトコード最適化部１３４ａは、ステップＳ０５で生成されたオブジェクトコードを最適化する。
【００４３】
（Ｈ）ステップＳ０７において、オブジェクトコード出力部１３５は、最適化されたオブジェクトコードをオブジェクトコード記憶領域６４に格納する。
【００４４】
次に、図１２に示すフローチャートを参照して、構文解析処理の詳細な処理手順例を説明する。
【００４５】
（ａ１）ステップＳ２１において、構文解析部１２２は、入力されたトークンが関数宣言であるか否かを判定する。関数宣言であると判定された場合、ステップＳ２３に進む。関数宣言でないと判定された場合、ステップＳ２２へ進み、構文解析部１２２は通常の構文解析処理を行う。
【００４６】
（ａ２）ステップＳ２３において、構文解析部１２２は、関数宣言が組込関数又は複合組込関数の宣言であるか否か判定する。図２に示す例においては、関数宣言に独自の予約語“＿ａｓｍ”又は“＿ＡＳＭ”が付加されている場合、ユーザ定義の組込関数又は複合組込関数であると判断し、ステップＳ２５に進む。予約語“＿ａｓｍ”又は“＿ＡＳＭ”が付加されていなければ、ステップＳ２４に進み、通常の関数宣言処理が行われる。
【００４７】
（ａ３）ステップＳ２５において、構文解析部１２２は、組込関数又は複合組込関数の宣言が、プロトタイプ宣言であるか、或いは関数定義であるのかを判定する。ここで、「プロトタイプ宣言」とはユーザ定義の組込関数のうち、仮引数の型情報や識別子の名前の定義のみで、動作定義を持たない組込関数又は複合組込関数の宣言をいう。プロトタイプ宣言であると判定された場合、ステップＳ２６に進む。関数定義であると判断された場合、ステップＳ３０に進む。
【００４８】
（ａ４）ステップＳ２６において、構文解析部１２２は、組込関数又は複合組込関数の仮引数の型情報や識別子の名前の解釈を行い、仮引数の型情報や識別子の名前の指定方法に誤りがあるか否かを判定する。判定の結果、仮引数の型情報や識別子の名前の指定方法に誤りがなければ、ステップＳ２７においてユーザ定義の組込関数又は複合組込関数の定義内容を組込関数定義記憶領域６２又は複合組込関数定義記憶領域６３に格納する。一方、仮引数の型情報や識別子の名前の指定方法に誤りがあれば、ステップＳ２８においてエラーメッセージを出力する。
【００４９】
（ａ５）ステップＳ３０において、構文解析部１２２は、組込関数又は複合組込関数の仮引数の型情報や識別子の名前の解釈を行い、仮引数の型情報や識別子の名前の指定方法に誤りがあるか否か、組込関数又は複合組込関数の動作定義に文法的な誤りがあるか否かを判定する。判定の結果、仮引数の型情報や識別子の名前の指定方法や動作定義に誤りがある場合、ステップＳ２８においてエラーメッセージを出力する。仮引数の型情報や識別子の名前の指定方法や動作定義に誤りがない場合、ステップＳ３１に進む。
【００５０】
（ａ６）ステップＳ３１において、構文解析部１２２は、関数定義が、組込関数の関数定義であるか、複合組込関数の関数定義であるか判定する。図２に示す例においては、予約語“＿ａｓｍ”が付加されている場合、ステップＳ３３に進み、組込関数の関数名及び動作定義が組込関数定義記憶領域６２に格納される。予約語“＿ＡＳＭ”が付加されている場合、ステップＳ３２に進む。
【００５１】
（ａ７）ステップＳ３２において、構文解析部１２２は、複合組込関数のインライン節の記述に誤りがあるか否か判定する。インライン節の記述に誤りがあると判定された場合、ステップＳ２８に進み、エラーメッセージが出力される。インライン節の記述に誤りがないと判定された場合、ステップＳ３４に進み、複合組込関数のインライン節中の命令列及び動作定義が複合組込関数定義記憶領域６３に格納される。
【００５２】
（ａ８）ステップＳ２２、Ｓ２４、Ｓ２７、Ｓ３３、又はＳ３４の後のステップＳ２９においては、すべてのトークンについて構文解析が終了したか否か判定される。すべてのトークンについて構文解析が終了したと判定された場合、構文解析処理が終了する。すべてのトークンについて構文解析が終了していないと判定された場合、ステップＳ２１に処理が戻る。
【００５３】
次に、図１３に示すフローチャートを参照して、中間コード最適化処理の詳細な処理手順例を説明する。
【００５４】
（ｂ１）ステップＳ４１において、中間コード最適化部１３２は、中間コード生成部１３１が生成した中間コードが、組込関数の明示的呼び出しか否か判定する。ここで、「明示的呼び出し」とは、図４（ａ）に示す組込関数例においては、ソースプログラム中に、直接“ｕｃｉ”が記述されている場合等を意味する。組込関数の明示的呼び出しであると判定された場合、ステップＳ４３に進む。組込関数の明示的呼び出しでないと判定された場合、ステップＳ４２に進む。
【００５５】
（ｂ２）ステップＳ４２において、中間コード最適化部１３２の一致判定部１３２１は、中間コードの組合せが、組込関数又は複合組込関数の動作定義と一致するか否か判定する。中間コードの組合せが組込関数又は複合組込関数の動作定義と一致すると判定された場合、ステップＳ４４に進む。中間コードの組合せが組込関数又は複合組込関数の動作定義と一致しないと判定された場合、ステップＳ４６に進み、通常の中間コードとして処理される。
【００５６】
（ｂ３）ステップＳ４４において、組込関数又は複合組込関数の動作定義と一致すると判定された中間コードの組合せが、複合組込関数の動作定義であるか否か判定される。複合組込関数の動作定義であると判定された場合、ステップＳ４５に進み、最適化部１３２２により対応するインライン節の命令列（中間コード）に最適化される。複合組込関数の動作定義でない、即ち組込関数であると判定された場合、ステップＳ４３に進み、最適化部１３２２により組込関数の中間コードに最適化される。
【００５７】
（ｂ４）ステップＳ４３、Ｓ４５、又はＳ４６の後のステップＳ４７において、中間コード最適化部１３２は、すべての中間コードについて最適化処理が終了したか否か判定する。すべての中間コードについて最適化処理が終了したと判定された場合、中間コード最適化処理が終了する。すべての中間コードについて最適化処理が終了していないと判定された場合、ステップＳ４１に処理が戻る。
【００５８】
このように、第１実施形態によれば、ソースプログラムを書き換えることなく、ターゲット・ハードウェアに最適なオブジェクトコードを生成できる。即ち、コンパイルの過程において、ソースプログラムを、ターゲット・ハードウェアに依存した特定の命令列を含む別のソースプログラムに置換する最適化が可能となる。したがって、ソースプログラム中の特定のプログラム記述を１命令に置き換えるだけでなく、複数命令からなる命令列に置き換えることができる。
【００５９】
（第１実施形態の第１変形例）
本発明の第１実施形態の第１変形例として図１４に示すように、プログラム開発装置が、中間コードを生成せずに、ソースプログラムから直接オブジェクトコードを生成する構成でも良い。
【００６０】
オブジェクトコード生成部１３３ｂは、構文解析後のソースプログラムをオブジェクトコードに変換する。オブジェクトコード最適化部１３４ｂは、生成されたオブジェクトコードに対して、組込関数及び複合組込関数を用いた最適化を行う。その他の構成については、図１と同様である。また、図１４に示すプログラム開発装置は図１５に示すように、図１１に示した中間コード生成処理（ステップＳ０３）及び中間コード最適化処理（ステップＳ０４）を実行しない。
【００６１】
図１４に示すオブジェクトコード最適化部１３４ｂは、図１６に示すように、オブジェクトコード（機械語）について組込関数又は複合組込関数との一致判定を行う。具体的には、オブジェクトコード最適化部１３４ｂの一致判定部１３４１は、図１６のステップＳ６２において、組込関数又は複合組込関数の動作定義と一致する機械語列を検出する。
【００６２】
オブジェクトコード最適化部１３４ｂの最適化部１３４２は、組込関数の動作定義と一致する機械語列が検出された場合、図１６のステップＳ６３において、組込関数の動作定義と一致する機械語列を組込関数の関数名に最適化する。これに対して複合組込関数の動作定義と一致する機械語列が検出された場合、最適化部１３４２は、図１６のステップＳ６５において、複合組込関数の動作定義と一致する機械語列をインライン節中の命令列に最適化する。その他の処理については、図１３と同様である。
【００６３】
第１実施形態の第１変形例に係るプログラム開発装置によれば、中間コードを生成しないので、コンパイラ１０ｂの構成を簡略化できる。
【００６４】
（第１実施形態の第２変形例）
本発明の第１実施形態の第２変形例として図１７に示すように、図１に示した中間コード最適化部１３２が、最適化に使用した複合組込関数の履歴を作成し、履歴に存在する複合組込関数を優先的に使用しても良い。また、複合組込関数だけでなく、最適化に使用した組込関数の履歴を作成し、履歴に存在する組込関数を優先的に使用しても良い。尚、最適化に使用した複合組込関数の履歴は、例えば図１に示す複合組込関数定義記憶領域６３に格納される。最適化に使用した組込関数の履歴は、例えば組込関数定義記憶領域６２に格納される。
【００６５】
即ち、中間コード最適化部１３２は、図１７のステップＳ４００において、中間コードの組合せが、履歴に存在する組込関数又は複合組込関数の動作定義と一致するか否か判定する。履歴中の組込関数又は複合組込関数の動作定義と一致しないと判定された場合、ステップＳ４０１において、中間コード最適化部１３２は、中間コードの組合せが、組込関数又は複合組込関数の動作定義と一致するか否か判定する。ステップＳ４０２において、中間コード最適化部１３２は、ステップＳ４０１で一致すると判定された組込関数又は複合組込関数を履歴に追加する。その他の処理については図１３と同様である。
【００６６】
一例として、図１８に示す複合組込関数“ｃａｓｅ２”及び図１９に示す複合組込関数“ｃａｓｅ３”がソースプログラム記憶領域６０に格納されている場合、複合組込関数“ｃａｓｅ２”及び“ｃａｓｅ３”のそれぞれの動作定義Ｇ２及びＨ２は互いに類似することとなる。図２０に示すようなソースプログラムがソースプログラム記憶領域６０に格納される場合、ソースプログラムのプログラム記述Ｉ１中の３つの文は、いずれも複合組込関数“ｃａｓｅ３”の動作定義Ｈ２に一致する。
【００６７】
しかしながら、図２０に示すソースプログラムのプログラム記述Ｉ２については、複合組込関数“ｃａｓｅ２”及び“ｃａｓｅ３”のそれぞれの動作定義Ｇ２及びＨ２のいずれとも一致する。よって、複合組込関数“ｃａｓｅ２”及び“ｃａｓｅ３”のいずれを選択するかの基準がない場合、複合組込関数“ｃａｓｅ２”に最適化される可能性もある。
【００６８】
したがって、第１実施形態の第２変形例においては、最適化に利用した複合組込関数の履歴を参照して、過去に最適化に使用された複合組込関数“ｃａｓｅ３”を採用する。この結果、図２０に示すソースプログラム例に関しては、複合組込関数“ｃａｓｅ２”のインライン節Ｇ１だけに使用されている命令“ｄｓｐ２”をハードウェア化する必要がなくなる。
【００６９】
このように、第１実施形態の第２変形例によれば、複合組込関数及び組込関数の適用に優先度を設けることができるため、最適化に使用される複合組込関数及び組込関数の種類を削減できる。この結果、最適化に使用されない複合組込関数のインライン節中の命令列を実行するためのハードウェア、及び最適化に使用されない組込関数を実行するためのハードウェアを実装不要とすることができ、ターゲット・ハードウェアのハードウェア規模を削減することが可能となる。
【００７０】
尚、第１実施形態の第２変形例においては、中間コード最適化部１３２が履歴を作成する一例を説明したが、図１４に示すプログラム開発装置の構成を採用する場合、オブジェクトコード最適化部１３４ｂが履歴を作成することとなる。
【００７１】
（第１実施形態の第３変形例）
本発明の第１実施形態の第３変形例として、図２１に示すように、図１に示した中間コード最適化部１３２が、ソースデバッグ情報を選択的に出力する構成でも良い。ここで、「デバッグ情報」としては、例えば行番号が利用できる。
【００７２】
具体的には、図１に示す最適化部１３２２が、図２１のステップＳ４１１においてインライン節を解析し、ステップＳ４１１においてデバッグ情報を検出する。また、ステップＳ４１３及びＳ４１４に示すように、インライン節の中間コード列についてデバッグ情報を付加する。
【００７３】
一例として、図２２に示す複合組込関数Ｊ１からは、図２３に示すような中間コードが生成される。図２３に示すように、図２２に示す複合組込関数Ｊ１のインライン節の命令列から生成された中間コードに対しては、デバッグ情報（行番号）Ｋ１が付加されている。図２２に示すソースプログラムＪ２から生成された中間コードに対して、図２３に示す複合組込関数の中間コードを用いて最適化が行われる場合、図２４に示すオブジェクトコードが生成される。図２４に示すオブジェクトコードにおいては、図２３に示すデバッグ情報（行番号）が維持されている。
【００７４】
第１実施形態の第３変形例によれば、デバッガを使用した場合に、どのソースプログラムが、どの複合組込関数によって置き換えられたかについての情報をユーザに提供できる。また、最適化が行われた部分について、複合組込関数のインライン節の中を表示させることができる。
【００７５】
尚、第１実施形態の第３変形例においては、中間コード最適化部１３２が、インライン節の中間コード列についてデバッグ情報を付加する一例を説明したが、図１４に示すプログラム開発装置の構成を採用する場合は、オブジェクトコード最適化部１３４ｂがインライン節の機械語列についてデバッグ情報を付加することとなる。
【００７６】
（第２実施形態）
本発明の第２実施形態に係るプログラム開発装置は、図２５に示すように、超長命令語（ＶＬＩＷ）型の拡張命令（以下において「ＶＬＩＷ命令」という。）を生成可能な命令生成部７００ａを更に備える点が図１と異なる。即ち、図２５に示すプログラム開発装置は、図３に示すコプロセッサ７２３がＶＬＩＷ型である場合に適用される。ＶＬＩＷ命令においては命令語長を長くすることで、一度に複数命令を同時実行することが可能となる。ここで、「ＶＬＩＷ命令」とは、図３に示すプロセッサコア７１０及びコプロセッサ７２３で同時に実行される命令の組み合わせを１つの命令とした長命令を意味する。命令生成部７００ａは、ソースプログラム記憶領域６０に格納されたソースプログラムからＶＬＩＷ命令を自動的に生成する。更に、命令生成部７００ａは、ＶＬＩＷ命令をインライン節に含む複合組込関数を生成してソースプログラム記憶領域６０に格納する。
【００７７】
具体的には、命令生成部７００ａは、並列化命令検出部７０１ａ、ＶＬＩＷ命令定義部７２、複合組込関数生成部７３、及び命令定義ファイル生成部７４を備える。並列化命令検出部７０１ａは、ソースプログラムからデータフローグラフを作成し、データフローグラフに基づいてソースプログラム中の並列実行可能な命令を検出する。「データフローグラフ」とは、複数命令のそれぞれのオペランドのデータ依存関係に応じて各命令を連結したグラフを意味する。ＶＬＩＷ命令定義部７２は、並列実行可能な命令から、ＶＬＩＷ型のコプロセッサ７２３に実行させるコプロセッサ命令を定義する。複合組込関数生成部７３は、ＶＬＩＷ命令をインライン節中の命令列として記述し、ソースプログラム中のＶＬＩＷ命令への最適化対象となるプログラム記述を動作定義として定義して複合組込関数を生成する。命令定義ファイル生成部７４は、ＶＬＩＷ命令定義部７２が定義したコプロセッサ命令と、図３に示すプロセッサコア７１０及びコプロセッサ７２３間の転送命令等を作成する。命令定義ファイル生成部７４が生成した命令定義ファイルは、命令定義ファイル記憶領域６５に格納される。その他の構成については、図１と同様である。
【００７８】
また、並列化命令検出部７０１ａは、コンパイラ７１ａ、データフローグラフ作成部７１ｂ、検出部７１ｃ、及び判定部７１ｄを備える。コンパイラ７１ａは、ソースプログラム記憶領域６０からソースプログラムを読み出し、ソースプログラムをコンパイルしてアセンブリ記述を生成する。尚、コンパイラ７１ａとしては、ソースプログラムの言語に対応した既存のコンパイラが使用できる。一例として、コンパイラ７１ａは、図２６に示すソースプログラムをコンパイルして図２７に示すアセンブリ記述を生成する。
【００７９】
データフローグラフ作成部７１ｂは、コンパイラ７１ａが生成したアセンブリ記述から、図２８に示すようなデータフローグラフを作成する。具体的には、データフローグラフ作成部７１ｂは、図２７におけるオペランドの依存関係に基づいて、各命令を鎖状に連結することによりデータフローグラフを作成する。
【００８０】
検出部７１ｃは、図２８に示すように、データフローグラフの各ノード（命令）にラベルを付加する。図２８においては、（１−１）、（１−２）、（２−１）、（２−２）、（２−３）、及び（３−１）等のラベルが、データフローグラフの各ノードに付加される。尚、図２８においては、説明の簡略化のため、データフローグラフの一部にのみラベルを付している。
【００８１】
検出部７１ｃは、図２９に示すように、並列化可能な命令を検出するために図２８に示すデータフローグラフを変形する。即ち、検出部７１ｃは、図２８に示すように分散して配置されている各ノードを、図２９に示すように並列的に再配置することで並列化可能な命令を検出する。
【００８２】
検出部７１ｃは、図２９に示すデータフローグラフにより、（１−１）、（１−２）、（２−１）、（２−２）、（２−３）、及び（３−１）の各ノードに関して、(１−１)及び(１−２)のグループ（以下において｛(１−１),(１−２)｝と表記する。）と、(２−１)、(２−２)、及び(２−３)のグループ（以下において｛(２−１),(２−２),(２−３)｝と表記する。）と、(３−１)の３つが並列実行可能であることを検出する。
【００８３】
また、検出部７１ｃは、データフローグラフから、アセンブリ記述の実行に要するサイクル数を見積もる。図２８及び図２９に示すデータフローグラフにより、総実行命令数は１０であり、乗算“mul”と除算“div”の実行に２０サイクル、乗算“mul”と除算“div”以外の各命令の実行に１サイクルを必要とする場合、すべての命令の実行に６７サイクルが必要であると算出される。
【００８４】
或いは、計算によりアセンブリ記述の実行に要するサイクル数を求めることに代えて、ターゲット・ハードウェア又はシミュレーション上でアセンブリ記述の実行を解析し、解析結果に基づいてアセンブリ記述の実行に要するサイクル数を求めても良い。
【００８５】
更に、判定部７１ｄは、図３に示すコプロセッサ７２３の並列実行可能な命令数（以下において「最大並列度」という。）に応じて、検出部７１ｃが検出した並列実行可能な命令をプロセッサコア７１０及びコプロセッサ７２３のそれぞれに割り当てる。コプロセッサ７２３の最大並列度が２であるとすると、判定部７１ｄは、３つのグループのうち最も実行サイクル数の多いアセンブリ記述をコプロセッサ７２３の命令として、次に実行サイクルの多いアセンブリ記述をそのコプロセッサ命令と対にしてプロセッサコアの命令系列に割り当てる。
【００８６】
よって、図２９に示す例においては、｛(２−１),(２−２),(２−３)｝を１つのコプロセッサ命令系列とし、｛(１−１),(１−２)｝をそれと並列実行されるプロセッサコア命令系列とする。尚、最大並列度は、入力装置２に対する操作により決定されても良く、最大並列度のデータが記憶装置６００に予め格納されていても良い。
【００８７】
また、ＶＬＩＷ命令定義部７２は、判定部７１ｄの判定結果に応じて、コプロセッサ７２３に実行させる並列化可能命令と等価なコプロセッサ命令を定義する。ＶＬＩＷ命令定義部７２は、例えば、データフローグラフに基づいて並列化可能命令の入力数及び出力数を判定し、並列化可能命令に含まれる命令を解釈してコプロセッサ命令を生成する。｛(２−１),(２−２),(２−３)｝の命令系列と等価なコプロセッサ命令を新たに定義する場合、ＶＬＩＷ命令定義部７２は、図２９に示すデータフローグラフよりこの命令系列が２入力１出力であると判定する。更に、｛(２−１),(２−２),(２−３)｝の命令系列は、ターゲットとするプロセッサコア７１０の命令の機能がすべて登録されていると仮定すると、乗算の結果に３を加えるという処理であることを導出できる。尚、プロセッサコア７１０の命令は、例えばコンパイラ７１ａから得ることができる。
【００８８】
この結果、ＶＬＩＷ命令定義部７２は、「２個のコプロセッサ・レジスタの値の積に３を加算し、加算結果をコプロセッサ・レジスタに格納する」というコプロセッサ命令を定義する。「コプロセッサ・レジスタ」は、コプロセッサ７２３の内部に備えられるレジスタを意味する。
【００８９】
更に、命令定義ファイル生成部７４は、図３０に示すように、ＶＬＩＷ命令定義部７２が定義したコプロセッサ命令と、プロセッサコア７１０とコプロセッサ７２３（コプロセッサ・レジスタ）間の転送命令を作成する。図３０において、各命令定義は、命令のニーモニック、ビットパターン、及び動作記述により構成されている。図３０に示す命令“ＣＭＯＶ”は、プロセッサコア７１０とコプロセッサレジスタ間の転送命令であり、命令“ＣＭＡＣ３”は、図２９に示す｛(２−１),(２−２),(２−３)｝を１つの命令にしたものであり、「２個のコプロセッサ・レジスタの値の積に３を加算し、加算結果をコプロセッサ・レジスタに格納する」というコプロセッサ命令である。尚、命令定義ファイルの命令フォーマットは、特開２００３−３２３４６３号公報に開示されているアーキテクチャ・データベースとしても良い。この場合、コンパイラが新たに定義されたＶＬＩＷ命令を生成できる。
【００９０】
また、複合組込関数生成部７３は、並列化命令検出部７０１ａのコンパイラ７１ａから出力されるアセンブリ記述内のシンボル情報により、ソースプログラムのソース行とアセンブリ記述の対応付けが可能である。よって、複合組込関数生成部７３は、図２９に示す｛(２−１),(２−２),(２−３)｝に相当するソースプログラムを切り出すことができる。したがって、図２６に示す“y = c * d + ３;”は、図３１に示すように、コプロセッサ命令を使った“cmac３(tmp_c, tmp_d);”とコプロセッサレジスタ転送命令に置き換えられる。尚、図３１に示す記述を第１実施形態に係るコンパイラ１０ａがコンパイルすると、図３２に示すオブジェクトコードが生成される。図３１に示す“＿cop”は、宣言された変数をコプロセッサ７２３のレジスタに割り付けるための指示子である。図３２に示す“＋”は、前後の命令が１つのＶＬＩＷ命令に詰め込まれることを示す。図３２において、例えば、“mul $1, $2”と“+cmac3 $c1, $c2”とを１つにまとめたものがＶＬＩＷ命令であり、“+cmac3 $c1, $c2”はコプロセッサ命令である。
【００９１】
この結果、複合組込関数生成部７３は、図３３に示すように、ＶＬＩＷ命令をインライン節に含み、ＶＬＩＷ命令への置換対象となるソースプログラム中のプログラム記述を動作定義に含む複合組込関数を生成する。図３３に示す複合組込関数は、図２５に示すソースプログラム記憶領域６０に格納される。コンパイラ１０ａは、ソースプログラム中に図３３の動作定義Ｍ２に一致するプログラム記述を検出した場合、図３３のインライン節Ｍ１中のＶＬＩＷ命令を含む命令列に最適化する。
【００９２】
次に、図３４に示すフローチャートを参照して、第２実施形態に係るプログラム開発装置の処理手順例を説明する。但し、第１実施形態に係るプログラム開発装置の処理と同様の処理については、重複する説明を省略する。
【００９３】
（Ａ）ステップＳ１０１において、図２５に示すコンパイラ７１ａは、ソースプログラム記憶領域６０からソースプログラムを読み出し、ソースプログラムをコンパイルしてアセンブリ記述を生成する。
【００９４】
（Ｂ）ステップＳ１０２において、データフローグラフ作成部７１ｂは、ステップＳ１０１で作成されたアセンブリ記述からデータフローグラフを作成する。
【００９５】
（Ｃ）ステップＳ１０３において、検出部７１ｃは、ステップＳ１０２で作成されたデータフローグラフ中の並列化可能な命令を検出する。
【００９６】
（Ｄ）ステップＳ１０４において、判定部７１ｄは、コプロセッサ７２３の最大並列度に応じて、ステップＳ１０３で検出された並列実行可能な命令をコプロセッサ命令とするか否か判定する。
【００９７】
（Ｅ）ステップＳ１０５において、ＶＬＩＷ命令定義部は、ステップＳ１０４の判定結果に応じて、並列実行可能な命令をコプロセッサ命令として定義する。
【００９８】
（Ｆ）ステップＳ１０６において、命令定義ファイル生成部７４は、ステップＳ１０５で定義されたコプロセッサ命令から命令定義ファイルを作成する。命令定義ファイル生成部７４が生成した命令定義ファイルは、命令定義ファイル記憶領域６５に格納される。
【００９９】
（Ｇ）ステップＳ１０７において、複合組込関数生成部７３は、ステップＳ１０５で定義されたＶＬＩＷ命令をインライン節に含む複合組込関数を生成する。複合組込関数生成部７３が生成した複合組込関数は、ソースプログラム記憶領域６０に格納される。尚、ステップＳ１０７は、ステップＳ１０６の直前又はステップＳ１０６と同時に実行されても良い。
【０１００】
（Ｈ）ステップＳ０１〜Ｓ０７においては、図１１と同様の処理が実行される。この結果、ＶＬＩＷ命令を含むオブジェクトコードが自動生成される。
【０１０１】
このように、第２実施形態によれば、ＶＬＩＷ命令を自動生成できるので、拡張可能なプロセッサの性能を十分に活用できる。また、ユーザ自身が経験に基づいて試行錯誤しながら命令を追加し、シミュレーションによってその効果を確かめ、有用と判断すれば命令を追加する手順と比べて、与えられたアプリケーションに対して効果的な命令を極めて短期間で作成することが可能となる。よって、プログラムの開発期間を飛躍的に短縮できる。更に、データフローグラフを利用して並列実行可能な演算を検出して、コプロセッサ７２３の最大並列度に応じてＶＬＩＷ命令を生成するので、コプロセッサ７２３のアーキテクチャ上の制約を満たすことができる。
【０１０２】
（第２実施形態の変形例）
本発明の第２実施形態の変形例に係るプログラム開発装置として、図３５に示すように、ソースプログラムを入力としてソースプログラムレベルでデータフローグラフを作成しても良い。即ち、図３５に示すプログラム開発装置は、図２５に示したコンパイラ７１ａを備えていない。また、図３５に示すデータフローグラフ作成部７１ｂは、ソースプログラム記憶領域６０からソースプログラムを読み出し、ソースプログラムからデータフローグラフを作成する。
【０１０３】
したがって、第２実施形態の変形例に係るプログラム開発装置によれば、ソースプログラムをコンパイルすることなく並列化可能な命令を検出できるので、並列化命令検出部７０１ｂの構成を簡略化できる。
【０１０４】
（その他の実施形態）
上記のように、本発明は第１及び第２実施形態によって記載したが、この開示の一部をなす論述及び図面はこの発明を限定するものであると理解すべきではない。この開示から当業者には様々な代替実施形態、実施例及び運用技術が明らかとなろう。
【０１０５】
上述した第１及び第２実施形態においては、ソースプログラム及びヘッダファイルが別個に用意されてコンパイラ１０ａ及び１０ｂに与えられても良いし、ソースプログラム中にヘッダファイルを明示的に挿入してコンパイラ１０ａ及び１０ｂに与えられても良い。
【０１０６】
更に、ソースプログラムがＣ言語により記述されている場合を例に説明したが、Ｃ＋＋言語又はｆｏｒｔｒａｎ言語等の様々なプログラミング言語、或いはハードウェア記述言語（ＨＤＬ）等に応用可能である。
【０１０７】
尚、既に述べた第１及び第２実施形態に係る自動設計装置は、ソースプログラム及びヘッダファイル等のデータをネットワークを介して取得しても良い。この場合、プログラム開発装置が、ネットワークとの通信を制御する通信制御装置等を更に備える必要がある。
【０１０８】
このように本発明は、ここでは記載していない様々な実施形態等を包含するということを理解すべきである。したがって、本発明はこの開示から妥当な特許請求の範囲の発明特定事項によってのみ限定されるものである。
【図面の簡単な説明】
【０１０９】
【図１】本発明の第１実施形態に係るプログラム開発装置の構成例を示す機能ブロック図である。
【図２】図２（ａ）は複合組込関数の記述例を示す図であり、図２（ｂ）は組込関数の記述例を示す図であり、図２（ｃ）は図２（ａ）のインライン節の記述例を示す図であり、図２（ｄ）は図２（ａ）及び（ｂ）の動作定義の記述例を示す図である。
【図３】本発明の第１実施形態に係るプログラム開発装置のプログラム開発対象となるプロセッサの構成例を示すブロック図である。
【図４】図４（ａ）は組込関数の一例を示す図であり、図４（ｂ）は図４（ａ）から生成される中間コードを示す図である。
【図５】図５（ａ）は複合組込関数の一例を示す図であり、図５（ｂ）は図５（ａ）から生成される中間コードを示す図である。
【図６】本発明の第１実施形態に係るプログラム開発装置に入力されるソースプログラムの一例を示す図である。
【図７】図６から生成される中間コードを示す図である。
【図８】図７に示す中間コードに対して図５に示すインライン節を展開した場合の中間コードを示す図である。
【図９】図７に示す中間コードから生成されるオブジェクトコードを示す図である。
【図１０】図８に示す中間コードから生成されるオブジェクトコードを示す図である。
【図１１】本発明の第１実施形態に係るプログラム開発装置の処理手順例を示すフローチャートである。
【図１２】本発明の第１実施形態に係る構文解析処理の処理手順例を示すフローチャートである。
【図１３】本発明の第１実施形態に係る中間コード最適化処理の処理手順例を示すフローチャートである。
【図１４】本発明の第１実施形態の第１変形例に係るプログラム開発装置の構成例を示す機能ブロック図である。
【図１５】本発明の第１実施形態の第１変形例に係るプログラム開発装置の処理手順例を示すフローチャートである。
【図１６】本発明の第１実施形態の第１変形例に係るオブジェクトコード最適化処理の処理手順例を示すフローチャートである。
【図１７】本発明の第１実施形態の第２変形例に係る中間コード最適化処理の処理手順例を示すフローチャートである。
【図１８】本発明の第１実施形態の第２変形例に係る中間コード最適化処理を説明するための複合組込関数の一例を示す図である（その１）。
【図１９】本発明の第１実施形態の第２変形例に係る中間コード最適化処理を説明するための複合組込関数の一例を示す図である（その２）。
【図２０】本発明の第１実施形態の第２変形例に係る中間コード最適化処理を説明するためのソースプログラムの一例を示す図である（その２）。
【図２１】本発明の第１実施形態の第３変形例に係る中間コード最適化処理の処理手順例を示すフローチャートである。
【図２２】本発明の第１実施形態の第３変形例に係る中間コード最適化処理を説明するためのソースプログラムの一例を示す図である。
【図２３】図２２のソースプログラムから生成されるソースデバッグ情報を含む中間コードを示す図である。
【図２４】図２３のソースデバッグ情報を含む中間コードから生成されるオブジェクトコードを示す図である。
【図２５】本発明の第２実施形態に係るプログラム開発装置の構成例を示す機能ブロック図である。
【図２６】本発明の第２実施形態に係るプログラム開発装置入力されるソースプログラムの一例を示す図である。
【図２７】図２６のソースプログラムをコンパイルして得られるアセンブリ記述を示す図である。
【図２８】図２７のアセンブリ記述から生成されるデータフローグラフを示す図である。
【図２９】図２８のデータフローグラフを変形した例を示す図である。
【図３０】本発明の第２実施形態に係る命令定義ファイル生成部が生成する命令定義ファイルの一例を示す図である。
【図３１】図２６に示すソースプログラムを変形した一例を示す図である。
【図３２】図３１に示す変形後のソースプログラムから生成されるオブジェクトコードを示す図である。
【図３３】本発明の第２実施形態に係る拡張命令定義部が生成する複合組込関数の一例を示す図である。
【図３４】本発明の第２実施形態に係るプログラム開発装置の処理手順例を示すフローチャートである。
【図３５】本発明の第２実施形態の変形例に係るプログラム開発装置の構成例を示す機能ブロック図である。
【符号の説明】
【０１１０】
１０ａ、１０ｂ…コンパイラ
１２…解析部
１３ａ、１３ｂ…コード生成部
６０…ソースプログラム記憶領域
７００ａ…命令生成部
７０１ａ、７０１ｂ…並列化命令検出部
７２…ＶＬＩＷ命令定義部
７３…複合組込関数生成部
７２３…コプロセッサ
【図１】
2006243838.tif 000003
【図２】
2006243838.tif 000004
【図３】
2006243838.tif 000005
【図４】
2006243838.tif 000006
【図５】
2006243838.tif 000007
【図６】
2006243838.tif 000008
【図７】
2006243838.tif 000009
【図８】
2006243838.tif 000010
【図９】
2006243838.tif 000011
【図１０】
2006243838.tif 000012
【図１１】
2006243838.tif 000013
【図１２】
2006243838.tif 000014
【図１３】
2006243838.tif 000015
【図１４】
2006243838.tif 000016
【図１５】
2006243838.tif 000017
【図１６】
2006243838.tif 000018
【図１７】
2006243838.tif 000019
【図１８】
2006243838.tif 000020
【図１９】
2006243838.tif 000021
【図２０】
2006243838.tif 000022
【図２１】
2006243838.tif 000023
【図２２】
2006243838.tif 000024
【図２３】
2006243838.tif 000025
【図２４】
2006243838.tif 000026
【図２５】
2006243838.tif 000027
【図２６】
2006243838.tif 000028
【図２７】
2006243838.tif 000029
【図２８】
2006243838.tif 000030
【図２９】
2006243838.tif 000031
【図３０】
2006243838.tif 000032
【図３１】
2006243838.tif 000033
【図３２】
2006243838.tif 000034
【図３３】
2006243838.tif 000035
【図３４】
2006243838.tif 000036
【図３５】
2006243838.tif 000037