(57)【要約】【課題】  モデルベース開発環境において、モデルから生成されるソースコードの関数の複雑度のばらつきを低減する。【解決手段】  パーソナルコンピュータ１が、指定されたモデルから、結線によって連なったブロック群をグループ化候補部分として記憶媒体から読み出し（ステップ１０５）、その読み出したグループ化候補部分の複雑度を、ブロック群の種類、ブロック群の結線による接続関係に基づいて累積的に算出する（ステップ１１０）。そして、算出した複雑度が所定の複雑度基準範囲内にある場合（ステップ１１５、１３０）、当該ブロックが新たに含められた後のグループ化候補部分をサブシステム化する（ステップ１３５）。そして、サブシステムを１つの関数とするＣソースコードを生成する。【選択図】 図５
2005332333.tif 000002
【特許請求の範囲】
【請求項１】
モデルによって表現される処理を実現するソースコードを生成し、その生成の際に当該モデルの構成部分がグループ化されている旨のグループ化情報を読み出すと、当該構成部分を当該ソースコード中の１つの関数とするソースコード生成装置、に読み出させるためのグループ化情報を生成するグループ化プログラムであって、
モデルの構成部分を、グループ化候補部分として記憶媒体から読み出す読み出し手段、
前記読み出し手段が読み出した当該グループ化候補部分の複雑度を算出する算出手段、および
前記算出手段が算出した複雑度が所定の複雑度基準範囲内にある場合、当該グループ化候補部分をグループ化する旨のグループ化情報を記憶媒体に書き込む書き込み手段、として演算装置を機能させるグループ化プログラム。
【請求項２】
所定の規則に基づいて信号を出力することを表現するブロックおよびそれらブロック間の信号の入出力の繋がりを表現する結線を有するモデル、によって表現される信号処理を実現するソースコードを生成し、その生成の際に、当該モデルの構成部分がグループ化されている旨のグループ化情報を読み出すと、当該構成部分を当該ソースコード中の１つの関数とするソースコード生成装置、に読み出させるためのグループ化情報を生成するグループ化プログラムであって、
前記結線によって連なったブロック群をグループ化候補部分として記憶媒体から読み出す読み出し手段、
前記読み出し手段が読み出したグループ化候補部分の複雑度を、前記ブロック群の結線による接続関係に基づいて算出する算出手段、および
前記算出手段が算出した複雑度が所定の複雑度基準範囲内にある場合、当該グループ化候補部分をグループ化する旨のグループ化情報を記憶媒体に書き込む書き込み手段、として演算装置を機能させるグループ化プログラム。
【請求項３】
前記算出手段は、前記読み出し手段が読み出したグループ化候補部分の複雑度を、当該グループ化候補部分に含まれるブロックの種類に基づいて算出することを特徴とする請求項２に記載のグループ化プログラム。
【請求項４】
前記読み出し手段は、前記グループ化候補部分に含まれる１つのブロックから１つの結線を経た出力先のブロックを新たに記憶媒体から読み出して当該グループ化候補部分に含めることで、順次グループ化候補部分を更新し、
前記書き込み手段は、前記算出手段が算出した複雑度が、新たに含められたブロックの存在によって所定の複雑度の閾値を超えた場合、当該ブロックが新たに含められた後または含められる前のグループ化候補部分をグループ化する旨のグループ化情報を記憶媒体に書き込むことを特徴とする請求項２または３に記載のグループ化プログラム。
【請求項５】
前記書き込み手段は、前記算出手段が算出した複雑度が、新たに含められたブロックの存在によって所定の複雑度の閾値を超え、かつ当該グループ化候補部分が１つのループを形成するブロック群のうち一部のみと当該ループ外のブロックを含む場合、当該ループを形成するブロック群の当該一部を当該グループ化候補部分から除いた残りの部分をグループ化する旨のグループ化情報を記憶媒体に書き込むことを特徴とする請求項４に記載のグループ化プログラム。
【請求項６】
モデルが記憶された記憶媒体と、
モデルの構成部分を、グループ化候補部分として記憶媒体から読み出す読み出し手段と、
前記読み出し手段が読み出した当該グループ化候補部分の複雑度を算出する算出手段と、
前記算出手段が算出した複雑度が所定の複雑度基準範囲内にある場合、当該グループ化候補部分をグループ化する旨のグループ化情報を記憶媒体に書き込む書き込み手段と、
前記書き込み手段が書き込んだモデルのグループ化情報に基づいて、当該モデルのグループ化情報に係る構成部分１つの関数として有する、当該モデルによって表現される処理を実現するソースコードを生成するソースコード生成手段と、を備えたソースコード生成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、モデルによって表現される処理を実現するソースコードを生成し、その生成の際に当該モデルの構成部分がグループ化されている旨のグループ化情報を読み出すと、当該構成部分を当該ソースコード中の１つの関数とするソースコード生成装置、および当該ソースコード生成装置に読み出させるためのグループ化情報を生成するグループ化プログラムに関する。
【背景技術】
【０００２】
従来より、例えば車両のエンジンＥＣＵの作動のためのプログラムにおいては、開発者が直接そのプログラムのソースコードを記述せず、目的とするプログラムの機能を、より作成が簡易で視認性の良い「モデル」という形態で記述する場合がある（例えば特許文献１参照）。
【０００３】
開発者は、このモデルに対応したプログラム開発環境がインストールされたワークステーション、パーソナルコンピュータ等を用い、モデルから自動的にソースコードを生成する。モデルからソースコードを生成する機能を実現するためのプログラムは、コード生成ツールと呼ばれる。コード生成ツールは、モデル開発環境に組み込まれている場合が多い。モデルからソースコードを生成するようなプログラム開発は、モデルベース開発と呼ばれる。
【０００４】
モデルベース開発に対応したプログラム開発環境としては、例えば、Ｍｏｔｈｗｏｒｋｓ（登録商標）社のＭａｔｌａｂ（登録商標）がある。Ｍａｔｌａｂ（登録商標）においては、開発者はＭａｔｌａｂ（登録商標）の一機能であるＳｉｍｕｌｉｎｋ（登録商標）を用いて、目的とするプログラムのモデルを記述する。
【０００５】
モデルは、ブロックと呼ばれる機能単位および機能単位間の入出力関係を示す結線の組み合わせとして記述される。すなわち、複数のブロックが結線によって繋ぎ合わされた集合体がモデルである。
【０００６】
ブロックの具体例としては、信号の入力（インポート）および出力の一方または両方を表現する。信号の入力や出力の内容は、そのブロックに割り当てられた所定の規則に基づいたものとなっている。ブロックとしては、例えば入力された信号を変数とするサイン関数の値を出力することを表現するブロック、ファイルからデータを読み出すことを表現するブロック、入力されたデータに対する特定の四則演算を行った結果を出力することを表現するブロック、複数のブロックおよび結線がグループ化された上位のブロックとしてのサブシステム等がある。
【０００７】
結線は、あるブロックの出力と他のブロックの入力との繋がりを表現する。具体的には、サイン関数を表現するブロックの出力および階段関数を表現するブロックの出力のそれぞれから、積演算ブロックのそれぞれの入力へリングが繋がっている場合、サイン関数と階段関数とが積演算の対象の項となることが表されている。
【０００８】
このようなモデルベース開発では、開発者がモデルを作成し、その後、モデルからコード生成ツールを用いてソースコードを自動生成する。この際、コード生成ツールは、モデル中に含まれるサブシステムのそれぞれを、ソースコード中の１つの関数に変換する。
【特許文献１】特開平２０００−２０２９１号公報
【発明の開示】
【発明が解決しようとする課題】
【０００９】
このような従来技術におけるコード生成ツールは、そのサブシステムの内部のブロックの構成に関わらず、サブシステムを関数に変換する。したがって、生成されるソースコード中にある関数の複雑度は、サブシステムの大小に応じて非常に大きくなる場合もあれば非常に小さくなる場合もある。
【００１０】
このような場合、ソースコードから生成されたオブジェクトコードの実行効率やソースコードの検査の効率が悪くなる。具体的には、複雑度が小さすぎる関数が多い場合には、オブジェクトコードの実行時に関数コールのオーバーヘッドに無駄な処理時間が費やされてしまう。また、複雑度が大きすぎる関数はソースコードの品質検査の際に検査シナリオが膨大になり時間が掛かると共に、そのソースコード中で実際には実行されない部分を特定するためのカバレッジテストが困難となる。
【００１１】
本発明は上記点に鑑み、モデルベース開発環境において、モデルから生成されるソースコードの関数の複雑度のばらつきを低減することを目的とする。
【課題を解決するための手段】
【００１２】
このような目的を達成するための本発明の特徴は、「モデルによって表現される処理を実現するソースコードを生成し、その生成の際に当該モデルの構成部分がグループ化されている旨のグループ化情報を読み出すと、当該構成部分を当該ソースコード中の１つの関数とするソースコード生成装置」に読み出させるためのグループ化情報を生成するグループ化プログラムが、演算装置を、（１）モデルの構成部分を、グループ化候補部分として記憶媒体から読み出し、（２）その読み出した当該グループ化候補部分の複雑度を算出し、（３）その算出した複雑度が所定の複雑度基準範囲内にある場合、当該グループ化候補部分をグループ化する旨のグループ化情報を記憶媒体に書き込む装置として機能させることである。
【００１３】
このようになっているので、モデルの、複雑度が所定の複雑度基準範囲内にある構成部分についてのグループ化情報をソースコード生成装置が読み出し、当該グループ化された構成部分をソースコード中の１つの関数とする。したがって、ソースコード中の関数は、上述した所定の複雑度基準範囲内に対応した複雑度となるので、モデルから生成されるソースコードの関数の複雑度を低減することができる。
【００１４】
なお、本発明における関数は、クラス、サブルーチンを含む概念である。
【００１５】
また、『「所定の規則に基づいて信号を出力することを表現するブロックおよびそれらブロック間の信号の入出力の繋がりを表現する結線を有するモデル」によって表現される信号処理を実現するソースコードを生成し、その生成の際に、当該モデルの構成部分がグループ化されている旨のグループ化情報を読み出すと、当該構成部分を当該ソースコード中の１つの関数とするソースコード生成装置』に読み出させるためのグループ化情報を生成するグループ化プログラムが、演算装置を、（１）当該結線によって連なったブロック群をグループ化候補部分として記憶媒体から読み出し、（２）その読み出したグループ化候補部分の複雑度を、前記ブロック群の結線による接続関係に基づいて算出し、（３）算出した複雑度が所定の複雑度基準範囲内にある場合、当該グループ化候補部分をグループ化する旨のグループ化情報を記憶媒体に書き込む装置として機能させることによっても本発明の目的は達成される。
【００１６】
なお、結線によって連なったブロック群とは、「そのブロック群に含まれる異なる任意の２個のブロックが、１個以上の結線およびそのブロック群に含まれる０個以上のブロックだけを経て繋がっているようなブロック群」をいう。
【００１７】
また、グループ化プログラムによって、演算装置は、読み出したグループ化候補部分の複雑度を、当該グループ化候補部分に含まれるブロックの種類に基づいた重みづけで算出するように機能してもよい。
【００１８】
また、グループ化プログラムによって、演算装置は、グループ化候補部分に含まれる１つのブロックから１つの結線を経た出力先のブロックを新たに記憶媒体から読み出して当該グループ化候補部分に含めることで、順次グループ化候補部分を更新し、また、算出した複雑度が、新たに含められたブロックの存在によって所定の複雑度の閾値を超えた場合、当該ブロックが新たに含められた後または含められる前のグループ化候補部分をグループ化する旨のグループ化情報を記憶媒体に書き込むように機能してもよい。
【００１９】
また、グループ化プログラムによって、演算装置は、算出した複雑度が、新たに含められたブロックの存在によって所定の複雑度の閾値を超え、かつ当該グループ化候補部分が１つのループを形成するブロック群のうち一部のみと当該ループ外のブロックを含む場合、当該ループを形成するブロック群の当該一部を当該グループ化候補部分から除いた残りの部分をグループ化する旨のグループ化情報を記憶媒体に書き込むように機能してもよい。
【００２０】
また、上記した発明は、モデルが記憶された記憶媒体と、モデルの構成部分を、グループ化候補部分として記憶媒体から読み出す読み出し手段と、読み出し手段が読み出した当該グループ化候補部分の複雑度を算出する算出手段と、算出手段が算出した複雑度が所定の複雑度基準範囲内にある場合、当該グループ化候補部分をグループ化する旨のグループ化情報を記憶媒体に書き込む書き込み手段と、書き込み手段が書き込んだモデルのグループ化情報に基づいて、当該モデルのグループ化情報に係る構成部分１つの関数として有する、当該モデルによって表現される処理を実現するソースコードを生成するソースコード生成手段と、を備えたソースコード生成装置としても実現可能である。
【発明を実施するための最良の形態】
【００２１】
以下、本発明の一実施形態について説明する。図１に、本実施形態に係るソースコード生成装置としてのパーソナルコンピュータ１の構成を示す。このパーソナルコンピュータ１は、ディスプレイ１１、入力装置１２、ＲＡＭ１３、ＲＯＭ１４、ＨＤＤ（ハードディスクドライブ）１５、ＣＰＵ（演算装置に相当する）１６等から構成される。
【００２２】
ディスプレイ１１は、ＣＰＵ１６から入力された映像信号を、ユーザ（開発者）に対して映像として表示する。
【００２３】
入力装置１２は、キーボード、マウス等から構成され、ユーザが操作することにより、その操作に応じた信号をＣＰＵ１６に出力する。
【００２４】
ＲＡＭ１３は読み出し、書き込み可能な揮発性メモリであり、ＲＯＭ１４は読み出し専用の不揮発性メモリであり、ＨＤＤ１５は読み出し、書き込み可能な不揮発性メモリである。ＲＯＭ１４、ＨＤＤ１５には、ＣＰＵ１６が読み出して実行するプログラム等があらかじめ記憶されている。またＨＤＤ１５には、後述するモデルが記憶されている。
【００２５】
ＲＡＭ１３は、ＣＰＵ１６がＲＯＭ１４、ＨＤＤ１５に記憶されたプログラムを実行する際に、そのプログラムを一時的に保存するための記憶領域、および作業用のデータを一時的に保存するための記憶領域として用いられる。
【００２６】
ＣＰＵ１６は、パーソナルコンピュータ１に電源が投入されることによって起動すると、ＲＯＭ１４から所定のブートプログラムを読み出して実行し、このブートプログラムに規定されるオペレーティングシステム（以下ＯＳと記す）その他のプログラムをＨＤＤ１５から読み出して実行することにより、起動処理を行う。起動処理以後、電源が遮断されるまで、ＣＰＵ１６は、入力装置１２からの信号、ＯＳによって予め定められたスケジュール等に基づいて、ＨＤＤ１５に記録されている各種プログラムを当該ＯＳ上のプロセスとして実行する。また、上記した起動処理およびプロセスにおいて、ＣＰＵ１６は必要に応じて入力装置１２から信号の入力を受け付け、またディスプレイ１１に映像信号を出力し、またＲＡＭ１３、ＨＤＤ１５に対してデータの読み出し／書き込みの制御を行う。
【００２７】
パーソナルコンピュータ１のＣＰＵ１６が実行するプログラムの構成を図２に示す。ＣＰＵ１６は、ソースコード生成プログラム２１、サブシステム化プログラム２２等を実行する。
【００２８】
なお以降は、プログラムを実行することによるＣＰＵ１６の動作を、その実行されるプログラム自体の動作であるとして説明する。
【００２９】
ソースコード生成プログラム２１は、ＨＤＤ１５に記憶されているモデルを読み出し、この読み出したモデルによって表現される信号処理を実現するソースコードを生成する。
【００３０】
モデルは、所定の規則に基づいて信号を出力することを表現するブロックおよびそれらブロック間の信号の入出力の繋がりを表現する結線等から成る。このようなモデルは、図示しないモデルエディタ等の、ＣＰＵ１６が上記ＯＳ上で実行されるプログラムをユーザが利用することによって作成され、さらにＨＤＤ１５に記憶されるようになっている。
【００３１】
モデルエディタとしては、例えばＭａｔｌａｂ（登録商標）上で動作するＳｉｍｕｌｉｎｋ（登録商標）と呼ばれるソフトウェアを用いることができる。
【００３２】
図３に、このようなモデルエディタによって作成されたモデルの一例を示す。図中に長方形または円形で表されたものがブロックである。ブロックは、入力端および出力端のいずれかまたは両方を有し、所定の信号処理を行う。その信号処理は、当該ブロックが入力端を有していればその入力端から受けた信号に基づいたものとなる。また、当該ブロックが出力端を有していれば、当該信号処理の結果を出力端から出力する。
【００３３】
また、ブロック間を繋ぐ矢印線が結線を表している。結線は、ブロックの出力端を始点とし、ブロックの入力端を終点とするようになっている。なお、結線の始点および終点とは、それぞれ当該結線を表す矢印線の矢印のない端点および矢印のある端点をいう。
【００３４】
そして、あるブロックＡの出力端とあるブロックＢの入力端との結線による繋がりは、当該ブロックＡの当該出力端からの出力が当該ブロックＢの当該入力端において入力されることを表す。すなわち、結線は、ブロック間の入出力の関係を表すものである。
【００３５】
図３中、ブロック３０１、３０２、３０３、３０９は、条件分岐用のＩＦブロックである。ＩＦブロックは、条件信号入力端（図中上から２番目の入力端）を含む３つの入力端を有し、条件信号入力端からの信号がオンであるかオフであるかに基づいて、他の２つの入力端から受けた信号のいずれかを出力する。
【００３６】
また、ブロック３０４〜３０８は、四則演算ブロックであり、複数の入力端から受けた信号を用いた所定の加算、減算、乗算、除算を行い、その結果を出力する。
【００３７】
また、図３におけるブロック３０１〜３０９以外のブロックは、ＲＡＭ１３、ＨＤＤ１５等にあらかじめ記憶された所定のデータを出力するデータリードブロック、または入力があったデータをＲＡＭ１３、ＨＤＤ１５等に記憶させるデータライトブロックである。
【００３８】
図４に、ソースコード生成プログラム２１が図３のブロックを元に生成したＣソースコードを示す。
【００３９】
図５のソースコード中の最初のｉｆブロックがブロック３０１およびそれに関連するデータリードブロックの機能を実現し、２番目のｉｆブロックがブロック３０２およびそれに関連するデータリードブロックの機能を実現し、３番目のｉｆブロックがブロック３０３およびそれに関連するデータリードブロックの機能を実現し、４番目のｉｆブロックがブロック３０９およびそれに関連するデータリードブロック、データライトブロックの機能を実現する。
【００４０】
また、４番目のｉｆブロック中において、最初の中括弧｛｝内の代入式の右辺がブロック３０４、３０５、３０６およびそれに関連するデータリードブロックの機能を実現し、２番目の中括弧｛｝内の代入式の右辺がブロック３０７、３０８、およびそれに関連するデータリードブロックの機能を実現する。
【００４１】
また、ソースコード生成プログラム２１はこのソースコード生成の際、そのモデル中で１つのサブシステムとしてグループ化されているブロック群によって表現される信号処理を、当該ソースコード中の１つの関数とする。ここで、モデル中であるブロック群がサブシステムとしてまとめられていること自体が、当該ブロック群がグループ化されている旨の情報、すなわちグループ化情報に相当する。
【００４２】
以上のようなソースコード生成プログラム２１としては、Ｍａｔｌａｂ（登録商標）上で動作するＲｅａｌ  Ｔｉｍｅ  Ｗｏｒｋｓｈｏｐ（登録商標）と呼ばれる、Ｓｉｍｕｌｉｎｋ（登録商標）で作成されたモデルに基づいたＣソースコードを生成するソフトウェアを用いることができる。
【００４３】
サブシステム化プログラム２２は、ＨＤＤ１５中に記憶されているモデルを読み出して、その一部をモデルの複雑度に関する所定の基準に基づいてサブシステム化し、その一部がサブシステム化されたモデルをＨＤＤ１５に記憶させるためのプログラムである。サブシステム化とは、モデル中の複数のブロックを１つのサブシステムにグループ化することをいう。そして、このサブシステム化された構成部分を有するモデルをＨＤＤ１５に記憶することが、グループ化情報を記憶させることに相当する。
【００４４】
例えば、Ｒｅａｌ  Ｔｉｍｅ  Ｗｏｒｋｓｈｏｐ（登録商標）においては、ユーザがディスプレイ１１に表示されているモデルの一部を入力装置１２を用いて選択し、さらにそれらをサブシステム化する旨の操作を入力装置１２を用いて行うことで、当該サブシステム化が実現される。本実施形態では、サブシステム化プログラム２２が、このような処理を自動的に行うことで、サブシステム化を実現する。
【００４５】
図５に、このサブシステム化プログラム２２のフローチャートを示す。ステップ１０５では、サブシステム化プログラム２２は、ＨＤＤ１５に記憶されたモデルから、入力装置１２等の操作によってユーザが指定したモデルの一部として１つのブロックを読み込み、それをグループ化候補部分のいずれか１つに含める。なお、グループ化候補部分に含めるとは、具体的にはＲＡＭ１３中のグループ化候補リストにそのブロックを登録することをいう。グループ化候補リストとは、グループ化候補部分が含むブロックの名称、当該ブロック毎の後述する累積的な複雑度、および後述するＦｏｒループ始点情報等を含むテーブルである。
【００４６】
ここで、読み出すブロックは、具体的には、以下の条件（１）、（２）のどちらかを満たすブロックのいずれか１つである。
条件（１）： 入力端を有さない
条件（２）：  自己の入力端と１つの結線を介して繋がっているブロックのそれぞれが既にサブシステム化されているまたはグループ化候補リストに登録されている
そして、この読み出したブロックを、どのグループ化候補リストに登録するかは、以下の基準（１）および基準（２）に基づいて決定する。
【００４７】
基準（１）：読み出したブロックが、入力端を有さないものであるか、またはそのブロックの入力端と１つの結線を介して繋がっているブロックのすべてが既にサブシステム化されている場合、新たなグループ化候補リストを生成し、その生成したグループ化候補リストに読み出したブロックを登録する。
【００４８】
基準（２）：読み出したブロックが、「グループ化候補リストに登録されているブロックと１つの結線を介して繋がる入力端」を少なくとも１つ有している場合、それら１つ以上のグループ化候補リストを１つにまとめ、さらに読み出したブロックをその１つにまとめられたグループ化候補リストに登録する。なお、グループ化候補リストを１つにまとめる場合、まとめられたグループ化候補リストは、まとめられる前のグループ化候補リストがＦｏｒループ始点情報を有していれば、その情報も含むようにする。
【００４９】
このように、サブシステム化プログラム２２がグループ化候補リストを生成することで、グループ化候補部分は、それに含まれる１つのブロックから１つの結線を経た出力先のブロックが新たにグループ化候補部分に含められることで、順次更新される。その結果グループ化候補部分は、結線によって連なったブロック群となる。なお、結線によって連なったブロック群とは、「そのブロック群に含まれる異なる任意の２個のブロックが、１個以上の結線およびそのブロック群に含まれる０個以上のブロックのみを経て繋がっているようなブロック群」をいう。
【００５０】
次にステップ１１０で、直前に読み込んだブロックが含まれたグループ化候補リストに対応するグループ化候補部分の複雑度を、グループ化候補リストに含まれるブロックの種類、および当該ブロック間の結線による接続関係に基づいて計算する。具体的には、当該ブロック間の結線に沿って、出力する側のブロックから入力する側のブロックへ、複雑度を累積的に順次継承させ、最も後段のブロックにおける複雑度を、そのグループ化候補部分の複雑度とする。そして、各ブロックにおける複雑度の累積的な継承の方法は、ブロックの種類毎にあらかじめ決められ、ＨＤＤ１５に記憶されている。
【００５１】
本実施形態においては、複雑度として、出力パターン数を用いる。そして、ｉｆブロック、比較ブロック、スイッチブロックにおける累積的な継承の方法は、条件信号入力端以外の２つの入力端のそれぞれに１つの結線を介して繋がるブロックにおける累積的な出力パターン数の総和を取ることである。また、四則演算ブロックにおける累積的な継承の方法は、複数の入力端のそれぞれに１つの結線を介して繋がるブロックにおける累積的な出力パターン数の総積を取ることである。
【００５２】
ステップ１１０では、この計算のために、直前に読み込んだブロックの種類を特定し、そのブロックの入力端に１つの結線を介して繋がるブロックにおける累積的な出力パターン数をブロック化候補リストから読み出し、そのブロックの種類の累積的な継承方法に基づいて、当該読み出した出力パターン数に対して当該継承方法によって規定された演算を行い、その演算結果を、当該ブロックにおける累積的な出力パターン数とし、さらに、この演算結果を、当該グループ化候補部分の複雑度としての出力パターン数とする。
【００５３】
なお、本実施形態では、入力端を有さないブロックにおける出力パターン数は２であるとする。また、サブシステム化プログラム２２によってサブシステム化されたサブシステムからの出力パターン数は１であるとする。
【００５４】
次にステップ１１２で、直前に読み込んだブロックが含まれたグループ化候補リストがＦｏｒループ内に進入した場合、当該ブロックの位置をＦｏｒループ開始位置とするＦｏｒループ始点情報を当該グループ化候補リストに含める。なお、「直前に読み込んだブロックが含まれたグループ化候補リストがＦｏｒループ内に進入した」ことは、当該直前に読み込んだブロックがＦｏｒループを構成するサブシステム内部にあり、かつ、討議ブロックが含まれたグループ化候補リストには、他にそのＦｏｒループを構成するサブシステム内部にあるブロックを含まないこと
によって特定できる。
【００５５】
次にステップ１１５で、計算したグループ化候補部分の複雑度が、所定の閾値（例えば１０）より小さいか否かを判定し、小さい場合、続いてステップ１２０を実行し、小さくない場合、続いてステップ１３０を実行する。
【００５６】
ステップ１２０では、指定されたモデルのすべてのブロックの読み込みが終了したか否か、すなわち、直前に読み出したブロックが、そのモデル中で最後に読み出されたブロックであるか否か、を判定する。
【００５７】
すべてのブロックの読み込みが終了した場合、続いてステップ１２５を実行し、終了していない場合、続いてステップ１０５を実行する。
【００５８】
ステップ１２５では、現グループ化候補部分、すなわち直前に読み込んだブロックが含まれるグループ化候補部分をサブシステム化する。ただし、グループ化候補部分に当該ブロックのみが含まれている場合は、サブシステム化を行わない。ステップ１２５の後、サブシステム化プログラム２２の実行は終了する。
【００５９】
ステップ１３０では、直前に読み出したブロックがＦｏｒループ中のブロックであるか否かを判定する。Ｆｏｒループ中のブロックであれば続いてステップ１３５を実行し、Ｆｏｒループ中のブロックでなければ続いてステップ１４５を実行する。
【００６０】
ステップ１３５では、ステップ１２５と同様に、現グループ化候補部分をサブシステム化する。ステップ１３５の後、続いてステップ１０５の処理を実行する。
【００６１】
ステップ１４５では、現グループ化候補部分のうち、Ｆｏｒループ開始位置の直前までのブロックをサブシステム化する。具体的には、現グループ化候補部分についてのブロック化候補リストから、ステップ１１２で記憶したＦｏｒループ始点情報に基づいて、Ｆｏｒループ開始位置のブロックを特定し、この特定したブロックおよび当該ブロックの出力端以降に連なるブロックを、当該ブロック化候補リストから削除し、残ったブロックをサブシステム化する。なお、始点情報中にブロックの始点が２つ以上ある場合、当該残った部分を、結線によって連なったブロック毎にサブシステム化する。
【００６２】
ステップ１４５の後、続いてステップ１０５の処理を実行する。
【００６３】
以上のようなサブシステム化プログラム２２を実行することによってＣＰＵ１６は、指定されたモデルから、結線によって連なったブロック群をグループ化候補部分として記憶媒体から読み出し（ステップ１０５参照）、その読み出したグループ化候補部分の複雑度を、ブロック群の種類、ブロック群の結線による接続関係に基づいて累積的に算出する（ステップ１１０参照）。
【００６４】
そしてＣＰＵ１６は、算出した複雑度が所定の複雑度基準範囲内にある場合、すなわち、新たなブロックがグループ化候補部分に含められることによって複雑度が所定の複雑度の閾値を超え（ステップ１１５参照）、かつ当該グループ化候補部分を独立した関数とするＣソースコードを生成することが可能である場合（ステップ１３０参照）、当該ブロックが新たに含められた後グループ化候補部分をサブシステム化する（ステップ１３５参照）。
【００６５】
ここで、「当該グループ化候補部分を独立した関数とするＣソースコードを生成することが可能である場合」とは、「当該グループ化候補部分がＦｏｒループを形成するブロック群のうち一部のみを有しており、かつ当該Ｆｏｒループ外のブロックを含むようになっている場合」以外の場合に相当する。
【００６６】
また、ＣＰＵ１６は、新たなブロックがグループ化候補部分に含められることによって複雑度が所定の複雑度の閾値を超え（ステップ１１５参照）、かつ当該グループ化候補部分を独立した関数とするＣソースコードを生成することが不可能である場合（ステップ１３０参照）、当該Ｆｏｒループを形成するブロック群の当該一部を当該グループ化候補部分から除いた残りの部分をサブシステム化する（ステップ１４５参照）。
【００６７】
このような処理において、ステップ１２０、１３５、１４５からステップ１０５に戻ることによるループが繰り返されることで、指定されたモデルのすべてのブロックについてサブシステム化が行われる。
【００６８】
なお、当該ブロックが新たに含められた後のグループ化候補部分ではなく、当該ブロックが新たに含められる前のグループ化候補部分をサブシステム化するようになっていてもよい。
【００６９】
図６に、図３に示したモデルが指定されてサブシステム化プログラム２２が実行された場合の、サブシステム化プログラム２２がＨＤＤ１５に出力するモデルを示す。ただし、この例においては、上記した出力パターン数の閾値は１０である。
【００７０】
図６においては、ブロック３０３およびそれらの前段のブロックから成るブロック群が、サブシステム４０１としてサブシステム化されている。また、残りのブロック群のうち、最後端のブロック（すなわち出力端を有しないブロック）が、サブシステム４０２としてサブシステム化されている。
【００７１】
これは、サブシステム化プログラム２２を実行することによる以下のような出力パターン数の算出によって実現される。すなわち、ｉｆブロック３０１、３０２における出力パターン数は（２＋２）＝４となり、ｉｆブロック３０３における出力パターン数は（４＋４）＝８となり、積演算ブロック３０４にける出力パターン数は（８×２）＝１６となる。したがって、積演算ブロック３０４を読み出した直後のステップ１１５で、複雑度が閾値を超え、ステップ１３５で当該積演算ブロック３０４および積演算ブロック３０４の前段のブロックから成るブロック群がサブシステム化される。
【００７２】
また、和演算ブロック３０５における出力パターン数は（２×１）＝２となり、差演算ブロック３０６における出力パターン数は（２×２）＝４となり、積演算ブロック３０７における出力パターン数は（２×２）＝４となり、積演算ブロック３０８における出力パターン数は（２×４）＝８となり、ｉｆブロック３０９における出力パターン数は（４＋８）＝１２となる。したがって、ｉｆブロック３０９を読み出した直後のステップ１１５で、複雑度が閾値を超え、ステップ１３５で当該積演算ブロック３０９の前段のブロックから成るブロック群（ただしサブシステム４０１のブロック群は除く）がサブシステム化される。
【００７３】
このようにしてサブシステム化された後のモデルに基づいてソースコード生成プログラム２１が生成するＣソースコードを図７に示す。
【００７４】
図７の最も下にある関数ｓａｍｐｌｅ１ｓｕｂ＿ｃａｌ（）が、図６のモデル全体を示す部分であり、この関数内で呼び出される関数Ｓｕｂｓｙｓｔｅｍ１（）およびＳｕｂｓｙｓｔｅｍ２（）が、それぞれサブシステム４０１および４０２に対応する部分である。このように、ソースコード生成プログラム２１は、サブシステムを１つの関数としたＣソースコードを生成する。
【００７５】
このとき、サブシステムは所定の複雑度閾値に基づいて区切られているので、生成される関数においても、複雑度のばらつきが少ない。したがって、適切な複雑度を維持した関数を有するＣソースコードが生成される。
【００７６】
次に、図８に、モデルの別の例として、Ｆｏｒループを示すサブシステム８０１を有するモデルを示す。
【００７７】
ブロック６０１は２つの入力のうち値が大きい方を出力する比較ブロックであり、ブロック６０２は２つの入力のうち値が小さい方を出力する比較ブロックである。また、ブロック６０９は、図中最上部の入力端から受けた条件信号が１、２、または３のいずれを示すかに基づいて、他の３つの入力端から受けた信号のいずれを出力するかを選択するスイッチブロックである。
【００７８】
Ｆｏｒサブシステム８０１は、このサブシステムに含まれるブロックによる機能をある回数だけ繰り返し実行する機能を表すサブシステムである。図９に、図８のモデルに基づいてソースコード生成プログラム２１が生成するＣソースコードを示す。
【００７９】
図９において、Ｆｏｒサブシステム８０１の機能を実現するための部分は、ｆｏｒソースブロック９０１である。
【００８０】
このように、ソースコード生成プログラム２１によって、図８のＦｏｒサブシステム８０１の内部に表された処理が、ｆｏｒソースブロック９０１の内部のソースコードとして実現され、その結果、変数ＮＵＭの回数だけ、当該処理が繰り返される。
【００８１】
このようなｆｏｒソースブロックを、その一部のみが他のソースコードと共に関数化することはできない。したがって、Ｆｏｒサブシステム８０１の内部のブロック群のうち、その一部のみをＦｏｒサブシステム８０１外のブロックと共にサブシステム化しても、正常に機能するソースコードは生成できない。
【００８２】
サブシステム化プログラム２２は、図８に示すようなモデルを指定された上で実行されると、上述したステップ１１２、１３０、１４５の処理によって、Ｆｏｒサブシステム８０１を構成するブロックのうち一部のみが他の外部のブロックと共にサブシステム化されないようなサブシステム化の処理を行うことができる。なお、この場合においても、複雑度の閾値は１０であるとする。
【００８３】
具体的には、サブシステム化プログラム２２を実行することにより、ＣＰＵ１６が以下のような出力パターン数の算出を行う。すなわち、比較ブロック６０１における出力パターン数は（２＋２）＝４となり、比較ブロック６０２における出力パターン数は（２＋４）＝６となる。
【００８４】
そして、ステップ１０５でブロック６０３を読み出したとき、ステップ１１２で、このブロックの位置をＦｏｒループ開始位置とするＦｏｒループ始点情報が、グループ化候補リストに追加される。
【００８５】
そして、比較ブロック６０２における出力パターン数は（６×２）＝１２となる。このとき、出力パターン数が閾値を超え（ステップ１１５参照）、かつ現在のブロックがｆｏｒループ内なので（ステップ１３０参照）、ＣＰＵ１６は、ステップ１４５によって、ｆｏｒループの開始位置の前まで、すなわちブロック６０２およびその前段をサブシステム化する。これが、図１０のサブシステム７０１に相当する。
【００８６】
そして、積演算ブロック６０３における出力パターン数は（１×２）＝２となり、積演算ブロック６０４における出力パターン数は（２×２）＝４となり、積演算ブロック６０５における出力パターン数は（４×２）＝８となり、積演算ブロック６０６における出力パターン数は（８×２）＝１６となる。ここで、出力パターン数が閾値を超えたので、ステップ１３５で当該積演算ブロック６０６の前段のブロックから成るブロック群（ただしサブシステム７０１のブロック群は除く）がサブシステム化される。これが、図１０のサブシステム７０２に相当する。
【００８７】
また、和演算ブロック６０７における出力パターン数は（２×２）＝４となり、差演算ブロック６０８における出力パターン数は（２×１）＝２となり、スイッチブロック６０９における出力パターン数は（１＋４＋２）＝７となり最後のデータライトブロックにおける出力パターン数は７となる。従って、複雑度が閾値を超える前にすべてのブロックの読み込みが終了したので（ステップ１２０参照）、現在のグループ化リストに含まれるブロック、すなわち、サブシステム７０１、７０２に含まれないブロックがサブシステム化される。これが、図１０のサブシステム７０３に相当する。
【００８８】
このようにしてサブシステム化プログラム２２の実行によりサブシステム化されたモデルに基づいてソースコード生成プログラム２１が生成するＣソースコードを図１１に示す。
【００８９】
図１１の最も下にある関数ｓａｍｐｌｅ２＿ｃａｌ（）が、図６のモデル全体を示す部分であり、この関数内で呼び出される関数Ｓｕｂｓｙｓｔｅｍ１（）、Ｓｕｂｓｙｓｔｅｍ２（）およびＳｕｂｓｙｓｔｅｍ３（）が、それぞれサブシステム７０１、７０２および７０３に対応する部分である。
【００９０】
このとき、サブシステムは所定の複雑度閾値に基づいて区切られているので、生成される関数においても、複雑度のばらつきが少ない。したがって、適切な複雑度を維持した関数を有するＣソースコードが生成される。また、Ｆｏｒサブシステム８０１を構成するブロックのうち一部のみが他のブロックと共にサブシステム化されることがないので、実行可能な正常なソースコードが生成される。
【００９１】
なお、上記した実施形態においては、サブシステム化プログラム２２がグループ化プログラムに相当し、パーソナルコンピュータ１がソースコード生成装置に相当し、ＲＡＭおよびＨＤＤが記憶媒体に相当する。
【００９２】
また、ＣＰＵ１６が、サブシステム化プログラム２２のステップ１０５の処理を実行することで、読み出し手段として機能する。
【００９３】
また、ＣＰＵ１６が、サブシステム化プログラム２２のステップ１１０の処理を実行することで、算出手段として機能する。
【００９４】
また、ＣＰＵ１６が、サブシステム化プログラム２２のステップ１１５、１３０、１３５、１４５の処理を実行することで、書き込み手段として機能する。
【００９５】
また、ＣＰＵ１６が、ソースコード生成プログラム２１を実行することで、ソースコード生成手段として機能する。
【００９６】
また、上記したサブシステム化プログラム２２は、ステップ１１２、１３０、１４５の処理によって、Ｆｏｒループを構成するブロックのうち一部のみが他のブロックと共にサブシステム化されないようにしているが、このような、その構成部分の一部のみが他のブロックと共にサブシステム化されないようにする対象は、必ずしもＦｏｒループのみである必要はない。例えば、ｗｈｉｌｅループのサブシステム等の、Ｓｉｍｕｌｉｎｋ（登録商標）のアトミックサブシステムのすべてを対象として、上記のような処理を行ってもよい。すなわち、Ｆｏｒループは、構成するブロックのうち一部のみが他の外部のブロックと共にサブシステム化されると、サブシステムを関数として生成するソースコード生成プログラム２１が正常なプログラムを生成できなくなるようなモデルの構成部分として一般化できる。
【００９７】
また、上記した実施形態においては、ブロック群の複雑度として、出力パターン数を用いたが、これ以外にも、ブロック数、ディスプレイ１１にモデルを表示させたときに当該ブロック群が占める表示面積等を用いてもよい。また、生成されるソースコード中の当該ブロック群に対応する部分のネスト数、コード行数、ループ数、代入変数数等を、当該ブロック群の複雑度としてもよい。
【００９８】
ある指標が複雑度であるか否かは、あるグループ化されたブロック群についてのその指標の値と、そのブロック群の総ブロック数との間に強い相関関係があるか否かで特定することができる。
【００９９】
また、上記実施形態においてデータリードブロックとして説明したブロックは、任意に複雑度の値を設定してもよいブロックの例として示したものであり、必ずしもデータリードブロックとして実現されておらずともよい。
【０１００】
また、ブロックの種類毎の複雑度の累積的な継承の方法は、入力装置１２を用いて入力するようになっていてもよい。
【０１０１】
また、ソースコード生成プログラム２１が生成するソースコードは、プログラミング言語Ｃに限らない。Ｊａｖａ（登録商標）やＣ＋＋のソースコードであってもよい。
【図面の簡単な説明】
【０１０２】
【図１】パーソナルコンピュータ１の構成を示す図である。
【図２】ＣＰＵ１６の実行するプログラムを示す図である。
【図３】モデルの一例を示す図である。
【図４】図３に示したモデルを元にソースコード生成プログラム２１が生成したＣソースコードを示す図である。
【図５】サブシステム化プログラム２２のフローチャートである。
【図６】図３に示したモデルに基づいてサブシステム化プログラム２２が生成するモデルを示す図である。
【図７】図６に示したモデルに基づいてソースコード生成プログラム２１が生成したＣソースコードを示す図である。
【図８】Ｆｏｒループを有するモデルの一例を示す図である。
【図９】図８に示したモデルに基づいてソースコード生成プログラム２１が生成したＣソースコードを示す図である。
【図１０】図８に示したモデルに基づいてサブシステム化プログラム２２が生成するモデルを示す図である。
【図１１】図１０に示したモデルに基づいてソースコード生成プログラム２１が生成したＣソースコードを示す図である。
【符号の説明】
【０１０３】
１…パーソナルコンピュータ、１１…ディスプレイ、１２…入力装置、１３…ＲＡＭ、
１４…ＲＯＭ、１５…ＨＤＤ、１６…ＣＰＵ、２１…ソースコード生成プログラム、
２２…サブシステム化プログラム、３０１〜３０９…ブロック、
４０１、４０２…サブシステム、６０１〜６０９…ブロック、
７０１〜７０３…サブシステム、８０１…Ｆｏｒループサブシステム、
９０１…ｆｏｒソースブロック。
【図１】
2005332333.tif 000003
【図２】
2005332333.tif 000004
【図３】
2005332333.tif 000005
【図４】
2005332333.tif 000006
【図５】
2005332333.tif 000007
【図６】
2005332333.tif 000008
【図７】
2005332333.tif 000009
【図８】
2005332333.tif 000010
【図９】
2005332333.tif 000011
【図１０】
2005332333.tif 000012
【図１１】
2005332333.tif 000013