説明

コンパイル可能なコンピュータプログラムの処理

複数のソースファイルおよび1つかまたはそれ以上のヘッダーファイルが、提供される。ヘッダーファイルは、ソースファイルの中のいくつかが参照する情報を含む。オリジナルファイルは、前処理され、そのそれぞれが、それぞれの前処理ファイルを生成し、前記前処理は、第1のヘッダーファイルからの情報によって、ソースファイルの中のいくつかを拡張することを含む。全体的処理ステップが、施され、統合的な変更を前処理ファイルからの情報に対して行う。変更された前処理ファイルは、修正されたソースファイルおよびヘッダーファイルを再生成するのに使用される。第1のヘッダーファイルを再生成するために、前処理ファイルの中の1つが、選択されたファイルが第1のヘッダーファイルからの情報を詳述することを検出することに基づいて選択される。第1のヘッダーファイルは、選択されたファイル内の情報から再生成される。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、例えば、ソースファイルおよびヘッダファイルのような複数のファイルからなるコンパイル可能なコンピュータプログラムの処理に関し、あるいは、より一般的には、複数のファイルからなるコンパイル可能な関数システム記述の処理に関する。
【背景技術】
【0002】
大きなコンピュータプログラムの生成は、一般的には、多くの数のファイルを結合しなければならない。管理可能な状態に設計を維持するために、ソースコードのモジュールは、個々に設計および処理することのできる様々なファイルにある程度まで分割される。C++プログラミングは、例えば、複数のソースファイルに分割されるかもしれない多くの数のクラスを使用しなければならない。ソースファイルは、お互いに独立して、構文エラーを検査され、そして、オブジェクトコードとしてコンパイルされてもよい。様々なソースファイルから得られた情報は、機械実行可能コンピュータプログラムを生成するために、最後のステージすなわちリンクステージでしか結合されない。
【0003】
ソースファイルを個々に処理しているとき、設計情報の要素を複数のソースファイルが利用できることが必要となる場合がある。C++プログラミングにおいては、例えば、クラス定義は、クラスを使用するために、あるいは、クラスを実装するために、様々なソースファイルが利用できるものでなければならない。このために、共有可能な設計要素を含むヘッダファイルが、使用される。設計情報の要素を使用するこれらのソースファイルは、要素を含むヘッダファイルを参照する「include文」を含む。そして、ヘッダファイルもまた、include文を含んでもよい。
【0004】
構文検査およびコンパイルする前に、それぞれのソースファイルは、プリプロセッサによって前処理され、そのプリプロセッサは、ソースファイルからのコードを含む前処理ファイルを生成するが、include文は、include文が参照するヘッダファイルからの情報を代入することによって、拡張される。プリプロセッサは、これを再帰的に実行する。そして、ヘッダファイルが、include文を含む場合、参照される情報は、前処理ファイルに拡張され、以下、同様に実行される。これは、1回以上参照されるヘッダファイルからの情報の重複を含むことがある。プログラマは、通常、プリプロセッサにそのような重複を抑制させる条件付きinclude文を追加する。条件付きinclude文は、ヘッダファイルが以前に拡張されていないことを条件として、ヘッダファイルを含める。多くの場合、この抑制は、まさに必要とされるものである。なぜなら、さもなければ、重複定義が、挿入され、それは、コンパイルを中断するからである。
【0005】
前処理ファイルは、構文検査およびオブジェクトファイルの生成に使用される。リンクステージにおいて、オブジェクトファイルは、結合され、実行可能プログラムが、生成される。したがって、最初の個々のファイル処理ステージと最後の全体的ファイル処理ステージとに厳格に分離される。最初のステージにおいては、それぞれのソースファイルは、個々に処理され、最後のステージにおいては、ソースファイルから得られるすべてのファイルは、全体的に処理される。個々のソースファイル処理ステージが、全体的ファイル処理ステージの後にくることはない。
【0006】
しかしながら、様々な理由から、個々のファイル処理ステージと全体的ファイル処理ステージとが交互に何回か起こることを用いることによって、この厳格な分離から逸脱することが提案されている。米国特許第5,920,723号は、全体的ソースファイル最適化処理ステージがリンクの前に実行される処理を記載している。最適化ステージは、リンクステージの前に、様々なソースファイルから得られた情報を結合し、プログラムコードを最適化する。最適化は、命令の変更、命令の移動、不必要な命令の除去、補充命令の追加、などを含んでもよい。最適化ステージは、最適化されたそれぞれの中間ファイルを生成し、それらのそれぞれは、ソースファイルのそれぞれに対応する。最適化ステージの後に、中間ファイルは、もう一度、個々の処理を施され、オブジェクトファイルが、生成される。オブジェクトファイルは、最後に、全体的処理を施され、オブジェクトファイルを実行可能プログラムとしてリンクする。
【0007】
基本的には、中間ファイルは、ソースファイルと同じ構文で表現されてもよい。したがって、ソースファイルおよび中間ファイルの両方は、同じコンパイラプログラムによって処理されてもよく、そのために、個々のコンパイラは、必要とされない。個々の処理ステージが、全体的処理ステージと交替するとき、処理された情報をどのように個々のファイルに分配すべきかという問題が発生することがある。米国特許第5,920,723号の場合、この問題は、ほとんど存在しない。なぜなら、ソースファイルと中間ファイルとの間には、1対1の関係が存在するからである。中間ファイルは、オリジナルヘッダファイルを用いて、個々にコンパイルされてもよい。
【0008】
一般的な最適化の域を越えるプログラムの再編成が必要とされる場合、例えば、そのために、また、ヘッダファイルが、変更される場合、問題が発生する。この種類の再編成は、例えば、異なるプログラム要素間において通信チャンネルを取り替えるために、例えば、プログラムを再設計して異なる種類の(マルチ)プロセッサ上で実行するために、必要とされることがある。この場合、ソースファイルおよびヘッダファイルは、プリプロセッサによって前処理される。前処理の結果として、ヘッダファイルからの同一情報の複数コピーが、異なる前処理ファイルにおいて発生することがある。ヘッダファイルからのそのような情報が、変更される場合、まず第一に、異なる前処理ファイルにおいて発生する同一ヘッダファイルからの情報は一貫性をもって変更されることが保証されなければならない。さらに、全体的処理ステージの最後においてヘッダファイルを再生成すること、および、再生成ヘッダファイルを参照するinclude文を再導入することが望ましい(「再生成」ファイルという用語は、オリジナルファイルに対応するファイルを意味し、全体的処理ステージの結果としての変更を備える)。したがって、再生成ソースファイルおよび再生成ヘッダファイルは、オリジナルソースファイルおよびオリジナルヘッダファイルに利用可能なツールによって処理されてもよい。これは、ヘッダファイルの生成のさらなる問題を発生させる。
【0009】
前処理ファイルにおいてオリジナルヘッダファイルを識別できれば、その情報から新しいヘッダファイルおよび新しいinclude文を変更されたものとして再生成できることが一見して分かる。しかしながら、これは、不可能である。なぜなら、前処理中のヘッダファイルの拡張は、条件付きinclude文のために、不完全なものであるかもしれないからである。したがって、異なるソースファイルが、それぞれ、ヘッダファイルのような共通ファイルからの情報を用いて個々に前処理され、それに続いて、全体的に変更され、そして、変更の後に、新しいソースファイルおよび共通ファイルが、再生成されなければならない場合、問題は、マルチファイル処理に存在する。
【発明の開示】
【発明が解決しようとする課題】
【0010】
とりわけ、本発明の目的は、変更された前処理ファイルからソースファイルおよび共通ファイルを再生成するための方法およびシステムを提供することである。
【0011】
本発明のさらなる目的は、共通ファイルからの情報の拡張を含むソースファイルのバージョンから共通ファイルを再生成することである。
【課題を解決するための手段】
【0012】
本発明による方法が、請求項1に記載される。1つかまたはそれ以上の共通ファイル(例えば、ヘッダファイル)から拡張された情報を付加することによってそれぞれがそれぞれのオリジナルファイル(例えば、ソースファイル)から生成された前処理ファイルは、統合的な変更を施される。変更された後、前処理ファイルは、オリジナルファイルの再生成ファイル(例えば、再生成ソースファイル)および共通ファイルの再生成ファイル(例えば、再生成ヘッダファイル)の両方を再生成するのに使用される。共通ファイルから異なる前処理ファイル内に拡張される情報量は、異なる場合があるので、生成ファイルが十分に完全なものであることを保証するために、特別の注意が必要とされる。したがって、十分に完全なヘッダファイル情報を含むことが予想される前処理ファイルが、共通ファイルを再生成するために選択され、あるいは、少なくとも、完全性を決定する再生成の一部に使用される。共通ファイルの再生成のために選択される前処理ファイルは、オリジナルファイルがヘッダファイルに対してなす参照の種類に基づいて選択される。共通ファイル内において定義されたソフトウェアコンポーネントの実装を含む前処理ファイルが、ヘッダファイルを生成するのに使用される。ソースファイルおよびヘッダファイルを生成した後、ファイルは、例えば、それらをオブジェクトファイルにコンパイルすることによって、個々に処理されてもよく、それに続いて、例えば、実行可能プログラムを生成するために、リンクされる。それに続いて、コンピュータは、そのような実行可能なプログラムの命令を実行してもよい。
【0013】
上述したように、前処理ファイルは、好ましくは、共通ファイルを再生成するために、共通ファイル内において宣言されているソフトウェアコンポーネントの実装を検出することに基づいて選択される。好ましくは、選択は、統合された全体的処理の前に実行され、そのために、共通ファイルの場合、選択された前処理ファイルからの情報だけが、統合された処理のために、コンピュータメモリに保持されればよい。好ましくは、2パス処理が、使用される。第1のパスは、どの前処理ファイルをどの共通ファイルに使用すべきかを決定する。第2のパスは、選択された前処理ファイルから共通ファイル情報を得る。第1のパスは、前処理ファイルを読み込む順序を決定し、それによって、前記順序内における特定の前処理ファイルの位置が、選択され、それによって、その特定の前処理ファイルが、1つかまたはそれ以上のさらなるソフトウェアコンポーネントを参照するソフトウェアコンポーネントの実装を含む場合、特定の前処理ファイルは、1つかまたはそれ以上のさらなるソフトウェアコンポーネントのすべての実装を含む1つかまたは複数の前処理ファイルの後に読み込むように前記順序内に配置される。換言すれば、読み込みは、下から上に実行され、それによって、まず最初に、ソフトウェアコンポーネントの参照階層において最下位のコンポーネントを定義するファイルが、読み込まれる(第1のコンポーネントの定義が、第2のコンポーネントを参照する場合、その第1のコンポーネントは、階層においてより高いと言われる)。したがって、共通ファイルの検出された第1の拡張だけが、保持されればよい。好ましくは、情報が前処理ファイル内に拡張された共通ファイルおよび拡張された情報自身の両方を識別するために、マーク情報が、前処理ファイル内に含められる。再生成中、マーク情報は、オリジナルファイルの再生成ファイル内に存在する拡張された情報の代わりに命令を挿入するのに使用される。挿入命令は、第1の共通ファイルが前処理ファイル内に拡張された第1の共通ファイルの再生成ファイルを含めることを命令する。共通ファイルの再生成ファイルは、選択された前処理ファイル内のマーク情報によってマークを付された拡張された情報から再生成される。したがって、再生成ファイルは、オリジナルファイルと同じように使用されてもよい。
【0014】
好ましくは、オリジナルファイルのいくつかが参照する情報は、ソフトウェアコンポーネントの構造の定義であり、選択されたファイルは、実装するプログラムをソフトウェアコンポーネントの要素に提供することによって、情報を詳述する。この場合、好ましくは、選択された前処理ファイルが生成されたオリジナルファイルの中の1つが、第1の共通ファイルからの情報を拡張するための第1の命令に先行して、さらなる共通ファイルからの情報を拡張するための先行命令を含んでいるかどうかが、前処理ファイルごとに検出され、先行命令の等価なコピーが、第1の共通ファイルを拡張するための命令が挿入されたそれぞれの再生成ファイル内に生成され、等価なコピーは、第1の共通ファイルを拡張するための命令に先行して、挿入される。
【0015】
以下、添付の図面を参照して、本発明のこれらのおよびその他の目的および有益な側面を説明する。
【発明を実施するための最良の形態】
【0016】
図1は、ファイルを処理するためのシステムを示す。システムは、磁気ディスクまたはそのようなディスクを組み合わせたもののような、ソースファイルおよびヘッダファイルを記憶するための記憶装置10、プロセッサメモリ11、ターゲットプログラムメモリ17およびターゲットプロセッサ18を備えたターゲットコンピュータ16、および、生成された機械命令のプログラムをプログラムメモリ17に記憶するための装置14を含む。本発明から逸脱することなく、ターゲットプロセッサ18は、プロセッサ12であってもよく、ターゲットプログラムメモリ17は、プロセッサメモリ11である。
【0017】
プロセッサ12は、オリジナルソースファイルおよびオリジナルヘッダファイルを記憶装置10からプロセッサメモリ11に読み込むために、記憶装置10に結合される。装置14は、プロセッサ12とターゲットプログラムメモリ17との間に結合される。装置14は、機械命令のプログラムをターゲットプログラムメモリ17に書き込むように構成されてもよく、あるいは、ターゲットコンピュータが集積回路の一部であるならば、プログラムによってプログラムされたプログラムメモリ17を製造するように構成されてもよい。しかしながら、プロセッサ12と装置14との間の結合は、実際には、記憶装置10または何らかの記憶装置(図示しない)を介して実現されてもよいことが分かる。
【0018】
図2は、処理中の情報の流れを示す。記憶装置10に記憶されたオリジナルソースファイル20a〜20cが、プリプロセッサ22に提供される。例として、3つのオリジナルソースファイル20a〜20cが、示されているが、どのような数のオリジナルソースファイル20a〜20cが使用されてもよいことが分かるはずである。プリプロセッサ22は、例えば、コンピュータ12上で実行されるプログラムとして実施され、それは、オリジナルソースファイル20a〜20cごとに、毎回、反復して実行される。プリプロセッサ22は、前処理中に、オリジナルヘッダファイル21からなるグループからのファイルを使用し、それぞれのオリジナルソースファイル20a〜20cごとに、前処理ファイル23a〜23cを生成する。
【0019】
プリプロセッサは、典型的には、オリジナルソースファイル20a〜20cからの命令コードを前処理ファイル23a〜23cのそれぞれにコピーし、オリジナルソースファイル20a〜20cからのある種の文に応じて、オリジナルヘッダファイル21からの情報を前処理ファイル23a〜23c内に挿入する。挿入された情報は、その情報が得られたオリジナルヘッダファイル21を指示するために、マークを付される。プリプロセッサ22によって生成された前処理ファイル23a〜23cは、例えば、プロセッサメモリまたは記憶装置10に記憶される。
【0020】
表1は、オリジナルソースファイル、オリジナルヘッダファイル、および、前処理ファイルの例を示し、include文が、オリジナルヘッダファイルからの情報によってオリジナルソースファイルを拡張するのに使用されており、また、マーク情報が、付加されている。さらに、前処理ファイルの上部において、ソースファイルを識別するためのマークが、付加されている。
【表1】

【0021】
マークする形式はただ単に例として示されることが分かる。都合の良いものであれば、識別されたオリジナルヘッダファイルから発生するどのようなマーク情報の形式でも使用されてよい。
【0022】
オリジナルヘッダファイルは、さらなるオリジナルヘッダファイルを得るためのinclude文を含んでもよい。この場合には、プリプロセッサ22は、これらのさらなるオリジナルヘッダファイルから前処理ファイル23a〜23c内に情報を拡張し、対応するマーク情報を前処理ファイル23a〜23cに付加する。そして、これらのさらなるオリジナルヘッダファイルが、include文を含む場合、またさらなるオリジナルヘッダファイルからの情報が、前処理ファイル23a〜23cに含められ、以下、同様である。
【0023】
オリジナルヘッダファイル21は、条件文、例えば、変数Xがすでに定義されていれば、プリプロセッサ22にオリジナルヘッダファイル21の一部の拡張をスキップさせる「#ifndef X」を含んでもよい。例えば、オリジナルヘッダファイル21が、次の文を含むと仮定する。

...
#endif
【0024】
変数Xの名前は、このオリジナルヘッダファイルに特有のものである。この場合、「ifndef」と「endif」との間に存在するオリジナルヘッダファイルの部分は、変数Xがすでに定義されていれば、オリジナルヘッダファイル21を得るためのinclude文が検出されたとき、前処理ファイル23a〜23c内に拡張されない。
【0025】
全体的処理ステージ24aは、前処理ファイル23a〜23cの組み合わせを処理する。全体的処理ステージ24aは、例えば、コンピュータ12上で実行されるプログラムとして実施される。全体的処理ステージ24aは、前処理ファイル23a〜23cからの情報を変更する。これは、オリジナルソースファイル20a〜20cから得られた情報および/またはオリジナルヘッダファイル21から得られた情報を含んでもよい。
【0026】
本発明は、全体的処理ステージ24aが前処理ファイル23a〜23cからの情報に施す変更の種類に依存しない。典型的な変更は、前処理ファイルの合同再設計であり、オリジナルヘッダファイルからの共通クラス定義の変更、および、変更されたクラスのメンバーを実装しあるいはクラス定義を利用するオリジナルソースファイル20a〜20cからの命令の対応する変更を含む。これは、例えば、並列プロセッサ間におけるデータ転送のための命令を挿入することによって、例えば、オリジナルソースファイル20a〜20cからのプログラムをそれらが元々設計されたターゲットコンピュータと異なる別の種類のターゲットコンピュータ16上で実行するのに適したものにするために、適用されてもよい。
【0027】
分離器ステージ24bは、全体的処理ステージ24aの結果を、生成ソースファイル25a〜25cおよび生成ヘッダファイル26a〜26cに分配する。生成ソースファイル25a〜25cおよび生成ヘッダファイル26a〜26cは、あたかもそれらがそれぞれオリジナルソースファイル20a〜20cおよびオリジナルヘッダファイル21であるかのように使用されてもよい。すなわち、それらは、さらなる前処理ファイル27a〜27cを生成するために、プリプロセッサ22に使用されてもよい。
【0028】
さらなる前処理ファイル27a〜27cは、コンパイラー28に使用されてもよい。コンパイラー28は、例えば、コンピュータ12上で実行されるプログラムとして実施され、そのプログラムは、それぞれのさらなる前処理ファイル27a〜27cごとに、毎回、反復して実行される。コンパイラー28は、オブジェクトファイル29a〜29cを生成し、そのオブジェクトファイル29a〜29cは、ターゲットプロセッサ18に使用される機械命令の実行可能プログラム210を生成するために、リンカー200によって使用される。リンカーは、例えば、コンピュータ12上で実行されるプログラムとして実施されてもよい。
【0029】
分離器ステージ24bは、変更後の前処理ファイル23a〜23cから得られたコードを使用することによって、ソースファイル25a〜25cを生成する。前処理ファイル内の最上位マーカー情報の位置に対応するコード内の位置において、分離器ステージ24bは、生成ソースファイル25a〜25c内にinclude文を挿入し、include文は、マーカー情報で識別されるヘッダファイル21の生成されたバージョンを参照する。分離器ステージ24bは、マーカー情報によってそれ自身がマークを付されたヘッダファイル21からの拡張された情報を生成ソースファイル25a〜25c内に挿入することはない。また、分離器ステージ24bは、include文を挿入するために、拡張された情報内のネスティングされたマーカー情報を使用することもない。したがって、最上位マーカー情報のみ(マークを付されたその他の情報の一部ではなく)が、include文を挿入するのに使用される。表2は、ソースファイルの再生成を説明するものである。
【表2】

【0030】
また、分離器ステージ24bは、前処理ファイル23a〜23c内の情報からヘッダファイル26a〜26cを生成する。一般的には、異なる前処理ファイル23a〜23cは、それぞれ、同じヘッダファイル21からの拡張を含んでもよい。それにもかかわらず、異なる前処理ファイル23a〜23c内の拡張は、プリプロセッサ22が条件付きinclude文を与えることによって、異なってもよい。これは、前処理ファイル23a〜23cの一部だけがヘッダファイル26a〜26cを生成するのに適していることを意味する。その他の前処理ファイル23a〜23cは、十分に完全なものではない。
【0031】
図3は、前処理ファイル23a〜23cの不完全性を示す。第1のソースファイルS1内には、第1のヘッダファイルH1を参照するinclude文が、含まれている。第1のヘッダファイルH1は、基本的なヘッダファイルH0を参照するinclude文を含む。第2のソースファイルS2は、第1のヘッダファイルH1を参照するinclude文を含み、第2のヘッダファイルH2を参照するinclude文が、先行する。また、第2のヘッダファイルH1は、基本的なヘッダファイルH0を参照するinclude文を含む。ここで、第1のソースファイルS1が、前処理されるとき、第1のヘッダファイルH1は、完全に拡張され、H0の拡張を含む。しかしながら、第2のソースファイルS2が、前処理されるときには、第1のヘッダファイルH1は、完全には拡張されない。なぜなら、H0の参照は、それが、第2のヘッダファイルH2の拡張中にすでに拡張されているので、拡張されないからである。その結果として、第2のソースファイルS2から得られた前処理ファイルからヘッダファイルH1′を生成することは、十分に完全な生成ヘッダファイルH1′をもたらさない。
【0032】
ヘッダファイル26a〜26cを生成するために適切な前処理ファイルを選択することは、前処理ファイル23a〜23c内にソフトウェアコンポーネントが存在することを分析することを必要とする。分析のために、前処理ファイル23a〜23cから得られたデータ構造が、使用される。このデータ構造は、ソフトウェアコンポーネント、前処理ファイル23a〜23d、および、前処理ファイル23a〜23d内においてエンティティーとして識別されたヘッダファイルの識別情報を使用する。1つの例においては、ソフトウェアコンポーネントは、C++クラス定義である。データ構造は、ソフトウェアコンポーネントおよびヘッダファイルの識別子間の「defined_in」の関係、および、ソフトウェアコンポーネントおよび前処理ファイル23a〜23dの識別子間の「implemented_in」の関係を表現する。
【0033】
表3に示されるソースファイルMain、F1、F2の例を用いて、ヘッダファイルの生成を説明する。
【表3】

【0034】
ソースファイルは、ヘッダファイルF1、F2、sysを含む。例として、ヘッダファイルF1は、ライブラリヘッダファイルLおよびヘッダファイルF0を得るためのinclude文を含むと仮定する(ソースファイルは、sys、L、および、F0には提供されない)。さらに、ヘッダファイルF2は、ヘッダファイルL、F0、F1を得るためのinclude文を含むと仮定する。ヘッダファイルF0は、ヘッダファイルLおよびsysのinclude文を含む。ヘッダファイルLは、ヘッダファイルsysを得るためのinclude文を含む。
【0035】
これは、表4に記載された前処理ファイル23a〜23cをもたらす。
【表4】

【0036】
前処理ファイルは、ネスティングされたマーク情報を含むことが分かる(第1のマークに続いて、その第1のマークに対応するエンドマークの前に、第2のマークが存在する)。また、同じヘッダファイル(例えば、F1)の拡張は異なる前処理ファイルにおいては異なることが分かる。なぜなら、場合によっては、ネスティングされたヘッダファイルは、それらが以前に前処理されていれば、前処理されないからである。
【0037】
全体的処理ステージ24aまたは分離器ステージ24bは、前処理ファイルから読み込まれた情報を用いて、データ構造を構築する。ファイル自身は、前処理ファイルの識別子を定義する。マーク情報が新しいヘッダファイルを挙げるたびに、ヘッダファイル識別子が、付加される。例えば、クラス定義を検出するために、前処理ファイルを構文解析することによって、ソフトウェアコンポーネントが、検出される。そのようなクラス定義が、前処理ファイル内において検出されると、ソフトウェアコンポーネント識別情報が、そのために生成され、defined_in関係が、定義が発生することを指示されたヘッダファイルに付加される。同様に、前処理ファイルは、例えば、クラスのメンバー関数を実装するために、構文解析され、クラスのメンバーの実装が前処理ファイル内において検出されかつ対応するimplemented_in関係がまだ記録されていなければ、そのたびに、implemented_in関係が、付加される。識別情報およびこれらの識別情報間の関係は、都合の良いやり方で、例えば、ヘッダファイル、前処理ファイル、および、ソフトウェアコンポーネントのようなエンティティーのテーブル、および、関係づけられたそのようなエンティティーの対のエントリーとの関係ごとのテーブルを用いて、記録されてもよい。
【0038】
分離器ステージ24bは、データ構造からの情報によって、ヘッダファイル26a〜26cを生成する。ソフトウェアコンポーネントごとに、分離器ステージ24bは、ソフトウェアコンポーネントとdefined_in関係にあるヘッダファイル、および、ソフトウェアコンポーネントとimplemented_in関係にある前処理ファイルを決定する。それに続いて、ヘッダファイルが、implemented_in関係にある前処理ファイルから生成される。
【0039】
この処理は、特定のヘッダファイル21内において定義されたソフトウェアコンポーネントの実装を含むソースファイル20a〜20cが、include文が完全に拡張されるような形で、その特定のヘッダファイルを得るためのinclude文を含むと仮定する。これは、例えば、特定のヘッダファイルを得るためのinclude文がプログラムファイル内の最初のinclude文であれば、保証される(特定のヘッダファイルに必要とされるその他のヘッダファイルは、その特定のヘッダファイル自身に含められる)。プログラムファイルが、この要件を満足する設計スタイルを用いて展開される場合、さらなる手段は、必要とされない(この場合、refers_to関係は、必要とされない)。
【0040】
そのようなスタイルが、規定されていなければ、分離器ステージ24bの実施形態は、好ましくは、特定のヘッダファイルを生成するのに使用される前処理ファイル内における特定のヘッダファイルを得るためのinclude文に先行するそれらのマークを付された最上位include文をマーク情報から抽出するように構成される。分離器ステージ24bは、抽出されたinclude文を、特定のヘッダファイルを得るためのinclude文を含むそれぞれの生成ソースファイルに挿入し、そのヘッダファイルに先行する。したがって、特定のヘッダファイルが含められるとき、同じ環境が、毎回、生成される。
【0041】
表5は、この技術の結果の例を示す。
【表5】

【0042】
この例においては、ファイル「a」を参照するinclude文は、ソースファイルbにおいて、ヘッダファイル「b.h」を得るためのinclude文の前に発生する。ヘッダファイルcは、ヘッダファイル「b.h」を得るためのinclude文を含むが、ファイル「a」を得るためのinclude文は、含まない。ファイルを得るためのinclude文は、生成ソース「b」および生成ヘッダファイル「c」の両方において、生成ヘッダファイル「b1.h」を得るためのinclude文の前に、「a」を得るためのinclude文を分離器ステージ24bに挿入させる。すなわち、さらなるinclude文が、ヘッダファイル「c」内に生成される。基本的には、分離器ステージ24bは、生成ヘッダファイル「b1.h」を得るためのinclude文が挿入されるすべてのファイルにそのようなさらなるinclude文を挿入する。オプションとして、ファイル「a」を得るためのinclude文がすでに存在するファイルの場合、分離器ステージ24bは、さらなるinclude文を挿入するのを抑制してもよい。
【0043】
別の実施形態においては、マーカー情報が、前処理ファイル23a〜23cの一部が別のプリプロセッサファイル23a〜23cの一部としてすでに読み込まれているヘッダファイルを得るためのinclude文から発生することを指示する場合、全体的処理ステージ24aは、前処理ファイル23a〜23cのそれらの部分をスキップするように構成されてもよい。スキップすることによって、結果的に、スキップされた部分は、変更されないことになり、および/または、全体的処理には使用されないことになる。一般的には、全体的処理中にメモリ11においてスキップされた部分が占めるメモリ空間(もしあれば)は、再利用され、そのために、これらの部分のコピーまたはこれらの部分から得られる情報は、処理中、メモリ11に保持されない。全体的処理ステージ24aが、前処理ファイル23a〜23cを読み込み、マーカー情報を検出すると、全体的処理ステージ24aは、マーカー情報において識別されたヘッダファイルを決定し、ヘッダ識別情報を、マーカー情報においてすでに検出されているヘッダファイル識別情報のリストと比較し、識別情報がすでに検出されていれば、スキップする。
【0044】
一実施形態においては、全体的処理ステージは、第1の構文解析器および第2の構文解析器(例えば、異なるプログラム部分として実施される)を含む。構文解析器は、それ自身が知られており、前処理ファイルを読み込み、これらのファイルの構文的構造を決定し、そして、構文的位置に基づいて情報を抽出するのに役立つ。第1の構文解析器は、精密な文法を用いて構文解析するように構成され、その詳細な文法は、マークを付された情報の開始点と終了点との間に存在する詳細な情報を分析する。第2の構文解析器は、あまり精密ではない文法を構文解析するように構成され、そのあまり精密ではない文法は、マークを付された情報の開始点と終了点との間に存在するすべての情報を、廃棄された非構造化ブロックとして処理する。
【0045】
全体的処理ステージ24aが、ヘッダファイルからの情報の反復をスキップするような実施形態を使用する場合、それぞれのヘッダファイルから最初に検出された情報は完全なものであることが保証されるべきである。このために、前処理ファイルを全体的処理ステージ24aによって処理する順序は、好ましくは、ヘッダファイルを(上述したように)生成するのに使用されるべきそれぞれの前処理ファイルが、そのヘッダファイルを含むその他の前処理ファイルの前に処理されるようにうまく計画される。
【0046】
好ましくは、並べ替えステージが、全体的処理ステージ24aにおいて使用される。並べ替えステージは、まず最初に、前処理ファイル23a〜23cを任意の順序で読み込み、前処理ファイルを処理する順序を選択する。それに続いて、全体的処理ステージ24aが、選択された順序で、再度、前処理ファイルを読み込む。並べ替えのために、好ましくは、ソフトウェアコンポーネント間のさらなる「refers_to」関係に関する情報が、収集される。第1のソフトウェアコンポーネントが、第2のソフトウェアコンポーネントを使用するならば(例えば、第1のコンポーネントが、第2のコンポーネントによって定義された第2のクラスの変数を含む第1のクラスであれば)、その第1のソフトウェアコンポーネントは、第2のソフトウェアコンポーネントを参照すると言われる。
【0047】
図4は、表3および表4に示される例の前処理ファイルから得られたデータ構造におけるエンティティーおよび関係の例を示す。3つのソフトウェアコンポーネントF2、F1、および、F0が、定義されると仮定する(長方形として示される)。ソフトウェアコンポーネント間の矢印は、refers_to関係を示す。前処理ファイルF1およびF2は、円として示され、これらの前処理ファイルが実装を含むソフトウェアコンポーネントへのリンクを備える。マークを付されたファイルは、楕円として示され、ヘッダファイルが定義を含むソフトウェアコンポーネントへのリンクを備える。ソフトウェアコンポーネントにリンクされた前処理ファイルおよびヘッダファイルだけが、示される。したがって、例えば、前処理ファイルMainは、示されない。
【0048】
図4を参照して説明したように、並べ替えステージは、データ構造を構築する。ソースファイルの使用可能な順序を決定するために、並べ替えステージは、ソフトウェアコンポーネントを指示する順序リストを効果的に使用する。最初は、リストは、空である。並べ替えステージは、リストにまだ存在しておらずかつリストにまだ存在していないその他のソフトウェアコンポーネントによって参照されていない「遊離した」ソフトウェアコンポーネントを反復的に探索する。並べ替えステージは、遊離したソフトウェアコンポーネントをリストに加え、すべてのソフトウェアコンポーネントがリストに登録されてしまうまで、反復的に、次の遊離したソフトウェアコンポーネントの探索を繰り返す。ソフトウェアコンポーネントごとに、関連する前処理ファイル23a〜23dが、識別され、それがソフトウェアコンポーネントとimplemented_in関係にあれば、それは、関連すると言われる。
【0049】
全体的処理ステージ24aは、再度、前処理ファイル23a〜23cを読み込み、前処理ファイル23a〜23cは、リスト内における関連するソフトウェアコンポーネントの順序で読み込まれる。ソフトウェアコンポーネントに関連するものとして選択されなかったが特定のソフトウェアコンポーネントを実装する前処理ファイルは、いかなる時点においても読み込まれてよいが、特定のソフトウェアコンポーネントが参照するさらなるソフトウェアコンポーネントを実装する前処理ファイルの前には読み込まれない。
【0050】
例えば、図4に示される例の場合、並べ替えられた順序で、共通処理ステージ24aは、まず最初に、オリジナルファイルF2の前処理ファイルを読み込み、それに続いて、オリジナルファイルF1の前処理ファイルを読み込む。Mainのような、特定のコンポーネントを実装しないと確認されたその他のファイルは、その後に読み込まれる。
【0051】
好ましくは、上述したように、生成されたバージョンが作成されるファイル(例えば、F1およびF2)を得るための元々のinclude文に先行する先行include文(例えば、F0を得るための)は、自動的に、元々のinclude文(例えば、F1およびF2を得るための)に対応するinclude文が発生するすべての生成ファイルにコピーされる。
【0052】
別の方法として、あるいは、それに加えて、全体的ソース処理ステージ24aは、実装する前処理ファイルが検出されなかったソフトウェアコンポーネント(例えば、F0)のための補助的なダミー実装ソースファイルを生成してもよい。ダミー実装ソースファイルは、プリプロセッサ22に提供され、結果として得られた前処理ファイルは、全体的ソース処理ステージが前処理ファイルを選択された順序で読み込むときに、第2のパスにおいて使用される。ダミー実装ソースファイル(例えば、F0のソースファイル)は、関係のあるソフトウェアコンポーネントを定義するヘッダファイルを得るためのinclude文を含むにすぎない。第2のパスにおいて全体的処理ステージ24bによって読み込まれる順序内におけるダミー実装ソースファイルの位置が、生成ソースファイルに関して決定される。したがって、第2のパスにおいて、ヘッダファイルが初めて読み込まれるときに、関係のあるヘッダファイルの完全な拡張が前処理ファイルから読み込まれることが保証される。
【0053】
全体的処理ステージ24aが、毎回、読み込む順序を第2のパスのために選択する第1のパスとともに、2パス読み込み処理を使用することは好ましいことであるが、選択された順序は、並べ替えることなく、異なる第2のパスのために何回でも再利用されてよいことが分かる。これは、例えば、共通処理ステージ24aの次の実行のために、例えば、ソースファイル20a〜20cが変更された後に実施される実行のために選択された読み込み順序を記述する作成ファイルを生成することによって、実現されてもよい。
【0054】
さらに、前処理ファイルを読み込む順序を並べ替えること、および、ヘッダファイルの最初に検出された拡張だけを保持することは、好ましい実施形態ではあるが、保持されるべき拡張を選択するための別の実現可能な方法が、存在することを理解すべきである。例えば、修正された前処理ファイルが、生成されてもよく、ヘッダファイルから拡張された情報のための指示情報を備え、拡張された情報を保持すべきかどうかを指定する。それに続いて、修正された前処理ファイルが、全体的処理ステージ24aの次の実行において読み込まれ、ヘッダファイルからの指示された情報だけが、メモリ11に保持される。別の例として、ヘッダファイルの選択された前処理ファイルに関する識別情報が、2つの実行間の全体的処理ステージ24aにおいて保持されてもよく、それによって、第2の実行において、識別された前処理ファイルからのヘッダファイルからの情報だけが、メモリ11に保持される。
【0055】
さらに、読み込む順序を選択するのに使用されるデータ構造は、並べ替えと異なるその他の目的に使用されてもよいことが分かる。実際には、関連するデータ構造は、全体的処理ステージ24aによる処理の副産物であってもよい。
【0056】
C++ソースファイルおよびC++ヘッダファイルによって本発明を説明したが、ソースファイルのような複数のオリジナルファイルが、前処理され、それによって、ヘッダファイルのような共通ファイルからの情報が、前処理ファイル内に拡張されるのであれば、また、オリジナルファイルおよび共通ファイルのいくつかのバージョンが、前処理ファイルから生成されるのであれば、どのような処理にでも本発明が適用されてよいことが分かる。
【0057】
図5は、情報の流れを示し、すべてのファイルが、再利用のために生成されるとは限らない。例として、ソースファイル20cの1つは、生成ファイル25c(図示しない)の代わりに使用されるように示され、ヘッダファイル21の1つは、生成ヘッダファイル26c(図示しない)の代わりに使用されるように示される。ヘッダファイルの選択は、全体的処理ステージ24aに供給される命令に基づいてなされてもよい。命令は、例えば、ある種のクラスを識別してもよく、そのクラスの使用は、前処理ファイル23a〜23cにおけるクラスから修正されなければならない。この場合、全体的処理ステージ24aは、ソフトウェアコンポーネントのどちらが修正によって影響を受けるかを決定するためにrefers_to関係を使用し(それ自身が修正され、あるいは、影響を受けたコンポーネントを直接的または間接的に参照する)、そして、影響を受けたファイルのために、ソースファイル25a、25b、および、ヘッダファイル26a、26bだけを生成するように分離器ステージ24bに命令する。ヘッダファイルの新しいバージョンが生成されない場合、include文は、影響を受けていないヘッダファイル(のコピー)を参照して生成される。
【0058】
上述したように、本発明は、基本的には、複数の前処理ファイルに対して統合的な修正を自動的に行う全体的処理ステージ24aと組み合わせると有益であるが、本発明は、全体的処理ステージが人手による前処理ファイルの編集を可能にする場合に適用されてもよいことを理解すべきである。
【図面の簡単な説明】
【0059】
【図1】プログラムファイルを処理するためのシステムを示す図である。
【図2】情報処理構造を示す図である。
【図3】ファイル間の参照関係を示す図である。
【図4】データ構造を表現する図である。
【図5】情報処理構造を示す図である。
【符号の説明】
【0060】
10 記憶装置
11 プロセッサメモリ
12 プロセッサ
14 装置
16 ターゲットコンピュータ
17 ターゲットプログラムメモリ
18 ターゲットプロセッサ
20a〜20c オリジナルソースファイル
21 オリジナルヘッダファイル
22 プリプロセッサ
23a〜23c 前処理ファイル
24a 全体的処理ステージ
24b 分離器ステージ
25a〜25c 生成ソースファイル
26a〜26c 生成ヘッダファイル
27a〜27c 前処理ファイル
28 コンパイラ
29a〜29c オブジェクトファイル
200 リンカー
210 実行可能プログラム

【特許請求の範囲】
【請求項1】
ファイルを処理するための機械によって実行される方法であって、
複数のオリジナルファイルを提供するステップと、
前記オリジナルファイルの中のいくつかが参照する情報を含む1つかまたはそれ以上の共通ファイルを提供するステップと、
前記オリジナルファイルを前処理して、それぞれの前記オリジナルファイルが、それぞれの前処理ファイルを生成するステップであり、前記前処理が、第1の共通ファイルからの情報によって、前記オリジナルファイルの中のいくつかを拡張することを備える、前記生成するステップと、
全体的処理ステップを施して、統合的な変更を前記前処理ファイルからの情報に対して行うステップと、
選択されたファイルが前記第1の共通ファイルからの情報を詳述することを検出することに基づいて、前記前処理ファイルの中の1つを選択するステップと、
全体的処理ステップによって影響を受けた前記オリジナルファイルおよび前記第1の共通ファイルの再生成ファイルを再生成するステップであり、前記第1の共通ファイルのための前記再生成ファイルの前記再生成が、選択された前処理ファイルからの情報を用いて制御され、それによって、選択された前処理ファイル内の情報が、前記第1の共通ファイルの前記再生成ファイル内にどれだけ含められるかを制御する、前記再生成するステップと、
を備えた方法。
【請求項2】
まず最初に、前記第1の共通ファイルのための前記再生成ファイルからの情報を用いて、前記オリジナルファイルのための前記再生成ファイルを個々に処理し、それに続いて、前記オリジナルファイルのための前記再生成ファイルから得られた情報をリンクすることによって、機械命令のプログラムをリンクする第1のステップを備えた、請求項1に記載の方法。
【請求項3】
前記全体的処理ステージによって影響を受けたこれらオリジナルファイルおよび共通ファイルだけについて再生成ファイルを選択的に再生成し、影響を受けていないオリジナルファイルおよび共通ファイルを前記個々に処理するステップに使用するステップを備えた、請求項2に記載の方法。
【請求項4】
前記オリジナルファイルの中のいくつかが参照する情報が、ソフトウェアコンポーネントの構造の定義であり、前記選択されたファイルが、実装するプログラムを前記ソフトウェアコンポーネントの要素に提供することによって情報を詳述する、請求項1に記載の方法。
【請求項5】
前記選択するステップを実行するために、前処理ファイルを一回目に読み込むステップと、
前処理ファイルを二回目に読み込むステップであり、全体的処理を施すときに使用するために、第1の共通ファイルの拡張された情報のうち、選択された前処理ファイルからの拡張された情報だけが、コンピュータメモリに保持される、前記二回目に読み込むステップと、
を備えた、請求項1に記載の方法。
【請求項6】
前記選択するステップが、
前処理ファイル内におけるソフトウェアコンポーネントの実装を検出するステップと、
特定の前処理ファイルが、ソフトウェアコンポーネントの実装を含める場合、前記第1の共通ファイルからの情報を前記メモリに保持するために、その特定の前処理ファイルを選択するステップと、
を備えた、請求項5に記載の方法。
【請求項7】
前記二回目に読み込むときの前記前処理ファイルを読み込む順序が、前記一回目に読み込むときに予め選択され、前記順序内における特定の前処理ファイルの位置が、前記特定の前処理ファイルが1つかまたはそれ以上のさらなるソフトウェアコンポーネントを参照するソフトウェアコンポーネントの実装を含む場合には、その1つかまたはそれ以上のさらなるソフトウェアコンポーネントのすべての実装を含む1つかまたは複数の前処理ファイルの後に、特定の前処理ファイルが前記読み込む順序内に配置されるように、選択される請求項6に記載の方法。
【請求項8】
実装する前処理ファイルが検出されなかったそれぞれのソフトウェアコンポーネントごとに、前記ダミーファイルを生成し、前記二回目の読み込みの一部として、前記ダミーファイルを読み込むステップを備え、前記ダミーファイルを生成するステップが、前記ダミーファイルが生成される前記ソフトウェアコンポーネントを定義する前記共通ファイルを含めるための命令をそれぞれの特定の前記ダミーファイルに挿入し、かつ、前記ダミーファイルを前処理し、あるいは、前記挿入および前処理する代わりに、前記共通ファイルの拡張を前記ダミーファイルに挿入するステップを備えた、請求項7に記載の方法。
【請求項9】
前記前処理するステップが、
情報が前記前処理ファイル内に拡張された前記第1の共通ファイルおよび拡張された情報を識別するために、マーク情報を前記前処理ファイルに含めるステップを備え、
前記再生成するステップが、拡張された前記情報の代わりに命令を前記オリジナルファイルの前記再生成ファイルに挿入するために、前記マーク情報を使用するステップを備え、命令が、前記第1の共通ファイルの前記再生成ファイルを含めることを命令し、前記第1の共通ファイルは、前記前処理ファイル内に拡張されたものであり、
前記第1の共通ファイルの前記再生成ファイルが、選択された前記前処理ファイル内の前記マーク情報によってマークを付された拡張された情報から再生成される、
請求項1に記載の方法。
【請求項10】
前記オリジナルファイルの中のいくつかが参照する情報が、ソフトウェアコンポーネントの構造の定義であり、前記選択されたファイルが、実装するプログラムを前記ソフトウェアコンポーネントの要素に提供することによって、前記情報を詳述し、
選択された前記前処理ファイルが生成された前記オリジナルファイルの中の1つが、前記第1の共通ファイルからの情報を拡張するための第1の命令に先行して、さらなる共通ファイルからの情報を拡張するための先行命令を含んでいるかどうかを前処理ファイルごとに検出するステップと、
前記第1の共通ファイルを拡張するための命令が挿入されたそれぞれの再生成ファイル内において先行する前記命令の等価なコピーを生成するステップであり、前記等価なコピーが、前記第1の共通ファイルを拡張するための前記命令に先行して、挿入される、前記生成するステップと、
を備えた、請求項9に記載の方法。
【請求項11】
請求項1から請求項10までのいずれかに記載の前記方法を実行するための機械命令を含む、コンピュータプログラムプロダクト。
【請求項12】
複数のオリジナルファイルと前記オリジナルファイルのいくつかが参照する情報を含む1つかまたはそれ以上の共通ファイルとを記憶するための記憶システムと、プログラムされた処理システムとを備えた、ファイルを処理するようにプログラムされた機械であって、
前記処理システムが、
前記オリジナルファイルを前処理して、それぞれの前記オリジナルファイルが、それぞれの前処理ファイルを生成し、前記前処理が、第1の共通ファイルからの前記情報によって、前記オリジナルファイルの中のいくつかを拡張することを備え、
全体的処理ステップを施して、統合的な変更を前処理ファイルからの情報に対して行い、
選択された前記ファイルが前記第1の共通ファイルからの情報を詳述することを検出することに基づいて、前記前処理ファイルの中の1つを選択し、
前記全体的処理ステージによって影響を受けた前記オリジナルファイルおよび前記第1の共通ファイルの再生成ファイルを再生成し、前記第1の共通ファイルの前記再生成ファイルの前記再生成が、選択された前記前処理ファイルからの情報を用いて制御され、それによって、選択された前記前処理ファイル内の情報が、前記第1の共通ファイルの前記再生成ファイル内にどれだけ含められるかを制御するようにプログラムされた、機械。
【請求項13】
前記全体的処理ステップを施すために前記前処理されたファイルからの情報を記憶するためのメモリを備え、機械が、
前記選択を実行するために、前記前処理ファイルを一回目に読み込み、
その次に、前記全体的処理ステージのために、前記前処理ファイルを読み込み、全体的処理を施すときに使用するために、前記第1の共通ファイルの拡張された情報のうち、選択された前記前処理ファイルからの拡張された情報だけが、前記メモリに保持されるように構成された、
請求項12に記載の機械。
【請求項14】
前記選択が、
前記前処理ファイル内におけるソフトウェアコンポーネントの実装を検出するステップと、
その特定の前処理ファイルが、ソフトウェアコンポーネントの実装を含む場合、前記第1の共通ファイルからの情報を前記メモリに保持するために、その特定の前処理ファイルを選択するステップと、
を備えた、請求項13に記載の機械。
【請求項15】
前記二回目に読み込むときの前記前処理ファイルを読み込む順序が、前記一回目に読み込むときに予め選択され、前記順序内における特定の前処理ファイルの位置が、前記特定の前処理ファイルが1つかまたはそれ以上のさらなるソフトウェアコンポーネントを参照するソフトウェアコンポーネントの実装を含む場合には、その1つかまたはそれ以上のさらなるソフトウェアコンポーネントのすべての実装を含む1つかまたは複数の前処理ファイルの後に、前記特定の前処理ファイルが前記読み込む順序内に配置されるように、選択される請求項14に記載の機械。
【請求項16】
前処理が、
情報が前記前処理ファイル内に拡張された前記第1の共通ファイルおよび前記拡張された情報を識別するために、マーク情報を前処理ファイルに含めるステップを備え、
前記再生成するステップが、前記拡張された情報の代わりに命令を前記オリジナルファイルの再生成ファイルに挿入するために、マーク情報を使用するステップを備え、命令が、前記第1の共通ファイルの前記再生成ファイルを含めることを命令し、前記第1の共通ファイルは、前記前処理ファイル内に拡張されたものであり、
前記第1の共通ファイルの前記再生成ファイルが、選択された前記前処理ファイル内の前記マーク情報によってマークを付された拡張された情報から再生成される、
請求項12に記載の機械。
【請求項17】
前記オリジナルファイルの中のいくつかが参照する前記情報が、ソフトウェアコンポーネントの構造の定義であり、選択された前記ファイルが、実装するプログラムを前記ソフトウェアコンポーネントの要素に提供することによって、前記情報を詳述し、
前記処理システムが、
選択された前記前処理ファイルが生成された前記オリジナルファイルの中の1つが、前記第1の共通ファイルからの前記情報を拡張するための第1の命令に先行して、さらなる共通ファイルからの情報を拡張するための先行命令を含んでいるかどうかを前処理ファイルごとに検出し、
前記第1の共通ファイルを拡張するための命令が挿入されたそれぞれの再生成ファイル内の先行命令の等価なコピーを生成し、前記等価なコピーが、前記第1の共通ファイルを拡張するための命令に先行して、挿入される、
ように構成された、請求項16に記載の機械。

【図1】
image rotate

【図3】
image rotate

【図4】
image rotate

【図2】
image rotate

【図5】
image rotate


【公表番号】特表2006−523887(P2006−523887A)
【公表日】平成18年10月19日(2006.10.19)
【国際特許分類】
【出願番号】特願2006−506834(P2006−506834)
【出願日】平成16年4月13日(2004.4.13)
【国際出願番号】PCT/IB2004/050425
【国際公開番号】WO2004/092953
【国際公開日】平成16年10月28日(2004.10.28)
【出願人】(590000248)コーニンクレッカ フィリップス エレクトロニクス エヌ ヴィ (12,071)
【氏名又は名称原語表記】Koninklijke Philips Electronics N.V.
【住所又は居所原語表記】Groenewoudseweg 1,5621 BA Eindhoven, The Netherlands
【Fターム(参考)】