(57)【特許請求の範囲】
【請求項１】
数式演算を記述するソースプログラムをコンパイルするコンパイル処理装置において、
入力したソースプログラムに、括弧又はそれに相当するものでくくられた数式演算が記述されているのか否かを検出する検出手段と、
上記検出手段により括弧又はそれに相当するものでくくられた数式演算が記述されていることが検出される場合に、括弧又はそれに相当するものでくくられた数式演算部分であることを示す命令情報を生成する生成手段と、
上記生成手段の生成した命令情報が検出される場合には、その命令情報に係る数式演算部分に対しての演算評価順序に関する最適化を抑止しつつ、ソースプログラムに記述される数式演算に対しての演算評価順序に関する最適化を実行する最適化手段とを備えることを、
特徴とするコンパイル処理装置。
【請求項２】
数式演算を記述するソースプログラムをコンパイルするコンパイル処理装置の実現に用いられるプログラムを記録したコンピュータ読み取り可能な記録媒体であって、
入力したソースプログラムに、括弧又はそれに相当するものでくくられた数式演算が記述されているのか否かを検出する検出処理と、
上記検出処理により括弧又はそれに相当するものでくくられた数式演算が記述されていることが検出される場合に、括弧又はそれに相当するものでくくられた数式演算部分であることを示す命令情報を生成する生成処理と、
上記生成処理で生成した命令情報が検出される場合には、その命令情報に係る数式演算部分に対しての演算評価順序に関する最適化を抑止しつつ、ソースプログラムに記述される数式演算に対しての演算評価順序に関する最適化を実行する最適化処理とをコンピュータに実行させるためのプログラムを記録したことを、
特徴とするコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、数式演算を記述するソースプログラムをコンパイルしてオブジェクトプログラムを生成するコンパイル処理装置と、そのコンパイル処理装置の実現に用いられるプログラムを記録したコンピュータ読み取り可能なプログラム記録媒体とに関し、特に、プログラマの望む形態で数式演算を実行するオブジェクトプログラムを生成できるようにするコンパイル処理装置と、そのコンパイル処理装置の実現に用いられるプログラムを記録したコンピュータ読み取り可能なプログラム記録媒体とに関する。
【０００２】
数式演算を記述するプログラムを実行する場合には、プログラマの望む形態で数式演算を実行することが好ましい。これから、これを実現するための技術を構築していく必要がある。
【０００３】
【従来の技術】
多くの高級プログラミング言語では、括弧によって演算評価順序を指定することができる。更に、特定の高級プログラミング言語の中には、自然に決定する演算評価順序（例えば、掛け算は足し算より優先するとか、左側を優先するとかいったルール）については、数学的に等価である限り、その演算評価順序の変更を許しているものの、括弧で指定された演算評価順序については、その演算評価順序の変更を許していないものもある。
【０００４】
一方、高級プログラミング言語を機械語などの別の言語に変換するコンパイラでは、自然に決定する演算評価順序と括弧で指定された演算評価順序とを区別せずに最適化処理を施すことで、オブジェクトプログラムを生成するように処理している。
【０００５】
【発明が解決しようとする課題】
このように、従来のコンパイラでは、プログラマの記述した括弧を無視して、最も高い最適化効率が得られるようにと、ソースプログラムに記述される数式演算の演算評価順序を変更していくように処理している。
【０００６】
しかしながら、このような従来技術に従っていると、プログラマの望む形態で数式演算が実行されないことが起こるという問題点がある。
【０００７】
例えば、プログラマは、桁落ちを考慮して括弧を挿入することがあるが、従来技術に従っていると、このような場合にも、最適化の観点から括弧に関係なく演算評価順序が変更されてしまうことで、桁落ちが発生してしまうという問題点がある。
【０００８】
本発明はかかる事情に鑑みてなされたものであって、数式演算を記述するソースプログラムをコンパイルする構成を採るときにあって、プログラマの望む形態で数式演算を実行するオブジェクトプログラムを生成できるようにする新たなコンパイル処理技術の提供を目的とする。
【０００９】
【課題を解決するための手段】
図１に本発明の原理構成を図示する。
【００１０】
図中、１は本発明を具備するコンパイル処理装置であって、数式演算を記述するソースプログラムをコンパイルしてオブジェクトプログラムを生成するものである。
【００１１】
本発明のコンパイル処理装置１は、ソースプログラムを構文解析する構文解析手段２と、構文解析手段２の解析結果に従い演算評価順序を変更することで数式演算の最適化を実行する最適化手段３と、最適化手段３により最適化されたソースプログラムの中間テキストからオブジェクトプログラムを生成するオブジェクト生成手段４とを備える。
【００１２】
本発明のコンパイル処理装置１では、本発明を実現するために、構文解析手段２に、ソースプログラムに括弧又はそれに相当するものでくくられた数式演算が記述されているのか否かを検出する検出手段５と、検出手段５により括弧又はそれに相当するものでくくられた数式演算が記述されていることが検出される場合に、括弧又はそれに相当するものでくくられた数式演算部分であることを示す命令情報を生成する生成手段６とを備え、これを受けて、最適化手段３は、生成手段６の生成した命令情報が検出される場合には、その命令情報に係る数式演算部分に対しての演算評価順序に関する最適化を抑止しつつ、ソースプログラムに記述される数式演算に対しての演算評価順序に関する最適化を実行する。
【００１３】
ここで、本発明のコンパイル処理装置１の持つ機能は具体的にはプログラムで実現されるものであり、このプログラムは、フロッピィディスクなどに格納されたり、サーバなどのディスクなどに格納され、それらからコンパイル処理装置１にインストールされてメモリ上で動作することで、本発明を実現することになる。
【００１４】
このように構成される本発明のコンパイル処理装置１では、構文解析手段２の検出手段５は、入力したソースプログラムに、括弧又はそれに相当するものでくくられた数式演算が記述されているのか否かを検出し、これを受けて、構文解析手段２の生成手段６は、検出手段５により括弧又はそれに相当するものでくくられた数式演算が記述されていることが検出される場合に、括弧又はそれに相当するものでくくられた数式演算部分であることを示す命令情報を生成する。
【００１６】
この構文解析手段２の処理を受けて、最適化手段３は、生成手段６の生成した命令情報が検出される場合には、その命令情報に係る数式演算部分に対しての演算評価順序に関する最適化を抑止しつつ、ソースプログラムに記述される数式演算に対しての演算評価順序に関する最適化を実行する。
【００１７】
このように、本発明のコンパイル処理装置１では、数式演算を記述するソースプログラムをコンパイルする構成を採るときにあって、プログラマが括弧又はそれに相当するものを記述しつつ数式演算をプログラムするときには、その括弧又はそれに相当するものの指す数式演算部分の演算評価順序に関する最適化を抑止する構成を採ることから、プログラマの望む形態で数式演算を実行するオブジェクトプログラムを生成できるようになる。
【００１８】
【発明の実施の形態】
以下、実施の形態に従って本発明を詳細に説明する。
【００１９】
図中、１０は本発明を具備する計算機であって、プリコンパイラ１００と本発明を具備するコンパイラ１０１とを備えて、ソースファイル２０に格納される数式演算を記述するソースプログラムをコンパイルすることでオブジェクトプログラムを生成して、それをオブジェクトファイル３０に格納する処理を行うものである。
【００２０】
ここで、プリコンパイラ１００やコンパイラ１０１は、フロッピィディスクや回線などを介してインストールされることになる。
【００２１】
図３に、本発明を具備するコンパイラ１０１が構文解析処理で実行する処理フローの一実施例、図４に、本発明を具備するコンパイラ１０１が最適化処理で実行する処理フローの一実施例を図示する。次に、これらの処理フローに従って、本発明について詳細に説明する。
【００２２】
本発明を具備するコンパイラ１０１は、構文解析処理に入ると、図３の処理フローに従って、数式演算を記述するソースプログラムを構文解析することで、中間テキストレベルの命令列を生成する。
【００２３】
すなわち、本発明を具備するコンパイラ１０１は、構文解析処理に入ると、図３の処理フローに示すように、先ず最初に、ステップ１で、最適化処理のレベルを示す最適化オプションを入力する。この最適化オプションは、翻訳対象となるソースプログラム名を指定して発行される翻訳コマンドに付加されているので、それを抽出することで行う。
【００２４】
続いて、ステップ２で、入力した最適化オプションがソースプログラムに記述される括弧の無視を指示するものであるのか否かを判断して、括弧を無視してはならないことの指示を判断するときには、ステップ３に進んで、翻訳対象となるソースプログラムから数式演算を読み込む。
【００２５】
続いて、ステップ４で、その読み込んだ数式演算が括弧でくくられたものであるのか否かを判断して、括弧でくくられた数式演算であることを判断するときには、ステップ５に進んで、その数式演算に対する命令と括弧を示す命令とを生成する。一方、括弧でくくられた数式演算でないことを判断するときには、ステップ６に進んで、その数式演算に対する命令のみを生成する。
【００２６】
そして、ステップ５／ステップ６の処理を終了すると、ステップ７に進んで、全ソースプログラムの読み込みを終了したのか否かを判断して、全ソースプログラムの読み込みを終了していないことを判断するときには、ステップ３に戻り、全ソースプログラムの読み込みを終了したことを判断するときには、処理を終了する。
【００２７】
一方、ステップ２で、入力した最適化オプションがソースプログラムに記述される括弧の無視を指示するものであることを判断するときには、ステップ８に進んで、翻訳対象となるソースプログラムから数式演算を読み込み、続くステップ９で、その読み込んだ数式演算が括弧でくくられているものであっても、括弧を示す命令を生成することなく、その数式演算に対する命令を生成し、その読み込んだ数式演算が括弧でくくられていない場合には、そのままその数式演算に対する命令を生成する。
【００２８】
そして、続くステップ１０で、全ソースプログラムの読み込みを終了したのか否かを判断して、全ソースプログラムの読み込みを終了していないことを判断するときには、ステップ８に戻り、全ソースプログラムの読み込みを終了したことを判断するときには、処理を終了する。
【００２９】
このようにして、本発明を具備するコンパイラ１０１は、構文解析処理に入るときにあって、最適化オプションがソースプログラムに記述される括弧を無視してはならないことを指示するときに、
ｘ＝（ａ＋２.0）＋１.0
という数式演算が与えられると、図５（ａ）に示すように、一時格納域から別の一時格納域への格納を指示する命令内容を持つ“括弧を示す命令「ｐｓｉｓ」”を生成しつつ、この数式演算に対応させて、
ａｄｄ      ｔ１，“ａ”，“２.0”
ｐｓｉｓ    ｔ２，ｔ１
ａｄｄ      ｔ３，ｔ２，“１.0”
という中間テキストレベルの命令列を生成するように処理する。
【００３０】
一方、最適化オプションがソースプログラムに記述される括弧を無視してはならないことを指示するときに、
ｘ＝ａ＋２.0＋１.0
という括弧のない数式演算が与えられると、図５（ｂ）に示すように、この括弧を示す命令「ｐｓｉｓ」を生成することなく、この数式演算に対応させて、
ａｄｄ      ｔ１，“ａ”，“２.0”
ａｄｄ      ｔ２，ｔ１，“１.0”
という中間テキストレベルの命令列を生成するように処理する。
【００３１】
すなわち、本発明を具備するコンパイラ１０１は、ソースプログラムの構文解析処理に入ると、括弧でくくられていない数式演算のときには、図６に示すように、従来技術と同様のツリー構造に従って中間テキストレベルの命令列を生成していくのに対して、括弧でくくられた数式演算のときには、図７に示すように、従来技術と異なるツリー構造に従って、“括弧を示す命令「ｐｓｉｓ」”を生成しつつ中間テキストレベルの命令列を生成していく構成を採るのである。
【００３２】
この構文解析処理を受けて、本発明を具備するコンパイラ１０１は、図４の処理フローに従って、生成した中間テキストレベルの命令列の演算評価順序を変更していくことで、数式演算の最適化処理を実行する。
【００３３】
すなわち、本発明を具備するコンパイラ１０１は、最適化処理に入ると、図４の処理フローに示すように、先ず最初に、ステップ１で、最適化オプションがソースプログラムに記述される括弧の無視を指示するものであるのか否かを判断して、括弧を無視してはならないことの指示を判断するときには、ステップ２に進んで、構文解析処理で生成した中間テキストレベルの命令を読み込む。
【００３４】
続いて、ステップ３で、その読み込んだ命令が括弧を示す命令であるのか否かを判断して、括弧を示す命令であることを判断するときには、ステップ４に進んで、その括弧を示す命令が規定する演算評価順序を変更することになる最適化を行わず、最適化を行う。一方、括弧を示す命令でないことを判断するときには、ステップ５に進んで、演算評価順序を変更する最適化を行う。
【００３５】
そして、ステップ４／ステップ５の処理を終了すると、ステップ６に進んで、全命令の処理を終了したのか否かを判断して、全命令の処理を終了していないことを判断するときには、ステップ２に戻り、全命令の処理を終了したことを判断するときには、処理を終了する。
【００３６】
一方、ステップ１で、最適化オプションがソースプログラムに記述される括弧の無視を指示するものであることを判断するときには、ステップ７に進んで、構文解析処理で生成した中間テキストレベルの命令を読み込み、続くステップ８で、その読み込んだ命令が括弧を示す命令であってもなくても、演算評価順序を変更する最適化を行う。
【００３７】
そして、続くステップ９で、全命令の処理を終了したのか否かを判断して、全命令の処理を終了していないことを判断するときには、ステップ７に戻り、全命令の処理を終了したことを判断するときには、処理を終了する。
【００３８】
このようにして、本発明を具備するコンパイラ１０１は、最適化処理に入るときにあって、最適化オプションがソースプログラムに記述される括弧を無視してはならないことを指示するときに、構文解析処理で得た中間テキストレベルの命令例が、
ａｄｄ      ｔ１，“ａ”，“２.0”
ｐｓｉｓ    ｔ２，ｔ１
ａｄｄ      ｔ３，ｔ２，“１.0”
であるときには、図８に示すように、括弧を示す命令「ｐｓｉｓ」が規定する演算評価順序を最適化の対象とすることなく、最適化を行うように処理する。すなわち、括弧の中の演算評価順序を変えずに、最適化を行うように処理するのである。
【００３９】
一方、最適化オプションがソースプログラムに記述される括弧を無視してはならないことを指示するときに、構文解析処理で得た中間テキストレベルの命令例が、
ａｄｄ      ｔ１，“ａ”，“２.0”
ａｄｄ      ｔ２，ｔ１，“１.0”
であるときには、整数をまとめるべく、図９に示すように、演算評価順序を変更させる最適化を行うことで、この命令列を、
ａｄｄ      ｔ２，“３.0”，“ａ”
という形に変形していくように処理する。
【００４０】
このようにして、本発明を具備するコンパイラ１０１は、数式演算を記述するソースプログラムをコンパイルするときに、ソースプログラムに記述される括弧の指定する数式演算部分の演算評価順序に関する最適化を抑止するように処理するのである。これにより、プログラマの望む形態で数式演算を実行するオブジェクトプログラムを生成できるようになる。
【００４１】
本発明を具備するコンパイラ１０１は、図３の処理フローに従う場合には、図１０（ａ）に示すように、括弧を示す命令を生成することで、括弧の指定する数式演算部分の演算評価順序に関する最適化を抑止するように処理したが、このような命令を生成しない構成を採ることも可能である。
【００４２】
例えば、図１０（ｂ）に示すように、括弧の記述箇所に、それが記述されていないときに生成する命令（この例ではａｄｄ命令）と同一内容を持つ別の名前を持つ命令（この例ではｐａｄｄ命令）を生成することで、括弧の指定する数式演算部分の演算評価順序に関する最適化を抑止するように処理したり、図１０（ｃ）に示すように、括弧の記述箇所の指す命令のオペランドに対応付けて、括弧が記述されている旨を示す特別のコメント（この例ではｐｏｉｎｔｅｒ）を付加することで、括弧の指定する数式演算部分の演算評価順序に関する最適化を抑止するように処理する構成を採ることも可能である。
【００４３】
また、本発明を具備するコンパイラ１０１は、ソースプログラムに記述される括弧のみに適用されるものではなく、演算評価順序を規定する性質を持つ全てのもの（括弧に相当するもの）に対して適用可能である。
【００４４】
例えば、Ｃ言語で宣言するボラタイルも、演算評価順序を規定する括弧に相当する性質を有することから、本発明を用いることで、ボラタイルとして宣言された部分までは、その演算評価順序を変更しないように処理することができるようになる。
【００４５】
【発明の効果】
以上説明したように、本発明によれば、数式演算を記述するソースプログラムをコンパイルする構成を採るときにあって、プログラマが括弧又はそれに相当するものを記述しつつ数式演算をプログラムするときには、その括弧又はそれに相当するものの指す数式演算部分の演算評価順序に関する最適化を抑止する構成を採ることから、プログラマの望む形態で数式演算を実行するオブジェクトプログラムを生成できるようになる。
【図面の簡単な説明】
【図１】本発明の原理構成図である。
【図２】本発明の一実施例である。
【図３】コンパイラの処理フローである。
【図４】コンパイラの処理フローである。
【図５】コンパイラの処理の説明図である。
【図６】コンパイラの処理の説明図である。
【図７】コンパイラの処理の説明図である。
【図８】コンパイラの処理の説明図である。
【図９】コンパイラの処理の説明図である。
【図１０】コンパイラの処理の説明図である。
【符号の説明】
１  コンパイル処理装置
２  構文解析手段
３  最適化手段
４  オブジェクト生成手段
５  検出手段
６  生成手段
【図１】
0004712925.tif 000002
【図２】
0004712925.tif 000003
【図３】
0004712925.tif 000004
【図４】
0004712925.tif 000005
【図５】
0004712925.tif 000006
【図６】
0004712925.tif 000007
【図７】
0004712925.tif 000008
【図８】
0004712925.tif 000009
【図９】
0004712925.tif 000010
【図１０】
0004712925.tif 000011