(57)【要約】【課題】重複引数に関する文法エラーをプログラム実行時に検出し、プログラムのデバッグ効率を高めることを目的としている。【解決手段】本発明のコンパイラプログラムは、呼出元手続きから呼出先手続きに実引数の配列の大きさ値を受け渡す処理、呼出先手続きが使用するすべての仮引数に対して、仮引数が大きさ引き継ぎ配列の場合には実引数の大きさ値から、仮引数が大きさ引継ぎ配列でない場合は仮引数の配列の大きさから、仮引数としての変数の範囲を算出し、呼出先手続きの識別情報、変数名、配列の存在位置を表す情報を含む仮引数情報を作成する処理、および呼出先手続きにおいて変数の値が確定されると、確定された変数が仮引数である場合、呼出先手続きが使用する仮引数を除く他の仮引数の仮引数情報を参照して、他の仮引数の変数範囲と重複しているかどうかを判定する処理を行うオブジェクトコードを生成する。【選択図】　　　図１
2004021429.tif 000002
【特許請求の範囲】
【請求項１】
ソースプログラムから実引数の配列の大きさ値を算出し、呼出元手続きから呼出先手続きに前記実引数の配列の大きさ値を受け渡す処理を行うオブジェクトコードを生成する大きさ値生成手段と、
前記呼出先手続きが使用するすべての仮引数に対して、仮引数が大きさ引継ぎ配列の場合には前記実引数の大きさ値から、仮引数が大きさ引継ぎ配列でない場合は仮引数の配列の大きさから、仮引数としての変数の範囲を算出し、前記呼出先手続きの識別情報、変数名、配列の存在位置を表す情報を含む仮引数情報を作成する処理を行うオブジェクトコードを生成する仮引数情報生成手段と、
前記呼出先手続きにおいて変数の値が確定されると、確定された変数が仮引数である場合、前記呼出先手続きが使用する前記仮引数を除く他の仮引数の仮引数情報を参照して、他の仮引数の変数範囲と重複しているかどうかを判定処理するオブジェクトコードを生成する重複判定手段と
してコンピュータを機能させるコンパイラプログラム。
【請求項２】
前記重複判定手段は、確定された変数が仮引数でない場合、前記呼出先手続きが使用するすべての仮引数情報を参照して、前記変数が仮引数の変数範囲と重複しているかどうかを判定するオブジェクトコードを生成する、請求項１記載のコンパイラプログラム。
【請求項３】
前記重複判定手段は、確定された変数が他の仮引数の変数範囲と重複していることを判定すると、前記確定された変数の名前、変数が確定された文の行番号、前記確定された変数と結合されている仮引数の名前を含むメッセージを出力するオブジェクトコードを生成する、請求項１、または請求項２記載のコンパイラプログラム。
【請求項４】
ソースプログラムから実引数の配列の大きさ値を算出し、呼出元手続きから呼出先手続きに前記実引数の配列の大きさ値を受け渡す処理を行うオブジェクトコードを生成する大きさ値生成手段と、
前記呼出先手続きが使用するすべての仮引数に対して、仮引数が大きさ引継ぎ配列の場合には前記実引数の大きさ値から、仮引数が大きさ引継ぎ配列でない場合は仮引数の配列の大きさから、仮引数としての変数の範囲を算出し、前記呼出先手続きの識別情報、変数名、配列の存在位置を表す情報を含む仮引数情報を作成する処理を行うオブジェクトコードを生成する仮引数情報生成手段と、
前記呼出先手続きにおいて変数の値が確定されると、確定された変数が仮引数である場合、前記呼出先手続きが使用する前記仮引数を除く他の仮引数の仮引数情報を参照して、他の仮引数の変数範囲と重複しているかどうかを判定処理するオブジェクトコードを生成する重複判定手段と
してコンピュータを機能させるコンパイラプログラムを記録したコンピュータ読み取り可能な記録媒体。
【請求項５】
ソースプログラムから実引数の配列の大きさ値を算出し、呼出元手続きから呼出先手続きに前記実引数の配列の大きさ値を受け渡す処理を行うオブジェクトコードを生成する大きさ値生成手段と、
前記呼出先手続きが使用するすべての仮引数に対して、仮引数が大きさ引継ぎ配列の場合には前記実引数の大きさ値から、仮引数が大きさ引継ぎ配列でない場合は仮引数の配列の大きさから、仮引数としての変数の範囲を算出し、前記呼出先手続きの識別情報、変数名、配列の存在位置を表す情報を含む仮引数情報を作成する処理を行うオブジェクトコードを生成する仮引数情報生成手段と、
前記呼出先手続きにおいて変数の値が確定されると、確定された変数が仮引数である場合、前記呼出先手続きが使用する前記仮引数を除く他の仮引数の仮引数情報を参照して、他の仮引数の変数範囲と重複しているかどうかを判定処理するオブジェクトコードを生成する重複判定手段と
を有することを特徴とするコンパイラ装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、Ｆｏｒｔｒａｎ、Ｃ言語など、仮引数と結合した要素に関する制限を持つ仕様が存在する計算機言語で記述されたプログラムが、その制限に違反するとプログラム実行時に検出可能なオブジェクトプログラムを生成するコンパイラに関し、特にランタイムライブラリと連携させて重複引数に関する文法エラーを検出する技術に関する。
【０００２】
【従来の技術】
上記の、仮引数と結合した要素に関する言語仕様のもつ制限事項とは、以下を指す。
（イ）同じ手続の二つの異なる仮引数と結合された実引数が重なって結合された場合、重なった部分は、手続の実行中に確定してはならない。
（ロ）手続で仮引数と結合された実引数の変数は、手続の実行中に仮引数以外を通して確定してはならない。
【０００３】
以下に図３、図４を用いて具体的に上記制限事項について説明する。
図３は、上記制限事項（イ）に関連するＦｏｒｔｒａｎで記述したソースプログラムの例が示してある。文（２）は、サブルーチンＳＵＢ１を呼び出す際に、第一引数は、Ａ（１），Ａ（２），・・・，Ａ（１０）と結合され、第二引数は、Ａ（５），Ａ（６），・・・，Ａ（１０）と結合されることを表している。文（５）は、サブルーチンＳＵＢ１の第一引数であるＡの配列宣言である。Ａは１次元の配列であり、要素数の上限値に＊が指定されているため、配列の大きさは呼び出し元の配列の大きさが引き継がれる。そのため、Ａ（１），Ａ（２），・・・，Ａ（１０）は実引数ＡＲＲＡＹ（１），ＡＲＲＡＹ（２），・・・，ＡＲＲＡＹ（１０）と結合される。
【０００４】
文（６）は、サブルーチンＳＵＢ１の第二引数であるＢの配列宣言である。ＢもＡと同様に、Ｂ（１），Ｂ（２），・・・Ｂ（６）は実引数ＡＲＲＡＹ（５），ＡＲＲＡＹ（６），・・・ＡＲＲＡＹ（１０）と結合される。実引数ＡＲＲＡＹ（５），ＡＲＲＡＹ（６），・・・ＡＲＲＡＹ（１０）は、同じ手続き（サブルーチンＳＵＢ１）の二つの異なる仮引数ＡとＢで重なって結合されるため、手続きの実行中に確定してはならない。言い換えると、Ａ（５），Ａ（６），・・・Ａ（１０）、およびＢ（１），Ｂ（２），・・・Ｂ（６）は、値を確定してはならないことになり、文（８）と文（９）は文法上、誤った記述である。
【０００５】
図４は、上記制限事項（ロ）に関連したＦｏｒｔｒａｎで記述したソースプログラムの例が示してある。文（２）は、サブルーチンＳＵＢ２を呼び出す際に、仮引数がＡ（３）と宣言されているため、引数はＡ（５），Ａ（６），Ａ（７）と結合することを表している。文（５）は、サブルーチンＳＵＢ２の引数であるＡの配列宣言である。呼出元手続きと、呼出先手続き（サブルーチンＳＵＢ２）が親子結合の関係にあるため、ＡＲＲＡＹは呼出元手続きと、呼出先手続きで共有することが可能である。
【０００６】
しかしながら、上記（ロ）の制限事項により手続（サブルーチンＳＵＢ２）で仮引数Ａと結合された実引数（ＡＲＲＡＹ（５），ＡＲＲＡＹ（６），ＡＲＲＡＹ（７））の変数は、手続の実行中に仮引数Ａ以外を通して確定してはならない。言い換えると、ＡＲＲＡＹ（１），ＡＲＲＡＹ（２），ＡＲＲＡＹ（３），ＡＲＲＡＹ（４），ＡＲＲＡＹ（８），ＡＲＲＡＹ（９），ＡＲＲＡＹ（１０），Ａ（１），Ａ（２），Ａ（３）はサブルーチンＳＵＢ２から値の確定が可能であり、ＡＲＲＡＹ（５），ＡＲＲＡＹ（６），ＡＲＲＡＹ（７）はＡを通してのみ確定することが可能であるため、文（７）は文法上、誤った記述である。
【０００７】
しかしながら、２つの異なる仮引数と結合した実引数の間で重複する部分があっても、値を変更するのではなく、参照するだけでは上記制限事項には違反したことにはならない。また、呼び出された手続きから、更に他の手続きが呼び出され、そこで値が確定される場合があったり、コンパイル単位が呼出元手続きと呼出先手続きで異なる場合もあるので上記制限事項に違反したプログラムについて、すべてコンパイル時に文法エラーとすることはできない。
【０００８】
第２５０２１２８号公報に記載の「コンパイラ装置」には、コンパイラは、ソースプログラムの翻訳（コンパイル）時に、プログラム中に他の手続きを引用する呼出文があると、複数の引数があるかどうかを判定し、複数の引数がある場合、さらにそれらの領域が重複する可能性があるかどうかを調べ、領域が重複する可能性がある場合、コンパイラは以下の処理を行うオブジェクトを生成することにより、上記仮引数と結合した要素に関する言語仕様のもつ制限事項（イ）に違反したプログラムを、実行時に文法エラーとして検出し、プログラムのデバッグを簡単に行うことを可能とする技術について開示されている。
（ａ）各実引数の領域の大きさを調べ、その大きさの新たな領域を動的に確保する。
（ｂ）動的に確保した各領域に、対応する引数の内容を複写する。
（ｃ）動的に確保した領域を引数として、指定された処理手続きを呼び出す。
（ｄ）呼び出した処理手続きからの復帰時に、呼び出した処理手続きに渡した領域の内容の比較により、領域が重複する部分について値の変更があるか否かを判定する。
（ｅ）重複する部分の値の変更があるとき、エラーメッセージを出力する。
【０００９】
【発明が解決しようとする課題】
しかしながら、第２５０２１２８号公報に記載の「コンパイラ装置」では、上記の、仮引数と結合した要素に関する言語仕様のもつ制限事項（ロ）に違反したプログラムの実行時の検出は不可能であった。また、仮引数と結合した要素に関する言語仕様のもつ制限事項（イ）に違反したプログラムに対しても、制限事項を犯したことは判定できるが、手続きからの復帰時に、その手続きのどこで制限事項を犯したかは不明であった。
【００１０】
更に、実引数に対して、新たに領域を動的に確保し、確保した領域に引数の内容を複写したり、呼び出した処理手続きからの復帰時に、呼び出した処理手続きに渡した領域の内容を比較する際にも、引数の複写が必要な場合がある。そのため、大きな配列を引数とするような処理においては、多量のメモリ領域を必要とし、かつメモリ領域の動的確保や複写のために非常に多くの実行時間を要する。特にＤＯループの中に、大きな配列を引数とする手続き呼び出しが存在する場合には、従来技術では実行時間が掛かり過ぎ、実質的には適用できない場合もある。
【００１１】
本発明は、上記のような事情に鑑みて提案されたものであり、重複引数に関する文法エラーをプログラム実行時に検出し、プログラムのデバッグ効率を高めることを目的としている。
【００１２】
【課題を解決するための手段】
図１は本発明の実施の形態１の全体構成図を示すものである。本発明のコンパイラプログラム１０は、コンピュータを用いて利用者が作成したソースプログラム２を入力として、従来のコンパイラプログラムのソース解析部１１に、新たに仮引数情報生成手段１１２と、重複判定手段１１３を追加して、既存の大きさ値生成手段１１１と連携させて重複引数に関する値変更エラーをプログラム実行時に検出できるように機能追加したオブェクトプログラム３を生成するものである。
【００１３】
大きさ値生成手段１１１は、ソースプログラム２から実引数の配列の大きさ値を算出し、呼出元手続きから呼出先手続きに前記実引数の配列の大きさ値を受け渡す処理を行うオブジェクトコードを生成する。仮引数情報生成手段１１２は、前記呼出先手続きが使用するすべての仮引数に対して、仮引数が大きさ引継ぎ配列の場合には前記実引数の大きさ値から、仮引数が大きさ引継ぎ配列でない場合は仮引数の配列の大きさから、仮引数としての変数の範囲を算出し、前記呼出先手続きの識別情報、変数名、配列の存在位置を表す情報を含む仮引数情報を作成する処理を行うオブジェクトコードを生成する。重複判定手段１１３は、前記呼出先手続きにおいて変数の値が確定されると、確定された変数が仮引数である場合、前記呼出先手続きが使用する前記仮引数を除く他の仮引数の仮引数情報を参照して、他の仮引数の変数範囲と重複しているかどうかを判定処理するオブジェクトコードを生成する。
【００１４】
このようにして翻訳されたオブジェクトプログラム３は、確定された変数が仮引数である場合、他の仮引数の変数範囲と重複しているかどうかを判定するオブジェクトコードが生成されるため、連係編集され実行形式プログラムに変換されると、仮引数と結合した要素に関する言語仕様のもつ制限事項（イ）に違反していた場合、実引数に対して、新たに領域を動的に確保し、確保した領域に引数の内容を複写したり、呼び出した処理手続きからの復帰時に、呼び出した処理手続きに渡した領域の内容を比較する際にも、引数の複写を行うことなく、プログラム実行時に文法エラーとして検出することが可能となる。
【００１５】
なお、大きさ値生成手段が呼出元手続きから呼出先手続きに実引数の配列の大きさ値を受け渡すためには、呼出元手続きから呼出先手続きに渡すパラメタ内に含めるように実装してもよいし、呼出元プログラムを制御するための制御テーブルに格納しておき、呼出先プログラムが制御テーブルから取り出すように実装してもよい。
【００１６】
また、重複判定手段１１３は、確定された変数が仮引数でない場合、呼出先手続きが使用するすべての仮引数情報を参照して、前記変数が仮引数の変数範囲と重複しているかどうかを判定するオブジェクトコードを生成すると、仮引数と結合した要素に関する言語仕様のもつ制限事項（ロ）に違反していた場合、プログラム実行時に文法エラーとして検出することが可能となる。
【００１７】
更に、重複判定手段１１３は、確定された変数が他の仮引数の変数範囲と重複していることを判定すると、前記確定された変数の名前、変数が確定された文の行番号、前記確定された変数と結合されている仮引数の名前を含むメッセージを出力するオブジェクトコードを生成すると、利用者はメッセージを参照するだけで、利用者のプログラムが上記仮引数と結合した要素に関する言語仕様のもつ制限事項に違反した場合、変数を確定した文の行番号、確定された変数の名前、確定された変数と結合されている仮引数の名前が分かり、プログラムのデバッグ効率を高めることが可能となる。
【００１８】
【発明の実施の形態】
図１は本発明の実施の形態１の全体構成図を示してある。コンパイラ装置１では、利用者が作成したソースプログラム２を入力として、オブジェクトプログラム３を生成するコンパイラプログラム１０が実行される。コンパイラプログラム１０は、従来よりソース解析部１１、最適化部１２、コード生成部１３から構成されており、本発明では、ソース解析部１１に新たに仮引数情報生成手段１１２と、重複判定手段１１３を追加して、既存の大きさ値生成手段１１１と連携させて重複引数に関する値変更エラーをプログラム実行時に検出できるように機能追加したオブェクトプログラム３を生成するようにしたものであり、コンピュータ読み取り可能な記録媒体に格納されている。
【００１９】
大きさ値生成手段１１１は、ソースプログラム２から実引数の配列の大きさ値を算出し、呼出元手続きから呼出先手続きに前記実引数の配列の大きさ値を受け渡す処理を行うオブジェクトコードを生成する。仮引数情報生成手段１１２は、前記呼出先手続きが使用するすべての仮引数に対して、仮引数が大きさ引継ぎ配列の場合には前記実引数の大きさ値から、仮引数が大きさ引継ぎ配列でない場合は仮引数の配列の大きさから、仮引数としての変数の範囲を算出し、前記呼出先手続きの識別情報、変数名、配列の存在位置を表す情報を含む仮引数情報を作成する処理を行うオブジェクトコードを生成する。
【００２０】
重複判定手段１１３は、前記呼出先手続きにおいて変数の値が確定されると、確定された変数が仮引数である場合、前記呼出先手続きが使用する前記仮引数を除く他の仮引数の仮引数情報を参照して、他の仮引数の変数範囲と重複しているかどうかを判定処理するオブジェクトコードを生成する。
なお、本実施例では、確定された変数が仮引数でない場合、呼出先手続きが使用するすべての仮引数情報を参照して、前記変数が仮引数の変数範囲と重複しているかどうかを判定するオブジェクトコード、確定された変数が他の仮引数の変数範囲と重複していることを判定すると、前記確定された変数の名前、変数が確定された文の行番号、前記確定された変数と結合されている仮引数の名前を含むメッセージを出力するオブジェクトコードも生成するようにしており、仮引数と結合した要素に関する言語仕様のもつ制限事項（イ）、（ロ）のいずれに違反していた場合でもプログラム実行時に文法エラーとして検出ができ、利用者はメッセージを参照するだけで、利用者のプログラムが上記仮引数と結合した要素に関する言語仕様のもつ制限事項に違反した場合、変数を確定した文の行番号、確定された変数の名前、確定された変数と結合されている仮引数の名前が分かり、プログラムのデバッグ効率を高めることが可能となる。
【００２１】
図２は、仮引数情報テーブルのデータ形式が示してある。手続きの行番号には、仮引数を使用するサブルーチンなど呼出先手続きのソースリスト上の行番号が格納される。例えば図３で示すプログラム例１の場合、仮引数Ａに対する仮引数情報テーブルでは、（４）で示す文の行番号が格納される。変数の名前は、仮引数の変数名が格納される。変数領域の開始位置と終了位置には、仮引数（配列）の変数領域の開始位置アドレスと終了位置アドレスが格納される。図３で示すプログラム例１の場合、変数の名前にはＡが、変数領域の開始位置と終了位置には、それぞれＡＲＲＡＹ（１）とＡＲＲＡＹ（１０）の終端のアドレス−１が格納される。
【００２２】
また、次の仮引数情報テーブルのアドレスは次の仮引数に対する仮引数情報テーブルのアドレスが格納される。例えば図３で示すプログラム例１の場合、仮引数Ａに対する仮引数情報テーブルには、次の仮引数Ｂに対する仮引数情報テーブルのアドレスが格納される。なお、次の仮引数が存在しなくなると、このフィールドの内容にはバイナリ０など次の仮引数情報テーブルが存在しないことが判別できる値が格納される。
【００２３】
図３、および図４は仮引数と結合した要素に関する言語仕様のもつ制限事項（イ）、および（ロ）に違反したソースプログラムの例である。プログラムの詳細については、『従来の技術』の項で記述してあるので省略する。
図５、および図６は、本発明に係る実施の形態１におけるコンパイラプログラムの重複引数エラー検出のためのオブジェクトコード生成の処理の流れを示したフローチャートである。なお、本実施の形態では、本発明を利用者のプログラムに適用する際に以下の処理を共通ルーチンとしてランタイムライブラリで提供するようにしているため、オブジェクトプログラムではこれらのランタイムライブラリを呼び出すように生成されるが、これらの処理を行うオブジェクトコードを生成するように実装してもよい。（ａ）仮引数情報テーブル初期化処理、（ｂ）仮引数情報テーブル作成処理、（ｃ）変数確定検査処理、（ｄ）仮引数情報テーブル消去処理。
【００２４】
図５、および図６に基づき本発明に係る実施の形態１におけるコンパイラプログラムの重複引数エラー検出のためのオブジェクトコード生成の処理の流れについて説明する。なお、本処理は、従来のコンパイラのソース解析部に対して機能追加されるものであって、以下、今回の発明に係る部分についての説明を中心とし、従来技術に関する部分については処理の詳細は省略する。
【００２５】
先ず本発明に係る処理を適用するかどうかを従来からサポートしているコンパイル時の検査オプションが指定されたかどうかで判断する（Ｓ５０１）。検査オプションが指定されなかった場合は本発明に係る処理は適用しない。検査オプションが指定された場合は、ソースプログラム内に仮引数が存在するかどうかを判定し、仮引数が存在しない場合は本発明に係る処理は終了する（Ｓ５０２）。
【００２６】
仮引数の存在を検出すると、仮引数情報テーブルの初期設定ライブラリを呼び出すオブジェクトコードを生成する（Ｓ５０３）。なお、仮引数情報テーブルの初期設定ライブラリを呼び出す際には、コンパイル対象のソースプログラムが使用する仮引数の全数をパラメタとして渡す。次に仮引数を取り出し処理を行い（Ｓ５０４）、最後の仮引数まで取り出したかどうか判定する（Ｓ５０５）。仮引数の取り出しが終了すると図６の先頭の処理に進む。処理すべき仮引数が存在すると、その仮引数が大きさ引継ぎ配列かどうかを判定する（Ｓ５０６）。
【００２７】
処理中の仮引数が大きさ引継ぎ配列でない場合は、Ｓ５０８の処理に進む。仮引数が大きさ引継ぎ配列の場合は、大きさ引継ぎ配列の大きさ値を確定する（Ｓ５０７）。仮引数情報テーブルを作成するために仮引数情報作成ライブラリの呼出のためのオブジェクトコードを生成し（Ｓ５０８）、次の仮引数に対する仮引数情報テーブル作成のためにＳ５０４の処理へ戻る。なお、仮引数情報テーブル作成ライブラリを呼び出す際には、仮引数名、仮引数の先頭アドレス、仮引数の配列の大きさ、仮引数を使用する手続の行番号をパラメタとして渡す。
【００２８】
仮引数情報テーブルの作成のための処理が完了すると、ソースコードから１文取り出し（Ｓ６０１）、文が終了したかどうかを判定し（Ｓ６０２）、文が終了するまで、取り出した文が手続の呼出文かどうかを判定する（Ｓ６０３）。Ｓ６０２の判定で文が終了処理したことを検出すると、仮引数情報テーブルの消去のために仮引数情報テーブルの消去ライブラリの呼出すオブジェクトコードを生成する（Ｓ６０８）。
【００２９】
Ｓ６０３の判定で手続の呼出を検出すると、その手続は配列の結合される引数が存在するかどうかを判定し（Ｓ６０４）、存在する場合には、引数の配列の大きさを計算し（Ｓ６０５）、この文で変数の値を確定するかどうかを判定する（Ｓ６０６）。Ｓ６０３の判定で手続の呼出しが存在しない場合には、Ｓ６０６の判定処理に進む。Ｓ６０６の判定処理で、この文で変数の値を確定していない場合には、次の文の取り出し処理Ｓ６０１に戻る。
【００３０】
Ｓ６０６の判定処理で、この文で変数の値を確定している場合には、重複引数エラーをプログラム実行時に検出するために変数確定検査ライブラリを呼出すオブジェクトコードを生成し（Ｓ６０７）、次の文の取り出し処理Ｓ６０１に戻る。なお、変数確定検査ライブラリを呼出す際には、現在処理中の文、言い換えると誤って確定した変数の行番号、変数名、変数の先頭アドレス、Ｓ６０５で求めた確定した変数の配列の大きさをパラメタとして渡すことにより、重複引数に関する文法エラーをプログラム実行時に検出し、プログラムのデバッグ効率を高めることが可能となる。
【００３１】
以下、図７、図８、図９、図１０に基づき本発明を適用したコンパイラが生成するオブジェクトプログラムが呼び出すランタイムライブラリの処理について説明する。図７は、仮引数情報テーブルの初期化設定ライブラリの処理の流れを示すフローチャートである。このランタイムライブラリが呼び出される際に、パラメタとして処理対象のプログラムが使用する仮引数の数が渡されるため、この数に基づき仮引数情報テーブル領域を獲得し、テーブル領域内を初期化し、先頭仮引数情報テーブルのから順に次の仮引数情報テーブルへのリンクを張り、先頭仮引数情報テーブルのアドレスを記憶領域に記憶する（Ｓ７０１）。なお、最後の仮引数情報テーブルの次の仮引数情報テーブルのアドレスには、バイナリ０を設定し、最後であることを判定出来るようにする。
【００３２】
図８は、仮引数情報テーブル作成ライブラリの処理の流れを示すフローチャートである。本ライブラリは、呼び出される際に指定されるパラメタに基づき、図２で示す仮引数情報テーブルを作成する（Ｓ８０１）。なお、本実施の形態では、パラメタとして仮引数の先頭アドレスと、配列の大きさが渡されるため、仮引数の先頭アドレスに（配列の大きさ−１）を加算して、仮引数の終了アドレスとする。
【００３３】
また、仮引数情報テーブルのアドレスは、初めて仮引数情報テーブル作成ライブラリが呼び出された場合は、仮引数情報テーブルの初期化設定ライブラリが記憶したアドレスをカレントの仮引数情報テーブルアドレスとして記憶する。本ライブラリの処理が完了すると、次の仮引数情報テーブルの処理のために記憶しておいたカレントの仮引数情報テーブルアドレスを更新する。
【００３４】
図９は、変数確定検査ライブラリの処理の流れを示すフローチャートである。先ず、仮引数情報テーブルの初期化設定ライブラリで記憶した仮引数情報テーブルの先頭アドレスから順に仮引数情報テーブルを取り出す（Ｓ９０１）。次の仮引数情報テーブルのアドレスを参照し（Ｓ９０２）、すべての仮引数情報テーブルの処理が完了すると本ライブラリの処理は終了する。この仮引数情報テーブルに格納されている変数の名前は、値を確定した変数の名前と同じかどうか判定する（Ｓ９０４）。同じであれば、重複引数に関する文法エラーとはならないため次の仮引数情報テーブルの取り出し処理Ｓ９０１に戻る。
【００３５】
異なる場合、値を確定した変数は、この仮引数情報テーブルに格納されている変数の開始位置と終了位置で示されるアドレスの範囲であるかどうか判定し（Ｓ９０４）、範囲外であれば重複引数に関する文法エラーとはならないため、処理を終了する。値を確定した変数が仮引数情報テーブルで示される変数の範囲と重複していると、重複引数に関する文法エラーとなるため、誤って確定した変数の行番号、変数名、誤って確定した変数と結合されている仮引数の名前、手続の行番号をエラーメッセージとともに出力する（Ｓ９０５）。
【００３６】
図１０は、仮引数情報テーブルの消去ライブラリの処理を示すフローチャートである。本ライブラリは、仮引数情報テーブルの初期化設定ライブラリの処理で確保した仮引数情報テーブル領域の消去を行う。仮引数情報テーブルの初期化設定ライブラリの処理で記憶した仮引数情報テーブルの先頭アドレス、およびコンパイル対象のプログラムが使用する仮引数の数に基づき仮引数情報テーブル領域を解放することにより仮引数情報テーブルを消去する（Ｓ１００１）。
【００３７】
（付記１）　ソースプログラムから実引数の配列の大きさ値を算出し、呼出元手続きから呼出先手続きに前記実引数の配列の大きさ値を受け渡す処理を行うオブジェクトコードを生成する大きさ値生成手段と、
前記呼出先手続きが使用するすべての仮引数に対して、仮引数が大きさ引継ぎ配列の場合には前記実引数の大きさ値から、仮引数が大きさ引継ぎ配列でない場合は仮引数の配列の大きさから、仮引数としての変数の範囲を算出し、前記呼出先手続きの識別情報、変数名、配列の存在位置を表す情報を含む仮引数情報を作成する処理を行うオブジェクトコードを生成する仮引数情報生成手段と、
前記呼出先手続きにおいて変数の値が確定されると、確定された変数が仮引数である場合、前記呼出先手続きが使用する前記仮引数を除く他の仮引数の仮引数情報を参照して、他の仮引数の変数範囲と重複しているかどうかを判定処理するオブジェクトコードを生成する重複判定手段と
してコンピュータを機能させるコンパイラプログラム。
【００３８】
（付記２）　前記重複判定手段は、確定された変数が仮引数でない場合、前記呼出先手続きが使用するすべての仮引数情報を参照して、前記変数が仮引数の変数範囲と重複しているかどうかを判定するオブジェクトコードを生成する、付記１記載のコンパイラプログラム。
（付記３）　前記重複判定手段は、確定された変数が他の仮引数の変数範囲と重複していることを判定すると、前記確定された変数の名前、変数が確定された文の行番号、前記確定された変数と結合されている仮引数の名前を含むメッセージを出力するオブジェクトコードを生成する、付記１、または付記２記載のコンパイラプログラム。
【００３９】
（付記４）　ソースプログラムから実引数の配列の大きさ値を算出し、呼出元手続きから呼出先手続きに前記実引数の配列の大きさ値を受け渡す処理を行うオブジェクトコードを生成する大きさ値生成手段と、
前記呼出先手続きが使用するすべての仮引数に対して、仮引数が大きさ引継ぎ配列の場合には前記実引数の大きさ値から、仮引数が大きさ引継ぎ配列でない場合は仮引数の配列の大きさから、仮引数としての変数の範囲を算出し、前記呼出先手続きの識別情報、変数名、配列の存在位置を表す情報を含む仮引数情報を作成する処理を行うオブジェクトコードを生成する仮引数情報生成手段と、
前記呼出先手続きにおいて変数の値が確定されると、確定された変数が仮引数である場合、前記呼出先手続きが使用する前記仮引数を除く他の仮引数の仮引数情報を参照して、他の仮引数の変数範囲と重複しているかどうかを判定処理するオブジェクトコードを生成する重複判定手段と
してコンピュータを機能させるコンパイラプログラムを記録したコンピュータ読み取り可能な記録媒体。
【００４０】
（付記５）　ソースプログラムから実引数の配列の大きさ値を算出し、呼出元手続きから呼出先手続きに前記実引数の配列の大きさ値を受け渡す処理を行うオブジェクトコードを生成する大きさ値生成手段と、
前記呼出先手続きが使用するすべての仮引数に対して、仮引数が大きさ引継ぎ配列の場合には前記実引数の大きさ値から、仮引数が大きさ引継ぎ配列でない場合は仮引数の配列の大きさから、仮引数としての変数の範囲を算出し、前記呼出先手続きの識別情報、変数名、配列の存在位置を表す情報を含む仮引数情報を作成する処理を行うオブジェクトコードを生成する仮引数情報生成手段と、
前記呼出先手続きにおいて変数の値が確定されると、確定された変数が仮引数である場合、前記呼出先手続きが使用する前記仮引数を除く他の仮引数の仮引数情報を参照して、他の仮引数の変数範囲と重複しているかどうかを判定処理するオブジェクトコードを生成する重複判定手段と
を有することを特徴とするコンパイラ装置。
【００４１】
（付記６）　重複引数に関する文法エラーをプログラム実行時に検出するオブジェクトプログラムを生成するコンパイル方法であって、
ソースプログラムから実引数の配列の大きさ値を算出し、呼出元手続きから呼出先手続きに前記実引数の配列の大きさ値を受け渡す処理を行うオブジェクトコードを生成するステップと、
前記呼出先手続きが使用するすべての仮引数に対して、仮引数が大きさ引継ぎ配列の場合には前記実引数の大きさ値から、仮引数が大きさ引継ぎ配列でない場合は仮引数の配列の大きさから、仮引数としての変数の範囲を算出し、前記呼出先手続きの識別情報、変数名、配列の存在位置を表す情報を含む仮引数情報を作成する処理を行うオブジェクトコードを生成するステップと、
前記呼出先手続きにおいて変数の値が確定されると、確定された変数が仮引数である場合、前記呼出先手続きが使用する前記仮引数を除く他の仮引数の仮引数情報を参照して、他の仮引数の変数範囲と重複しているかどうかを判定処理するオブジェクトコードを生成するステップと
を有することを特徴とするコンパイル方法。
【００４２】
【発明の効果】
重複引数に関する文法エラーをプログラム実行時に検出し、プログラムのデバッグ効率を高めることが可能となる。
【図面の簡単な説明】
【図１】本発明の実施の形態１の全体構成図
【図２】仮引数情報テーブル
【図３】プログラム例１
【図４】プログラム例２
【図５】本発明に係る実施の形態１における重複引数エラー検出のためのコード生成処理の流れを示すフローチャートその１
【図６】本発明に係る実施の形態１における重複引数エラー検出のためのコード生成処理の流れを示すフローチャートその２
【図７】本発明に係る実施の形態１における仮引数情報テーブルの初期設定ライブラリの処理の流れを示すフローチャート
【図８】本発明に係る実施の形態１における仮引数情報テーブル作成ライブラリの処理の流れを示すフローチャート
【図９】本発明に係る実施の形態１における変数確定検査ライブラリの処理の流れを示すフローチャート
【図１０】本発明に係る実施の形態１における仮引数情報テーブルの消去ライブラリの処理の流れを示すフローチャート
【符号の説明】
１　コンパイラ装置
２　ソースプログラム
３　オブジェクトプログラム
１０　コンパイラプログラム
１１　ソース解析部
１２　最適化部
１３　コード生成部
１１１　大きさ値生成手段
１１２　仮引数情報生成手段
１１３　重複判定手段
【図１】
2004021429.tif 000003
【図２】
2004021429.tif 000004
【図３】
2004021429.tif 000005
【図４】
2004021429.tif 000006
【図５】
2004021429.tif 000007
【図６】
2004021429.tif 000008
【図７】
2004021429.tif 000009
【図８】
2004021429.tif 000010
【図９】
2004021429.tif 000011
【図１０】
2004021429.tif 000012