(57)【要約】      （修正有）【課題】使用するモジュールの情報および入力に用いられる変数の情報を実行時に取得して冗長な計算を排除したプログラムを生成するための中間プログラムを生成するプログラム開発支援装置およびプログラム開発支援方法、ならびにプログラム生成支援装置およびプログラム生成支援方法を提供する。【解決手段】プログラム生成支援装置３０は、プログラムに使用されるモジュールの情報および入力に用いられる変数の情報を受け付ける受付部３８と、モジュールを構成するブロックのそれぞれについてのブロックの入力とモジュールの入力との対応関係の情報を含む中間プログラムにもとづいて、入力の対応関係を用いてブロックの入力を変数で置き換えることにより各ブロックをインスタンス化するとともに、使用されるモジュールを構成するブロックのうち冗長なブロックを排除するプログラム生成部３９と、を備える。【選択図】図１
2015011467.tif 000002
【特許請求の範囲】
【請求項１】
プログラムに使用されるモジュールの情報およびモジュールの入力に用いられる変数の情報を受け付ける受付部と、
モジュールを構成するブロックのそれぞれについてのブロックの入力とモジュールの入力との対応関係の情報を含む中間プログラムにもとづいて、前記入力の対応関係を用いて前記ブロックの入力を前記変数で置き換えることにより各ブロックをインスタンス化するとともに、前記使用されるモジュールを構成するブロックのうち冗長なブロックを排除するよう前記プログラムを生成するプログラム生成部と、
を備えたプログラム生成支援装置。
【請求項２】
前記プログラム生成部は、
前記プログラムを生成した後に前記受付部により、新たにプログラムに使用されるモジュールの情報および入力に用いられる変数の情報の少なくとも一方の情報が受け付けられると、この新たに受け付けた情報に応じて前記中間プログラムを用いてプログラムを再生成する、
請求項１記載のプログラム生成支援装置。
【請求項３】
前記中間プログラムは、プログラムプールおよび中間モジュールにより構成され、
前記プログラムプールは、
前記モジュールを構成するブロックを帰りがけ順深さ優先探索により決定された順序で抽出し、抽出した順に、抽出したブロックの入力が前記モジュールの入力および他のブロックの出力のいずれであるかを示す情報を含む中間ブロックが登録されるとともに入力および出力が同一の中間ブロックの重複登録を禁止することにより作成されたものであり、
前記中間モジュールは、
前記モジュールごとに、前記モジュールを構成するブロックに対応する中間ブロックの情報と、前記中間ブロックに含まれた前記モジュールの入力であることを示す情報と前記モジュールの入力との対応関係の情報と、を登録することにより作成されたものである、
請求項１または２に記載のプログラム生成支援装置。
【請求項４】
前記中間プログラムは、
前記各ブロックに対し、前記各ブロックのそれぞれについての自身の出力１回分に要する出力バッファサイズの情報と前記他のブロックの出力と接続された自身の入力が前記他のブロックの出力の何回前の出力情報まで利用するかを示す利用出力回数の情報とがさらに付加され、
前記プログラム生成部は、
前記プログラムを生成する際に、前記使用されるモジュールを構成するブロックのそれぞれの出力について、この出力と接続された他のブロックの入力に付加された前記利用出力回数の情報にもとづいて何回前の出力情報まで保持すべきかを示す保持出力回数を決定する、
請求項１ないし３のいずれか１項に記載のプログラム生成支援装置。
【請求項５】
前記プログラム生成部により決定された前記保持出力回数および前記出力１回分に要する出力バッファサイズの情報にもとづいて、ワーキングメモリに所要の出力用ワークエリアを確保しつつ前記プログラム生成部により生成された前記プログラムを実行するプログラム実行部、
をさらに備えた請求項４記載のプログラム生成支援装置。
【請求項６】
モジュールを構成するブロックの入出力関係を定義したモジュール定義をモジュールごとに取得するモジュール定義取得部と、
モジュールを構成するブロックのそれぞれについてのブロックの入力とモジュールの入力との対応関係の情報を含む中間プログラムを前記モジュール定義にもとづいて生成する中間プログラム生成部と、
を備えたプログラム開発支援装置。
【請求項７】
前記中間プログラムは、プログラムプールおよび中間モジュールにより構成され、
前記中間プログラム生成部は、
前記モジュール定義取得部により取得された前記モジュール定義にもとづいて、前記モジュールを構成するブロックを帰りがけ順深さ優先探索により決定された順序で抽出し、抽出した順に、抽出したブロックの入力が前記モジュールの入力および他のブロックの出力のいずれであるかを示す情報を含む中間ブロックを前記プログラムプールに登録するとともに入力および出力が同一の中間ブロックの重複登録を禁止することにより前記プログラムプールを作成するプログラムプール作成部と、
前記モジュールごとに、前記モジュールを構成するブロックに対応する中間ブロックの情報と、前記中間ブロックに含まれた前記モジュールの入力であることを示す情報と前記モジュールの入力との対応関係の情報と、を前記中間モジュールに登録することにより前記中間モジュールを作成する中間モジュール作成部と、
を有する請求項６記載のプログラム開発支援装置。
【請求項８】
前記モジュールを構成するブロックのそれぞれは、
あらかじめ自身の出力１回分に要する出力バッファサイズの情報と、前記他のブロックの出力と接続された自身の入力が前記他のブロックの出力の何回前の出力情報まで利用するかを示す利用出力回数の情報と、が付加され、
前記中間プログラム生成部は、
前記モジュールを構成するブロックのそれぞれの出力について、この出力と接続された他のブロックの入力に付加された前記利用出力回数の情報にもとづいて、何回前の出力情報まで保持すべきかを示す保持出力回数を決定し、各ブロックに前記保持出力回数の情報を付加する、
請求項６または７に記載のプログラム開発支援装置。
【請求項９】
プログラムに使用されるモジュールの情報およびモジュールの入力に用いられる変数の情報を受け付けるステップと、
モジュールを構成するブロックのそれぞれについてのブロックの入力とモジュールの入力との対応関係の情報を含む中間プログラムにもとづいて、前記入力の対応関係を用いて前記ブロックの入力を前記変数で置き換えることにより各ブロックをインスタンス化するとともに、前記使用されるモジュールを構成するブロックのうち冗長なブロックを排除するよう前記プログラムを生成するステップと、
を有するプログラム生成支援方法。
【請求項１０】
モジュールを構成するブロックの入出力関係を定義したモジュール定義をモジュールごとに取得するステップと、
モジュールを構成するブロックのそれぞれについての、ブロックの入力とモジュールの入力との対応関係の情報を含む中間プログラムを前記モジュール定義にもとづいて生成するステップと、
を有するプログラム開発支援方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、プログラム開発支援装置、プログラム生成支援装置、プログラム開発支援方法およびプログラム生成支援方法に関する。
【背景技術】
【０００２】
最近、プログラム開発者やプログラム使用者が所望のプログラムを容易に自動生成することができるよう支援する技術が開発されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平９−５４６８７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
プログラムを設計する際には、所定の問題を解くことができるように、計算の単位としてのブロックの入出力をつないだグラフ構造（ＤＦＤ：Data Flow Diagram）としてモジュールを設計することがある。この種のプログラムは、実行速度、実行時の柔軟性および開発効率が高いことが好ましいが、これらを共に達成することは困難である。
【０００５】
実行速度を高めて高速化を図るためには、冗長なブロックを排除することが好ましい。しかし、使用するモジュールおよび使用するモジュールへどのような変数が入力されるのかが確定しない限り、どのブロックが冗長であるかを判別することはできない。一方で、実行時の柔軟性を高めるためには、使用するモジュールや入力に用いる変数は、実行時に決定させることが好ましい。高速性と柔軟性を両立する方法として、モジュールと変数との組み合わせをあらかじめ全て用意しておく方法が考えられる。しかし、この方法では開発に要する時間が膨大なものになってしまう。
【０００６】
このため、プログラムの自動生成を支援する技術により生成されるプログラムは、たとえば柔軟性を犠牲にして高速性を優先し、あらかじめ使用するモジュールおよび入力に用いる変数が固定されて生成される場合がある。しかし、開発環境で設計されたプログラムが実行環境で用いられる場合には、実行環境でプログラムを使用するユーザが使用するモジュールおよび入力に用いる変数を変更したいと所望すると、プログラムを開発環境で再生成しなおさなくてはならず、非常に柔軟性に欠ける。
【課題を解決するための手段】
【０００７】
本発明の一実施形態に係るプログラム生成支援装置は、上述した課題を解決するために、プログラムに使用されるモジュールの情報およびモジュールの入力に用いられる変数の情報を受け付ける受付部と、モジュールを構成するブロックのそれぞれについてのブロックの入力とモジュールの入力との対応関係の情報を含む中間プログラムにもとづいて、入力の対応関係を用いてブロックの入力を変数で置き換えることにより各ブロックをインスタンス化するとともに、使用されるモジュールを構成するブロックのうち冗長なブロックを排除するようプログラムを生成するプログラム生成部と、を備えたものである。
【図面の簡単な説明】
【０００８】
【図１】本発明の第１実施形態に係るプログラム開発支援装置およびプログラム生成支援装置の一例を示すブロック図。
【図２】プログラム開発支援装置およびプログラム生成支援装置の動作全体の概略を示すフローチャート。
【図３】モジュール、中間プログラムおよび中間プログラムにもとづいて生成されるプログラムの関係の一例を示す説明図。
【図４】プログラムの一構成例を示す説明図。
【図５】モジュールの一構成例を示す説明図。
【図６】（ａ）はブロックの一構成例を詳細に表記した様子を示す説明図、（ｂ）はブロックの一構成例を簡易的に表記した様子を示す説明図。
【図７】中間プログラムの一構成例を示す説明図。
【図８】ブロック、中間ブロックおよびブロックのインスタンスの関係の一例を示す説明図。
【図９】図２のステップＳ１でプログラム開発支援装置の中間プログラム生成部により実行される中間プログラムの生成処理の一例を示すサブルーチンフローチャート。
【図１０】図９に示す手順により、２つのモジュールＸ、Ｙから生成される中間プログラムの一例を示す説明図。
【図１１】図９のステップＳ１３においてプログラムプール作成部により実行されるプログラムプール作成処理の一例を示すサブルーチンフローチャート。
【図１２】モジュール定義に含まれる１つのモジュールの実行順序について説明するための図。
【図１３】モジュールＸを構成するブロックＡ、Ｂ、Ｃに対応する中間ブロックをプログラムプールに登録する様子の一例を示す説明図。
【図１４】モジュールＹを構成するブロックＡ、Ｂ、Ｄに対応する中間ブロックをプログラムプールに登録する様子の一例を示す説明図。
【図１５】図９のステップＳ１４において中間モジュール作成部により実行される中間モジュール作成処理の一例を示すサブルーチンフローチャート。
【図１６】（ａ）は中間モジュールに「使用する中間ブロック」（プログラムプールの何番目の中間ブロックを使うかを示すリスト）が登録される様子の一例を示す説明図、（ｂ）は中間モジュールにさらに入力パラメータ対応関係が登録される様子の一例を示す説明図。
【図１７】図２のステップＳ３でプログラム生成支援装置の実行用制御部より実行される中間プログラムにもとづくプログラム生成処理の一例を示すサブルーチンフローチャート。
【図１８】図１７のステップＳ３２でプログラム生成部により実行される、中間プログラムにもとづく受け付けたモジュール、変数に応じたプログラム生成処理の一例を示すサブルーチンフローチャート。
【図１９】（ａ）は図１７のステップＳ３１で受け付けられるモジュールおよび変数の一例を示す説明図、（ｂ）は中間プログラムの一例を示す説明図、（ｃ）は（ａ）に示すモジュールおよび変数が受け付けられた場合において冗長性が排除されたプログラムの一例を示す説明図。
【図２０】中間モジュールＸに対応するモジュールＸをロードする際の様子の一例を示す説明図。
【図２１】中間モジュールＹに対応するモジュールＹをロードする際の様子の一例を示す説明図。
【図２２】モジュールや変数の変更要求に応じたプログラムの再生成処理の一例を示すフローチャート。
【図２３】（ａ）は図１９（ａ）に示す例に対してモジュールＹの入力ｐａｒａｍＹ１に用いられる変数ＵがモジュールＸの入力ｐａｒａｍＸ１に用いられる変数と同じ変数Ｔに変更された場合について説明するための図、（ｂ）は図１９（ｂ）と同じく図１７のステップＳ３１で受け付けられるモジュールおよび変数の一例を示す説明図、（ｃ）は（ａ）に示す変更要求が受け付けられた場合において冗長性が排除されたプログラムの一例を示す説明図。
【図２４】図２３（ａ）に示す変更要求が受け付けられた場合において中間モジュールＹに対応するモジュールＹをロードする際の様子の一例を示す説明図。
【図２５】本発明の第２実施形態に係るプログラム開発支援装置およびプログラム生成支援装置の一例を示すブロック図。
【図２６】図２のステップＳ１で第２実施形態に係るプログラム開発支援装置の中間プログラム生成部により実行される、出力利用回数を考慮した中間プログラムの生成処理の一例を示すサブルーチンフローチャート。
【図２７】第２実施形態に係るブロック定義に含まれるブロックの入力が保持する利用出力回数の情報の一例を示す説明図。
【図２８】利用出力回数の初期値として１が与えられたプログラムプールの一例を示す説明図。
【図２９】（ａ）は、図２７に示す例において１より大きい利用出力回数の情報が付加されたブロックＣおよびＤを抽出して示す説明図であり、（ｂ）は図２７に示す例においてプログラムプールの各中間ブロックに対して保持出力回数の情報を付加した様子の一例を示す説明図。
【図３０】本発明の第３実施形態に係るプログラム開発支援装置およびプログラム生成支援装置の一例を示すブロック図。
【図３１】第３実施形態に係るプログラムプール作成部により作成されるプログラムプールの一例を示す説明図。
【図３２】図３１に示す例において、第３実施形態に係るプログラム生成部によりプログラムが生成される際に、各ブロックのインスタンスの出力の保持出力回数を決定する様子の一例を示す説明図。
【発明を実施するための形態】
【０００９】
本発明に係るプログラム開発支援装置、プログラム生成支援装置、プログラム開発支援方法およびプログラム生成支援方法の実施の形態について、添付図面を参照して説明する。
【００１０】
本発明の一実施形態に係るプログラム開発支援装置は、たとえば開発環境を提供しプログラム開発者により利用される装置であり、プログラム生成支援装置は、たとえば実行環境を提供しプログラム使用者により利用される装置である。
【００１１】
プログラム使用者は、実行環境において、自身でプログラムに用いたいモジュールやモジュールの入力に用いたい変数を指定し、このモジュールや変数に応じたプログラムであって冗長な計算を排除したプログラムを容易に自動生成したいと所望することがある。そこで、本発明の一実施形態に係るプログラム開発支援装置は、プログラム生成支援装置が提供する実行環境においてモジュールや変数に応じて柔軟に、かつ冗長性を排除した高速なプログラムを生成するためのプログラム（中間プログラム）を生成する。そして、この中間プログラムは、本発明の一実施形態に係るプログラム生成支援装置において柔軟かつ高速なプログラムを自動生成するために用いられる。
【００１２】
（Ｉ）第１の実施形態
（１）構成
図１は、本発明の第１実施形態に係るプログラム開発支援装置１０およびプログラム生成支援装置３０の一例を示すブロック図である。
【００１３】
プログラム開発支援装置１０は、たとえば開発環境を提供しプログラム開発者により利用される装置であり、図１に示すように、入力部１１、表示部１２、ネットワーク接続部１３、開発用記憶部１４および開発用制御部１５を有する。プログラム開発支援装置１０は、たとえばパーソナルコンピュータやワークステーションなどにより構成することができる。
【００１４】
入力部１１は、少なくともポインティングデバイスを含み、たとえばマウス、トラックボール、キーボード、タッチパネル、テンキーなどの一般的な入力装置により構成され、ユーザの操作に対応した操作入力信号を開発用制御部１５に出力する。
【００１５】
表示部１２は、たとえば液晶ディスプレイやＯＬＥＤ（Organic Light Emitting Diode）ディスプレイなどの一般的な表示出力装置により構成され、開発用制御部１５の制御に従って各種画像を表示する。
【００１６】
ネットワーク接続部１３は、ネットワークの形態に応じた種々の情報通信用プロトコルを実装する。ネットワーク接続部１３は、この各種プロトコルに従ってプログラム開発支援装置１０とプログラム生成支援装置３０などの他の電気機器とを接続する。ここでネットワークとは、電気通信技術を利用した情報通信網全般を意味し、無線／有線ＬＡＮやインターネット網のほか、電話通信回線網、光ファイバ通信ネットワーク、ケーブル通信ネットワークおよび衛星通信ネットワークなどを含む。
【００１７】
開発用記憶部１４は、モジュール定義記憶部１６および中間プログラム記憶部１７を備え、磁気的もしくは光学的記録媒体または半導体メモリなどのＣＰＵにより読み取り可能な記録媒体を含んだ構成を有する。これら記憶媒体内のプログラムおよびデータの一部または全部は電子ネットワークを介してダウンロードされるように構成してもよい。
【００１８】
モジュール定義記憶部１６は、プログラム開発者により入力部１１を介して入力されたモジュール定義を記憶する。
【００１９】
モジュール定義（ＤＦＤ：Data Flow Diagram）は、モジュールごとに、モジュールを構成するブロックの入出力関係（接続関係）を定義したものである。
【００２０】
中間プログラム記憶部１７は、開発用制御部１５によりモジュール定義にもとづいて生成された中間プログラムを記憶する。プログラム生成支援装置３０は、作成したいプログラムにおいて使用したいモジュールの情報および入力に用いられる変数の情報をプログラム使用者から実行時に取得して、これらの情報に応じた冗長な計算を排除したプログラム使用者の所望のプログラムを、この中間プログラムにもとづいて生成する。
【００２１】
開発用制御部１５は、ＣＰＵ、ＲＡＭおよびＲＯＭをはじめとする記憶媒体などにより構成され、この記憶媒体に記憶されたプログラムに従ってプログラム開発支援装置１０の動作を制御する。
【００２２】
開発用制御部１５のＣＰＵは、ＲＯＭをはじめとする記憶媒体に記憶された中間プログラム生成制御プログラムおよびこのプログラムの実行のために必要なデータをＲＡＭへロードし、このプログラムに従って、生成したいプログラムが使用するモジュールの情報および入力に用いられる変数の情報を実行時に取得して、この実行時に取得した情報に応じて冗長な計算を排除したプログラムを生成するための中間プログラムを生成する処理を実行する。
【００２３】
開発用制御部１５のＲＡＭは、ＣＰＵが実行するプログラムおよびデータを一時的に格納するワークエリアを提供する。
【００２４】
開発用制御部１５のＲＯＭをはじめとする記憶媒体は、プログラム開発支援装置１０の起動プログラム、中間プログラム生成制御プログラムや、これらのプログラムを実行するために必要な各種データを記憶する。
【００２５】
なお、ＲＯＭをはじめとする記憶媒体は、磁気的もしくは光学的記録媒体または半導体メモリなどの、ＣＰＵにより読み取り可能な記録媒体を含んだ構成を有し、これら記憶媒体内のプログラムおよびデータの一部または全部は電子ネットワークを介してダウンロードされるように構成してもよい。
【００２６】
図１に示すように、開発用制御部１５のＣＰＵは、中間プログラム生成制御プログラムによって、少なくともモジュール定義取得部１８および中間プログラム生成部２０として機能する。この各部１８、２０は、ＲＡＭの所要のワークエリアを、データの一時的な格納場所として利用する。
【００２７】
モジュール定義取得部１８は、モジュール定義記憶部１６に記憶されたモジュール定義をモジュールごとに取得し、モジュール定義を内部構造に変換する。なお、内部構造への変換とは、字句解析や構文解析などを実行することをいう。モジュール定義の内部構造はたとえばデータフロー図のようなグラフ構造である。
【００２８】
中間プログラム生成部２０は、プログラムプール作成部２１および中間モジュール作成部２２を有する。中間プログラム生成部２０は、モジュールを構成するブロックのそれぞれについての、ブロックの入力と、他のブロックの出力およびモジュールの入力のいずれかと、の相対的な対応関係の情報および各ブロックの計算内容の情報を含む中間プログラムを、内部構造に変換されたモジュール定義にもとづいて生成し、中間プログラム記憶部１７に記憶させる。
【００２９】
中間プログラムは、プログラムプールおよび中間モジュールにより構成される。中間プログラムのプログラムプールは、プログラムプール作成部２１により作成され、中間プログラムの中間モジュールは、中間モジュール作成部２２により作成される。
【００３０】
一方、プログラム生成支援装置３０は、たとえば実行環境を提供しプログラム使用者により利用される装置であり、入力部３１、表示部３２、ネットワーク接続部３３、実行用記憶部３４および実行用制御部３５を有する。プログラム生成支援装置３０は、たとえば計測機器などを制御、監視等するための組込み機器などにより構成することができる。
【００３１】
入力部３１は、少なくともポインティングデバイスを含み、たとえばマウス、トラックボール、キーボード、タッチパネル、テンキーなどの一般的な入力装置により構成され、たとえばプログラム使用者による作成したいプログラムに使用したいモジュールの情報の指示およびモジュールの入力に用いられる変数の情報の指示などの各種の操作に対応した操作入力信号を実行用制御部３５に出力する。
【００３２】
表示部３２は、たとえば液晶ディスプレイやＯＬＥＤ（Organic Light Emitting Diode）ディスプレイなどの一般的な表示出力装置により構成され、実行用制御部３５の制御に従って各種画像を表示する。
【００３３】
ネットワーク接続部３３は、ネットワーク接続部１３と同等の構成を有し各種プロトコルに従ってプログラム生成支援装置３０とプログラム開発支援装置１０などの他の電気機器とを接続する。
【００３４】
実行用記憶部３４は、中間プログラム記憶部３６およびプログラム記憶部３７を備え、磁気的もしくは光学的記録媒体または半導体メモリなどのＣＰＵにより読み取り可能な記録媒体を含んだ構成を有する。これら記憶媒体内のプログラムおよびデータの一部または全部は電子ネットワークを介してダウンロードされるように構成してもよい。
【００３５】
中間プログラム記憶部３６は、プログラム開発支援装置１０の中間プログラム記憶部１７に記憶された中間プログラムを、たとえばネットワーク接続部１３および３３を介して、または可搬性記憶媒体を介して与えられて記憶する。
【００３６】
プログラム記憶部３７は、中間プログラムにもとづいて実行用制御部３５により生成されたプログラムを記憶する。
【００３７】
実行用制御部３５は、ＣＰＵ、ＲＡＭおよびＲＯＭをはじめとする記憶媒体などにより構成され、この記憶媒体に記憶されたプログラムに従ってプログラム生成支援装置３０の動作を制御する。
【００３８】
実行用制御部３５のＣＰＵは、ＲＯＭをはじめとする記憶媒体に記憶されたプログラム生成支援プログラムおよびこのプログラムの実行のために必要なデータをＲＡＭへロードし、このプログラムに従って、作成したいプログラムにおいて使用したいモジュールの情報および入力に用いられる変数の情報をプログラム使用者から実行時に取得して、これらの情報に応じて、冗長な計算を排除したプログラム使用者の所望のプログラムを中間プログラムにもとづいて生成する処理を実行する。
【００３９】
実行用制御部３５のＲＡＭは、ＣＰＵが実行するプログラムおよびデータを一時的に格納するワークエリアを提供する。
【００４０】
実行用制御部３５のＲＯＭをはじめとする記憶媒体は、プログラム生成支援装置３０の起動プログラム、中間プログラム生成制御プログラムや、これらのプログラムを実行するために必要な各種データを記憶する。
【００４１】
なお、ＲＯＭをはじめとする記憶媒体は、磁気的もしくは光学的記録媒体または半導体メモリなどの、ＣＰＵにより読み取り可能な記録媒体を含んだ構成を有し、これら記憶媒体内のプログラムおよびデータの一部または全部は電子ネットワークを介してダウンロードされるように構成してもよい。
【００４２】
図１に示すように、実行用制御部３５のＣＰＵは、プログラム生成支援プログラムによって、少なくとも受付部３８、プログラム生成部３９およびプログラム実行部４０として機能する。この各部３８−４０は、ＲＡＭの所要のワークエリアをデータの一時的な格納場所として利用する。
【００４３】
受付部３８は、プログラム使用者から入力部３１を介して、プログラム使用者が作成したいと所望するプログラムに使用されるモジュールの情報およびモジュールの入力に用いられる変数の情報を受け付ける。
【００４４】
プログラム生成部３９は、中間プログラムにもとづいて、受付部３８により受け付けられたモジュールの情報および変数の情報を用いてプログラムを生成し、プログラム記憶部３７に記憶させる。より具体的には、プログラム生成部３９は、モジュールを構成するブロックのそれぞれについての、ブロックの入力と、他のブロックの出力およびモジュールの入力のいずれかと、の相対的な対応関係の情報および各ブロックの計算内容の情報を含む中間プログラムにもとづいて、相対的な対応関係を用いてブロックの入力を受付部３８が受け付けた変数で置き換えることにより各ブロックをインスタンス化するとともに、使用されるモジュールを構成するブロックのうち冗長なブロックを排除するよう、プログラムを生成する。
【００４５】
プログラム実行部４０は、プログラム使用者による入力部３１を介した指示に応じてプログラム記憶部３７に記憶されたプログラムを実行する。
【００４６】
（２）動作全体の概略
図２は、プログラム開発支援装置１０およびプログラム生成支援装置３０の動作全体の概略を示すフローチャートである。図２において、Ｓに数字を付した符号はフローチャートの各ステップを示す。
【００４７】
この手順は、あらかじめプログラム開発者によりモジュール定義記憶部１６にモジュール定義が記憶されてスタートとなる。
【００４８】
ステップＳ１において、プログラム開発支援装置１０の開発用制御部１５は、開発環境においてモジュール定義にもとづいて中間プログラムを生成し中間プログラム記憶部１７に記憶させる。
【００４９】
次に、ステップＳ２において、プログラム開発者は、プログラム開発支援装置１０の中間プログラム記憶部１７に記憶された中間プログラムを、たとえばネットワーク接続部１３および３３を介して、または可搬性記憶媒体を介して、プログラム生成支援装置３０の中間プログラム記憶部３６に記憶させる。
【００５０】
次に、ステップＳ３において、プログラム生成支援装置３０の実行用制御部３５は、実行環境において、作成したいプログラムにおいて使用したいモジュールの情報および入力に用いられる変数の情報をプログラム使用者から取得して、これらの情報に応じて、冗長な計算を排除したプログラム使用者の所望のプログラムを中間プログラムにもとづいて生成し、プログラム記憶部３７に記憶させる。
【００５１】
次に、ステップＳ４において、実行用制御部３５のプログラム実行部４０は、このプログラムを実行する。
【００５２】
以上の手順により、プログラム開発支援装置１０により、使用するモジュールの情報および入力に用いられる変数の情報を実行時に取得してこれらの情報に応じて冗長な計算を排除したプログラムを生成するための中間プログラムを生成することができる。また、プログラム生成支援装置３０により、使用するモジュールの情報および入力に用いられる変数の情報を実行時に取得してこれらの情報に応じた冗長な計算を排除したプログラムを中間プログラムにもとづいて生成することができる。
【００５３】
（３）中間プログラム
続いて、中間プログラムについて説明する。
（３−１）概要
図３は、モジュール、中間プログラムおよび中間プログラムにもとづいて生成されるプログラムの関係の一例を示す説明図である。
【００５４】
プログラム開発者は、開発環境を提供するプログラム開発支援装置１０を用いて、モジュール定義をモジュール定義記憶部１６に記憶させる。プログラム開発支援装置１０は、モジュール定義から中間プログラムを生成する。この中間プログラムは実行環境を提供するプログラム生成支援装置３０に与えられ、実行環境で中間プログラムからプログラムが生成される。
【００５５】
（３−２）プログラム
図４は、プログラムの一構成例を示す説明図である。
本明細書において、プログラムとは、中間プログラム生成制御プログラムおよびプログラム生成支援プログラムを除き、実行環境上で中間プログラムにもとづいて最終的に生成されるものをいう。プログラムは、０個以上の変数を含み、変数は追加することができる。また、追加した変数は変更が可能である。また、プログラムは、０個以上のモジュールのインスタンスを含み、モジュールのインスタンスは追加することができる。プログラムのインスタンスは、プログラム実行部４０により実行可能である。プログラムのインスタンスが実行されると、内部のブロックのインスタンスが前から順に実行される。
【００５６】
（３−３）モジュール
図５は、モジュールの一構成例を示す説明図である。
モジュールは、０個以上の入力と１個以上のブロックを持つ。ブロック同士をつなぐことは可能であるが、ループは持たない。
【００５７】
モジュールの入力には名前が与えられる。本明細書ではモジュールＸの入力をｐａｒａｍＸ０、ｐａｒａｍＸ１と表す。モジュールの入力は、モジュールを構成するブロックの入力に接続することが出来る。また、モジュールの入力に変数を割り当てることにより、モジュールのインスタンスを作成することができる。また、モジュールの入力に変数が割り当てられることにより、結果的にモジュール内部のブロックの入力に変数が割り当てられることになる。
【００５８】
モジュールのインスタンスは、ブロックのインスタンスを持つ。モジュールのインスタンスを構成するブロックのインスタンス同士の入出力関係（接続関係）は、モジュールのインスタンスの元となるモジュールを構成するブロック同士の入出力関係と同等である。本明細書では、モジュールＸのインスタンスはＸ０、Ｘ１、Ｘ２と数字を付すことで、元となる対応するモジュールと区別可能に表記する。
【００５９】
（３−４）ブロック
図６（ａ）は、ブロックの一構成例を詳細に表記した様子を示す説明図であり、（ｂ）はブロックの一構成例を簡易的に表記した様子を示す説明図である。
【００６０】
ブロックは、０個位以上の入力、０個以上の出力および１個の計算を持つ。ブロックの入力および出力には名前が与えられる。本明細書では、ブロックの入力を入力０、入力１またはｉｎ０、ｉｎ１と、ブロックの出力を出力０、出力１またはｏｕｔ０、ｏｕｔ１と、それぞれ表す。また、ブロックの出力は、出力１回分に要するバッファサイズの情報を持つ（図６（ａ）の出力０：１２の「１２」等参照）。
【００６１】
計算は、ブロックのインスタンスの入力からデータを読み込み、ブロックのインスタンスの出力に結果を書き込むことにより行われる。なお、入力と計算が同じであれば、出力も同じである。中間プログラム生成部２０により、ブロックから中間ブロックが生成される。なお、以下の説明では適宜、ブロックの表記を簡略化して示す（図６（ａ）参照）。
【００６２】
ブロックのインスタンスの入力は、他のブロックのインスタンスの出力か、モジュールの入力に接続される。ブロックのインスタンスの出力は、ブロックの出力とは異なり、実際に値を格納する場所を持つ。ブロックのインスタンスの計算は元となる対応するブロックの計算と同じである。
【００６３】
ここで、同一のプログラムの実行内であれば２つのブロックのインスタンスの出力の値が同じであるとき、この２つのブロックのインスタンスは等価であるというものとする。ブロックのインスタンスの等価性は、推移的、対称的かつ反射的である。ブロックの性質から、２つのブロックのインスタンスについて入力が全て等価であり計算が同一であれば、この２つのブロックのインスタンスは等価であるということができる。
【００６４】
（３−５）中間プログラム
図７は、中間プログラムの一構成例を示す説明図である。
中間プログラムは、プログラムプールおよび中間モジュールにより構成される。
【００６５】
プログラムプールは、中間ブロックのリストである。異なる中間ブロックから等価なブロックのインスタンスが生成される可能性はない。プログラムプール内の中間ブロックは、前から順に通し番号が付与される。たとえば、同じモジュールを構成するブロックＡおよびブロックＢについて、ブロックＡに対応する中間ブロックの通し番号がブロックＢに対応する中間ブロックの通し番号よりも小さい場合、ブロックＡのインスタンスはブロックＢのインスタンスよりも先に実行されることを意味する。また、中間ブロックは、元となるブロックの情報が保持されている。
【００６６】
また、中間ブロックは、入力を持つ。中間ブロックの入力は、他の中間ブロックの出力か、モジュールの入力が接続される。ここで、他の中間ブロックの出力も、元をたどれば所定のモジュールの入力にさかのぼることができる。このため、中間ブロックの入力は、結局モジュールの入力のいずれかに依存するということができる。
【００６７】
そこで、中間ブロックには、各中間ブロックが依存するモジュールの入力を示すパラメータが保持されている。ここで、各中間ブロックが保持するパラメータは、上記モジュールの入力（たとえばモジュールＸの入力であればｐａｒａｍＸ０、ｐａｒａｍＸ１など）とは異なり、同一のモジュールを構成する複数のブロック間で一意なパラメータであって各ブロックへの入力（ｉｎ０、ｉｎ１など）がモジュールの入力（ｐａｒａｍＸ０、ｐａｒａｍＸ１など）であることを示す情報（ｐａｒａｍ１、ｐａｒａｍ２など）であることに注意する。この、ブロックの入力がモジュールの入力であることを示す情報は、各中間ブロックが依存するモジュールの入力を示す情報であり、この情報（ｐａｒａｍ１、ｐａｒａｍ２など）と実際のモジュールの入力（ｐａｒａｍＸ０、ｐａｒａｍＸ１など）との対応関係（以下、入力パラメータ対応関係という）は、中間モジュールに登録される。
【００６８】
中間モジュールは、各モジュールが、プログラムプールの何番目の中間ブロックを使うかを示すリスト（図７の中間モジュールの「使用する中間ブロック」参照）と、入力パラメータ対応関係とを持つ。
【００６９】
（３−６）ブロック、中間ブロック、ブロックのインスタンス
図８は、ブロック、中間ブロックおよびブロックのインスタンスの関係の一例を示す説明図である。
【００７０】
プログラム開発支援装置１０の中間プログラム生成部２０により、ブロックから中間ブロックが生成される。また、プログラム生成支援装置３０のプログラム生成部３９により、中間ブロックからブロックのインスタンスが生成される。
【００７１】
（４）中間プログラム生成処理
続いて、プログラム開発支援装置１０により実行される中間プログラムの生成処理について説明する。
【００７２】
（４−１）中間プログラム生成処理の全体フロー
図９は、図２のステップＳ１でプログラム開発支援装置１０の中間プログラム生成部２０により実行される中間プログラムの生成処理の一例を示すサブルーチンフローチャートである。この処理は、プログラム開発支援装置１０により開発環境において実行される。
【００７３】
まず、ステップＳ１１において、モジュール定義取得部１８は、モジュール定義記憶部１６に記憶されたモジュール定義をモジュールごとに取得する。
【００７４】
次に、ステップＳ１２において、モジュール定義取得部１８は、取得したモジュール定義を内部構造に変換する。
【００７５】
次に、ステップＳ１３において、中間プログラム生成部２０のプログラムプール作成部２１は、内部構造に変換されたモジュール定義にもとづいてプログラムプールを生成する。
【００７６】
次に、ステップＳ１４において、中間プログラム生成部２０の中間モジュール作成部２２は、モジュールごとに、モジュールを構成するブロックに対応する中間ブロックの情報と、入力パラメータ対応関係（モジュールを構成するブロックの入力がモジュールの入力であることを示す情報（ｐａｒａｍ１、ｐａｒａｍ２など）とモジュールの入力（ｐａｒａｍＸ０、ｐａｒａｍＹ０など）との対応関係）と、を中間モジュールに登録することにより中間モジュールを作成する。
【００７７】
次に、ステップＳ１５において、中間プログラム生成部２０は、プログラムプールおよび中間モジュールからなる中間プログラムを中間プログラム記憶部１７に記憶させる。
【００７８】
以上の手順により、モジュール定義にもとづいて中間プログラムを生成することができる。
【００７９】
図１０は、図９に示す手順により、２つのモジュールＸ、Ｙから生成される中間プログラムの一例を示す説明図である。
【００８０】
以下、プログラムプール作成処理および中間モジュール作成処理について順に詳細に説明する。以下の説明では、モジュール定義が図１０に示す２つのモジュールＸ、Ｙで構成され、この２つのモジュールにもとづいて中間プログラムを生成する場合の例について示す。
【００８１】
（４−２）プログラムプール作成処理
図１１は、図９のステップＳ１３においてプログラムプール作成部２１により実行されるプログラムプール作成処理の一例を示すサブルーチンフローチャートである。また、図１２は、モジュール定義に含まれる１つのモジュールの実行順序について説明するための図である。図１３は、モジュールＸを構成するブロックＡ、Ｂ、Ｃに対応する中間ブロックをプログラムプールに登録する様子の一例を示す説明図である。また、図１４は、モジュールＹを構成するブロックＡ、Ｂ、Ｄに対応する中間ブロックをプログラムプールに登録する様子の一例を示す説明図である。
【００８２】
まず、ステップＳ１３０１において、プログラムプール作成部２１は、空のプログラムプールを作成する（図１３の１段目参照）。
【００８３】
次に、ステップＳ１３０２において、プログラムプール作成部２１は、内部構造に変換されたモジュール定義に含まれるモジュールを１つ抽出する。図１０に示す例では、モジュールＸおよびＹのいずれかが抽出される。ここでは、まずモジュールＸが抽出されたものとする。
【００８４】
次に、ステップＳ１３０３において、プログラムプール作成部２１は、モジュールを構成するブロックを帰りがけ順深さ優先探索により、各ブロックの抽出順序を決定する。この抽出順序は、モジュールのインスタンスが実行される際におけるブロックの実行順序に則した順序である（図１２参照）。
【００８５】
次に、ステップＳ１３０４において、プログラムプール作成部２１は、決定した順序で各ブロックを抽出する。モジュールＸでは、ブロックＡ、Ｂ、Ｃの順に抽出されることになる。ここでは、まずブロックＡが抽出されたものとする。
【００８６】
次に、ステップＳ１３０５において、プログラムプール作成部２１は、抽出したブロックの入力元がモジュールの入力であるか否かを判定する。モジュールの入力である場合はステップＳ１３０６に進む。一方、他のブロックの出力である場合はステップＳ１３０７に進む。図１０に示す例ではブロックＡの入力元はモジュールＸの入力（ｐａｒａｍＸ０）であるため、ＹＥＳと判定され、ステップＳ１３０６に進む。
【００８７】
次に、ステップＳ１３０６において、プログラムプール作成部２１は、抽出したブロックの入力がモジュールの入力であることを示す情報ｐａｒａｍＮ（ただしＮは自然数）に置換して対応する中間ブロックを作成する（図１３の２段目参照）。
【００８８】
次に、ステップＳ１３０８において、プログラムプール作成部２１は、作成した中間ブロックがプログラムプールに登録済みであるか否かを判定する。プログラムプールに登録済みでない場合はステップＳ１３０９に進む。一方、登録済みである場合はステップＳ１３１２に進む。ブロックＡの中間ブロックは未登録であるため、ステップＳ１３０９に進む。
【００８９】
次に、ステップＳ１３０９において、プログラムプール作成部２１は、作成した中間ブロックの入力がｐａｒａｍＮか否かを判定する。入力がｐａｒａｍＮである場合はステップＳ１３１０に進む。一方、ｐａｒａｍＮでない場合はステップＳ１３１１に進む。ブロックＡの中間ブロックの入力はステップＳ１３０６でｐａｒａｍＮに置換されているため、ステップＳ１３１０に進む。
【００９０】
次に、ステップＳ１３１０において、プログラムプール作成部２１は、ｐａｒａｍＮのＮに対してプログラムプール内で一意な情報を付加する。一意な情報としては、たとえばプログラムプールへの登録の順番などが考えられる。登録の順番を付与する場合、ブロックＡの中間ブロックの入力のｐａｒａｍＮのＮには１が付与されｐａｒａｍ１とされる。
【００９１】
次に、ステップＳ１３１１において、プログラムプール作成部２１は、作成した中間ブロックに対してプログラムプール内で一意な通し番号ＫＮ（ただし、Ｎは自然数）を付与してプログラムプールに登録する。ＫＮのＮとして登録の順番を付与する場合、ブロックＡの中間ブロックのＫＮのＮには１が付与されＫ１とされる（図１３の３段目参照）。
【００９２】
次に、ステップＳ１３１２において、プログラムプール作成部２１は、ステップＳ１３０２で抽出したモジュールを構成する全てのブロックについてプログラムプール登録処理（ステップＳ１３０４−Ｓ１３１１）が終了したか否かを判定する。終了した場合はステップＳ１３１３に進む。一方、終了していない場合はステップＳ１３０４に戻る。上記例ではモジュールＸのブロックＢおよびＣについてまだ終了していないため、ステップＳ１３０４に戻り、ブロックＢが抽出される。
【００９３】
図１０に示すようにブロックＢの入力元はモジュールＸの入力（ｐａｒａｍＸ１）であるため、ブロックＡと同様にステップＳ１３０６、Ｓ１３０８−Ｓ１３１１が実行され、ブロックＢに対応する中間ブロックの入力がｐａｒａｍ２に置換され、通し番号Ｋ２が与えられてプログラムプールに登録される（図１３の４、５段目参照）。そして、ステップＳ１３１２からステップＳ１３０４に戻り、ブロックＣが抽出される。
【００９４】
図１０に示すように、ブロックＣの入力元は他のブロックの出力（ブロックＡの出力およびブロックＢの出力）であるため、ステップＳ１３０５でＮＯと判定されてステップＳ１３０７に進む。
【００９５】
次に、ステップＳ１３０７において、プログラムプール作成部２１は、抽出したブロックの入力元（他のブロック）をプログラムプールから検索し、抽出したブロックの入力が他のブロックの出力であることを示す情報ＫＮ．ｏｕｔに置換して対応する中間ブロックを作成する。ブロックＣの入力元はブロックＡの出力およびブロックＢの出力であるため、ブロックＣの入力はブロックＡに対応する中間ブロックＫ１の出力を示す情報Ｋ１．ｏｕｔおよびブロックＢに対応する中間ブロックＫ２の出力を示す情報Ｋ２．ｏｕｔに置換される（図１３の６段目参照）。そして、ステップＳ１３０８、Ｓ１３０９のＮＯを経てステップＳ１３１１でＫ３が付与されてブロックＣに対応する中間ブロックＫ３がプログラムプールに登録される（図１３の７段目参照）。
【００９６】
次に、ステップＳ１３１２において、モジュールＸの全てのブロックＡ、ＢおよびＣについて終了したと判定されて、ステップＳ１３１３に進む。
【００９７】
次に、ステップＳ１３１３において、プログラムプール作成部２１は、モジュール定義に含まれる全てのモジュールについて処理が終了したか否かを判定する。終了している場合は一連の手順は終了となる。一方、終了していない場合は、ステップＳ１３０２に戻る。上記例では、モジュールＹについてまだ処理を行なっていないため、ステップＳ１３０２に戻り、モジュールＹが抽出される。
【００９８】
次に、ステップＳ１３０３においてプログラムプール作成部２１は、モジュールＹを構成するブロックを帰りがけ順深さ優先探索により、ブロックの抽出順序をＡ、Ｂ、Ｄの順に決定する。
【００９９】
次に、ブロックＡが抽出され（ステップＳ１３０４）、入力元がモジュールＹの入力（ｐａｒａｍＹ０）と判定され（ステップＳ１３０５のＹＥＳ）、ブロックＡの入力がｐａｒａｍＮに置換されて対応する中間ブロックが生成される（ステップＳ１３０６）。しかし、この中間ブロックはすでにプログラムプールに登録されているためステップＳ１３０８でＮＯと判定され、プログラムプールに冗長な中間ブロックが登録されることがないようになっている。同様に、モジュールＹのブロックＢに対応する中間ブロックについてもプログラムプールに冗長に登録されることがない（図１４の１、２段目参照）。
【０１００】
一方、モジュールＹのブロックＤについては、ステップＳ１３０５のＮＯ、Ｓ１３０７−１３０８、Ｓ１３０９のＮＯを経てステップＳ１３１１で対応する中間ブロックがプログラムプールに登録される（図１４の３、４段目参照）。そして、ステップＳ１３１３にてモジュール定義に含まれる全てのモジュールについて処理が終了したと判定されて一連の手順は終了となる。この結果、図１０に示す中間プログラムのプログラムプールが生成される。
【０１０１】
以上の手順により、モジュール定義にもとづいてプログラムプールを作成することができる。プログラムプールは、グラフ構造の計算順序に反しないように、全モジュールのブロックに対応する中間ブロックをまとめて直列化し、各中間ブロックに対して依存するモジュール入力の情報（ｐａｒａｍＮ）を付加したものということができる。
【０１０２】
（４−３）中間モジュール作成処理
プログラム生成支援装置３０がプログラムを生成する際には、モジュール単位でロードが行われる。このため、モジュール定義に含まれる全てのモジュールを構成するブロックに対応する中間ブロックが直列化されたリスト（プログラムプール）のみでは、モジュール単位でロードすることはできない。そこで、中間プログラムには、プログラムプールのほか、モジュールのインスタンス作成時にどの中間ブロックを用いるかを示す情報を登録した情報（中間モジュール）が含まれる必要がある。
【０１０３】
図１５は、図９のステップＳ１４において中間モジュール作成部２２により実行される中間モジュール作成処理の一例を示すサブルーチンフローチャートである。また、図１６（ａ）は中間モジュールに「使用する中間ブロック」（プログラムプールの何番目の中間ブロックを使うかを示すリスト）が登録される様子の一例を示す説明図であり、（ｂ）は中間モジュールにさらに入力パラメータ対応関係が登録される様子の一例を示す説明図である。
【０１０４】
ステップＳ１４０１において、中間モジュール作成部２２は、内部構造に変換されたモジュール定義に含まれるモジュールを１つ抽出する。
【０１０５】
次に、ステップＳ１４０２において、中間モジュール作成部２２は、抽出したモジュール用の空の中間モジュールを作成する。
【０１０６】
次に、ステップＳ１４０３において、中間モジュール作成部２２は、抽出したモジュールに含まれるブロックに対応する中間ブロックの情報を中間モジュールに登録する（図１６（ａ）の「使用する中間ブロック」参照）。この結果、モジュールに対応する中間モジュールがプログラムプールの何番目の中間ブロックを使うかを示すリストが中間モジュールに登録される。プログラム生成支援装置３０がプログラムを生成する際にモジュール単位でロードを行うときには、このリストを参照してロードすべきブロックを決定することができる。
【０１０７】
次に、ステップＳ１４０４において、中間モジュール作成部２２は、プログラムプールの中間ブロックを前から順に訪問する。
【０１０８】
次に、ステップＳ１４０５において、中間モジュール作成部２２は、訪問した中間ブロックの元となる対応するブロックが抽出したモジュールに含まれるか否かを判定する。含まれている場合はステップＳ１４０６に進む。一方、含まれていない場合はステップＳ１４０８に進む。
【０１０９】
次に、ステップＳ１４０６において、中間モジュール作成部２２は、訪問した中間ブロックの入力がｐａｒａｍＮ（モジュールの入力であることを示す情報）であるか否かを判定する。ｐａｒａｍＮである場合はステップＳ１４０７に進む。一方、ＫＮ．ｏｕｔ（他のブロックの出力であることを示す情報）である場合はステップＳ１４０８に進む。
【０１１０】
次に、ステップＳ１４０７において、中間モジュール作成部２２は、中間ブロックの入力であるｐａｒａｍＮと元となるブロックの入力であるモジュールの入力との対応関係（入力パラメータ対応関係）を中間モジュールに登録する。たとえば、中間モジュールＸについて中間ブロックＫ１を訪問している場合、中間ブロックＫ１の入力であるｐａｒａｍ１と中間ブロックＫ１の元となるブロックＡの入力であるモジュールＸの入力ｐａｒａｍＸ０との対応関係（ｐａｒａｍＸ０＝ｐａｒａｍ１）を中間モジュールＸに登録する（図１６（ｂ）参照）。
【０１１１】
次に、ステップＳ１４０８において、中間モジュール作成部２２は、抽出したモジュールに含まれるブロックに対応する全ての中間ブロックを訪問したか否かを判定する。全て訪問した場合はステップＳ１４０９に進む。一方、未訪問の中間ブロックがある場合はステップＳ１４０４に戻る。
【０１１２】
次に、ステップＳ１４０９において、中間モジュール作成部２２は、モジュール定義に含まれる全てのモジュールに対応する中間モジュールについて処理を終了したか否かを判定する。全ての中間モジュールについて処理が終了している場合は一連の手順は終了となる。一方、終了していない中間モジュールがある場合は、ステップＳ１４０１に戻る。
【０１１３】
以上の手順により、モジュール定義に含まれる全てのモジュールのそれぞれについて、使用する中間ブロック（プログラムプールの何番目の中間ブロックを使うかを示すリスト）および入力パラメータ対応関係が登録された中間モジュールを作成することができる。中間モジュールは、あるモジュールをロードするときにプログラムプール内のどの中間ブロックを用いるかの情報（使用する中間ブロックの情報）と、プログラムプール内の中間ブロックの各入力がどのモジュールの入力に対応しているかを示す情報とにより構成されているということができる。
【０１１４】
図９、１１および１５に示す手順により、中間プログラム生成部２０は、プログラムプールおよび中間モジュールを含む中間プログラムを生成することができる。この中間プログラムを用いることにより、ロードしたいモジュールが指定されると、この指定されたモジュールに必要なブロックを容易かつ冗長性を排除してロードすることができる。また、中間プログラムにおいて、ブロックの入力とモジュールの入力とは、相対的な対応関係（ｐａｒａｍＮ＝ｐａｒａｍＸＮ）で定義されている。このため、モジュールの入力に用いられる変数（変数Ｓなど）が与えられると、この対応関係にもとづいて容易にどのブロックにどの変数が与えられるかを判別することができる。このため、中間プログラムを用いることにより、実行環境で変数が与えられても、ロードすべきモジュールに必要なブロックを変数に応じて容易かつ冗長性を排除してロードすることができる。
【０１１５】
（５）プログラム生成処理
続いて、プログラム生成支援装置３０により実行される中間プログラムにもとづくプログラムの生成処理について説明する。
【０１１６】
（５−１）中間プログラムにもとづくプログラム生成処理の全体フロー
【０１１７】
図１７は、図２のステップＳ３でプログラム生成支援装置３０の実行用制御部３５より実行される中間プログラムにもとづくプログラム生成処理の一例を示すサブルーチンフローチャートである。この処理は、プログラム生成支援装置３０により実行環境において実行されることができる。
【０１１８】
なお、この手順は、あらかじめプログラム生成支援装置３０の中間プログラム記憶部３６に中間プログラムが記憶されてスタートとなる。
【０１１９】
ステップＳ３１において、受付部３８は、プログラム使用者から入力部３１を介して、プログラム使用者が作成したいと所望するプログラムに使用されるモジュールの情報およびモジュールの入力に用いられる変数の情報を受け付ける。
【０１２０】
次にステップＳ３２において、プログラム生成部３９は、受け付けたモジュールおよび変数に応じて、中間プログラムにもとづいてプログラムを生成する。
【０１２１】
以上の手順により、中間プログラムにもとづいてプログラムを生成することができる。
【０１２２】
（５−２）中間プログラムにもとづく受け付けたモジュール、変数に応じたプログラム生成処理
【０１２３】
図１８は、図１７のステップＳ３２でプログラム生成部３９により実行される、中間プログラムにもとづく受け付けたモジュール、変数に応じたプログラム生成処理の一例を示すサブルーチンフローチャートである。図１９（ａ）は図１７のステップＳ３１で受け付けられるモジュールおよび変数の一例を示す説明図であり、（ｂ）は中間プログラムの一例を示す説明図であり、（ｃ）は（ａ）に示すモジュールおよび変数が受け付けられた場合において冗長性が排除されたプログラムの一例を示す説明図である。
【０１２４】
また、図２０は、中間モジュールＸに対応するモジュールＸをロードする際の様子の一例を示す説明図である。また、図２１は、中間モジュールＹに対応するモジュールＹをロードする際の様子の一例を示す説明図である。
【０１２５】
図１９（ａ）に示すように、プログラム使用者が作成したいと所望するプログラムに使用されるモジュールとしてモジュールＸおよびＹが受付部３８により受け付けられるとともに、モジュールの入力に用いられる変数として、ｐａｒａｍＸ０＝ｐａｒａｍＹ０＝変数Ｓ、ｐａｒａｍＸ１＝変数Ｔ、ｐａｒａｍＹ１＝変数Ｕの情報が受付部３８により受け付けられた場合の例を用いて、図１８に示す手順を説明する。
【０１２６】
図１９（ａ）に示すモジュールのインスタンスＸ０に含まれるブロックのインスタンスＡと、モジュールのインスタンスＹ０に含まれるブロックのインスタンスＡとは、入力される変数が等しく変数Ｓであるため、等価である。したがって、モジュールＸおよびＹをロードしてプログラムを生成する際には、図１９（ｃ）に示すような、図１９（ａ）に示すプログラムと等価なプログラムであって図１９（ａ）における冗長なブロックのインスタンスＡを排除したプログラムが生成されることが好ましい。
【０１２７】
本実施形態に係るプログラム生成支援装置３０は、中間プログラムを用いることにより、受け付けたモジュール、変数に応じてモジュールをロードすることができる。このため、容易にこの種の冗長なブロックのインスタンスを排除したプログラムを生成することができる。以下詳細に説明する。
【０１２８】
ステップＳ３２０１において、プログラム生成部３９は、中間プログラム記憶部３６から中間プログラムを読み出す。
【０１２９】
次に、ステップＳ３２０２において、プログラム生成部３９は、受付部３８により図１７のステップＳ３１で受け付けられた使用するモジュールに対応する中間モジュールの１つを中間プログラムから抽出する。図１９に示す例では、モジュールＸおよびＹが使用するモジュールとして受け付けられる。ここではまずモジュールＸに対応する中間モジュールＸが抽出されたものとする（図２０の１段目参照）。
【０１３０】
次に、ステップＳ３２０３において、プログラム生成部３９は、抽出した中間モジュールが使用する中間ブロックを通し番号順にプログラムプールから抽出する。上記例では、中間モジュールＸが使用する中間ブロックＫ１がまず抽出される（図２０の２段目参照）。
【０１３１】
次に、ステップＳ３２０４において、プログラム生成部３９は、抽出した中間ブロックの入力がモジュールの入力であることを示す情報ｐａｒａｍＮであるか否かを判定する。ｐａｒａｍＮである場合はステップＳ３２０５に進む。一方、他のブロックの出力であることを示す情報ＫＮ．ｏｕｔである場合は、ステップＳ３２０６に進む。中間ブロックＫ１の入力はｐａｒａｍ１であるため、ステップＳ３２０５に進む。
【０１３２】
次に、ステップＳ３２０５において、プログラム生成部３９は、入力パラメータ対応関係を用いて、ｐａｒａｍＮを受付部３８により受け付けられたモジュールの入力に用いられる変数に置換することにより、中間ブロックに対応するブロックのインスタンスを作成する。
【０１３３】
中間ブロックＫ１の入力ｐａｒａｍ１は、中間モジュールＸの入力パラメータ対応関係においてｐａｒａｍＸ０＝ｐａｒａｍ１の関係にあることがわかる（図２０の１段目参照）。このため、中間ブロックＫ１の入力ｐａｒａｍ１は、対応するｐａｒａｍＸ０に対して受付部３８により受け付けられた変数Ｓで置換され、対応するブロックのインスタンスが生成される。
【０１３４】
次に、ステップＳ３２０７において、プログラム生成部３９は、作成したブロックのインスタンスがプログラムに追加済みであるか否かを判定する。プログラムに追加済みでない場合はステップＳ３２０８に進む。一方、追加済みである場合はステップＳ３２０９に進む。中間ブロックＫ１に対応するブロックのインスタンスは未追加であるため、ステップＳ３２０８に進む。
【０１３５】
次に、ステップＳ３２０８において、プログラム生成部３９は、作成したブロックのインスタンスに対してプログラム内で一意な通し番号ＬＮ（ただし、Ｎは自然数）を付与してプログラムに追加する。ＬＮのＮとして追加の順番を付与する場合、中間ブロックＫ１に対応するブロックのインスタンスのＬＮのＮには１が付与されＬ１とされる（図２０の３、４段目参照）。
【０１３６】
次に、ステップＳ３２０９において、プログラム生成部３９は、ステップＳ３２０２において抽出された中間モジュールに含まれる全ての中間ブロックについてプログラム追加処理（ステップＳ３２０４−Ｓ３２０８）が終了したか否かを判定する。終了した場合はステップＳ３２１０に進む。一方、終了していない場合はステップＳ３２０３に戻る。上記例ではステップＳ３２０２で抽出された中間モジュールＸの中間ブロックＫ２、Ｋ３についてまだ処理が終了していない。このため、ステップＳ３２０３に戻り、中間ブロックＫ２が抽出され、中間ブロックＫ１と同様に、ステップＳ３２０８で対応するブロックのインスタンスＬ２がプログラムに登録される（図２０の５、６段目参照）。
【０１３７】
続いて、再度ステップＳ３２０３に戻り中間ブロックＫ３が抽出される。中間ブロックＫ３の入力は他のブロックの出力であることを示す情報Ｋ１．ｏｕｔおよびＫ２．ｏｕｔである（図１９（ｂ）参照）。このため、ステップＳ３２０４でＮＯと判定されてステップＳ３２０６に進む。
【０１３８】
ステップＳ３２０６において、プログラム生成部３９は、抽出した中間ブロックの入力元（他の中間ブロック）をプログラムプールから検索し、この他の中間ブロックに対応するブロックのインスタンスの出力ＬＮ．ｏｕｔで入力ＫＮ．ｏｕｔを置換してブロックのインスタンスを作成する。中間ブロックＫ３の入力Ｋ１．ｏｕｔおよびＫ２．ｏｕｔは、各中間ブロックＫ１およびＫ２にそれぞれ対応するブロックのインスタンスＬ１およびＬ２の出力Ｌ１．ｏｕｔおよびＬ２．ｏｕｔに置換されてブロックのインスタンスが作成される。そして、ステップＳ３２０７のＮＯを経て、ステップＳ３２０８でＬ３が付与されて中間ブロックＫ３に対応するブロックのインスタンスＬ３がプログラムに追加される（図２０の７、８段目参照）。
【０１３９】
次に、ステップＳ３２０９において、中間モジュールＸに含まれる全ての中間ブロックＫ１、Ｋ２およびＫ３について処理が終了したと判定されて、ステップＳ３２１０に進む。
【０１４０】
次に、ステップＳ３２１０において、プログラム生成部３９は、受付部３８により図１７のステップＳ３１で受け付けられた使用するモジュールに対応する全ての中間モジュールについて処理が終了したが否かを判定する。終了した場合は、一連の手順は終了となる。一方、終了していない場合はステップＳ３２０２に戻る。上記例では中間モジュールＹについてまだ終了していないため、ステップＳ３２０２戻り中間モジュールＹが抽出される。
【０１４１】
次に、ステップＳ３２０３において、プログラム生成部３９は、抽出した中間モジュールＹが使用する中間ブロックを通し番号順に、すなわちＫ１、Ｋ２、Ｋ４の順に、プログラムプールから抽出する。
【０１４２】
はじめに、中間ブロックＫ１が抽出されると（ステップＳ３２０３）、入力がｐａｒａｍＮであると判定され（ステップＳ３２０４のＹＥＳ）、入力が変数Ｓで置き換えられてブロックのインスタンスが作成される（ステップＳ３２０５、図２１の１、２段目参照）。しかし、このブロックのインスタンスはすでにプログラムに追加済みである（図２０の４、６、８段目参照）。このため、ステップＳ３２０７でＮＯと判定され、プログラムに冗長なブロックのインスタンスが追加されることがないようになっている。
【０１４３】
一方、中間モジュールＹの中間ブロックＫ２の入力ｐａｒａｍ２は（図１９（ｂ）参照）、中間モジュールＹの入力パラメータ対応関係においてｐａｒａｍＹ１＝ｐａｒａｍ２の関係にある（図２１の１段目参照）。このため、中間モジュールＹの中間ブロックＫ２の入力ｐａｒａｍ２は、対応するｐａｒａｍＹ１に対して受付部３８により受け付けられた変数Ｕで置換されて対応するブロックのインスタンスとされる（ステップＳ３２０５）。
【０１４４】
この中間モジュールＹの中間ブロックＫ２に対応するインスタンスは、中間モジュールＸの中間ブロックＫ２の入力ｐａｒａｍ２が変数Ｔで置換されて作成されたブロックのインスタンスとは入力が異なるため、等価ではない。このため、中間モジュールＹの中間ブロックＫ２に対応するインスタンスはステップＳ３２０７でＮＯと判定され、ステップＳ３２０８でＬ４が付与されてプログラムに登録される（図２１の４、５段目参照）。また、中間モジュールＹの中間ブロックＫ４に対応するブロックのインスタンスＬ５は、中間モジュールＸの中間ブロックＫ３に対応するブロックのインスタンスＬ３と同様の手順によりプログラムに追加される（図２１の６、７段目参照）。
【０１４５】
そして、ステップＳ３２１０にて受付部３８により図１７のステップＳ３１で受け付けられた使用するモジュールに対応する全ての中間モジュールについて処理が終了したと判定されて、一連の手順は終了となる。この結果、図１９（ｃ）に示すプログラムがロードされる。
【０１４６】
以上の手順により、中間プログラムにもとづいて、実行環境で受け付けたモジュール、変数に応じて、冗長性を排除したプログラムを生成することができる。
【０１４７】
（５−３）受け付けたモジュール、変数の変更要求に応じたプログラム生成処理
【０１４８】
（５−２）で説明したように、プログラム生成支援装置３０は、中間プログラムを用いることにより、実行環境で受け付けたモジュール、変数に応じて柔軟にプログラムを生成することができる。このため、一度プログラムを生成した後であっても、モジュールや変数の変更要求が受け付けられると、この変更要求に応じてプログラムを容易に再生成することが可能である。
【０１４９】
図２２は、モジュールや変数の変更要求に応じたプログラムの再生成処理の一例を示すフローチャートである。
【０１５０】
ステップＳ６１において、受付部３８は、プログラム使用者から入力部３１を介して、プログラム使用者が変更したいと所望するモジュールの情報およびモジュールの入力に用いられる変数の情報の少なくとも一方を受け付ける。
【０１５１】
そして、ステップＳ６２において、プログラム生成部３９は、受け付けた変更要求に応じて、中間プログラムにもとづいてプログラムを再生成する。
【０１５２】
なお、ステップＳ６２において実行される手順は図１７のステップＳ３２で実行される手順（図１８に示す手順）と同一であるため説明を省略する。
【０１５３】
以上の手順により、モジュールや変数の変更要求に応じてプログラムを再生成することができる。
【０１５４】
モジュールや変数の変更要求の一例として、図１９（ａ）に示すモジュールおよび変数の受け付け情報に対して変数の一部に対して変更要求があった場合について説明する。
【０１５５】
図２３（ａ）は、図１９（ａ）に示す例に対してモジュールＹの入力ｐａｒａｍＹ１に用いられる変数ＵがモジュールＸの入力ｐａｒａｍＸ１に用いられる変数と同じ変数Ｔに変更された場合について説明するための図である。また、図２３（ｂ）は図１９（ｂ）と同じく図１７のステップＳ３１で受け付けられるモジュールおよび変数の一例を示す説明図であり、（ｃ）は（ａ）に示す変更要求が受け付けられた場合において冗長性が排除されたプログラムの一例を示す説明図である。
【０１５６】
また、図２４は図２３（ａ）に示す変更要求が受け付けられた場合において中間モジュールＹに対応するモジュールＹをロードする際の様子の一例を示す説明図である。なお、中間モジュールＸに対応するモジュールＸについては図２０と同様であるため説明を省略する。
【０１５７】
図２３（ａ）および（ｃ）ならびに図２４の３段目に示すように、中間モジュールＹの中間ブロックＫ２の入力ｐａｒａｍ２は（図２３（ｂ）参照）、中間モジュールＹの入力パラメータ対応関係においてｐａｒａｍＹ１＝ｐａｒａｍ２の関係にある（図２４の２段目参照）。このため、中間モジュールＹの中間ブロックＫ２の入力ｐａｒａｍ２は、対応するｐａｒａｍＹ１に対して受付部３８により受け付けられた変数Ｔで置換されて対応するブロックのインスタンスとされる（図１８のステップＳ３２０５）。これは、中間モジュールＸの中間ブロックＫ２に対応するブロックのインスタンスＬ２（図２０の５、６段目および図２４の１段目参照）と等価である。
【０１５８】
このため、図１８のステップＳ３２０７でＮＯと判定される。したがって、変数が変更されることによって新たに生じた冗長なブロックのインスタンスは、確実にプログラムから除外される。
【０１５９】
本実施形態に係るプログラム開発支援装置１０は、使用するモジュールの情報および入力に用いられる変数の情報を実行時に取得してこれらの情報に応じて冗長な計算を排除したプログラムを生成するための中間プログラムを生成することができる。
【０１６０】
また、本実施形態に係るプログラム生成支援装置３０は、使用するモジュールの情報および入力に用いられる変数の情報を実行時に取得してこれらの情報に応じた冗長な計算を排除したプログラムを、中間プログラムにもとづいて生成することができる。
【０１６１】
中間プログラムを用いることにより、冗長なブロックのインスタンスをプログラムから容易に排除することができる。このため、本実施形態に係るプログラム生成支援装置３０によれば、容易に高速なプログラムを生成することができる。
【０１６２】
また、中間プログラムを用いることにより、プログラムに使用するモジュールおよびモジュールの入力は、実行時に決定することができる。このため、本実施形態に係るプログラム生成支援装置３０は、実行時の柔軟性が非常に高い。さらに、一度生成したプログラムについて、モジュールや変数の変更要求があると、この変更要求に応じて柔軟性良く冗長性を排除したプログラムを容易に生成することができる。このため、実行環境でプログラムを利用するプログラム使用者にとって、非常に利便性が高い。
【０１６３】
また、中間プログラムを用いない場合、開発環境において新たに作成されたモジュールやブロックを実行環境のプログラムに追加するためには、実行環境のプログラムを構成するモジュールやブロックの入出力関係を調べ、接続関係に矛盾がでないようにすることは非常に煩雑な作業を必要としてしまう。
【０１６４】
一方、本実施形態に係るプログラム開発支援装置１０は、開発環境において新たにモジュールやブロックを作成した場合には、中間プログラムを再生成してプログラム生成支援装置３０に移植すればよい。中間プログラムは、モジュール定義から自動的に再生成することができる。このため、本実施形態に係るプログラム開発支援装置１０によれば、プロ
グラムの開発効率が大幅に向上する。
【０１６５】
（ＩＩ）第２の実施形態
次に、本発明に係るプログラム開発支援装置およびプログラム生成支援装置の第２実施形態について説明する。
【０１６６】
（６）構成
図２５は、本発明の第２実施形態に係るプログラム開発支援装置１０Ａおよびプログラム生成支援装置３０の一例を示すブロック図である。
【０１６７】
この第２実施形態に示すプログラム開発支援装置１０Ａは、開発用制御部１５Ａの中間プログラム生成部２０Ａのプログラムプール作成部２１Ａがプログラムプールの各中間ブロックの出力に対して何回前の出力情報まで保持すべきかを示す保持出力回数を付加する点で第１実施形態に示すプログラム開発支援装置１０と異なる。他の構成および作用については図１に示すプログラム開発支援装置１０およびプログラム生成支援装置３０と実質的に異ならないため、同じ構成には同一符号を付して説明を省略する。
【０１６８】
（７）出力利用回数を考慮した中間プログラムの生成処理
図２６は、図２のステップＳ１で第２実施形態に係るプログラム開発支援装置１０Ａの中間プログラム生成部２０Ａにより実行される、出力利用回数を考慮した中間プログラムの生成処理の一例を示すサブルーチンフローチャートである。図９と同等のステップには同一符号を付し、重複する説明を省略する。
【０１６９】
図２７は、第２実施形態に係るブロック定義に含まれるブロックの入力が保持する利用出力回数の情報の一例を示す説明図である。図２７に示すように、第２実施形態においては、ブロックの入力は、接続された他のブロックの出力の何回前の出力情報まで利用するかを示す利用出力回数の情報が付加されている。
【０１７０】
図２６に示す手順は、ブロックの入力に利用出力回数の情報が付加されたモジュール定義がモジュール定義記憶部１６に記憶されてスタートとなる。
【０１７１】
ステップＳ７１において、モジュール定義取得部１８は、モジュール定義記憶部１６に記憶されたモジュール定義をモジュールごとに取得する。このモジュール定義に含まれるモジュールを構成する各ブロックは、自身の出力１回分に要する出力バッファサイズの情報と、他のブロックの出力と接続された自身の入力が他のブロックの出力の何回前の出力情報まで利用するかを示す利用出力回数の情報と、が付加されている。
【０１７２】
図２８は、利用出力回数の初期値として１が与えられたプログラムプールの一例を示す説明図である。
【０１７３】
ステップＳ１３において、プログラムプール作成部２１Ａは、利用出力回数の初期値として１が与えつつ、プログラムプールを生成する（図２８参照）。
【０１７４】
図２９（ａ）は、図２７に示す例において１より大きい利用出力回数の情報が付加されたブロックＣおよびＤを抽出して示す説明図であり、（ｂ）は図２７に示す例においてプログラムプールの各中間ブロックに対して保持出力回数の情報を付加した様子の一例を示す説明図である。
【０１７５】
ステップＳ７２において、プログラムプール作成部２１Ａは、中間ブロックのそれぞれの出力について、この出力と接続された他のブロックの入力に付加された利用出力回数の情報にもとづいて、何回前の出力情報まで保持すべきかを示す保持出力回数を決定し、各中間ブロックに保持出力回数の情報を付加する。また、プログラムプール作成部２１Ａは、１つの出力が複数の他のブロックの入力に接続される場合、接続される入力のうち最大の利用出力回数に応じて保持出力回数を決定する（図２９（ｂ）参照）。
【０１７６】
本実施形態に係るプログラム開発支援装置１０Ａによっても、第１実施形態に係るプログラム開発支援装置１０と同様の効果を奏する。また、本実施形態に係るプログラム開発支援装置１０Ａは、１つの出力が複数の他のブロックの入力に接続される場合、接続される入力のうち最大の利用出力回数に応じて保持出力回数を決定する。この保持出力回数の情報は、中間プログラムに登録される。このため、出力バッファが足りなくなる弊害を未然に防ぐことができ、開発効率が向上する。また、利用出力回数の違いごとにブロックのインスタンスを分ける必要もなくなり、効率的なプログラムを容易に生成することができる。
【０１７７】
また、本実施形態に係るプログラム開発支援装置１０Ａによれば、モジュール定義にもとづいて保持出力回数を含む中間プログラムが自動生成される。このため、ブロックの開発者は、ブロックの出力がどの他のブロックの入力に参照されるかを考慮する必要がなくなる。このため、開発効率が向上する。
【０１７８】
（ＩＩＩ）第３の実施形態
次に、本発明に係るプログラム開発支援装置およびプログラム生成支援装置の第３実施形態について説明する。
【０１７９】
（８）構成
図３０は、本発明の第３実施形態に係るプログラム開発支援装置１０Ｂおよびプログラム生成支援装置３０Ｂの一例を示すブロック図である。
【０１８０】
この第３実施形態に示すプログラム開発支援装置１０Ｂは、開発用制御部１５Ｂの中間プログラム生成部２０Ｂのプログラムプール作成部２１Ｂがプログラムプールの各中間ブロックの入力に対して他の中間ブロックの出力と接続された自身の入力が他のブロックの出力の何回前の出力情報まで利用するかを示す利用出力回数の情報を付加する点で第１実施形態に示すプログラム開発支援装置１０と異なる。また、プログラム生成支援装置３０Ｂは、実行用制御部３５Ｂのプログラム生成部３９Ｂが、プログラムを生成する際に、使用されるモジュールを構成するブロックのそれぞれの出力について、この出力と接続された他のブロックの入力に付加された利用出力回数の情報にもとづいて何回前の出力情報まで保持すべきかを示す保持出力回数を決定する点で第１実施形態に係るプログラム生成支援装置３０と異なる。他の構成および作用については図１に示すプログラム開発支援装置１０およびプログラム生成支援装置３０と実質的に異ならないため、同じ構成には同一符号を付して説明を省略する。
【０１８１】
図３１は、第３実施形態に係るプログラムプール作成部２１Ｂにより作成されるプログラムプールの一例を示す説明図である。
【０１８２】
図３１に示すように、プログラムプール作成部２１Ｂにより作成されるプログラムプールの各中間ブロックは、自身の出力１回分に要する出力バッファサイズの情報と、他の中間ブロックの出力と接続された自身の入力がこの他の中間ブロックの出力の何回前の出力情報まで利用するかを示す利用出力回数の情報と、が付加される。
【０１８３】
図３２は、図３１に示す例において、第３実施形態に係るプログラム生成部３９Ｂによりプログラムが生成される際に、各ブロックのインスタンスの出力の保持出力回数を決定する様子の一例を示す説明図である。
【０１８４】
本実施形態に係るプログラム生成部３９Ｂは、プログラムを生成する際に、各ブロックのインスタンスの出力について、この出力と接続された他のブロックのインスタンスの入力に付加された利用出力回数の情報にもとづいて何回前の出力情報まで保持すべきかを示す保持出力回数を決定する。
【０１８５】
たとえば、図３２に示す例では、ブロックのインスタンスＬ１の出力に対し、Ｌ３の入力Ｌ１．ｏｕｔおよびＬ５の入力Ｌ１．ｏｕｔが接続されている。このため、プログラム生成部３９Ｂは、プログラムプールから、インスタンスＬ３の入力Ｌ１．ｏｕｔに対応する中間ブロックＫ３の入力Ｋ１．ｏｕｔの利用回数情報「２」と、インスタンスＬ５の入力Ｌ１．ｏｕｔに対応する中間ブロックＫ４の入力Ｋ１．ｏｕｔの利用回数情報「４」と、の情報を取得する。そして、ブロックのインスタンスＬ１の出力に対し、より多い「４」を保持出力回数として付加する。
【０１８６】
本実施形態に係るプログラム開発支援装置１０Ｂおよびプログラム生成支援装置３０Ｂによっても、第１実施形態に係るプログラム開発支援装置１０およびプログラム生成支援装置３０と同様の効果を奏する。また、本実施形態に係るプログラム生成支援装置３０Ｂは、プログラム生成時に各ブロックのインスタンスの保持出力回数を決定する。このため、中間プログラムに含まれる全ての中間ブロックの入出力関係を考慮して保持出力回数を決定する第２実施形態に比べ、出力用メモリの量をプログラムに即して必要最小限にすることができる。
【０１８７】
なお、本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【０１８８】
また、本発明の実施形態では、フローチャートの各ステップは、記載された順序に沿って時系列的に行われる処理の例を示したが、必ずしも時系列的に処理されなくとも、並列的あるいは個別実行される処理をも含むものである。
【符号の説明】
【０１８９】
１０、１０Ａ、１０Ｂ  プログラム開発支援装置
１６  モジュール定義記憶部
１７  中間プログラム記憶部
１８  モジュール定義取得部
２０、２０Ａ、２０Ｂ  中間プログラム生成部
２１、２１Ａ、２１Ｂ  プログラムプール作成部
２２  中間モジュール作成部
３０、３０Ｂ  プログラム生成支援装置
３６  中間プログラム記憶部
３７  プログラム記憶部
３８  受付部
３９、３９Ｂ  プログラム生成部
４０  プログラム実行部
【図１】
2015011467.tif 000003
【図２】
2015011467.tif 000004
【図３】
2015011467.tif 000005
【図４】
2015011467.tif 000006
【図５】
2015011467.tif 000007
【図６】
2015011467.tif 000008
【図７】
2015011467.tif 000009
【図８】
2015011467.tif 000010
【図９】
2015011467.tif 000011
【図１０】
2015011467.tif 000012
【図１１】
2015011467.tif 000013
【図１２】
2015011467.tif 000014
【図１３】
2015011467.tif 000015
【図１４】
2015011467.tif 000016
【図１５】
2015011467.tif 000017
【図１６】
2015011467.tif 000018
【図１７】
2015011467.tif 000019
【図１８】
2015011467.tif 000020
【図１９】
2015011467.tif 000021
【図２０】
2015011467.tif 000022
【図２１】
2015011467.tif 000023
【図２２】
2015011467.tif 000024
【図２３】
2015011467.tif 000025
【図２４】
2015011467.tif 000026
【図２５】
2015011467.tif 000027
【図２６】
2015011467.tif 000028
【図２７】
2015011467.tif 000029
【図２８】
2015011467.tif 000030
【図２９】
2015011467.tif 000031
【図３０】
2015011467.tif 000032
【図３１】
2015011467.tif 000033
【図３２】
2015011467.tif 000034