(57)【要約】【課題】プログラム言語で記述されたソースプログラムからコンピュータで実行可能な形式にコンパイルを行う際の期間短縮とコンパイル結果の品質向上を図る。【解決手段】第1と第2のソースプログラムを読み込んで、それぞれに対応する第1と第2の中間コードを生成するコンパイラ２０と、生成された第1と第2の中間コードを読み込んで、中間コード間の整合性の検証を行うと共に、オブジェクトコードを生成するコンパイラ４０を有する。【選択図】図１
2009026048.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータを用いて、記憶部に格納されているプログラミング言語で記述された第１と第２のソースプログラムに対して、コンピュータで実行可能な形式にコンパイルを行う方法であって、
前記第１のソースプログラムを読み込んで、第１の中間コードを生成する第１のコンパイル処理ステップと、
前記第２のソースプログラムを読み込んで、第２の中間コードを生成する第２のコンパイル処理ステップと、
前記第１と第２の中間コードを読み込んで、当該中間コード間の整合性検証を行うと共に、前記第１と第２の中間コードに対応したオブジェクトコードを生成する第３のコンパイル処理ステップとを有するコンパイル方法。
【請求項２】
前記第１の中間コードは、前記第１のソースプログラムが有する変数の型情報を含み、前記第２の中間コードは、前記第２のソースプログラムが有する変数の型情報を含み、前記第３のコンパイル処理ステップは、前記第１と第２の中間コードが有する変数の型情報に基づいて整合性を検証する請求項１に記載のコンパイル方法。
【請求項３】
前記第１の中間コードは、前記第１のソースプログラムが有する変数の配置情報を更に含み、前記第２の中間コードは、前記第２のソースプログラムが有する変数の配置情報を更に含み、前記第３のコンパイル処理ステップは、更に前記第１と第２の中間コードが有する変数の配置情報に基づいて整合性を検証する請求項２に記載のコンパイル方法。
【請求項４】
前記第１のコンパイル処理ステップは、前記第１のソースプログラムの構文解析を行うステップと、当該構文解析の結果に基づいて、前記第１のソースプログラムが有する変数の型情報に対応する中間コードを含めた前記第１の中間コードを生成するステップとを含み、
前記第２のコンパイル処理ステップは、前記第２のソースプログラムの構文解析を行うステップと、当該構文解析の結果に基づいて、前記第２のソースプログラムが有する変数の型情報に対応する中間コードを含めた前記第２の中間コードを生成するステップとを含み、
前記第３のコンパイル処理ステップは、前記第１と第２の中間コードが有する変数の型情報に基づいて中間コード間の整合性を検証するステップと、前記第１と第２の中間コードに対応したオブジェクトコードを生成するステップとを含む請求項１に記載のコンパイル方法。
【請求項５】
前記第１の中間コードを生成するステップは、前記第１のソースプログラムの構文解析の結果に基づいて、前記第１のソースプログラムが有する変数の配置情報に対応する中間コードを更に含めた前記第１の中間コードを生成し、
前記第２の中間コードを生成するステップは、前記第２のソースプログラムの構文解析の結果に基づいて、前記第２のソースプログラムが有する変数の配置情報に対応する中間コードを更に含めた前記第２の中間コードを生成し、
前記中間コード間の整合性を検証するステップは、更に前記第１と第２の中間コードが有する変数の配置情報に基づいて中間コード間の整合性を検証する請求項４に記載のコンパイル方法。
【請求項６】
プログラミング言語で記述された第１と第２のソースプログラムに対して、コンピュータで実行可能な形式にコンパイルを行うプログラムであって、
前記第１または第２のソースプログラムを読み込んで、第１または第２の中間コードを生成する第１のコンパイル処理ステップと、
前記第１と第２の中間コードを読み込んで、当該中間コード間の整合性検証を行うと共に、前記第１と第２の中間コードに対応したオブジェクトコードを生成する第２のコンパイル処理ステップとをコンピュータに実行させるためのプログラム。
【請求項７】
前記第１の中間コードは、前記第１のソースプログラムが有する変数の型情報を含み、前記第２の中間コードは、前記第２のソースプログラムが有する変数の型情報を含み、前記第２のコンパイル処理ステップは、前記第１と第２の中間コードが有する変数の型情報に基づいて整合性を検証する請求項６に記載のプログラム。
【請求項８】
前記第１の中間コードは、前記第１のソースプログラムが有する変数の配置情報を更に含み、前記第２の中間コードは、前記第２のソースプログラムが有する変数の配置情報を更に含み、前記第２のコンパイル処理ステップは、更に前記第１と第２の中間コードが有する変数の配置情報に基づいて整合性を検証する請求項７に記載のプログラム。
【請求項９】
前記第１のコンパイル処理ステップは、前記第１または第２のソースプログラムの構文解析を行うステップと、当該構文解析の結果に基づいて、前記第１または第２のソースプログラムが有する変数の型情報に対応する中間コードを含めた前記第１または第２の中間コードを生成するステップとを含み、
前記第２のコンパイル処理ステップは、前記第１と第２の中間コードが有する変数の型情報に基づいて中間コード間の整合性を検証するステップと、前記第１と第２の中間コードに対応したオブジェクトコードを生成するステップとを含む請求項６に記載のプログラム。
【請求項１０】
前記第１または第２の中間コードを生成するステップは、前記第１または第２のソースプログラムの構文解析の結果に基づいて、前記第１または第２のソースプログラムが有する変数の配置情報に対応する中間コードを更に含めた前記第１または第２の中間コードを生成し、
前記中間コード間の整合性を検証するステップは、更に前記第１と第２の中間コードが有する変数の配置情報に基づいて中間コード間の整合性を検証する請求項９に記載のプログラム。
【請求項１１】
プログラミング言語で記述された第１と第２のソースプログラムに対して、コンピュータで実行可能な形式にコンパイルを行うコンパイル処理装置であって、
前記第１または第２のソースプログラムを読み込んで、第１または第２の中間コードを生成する第１のコンパイル処理部と、
前記第１と第２の中間コードを読み込んで、当該中間コード間の整合性検証を行うと共に、前記第１と第2の中間コードに対応したオブジェクトコードを生成する第２のコンパイル処理部を備えるコンパイル処理装置。
【請求項１２】
前記第１の中間コードは、前記第１のソースプログラムが有する変数の型情報を含み、前記第２の中間コードは、前記第２のソースプログラムが有する変数の型情報を含み、前記第２のコンパイル処理部は、前記第１と第２の中間コードが有する変数の型情報に基づいて整合性を検証する請求項１１に記載のコンパイル処理装置。
【請求項１３】
前記第１の中間コードは、前記第１のソースプログラムが有する変数の配置情報を更に含み、前記第２の中間コードは、前記２のソースプログラムが有する変数の配置情報を更に含み、前記第２のコンパイル処理部は、前記第１と第２の中間コードが有する変数の配置情報に基づいて整合性を検証する請求項１２に記載のコンパイル処理装置。
【請求項１４】
前記第１のコンパイル処理部は、前記第１または第２のソースプログラムの構文解析を行う構文解析部と、当該構文解析の結果に基づいて、前記第１または第２のソースプログラムが有する変数の型情報に対応する中間コードを含めた前記第１または第２の中間コードを生成する中間コード生成部とを有し、
前記第２のコンパイル処理部は、前記第１と第２の中間コードが有する変数の型情報に基づいて中間コード間の整合性を検証する変数の型検証部と、前記第１と第２の中間コードに対応したオブジェクトコードを生成するオブジェクトコード生成部とを有する請求項１１に記載のコンパイル処理装置。
【請求項１５】
前記中間コード生成部は、前記第１または第２のソースプログラムの構文解析の結果に基づいて、前記第１または第２のソースプログラムが有する変数の配置情報に対応する中間コードを更に含めた前記第１または第２の中間コードを生成し、
前記変数の型検証部は、更に前記第１と第２の中間コードが有する変数の配置情報に基づいて中間コード間の整合性を検証する請求項１４に記載のコンパイル処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数モジュールからなるプログラム言語のコンパイル方法とプログラムに関する。
【背景技術】
【０００２】
C言語等のプログラミング言語が用いられたプログラム開発において、開発規模の増大に伴い、プログラムを機能毎に複数のモジュールに分割して分散、並列的に開発する手法がとられている。図１０を用いて一般的なプログラムの分散、並列開発方法を説明する。
【０００３】
図１０は、全体のプログラムが３個のモジュールに分割された場合で、ソースプログラム１０１、１０２、１０３は、各モジュールのソースプログラムに相当する。各ソースプログラムは個々にコンパイラ２００による処理が行われて、オブジェクトコード３０１、３０２、３０３が生成される。最終的に、各オブジェクトコードはリンカ４００によるリンク処理によって結合され、ロードモジュール５００が生成される。ロードモジュール５００はコンピュータが読み込み可能な形式のものであり、コンピュータに読み込まれて実行される。
【０００４】
このように、プログラムを複数のモジュールに分割した場合、それぞれのモジュールはコンパイル処理を含めて個々に分散して並列的に開発を進めることでき、また、特定のモジュールに問題が発生した場合は、そのモジュールの再コンパイル処理だけを行えばよく、全モジュールの再コンパイル処理は不要となるなど分散開発を効率的に行うことが可能となる。
【０００５】
リンク処理は、主に関数ライブラリや各オブジェクトコードの結合や、各オブジェクトコード間の変数や関数の結びつけが行われる。例えば、ソースプログラム１０１、１０２で共通使用する変数ａがあった場合、ソースプログラム１０１、１０２ともに図１１（ａ）のようなｉｎｔ型（整数型）で宣言すると、これらをコンパイルして生成されたオブジェクトコード３０１、３０２は、図１２（ａ）のようになる。一般に、オブジェクトコードは、コンピュータの機械語であるが、図１２ではわかりやすくするため、オブジェクトコードをアセンブリ言語に似た形式で表現している。
【０００６】
生成されるオブジェクトコードは、コンパイル処理を行うコンパイラやコンピュータの機種などに依存したコンパイル環境の情報が盛り込まれて生成される。例えば、整数型の変数は３２ビットが領域として割り当てられるコンパイル環境だとすると、図１１（ａ）のｉｎｔ ａという記述は、図１２（ａ）の“＿ａ：ｗｏｒｄ ０”というコンパイル環境に依存したオブジェクトコードに変換される。“＿ａ：ｗｏｒｄ ０”という表現は、アセンブリ言語の仕様にもよるが、ここでは変数ａに３２ビット、初期値０が割り当てられる、という意味である。
【０００７】
リンク処理では、これら変数に対して割り当てられている領域がチェックされ、同じであれば結びつけが問題なく行われるが、割り当てられている領域が異なれば、リンクエラーとなり、リンク処理は異常終了する。リンク処理において、リンクエラーが発生した場合は、各モジュールのソースプログラムをチェックして修正することになるが、これは開発工程において後戻りが発生することになる。
【０００８】
特許文献１には、図１０のコンパイラ２００に相当する技術が開示されており、ソースプログラムから中間表現を生成し、中間表現を最適化してオブジェクトコードを生成している。
【０００９】
特許文献２には、図１０のリンカ４００に相当した、複数のオブジェクトコードをリンクしてロードモジュールを生成する技術が開示されている。
【００１０】
特許文献３には、プログラムを対話形式で入力する言語処理装置において、コード生成（コンパイル処理）前に、入力されたプログラムの外部モジュールの呼び出し、外部データ参照が間違っていないかを早期に発見できる技術を開示している。具体的には、対話形式で入力されたプログラムに対して構文解析を行い、結果を構文解析中間語ファイルに保存する構文解析中間語生成手段と、構文解析中間語ファイルを参照して、入力されたプログラムの外部モジュール呼び出しが間違っていないかを検査するモジュール呼び出し検査手段と、構文解析中間言語ファイルを参照して、入力されたプログラムの外部データ参照が間違っていないかどうかを検査する外部データ参照検査手段を有することにより、上記効果を実現している。
【特許文献１】特開第３２８０４４９号
【特許文献２】特許第３１４９４２２号
【特許文献３】特開平６−８９１８４
【発明の開示】
【発明が解決しようとする課題】
【００１１】
上述した従来のコンパイル処理、リンク処理では、変数に割り当てられている領域によってリンクに問題ないかどうかを判断している。しかしながら、変数に割り当てられる領域は、コンパイル環境、すなわち、コンパイルを行うコンピュータの機種やコンパイル時に使用する変数の定義などによって決まるため、コンパイル環境によっては不具合が生じる場合がある。
【００１２】
不具合が生じる一例として、単精度浮動小数点（ｆｌｏａｔ型）を使ったプログラムのコンパイル処理が上げられる。単精度浮動小数点に割り当てられる領域は、上述の通りコンパイルの環境などによって変わるが、浮動小数点の定義の代表的なものとしてＩＥＥＥ７５４がある。
【００１３】
ＩＥＥＥ７５４に準拠した単精度浮動小数点では、割り当てられる領域は整数と同じく３２ビットと定義されている。従って、ソースプログラム１０１とソースプログラム１０２とで共通の変数ａを、ソースプログラム１０１では図１１（ａ）のようにｉｎｔ型で宣言し、ソースプログラム１０２では図１１（ｂ）のようにｆｌｏａｔ型で宣言してしまった場合、コンパイルして生成されるオブジェクトコード３０１、３０２は、図１２（ａ）（ｂ）のようなものとなる。これらのオブジェクトコード３０１、３０２に対してリンク処理を行うと、どちらのモジュールでも変数ａには同じ３２ビットの領域が割り当てられているため、リンクは正常に行われて、エラーが発生することなくロードモジュール５００が生成されてしまう。しかしながら、ｉｎｔ型とｆｌｏａｔ型とでは数値表現が異なるため、リンクが正常に終了したとしても、生成されたロードモジュール５００をコンピュータで実行した時に、演算結果の誤りや、予期せぬ動作をしてしまうなどの不具合が生じてしまう。
【００１４】
特許文献３の技術は、ソースプログラムを対話的な入力で作成する際に、外部モジュール呼び出し、外部データ参照の正当性を、構文解析中間語ファイルを用いて検証するもので、コンパイル処理前に事前に検証しようとするものである。すなわち、特許文献３の技術では、呼び出される側のプログラムが既に完成され、構文解析済みということが前提となる。この場合、あるモジュールの開発者は、別のモジュールのソースプログラムが出来あがるまで、コンパイルの処理を行うことができない。また、コンパイル処理を行った後に、別のモジュールのソースプログラムが修正された場合には、再度、ソースプログラムの開発工程に戻って、外部モジュール呼び出し、外部データ参照の正当性を検証し直さなければならない。これは、複数のモジュールを並列的に分散して開発した場合の開発期間の短縮のメリットが薄くなってしまうことになる。
【課題を解決するための手段】
【００１５】
本発明に係るコンパイル方法では、プログラミング言語で記述された第１のソースプログラムを読み込んで、第1の中間コードを生成する第１のコンパイル処理ステップと、プログラミング言語で記述された第2のソースプログラムを読み込んで、第2の中間コードを生成する第2のコンパイル処理ステップと、生成された第１と第2の中間コードを読み込んで、中間コード間の整合性検証を行うと共に、第1と第2の中間コードに対応したオブジェクトコードを生成する第３のコンパイル処理ステップとを有していることを特徴とする。
【発明の効果】
【００１６】
本発明に係るコンパイル・プログラムによれば、プログラム言語で記述されたソースプログラムからコンピュータで実行可能な形式にコンパイルを行う際の期間短縮と、コンパイル結果の品質向上に有益である。
【発明を実施するための最良の形態】
【００１７】
以下、添付した図面を参照して本発明の実施の形態について説明する。
［第1の実施形態］
【００１８】
図１は、本発明の実施の形態に係るコンパイル方法の全体フローチャートである。図１を参照すると、複数のソースプログラム１１、１２、１３がコンパイラ２０に入力され、中間コード３１、３２、３３がそれぞれ生成される。中間コード３１、３２、３３はコンパイラ４０に入力され、各中間コードが結合されてオブジェクトモジュール５０が生成される。オブジェクトコード５０は、リンカ６０に入力されて最終的にコンピュータで実行可能な形式であるロードモジュール７０が生成される。オブジェクトコード５０の生成までが本願発明の特徴部分であり、詳細は後述する。
【００１９】
図２はコンパイラ２０、４０の構成図である。字句解析部２１は、ソースプログラムを読み込んでトークンに分解する。構文解析部２２は、字句解析結果に基づいてプログラムの構文を解析する。ツリー構造の構文木の構築といった手法がとられる。中間コード生成部２３は、構文解析の結果に基づいて、コンパイルを行うコンピュータの機種やコンパイル時に使用する変数の定義などのコンパイル環境に依存しない中間コードを生成する。中間コード結合部２４は、複数の中間コードを入力として、中間コードを結合（リンク）すると共に、各中間コードに存在している変数の型の整合性の検証、変数の配置の検証を行う。最適化処理部２５は、結合された中間コードに対して、オブジェクトコード生成の段階で実行効率の高いコードとなるように最適化処理を行う。オブジェクトコード生成部２６は、最適化された中間コードに基づいて、コンピュータの機械語で表現されるオブジェクトコードを生成する。
【００２０】
なお、図２では、コンパイラ２０と４０が１つのコンパイラで構成された場合で説明している。この場合、入力がソースプログラムか中間コードかによって、コンパイラ２０の処理を行うか、コンパイラ４０の処理を行うかが決まることになる。入力がソースプログラムの場合は、２１、２２、２３の各処理を行うコンパイラ２０として動作し、入力が中間コードの場合は、２４、２５、２６の各処理を行うコンパイラ４０として動作する。ただし、この形態に限らず、コンパイラ２０と４０とが分離されたコンパイラであっても何ら問題ない。
【００２１】
図３〜６を用いて更に詳細に説明する。図５（ａ）はソースプログラム１１、（ｂ）はソースプログラム１２の記述例である。変数ａがソースプログラム１１ではｉｎｔ型、ソースプログラム１２ではｆｌｏａｔ型で宣言されている。変数ａは本来ならどちらかの型にあわせるべきものだが、本発明の特徴を説明するために故意に誤った宣言としている。
【００２２】
図３は、ソースプログラム１１（１２、１３）から中間コード３１（３２、３３）を生成するためのコンパイルの処理フローである。ソースプログラム１１（１２、１３）に対して、字句解析７１、構文解析７２、中間コード生成７３の一連の処理が行われて、中間コードが生成される。字句解析、構文解析、中間コードの生成処理については、従来のコンパイラが有する機能を利用することができるため、概略を以下で説明する。
【００２３】
中間コード生成７３は、字句解析７１、構文解析７２の結果と、変換ルール７４に基づいて、ソースプログラム１１（１２、１３）から中間コード３１（３２、３３）を生成する。図６（ａ）は図５（ａ）のソースプログラム１１から生成された中間コードの一例を示すもので、図６（ｂ）は図５（ｂ）のソースプログラム１２から生成された中間コードの一例である。
【００２４】
中間コード生成７３によって生成される中間コードは、コンパイル処理を行うコンピュータの機種やコンパイル時に使用する変数の定義などに依存しない、すなわちコンパイル環境に依存しないコードである。
【００２５】
変換ルール７４には、ソースプログラムをコンパイル環境に依存しない中間コードに変換するための情報が格納されている。具体的には、ソースプログラム中に記述されている変数の型宣言に対応した中間コード情報や、ソースプログラム中の各演算に対応した中間コード情報などが格納されている。
【００２６】
上記中間コードの生成を、図５（ａ）（ｂ）、図６（ａ）（ｂ）で具体的に説明する。中間コード生成７３は、字句解析７１、構文解析７２によって、図５（ａ）で示すソースプログラム１１の１行目（ｉｎｔ ａ）が整数型の変数ａの宣言部分であることを認識し、この部分に対して図６（ａ）で示すような、＿ａ：ＶＡＲＤＥＦ ＩＮＴという中間コードを生成する。＿ａは変数ａの意味であり、ＶＡＲＤＥＦ ＩＮＴは、変換ルール７４に基づいて、変数ａがＩＮＴ型であることを明示するために生成された中間コードである。
【００２７】
図５（ａ）中のａ＝１という代入演算については、図６（ａ）に示すように、代入演算に対応したＬＯＡＤ、ＳＴＯＲＥという演算コードで構成された中間コードが生成される。
【００２８】
図５（ｂ）で示すソースプログラム１２の場合も同様に、中間コード生成７３は、１行目が単精度浮動小数点型の変数ａの宣言部分であることを認識し、この部分に対して図６（ｂ）に示すような、＿ａ：ＶＡＲＤＥＦ ＦＬＯＡＴという中間コードを生成する。ＶＡＲＤＥＦ ＦＬＯＡＴは、変数ａがＦＬＯＡＴ型であることを明示するために生成された中間コードである。図５（ｂ）中のａ＝１．０という代入演算については、図６（ｂ）のようなＬＯＡＤ、ＳＴＯＲＥという演算コードで構成された中間コードが生成される。
【００２９】
次に、図４を用いて、中間コード３１、３２、３３からオブジェクトコード５０を生成するためのコンパイラ４０の処理フローを説明する。中間コード結合８１は、中間コード３１、３２、３３を入力としてリンク処理を行うと共に、変数の型検証８２で、中間コード３１、３２、３３間の変数の型の整合性の検証を行う。変数の型検証８２で不一致が発生した場合は、コンパイル処理は関連するエラーを出力すると共に異常終了となる。不一致がなければ、結合された中間コード３１、３２、３３は最適化処理８３、オブジェクトコード生成８４を経てオブジェクトコード５０が生成される。結合された中間コードに対する最適化、オブジェクトコード生成については、従来のコンパイラが有する機能と同じ技術を利用することができる。
【００３０】
変数の型検証８２では、各中間コードから変数の型宣言を行っている中間コード、すなわちＶＡＲＤＥＦ部分を検索、抽出して中間コード間の変数の型の整合性を検証する。中間コード３１、３２が図６の（ａ）（ｂ）のような内容であった場合、中間コード３１では、＿ａ：ＶＡＲＤＥＦ ＩＮＴという中間コードから、変数ａ（＿ａ）がＩＮＴ型となっていることがわかり、同様に中間コード３２では変数ａがＦＬＯＡＴ型になっていることがわかる。この場合、変数の型検証８２において、型の不一致が検出されることになり、コンパイル処理はエラーを出力して異常終了となる。
【００３１】
プログラム開発者は、この異常終了によって、プログラムソース１１、１２のどちらかの変数ａの型宣言が誤っていることが判る。従って、プログラムソース１２の変数ａの型宣言をｉｎｔ型に修正（当然、変数ａに関連する他の部分も修正）し、プログラムソース１２の再コンパイル処理をすることで、正常に動作するオブジェクトコード、ロードモジュールを生成することができる。
【００３２】
本実施の形態では、ｉｎｔ型、ｆｌｏａｔ型を例として説明したが、その他ｄｏｕｂｌｅ型、ｓｈｏｒｔ型、ｌｏｎｇ型などにも適用可能なことは言うまでもない。
［第２の実施の形態］
【００３３】
図７は、第２の実施の形態に係る中間コード３１（３２、３３）から、オブジェクトコード５０を生成するためのコンパイルの処理フローである。
【００３４】
変数の配置検証８５は、中間コード間における変数の配置の整合性を検証するものである。
【００３５】
ここで変数の配置の意味を説明する。変数の配置とは、一般にアセンブリ言語で用いられるセクションのことである。アセンブリ言語では、セクションと呼ばれる管理領域を設定することにより、定数、文字列、変数をその性質に応じて管理することができる。そして、ロードモジュールがコンピュータで実行される際に、セクションの種類に応じた処理が行われることになる。例えば、変数と定数とでは、異なるセクションが設定され、変数のセクションに配置された各変数は、実行時、書込み可能なメモリ領域に割り当てられて初期値が書き込まれる。定数のセクションに配置された各定数は、書き換えが起こることはないため、実行時、適当なメモリ領域に割り当てられて定数値が書き込まれる。
【００３６】
セクションの情報はＣ言語などの高級言語では使われず、コンパイラがコンパイル環境に応じて自動生成することによりオブジェクトコードに盛り込まれる。ただし、例えば組み込み用マイクロプロセッサなどのように、メモリ空間に制限があるといった場合は、プログラム開発者がセクション情報をＣ言語の段階で明示的に指定する場合がある。この場合は、コンパイルに対して指定を行うことになるが、コンパイラに対するセクション、すなわち変数の配置指定は、変数の型と同様、各ソースプログラム間で整合性が取れていなければならない。
【００３７】
図３、図７〜９を用いて詳細に説明する。図８（ａ）はソースプログラム１１、（ｂ）はソースプログラム１２の記述例である。ソースプログラム１１では、変数ａがｉｎｔ型で宣言され、ソースプログラム１２では、他のソースプログラム（ここではソースプログラム１１）の変数ａの宣言を参照（ｅｘｔｅｒｎ）している。ソースプログラム１１、１２それぞれの１行目の＃ｐｒａｇｍａは、コンパイラに対して変数の配置を指定する記述であり、一般に、コンパイラのプリプロセッサと呼ばれる機能の１つである。ソースプログラム１１では、変数ａをｄａｔａ１というセクションに配置するように指定している。一方、ソースプログラム１２では、変数ａをｄａｔａ２というセクションに配置するように指定している。本来は、同じ配置指定をしなければならないものであるが、ここでは誤って指定してしまった場合を想定している。
【００３８】
ソースプログラム１１、１２は図３の示すフローに基づいて中間コード３１、３２が生成される。変換ルール７４には、実施の形態１のルールに加え、＃ｐｒａｇｍａが指定している配置情報を中間コードに埋め込むルールが追加されている。
【００３９】
図９（ａ）はソースプログラム１１から生成された中間コード３１である。変換ルール７４に基づき、変数の配置情報であるＡＴ ｄａｔａ１という中間コードがＶＡＲＤＥＦと共に生成されている。同様に、図９（ｂ）はソースプログラム１２から生成された中間コード３２であり、変数の配置情報であるＡＴ  ｄａｔａ２という中間コードがＶＡＲＤＣＬと共に生成されている。なお、ＶＡＲＤＣＬは、ソースプログラム１２のｅｘｔｅｒｎに対応した中間コードであり、これも変換ルール７４に登録される。
【００４０】
図７の変数の配置検証８５は、中間コード３１と３２とで、参照が行われている変数、すなわちＶＡＲＤＥＦ ＩＮＴ ＡとＶＡＲＤＣＬ ＩＮＴ Ａという情報から変数ａを抽出し、また、その変数ａの配置情報、すなわちＡＴ部分を検索、抽出して中間コード間の変数の配置の整合性を検証する。中間コード３１では、変数ａの配置セクションはｄａｔａ１であり、中間コード３２では、変数ａの配置セクションはｄａｔａ２であるから、この場合は不一致となりコンパイル処理は異常終了となる。
【００４１】
プログラム開発者は、この異常終了によって、ソースプログラム１１、１２のどちらかの変数の配置指定が誤っていることが判り、例えば、ソースプログラム１２の配置指定を修正、再コンパイルすることで正常に動作するオブジェクトコード、ロードモジュールを生成することができる。
【００４２】
このように、本実施の形態によれば、オブジェクトコードを生成する前に中間コードを生成し、中間コードを用いて各モジュール間の整合性を検証するため、プログラムソース上の問題を早期に発見することが可能となり、開発期間の短縮に有効である。また、従来のコンパイル手法では、リンク処理時には検出できずに、プログラムの実行の段階でバグが発覚してしまうという問題を有していたが、本実施例ではこれを抑制することが可能となるため開発したプログラムの品質向上に有効である。
【００４３】
上記した図１のコンパイラ２０、コンパイラ４０、図２、図３、図４の各処理は、コンピュータで実行されるプログラムで実現される。
【図面の簡単な説明】
【００４４】
【図１】本発明の一実施例のフローチャートである。
【図２】図１に示した実施例におけるコンパイラ２０、４０を構成するコンパイラのブロック図である。
【図３】図１に示したコンパイラ２０の処理内容を示すフローチャートである。
【図４】図１に示したコンパイラ４０の処理内容を示すフローチャートである。
【図５】図１に示したソースプログラム１１、１２の一実施例である。
【図６】図１に示した中間コード３１、３２の一実施例である。
【図７】第２の実施の形態に係るコンパイラ４０の処理内容を示すフローチャートである。
【図８】第２の実施の形態に係るソースプログラム１１、１２の一実施例である。
【図９】第２の実施の形態に係る中間コード３１、３２の一実施例である。
【図１０】従来におけるコンパイル処理フローである。
【図１１】従来におけるソースプログラム１０１、１０２の例である。
【図１２】従来におけるオブジェクトコード３０１、３０２の例である。
【符号の説明】
【００４５】
１１、１２、１３・・・ソースプログラム
２０・・・コンパイラ
３１、３２、３３・・・中間コード
４０・・・コンパイラ
５０・・・オブジェクトコード
７３・・・中間コード生成
７４・・・変換ルール
８１・・・中間コード結合
８２・・・変数の型検証
８５・・・変数の配置検証
【図１】
2009026048.tif 000003
【図２】
2009026048.tif 000004
【図３】
2009026048.tif 000005
【図４】
2009026048.tif 000006
【図５】
2009026048.tif 000007
【図６】
2009026048.tif 000008
【図７】
2009026048.tif 000009
【図８】
2009026048.tif 000010
【図９】
2009026048.tif 000011
【図１０】
2009026048.tif 000012
【図１１】
2009026048.tif 000013
【図１２】
2009026048.tif 000014