(57)【要約】      （修正有）【課題】モデル上で再帰呼び出しを使用しつつモデルからソースコードを生成できるようにしたソースコード生成装置を提供する。【解決手段】パーソナルコンピュータは、モデル内の再帰関数サブシステムを特定し、再帰関数サブシステム内において再帰呼び出しブロックを特定し、特定された再帰呼び出しブロックをループコードに変換することによりソースコードを生成するＳ２０４〜Ｓ２０６。【選択図】図６
2015161983.tif 000002
【特許請求の範囲】
【請求項１】
再帰関数サブシステム（２０）、及び、前記再帰関数サブシステム内に構成された再帰呼び出しブロック（２１）を用いて記述されたモデル（１１）に基づいてソースコード（Ｃ）を生成する生成手段（１、１６）と、
前記モデル内の再帰関数サブシステムを特定する第１特定手段（１、Ｓ１０６）と、
前記第１特定手段により特定された前記再帰関数サブシステム内において末尾再帰呼び出しブロック（２１）を特定する第２特定手段（１、Ｓ３０３）と、を備え、
前記生成手段（１、１６）は、前記第２特定手段により特定された再帰呼び出しブロックをループコードに変換することにより前記ソースコード（Ｃ）を生成することを特徴とするソースコード生成装置。
【請求項２】
請求項１記載のソースコード生成装置において、
前記第２特定手段により特定された再帰呼び出しブロックが末尾再帰であるか否かを前記生成手段によるソースコード生成処理に先立って判定する末尾再帰判定手段（１、Ｓ２０２）を備えることを特徴とするソースコード生成装置。
【請求項３】
請求項１または２記載のソースコード生成装置において、
前記第１特定手段により特定された再帰関数サブシステムの入力ポート及び出力ポートの数と、前記第２特定手段により特定された再帰呼び出しブロックの入力ポート及び出力ポートの数と、が等しいか否かを前記生成手段によるソースコード生成処理に先立って判定する個数整合手段（１、Ｓ１０９）を備えることを特徴とするソースコード生成装置。
【請求項４】
請求項１〜３の何れか一項に記載のソースコード生成装置において、
前記第１特定手段は、前記モデルに予め設定されると共に記憶部に記憶された属性データ（３０）に基いて再帰関数サブシステムを特定することを特徴とするソースコード生成装置。
【請求項５】
請求項１〜４の何れか一項に記載のソースコード生成装置において、
前記第２特定手段は、前記モデルに予め設定されると共に記憶部に記憶された属性データ（３０）に基いて再帰呼び出しブロックを特定することを特徴とするソースコード生成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースコード生成装置に関する。
【背景技術】
【０００２】
この種のソースコード生成装置は、例えば車両のエンジンＥＣＵのプログラム開発支援に用いられている。このソースコード生成装置は、プログラムの開発者が直接ソースコードを記述することなく、目的とするプログラムの機能をより簡易的に視認性の良い「モデル」という形態で記述する。すると、プログラム開発者の可読性を向上できるようになりプログラム構造を容易に把握できる。
【０００３】
開発者は、このモデル記述用の開発環境がインストールされたワークステーション又はパーソナルコンピュータ（以下ＰＣ）等を用い、この「モデル」により定義された演算処理等のシミュレーション処理を行い、ＰＣは当該「モデル」に応じたソースコードを自動生成する。このモデルに基づいてソースコードを自動生成するためのプログラム開発はモデルベース開発と呼ばれている。モデルベース開発を行うためのプログラム開発環境は、例えばＭＡＴＬＡＢ（登録商標）およびこれに付加機能を提供するＳｉｍｕｌｉｎｋ（登録商標）が知られている。
【０００４】
モデルベース開発を行う場合、開発者は例えばＳｉｍｕｌｉｎｋ（登録商標）を用いて「モデル」を記述する。この「モデル」は各種演算を示すブロックと当該ブロック間のデータの授受を示す信号線とでＧＵＩ(graphical user interface)環境下で表現されたプログラムを示す。従来、「モデル」はプログラミング言語から制御フローを記述する多くの機能がブロックとして取り入れられており、様々な制御構造を表現できる。特に、繰り返し処理においては、例えばＣ言語などの手続型言語のforループ又はwhileループなどに相当するブロックを備える。
【０００５】
このようなモデルベース開発における自動コード生成技術は、例えば特許文献１に示されている。この特許文献１記載の技術においては、ブロックセットを自動的にサブシステム化することで、生成されるソースコードの複雑度のばらつきを低減させている。
【０００６】
近年、モデルベース開発は、その適用される領域がますます拡大しており、これに伴い、より複雑なアルゴリズムをモデルにより記述する必要性が高まってきている。中でも、大規模データの探索処理中で利用される再帰的アルゴリズムへのモデル適用が検討されている。再帰的アルゴリズムは自分自身を呼び出す再帰関数を使用したアルゴリズムを示す。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００５−３３２３３３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
再帰関数は、再帰呼出を用いた記述の方が一般的なループを用いた記述よりも簡潔になることが多く近年では多用されている。従来技術では、再帰呼び出しに相当するブロックを備えていないため、再帰的アルゴリズムを直接的にモデルによって記述できない。このため、開発者は、再帰的アルゴリズムを扱うときに、そのアルゴリズムについて一般的なループを用いて書き直さなければならない。
【０００９】
しかし、開発者が再帰的アルゴリズムを一般的なループを用いて書き直した場合、元のアルゴリズムよりも複雑になる傾向がある。すると、もともとのアルゴリズムがもつ複雑さだけではなく、再帰的アルゴリズムを一般的なループに書き直すことでもたらされる複雑さも加えられるため、結果、モデルの構成要素数が増加し、モデルの記述しやすさや可読性が低下する。
【００１０】
また、再帰的アルゴリズムを直接的に記述すると、プログラム実行時にコールスタックとなるメモリ領域を消費する。このメモリ領域は、再帰呼出のときに呼出深さに比例して無制限に消費されてしまう。すると、一般的にメモリの使用容量が制限される環境下において、再帰呼出の使用が避けられることになり前述の再帰呼出処理の利点を享受できなくなってしまう。
【００１１】
本発明の目的は、モデル上で再帰呼び出し機能を使用しつつモデルからソースコードを生成でき、メモリ領域を効率的に使用できるようにしたソースコード生成装置を提供することにある。
【課題を解決するための手段】
【００１２】
請求項１記載の発明によれば、第１特定手段は、モデル内の再帰関数サブシステムを特定し、第２特定手段は再帰関数サブシステム内において再帰呼び出しブロックを特定し、生成手段は特定された再帰呼び出しブロックをループコードに変換することによりソースコードを生成している。このため、開発者は、再帰関数サブシステム及び再帰呼び出しブロックを用いて、より視認性良くモデルを構築できる。生成手段が、モデルをソースコードに変換したときには、再帰呼び出しブロックをループ処理に変換できるため、メモリ領域を効率的に使用できることになる。
【図面の簡単な説明】
【００１３】
【図１】一実施形態に係るソースコード生成装置の内部処理内容を概略的に示す説明図である。
【図２】ソースコード生成装置のハードウェア構成例を概略的に示す電気的構成図
【図３】（ａ）モデルを概略的に示す表示例、（ｂ）再帰呼び出しブロックを概略的に示す表示例
【図４】ブロックの属性データ例を示す図
【図５】ブロック走査アルゴリズムを概略的に示すフローチャート
【図６】再帰関数サブシステム用のコード生成ルーチンを概略的に示すフローチャート
【図７】末尾再帰判定処理を概略的に示すフローチャート
【図８】再帰呼び出しブロックのコード生成処理を概略的に示すフローチャート
【図９】再帰呼び出しブロックのコード生成処理内容を概略的に示す図
【図１０】基本ブロックのコード生成処理内容を概略的に示す図
【図１１】基本的なブロックのみを用いてモデル記述した場合の二分探索アルゴリズム（その１）
【図１２】基本的なブロックのみを用いてモデル記述した場合の二分探索アルゴリズム（その２）
【図１３】末尾再帰の形態で表した二分探索アルゴリズムのソースコード例
【図１４】末尾再帰の形態でモデル記述した場合の二分探索アルゴリズム
【図１５】モデルを構成するブロック数と信号線数とを比較した評価結果
【図１６】ソースコード生成例
【図１７】コールスタック消費量による評価結果
【図１８】（ａ）は再帰を使用したプログラム例、（ｂ）は末尾再帰を使用したプログラム例
【図１９】（ａ）は末尾再帰最適化適用前のプログラム例、（ｂ）は末尾再帰最適化適用後のプログラム例
【発明を実施するための形態】
【００１４】
以下、本発明の一実施形態について図面を参照しながら説明する。図２に示すように、ワークステーション又はパーソナルコンピュータ（以下、ＰＣ）１は、ＣＰＵ２、ＲＯＭ３、ＲＡＭ４、ハードディスクドライブ（ＨＤＤ）５、入力装置６及びディスプレイ７などを備えている。ディスプレイ７は、ＣＰＵ２から受けた映像信号をユーザに対して映像として表示する。入力装置６は、例えばキーボード、マウス等から構成され、ユーザにより操作されることによって、その操作に応じた信号をＣＰＵ２に出力する。ＲＡＭ４は、読み出し、書き込み可能な揮発性メモリであり、ＲＯＭは読み出し専用の不揮発性メモリであり、ＨＤＤ５は読み出し、書き込み可能な不揮発性メモリである。ＲＯＭ３、ＨＤＤ５には、ＣＰＵ２が読み出して実行するプログラム等が予め記憶されている。また、ＨＤＤ５には後述するモデルが記憶されている。  ＲＡＭ４は、ＣＰＵ２がＲＯＭ３、ＨＤＤ５に記憶されたプログラムを実行する際に、そのプログラムを一時的に保存するための記憶領域、及び作業用のデータを一時的に保存するための記憶領域として用いられる。ＰＣ１に電源が投入され起動されると、ＣＰＵ２はＲＯＭ３からブートプログラムを読み出して実行する。そして、起動処理以降、ＣＰＵ２は、入力装置６からの信号、オペレーションシステム（ＯＳ）により予め定められたスケジュール等に基づき、ＨＤＤ５に記憶された各種プログラムをＯＳ上のプロセスとして実行する。
【００１５】
次に、図１を参照して、ＨＤＤ５にインストールされている本実施形態の自動生成ツール１０について説明する。この自動生成ツール１０は、ＨＤＤ５に保存されると共にＯＳ上で実行されるアプリケーションの一つである。ＰＣ１は、ＣＰＵ２が自動生成ツール１０を動作させることで、モデルベースのプログラム開発を行うためのコード生成装置として作動する。なお、コード生成装置は、例えば車載装置等の組み込みシステム向けのプログラム開発や、その他あらゆる用途のプログラム開発に用いることができる。
【００１６】
自動生成ツール１０は、ＯＳの仕様に従うユーザによる入力装置６の操作により起動され、その後のユーザによる入力装置６の操作に基づいて生成されたモデル１１からＣ＋＋等のプログラミング言語の仕様に応じたソースコードＣを生成する。このソースコードＣは、コンパイラ、リンカ等に入力されることで、ＣＰＵ２等が直接実行可能なオブジェクトコードに変換されることになる。
【００１７】
モデル１１は、ソースコードＣよりも記述を簡易的にし、且つ人による可読性を高める目的で定められたモデル言語仕様に基づいて作成されるプログラムの一表現形態であり、例えばＳｉｍｕｌｉｎｋにより作成されるＳｉｍｕｌｉｎｋ（登録商標）モデルがある。Ｓｉｍｕｌｉｎｋモデルが、Matlab上で動作するRealTimeWorkshop（登録商標：以下ＲＴＷ）に入力されることで、このＲＴＷが当該Simulinkモデルに対応するソースコードＣを生成する。
【００１８】
モデル１１は、内部的には基本ブロック１２と再帰ブロック１３とを備える。基本ブロック１２は、一般的に用いられる基本モデルの組合せからなるブロックを示すもので、ビット演算、論理演算、ループ処理等が、可読性及び視認性良く表現されるものであり、再帰ブロック１３以外を示している。再帰ブロック１３は、再帰関数を用いて再帰呼び出しを表現するためのブロックを示すものであり、再帰関数サブシステム２０（図３（ａ）参照）、再帰呼び出しブロック２１（図３（ｂ）参照）と称されるように分類されている。このモデル１１は、上位から下位まで階層的に記述され、開発者によりＧＵＩ環境の下で記述される。
【００１９】
図１に示すように、ＨＤＤ５内にインストールされる自動生成ツール１０は、モデル解析部１４、基本ブロック用のコード生成ルーチン１５、再帰ブロック用のコード生成ルーチン１６、生成コード統合部１７などの役割に分けることができ、ＰＣ１はこれらの機能を実施することで、ソースコードＣを生成する。
【００２０】
ＰＣ１のＣＰＵ２は、入力されたモデル１１を解析しモデル１１中に含まれる各ブロックに対応するコード生成ルーチン１５、１６を呼び出す。基本ブロック１２用および再帰ブロック１３用のコード生成ルーチン１５、１６は、各ブロック１２、１３に対応するコードを生成するルーチンである。生成コード統合部１７は、各コード生成ルーチン１５、１６により生成された各コードをひとまとめにして出力するルーチンである。
【００２１】
本実施形態は、再帰処理をモデル化してソースコードＣを生成するところを特徴点の一つとしているが、再帰処理の中でも特有の末尾再帰を用いて処理を行っている。このため、まず「末尾再帰」の内容を説明する。「末尾再帰」とは、再帰呼び出しの一種で、自分自身の呼び出しが許される位置を、関数の呼び出し元へ戻る直前の位置のみに限定したものである。
【００２２】
例えば、階乗「 n! = n・(n-1)・…・2・1」について、再帰呼び出しを使用して計算する場合を考える。図１８（ａ）、図１８（ｂ）に２つのプログラムを示している。図１８（ａ）のプログラム１００は「再帰」を使っているが「末尾再帰」ではない。なぜなら、関数factは内部で自身を呼び出した後に、その呼び出し結果を値ｎに掛け合わせる計算を実行する必要があるためである。他方、図１８（ｂ）のプログラム１０１は末尾再帰である。このプログラム１０１は、図１８（ａ）のプログラム１００と異なり、再帰呼び出しをした後、returnによって呼び出し元へ戻る以外に処理を行なっていないためである。
【００２３】
このような「末尾再帰」は、一般の再帰関数にはない「機械的にループへ変換できる」という性質がある。したがって、この性質を利用した末尾再帰のループへの変換は、コンパイラの最適化手法のひとつである「末尾再帰最適化」として用いることができる。末尾再帰最適化の例を図１９（ａ）(最適化適用前)のプログラム１０２、図１９（ｂ）(最適化適用後)のプログラム１０３、に示す。
【００２４】
図４には、各ブロック１２、１３の属性データ３０の一例を示す。モデル１１内の各ブロック１２、１３は、ＰＣ１内のＨＤＤ５内に結線関係などが属性データ３０を用いて記憶される。図４に示すように、モデル１１内のブロック１２、１３又は信号には、固有の識別名称３１（例えば"In1"、"In2"、"output"など）が付されている。そして、これらのブロック、信号には各種属性３２が組み付けられており、モデル１１はＨＤＤ５に記憶されている。
【００２５】
本実施形態では、前述の基本的な属性３２の他、「再帰関数サブシステム」か否かを示す属性３３（"RecurFun?"）、「再帰呼び出しブロック」であるか否かを示す属性３４（"RecurCall?"）が付されている。ＰＣ１のＣＰＵ２は、このようなモデル１１内のブロックの識別名称３１及び属性３２〜３４を参照し、何れのサブシステム内に属しているか、又は、何れの再帰関数サブシステム２０内の再帰呼び出しブロック２１であるか特定できる。サブシステムは、複数のブロックをまとめて一つのブロックとして扱うことができるようにしたブロックであり、サブシステムは、当該サブシステム内に１又は複数の入力ポートおよび１の出力ポートが配置されることによりサブシステムの内外でデータの授受を行うことができる。
【００２６】
この中で、図３（ａ）に示す再帰関数サブシステム２０は、当該サブシステム２０の内部に記述された処理により再帰関数を定義するブロックを示す。図３（ｂ）に示す再帰呼び出しブロック２１は、再帰関数サブシステム２０自身を再帰的に呼び出すことを表現するためのブロックを示す。図３（ａ）に示すように、この再帰呼び出しブロック２１は、再帰関数サブシステム２０の下に配置される。
【００２７】
次に、前述構成におけるモデル解析処理を説明する。図５はモデル解析部１４を用いて行うブロック走査アルゴリズムを概略的に示す。まず、ＰＣ１は、モデル解析部１４を用いて図５に示すブロック走査アルゴリズムを実行する。ＰＣ１は、最上位のブロックの中で入力ポートを探索する（Ｓ１０１）。そして、ＰＣ１は、入力ポートから出力側の信号線を次のブロックまで探索する（Ｓ１０２）。
【００２８】
ＰＣ１は、次のブロックまでたどったときに当該ブロックがサブシステムであるか、再帰呼び出しブロック２１であるか、出力ポートであるか判定する（Ｓ１０３、Ｓ１０４、Ｓ１０５）。ＰＣ１は、これらのＳ１０５の条件を満たさないときにはサブシステムを抜けたと判定して処理を終了する。
【００２９】
他方、ＰＣ１は、探索された対象ブロックがサブシステムであると判定したときに（Ｓ１０３：ＹＥＳ）、当該サブシステムが再帰関数サブシステム２０であるか否かを判定する（Ｓ１０６）。これは、サブシステムの中でも前述の再帰関数サブシステム２０以外にさらなる下位のサブシステムが存在するためであり、この下位のサブシステムであると判定されたときには（Ｓ１０６：ＮＯ）、サブシステム内についてブロックを網羅的に探索する（Ｓ１０７）。
【００３０】
ＰＣ１が、サブシステム内のブロックを網羅的に探索するとサブシステム内のブロックを階層的に探索することになる。処理上では、ＰＣ１が図５に示す処理をさらに階層的に実施することになる。これにより、ＰＣ１は全ての上位から下位のサブシステム内の再帰関数サブシステム２０を探索して特定できる。なお、このステップＳ１０７の探索処理が終了すれば、ステップＳ１０２に戻って処理を繰り返す。
【００３１】
また、ＰＣ１は、ステップＳ１０６において対象ブロックを再帰関数サブシステム２０であると判定したときに、再帰関数サブシステム２０の位置を特定できる。そして、ＰＣ１は、再帰関数サブシステム２０のコードを生成する（Ｓ１０８）。このコード生成処理は後述する。
【００３２】
また、ＰＣ１は、ステップＳ１０４において再帰呼び出しブロック２１であると判定したときには、入力ポートＰＩ１〜ＰＩ３、出力ポートＰＯ１の数が整合しているか否か判定する（Ｓ１０９）。ここで、ＰＣ１は、自動生成ツール１０のモデル解析部１４によりモデル１１を解析し、再帰関数サブシステム２０と再帰呼び出しブロック２１について、以下の（１）及び（２）の制約を満たさなければエラーと見做す。これらの条件とは、（１）再帰呼び出しブロック２１の入力ポートＰＩ１〜ＰＩ３の数と、再帰関数サブシステム２０内に配置される入力ポートＰＩ１〜ＰＩ３の数とは同一、（２）再帰呼び出しブロック２１の出力ポートＰＯ１の数と、再帰関数サブシステム２０内に配置される出力ポートＰＯ１の数とは同一、の条件である。
【００３３】
ここで、ＰＣ１は、（１）再帰呼び出しブロック２１の入力ポートＰＩ１〜ＰＩ３の数が再帰関数サブシステム２０内に配置される入力ポートＰＩ１〜ＰＩ３の数と異なっていれば、再帰関数のモデル１１として適切ではないと判定し（Ｓ１０９：ＮＯ）、ＰＣ１はエラーメッセージを出力し（Ｓ１１０）終了する。
【００３４】
さらに、ＰＣ１は、（２）再帰呼び出しブロック２１の出力ポートＰＯ１の数が再帰関数サブシステム２０内に配置される出力ポートＰＯ１の数と異なっていれば、再帰関数のモデル１１として適切ではないと判定し（Ｓ１０９：ＮＯ）、ＰＣ１はエラーメッセージを出力し（Ｓ１１０）終了する。
【００３５】
ＰＣ１は、前述の（１）及び（２）の制約を満たしていると判定すると、再帰関数のモデル１１として適切であると判定し（Ｓ１０９：ＹＥＳ）、再帰呼び出しブロック２１のコードを生成する（Ｓ１１１）。
【００３６】
この再帰呼び出しブロック用のコード生成ルーチンの詳細は後述する。そしてコード生成処理が終了すると、次のブロックを探索するためステップＳ１０２に戻る。ＰＣ１は、探索されたブロックが前述のＳ１０３〜Ｓ１０５の条件を満たさない基本ブロック１２であったときには、この対象基本ブロック１２のコードを生成する。このコード生成処理が終了すると、次のブロックを探索するためステップＳ１０２に戻る。このコード生成処理は本実施形態の特徴とは関係しないため説明を省略する。そして、ＰＣ１は、ステップＳ１０５において、探索されたブロックが出力ポートＰＯ１であるか判定し、出力ポートＰＯ１まで探索完了すれば処理を終了する。
【００３７】
図６にコード生成ルーチンの流れをフローチャートで示すように、まず、ＰＣ１は、再帰関数サブシステム２０が末尾再帰であるか否かを判定する（Ｓ２０１）。この末尾再帰判定処理を図７に示す。
【００３８】
図７に示すように、ＰＣ１は、末尾再帰判定処理において再帰関数サブシステム２０内の出力ポートＰＯ１を探索し（Ｓ３０１）、出力ポートＰＯ１の入力側から入力ポートＰＩ１〜ＰＩ３側に次のブロックを探索する。すなわち、ＰＣ１は、出力ポートＰＯ１から逆方向にブロックを探索する。そしてＰＣ１は、探索された対象ブロックが末尾再帰呼び出しブロックであるか否かを判定する（Ｓ３０３）。ＰＣ１は、対象ブロックが末尾再帰呼び出しブロックであると判定したときには「ＹＥＳ」（末尾再帰である）と出力する（Ｓ３０４）。これにより末尾再帰呼び出しブロックを特定する。
【００３９】
また、ＰＣ１は、探索された対象ブロックが入力ポートＰＩ１〜ＰＩ３の何れかであるか否かを判定する（Ｓ３０５）。ＰＣ１は、対象ブロックが入力ポートＰＩ１〜ＰＩ３であると判定したときには「ＹＥＳ」（末尾再帰である）と出力する（Ｓ３０６）。
【００４０】
そして、ＰＣ１は、探索された対象ブロックが演算ブロックであるか否か判定する（Ｓ３０７）。ＰＣ１は、対象ブロックが演算ブロックであると判定したときには「ＮＯ」（末尾再帰でない）と出力する（Ｓ３０８）。ＰＣ１は、探索された対象ブロックがＳ３０３、Ｓ３０５、Ｓ３０７の何れの条件も満たさないときには、次のブロックを探索しステップＳ３０３の処理に戻る。
【００４１】
したがって、ＰＣ１は、末尾から遡って最初に探索された対象ブロックが末尾再帰呼び出しブロックであったり入力ポートＰＩ１〜ＰＩ３であったりしたときには末尾再帰であると判定する。逆に、ＰＣ１は、その他の普通の演算ブロックが末尾に存在するときには末尾再帰ではないと判定する。
【００４２】
図６の処理に戻って、ＰＣ１は、前述の末尾再帰判定処理（Ｓ２０１）を行うことで、再帰関数サブシステム２０が末尾再帰ではないと判定されると（Ｓ２０２：ＮＯ）、コード生成不能であると判定しエラーメッセージを出力する（Ｓ２０３）。逆に、ＰＣ１は、末尾再帰判定処理（Ｓ２０１）を行うことで、再帰関数サブシステム２０が末尾再帰であると判定されると（Ｓ２０２：ＹＥＳ）、ループ開始コードを生成する（Ｓ２０４）。このループ開始コードは、例えばＣ＋＋言語のソースコードにおいては  " while(1) { "などのループ開始を示すコードを示す。
【００４３】
そして、ＰＣ１は、現在対象とされている再帰関数サブシステム２０の内部を対象として、図５に示すブロック走査アルゴリズムを適用する（Ｓ２０５）、これにより、ＰＣ１は階層的にサブシステムの内部を解析できる。
【００４４】
そして、ＰＣ１は階層的にサブシステムの内部の解析処理を終了すると、ループ終了コードを生成する（Ｓ２０６）。このループ終了コードは、例えばＣ＋＋言語のソースコードにおいては、" } "による。
【００４５】
また、図８に示すように、ＰＣ１は、再帰呼び出しブロック２１を探索したときには、当該再帰呼び出しブロック２１に対応するコードを生成する。この再帰呼び出しブロックのコード生成処理は、図９に示すように、再帰呼び出しブロック２１への入力値（ｖ１，ｖ２，…，ｖｎ）を再帰関数サブシステム２０の対応する引数（ｘ１，ｘ２，…，ｘｎ）に代入するコード（例えば"x1 = v1 ;"）を生成することで行われる。そして、全ての引数を代入するコードを生成した後、ループ実行処理を終了するためのコード（例えばＣ＋＋言語の場合"continue;"）を生成する。
【００４６】
また、ＰＣ１は、ステップＳ１１２においてその他の基本ブロックのコードを生成するときには、図１０に示すように、基本ブロックのコード生成機能によりコード生成する。このとき、次にブロックが出力ポートであるときには処理を終了するためのコード（例えばＣ＋＋言語の場合"break;"）を生成する。
【００４７】
＜適用例＞
次に、本実施形態のように、開発者がプログラムについてモデル１１を構築し、ＰＣ１がモデル１１から自動生成ツール１０を用いてソースコードＣを生成する場合の例について、二分探索アルゴリズムを例に挙げて説明する。
【００４８】
この二分探索プログラムは、末尾再帰処理を使用することなく従来から用いられる基本的なブロックモデルのみを用いて記述すると、図１１及び図１２に示すモデル１１のように記述できる。図１１及び図１２に示す例を簡単に説明する。
【００４９】
図１１に示すモデル１１は、"imid"、"A(imid) " " key" などの定数について各種演算ブロックＢ１を用いて各種処理が行われるように記述されている。また、図１１に示す例では、条件ブロックＢ２１〜Ｂ２４なども記述されている。ここで、条件ブロックＢ２１は、 "A(imid) > key"と、"A(imid) < key"と、を入力し、これらの条件を満たすか否かに応じて値を出力する。また、これらの出力値が有効／無効切換条件として与えられる条件ブロックＢ２２〜Ｂ２４は、前回値（prev, imin, imid）を次回値(result , next_imin , next_imax)に変換するブロックであり、それぞれ、図１２に示すようなサブシステムに設定されている。
【００５０】
条件ブロックＢ２２は、入力ポートＰＩ１、ＰＩ２をそのまま出力ポートＰＯ１、ＰＯ２にそれぞれ出力し、入力ポートＰＯ３の値に１を演算ブロックＢ１により減算して出力ポートＰＯ３に出力する。
【００５１】
また、条件ブロックＢ２３は、入力ポートＰＩ１、ＰＩ３をそのまま出力ポートＰＯ１、ＰＯ３にそれぞれ出力し、入力ポートＰＯ３の値に１を演算ブロックＢ１により加算し出力ポートＰＯ３に出力する。また、条件ブロックＢ２４は、入力ポートＰＩ１をそのまま出力ポートＰＯ１に出力し、グランド（定値）を出力ポートＰＯ２、ＰＯ３に出力する。
【００５２】
すると、これらの条件ブロックＢ２２〜Ｂ２４の出力ポートＰＯ１〜ＰＯ３の後段に接続されたマージブロックＢ３２〜Ｂ３４が、各条件ブロックＢ２２〜Ｂ２４のそれぞれの出力ポートＰＯ１〜ＰＯ３の値をそれぞれマージし、次回値(result , next_imin , next_imax)としてそれぞれ出力する。これらの次回値(result , next_imin , next_imax)は、演算ブロックＢ１を通じてそれぞれ前回値(prev , imin , imid)として戻されることになる。この演算ブロックＢ１は次回値(result , next_imin , next_imax)を上限値又は下限値と比較するブロックである。これらの処理は、while条件ブロックＢ４０内への各種演算ブロックＢ１による条件を満たしつつ、"key"が"A[]"の中に見つかるまで繰り返される。
【００５３】
すなわち、基本ブロックＢ１、Ｂ２１〜Ｂ２４、Ｂ３２〜Ｂ３４、Ｂ４０のみを用いて記述した場合には、自身を再帰的に参照することなく記述されることになるため、ブロック数や信号線の結線数なども多くなり、開発者などが後にバグなどを発見しにくい。
【００５４】
図１３は末尾再帰の形態で表した二分探索アルゴリズムのソースコード例を示す。この二分探索アルゴリズムのソースコード４０は、"binary_search()"を再帰関数として、A[imid] > key"を満たすときには、"binary_search(A,key,imin,imid-1)"を実行し、逆に"A[imid] < key"を満たすときには、"binary_search(A,key,imid+1,imax)"を実行することで、探索範囲を絞りながら"A[imid] = key"を満たす"imid"を特定している。
【００５５】
開発者は、図１３のように表される二分探索アルゴリズムを想定したときに、このソースコード４０をモデル記述して視認性良くすることを考える。このようなとき、開発者は前述の再帰呼び出しブロック２１の他、基本ブロックとなる演算ブロックＢ１、条件ブロックＢ２５〜Ｂ２７を組み合わせて、図１４に示すように再帰関数サブシステム２０によるモデルを構築する。この記述は、再帰関数サブシステム２０を用いるもので、開発者がＰＣ１のＧＵＩ環境を用いて作成した記述例である。図１４に示す再帰関数サブシステム２０は、再帰呼び出しブロック２１が用いられているため視認性良く表すことができる。
【００５６】
この図１４に示す例を概略的に説明する。この再帰関数サブシステム２０の内部には"A""key""imin""imax"が、入力ポートＰＩ１１〜ＰＩ１４として記述されている。また、再帰関数サブシステム２０の内部には"return"が出力ポートＰＯ１１として記述されている。したがって、この再帰関数サブシステム２０は、４つの入力ポートＰＩ１１〜ＰＩ１４を備えると共に１つの出力ポートＰＯ１１を備える。
【００５７】
また、この再帰関数サブシステム２０内には、再帰呼び出しブロック２１が記述されている。再帰呼び出しブロック２１は、自身の再帰関数サブシステム２０を呼び出すためのブロックであり、これにより再帰呼び出しする。この再帰呼び出しブロック２１は、４つの入力ポートＰＩ１１〜ＰＩ１４と１つの出力ポートＰＯ１１を備えている。
【００５８】
再帰呼び出しブロック２１の入力ポート数は、再帰関数サブシステム２０の入力ポート数と合致し、再帰呼び出しブロック２１の出力ポート数は、再帰関数サブシステム２０の出力ポート数と合致するようになっている。
【００５９】
これらの再帰関数サブシステム２０は、開発者がＰＣ１の入力装置６から属性データ３０などが設定入力されることで、入力ポート数及び出力ポート数を入力装置６から設定可能になっている。したがって、開発者が再帰関数サブシステム２０を構築するときに、再帰関数サブシステム２０の入力ポート数及び出力ポート数をＰＣ１内に設定すると、ＰＣ１は当該再帰関数サブシステム２０の入力ポート数及び出力ポート数に応じた再帰呼び出しブロック２１を生成する。すると、開発者は再帰呼び出しブロック２１を使用可能になる。開発者が再帰呼び出しブロック２１を記述でき、ディスプレイ７に対し視覚的に表示させることができる。
【００６０】
図１５は、モデル１１を構成するブロック数と信号線数とを比較した評価結果を示す。図１５に示すように、本実施形態の再帰関数サブシステム２０を用いないときには、構成ブロック数が３２、信号線数が４８となる。再帰関数サブシステム２０を呼び出すためのシステムを含めると、全体で、構成ブロック数が５４、信号線数が６１となる。
【００６１】
これに対し、本実施形態の構成を用いると、構成ブロック数を２２、信号線数を３４に削減できる。すなわち、モデル１１の構成ブロック数を２／３〜１／２に削減できる。したがって、より簡潔なモデルを用いてアルゴリズムを表すことができる。これにより、モデルの複雑化を極力排除でき、視認性を向上できる。
【００６２】
図１６は、本実施形態の図４〜図７に示すフローチャートの流れに沿ってソースコードＣを生成した場合の生成例を示している。図１３の再帰関数を用いたソースコード４０に比較して、図１６に示すように再帰関数"binary_search()"を全てループ処理に変換できる。
【００６３】
図１７はプログラムを実行した場合のコールスタック消費量による評価結果を概略的に示す。コールスタックには各種関数の引数、ローカル変数、戻り番地等の情報が保持されるが、ここでは、コールスタック内に確保される各種関数の引数およびローカル変数に注目し、コールスタックの消費量を概算する。
【００６４】
コールスタックの要素数が、１個、１０個、１００個、１０００個のそれぞれの配列を対象とし、図１３に示す再帰関数を用いたソースコード４０と、図１６に示すソースコード５０とを用いて二分探索アルゴリズムを実行したときに、それぞれ確保される関数の引数およびローカル変数の最大個数を示している。
【００６５】
再帰関数"binary_search()"を用いてコード化したソースコード４０の場合には、図１７に示すように、探索する配列の要素が増せば増すほどコールスタックの消費量が指数関数的に増加することがわかる。しかし、再帰関数サブシステム２０がループ処理を用いてコード化された場合には、探索する配列の要素が増したとしてもコールスタックの消費量が増加することはない。これにより、特に配列要素が大きければ大きいほどコールスタックの消費量を抑制できることがわかる。
【００６６】
本実施形態によれば、ＰＣ１は、モデル１１内の再帰関数サブシステム２０を特定し、再帰関数サブシステム２０内において再帰呼び出しブロック２１を特定し、特定された再帰呼び出しブロック２１をループコードに変換することによりソースコードＣを生成している。このため、開発者は、再帰関数サブシステム２０及び再帰呼び出しブロック２１を用いて、より視認性良くモデルを構築できる。ＰＣ１が、モデル１１をソースコードＣに変換したときには、再帰呼び出しブロック２１をループ処理に変換できるため、コールスタックの要素数を大幅に削減でき、メモリ領域を効率的に使用できる。
【００６７】
ＰＣ１は、再帰呼び出しブロック２１が末尾再帰であるか否かをソースコード生成処理に先立って判定しているため、モデル１１が適切であるか否か、または、ソースコード生成可能であるか否かを予め判定できる。
【００６８】
ＰＣ１は、再帰関数サブシステム２０の入力ポートＰＩ１１〜ＰＩ１４及び出力ポートＰＯ１１の数と、再帰呼び出しブロック２１の入力ポートＰＩ１１〜ＰＩ１４及び出力ポートＰＯ１１の数と、が等しいか否かをソースコード生成処理に先立って判定しているため、モデルが適切であるか否か、または、ソースコード生成可能であるか否かを予め判定できる。
【００６９】
ＨＤＤ５には、モデル１１内のサブシステム、ブロックの属性３２〜３４が予め記憶されており、ＰＣ１はこのＨＤＤ５に記憶された属性３２〜３４に基いて再帰関数サブシステム２０又は再帰呼び出しブロック２１を特定する。このため、開発者などはモデル１１の外部から属性データ３０を設定できる。
【符号の説明】
【００７０】
図面中、１はパーソナルコンピュータ（ソースコード生成装置、生成手段、第１特定手段、第２特定手段、末尾再帰判定手段、個数整合手段）、１２はソースコード、１６は再帰ブロック用のコード生成ルーチン（生成手段）、２０は再帰関数サブシステム、２１は再帰呼び出しブロック、３０は属性データ、を示す。
【図１】
2015161983.tif 000003
【図２】
2015161983.tif 000004
【図３】
2015161983.tif 000005
【図４】
2015161983.tif 000006
【図５】
2015161983.tif 000007
【図６】
2015161983.tif 000008
【図７】
2015161983.tif 000009
【図８】
2015161983.tif 000010
【図９】
2015161983.tif 000011
【図１０】
2015161983.tif 000012
【図１１】
2015161983.tif 000013
【図１２】
2015161983.tif 000014
【図１３】
2015161983.tif 000015
【図１４】
2015161983.tif 000016
【図１５】
2015161983.tif 000017
【図１６】
2015161983.tif 000018
【図１７】
2015161983.tif 000019
【図１８】
2015161983.tif 000020
【図１９】
2015161983.tif 000021