JP2004348667A - プログラム結合支援装置およびプログラム結合支援プログラム - Google Patents
プログラム結合支援装置およびプログラム結合支援プログラム Download PDFInfo
- Publication number
- JP2004348667A JP2004348667A JP2003147957A JP2003147957A JP2004348667A JP 2004348667 A JP2004348667 A JP 2004348667A JP 2003147957 A JP2003147957 A JP 2003147957A JP 2003147957 A JP2003147957 A JP 2003147957A JP 2004348667 A JP2004348667 A JP 2004348667A
- Authority
- JP
- Japan
- Prior art keywords
- unit
- program
- programs
- function
- variable
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Withdrawn
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
【課題】複数の関数を順次実行することで所望の機能を実現するソフトウェアの開発において、これら関数が特別な識別コードを持たずとも、関数間の公開参照に関する情報を自動で読み取り、処理順序に不整合が発生しないように、これら複数の関数の実行順序の設定を行う装置。
【解決手段】プログラム結合支援装置が、複数の関数の実行順序の入力を受け取り(21)、当該関数にて算出される変数が、この複数の関数中の他の関数にて参照されているか否かについての公開参照情報を検索し(24)、この情報に基づいて、当該他の関数にて参照されている変数を算出している関数が、他の関数より先に実行されるように、複数の単位プログラムの実行順序を設定する(25)。
【選択図】 図2
【解決手段】プログラム結合支援装置が、複数の関数の実行順序の入力を受け取り(21)、当該関数にて算出される変数が、この複数の関数中の他の関数にて参照されているか否かについての公開参照情報を検索し(24)、この情報に基づいて、当該他の関数にて参照されている変数を算出している関数が、他の関数より先に実行されるように、複数の単位プログラムの実行順序を設定する(25)。
【選択図】 図2
Description
【0001】
【発明の属する技術分野】
本発明は、複数の単位プログラムを順次実行することで所望の機能を実現するソフトウェアの開発において、これら単位プログラムの実行順序を設定するプログラム結合支援装置、およびプログラム結合支援プログラムに関するものである。
【0002】
【従来の技術】
従来、例えば自動車のエンジンを制御するエンジンECU用のプログラムの様に、複数の関数を順番に実行することにより、所望の機能を実現するプログラムがある。このようなプログラムにおいては、これらプログラム中の単位プログラムとしての関数の実行順序がプログラムの機能の質に大きな影響を及ぼす場合がある。
【0003】
例えば、エンジンECUにおいて、吸気管圧変化量を算出し公開する関数と、加減速時燃料噴射量補正量を算出し公開する関数を含む複数の関数が、所定の順序で180’CA毎にサイクリックに実行され、この加減速時燃料噴射量補正量の関数が、この吸気管圧変化量の関数の結果を参照するようになっている場合を考える。この場合、もし加減速時燃料噴射量補正量の関数が吸気管圧変化量の関数よりも先に実行されるようになっていれば、算出される加減速時燃料噴射量補正量は、前のサイクルにおいて算出された吸気管圧変化量に基づいたものになってしまい、燃料補正の遅れによる加速の応答遅れを招いてしまう。
【0004】
したがって、この場合、加減速時燃料噴射量補正量の関数が吸気管圧変化量の関数より後に実行されることが望ましい。
【0005】
従来は、このような関数の実行順序の設定は、作業者が関数間の公開と参照の情報を調査し、不整合の起こらないように手動で行うことが一般的であった。
【0006】
しかし、このような従来の手法では、作業者がすべての関数の公開参照情報を調査し処理順序を決定するいわゆる「ホワイトボックス」検査を行うことになり、小規模なソフト構成にしか適用できない。関数の数が増加すると処理順序の設定作業が複雑かつ膨大になるためである。複数人で作業を行うことで作業を効率化することが考えられるが、作業者の設定基準の解釈の違いなどから、必ずしも作業の精度は高くならない。
【0007】
現状のソフトウェアはそのサイズが増加の一途を辿っており、分業化によりそれぞれ別の作業者が各関数を作成すること等を考慮すると、実行順序設定のために作業者が関数の内容を逐一チェックすることのない「ブラックボックス」検査による処理手順の決定が必要となっているといえる。
【0008】
単位プログラム間の公開参照情報をプログラムが自動的にチェックする「ブラックボックス」検査の技術として、例えば特許文献1がある。
【0009】
【特許文献1】
特許第2806976号明細書
【0010】
【発明が解決しようとする課題】
この技術は、既存の登録されたソフトウェアを検査の対象としており、その検査のためにはソフトウェア側が特殊な識別コードを有することを必要とする。日進月歩で変化するソフトウェアを登録制とするのは現実には難しいと言え、また現状ソフトウェア数も膨大となっており特殊な識別コードを設定することは不可能といえる。
【0011】
上記問題点に鑑み、本発明は、複数の単位プログラムを順次実行することで所望の機能を実現するソフトウェアの開発において、単位プログラム間の公開参照に関する情報を自動で読み取り、処理順序に不整合が発生することを抑えるように、これら複数の単位プログラムの実行順序の設定を行う装置またはプログラムを提供することを目的とする。
【0012】
また、これら単位プログラムが特別な識別コードを持たずとも、上記した実行順序の設定を行う装置またはプログラムを提供することを第2の目的とする。
【0013】
【課題を解決するための手段】
上記目的を達成するための請求項1に記載の発明は、複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索してテーブルとして記録する検索手段(24)と、前記検索手段がテーブルとして記録した公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定する順序設定手段(25)と、を備えたプログラム結合支援装置である。
【0014】
これにより、検索手段(24)が、公開参照情報を検索してテーブルとして記録するので、単位プログラム間の公開参照に関する情報を自動で読み取ることができ、また順序設定手段(25)が、前記検索手段がテーブルとして記録した公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定するので、処理順序の不整合の発生が抑えられる。したがって、複数の単位プログラムを順次実行することで所望の機能を実現するソフトウェアの開発において、単位プログラム間の公開参照に関する情報を自動で読み取り、処理順序に不整合が発生することを抑えるように、これら複数の単位プログラムの実行順序の設定を行う装置を提供することができる。
【0015】
また、請求項2に記載の発明は、請求項1に記載のプログラム結合支援装置において、複数の単位プログラムの実行順序の入力を受け取る受取手段(21)を備え、前記検索手段は、前記受取手段が受け取った実行順序に係る複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索することを特徴とする。
【0016】
これにより、受取手段(21)が複数の単位プログラムの実行順序の入力を受け取り、検索手段(24)が、公開参照情報を検索してテーブルとして記録するので、単位プログラム間の公開参照に関する情報を自動で読み取ることができ、また順序設定手段(25)が、前記検索手段がテーブルとして記録した公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定するので、処理順序の不整合の発生が抑えられる。したがって、複数の単位プログラムを順次実行することで所望の機能を実現するソフトウェアの開発において、単位プログラム間の公開参照に関する情報を自動で読み取り、処理順序に不整合が発生することを抑えるように、これら複数の単位プログラムの実行順序の設定を行う装置を提供することができる。
【0017】
また、請求項3に記載の発明は、複数の単位プログラムの実行順序の入力を受け取る受取手段(21)と、前記受取手段が受け取った実行順序に係る複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索する検索手段(24)と、前記公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定する順序設定手段(25)と、を備えたプログラム結合支援装置である。
【0018】
これにより、受取手段(21)が複数の単位プログラムの実行順序の入力を受け取り、検索手段(24)が、公開参照情報を検索するので、単位プログラム間の公開参照に関する情報を自動で読み取ることができ、また順序設定手段(25)が、検索された公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定するので、処理順序の不整合の発生が抑えられる。したがって、複数の単位プログラムを順次実行することで所望の機能を実現するソフトウェアの開発において、単位プログラム間の公開参照に関する情報を自動で読み取り、処理順序に不整合が発生することを抑えるように、これら複数の単位プログラムの実行順序の設定を行う装置を提供することができる。
【0019】
また、請求項4に記載の発明は、請求項2または3に記載のプログラム結合支援装置において、前記受取手段は、作業者が設定した複数の単位プログラムの実行順序の入力を受け取ることを特徴とする。
【0020】
また、請求項5に記載の発明は、請求項1ないし4のいずれか1つに記載のプログラム結合支援装置において、前記順序設定手段は、前記公開参照情報に基づいて、前記複数の単位プログラムの一部または全部をその要素とする並び替え対象集合に含まれるある単位プログラムにて、前記並び替え対象集合に含まれる他の単位プログラムにて算出される変数のいずれもが参照されていない場合、前記ある単位プログラムの実行順序を前記並び替え対象集合に含まれる単位プログラム中で最先とする第1入れ替え手段(315、320)と、前記第1入れ替え手段によって最先とされた単位プログラムを、前記並び替え対象集合の要素から除外する第1除外手段(330)と、を備えたことを特徴とする。
【0021】
また、請求項6に記載の発明は、請求項5に記載のプログラム結合支援装置において、前記順序設定手段は、前記第1入れ替え手段および前記第1除外手段とを再帰的に作動させることで、前記複数の単位プログラムの実行順序を設定することを特徴とする。
【0022】
また、請求項7に記載の発明は、請求項1ないし6のいずれか1つに記載のプログラム結合支援装置において、前記順序設定手段は、前記公開参照情報に基づいて、前記複数の単位プログラムの一部または全部をその要素とする並び替え対象集合に含まれるある単位プログラムにて算出される変数のいずれもが、前記並び替え対象集合に含まれる他の単位プログラムにて参照されない場合、前記ある単位プログラムの実行順序を前記並び替え対象集合に含まれる単位プログラム中で最後尾とする第2入れ替え手段(335、340)と、前記第2入れ替え手段によって最後尾とされた単位プログラムを、前記並び替え対象集合の要素から除外する第2除外手段(350)と、を備えたことを特徴とする。
【0023】
また、請求項8に記載の発明は、請求項7に記載のプログラム結合支援装置において、前記順序設定手段は、前記第2入れ替え手段および前記第2除外手段とを再帰的に作動させることで、前記複数の単位プログラムの実行順序を設定することを特徴とする。
【0024】
また、請求項9に記載の発明は、請求項1ないし8のいずれか1つに記載のプログラム結合支援装置において、前記検索手段は、前記複数の単位プログラムに記載の処理内容を検索することで、前記公開参照情報を検索する。
【0025】
これによって、検索手段は、複数の単位プログラムに記載の処理内容を検索することで公開参照情報を検索するので、単位プログラムが特別な識別コードを持たずとも、実行順序の設定を行う装置またはプログラムを提供することができる。
【0026】
また、請求項10に記載の発明は、請求項9に記載のプログラム結合支援装置において、前記検索手段は、前記複数の単位プログラムのそれぞれの処理内容を検索することで他の単位プログラムに対して公開している変数の名称を抽出し、またその単位プログラムが参照している他の単位プログラムにて算出される変数の名称を抽出し、さらにそれら抽出された変数の名称と対応する単位プログラムの名称との関連を公開参照情報とする抽出手段(830、840)を備えたことを特徴とする。
【0027】
なお、「公開している」とは、「参照することを許可している」こと、および「参照することを禁じていない」等、結果として他のプログラム単位から参照できるようになっていることをいう。また、「公開している」とは、任意の他のプログラム単位から参照できるようになっている場合、特定の他のプログラム単位のみから参照できるようになっている場合の両方を含む概念である。
【0028】
また、請求項11に記載の発明は、請求項1に記載の発明をプログラムとして実現するものであり、請求項12に記載の発明は、請求項3に記載の発明をプログラムとして実現するものである。
【0029】
なお、上記各手段の括弧内の符号は、後述する実施形態に記載の具体的手段との対応関係を示すものである。
【0030】
【発明の実施の形態】
図1に、本発明の一実施形態に係るパーソナルコンピュータ1の構成を示す。パーソナルコンピュータ1は、ディスプレイ11、入力装置12、RAM13、ROM14、HDD(ハードディスクドライブ)15、CPU16等から構成される。
【0031】
ディスプレイ11は、CPU16から入力された映像信号を、ユーザに対して映像として表示する。
【0032】
入力装置12は、キーボード、マウス等から構成され、ユーザが操作することにより、その操作に応じた信号をCPU16に出力する。
【0033】
CPU16は、パーソナルコンピュータ1に電源が投入されることによって起動すると、ROM14から所定のブートプログラムを読み出して実行し、このブートプログラムに規定されるオペレーティングシステム(以下OSと記す)その他のプログラムをHDD15から読み出して実行することにより、起動処理を行う。起動処理以後電源が遮断されるまで、CPU16は、入力装置12からの信号、OSによって予め定められたスケジュール等に基づいて、HDD15に記録されている各種プログラムを当該OS上のプロセスとして実行する。
【0034】
また、上記した起動処理およびプロセスにおいて、CPU16は必要に応じて入力装置12から信号の入力を受け付け、またディスプレイ11に映像信号を出力し、またRAM13、HDD15に対してデータの読み出し/書き込みの制御を行う。
【0035】
図2に、HDD15に保存され、OS上のプロセスとして実行されるプログラムの1つである並び替えプログラム20の機能ブロック図を示す。
【0036】
並び替えプログラム20は、呼び出し設定部21、関数呼び出し定義ファイル読み込み部22、順序検査部23、公開/参照情報検索部24、呼び出し並び替え部25、関数呼び出し定義ファイル生成部26を有している。また、並び替えプログラム20は、ソフトウェア群31を参照し、関数呼び出し定義ファイル32を生成、参照し、ログファイル33を生成するようになっている。
【0037】
ソフトウェア群31は、このプログラムの並び替えの対象となる関数を含む、C、C++等の言語で記述されたソースコード等を構成要素とするソフトウェアの集まりであり、HDD15に保存されている。図3(a)に、ソフトウェア群31の一部としてHDD15にファイルとして格納されているソースコード35、公開用ヘッダ36、参照用ヘッダ37の一例を示す。
【0038】
ソースコード35はプログラミング言語Cによって記述されており、2つの関数func_Aおよびtemp1_GetAを有している。さらに、ソースコード35は、公開用ヘッダ36および参照用ヘッダ37をインクルードしている。公開用ヘッダ36のファイル名temp1.hedは、ソースコード35のファイル名temp1.cの拡張子をhedに置き換えたものであり、参照用ヘッダ37のファイル名temp1_Ref.hedは、ソースコード35のファイル名のピリオドより前の部分temp1に_Ref.hedを付加したものである。
【0039】
関数func_Aは、その中で変数Ref_Eを参照している(太字部分)が、この変数Ref_Eは参照用ヘッダ37においてソースコード35が有さない関数temp2_GetEとして定義されている(太字部分)。従って、ソースコード35の変数Ref_Eが記載された部分および参照用ヘッダ37の変数Ref_Eの定義部分は、関数func_Aの参照情報である。
【0040】
関数temp1_GetAは、関数func_A内において算出されるようになっている文字変数A(矩形で囲まれた部分)を戻り値として返す(矩形で囲まれた部分)ようになっている。そして、公開用ヘッダ36では、関数temp1_GetAが文字変数として宣言されている。これによって、他の関数が公開用ヘッダ36をインクルードして関数temp1_GetAを呼び出すことで、変数Aの値が外部から参照できるようになっている。したがって、ソースコード35および公開用ヘッダ36の矩形で囲まれた部分は、関数func_Aの公開情報である。
【0041】
ソフトウェア群31は、上記した命名規則によって1つのソースコード、およびそのソースコードのファイル名と1対1に関連付けられたファイル名を有する公開用ヘッダと参照用ヘッダから成る組を複数有する。そしてこの公開用ヘッダは、1対1に関連付けられたソースコードの公開情報を有し、またこの参照用ヘッダは、1対1に関連付けられたソースコードの参照情報を有する。
【0042】
図3(b)に、ソフトウェア群31に含まれる他の関連付けられたソースコード38、公開用ヘッダ39、および参照用ヘッダ40を示す。ソースコード38内において、変数Ref_Aが参照されているが、これは参照用ヘッダ40において関数temp1_GetAとして定義され、この関数temp1_GetAは上述の通りソースコード35にて算出される変数Aを返す。また、ソースコード38によって算出される変数Eは関数temp2_GetEによって公開されるようになっており、上述の通りソースコード35のRef_Eの部分によって参照されている。
【0043】
このように、図3(a)(b)に示した例では、ソースコード35中の関数func_Aは変数Aを公開し、ソースコード38で算出・公開されている変数Eを参照している。また、ソースコード38中の関数func_Eは変数Eを公開し、ソースコード35で算出・公開されている変数Aを参照している。
【0044】
このように、ソフトウェア群31内の関数は他のソフトウェア群31内の関数に対して参照または公開を行うようになっている。そして、公開参照情報は、このような関数間の変数の公開、参照の情報を有するものである。
【0045】
関数呼び出し定義ファイル32は、関数を呼び出す順序を規定するファイルであり、HDD15に複数種類保存されている。図4に、関数呼び出し定義ファイル32の一例を示す。関数呼び出し定義ファイル32は、Cソースコードの形式で記載されており、この関数呼び出し定義ファイル32に記載された関数func_A、func_B、func_C、func_D、func_E、func_F等の規定の実行順序とは、図中上から下への順序に相当する。
【0046】
実際にこの関数呼び出し定義ファイル32の規定に従って関数を実行する際には、関数呼び出し定義ファイル32、およびソフトウェア群31中の、この関数呼び出し定義ファイル32中に記載されている関数の実体が記載されているファイルをまとめてコンパイルしてオブジェクトコードを生成し、そのオブジェクトコードを実行する。
【0047】
ログファイル33は、並び替えプログラム20の動作結果が記録されるようになっており、HDD15に保存される。
【0048】
この並び替えプログラム20の各部の動作の概要は、以下の通りである。なお以降は、プログラムを実行することによるCPU16の動作を、その実行されるプログラム自体の動作であるとして説明する。
【0049】
まず、作業者30が入力装置12を操作して、ある関数呼び出し定義ファイル32の指定を並び替えプログラム20に入力すると、呼び出し設定部21がHDD15から当該関数呼び出し定義ファイル32を読み出して、ディスプレイ11にその内容を表示させる。作業者30はこの表示された既存関数の呼び出し順序の定義に対して、関数の追加、並び替え、削除等の変更を行う(図2の(1)に対応)。なお、呼び出し順序とは、実行の順序のことである。呼び出し設定部21は、変更された呼び出し順序の入力を受け取り、それを順序検査部23に出力する(図2の(2)に対応)。
【0050】
呼び出し順序が入力された順序検査部23は、まずこの順序中の関数の公開/参照情報を入手するために、公開/参照情報検索部24に当該呼び出し順序を出力する(図2の(3)に対応)。
【0051】
公開/参照情報検索部24では、入力された呼び出し順序中の関数の公開情報および参照情報をソフトウェア群31から抜き出し、これらを順序検査部23に出力する(図2の(4)に対応)。
【0052】
順序検査部23は、入力された関数の公開参照情報からこれら情報の一覧表を作成し、これを呼び出し並び替え部25に出力する(図2の(5)に対応)。
【0053】
呼び出し並び替え部25は、入力された一覧表を基に、これら関数の呼び出しの順序を自動的に並べ替える。
【0054】
並べ替えられた結果の順序は順序検査部23に出力され(図2の(6)に対応)、この結果を受け取った順序検査部23は、これを関数呼び出し定義ファイル生成部26に出力し(図2の(7)に対応)、関数呼び出し定義ファイル生成部26では入力された関数呼び出し順序を関数呼び出し定義ファイル32に出力する。
【0055】
また、順序検査部23によって、並べ替えの経過、結果、処理異常等の、並び替えプログラム20の動作の情報はログファイル生成部27に出力され(図2の(8)に対応)、ログファイル生成部27は入力された情報をログファイル33に書き込む。
【0056】
以上のような並び替えプログラム20の全体としての機能を実現するための、呼び出し設定部21、関数呼び出し定義ファイル読み込み部22、順序検査部23、公開/参照情報検索部24、呼び出し並び替え部25、関数呼び出し定義ファイル生成部26、およびログファイル生成部27の具体的な構成を以下説明する。
【0057】
関数呼び出し定義ファイル読み込み部22は、呼び出し設定部21からファイル名、およびオープンの命令を受けると当該ファイルをオープンし、また呼び出し設定部21からファイル名、および読み出しの命令を受けると、当該ファイルの内容を読み出して呼び出し設定部21に出力する。なお、ファイルのオープンとは、当該ファイルの読み出し、書き込みを可能にする処理をいう。
【0058】
関数呼び出し定義ファイル生成部26は、順序検査部23からファイル名、およびオープンの命令を受けると当該ファイルをオープンし、また順序検査部23からファイル名、および書き込みの命令、および書き込み内容の情報を受けると、当該書き込み内容の情報を関数呼び出し定義ファイル32としてHDD15に書き込む。
【0059】
ログファイル生成部27は、順序検査部23から情報およびログファイル作成の命令を受けると、ログファイル33をオープンし、当該情報をこのログファイル33に書き込む。
【0060】
図5に、呼び出し設定部21の動作のフローチャートを示す。このプログラムは、並び替えプログラム20が有する、あるいはOSによって提供されるユーザインターフェース用のプログラムによって、作業者30の入力装置12の操作によって指定した関数呼び出し定義ファイル32の特定が為されたときに動作を開始する。
【0061】
まずステップ510では、この指定された関数呼び出し定義ファイル32をオープンする。すなわち、当該関数呼び出し定義ファイル32を読み出し可能な状態にする。具体的には、関数呼び出し定義ファイル読み込み部22に指定された当該ファイル名およびファイルをオープンする命令を出力する。
【0062】
次にステップ520では、関数呼び出し定義ファイル読み込み部22にこのファイル名および読み出し命令を出力することで、この特定された関数呼び出し定義ファイル32の内容を読み出し、その内容の文字データをディスプレイ11に出力する。
【0063】
これによって、ディスプレイ11は関数呼び出し定義ファイル32の内容を表示する。
【0064】
次にステップ530では、当該表示した関数呼び出し定義ファイル32の、作業者30の入力装置12の操作による内容の変更を検出し、その検出をディスプレイ11の画面表示に反映させるよう、文字データをディスプレイ11に出力する。関数呼び出し定義ファイル32の内容の変更とは、関数呼び出し定義ファイル32に記載された関数の実行順序の並び替え、関数呼び出し定義ファイル32に記載された関数の一部または前部の削除、関数呼び出し定義ファイル32への新たな関数の追加等をいう。これによって、呼び出し設定部21は、関数の実行順序の入力を受け取ることができる。
【0065】
更にステップ530では、作業者30の関数呼び出し定義ファイル32に対する変更(設定)が終了したか否かを判定する。具体的には、作業者30が入力装置12に対して設定終了の旨の所定の操作を行ったことを検知したか否かを判定する。そして、変更が終了するまで、ステップ530の処理をくり返し、変更が終了すると、処理はステップ540に進む。
【0066】
ステップ540では、上記変更結果に基づく関数の順序を配列FuncName[]に保存する。具体的には、RAM13中に配列FuncName[]のための領域を確保し、これら関数の名称が、それらの関数の順序の先頭から最後尾までの順に、配列FuncName[]の各配列要素に格納される。例えば配列FuncName[]の添字が1から始まる場合は、順序がn番目の関数はFuncName[n]に格納される。なお、既に配列FuncName[]がRAM13中に存在するときは、上記変更結果に基づく関数の順序を当該配列FuncName[]に上書きする。
【0067】
この配列FuncName[]は、後述するように順序検査部23がその動作において利用するので、FuncName[]への関数名の書き込みは、実効的には順序検査部23への実行順序の出力である。以上で呼び出し設定部21の動作は終了する。
【0068】
図6に、関数呼び出し定義ファイル読み込み部22の動作のフローチャートを示す。このプログラムは、呼び出し設定部21によって配列FuncName[]が生成され、または上書きされたときに動作を開始する。
【0069】
ステップ610では、公開/参照情報検索部24を起動する。なお、配列FuncName[]は、後述するように公開/参照情報検索部24がその動作において利用するので、公開/参照情報検索部24の起動は、実効的には順序検査部23から公開/参照情報検索部24へのFuncName[]の出力である。
【0070】
これによって、公開/参照情報検索部24が動作し、後述するような動作内容により、配列SupplyName[]、UseName[]が生成される。このSupplyName[]、UseName[]は、FuncName[]と対応するように生成される。具体的には、FuncName[n](nは整数)に格納されている関数名を有する関数(以下FuncName[n]に係る関数という)が公開している変数名がSupplyName[n]に格納され、当該関数が参照している変数名がUseName[n]に格納される。図7に、FuncName[]、S upplyName[]、UseName[]の対応関係を表として示す。この表中、数字1〜6でラベルされる各行は、それぞれ1〜6番目の配列FuncName[]、SupplyName[]、UseName[]の要素である。各配列FuncName[]、SupplyName[]、UseName[]は、図7に示すようなテーブルとして、各関数間の公開参照情報を構成する。
【0071】
なお、1つの関数が参照する値および公開する値は、それぞれ1つであるとは限らないので、実際にはSupplyName[]、UseName[]は1つの要素が複数の変数名を示すようになっている。具体的には、例えばSupplyName[]、UseName[]はコンマ、セミコロン等の所定のデリミタで区切られた複数の変数名を文字列として有するようになっていてもよい。また例えば、SupplyName[]、UseName[]は、それぞれの要素が特定の配列変数のアドレスを指定するポインタとなっており、その指定されたそれぞれの配列変数が複数の変数名を格納するようになっていてもよい。
【0072】
次にステップ620では、後にログファイルを作成するための一時保存のために、現在のFuncName[]、SupplyName[]、UseName[]をそれぞれ別の配列変数FuncNameBuf[]、SupplyNameBuf[]、UseNameBuf[]にコピーする。
【0073】
次にステップ630では、後に使用する並び替え用の変数StaPointerおよびEndPointerを初期化する。具体的には、RAM13中にStaPointerおよびEndPointerの領域が無ければ確保し、StaPointerには1を代入し、EndPointerには配列FuncName[]のサイズ、すなわち配列FuncName[]に格納された関数名の数を格納する。
【0074】
次にステップ640では、呼び出し並び替え部25を起動させる。さらにこのとき、SupplyName[]、UseName[]を初期化し、FuncName[]、SupplyName[]、UseName[]、StaPointerおよびEndPointerを引数として呼び出し並び替え部25に渡す。これは、実効的には順序検査部23から呼び出し並び替え部25への図7に示したようなテーブルとしての公開参照情報等の出力である。
【0075】
呼び出し並び替え部25は、後述する動作によって、公開参照情報に基づいて配列FuncName[]、SupplyName[]、UseName[]の要素の並べ替えを行うことで、関数の実行順序の並べ替えを行う。
【0076】
次にステップ650では、関数呼び出しの並び替え前の設定と並び替え後との違いを確認し、ログファイルを生成する。具体的には、FuncNameBuf[]、SupplyNameBuf[]、UseNameBuf[]を、それぞれFuncName[]、SupplyName[]、UseName[]と比較し、どのように並べ替えが行われたかを検出し、これらFuncNameBuf[]、SupplyNameBuf[]、UseNameBuf[]、FuncName[]、SupplyName[]、UseName[]、およびどのように並べ替えが行われたかの情報を、ログファイル作成の命令と共にログファイル生成部27に出力する。これにより、ログファイル33に今回の並べ替えの情報が記録される。
【0077】
次にステップ660では、関数呼び出し定義ファイル生成部26に関数呼び出し定義ファイル32をオープンする命令を出力し、さらに、関数呼び出し定義ファイル生成部26に書き込み命令と、FuncName[]に格納されているものと同じ順序の、関数呼び出し定義ファイル32の形式に従った関数呼び出し定義ファイル32を出力する。これにより、関数呼び出し定義ファイル生成部26によって新たな関数呼び出し定義ファイル32が生成される。これによって、並び替えられたFuncName[]の順序が新たな関数の実行順序となる。以上で順序検査部23の動作は終了する。
【0078】
図8に、公開/参照情報検索部24の動作のフローチャートを示す。このプログラムは、図6のステップ610の処理によって、その動作を開始する。
【0079】
まず、ステップ810では、変数Numberに1を代入する。
【0080】
ステップ820では、FuncName[Number]、すなわち、配列FuncName[]のNumber番目の要素を検索対象とする。具体的には、現在の検索対象を示すための変数にNumberの値を代入する。
【0081】
ステップ830では、図9に示す当該検索対象の関数についての公開情報抜き出しの処理を行う。後述するように、この公開情報抜き出しの処理によって、FuncName[Number]に係る関数の公開する変数名がSupplyName[Number]に格納される。
【0082】
ステップ840では、図10に示す当該検索対象の関数についての参照情報抜き出しの処理を行う。後述するように、この参照情報抜き出しの処理によって、FuncName[Number]に係る関数が参照する変数名がUseName[Number]に格納される。
【0083】
ステップ850では、変数Numberの値を1だけ増加させる。
【0084】
ステップ860では、変数Numberが配列FuncName[]のサイズより大きいか否かを判定する。大きければ処理は終了し、大きくなければ処理はステップ820に戻る。
【0085】
この公開/参照情報検索部24の動作によって、FuncName[]にその名称が格納されている全ての関数について、公開情報がSupplyName[]に、参照情報がUseName[]に格納される。
【0086】
以下、ステップ830で起動される図9の公開情報抜き出し処理について説明する。
【0087】
まずステップ910で、検索対象の関数、すなわちFuncName[Number]に係る関数を含むソースコードのファイルをオープンする。これは、公開用ヘッダファイルの内容を検索し、該当する関数名の宣言文がある公開用ヘッダファイルに先述した命名規則により1対1に対応するソースコードのファイルをオープンすることで実現される。
【0088】
次にステップ920で、当該関数内で演算している変数を検索する。関数内で演算している変数とは、その関数内の代入文中で、代入される変数となっている変数(例えば代入記号“=”の左側にある変数)をいう。具体的には,関数の処理内容(すなわち関数に記載されている各文)を逐一検索し、当該変数を抽出する。
【0089】
次にステップ930で、検索の結果において、演算している変数が1つ以上あるか否かを判定する。1つ以上あれば、それらの演算している変数の個々についてステップ950から970までのループ処理を行うため、処理はステップ950に進み、1つもなければ、処理はこのループ処理を省略してステップ980に進む。
【0090】
ステップ950では、当該演算している変数の1つが、外部に公開されるようになっている変数であるか否かを判定する。当該演算している変数が外部に公開されるようになっている場合としては、例えば、当該関数を有するファイル内というスコープにおいてこの変数がグローバルであり、かつこのファイル中にこの変数を返すような別の関数が定義されている場合、換言すれば当該変数のスコープ中にこの変数を返すような関数が定義されている場合がある(図3参照)。また例えば、当該関数がC++等のオブジェクト指向言語によるクラスとして実現されていれば、当該変数が外部公開用にパブリック宣言されたメソッドを呼び出すことによって参照できるようになっている場合がある。当該変数が、外部に公開されるようになっていれば処理はステップ960に進み、外部に公開されるようになっていなければ処理はステップ970に進む。
【0091】
ステップ960では、外部に公開されるようになっている当該変数を配列SupplyName[Number]に、または、配列SupplyName[ Number]の示すアドレスに割り当てられた配列にその値を追記する形で格納する。
【0092】
ステップ970では、ステップ920で検索した全ての当該関数内で演算(算出と同義)している変数について、ステップ950の処理を行ったか否かを判定する、全てについて行っていれば、処理はループを終了してステップ980に進み、全てについて行っていなければ、まだ当該処理を行っていない変数の1つを処理対象とし、処理はステップ950に戻る。
【0093】
ステップ980では、ステップ910でオープンした検索対象関数を含むファイルをクローズし、その後公開情報抜き出し処理は終了する。なおクローズとは、当該ファイルの読み出し、書き込みができる状態を終了することをいう。
【0094】
以上のような公開情報抜き出し処理によって、検索対象の関数内で演算されており、かつ外部の関数から参照できるよう公開を行っている変数の全てが、当該検索対象関数の名称を格納している配列FuncName[]の要素に対応する配列SupplyName[]の要素に格納される。
【0095】
以下、ステップ840で起動される図10の参照情報抜き出し処理について説明する。まずステップ710で、図9のステップ910と同様、検索対象の関数、すなわちFuncName[Number]に係る関数を含むソースコードのファイルをオープンする。
【0096】
次にステップ720で、検索対象関数内で参照している外部の関数を検索する。外部とは、当該関数内でないという意味である。具体的には、関数の処理内容(すなわち関数に記載されている各文)を逐一検索し、Ref_から始まる変数名を有する変数を抽出する。そして、抽出した全ての当該変数のうち、当該関数を含むソースファイルに1対1に対応する参照用ヘッダのdefine文において、当該変数が当該ソースファイル中に無い関数として定義されている変数を抽出し、この抽出したものを検索対象関数内で参照している外部の関数とする。
【0097】
次にステップ730で、検索の結果において、当該参照している外部関数が1つ以上あるか否かを判定する。1つ以上あれば、それら参照している外部関数の個々についてステップ740から760までのループ処理を行うため、処理はステップ740に進み、1つもなければ、処理はこのループ処理を省略してステップ770に進む。
【0098】
ステップ740では、当該参照している外部関数の1つが定義されているCソースコードのファイルを検索する。これは、各公開用ヘッダのファイルの記載内容を検索し、該当する外部関数名の宣言文がある公開用ヘッダファイルに1対1に対応するCソースコードのファイルを特定することで実現される。
【0099】
ステップ750では、当該特定したCソースコードのファイルの処理内容を逐一検索することで、この外部関数によって返される変数名(例えば図3(a)における変数A)を抜き出し、その名称を配列UseName[Number]または、配列UseName[Number]の示すアドレスに割り当てられた配列にその値を格納する。
【0100】
ステップ760では、ステップ720で検索した全ての外部参照について、ステップ730の処理を行ったか否かを判定する。全てについて行っていれば、処理はループを終了してステップ770に進み、全てについて行っていなければ、まだ当該処理を行っていない外部参照の1つを処理対象とし、処理はステップ740に戻る。
【0101】
ステップ770では、ステップ710でオープンした検索対象関数を含むファイルをクローズし、その後参照情報抜き出し処理は終了する。
【0102】
以上のような参照情報抜き出し処理によって、検索対象の関数内で参照しており、かつ他の関数中で当該検索対象の関数に対して公開されている変数の全てが、当該検索対象関数の名称を格納している配列FuncName[]の要素に対応する位置の配列UseName[]の要素に格納される。
【0103】
以上のような動作によって、公開/参照情報検索部24は、呼び出し設定部21が受け取った実行順序に記載されている複数の関数中の関数にて算出・公開される変数が、他の関数にて参照されているか否かについての公開参照情報を検索してテーブルとして記録する。
【0104】
図11、12、13に、呼び出し並び替え部25の動作のフローチャートを示す。このプログラムは、図6のステップ640の処理によって、その動作を開始する。
【0105】
次に、図11のステップ110では、変数EndPointerから変数StaPointerを減算した値が0以下であるか否かを判定する。これは、後述する並び替え対象範囲の数が1以下となったか否かを判定するための処理である。なお、StaPointerは並び替え対象範囲の先頭位置を示す値を有しており、EndPointerは当該範囲の最後尾を示す値を有している。EndPointer − StaPointerが0以下であれは処理は終了し、0以下でなければ処理はステップ120に進む。なお、図6のステップ640において起動した時点では、EndPointerは配列FuncName[]のサイズであり、StaPointerは1であるから、FuncName[]に1つ以下しか関数名が格納されていない場合を除いて、EndPointer − StaPointerは0より大きくなる。
【0106】
ステップ120では、関数状態を格納するために用いる配列UseInRange[]の初期化を行う。具体的には、RAM13中に配列UseInRange[]のための領域を割り当て、配列UseInRange []の全ての要素をゼロとする。なお、配列UseInRange[]は、各要素が4ビットの配列変数である。以下、この各要素の最下位ビットから最上位ビットまでを順に第1ビット、第2ビット、第3ビット,第4ビットと記す。
【0107】
ステップ120の後には、処理は図12のステップ205に進み、第1ループについての初期設定を行う。具体的には、変数Loopの値をStaPointerの値に初期化する。なお、第1ループとは、ステップ210からステップ265までの処理の繰り返しのことである。
【0108】
次にステップ210では、第2ループについての初期設定を行う。具体的には、変数Loop2の値をStaPointerの値に初期化する。なお、第2ループとは、ステップ225からステップ245までの処理の繰り返しのことである。
【0109】
次にステップ215では、第1ループの関数に公開変数があるか否かを判定する。第1ループの関数とは、FuncName[Loop]に係る関数である。この関数に公開変数があるか否かについては、具体的には、配列SupplyName[]の当該関数についての要素SupplyName[Loop]に1つ以上変数名が格納されているか否かを判定する。公開変数があれば処理はステップ220に進み、なければステップ250に進む。
【0110】
ステップ220では、第1ループの関数に公開変数があるという情報を配列UseInRange[]に格納する。具体的には、UseInRange[Loop − StaPointer]の第4ビットを1とする。
【0111】
ステップ225では、第1ループの関数の公開変数が第2ループの関数の参照変数として使用されているか否かを判定する。第2ループの関数とは、FuncName[Loop2]に係る関数である。この判定は、具体的には、SupplyName[Loop]に格納され、かつUseName[Loop2]に格納されている変数名があるか否かの判定である。第1ループの関数の公開変数が第2ループの関数の参照変数として使用されていれば処理はステップ230に進み、使用されていなければ処理はステップ240に進む。
【0112】
ステップ230では、第1ループの関数の公開変数は範囲内で参照されている旨の情報を配列UseInRange[]に格納する。具体的には、UseInRange[Loop − StaPointer]の第3ビットを1とする。なお、「範囲内」とは、現時点での並び替え範囲内、すなわち、FuncName[StaPointer]からFuncName[EndPointer]までの範囲によって示される関数の範囲内をいう。なお、並び替え対象範囲内の関数は、並び替え対象集合の要素である。
【0113】
次にステップ235では、第2ループの関数の参照は範囲内で公開されている旨の情報を配列UseInRange[]に格納する。具体的には、UseInRange[Loop2 − StaPointer]の第1および第2ビットを1とする。
【0114】
ステップ240では、Loop2の値を1増加させる。
【0115】
次にステップ245では、Loop2の値がEndPointerの値よりも大きいか否かを判定する。大きければ処理はステップ250に進み、大きくなければ処理は第2ループの先頭のステップ225に戻る。
【0116】
次にステップ250では、第1ループの関数に参照変数があるか否かを判定する。具体的には、配列UseName[]の当該関数についての要素SupplyName[Loop]に1つ以上変数名が格納されているか否かを判定する。参照変数があれば処理はステップ255に進み、なければステップ260に進む。
【0117】
ステップ255では、第1ループの関数に参照情報があるという情報を配列UseInRange[]に格納する。具体的には、UseInRange[Loop − StaPointer]の第2ビットを1とする。そして処理はステップ260に進む。
【0118】
ステップ260では、Loopの値を1増加させる。
【0119】
次にステップ265では、Loopの値がEndPointerの値よりも大きいか否かを判定する。大きければ処理は図13のステップ305に進み、大きくなければ処理は第1ループの先頭のステップ210に戻る。
【0120】
以上のようなステップ205〜265の処理によって、変数LoopがStaPointerからEndPointerまで1づつ増加する第1ループの繰り返しを行うことによって、UseInRange[]の各要素は以下の(a)〜(d)の条件を満たすようになる。
(a)FuncName[j](jはStaPointerからEndPointerまでの整数、以下同様)に係る関数にて外部に公開されている変数があれば、UseInRange[j− StaPointer]の第4ビットが1となり、さもなければ当該ビットが0になる。
(b)FuncName[j]に係る関数にて外部に公開している変数が、範囲内の他の関数にて参照されていれば、UseInRange[j− StaPointer]の第3ビットが1となり、さもなければ当該ビットが0になる。
(c)FuncName[j]に係る関数にて外部の変数を参照していれば、UseInRange[j− StaPointer]の第2ビットが1となり、さもなければ当該ビットが0になる。
(d)FuncName[j]に係る関数にて参照している外部の変数が、範囲内の他の関数にて公開されているものであれば、UseInRange[j− StaPointer]の第1ビットが1となり、さもなければ当該ビットが0になる。
【0121】
図13のステップ305では、入れ替えステータス情報変数ChangeStatus、基準ポインタ変数BasePointer、およびループ変数Loopの初期化を行う。具体的には、これら変数のための領域をRAM13に確保し、ChangeStatusの値を0に、BasePointerの値をStaPointerに、Loopの値を0に設定する。
【0122】
次にステップ310では、ステップ310からステップ360までのループの強制終了条件を判定する。具体的には、BasePointerにLoopを加算した値がEndPointerより大きいか否かを判定し、大きい場合は処理を終了し、大きくない場合はループを続行するため処理をステップ315に進める。
【0123】
ステップ315では、当該ループの関数が参照している変数が範囲外で公開されているか否かを、配列UseInRange[]を用いて判定する。当該ループの関数とは、配列UseInRange[]のループ位置UseInRange[Loop]における要素が対象とする関数、すなわちFuncName[BasePointer + Loop]に係る関数である。この判定は、具体的には、UseInRange[Loop]の第1ビットが0であるか否かによって行う。範囲外であれば処理はステップ320に進み、範囲内であれば処理はステップ335に進む。
【0124】
ステップ320では、当該ループの関数を範囲の先頭の関数と入れ替える。これは、範囲内に参照する変数が無いので、当該ループの関数が範囲内の関数の中で先頭の実行順位となってもよいからである。具体的には、FuncName[StaPointer]の値と、FuncName[BasePointer + Loop]の値とを入れ替え、SupplyNam e[StaPointer]の値と、SupplyName[BasePointer + Loop]の値とを入れ替え、UseName[StaPointer]の値と、UseName[BasePointer + Loop]の値とを入れ替える。
【0125】
次にステップ325では、入れ替えステータス情報変数ChangeStatusの値を範囲の先頭に入れ替え済みの旨にする。具体的には、ChangeStatusの第1ビットを1とする。
【0126】
次にステップ330では、範囲の開始位置を、1つ分範囲が狭まる方向へずらず。具体的には、StaPointerの値を1増加させる。そして処理はステップ355へ進む。
【0127】
ステップ315で範囲外でないと判定された後のステップ335では、当該ループの関数が公開している変数が範囲外である(すなわち範囲内で参照されていない)か否かを、配列UseInRange[]を用いて判定する。この判定は、具体的には、UseInRange[loop]の第3ビットが0であるか否かによって行う。範囲外であれば処理はステップ340に進み、範囲内であれば処理はステップ355に進む。
【0128】
ステップ340では、当該ループの関数を範囲の最後尾の関数と入れ替える。これは、範囲内に当該公開変数を参照する関数が無いので、当該ループの関数が範囲内の関数の中で最後の実行順位となってもよいからである。具体的には、FuncName[EndPointer]の値と、FuncName[BasePointer + Loop]の値とを入れ替え、SupplyName[EndPointer]の値と、SupplyName[BasePointer + Loop]の値とを入れ替え、UseName[EndPointer]の値と、UseName[BasePointer + Loop]の値とを入れ替える。
【0129】
次にステップ345では、入れ替えステータス情報変数ChangeStatusの値を範囲の最後尾に入れ替え済みの旨にする。具体的には、ChangeStatusの第2ビットを1とする。
【0130】
次にステップ350では、範囲の最後尾位置を、1つ分範囲が狭まる方向へずらず。具体的には、StaPointerの値を1減少させる。そして処理はステップ355へ進む。
【0131】
ステップ355では、Loopの値を1増加させる。
【0132】
次にステップ360では、配列UseInRange[]の全てについてステップ315からステップ355までの検査処理を行ったか否かを判定する。具体的には、Loopの値が配列UseInRange[]のサイズより大きいか否かを判定する。大きければ処理はループを終了しステップ365に進み、大きくなければ処理はループの先頭のステップ310に戻る。
【0133】
ステップ365では、関数の入れ替えが行われたか否かを判定する。具体的には、ChangeStatusの値が0でないか否かを判定する。入れ替えが行われていれば処理はステップ375に進み、行われていなければ処理はステップ370に進む。
【0134】
ステップ375では、呼び出し並び替え部25を起動、すなわち自らを再帰呼び出しする。これによって、新たにステップ110から処理が行われ、この再帰呼び出しされた処理が終了すると、本処理も終了する。
【0135】
ステップ370では、ディスプレイ11に「関数の並び替えが不可能な箇所があります」とのメッセージを表示させた後処理は終了する。これは、フィードバックのために相互に変数を参照・公開し合う関数の組があった場合等、関数の実行順序を自動では特定できない場合に、このメッセージを表示し、後に作業者側の手動での設定を促すための処理である。
【0136】
以上のような、ステップ310〜360のループの繰り返し処理は、公開参照情報に基づいて、範囲内のある関数にて、この範囲内の他の関数にて算出される変数のいずれをも参照していない場合、その「ある関数」の実行順序を範囲内の関数中で最先とし、最先とされた関数を範囲から除外し、また、範囲内のある関数にて算出される変数のいずれもが、範囲内の他の単位プログラムにて参照されない場合、その「ある関数」の実行順序を範囲内の単位プログラム中で最後尾とし、この最後尾とされた関数を、範囲から除外する。
【0137】
上記ループの繰り返しによる範囲および実行順序の変遷の一例を図14〜図16に示す。図14および図15の表示形式は、図7と同じである。例えば、呼び出し並び替え部25が最初に処理を開始したとき、FuncName[]、SupplyName[]、UseName[]が図14に示す状態となっていた場合、StaPointerは1なので配列の一番目の関数Func_Aを示し、EndPointerはFuncNameのサイズなので配列の最後の関数Func_Fを示している。すなわち、範囲は関数Func_Aから関数Func_Fまでである。
【0138】
この図によれば、関数Func_Eは変数Zを参照しているが、この変数Zは範囲内の他の関数にて算出・公開されていない。したがって、ステップ315、320の処理によって、この関数の実行順序はこの範囲の中で最先のものとなる。さらに、ステップ330によって、StaPointerが1増加することにより、範囲が1つ狭まり、先頭になった関数Func_Eが範囲から除外される。
【0139】
また、関数Func_Bにて変数Bを算出・公開しているが、この変数Bを参照している他の関数はこの範囲内に存在しない。したがって、ステップ335、340の他の処理によって、この関数の実行順序はこの範囲の中で最後尾のものとなる。さらに、ステップ350によって、EndPointerが1減少することにより、範囲が1つ狭まり、最後尾になった関数Func_Bが範囲から除外される。
【0140】
この結果、関数の呼び出し順序は図15の様になる。
【0141】
また、このループ処理が再帰的に繰り替えされることにより、最終的にフィードバックのために相互に変数を参照・公開し合う2以上の関数の組が残って、これ以上自動的な並び替えが行えなくなるまで、すなわち図11のステップ110で並び替え対象範囲が1以下となるか、図13のステップ365で関数の入れ替えが行われなかったと判定されるまで、以上のような処理が順次続く。
【0142】
例えば図15のような状態で再度上記ループ処理が実行されると、もはや範囲内の関数にて算出・公開されなくなった変数Eのみを参照している関数Func_Aは、範囲内の先頭の実行順位とされ、また、もはや範囲内の関数にて参照されなくなった変数Fのみを算出・公開している関数Func_Fは、範囲内の先頭の実行順位とされ、さらにStaPointerが1増加しEndPointerが1減少することで、範囲が狭まる。この結果、図15の様に関数Func_E、Func_A、Func_F、およびFunc_Bの実行順位が確定する。
【0143】
そして、図15では、関数Func_Cは関数Func_Dにて算出・公開される変数Dを参照し、また関数Func_Dは関数Func_Cにて算出・公開される変数Eを参照している。すなわちフィードバックのために相互に変数を参照・公開し合う2つの関数の組が残る。
【0144】
以上のようなパーソナルコンピュータ1の並び替えプログラム20の動作により、呼び出し設定部21が複数の単位プログラムの実行順序の入力を受け取り、公開/参照情報検索部24が、公開参照情報を検索してテーブルとして記録し、また呼び出し並び替え部25が、公開/参照情報検索部24がテーブルとして記録した公開参照情報に基づいて、他の関数にて参照されている変数を算出している関数が、上記他の関数より先に実行されるように、複数の関数の実行順序を設定するので、処理順序の不整合の発生が抑えられる。したがって、複数の関数を順次実行することで所望の機能を実現するソフトウェアの開発において、処理順序に不整合が発生することを抑えるように、これら複数の単位プログラムの実行順序の設定を行うことができる。
【0145】
また、公開/参照情報検索部24は、複数の関数に記載の処理内容を検索することで公開参照情報を検索するので、関数が特別な識別コードを持たずとも、実行順序の設定を行うることができる。
【0146】
なお、図10のステップ720においては、Ref_から始まる変数名を有する変数を抽出するようになっているが、これは、ソースコードの開発者が、あらかじめ外部参照用の変数の名称としてRef_で始まる名称を用いるように取り決めがなされているという前提の上でのみ実効性がある。他の例としては、特にこのような取り決めを行わず、ソースコード中の全ての変数を抽出し、それら抽出したものについて参照用ヘッダのdefine文を検索してもよい。ただし本実施形態のような取り決めを行っている場合の方が、他の例の場合に比べて検索に係る時間が短くて済む。
【図面の簡単な説明】
【図1】本発明の実施形態に係るパーソナルコンピュータ1の構成を示す図である。
【図2】並び替えプログラム20の機能ブロック図である。
【図3】(a)は、ソースコード35、公開用ヘッダ36、参照用ヘッダ37の一例を示す図であり、(b)は、ソースコード38、公開用ヘッダ39、参照用ヘッダ40の一例を示す図である。
【図4】関数呼び出し定義ファイル32の一例を示す図である。
【図5】呼び出し設定部21の動作のフローチャートである。
【図6】関数呼び出し定義ファイル読み込み部22の動作のフローチャートである。
【図7】FuncName[]、SupplyName[]、UseName[]の対応関係を示す図表である。
【図8】公開/参照情報検索部24の動作のフローチャートである。
【図9】公開情報抜き出しの処理を示すフローチャートである。
【図10】参照情報抜き出しの処理を示すフローチャートである。
【図11】呼び出し並び替え部25の動作のフローチャートの一部を示す図である。
【図12】呼び出し並び替え部25の動作のフローチャートの一部を示す図である。
【図13】呼び出し並び替え部25の動作のフローチャートの一部を示す図である。
【図14】図13のループ処理の繰り返しによる範囲および実行順序の変遷の一例を示す図である。
【図15】図13のループ処理の繰り返しによる範囲および実行順序の変遷の一例を示す図である。
【図16】図13のループ処理の繰り返しによる範囲および実行順序の変遷の一例を示す図である。
【符号の説明】
1…パーソナルコンピュータ、11…ディスプレイ、12…入力装置、
13…RAM、14…ROM、15…HDD、16…CPU、
20…並び替えプログラム、21…呼び出し設定部、
22…関数呼び出し定義ファイル読み込み部、23…順序検査部、
24…公開/参照情報検索部、25…呼び出し並び替え部、
26…関数呼び出し定義ファイル生成部、27…ログファイル生成部、
30…作業者、31…ソフトウェア群、32…関数呼び出し定義ファイル、
33…ログファイル、35、38…ソースコード、
36、39…公開用ヘッダ、37、40…参照用ヘッダ。
【発明の属する技術分野】
本発明は、複数の単位プログラムを順次実行することで所望の機能を実現するソフトウェアの開発において、これら単位プログラムの実行順序を設定するプログラム結合支援装置、およびプログラム結合支援プログラムに関するものである。
【0002】
【従来の技術】
従来、例えば自動車のエンジンを制御するエンジンECU用のプログラムの様に、複数の関数を順番に実行することにより、所望の機能を実現するプログラムがある。このようなプログラムにおいては、これらプログラム中の単位プログラムとしての関数の実行順序がプログラムの機能の質に大きな影響を及ぼす場合がある。
【0003】
例えば、エンジンECUにおいて、吸気管圧変化量を算出し公開する関数と、加減速時燃料噴射量補正量を算出し公開する関数を含む複数の関数が、所定の順序で180’CA毎にサイクリックに実行され、この加減速時燃料噴射量補正量の関数が、この吸気管圧変化量の関数の結果を参照するようになっている場合を考える。この場合、もし加減速時燃料噴射量補正量の関数が吸気管圧変化量の関数よりも先に実行されるようになっていれば、算出される加減速時燃料噴射量補正量は、前のサイクルにおいて算出された吸気管圧変化量に基づいたものになってしまい、燃料補正の遅れによる加速の応答遅れを招いてしまう。
【0004】
したがって、この場合、加減速時燃料噴射量補正量の関数が吸気管圧変化量の関数より後に実行されることが望ましい。
【0005】
従来は、このような関数の実行順序の設定は、作業者が関数間の公開と参照の情報を調査し、不整合の起こらないように手動で行うことが一般的であった。
【0006】
しかし、このような従来の手法では、作業者がすべての関数の公開参照情報を調査し処理順序を決定するいわゆる「ホワイトボックス」検査を行うことになり、小規模なソフト構成にしか適用できない。関数の数が増加すると処理順序の設定作業が複雑かつ膨大になるためである。複数人で作業を行うことで作業を効率化することが考えられるが、作業者の設定基準の解釈の違いなどから、必ずしも作業の精度は高くならない。
【0007】
現状のソフトウェアはそのサイズが増加の一途を辿っており、分業化によりそれぞれ別の作業者が各関数を作成すること等を考慮すると、実行順序設定のために作業者が関数の内容を逐一チェックすることのない「ブラックボックス」検査による処理手順の決定が必要となっているといえる。
【0008】
単位プログラム間の公開参照情報をプログラムが自動的にチェックする「ブラックボックス」検査の技術として、例えば特許文献1がある。
【0009】
【特許文献1】
特許第2806976号明細書
【0010】
【発明が解決しようとする課題】
この技術は、既存の登録されたソフトウェアを検査の対象としており、その検査のためにはソフトウェア側が特殊な識別コードを有することを必要とする。日進月歩で変化するソフトウェアを登録制とするのは現実には難しいと言え、また現状ソフトウェア数も膨大となっており特殊な識別コードを設定することは不可能といえる。
【0011】
上記問題点に鑑み、本発明は、複数の単位プログラムを順次実行することで所望の機能を実現するソフトウェアの開発において、単位プログラム間の公開参照に関する情報を自動で読み取り、処理順序に不整合が発生することを抑えるように、これら複数の単位プログラムの実行順序の設定を行う装置またはプログラムを提供することを目的とする。
【0012】
また、これら単位プログラムが特別な識別コードを持たずとも、上記した実行順序の設定を行う装置またはプログラムを提供することを第2の目的とする。
【0013】
【課題を解決するための手段】
上記目的を達成するための請求項1に記載の発明は、複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索してテーブルとして記録する検索手段(24)と、前記検索手段がテーブルとして記録した公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定する順序設定手段(25)と、を備えたプログラム結合支援装置である。
【0014】
これにより、検索手段(24)が、公開参照情報を検索してテーブルとして記録するので、単位プログラム間の公開参照に関する情報を自動で読み取ることができ、また順序設定手段(25)が、前記検索手段がテーブルとして記録した公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定するので、処理順序の不整合の発生が抑えられる。したがって、複数の単位プログラムを順次実行することで所望の機能を実現するソフトウェアの開発において、単位プログラム間の公開参照に関する情報を自動で読み取り、処理順序に不整合が発生することを抑えるように、これら複数の単位プログラムの実行順序の設定を行う装置を提供することができる。
【0015】
また、請求項2に記載の発明は、請求項1に記載のプログラム結合支援装置において、複数の単位プログラムの実行順序の入力を受け取る受取手段(21)を備え、前記検索手段は、前記受取手段が受け取った実行順序に係る複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索することを特徴とする。
【0016】
これにより、受取手段(21)が複数の単位プログラムの実行順序の入力を受け取り、検索手段(24)が、公開参照情報を検索してテーブルとして記録するので、単位プログラム間の公開参照に関する情報を自動で読み取ることができ、また順序設定手段(25)が、前記検索手段がテーブルとして記録した公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定するので、処理順序の不整合の発生が抑えられる。したがって、複数の単位プログラムを順次実行することで所望の機能を実現するソフトウェアの開発において、単位プログラム間の公開参照に関する情報を自動で読み取り、処理順序に不整合が発生することを抑えるように、これら複数の単位プログラムの実行順序の設定を行う装置を提供することができる。
【0017】
また、請求項3に記載の発明は、複数の単位プログラムの実行順序の入力を受け取る受取手段(21)と、前記受取手段が受け取った実行順序に係る複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索する検索手段(24)と、前記公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定する順序設定手段(25)と、を備えたプログラム結合支援装置である。
【0018】
これにより、受取手段(21)が複数の単位プログラムの実行順序の入力を受け取り、検索手段(24)が、公開参照情報を検索するので、単位プログラム間の公開参照に関する情報を自動で読み取ることができ、また順序設定手段(25)が、検索された公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定するので、処理順序の不整合の発生が抑えられる。したがって、複数の単位プログラムを順次実行することで所望の機能を実現するソフトウェアの開発において、単位プログラム間の公開参照に関する情報を自動で読み取り、処理順序に不整合が発生することを抑えるように、これら複数の単位プログラムの実行順序の設定を行う装置を提供することができる。
【0019】
また、請求項4に記載の発明は、請求項2または3に記載のプログラム結合支援装置において、前記受取手段は、作業者が設定した複数の単位プログラムの実行順序の入力を受け取ることを特徴とする。
【0020】
また、請求項5に記載の発明は、請求項1ないし4のいずれか1つに記載のプログラム結合支援装置において、前記順序設定手段は、前記公開参照情報に基づいて、前記複数の単位プログラムの一部または全部をその要素とする並び替え対象集合に含まれるある単位プログラムにて、前記並び替え対象集合に含まれる他の単位プログラムにて算出される変数のいずれもが参照されていない場合、前記ある単位プログラムの実行順序を前記並び替え対象集合に含まれる単位プログラム中で最先とする第1入れ替え手段(315、320)と、前記第1入れ替え手段によって最先とされた単位プログラムを、前記並び替え対象集合の要素から除外する第1除外手段(330)と、を備えたことを特徴とする。
【0021】
また、請求項6に記載の発明は、請求項5に記載のプログラム結合支援装置において、前記順序設定手段は、前記第1入れ替え手段および前記第1除外手段とを再帰的に作動させることで、前記複数の単位プログラムの実行順序を設定することを特徴とする。
【0022】
また、請求項7に記載の発明は、請求項1ないし6のいずれか1つに記載のプログラム結合支援装置において、前記順序設定手段は、前記公開参照情報に基づいて、前記複数の単位プログラムの一部または全部をその要素とする並び替え対象集合に含まれるある単位プログラムにて算出される変数のいずれもが、前記並び替え対象集合に含まれる他の単位プログラムにて参照されない場合、前記ある単位プログラムの実行順序を前記並び替え対象集合に含まれる単位プログラム中で最後尾とする第2入れ替え手段(335、340)と、前記第2入れ替え手段によって最後尾とされた単位プログラムを、前記並び替え対象集合の要素から除外する第2除外手段(350)と、を備えたことを特徴とする。
【0023】
また、請求項8に記載の発明は、請求項7に記載のプログラム結合支援装置において、前記順序設定手段は、前記第2入れ替え手段および前記第2除外手段とを再帰的に作動させることで、前記複数の単位プログラムの実行順序を設定することを特徴とする。
【0024】
また、請求項9に記載の発明は、請求項1ないし8のいずれか1つに記載のプログラム結合支援装置において、前記検索手段は、前記複数の単位プログラムに記載の処理内容を検索することで、前記公開参照情報を検索する。
【0025】
これによって、検索手段は、複数の単位プログラムに記載の処理内容を検索することで公開参照情報を検索するので、単位プログラムが特別な識別コードを持たずとも、実行順序の設定を行う装置またはプログラムを提供することができる。
【0026】
また、請求項10に記載の発明は、請求項9に記載のプログラム結合支援装置において、前記検索手段は、前記複数の単位プログラムのそれぞれの処理内容を検索することで他の単位プログラムに対して公開している変数の名称を抽出し、またその単位プログラムが参照している他の単位プログラムにて算出される変数の名称を抽出し、さらにそれら抽出された変数の名称と対応する単位プログラムの名称との関連を公開参照情報とする抽出手段(830、840)を備えたことを特徴とする。
【0027】
なお、「公開している」とは、「参照することを許可している」こと、および「参照することを禁じていない」等、結果として他のプログラム単位から参照できるようになっていることをいう。また、「公開している」とは、任意の他のプログラム単位から参照できるようになっている場合、特定の他のプログラム単位のみから参照できるようになっている場合の両方を含む概念である。
【0028】
また、請求項11に記載の発明は、請求項1に記載の発明をプログラムとして実現するものであり、請求項12に記載の発明は、請求項3に記載の発明をプログラムとして実現するものである。
【0029】
なお、上記各手段の括弧内の符号は、後述する実施形態に記載の具体的手段との対応関係を示すものである。
【0030】
【発明の実施の形態】
図1に、本発明の一実施形態に係るパーソナルコンピュータ1の構成を示す。パーソナルコンピュータ1は、ディスプレイ11、入力装置12、RAM13、ROM14、HDD(ハードディスクドライブ)15、CPU16等から構成される。
【0031】
ディスプレイ11は、CPU16から入力された映像信号を、ユーザに対して映像として表示する。
【0032】
入力装置12は、キーボード、マウス等から構成され、ユーザが操作することにより、その操作に応じた信号をCPU16に出力する。
【0033】
CPU16は、パーソナルコンピュータ1に電源が投入されることによって起動すると、ROM14から所定のブートプログラムを読み出して実行し、このブートプログラムに規定されるオペレーティングシステム(以下OSと記す)その他のプログラムをHDD15から読み出して実行することにより、起動処理を行う。起動処理以後電源が遮断されるまで、CPU16は、入力装置12からの信号、OSによって予め定められたスケジュール等に基づいて、HDD15に記録されている各種プログラムを当該OS上のプロセスとして実行する。
【0034】
また、上記した起動処理およびプロセスにおいて、CPU16は必要に応じて入力装置12から信号の入力を受け付け、またディスプレイ11に映像信号を出力し、またRAM13、HDD15に対してデータの読み出し/書き込みの制御を行う。
【0035】
図2に、HDD15に保存され、OS上のプロセスとして実行されるプログラムの1つである並び替えプログラム20の機能ブロック図を示す。
【0036】
並び替えプログラム20は、呼び出し設定部21、関数呼び出し定義ファイル読み込み部22、順序検査部23、公開/参照情報検索部24、呼び出し並び替え部25、関数呼び出し定義ファイル生成部26を有している。また、並び替えプログラム20は、ソフトウェア群31を参照し、関数呼び出し定義ファイル32を生成、参照し、ログファイル33を生成するようになっている。
【0037】
ソフトウェア群31は、このプログラムの並び替えの対象となる関数を含む、C、C++等の言語で記述されたソースコード等を構成要素とするソフトウェアの集まりであり、HDD15に保存されている。図3(a)に、ソフトウェア群31の一部としてHDD15にファイルとして格納されているソースコード35、公開用ヘッダ36、参照用ヘッダ37の一例を示す。
【0038】
ソースコード35はプログラミング言語Cによって記述されており、2つの関数func_Aおよびtemp1_GetAを有している。さらに、ソースコード35は、公開用ヘッダ36および参照用ヘッダ37をインクルードしている。公開用ヘッダ36のファイル名temp1.hedは、ソースコード35のファイル名temp1.cの拡張子をhedに置き換えたものであり、参照用ヘッダ37のファイル名temp1_Ref.hedは、ソースコード35のファイル名のピリオドより前の部分temp1に_Ref.hedを付加したものである。
【0039】
関数func_Aは、その中で変数Ref_Eを参照している(太字部分)が、この変数Ref_Eは参照用ヘッダ37においてソースコード35が有さない関数temp2_GetEとして定義されている(太字部分)。従って、ソースコード35の変数Ref_Eが記載された部分および参照用ヘッダ37の変数Ref_Eの定義部分は、関数func_Aの参照情報である。
【0040】
関数temp1_GetAは、関数func_A内において算出されるようになっている文字変数A(矩形で囲まれた部分)を戻り値として返す(矩形で囲まれた部分)ようになっている。そして、公開用ヘッダ36では、関数temp1_GetAが文字変数として宣言されている。これによって、他の関数が公開用ヘッダ36をインクルードして関数temp1_GetAを呼び出すことで、変数Aの値が外部から参照できるようになっている。したがって、ソースコード35および公開用ヘッダ36の矩形で囲まれた部分は、関数func_Aの公開情報である。
【0041】
ソフトウェア群31は、上記した命名規則によって1つのソースコード、およびそのソースコードのファイル名と1対1に関連付けられたファイル名を有する公開用ヘッダと参照用ヘッダから成る組を複数有する。そしてこの公開用ヘッダは、1対1に関連付けられたソースコードの公開情報を有し、またこの参照用ヘッダは、1対1に関連付けられたソースコードの参照情報を有する。
【0042】
図3(b)に、ソフトウェア群31に含まれる他の関連付けられたソースコード38、公開用ヘッダ39、および参照用ヘッダ40を示す。ソースコード38内において、変数Ref_Aが参照されているが、これは参照用ヘッダ40において関数temp1_GetAとして定義され、この関数temp1_GetAは上述の通りソースコード35にて算出される変数Aを返す。また、ソースコード38によって算出される変数Eは関数temp2_GetEによって公開されるようになっており、上述の通りソースコード35のRef_Eの部分によって参照されている。
【0043】
このように、図3(a)(b)に示した例では、ソースコード35中の関数func_Aは変数Aを公開し、ソースコード38で算出・公開されている変数Eを参照している。また、ソースコード38中の関数func_Eは変数Eを公開し、ソースコード35で算出・公開されている変数Aを参照している。
【0044】
このように、ソフトウェア群31内の関数は他のソフトウェア群31内の関数に対して参照または公開を行うようになっている。そして、公開参照情報は、このような関数間の変数の公開、参照の情報を有するものである。
【0045】
関数呼び出し定義ファイル32は、関数を呼び出す順序を規定するファイルであり、HDD15に複数種類保存されている。図4に、関数呼び出し定義ファイル32の一例を示す。関数呼び出し定義ファイル32は、Cソースコードの形式で記載されており、この関数呼び出し定義ファイル32に記載された関数func_A、func_B、func_C、func_D、func_E、func_F等の規定の実行順序とは、図中上から下への順序に相当する。
【0046】
実際にこの関数呼び出し定義ファイル32の規定に従って関数を実行する際には、関数呼び出し定義ファイル32、およびソフトウェア群31中の、この関数呼び出し定義ファイル32中に記載されている関数の実体が記載されているファイルをまとめてコンパイルしてオブジェクトコードを生成し、そのオブジェクトコードを実行する。
【0047】
ログファイル33は、並び替えプログラム20の動作結果が記録されるようになっており、HDD15に保存される。
【0048】
この並び替えプログラム20の各部の動作の概要は、以下の通りである。なお以降は、プログラムを実行することによるCPU16の動作を、その実行されるプログラム自体の動作であるとして説明する。
【0049】
まず、作業者30が入力装置12を操作して、ある関数呼び出し定義ファイル32の指定を並び替えプログラム20に入力すると、呼び出し設定部21がHDD15から当該関数呼び出し定義ファイル32を読み出して、ディスプレイ11にその内容を表示させる。作業者30はこの表示された既存関数の呼び出し順序の定義に対して、関数の追加、並び替え、削除等の変更を行う(図2の(1)に対応)。なお、呼び出し順序とは、実行の順序のことである。呼び出し設定部21は、変更された呼び出し順序の入力を受け取り、それを順序検査部23に出力する(図2の(2)に対応)。
【0050】
呼び出し順序が入力された順序検査部23は、まずこの順序中の関数の公開/参照情報を入手するために、公開/参照情報検索部24に当該呼び出し順序を出力する(図2の(3)に対応)。
【0051】
公開/参照情報検索部24では、入力された呼び出し順序中の関数の公開情報および参照情報をソフトウェア群31から抜き出し、これらを順序検査部23に出力する(図2の(4)に対応)。
【0052】
順序検査部23は、入力された関数の公開参照情報からこれら情報の一覧表を作成し、これを呼び出し並び替え部25に出力する(図2の(5)に対応)。
【0053】
呼び出し並び替え部25は、入力された一覧表を基に、これら関数の呼び出しの順序を自動的に並べ替える。
【0054】
並べ替えられた結果の順序は順序検査部23に出力され(図2の(6)に対応)、この結果を受け取った順序検査部23は、これを関数呼び出し定義ファイル生成部26に出力し(図2の(7)に対応)、関数呼び出し定義ファイル生成部26では入力された関数呼び出し順序を関数呼び出し定義ファイル32に出力する。
【0055】
また、順序検査部23によって、並べ替えの経過、結果、処理異常等の、並び替えプログラム20の動作の情報はログファイル生成部27に出力され(図2の(8)に対応)、ログファイル生成部27は入力された情報をログファイル33に書き込む。
【0056】
以上のような並び替えプログラム20の全体としての機能を実現するための、呼び出し設定部21、関数呼び出し定義ファイル読み込み部22、順序検査部23、公開/参照情報検索部24、呼び出し並び替え部25、関数呼び出し定義ファイル生成部26、およびログファイル生成部27の具体的な構成を以下説明する。
【0057】
関数呼び出し定義ファイル読み込み部22は、呼び出し設定部21からファイル名、およびオープンの命令を受けると当該ファイルをオープンし、また呼び出し設定部21からファイル名、および読み出しの命令を受けると、当該ファイルの内容を読み出して呼び出し設定部21に出力する。なお、ファイルのオープンとは、当該ファイルの読み出し、書き込みを可能にする処理をいう。
【0058】
関数呼び出し定義ファイル生成部26は、順序検査部23からファイル名、およびオープンの命令を受けると当該ファイルをオープンし、また順序検査部23からファイル名、および書き込みの命令、および書き込み内容の情報を受けると、当該書き込み内容の情報を関数呼び出し定義ファイル32としてHDD15に書き込む。
【0059】
ログファイル生成部27は、順序検査部23から情報およびログファイル作成の命令を受けると、ログファイル33をオープンし、当該情報をこのログファイル33に書き込む。
【0060】
図5に、呼び出し設定部21の動作のフローチャートを示す。このプログラムは、並び替えプログラム20が有する、あるいはOSによって提供されるユーザインターフェース用のプログラムによって、作業者30の入力装置12の操作によって指定した関数呼び出し定義ファイル32の特定が為されたときに動作を開始する。
【0061】
まずステップ510では、この指定された関数呼び出し定義ファイル32をオープンする。すなわち、当該関数呼び出し定義ファイル32を読み出し可能な状態にする。具体的には、関数呼び出し定義ファイル読み込み部22に指定された当該ファイル名およびファイルをオープンする命令を出力する。
【0062】
次にステップ520では、関数呼び出し定義ファイル読み込み部22にこのファイル名および読み出し命令を出力することで、この特定された関数呼び出し定義ファイル32の内容を読み出し、その内容の文字データをディスプレイ11に出力する。
【0063】
これによって、ディスプレイ11は関数呼び出し定義ファイル32の内容を表示する。
【0064】
次にステップ530では、当該表示した関数呼び出し定義ファイル32の、作業者30の入力装置12の操作による内容の変更を検出し、その検出をディスプレイ11の画面表示に反映させるよう、文字データをディスプレイ11に出力する。関数呼び出し定義ファイル32の内容の変更とは、関数呼び出し定義ファイル32に記載された関数の実行順序の並び替え、関数呼び出し定義ファイル32に記載された関数の一部または前部の削除、関数呼び出し定義ファイル32への新たな関数の追加等をいう。これによって、呼び出し設定部21は、関数の実行順序の入力を受け取ることができる。
【0065】
更にステップ530では、作業者30の関数呼び出し定義ファイル32に対する変更(設定)が終了したか否かを判定する。具体的には、作業者30が入力装置12に対して設定終了の旨の所定の操作を行ったことを検知したか否かを判定する。そして、変更が終了するまで、ステップ530の処理をくり返し、変更が終了すると、処理はステップ540に進む。
【0066】
ステップ540では、上記変更結果に基づく関数の順序を配列FuncName[]に保存する。具体的には、RAM13中に配列FuncName[]のための領域を確保し、これら関数の名称が、それらの関数の順序の先頭から最後尾までの順に、配列FuncName[]の各配列要素に格納される。例えば配列FuncName[]の添字が1から始まる場合は、順序がn番目の関数はFuncName[n]に格納される。なお、既に配列FuncName[]がRAM13中に存在するときは、上記変更結果に基づく関数の順序を当該配列FuncName[]に上書きする。
【0067】
この配列FuncName[]は、後述するように順序検査部23がその動作において利用するので、FuncName[]への関数名の書き込みは、実効的には順序検査部23への実行順序の出力である。以上で呼び出し設定部21の動作は終了する。
【0068】
図6に、関数呼び出し定義ファイル読み込み部22の動作のフローチャートを示す。このプログラムは、呼び出し設定部21によって配列FuncName[]が生成され、または上書きされたときに動作を開始する。
【0069】
ステップ610では、公開/参照情報検索部24を起動する。なお、配列FuncName[]は、後述するように公開/参照情報検索部24がその動作において利用するので、公開/参照情報検索部24の起動は、実効的には順序検査部23から公開/参照情報検索部24へのFuncName[]の出力である。
【0070】
これによって、公開/参照情報検索部24が動作し、後述するような動作内容により、配列SupplyName[]、UseName[]が生成される。このSupplyName[]、UseName[]は、FuncName[]と対応するように生成される。具体的には、FuncName[n](nは整数)に格納されている関数名を有する関数(以下FuncName[n]に係る関数という)が公開している変数名がSupplyName[n]に格納され、当該関数が参照している変数名がUseName[n]に格納される。図7に、FuncName[]、S upplyName[]、UseName[]の対応関係を表として示す。この表中、数字1〜6でラベルされる各行は、それぞれ1〜6番目の配列FuncName[]、SupplyName[]、UseName[]の要素である。各配列FuncName[]、SupplyName[]、UseName[]は、図7に示すようなテーブルとして、各関数間の公開参照情報を構成する。
【0071】
なお、1つの関数が参照する値および公開する値は、それぞれ1つであるとは限らないので、実際にはSupplyName[]、UseName[]は1つの要素が複数の変数名を示すようになっている。具体的には、例えばSupplyName[]、UseName[]はコンマ、セミコロン等の所定のデリミタで区切られた複数の変数名を文字列として有するようになっていてもよい。また例えば、SupplyName[]、UseName[]は、それぞれの要素が特定の配列変数のアドレスを指定するポインタとなっており、その指定されたそれぞれの配列変数が複数の変数名を格納するようになっていてもよい。
【0072】
次にステップ620では、後にログファイルを作成するための一時保存のために、現在のFuncName[]、SupplyName[]、UseName[]をそれぞれ別の配列変数FuncNameBuf[]、SupplyNameBuf[]、UseNameBuf[]にコピーする。
【0073】
次にステップ630では、後に使用する並び替え用の変数StaPointerおよびEndPointerを初期化する。具体的には、RAM13中にStaPointerおよびEndPointerの領域が無ければ確保し、StaPointerには1を代入し、EndPointerには配列FuncName[]のサイズ、すなわち配列FuncName[]に格納された関数名の数を格納する。
【0074】
次にステップ640では、呼び出し並び替え部25を起動させる。さらにこのとき、SupplyName[]、UseName[]を初期化し、FuncName[]、SupplyName[]、UseName[]、StaPointerおよびEndPointerを引数として呼び出し並び替え部25に渡す。これは、実効的には順序検査部23から呼び出し並び替え部25への図7に示したようなテーブルとしての公開参照情報等の出力である。
【0075】
呼び出し並び替え部25は、後述する動作によって、公開参照情報に基づいて配列FuncName[]、SupplyName[]、UseName[]の要素の並べ替えを行うことで、関数の実行順序の並べ替えを行う。
【0076】
次にステップ650では、関数呼び出しの並び替え前の設定と並び替え後との違いを確認し、ログファイルを生成する。具体的には、FuncNameBuf[]、SupplyNameBuf[]、UseNameBuf[]を、それぞれFuncName[]、SupplyName[]、UseName[]と比較し、どのように並べ替えが行われたかを検出し、これらFuncNameBuf[]、SupplyNameBuf[]、UseNameBuf[]、FuncName[]、SupplyName[]、UseName[]、およびどのように並べ替えが行われたかの情報を、ログファイル作成の命令と共にログファイル生成部27に出力する。これにより、ログファイル33に今回の並べ替えの情報が記録される。
【0077】
次にステップ660では、関数呼び出し定義ファイル生成部26に関数呼び出し定義ファイル32をオープンする命令を出力し、さらに、関数呼び出し定義ファイル生成部26に書き込み命令と、FuncName[]に格納されているものと同じ順序の、関数呼び出し定義ファイル32の形式に従った関数呼び出し定義ファイル32を出力する。これにより、関数呼び出し定義ファイル生成部26によって新たな関数呼び出し定義ファイル32が生成される。これによって、並び替えられたFuncName[]の順序が新たな関数の実行順序となる。以上で順序検査部23の動作は終了する。
【0078】
図8に、公開/参照情報検索部24の動作のフローチャートを示す。このプログラムは、図6のステップ610の処理によって、その動作を開始する。
【0079】
まず、ステップ810では、変数Numberに1を代入する。
【0080】
ステップ820では、FuncName[Number]、すなわち、配列FuncName[]のNumber番目の要素を検索対象とする。具体的には、現在の検索対象を示すための変数にNumberの値を代入する。
【0081】
ステップ830では、図9に示す当該検索対象の関数についての公開情報抜き出しの処理を行う。後述するように、この公開情報抜き出しの処理によって、FuncName[Number]に係る関数の公開する変数名がSupplyName[Number]に格納される。
【0082】
ステップ840では、図10に示す当該検索対象の関数についての参照情報抜き出しの処理を行う。後述するように、この参照情報抜き出しの処理によって、FuncName[Number]に係る関数が参照する変数名がUseName[Number]に格納される。
【0083】
ステップ850では、変数Numberの値を1だけ増加させる。
【0084】
ステップ860では、変数Numberが配列FuncName[]のサイズより大きいか否かを判定する。大きければ処理は終了し、大きくなければ処理はステップ820に戻る。
【0085】
この公開/参照情報検索部24の動作によって、FuncName[]にその名称が格納されている全ての関数について、公開情報がSupplyName[]に、参照情報がUseName[]に格納される。
【0086】
以下、ステップ830で起動される図9の公開情報抜き出し処理について説明する。
【0087】
まずステップ910で、検索対象の関数、すなわちFuncName[Number]に係る関数を含むソースコードのファイルをオープンする。これは、公開用ヘッダファイルの内容を検索し、該当する関数名の宣言文がある公開用ヘッダファイルに先述した命名規則により1対1に対応するソースコードのファイルをオープンすることで実現される。
【0088】
次にステップ920で、当該関数内で演算している変数を検索する。関数内で演算している変数とは、その関数内の代入文中で、代入される変数となっている変数(例えば代入記号“=”の左側にある変数)をいう。具体的には,関数の処理内容(すなわち関数に記載されている各文)を逐一検索し、当該変数を抽出する。
【0089】
次にステップ930で、検索の結果において、演算している変数が1つ以上あるか否かを判定する。1つ以上あれば、それらの演算している変数の個々についてステップ950から970までのループ処理を行うため、処理はステップ950に進み、1つもなければ、処理はこのループ処理を省略してステップ980に進む。
【0090】
ステップ950では、当該演算している変数の1つが、外部に公開されるようになっている変数であるか否かを判定する。当該演算している変数が外部に公開されるようになっている場合としては、例えば、当該関数を有するファイル内というスコープにおいてこの変数がグローバルであり、かつこのファイル中にこの変数を返すような別の関数が定義されている場合、換言すれば当該変数のスコープ中にこの変数を返すような関数が定義されている場合がある(図3参照)。また例えば、当該関数がC++等のオブジェクト指向言語によるクラスとして実現されていれば、当該変数が外部公開用にパブリック宣言されたメソッドを呼び出すことによって参照できるようになっている場合がある。当該変数が、外部に公開されるようになっていれば処理はステップ960に進み、外部に公開されるようになっていなければ処理はステップ970に進む。
【0091】
ステップ960では、外部に公開されるようになっている当該変数を配列SupplyName[Number]に、または、配列SupplyName[ Number]の示すアドレスに割り当てられた配列にその値を追記する形で格納する。
【0092】
ステップ970では、ステップ920で検索した全ての当該関数内で演算(算出と同義)している変数について、ステップ950の処理を行ったか否かを判定する、全てについて行っていれば、処理はループを終了してステップ980に進み、全てについて行っていなければ、まだ当該処理を行っていない変数の1つを処理対象とし、処理はステップ950に戻る。
【0093】
ステップ980では、ステップ910でオープンした検索対象関数を含むファイルをクローズし、その後公開情報抜き出し処理は終了する。なおクローズとは、当該ファイルの読み出し、書き込みができる状態を終了することをいう。
【0094】
以上のような公開情報抜き出し処理によって、検索対象の関数内で演算されており、かつ外部の関数から参照できるよう公開を行っている変数の全てが、当該検索対象関数の名称を格納している配列FuncName[]の要素に対応する配列SupplyName[]の要素に格納される。
【0095】
以下、ステップ840で起動される図10の参照情報抜き出し処理について説明する。まずステップ710で、図9のステップ910と同様、検索対象の関数、すなわちFuncName[Number]に係る関数を含むソースコードのファイルをオープンする。
【0096】
次にステップ720で、検索対象関数内で参照している外部の関数を検索する。外部とは、当該関数内でないという意味である。具体的には、関数の処理内容(すなわち関数に記載されている各文)を逐一検索し、Ref_から始まる変数名を有する変数を抽出する。そして、抽出した全ての当該変数のうち、当該関数を含むソースファイルに1対1に対応する参照用ヘッダのdefine文において、当該変数が当該ソースファイル中に無い関数として定義されている変数を抽出し、この抽出したものを検索対象関数内で参照している外部の関数とする。
【0097】
次にステップ730で、検索の結果において、当該参照している外部関数が1つ以上あるか否かを判定する。1つ以上あれば、それら参照している外部関数の個々についてステップ740から760までのループ処理を行うため、処理はステップ740に進み、1つもなければ、処理はこのループ処理を省略してステップ770に進む。
【0098】
ステップ740では、当該参照している外部関数の1つが定義されているCソースコードのファイルを検索する。これは、各公開用ヘッダのファイルの記載内容を検索し、該当する外部関数名の宣言文がある公開用ヘッダファイルに1対1に対応するCソースコードのファイルを特定することで実現される。
【0099】
ステップ750では、当該特定したCソースコードのファイルの処理内容を逐一検索することで、この外部関数によって返される変数名(例えば図3(a)における変数A)を抜き出し、その名称を配列UseName[Number]または、配列UseName[Number]の示すアドレスに割り当てられた配列にその値を格納する。
【0100】
ステップ760では、ステップ720で検索した全ての外部参照について、ステップ730の処理を行ったか否かを判定する。全てについて行っていれば、処理はループを終了してステップ770に進み、全てについて行っていなければ、まだ当該処理を行っていない外部参照の1つを処理対象とし、処理はステップ740に戻る。
【0101】
ステップ770では、ステップ710でオープンした検索対象関数を含むファイルをクローズし、その後参照情報抜き出し処理は終了する。
【0102】
以上のような参照情報抜き出し処理によって、検索対象の関数内で参照しており、かつ他の関数中で当該検索対象の関数に対して公開されている変数の全てが、当該検索対象関数の名称を格納している配列FuncName[]の要素に対応する位置の配列UseName[]の要素に格納される。
【0103】
以上のような動作によって、公開/参照情報検索部24は、呼び出し設定部21が受け取った実行順序に記載されている複数の関数中の関数にて算出・公開される変数が、他の関数にて参照されているか否かについての公開参照情報を検索してテーブルとして記録する。
【0104】
図11、12、13に、呼び出し並び替え部25の動作のフローチャートを示す。このプログラムは、図6のステップ640の処理によって、その動作を開始する。
【0105】
次に、図11のステップ110では、変数EndPointerから変数StaPointerを減算した値が0以下であるか否かを判定する。これは、後述する並び替え対象範囲の数が1以下となったか否かを判定するための処理である。なお、StaPointerは並び替え対象範囲の先頭位置を示す値を有しており、EndPointerは当該範囲の最後尾を示す値を有している。EndPointer − StaPointerが0以下であれは処理は終了し、0以下でなければ処理はステップ120に進む。なお、図6のステップ640において起動した時点では、EndPointerは配列FuncName[]のサイズであり、StaPointerは1であるから、FuncName[]に1つ以下しか関数名が格納されていない場合を除いて、EndPointer − StaPointerは0より大きくなる。
【0106】
ステップ120では、関数状態を格納するために用いる配列UseInRange[]の初期化を行う。具体的には、RAM13中に配列UseInRange[]のための領域を割り当て、配列UseInRange []の全ての要素をゼロとする。なお、配列UseInRange[]は、各要素が4ビットの配列変数である。以下、この各要素の最下位ビットから最上位ビットまでを順に第1ビット、第2ビット、第3ビット,第4ビットと記す。
【0107】
ステップ120の後には、処理は図12のステップ205に進み、第1ループについての初期設定を行う。具体的には、変数Loopの値をStaPointerの値に初期化する。なお、第1ループとは、ステップ210からステップ265までの処理の繰り返しのことである。
【0108】
次にステップ210では、第2ループについての初期設定を行う。具体的には、変数Loop2の値をStaPointerの値に初期化する。なお、第2ループとは、ステップ225からステップ245までの処理の繰り返しのことである。
【0109】
次にステップ215では、第1ループの関数に公開変数があるか否かを判定する。第1ループの関数とは、FuncName[Loop]に係る関数である。この関数に公開変数があるか否かについては、具体的には、配列SupplyName[]の当該関数についての要素SupplyName[Loop]に1つ以上変数名が格納されているか否かを判定する。公開変数があれば処理はステップ220に進み、なければステップ250に進む。
【0110】
ステップ220では、第1ループの関数に公開変数があるという情報を配列UseInRange[]に格納する。具体的には、UseInRange[Loop − StaPointer]の第4ビットを1とする。
【0111】
ステップ225では、第1ループの関数の公開変数が第2ループの関数の参照変数として使用されているか否かを判定する。第2ループの関数とは、FuncName[Loop2]に係る関数である。この判定は、具体的には、SupplyName[Loop]に格納され、かつUseName[Loop2]に格納されている変数名があるか否かの判定である。第1ループの関数の公開変数が第2ループの関数の参照変数として使用されていれば処理はステップ230に進み、使用されていなければ処理はステップ240に進む。
【0112】
ステップ230では、第1ループの関数の公開変数は範囲内で参照されている旨の情報を配列UseInRange[]に格納する。具体的には、UseInRange[Loop − StaPointer]の第3ビットを1とする。なお、「範囲内」とは、現時点での並び替え範囲内、すなわち、FuncName[StaPointer]からFuncName[EndPointer]までの範囲によって示される関数の範囲内をいう。なお、並び替え対象範囲内の関数は、並び替え対象集合の要素である。
【0113】
次にステップ235では、第2ループの関数の参照は範囲内で公開されている旨の情報を配列UseInRange[]に格納する。具体的には、UseInRange[Loop2 − StaPointer]の第1および第2ビットを1とする。
【0114】
ステップ240では、Loop2の値を1増加させる。
【0115】
次にステップ245では、Loop2の値がEndPointerの値よりも大きいか否かを判定する。大きければ処理はステップ250に進み、大きくなければ処理は第2ループの先頭のステップ225に戻る。
【0116】
次にステップ250では、第1ループの関数に参照変数があるか否かを判定する。具体的には、配列UseName[]の当該関数についての要素SupplyName[Loop]に1つ以上変数名が格納されているか否かを判定する。参照変数があれば処理はステップ255に進み、なければステップ260に進む。
【0117】
ステップ255では、第1ループの関数に参照情報があるという情報を配列UseInRange[]に格納する。具体的には、UseInRange[Loop − StaPointer]の第2ビットを1とする。そして処理はステップ260に進む。
【0118】
ステップ260では、Loopの値を1増加させる。
【0119】
次にステップ265では、Loopの値がEndPointerの値よりも大きいか否かを判定する。大きければ処理は図13のステップ305に進み、大きくなければ処理は第1ループの先頭のステップ210に戻る。
【0120】
以上のようなステップ205〜265の処理によって、変数LoopがStaPointerからEndPointerまで1づつ増加する第1ループの繰り返しを行うことによって、UseInRange[]の各要素は以下の(a)〜(d)の条件を満たすようになる。
(a)FuncName[j](jはStaPointerからEndPointerまでの整数、以下同様)に係る関数にて外部に公開されている変数があれば、UseInRange[j− StaPointer]の第4ビットが1となり、さもなければ当該ビットが0になる。
(b)FuncName[j]に係る関数にて外部に公開している変数が、範囲内の他の関数にて参照されていれば、UseInRange[j− StaPointer]の第3ビットが1となり、さもなければ当該ビットが0になる。
(c)FuncName[j]に係る関数にて外部の変数を参照していれば、UseInRange[j− StaPointer]の第2ビットが1となり、さもなければ当該ビットが0になる。
(d)FuncName[j]に係る関数にて参照している外部の変数が、範囲内の他の関数にて公開されているものであれば、UseInRange[j− StaPointer]の第1ビットが1となり、さもなければ当該ビットが0になる。
【0121】
図13のステップ305では、入れ替えステータス情報変数ChangeStatus、基準ポインタ変数BasePointer、およびループ変数Loopの初期化を行う。具体的には、これら変数のための領域をRAM13に確保し、ChangeStatusの値を0に、BasePointerの値をStaPointerに、Loopの値を0に設定する。
【0122】
次にステップ310では、ステップ310からステップ360までのループの強制終了条件を判定する。具体的には、BasePointerにLoopを加算した値がEndPointerより大きいか否かを判定し、大きい場合は処理を終了し、大きくない場合はループを続行するため処理をステップ315に進める。
【0123】
ステップ315では、当該ループの関数が参照している変数が範囲外で公開されているか否かを、配列UseInRange[]を用いて判定する。当該ループの関数とは、配列UseInRange[]のループ位置UseInRange[Loop]における要素が対象とする関数、すなわちFuncName[BasePointer + Loop]に係る関数である。この判定は、具体的には、UseInRange[Loop]の第1ビットが0であるか否かによって行う。範囲外であれば処理はステップ320に進み、範囲内であれば処理はステップ335に進む。
【0124】
ステップ320では、当該ループの関数を範囲の先頭の関数と入れ替える。これは、範囲内に参照する変数が無いので、当該ループの関数が範囲内の関数の中で先頭の実行順位となってもよいからである。具体的には、FuncName[StaPointer]の値と、FuncName[BasePointer + Loop]の値とを入れ替え、SupplyNam e[StaPointer]の値と、SupplyName[BasePointer + Loop]の値とを入れ替え、UseName[StaPointer]の値と、UseName[BasePointer + Loop]の値とを入れ替える。
【0125】
次にステップ325では、入れ替えステータス情報変数ChangeStatusの値を範囲の先頭に入れ替え済みの旨にする。具体的には、ChangeStatusの第1ビットを1とする。
【0126】
次にステップ330では、範囲の開始位置を、1つ分範囲が狭まる方向へずらず。具体的には、StaPointerの値を1増加させる。そして処理はステップ355へ進む。
【0127】
ステップ315で範囲外でないと判定された後のステップ335では、当該ループの関数が公開している変数が範囲外である(すなわち範囲内で参照されていない)か否かを、配列UseInRange[]を用いて判定する。この判定は、具体的には、UseInRange[loop]の第3ビットが0であるか否かによって行う。範囲外であれば処理はステップ340に進み、範囲内であれば処理はステップ355に進む。
【0128】
ステップ340では、当該ループの関数を範囲の最後尾の関数と入れ替える。これは、範囲内に当該公開変数を参照する関数が無いので、当該ループの関数が範囲内の関数の中で最後の実行順位となってもよいからである。具体的には、FuncName[EndPointer]の値と、FuncName[BasePointer + Loop]の値とを入れ替え、SupplyName[EndPointer]の値と、SupplyName[BasePointer + Loop]の値とを入れ替え、UseName[EndPointer]の値と、UseName[BasePointer + Loop]の値とを入れ替える。
【0129】
次にステップ345では、入れ替えステータス情報変数ChangeStatusの値を範囲の最後尾に入れ替え済みの旨にする。具体的には、ChangeStatusの第2ビットを1とする。
【0130】
次にステップ350では、範囲の最後尾位置を、1つ分範囲が狭まる方向へずらず。具体的には、StaPointerの値を1減少させる。そして処理はステップ355へ進む。
【0131】
ステップ355では、Loopの値を1増加させる。
【0132】
次にステップ360では、配列UseInRange[]の全てについてステップ315からステップ355までの検査処理を行ったか否かを判定する。具体的には、Loopの値が配列UseInRange[]のサイズより大きいか否かを判定する。大きければ処理はループを終了しステップ365に進み、大きくなければ処理はループの先頭のステップ310に戻る。
【0133】
ステップ365では、関数の入れ替えが行われたか否かを判定する。具体的には、ChangeStatusの値が0でないか否かを判定する。入れ替えが行われていれば処理はステップ375に進み、行われていなければ処理はステップ370に進む。
【0134】
ステップ375では、呼び出し並び替え部25を起動、すなわち自らを再帰呼び出しする。これによって、新たにステップ110から処理が行われ、この再帰呼び出しされた処理が終了すると、本処理も終了する。
【0135】
ステップ370では、ディスプレイ11に「関数の並び替えが不可能な箇所があります」とのメッセージを表示させた後処理は終了する。これは、フィードバックのために相互に変数を参照・公開し合う関数の組があった場合等、関数の実行順序を自動では特定できない場合に、このメッセージを表示し、後に作業者側の手動での設定を促すための処理である。
【0136】
以上のような、ステップ310〜360のループの繰り返し処理は、公開参照情報に基づいて、範囲内のある関数にて、この範囲内の他の関数にて算出される変数のいずれをも参照していない場合、その「ある関数」の実行順序を範囲内の関数中で最先とし、最先とされた関数を範囲から除外し、また、範囲内のある関数にて算出される変数のいずれもが、範囲内の他の単位プログラムにて参照されない場合、その「ある関数」の実行順序を範囲内の単位プログラム中で最後尾とし、この最後尾とされた関数を、範囲から除外する。
【0137】
上記ループの繰り返しによる範囲および実行順序の変遷の一例を図14〜図16に示す。図14および図15の表示形式は、図7と同じである。例えば、呼び出し並び替え部25が最初に処理を開始したとき、FuncName[]、SupplyName[]、UseName[]が図14に示す状態となっていた場合、StaPointerは1なので配列の一番目の関数Func_Aを示し、EndPointerはFuncNameのサイズなので配列の最後の関数Func_Fを示している。すなわち、範囲は関数Func_Aから関数Func_Fまでである。
【0138】
この図によれば、関数Func_Eは変数Zを参照しているが、この変数Zは範囲内の他の関数にて算出・公開されていない。したがって、ステップ315、320の処理によって、この関数の実行順序はこの範囲の中で最先のものとなる。さらに、ステップ330によって、StaPointerが1増加することにより、範囲が1つ狭まり、先頭になった関数Func_Eが範囲から除外される。
【0139】
また、関数Func_Bにて変数Bを算出・公開しているが、この変数Bを参照している他の関数はこの範囲内に存在しない。したがって、ステップ335、340の他の処理によって、この関数の実行順序はこの範囲の中で最後尾のものとなる。さらに、ステップ350によって、EndPointerが1減少することにより、範囲が1つ狭まり、最後尾になった関数Func_Bが範囲から除外される。
【0140】
この結果、関数の呼び出し順序は図15の様になる。
【0141】
また、このループ処理が再帰的に繰り替えされることにより、最終的にフィードバックのために相互に変数を参照・公開し合う2以上の関数の組が残って、これ以上自動的な並び替えが行えなくなるまで、すなわち図11のステップ110で並び替え対象範囲が1以下となるか、図13のステップ365で関数の入れ替えが行われなかったと判定されるまで、以上のような処理が順次続く。
【0142】
例えば図15のような状態で再度上記ループ処理が実行されると、もはや範囲内の関数にて算出・公開されなくなった変数Eのみを参照している関数Func_Aは、範囲内の先頭の実行順位とされ、また、もはや範囲内の関数にて参照されなくなった変数Fのみを算出・公開している関数Func_Fは、範囲内の先頭の実行順位とされ、さらにStaPointerが1増加しEndPointerが1減少することで、範囲が狭まる。この結果、図15の様に関数Func_E、Func_A、Func_F、およびFunc_Bの実行順位が確定する。
【0143】
そして、図15では、関数Func_Cは関数Func_Dにて算出・公開される変数Dを参照し、また関数Func_Dは関数Func_Cにて算出・公開される変数Eを参照している。すなわちフィードバックのために相互に変数を参照・公開し合う2つの関数の組が残る。
【0144】
以上のようなパーソナルコンピュータ1の並び替えプログラム20の動作により、呼び出し設定部21が複数の単位プログラムの実行順序の入力を受け取り、公開/参照情報検索部24が、公開参照情報を検索してテーブルとして記録し、また呼び出し並び替え部25が、公開/参照情報検索部24がテーブルとして記録した公開参照情報に基づいて、他の関数にて参照されている変数を算出している関数が、上記他の関数より先に実行されるように、複数の関数の実行順序を設定するので、処理順序の不整合の発生が抑えられる。したがって、複数の関数を順次実行することで所望の機能を実現するソフトウェアの開発において、処理順序に不整合が発生することを抑えるように、これら複数の単位プログラムの実行順序の設定を行うことができる。
【0145】
また、公開/参照情報検索部24は、複数の関数に記載の処理内容を検索することで公開参照情報を検索するので、関数が特別な識別コードを持たずとも、実行順序の設定を行うることができる。
【0146】
なお、図10のステップ720においては、Ref_から始まる変数名を有する変数を抽出するようになっているが、これは、ソースコードの開発者が、あらかじめ外部参照用の変数の名称としてRef_で始まる名称を用いるように取り決めがなされているという前提の上でのみ実効性がある。他の例としては、特にこのような取り決めを行わず、ソースコード中の全ての変数を抽出し、それら抽出したものについて参照用ヘッダのdefine文を検索してもよい。ただし本実施形態のような取り決めを行っている場合の方が、他の例の場合に比べて検索に係る時間が短くて済む。
【図面の簡単な説明】
【図1】本発明の実施形態に係るパーソナルコンピュータ1の構成を示す図である。
【図2】並び替えプログラム20の機能ブロック図である。
【図3】(a)は、ソースコード35、公開用ヘッダ36、参照用ヘッダ37の一例を示す図であり、(b)は、ソースコード38、公開用ヘッダ39、参照用ヘッダ40の一例を示す図である。
【図4】関数呼び出し定義ファイル32の一例を示す図である。
【図5】呼び出し設定部21の動作のフローチャートである。
【図6】関数呼び出し定義ファイル読み込み部22の動作のフローチャートである。
【図7】FuncName[]、SupplyName[]、UseName[]の対応関係を示す図表である。
【図8】公開/参照情報検索部24の動作のフローチャートである。
【図9】公開情報抜き出しの処理を示すフローチャートである。
【図10】参照情報抜き出しの処理を示すフローチャートである。
【図11】呼び出し並び替え部25の動作のフローチャートの一部を示す図である。
【図12】呼び出し並び替え部25の動作のフローチャートの一部を示す図である。
【図13】呼び出し並び替え部25の動作のフローチャートの一部を示す図である。
【図14】図13のループ処理の繰り返しによる範囲および実行順序の変遷の一例を示す図である。
【図15】図13のループ処理の繰り返しによる範囲および実行順序の変遷の一例を示す図である。
【図16】図13のループ処理の繰り返しによる範囲および実行順序の変遷の一例を示す図である。
【符号の説明】
1…パーソナルコンピュータ、11…ディスプレイ、12…入力装置、
13…RAM、14…ROM、15…HDD、16…CPU、
20…並び替えプログラム、21…呼び出し設定部、
22…関数呼び出し定義ファイル読み込み部、23…順序検査部、
24…公開/参照情報検索部、25…呼び出し並び替え部、
26…関数呼び出し定義ファイル生成部、27…ログファイル生成部、
30…作業者、31…ソフトウェア群、32…関数呼び出し定義ファイル、
33…ログファイル、35、38…ソースコード、
36、39…公開用ヘッダ、37、40…参照用ヘッダ。
Claims (12)
- 複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索してテーブルとして記録する検索手段(24)と、
前記検索手段がテーブルとして記録した公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定する順序設定手段(25)と、を備えたプログラム結合支援装置。 - 複数の単位プログラムの実行順序の入力を受け取る受取手段(21)を備え、
前記検索手段は、前記受取手段が受け取った実行順序に係る複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索することを特徴とする請求項1に記載のプログラム結合支援装置。 - 複数の単位プログラムの実行順序の入力を受け取る受取手段(21)と、
前記受取手段が受け取った実行順序に係る複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索する検索手段(24)と、
前記公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定する順序設定手段(25)と、を備えたプログラム結合支援装置。 - 前記受取手段は、作業者が設定した複数の単位プログラムの実行順序の入力を受け取ることを特徴とする請求項2または3に記載のプログラム結合支援装置。
- 前記順序設定手段は、前記公開参照情報に基づいて、前記複数の単位プログラムの一部または全部をその要素とする並び替え対象集合に含まれるある単位プログラムにて、前記並び替え対象集合に含まれる他の単位プログラムにて算出される変数のいずれもが参照されていない場合、前記ある単位プログラムの実行順序を前記並び替え対象集合に含まれる単位プログラム中で最先とする第1入れ替え手段(315、320)と、
前記第1入れ替え手段によって最先とされた単位プログラムを、前記並び替え対象集合の要素から除外する第1除外手段(330)と、を備えたことを特徴とする請求項1ないし4のいずれか1つに記載のプログラム結合支援装置。 - 前記順序設定手段は、前記第1入れ替え手段および前記第1除外手段とを再帰的に作動させることで、前記複数の単位プログラムの実行順序を設定することを特徴とする請求項5に記載のプログラム結合支援装置。
- 前記順序設定手段は、前記公開参照情報に基づいて、前記複数の単位プログラムの一部または全部をその要素とする並び替え対象集合に含まれるある単位プログラムにて算出される変数のいずれもが、前記並び替え対象集合に含まれる他の単位プログラムにて参照されない場合、前記ある単位プログラムの実行順序を前記並び替え対象集合に含まれる単位プログラム中で最後尾とする第2入れ替え手段(335、340)と、
前記第2入れ替え手段によって最後尾とされた単位プログラムを、前記並び替え対象集合の要素から除外する第2除外手段(350)と、を備えたことを特徴とする請求項1ないし6のいずれか1つに記載のプログラム結合支援装置。 - 前記順序設定手段は、前記第2入れ替え手段および前記第2除外手段とを再帰的に作動させることで、前記複数の単位プログラムの実行順序を設定することを特徴とする請求項7に記載のプログラム結合支援装置。
- 前記検索手段は、前記複数の単位プログラムに記載の処理内容を検索することで、前記公開参照情報を検索する請求項1ないし8のいずれか1つに記載のプログラム結合支援装置。
- 前記検索手段は、前記複数の単位プログラムのそれぞれの処理内容を検索することで他の単位プログラムに対して公開している変数の名称を抽出し、またその単位プログラムが参照している他の単位プログラムにて算出される変数の名称を抽出し、さらにそれら抽出された変数の名称と対応する単位プログラムの名称との関連を公開参照情報とする抽出手段(830、840)を備えたことを特徴とする請求項9に記載のプログラム結合支援装置。
- 複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索してテーブルとして記録する検索手段(24)、および
前記検索手段がテーブルとして記録した公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定する順序設定手段(25)、として、コンピュータを機能させるプログラム結合支援プログラム。 - 複数の単位プログラムの実行順序の入力を受け取る受取手段(21)、
前記受取手段が受け取った実行順序に係る複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索する検索手段(24)、および
前記公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定する順序設定手段(25)と、としてコンピュータを機能させるプログラム結合支援プログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003147957A JP2004348667A (ja) | 2003-05-26 | 2003-05-26 | プログラム結合支援装置およびプログラム結合支援プログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003147957A JP2004348667A (ja) | 2003-05-26 | 2003-05-26 | プログラム結合支援装置およびプログラム結合支援プログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2004348667A true JP2004348667A (ja) | 2004-12-09 |
Family
ID=33534337
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2003147957A Withdrawn JP2004348667A (ja) | 2003-05-26 | 2003-05-26 | プログラム結合支援装置およびプログラム結合支援プログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2004348667A (ja) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2008033682A (ja) * | 2006-07-28 | 2008-02-14 | Canon Inc | 文書作成支援装置及び文書作成支援方法 |
JP6025955B1 (ja) * | 2015-11-30 | 2016-11-16 | 三菱電機株式会社 | プログラム解析装置及びプログラム解析方法 |
-
2003
- 2003-05-26 JP JP2003147957A patent/JP2004348667A/ja not_active Withdrawn
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2008033682A (ja) * | 2006-07-28 | 2008-02-14 | Canon Inc | 文書作成支援装置及び文書作成支援方法 |
JP6025955B1 (ja) * | 2015-11-30 | 2016-11-16 | 三菱電機株式会社 | プログラム解析装置及びプログラム解析方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7571427B2 (en) | Methods for comparing versions of a program | |
US7231633B2 (en) | Debugging with set verbosity level during read and analysis of executable code and associated comments while logging according to set verbosity level | |
US9152389B2 (en) | Trace generating unit, system, and program of the same | |
US20120266131A1 (en) | Automatic program generation device, method, and computer program | |
JP5900193B2 (ja) | 更新判定プログラムおよび更新判定装置 | |
US20110029953A1 (en) | System and Method for Scalable Handling of Debug Information | |
US7624381B1 (en) | Portable detection of start and completion of object construction | |
US20090328006A1 (en) | Instruction-trace generation program, instruction-trace generating device, and instruction-trace generating method | |
US20110246966A1 (en) | Embedding source files into program symbol files | |
US20210165643A1 (en) | User Interface Resource File Optimization | |
US20040154003A1 (en) | Code generation apparatus, code generation program, simulation apparatus, simulation program, model generation apparatus, and model generation program | |
JP2004348667A (ja) | プログラム結合支援装置およびプログラム結合支援プログラム | |
WO2020230241A1 (ja) | テスト装置、テスト方法及びプログラム | |
US8010572B1 (en) | Kstore scenario simulator processor and XML file | |
US20170344351A1 (en) | Information processing apparatus, compiling management method, and recording medium | |
US7343592B2 (en) | Benchmark synthesis using workload statistics | |
JP4782315B2 (ja) | 影響解析装置および方法、記録媒体、プログラム | |
KR100846203B1 (ko) | 모바일 어플리케이션의 생성 방법 및 이를 구현하기 위한프로그램을 기록한 기록매체 | |
JPH06110733A (ja) | プログラムのテストケース生成装置 | |
WO2012066635A1 (ja) | テスト方法、テスト装置及びテスト実行用プログラム | |
CN117785671B (zh) | 一种基于inline-hook patch的x86黑盒收集覆盖率方法和系统 | |
JP7244756B2 (ja) | 分析プログラム、プログラム分析方法およびプログラム分析装置 | |
JP7614976B2 (ja) | キャッシュ模擬装置、命令セットシミュレータ、キャッシュ模擬方法およびキャッシュ模擬プログラム | |
JP2002082811A (ja) | コンパイル方法および記録媒体 | |
JP3531728B2 (ja) | オブジェクト指向型プログラミング言語で記述されたプログラムの構成関係管理装置及び方法並びに記憶媒体 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A300 | Withdrawal of application because of no request for examination |
Free format text: JAPANESE INTERMEDIATE CODE: A300 Effective date: 20060801 |