(57)【要約】【課題】コンパイラの不良修正により発生する、不良と無関係なオブジェクトコードの改変を抑止する。【解決手段】  コンパイル手順の各ステップにおいて、不良が再現したかどうかを調べるステップを設け、不良が再現した場合、不良発生原因となったステップに戻り、不良を含まない処理ステップにて処理をやり直す。不良が再現しない場合は従来処理の不良箇所を含むステップにてそのままコンパイルを進める。【選択図】  図２
2005141610.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータ上でコンパイラによりソースプログラムからオブジェクトコードを生成するためのコンパイル方法であって、コンパイラに不良があった場合、不正なオブジェクトが生成されない場合は、不良を修正していないコンパイル方法によりオブジェクトコードを生成し、不正なオブジェクトコードが生成される場合は、コンパイラ不良を修正したコンパイル方法によりオブジェクトコードを生成することを特徴とするコンパイル方法。
【請求項２】
請求項１のコンパイル方法において、コンパイラ不良調査手段により不正なオブジェクトが生成されるかどうかチェックを行うステップと、コンパイラ不良により不正なオブジェクトコードを生成する可能性がある処理を行うステップと、コンパイラ不良が修正された最適化処理を行うステップと、コンパイラ不良調査手段により調査した結果コンパイラ不良によるオブジェクト不正が再現する場合は不良が修正された最適化処理を行い、コンパイラ不良によるオブジェクト不正が再現しない場合は、不良箇所が修正されていない不正なオブジェクトコードを生成する可能性がある最適化処理により最適化を行うよう、処理を切り替えるステップを有することを特徴とするコンパイル方法。
【請求項３】
コンパイラに不良があった場合、不正なオブジェクトが生成されない場合は、不良を修正していないコンパイル方法によりオブジェクトコードを生成し、不正なオブジェクトコードが生成される場合は、コンパイラ不良を修正したコンパイル方法によりオブジェクトコードを生成することを特徴とするコンパイラ。
【請求項４】
オブジェクトコードが改変された場合にコンパイラのユーザに対してその旨を表すメッセージを出力することを特徴とする請求項３記載のコンパイラ。
【請求項５】
請求項１のコンパイル方法を用いたコンパイラであって、オプションまたは指示文により請求項１のコンパイル方法でコンパイルを行うか否かをユーザーの指示に応答して選択する機能を持つコンパイラ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はコンパイラ自身に不良があった場合のコンパイルに関し、コンパイラ不良の修正によるオブジェクトコードの改変を少なくする機能に関する。
【背景技術】
【０００２】
コンパイラは、C言語などのプログラム言語で記述されたプログラムをマイクロプロセッサ上で実行可能なオブジェクトコードに変換するソフトウェアである。コンパイラに不良があった場合、不正なオブジェクトコードへと変換されるため、コンパイラの不良を修正した後、再度コンパイルしてオブジェクトコードを生成しなおす必要がある。
【０００３】
再度のコンパイルにより、オブジェクト不正（生成されるオブジェクトコードが正しくない、生成されるデータが正しくない、その結果生成されたオブジェクトコードが期待した動作をしないなどコンパイラ自身の不良に基づく不正、以下単にオブジェクト不正という）の箇所はコードが修正され、正しいオブジェクトコードになるが、コンパイラ不良の内容によっては、処理の流れ上、不良修正とは直接無関係な箇所までオブジェクトコードが変更されてしまう場合がある。従来技術として特開平１０−２４７１４３号公報「プログラム更新方法」のような、プログラマが自らソースコードを改変したことによりオブジェクトコードが改変された場合に、変更された関数のみ新しいオブジェクトコードに変更する技術はあったが、コンパイラ不良を修正することによりオブジェクトコードが改変される場合については考慮されていなかった。
【０００４】
【特許文献１】特開平１０−２４７１４３号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
プログラムによってはオブジェクトコードを生成した後、その動作が正しいかどうかの検証を多くの時間と手間をかけて行う場合がある。このようなプログラムにおいて、コンパイラ不良によるオブジェクトコードの不正が発生した場合、コンパイラ不良を修正して再度オブジェクトコードの生成を行い、オブジェクトコードが変わった箇所の動作検証をやり直す必要が生ずる。このとき、再検証の時間と手間を少なくするため、コンパイラ不良を修正した場合でもオブジェクト不正と無関係なオブジェクトの変更箇所を極力少なくしたいという要求がある。
【課題を解決するための手段】
【０００６】
コンパイラの不良部分およびその不良によってどのようなオブジェクト不正が生じるかは分かっている。
【０００７】
そして、上記課題解決のため、本発明においてはコンパイラ不良調査手段において予めコンパイラ不良が原因のオブジェクト不正が再現するかどうかを調べる。オブジェクト不正が再現した場合は不良を修正した処理によりコンパイルを行い、オブジェクト不正が再現しない場合には、不良を修正しない処理によってコンパイルを行うことにより、コンパイラ不良の修正によるオブジェクト改変を少なくすることができる。
【発明の効果】
【０００８】
本発明によれば、コンパイラ不良に対応したコンパイラの修正後再コンパイルするとき、オブジェクトコードの変更部分を小さくすることによりオブジェクトコードの再検証の必要な範囲を小さくすることができる。
【発明を実施するための最良の形態】
【０００９】
以下図面を参照しながら本発明の実施例について説明する。
【００１０】
図1は本発明によるコンパイラが稼動する計算機システムの構成図である。図に示すように、計算機システムは、CPU101、ディスプレイ装置102、キーボード103、主記憶装置104、外部記憶装置105より構成されている。外部記憶装置105には、コンパイラ106とソースプログラム107、およびオブジェクトコード108が保持される。コンパイル処理は、CPU101がコンパイラ104を実行することにより行われる。ユーザはキーボード103よりコマンドをCPU101に与え、CPU101は、コンパイラ104を主記憶104に読み込み、コンパイル処理を実行する。コンパイラ106はコンパイル処理中にソースプログラム107を主記憶104に読み込み、オブジェクトコード108に変換して、外部記憶装置105に出力する。ディスプレイ装置102はユーザにコンパイルの終了やエラーを知らせる。
【００１１】
図2は本発明によるコンパイル処理の流れを示したフローチャートである。コンパイラの不良がどんなものかは別途オブジェクトコードを解析して判明できる。本発明のコンパイラの処理は、まずステップ201の構文解析において、ソースプログラム107を読み出して、コンパイラ内部で処理可能な中間コード、記号表を生成する構文解析の処理を行う。構文解析処理については、例えば「エイホ、セシィ、ウルマン著: コンパイラＩ」(サイエンス社、1990年)30頁〜74頁に記載されているので、ここでは説明しない。次にステップの202不良箇所を含むデータフロー解析において、変数の依存関係を調べるデータフロー解析処理を行う。データフロー解析処理については、同じく「エイホ、セシィ、ウルマン著: コンパイラＩＩ」(サイエンス社、1990年)741頁〜772頁に記載されているので、ここでは説明しない。
【００１２】
次に、本発明の特徴的な処理の1つであるステップ203のデータフロー解析不良調査処理において、ステップ202の不良を含むデータフロー解析で検出されるその予め判明している不良により、オブジェクト不正の原因となりえる不正な処理や、不正な内部情報の生成を行ったかどうかを調べる。不正な処理や不正な内部情報の生成を行っていて、かつ現時点で不正なオブジェクトを生成していないが後のステップでオブジェクト不正の検出が不可能または困難な場合、もしくは現時点で不正なオブジェクトを生成していた場合、ステップ207の不良修正済みのデータフロー解析に進み、データフロー解析処理をやり直した後ステップ204に進む。それ以外の場合は、そのままステップ204に進む。次に、ステップ204の不良箇所を含む最適化処理に進み、最適化処理を行う。最適化処理については、「中田 育男 著：コンパイラの構成と最適化」（朝倉書店、1999年）228頁〜482頁に記載されているので、ここでは説明しない。
【００１３】
次に、本発明の特徴的な処理の1つであるステップ205の最適化処理不良調査処理において、ステップ205の不良箇所を含む最適化処理における不良、またはステップ202の不良を含むデータフロー解析における不良による不正処理や、不正な内部情報の生成が原因となって不正なオブジェクトを生成していないかどうかを調べる。不正な処理や不正な内部情報の生成を行っていた場合、さらにどのステップにより行われたかを調べる。不正な処理や、不正な内部情報の生成の原因がステップ202の不良を含むデータフロー解析だった場合、ステップ207の不良修正済みのデータフロー解析に進み、データフロー解析処理をやり直した後ステップ204から処理をやり直す。不正な処理や不正な内部情報の生成の原因がステップ204の不良を含む最適化処理だった場合、ステップ208の不良修正済みの最適化処理に進み、最適化処理をやり直した後ステップ206に進む。不正な処理や不正な内部情報の生成を行っていなかった場合は、そのままステップ206に進む。
【００１４】
次に、ステップ206のオブジェクトコード生成に進み、オブジェクトコードを生成して終了する。オブジェクト生成処理204については、同じく「エイホ、セシィ、ウルマン著: コンパイラＩＩ」(サイエンス社、1990年)624頁〜707頁に記載されているので、ここでは詳しく説明しない。ステップ203、205の不良調査処理は、その段階で検出できる既知のコンパイラ不良がない場合はステップが省略される。また、ステップ202、204の各ステップにおいて、不良がない場合には不良を含まない処理となり、対応する不良解析済みの処理は省略され、省略されたステップへの処理の遷移も存在しなくなる。
【００１５】
一般的に不正なオブジェクトが生成された処理と不良の原因となった処理が離れていると、不良修正による直接不良とは無関係のオブジェクトコードの変更箇所が多くなる。しかし、たとえば関数単位でコンパイル処理を行うコンパイラの場合、オブジェクトコードの改変範囲は関数内に限定されるため、不良が再現した以外の関数へのオブジェクトコードの改変を抑止することが可能である。また、不良原因がデータフロー解析の結果などの内部情報であった場合、実際の不良が発生するのは内部情報を用いて行われる最適化処理においてであったりする。このような場合、最適化処理において不良が発生しなければ、内部情報が不正であってもオブジェクト不正は再現しない。内部情報の不正が生じないようにした場合、オブジェクト不正が再現しない場合においても最適化処理においてオブジェクトコードが改変されることがある。
【００１６】
本発明においては、内部情報の不正であってもステップ206の最適化処理不良調査処理によって可能な限りオブジェクト不正の検出を行うようにすることにより、オブジェクト不正が再現しない場合にオブジェクトコードが改変されることを抑止することができる。本実施例ではステップ202の不良箇所を含むデータフロー解析、およびステップ204の不良箇所を含む最適化処理にコンパイラ不良があると仮定しているが、ほかのステップに不良があった場合も対応する処理を追加することにより対応可能である。
【００１７】
図3は図2の実施例を簡略化した別の実施例による本発明のコンパイル処理の流れを示したフローチャートである。ステップ301の構文解析においてステップ201と同様にソースプログラム107を読み出して、コンパイラ内部で処理可能な中間コード、記号表を生成する構文解析の処理を行う。次にステップ302において、以降の処理を関数単位に処理を行うために未処理関数があるかどうかを調べる。未処理関数がない場合は処理を終了する。
【００１８】
未処理関数がある場合はステップ303に進み、コンパイラ不良の再現する関数かどうかを調べる。コンパイラ不良の再現する関数の場合ステップ304に進み、不良修正済みのコンパイル処理にてデータフロー解析、最適化処理などのコンパイル処理を行った後、ステップ305に進む。
【００１９】
コンパイラ不良の再現しない関数の場合、ステップ306において不良を含むコンパイル処理にてデータフロー解析、最適化処理などのコンパイル処理を行った後、ステップ305に進む、次にステップ305においてオブジェクトコード生成を行った後、ステップ302に戻る。
【００２０】
図4はコンパイラ不良によりオブジェクト不正の再現するソースプログラム例である。ここでは、1byteのデータをメモリからレジスタに読み込む際、必要な符号拡張命令が生成されない不良がステップ306不良を含むコンパイル処理に含まれるものとする。ステップ404からステップ407の関数 func1 においては、1バイトの変数 ”a” を4バイトに拡張した後、1を加算して、ふたたび変数”a”に格納する処理を行っている。ステップ409からステップ412の関数func2においては、1バイトの変数”a”を4バイトに拡張した後、1を加算して4バイトの変数”b” に格納している。ステップ414からステップ417の関数func3においては、1バイトの変数”a”を4バイトに拡張した後1ビット左シフトした後、再び変数”a”に格納している。
【００２１】
図5は図4のソースプログラムから生成されることを想定している不良を含まない正しいオブジェクトコードの例であるステップ502、ステップ508、ステップ514に符号拡張命令が出力されている。ここではレジスタr1のサイズは4バイトであると仮定している。
【００２２】
図6は図4のソースプログラムから生成されたオブジェクト不良を含むオブジェクトコードの例である。ステップ601、ステップ606、ステップ611において、1バイトデータをレジスタに読み込んだ後、図5においてステップ502、ステップ508、ステップ514 で出力されていた符号拡張命令が、ここで想定している符号拡張命令が生成されない不良により符号拡張命令が生成されていない。
【００２３】
図7は図4のソースプログラムを図3のコンパイル処理を用いてコンパイルし、オブジェクト不正が再現しない場合のオブジェクトコードの改変を抑止して生成したオブジェクトコード例である。不良を含まない手コンパイル手順では、ステップ701、ステップ706、ステップ712の1バイトロード命令によりメモリから1バイトのデータをレジスタに読み込んだ後、符号拡張が生成されるが、ステップ701、ステップ712 においては、レジスタに読み込んだ後、それぞれ加算、左シフト演算を行い、ふたたび1バイトの領域にストアしているため、符号拡張命令が出力されなくても結果に変化はない。よってオブジェクト不正とはならないため、符号拡張命令を出さないほうがオブジェクトコードの改変は少なくすることができる。
【００２４】
次に図4を例に取り、図３のフローに従って、図4のソースプログラムから図7のオブジェクトコードを生成する手順を説明する。まずステップ301構文解析においてステップ401から417のソースプログラムを読み出して、コンパイラ内部で処理可能な中間コード、記号表を生成する構文解析の処理を行う。次にステップ302において、以降の処理を関数単位に処理を行うために未処理関数があるかどうかを調べる。最初はステップ404からステップ407にて定義されている関数func1が未処理関数であるため、この関数について処理を行う。
【００２５】
次にステップ303に進み、コンパイラ不良の再現する関数かどうかを調べる。func1には必要な符号拡張命令が出力されないコンパイラ不良が再現する箇所があるが、図7の説明で述べたように、符号拡張が出力されていなくてもオブジェクト不正にはならない、よって、不良が再現しない関数とみなされ、ステップ306不良を含むコンパイル処理に進み、データフロー解析、最適化処理などのコンパイル処理を行った後、ステップ305においてステップ702からステップ704の符号拡張命令が生成されないままのオブジェクトコードを生成した後、ステップ302にもどる。
【００２６】
次にステップ302において、未処理関数があるかどうかを調べ、ステップ409からステップ412で定義されている関数func2 が未処理関数であるためこの関数についての処理を行う。次にステップ303に進み、コンパイラ不良の再現する関数かどうかを調べる。func2には必要な符号拡張命令が出力されないコンパイラ不良が再現する箇所があり、正しい結果が得られない場合のある不正なオブジェクトであるため、不良が再現する関数とみなされ、ステップ304の不良修正済みのコンパイル処理に進み、データフロー解析、最適化処理などのコンパイル処理を行った後、ステップ305においてステップ706からステップ710の符号拡張命令を含む図6のオブジェクトコードからは改変されたオブジェクトコードを生成した後、ステップ302にもどる。次にステップ302において、未処理関数があるかどうかを調べ、ステップ414からステップ417で定義されている関数func3 が未処理関数であるためこの関数についての処理を行う。
【００２７】
次にステップ303に進み、コンパイラ不良の再現する関数かどうかを調べる。func3には必要な符号拡張命令が出力されないコンパイラ不良が再現する箇所があるが、図7の説明で述べたように、符号拡張が出力されていなくてもオブジェクト不正にはならない。よって、不良が再現しない関数とみなされ、ステップ306の不良を含むコンパイル処理に進み、データフロー解析、最適化処理などのコンパイル処理を行った後、ステップ305においてステップ712からステップ715の符号拡張命令が生成されないままのオブジェクトコードを生成した後、ステップ302にもどる。次にステップ302において、未処理関数があるかどうかを調べ、未処理関数は残っていないため、処理を終了する。以上のような処理により図7のオブジェクトコードが生成可能である。
【００２８】
コンパイラのユーザにコンパイラの不良の報告があった場合、ユーザは、図２、図３に実施例を示したようなコンパイラを用いて、不正なオブジェクトが生成されない場合は不良を修正していないコンパイル方法によりオブジェクトコードを生成し、不正なオブジェクトコードが生成される場合はコンパイラ不良を修正したコンパイル方法によりオブジェクトコードを生成するようオプション指定や指示文挿入を行い、ソースプログラムを再コンパイルする。
【００２９】
また、コンパイラの不良を回避するためのオブジェクトの改変があった場合、コンパイラは、改変された旨、およびどこが（例えば、どの関数が）改変されたかを示すメッセージを出力する。コンパイラのユーザは、このメッセージにより、どこが改変されたかを知ることができる。したがって、コンパイラのユーザはメッセージにより示された箇所についてのみ動作検証をやり直せばよく、再検証する範囲を狭めることが出来る。
【００３０】
なお実施例では構文解析処理やオブジェクトコード生成処理にはコンパイラ不良を含んでいないが、これらの処理にコンパイラ不良を含む場合でも不良が再現するかどうかを調べる処理、および、不良修正済みの処理を追加することにより対応可能である。
【図面の簡単な説明】
【００３１】
【図１】本発明のコンパイラ不良の修正によるオブジェクトコードの改変を少なくする機能を有するコンパイル方法を用いたコンパイラが稼動する計算機システムの構成図。
【図２】本発明のコンパイラ不良の修正によるオブジェクトコードの改変を少なくする機能を有するコンパイル方法の手順を示すフローチャート。
【図３】本発明のコンパイラ不良の修正によるオブジェクトコードの改変を少なくする機能を有するコンパイル方法の図２を簡略化した手順を示すフローチャート。
【図４】コンパイラ不良によりオブジェクト不正が再現するソースプログラム例を示す図。
【図５】図４のソースプログラム例から不良修正済みのコンパイラにより生成されたオブジェクトコード例を示す図。
【図６】図４のソースプログラム例からコンパイラ不良を含むコンパイラにより生成されたオブジェクト不正を含むオブジェクトコード例を示す図。
【図７】図４のソースプログラム本発明によりオブジェクトコードの改変を抑えて生成されたオブジェクトコード例を示す図。
【符号の説明】
【００３２】
２０１は不良構文解析の処理ブロック、２０２は不良箇所を含むデータフロー解析の処理ブロック、２０３はデータフロー解析不良調査処理の処理ブロック、２０４は不良箇所を含む最適化処理の処理ブロック、２０５は最適化処理不良調査処理の処理ブロック、２０６はオブジェクトコード生成の処理ブロック、２０７は不良修正済みのデータフロー解析の処理ブロック、２０８は不良修正済みの最適化処理の処理ブロックを示す。
【図１】
2005141610.tif 000003
【図２】
2005141610.tif 000004
【図３】
2005141610.tif 000005
【図４】
2005141610.tif 000006
【図５】
2005141610.tif 000007
【図６】
2005141610.tif 000008
【図７】
2005141610.tif 000009