(57)【要約】【課題】コンパイルの実行及び／又はコンパイルの管理を行うことを目的とする。【解決手段】一実施形態は、複数のオペレーションを含むソースからオブジェクトへのコンパイル、及び前記コンパイルの管理を行うプログラムであって、前記オブジェクトは複数の部分オブジェクトを有し、前記オペレーションに対応する前記ソースの一部を前記部分オブジェクトにコンパイルし、該プログラムのうち、前記部分オブジェクトの前記コンパイルに関与した部分を特定する情報を生成し、前記部分オブジェクトに関連付けて、対応する前記オペレーションを表す情報、及び前記コンパイルに関与した部分を特定する情報を含むオブジェクト展開情報をメモリに記憶する、処理をコンピュータに実行させるプログラムであって、前記オブジェクト展開情報は、コンパイル障害に関連する前記コンパイルに関与した部分により生成された前記部分オブジェクトを識別するために用いられる、プログラムを提供する。【選択図】図１３
2014013435.tif 000002
【特許請求の範囲】
【請求項１】
複数のオペレーションを含むソースからオブジェクトへのコンパイル、及び前記コンパイルの管理を行うプログラムであって、前記オブジェクトは複数の部分オブジェクトを有し、
前記オペレーションに対応する前記ソースの一部を前記部分オブジェクトにコンパイルし、
該プログラムのうち、前記部分オブジェクトの前記コンパイルに関与した部分を特定する情報を生成し、
前記部分オブジェクトに関連付けて、対応する前記オペレーションを表す情報、及び前記コンパイルに関与した部分を特定する情報を含むオブジェクト展開情報をメモリに記憶する、
処理をコンピュータに実行させるプログラムであって、
前記オブジェクト展開情報は、コンパイル障害に関連する前記コンパイルに関与した部分により生成された前記部分オブジェクトを識別するために用いられる、
プログラム。
【請求項２】
前記オブジェクト展開情報は、コンパイル障害に関連する複数の前記コンパイルに関与した部分により生成された複数の前記部分オブジェクトの位置関係が、所定の関係を満たすか否かを識別するために用いられる、
請求項１に記載のプログラム。
【請求項３】
前記オペレーションを表す情報は、前記コンパイルの過程において生成される中間言語に基づき決定される、
請求項１又は２に記載のプログラム。
【請求項４】
前記コンパイルに関与した部分を特定する情報は、前記コンパイルの過程において生成される中間言語をオブジェクトに変換するために用いる中間言語定義のバージョン、及び、前記中間言語定義の部分を特定する情報を含む、
請求項１ないし３のうちいずれか１項に記載のプログラム。
【請求項５】
前記オブジェクトと、前記オブジェクト展開情報とを１つのファイルに結合する処理を、コンピュータに実行させる、請求項１ないし４のうちいずれか１項記載のプログラム。
【請求項６】
複数のオペレーションを含むソースからオブジェクトへのコンパイル、及び前記コンパイルの管理をコンピュータが行う方法であって、前記オブジェクトは複数の部分オブジェクトを有し、
前記オペレーションに対応する前記ソースの一部を前記部分オブジェクトにコンパイルし、
前記コンパイルを実行するプログラムのうち、前記部分オブジェクトの前記コンパイルに関与した部分を特定する情報を生成し、
前記部分オブジェクトに関連付けて、対応する前記オペレーションを表す情報、及び前記コンパイルに関与した部分を特定する情報を含むオブジェクト展開情報をメモリに記憶する、
処理を有する方法であって、
前記オブジェクト展開情報は、コンパイル障害に関連する前記コンパイルに関与した部分により生成された前記部分オブジェクトを識別するために用いられる、
方法。
【請求項７】
複数のオペレーションを含むソースからオブジェクトへのコンパイル、及び前記コンパイルの管理を行う装置であって、前記オブジェクトは複数の部分オブジェクトを有し、
前記オペレーションに対応する前記ソースの一部を前記部分オブジェクトにコンパイルする、コンパイル部と、
前記コンパイルを実行するプログラムのうち、前記部分オブジェクトの前記コンパイルに関与した部分を特定する情報を生成する、コンパイル関与生成部と、
前記部分オブジェクトに関連付けて、対応する前記オペレーションを表す情報、及び前記コンパイルに関与した部分を特定する情報を含むオブジェクト展開情報をメモリに記憶する、オブジェクト展開情報作成部と、
を有する装置であって、
前記オブジェクト展開情報は、コンパイル障害に関連する前記コンパイルに関与した部分により生成された前記部分オブジェクトを識別するために用いられる、
装置。
【請求項８】
複数のオペレーションを含むソースからオブジェクトへのコンパイル、及び前記コンパイルの管理を行うプログラムであって、前記オブジェクトは複数の部分オブジェクトを有し、
前記オペレーションに対応する前記ソースの一部を前記部分オブジェクトにコンパイルし、
該プログラムのうち、前記部分オブジェクトの前記コンパイルに関与した部分を特定する情報を生成し、
前記部分オブジェクトに関連付けて、対応する前記オペレーションを表す情報、及び前記コンパイルに関与した部分を特定する情報を含むオブジェクト展開情報をメモリに記憶し、
前記オブジェクト展開情報に基づき、コンパイル障害に関連する前記コンパイルに関与した部分により生成された前記部分オブジェクトを識別する、
処理をコンピュータに実行させるプログラム。
【請求項９】
前記オブジェクトと、前記オブジェクト展開情報に基づき、コンパイル障害に関連する複数の前記コンパイルに関与した部分により生成された複数の前記部分オブジェクトの位置関係が、所定の関係を満たすか否かを識別する、
処理をコンピュータに実行させる請求項８に記載のプログラム。
【請求項１０】
複数のオペレーションを含むソースからオブジェクトへのコンパイル、及び前記コンパイルの管理を行う方法であって、前記オブジェクトは複数の部分オブジェクトを有し、
前記オペレーションに対応する前記ソースの一部を前記部分オブジェクトにコンパイルし、
前記コンパイルを実行するプログラムのうち、前記部分オブジェクトの前記コンパイルに関与した部分を特定する情報を生成し、
前記部分オブジェクトに関連付けて、対応する前記オペレーションを表す情報、及び前記コンパイルに関与した部分を特定する情報を含むオブジェクト展開情報をメモリに記憶し、
前記オブジェクト展開情報に基づき、コンパイル障害に関連する前記コンパイルに関与した部分により生成された前記部分オブジェクトを識別する、
処理を有する方法。
【請求項１１】
複数のオペレーションを含むソースからオブジェクトへのコンパイル、及び前記コンパイルの管理を行う装置であって、前記オブジェクトは複数の部分オブジェクトを有し、
前記オペレーションに対応する前記ソースの一部を前記部分オブジェクトにコンパイルする、コンパイル部と、
前記コンパイルを実行するプログラムのうち、前記部分オブジェクトの前記コンパイルに関与した部分を特定する情報を生成する、コンパイル関与生成部と、
前記部分オブジェクトに関連付けて、対応する前記オペレーションを表す情報、及び前記コンパイルに関与した部分を特定する情報を含むオブジェクト展開情報をメモリに記憶する、オブジェクト展開情報作成部と、
前記オブジェクト展開情報に基づき、コンパイル障害に関連する前記コンパイルに関与した部分により生成された前記部分オブジェクトを識別する、識別部、
とを有する装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイルの実行及び／又はコンパイルの管理を行う方法、装置、及びプログラムに関する。
【背景技術】
【０００２】
一般に、ソフトウエアは、コンパイラによって、ソースプログラムから実行形式の機械語のオブジェクトに変換される。このオブジェクトを格納したファイルは、ファイルの拡張子として、「.exe」や「.dll」などが付けられるものがある。
【０００３】
一般にコンパイラは、ソースプログラムを中間言語に一旦翻訳し、その後、中間言語を最終的な機械語に翻訳する作業を行うことが多い。
【０００４】
仮に、コンパイラ自体に障害（バグ）が発見された場合には、その障害を含むコンパイラを用いて生成されたオブジェクトには、障害が含まれている可能性がある。なお、コンパイラは、細心の注意を払って開発される基本ソフトウエアである。このため、コンパイラ自体の障害にバグが存在することは、非常に稀であるが、皆無であるとは言えず、コンパイラ開発後、かなりの時間が経過してから、障害が発見されることもある。そして、コンパイラの障害（バグ）は、そのコンパイラが生成した一部のオブジェクトに障害を内在させてしまう可能性がある。なお、コンパイラに障害があっても、その障害を持つコンパイラから生成された全てのオブジェクトに障害が存在するとは限らない。通常は、コンパイル時にコンパイラの障害部分が利用されたオブジェクトにだけ、障害が内在することがある。
【０００５】
コンパイラのリリースから、コンパイラの障害が発見されるまでには、一定の期間が存在する。このため、コンパイラの障害が発見された時点では、既にアプリケーションソフトウエア開発が相当進んでいたり、あるいは、障害のあるコンパイラでコンパイルしたオブジェクトファイルを業務で使用していたりする場合も想定される。
【０００６】
また、コンパイラにも複数のバージョンが存在することが通常である。したがって、コンパイラの障害が発見された場合に、既にコンパイル済みのオブジェクトの複数の資産に対して、コンパイラの障害の影響が及んでいるのか否かの判断は難しい。また、コンパイラ障害の影響がオブジェクトに及んでいる場合に、オブジェクトファイルのどの部分が影響を受けているのか等を発見し、これに対処するニーズが存在する。
【０００７】
しかしながら、オブジェクトの機械語命令の並び（又はパターン）から、コンパイラの障害の影響を受けているかを判断することができない場合が存在する。なぜなら、オブジェクトから、ソースコード（又は中間言語）の範囲、命令パターン、使用されたコンパイラ部分等が、必ずしも特定できないからである。このため、正しいオブジェクトに対しても、コンパイラの障害が影響していると誤って検出してしまう可能性がある。言い換えれば、オブジェクトだけからでは、コンパイル時の状況を完全には把握することができない。また、コンパイラや、中間言語をオブジェクトに変換する中間言語定義ファイルのバージョンなどの情報も必用な場合があるが、必ずしも、オブジェクトファイルだけからこれらのバージョンを取得することができるとは限らない。
【０００８】
他の対処法としては、ソース資産がある場合には、障害を取り除いたコンパイラで、再度コンパイルし直すことも可能である。しかしながら、開発されたソース資産が膨大である場合には、実行が難しい。
【０００９】
或いは、障害の発見されたコンパイラの部分が利用されたか否かをチェックできるよう、コンパイラを改造することが考えられる。この改造されたコンパイラでソースをコンパイルすることによって、コンパイラの障害部分が、既存のオブジェクトのコンパイルに影響したかなどを確認することができる。しかしながら、この場合には、開発環境を用意してコンパイラを改造し、この改造コンパイラでソースをコンパイルすることとなり、コストと時間がかかる。
【００１０】
中間言語を解析することで、静的にユーザプログラムのスタックオーバフローが発生する可能性のある障害を検出し、ユーザアプリケーションの障害を判断する技術が存在する（例えば、特許文献１参照）。
【００１１】
また、中間言語の行番号及びコンパイラが内部で自動生成する内部変数のシンボル情報をデバック情報とし、中間言語でのブレークポイントの設定とステップ実行、内部変数の参照を行うことにより、ソースレベル又は中間言語レベルでのデバックを可能とした技術が存在する（例えば、特許文献２参照）。
【先行技術文献】
【特許文献】
【００１２】
【特許文献１】特開２００４−１７１０６４号公報
【特許文献２】特開２０００−３５３１１２号公報
【発明の概要】
【発明が解決しようとする課題】
【００１３】
１つの側面では、本発明は、コンパイルの実行及び／又はコンパイルの管理を行うことを目的とする。
【課題を解決するための手段】
【００１４】
一態様のプログラムは、複数のオペレーションを含むソースからオブジェクトへのコンパイル、及び前記コンパイルの管理を行うプログラムであって、前記オブジェクトは複数の部分オブジェクトを有し、前記オペレーションに対応する前記ソースの一部を前記部分オブジェクトにコンパイルし、該プログラムのうち、前記部分オブジェクトの前記コンパイルに関与した部分を特定する情報を生成し、前記部分オブジェクトに関連付けて、対応する前記オペレーションを表す情報、及び前記コンパイルに関与した部分を特定する情報を含むオブジェクト展開情報をメモリに記憶する、処理をコンピュータに実行させるプログラムであって、前記オブジェクト展開情報は、コンパイル障害に関連する前記コンパイルに関与した部分により生成された前記部分オブジェクトを識別するために用いられる。
【発明の効果】
【００１５】
一態様によれば、コンパイルの実行及び／又はコンパイルの管理を簡便に行うことができる。
【図面の簡単な説明】
【００１６】
【図１】一実施形態に従った、コンパイルの概略を示すフローチャートである。
【図２】中間言語、オブジェクト、及びオブジェクト展開情報の例を示す図である。
【図３】中間言語定義の実施形態を示す図である。
【図４】一実施形態におけるレジスタ割り付けに係る障害の例を示す図である。
【図５】コンパイラの障害がオブジェクトに影響している場合の例を示す図である。
【図６】コンパイラの障害がオブジェクトに影響していない場合の例を示す図である。
【図７】一実施形態の処理のフローチャートである。
【図８】一実施形態の障害の特定の例を示す図である。
【図９】コンパイルでの障害がオブジェクトに影響しているか否かを確認するフローチャートである。
【図１０】一実施形態の利用の例を示す図である。
【図１１】中間言語定義に一実施形態をインプリメントする例を示す図である。
【図１２】中間言語定義の具体例を示す図である。
【図１３】一実施形態の機能ブロック図である。
【図１４】一実施形態のハードウェアの構成を示す図である。
【発明を実施するための形態】
【００１７】
以下に、図面を用いて本発明の実施形態を詳細に説明する。なお、以下の実施形態は、発明を理解するためのものであり、本発明の範囲を限定するためのものではない点に留意すべきである。また、以下の複数の実施形態は、相互に排他的なものではない。したがって、矛盾が生じない限り、別々に記載した実施形態の各要素を組み合わせることも意図されていることに留意すべきである。また、請求項に記載された方法やプログラムに係る発明は、矛盾のない限り処理の順番を入れ替えてもよく、あるいは、複数の処理を同時に実行してもよい。そして、これらの実施形態も、請求項に記載された発明の技術的範囲に包含されることは言うまでもない。
【００１８】
また、記録媒体に記憶されたコンピュータが読み出したプログラムコードを実行することにより、後述の実施形態の機能が実現されるだけでなく、そのプログラムコードの指示に基づき、コンピュータ上で稼働しているＯＳなどの他のプログラムが実際の処理の一部または全部を行ない、その処理によって実施形態の機能が実現される場合も、本発明に含まれることは言うまでもない。
【００１９】
なお、本明細書では、コンパイルの対象となっている原始プログラムを「ソース」と呼ぶ。そして、ソースをコンパイルした機械語の集合を「オブジェクト」と呼ぶ。また、コンパイルの途中で生成される中間的な言語を「中間言語」と呼ぶ。また、中間言語を機械語に変換する規則を含む定義を「中間言語定義」と呼ぶ。なお、本発明は、コンパイルにおいて、必ずしも中間言語を経る必要はなく、ソースからオブジェクトをコンパイルしてもよい。したがって、本発明は、中間言語の生成、中間言語の処理等の存在に限定されるものではない。また、機械語については、その内容の理解を助けるため、アセンブラ言語により表記する場合がある。
【実施例】
【００２０】
図１は、一実施形態に従った、コンパイラ１００によるコンパイルの概略を示すフローチャートを示している。
【００２１】
ソース１２０は、複数の命令を含むソフトウエアである。ソースは、ＣＯＢＯＬ言語、Ｃ言語等のプログラム言語に従った規則で記述される。本発明は、特定のプログラム原語に限定されるものではない。
【００２２】
ステップ１０２において、ソースの字句解析が行われる。
【００２３】
ステップ１０４において、字句解析の結果を利用して、ソースの構文解析が行われる。
【００２４】
ステップ１０６において、解析された構文の最適化が行われる。
【００２５】
この最適化によって、中間言語１３０が生成される。以上の各ステップは、コンパイラのフロントエンド（ＦＥ）と呼ぶ。中間言語は、その後の処理に利用される。
【００２６】
ステップ１０８において、機械語コードの集合（オブジェクト）が生成される。加えて、機械語に対応した形でオブジェクト展開情報が生成される。このオブジェクト展開情報は、コンパイラ自体の障害が発見された場合に、コンパイラの障害部分が、機械語のどの部分に影響したか等を探索するために用いられてもよい。このステップ１０８は、コンパイラのバックエンド（ＢＥ）と呼び、少なくともオブジェクト及びオブジェクト展開情報１４０が生成される。
【００２７】
図２は、中間言語、オブジェクト、及びオブジェクト展開情報の例を示している。なお、説明を分かりやすくするために、図面における機械語については、アセンブラ表記を用いている点に留意すべきである。なお、ソースについては、実施形態の説明を分かりやすくするために、省略している。
【００２８】
図２（Ａ）は、中間言語とオブジェクトとを、対応付けて示している。機械語のアセンブラ表記については、オフセットを付記している。オフセットは、ソースの先頭からの距離を表す。なお、図においては、分かりやすさを考慮して、便宜的にオフセットの代わりに、１０の刻みを有する行番号を付している点に留意すべきである。そして、１つ又は複数のオブジェクトのアセンブラ表記に対応させて、中間言語のメモリ上での位置を表す情報としてオフセット（行番号）を併記している。
【００２９】
図２（Ｂ）は、オブジェクト展開情報の例を示している。オブジェクト展開情報にも、オフセットの代替として行番号が付されている。機械語の命令２１２、２１４、及び２１６は、いずれもＬＯＡＤ・ＳＴＯＲＥ命令であるが、対応する中間言語は異なっている。すなわち、ＬＯＡＤ／ＳＴＯＲＥ命令２１２は、中間言語ＡＤＤ命令２２２を機械語に展開したものである。ＬＯＡＤ／ＳＴＯＲＥ命令２１４は、中間言語ＭＯＶ命令２２４を機械語に展開したものである。ＬＯＡＤ／ＳＴＯＲＥ命令２１６は、中間言語ＡＤＤ命令２２６を機械個に展開したものであることが分かる。ここで留意すべき点は、機械語だけからは、展開前の中間言語がどのようなものであったかを判断することができないという点である。加えて、機械語命令だけからは、コンパイラのどの部分が用いられて生成されたかということも分からない点に留意すべきである。このことは、コンパイラによる障害が後に発見された場合、機械語命令だけからでは、コンパイラの障害部分の影響を受けているか否かを正確には判断できないことを意味している。このため、本実施形態においては、図２（Ｂ）に示すオブジェクト展開情報を機械語に対応させて保持しておくことにより、コンパイラによる障害部分の影響を受けたか否かを判断することができる。
【００３０】
図２（Ｂ）におけるオフセット位置００４２０のオブジェクト展開情報２３２は、以下の内容を含んでいる。
[ADD],1.5,W,W,W,00190,R4,R5
ここで
「[ADD]」は、中間言語がADD命令であることを示している。中間言語の名前、又は、中間言語を定義している中間言語定義の名前を用いてもよい。中間言語の名前、又は、中間言語を定義している中間言語定義の名前は、オペレーションの一例である。
「1.5」は、中間言語定義のバージョンが1.5であることを示している。
「W,W,W,」は、オペランド割り付け情報を示しており、Ｗは、ユーザデータであることを示している。Ｗが３つあることは、オペランドが3つあることを示している。
「00190」は、機械語命令のオフセット（機械語命令の位置）を示している。なお、この実施形態では、オフセットとして、行番号を便宜的に用いている点に留意すべきである。オフセット00190の機械語命令は、「LOAD  -30000」である。そして、オフセット00430に示されるオブジェクト展開情報の機械語命令オフセットが「00210」を示していることから、中間言語ADD命令は、機械語のオフセット00190及び00200の2つの命令すなわち、
「LOAD  -30000
STORE  DATA1」
に対応することが分かる。
「R4,R5」は、ADD命令の中間言語定義の中の基本ブロックのうち、ルート４とルート５がコンパイル時に利用されたことを示している。この情報を利用することにより、中間言語定義の中の利用された基本ブロック（すなわちルート）を特定することができる。基本ブロック（すなわちルート）の詳細は、図３を用いて後述する。
【００３１】
同様に、図２（Ｂ）のオフセット00440のオブジェクト展開情報２３４は、以下の情報を含んでいる。
[MOV],1.0,W,W,00230,R2
この情報から、中間言語は、MOV命令であり、中間言語定義のバージョンは、1.0であり、２つのオペランドは、共にユーザデータであること、機械語命令は、オフセット00230から開始されること、MOV命令の中間言語定義の基本ブロック（ルート）R2が利用されたことが分かる。
【００３２】
同様に図２（Ｂ）のオフセット00420のオブジェクト展開情報２３６は、以下の情報を含んでいる。
[ADD],1.5,C,C,C,00270,R4,R5
この情報から、中間言語は、ADD命令であり、中間言語定義のバージョンは、1.5であり、３つのオペランドは、コンパイラ管理データであること（Cは、コンパイラ管理データを意味する）、機械語命令は、オフセット00270から開始されること、ADD命令の中間言語定義の基本ブロック（ルート）R4,R5が利用されたことが分かる。
【００３３】
例えば、ADD命令の中間言語定義の基本ブロック（ルート）R4及びR5に関連した障害が発見された場合には、オブジェクト展開情報を検索し、ADD命令であり、かつR4及びR5が存在するオブジェクト管理情報を検索すればよい。この検索によって、オブジェクト展開情報２３２と２３６がヒットする。この結果から、機械語の命令２１２と２１６が、コンパイラの障害によって影響を受けていることが分かる。
【００３４】
図３は、中間言語定義の実施形態を示している。
【００３５】
図３（Ａ）は、ADD命令の中間言語定義の具体例を示している。この中間言語定義においては、２つのオペランドOP2及びOP3が、定数であるか変数であるかに従って、中間言語を具体的な機械語に変換する規則が定義されている。中間言語定義は、その中に存在する複数の分岐命令を境界として、複数の基本ブロックであるルートに分けられる。図３（Ａ）においては、基本ブロックとしてルート１ないしルート５が示されている。このように、中間言語定義を複数のルートに分け、このルートが利用された情報を図２に示したように、オブジェクト管理情報に含めることにより、中間言語のどのルートが利用されたのかを知ることができる。
【００３６】
図３（Ｂ）は、CALL命令の中間言語定義を示している。この中間言語定義では、FOR部分は分岐の対象となるため、ルート１およびルート２が示されている。
【００３７】
図３（Ｃ）は、MOV命令の中間言語定義を示している。この場合には、ルート１ないしルート３に分割されていることが分かる。
【００３８】
図４は、一実施形態におけるレジスタ割り付けに係る障害の例を示している。
【００３９】
この障害の例では、３つの命令が順番に並んでいる命令パターンが存在する場合（アドレス計算命令、アドレス計算命令、MOV命令の場合）に、レジスタ割り付けの障害が発生する例を示している。この場合、LD命令は、レジスタreg2を利用している。このLD命令は、SETHI命令よりも前に割り当て済みのレジスタが利用されることを前提としている。しかしながら、図４の例においては、LD命令の直前のADD命令において、reg2を変更してしまっている。従って、LD命令では、誤ったアドレスからデータをロードしており、障害が発生している。この場合の障害は、図４に示す一連の機械語命令パターンが存在する場合に発生する障害であり、かつ、その元となった中間言語が、それぞれアドレス計算命令、アドレス計算命令、MOV命令である場合に発生する。しかしながら、機械語のパターンが図４に示すパターンであっても、元となった中間言語が、それぞれアドレス計算命令、アドレス計算命令、MOV命令のパターンの間に他の命令が存在する場合には、この障害は発生しない。
【００４０】
図５は、コンパイラの障害がオブジェクトに影響している場合の例を示している。図５（Ａ）に示すように、機械語５０２と機械語５０４のパターンは、図４に示した機械語パターンと一致している。そして、図５（Ｂ）のオブジェクト展開情報に示されるように、元となった中間言語の命令が、アドレス計算命令、アドレス計算命令、MOV命令の場合の順に並んでいることがわかる。したがって、機械語命令のパターンと、オブジェクト展開情報に示された、それぞれの機械語に対応する中間言語のパターンとをチェックすることにより、コンパイラの障害がオブジェクトに影響していることが確認できる。
【００４１】
図６は、コンパイラの障害がオブジェクトに影響していない場合の例を示している。図６（Ａ）は、オブジェクト内の機械語を示している。機械語６０２と機械語６０４は、図４に示した機械語のパターンと一致している。しかしながら、図６（Ｂ）に示すオブジェクト展開情報には、２つのアドレス計算命令の間に中間言語の加算命令６１２に対応する機械語が存在していることが分かる。このため、中間言語の命令パターンは、アドレス加算、加算、アドレス加算、文字比較となり、図４に示した中間言語の命令パターンとは一致していない。したがって、図４に示すコンパイラの障害は、図６に示すオブジェクトの機械語には影響していないことが分かる。
【００４２】
このように、オブジェクト内の機械語の命令パターンと、オブジェクト展開情報の中間言語の命令パターンを比較することにより、図４に示したコンパイラの障害が、オブジェクトに影響しているか否かが判断できる。
【００４３】
なお、コンパイラの障害は、機械語の命令パターンと、中間言語の命令パターンとの組合せに限定されるものではない。たとえば、オペランドがユーザデータであるか、コンパイラ管理データであるか、機械語定義のバージョン、機械語定義のルート情報等を組み合わせて、障害の内容に応じて合致するパターンは異なる。したがって、障害に応じて、適切なパターンを定義し、そのパターンに合致するオブジェクトの部分を探索することが望ましい。上記の説明は、コンパイラ障害のオブジェクトへの波及の探索に関する一例に過ぎない点に留意すべきである。
【００４４】
図７は、一実施形態の処理のフローチャートを示している。なお、図１に示したフロントエンドの部分は、省略し、バックエンドの部分のみを示す。
【００４５】
まず、フロントエンドで生成された中間言語１３０が、この処理に投入される。
【００４６】
ステップ７０２において、中間言語１３０の先頭の中間言語を取得し、処理対象とする。
【００４７】
ステップ７０４において、中間言語をコンパイルし、中間言語に対応する機械語を含む部分オブジェクトを生成する。
【００４８】
ステップ７０８において、コンパイルに関与した部分、すなわちバージョン等を含む中間言語定義名、利用されたルート等を特定した展開情報を取得する。
【００４９】
ステップ７１０において、生成された部分オブジェクトとオブジェクト展開情報とを対応付けてメモリに記憶する。
【００５０】
ステップ７１２において、処理した中間言語が、中間言語１３０の最後の中間言語であるか否かが判断される。判断が「いいえ」であれば、ステップ７２０に移る。判断が「はい」であれば、終了する。
【００５１】
ステップ７２０において、中間言語１３０の次の中間言語を処理対象とするために取得する。そして、処理はステップ７０４に移る。
【００５２】
以上の処理によって、オブジェクト及びオブジェクト展開情報１４０が生成される。
【００５３】
なお、上記のフローのステップは、この順番に処理されなくてもよい。例えば、ステップ７０４とステップ７０８は、同時に実行されてもよい。或いは、これらは、逆の順番に実行されてもよい。
【００５４】
図８は、一実施形態の障害の特定の例を示している。
【００５５】
この場合には、文字比較の中間言語を機械語に変換する中間言語定義のルートR53に関連して、障害が発見された例を示している。
【００５６】
図８（Ａ）は、中間言語定義を示している。中間言語定義の変換定義８０２に誤りが発見された場合を示している。変換定義８０２は、本来以下の命令として定義されるべきものである。
ROL  w0,16
そして、この部分のルートは、setROOT(53)命令によって、ルート５３（R53）と定義されている。
【００５７】
したがって、コンパイラの障害がオブジェクトに及んでいる場合には、対応するオブジェクト展開情報の中に、文字比較命令でかつルートがR53であるエントリが存在することとなる。
【００５８】
図８（Ｂ）に示すように、文字比較の命令であり、かつルート５３（R53）が存在するエントリ８１２が発見された。したがって、オフセット0000001B0に存在する機械語の部分に、コンパイラの障害が及んでいることが分かる。なお、図６（Ｂ）におけるオフセットは、１６進数で表現されている点に留意すべきである。
【００５９】
図９は、コンパイルでの障害がオブジェクトに影響しているか否かを確認するフローチャートを示している。
【００６０】
図９（Ａ）は、オブジェクト展開情報を確認するフローチャートを示している。このフローは、たとえば、オブジェクト展開情報だけを確認することで、コンパイル障害の影響が確認できる場合（例えば、障害に関与している中間言語定義のバージョンと、そのルートをチェックする場合）に利用できる。
【００６１】
ステップ９０２において、オブジェクト展開情報を読み込む。
【００６２】
ステップ９０４において、コンパイル障害と関連する（問題となる）中間言語定義のバージョンと、ルート情報を検索する。
【００６３】
ステップ９０６において、オブジェクト展開情報に、検索にヒットするエントリが存在したかがチェックされる。チェック結果が「はい」であれば、ステップ９０８に移る。チェック結果が「いいえ」であれば、ステップ９０９に移る。
【００６４】
ステップ９０８において、障害があったことを、ディスプレイ等に出力させてもよい。また、オブジェクト展開情報の検索にヒットした部分を解析し、コンパイル障害の影響を受けている機械語のオフセットアドレス情報、オフセットアドレスの機械語等を表示させてもよい。
【００６５】
ステップ９０９において、障害が発見されなかったことを、ディスプレイ等に出力させてもよい。
【００６６】
図９（Ｂ）は、オブジェクトにおける機械語のパターンと、オブジェクト展開情報との両者の組合せによる障害のパターンを検出するフローチャートを示している。
【００６７】
ステップ９１２において、オブジェクト展開情報を読み込む。
【００６８】
ステップ９１４において、オブジェクトを読み込む。
【００６９】
ステップ９１６において、オブジェクトの機械語のパターンと、オブジェクト展開情報のパターンが、検索にヒットしたか否かがチェックされる。
【００７０】
ステップ９１８において、チェック結果が判断される。チェック結果が「はい」であれば、ステップ９２０に移る。チェック結果が「いいえ」であれば、ステップ９２２に移る。
【００７１】
ステップ９２０において、障害があったことを、ディスプレイ等に出力させてもよい。また、検索にヒットしたオブジェクト展開情報、及びオブジェクトの部分を表示させてもよい。
【００７２】
ステップ９２２において、障害が発見されなかったことを、ディスプレイ等に出力させてもよい。
【００７３】
図１０は、一実施形態の利用の例を示している。
【００７４】
ユーザ開発マシン１０１０においては、図１に示したコンパイラ１００を用いて、ソース１２０をコンパイルし、オブジェクト及びオブジェクト展開情報１４０を取得する。そして、リンカ１０１２を用いて実行ファイルに変換してもよい。なお、実行ファイルには、オブジェクト展開情報を含ませることが望ましい。オブジェクト展開情報は、.dllなどの実行ファイルの.txt部分に格納されているオブジェクトの後などに格納してもよい。また、オブジェクト展開情報は、圧縮プログラムなどで圧縮して格納してもよい。また、オブジェクトは、コンパイラの障害を発見するためにチェックされてもよい（不図示）。
【００７５】
ユーザ運用マシン１０５０では、作成された実行ファイル１０１４がハードディスク等の記憶メディア１０５８に格納されてもよい。そして、メモリ１０５２上には、スタック、ヒープ等の領域１０５４が存在してもよい。加えて、メモリ１０５２に、実行ファイル内の.textの情報や、オブジェクト展開情報がロードされ、必要に応じて、オブジェクトが実行されてもよい。オブジェクトは、コンパイラの障害を発見するためにチェックされてもよい（不図示）。
【００７６】
図１１は、中間言語定義に一実施形態をインプリメントする例を示している。
【００７７】
上述のように、中間言語定義のバージョン情報や、利用されたルートの情報を取得することが望ましい。このために、例えば、既存の中間言語定義の中に、中間言語定義のバージョン情報や、利用されたルートの情報を取得する命令を加える修正を行ってもよい。
【００７８】
既存の中間言語定義１１０２を、中間言語定義修正部１１０４に入力する。
【００７９】
中間言語定義修正部１１０４では、既存の中間言語定義の中に、中間言語定義のバージョン情報や、利用されたルートの情報を取得する命令を加える処理を実行する。この例については、図１２を用いて説明する。
【００８０】
この処理によって、中間言語定義のバージョン情報や、ルート情報が抽出できる機能を持った中間言語定義１１０６が生成される。
【００８１】
図１２は、中間言語定義の具体例を示している。
【００８２】
図１２は、Ｃ言語を用いて記述されている。
【００８３】
行１２１０において、中間言語定義の名称、バージョン等の情報がset関数を用いて取得できるようになっている。
【００８４】
行１２２１，１２２２，１２２３，１２２４，１２２５，１２２６，１２２７，１２２８，１２２９は、set関数を用いて、分岐命令で区切られた基本ブロック単位にルートを定義している。特定の基本ブロックが実行されると、その部分のset関数が実行されるため、ルートの情報として取得することができる。
【００８５】
これらの取得された情報を元に、オブジェクト展開情報のエントリを生成させることができる。
【００８６】
図１３は、一実施形態の機能ブロック図を示している。この実施形態は、コンパイル管理部１３３０と識別部１３６０を含む。
【００８７】
コンパイル管理部１３３０における動作は以下の通りである。
【００８８】
まず、ソース１３１０が、中間言語定義を含むコンパイル実行プログラム１３３２に入力される。コンパイル実行プログラム１３３２は、中間言語１３２０を生成してもよい。更に中間言語１３２０は、コンパイル実行プログラムによって、部分オブジェクト１３４２に順次変換される。また、コンパイル実行プログラムは、コンパイル関与生成部１３３４に、コンパイル時における中間言語定義部の利用状況等の情報を伝達する。
【００８９】
コンパイル関与生成部１３３４は、コンパイルに関与した情報（中間言語名、中間言語定義部で利用されたルート情報等）をコンパイルに関与した部分の情報１３５２として、部分オブジェクトと関連付けて、オブジェクト展開情報の中に記憶してもよい。
【００９０】
オブジェクト展開情報生成部１３３６は、コンパイルに関与した部分の情報１３５２等の情報を統合して、オブジェクト展開情報１３５０を生成してもよい。
【００９１】
ファイル結合部１３３８は、オブジェクト１３４０とオブジェクト展開情報１３５０とを結合して、例えば１つの.textファイル中に結合させてもよい。
【００９２】
識別部１３６０は、コンパイラの障害が見つかった場合に利用される。
【００９３】
まず、コンパイラの障害に基づき、オペレータの作成した識別パターン１３６１を取得する。
【００９４】
部分オブジェクト識別部１３６４は、オブジェクト展開情報１３５０と、識別パターン１３６１とを比較し、マッチするオブジェクト展開情報が存在するか否かをチェックする。チェック結果は、出力されてもよい（１３６５）。
【００９５】
オブジェクト関係識別部１３６２は、オブジェクトとオブジェクト展開情報とを読み込み、識別パターン１３６１と比較し、マッチするパターンがあるか否かをチェックする。チェック結果は、出力されてもよい（１３６５）。
【００９６】
図１４は、一実施形態のハードウェアの構成を示す図である。ハードウェアは、ＣＰＵ１４０２、メモリ１４０４、入出力装置１４０６、表示装置１４０８、ハードディスク１４１０、記録媒体駆動装置１４１２、が含まれる。そして、それぞれの機器は、バス１４１６によって接続されている。また、記録媒体駆動装置１４１２は、可搬記録媒体１４１４を読み書きすることができる。
【００９７】
本ハードウェアは、コンパイル管理部１３３０、識別部１３６０、中間言語定義修正部１１０４などが実装されてもよい。また、図面に記した各フローチャートの処理が実行されてもよい。
【００９８】
なお、本実施形態の全部又は一部はプログラムによってインプリメントされ得る。このプログラムは、可搬記録媒体１４１４に格納することができる。可搬記録媒体１４１４とは、構造（ｓｔｒｕｃｔｕｒｅ）を有する１つ以上の非一時的（ｎｏｎ−ｔｒａｎｓｉｔｏｒｙ）な、有形（ｔａｎｇｉｂｌｅ）な、記録媒体を言う。例示として、可搬記録媒体１４１４としては、磁気記録媒体、光ディスク、光磁気記録媒体、不揮発性メモリなどがある。磁気記録媒体には、ＨＤＤ、フレキシブルディスク（ＦＤ）、磁気テープ（ＭＴ）などがある。光ディスクには、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｃ）、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ−Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＣＤ−Ｒ（Ｒｅｃｏｒｄａｂｌｅ）／ＲＷ（ＲｅＷｒｉｔａｂｌｅ）などがある。また、光磁気記録媒体には、ＭＯ（Ｍａｇｎｅｔｏ−Ｏｐｔｉｃａｌ  ｄｉｓｋ）などがある。可搬型記録媒体に格納されたプログラムが読み込まれ、プロセッサによって実行されることにより、本発明の実施形態の全部又は一部が実施され得る。
【００９９】
以上の実施形態に関し、以下の付記を開示する。
（付記１）
複数のオペレーションを含むソースからオブジェクトへのコンパイル、及び前記コンパイルの管理を行うプログラムであって、前記オブジェクトは複数の部分オブジェクトを有し、
前記オペレーションに対応する前記ソースの一部を前記部分オブジェクトにコンパイルし、
該プログラムのうち、前記部分オブジェクトの前記コンパイルに関与した部分を特定する情報を生成し、
前記部分オブジェクトに関連付けて、対応する前記オペレーションを表す情報、及び前記コンパイルに関与した部分を特定する情報を含むオブジェクト展開情報をメモリに記憶する、
処理をコンピュータに実行させるプログラムであって、
前記オブジェクト展開情報は、コンパイル障害に関連する前記コンパイルに関与した部分により生成された前記部分オブジェクトを識別するために用いられる、
プログラム。
（付記２）
前記オブジェクト展開情報は、コンパイル障害に関連する複数の前記コンパイルに関与した部分により生成された複数の前記部分オブジェクトの位置関係が、所定の関係を満たすか否かを識別するために用いられる、
付記１に記載のプログラム。
（付記３）
前記オペレーションを表す情報は、前記コンパイルの過程において生成される中間言語に基づき決定される、
付記１又は２に記載のプログラム。
（付記４）
前記コンパイルに関与した部分を特定する情報は、前記コンパイルの過程において生成される中間言語をオブジェクトに変換するために用いる中間言語定義のバージョン、及び、前記中間言語定義の部分を特定する情報を含む、
付記１ないし３のうちいずれか１項に記載のプログラム。
（付記５）
前記オブジェクトと、前記オブジェクト展開情報とを１つのファイルに結合する処理を、コンピュータに実行させる、付記１ないし４のうちいずれか１項記載のプログラム。
（付記６）
複数のオペレーションを含むソースからオブジェクトへのコンパイル、及び前記コンパイルの管理をコンピュータが行う方法であって、前記オブジェクトは複数の部分オブジェクトを有し、
前記オペレーションに対応する前記ソースの一部を前記部分オブジェクトにコンパイルし、
前記コンパイルを実行するプログラムのうち、前記部分オブジェクトの前記コンパイルに関与した部分を特定する情報を生成し、
前記部分オブジェクトに関連付けて、対応する前記オペレーションを表す情報、及び前記コンパイルに関与した部分を特定する情報を含むオブジェクト展開情報をメモリに記憶する、
処理を有する方法であって、
前記オブジェクト展開情報は、コンパイル障害に関連する前記コンパイルに関与した部分により生成された前記部分オブジェクトを識別するために用いられる、
方法。
（付記７）
前記オブジェクト展開情報は、コンパイル障害に関連する複数の前記コンパイルに関与した部分により生成された複数の前記部分オブジェクトの位置関係が、所定の関係を満たすか否かを識別するために用いられる、
付記６に記載の方法。
（付記８）
前記オペレーションを表す情報は、前記コンパイルの過程において生成される中間言語に基づき決定される、
付記６又は７に記載の方法。
（付記９）
前記コンパイルに関与した部分を特定する情報は、前記コンパイルの過程において生成される中間言語をオブジェクトに変換するために用いる中間言語定義のバージョン、及び、前記中間言語定義の部分を特定する情報を含む、
付記６ないし８のうちいずれか１項に記載の方法。
（付記１０）
前記オブジェクトと、前記オブジェクト展開情報とを１つのファイルに結合する処理、を有する付記６ないし９のうちいずれか１項記載の方法。
（付記１１）
複数のオペレーションを含むソースからオブジェクトへのコンパイル、及び前記コンパイルの管理を行う装置であって、前記オブジェクトは複数の部分オブジェクトを有し、
前記オペレーションに対応する前記ソースの一部を前記部分オブジェクトにコンパイルする、コンパイル部と、
前記コンパイルを実行するプログラムのうち、前記部分オブジェクトの前記コンパイルに関与した部分を特定する情報を生成する、コンパイル関与生成部と、
前記部分オブジェクトに関連付けて、対応する前記オペレーションを表す情報、及び前記コンパイルに関与した部分を特定する情報を含むオブジェクト展開情報をメモリに記憶する、オブジェクト展開情報作成部と、
を有する装置であって、
前記オブジェクト展開情報は、コンパイル障害に関連する前記コンパイルに関与した部分により生成された前記部分オブジェクトを識別するために用いられる、
装置。
（付記１２）
前記オブジェクト展開情報は、コンパイル障害に関連する複数の前記コンパイルに関与した部分により生成された複数の前記部分オブジェクトの位置関係が、所定の関係を満たすか否かを識別するために用いられる、
付記１１に記載の装置。
（付記１３）
前記オペレーションを表す情報は、前記コンパイルの過程において生成される中間言語に基づき決定される、
付記１１又は１２に記載の装置。
（付記１４）
前記コンパイルに関与した部分を特定する情報は、前記コンパイルの過程において生成される中間言語をオブジェクトに変換するために用いる中間言語定義のバージョン、及び、前記中間言語定義の部分を特定する情報を含む、
付記１１ないし１３のうちいずれか１項に記載の装置。
（付記１５）
前記オブジェクトと、前記オブジェクト展開情報とを１つのファイルに結合する、ファイル結合部を有する、付記１１ないし１４のうちいずれか１項記載の装置。
（付記１６）
複数のオペレーションを含むソースからオブジェクトへのコンパイル、及び前記コンパイルの管理を行うプログラムであって、前記オブジェクトは複数の部分オブジェクトを有し、
前記オペレーションに対応する前記ソースの一部を前記部分オブジェクトにコンパイルし、
該プログラムのうち、前記部分オブジェクトの前記コンパイルに関与した部分を特定する情報を生成し、
前記部分オブジェクトに関連付けて、対応する前記オペレーションを表す情報、及び前記コンパイルに関与した部分を特定する情報を含むオブジェクト展開情報をメモリに記憶し、
前記オブジェクト展開情報に基づき、コンパイル障害に関連する前記コンパイルに関与した部分により生成された前記部分オブジェクトを識別する、
処理をコンピュータに実行させるプログラム。
（付記１７）
前記オブジェクトと、前記オブジェクト展開情報に基づき、コンパイル障害に関連する複数の前記コンパイルに関与した部分により生成された複数の前記部分オブジェクトの位置関係が、所定の関係を満たすか否かを識別する、
処理をコンピュータに実行させる付記１６に記載のプログラム。
（付記１８）
複数のオペレーションを含むソースからオブジェクトへのコンパイル、及び前記コンパイルの管理を行う方法であって、前記オブジェクトは複数の部分オブジェクトを有し、
前記オペレーションに対応する前記ソースの一部を前記部分オブジェクトにコンパイルし、
前記コンパイルを実行するプログラムのうち、前記部分オブジェクトの前記コンパイルに関与した部分を特定する情報を生成し、
前記部分オブジェクトに関連付けて、対応する前記オペレーションを表す情報、及び前記コンパイルに関与した部分を特定する情報を含むオブジェクト展開情報をメモリに記憶し、
前記オブジェクト展開情報に基づき、コンパイル障害に関連する前記コンパイルに関与した部分により生成された前記部分オブジェクトを識別する、
処理を有する方法。
（付記１９）
前記オブジェクトと、前記オブジェクト展開情報に基づき、コンパイル障害に関連する複数の前記コンパイルに関与した部分により生成された複数の前記部分オブジェクトの位置関係が、所定の関係を満たすか否かを識別する、
処理を有する付記１８に記載のプログラム。
（付記２０）
複数のオペレーションを含むソースからオブジェクトへのコンパイル、及び前記コンパイルの管理を行う装置であって、前記オブジェクトは複数の部分オブジェクトを有し、
前記オペレーションに対応する前記ソースの一部を前記部分オブジェクトにコンパイルする、コンパイル部と、
前記コンパイルを実行するプログラムのうち、前記部分オブジェクトの前記コンパイルに関与した部分を特定する情報を生成する、コンパイル関与生成部と、
前記部分オブジェクトに関連付けて、対応する前記オペレーションを表す情報、及び前記コンパイルに関与した部分を特定する情報を含むオブジェクト展開情報をメモリに記憶する、オブジェクト展開情報作成部と、
前記オブジェクト展開情報に基づき、コンパイル障害に関連する前記コンパイルに関与した部分により生成された前記部分オブジェクトを識別する、識別部、
とを有する装置。
（付記２１）
前記オブジェクトと、前記オブジェクト展開情報に基づき、コンパイル障害に関連する複数の前記コンパイルに関与した部分により生成された複数の前記部分オブジェクトの位置関係が、所定の関係を満たすか否かを識別する、オブジェクト関係識別部、
を有する付記２０に記載の装置。
【符号の説明】
【０１００】
１３１０  ソース
１３２０  中間言語
１３３０  管理部
１３３０  コンパイル管理部
１３３２  コンパイル実行プログラム
１３３４  コンパイル関与生成部
１３３６  オブジェクト展開情報生成部
１３３８  ファイル結合部
１３４０  オブジェクト
１３４２  部分オブジェクト
１３５０  オブジェクト展開情報
１３５２  コンパイルに関与した部分の情報
１３６０  識別部
１３６１  識別パターン
１３６２  オブジェクト関係識別部
１３６４  部分オブジェクト識別部
１３６５  出力
【図１】
2014013435.tif 000003
【図２】
2014013435.tif 000004
【図３】
2014013435.tif 000005
【図４】
2014013435.tif 000006
【図５】
2014013435.tif 000007
【図６】
2014013435.tif 000008
【図７】
2014013435.tif 000009
【図８】
2014013435.tif 000010
【図９】
2014013435.tif 000011
【図１０】
2014013435.tif 000012
【図１１】
2014013435.tif 000013
【図１２】
2014013435.tif 000014
【図１３】
2014013435.tif 000015
【図１４】
2014013435.tif 000016