(57)【特許請求の範囲】
【請求項１】
変数の集まりであるスキーマを含む基準プログラムのソースコードにおいて、前記ソースコード内のスキーマ内の変数の値を設定する手続きを記述した部分を要求に応じて変更することにより、対象となるシステムに適合しうる対象プログラムのソースコードに変更するためのものであって、
前記対象となるシステムを構成するために必要なスキーマを定義するための情報および、前記対象プログラムを実行する上での時間制約を定義するための情報が入力される入力手段と、
前記ソースコードのコードブロック内の変更の対象となる文字列を置換変更するために前記入力手段より入力された情報から木構造を有するデータである対象システム定義情報に変換する入力情報変換手段と、
前記基準プログラムのソースコードに予め埋め込まれた情報であって、前記基準プログラムのソースコード内の構成要素であるコードブロックおよび前記対象システム定義情報の対応を付けるとともに前記コードブロックの変更方法を示す情報を抽出する抽出手段とを備え、
前記対象システム定義情報に対応づけながら前記抽出したコードブロックの変更方法を示す情報に従って基準プログラムのソースコード内のコードブロックを変更するように構成したことを特徴とするプログラム変更装置。
【請求項２】
基準プログラムのソースコードは各コードブロックと対象システム定義情報を構成する要素との対応に関する情報を予め含んだものであって、
抽出手段は、前記基準プログラムのソースコードから各コードブロックと対象システム定義情報を構成する要素との対応に関する情報および前記基準プログラムのソースコード内のコードブロックの変更方法を示す情報と、前記基準プログラムを動作させるためのソースコード本体とを分離抽出するように構成したことを特徴とする請求項１に記載のプログラム変更装置。
【請求項３】
基準プログラムのソースコード内のコードブロックの変更方法を示す情報は、基準プログラムのソースコードの各コードブロックに１対１に対応し、かつ前記コードブロックを変更する手順を記述した手続きの集まりであり、
前記コードブロックと前記変更する手順を記述した手続きとの対応関係を記述したコメントをソースコード本体に含めたことを特徴とする請求項２に記載のプログラム変更装置。
【請求項４】
基準プログラムのソースコード内のコードブロックの変更方法を示す情報は、前記基準プログラムのソースコードの各コードブロックに１対１に対応し、かつ前記コードブロックを変更する手順を記述した手続きの集まりであり、
前記変更する手順を記述した手続きにおいて使用される引数または局所変数を解釈できるように構成したことを特徴とする請求項１に記載のプログラム変更装置。
【請求項５】
基準プログラムのソースコードから各コードブロックと対象システム定義情報を構成する要素との対応に関する情報から所定のコードブロックを繰り返し用いるための情報を受け取ると当該コードブロックを所定の回数繰り返して用いるように構成したことを特徴とする請求項１に記載のプログラム変更装置。
【請求項６】
基準プログラムのソースコードから各コードブロックと対象システム定義情報を構成する要素との対応に関する情報から複数あるコードブロックのうちの所定のコードブロックを選択して用いるための情報を受け取ると当該コードブロックを選択して用いるように構成したことを特徴とする請求項１に記載のプログラム変更装置。
【請求項７】
基準プログラムのソースコードから各コードブロックと対象システム定義情報を構成する要素との対応に関する情報から所定のコードブロック内の所定の文字列を置換する情報を受け取ると当該コードブロック内の所定の文字列を置換して用いるように構成したことを特徴とする請求項１に記載のプログラム変更装置。
【請求項８】
抽出手段は、基準プログラムを動作させるためのソースコード本体と、前記ソースコード本体の構造を示す情報をコメントにしたものとをテンプレートファイルとして出力するように構成したことを特徴とする請求項１に記載のプログラム変更装置。
【請求項９】
基準プログラムのソースコードはスキーマに依存する部分と、スキーマに依存しない部分とに切り分けるとともに、前記基準プログラムのソースコード内のスキーマに依存する手続きを記述した部分を変更するように構成したことを特徴とする請求項１に記載のプログラム変更装置。
【請求項１０】
基準プログラムのソースコード内のコードブロックの順序と、変更されたソースコード内のコードブロックの順序が同じになるように前記基準プログラムのソースコードを変更することを特徴とする請求項１に記載のプログラム変更装置。
【請求項１１】
基準プログラムのソースコード内で条件文および前記条件文により実行される手続きを変更されたコードブロック内の１つのコードブロックに含めるように構成したことを特徴とする請求項１０に記載のプログラム変更装置。
【請求項１２】
基準プログラムのソースコード内でループ文および前記ループ文の内で実行される手続きを変更されたコードブロック内の１つのコードブロックに含めるように構成したことを特徴とする請求項１０に記載のプログラム変更装置。
【請求項１３】
入力情報変換手段は、反復的に利用され、そのそれぞれで変数名が置換される変数値設定のためのコードブロックにおいて、置換された変数名の重複がおこっていないかどうかを調べるように構成したことを特徴とする請求項１に記載のプログラム変更装置。
【請求項１４】
入力情報変換手段は、複数ある内のいずれかが選択され、そのそれぞれで変数名が置換される変数値設定のためのコードブロックにおいて、ある変数の値を導出するために必要となる変数の設定が前記選択により抜けていないかどうかを調べるように構成したことを特徴とする請求項１に記載のプログラム変更装置。
【請求項１５】
入力手段は、入力画面を有し、前記入力画面はスキーマを構成する変数の名前を定義するための第１の入力画面と、
前記変数の値の設定法を入力するための第２の入力画面とを備え、
前記第１の入力画面で指定された変数名の一覧を前記第２の入力画面で表示するとともに、前記第２の表示画面で表示された変数名の一覧から値を設定すべき変数を指定できるように構成したことを特徴とする請求項１に記載のプログラム変更装置。
【請求項１６】
第２の入力画面において、その名前をすでに定義した変数名の一覧の中から、変数を選択し、前記選択した変数の設定法を入力した後、
入力情報変換手段は、
前記変数がスキーマを構成する変数として定義されているかどうかを対象システム定義情報に変換する前に一括して調べるように構成したことを特徴とする請求項１５に記載のプログラム変更装置。
【請求項１７】
入力手段は、入力画面を有し、前記入力画面はスキーマを構成する変数の名前を定義するための第１の入力画面と、
変数の値の設定法を入力するための第２の入力画面を備え、
その値の設定法がすでに入力された変数名の一覧を前記第２の入力画面で表示するとともに、前記変数名の一覧の中の変数を用いて導出する変数を指定できるように構成したことを特徴とする請求項１に記載のプログラム変更装置。
【請求項１８】
第２の入力画面において、その設定法をすでに入力した変数の一覧の中から、新たな変数の値を導出するために用いる変数を指定した後、入力情報変換手段は、前記設定法が入力されている変数の名前が前記第１の入力画面で定義されているかどうかを対象システム定義情報に変換する前に一括して調べるように構成したことを特徴とする請求項１７に記載のプログラム変更装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
この発明は、コンピュータプログラムのソースコードを、対象となるシステムを制御するためのコンピュータプログラムのソースコードへ変更するためのプログラム変更装置に関するものである。
【０００２】
【従来の技術】
制御システムは、その内部で処理する変数の集まりをスキーマとして捉え、スキーマ内の変数はその値を制御対象から獲得し、その値に基づき制御コマンドを出力する処理を繰り返す。
図７は従来のシステムの構成を示す構成図である。
この構成図は、制御システムの一般的構成を示すモデルを説明するための図である。
このモデルは実時間性を保証するための手続きと、それ以外の手続きとを分離したものである。
図に示したシステム構成のモデルをアクティブ・リング・モデル（Ａｃｔｉｖｅ  Ｒｉｎｇ  Ｍｏｄｅｌ）と称す。
図において、１は対象となるシステムのデータを獲得する獲得エージェントである。
獲得エージェント１は予め定められたプログラム内の手続きに従い動作する。
獲得エージェント１のプログラム内にはセンサ（図示せず）等のようにデータを計測するための計測手段を動作させるための手続き１１、および計測手段により計測したデータから制御に必要とする最新の変数値の組を計算し、設定するための手続き１２、および最新の変数値の組を循環エリアであるリングバッファ２１に書き込むとともに、管理情報格納手段２２に格納された管理情報を更新するための手続きを有する。
【０００３】
計測手段により計測したデータは一旦、入力エリア（ｉｎｐｕｔ  Ａｒｅａ）なる記憶領域を有する記憶媒体（図示せず）に格納される。
手続き１２は入力エリア内に格納されたデータを用いて所定の演算を行い、変数値を設定するものである。
手続き１２により設定される変数には、その値が入力エリア上のデータだけから計算されるものと、設定済の他の変数値も用いて導出されるものがある。前者は基礎データ項目、後者は導出データ項目と呼ばれる。
【０００４】
２は獲得エージェントにより設定された変数の組を時系列データとして一時的に格納する格納手段である。
格納手段２はリングバッファ２１、および管理情報格納手段２２を有するものである。
リングバッファ２１は獲得１回分の変数の組を格納する場所が複数個あり、これらの格納する場所が周期的に巡回して変化するものである。
リングバッファ２１に格納するデータが時系列データを長期にわたり記憶する必要がある場合、その格納場所に新たなデータが格納される前にリングバッファ２１とは別体の格納手段（図示せず）に格納するように構成すればよい。
【０００５】
管理情報格納手段２２はハードディスク、光磁気ディスク、メモリなどの情報記憶媒体等を備えたものであり、管理情報格納手段にはリングバッファ２１に格納されている情報のうち時間的に古い時系列データの格納場所、更新時刻に関する情報を適宜更新して格納するものである。
具体的には、獲得エージェント１が獲得した最新の変数値の組をリングバッファ２１に格納するとき、獲得エージェント１が次の最新の変数値の組獲得したときに格納するべき場所を求めるともに、この場所に格納している変数値の組の獲得時刻を管理情報格納手段２２に格納するものである。
【０００６】
３は対象となるシステムの制御を行うためのデータを提供する提供エージェントである。
提供エージェント３は予め定められたプログラム内の手続きに従って動作する。
獲得エージェント３のプログラム内には、管理情報格納手段２２に格納された情報を読み込む手続き、リングバッファ２１上から読み出す変数値の個数を決定するための手続き、格納手段２からの時系列データを読み出すためのデータ読み出し手段（図示せず）を動作させるための手続き３１、データ読み出し手段により読み出した時系列のデータである変数値の組を用いて対象となるシステムを制御するためのデータを計算し出力する手続き３３を有する。
手続き３３により計算されたデータは出力エリアなる記憶領域を有する記憶媒体（図示せず）へ出力される。
【０００７】
４は外部から制御するためのデータの要求があったとき、どの提供エージェントがそのデータを提供するのかを調べるとともに、該当する提供エージェントにデータを出力するように司令を行う総領エージェントである。
総領エージェント４は予め定められたプログラムに従って動作する。
図７に示したものにおいて、提供エージェント３はその読み込むべき時系列データに応じて複数種類（ここではＮ種類（Ｐ1〜ＰN））あるとする。
総領エージェント４内のプログラムには、外部からＮ種類ある提供エージェントのいずれかへデータの提供の要求があったとき、対応する提供エージェントへデータの提供の要求を転送する手続きを有する。
【０００８】
図に示したシステムの動作を説明する。
入力エリアから基礎データ項目の値を獲得した獲得エージェント１は、最新の変数の組をリングバッファ２１に書き込む前に管理情報格納手段２２をロックし、書き込み終了時にロックを外す。
この変数の組を書き込む時間は十分小さい。この間、提供エージェント３は管理情報にアクセスできないので、提供エージェントが誤ってリングバッファ２１上の上書きが起こっている部分を読み出すことはない。
獲得エージェント１はこの動作を繰り返し行うことにより時系列データがリングバッファ２１に格納されていく。
【０００９】
総領エージェント４が格納されている時系列データを検索しそれを用いて制御データを計算する要求を外部から受け取ったとする。
このとき総領エージェント４はこの時系列データを検索し計算する提供エージェントを決定し、該当する提供エージェント３に指令信号を出す。
【００１０】
リングバッファ２１で上書きが起こっているのは１箇所のみであるから、上書きが起こっている部分を読まないようにすれば、提供エージェント３は排他制御することなくリングバッファ２１から時制データを読み出しても矛盾は生じない。提供エージェント３は上書きが起こっている位置を知るために管理情報格納手段２２を読み出す間だけロックする。
この排他制御における閉塞時間（つまりロックしている時間）は小さく、かつその最悪値（最長の閉塞時間）を見積もることができる。
読み出す位置を確定した後、提供エージェント３はリングバッファ２１に排他制御せずにアクセスし、そこに格納された時系列データを読み出すとともに、読み出された時系列データを用いて制御データを計算し、出力する。
【００１１】
また上述のシステムでは獲得エージェント１は、あらかじめ定められた時間内に監視の対象となるデータを獲得し、その処理を終了しなければならない。
更に、提供エージェント３は、あらかじめ定められた時間内に制御を行うためデータを送出しなければならない。
これらの制約を時間制約と称する。
また、制約時間を有する処理がその制約時間内に終了することを時間一貫性を維持すると称す。
【００１２】
アクティブ・リング・モデルに基づくシステムでは、以下に説明するように時間一貫性が維持できるかどうかを判定できる。
アクティブ・リング・モデルに基づいて構築されたシステムでは、排他制御するための手続きと、対象となるシステム毎に変更されるスキーマに依存する手続きとが分離される。
図７に示すものでは、影付き枠で囲まれた部分がスキーマに依存する手続きである。
アクティブ・リング・モデルに基づくシステムでは、排他制御に基づく閉塞時間が一定となる。
さらに各エージェントのメソッドを１回実行するのに要する実行時間は、実機上で各エージェントのメソッドを単独実行することにより、測定することができる。
【００１３】
このように実装されたアクティブ・リング・モデルに基づくシステムでは、各エージェントのメソッドの１回の実行時間と閉塞時間とがわかるので、システム内の全てのエージェントが与えられた制約時間内にメソッド実行を終了できるかどうかをRate  Monotonic  Analysisにより判定することができる。
Rate  Monotonic  Analysisは例えばC．L．Liu  and  J.W.Layland著、Scheduling  Algorithms  for  Multiprograming  in  a  Hard-Real-Time  Enviroment，Journal  of  ACM，Vol．20，No1，1973に記載されている。
【００１４】
【発明が解決しようとする課題】
従来のシステムでは以上のように構成されているので、ソースコード内のスキーマを変更するとき、各エージェントのメソッドがアクティブ・リング・モデルに従うことを意識しながら、人手により各エージェントのメソッドに対応するソースコードを変更する必要があった。
特に、人手によりエージェントのメソッドを変更する場合、アクティブ・リング・モデルに対する高度の理解と知識が必要であり、この知識を持たないものが変更を行うとソースコード内のスキーマを適正に変更ことができず、対象となるシステムを正常に動作させることができないといった問題があった。
【００１５】
一般に、対象となるシステムを制御する場合、実時間システムに長けたエンジニア（実時間システムエンジニアと称す）と、対象となるシステムの制御を行う制御エンジニアとが対象となるシステムを制御するプログラムのソースコードを作成する。
実時間システムエンジニアは実時間処理に対応するプログラミングの深い知識を有している。
一方、制御エンジニアは実際のシステムを監視、制御する現場にて作業を行っている場合が多く、実時間システムを構築するための知識を実時間システムエンジニアほどは有していない場合が多い。
【００１６】
対象となるシステムが例えば実時間プラント制御システムであるような場合、現場にて作業を行う制御エンジニアは計測手段において、監視対象または計測を行う時間間隔を変更したりする場合、これに伴いシステムを制御するプログラムのソースコードを変更しなければならない。
しかしながら、制御エンジニアは時間一貫性を維持しつつ、スキーマの変更ことができない場合が多く、下手に変更を加えるとシステム全体が正常に動作しなくなると言った問題がある。
【００１７】
この発明は上記のような問題点を解決するためになされたものであり、対象となるシステムを動作させるための対象プログラムのソースコードを容易に得ることができるプログラム変更装置を得ることを特徴とする。
【００１８】
【課題を解決するための手段】
この発明に係るプログラム変更装置は、変数の集まりであるスキーマを含む基準プログラムのソースコードにおいて、前記ソースコード内のスキーマ内の変数の値を設定する手続きを記述した部分を要求に応じて変更することにより、対象となるシステムに適合しうる対象プログラムのソースコードに変更するためのものであって、前記対象となるシステムを構成するために必要なスキーマを定義するための情報および、前記対象プログラムを実行する上での時間制約を定義するための情報が入力される入力手段と、前記ソースコードのコードブロック内の変更の対象となる文字列を置換変更するために前記入力手段より入力された情報から木構造を有するデータである対象システム定義情報に変換する入力情報変換手段と、前記基準プログラムのソースコードに予め埋め込まれた情報であって、前記基準プログラムのソースコード内の構成要素であるコードブロックおよび前記対象システム定義情報の対応を付けるとともに前記コードブロックの変更方法を示す情報を抽出する抽出手段とを備え、前記対象システム定義情報に対応づけながら前記抽出したコードブロックの変更方法を示す情報に従って基準プログラムのソースコード内のコードブロックを変更するように構成したことを特徴とするものである。
【００１９】
この発明に係るプログラム変更装置は、
基準プログラムのソースコードは各コードブロックと対象システム定義情報を構成する要素との対応に関する情報を予め含んだものであって、
抽出手段は、前記基準プログラムのソースコードから各コードブロックと対象システム定義情報を構成する要素との対応に関する情報および前記基準プログラムのソースコード内のコードブロックの変更方法を示す情報と、前記基準プログラムを動作させるためのソースコード本体とを分離抽出するように構成したことを特徴とするものである。
【００２０】
この発明に係るプログラム変更装置は、
基準プログラムのソースコード内のコードブロックの変更方法を示す情報は、基準プログラムのソースコードの各コードブロックに１対１に対応し、かつ前記コードブロックを変更する手順を記述した手続きの集まりであり、
前記コードブロックと前記変更する手順を記述した手続きとの対応関係を記述したコメントをソースコード本体に含めたことを特徴とするものである。
【００２１】
この発明に係るプログラム変更装置は、
基準プログラムのソースコード内のコードブロックの変更方法を示す情報は、前記基準プログラムのソースコードの各コードブロックに１対１に対応し、かつ前記コードブロックを変更する手順を記述した手続きの集まりであり、
前記変更する手順を記述した手続きにおいて使用される引数または局所変数を解釈できるように構成したことを特徴とするものである。
【００２２】
この発明に係るプログラム変更装置は、
基準プログラムのソースコードから各コードブロックと対象システム定義情報を構成する要素との対応に関する情報から所定のコードブロックを繰り返し用いるための情報を受け取ると当該コードブロックを所定の回数繰り返して用いるように構成したことを特徴とするものである。
【００２３】
この発明に係るプログラム変更装置は、
基準プログラムのソースコードから各コードブロックと対象システム定義情報を構成する要素との対応に関する情報から複数あるコードブロックのうちの所定のコードブロックを選択して用いるための情報を受け取ると当該コードブロックを選択して用いるように構成したことを特徴とするものである。
【００２４】
この発明に係るプログラム変更装置は、
基準プログラムのソースコードから各コードブロックと対象システム定義情報を構成する要素との対応に関する情報から所定のコードブロック内の所定の文字列を置換する情報を受け取ると当該コードブロック内の所定の文字列を置換して用いるように構成したことを特徴とするものである。
【００２５】
この発明に係るプログラム変更装置は、
抽出手段は、基準プログラムを動作させるためのソースコード本体と、前記ソースコード本体の構造を示す情報をコメントにしたものとをテンプレートファイルとして出力するように構成したことを特徴とするものである。
【００２６】
この発明に係るプログラム変更装置は、
基準プログラムのソースコードはスキーマに依存する部分と、スキーマに依存しない部分とに切り分けるとともに、
前記基準プログラムのソースコード内のスキーマに依存する手続きを記述した部分を変更するように構成したことを特徴とするものである。
【００２７】
この発明に係るプログラム変更装置は、
基準プログラムのソースコード内のコードブロックの順序と、変更されたソースコード内のコードブロックの順序が同じになるように前記基準プログラムのソースコードを変更することを特徴とするものである。
【００２８】
この発明に係るプログラム変更装置は、
基準プログラムのソースコード内で条件文および前記条件文により実行される手続きを変更されたコードブロック内の１つのコードブロックに含めるように構成したことを特徴とするものである。
【００２９】
この発明に係るプログラム変更装置は、
基準プログラムのソースコード内でループ文および前記ループ文の内で実行される手続きを変更されたコードブロック内の１つのコードブロックに含めるように構成したことを特徴とするものである。
【００３０】
この発明に係るプログラム変更装置は、
入力情報変換手段は、反復的に利用され、そのそれぞれで変数名が置換される変数値設定のためのコードブロックにおいて、置換された変数名の重複がおこっていないかどうかを調べるように構成したことを特徴とするものである請求項１に記載のプログラム変更装置。
【００３１】
この発明に係るプログラム変更装置は、
入力情報変換手段は、複数ある内のいずれかが選択され、そのそれぞれで変数名が置換される変数値設定のためのコードブロックにおいて、ある変数の値を導出するために必要となる変数の設定が前記選択により抜けていないかどうかを調べるように構成したことを特徴とするものである。
【００３２】
この発明に係るプログラム変更装置は、
入力手段は、入力画面を有し、前記入力画面は
スキーマを構成する変数の名前を定義するための第１の入力画面と、
前記変数の値の設定法を入力するための第２の入力画面とを備え、
前記第１の入力画面で指定された変数名の一覧を前記第２の入力画面で表示するとともに、前記第２の表示画面で表示された変数名の一覧から値を設定すべき変数を指定できるように構成したことを特徴とするものである。
【００３３】
この発明に係るプログラム変更装置は、
第２の入力画面において、その名前をすでに定義した変数名の一覧の中から、変数を選択し、前記選択した変数の設定法を入力した後、
入力情報変換手段は、
前記変数がスキーマを構成する変数として定義されているかどうかを対象システム定義情報に変換する前に一括して調べるように構成したことを特徴とするものである。
【００３４】
この発明に係るプログラム変更装置は、
入力手段は、入力画面を有し、前記入力画面は
スキーマを構成する変数の名前を定義するための第１の入力画面と、
変数の値の設定法を入力するための第２の入力画面を備え、
その値の設定法がすでに入力された変数名の一覧を前記第２の入力画面で表示するとともに、前記変数名の一覧の中の変数を用いて導出する変数を指定できるように構成したことを特徴とするものである。
【００３５】
この発明に係るプログラム変更装置は、
第２の入力画面において、その設定法をすでに入力した変数の一覧の中から、新たな変数の値を導出するために用いる変数を指定した後、
入力情報変換手段は、
前記設定法が入力されている変数の名前が前記第１の入力画面で定義されているかどうかを対象システム定義情報に変換する前に一括して調べるように構成したことを特徴とするものである。
【００３６】
【発明の実施の形態】
実施の形態１．
本発明の内容を具体的に説明する前に予めいくつかの用語の定義を行う。
基準システムとは、制御エンジニアが操作を行う対象となるハードウェア（Ｈ／Ｗ）上で時間一貫性と、時制一貫性の観点から正常に動作し、かつあらゆるデータ型（文字型のデータ、数値型（整数型、実数型、複素数型を含む）のデータ、２値型のデータ等）を含むものであって、最小構成のシステムを構築したものである。
最小構成のシステムとは、データを獲得するプロセス、獲得したデータを格納するプロセス、格納したデータまたは獲得したデータのうちの少なくともいずれか１つのデータを用いた処理を行いこれを出力するプロセス等である。
【００３７】
基準システムのプログラムを基準プログラムと称する。
ここでは、基準プログラムのソースコードを計算機言語であるＣ言語で記述したものを例に説明を行うがＣ言語以外の計算機言語を用いたものでもよい。
【００３８】
基準プログラムのソースコードはコードブロックをその構成要素とする。
コードブロックとは以下（１）から（３）のいずれかに相当するものである。
（１）分割されずに使用される連続した行の連接。
（２）０回以上使用されるコードブロックの連接。
（３）その要素の高々１つが選択されるコードブロックの連接。
【００３９】
あるコードブロックは上述のコードブロックの連接であってもかまわない。
エージェントのメソッドの中に連続して現れるソースコードのラインＬi、Ｌi+1、・・・、Ｌj（Ｌi：プログラム中のｉ番目のライン（またはｉ行目）に記載されたソースコード、ｉ、ｊ：整数）からなるコードブロックｂpをｂp（Ｌi、Ｌi+1、・・・、Ｌj）と表現する。
またｂq（ｂ1、ｂ2、・・・、ｂk）とは、コードブロックｂqはコードブロックｂ1、ｂ2、・・・、ｂkを含むものであることを意味する（ｋ：整数）。
【００４０】
実施の形態１のプログラム変更装置は正しく動作している基準システムの基準プログラムのうち、スキーマ内の変数の定義、各変数の値の設定法に関するソースコードの部分を、対象となるシステムで要求されるスキーマに適合するものに変更するものである。
例えば、基準システムの基準プログラムが
【００４１】
0003777859.tif 000002
【００４２】
とあるとき、基礎データ項目、導出データ項目を対象となるシステムの要求に合わせて新たに追加するには、対象となるシステムで要求されているデータ項目が基礎データ項目であるか導出データ項目であるかにより、それぞれのデータ項目に対応する値設定のコード部分を選択して複製し、対象となるシステムのスキーマの設定に合うように文字列を置換する。
また、この操作は、対象となるシステムで要求されるデータ項目の数だけ繰り返せば良い。
具体的には、値設定のコードとして、基準プログラムのソースコードに
【００４３】
データ項目名  ＝  関数名（引数１，引数２）；
【００４４】
という記述があるとき、データ項目名、関数名、引数１、引数２に対応する文字列を対象となるシステムのスキーマの設定に合うように置換すればよい。
このような変更の対象となるソースコードは、実時間処理の手続きに関する部分、例えば排他制御を行う手続きの部分以外のソースコードの部分であり、このような変更により作成されたソースコードは、そのプログラムの動作がアクティブ・リング・モデルが示す規範に適合している。
つまり、基準プログラムのソースコードはアクティブ・リング・モデルに沿った形で変更することにより、時間制約が満足されるかどうをRate  Monotonic  Analysisにより容易に判定することができる。
【００４５】
対象となるシステムに要求する情報として、制御エンジニアは例えばスキーマと時間制約とを指定し、入力するものとする。
スキーマの指定にはスキーマ内の変数の定義と、各変数の値の設定法の定義とが含まれる。
【００４６】
図１は、基準システムの基準プログラムのソースコードの一例を説明するための説明図である。基準システムはここでは、従来例で示したアクティブ・リング・モデルを仮定し、基準プログラムとは基準システムのエージェント（図１では獲得エージェント）を動作させるためのプログラムとする。
【００４７】
図において、Ｌ1、Ｌ2、・・・、Ｌ20はソースコードのラインを示し、添え字はライン番号（または行番号）に相当する。
図では、ソースコードは２０行の記述で表現したものを例に説明をしている。
ソースコードを表現するための計算機言語は何であっても良いが、図ではＣ言語なる計算機言語を用いて表現したものを例に示す。
【００４８】
Ｌ1からＬ5までの行は、ヘッダとなるコードブロックｂhdを構成する。
Ｌ6からＬ7までの行は初期化のコードブロックｂinitを構成する。
ｂinitでは、ローカル変数ｓｐに最新のデータを格納するリングバッファ２１上のメモリ領域の先頭アドレスが設定され、入力領域上のデータが一括してローカルなメモリ空間ｉｎｐｕｔＡｒｅａに読み出される。
【００４９】
Ｌ8からＬ10までの行は、基礎データ項目であるａｌｐｈａの値を設定するためのコードブロックｂbscを構成する。
ｂbscでは、関数ｃｏｎｖｅｒｓｉｏｎＦｕｎｃｔｉｏｎにより、ａｌｐｈａの入力領域の先頭位置からのずれであるオフセット（ｏｆｆｓｅｔ）、ａｌｐｈａのデータ長（ｌｅｎｇｔｈ）を用い、必要に応じてリングバッファの所定の格納場所にデータを書き込み、格納するものである。
【００５０】
Ｌ14からＬ18までの行は、基礎データ項目であるａｌｐｈａ、ｂｅｔａの値より導出データ項目であるｍａｘの値を設定するコードブロックｂdrvを構成する。
関数ｍａｘｉｍｕｍにおいて括弧内の第１引数は値を計算すべき導出データ項目に対応し、第２引数と第３引数とは計算に使用される基礎データ項目の値に対応する。
また、ｂavsはＬ11、Ｌ12、Ｌ13、ｂdrvを内部に包含するものである。
【００５１】
本願発明のプログラム変更装置は、変数の集まりであるスキーマを含む基準プログラムのソースコードにおいて、前記ソースコード内のスキーマ内の変数の値を設定する手続きを記述した部分を要求に応じて変更することにより、対象となるシステムに適合しうる対象プログラムのソースコードに変更するものである。
【００５２】
具体的にはプログラム変更装置は、対象となるシステムの要求にあわせて基準プログラムを構成するスキーマの中の複数の手続きを反復的、選択的に使用し、その中の文字列を入力した情報に応じて置換することにより、基準プログラムのソースコードを変更するときには対象プログラムもアクティブ・リング・モデルに基づいたものであるようにする必要がある。
【００５３】
このため、
（１）基準プログラムの手続きを構成するコードブロックを識別すること
（２）対象となるシステムに要求されている事項に関する情報
（３）コードブロックを反復する回数、コードブロックを選択する条件、コードブロック内の文字列を置換するといったように基準プログラムのソースコードを変更することにより拡張を行うための拡張ルールが必要となる。
【００５４】
基準プログラムのソースコードを変更するとき、基準プログラムのソースコード内の手続きを構成するコードブロックの中に記述された特定の文字列は、対象となるシステムの要求に応じて置換される。
コードブロックの中には対象となるシステムに要求されるデータに合わせて選択的に使われるもの、繰り返し使われるものがある。
またコードブロックの中には全く変更されずに使われる部分もある。
ここでは、コードブロックを以下に示すように分類する。
【００５５】
ｐａｒｔ（またはｐｒｔ）：コードブロックの集合であり、手続きそのものはｐａｒｔとみなされる。またｐａｒｔは以下に示すｒｉｇｉｄ  ｃｅｌｌとａｄａｐｔａｂｌｅ  ｃｅｌｌとを包含する。
【００５６】
ｒｉｇｉｄ  ｃｅｌｌ（またはｒｇｄ）：全く変更すること無く使用されるコードブロックである。ｒｉｇｉｄ  ｃｅｌｌはこれを構成する要素としてコードブロックを有しないものである。
【００５７】
ａｄａｐｔａｂｌｅ  ｃｅｌｌ（またはａｄｐ）：変更されうるコードブロックを有するコードブロックである。以下に示すｃｙｔｏｐｌａｓｍとｎｕｃｌｅｕｓを包含する。ａｄａｐｔａｂｌｅ  ｃｅｌｌは繰り返し使うことができる。
【００５８】
ｃｙｔｏｐｌａｓｍ（またはｃｙｔ）：内部の文字列を置換して使用されるコードブロック。対象となるシステムのを動作させる対象プログラムのソースコードを構成する手続きの中に必ず現れる。
【００５９】
ｎｕｃｌｅｕｓ（またはｎｃｌ）：ｐａｒｔと以下に示すｇｅｎｅとを含むコードブロック。構成するコードブロックの一部が選択的に使用される。
ｇｅｎｅ（またはｇｅｎ）：選択的に使用されるコードブロック。変更のときに文字列が選択的に使用される。
【００６０】
ｇｅｎｅはｐａｒｔをコードブロックに含む。従ってコードブロックはこれを構成するデータの構造において再帰的な階層を構成することが可能になるとともに、基準プログラムのソースコード内のコードブロックの入れ子構造を特定することができる。
またｒｉｇｉｄ  ｃｅｌｌ、ｃｙｔｏｐｌａｓｍ、ｇｅｎｅはコードブロックを包含しない。従ってこれらのコードブロックはこれ以上に複数のコードブロックに分割できないものである。これらのコードブロックを原子的（ａｔｏｍｉｃ）なコードブロックと称する。
基準プログラムのソースコードを変更する場合、文字列を置換することができるコードブロックはｃｙｔｏｐｌａｓｍ、ｇｅｎｅである。
【００６１】
図１において、コードブロックｂhd、ｂinitはｃｙｔｏｐｌａｓｍである。
また、コードブロックｂdhg、ｂdtg、ｂdusdはｃｙｔｏｐｌａｓｍである。
これらのコードブロックはその手続き内の文字列が修正され、対象となるシステムの手続きに現れる。
コードブロックｂdprlgは、包含するコードブロックｂdhg、ｂdtgがｃｙｔｏｐｌａｓｍであるので、ａｄａｐｔａｂｌｅ  ｃｅｌｌである。
【００６２】
ａｄａｐｔａｂｌｅ  ｃｅｌｌであるコードブロックｂdargsは、ｂdusdがｃｙｔｏｐｌａｓｍであるので、ａｄａｐｔａｂｌｅ  ｃｅｌｌである。
また、ｂdargsは、繰り返し使用してもよいコードブロックｂdusdを包含するものである。
ｂdtlは、これに含まれる文字列が全く変更されないため、ｒｉｇｉｄ  ｃｅｌｌである。
【００６３】
コードブロックｂdrvは導出データ項目の値を計算するｐａｒｔであり、ｂdprlg、ｂdusd、ｂdtlを包含するものである。
コードブロックｂbscは、基礎データ項目知の値を計算するものであり、これに含まれる文字列“ａｌｐｈａ”が置換され、ｂbscかｂdrvかのいずれか一方を選択して使用するので、ｇｅｎｅである。
【００６４】
コードブロックｂbdyはコードブロックｂbscとｂdrvとを包含するａｄａｐｔａｐｌｅ  ｃｅｌｌである。
ｂwhlはコードブロックｂprl、ｂbdy、ｂtlを包含するｐａｒｔである。
【００６５】
基準プログラムのコードブロックの順序、コードブロックの入れ子構造は、変更されたプログラムにおいても維持されるように拡張されなければならない。
更に、変更されたプログラムにおいて、削除される可能性がある基準プログラムのソースコードのコードブロックは、反復的または選択的に利用されるコードブロックのみである。
【００６６】
上述で説明した用語を用い実施の形態１のプログラム変更装置を説明する。
図２は実施の形態１のプログラム変更装置の構成を説明するための図である。
図において、１００は基準プログラムのソースコードである。
基準プログラムのソースコード１００は、スキーマに依存する手続きを記述した部分であって、変更の対象となるコードブロックにタグを埋め込んだタグファイル１０１と、本発明のプログラム変更装置により何ら変更をされない固定ファイル１０２とを有する。
【００６７】
タグファイル１０１の中のタグには、基準プログラムのコードブロックの変更方法を示す情報が記述されている。基準プログラムのコードブロックの変更方法を示す情報とは例えば、コードブロックを繰り返し複製する情報、所定のコードブロックを選択する方法、コードブロック内の所定の文字列を置換する方法などが記述されている。
これらの情報は各コードブロックに対応付けられている。
固定ファイル１０２とは、基準プログラムのソースコード１００に記述された手続きのうち、スキーマに依存しない手続き、つまり実時間処理に対応する手続きを記述した部分である。
【００６８】
２００は、基準プログラムのタグファイル１０１を読み出す読み出し手段である。
３００は、後述するジェネレータソースコード３０１およびテンプレートファイル３０２を抽出する抽出手段であるジェネレータ生成系である。
ジェネレータソースコード３０１とは基準プログラムのタグファイル１０１から対象プログラムのソースコードへ変更するための手順を記述したものを抽出し、プログラムとして動作可能なものにしたものである。
【００６９】
テンプレートファイル３０２とは基準プログラムのタグファイル１０１から対象プログラムのソースコードへ変更するための手順を記述した部分を除くことにより生成されるスキーマに依存する手続きを記述した部分を含むソースコード本体を出力したものである。
また、テンプレートファイル３０２は、固定ファイル１０２とともにコンパイラ（図示せず）によりコンパイルし、実行させると、基準システムとして正常に動作する。
４００はジェネレータソースコード３０１をコンパイルし、後述するジェネレータ７００に変換するコンパイラである。
【００７０】
５００は対象となるシステムに要求されるデータの情報を入力する入力手段に対応するビルダである。
入力手段５００には、対象となるシステムを構成するために必要なスキーマや時間制約を定義するための情報、例えば獲得エージェント１の計測手段により計測されるデータのデータ名、データ型、構成、データを取り込む周期またはタイミング、データ導出手段によりにデータを導出する数式などの手法といった情報などが入力される。
６００は入力手段５００により入力した情報を変換する入力情報変換手段に対応するパーザである。
パーザ６００は入力した情報を対象システム定義情報６０１に変換する。
【００７１】
対象システム定義情報６０１とは、対象システムでのスキーマや時間制約を表す情報である。
対象システム定義情報６０１の一例として、ここでは木構造を用いて表したものを例に説明を行う。
【００７２】
７００は、ジェネレータ生成系３００を使ってタグファイル１０１より抽出した基準プログラム内のコードブロックの変更方法に従って変更する変更手段に対応するジェネレータである。
ジェネレータ７００は、例えばコンパイラ４００によりジェネレータソースコード３０１を実行形式のプログラムに変換したものである。
【００７３】
８００は対象となるシステムを制御するための対象プログラムのソースコードである。
対象プログラムのソースコード８００は固定ファイル１０２と、変更手段７００により基準プログラムのソースコードを変更したファイル８０１を有する。
【００７４】
図３は、実施の形態１のプログラム変更装置の動作の概念を説明するための図である。
図において、図２と同一の符号を付したものは同一またはこれに相当するものである。
図において、基準プログラムのソースコード１００には入力エリア（図示せず）上の所定の位置（基準となる位置からオフセットｏだけ離れた位置）に格納された長さｌのデータ長を有するデータを読み出し、関数ｆにより基礎データ項目ｂを得る手続きを含むコードブロック１０３と、既に獲得したデータ項目ａ１、ａ２を関数ｇにより導出データ項目ｄを得る手続きを含むコードブロック１０４を含むとする。
【００７５】
対象となるシステムにおいて、コードブロック１０３内のオフセットｏをｏ'にデータ長ｌをｌ'に、基礎データ項目ｂをｂ'に変更する必要があるとし、かつコードブロック１０４内のデータ項目ａ1をａ1'に、データ項目ａ2をａ2'に、関数ｇをｇ'に、導出データ項目ｄをｄ'に変更する必要があるとする。
これら変更に必要な情報はビルダ５００により入力され、パーザ６００により対象システム定義情報６０１に変換される。
【００７６】
プログラム変更装置は、まずジェネレータ生成系３００を用いて基準プログラムのソースコード１００内のタグファイル１０１からジェネレータソースコードとテンプレートファイルとを作成する。
次いでジェネレータ７００によって、タグファイル１０１のタグ中のコードブロックの変更方法に従い、基準プログラムのソースコードのコードブロックと対象システム定義情報６０１と対応を取りながらコードブロック１０３、１０４内の変更の対象となる文字列を置換変更し、変更した手続きを対象プログラムのソースコード８００（詳しくはファイル８０１）内にコードブロック８０３、コードブロック８０４として出力するものである。
このとき、データの変更は基準プログラムのタグファイル１０１に記述された手続きを順に辿りながら行う。
【００７７】
図３のプログラム変更装置のより具体的な動作を説明する。
タグファイル１０１とは、基準プログラムのソースコードにタグが埋め込まれてできたものである。
変更の対象となるタグファイル１０１は、コードブロックに分割することが可能であり、コードブロック間の関係、コードブロックと対象システム定義情報６０１内の節との対応を明示するためのタグが予め埋め込まれている。
タグファイル１０１をジェネレータ生成系３００よりジェネレータソースコード３０１を抽出し、これに記述された変更の手順にしたがって対象となるシステムのプログラムのソースコード（ここではファイル８０１）が生成される。
【００７８】
ジェネレータ生成系３００は、ジェネレータソースコード３０１を生成するだけでなく、基準プログラムのソースコードに含まれるタグファイル１０１からタグを抜き取とれば、所定の計算機言語（Ｃ言語等）で記述されたソースコード（つまりソースコード本体）となり、このソースコード本体を実行可能なファイルに変換すれば基準システムを正常に動作させることが可能となる。
ジェネレータ生成系３００は、基準プログラムのソースコード１００からタグを抜き取りソースコード本体を抽出し、これをテンプレートファイル３０２に出力すると共に、基準プログラムのタグファイル１０１からコードブロックを変更するための手順を抽出する。ここでは、Ｃ言語などの所定の計算機言語でその手順を示したジェネレータソースコード３０１を出力する。
【００７９】
ジェネレータ７００はタグファイル１０１に記述された各コードブロックと対象システム定義情報の構造との対応、各コードブロックの選択方法、繰り返し方法、入れ子関係、文字列置換方法を解釈して、対象システム定義情報により定義された対象システムにおける要求を満足するように基準プログラムのソースコード本体に相当するテンプレートファイル３０２を変更する。
ジェネレータ７００は、基準プログラムのソースコード１００内のコードブロック毎に変更を行う。
【００８０】
基準プログラムのソースコード内のコードブロックを変更する手順の記述に誤りがあった場合、ジェネレータ７００により変更された対象プログラムのソースコード８００に誤った手続きが出力される。
具体的には、例えば実時間システムエンジニアが、タグファイル内でのタグの記述を誤った場合、生成系ソースプログラムに正しくないコードが現れる場合がある。
より具体的には、スキーマの中で定義された変数の数を間違えて多く指定したことが原因で、空値を有するポインタが発生し、このポインタの評価先を評価しようとし、ジェネレータ７００がメモリエラーとなり、正しくないコードを生成系ソースプログラムに出力する場合である。
【００８１】
この場合、ソースコードデバッガ（図示せず）を用いてジェネレータソースコードの誤りを解析することができる。
ジェネレータソースコード３０１の各ルーチンで実現される機能は極めて簡潔であり、１０行から２０行程度の手続きの記述で表現することができる。
よって、ジェネレータソースコード３０１に記述された情報からタグの記述の誤り個所を容易に同定することができる。
【００８２】
ジェネレータソースコード３０１の各ルーチンは、タグで括り出された基準プログラムのソースコード内のプログラム部分に１対１で対応している。
従って、ジェネレータソースコード３０１内の正しくないコードの原因となっているタグを一意に決めることが可能であるため、基準プログラムのソースコード内のタグの記述の誤りを容易に同定することができる。
【００８３】
また、ソースコード本体を抽出手段３００より抽出し、テンプレートファイルに出力ている。このときソースコード本体にコードブロックとこれに対応するジェネレータソースコード３０１のルーチンと情報をコメントを明示して含めるようにすれば、基準プログラムのソースコードそのものに誤りがある場合であっても、誤りのある部分に対応するタグをより早く見つけることができる。
【００８４】
また、ジェネレータ７００はコードブロックの操り返し、選択をそれぞれ許すように構成すれば、コードブロックの反復的な利用、選択的な利用をすることができるので、対象となるシステムの要求に適合しうる対象プログラムのソースコードを得ることができる。
また、ジェネレータ７００はコードブロック内の文字列置換を許すように構成すれば、対象となるシステムの要求に適合しうる対象プログラムのソースコードを得ることができるとともに、同一のコードブロックを反復的に利用したとしても、スキーマの名称の重複を無くすことができる。
【００８５】
また、ジェネレータ７００が対象プログラムのソースコードを生成し、任意の実機上でコンパイルして動作させることにより実行にかかる時間を測定し、これをもとに与えられた時間制約内に対象となるシステムがブログラムの実行を終了できるかどうかを判定することができるようにしてもよい。
【００８６】
図２のプログラム変更装置において、対象システムのソースコード８００はスキーマに依存する部分を対象となるシステムのスキーマに適合するよう、基準プログラムのソースコードを変更することによって得られる。
基準プログラムのソースコード１００は例えばアクティブ・リング・モデルに基づき、実時間システムエンジニアが記述したものである。
【００８７】
アクティブ・リング・モデルに基づいた実時間システムでは、基準プログラムのソースコードはスキーマと独立した（または依存しない）実時間処理のための手続きと、スキーマに依存する手続き（例えばデータ管理のための手続き）とに分離することができる。
【００８８】
スキーマと独立した実時間処理のための手続きとは、スキーマを変更したとしても、その手続きの内容が変更により何らスキーマに影響することのない手続きであり、例えばデータのアクセス制御、排他制御に対応する手続きなどである。
より具体的には、例えば図７に示すものでは、獲得エージェント内の動作においてデータを計測する手続き、管理情報格納手段２２に格納された情報を更新する手続き、提供エージェント内の動作において、管理情報格納手段２２に格納された情報を読み出す手続き、データを出力する手続きがこれに相当する。
この部分の手続きは下手に変更をするとアクティブ・リング・モデルが正常にに動作しない場合が有るため、この部分を固定ファイル１０２としている。
【００８９】
また、スキーマに依存する手続きとは、その手続きの内容が例えば図７に示すものにおいて、影付の枠で囲まれた手続きである。すなわち、獲得エージェント内の動作において、最新の変数値の組を計算する手続き、提供エージェント内の動作において、循環エリアからのｉ番目の変数の組を読み出す手続き、総領エージェント内の動作において所定の提供エージェントへ割り当てる手続きがこれに相当し、この部分は変更を行ったとしても変更後のシステムはアクティブ・リング・モデルに沿うシステムとなる。
【００９０】
ジェネレータ７００は基準プログラムのソースコード１００において、スキーマに依存する手続（つまりソースコード本体内の手続き）を変更する。
スキーマに依存する手続きとは、例えば図７の影付の枠で囲まれた部分である。
図７に示すアクティブ・リング・モデルに基づけば、データの獲得を行う手続きを実行する獲得エージェント１と、読み出しを行う手続きを実行する提供エージェント３とがリングバッファ２を共有するように実装できるとともに、両エージェントにおいて、リングバッファ２へのアクセスを制御するための手続き部分とスキーマに依存する手続き部分とが切り分けられる。
【００９１】
このようなシステムのソースコードにおいて、ジェネレータ７００によりスキーマに依存する手続きのみを変更する。
これをコンパイラなどにより実行形式に変換し、構成した対象システムではアクセス制御を実行するための手続きは変更されないため、アクセス制御に起因する閉塞時間は一定である。
よって実時間性が保証されるかどうかを判定することができる。
【００９２】
実時間システムエンジニアはスキーマ依存の手続きと対象システム定義構報６０１とをタグの情報にしたがって結び付ける。
結びつけを可能とするため、タグファイルに記述される変更の手続には、例えば以下の情報に関する記述が要求される。
【００９３】
（１）例題システムの基準プログラムのソースコード１００内のスキーマに依存する手続きをタグでコードブロックとして括りだし、コードブロック間の入れ子関係を作る。
（２）必要ならコードブロックの繰り返し、選択をタグ内の制御ラベルを使って指定する。
（３）コードブロックの各々を対象システム定義情報６０１の木構造の節（ノード）に対応させる。
（４）ｃｙｔｏｐｌａｓｍとｇｅｎｅのコードブロックでは、文字列の置換ルールを指定する。
上述の記述においては、必要であれば入力エリア上のデータから基礎データ項目値への変更方法、他のデータ項目値から導出データ項目値を導出する方法などををセマンティック関数を用いて記述しても良い。
【００９４】
ジェネレータ生成系３００はタグファイルのタグを順に読み込み、タグで括り出された部分に対応したルーチン（例えばＣ言語でいう関数）の集まりとしてジェネレータソースコード３０１を生成する。
各ルーチン内の手続きは、各タグ内の記述に基づいて決定される。
ジェネレータ７００は以下のようにふるまう。
【００９５】
（１）ジェネレータ７００は、各コードブロックと対象システム定義情報６０１との対応を辿りながら、基準プログラムのソースコード１００において、変更の対象となる部分すなわち、テンプレートファイル３０２に書かれた手続きの構造をなぞる。
（２）ジェネレータソースコード３０１内の各ルーチンは、タグファイル１０１内の、タグで括り出された変更の対象となるコードブロックに対応している。
これらルーチンは、タグ内に記述された
（２ａ）コードブロックの操り返し関係に基づいて対応ルーチンを操り返し呼びだし
（２ｂ）コードブロックの選択関係に基づいて対応ルーチンを選択的に呼びだし、
（２ｃ）コードブロックの入れ子関係に基づいて入れ子になっているルーチンを呼びだす。この「なぞり」は、これらの関数呼び出しにより実行される。
【００９６】
また、ジェネレータ７００は基準プログラムの変更の対象となる手続きのコードブロックのうち、何らの変更を行わないコードブロックｒｉｇｉｄ  ｃｅｌｌの部分はそのまま対象プログラムのソースコード内に複製する。
また、ｃｙｔｏｐｌａｓｍとｇｅｎｅの変更部分については所定の文字列の置換を行なう。
【００９７】
このように構成することにより、基準システムによって動作する各エージェントのメソッド（つまり各エージェントを動作させるためのプログラムを記述したソースコード）のスキーマを対象となるシステムの要求に併せて変更し、拡張することにより時間一貫性を維持するかどうかを判定できるプログラムに変更することが可能となる。
【００９８】
より具体的に説明するため、図１に示した基準プログラム（ここでは獲得エージェントのプログラム）のソースコードを対象となるシステムのプログラムのソースコードへと変更する手法を述べる。
これを行うには、多数のデータ項目を計算するコードを生成するときは、必要となる基礎データ項目と、導出データ項目に応じて基準プログラムの該当するコードブロックを選択し、その中の文字列を置換する動作を繰り返せばよい。
必要となるデータ項目が基礎データ項目である場合には、オフセット、データ長、変換関数、基礎データ項目に対応する文字列が置換される。
必要となるデータ項目が導出データ項目である場合には、すでに獲得したデータ項目（基礎データ項目、導出データ項目のいずれであっても良い）、変換関数、導出データ項目に対応する文字列が置換される。
【００９９】
図１において、Ｌ1、Ｌ3、Ｌ6において、現れる文字列“ＲＢ”は循環エリアのスキーマに対応する。この文字列はビルダ５００より入力し、変換された対象システム定義情報６０１により、循環エリアのスキーマに対応した文字列に置換される。
同様に、ｂdhd、ｂtg、ｂdusdではそれぞれ、“ｍａｘｉｍｕｍ”、“ｍａｘ”、“ａｌｐｈａ”が置換する文字列の対象となる。
ｂdargsは、より多くの引数を有する関数を処理するため、繰り返して使用してもよいコードブロックであるｂdusdを有する。
Ｌ18を要素とするコードブロックｂdtlは全く変更されずに使用される。
【０１００】
ｂdprlg、ｂdusd、ｂdtlの上位集合であるｂdrvは導出データを計算するためのコードブロックである。
ｂbscは基礎データを獲得するためのコードブロックである。
ビルダ５００より入力され、パーザ６００により変換される対象システム定義情報６０１のうち、ある特定のデータ項目に関する情報が基礎データ項目である場合にはコードブロックｂbscが選択され、導出データ項目である場合にはコードブロックｂdrvが選択される。
ｂbscと、ｂdrvとは、対象システム定義情報６０１において、指定されたデータ項目の数だけ用いられる。
【０１０１】
次に、対象プログラムのソースコードを生成するために必要となる対象システム定義情報６０１に関し、より具体的に説明する。
ビルダ５００により、システムにおいて要求されるスキーマの構成とスキーマ内の変数の値を設定、手続きの実行時の時間制約に関する情報を入力し、これをパーザ６００により対象システム定義情報６０１に変換する。
対象システム定義情報６０１は例えば木構造で表される。
【０１０２】
図４は、対象システム定義情報の一例を説明するための図である。
図において、楕円は非終端の節を示し、四角形は終端の節を示す。終端節は値をもつ。
ｎ1〜ｎ10、ｎｎ5〜ｎｎ7は節である。
節ｎ1は対象システムのリングバッファ２１へのデータ獲得および保存に関する要求に対応する節であり、このリングバッファ２１に割り当てられた名称を示す終端の節ｎ11、スキーマに対応する節ｎ2、保存に関する要求に対応する節ｎ3、獲得するデータ項目の集合に対応する節ｎ4にリンクしている。
終端節ｎ11はリングバッファ２１名称に関する情報を値としてもつ。
節ｎ2はスキーマの名称に対応する節ｎ21、スキーマを構成するデータ項目に対応する節ｎ5にリンクし、節ｎ5はデータ項目の名称に対応する節ｎ51、データ項目の型に対応する節ｎ52にリンクしている。
終端節ｎ51はデータ項目の名称に関する情報、終端節ｎ５２はデータ項目の型に関する情報を値としてもつ。
【０１０３】
節ｎ4は、獲得周期または獲得するタイミングを特定するデータに対応する節ｎ6、獲得するデータ項目に対応する節ｎ7にリンクしている。
節ｎ6は更に獲得周期を特定するデータに関する節（図示せず）、獲得するタイミングを特定するデータに関する節（図示せず）にリンクしている。
節ｎ7は獲得のための変換関数に対応する節ｎ8、変換関数により得られるデータ項目に対応する節ｎｎ5、節ｎ7に対応するデータ項目の型に対応する節ｎ71にリンクしている。
節ｎｎ5はデータ項目の名称に対応する節ｎ51、データ項目の型に対応する節ｎ52にリンクしている。
ｎ8は変換関数の名称に対応する節ｎ81、変換関数の引数の集合に対応する節ｎ9にリンクする。
【０１０４】
節ｎ9は獲得されるデータ項目が基礎データ項目の場合に対応するｎ10、導出データ項目の場合に対応するｎｎ7にリンクする。
節ｎ10はこの名称に対応する終端節ｎ101、オフセットに対応する終端節ｎ102、データ長に対応する終端節ｎ103にリンクする。
【０１０５】
図４に示した対象システム定義情報６０１の木構造は個々の対象システムの要求に応じて変化する。この変化を表現できるようにアスタリスク記号（＊）と丸印記号（○）を用いる。
図において、矢印に付しているアスタリスク記号は出元の節が行き先の節を集まりとして参照していることを意味する。
個々の対象システムでの要求を示す対象システム定義情報６０１では、アスタリスク記号（＊）の付いた矢印の行き先の節は同じ形のものが複数あることを示す。
例えば、図では、節ｎ8に対応するｆｕｎｃｔｉｏｎは、節ｎ9に対応するａｒｇｕｍｅｎｔを内部の変数として複数持つことができる。
【０１０６】
また、矢印に付した丸印記号（○）は、出元の節とリンクする行き先の節が複数ある場合、複数ある行き先の節のうちの１つを選択するものである。
例えば、図に示したものでは節ｎ9に対応するａｒｇｕｍｅｎｔは節ｎ10に対応するｉｎＶａｒｉａｂｌｅ、節ｎｎ7に対応するａｃｑｕｉｓｉｔｉｏｎ  ｖａｒｉａｂｌｅにリンクしている。
基準プログラムのソースコードを変更する場合、ａｒｇｕｍｅｎｔが基礎データ項目を必要とする場合には節ｎ10とリンクする。つまりａｒｇｕｍｅｎｔは、その内部の引数としてｉｎＶａｒｉａｂｌｅを持つようにデータを構成するものである。
また、ａｒｇｕｍｅｎｔが導出データ項目を必要とする場合には節ｎｎ7とリンクする。つまりａｒｇｕｍｅｎｔは、その内部の引数としてａｃｑｕｉｓｉｔｉｏｎ  Ｖａｒｉａｂｌｅを持つようにデータを構成するものである。
また、これらの引数の選択は個々の対象システムでの要求を満足するために入力された情報（具体的には、対象システム定義情報６０１）に応じて選択されるものである。
【０１０７】
上述のコードブロックと、対象システム定義情報６０１とを用いて、基準プログラムのソースコードを示すテンプレートファイル３０２を対象プログラムのソースコード８０１に変更する。
【０１０８】
変更を行うとき、テンプレートファイル３０２に記述されたコードブロックを順に辿る。
例えば基準プログラムのソースコードが図１に示したものである場合、図に示すｂdrvはデータ項目を獲得するためのコードブロックであり、これは図３に示す節ｎ7に対応するものである。
コードブロックｂdrvを対象となるシステムに要求されるものに拡張するとき、まずコードブロックｂdprlgを読み込み、この部分をまず変更する。
図１のものでは、ｂdhdを構成する文字列ｍａｘｉｍｕｍとｂdtgを構成するｍａｘはそれぞれ、対象システム定義情報における節ｎ8で指定された関数名、節ｎｎ5で指定された変数名に置換される。
その後、ｂdargsを通してｂdusdへ辿る。コードブロックｂdusdは対象システム定義情報６０１で指定された引数に対応する節ｎ9の数だけ使われる。
【０１０９】
変更のためにソースコードを辿るには
（１）各コードブロックと対象システム定義情報６０１を表現する木構造の節との対応
（２）対応する所定の文字列の置換
（３）深さ優先の辿りで実現できる連接以外の繰り返し、選択による辿りの制御
に関する情報が必要である。
また、対象システム定義情報６０１内の節との対応をとりながら基準プログラムのソースコードを示すテンプレートファイル３０２内のコードブロックを辿る必要がある。
従って、
（４）対象システム定義情報６０１の節のリンクの巡航
に関する知識が間接的に必要となる。
これらを表現するために、必要な記法を示した上で、ソースコードの変更によりプログラムの拡張を行うための拡張ルールを以下に定義する。
【０１１０】
記法Ｌi←ｎjはソースコードの行Ｌiに含まれる所定の文字列が対象システム定義情報の節ｎjに従って置換することを示すものである。Ｒは置換の操作を表すものであり、例えばＲ＝（Ｌi←ｎj、・・・、Ｌh←ｎk）等の形で表現するものである。
【０１１１】
辿り制御は、深さ優先の辿りで実現できる連接以外の方法でソースコードを辿ることを表現するものである。
辿り制御Ｔは、ｉｔｒ（ｎ．ｍ）、ｓｅｌ（ｎ．ｍ）、ｃａｓｅ（ｌ）のいずれかの処理を用いて実現することができる。
変更においては、ａｄａｐｔａｂｌｅ  ｃｅｌｌに対応するコードブロックは反復して利用することができる。
【０１１２】
記法ｉｔｒ（ｎ．ｍ）は反復回数を表現するものである。
ここで、ｍは対象システム定義情報６０１における非終端節ｎがアスタリスク記号（＊）の付いた矢印で指す節の数である。すなわち、このコードブロックはｍ回繰り返し使用することを示す。
【０１１３】
また、ｓｅｌ（ｎ．ｍ）、ｃａｓｅ（ｌ）はコードブロックを選択的に用いるときに利用するものである。ここでｍは非終端節ｎが矢印で指す終端節であり、ｃａｓｅの引数であるｌはｍがとる可能性がある値である。
選択はｎｅｃｌｅｕｓと、その部分集合、すなわちｇｅｎｅ、ｐａｒｔの組合わせによって表現される。
ｎｅｃｅｌｅｕｓのコードブロックに対応する節を考える。このコードブロックとともに指定された記法ｓｅｌ（ｎ.ｍ）とその部分集合とともに指定された記法ｃａｓｅ（ｌ）の組み合わせは、ｍの値がｌと等しいとき、この部分集合が選択されることを示す。
【０１１４】
いま、コードブロックｂが、対象システム定義情報の節ｎeに対応するものとする。
さらに節ｎr1、ｎr2、・・・、ｎrkがコードブロックｂ内での所定の文字列の置換もしくはｂの部分集合を辿る上で必要であるとする。
ここで、ｒ1、ｒ2、・・・、ｒkは自然数とする。
また節ｎr1、ｎr2、・・・、ｎrkを要素に含む集合を｛ｎr1、ｎr2、・・・、ｎrk｝とする。
【０１１５】
いま、｛ｎr1、ｎr2、・・・、ｎrk｝内の任意の要素ｎrmに対し、節ｎeから節ｎrmへ至る経路（パス）を含んでいるような節から節へのリンクの集合として巡航Ｌ（ｎrm）を考える。
巡航集合とは、これら巡航の和集合
【０１１６】
【数１】
0003777859.tif 000003
【０１１７】
である。
文字列置換、節への辿り、ｎe以外の節を必要としないとき巡航集合はφである。
いま、ｎa、ｎbを節としたとき、記法ｎa←ｎbは、節ｎaは節ｎbからのリンクにより巡航できることを示すものとする。このように約束すると巡航集合Ｅは、Ｅ＝｛ｎr←ｎi、・・・、ｎk←ｎe｝で表現できる。
【０１１８】
以上の記法を用い、基準プログラムのソースコードを示したテンプレートファイル３０２を構成するコードブロックから対象システム定義情報の節への対応に対し指定された拡張ルールを定義することができる。
【０１１９】
いま、部分集合ｂc1、ｂc2、・・・、ｂcmを含むコードブロックｂpが対象システム定義情報内の節ｎeに対応しているものとする。
更に、ｂpの部分集合であるｂc1、ｂc2、・・・、ｂcmはそれぞれ節ｎ1、ｎ2、・・・、ｎmに対応しているものとする。
拡張ルールとは巡航集合Ｅ、辿り制御Ｔ、置換Ｒの３つの組である。
【０１２０】
ここで、巡航集合Ｅは節ｎeから｛ｎ1、ｎ2、・・・、ｎm｝の任意の要素へのパスを含み、かつ巡航集合Ｅは節ｎeから辿り制御Ｔで使われる全ての節へのパスを含み、かつ巡航集合Ｅは節ｎeから置換Ｒの任意の要素で使われる節へのパスを含むものとする。
いま記法
【０１２１】
0003777859.tif 000004
【０１２２】
とは、基準プログラムのソースコードにおいて、Ｌi行からＬj行からなるコードブロックｂpが節ｎeに、拡張ルールαpを用いて変更し、拡張することを示すものとする。
この記法を用いて以下に図１の基準プログラムのソースコード内のコードブロックの拡張を説明する。
まず、コードブロックｂwhlの拡張について説明する。
【０１２３】
0003777859.tif 000005
【０１２４】
ここで、拡張ルールαwhlは
【０１２５】
αwhl（Ｅwhl、φ、φ）
Ｅwhl＝｛ｎ4←ｎ1｝
【０１２６】
となる。
これはコードブロックｂwhlは節ｎ1に対応し、拡張ルールαwhlにより拡張することを示す。
次にコードブロックｂprlの拡張を示す。
【０１２７】
0003777859.tif 000006
【０１２８】
ここで、拡張ルールαprlは
【０１２９】
αprl（φ、φ、φ）
【０１３０】
である。
これは、コードブロックｂprlは何ら拡張せずにそのまま用いることを意味する。
次に、コードブロックｂhdの拡張について説明する。
【０１３１】
0003777859.tif 000007
【０１３２】
ここで、拡張ルールαhdとは
【０１３３】
αhd（Ｅhd、φ、Ｒhd）
Ｅhd＝（ｎ2←ｎ1）
Ｒhd＝（Ｌ1←ｎ1、Ｌ3←ｎ2）
【０１３４】
である。
この拡張ルールαhdでは対象システム定義情報６０１において、節ｎ1からリンクされた節への辿りが反復的でもなく、選択的でもないため、拡張ルールαhdの第２引数である辿り制御はφとなる。
【０１３５】
0003777859.tif 000008
【０１３６】
ここで、拡張ルールαinitとは、
【０１３７】
αinit（φ、φ、Ｒinit）
Ｒinit＝（Ｌ6←ｎ1）
【０１３８】
これはコードブロックｂinitは節ｎ1に対応していることを示す。
次に、基礎データ項目を計算するためのコードブロックｂbscを拡張する手法を示す。
基礎データ項目を計算するためのコードブロックｂbscは図４に示す節ｎ7に対応しており、拡張を行うための拡張ルールがαbscであるとする。
つまり、
【０１３９】
0003777859.tif 000009
【０１４０】
ここで、
【０１４１】
αbsc（Ｅbsc、ｃａｓｅ（ＢＡＳＩＣ）、Ｒbsc）
Ｅbsc＝（ｎ8←ｎ7、ｎ9←ｎ8、ｎ10←ｎ9）
Ｒbsc＝（Ｌ8←ｎ10、Ｌ9←ｎ10、Ｌ10←ｎ8、ｎ51）
【０１４２】
とする。
拡張ルールである置換Ｒbscは基準プログラムのＬ8行目の所定の文字情報が節ｎ8のメンバ（つまり節ｎ8からリンクされた節）に従って置換され、Ｌ9行目の所定の文字情報が節ｎ10のメンバに従って置換され、Ｌ10行目の所定の文字情報が節ｎ8、節ｎ51のメンバに従って置換されることを意味する。
【０１４３】
一方、導出データ項目に対応するコードブロックｂdrvは、節ｎ7に対応しており、コードブロックｂdrvを拡張するための拡張ルールをαdrvとする。
図１に示すものでは、
【０１４４】
0003777859.tif 000010
【０１４５】
ここで、
【０１４６】
αdrv（φ、ｃａｓｅ（ＤＥＲＩＶＥＤ）、φ）
【０１４７】
である。
コードブロックｂdrvの更なる分割は後述する。
上述した拡張ルールにおいて、辿り制御ｃａｓｅ（ｌ）が使われるのは、拡張により獲得するデータ項目が基礎データ項目または導出データ項目によりｂbscまたはｂdrvのいずれかを選択するためである。
選択のための節のメンバは節ｎ7に対応するｂavsで以下のように指定される。
【０１４８】
0003777859.tif 000011
【０１４９】
ここで、
【０１５０】
αavs（φ、ｓｅｌ（ｎ7．ｔｙｐｅ）、φ）
【０１５１】
である。コードブロックｂavsでは、その部分集合ｂavsが節ｎ4のａｃｑｕｉｓｉｔｉｏｎ＿ｖａｒｉａｂｌｅの値と同じだけ繰り返し使用される。これは、
【０１５２】
0003777859.tif 000012
【０１５３】
ここで、
【０１５４】
αbdy（Ｅbdy、ｉｔｒ（ｎ4．ａｃｑｕｉｓｉｔｉｏｎ＿ｖａｒｉａｂｌｅ）、φ））
Ｅbdy＝（ｎ7←ｎ4）
【０１５５】
として表現できる。ここで、巡航集合Ｅbdyにより、ｎ4からｎ7へのパスを指定する必要がある。
なぜならコードブロックｂbdyの部分集合であるコードブロックｂavsは節ｎ7に対応してるからである。
【０１５６】
次にコードブロックｂdrvの更なる分割について考える。
コードブロックｂdhdは節ｎ8に対応しており、これを構成するＬ14行の関数名に相当する文字情報は節ｎ8に従って拡張ルールαdhdにより変更される。
つまり、
【０１５７】
0003777859.tif 000013
【０１５８】
ここで、拡張ルールαdhdは
【０１５９】
αdhd（φ、φ、Ｒdhd）
Ｒdhd＝｛Ｌ14←ｎ8｝
【０１６０】
コードブロックｂdtgにおける導出データ項目に対応する文字情報は、
【０１６１】
0003777859.tif 000014
【０１６２】
ここで、拡張ルールαdhdは
【０１６３】
αdtg（φ、φ、Ｒdtg）
Ｒdtg＝｛Ｌ15←ｎ51｝
【０１６４】
となる。コードブロックｂdhd、ｂdtgはコードブロックｂdprlgの部分集合であるため、これらを１つにまとめることができる。
つまり、
【０１６５】
0003777859.tif 000015
【０１６６】
ここで、拡張ルールαdprlgは
【０１６７】
αdprlg（Ｅdprlg、φ、φ）
Ｅdprlg＝｛ｎ8←ｎ7、ｎ51←ｎ7｝
【０１６８】
となる。
また、
【０１６９】
0003777859.tif 000016
【０１７０】
であり、拡張ルールαdusdは
【０１７１】
αdusd（Ｅdusd、φ、Ｒdusd）
Ｅdusd＝｛ｎ71←ｎ9、ｎ51←ｎ71｝
【０１７２】
となる。
コードブロックｂdargsはコードブロックｂdusdを部分集合にもつ。
コードブロックｂdargsは対象システム定義情報のコードブロックｂdusdの数に応じて反復的に辿られる。
従って、
【０１７３】
0003777859.tif 000017
【０１７４】
であり、拡張ルールαdargsは
【０１７５】
αdargs（Ｅdargs、ｉｔｒ（ｎ8．ａｒｇｕｍｅｎｔｓ）、φ）
Ｅdargs＝｛ｎ8←ｎ7、ｎ9←ｎ8｝
【０１７６】
となる。結果として、ｂdrvを拡張するための拡張ルールαdrvは上述したように
【０１７７】
0003777859.tif 000018
【０１７８】
0003777859.tif 000019
【０１７９】
であり、拡張ルールαdrvは
【０１８０】
αdrv（φ、ｃａｓｅ（ＤＥＲＩＶＥＤ）、φ）
【０１８１】
となる。
このようにプログラム変更装置は、コードブロックと対象システム定義情報の節との対応をとりながら、基準プログラムを変更し対象プログラムへ拡張するので、対象プログラムのソースコード内のスキーマは、基準プログラムのソースコードのスキーマがもつ論理構造および入れ子関係を保ちつつ、自動的に変更を行うことが可能となる。
【０１８２】
コードブロックを明示し、それが対応する対象システム内の節と対応に関連付けられた拡張ルールを表現するために基準プログラムの中にタグを導入する。
図５は基準プログラムのソースコードの一例を示すものであり、具体的にはタグファイルの一例を説明するための図である。
コードブロックは、基準プログラムのソースプログラムに「タグ」を埋め込むことにより、明示化される。
【０１８３】
タグの中には拡張ルールが記述される。
図において、１０００は開始タグであるstarting tag、１０１０はコードブロックの種類を示す情報であるkind、１０２０はコードブロックの役割を示す情報であるrole、１０３０は対象システム定義情報の節のと関連を示す情報、１０４０は必要となる変数の情報、１０５０は局所変数に関する情報、１０６０は変更する手順に関する情報である。
また、２０００は終了タグであるending tagである。
以下に図１に示した基準プログラムのソースコードに手続きにタグを埋め込んだものの一例を示す。
【０１８４】
0003777859.tif 000020
0003777859.tif 000021
0003777859.tif 000022
0003777859.tif 000023
【０１８５】
図６はタグの意味を説明するための表図である。
読み込まれたタグは図６の表図に従って解釈される。
表において、internal control label とは、コードブロックの反復的な利用または選択的な利用をするときに用いるものである。
コードブロックの反復的な利用を行うときには、for(exp;exp;・・・;exp)を用いる。ここでforの括弧内に用いる変数の数は反復利用する回数に等しい。
コードブロックの選択的な利用を行うときには、switch(exp)を用いる。ここで、switchの括弧内の変数は選択されるべきコードブロックである。
【０１８６】
文字列の置換を行うコードブロックには、対応する手続き部分の所定の識別子（ここでは、“~!^%()”、“~!^%s()”であり括弧内の文字列が置換の対象となる文字列である）を検出し、ソースコード内の文字列置換を行う。
このとき文字列の置換はconversion list に従って置換がなされる。
【０１８７】
図６に示されているように上述した６種類のコードブロックに対応して６種類のタグの組が用意されている。
各タグの組は開始タグ１０００と終了タグ２０００によってできており、これらのタグで挟まれたソースコード行がコードブロックとなる。
開始タグ１０００は図５に示した第１の記号（ここでは“/*~!^”）で始まり、第２の記号（ここでは“（*/”）で終わる。
一方、終了タグ２０００は第３の記号（ここでは、“/*）~!^”）と第４の記号（ここでは、“/*”）と、これらの記号の間にタグの種類（コードブロックの種類）に関する情報１０１０を有する文字列を有する。
【０１８８】
ジェネレータ生成系３００は、開始タグ１０００の中に記述されたコードブロックを変更するための情報を基にしてジェネレータソースコード３０１を生成する。図５に示すものでは、コードブロックがｃｙｔであるソースコード内の文字列“ＲＢ”、“ＲＢｓｃｈｅｍａ”を拡張ルール（ここではconversion list１０６０）に従ってその文字列を変更するものである。
図５に示すように開始タグ１０００の中には、タグの種類（ここでは、ｃｙｔ）、コードブロックの役割（ここでは、ｈｅａｄｅｒ）、コードブロックが対応する対象システム定義情報６０１の節の名称であるｃｉｒｃｕｌａｒ、拡張ルール（ｃｉｒｃｕｌａｒ（ＲＢに対応）、ｓｃｈｅｍａ（ＲＢｓｃｈｅｍａに対応ｓ）をシステム定義情報で定義された文字列に置換する操作）等が示されている。
タグの種類とはｒｇｄ、ａｄｐ、ｃｙｔ、ｎｃｌ、ｇｅｎ、ｐｒｔのいずれかである。
コードブロックの役割はその上位集合の中でこのコードブロックを一意に識別するための識別子である。
コードブロックが対応する対象システム定義情報６０１の節は図６における実引数（ａｒｇ）と仮引数（ｐａｒａｍ）により表現される。
実引数（ａｒｇ）と仮引数（ｐａｒａｍ）は対象システム定義情報６０１の同一の節を指していなければならない。
また、対象システム定義情報６０１では、各節に対応するデータは構造体を用いて表現されているが、仮引数ではそれが指している節に対応するデータの型を指定する必要がある。
【０１８９】
ジェネレータ生成系３００がジェネレータソースコード３００を生成するとき、実引数はこの手続きの呼び出し側に現れ、仮引数はこの手続きの本体側に現れる。
拡張ルールの巡航集合は図６における局所変数リスト（ｌｏｃａｌ  ｖａｒ．ｌｉｓｔ）により表現される。
これらは生成系の手続き本体の局所変数となる。
局所変数リストにおける代入式は巡航集合におけるリンクの巡航を意味する。この代入式の設定には対象システム定義情報６０１の各節の意味に基づく補助的な関数が必要になることがある。
このため必要に応じてセマンティック間数を定義することができる。
置換リスト（ｃｏｎｖ．ｌｉｓｔ）は拡張ルールにおける置換を表している。
また制御ラベル（ｃｎｔｌ．ｌａｂｅｌ）は辿り制御を表している。
【０１９０】
基準プログラムのソースコード１００の変更においては、基準プログラムのソースコード１００内のコードブロックの関係を維持しつつ、対象プログラムのソースコード８００へ移転されなければならない。
本手法では，構成要素間の関係を明確にするために、Ｒ．Ｇｅｆｂｅｒ、ａｎｄ  Ｓ．Ｈｏｎｇ著、Ｓｌｉｃｉｎｇ  Ｒｅａｌ‐Ｔｉｍｅ  Ｐｒｏｇｒａｍｓｆｏｒ  Ｅｎｈａｎｃｅｄ  Ｓｃｈｅｄｕｌａｂｉｌｉｔｙ、ＡＣＭ  Ｔｒａｎｓ．ｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｌａｎｇｕａｇｅｓ  ａｎｄ  Ｓｙｓｔｅｍｓ、Ｖｏｌ．１９、Ｎｏ．３、１９９７に説明されているような制御依存関係、データ依存関係の考え方を用いる。
【０１９１】
制御依存関係とデータ依存関係とは以下に示すものである。
制御依存関係：文ｓが条件文もしくは繰り返し文の条件式であり、文ｔを実行するかどうかが文ｓの評価結果によって決定するとき、文ｓから文ｔヘの制御依存間係があると言う。
データ依存関係：変数ｖが文ｎで定義され、文ｓで参照されているとし、文ｎから文ｓへの実行パスが存在し、かつ、この実行パスの中では変数ｖは再定義されないようなプログラムを考える。このプログラムにおいては文ｎから文ｓへの変数ｖに関するデータ依存関係があるという。
【０１９２】
基準プログラムのソースコード１００において、コードブロックの入れ子溝造と親のコードブロックにおける子のコードブロックの順序は対象プログラムのソースコード８００においても維持される。
また、ｉｆ文などの条件文とｗｈｉｌｅ文などのループ文の構造をそのすべての要素を１つのコードブロックの中に含めることにより、これらの文に起因する制御依存関係は，基準システムの基準プログラムのメソッドから対象となるシステムの対象プログラムメソッドに正しく移転される。
【０１９３】
具体的な例として、コードブロックｂ内の文ｓで定義された変数ｖが、コードブロックｃ内の文ｔで参照される場合を考えよう。
ここで、文ｔは文ｓに依存するものとする（つまり制御依存関係を有する）。
変数ｖを変数ｕに置換する変更を実行するときには、コードブロックｂとコードブロックｃとの順序が守られ、文ｓと文ｔとの両方で変数ｔが変数ｕへ置換されれば、データ依存関係は正しく移転される。
コードブロックの連接における順序を変更しない限り、正しい文字列置換を行う基準プログラムのソースコードの変更による拡張はデータ依存関係を維持する。
【０１９４】
対象システム定義情報には、対象システムの構成と対象システムで使用されるスキーマと時間制約が指定されている。
アクティブ・リング・モデルに基づくシステムでは対象システムの構成は、獲得エージェントと提供エージェントとのメソッドに影響を与えることなく、総領エージェントが提供エージェントへ依頼を割り付けるメソッドに影響を与える。
このメソッドの本質は依頼の受け取りと
【０１９５】
0003777859.tif 000024
【０１９６】
なる処理の繰り返しである。
つまり、総領エージェントは依頼を受け取ったとき、その依頼が、提供エージェントＰに割り付けられるべき依頼がどうかを調べ、割り付けられるべき依頼であるとき、提供エージェントに依頼を割り付ける。
総領エージェントのメソッドを記述するプログラムのソースコードでは、このコードブロックの並びが分割できないコードブロックとなる。
基準プログラムのソースコードの変更がこのコードブロックの複製とコードブロック内の所定の文字列置換により実行されるので、すべての制御依存関係が正しく移転される。
【０１９７】
上述のｉｆ文における２行目、つまり提供エージェントＰに依頼を割り付ける処理は、依頼を表す変数を定義する依頼受け取りのための文に依存する。
依頼の受け取りのためのコードブロックは必ず対象プログラムのソースコード８００に現れるので、データ依存関係は正しく移転される。
【０１９８】
一方、対象システムで使用されるスキーマは獲得エージェントと提供エージェントのメソッドに影響する。
図１の例では、コードブロックｂbscで基礎データ項目の名称であるａｌｐｈａと、オフセットｏｆｆｓｅｔ，データ長ｌｅｎｇｔｈの値を置換することにより、コードブロックｂbscのコードを他の基礎データ項目の値の設定に変更する場合を例に説明する。
【０１９９】
関数の内部コードは、もし大域変数にアクセスせず、引数だけから求めた値を返すなら、外部からのデータ依存関係を有しない。
従って、コードブロックｂbsc内の文とＬ11からＬ13までの文の間にはデータ依存関係はない。
Ｌ11からＬ13までの文と関数ｃｏｎｖｅｒｓｉｏｎＦｕｎｃｔｉｏｎ（）の内部コードが文Ｌ8、Ｌ9、Ｌ10に依存しないので、コードブロックｂbscを複製し文字列の置換をすることによって、Ｌ11からＬ13までの文を含まないプログラムから、これらの文を含む正しいブログラムを得ることができる。
【０２００】
多くの基礎データ項目に対する値を獲得するためには、コードブロックｂbscの複製と文字列置換を対象となるシステムで必要とする基礎データ項目の数だけ繰り返せば良い。
同様にして、コードブロックｂdrvは別の導出データ項目の値を獲得するための行Ｌ19の生成に用いることができる。
【０２０１】
さらに、たとえ関数ｍａｘｉｍｕｍ（）が任意個の引数からもっとも大きいものを選ぶ関数であったとしても、生成されるコードとｂdusd間にデータ依存関係がなければ、コードブロックｂdusdに対する複製と文字列置換の繰り返しを用いたコード生成により正しいプログラムを得ることができる。
【０２０２】
次に、コードブロックｂavsにおけるｂbscとｂdrvの関係について考える。
値を獲得すべきデータ項目が基礎データ項目または導出データ項目により、拡張におけるコードブロックｂbsc、ｂdrvの選択が行われる。
コードブロックｂbsc内の文とコードブロックｂdrv内の文の間にデータ依存関係も制御依存関係も無いのであれば、選択を伴うコードブロックの変更は可能である。
【０２０３】
２つのコードブロック間に制御依存関係はないが、導出データ項目の値は基礎データ項目の値から計算されるので、コードブロックｂdrv内の文はコードブロックｂbsc内の文に依存する。
図１の例では、Ｌ19の文は、Ｌ10、Ｌ13に依存する。
しかし、変更により生成された文が依存するあらゆる文が変更の後のエージェントのメソッドでも生成されるのであれば、問題はない。
【０２０４】
基準プログラム上で変数名が文字列置換される場合、このような変数はデータ依存性を正しく移転させる上で妨げとなる可能性がある。このような変数について、データ依存性を正しく転移させるには、基準プログラムの変更により生成される文が依存するあらゆるデータ項目について、その値を獲得するための文が拡張された後のエージェントのメソッドでも生成されるように、対象システム定義情報において、データ項目が定義されているかどうかをパーザ６００が検査するように構成すれば良い。
【０２０５】
実施の形態１のプログラム変更装置は、上述のように構成されているので、基準プログラムのソースコードを対象となるシステムに適合しうるプログラムのソースコードへ変更することができるので、対象となるプログラムのソースコードを逐一人手により作り直すための手間を削減することができる。
特に基準プログラムのソースコードを最小システムを動作させるためのプログラムのソースコードとすることにより、比較的短い行数で表現される基準プログラムのソースコードから対象プログラムのソースコードを得ることができる。
【０２０６】
実施の形態２．
入力手段であるビルダ５００は、対象となるシステムを構成するために必要なスキーマや時間制約を定義するための情報、例えば獲得エージェント１の計測手段１１により計測されるデータのデータ型、構成、データを取り込む周期またはタイミング、データ導出手段１２によりにデータを導出する数式などの手法といった情報などを入力するものである。
【０２０７】
ビルダ５００は例えば、入力画面を有し、この入力画面はスキーマを構成する変数の名前を定義するための第１の入力画面である名前定義用画面と、変数の値の設定法を入力するための第２の入力画面である値設定法画面とを有する。
これらの２つの入力画面は、例えば１つの表示装置（図示せず）内に切り分けて表示するように構成する。
【０２０８】
名前定義用画面で指定された変数名の一覧の情報は、値設定法画面で表示されるとともに、値設定法画面で表示された変数名の一覧から値を設定すべき変数を指定できるように構成する。
具体的には変数名の一覧の情報を名前定義用画面、値設定法画面の双方で共有すればよい。
このように構成することにより、限られた表示画面の中に名前定義用画面、値設定法画面を有効に表示することができ、情報（特に基礎データ項目）の入力が容易なるとともに、入力ミスを軽減することができる。
【０２０９】
また、値設定法画面で、その名前をすでに定義した変数名の一覧の中から、変数を選択し、選択した変数の設定法の入力を完了した後、入力情報変換手段であるパーザ６００は変数がスキーマを構成する変数として定義されているかどうかを対象システム定義情報に変換する前に一括して調べるように構成すれば、パーザ６００で再度入力した情報が適切がどうかを検査するので、入力ミスが更に軽減する。
【０２１０】
実施の形態３．
入力手段であるビルダ５００は、入力画面を有し、入力画面はスキーマを構成する変数の名前を定義するための第１の入力画面である名前定義用画面と、変数の値の設定法を入力するための第２の入力画面である値設定法画面とを備え、その値の設定法がすでに入力された変数名の一覧を値設定法画面で表示するとともに、変数名の一覧の中の変数を用いて導出する変数を指定できるように構成したことを特徴とする。
このように構成することにより、限られた表示画面の中に名前定義用画面、値設定法画面を有効に表示することができ、情報（特に導出データ項目）の入力が容易になるとともに、入力ミスを軽減することができる。
【０２１１】
また、値設定法画面において、その設定法をすでに入力した変数の一覧の中から、新たな変数の値を導出するために用いる変数を指定した後、入力情報変換手段であるパーザ６００は、設定法が入力されている変数の名前が名前定義用画面で定義されているかどうかを対象システム定義情報に変換する前に一括して調べるように構成すれば、パーザ６００で再度入力した情報が適切がどうかを検査するので、入力ミスが更に軽減する。
【０２１２】
【発明の効果】
この発明に係るプログラム変更装置によれば、変数の集まりであるスキーマを含む基準プログラムのソースコードにおいて、前記ソースコード内のスキーマ内の変数の値を設定する手続きを記述した部分を要求に応じて変更することにより、対象となるシステムに適合しうる対象プログラムのソースコードに変更するためのものであって、前記対象となるシステムを構成するために必要なスキーマを定義するための情報および、前記対象プログラムを実行する上での時間制約を定義するための情報が入力される入力手段と、前記ソースコードのコードブロック内の変更の対象となる文字列を置換変更するために前記入力手段より入力された情報から木構造を有するデータである対象システム定義情報に変換する入力情報変換手段と、前記基準プログラムのソースコードに予め埋め込まれた情報であって、前記基準プログラムのソースコード内の構成要素であるコードブロックおよび前記対象システム定義情報の対応を付けるとともに前記コードブロックの変更方法を示す情報を抽出する抽出手段とを備え、前記対象システム定義情報に対応づけながら前記抽出したコードブロックの変更方法を示す情報に従って基準プログラムのソースコード内のコードブロックを変更するように構成したので、基準プログラムのソースコードを対象プログラムのソースコードへ容易に変更することが可能である。
【０２１３】
この発明に係るプログラム変更装置によれば、
基準プログラムのソースコードは各コードブロックと対象システム定義情報を構成する要素との対応に関する情報を予め含んだものであって、
抽出手段は、前記基準プログラムのソースコードから各コードブロックと対象システム定義情報を構成する要素との対応に関する情報および前記基準プログラムのソースコード内のコードブロックの変更方法を示す情報と、前記基準プログラムを動作させるためのソースコード本体とを分離抽出するように構成したので、
抽出手段の実装を簡単なものとすることができる。
【０２１４】
この発明に係るプログラム変更装置は、
基準プログラムのソースコード内のコードブロックの変更方法を示す情報は、基準プログラムのソースコードの各コードブロックに１対１に対応し、かつ前記コードブロックを変更する手順を記述した手続きの集まりであり、
前記コードブロックと前記変更する手順を記述した手続きとの対応関係を記述したコメントをソースコード本体に含めたので、
基準プログラムのソースコード内のコードブロックを変更するための情報に誤りがあったとき、
対応するソースコードの部分を容易に対応づけることができる。
【０２１５】
この発明に係るプログラム変更装置は、
基準プログラムのソースコード内のコードブロックの変更方法を示す情報は、前記基準プログラムのソースコードの各コードブロックに１対１に対応し、かつ前記コードブロックを変更する手順を記述した手続きの集まりであり、
前記変更する手順を記述した手続きにおいて使用される引数または局所変数を解釈できるように構成したので、
基準プログラムのソースコード内のコードブロックを変更するための情報に誤りがあったとき、
対応するコードブロックを変更するための情報を容易に対応づけることができる。
【０２１６】
この発明に係るプログラム変更装置は、
基準プログラムのソースコードから各コードブロックと対象システム定義情報を構成する要素との対応に関する情報から所定のコードブロックを繰り返し用いるための情報を受け取ると当該コードブロックを所定の回数繰り返して用いるように構成したので、
基準プログラム内の所定のコードブロックを繰り返し用いることができる。
【０２１７】
この発明に係るプログラム変更装置は、
基準プログラムのソースコードから各コードブロックと対象システム定義情報を構成する要素との対応に関する情報から複数あるコードブロックのうちの所定のコードブロックを選択して用いるための情報を受け取ると当該コードブロックを選択して用いるように構成したので、
基準プログラム内の所定のコードブロック選択して用いることができる。
【０２１８】
この発明に係るプログラム変更装置は、
基準プログラムのソースコードから各コードブロックと対象システム定義情報を構成する要素との対応に関する情報から所定のコードブロック内の所定の文字列を置換する情報を受け取ると当該コードブロック内の所定の文字列を置換して用いるように構成したので、
基準プログラム内の所定のコードブロックを繰り返し用いたとしても、所定のコードブロックの名称が重複することをなくすことができる。
【０２１９】
この発明に係るプログラム変更装置は、
抽出手段は、基準プログラムを動作させるためのソースコード本体と、前記ソースコード本体の構造を示す情報をコメントにしたものとをテンプレートファイルとして出力するように構成したので、
基準プログラムのソースコードに誤りがある場合であっても、誤りのある部分をより早く見つけることができる。
【０２２０】
この発明に係るプログラム変更装置は、
基準プログラムのソースコードはスキーマに依存する部分と、スキーマに依存しない部分とに切り分けるとともに、
前記基準プログラムのソースコード内のスキーマに依存する手続きを記述した部分を変更するように構成したので、
実時間性を保証しつつ基準プログラムのソースコードを変更することができる。
【０２２１】
この発明に係るプログラム変更装置は、
基準プログラムのソースコード内のコードブロックの順序と、変更されたソースコード内のコードブロックの順序が同じになるように前記基準プログラムのソースコードを変更するので、
コードブロック間の相互関係を維持しながら対象システムのソースコードを生成するので、対象プログラムのソースコードに現れる変数についてのデータ依存性が維持される。
【０２２２】
この発明に係るプログラム変更装置は、
基準プログラムのソースコード内で条件文および前記条件文により実行される手続きを変更されたコードブロック内の１つのコードブロックに含めるように構成したので、
基準プログラムのソースコードにおいて、条件文に起因する制御依存性が対象プログラムのソースコードにおいても維持される。
【０２２３】
この発明に係るプログラム変更装置は、
基準プログラムのソースコード内でループ文および前記ループ文の内で実行される手続きを変更されたコードブロック内の１つのコードブロックに含めるように構成したので、
基準プログラムのソースコードにおいて、ループ文に起因する制御依存性が対象プログラムのソースコードにおいても維持される。
【０２２４】
この発明に係るプログラム変更装置は、
入力情報変換手段は、反復的に利用され、そのそれぞれで変数名が置換される変数値設定のためのコードブロックにおいて、置換された変数名の重複がおこっていないかどうかを調べるように構成したので、
反復的な利用による変数名の重複を無くすことができる。
【０２２５】
この発明に係るプログラム変更装置は、
入力情報変換手段は、複数ある内のいずれかが選択され、そのそれぞれで変数名が置換される変数値設定のためのコードブロックにおいて、ある変数の値を導出するために必要となる変数の設定が前記選択により抜けていないかどうかを調べるように構成したので、
変数の設定が抜けを無くすことができる。
【０２２６】
この発明に係るプログラム変更装置は、
入力手段は、入力画面を有し、前記入力画面は
スキーマを構成する変数の名前を定義するための第１の入力画面と、
前記変数の値の設定法を入力するための第２の入力画面とを備え、
前記第１の入力画面で指定された変数名の一覧を前記第２の入力画面で表示するとともに、前記第２の表示画面で表示された変数名の一覧から値を設定すべき変数を指定できるように構成したので、
入力を容易にし、かつ入力ミスを低くすることができる。
【０２２７】
この発明に係るプログラム変更装置は、
第２の入力画面において、その名前をすでに定義した変数名の一覧の中から、変数を選択し、前記選択した変数の設定法を入力した後、
入力情報変換手段は、
前記変数がスキーマを構成する変数として定義されているかどうかを対象システム定義情報に変換する前に一括して調べるように構成したので、
変数名の修正に起因する入力ミスを無くすことができる。
【０２２８】
この発明に係るプログラム変更装置は、
入力手段は、入力画面を有し、前記入力画面は
スキーマを構成する変数の名前を定義するための第１の入力画面と、
変数の値の設定法を入力するための第２の入力画面を備え、
その値の設定法がすでに入力された変数名の一覧を前記第２の入力画面で表示するとともに、前記変数名の一覧の中の変数を用いて導出する変数を指定できるように構成したので、
入力を容易にし、かつ入力ミスを低くすることができる。
【０２２９】
この発明に係るプログラム変更装置は、
第２の入力画面において、その設定法をすでに入力した変数の一覧の中から、新たな変数の値を導出するために用いる変数を指定した後、
入力情報変換手段は、
前記設定法が入力されている変数の名前が前記第１の入力画面で定義されているかどうかを対象システム定義情報に変換する前に一括して調べるように構成したので、
導出における入力ミスを無くすことができる。
【図面の簡単な説明】
【図１】  基準プログラムのソースコードの一例を説明するための図である。
【図２】  実施の形態１のプログラム変更装置を説明するための図である。
【図３】  実施の形態１のプログラム変更装置を説明するための図である。
【図４】  対象システム定義情報の一例を説明するための図である。
【図５】  基準プログラムのソースコードのタグファイルの一例を説明するための図である。
【図６】  基準プログラムのソースコードに埋め込まれたタグの意味を示す表図である。
【図７】  アクティブ・リング・モデルを用いてシステムを構成した一例を説明するための図である。
【符号の説明】
１００：基準プログラムのソースコード
２００：読み出し手段
３００：抽出手段
４００：コンパイラ
５００：入力手段
６００：入力情報変換手段
７００：変更手段
【図１】
0003777859.tif 000025
【図２】
0003777859.tif 000026
【図３】
0003777859.tif 000027
【図４】
0003777859.tif 000028
【図５】
0003777859.tif 000029
【図６】
0003777859.tif 000030
【図７】
0003777859.tif 000031