(57)【要約】【課題】割り込み処理において実行結果が不正になるようなオブジェクトコードを生成しないよう、コンパイル時の大域変数の最適化を抑止する。【解決手段】オプション、またはソースコード中の指示文で、変数名や範囲指定で大域変数の最適化抑止を指示する。コンパイラによるコンパイル時に指定の大域変数の記号表を、指定の範囲において非最適化対象に設定することにより、コンパイル時にソースを改変することなく指定の大域変数を指定の範囲での最適化を抑止する。【選択図】　図３
2004145589.tif 000002
【特許請求の範囲】
【請求項１】
コンパイラにおいて、最適化抑止修飾子が記述されていない大域変数の最適化を抑止する機能を持つコンパイラ。
【請求項２】
請求項１のコンパイラにおいて、コンパイラのユーザーからのコンパイラオプションの指定により、最適化を抑止する大域変数および抑止する範囲を制御する手段を持つコンパイラ。
【請求項３】
請求項１のコンパイラにおいて、コンパイラのユーザーからのソース内指示文により、最適化を抑止する大域変数および抑止する範囲を制御する手段を持つコンパイラ。
【請求項４】
請求項２または請求項３のコンパイラにおいて、前記オプションおよび指示文の情報により指示される大域変数を、指示される範囲で、内部的に最適化抑止修飾子が記述されているものと変換する機構を有するコンパイラ。
【請求項５】
請求項４のコンパイラを格納した記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明はコンパイラに関し、大域変数に対する最適化の抑止機能を持つコンパイラに関する。
【０００２】
【従来の技術】
Ｃ言語などのコンパイラでは、実行速度やコードサイズの削減のため、同じ計算を共通化して結果を再利用したり、冗長であるとコンパイラが判断する文を削除するなどの最適化を行う。Ｃ言語にはコンパイル時に静的に領域が確保される変数として、ｅｘｔｅｒｎ変数や、ファイル内ｓｔａｔｉｃ変数などの変数がある。ｅｘｔｅｒｎ　変数は、プログラム中の任意の関数内から参照可能である。ファイル内ｓｔａｔｉｃ変数は同じファイル内で定義されている任意の関数から参照可能である。以降、ｅｘｔｅｒｎ　変数とファイル内ｓｔａｔｉｃ変数のことを大域変数と呼ぶことにする。通常のプログラムにおいては、大域変数の参照や定義は明示的に記述された変数の参照や定義、もしくは関数呼び出しによる呼び先の関数において行われる。このため、コンパイラによる最適化は、大域変数の参照が、プログラムに記述された元の意味を壊さない範囲で行う。しかし、組み込み用プログラムの分野においては、割り込みによる処理が多く発生する。割り込みによる処理の場合、プログラム中に明示的に記述されていない関数呼び出しが発生し、その関数呼び出しにより大域変数の値が参照もしくは定義されることがあるため、大域変数を対象にした最適化により実行結果が不正になることがある。このようなことを防ぐため、下記する非特許文献１に記載されているように、Ｃ言語では　ｖｏｌａｔｉｌｅ　修飾子が用意されており、宣言時にこの修飾子をつけて宣言された変数はレジスタ割付や、参照の共通化などの最適化が行われない。
【０００３】
【非特許文献１】
「カーニハン、リッチー著：　プログラミング言語Ｃ　第２版」（共立出版社、１９８９年）２６１頁〜２６２頁
【０００４】
【発明が解決しようとする課題】
しかし、これまで　ｖｏｌａｔｉｌｅ　修飾子をつけなくても正しく動作していたプログラムが、コンパイラの最適化機能の向上により、最適化の適用範囲や適用対象が広がり、大域変数に　ｖｏｌａｔｉｌｅ　修飾子をつけないと不正なオブジェクトコードとなることがある。
【０００５】
このような場合、ユーザーは大域変数の宣言に　ｖｏｌａｔｉｌｅ　修飾子をつけるようプログラムを改変することにより、不正なオブジェクトが生成されることを避けることが可能である。しかし、コンパイラのユーザーによっては、ｖｏｌａｔｉｌｅ　修飾子をつけるべき大域変数を特定することが困難である、もしくは、ほかの理由により、変数宣言に　ｖｏｌａｔｉｌｅ　修飾子をつけるようなプログラムの改変することなく、実行結果が不正となるような最適化を抑止したいという要求がある。
【０００６】
【課題を解決するための手段】
上記課題解決のため、本発明のコンパイラでは任意の大域変数を、ｖｏｌａｔｉｌｅ　宣言されたものとして扱うことができる機構を備える。またユーザーに、ｖｏｌａｔｉｌｅ　宣言されたものとして扱う変数または範囲を指定可能なコンパイルオプション、およびプログラム中の指示文を提供する。オプションや指示文により、ユーザーは最適化対象外とする大域変数や、最適化対象外とするプログラム中の範囲をプログラムの改変なしで、もしくは指示文の挿入のみで制御可能である。コンパイラは、コンパイル中にオプションまたは指示文にて指定された大域変数、もしくはオプションで指定されたプログラム範囲に含まれる大域変数をｖｏｌａｔｉｌｅ　宣言されたものと同様に、内部的に変換する手段を有する。
【０００７】
【発明の実施の形態】
以下図面を参照しながら本発明の一実施例について説明する。
【０００８】
図１は本発明によるコンパイラが稼動する計算機システムの構成図である。図に示すように、計算機システムは、ＣＰＵ１０１、ディスプレイ装置１０２、キーボード１０３、主記憶装置１０４、外部記憶装置１１０より構成されている。外部記憶装置１１０には、コンパイラ１１１とソースプログラム１１２、およびオブジェクトプログラム１１３が保持される。コンパイル処理は、ＣＰＵ１０１がコンパイラ１０４を実行することにより行われる。ユーザーはキーボード１０３よりコマンドをＣＰＵ１０１に与え、ＣＰＵ１０１は、コンパイラ１０４を主記憶１０４に読み込み、コンパイル処理を実行する。コンパイル処理中、コンパイラ１０８は実行中に内部処理で必要な中間コード１０５や記号表１０６、関数表１０７、ループ表１０８、オプションテーブル１０９を生成して、コンパイル処理中に参照しながら処理を行う。ディスプレイ装置１０２はユーザーにコンパイルの終了やエラーを知らせる。
【０００９】
図２は本発明を適用したコンパイラを用いて、大域変数の最適化が抑止されたコンパイル処理を行うための手順を示したものである。ソースプログラム１１２に対してステップ２０１により大域変数の最適化を抑止したコンパイル処理を行い、大域変数の最適化が抑止されたオブジェクトコード１１３を得る。
【００１０】
図３は本発明によるコンパイル処理の流れを示したフローチャートである。コンパイラの処理は、まずステップ３０１構文解析において、ソースプログラム１１２を読み出して、コンパイラ内部で処理可能な中間コード１０５や、図４により後述する記号表１０６、図１２により後述する関数表１０７を生成する構文解析の処理を行う。構文解析処理については、例えば「エイホ、セシィ、ウルマン著：　コンパイラＩ」（サイエンス社、１９９０年）３０頁〜７４頁に記載されているので、ここでは説明しない。次に、ステップ３０２において、変数の依存関係や、図１１により後述するループ表１０８を生成する、データフロー解析処理を行う。データフロー解析処理については、同じく「エイホ、セシィ、ウルマン著：　コンパイラＩＩ」（サイエンス社、１９９０年）７４１頁〜７７２頁に記載されているので、ここでは説明しない。次に、ステップ３０３に進み、本発明の特徴的な処理である大域変数最適化抑止処理を行い、指示された大域変数を指示された範囲で　ｖｏｌａｔｉｌｅ　宣言されたものとして扱う。ステップ３０３については図５を用いて詳しく説明する。つぎに、ステップ３０４に進み、最適化処理を行う。最適化処理については、「中田　育男　著：コンパイラの構成と最適化」（朝倉書店、１９９９年）２２８頁〜４８２頁に記載されているので、ここでは説明しない。次に、ステップ３０５オブジェクトコード生成に進み、オブジェクトコードを生成して終了する。オブジェクト生成処理２０４については、同じく「エイホ、セシィ、ウルマン著：　コンパイラＩＩ」（サイエンス社、１９９０年）６２４頁〜７０７頁に記載されているので、ここでは詳しく説明しない。
【００１１】
図４は記号表の詳細図である。記号表４０１は、記号の名前であるシンボルフィールド４０２と、記号のデータ型を表す型フィールド４０３と、記号のデータサイズを表すサイズフィールド４０４と、記号の記憶領域、参照可能範囲を示すセクションフィールド４０５と、記号の表す変数の最適化可否を表す最適化レベルフィールド４０６と、次の記号表のエントリへのリンク４０７を含んでいる。これらの情報は、図３のステップ３０１構文解析処理において、記号表を生成する過程で得られる。最適化レベルフィールド４０６は、ｖｏｌａｔｉｌｅ修飾子がついている変数では、最適化抑止が指示されていることを示すｖｏｌａｔｉｌｅ　という情報が載っている。ｖｏｌａｔｉｌｅ修飾子がついていない記号の場合は、最適化可能であることを示す　ｏｐｔｉｍｉｚａｂｌｅ　という情報が載っている。
【００１２】
図６は、オプションによる最適化抑止範囲の指示方法の例である。ｃｃはコンパイルコマンドである。ｔｅｓｔ．ｃ　は、コンパイル対象のソースファイルの指定である。−ｇｌｏｂａｌ＿ｖｏｌａｔｉｌｅ　は、本発明の特徴的機能である大域変数の最適化抑止機能において、大域変数の最適化を抑止するする範囲を指定するオプションである。６０１は、ソースプログラムファイルに含まれる、全ての大域変数の最適化抑止を指示している例である。６０２では、ソースプログラム中のループ内部で参照される、全ての大域変数の最適化抑止を指示している例である。
【００１３】
図１０は、オプションテーブル１０９の詳細図である。ここにはコンパイラ起動時に指定されたオプションの内容が格納されている。オプションテーブル１０９には、最適化レベルのオプション指定フィールド１００１と、大域変数最適化抑止範囲指定オプションフィールド１００２と、ソースファイル名フィールド１００３を含んでいる。
【００１４】
図１１はループ表１０８の詳細図である。ループ表１０８には、ループ番号フィールド１１０１と、ループ先頭文フィールド１１０２と、ループ末尾文フィールド１１０３と、ループ出口文フィールド１１０４と、ループ入り口文フィールド１１０５と次ループ表フィールド１１０６を含む。
【００１５】
図１２は、関数表１０７の詳細図である。関数表１０７には、関数名フィールド１２０１と、関数戻り値型フィールド１２０２と、関数戻り値サイズフィールド１２０３と、本発明の特徴的なフィールドである、大域変数抑止指示文リストフィールド１２０４と、次関数表フィールド１２０５を含んでいる。大域変数抑止指示文リストフィールド１２０４は、大域変数抑止指示文リスト１２０６をさしており、次リストフィールド１２０７と、シンボル辞書フィールド１２０８を含んでいる。記号表フィールド１２０８は、指示文により関数表１０７が示す関数内で最適化抑止を指示されている変数表を指している。
【００１６】
図５は、本発明の特徴的処理である、大域変数最適化抑止処理の処理手順を示したフローチャートである。まず、ステップ５０１において、記号表リストの先頭要素である記号表を選択して処理対象とする。次に、ステップ５０２において、記号表リストが終端に達していて、処理すべき記号表がすでにないかどうかをチェックする。処理すべき記号表がなかった場合は処理を終了する。処理すべき記号表があった場合、ステップ５０３に進み、処理中の記号表が大域変数を示す記号のものかどうかを調べる。大域変数かどうかを調べるには、記号表のセクションフィールド４０５を参照して、ｅｘｔｅｒｎ　変数もしくはファイル内ｓｔａｔｉｃ変数であった場合は大域変数であると判断する。大域変数を示す記号表でなかった場合、ステップ５０７に進み、記号表リストから次の記号表を選択した後、ステップ５０２に戻る。大域変数を示す記号表であった場合、ステップ５０４に進み、オプションテーブル１０７の大域変数最適化抑止範囲指定オプションフィールド１００２を参照して、本発明の機能を利用するための、最適化抑止オプションが指定されているかどうかを調べる。最適化抑止オプションが指定されていた場合、ステップ５１０に進み、指定の範囲にカレントの記号表の変数の参照があるかどうかを調べる。例えばコマンドライン６０２のように、ループ内の大域変数を最適化対象外とするが指定されていた場合、ループ表１０８を参照して、ループ先頭文フィールド１１０２およびループ末尾文フィールド１１０３より、ループの先頭と末尾の文を得て、先頭の文と末尾の文の間の中間語を走査して、カレントの記号表の記号が使用されているかどうかを調べる。指定の範囲内に参照がある場合、ステップ５０９に進み、カレントの記号表の最適化レベルフィールド４０６に非最適化対象であることを示すｖｏｌａｔｉｌｅ　を記入し、最適化対象外にした後、ステップ５０７に進み、次の記号表を選択して、ステップ５０２に戻る。ステップ５０４において、最適化抑止オプションが指定されていなかった場合、ステップ５０５に進み、ソースプログラム中にカレントの記号表が示す変数の最適化抑止を指示する指示文が記述されているかどうかを調べる。指示文が指定されているかどうかは、現在処理中の関数の関数表１０７より、指示文リストフィールド１２０４から、大域変数指示文リスト１２０６を順にたどり、記号表フィールド１２０８が、カレントの記号表を指しているかどうかを調べることにより行う。指示文が記述されていた場合、ステップ５０９に進み、現在処理中の関数は指示文により最適化の抑止を指定されている関数であるかどうかを調べる。抑止が指示された関数であった場合ステップ５０９に進み、カレントの記号表を最適化対象外にした後、ステップ５０７に進み、次の記号表を選択して、ステップ５０２に戻る。ステップ５０５においてソースプログラム中にカレントの記号表が示す変数の最適化抑止を指示する指示文が記述されていなかった場合、カレントの記号表は最適化対象外にする必要がないため、最適化対象であることを示す情報である　ｏｐｔｉｍｉｚａｂｌｅ　を載せて最適化対象にした後、ステップ５０７に進み、次の記号表を選択して、ステップ５０２に戻る。
【００１７】
図７は、ソースプログラム中の指示文により最適化抑止を指示した例である。ステップ７０４の指示文により、関数　ｆｏｏ（）　内での変数ａの参照の最適化が抑止される。指示文により最適化抑止範囲を指定することで、（１）コンパイルオプションを記述した　Ｍａｋｅｆｉｌｅ　の改変が不要である。（２）ソースプログラムのアルゴリズムは変えることなく記述可能なため、ソースファイルの互換性が保てる。（３）ソースプログラム中に直接記述するため、最適化抑止の範囲が直感的にわかりやすい。などのような利点がある。
【００１８】
図８は、図７のプログラムを指示文なしでコンパイルして生成した擬似オブジェクトコードの例である。変数ａはレジスタｒ１に割り付けられており、ステップ８０１でレジスタｒ１にロードされ、ステップ８０３、８０４　で参照、定義された後、ステップ８０５でメモリ領域にストアされる。
【００１９】
図９は、図７のプラグラムを最適化抑止指示文つきでコンパイルした擬似オブジェクトコードの例である。変数ａは、最適化が抑止された結果、レジスタ割付の対象外となるため、ステップ９０１でレジスタｒ１にロードした後、ステップ９０３で参照、定義された後、９０４でメモリ領域にストアされる。そして、再びステップ９０５でロードされた後、ステップ９０６で参照、定義され、ステップ９０７でメモリ領域にストアされ、参照のたびごとにメモリ領域からのロード、メモリ領域へのストアが行われる。これにより、不特定の場所で割り込みが発生しても、更新された大域変数の値をメモリ上から参照することが可能である。
【００２０】
【発明の効果】
本発明によれば、割り込み処理において実行結果が不正になるようなオブジェクトコードを生成しないよう、コンパイル時の大域変数の最適化を抑止することができる。
【図面の簡単な説明】
【図１】本発明の大域変数の最適化抑止機能を持つコンパイラが稼動する計算機システムの構成図。
【図２】本発明の大域変数の最適化抑止をしたコンパイルの手順を示すフローチャート図。
【図３】本発明の大域変数の最適化抑止機能を持つコンパイラの処理の流れを示すフローチャート図。
【図４】本発明の大域変数最適化処理機能を持つコンパイラの内部処理用記号表の例を示す図。
【図５】大域変数最適化抑止処理の処理手順を示すフローチャート図。
【図６】大域変数の最適化抑止を指示するオプション指定例を示す図。
【図７】大域変数の最適化抑止を指示するソースプログラムの指示文記述例を示す図。
【図８】図７のプログラムを大域変数の最適化抑止指示文なしでコンパイルして生成した擬似オブジェクトコードの例を示す図。
【図９】図７のプログラムを大域変数の最適化抑止指示文つきでコンパイルして生成した擬似オブジェクトコードの例を示す図。
【図１０】オプションテーブルの例を示す図。
【図１１】本発明の大域変数最適化処理機能を持つコンパイラの内部処理用ループ表の例を示す図。
【図１２】本発明の大域変数最適化処理機能を持つコンパイラの内部処理用関数表の例を示す図。
【符号の説明】
１０１…ＣＰＵ、１０２…ディスプレイ装置、１０３…キーボード、１０４…主記憶装置、１１０…外部記憶装置。
【図１】
2004145589.tif 000003
【図２】
2004145589.tif 000004
【図３】
2004145589.tif 000005
【図４】
2004145589.tif 000006
【図５】
2004145589.tif 000007
【図６】
2004145589.tif 000008
【図７】
2004145589.tif 000009
【図８】
2004145589.tif 000010
【図９】
2004145589.tif 000011
【図１０】
2004145589.tif 000012
【図１１】
2004145589.tif 000013
【図１２】
2004145589.tif 000014