(57)【要約】【課題】複数の関数を順次実行することで所望の機能を実現するソフトウェアの開発において、これら関数が特別な識別コードを持たずとも、関数間の公開参照に関する情報を自動で読み取り、処理順序に不整合が発生しないように、これら複数の関数の実行順序の設定を行う装置。【解決手段】プログラム結合支援装置が、複数の関数の実行順序の入力を受け取り（２１）、当該関数にて算出される変数が、この複数の関数中の他の関数にて参照されているか否かについての公開参照情報を検索し（２４）、この情報に基づいて、当該他の関数にて参照されている変数を算出している関数が、他の関数より先に実行されるように、複数の単位プログラムの実行順序を設定する（２５）。【選択図】        図２
2004348667.tif 000002
【特許請求の範囲】
【請求項１】
複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索してテーブルとして記録する検索手段（２４）と、
前記検索手段がテーブルとして記録した公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定する順序設定手段（２５）と、を備えたプログラム結合支援装置。
【請求項２】
複数の単位プログラムの実行順序の入力を受け取る受取手段（２１）を備え、
前記検索手段は、前記受取手段が受け取った実行順序に係る複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索することを特徴とする請求項１に記載のプログラム結合支援装置。
【請求項３】
複数の単位プログラムの実行順序の入力を受け取る受取手段（２１）と、
前記受取手段が受け取った実行順序に係る複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索する検索手段（２４）と、
前記公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定する順序設定手段（２５）と、を備えたプログラム結合支援装置。
【請求項４】
前記受取手段は、作業者が設定した複数の単位プログラムの実行順序の入力を受け取ることを特徴とする請求項２または３に記載のプログラム結合支援装置。
【請求項５】
前記順序設定手段は、前記公開参照情報に基づいて、前記複数の単位プログラムの一部または全部をその要素とする並び替え対象集合に含まれるある単位プログラムにて、前記並び替え対象集合に含まれる他の単位プログラムにて算出される変数のいずれもが参照されていない場合、前記ある単位プログラムの実行順序を前記並び替え対象集合に含まれる単位プログラム中で最先とする第１入れ替え手段（３１５、３２０）と、
前記第１入れ替え手段によって最先とされた単位プログラムを、前記並び替え対象集合の要素から除外する第１除外手段（３３０）と、を備えたことを特徴とする請求項１ないし４のいずれか１つに記載のプログラム結合支援装置。
【請求項６】
前記順序設定手段は、前記第１入れ替え手段および前記第１除外手段とを再帰的に作動させることで、前記複数の単位プログラムの実行順序を設定することを特徴とする請求項５に記載のプログラム結合支援装置。
【請求項７】
前記順序設定手段は、前記公開参照情報に基づいて、前記複数の単位プログラムの一部または全部をその要素とする並び替え対象集合に含まれるある単位プログラムにて算出される変数のいずれもが、前記並び替え対象集合に含まれる他の単位プログラムにて参照されない場合、前記ある単位プログラムの実行順序を前記並び替え対象集合に含まれる単位プログラム中で最後尾とする第２入れ替え手段（３３５、３４０）と、
前記第２入れ替え手段によって最後尾とされた単位プログラムを、前記並び替え対象集合の要素から除外する第２除外手段（３５０）と、を備えたことを特徴とする請求項１ないし６のいずれか１つに記載のプログラム結合支援装置。
【請求項８】
前記順序設定手段は、前記第２入れ替え手段および前記第２除外手段とを再帰的に作動させることで、前記複数の単位プログラムの実行順序を設定することを特徴とする請求項７に記載のプログラム結合支援装置。
【請求項９】
前記検索手段は、前記複数の単位プログラムに記載の処理内容を検索することで、前記公開参照情報を検索する請求項１ないし８のいずれか１つに記載のプログラム結合支援装置。
【請求項１０】
前記検索手段は、前記複数の単位プログラムのそれぞれの処理内容を検索することで他の単位プログラムに対して公開している変数の名称を抽出し、またその単位プログラムが参照している他の単位プログラムにて算出される変数の名称を抽出し、さらにそれら抽出された変数の名称と対応する単位プログラムの名称との関連を公開参照情報とする抽出手段（８３０、８４０）を備えたことを特徴とする請求項９に記載のプログラム結合支援装置。
【請求項１１】
複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索してテーブルとして記録する検索手段（２４）、および
前記検索手段がテーブルとして記録した公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定する順序設定手段（２５）、として、コンピュータを機能させるプログラム結合支援プログラム。
【請求項１２】
複数の単位プログラムの実行順序の入力を受け取る受取手段（２１）、
前記受取手段が受け取った実行順序に係る複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索する検索手段（２４）、および
前記公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定する順序設定手段（２５）と、としてコンピュータを機能させるプログラム結合支援プログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、複数の単位プログラムを順次実行することで所望の機能を実現するソフトウェアの開発において、これら単位プログラムの実行順序を設定するプログラム結合支援装置、およびプログラム結合支援プログラムに関するものである。
【０００２】
【従来の技術】
従来、例えば自動車のエンジンを制御するエンジンＥＣＵ用のプログラムの様に、複数の関数を順番に実行することにより、所望の機能を実現するプログラムがある。このようなプログラムにおいては、これらプログラム中の単位プログラムとしての関数の実行順序がプログラムの機能の質に大きな影響を及ぼす場合がある。
【０００３】
例えば、エンジンＥＣＵにおいて、吸気管圧変化量を算出し公開する関数と、加減速時燃料噴射量補正量を算出し公開する関数を含む複数の関数が、所定の順序で１８０’ＣＡ毎にサイクリックに実行され、この加減速時燃料噴射量補正量の関数が、この吸気管圧変化量の関数の結果を参照するようになっている場合を考える。この場合、もし加減速時燃料噴射量補正量の関数が吸気管圧変化量の関数よりも先に実行されるようになっていれば、算出される加減速時燃料噴射量補正量は、前のサイクルにおいて算出された吸気管圧変化量に基づいたものになってしまい、燃料補正の遅れによる加速の応答遅れを招いてしまう。
【０００４】
したがって、この場合、加減速時燃料噴射量補正量の関数が吸気管圧変化量の関数より後に実行されることが望ましい。
【０００５】
従来は、このような関数の実行順序の設定は、作業者が関数間の公開と参照の情報を調査し、不整合の起こらないように手動で行うことが一般的であった。
【０００６】
しかし、このような従来の手法では、作業者がすべての関数の公開参照情報を調査し処理順序を決定するいわゆる「ホワイトボックス」検査を行うことになり、小規模なソフト構成にしか適用できない。関数の数が増加すると処理順序の設定作業が複雑かつ膨大になるためである。複数人で作業を行うことで作業を効率化することが考えられるが、作業者の設定基準の解釈の違いなどから、必ずしも作業の精度は高くならない。
【０００７】
現状のソフトウェアはそのサイズが増加の一途を辿っており、分業化によりそれぞれ別の作業者が各関数を作成すること等を考慮すると、実行順序設定のために作業者が関数の内容を逐一チェックすることのない「ブラックボックス」検査による処理手順の決定が必要となっているといえる。
【０００８】
単位プログラム間の公開参照情報をプログラムが自動的にチェックする「ブラックボックス」検査の技術として、例えば特許文献１がある。
【０００９】
【特許文献１】
特許第２８０６９７６号明細書
【００１０】
【発明が解決しようとする課題】
この技術は、既存の登録されたソフトウェアを検査の対象としており、その検査のためにはソフトウェア側が特殊な識別コードを有することを必要とする。日進月歩で変化するソフトウェアを登録制とするのは現実には難しいと言え、また現状ソフトウェア数も膨大となっており特殊な識別コードを設定することは不可能といえる。
【００１１】
上記問題点に鑑み、本発明は、複数の単位プログラムを順次実行することで所望の機能を実現するソフトウェアの開発において、単位プログラム間の公開参照に関する情報を自動で読み取り、処理順序に不整合が発生することを抑えるように、これら複数の単位プログラムの実行順序の設定を行う装置またはプログラムを提供することを目的とする。
【００１２】
また、これら単位プログラムが特別な識別コードを持たずとも、上記した実行順序の設定を行う装置またはプログラムを提供することを第２の目的とする。
【００１３】
【課題を解決するための手段】
上記目的を達成するための請求項１に記載の発明は、複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索してテーブルとして記録する検索手段（２４）と、前記検索手段がテーブルとして記録した公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定する順序設定手段（２５）と、を備えたプログラム結合支援装置である。
【００１４】
これにより、検索手段（２４）が、公開参照情報を検索してテーブルとして記録するので、単位プログラム間の公開参照に関する情報を自動で読み取ることができ、また順序設定手段（２５）が、前記検索手段がテーブルとして記録した公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定するので、処理順序の不整合の発生が抑えられる。したがって、複数の単位プログラムを順次実行することで所望の機能を実現するソフトウェアの開発において、単位プログラム間の公開参照に関する情報を自動で読み取り、処理順序に不整合が発生することを抑えるように、これら複数の単位プログラムの実行順序の設定を行う装置を提供することができる。
【００１５】
また、請求項２に記載の発明は、請求項１に記載のプログラム結合支援装置において、複数の単位プログラムの実行順序の入力を受け取る受取手段（２１）を備え、前記検索手段は、前記受取手段が受け取った実行順序に係る複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索することを特徴とする。
【００１６】
これにより、受取手段（２１）が複数の単位プログラムの実行順序の入力を受け取り、検索手段（２４）が、公開参照情報を検索してテーブルとして記録するので、単位プログラム間の公開参照に関する情報を自動で読み取ることができ、また順序設定手段（２５）が、前記検索手段がテーブルとして記録した公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定するので、処理順序の不整合の発生が抑えられる。したがって、複数の単位プログラムを順次実行することで所望の機能を実現するソフトウェアの開発において、単位プログラム間の公開参照に関する情報を自動で読み取り、処理順序に不整合が発生することを抑えるように、これら複数の単位プログラムの実行順序の設定を行う装置を提供することができる。
【００１７】
また、請求項３に記載の発明は、複数の単位プログラムの実行順序の入力を受け取る受取手段（２１）と、前記受取手段が受け取った実行順序に係る複数の単位プログラム中の単位プログラムにて算出される変数が、前記複数の単位プログラム中の他の単位プログラムにて参照されているか否かについての公開参照情報を検索する検索手段（２４）と、前記公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定する順序設定手段（２５）と、を備えたプログラム結合支援装置である。
【００１８】
これにより、受取手段（２１）が複数の単位プログラムの実行順序の入力を受け取り、検索手段（２４）が、公開参照情報を検索するので、単位プログラム間の公開参照に関する情報を自動で読み取ることができ、また順序設定手段（２５）が、検索された公開参照情報に基づいて、前記他の単位プログラムにて参照されている変数を算出している単位プログラムが、前記他の単位プログラムより先に実行されるように、前記複数の単位プログラムの実行順序を設定するので、処理順序の不整合の発生が抑えられる。したがって、複数の単位プログラムを順次実行することで所望の機能を実現するソフトウェアの開発において、単位プログラム間の公開参照に関する情報を自動で読み取り、処理順序に不整合が発生することを抑えるように、これら複数の単位プログラムの実行順序の設定を行う装置を提供することができる。
【００１９】
また、請求項４に記載の発明は、請求項２または３に記載のプログラム結合支援装置において、前記受取手段は、作業者が設定した複数の単位プログラムの実行順序の入力を受け取ることを特徴とする。
【００２０】
また、請求項５に記載の発明は、請求項１ないし４のいずれか１つに記載のプログラム結合支援装置において、前記順序設定手段は、前記公開参照情報に基づいて、前記複数の単位プログラムの一部または全部をその要素とする並び替え対象集合に含まれるある単位プログラムにて、前記並び替え対象集合に含まれる他の単位プログラムにて算出される変数のいずれもが参照されていない場合、前記ある単位プログラムの実行順序を前記並び替え対象集合に含まれる単位プログラム中で最先とする第１入れ替え手段（３１５、３２０）と、前記第１入れ替え手段によって最先とされた単位プログラムを、前記並び替え対象集合の要素から除外する第１除外手段（３３０）と、を備えたことを特徴とする。
【００２１】
また、請求項６に記載の発明は、請求項５に記載のプログラム結合支援装置において、前記順序設定手段は、前記第１入れ替え手段および前記第１除外手段とを再帰的に作動させることで、前記複数の単位プログラムの実行順序を設定することを特徴とする。
【００２２】
また、請求項７に記載の発明は、請求項１ないし６のいずれか１つに記載のプログラム結合支援装置において、前記順序設定手段は、前記公開参照情報に基づいて、前記複数の単位プログラムの一部または全部をその要素とする並び替え対象集合に含まれるある単位プログラムにて算出される変数のいずれもが、前記並び替え対象集合に含まれる他の単位プログラムにて参照されない場合、前記ある単位プログラムの実行順序を前記並び替え対象集合に含まれる単位プログラム中で最後尾とする第２入れ替え手段（３３５、３４０）と、前記第２入れ替え手段によって最後尾とされた単位プログラムを、前記並び替え対象集合の要素から除外する第２除外手段（３５０）と、を備えたことを特徴とする。
【００２３】
また、請求項８に記載の発明は、請求項７に記載のプログラム結合支援装置において、前記順序設定手段は、前記第２入れ替え手段および前記第２除外手段とを再帰的に作動させることで、前記複数の単位プログラムの実行順序を設定することを特徴とする。
【００２４】
また、請求項９に記載の発明は、請求項１ないし８のいずれか１つに記載のプログラム結合支援装置において、前記検索手段は、前記複数の単位プログラムに記載の処理内容を検索することで、前記公開参照情報を検索する。
【００２５】
これによって、検索手段は、複数の単位プログラムに記載の処理内容を検索することで公開参照情報を検索するので、単位プログラムが特別な識別コードを持たずとも、実行順序の設定を行う装置またはプログラムを提供することができる。
【００２６】
また、請求項１０に記載の発明は、請求項９に記載のプログラム結合支援装置において、前記検索手段は、前記複数の単位プログラムのそれぞれの処理内容を検索することで他の単位プログラムに対して公開している変数の名称を抽出し、またその単位プログラムが参照している他の単位プログラムにて算出される変数の名称を抽出し、さらにそれら抽出された変数の名称と対応する単位プログラムの名称との関連を公開参照情報とする抽出手段（８３０、８４０）を備えたことを特徴とする。
【００２７】
なお、「公開している」とは、「参照することを許可している」こと、および「参照することを禁じていない」等、結果として他のプログラム単位から参照できるようになっていることをいう。また、「公開している」とは、任意の他のプログラム単位から参照できるようになっている場合、特定の他のプログラム単位のみから参照できるようになっている場合の両方を含む概念である。
【００２８】
また、請求項１１に記載の発明は、請求項１に記載の発明をプログラムとして実現するものであり、請求項１２に記載の発明は、請求項３に記載の発明をプログラムとして実現するものである。
【００２９】
なお、上記各手段の括弧内の符号は、後述する実施形態に記載の具体的手段との対応関係を示すものである。
【００３０】
【発明の実施の形態】
図１に、本発明の一実施形態に係るパーソナルコンピュータ１の構成を示す。パーソナルコンピュータ１は、ディスプレイ１１、入力装置１２、ＲＡＭ１３、ＲＯＭ１４、ＨＤＤ（ハードディスクドライブ）１５、ＣＰＵ１６等から構成される。
【００３１】
ディスプレイ１１は、ＣＰＵ１６から入力された映像信号を、ユーザに対して映像として表示する。
【００３２】
入力装置１２は、キーボード、マウス等から構成され、ユーザが操作することにより、その操作に応じた信号をＣＰＵ１６に出力する。
【００３３】
ＣＰＵ１６は、パーソナルコンピュータ１に電源が投入されることによって起動すると、ＲＯＭ１４から所定のブートプログラムを読み出して実行し、このブートプログラムに規定されるオペレーティングシステム（以下ＯＳと記す）その他のプログラムをＨＤＤ１５から読み出して実行することにより、起動処理を行う。起動処理以後電源が遮断されるまで、ＣＰＵ１６は、入力装置１２からの信号、ＯＳによって予め定められたスケジュール等に基づいて、ＨＤＤ１５に記録されている各種プログラムを当該ＯＳ上のプロセスとして実行する。
【００３４】
また、上記した起動処理およびプロセスにおいて、ＣＰＵ１６は必要に応じて入力装置１２から信号の入力を受け付け、またディスプレイ１１に映像信号を出力し、またＲＡＭ１３、ＨＤＤ１５に対してデータの読み出し／書き込みの制御を行う。
【００３５】
図２に、ＨＤＤ１５に保存され、ＯＳ上のプロセスとして実行されるプログラムの１つである並び替えプログラム２０の機能ブロック図を示す。
【００３６】
並び替えプログラム２０は、呼び出し設定部２１、関数呼び出し定義ファイル読み込み部２２、順序検査部２３、公開／参照情報検索部２４、呼び出し並び替え部２５、関数呼び出し定義ファイル生成部２６を有している。また、並び替えプログラム２０は、ソフトウェア群３１を参照し、関数呼び出し定義ファイル３２を生成、参照し、ログファイル３３を生成するようになっている。
【００３７】
ソフトウェア群３１は、このプログラムの並び替えの対象となる関数を含む、Ｃ、Ｃ＋＋等の言語で記述されたソースコード等を構成要素とするソフトウェアの集まりであり、ＨＤＤ１５に保存されている。図３（ａ）に、ソフトウェア群３１の一部としてＨＤＤ１５にファイルとして格納されているソースコード３５、公開用ヘッダ３６、参照用ヘッダ３７の一例を示す。
【００３８】
ソースコード３５はプログラミング言語Ｃによって記述されており、２つの関数ｆｕｎｃ＿Ａおよびｔｅｍｐ１＿ＧｅｔＡを有している。さらに、ソースコード３５は、公開用ヘッダ３６および参照用ヘッダ３７をインクルードしている。公開用ヘッダ３６のファイル名ｔｅｍｐ１．ｈｅｄは、ソースコード３５のファイル名ｔｅｍｐ１．ｃの拡張子をｈｅｄに置き換えたものであり、参照用ヘッダ３７のファイル名ｔｅｍｐ１＿Ｒｅｆ．ｈｅｄは、ソースコード３５のファイル名のピリオドより前の部分ｔｅｍｐ１に＿Ｒｅｆ．ｈｅｄを付加したものである。
【００３９】
関数ｆｕｎｃ＿Ａは、その中で変数Ｒｅｆ＿Ｅを参照している（太字部分）が、この変数Ｒｅｆ＿Ｅは参照用ヘッダ３７においてソースコード３５が有さない関数ｔｅｍｐ２＿ＧｅｔＥとして定義されている（太字部分）。従って、ソースコード３５の変数Ｒｅｆ＿Ｅが記載された部分および参照用ヘッダ３７の変数Ｒｅｆ＿Ｅの定義部分は、関数ｆｕｎｃ＿Ａの参照情報である。
【００４０】
関数ｔｅｍｐ１＿ＧｅｔＡは、関数ｆｕｎｃ＿Ａ内において算出されるようになっている文字変数Ａ（矩形で囲まれた部分）を戻り値として返す（矩形で囲まれた部分）ようになっている。そして、公開用ヘッダ３６では、関数ｔｅｍｐ１＿ＧｅｔＡが文字変数として宣言されている。これによって、他の関数が公開用ヘッダ３６をインクルードして関数ｔｅｍｐ１＿ＧｅｔＡを呼び出すことで、変数Ａの値が外部から参照できるようになっている。したがって、ソースコード３５および公開用ヘッダ３６の矩形で囲まれた部分は、関数ｆｕｎｃ＿Ａの公開情報である。
【００４１】
ソフトウェア群３１は、上記した命名規則によって１つのソースコード、およびそのソースコードのファイル名と１対１に関連付けられたファイル名を有する公開用ヘッダと参照用ヘッダから成る組を複数有する。そしてこの公開用ヘッダは、１対１に関連付けられたソースコードの公開情報を有し、またこの参照用ヘッダは、１対１に関連付けられたソースコードの参照情報を有する。
【００４２】
図３（ｂ）に、ソフトウェア群３１に含まれる他の関連付けられたソースコード３８、公開用ヘッダ３９、および参照用ヘッダ４０を示す。ソースコード３８内において、変数Ｒｅｆ＿Ａが参照されているが、これは参照用ヘッダ４０において関数ｔｅｍｐ１＿ＧｅｔＡとして定義され、この関数ｔｅｍｐ１＿ＧｅｔＡは上述の通りソースコード３５にて算出される変数Ａを返す。また、ソースコード３８によって算出される変数Ｅは関数ｔｅｍｐ２＿ＧｅｔＥによって公開されるようになっており、上述の通りソースコード３５のＲｅｆ＿Ｅの部分によって参照されている。
【００４３】
このように、図３（ａ）（ｂ）に示した例では、ソースコード３５中の関数ｆｕｎｃ＿Ａは変数Ａを公開し、ソースコード３８で算出・公開されている変数Ｅを参照している。また、ソースコード３８中の関数ｆｕｎｃ＿Ｅは変数Ｅを公開し、ソースコード３５で算出・公開されている変数Ａを参照している。
【００４４】
このように、ソフトウェア群３１内の関数は他のソフトウェア群３１内の関数に対して参照または公開を行うようになっている。そして、公開参照情報は、このような関数間の変数の公開、参照の情報を有するものである。
【００４５】
関数呼び出し定義ファイル３２は、関数を呼び出す順序を規定するファイルであり、ＨＤＤ１５に複数種類保存されている。図４に、関数呼び出し定義ファイル３２の一例を示す。関数呼び出し定義ファイル３２は、Ｃソースコードの形式で記載されており、この関数呼び出し定義ファイル３２に記載された関数ｆｕｎｃ＿Ａ、ｆｕｎｃ＿Ｂ、ｆｕｎｃ＿Ｃ、ｆｕｎｃ＿Ｄ、ｆｕｎｃ＿Ｅ、ｆｕｎｃ＿Ｆ等の規定の実行順序とは、図中上から下への順序に相当する。
【００４６】
実際にこの関数呼び出し定義ファイル３２の規定に従って関数を実行する際には、関数呼び出し定義ファイル３２、およびソフトウェア群３１中の、この関数呼び出し定義ファイル３２中に記載されている関数の実体が記載されているファイルをまとめてコンパイルしてオブジェクトコードを生成し、そのオブジェクトコードを実行する。
【００４７】
ログファイル３３は、並び替えプログラム２０の動作結果が記録されるようになっており、ＨＤＤ１５に保存される。
【００４８】
この並び替えプログラム２０の各部の動作の概要は、以下の通りである。なお以降は、プログラムを実行することによるＣＰＵ１６の動作を、その実行されるプログラム自体の動作であるとして説明する。
【００４９】
まず、作業者３０が入力装置１２を操作して、ある関数呼び出し定義ファイル３２の指定を並び替えプログラム２０に入力すると、呼び出し設定部２１がＨＤＤ１５から当該関数呼び出し定義ファイル３２を読み出して、ディスプレイ１１にその内容を表示させる。作業者３０はこの表示された既存関数の呼び出し順序の定義に対して、関数の追加、並び替え、削除等の変更を行う（図２の（１）に対応）。なお、呼び出し順序とは、実行の順序のことである。呼び出し設定部２１は、変更された呼び出し順序の入力を受け取り、それを順序検査部２３に出力する（図２の（２）に対応）。
【００５０】
呼び出し順序が入力された順序検査部２３は、まずこの順序中の関数の公開／参照情報を入手するために、公開／参照情報検索部２４に当該呼び出し順序を出力する（図２の（３）に対応）。
【００５１】
公開／参照情報検索部２４では、入力された呼び出し順序中の関数の公開情報および参照情報をソフトウェア群３１から抜き出し、これらを順序検査部２３に出力する（図２の（４）に対応）。
【００５２】
順序検査部２３は、入力された関数の公開参照情報からこれら情報の一覧表を作成し、これを呼び出し並び替え部２５に出力する（図２の（５）に対応）。
【００５３】
呼び出し並び替え部２５は、入力された一覧表を基に、これら関数の呼び出しの順序を自動的に並べ替える。
【００５４】
並べ替えられた結果の順序は順序検査部２３に出力され（図２の（６）に対応）、この結果を受け取った順序検査部２３は、これを関数呼び出し定義ファイル生成部２６に出力し（図２の（７）に対応）、関数呼び出し定義ファイル生成部２６では入力された関数呼び出し順序を関数呼び出し定義ファイル３２に出力する。
【００５５】
また、順序検査部２３によって、並べ替えの経過、結果、処理異常等の、並び替えプログラム２０の動作の情報はログファイル生成部２７に出力され（図２の（８）に対応）、ログファイル生成部２７は入力された情報をログファイル３３に書き込む。
【００５６】
以上のような並び替えプログラム２０の全体としての機能を実現するための、呼び出し設定部２１、関数呼び出し定義ファイル読み込み部２２、順序検査部２３、公開／参照情報検索部２４、呼び出し並び替え部２５、関数呼び出し定義ファイル生成部２６、およびログファイル生成部２７の具体的な構成を以下説明する。
【００５７】
関数呼び出し定義ファイル読み込み部２２は、呼び出し設定部２１からファイル名、およびオープンの命令を受けると当該ファイルをオープンし、また呼び出し設定部２１からファイル名、および読み出しの命令を受けると、当該ファイルの内容を読み出して呼び出し設定部２１に出力する。なお、ファイルのオープンとは、当該ファイルの読み出し、書き込みを可能にする処理をいう。
【００５８】
関数呼び出し定義ファイル生成部２６は、順序検査部２３からファイル名、およびオープンの命令を受けると当該ファイルをオープンし、また順序検査部２３からファイル名、および書き込みの命令、および書き込み内容の情報を受けると、当該書き込み内容の情報を関数呼び出し定義ファイル３２としてＨＤＤ１５に書き込む。
【００５９】
ログファイル生成部２７は、順序検査部２３から情報およびログファイル作成の命令を受けると、ログファイル３３をオープンし、当該情報をこのログファイル３３に書き込む。
【００６０】
図５に、呼び出し設定部２１の動作のフローチャートを示す。このプログラムは、並び替えプログラム２０が有する、あるいはＯＳによって提供されるユーザインターフェース用のプログラムによって、作業者３０の入力装置１２の操作によって指定した関数呼び出し定義ファイル３２の特定が為されたときに動作を開始する。
【００６１】
まずステップ５１０では、この指定された関数呼び出し定義ファイル３２をオープンする。すなわち、当該関数呼び出し定義ファイル３２を読み出し可能な状態にする。具体的には、関数呼び出し定義ファイル読み込み部２２に指定された当該ファイル名およびファイルをオープンする命令を出力する。
【００６２】
次にステップ５２０では、関数呼び出し定義ファイル読み込み部２２にこのファイル名および読み出し命令を出力することで、この特定された関数呼び出し定義ファイル３２の内容を読み出し、その内容の文字データをディスプレイ１１に出力する。
【００６３】
これによって、ディスプレイ１１は関数呼び出し定義ファイル３２の内容を表示する。
【００６４】
次にステップ５３０では、当該表示した関数呼び出し定義ファイル３２の、作業者３０の入力装置１２の操作による内容の変更を検出し、その検出をディスプレイ１１の画面表示に反映させるよう、文字データをディスプレイ１１に出力する。関数呼び出し定義ファイル３２の内容の変更とは、関数呼び出し定義ファイル３２に記載された関数の実行順序の並び替え、関数呼び出し定義ファイル３２に記載された関数の一部または前部の削除、関数呼び出し定義ファイル３２への新たな関数の追加等をいう。これによって、呼び出し設定部２１は、関数の実行順序の入力を受け取ることができる。
【００６５】
更にステップ５３０では、作業者３０の関数呼び出し定義ファイル３２に対する変更（設定）が終了したか否かを判定する。具体的には、作業者３０が入力装置１２に対して設定終了の旨の所定の操作を行ったことを検知したか否かを判定する。そして、変更が終了するまで、ステップ５３０の処理をくり返し、変更が終了すると、処理はステップ５４０に進む。
【００６６】
ステップ５４０では、上記変更結果に基づく関数の順序を配列ＦｕｎｃＮａｍｅ［］に保存する。具体的には、ＲＡＭ１３中に配列ＦｕｎｃＮａｍｅ［］のための領域を確保し、これら関数の名称が、それらの関数の順序の先頭から最後尾までの順に、配列ＦｕｎｃＮａｍｅ［］の各配列要素に格納される。例えば配列ＦｕｎｃＮａｍｅ［］の添字が１から始まる場合は、順序がｎ番目の関数はＦｕｎｃＮａｍｅ［ｎ］に格納される。なお、既に配列ＦｕｎｃＮａｍｅ［］がＲＡＭ１３中に存在するときは、上記変更結果に基づく関数の順序を当該配列ＦｕｎｃＮａｍｅ［］に上書きする。
【００６７】
この配列ＦｕｎｃＮａｍｅ［］は、後述するように順序検査部２３がその動作において利用するので、ＦｕｎｃＮａｍｅ［］への関数名の書き込みは、実効的には順序検査部２３への実行順序の出力である。以上で呼び出し設定部２１の動作は終了する。
【００６８】
図６に、関数呼び出し定義ファイル読み込み部２２の動作のフローチャートを示す。このプログラムは、呼び出し設定部２１によって配列ＦｕｎｃＮａｍｅ［］が生成され、または上書きされたときに動作を開始する。
【００６９】
ステップ６１０では、公開／参照情報検索部２４を起動する。なお、配列ＦｕｎｃＮａｍｅ［］は、後述するように公開／参照情報検索部２４がその動作において利用するので、公開／参照情報検索部２４の起動は、実効的には順序検査部２３から公開／参照情報検索部２４へのＦｕｎｃＮａｍｅ［］の出力である。
【００７０】
これによって、公開／参照情報検索部２４が動作し、後述するような動作内容により、配列ＳｕｐｐｌｙＮａｍｅ［］、ＵｓｅＮａｍｅ［］が生成される。このＳｕｐｐｌｙＮａｍｅ［］、ＵｓｅＮａｍｅ［］は、ＦｕｎｃＮａｍｅ［］と対応するように生成される。具体的には、ＦｕｎｃＮａｍｅ［ｎ］（ｎは整数）に格納されている関数名を有する関数（以下ＦｕｎｃＮａｍｅ［ｎ］に係る関数という）が公開している変数名がＳｕｐｐｌｙＮａｍｅ［ｎ］に格納され、当該関数が参照している変数名がＵｓｅＮａｍｅ［ｎ］に格納される。図７に、ＦｕｎｃＮａｍｅ［］、Ｓ  ｕｐｐｌｙＮａｍｅ［］、ＵｓｅＮａｍｅ［］の対応関係を表として示す。この表中、数字１〜６でラベルされる各行は、それぞれ１〜６番目の配列ＦｕｎｃＮａｍｅ［］、ＳｕｐｐｌｙＮａｍｅ［］、ＵｓｅＮａｍｅ［］の要素である。各配列ＦｕｎｃＮａｍｅ［］、ＳｕｐｐｌｙＮａｍｅ［］、ＵｓｅＮａｍｅ［］は、図７に示すようなテーブルとして、各関数間の公開参照情報を構成する。
【００７１】
なお、１つの関数が参照する値および公開する値は、それぞれ１つであるとは限らないので、実際にはＳｕｐｐｌｙＮａｍｅ［］、ＵｓｅＮａｍｅ［］は１つの要素が複数の変数名を示すようになっている。具体的には、例えばＳｕｐｐｌｙＮａｍｅ［］、ＵｓｅＮａｍｅ［］はコンマ、セミコロン等の所定のデリミタで区切られた複数の変数名を文字列として有するようになっていてもよい。また例えば、ＳｕｐｐｌｙＮａｍｅ［］、ＵｓｅＮａｍｅ［］は、それぞれの要素が特定の配列変数のアドレスを指定するポインタとなっており、その指定されたそれぞれの配列変数が複数の変数名を格納するようになっていてもよい。
【００７２】
次にステップ６２０では、後にログファイルを作成するための一時保存のために、現在のＦｕｎｃＮａｍｅ［］、ＳｕｐｐｌｙＮａｍｅ［］、ＵｓｅＮａｍｅ［］をそれぞれ別の配列変数ＦｕｎｃＮａｍｅＢｕｆ［］、ＳｕｐｐｌｙＮａｍｅＢｕｆ［］、ＵｓｅＮａｍｅＢｕｆ［］にコピーする。
【００７３】
次にステップ６３０では、後に使用する並び替え用の変数ＳｔａＰｏｉｎｔｅｒおよびＥｎｄＰｏｉｎｔｅｒを初期化する。具体的には、ＲＡＭ１３中にＳｔａＰｏｉｎｔｅｒおよびＥｎｄＰｏｉｎｔｅｒの領域が無ければ確保し、ＳｔａＰｏｉｎｔｅｒには１を代入し、ＥｎｄＰｏｉｎｔｅｒには配列ＦｕｎｃＮａｍｅ［］のサイズ、すなわち配列ＦｕｎｃＮａｍｅ［］に格納された関数名の数を格納する。
【００７４】
次にステップ６４０では、呼び出し並び替え部２５を起動させる。さらにこのとき、ＳｕｐｐｌｙＮａｍｅ［］、ＵｓｅＮａｍｅ［］を初期化し、ＦｕｎｃＮａｍｅ［］、ＳｕｐｐｌｙＮａｍｅ［］、ＵｓｅＮａｍｅ［］、ＳｔａＰｏｉｎｔｅｒおよびＥｎｄＰｏｉｎｔｅｒを引数として呼び出し並び替え部２５に渡す。これは、実効的には順序検査部２３から呼び出し並び替え部２５への図７に示したようなテーブルとしての公開参照情報等の出力である。
【００７５】
呼び出し並び替え部２５は、後述する動作によって、公開参照情報に基づいて配列ＦｕｎｃＮａｍｅ［］、ＳｕｐｐｌｙＮａｍｅ［］、ＵｓｅＮａｍｅ［］の要素の並べ替えを行うことで、関数の実行順序の並べ替えを行う。
【００７６】
次にステップ６５０では、関数呼び出しの並び替え前の設定と並び替え後との違いを確認し、ログファイルを生成する。具体的には、ＦｕｎｃＮａｍｅＢｕｆ［］、ＳｕｐｐｌｙＮａｍｅＢｕｆ［］、ＵｓｅＮａｍｅＢｕｆ［］を、それぞれＦｕｎｃＮａｍｅ［］、ＳｕｐｐｌｙＮａｍｅ［］、ＵｓｅＮａｍｅ［］と比較し、どのように並べ替えが行われたかを検出し、これらＦｕｎｃＮａｍｅＢｕｆ［］、ＳｕｐｐｌｙＮａｍｅＢｕｆ［］、ＵｓｅＮａｍｅＢｕｆ［］、ＦｕｎｃＮａｍｅ［］、ＳｕｐｐｌｙＮａｍｅ［］、ＵｓｅＮａｍｅ［］、およびどのように並べ替えが行われたかの情報を、ログファイル作成の命令と共にログファイル生成部２７に出力する。これにより、ログファイル３３に今回の並べ替えの情報が記録される。
【００７７】
次にステップ６６０では、関数呼び出し定義ファイル生成部２６に関数呼び出し定義ファイル３２をオープンする命令を出力し、さらに、関数呼び出し定義ファイル生成部２６に書き込み命令と、ＦｕｎｃＮａｍｅ［］に格納されているものと同じ順序の、関数呼び出し定義ファイル３２の形式に従った関数呼び出し定義ファイル３２を出力する。これにより、関数呼び出し定義ファイル生成部２６によって新たな関数呼び出し定義ファイル３２が生成される。これによって、並び替えられたＦｕｎｃＮａｍｅ［］の順序が新たな関数の実行順序となる。以上で順序検査部２３の動作は終了する。
【００７８】
図８に、公開／参照情報検索部２４の動作のフローチャートを示す。このプログラムは、図６のステップ６１０の処理によって、その動作を開始する。
【００７９】
まず、ステップ８１０では、変数Ｎｕｍｂｅｒに１を代入する。
【００８０】
ステップ８２０では、ＦｕｎｃＮａｍｅ［Ｎｕｍｂｅｒ］、すなわち、配列ＦｕｎｃＮａｍｅ［］のＮｕｍｂｅｒ番目の要素を検索対象とする。具体的には、現在の検索対象を示すための変数にＮｕｍｂｅｒの値を代入する。
【００８１】
ステップ８３０では、図９に示す当該検索対象の関数についての公開情報抜き出しの処理を行う。後述するように、この公開情報抜き出しの処理によって、ＦｕｎｃＮａｍｅ［Ｎｕｍｂｅｒ］に係る関数の公開する変数名がＳｕｐｐｌｙＮａｍｅ［Ｎｕｍｂｅｒ］に格納される。
【００８２】
ステップ８４０では、図１０に示す当該検索対象の関数についての参照情報抜き出しの処理を行う。後述するように、この参照情報抜き出しの処理によって、ＦｕｎｃＮａｍｅ［Ｎｕｍｂｅｒ］に係る関数が参照する変数名がＵｓｅＮａｍｅ［Ｎｕｍｂｅｒ］に格納される。
【００８３】
ステップ８５０では、変数Ｎｕｍｂｅｒの値を１だけ増加させる。
【００８４】
ステップ８６０では、変数Ｎｕｍｂｅｒが配列ＦｕｎｃＮａｍｅ［］のサイズより大きいか否かを判定する。大きければ処理は終了し、大きくなければ処理はステップ８２０に戻る。
【００８５】
この公開／参照情報検索部２４の動作によって、ＦｕｎｃＮａｍｅ［］にその名称が格納されている全ての関数について、公開情報がＳｕｐｐｌｙＮａｍｅ［］に、参照情報がＵｓｅＮａｍｅ［］に格納される。
【００８６】
以下、ステップ８３０で起動される図９の公開情報抜き出し処理について説明する。
【００８７】
まずステップ９１０で、検索対象の関数、すなわちＦｕｎｃＮａｍｅ［Ｎｕｍｂｅｒ］に係る関数を含むソースコードのファイルをオープンする。これは、公開用ヘッダファイルの内容を検索し、該当する関数名の宣言文がある公開用ヘッダファイルに先述した命名規則により１対１に対応するソースコードのファイルをオープンすることで実現される。
【００８８】
次にステップ９２０で、当該関数内で演算している変数を検索する。関数内で演算している変数とは、その関数内の代入文中で、代入される変数となっている変数（例えば代入記号“＝”の左側にある変数）をいう。具体的には，関数の処理内容（すなわち関数に記載されている各文）を逐一検索し、当該変数を抽出する。
【００８９】
次にステップ９３０で、検索の結果において、演算している変数が１つ以上あるか否かを判定する。１つ以上あれば、それらの演算している変数の個々についてステップ９５０から９７０までのループ処理を行うため、処理はステップ９５０に進み、１つもなければ、処理はこのループ処理を省略してステップ９８０に進む。
【００９０】
ステップ９５０では、当該演算している変数の１つが、外部に公開されるようになっている変数であるか否かを判定する。当該演算している変数が外部に公開されるようになっている場合としては、例えば、当該関数を有するファイル内というスコープにおいてこの変数がグローバルであり、かつこのファイル中にこの変数を返すような別の関数が定義されている場合、換言すれば当該変数のスコープ中にこの変数を返すような関数が定義されている場合がある（図３参照）。また例えば、当該関数がＣ＋＋等のオブジェクト指向言語によるクラスとして実現されていれば、当該変数が外部公開用にパブリック宣言されたメソッドを呼び出すことによって参照できるようになっている場合がある。当該変数が、外部に公開されるようになっていれば処理はステップ９６０に進み、外部に公開されるようになっていなければ処理はステップ９７０に進む。
【００９１】
ステップ９６０では、外部に公開されるようになっている当該変数を配列ＳｕｐｐｌｙＮａｍｅ［Ｎｕｍｂｅｒ］に、または、配列ＳｕｐｐｌｙＮａｍｅ［  Ｎｕｍｂｅｒ］の示すアドレスに割り当てられた配列にその値を追記する形で格納する。
【００９２】
ステップ９７０では、ステップ９２０で検索した全ての当該関数内で演算（算出と同義）している変数について、ステップ９５０の処理を行ったか否かを判定する、全てについて行っていれば、処理はループを終了してステップ９８０に進み、全てについて行っていなければ、まだ当該処理を行っていない変数の１つを処理対象とし、処理はステップ９５０に戻る。
【００９３】
ステップ９８０では、ステップ９１０でオープンした検索対象関数を含むファイルをクローズし、その後公開情報抜き出し処理は終了する。なおクローズとは、当該ファイルの読み出し、書き込みができる状態を終了することをいう。
【００９４】
以上のような公開情報抜き出し処理によって、検索対象の関数内で演算されており、かつ外部の関数から参照できるよう公開を行っている変数の全てが、当該検索対象関数の名称を格納している配列ＦｕｎｃＮａｍｅ［］の要素に対応する配列ＳｕｐｐｌｙＮａｍｅ［］の要素に格納される。
【００９５】
以下、ステップ８４０で起動される図１０の参照情報抜き出し処理について説明する。まずステップ７１０で、図９のステップ９１０と同様、検索対象の関数、すなわちＦｕｎｃＮａｍｅ［Ｎｕｍｂｅｒ］に係る関数を含むソースコードのファイルをオープンする。
【００９６】
次にステップ７２０で、検索対象関数内で参照している外部の関数を検索する。外部とは、当該関数内でないという意味である。具体的には、関数の処理内容（すなわち関数に記載されている各文）を逐一検索し、Ｒｅｆ＿から始まる変数名を有する変数を抽出する。そして、抽出した全ての当該変数のうち、当該関数を含むソースファイルに１対１に対応する参照用ヘッダのｄｅｆｉｎｅ文において、当該変数が当該ソースファイル中に無い関数として定義されている変数を抽出し、この抽出したものを検索対象関数内で参照している外部の関数とする。
【００９７】
次にステップ７３０で、検索の結果において、当該参照している外部関数が１つ以上あるか否かを判定する。１つ以上あれば、それら参照している外部関数の個々についてステップ７４０から７６０までのループ処理を行うため、処理はステップ７４０に進み、１つもなければ、処理はこのループ処理を省略してステップ７７０に進む。
【００９８】
ステップ７４０では、当該参照している外部関数の１つが定義されているＣソースコードのファイルを検索する。これは、各公開用ヘッダのファイルの記載内容を検索し、該当する外部関数名の宣言文がある公開用ヘッダファイルに１対１に対応するＣソースコードのファイルを特定することで実現される。
【００９９】
ステップ７５０では、当該特定したＣソースコードのファイルの処理内容を逐一検索することで、この外部関数によって返される変数名（例えば図３（ａ）における変数Ａ）を抜き出し、その名称を配列ＵｓｅＮａｍｅ［Ｎｕｍｂｅｒ］または、配列ＵｓｅＮａｍｅ［Ｎｕｍｂｅｒ］の示すアドレスに割り当てられた配列にその値を格納する。
【０１００】
ステップ７６０では、ステップ７２０で検索した全ての外部参照について、ステップ７３０の処理を行ったか否かを判定する。全てについて行っていれば、処理はループを終了してステップ７７０に進み、全てについて行っていなければ、まだ当該処理を行っていない外部参照の１つを処理対象とし、処理はステップ７４０に戻る。
【０１０１】
ステップ７７０では、ステップ７１０でオープンした検索対象関数を含むファイルをクローズし、その後参照情報抜き出し処理は終了する。
【０１０２】
以上のような参照情報抜き出し処理によって、検索対象の関数内で参照しており、かつ他の関数中で当該検索対象の関数に対して公開されている変数の全てが、当該検索対象関数の名称を格納している配列ＦｕｎｃＮａｍｅ［］の要素に対応する位置の配列ＵｓｅＮａｍｅ［］の要素に格納される。
【０１０３】
以上のような動作によって、公開／参照情報検索部２４は、呼び出し設定部２１が受け取った実行順序に記載されている複数の関数中の関数にて算出・公開される変数が、他の関数にて参照されているか否かについての公開参照情報を検索してテーブルとして記録する。
【０１０４】
図１１、１２、１３に、呼び出し並び替え部２５の動作のフローチャートを示す。このプログラムは、図６のステップ６４０の処理によって、その動作を開始する。
【０１０５】
次に、図１１のステップ１１０では、変数ＥｎｄＰｏｉｎｔｅｒから変数ＳｔａＰｏｉｎｔｅｒを減算した値が０以下であるか否かを判定する。これは、後述する並び替え対象範囲の数が１以下となったか否かを判定するための処理である。なお、ＳｔａＰｏｉｎｔｅｒは並び替え対象範囲の先頭位置を示す値を有しており、ＥｎｄＰｏｉｎｔｅｒは当該範囲の最後尾を示す値を有している。ＥｎｄＰｏｉｎｔｅｒ  −    ＳｔａＰｏｉｎｔｅｒが０以下であれは処理は終了し、０以下でなければ処理はステップ１２０に進む。なお、図６のステップ６４０において起動した時点では、ＥｎｄＰｏｉｎｔｅｒは配列ＦｕｎｃＮａｍｅ［］のサイズであり、ＳｔａＰｏｉｎｔｅｒは１であるから、ＦｕｎｃＮａｍｅ［］に１つ以下しか関数名が格納されていない場合を除いて、ＥｎｄＰｏｉｎｔｅｒ  −    ＳｔａＰｏｉｎｔｅｒは０より大きくなる。
【０１０６】
ステップ１２０では、関数状態を格納するために用いる配列ＵｓｅＩｎＲａｎｇｅ［］の初期化を行う。具体的には、ＲＡＭ１３中に配列ＵｓｅＩｎＲａｎｇｅ［］のための領域を割り当て、配列ＵｓｅＩｎＲａｎｇｅ  ［］の全ての要素をゼロとする。なお、配列ＵｓｅＩｎＲａｎｇｅ［］は、各要素が４ビットの配列変数である。以下、この各要素の最下位ビットから最上位ビットまでを順に第１ビット、第２ビット、第３ビット，第４ビットと記す。
【０１０７】
ステップ１２０の後には、処理は図１２のステップ２０５に進み、第１ループについての初期設定を行う。具体的には、変数Ｌｏｏｐの値をＳｔａＰｏｉｎｔｅｒの値に初期化する。なお、第１ループとは、ステップ２１０からステップ２６５までの処理の繰り返しのことである。
【０１０８】
次にステップ２１０では、第２ループについての初期設定を行う。具体的には、変数Ｌｏｏｐ２の値をＳｔａＰｏｉｎｔｅｒの値に初期化する。なお、第２ループとは、ステップ２２５からステップ２４５までの処理の繰り返しのことである。
【０１０９】
次にステップ２１５では、第１ループの関数に公開変数があるか否かを判定する。第１ループの関数とは、ＦｕｎｃＮａｍｅ［Ｌｏｏｐ］に係る関数である。この関数に公開変数があるか否かについては、具体的には、配列ＳｕｐｐｌｙＮａｍｅ［］の当該関数についての要素ＳｕｐｐｌｙＮａｍｅ［Ｌｏｏｐ］に１つ以上変数名が格納されているか否かを判定する。公開変数があれば処理はステップ２２０に進み、なければステップ２５０に進む。
【０１１０】
ステップ２２０では、第１ループの関数に公開変数があるという情報を配列ＵｓｅＩｎＲａｎｇｅ［］に格納する。具体的には、ＵｓｅＩｎＲａｎｇｅ［Ｌｏｏｐ  −  ＳｔａＰｏｉｎｔｅｒ］の第４ビットを１とする。
【０１１１】
ステップ２２５では、第１ループの関数の公開変数が第２ループの関数の参照変数として使用されているか否かを判定する。第２ループの関数とは、ＦｕｎｃＮａｍｅ［Ｌｏｏｐ２］に係る関数である。この判定は、具体的には、ＳｕｐｐｌｙＮａｍｅ［Ｌｏｏｐ］に格納され、かつＵｓｅＮａｍｅ［Ｌｏｏｐ２］に格納されている変数名があるか否かの判定である。第１ループの関数の公開変数が第２ループの関数の参照変数として使用されていれば処理はステップ２３０に進み、使用されていなければ処理はステップ２４０に進む。
【０１１２】
ステップ２３０では、第１ループの関数の公開変数は範囲内で参照されている旨の情報を配列ＵｓｅＩｎＲａｎｇｅ［］に格納する。具体的には、ＵｓｅＩｎＲａｎｇｅ［Ｌｏｏｐ  −  ＳｔａＰｏｉｎｔｅｒ］の第３ビットを１とする。なお、「範囲内」とは、現時点での並び替え範囲内、すなわち、ＦｕｎｃＮａｍｅ［ＳｔａＰｏｉｎｔｅｒ］からＦｕｎｃＮａｍｅ［ＥｎｄＰｏｉｎｔｅｒ］までの範囲によって示される関数の範囲内をいう。なお、並び替え対象範囲内の関数は、並び替え対象集合の要素である。
【０１１３】
次にステップ２３５では、第２ループの関数の参照は範囲内で公開されている旨の情報を配列ＵｓｅＩｎＲａｎｇｅ［］に格納する。具体的には、ＵｓｅＩｎＲａｎｇｅ［Ｌｏｏｐ２  −  ＳｔａＰｏｉｎｔｅｒ］の第１および第２ビットを１とする。
【０１１４】
ステップ２４０では、Ｌｏｏｐ２の値を１増加させる。
【０１１５】
次にステップ２４５では、Ｌｏｏｐ２の値がＥｎｄＰｏｉｎｔｅｒの値よりも大きいか否かを判定する。大きければ処理はステップ２５０に進み、大きくなければ処理は第２ループの先頭のステップ２２５に戻る。
【０１１６】
次にステップ２５０では、第１ループの関数に参照変数があるか否かを判定する。具体的には、配列ＵｓｅＮａｍｅ［］の当該関数についての要素ＳｕｐｐｌｙＮａｍｅ［Ｌｏｏｐ］に１つ以上変数名が格納されているか否かを判定する。参照変数があれば処理はステップ２５５に進み、なければステップ２６０に進む。
【０１１７】
ステップ２５５では、第１ループの関数に参照情報があるという情報を配列ＵｓｅＩｎＲａｎｇｅ［］に格納する。具体的には、ＵｓｅＩｎＲａｎｇｅ［Ｌｏｏｐ  −  ＳｔａＰｏｉｎｔｅｒ］の第２ビットを１とする。そして処理はステップ２６０に進む。
【０１１８】
ステップ２６０では、Ｌｏｏｐの値を１増加させる。
【０１１９】
次にステップ２６５では、Ｌｏｏｐの値がＥｎｄＰｏｉｎｔｅｒの値よりも大きいか否かを判定する。大きければ処理は図１３のステップ３０５に進み、大きくなければ処理は第１ループの先頭のステップ２１０に戻る。
【０１２０】
以上のようなステップ２０５〜２６５の処理によって、変数ＬｏｏｐがＳｔａＰｏｉｎｔｅｒからＥｎｄＰｏｉｎｔｅｒまで１づつ増加する第１ループの繰り返しを行うことによって、ＵｓｅＩｎＲａｎｇｅ［］の各要素は以下の（ａ）〜（ｄ）の条件を満たすようになる。
（ａ）ＦｕｎｃＮａｍｅ［ｊ］（ｊはＳｔａＰｏｉｎｔｅｒからＥｎｄＰｏｉｎｔｅｒまでの整数、以下同様）に係る関数にて外部に公開されている変数があれば、ＵｓｅＩｎＲａｎｇｅ［ｊ−  ＳｔａＰｏｉｎｔｅｒ］の第４ビットが１となり、さもなければ当該ビットが０になる。
（ｂ）ＦｕｎｃＮａｍｅ［ｊ］に係る関数にて外部に公開している変数が、範囲内の他の関数にて参照されていれば、ＵｓｅＩｎＲａｎｇｅ［ｊ−  ＳｔａＰｏｉｎｔｅｒ］の第３ビットが１となり、さもなければ当該ビットが０になる。
（ｃ）ＦｕｎｃＮａｍｅ［ｊ］に係る関数にて外部の変数を参照していれば、ＵｓｅＩｎＲａｎｇｅ［ｊ−  ＳｔａＰｏｉｎｔｅｒ］の第２ビットが１となり、さもなければ当該ビットが０になる。
（ｄ）ＦｕｎｃＮａｍｅ［ｊ］に係る関数にて参照している外部の変数が、範囲内の他の関数にて公開されているものであれば、ＵｓｅＩｎＲａｎｇｅ［ｊ−  ＳｔａＰｏｉｎｔｅｒ］の第１ビットが１となり、さもなければ当該ビットが０になる。
【０１２１】
図１３のステップ３０５では、入れ替えステータス情報変数ＣｈａｎｇｅＳｔａｔｕｓ、基準ポインタ変数ＢａｓｅＰｏｉｎｔｅｒ、およびループ変数Ｌｏｏｐの初期化を行う。具体的には、これら変数のための領域をＲＡＭ１３に確保し、ＣｈａｎｇｅＳｔａｔｕｓの値を０に、ＢａｓｅＰｏｉｎｔｅｒの値をＳｔａＰｏｉｎｔｅｒに、Ｌｏｏｐの値を０に設定する。
【０１２２】
次にステップ３１０では、ステップ３１０からステップ３６０までのループの強制終了条件を判定する。具体的には、ＢａｓｅＰｏｉｎｔｅｒにＬｏｏｐを加算した値がＥｎｄＰｏｉｎｔｅｒより大きいか否かを判定し、大きい場合は処理を終了し、大きくない場合はループを続行するため処理をステップ３１５に進める。
【０１２３】
ステップ３１５では、当該ループの関数が参照している変数が範囲外で公開されているか否かを、配列ＵｓｅＩｎＲａｎｇｅ［］を用いて判定する。当該ループの関数とは、配列ＵｓｅＩｎＲａｎｇｅ［］のループ位置ＵｓｅＩｎＲａｎｇｅ［Ｌｏｏｐ］における要素が対象とする関数、すなわちＦｕｎｃＮａｍｅ［ＢａｓｅＰｏｉｎｔｅｒ  ＋  Ｌｏｏｐ］に係る関数である。この判定は、具体的には、ＵｓｅＩｎＲａｎｇｅ［Ｌｏｏｐ］の第１ビットが０であるか否かによって行う。範囲外であれば処理はステップ３２０に進み、範囲内であれば処理はステップ３３５に進む。
【０１２４】
ステップ３２０では、当該ループの関数を範囲の先頭の関数と入れ替える。これは、範囲内に参照する変数が無いので、当該ループの関数が範囲内の関数の中で先頭の実行順位となってもよいからである。具体的には、ＦｕｎｃＮａｍｅ［ＳｔａＰｏｉｎｔｅｒ］の値と、ＦｕｎｃＮａｍｅ［ＢａｓｅＰｏｉｎｔｅｒ  ＋  Ｌｏｏｐ］の値とを入れ替え、ＳｕｐｐｌｙＮａｍ  ｅ［ＳｔａＰｏｉｎｔｅｒ］の値と、ＳｕｐｐｌｙＮａｍｅ［ＢａｓｅＰｏｉｎｔｅｒ  ＋  Ｌｏｏｐ］の値とを入れ替え、ＵｓｅＮａｍｅ［ＳｔａＰｏｉｎｔｅｒ］の値と、ＵｓｅＮａｍｅ［ＢａｓｅＰｏｉｎｔｅｒ  ＋  Ｌｏｏｐ］の値とを入れ替える。
【０１２５】
次にステップ３２５では、入れ替えステータス情報変数ＣｈａｎｇｅＳｔａｔｕｓの値を範囲の先頭に入れ替え済みの旨にする。具体的には、ＣｈａｎｇｅＳｔａｔｕｓの第１ビットを１とする。
【０１２６】
次にステップ３３０では、範囲の開始位置を、１つ分範囲が狭まる方向へずらず。具体的には、ＳｔａＰｏｉｎｔｅｒの値を１増加させる。そして処理はステップ３５５へ進む。
【０１２７】
ステップ３１５で範囲外でないと判定された後のステップ３３５では、当該ループの関数が公開している変数が範囲外である（すなわち範囲内で参照されていない）か否かを、配列ＵｓｅＩｎＲａｎｇｅ［］を用いて判定する。この判定は、具体的には、ＵｓｅＩｎＲａｎｇｅ［ｌｏｏｐ］の第３ビットが０であるか否かによって行う。範囲外であれば処理はステップ３４０に進み、範囲内であれば処理はステップ３５５に進む。
【０１２８】
ステップ３４０では、当該ループの関数を範囲の最後尾の関数と入れ替える。これは、範囲内に当該公開変数を参照する関数が無いので、当該ループの関数が範囲内の関数の中で最後の実行順位となってもよいからである。具体的には、ＦｕｎｃＮａｍｅ［ＥｎｄＰｏｉｎｔｅｒ］の値と、ＦｕｎｃＮａｍｅ［ＢａｓｅＰｏｉｎｔｅｒ  ＋  Ｌｏｏｐ］の値とを入れ替え、ＳｕｐｐｌｙＮａｍｅ［ＥｎｄＰｏｉｎｔｅｒ］の値と、ＳｕｐｐｌｙＮａｍｅ［ＢａｓｅＰｏｉｎｔｅｒ  ＋  Ｌｏｏｐ］の値とを入れ替え、ＵｓｅＮａｍｅ［ＥｎｄＰｏｉｎｔｅｒ］の値と、ＵｓｅＮａｍｅ［ＢａｓｅＰｏｉｎｔｅｒ  ＋  Ｌｏｏｐ］の値とを入れ替える。
【０１２９】
次にステップ３４５では、入れ替えステータス情報変数ＣｈａｎｇｅＳｔａｔｕｓの値を範囲の最後尾に入れ替え済みの旨にする。具体的には、ＣｈａｎｇｅＳｔａｔｕｓの第２ビットを１とする。
【０１３０】
次にステップ３５０では、範囲の最後尾位置を、１つ分範囲が狭まる方向へずらず。具体的には、ＳｔａＰｏｉｎｔｅｒの値を１減少させる。そして処理はステップ３５５へ進む。
【０１３１】
ステップ３５５では、Ｌｏｏｐの値を１増加させる。
【０１３２】
次にステップ３６０では、配列ＵｓｅＩｎＲａｎｇｅ［］の全てについてステップ３１５からステップ３５５までの検査処理を行ったか否かを判定する。具体的には、Ｌｏｏｐの値が配列ＵｓｅＩｎＲａｎｇｅ［］のサイズより大きいか否かを判定する。大きければ処理はループを終了しステップ３６５に進み、大きくなければ処理はループの先頭のステップ３１０に戻る。
【０１３３】
ステップ３６５では、関数の入れ替えが行われたか否かを判定する。具体的には、ＣｈａｎｇｅＳｔａｔｕｓの値が０でないか否かを判定する。入れ替えが行われていれば処理はステップ３７５に進み、行われていなければ処理はステップ３７０に進む。
【０１３４】
ステップ３７５では、呼び出し並び替え部２５を起動、すなわち自らを再帰呼び出しする。これによって、新たにステップ１１０から処理が行われ、この再帰呼び出しされた処理が終了すると、本処理も終了する。
【０１３５】
ステップ３７０では、ディスプレイ１１に「関数の並び替えが不可能な箇所があります」とのメッセージを表示させた後処理は終了する。これは、フィードバックのために相互に変数を参照・公開し合う関数の組があった場合等、関数の実行順序を自動では特定できない場合に、このメッセージを表示し、後に作業者側の手動での設定を促すための処理である。
【０１３６】
以上のような、ステップ３１０〜３６０のループの繰り返し処理は、公開参照情報に基づいて、範囲内のある関数にて、この範囲内の他の関数にて算出される変数のいずれをも参照していない場合、その「ある関数」の実行順序を範囲内の関数中で最先とし、最先とされた関数を範囲から除外し、また、範囲内のある関数にて算出される変数のいずれもが、範囲内の他の単位プログラムにて参照されない場合、その「ある関数」の実行順序を範囲内の単位プログラム中で最後尾とし、この最後尾とされた関数を、範囲から除外する。
【０１３７】
上記ループの繰り返しによる範囲および実行順序の変遷の一例を図１４〜図１６に示す。図１４および図１５の表示形式は、図７と同じである。例えば、呼び出し並び替え部２５が最初に処理を開始したとき、ＦｕｎｃＮａｍｅ［］、ＳｕｐｐｌｙＮａｍｅ［］、ＵｓｅＮａｍｅ［］が図１４に示す状態となっていた場合、ＳｔａＰｏｉｎｔｅｒは１なので配列の一番目の関数Ｆｕｎｃ＿Ａを示し、ＥｎｄＰｏｉｎｔｅｒはＦｕｎｃＮａｍｅのサイズなので配列の最後の関数Ｆｕｎｃ＿Ｆを示している。すなわち、範囲は関数Ｆｕｎｃ＿Ａから関数Ｆｕｎｃ＿Ｆまでである。
【０１３８】
この図によれば、関数Ｆｕｎｃ＿Ｅは変数Ｚを参照しているが、この変数Ｚは範囲内の他の関数にて算出・公開されていない。したがって、ステップ３１５、３２０の処理によって、この関数の実行順序はこの範囲の中で最先のものとなる。さらに、ステップ３３０によって、ＳｔａＰｏｉｎｔｅｒが１増加することにより、範囲が１つ狭まり、先頭になった関数Ｆｕｎｃ＿Ｅが範囲から除外される。
【０１３９】
また、関数Ｆｕｎｃ＿Ｂにて変数Ｂを算出・公開しているが、この変数Ｂを参照している他の関数はこの範囲内に存在しない。したがって、ステップ３３５、３４０の他の処理によって、この関数の実行順序はこの範囲の中で最後尾のものとなる。さらに、ステップ３５０によって、ＥｎｄＰｏｉｎｔｅｒが１減少することにより、範囲が１つ狭まり、最後尾になった関数Ｆｕｎｃ＿Ｂが範囲から除外される。
【０１４０】
この結果、関数の呼び出し順序は図１５の様になる。
【０１４１】
また、このループ処理が再帰的に繰り替えされることにより、最終的にフィードバックのために相互に変数を参照・公開し合う２以上の関数の組が残って、これ以上自動的な並び替えが行えなくなるまで、すなわち図１１のステップ１１０で並び替え対象範囲が１以下となるか、図１３のステップ３６５で関数の入れ替えが行われなかったと判定されるまで、以上のような処理が順次続く。
【０１４２】
例えば図１５のような状態で再度上記ループ処理が実行されると、もはや範囲内の関数にて算出・公開されなくなった変数Ｅのみを参照している関数Ｆｕｎｃ＿Ａは、範囲内の先頭の実行順位とされ、また、もはや範囲内の関数にて参照されなくなった変数Ｆのみを算出・公開している関数Ｆｕｎｃ＿Ｆは、範囲内の先頭の実行順位とされ、さらにＳｔａＰｏｉｎｔｅｒが１増加しＥｎｄＰｏｉｎｔｅｒが１減少することで、範囲が狭まる。この結果、図１５の様に関数Ｆｕｎｃ＿Ｅ、Ｆｕｎｃ＿Ａ、Ｆｕｎｃ＿Ｆ、およびＦｕｎｃ＿Ｂの実行順位が確定する。
【０１４３】
そして、図１５では、関数Ｆｕｎｃ＿Ｃは関数Ｆｕｎｃ＿Ｄにて算出・公開される変数Ｄを参照し、また関数Ｆｕｎｃ＿Ｄは関数Ｆｕｎｃ＿Ｃにて算出・公開される変数Ｅを参照している。すなわちフィードバックのために相互に変数を参照・公開し合う２つの関数の組が残る。
【０１４４】
以上のようなパーソナルコンピュータ１の並び替えプログラム２０の動作により、呼び出し設定部２１が複数の単位プログラムの実行順序の入力を受け取り、公開／参照情報検索部２４が、公開参照情報を検索してテーブルとして記録し、また呼び出し並び替え部２５が、公開／参照情報検索部２４がテーブルとして記録した公開参照情報に基づいて、他の関数にて参照されている変数を算出している関数が、上記他の関数より先に実行されるように、複数の関数の実行順序を設定するので、処理順序の不整合の発生が抑えられる。したがって、複数の関数を順次実行することで所望の機能を実現するソフトウェアの開発において、処理順序に不整合が発生することを抑えるように、これら複数の単位プログラムの実行順序の設定を行うことができる。
【０１４５】
また、公開／参照情報検索部２４は、複数の関数に記載の処理内容を検索することで公開参照情報を検索するので、関数が特別な識別コードを持たずとも、実行順序の設定を行うることができる。
【０１４６】
なお、図１０のステップ７２０においては、Ｒｅｆ＿から始まる変数名を有する変数を抽出するようになっているが、これは、ソースコードの開発者が、あらかじめ外部参照用の変数の名称としてＲｅｆ＿で始まる名称を用いるように取り決めがなされているという前提の上でのみ実効性がある。他の例としては、特にこのような取り決めを行わず、ソースコード中の全ての変数を抽出し、それら抽出したものについて参照用ヘッダのｄｅｆｉｎｅ文を検索してもよい。ただし本実施形態のような取り決めを行っている場合の方が、他の例の場合に比べて検索に係る時間が短くて済む。
【図面の簡単な説明】
【図１】本発明の実施形態に係るパーソナルコンピュータ１の構成を示す図である。
【図２】並び替えプログラム２０の機能ブロック図である。
【図３】（ａ）は、ソースコード３５、公開用ヘッダ３６、参照用ヘッダ３７の一例を示す図であり、（ｂ）は、ソースコード３８、公開用ヘッダ３９、参照用ヘッダ４０の一例を示す図である。
【図４】関数呼び出し定義ファイル３２の一例を示す図である。
【図５】呼び出し設定部２１の動作のフローチャートである。
【図６】関数呼び出し定義ファイル読み込み部２２の動作のフローチャートである。
【図７】ＦｕｎｃＮａｍｅ［］、ＳｕｐｐｌｙＮａｍｅ［］、ＵｓｅＮａｍｅ［］の対応関係を示す図表である。
【図８】公開／参照情報検索部２４の動作のフローチャートである。
【図９】公開情報抜き出しの処理を示すフローチャートである。
【図１０】参照情報抜き出しの処理を示すフローチャートである。
【図１１】呼び出し並び替え部２５の動作のフローチャートの一部を示す図である。
【図１２】呼び出し並び替え部２５の動作のフローチャートの一部を示す図である。
【図１３】呼び出し並び替え部２５の動作のフローチャートの一部を示す図である。
【図１４】図１３のループ処理の繰り返しによる範囲および実行順序の変遷の一例を示す図である。
【図１５】図１３のループ処理の繰り返しによる範囲および実行順序の変遷の一例を示す図である。
【図１６】図１３のループ処理の繰り返しによる範囲および実行順序の変遷の一例を示す図である。
【符号の説明】
１…パーソナルコンピュータ、１１…ディスプレイ、１２…入力装置、
１３…ＲＡＭ、１４…ＲＯＭ、１５…ＨＤＤ、１６…ＣＰＵ、
２０…並び替えプログラム、２１…呼び出し設定部、
２２…関数呼び出し定義ファイル読み込み部、２３…順序検査部、
２４…公開／参照情報検索部、２５…呼び出し並び替え部、
２６…関数呼び出し定義ファイル生成部、２７…ログファイル生成部、
３０…作業者、３１…ソフトウェア群、３２…関数呼び出し定義ファイル、
３３…ログファイル、３５、３８…ソースコード、
３６、３９…公開用ヘッダ、３７、４０…参照用ヘッダ。
【図１】
2004348667.tif 000003
【図２】
2004348667.tif 000004
【図３】
2004348667.tif 000005
【図４】
2004348667.tif 000006
【図５】
2004348667.tif 000007
【図６】
2004348667.tif 000008
【図７】
2004348667.tif 000009
【図８】
2004348667.tif 000010
【図９】
2004348667.tif 000011
【図１０】
2004348667.tif 000012
【図１１】
2004348667.tif 000013
【図１２】
2004348667.tif 000014
【図１３】
2004348667.tif 000015
【図１４】
2004348667.tif 000016
【図１５】
2004348667.tif 000017
【図１６】
2004348667.tif 000018