(57)【要約】【課題】未使用シンボルの抽出機能の実装を容易にすること。【解決手段】処理部１ｂは、ソースコード３に含まれるシンボルに対し、シンボルの使用が非推奨であることのコンパイラによる警告の出力に用いられる属性情報を追加する。処理部１ｂは、コンパイルの際にシンボルに対して属性情報に応じた警告がコンパイラにより出力されたか否かを判定する。処理部１ｂは、警告が出力されていない場合、当該シンボルをソースコード３に記述された処理において使用されない未使用シンボルであると決定し、未使用シンボルの情報を出力する。【選択図】図１
2018156133.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードに含まれるシンボルに対し、前記シンボルの使用が非推奨であることの警告の出力に用いられる属性情報を追加し、
前記ソースコードのコンパイルの際に前記シンボルに対して前記属性情報に応じた前記警告が出力されたか否かを判定し、前記警告が出力されていない場合、前記シンボルを前記ソースコードに記述された処理において使用されない未使用シンボルであると決定し、前記未使用シンボルの情報を出力する、
処理をコンピュータに実行させるコンパイラプログラム。
【請求項２】
前記ソースコードは、複数のソースファイルに分割されており、
前記未使用シンボルの決定では、前記複数のソースファイルそれぞれを個別にコンパイルして前記複数のソースファイルに対して前記情報の複数の出力結果を取得し、前記複数の出力結果に基づいて前記未使用シンボルを決定する、
請求項１記載のコンパイラプログラム。
【請求項３】
第１のソースファイルから生成された第１のオブジェクトファイルに、前記第１のソースファイルに対する前記情報の第１の出力結果を追加し、
第２のソースファイルから生成された第２のオブジェクトファイルに、前記第２のソースファイルに対する前記情報の第２の出力結果を追加し、
前記未使用シンボルの決定では、前記第１および前記第２のオブジェクトファイルを用いたリンク処理の際に、前記第１および前記第２の出力結果に基づいて、前記未使用シンボルを決定する、
請求項２記載のコンパイラプログラム。
【請求項４】
前記情報に基づいて、前記未使用シンボルをコンパイルの対象外とする、処理を前記コンピュータに更に実行させる請求項１乃至３の何れか１項に記載のコンパイラプログラム。
【請求項５】
前記属性情報の追加では、前記ソースコードにおいて予め前記属性情報が付加されていた第１のシンボルとは異なる第２のシンボルに前記属性情報を追加し、
前記ソースコードのコンパイルの際に、前記第１のシンボルに対する前記警告を表示装置による表示対象とし、前記第２のシンボルに対する前記警告の前記表示装置による表示を制限する、
請求項１乃至４の何れか１項に記載のコンパイラプログラム。
【請求項６】
前記属性情報は、ｄｅｐｒｅｃａｔｅｄ属性であり、
前記ｄｅｐｒｅｃａｔｅｄ属性に対する前記警告の出力処理に併せて、前記ｄｅｐｒｅｃａｔｅｄ属性に対する前記警告の有無により前記未使用シンボルを決定する、
請求項１乃至５の何れか１項に記載のコンパイラプログラム。
【請求項７】
ソースコードを記憶する記憶部と、
前記ソースコードに含まれるシンボルに対し、前記シンボルの使用が非推奨であることのコンパイラによる警告の出力に用いられる属性情報を追加し、前記ソースコードのコンパイルの際に前記シンボルに対して前記属性情報に応じた前記警告が前記コンパイラにより出力されたか否かを判定し、前記警告が出力されていない場合、前記シンボルを前記ソースコードに記述された処理において使用されない未使用シンボルであると決定し、前記未使用シンボルの情報を出力する処理部と、
を有する情報処理装置。
【請求項８】
コンピュータが、
ソースコードに含まれるシンボルに対し、前記シンボルの使用が非推奨であることのコンパイラによる警告の出力に用いられる属性情報を追加し、
前記ソースコードのコンパイルの際に前記シンボルに対して前記属性情報に応じた前記警告が前記コンパイラにより出力されたか否かを判定し、前記警告が出力されていない場合、前記シンボルを前記ソースコードに記述された処理において使用されない未使用シンボルであると決定し、前記未使用シンボルの情報を出力する、
コンパイル方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はコンパイラプログラム、情報処理装置およびコンパイル方法に関する。
【背景技術】
【０００２】
コンピュータソフトウェアの開発現場では、開発者はプログラミング言語としてＣ言語などの高級言語を使用することが多い。高級言語で記述されたソースコードは、コンパイラによりプロセッサが実行可能なオブジェクトコードに変換できる。また、リンカによって、オブジェクトコードを含むオブジェクトファイルと当該オブジェクトコードから参照される他のオブジェクトファイルやライブラリとを結合し、実行ファイルを生成できる。
【０００３】
ここで、ソースコードには多数のコードが記述され得るため、開発者による修正箇所などの発見が容易でないことがある。そこで、開発者によるソフトウェアの開発を支援する方法が考えられている。
【０００４】
例えば、入力ファイル内のシンボル情報がシンボルの定義（ＰＵＢＬＩＣ宣言）か、シンボルの参照（ＥＸＴＥＲＮ宣言）かの判定を、全シンボル情報に渡って行い、各シンボルに対する判定結果を記録したシンボルテーブルを作成するシステムの提案がある。この提案では、シンボルテーブルに基づき定義だけで参照されていないシンボルを特定する。
【０００５】
また、ソースプログラムのコードを解析することで、各コードシンボルが他のどのシンボルを参照しているかを示すシンボル依存情報を抽出するコード最適化装置の提案もある。この提案では、ロードモジュールの実行時に使用されないシンボルに対応するコードを、プログラムから削除する。
【０００６】
更に、オリジナルコードから外来情報を除去した修正コードを作成し、ランタイム時には、修正コードをメモリにロードすることで、メモリ使用量の削減を図るシステムの提案もある。この提案では、ランタイム中に外来情報に対する要求がある場合、修正コードに挿入された所定のキーにより適切なタイプの外来情報だけを見つけてロードする。外来情報としては、例外処理によるエラー報告のためのデバッグ情報やプログラム命令の正規の実行にとって不必要なソース情報などが挙げられている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開平４−１４９７３２号公報
【特許文献２】特開２０００−２０７２２６号公報
【特許文献３】特開２０１１−１１８９０１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
例えば、ソースコード中で定義されたシンボルのうち、当該プログラムに対応するロードモジュールの実行時に使用されないシンボルを判定する機能をコンパイラに実装することが考えられる。しかし、ソースコード内の全てのシンボルを検索し、各シンボルの定義および参照を探索する機能を別個に作り上げてコンパイラに別途実装することは容易ではなく、改善の余地がある。
【０００９】
１つの側面では、本発明は、未使用シンボルの抽出機能の実装を容易にすることを目的とする。
【課題を解決するための手段】
【００１０】
１つの態様では、コンパイラプログラムが提供される。コンパイラプログラムは、ソースコードに含まれるシンボルに対し、シンボルの使用が非推奨であることの警告の出力に用いられる属性情報を追加し、ソースコードのコンパイルの際にシンボルに対して属性情報に応じた警告が出力されたか否かを判定し、警告が出力されていない場合、シンボルをソースコードに記述された処理において使用されない未使用シンボルと決定し、未使用シンボルの情報を出力する、処理をコンピュータに実行させる。
【発明の効果】
【００１１】
１つの側面では、未使用シンボルの抽出機能の実装を容易にすることができる。
【図面の簡単な説明】
【００１２】
【図１】第１の実施の形態の情報処理装置を示す図である。
【図２】第１の実施の形態の処理例を示すフローチャートである。
【図３】第１の実施の形態のソースコードの例（その１）を示す図である。
【図４】第１の実施の形態のソースコードの例（その２）を示す図である。
【図５】第１の実施の形態の未使用シンボルの他の出力例を示す図である。
【図６】第２の実施の形態のコンパイラ装置のハードウェア例を示す図である。
【図７】ｄｅｐｒｅｃａｔｅｄ属性付与後のソースコードの例を示す図である。
【図８】非推奨の警告メッセージの出力例を示す図である。
【図９】コンパイラ装置の機能例を示す図である。
【図１０】ソースファイルの例（その１）を示す図である。
【図１１】ソースファイルの例（その２）を示す図である。
【図１２】構文木の例（その１）を示す図である。
【図１３】構文木の例（その２）を示す図である。
【図１４】ｄｅｐｒｅｃａｔｅｄ属性の追加例を示す図である。
【図１５】ＬＴＯを用いる場合のコマンド例を示す図である。
【図１６】第２の実施の形態のコンパイル例を示すフローチャートである。
【図１７】第２の実施の形態の属性追加例を示すフローチャートである。
【図１８】リストの例（その１）を示す図である。
【図１９】リストの例（その２）を示す図である。
【図２０】構文木（ｄｅｐｒｅｃａｔｅｄ追加後）の例（その１）を示す図である。
【図２１】構文木（ｄｅｐｒｅｃａｔｅｄ追加後）の例（その２）を示す図である。
【図２２】第２の実施の形態の非推奨機能に対する警告出力例を示すフローチャートである。
【図２３】使用フラグ設定後のリストの例を示す図である。
【図２４】第２の実施の形態のリンク処理例を示すフローチャートである。
【図２５】第２の実施の形態の未使用機能に対する警告出力例を示すフローチャートである。
【図２６】マージ後のリストの例を示す図である。
【図２７】未使用を示す警告の表示例を示す図である。
【図２８】コンパイラ装置の他の機能例を示す図である。
【図２９】第２の実施の形態のコンパイル制御例を示すフローチャートである。
【発明を実施するための形態】
【００１３】
以下、本実施の形態について図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の情報処理装置を示す図である。情報処理装置１は、コンパイラとして機能し、ソースコードのコンパイルに用いられる。情報処理装置１は、表示装置２に接続されている。表示装置２は、情報処理装置１により出力される情報の表示に用いられる。情報処理装置１は、記憶部１ａおよび処理部１ｂを有する。
【００１４】
記憶部１ａは、ＲＡＭ（Random Access Memory）などの揮発性記憶装置でもよいし、ＨＤＤ（Hard Disk Drive）やフラッシュメモリなどの不揮発性記憶装置でもよい。処理部１ｂは、ＣＰＵ（Central Processing Unit）、ＤＳＰ（Digital Signal Processor）、ＡＳＩＣ（Application Specific Integrated Circuit）、ＦＰＧＡ（Field Programmable Gate Array）などを含み得る。処理部１ｂはプログラムを実行するプロセッサであってもよい。ここでいう「プロセッサ」には、複数のプロセッサの集合（マルチプロセッサ）も含まれ得る。
【００１５】
記憶部１ａは、ソースコード３を記憶する。ソースコード３は、ユーザによって作成される。ソースコード３は、ソースプログラムと呼ばれてもよい。例えば、ソースコード３は、Ｃ＋＋やＪＡＶＡ（登録商標）などの高級言語を用いて記述される。ソースコード３は、複数のシンボルを含む。シンボルは、変数、関数、クラスおよび構造体などのソースコード３に含まれるプログラムの要素を表す識別名である。
【００１６】
処理部１ｂは、記憶部１ａに記憶されたソースコード３に含まれるシンボルに対し、当該シンボルの仕様が非推奨であることの警告の出力に用いられる属性情報を追加する。シンボルの仕様が非推奨であることの警告の出力は、ソースコード３をコンパイルするコンパイラによる出力である。
【００１７】
処理部１ｂは、記憶部１ａに記憶されたコンパイラプログラムを実行することで、コンパイラの機能を発揮してもよい。あるいは、コンパイラの機能は、情報処理装置１が有する所定の演算装置により発揮されてもよい。属性情報は、メタデータ、タグまたはアノテーションなどと呼ばれてもよい。コンパイラは、オブジェクトコードの生成過程において、変数と変数を参照する関数やクラスなどとの関係、および、宣言または定義された関数やクラスなどが実際に実行されるか否かを判断し、属性情報に応じた非推奨警告を出力する機能を予め備えるものがある。このような属性情報として、例えば、Ｃ＋＋やＪＡＶＡなどのコンパイラで利用されるｄｅｐｒｅｃａｔｅｄ属性が挙げられる。
【００１８】
ｄｅｐｒｅｃａｔｅｄ属性は、既に存在している機能に不具合が見つかった場合や、より良い新機能が登場した際に過去の機能を非推奨にするために利用される。一例として、Ｃ＋＋では、ｄｅｐｒｅｃａｔｅｄ属性を、クラスの型、型の別名、変数、非静的メンバ変数、関数および列挙型に対して指定することができる。具体的には、ソースコード３におけるシンボルの宣言または定義の記述箇所に対する所定位置（例えば、シンボルの直前など）に、ｄｅｐｒｅｃａｔｅｄの文字列を含む所定のコードを挿入することで、当該シンボルにｄｅｐｒｅｃａｔｅｄ属性を付与できる。例えば、コンパイラは、“ｄｅｐｒｅｃａｔｅｄ属性”が付与されたシンボルが使用されると、該当のシンボルが非推奨の機能であることを警告したり、代替となる機能を提示したりする。
【００１９】
１つの例として、図１では、属性情報に相当する文字列を“ａｔｔｒｉｂｕｔｅ”と表記する。例えば、ソースコード３は、整数型（ｉｎｔ型）の変数“ｘ”、および、関数“ｆｕｎｃ０１（）”を含む。変数“ｘ”は、ソースコード３に含まれる複数のシンボルのうちの１つのシンボルである。また、関数“ｆｕｎｃ０１”は、ソースコード３に含まれる複数のシンボルのうちの１つのシンボルである。例えば、処理部１ｂは、ソースコード３に含まれるシンボル“ｘ”の定義“ｉｎｔ  ｘ；”の直前に、属性情報に相当するコード“＜ａｔｔｒｉｂｕｔｅ＞”を追加する。同様に、処理部１ｂは、ソースコード３に含まれるシンボル“ｆｕｎｃ０１”の定義“ｆｕｎｃ０１（）｛・・・｝”の直前に、属性情報に相当するコード“＜ａｔｔｒｉｂｕｔｅ＞”を追加する。ここで、図１で例示するプログラム言語は、属性情報を記号“＜”、“＞”で括る規約をもつものとする。ソースコード４は、ソースコード３の各シンボルに属性情報が追加された結果である。
【００２０】
ただし、処理部１ｂは、ソースコード３に対して所定の構文解析（オブジェクトコード作成の前段階の処理）を行った結果として得られる所定の中間情報に、属性情報を追加してもよい。
【００２１】
処理部１ｂは、ソースコード４のコンパイルの際にシンボルに対して、コンパイラにより属性情報に応じた警告が出力されたか否かを判定する。処理部１ｂは、あるシンボルに対して警告が出力されていない場合、当該シンボルを、ソースコード４（またはソースコード３）に記述された処理において使用されない未使用シンボルであると決定する。「未使用シンボル」の一例としては、宣言または定義はされているものの、該当のソースコードに対応するオブジェクトコードにより実行される関数やクラスなどで参照されない変数や、宣言や定義だけあって実行されない関数やクラスなどが考えられる。
【００２２】
例えば、処理部１ｂは、属性情報に応じたコンパイラによる警告として、出力５を得たとする。出力５は、シンボル“ｆｕｎｃ０１（）”が非推奨であることの警告を含むが、シンボル“ｉｎｔ  ｘ”が非推奨であることの警告を含まない。このため、処理部１ｂは、シンボル“ｆｕｎｃ０１（）”がソースコード４に記述された処理において使用されるシンボルであると判定する。一方、処理部１ｂは、シンボル“ｘ”がソースコード４に記述された処理において使用されない未使用シンボルであると決定する。
【００２３】
なお、出力５は、処理部１ｂにより付与された属性情報に応じた警告であるため、記憶部１ａに出力５の情報がログなどに記録されればよく、表示装置２により出力５の内容は表示されなくてもよい。ここで、本例では、シンボル“ｆｕｎｃ０１（）”が「真に」非推奨であるか否かについては不問としてよい。寧ろ、処理部１ｂは、コンパイラによる属性情報に応じた機能を、本来の機能とは別の用途（すなわち、未使用シンボルの特定）に流用するために、各シンボルに対して属性情報を付加するので、シンボル“ｆｕｎｃ０１（）”は非推奨ではないこともある。ただし、コンパイラが属性情報に応じた本来の機能（非推奨機能に対する警告）を果たすために、ユーザが追加した属性情報と、処理部１ｂが追加した属性情報とを区別することも考えられる。
【００２４】
具体的には、処理部１ｂは、ユーザの操作により付加された第１のタイプの属性情報（本来の非推奨警告の通知のためのもの）と、処理部１ｂにより不使用シンボルの特定のために付加された第２のタイプの属性情報とを区別してもよい。例えば、処理部１ｂは、ソースコード３に予め記述されていた属性情報を第１のタイプとし、コンパイル時に処理部１ｂが追加した属性情報を第２のタイプとして区別する。そして、処理部１ｂは、出力５に含まれるシンボルに関する警告が、第１のタイプおよび第２のタイプの何れの属性情報に応じたものであるかにより、コンパイラによる非推奨警告の表示装置２による表示内容を制御してもよい。すなわち、処理部１ｂは、第１のタイプの場合は非推奨警告を表示させ、第２のタイプの場合は非推奨警告を表示させないように制御してもよい。
【００２５】
処理部１ｂは、未使用シンボルの情報を出力する。例えば、処理部１ｂは、未使用シンボルの宣言または定義に相当するソースコード４の中のコードを、表示装置２に出力し、当該コードを表示装置２により表示させてもよい。より具体的には、処理部１ｂは、“ｗａｒｎｉｎｇ：  ‘ｉｎｔ  ｘ’  ｉｓ  ｕｎｕｓｅｄ．”のように、シンボル“ｉｎｔ  ｘ”が未使用であることを示すメッセージを含む出力６の内容を、表示装置２により表示させてもよい。
【００２６】
次に、情報処理装置１による処理手順を説明する。
図２は、第１の実施の形態の処理例を示すフローチャートである。以下、図２に示す処理をステップ番号に沿って説明する。
【００２７】
（Ｓ１）処理部１ｂは、ソースコード３のコンパイルの指示を受け付けると、ソースコード３の各シンボルに対して属性情報を追加する。
（Ｓ２）処理部１ｂは、コンパイラの機能により、ソースコード４（または、ソースコード４に相当する中間情報）に対応するオブジェクトコードを生成する。
【００２８】
（Ｓ３）処理部１ｂは、ソースコード４（または、ソースコード３）に含まれるシンボルを１つ選択する。選択対象となるシンボルは、今回の処理で未選択であるシンボルである。
【００２９】
（Ｓ４）処理部１ｂは、ステップＳ１で追加した属性情報に応じたコンパイラによる警告の出力（非推奨警告の出力）があるか否かを判定する。ある場合、処理部１ｂは、ステップＳ５に処理を進める。ない場合、処理部１ｂは、ステップＳ６に処理を進める。
【００３０】
（Ｓ５）処理部１ｂは、該当のシンボルが使用されていると決定する。そして、処理部１ｂは、ステップＳ７に処理を進める。
（Ｓ６）処理部１ｂは、該当のシンボルが未使用であると決定する。そして、処理部１ｂは、ステップＳ７に処理を進める。
【００３１】
（Ｓ７）処理部１ｂは、ステップＳ１で属性情報を追加した全てのシンボルを選択済であるか（ステップＳ３の選択を行ったか）否かを判定する。属性情報を追加した全てのシンボルを選択済である場合、処理部１ｂは、ステップＳ８に処理を進める。属性情報を追加した全てのシンボルを選択済でない場合、処理部１ｂは、ステップＳ３に処理を進める。
【００３２】
（Ｓ８）処理部１ｂは、未使用シンボルの情報を出力する。例えば、処理部１ｂは、出力６の内容を表示装置２に表示させる。
このように、処理部１ｂは、コンパイラによる非推奨警告の出力に用いられる属性情報を各シンボルに付加することで、コンパイラによる各シンボルに対する非推奨警告の有無により、各シンボルが使用されているか、使用されていないかを識別する。
【００３３】
こうして、コンパイラに予め備わっている機能を流用することで、未使用シンボルの抽出機能の実装を容易にすることができる。また、処理部１ｂは、未使用シンボルの情報を出力することで、ユーザ（ソフトウェアの開発者）による未使用シンボルの発見およびソースコード３の改善を支援できる。
【００３４】
また、処理部１ｂは、コンパイラによる非推奨警告の出力処理の結果を用いて、未使用シンボルの抽出処理を行うので、未使用シンボルの抽出処理を別個のルーチンによって実行しなくてよい。具体的には、コンパイル処理とは別個に、各シンボルが使用されているか否かのチェック処理を行わずに済む。このため、未使用シンボルの抽出処理の効率化を図ることができる。また、未使用シンボルを抽出するためのルーチンを別個に行うよりも、処理部１ｂは、未使用シンボルの抽出を高速化できる。
【００３５】
更に、処理部１ｂは、ソースコード３を再度コンパイルする際に、未使用シンボルの情報に基づいて、ソースコード３に含まれる未使用シンボルをコンパイルの対象外とすることも可能である。
【００３６】
なお、ソースコード３は、複数のソースファイルに分割して作成されることもある。例えば、各ソースファイルは、別個のユーザ、別個の場所、および、別個の時間に作成され、それぞれ別個にコンパイルされ得る。この場合、情報処理装置１は、各ソースファイルに対して個別に作成された各オブジェクトファイルを結びつける（リンクする）ことで、実行ファイルを生成することになる。
【００３７】
情報処理装置１は、このようにソースコード３が複数のソースファイルに分割して作成される場合でも、ソースコード３の全体にわたって、未使用シンボルを抽出する機能を提供することができる。具体的には次の通りである。なお、以下では、プログラミング言語の一例としてＣ＋＋を挙げる（ただし、他のプログラミング言語でもよい）。
【００３８】
図３は、第１の実施の形態のソースコードの例（その１）を示す図である。ソースコード３０は、ソースファイル３１，３２に分割して作成される。ソースファイル３１，３２は、個別のファイルとして管理される。ソースファイル３１のファイル名は、“ｓａｍｐｌｅ．ｃｐｐ”である。ソースファイル３２のファイル名は、“ｍａｉｎ．ｃｐｐ”である。
【００３９】
処理部１ｂは、ソースファイル３１，３２を個別にコンパイルする。このとき、処理部１ｂは、ソースファイル３１，３２それぞれに含まれる各シンボルに対して、Ｃ＋＋の規約に則って、ｄｅｐｒｅｃａｔｅｄ属性を付加する。
【００４０】
図４は、第１の実施の形態のソースコードの例（その２）を示す図である。ソースコード４０は、ソースコード３０に含まれるソースファイル３１，３２の各シンボルに対して、ｄｅｐｒｅｃａｔｅｄ属性を付加した結果である。ソースコード４０は、ソースファイル４１，４２を含む。ソースファイル４１は、ソースファイル３１の各シンボルに対してｄｅｐｒｅｃａｔｅｄ属性を付加した結果である。ソースファイル４２は、ソースファイル３２の各シンボルに対してｄｅｐｒｅｃａｔｅｄ属性を付加した結果である。この場合、属性情報は、２重の角括弧記号“［［”、“］］”で囲われた“［［ｄｅｐｒｅｃａｔｅｄ］］”のコード部分に相当する。前述のように、ｄｅｐｒｅｃａｔｅｄ属性の付加対象のシンボルおよびｄｅｐｒｅｃａｔｅｄ属性の付加方法は、Ｃ＋＋の規約に従って決定される。
【００４１】
なお、図４では、ソースファイル４１，４２それぞれにｄｅｐｒｅｃａｔｅｄ属性を追加する例を示しているが、前述のように、ソースファイル４１，４２それぞれに対応する所定の中間情報を、ｄｅｐｒｅｃａｔｅｄ属性を付加した状態で作成してもよい。
【００４２】
図５は、第１の実施の形態の未使用シンボルの他の出力例を示す図である。処理部１ｂは、ソースファイル３１に対して図２の手順を実行することで、ソースファイル３１に対するリストＬ１を作成する。リストＬ１は、ソースファイル３１に関する未使用シンボルの情報の出力結果である。処理部１ｂは、ソースファイル３１（またはソースファイル４１）に対応するオブジェクトファイル７に、リストＬ１を追加する。処理部１ｂは、作成されたオブジェクトファイル７を記憶部１ａに格納する。オブジェクトファイル７のファイル名は、例えば“ｓａｍｐｌｅ．ｏ”である。
【００４３】
ここで、リストＬ１は、ソースファイル３１に含まれるシンボルに対応する要素名と、使用フラグとの対応関係を示す情報である。使用フラグとは、図２の手順により、該当のシンボルが「使用されている」と判定されたか、または、「未使用である」と判定されたかを示すフラグである。例えば、使用フラグ“ＴＲＵＥ”は、「使用されている」ことを示す。使用フラグ“ＦＡＬＳＥ”は、「未使用である」ことを示す。
【００４４】
同様に、処理部１ｂは、ソースファイル３２に対して図２の手順を実行することで、ソースファイル３２に対するリストＬ２を作成する。リストＬ２は、ソースファイル３２に関する未使用シンボルの情報の出力結果である。処理部１ｂは、ソースファイル３２（またはソースファイル４２）に対応するオブジェクトファイル８に、リストＬ２を追加する。処理部１ｂは、作成されたオブジェクトファイル８を記憶部１ａに格納する。オブジェクトファイル８のファイル名は、例えば“ｍａｉｎ．ｏ”である。なお、リストＬ２も、リストＬ１と同様に、ソースファイル３２に含まれるシンボルに対応する要素名と使用フラグとの対応関係を示す情報である。
【００４５】
そして、処理部１ｂは、リンカの機能により、オブジェクトファイル７およびオブジェクトファイル８に対するリンク処理を行い、実行ファイル９（ａ．ｏｕｔ）を作成する。このとき、処理部１ｂは、オブジェクトファイル７に含まれるリストＬ１およびオブジェクトファイル８に含まれるリストＬ２をマージすることで、マージ後のリストＬ３を作成し、リストＬ３に基づいて、未使用シンボルを抽出する。
【００４６】
特に、処理部１ｂは、リンク処理において、リンク時最適化（ＬＴＯ：Link Time Optimization）と呼ばれる最適化を行う。リンク時最適化では、個々のオブジェクトファイルの最適化だけでなく、オブジェクトファイル間の最適化（例えば、オブジェクトファイルを跨いだプログラム全体に渡る関数のインライン化や定数伝播など）を可能とする。なお、ＬＴＯを用いる場合、コンパイル時に、所定の中間表現（例えば、Ｇｉｍｐｌｅデータ）をオブジェクトファイル中に残すようコンパイルオプションが選択される。処理部１ｂによるリストＬ３の作成および未使用シンボルの抽出は、例えば、ＬＴＯ実行時に行われてもよい。
【００４７】
例えば、処理部１ｂは、リストＬ１，Ｌ２の少なくとも一方に含まれる要素名を、リストＬ３の要素名の項目に登録する。また、処理部１ｂは、リストＬ３に登録した要素名に対して、リストＬ１，Ｌ２それぞれの使用フラグを参照し、少なくとも一方の使用フラグが“ＴＲＵＥ”であれば、リストＬ３の当該要素名に対する使用フラグを“ＴＲＵＥ”とする。両方の使用フラグが“ＦＡＬＳＥ”であれば、処理部１ｂは、リストＬ３の当該要素名に対する使用フラグを“ＦＡＬＳＥ”とする。
【００４８】
そして、処理部１ｂは、リストＬ３で使用フラグが“ＦＡＬＳＥ”である要素名に対するシンボルを、ソースコード３０に記述された処理（すなわち、実行ファイル９により実行される処理）で使用されていない未使用シンボルであると決定する。
【００４９】
こうして、処理部１ｂは、リストＬ２，Ｌ３に基づいて、リンク対象の各オブジェクトファイルの少なくとも何れかで使用されているシンボルについては使用されていると判断する。一方、処理部１ｂは、リンク対象の何れのオブジェクトファイルでも使用されていないシンボルを未使用シンボルと判断する。
【００５０】
例えば、図５の例の場合、処理部１ｂは、リストＬ３に基づいて変数“ｇｌｏｂａｌ＿ｙ”、関数“ｆｕｎｃ０１（ｖｏｉｄ）”、および、変数“ｘ”を未使用シンボルと判定する。したがって、例えば、処理部１ｂは、これら未使用シンボルに関する記述“ｉｎｔ  ｇｌｏｂａｌ＿ｙ”、“ｖｏｉｄ  ｆｕｎｃ０１（ｖｏｉｄ）”、および“ｉｎｔ  ｘ”が未使用（Ｕｎｕｓｅｄ）であることを出力し、表示装置２に表示させる。出力６ａは、未使用であることの警告の一例である。例えば、処理部１ｂは、出力６ａの内容を表示装置２に表示させてもよい。
【００５１】
このように、分割コンパイルが行われる場合にも、処理部１ｂは、オブジェクトファイル７にリストＬ１を追加し、オブジェクトファイル８にリストＬ２を追加することで、リンク処理時（ＬＴＯ時）に、リストＬ１，Ｌ２を基に未使用シンボルを抽出可能となる。また、こうして抽出した未使用シンボルの情報を出力することで、ユーザ（ソフトウェアの開発者）による未使用シンボルの発見およびソースコード３０の改善を支援できる。また、処理部１ｂは、ソースファイル３１，３２それぞれを再度コンパイルする際に、未使用シンボルの情報に基づいて、ソースファイル３１，３２に含まれる未使用シンボルをコンパイルの対象外とすることも可能である。
【００５２】
以下では、情報処理装置１の一例として、ソースコードのコンパイルおよびリンク処理を行うコンピュータ（コンパイラ装置と称する）を例示し、情報処理装置１の機能を更に具体的に説明する。
【００５３】
［第２の実施の形態］
図６は、第２の実施の形態のコンパイラ装置のハードウェア例を示す図である。コンパイラ装置１００は、プログラミング言語Ｃ＋＋のコンパイラとして機能する。
【００５４】
ここで、Ｃ＋＋では、２０１４年にＩＳＯ（International Organization for Standardization）／ＩＥＣ（International Electrotechnical Commission）１４８８２：２０１４（通称Ｃ＋＋１４）という規格が策定されている。Ｃ＋＋１４では、新機能の１つに［［ｄｅｐｒｅｃａｔｅｄ］］属性（単に、ｄｅｐｒｅｃａｔｅｄ属性と称することがある）と呼ばれる機能が追加されている。本属性が指定されたオブジェクトが使用されると、コンパイラは警告メッセージを出力する。前述のように、ｄｅｐｒｅｃａｔｅｄ属性は、既に存在している機能に不具合が見つかった場合や、より良い新機能が登場した際に過去の機能を非推奨にするために利用される機能である。
【００５５】
ただし、コンパイラは、ｄｅｐｒｅｃａｔｅｄ属性による非推奨警告の出力機能をもつものであれば、Ｃ＋＋の他のバージョン、および、他のプログラミング言語（例えば、ＪＡＶＡなど）でもよい。
【００５６】
コンパイラ装置１００は、プロセッサ１０１、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、媒体リーダ１０６および通信インタフェース１０７を有する。各ハードウェアはコンパイラ装置１００のバスに接続されている。
【００５７】
プロセッサ１０１は、コンパイラ装置１００の情報処理を制御するハードウェアである。プロセッサ１０１は、マルチプロセッサであってもよい。プロセッサ１０１は、例えばＣＰＵ、ＤＳＰ、ＡＳＩＣまたはＦＰＧＡなどである。プロセッサ１０１は、ＣＰＵ、ＤＳＰ、ＡＳＩＣ、ＦＰＧＡなどのうちの２以上の要素の組み合わせであってもよい。
【００５８】
ＲＡＭ１０２は、コンパイラ装置１００の主記憶装置である。ＲＡＭ１０２は、プロセッサ１０１に実行させるＯＳ（Operating System）のプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、ＲＡＭ１０２は、プロセッサ１０１による処理に用いる各種データを記憶する。
【００５９】
ＨＤＤ１０３は、コンパイラ装置１００の補助記憶装置である。ＨＤＤ１０３は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３は、ＯＳのプログラム、アプリケーションプログラム、および各種データを記憶する。コンパイラ装置１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
【００６０】
画像信号処理部１０４は、プロセッサ１０１からの命令に従って、コンパイラ装置１００に接続されたディスプレイ１１に画像を出力する。ディスプレイ１１として、ＣＲＴ（Cathode Ray Tube）ディスプレイや液晶ディスプレイなどを用いることができる。
【００６１】
入力信号処理部１０５は、コンパイラ装置１００に接続された入力デバイス１２から入力信号を取得し、プロセッサ１０１に出力する。入力デバイス１２として、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
【００６２】
媒体リーダ１０６は、記録媒体１３に記録されたプログラムやデータを読み取る装置である。記録媒体１３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）を使用できる。また、記録媒体１３として、例えば、フラッシュメモリカードなどの不揮発性の半導体メモリを使用することもできる。媒体リーダ１０６は、例えば、プロセッサ１０１からの命令に従って、記録媒体１３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００６３】
通信インタフェース１０７は、ネットワーク１０を介して他の装置と通信を行う。通信インタフェース１０７は、有線通信インタフェースでもよいし、無線通信インタフェースでもよい。
【００６４】
図７は、ｄｅｐｒｅｃａｔｅｄ属性付与後のソースコードの例を示す図である。ソースコードＰ１は、Ｃ＋＋を用いて記述されたソースコードの一例である。ソースコードＰ１のファイル名を“ｍａｉｎ．ｃｐｐ”とする。前述のように、Ｃ＋＋では、２重の角括弧記号“［［”、“］］”で囲われた“［［ｄｅｐｒｅｃａｔｅｄ］］”というコードをシンボルに付与することで、非推奨警告のための属性情報が追加される。また、“ｄｅｐｒｅｃａｔｅｄ”に続けて括弧記号“（”、“）”を記述し、当該括弧記号で括られた２重引用符により、ユーザが警告として表示させたいメッセージを設定することもできる。ユーザが表示させたいメッセージを設定しない場合は、２重引用符の中に何も記述しないか、または、“ｄｅｐｒｅｃａｔｅｄ”の文字列に続く括弧記号および２重引用符を記述しないこともある。
【００６５】
具体的には、ソースコードＰ１の１行目は、構造体を表すシンボル“Ｘ｛｝”にｄｅｐｒｅｃａｔｅｄ属性が付与された例である。［［ｄｅｐｒｅｃａｔｅｄ（“ｗａｒｎｉｎｇ”）］］は、非推奨警告のための属性情報である。当該属性情報のオプションとして含まれる“ｗａｒｎｉｎｇ”の文字列は、コンパイラが出力する規定の警告とは別に、ユーザが表示させたいメッセージである。
【００６６】
また、ソースコードＰ１の３行目は、列挙型（列挙体と呼ばれることもある）を表すシンボル“｛ＺＥＲＯ，ＯＮＥ｝”にｄｅｐｒｅｃａｔｅｄ属性が付与された例である。［［ｄｅｐｒｅｃａｔｅｄ（“”）］］は、非推奨警告のための属性情報である。当該２行目の例では、ユーザが表示させたいメッセージの設定はないことになる。
【００６７】
ソースコードＰ１には、他のシンボルに対しても、Ｃ＋＋の規約に則って、ｄｅｐｒｅｃａｔｅｄ属性が付与されている。また、ｍａｉｎ関数およびｍａｉｎ関数の定義ブロック（９行目〜２０行目）はｄｅｐｒｅｃａｔｅｄ属性の付与対象外となる。
【００６８】
図８は、非推奨の警告メッセージの出力例を示す図である。メッセージ群１１ａは、コンパイラ装置１００によりソースコードＰ１のコンパイルが行われた場合に、ディスプレイ１１により表示される非推奨であることの警告メッセージ（すなわち、コンパイラ装置１００による非推奨警告の出力の内容）の例である。なお、メッセージ群１１ａは、ＧＣＣ（GNU Compiler Collection）６．１．０を用いて出力したものである。
【００６９】
具体的には、メッセージ群１１ａは、ソースコードＰ１のｍａｉｎ関数において使用される構造体“Ｘ”が非推奨である旨の警告メッセージ（メッセージ群１１ａの３行目〜９行目）を含む。また、メッセージ群１１ａは、ソースコードＰ１のｍａｉｎ関数において使用される変数“ｘ”が非推奨である旨の警告メッセージ（メッセージ群１１ａの１０行目〜１６行目）を含む。また、メッセージ群１１ａは、ソースコードＰ１のｍａｉｎ関数において使用される関数“ｆｕｎｃ（）”が非推奨である旨の警告メッセージ（メッセージ群１１ａの１７行目〜３０行目）を含む。
【００７０】
なお、メッセージ群１１ａは、ソースコードＰ１における列挙型のシンボルに対する非推奨である旨の警告メッセージを含まない。該当の列挙型は、ｍａｉｎ関数において使用されていないからである。
【００７１】
このように、コンパイラ装置１００は、ｄｅｐｒｅｃａｔｅｄ属性の機能を用いることで、ソースコードＰ１内で使用されるシンボルに対して非推奨である旨の警告メッセージをコンパイラにより出力させることができる。ここで、「使用されるシンボル」とは、ソースコードＰ１に対応するオブジェクトコードにより実現される処理（すなわち、ソースコードＰ１に記述された処理）で使用されるシンボルである。「使用されないシンボル」とは、ソースコードＰ１に対応するオブジェクトコードにより実現される処理（すなわち、ソースコードＰ１に記述された処理）で使用されないシンボルである。そこで、コンパイラ装置１００は、コンパイラによる非推奨警告の出力機能を活用して、不使用シンボルの抽出を行う。具体的には次の通りである。
【００７２】
図９は、コンパイラ装置の機能例を示す図である。コンパイラ装置１００は、ソースファイル記憶部１１０、中間コード記憶部１２０、オブジェクトファイル記憶部１３０、実行ファイル記憶部１４０、字句解析部１５１、構文解析部１５２、意味解析部１５３、属性追加部１６１、警告出力部１６２、最適化部１７１、出力生成部１７２、ＬＴＯ処理部１８１、リスト結合部１８２および結果出力部１８３を有する。
【００７３】
ソースファイル記憶部１１０は、複数のソースファイルを記憶する。例えば、ソースファイル記憶部１１０は、ソースファイル１１１，１１２を記憶する。ソースファイル１１１，１１２は、ある実行ファイルの作成に用いられる。ソースファイル１１１，１１２は、別個のファイルとして管理されるが、当該実行ファイルに対応する１つのソースコードを形成するものと捉えられる。
【００７４】
中間コード記憶部１２０は、ソースファイル１１１，１１２それぞれに対応する中間コードを記憶する。中間コードは、オブジェクトコードの前段階のコードである。
オブジェクトファイル記憶部１３０は、複数のオブジェクトファイルを記憶する。例えば、オブジェクトファイル記憶部１３０は、オブジェクトファイル１３１，１３２を記憶する。オブジェクトファイル１３１は、ソースファイル１１１に基づいて生成されたオブジェクトファイルである。オブジェクトファイル１３２は、ソースファイル１１２に基づいて生成されたオブジェクトファイルである。
【００７５】
実行ファイル記憶部１４０は、オブジェクトファイル１３１，１３２に対するリンク処理の結果として生成された実行ファイルを記憶する。
字句解析部１５１は、ソースファイル１１１，１１２に対する字句解析処理を行う。具体的には、字句解析部１５１は、ソースファイル１１１に記述された文字（字）を特定し、文字の並びから文字列（句）を特定する。字句解析部１５１は、ソースファイル１１２に対しても同様に字句解析処理を行う。
【００７６】
構文解析部１５２は、ソースファイル１１１，１１２に対する構文解析処理を行う。具体的には、構文解析部１５２は、字句解析部１５１により特定された字句の組み合わせ（構文）を特定し、構文木の情報を生成する。構文木の情報は、オブジェクトコードの作成の前段階に作成される中間情報であるといえる。
【００７７】
意味解析部１５３は、ソースファイル１１１，１１２に対する意味解析処理を行う。具体的には、意味解析部１５３は、構文解析部１５２により特定された構文から、プログラム言語で規定されている命令や記法を抽出し、最適化処理に用いられる中間コードを生成する。意味解析部１５３は、生成された中間コードを中間コード記憶部１２０に格納する。このとき、意味解析部１５３は、変数、関数およびクラスなどの宣言または定義や、それらの呼び出し関係などを特定する。また、意味解析部１５３は、各シンボルについて、後述する属性追加部１６１によって追加されるｄｅｐｒｅｃａｔｅｄ属性の有無も解析し、使用されるシンボルに対する非推奨警告の出力を、警告出力部１６２に指示する。
【００７８】
属性追加部１６１は、Ｃ＋＋の規約に則って、ソースファイル１１１から作成された構文木に含まれるシンボルにｄｅｐｒｅｃａｔｅｄ属性を追加する。同様に、属性追加部１６１は、ソースファイル１１２から作成された構文木に含まれるシンボルにｄｅｐｒｅｃａｔｅｄ属性を追加する。意味解析部１５３は、追加されたｄｅｐｒｅｃａｔｅｄ属性も含めて、意味解析処理を行うことになる。
【００７９】
警告出力部１６２は、意味解析部１５３の指示により、ｄｅｐｒｅｃａｔｅｄ属性に応じた非推奨警告をディスプレイ１１に表示させる。具体的には、警告出力部１６２は、ソースファイル１１１，１１２に対してユーザによりｄｅｐｒｅｃａｔｅｄ属性が追加されたシンボルに絞って、非推奨警告をディスプレイ１１に表示させる。例えば、警告出力部１６２は、該当のシンボルに対応する機能の使用が非推奨である旨の警告メッセージをディスプレイ１１により表示させる。一方、警告出力部１６２は、属性追加部１６１によりｄｅｐｒｅｃａｔｅｄ属性が追加されたシンボルに対して、非推奨警告の出力を行わない。また、警告出力部１６２は、各シンボルに対する非推奨警告の有無を記録したリストを作成し、出力生成部１７２に提供する。
【００８０】
ここで、リストは、要素名、使用フラグおよびユーザ定義パラメータを対応付けた情報である。要素名、使用フラグおよびユーザ定義パラメータの１つの対応関係を１つのレコードと称する。リストは、複数のレコードを含み得る。要素名は、ソースファイルに記述されたシンボル（あるいはオブジェクト）の名称である。すなわち、要素は、シンボル（あるいはオブジェクト）を示す。使用フラグは、当該要素名に対応するシンボルに対してｄｅｐｒｅｃａｔｅｄ属性に応じた非推奨警告がコンパイル時に発生したか否かを示すフラグである。使用フラグ“ＦＡＬＳＥ”は、当該シンボルに対して非推奨警告の出力の指示が発生しなかったことを示す。使用フラグ“ＴＲＵＥ”は、当該シンボルに対して非推奨警告の出力の指示が発生したことを示す。ユーザ定義パラメータは、シンボルに対して付与されたｄｅｐｒｅｃａｔｅｄ属性が、ユーザ定義のものか、または、属性追加部１６１により追加されたものかの識別結果を示すパラメータである。ユーザ定義パラメータ“Ｘ”は、ユーザ定義のものではないこと（すなわち、属性追加部１６１により追加されたものであること）を示す。ユーザ定義パラメータ“Ｙ”は、ユーザ定義のものであること（すなわち、属性追加部１６１により追加されたものでないこと）を示す。
【００８１】
最適化部１７１は、中間コード記憶部１２０に記憶された中間コードを用いて、中間コード単位（すなわち、コンパイル単位）の最適化処理を行う。例えば、最適化部１７１の最適化処理により、プログラムの実行の所要時間の短縮やメモリ使用量の低減などが図られる。
【００８２】
出力生成部１７２は、最適化部１７１による最適化結果に基づいて、オブジェクトファイルを生成し、オブジェクトファイル記憶部１３０に格納する。このとき、出力生成部１７２は、警告出力部１６２により提供されたリストを、オブジェクトファイルに追加する。例えば、ソースファイル１１１に対するコンパイルを行う場合、出力生成部１７２は、ソースファイル１１１に対応するオブジェクトファイル１３１を、オブジェクトファイル記憶部１３０に格納する。オブジェクトファイル１３１は、ソースファイル１１１に関して、ｄｅｐｒｅｃａｔｅｄ属性に応じた各シンボルの非推奨警告の有無が記録されたリストＬ１０を含む。また、ソースファイル１１２に対するコンパイルを行う場合、出力生成部１７２は、ソースファイル１１１に対応するオブジェクトファイル１３２を、オブジェクトファイル記憶部１３０に格納する。オブジェクトファイル１３２は、ソースファイル１１２に関して、ｄｅｐｒｅｃａｔｅｄ属性に応じた各シンボルの非推奨警告の有無が記録されたリストＬ２０を含む。
【００８３】
ＬＴＯ処理部１８１は、リンカの機能を提供する。具体的には、ＬＴＯ処理部１８１は、オブジェクトファイル記憶部１３０に記憶された複数のオブジェクトファイルに対するリンク処理を実行する。ＬＴＯ処理部１８１は、リンク処理においてＬＴＯを実行する。ＬＴＯ処理部１８１は、リンク処理を実行することで実行ファイルを生成する。ＬＴＯ処理部１８１は、生成された実行ファイルを実行ファイル記憶部１４０に格納する。
【００８４】
リスト結合部１８２は、ＬＴＯ処理部１８１によるＬＴＯ実行の際に、リンク対象の各オブジェクトファイルに含まれるリストを取得する。リスト結合部１８２は、取得された複数のリストを結合（マージ）し、マージ後のリストを作成する。例えば、ＬＴＯ処理部１８１によりオブジェクトファイル１３１，１３２のリンク処理が行われる場合、リスト結合部１８２は、オブジェクトファイル１３１に含まれるリストＬ１０、および、オブジェクトファイル１３２に含まれるリストＬ２０を取得する。そして、リスト結合部１８２は、リストＬ１０，Ｌ２０をマージし、マージ後のリストを作成する。
【００８５】
結果出力部１８３は、リスト結合部１８２により作成されたリスト（結合後のリスト）を参照して、オブジェクトファイル１３１，１３２にわたって未使用であるシンボル（未使用シンボル）を特定する。結果出力部１８３は、未使用シンボルの情報を出力する。例えば、結果出力部１８３は、ソースファイル１１１，１１２に、未使用シンボルが存在することを示す警告メッセージを、ディスプレイ１１により表示させる。
【００８６】
ここで、ソースファイル記憶部１１０、中間コード記憶部１２０、オブジェクトファイル記憶部１３０および実行ファイル記憶部１４０は、ＲＡＭ１０２またはＨＤＤ１０３に確保された所定の記憶領域を用いて実現される。
【００８７】
また、字句解析部１５１、構文解析部１５２、意味解析部１５３、属性追加部１６１、警告出力部１６２、最適化部１７１、出力生成部１７２、ＬＴＯ処理部１８１、リスト結合部１８２および結果出力部１８３の機能は、プロセッサ１０１により実現される。例えば、プロセッサ１０１は、ＲＡＭ１０２に記憶された所定のプログラムを実行することで、字句解析部１５１、構文解析部１５２、意味解析部１５３、属性追加部１６１、警告出力部１６２、最適化部１７１、出力生成部１７２、ＬＴＯ処理部１８１、リスト結合部１８２および結果出力部１８３の機能を発揮する。これらの機能は、コンパイラと呼ばれるソフトウェアの機能として実装される。ただし、字句解析部１５１、構文解析部１５２、意味解析部１５３、属性追加部１６１、警告出力部１６２、最適化部１７１および出力生成部１７２の機能をコンパイラに実装し、ＬＴＯ処理部１８１、リスト結合部１８２および結果出力部１８３の機能をリンカに実装する、というように、別個のソフトウェアとして各機能を実装することもできる。
【００８８】
図１０は、ソースファイルの例（その１）を示す図である。ソースファイル１１１のファイル名は、“ｓａｍｐｌｅ．ｃｐｐ”である。ソースファイル１１１では、“ｉｎｔ  ｇｌｏｂａｌ＿ｙ；”に対して“［［ｄｅｐｒｅｃａｔｅｄ］］”が付されている（ソースファイル１１１の３行目）。これは、“ｇｌｏｂａｌ＿ｙ；”の使用が非推奨である旨の警告メッセージを通知するために、ユーザによって追加されたｄｅｐｒｅｃａｔｅｄ属性である。
【００８９】
図１１は、ソースファイルの例（その２）を示す図である。ソースファイル１１２のファイル名は、“ｍａｉｎ．ｃｐｐ”である。ソースファイル１１２では、ソースファイル１１１と同様に、“ｉｎｔ  ｇｌｏｂａｌ＿ｙ；”に対して“［［ｄｅｐｒｅｃａｔｅｄ］］”が付されている（ソースファイル１１２の４行目）。これは、“ｇｌｏｂａｌ＿ｙ；”の使用が非推奨である旨の警告メッセージを通知するために、ユーザによって追加されたｄｅｐｒｅｃａｔｅｄ属性である。
【００９０】
図１０，図１１で例示したように、ソースファイル１１１，１１２には、ｄｅｐｒｅｃａｔｅｄ属性による本来の警告メッセージを通知するために、ユーザによってｄｅｐｒｅｃａｔｅｄ属性が予め付与されることがある。したがって、コンパイラ装置１００は、このような本来通知すべき警告メッセージに絞って、ユーザに提示する機能も提供する。
【００９１】
図１２は、構文木の例（その１）を示す図である。図１２では、ソースファイル１１１に対応する構文木５１，５２，５３，５４，５５，５６，５７を例示している。
構文木５１は、ソースファイル１１１の２行目のコードに相当する。構文木５２は、ソースファイル１１１の３行目のコードに相当する。構文木５３は、ソースファイル１１１の５行目〜８行目のコードに相当する。構文木５４は、ソースファイル１１１の９行目のコードに相当する。構文木５５は、ソースファイル１１１の１１行目〜１３行目のコードに相当する。構文木５６は、ソースファイル１１１の１５行目〜１６行目のコードに相当する。構文木５７は、ソースファイル１１１の１８行目〜２０行目のコードに相当する。
【００９２】
構文木は、ソースファイル１１１に記述された字句をノードとし、字句間の連結関係をエッジとした木構造をもつ情報である。例えば、ソースファイル１１１の２行目では、“ｉｎｔ”という整数型を表す文字列に、“ｇｌｏｂａｌ＿ｘ”の文字列が続く。このため、構文木５１では、型（Ｔｙｐｅ）として“ｉｎｔ”をもつノードと、変数（Ｖａｒｉａｂｌｅ）として“ｇｌｏｂａｌ＿ｘ”をもつノードとをエッジにより繋ぐ。
【００９３】
このように、構文木のノードは、型（Ｔｙｐｅ）や変数（Ｖａｒｉａｂｌｅ）といった属性をもつ。クラスキー（Ｃｌａｓｓ  ｋｅｙ）を用いて、クラスの型が定義される場合、Ｔｙｐｅのノードには、Ｃｌａｓｓ  ｋｅｙのノード（“ｓｔｒｕｃｔ”、“ｃｌａｓｓ”または“ｕｎｉｏｎ”といった値をもつ）が接続される。ノードの属性は、型や変数以外にも次のものが例示される。
【００９４】
第１には、“ｓｔａｔｉｃ”や“ｃｏｎｓｔ”などの修飾子（Ｑｕａｌｉｆｉｅｒ）である。第２には、関数名などに相当するルーチン（Ｒｏｕｔｉｎｅ）である。第３には、ｄｅｐｒｅｃａｔｅｄ属性などに相当する属性（ａｔｔｒｉｂｕｔｅ）である。
【００９５】
第４には、数式（ｅｘｐｒｅｓｓｉｏｎ）、繰り返し（ｉｔｅｒａｔｉｏｎ）、呼び出し（ｃａｌｌ）、および、リターン（ｒｅｔｕｒｎ）などに相当するステートメント（Ｓｔａｔｅｍｅｎｔ）である。
【００９６】
例えば、ステートメントとして、“ｅｘｐｒｅｓｓｉｏｎ”をもつノードには、演算子（Ｏｐｅｒａｔｏｒ）の属性をもつノード（例えば、演算子“＝”が設定される）が連結される。そして、演算子のノードに対して、当該演算子で結ばれる変数（例えば、変数“ｘ”および変数“ｇｌｏｂａｌ＿ｙ”）が連結される。
【００９７】
また、例えば、ステートメントとして“ｃａｌｌ”をもつノードには、呼び出す関数名などのノードが連結される。更に、ステートメントとして“ｒｅｔｕｒｎ”をもつノードには、呼び出し元の関数に対する戻り値（返り値）が設定されたノードが連結される。
【００９８】
図１３は、構文木の例（その２）を示す図である。図１３では、ソースファイル１１２に対応する構文木６１，６２，６３，６４を例示している。
構文木６１は、ソースファイル１１２の２行目〜８行目のコードに相当する。構文木６２は、ソースファイル１１２の１０行目〜１３行目のコードに相当する。構文木６３は、ソースファイル１１２の１４行目のコードに相当する。構文木６４は、ソースファイル１１２の１６行目〜２０行目のコードに相当する。
【００９９】
構文木６１，６２，６３，６４も、ソースファイル１１２に記述された字句をノードとし、字句間の連結関係をエッジとした木構造をもつ。
図１４は、ｄｅｐｒｅｃａｔｅｄ属性の追加例を示す図である。ｄｅｐｒｅｃａｔｅｄ属性は、Ｃ＋＋の規約に従って付与されなければ、コンパイラによって適切に処理されない。すなわち、ｄｅｐｒｅｃａｔｅｄ属性は、どこにでも付与できるわけではなく、言語規格で付与できる場所が定められている。特に、クラスの静的メンバ変数にｄｅｐｒｅｃａｔｅｄ属性を付与する際に注意を要する。サンプルコード１１１ｐは、ソースファイル１１１の一部のコードにｄｅｐｒｅｃａｔｅｄ属性を追加したものである。ここで、「クラス」という場合、構造体を含むものとする。
【０１００】
サンプルコード１１１ｐの６行目の“［［ｄｅｐｒｅｃａｔｅｄ］］  ｉｎｔ  ｘ；”の記述は許容される。一方、サンプルコード１１１ｐの７行目の“［［ｄｅｐｒｅｃａｔｅｄ］］  ｓｔａｔｉｃ  ｉｎｔ  ｙ；”の記述は、許容されない。ここで、サンプルコード１１１ｐの７行目の「未定義な動作」（ｕｎｄｅｆｉｎｅｄ  ｂｅｈａｖｉｏｒ）とは、ＩＳＯ／ＩＥＣ  １３３８２：２０１４では定められておらず、使用するコンパイラによって振る舞いが変わる処理のことである。実質クラスの静的メンバ変数の宣言にｄｅｐｒｅｃａｔｅｄ属性を付与する場合、Ｃ＋＋の規約では、静的変数の実体に付与することが求められる。したがって、サンプルコード１１１ｐの９行目の“［［ｄｅｐｒｅｃａｔｅｄ］］  ｉｎｔ  Ｘ：：ｙ；”の記述が適正となる。
【０１０１】
このような理由から、属性追加部１６１は、意味解析部１５３によるソースコードの意味解析処理の結果を基に、ｄｅｐｒｅｃａｔｅｄ属性をＣ＋＋の規約で定められた適切な箇所に付与する。
【０１０２】
なお、前述の“ｉｎｔ  ｘ”（サンプルコード１１１ｐの６行目）のようなローカル変数は、既存の警告機能でも検出可能である。コンパイラ装置１００では、複数のファイル間で使用されていない機能を検出するために、ファイルを跨いだ参照や呼び出しが生じ得る以下の内容をｄｅｐｒｅｃａｔｅｄ属性の主な付与対象（ターゲット）とする。
【０１０３】
第１のターゲットは、グローバル変数である。第２のターゲットは、関数である。第３のターゲットは、クラス（構造体を含む）である。第４のターゲットは、クラスのメンバ変数である。第５のターゲットは、クラスの静的メンバ変数である（ただし、前述のように静的メンバ変数の実体）。第６のターゲットは、クラスのメンバ関数である。第７のターゲットは、列挙型である。第８のターゲットは、共用体である。
【０１０４】
このため、属性追加部１６１は、ｄｅｐｒｅｃａｔｅｄ属性を付与する際に、付与対象が適切であるかを確認する。
図１５は、ＬＴＯを用いる場合のコマンド例を示す図である。ユーザは、コマンド“ｇ＋＋−６．１．０  ｓａｍｐｌｅ．ｃｐｐ  ０ｆａｓｔ    ｆｌｔｏ    ｃ    ｏ  ｓａｍｐｌｅ．ｏ”を、コンパイラ装置１００に入力することで、コンパイラ装置１００によるソースファイル１１１のコンパイルを指示する。このとき、ユーザは、オプション“ｆｌｔｏ”を指定することで、後段のＬＴＯ処理を意識したオブジェクトファイルの生成を、コンパイラ装置１００に指示できる。コンパイラ装置１００は、当該コマンドの入力に応じて、ソースファイル１１１をコンパイルし、オブジェクトファイル１３１を生成する。前述のように、オブジェクトファイル１３１は、ＬＴＯ処理に用いられる中間表現の情報を含む。また、オブジェクトファイル１３１は、リストＬ１０を含む。
【０１０５】
同様に、ユーザは、コマンド“ｇ＋＋−６．１．０  ｍａｉｎ．ｃｐｐ  ０ｆａｓｔ    ｆｌｔｏ    ｃ    ｏ  ｍａｉｎ．ｏ”を、コンパイラ装置１００に入力することで、コンパイラ装置１００によるソースファイル１１２のコンパイルを指示する。コンパイラ装置１００は、当該コマンドの入力に応じて、ソースファイル１１２をコンパイルし、オブジェクトファイル１３２を生成する。前述のように、オブジェクトファイル１３２は、ＬＴＯ処理に用いられる中間表現の情報を含む。また、オブジェクトファイル１３２は、リストＬ２０を含む。
【０１０６】
次に、コンパイラ装置１００により実行される処理手順を説明する。
図１６は、第２の実施の形態のコンパイル例を示すフローチャートである。以下、図１６に示す処理をステップ番号に沿って説明する。
【０１０７】
（Ｓ１１）字句解析部１５１は、ソースファイル１１１に対するコンパイルコマンドを受け付ける。コンパイルコマンドは、例えば、図１５の１行目で示されるコマンドである。コンパイル対象がソースファイル１１２の場合は、例えば図１５の２行目で示されるコマンドが用いられる。
【０１０８】
（Ｓ１２）字句解析部１５１は、ソースファイル１１１に対する字句解析を行う。また、構文解析部１５２は、字句解析部１５１による字句解析の結果に基づいて、ソースファイル１１１の構文解析を行い、構文木５１，５２，５３，５４，５５，５６，５７の情報を生成し、ＲＡＭ１０２の所定の記憶領域に格納する。更に、意味解析部１５３は、ＲＡＭ１０２に記憶された構文木５１，５２，５３，５４，５５，５６，５７の情報に基づいて、意味解析を行い、解析結果を属性追加部１６１に通知する。
【０１０９】
（Ｓ１３）属性追加部１６１は、意味解析部１５３による意味解析の結果に基づいて、構文木５１，５２，５３，５４，５５，５６，５７それぞれに含まれる所定のシンボルにｄｅｐｒｅｃａｔｅｄ属性を追加する。処理の詳細は後述される。
【０１１０】
（Ｓ１４）警告出力部１６２は、ｄｅｐｒｅｃａｔｅｄ属性に応じた非推奨機能に対する警告出力を行う。処理の詳細は後述される。
（Ｓ１５）意味解析部１５３は、意味解析の結果に基づいて、ソースファイル１１１に対応する中間コードを生成し、中間コード記憶部１２０に格納する。最適化部１７１は、中間コード記憶部１２０に記憶された中間コードを用いて所定の最適化処理を実行する。出力生成部１７２は、最適化部１７１による最適化結果を用いて、ソースファイル１１１に対応するオブジェクトファイル１３１を生成し、オブジェクトファイル記憶部１３０に格納する。このとき、出力生成部１７２は、警告出力部１６２により作成されたリストＬ１０を取得し、オブジェクトファイル１３１に追加する。
【０１１１】
このようにして、コンパイラ装置１００は、ソースファイル１１１をコンパイルし、オブジェクトファイル１３１を作成する。コンパイラ装置１００は、ソースファイル１１２についても同様にして、オブジェクトファイル１３２を作成する。
【０１１２】
図１７は、第２の実施の形態の属性追加例を示すフローチャートである。以下、図１７に示す処理をステップ番号に沿って説明する。以下に示す手順は、図１６のステップＳ１３に相当する。
【０１１３】
（Ｓ２１）属性追加部１６１は、ＲＡＭ１０２に記憶された構文木５１，５２，５３，５４，５５，５６，５７のうち、未処理の構文木（ステップＳ２２以降の処理を行っていない構文木）があるか否かを判定する。未処理の構文木がある場合、属性追加部１６１は、未処理の構文木を１つ選択して、ステップＳ２２に処理を進める。未処理の構文木がない場合、属性追加部１６１は、処理を終了する。
【０１１４】
（Ｓ２２）属性追加部１６１は、該当の構文木がグローバル変数の宣言であるか否かを判定する。グローバル変数の宣言である場合、属性追加部１６１は、ステップＳ２７に処理を進める。グローバル変数の宣言でない場合、属性追加部１６１は、ステップＳ２３に処理を進める。例えば、属性追加部１６１は、該当の構文木が、プログラム中の、構造体や関数などに相当するブロックに属さない箇所で宣言された変数である場合に、当該構文木をグローバル変数の宣言であると判定する。該当の構文木が、プログラム中の、構造体や関数などに相当するブロックに属さない箇所で宣言された変数でない場合、属性追加部１６１は、当該構文木をグローバル変数の宣言でないと判定する。
【０１１５】
（Ｓ２３）属性追加部１６１は、該当の構文木が列挙型の定義であるか否かを判定する。列挙型の定義である場合、属性追加部１６１は、ステップＳ２７に処理を進める。列挙型の定義でない場合、属性追加部１６１は、ステップＳ２４に処理を進める。例えば、属性追加部１６１は、該当の構文木が、Ｔｙｐｅ“ｅｎｕｍ”による定義の場合、該当の構文木は列挙型の定義であると判定する。該当の構文木が、Ｔｙｐｅ“ｅｎｕｍ”による定義でない場合、属性追加部１６１は、該当の構文木は列挙型の定義ではないと判定する。
【０１１６】
（Ｓ２４）属性追加部１６１は、該当の構文木が共用体の定義であるか否かを判定する。共用体の定義である場合、属性追加部１６１は、ステップＳ２７に処理を進める。共用体の定義でない場合、属性追加部１６１は、ステップＳ２５に処理を進める。例えば、属性追加部１６１は、該当の構文木がＣｌａｓｓ  ｋｅｙ“ｕｎｉｏｎ”のノードをもつ場合、該当の構文木は共用体の定義であると判定する。該当の構文木が、Ｃｌａｓｓ  ｋｅｙ“ｕｎｉｏｎ”のノードをもたない場合、属性追加部１６１は、該当の構文木は共用体の定義ではないと判定する。
【０１１７】
（Ｓ２５）属性追加部１６１は、該当の構文木が関数の定義であるか否かを判定する。関数の定義である場合、属性追加部１６１は、ステップＳ２７に処理を進める。関数の定義でない場合、属性追加部１６１は、ステップＳ２６に処理を進める。例えば、属性追加部１６１は、該当の構文木がＲｏｕｔｉｎｅのノードをルートとする場合、該当の構文木は関数の定義であると判定する。該当の構文木が、Ｒｏｕｔｉｎｅのノードをルートとしない場合、該当の構文木は関数の定義でないと判定する。ただし、属性追加部１６１は、Ｒｏｕｔｉｎｅのノードがｍａｉｎ関数を表す場合、例外的にｄｅｐｒｅｃａｔｅｄ属性の付与対象外とするため、ステップＳ２１に処理を進める。
【０１１８】
（Ｓ２６）属性追加部１６１は、該当の構文木がクラスの定義であるか否かを判定する。クラスの定義である場合、属性追加部１６１は、ステップＳ２７に処理を進める。クラスの定義でない場合、属性追加部１６１は、ステップＳ２１に処理を進める。例えば、属性追加部１６１は、該当の構文木がＣｌａｓｓ  ｋｅｙ“ｓｔｒｕｃｔ”またはＣｌａｓｓ  ｋｅｙ“ｃｌａｓｓ”のノードをもつ場合、該当の構文木はクラスの定義であると判定する。該当の構文木がＣｌａｓｓ  ｋｅｙ“ｓｔｒｕｃｔ”またはＣｌａｓｓ  ｋｅｙ“ｃｌａｓｓ”のノードをもたない場合、属性追加部１６１は、該当の構文木はクラスの定義ではないと判定する。
【０１１９】
（Ｓ２７）属性追加部１６１は、該当の構文木のオブジェクトをリストＬ１０に記録する。属性追加部１６１は、該当のオブジェクトがクラスならば静的メンバ変数以外のメンバ変数と、各メンバ関数もリストＬ１０に記録する。なお、あるソースファイルのコンパイル時に最初にステップＳ２７を実行する直前に、属性追加部１６１は、該当のソースファイルに対するリスト（当初は何も記録されていない空のリスト）を作成し、ＲＡＭ１０２の所定の記憶領域に格納する。
【０１２０】
（Ｓ２８）属性追加部１６１は、ユーザ定義の［［ｄｅｐｒｅｃａｔｅｄ］］属性（ｄｅｐｒｅｃａｔｅｄ属性）が該当の構文木に付与されているか否かを判定する。ユーザ定義のｄｅｐｒｅｃａｔｅｄ属性が該当の構文木に付与されている場合、属性追加部１６１は、ステップＳ２９に処理を進める。ユーザ定義のｄｅｐｒｅｃａｔｅｄ属性が該当の構文木に付与されていない場合、属性追加部１６１は、ステップＳ３０に処理を進める。
【０１２１】
（Ｓ２９）属性追加部１６１は、リストＬ１０における同オブジェクトのパラメータ（具体的には、ユーザ定義パラメータ）に“Ｙ”を記録する。そして、属性追加部１６１は、ステップＳ２１に処理を進める。
【０１２２】
（Ｓ３０）属性追加部１６１は、リストＬ１０における同オブジェクトのパラメータ（具体的には、ユーザ定義パラメータ）に“Ｘ”を記録する。
（Ｓ３１）属性追加部１６１は、該当の構文木にｄｅｐｒｅｃａｔｅｄ属性を追加する。具体的には、属性追加部１６１は、ステップＳ２７において、リストＬ１０に記録された構文木のオブジェクトのノードに対して、ａｔｔｒｉｂｕｔｅのノードを連結し、当該ａｔｔｒｉｂｕｔｅのノードに、“［［ｄｅｐｒｅｃａｔｅｄ］］”を設定する。なお、該当のオブジェクトがクラスの場合には、属性追加部１６１は、静的メンバ変数以外のメンバ変数と、各メンバ関数に対しても、同様にして、ｄｅｐｒｅｃａｔｅｄ属性を追加する。そして、属性追加部１６１は、ステップＳ２１に処理を進める。
【０１２３】
なお、上記の説明では、ソースファイル１１１のコンパイル時における属性追加の手順を説明したが、属性追加部１６１は、ソースファイル１１２に対しても同様にして属性追加を行う。
【０１２４】
また、ステップＳ２２の変数の確認において、属性追加部１６１は、構文木がクラスの静的メンバ変数の実体の定義であるか否かの確認を含めることができる。例えば、構文木５４のように、スコープ解決演算子“：：”を用いたクラス“Ｘ”の静的メンバ変数“Ｘ：：ｙ”の実体の定義の場合、属性追加部１６１は、ステップＳ２７に処理を進める。そして、属性追加部１６１は、当該オブジェクトの要素名およびユーザ定義パラメータのリストＬ１０への登録やｄｅｐｒｅｃａｔｅｄ属性の追加を行う。
【０１２５】
図１８は、リストの例（その１）を示す図である。リストＬ１１は、ソースファイル１１１（ファイル名“ｓａｍｐｌｅ．ｃｐｐ”）のコンパイルの過程（図１７の手順の直後の段階）で、属性追加部１６１により作成されたリストの例である。リストＬ１１は、リストＬ１０に至る前段階の状態を表している。リストＬ１１は、要素名、使用フラグおよびユーザ定義パラメータの項目を含む。
【０１２６】
例えば、リストＬ１１は、要素名が“ｉｎｔ  ｇｌｏｂａｌ＿ｘ”、使用フラグが設定なし（図中、ハイフン記号“−”により設定なしを表している）、ユーザ定義パラメータが“Ｘ”というレコードを含む。これは、“ｉｎｔ  ｇｌｏｂａｌ＿ｘ”というプログラム要素がソースファイル１１１に存在し、非推奨警告の有無を未判定であること、“ｉｎｔ  ｇｌｏｂａｌ＿ｘ”に対しユーザ定義のｄｅｐｒｅｃａｔｅ属性がないことを示す。この場合、“ｉｎｔ  ｇｌｏｂａｌ＿ｘ”に対して、属性追加部１６１により、ｄｅｐｒｅｃａｔｅｄ属性が追加されたことになる。
【０１２７】
また、リストＬ１１は、要素名が“ｉｎｔ  ｇｌｏｂａｌ＿ｙ”、使用フラグが設定なし、ユーザ定義パラメータが“Ｙ”というレコードを含む。これは、“ｉｎｔ  ｇｌｏｂａｌ＿ｙ”というプログラム要素がソースファイル１１１に存在し、非推奨警告の有無が未判定であること、“ｉｎｔ  ｇｌｏｂａｌ＿ｙ”に対しユーザ定義のｄｅｐｒｅｃａｔｅｄ属性があることを示す。
【０１２８】
リストＬ１１には、ソースファイル１１１に含まれる他のプログラム要素（ただし、ｄｅｐｒｅｃａｔｅｄ属性の付与対象の要素）に対しても、同様に、要素名と、使用フラグと、ユーザ定義パラメータとの対応関係が登録される。ただし、図１７の手順が完了した段階では、使用フラグは設定なしである。
【０１２９】
図１９は、リストの例（その２）を示す図である。リストＬ２１は、ソースファイル１１２（ファイル名“ｍａｉｎ．ｃｐｐ”）のコンパイルの過程（図１７の手順の直後の段階）で、属性追加部１６１により作成されたリストの例である。リストＬ２１は、リストＬ２０に至る前段階の状態を表している。リストＬ２１は、要素名、使用フラグおよびユーザ定義パラメータの項目を含む。
【０１３０】
リストＬ２１には、ソースファイル１１２に含まれるプログラム要素（ただし、ｄｅｐｒｅｃａｔｅｄ属性の付与対象の要素）に対して、リストＬ１１と同様に、要素名と、使用フラグと、ユーザ定義パラメータとの対応関係が登録される。ただし、図１７の手順が完了した段階では、使用フラグは設定なしである。
【０１３１】
図２０は、構文木（ｄｅｐｒｅｃａｔｅｄ追加後）の例（その１）を示す図である。構文木５１ａ，５２ａ，５３ａ，５４ａ，５５ａ，５６ａ，５７ａは、構文木５１，５２，５３，５４，５５，５６，５７に対してｄｅｐｒｅｃａｔｅｄ属性を追加した状態を示す。特に、構文木５３ａでは、構造体“Ｘ”に対して“［［ｄｅｐｒｅｃａｔｅｄ］］”が追加され、更に、構造体“Ｘ”の静的メンバ変数以外のメンバ変数“ｘ”に対しても“［［ｄｅｐｒｅｃａｔｅｄ］］”が追加されている。一方、構文木５３ａでは、構造体“Ｘ”の静的メンバ変数“ｙ”には、“［［ｄｅｐｒｅｃａｔｅｄ］］”が追加されていない。その代わり、構文木５４ａの静的メンバ変数“ｙ”の実体の定義に対して、“［［ｄｅｐｒｅｃａｔｅｄ］］”が追加されている。
【０１３２】
図２１は、構文木（ｄｅｐｒｅｃａｔｅｄ追加後）の例（その２）を示す図である。構文木６１ａ，６２ａ，６３ａは、構文木６１，６２，６３に対してｄｅｐｒｅｃａｔｅｄ属性を追加した状態を示す。なお、構文木６４は、ｍａｉｎ関数を表す構文木であるため、前述のようにｄｅｐｒｅｃａｔｅｄ属性が追加されない。
【０１３３】
図２２は、第２の実施の形態の非推奨機能に対する警告出力例を示すフローチャートである。以下、図２２に示す処理をステップ番号に沿って説明する。
（Ｓ４１）警告出力部１６２は、今回のコンパイル対象であるソースファイル１１１に対して作成されたリストＬ１１を、ＲＡＭ１０２の所定の記憶領域から取得する。
【０１３４】
（Ｓ４２）警告出力部１６２は、リストＬ１１に未処理の要素（ステップＳ４３以降の処理を行っていない要素）があるか否かを判定する。未処理の要素がある場合、警告出力部１６２は、ステップＳ４３に処理を進める。未処理の要素がない場合、警告出力部１６２は、処理を終了する。
【０１３５】
（Ｓ４３）警告出力部１６２は、［［ｄｅｐｒｅｃａｔｅｄ］］属性（ｄｅｐｒｅｃａｔｅｄ属性）の機能による非推奨警告の応答があるかを確認する。例えば、警告出力部１６２は、意味解析部１５３によるｄｅｐｒｅｃａｔｅｄ属性付与後の各構文木の意味解析の結果として、ｄｅｐｒｅｃａｔｅｄ属性の機能による非推奨警告が該当の要素に対して発生しているかを確認する。
【０１３６】
（Ｓ４４）警告出力部１６２は、ステップＳ４３の確認により、該当の要素に対して、非推奨警告があるか否かを判定する。該当の要素に対して非推奨警告がある場合、警告出力部１６２は、ステップＳ４５に処理を進める。該当の要素に対して非推奨警告がない場合、警告出力部１６２は、ステップＳ４９に処理を進める。
【０１３７】
（Ｓ４５）警告出力部１６２は、該当の要素を使用されている機能であると決定する。
（Ｓ４６）警告出力部１６２は、リストＬ１１を参照して、該当の要素に対するユーザ定義パラメータが“Ｙ”であるか否かを判定する。該当の要素に対するユーザ定義パラメータが“Ｙ”である場合、警告出力部１６２は、ステップＳ４７に処理を進める。該当の要素に対するユーザ定義パラメータが“Ｙ”でない場合（すなわち、“Ｘ”である場合）、警告出力部１６２は、ステップＳ４８に処理を進める。
【０１３８】
（Ｓ４７）警告出力部１６２は、該当の要素が非推奨機能である旨の警告を、ディスプレイ１１に表示させる。
（Ｓ４８）警告出力部１６２は、リストＬ１１において、該当の要素の使用フラグを“ＴＲＵＥ”に設定する。そして、警告出力部１６２は、ステップＳ４２に処理を進める。
【０１３９】
（Ｓ４９）警告出力部１６２は、該当の要素を使用されていない機能であると決定する。
（Ｓ５０）警告出力部１６２は、リストＬ１１において、該当の要素の使用フラグを“ＦＡＬＳＥ”に設定する。そして、警告出力部１６２は、ステップＳ４２に処理を進める。
【０１４０】
ここで、ステップＳ４５，Ｓ４９の決定を行える理由は次の通りである。本来、ｄｅｐｒｅｃａｔｅｄ属性による非推奨である旨の警告機能は、該当のオブジェクト（要素）が“使用された場合”にコンパイラが警告をだす機能である。本機能を一考すると、ｄｅｐｒｅｃａｔｅｄ属性が付与されたオブジェクトのうち、コンパイラによって「非推奨である旨の警告がでないものは使用されていない」と考えることができる。したがって、ｄｅｐｒｅｃａｔｅｄ属性が付与された要素についてコンパイラによる非推奨警告が発生していれば、当該要素は使用されている機能であると考えられる。一方、ｄｅｐｒｅｃａｔｅｄ属性が付与された要素についてコンパイラによる非推奨警告が発生していなければ、当該要素は使用されていない機能であると考えられる。
【０１４１】
そして、ステップＳ４３〜Ｓ５０の手順で示されるように、コンパイラ装置１００は、ｄｅｐｒｅｃａｔｅｄ属性に対する警告の出力処理に併せて、ｄｅｐｒｅｃａｔｅｄ属性に対する警告の有無により未使用シンボルを決定する。すなわち、コンパイラ装置１００は、コンパイル時のｄｅｐｒｅｃａｔｅｄ属性に対する警告の出力処理の手順の中で、未使用シンボルを決定する。より具体的には、警告出力部１６２は、ｄｅｐｒｅｃａｔｅｄ属性に対する警告があれば、ｄｅｐｒｅｃａｔｅｄ属性が付与された該当のシンボルを使用されていると決定する。また、警告出力部１６２は、ｄｅｐｒｅｃａｔｅｄ属性に対する警告がなければ、ｄｅｐｒｅｃａｔｅｄ属性が付与された該当のシンボルを未使用であると決定する。
【０１４２】
このため、未使用シンボルを決定するためのルーチンを、コンパイルと別個に行わずに済む。具体的には、コンパイルとは別個に、各シンボルが使用されているか否かのチェック処理を行わなくてよくなる。これにより、コンパイル装置１００は、未使用シンボルの抽出を効率的に行える。また、未使用シンボルを抽出するためのルーチンを別個に行うよりも、未使用シンボルの抽出を高速化できる。
【０１４３】
また、コンパイラ装置１００は、ステップＳ４６の判定により、ユーザにより予めｄｅｐｒｅｃａｔｅｄ属性が付与されていた要素（シンボル）に絞って、非推奨警告をディスプレイ１１による表示対象とすることができる。すなわち、コンパイラ装置１００は、属性追加部１６１によりｄｅｐｒｅｃａｔｅｄ属性が追加された要素（シンボル）に対する非推奨警告のディスプレイ１１による表示を制限する。これにより、ユーザにより非推奨警告の表示が意図されている要素に絞って非推奨警告を表示させることができる。
【０１４４】
図２３は、使用フラグ設定後のリストの例を示す図である。図２３（Ａ）は、リストＬ１０の内容を示す。リストＬ１０は、リストＬ１１に対して、使用フラグが設定された後の状態である。図２３（Ｂ）は、リストＬ２０の内容を示す。リストＬ２０は、リストＬ２１に対して、使用フラグが設定された後の状態である。
【０１４５】
リストＬ１０の例でいえば、ソースファイル１１１における“ｉｎｔ  ｇｌｏｂａｌ＿ｘ”、“ｓｔｒｕｃｔ  Ｘ”、“ｉｎｔ  Ｘ：：ｘ”（構造体“Ｘ”のメンバ変数“ｘ”）、“ｓｔａｔｉｃ  ｉｎｔ  Ｘ：：ｙ”、“ｖｏｉｄ  ｆｕｎｃ０１（）”および“ｖｏｉｄ  ｆｕｎｃ０３（）”の各要素に対応する使用フラグは、“ＦＡＬＳＥ”である。これは、ソースファイル１１１において、“ｉｎｔ  ｇｌｏｂａｌ＿ｘ”、“ｓｔｒｕｃｔ  Ｘ”、“ｉｎｔ  Ｘ：：ｘ”（構造体“Ｘ”のメンバ変数“ｘ”）、“ｓｔａｔｉｃ  ｉｎｔ  Ｘ：：ｙ”、“ｖｏｉｄ  ｆｕｎｃ０１（）”および“ｖｏｉｄ  ｆｕｎｃ０３（）”の各要素は使用されていないことを示す。
【０１４６】
一方、リストＬ１０では、ソースファイル１１１における“ｉｎｔ  ｇｌｏｂａｌ＿ｙ”および“ｖｏｉｄ  ｆｕｎｃ０２（）”の各要素に対応する使用フラグは、“ＴＲＵＥ”である。これは、ソースファイル１１１において、“ｉｎｔ  ｇｌｏｂａｌ＿ｙ”および“ｖｏｉｄ  ｆｕｎｃ０２（）”の各要素は使用されていることを示す。
【０１４７】
同様に、リストＬ２０の例でいえば、ソースファイル１１２における“ｉｎｔ  ｇｌｏｂａｌ＿ｙ”、“ｖｏｉｄ  ｆｕｎｃ０１（ｖｏｉｄ）”、“ｖｏｉｄ  ｆｕｎｃ０２（ｖｏｉｄ）”、“ｓｔｒｕｃｔ  Ｘ”、“ｉｎｔ  Ｘ：：ｘ”および“ｓｔａｔｉｃ  ｉｎｔ  Ｘ：：ｙ”の各要素に対応する使用フラグは、“ＦＡＬＳＥ”である。これは、ソースファイル１１２において、“ｉｎｔ  ｇｌｏｂａｌ＿ｙ”、“ｖｏｉｄ  ｆｕｎｃ０１（ｖｏｉｄ）”、“ｖｏｉｄ  ｆｕｎｃ０２（ｖｏｉｄ）”、“ｓｔｒｕｃｔ  Ｘ”、“ｉｎｔ  Ｘ：：ｘ”および“ｓｔａｔｉｃ  ｉｎｔ  Ｘ：：ｙ”の各要素は使用されていないことを示す。
【０１４８】
一方、リストＬ２０では、ソースファイル１１２における“ｉｎｔ  ｇｌｏｂａｌ＿ｘ”および“ｖｏｉｄ  ｆｕｎｃ０３（ｖｏｉｄ）”の各要素に対応する使用フラグは、“ＴＲＵＥ”である。これは、ソースファイル１１２において、“ｉｎｔ  ｇｌｏｂａｌ＿ｘ”および“ｖｏｉｄ  ｆｕｎｃ０３（ｖｏｉｄ）”の各要素は使用されていることを示す。
【０１４９】
リストＬ１０は、オブジェクトファイル１３１に追加される。また、リストＬ２０は、オブジェクトファイル１３２に追加される。そして、オブジェクトファイル１３１，１３２は、オブジェクトファイル記憶部１３０に格納される。
【０１５０】
次に、以上のようにして生成されたオブジェクトファイル１３１，１３２に基づく実行ファイルの生成処理の手順を説明する。コンパイラ装置１００は、オブジェクトファイル１３１，１３２を結合する（リンク処理する）ことで、実行ファイルを生成する。
【０１５１】
図２４は、第２の実施の形態のリンク処理例を示すフローチャートである。以下、図２４に示す処理をステップ番号に沿って説明する。
（Ｓ６１）ＬＴＯ処理部１８１は、実行ファイルの生成指示コマンドを受け付ける。実行ファイルの生成指示コマンドは、例えば、図１５の３行目で示されるコマンドである。例えば、当該コマンドでは、リンク対象として、オブジェクトファイル記憶部１３０に記憶されたオブジェクトファイル１３１，１３２が指定される。
【０１５２】
（Ｓ６２）ＬＴＯ処理部１８１は、オブジェクトファイル１３１，１３２に基づいてリンク時最適化（ＬＴＯ）処理を実行する。このとき、ＬＴＯ処理部１８１は、リンク対象のオブジェクトファイル１３１からリストＬ１０を抽出し、リスト結合部１８２に提供する。また、ＬＴＯ処理部１８１は、リンク対象のオブジェクトファイル１３２からリストＬ２０を抽出し、リスト結合部１８２に提供する。
【０１５３】
（Ｓ６３）リスト結合部１８２は、ＬＴＯ処理部１８１から取得したリストＬ１０，Ｌ２０に基づいて、未使用機能に対する警告出力の処理を実行する。当該処理の詳細は後述される。
【０１５４】
（Ｓ６４）ＬＴＯ処理部１８１は、オブジェクトファイル１３１，１３２に基づいて実行ファイルを生成し、生成された実行ファイルを出力する。具体的には、ＬＴＯ処理部１８１は、生成された実行ファイルを、実行ファイル記憶部１４０に格納する。
【０１５５】
図２５は、第２の実施の形態の未使用機能に対する警告出力例を示すフローチャートである。以下、図２５に示す処理をステップ番号に沿って説明する。以下に示す手順は、図２４のステップＳ６３に相当する。
【０１５６】
（Ｓ７１）リスト結合部１８２は、ＬＴＯ処理部１８１によるＬＴＯ処理の際にオブジェクトファイル１３１，１３２から抽出されたリストＬ１０，Ｌ２０を取得する。
（Ｓ７２）リスト結合部１８２は、リストＬ１０，Ｌ２０をマージすることでマージ後のリストを作成する。具体的には、リスト結合部１８２は、リストＬ１０，Ｌ２０の少なくとも一方に含まれる要素名を、マージ後のリストの要素名の項目に登録する。また、リスト結合部１８２は、マージ後のリストに登録した要素名に対して、リストＬ１０，Ｌ２０それぞれの使用フラグを参照し、少なくとも一方の使用フラグが“ＴＲＵＥ”であれば、マージ後のリストの当該要素名に対する使用フラグを“ＴＲＵＥ”とする。両方の使用フラグが“ＦＡＬＳＥ”であれば、リスト結合部１８２は、マージ後のリストの当該要素名に対する使用フラグを“ＦＡＬＳＥ”とする。ユーザ定義パラメータについては、少なくとも何れか一方が“Ｙ”であれば“Ｙ”、両方が“Ｘ”であれば“Ｘ”とする。
【０１５７】
ここで、リスト結合部１８２は、リストＬ１０，Ｌ２０において実質的に同じ要素名があれば、当該要素名がリストＬ１０，Ｌ２０の両方に存在すると判断する。例えば、リストＬ１０における“ｖｏｉｄ  ｆｕｎｃ０１（）”と、リストＬ２０における“ｖｏｉｄ  ｆｕｎｃ０１（ｖｏｉｄ）”とは、実質的に同じである。したがって、リスト結合部１８２は、当該要素について、リストＬ１０，Ｌ２０のうちの一方に登録された要素名（例えば、“ｖｏｉｄ  ｆｕｎｃ０１（ｖｏｉｄ）”）を採用し、マージ後のリストに追加する。リスト結合部１８２は、作成したリストをＲＡＭ１０２の所定の記憶領域に格納する。
【０１５８】
（Ｓ７３）結果出力部１８３は、マージ後のリストに未処理の要素があるか否かを判定する。マージ後のリストに未処理の要素（ステップＳ７４以降の処理を行っていない要素）がある場合、結果出力部１８３は、ステップＳ７４に処理を進める。マージ後のリストに未処理の要素がない場合、結果出力部１８３は、処理を終了する。
【０１５９】
（Ｓ７４）結果出力部１８３は、マージ後のリストの要素を１つ選択する。ここで選択対象となる要素は、未だ選択されていない要素である。
（Ｓ７５）結果出力部１８３は、マージ後のリストを参照して、該当の要素に対応する使用フラグが“ＦＡＬＳＥ”であるか否かを判定する。“ＦＡＬＳＥ”である場合、結果出力部１８３は、ステップＳ７６に処理を進める。“ＦＡＬＳＥ”でない場合（すなわち、“ＴＲＵＥ”である場合）、結果出力部１８３は、ステップＳ７３に処理を進める。
【０１６０】
（Ｓ７６）結果出力部１８３は、該当の要素について、使用されていない機能である旨の警告をディスプレイ１１に表示させる。そして、結果出力部１８３は、ステップＳ７３に処理を進める。
【０１６１】
図２６は、マージ後のリストの例を示す図である。リストＬ３０は、リストＬ１０，Ｌ２０をマージした結果である。例えば、リストＬ３０には各要素について次のように使用フラグが決定される。
【０１６２】
要素名“ｉｎｔ  ｇｌｏｂａｌ＿ｘ”について、リストＬ１０の使用フラグは“ＦＡＬＳＥ”であり、リストＬ２０の使用フラグは“ＴＲＵＥ”である。したがって、リストＬ３０の要素名“ｉｎｔ  ｇｌｏｂａｌ＿ｘ”の使用フラグは“ＴＲＵＥ”である。
【０１６３】
要素名“ｉｎｔ  ｇｌｏｂａｌ＿ｙ”について、リストＬ１０の使用フラグは“ＴＲＵＥ”であり、リストＬ２０の使用フラグは“ＦＡＬＳＥ”である。したがって、リストＬ３０の要素名“ｉｎｔ  ｇｌｏｂａｌ＿ｙ”の使用フラグは“ＴＲＵＥ”である。
【０１６４】
要素名“ｓｔｒｕｃｔ  Ｘ”について、リストＬ１０の使用フラグは“ＦＡＬＳＥ”であり、リストＬ２０の使用フラグは“ＦＡＬＳＥ”である。したがって、リストＬ３０の要素名“ｓｔｒｕｃｔ  Ｘ”の使用フラグは“ＦＡＬＳＥ”である。
【０１６５】
要素名“ｉｎｔ  Ｘ：：ｘ”について、リストＬ１０の使用フラグは“ＦＡＬＳＥ”であり、リストＬ２０の使用フラグは“ＦＡＬＳＥ”である。したがって、リストＬ３０の要素名“ｉｎｔ  Ｘ：：ｘ”の使用フラグは“ＦＡＬＳＥ”である。
【０１６６】
要素名“ｓｔａｔｉｃ  ｉｎｔ  Ｘ：：ｙ”について、リストＬ１０の使用フラグは“ＦＡＬＳＥ”であり、リストＬ２０の使用フラグは“ＦＡＬＳＥ”である。したがって、リストＬ３０の要素名“ｓｔａｔｉｃ  ｉｎｔ  Ｘ：：ｙ”の使用フラグは“ＦＡＬＳＥ”である。
【０１６７】
要素名“ｖｏｉｄ  ｆｕｎｃ０１（ｖｏｉｄ）”について、リストＬ１０の使用フラグは“ＦＡＬＳＥ”であり、リストＬ２０の使用フラグは“ＦＡＬＳＥ”である。したがって、リストＬ３０の要素名“ｖｏｉｄ  ｆｕｎｃ０１（ｖｏｉｄ）”の使用フラグは“ＦＡＬＳＥ”である。
【０１６８】
要素名“ｖｏｉｄ  ｆｕｎｃ０２（ｖｏｉｄ）”について、リストＬ１０の使用フラグは“ＴＲＵＥ”であり、リストＬ２０の使用フラグは“ＦＡＬＳＥ”である。したがって、リストＬ３０の要素名“ｖｏｉｄ  ｆｕｎｃ０２（ｖｏｉｄ）”の使用フラグは“ＴＲＵＥ”である。
【０１６９】
要素名“ｖｏｉｄ  ｆｕｎｃ０３（ｖｏｉｄ）”について、リストＬ１０の使用フラグは“ＦＡＬＳＥ”であり、リストＬ２０の使用フラグは“ＴＲＵＥ”である。したがって、リストＬ３０の要素名“ｖｏｉｄ  ｆｕｎｃ０３（ｖｏｉｄ）”の使用フラグは“ＴＲＵＥ”である。
【０１７０】
結果出力部１８３は、リストＬ３０に基づいて、ソースファイル１１１，１１２における“ｓｔｒｕｃｔ  Ｘ”、“ｉｎｔ  Ｘ：：ｘ”、“ｓｔａｔｉｃ  ｉｎｔ  Ｘ：：ｙ”および“ｖｏｉｄ  ｆｕｎｃ０１（ｖｏｉｄ）”に相当するコードが未使用である旨の警告を、ディスプレイ１１に表示させる。
【０１７１】
図２７は、未使用を示す警告の表示例を示す図である。メッセージ群１１ｂは、該当の要素が未使用であることを示す警告メッセージの表示例である。例えば、結果出力部１８３は、リストＬ３０における該当の要素名からソースファイル１１１，１１２における記述箇所を特定する。そして、結果出力部１８３は、ソースファイル１１１，１１２それぞれのファイル名と、当該記述箇所を示す情報（例えば、行番号や行先頭からの位置を表す番号など）とをディスプレイ１１に表示させてもよい。
【０１７２】
このように、コンパイラ装置１００は、ｄｅｐｒｅｃａｔｅｄ属性による非推奨警告の出力機能を活用して、ソースコード中の未使用の要素の抽出を行う。これにより、ソースコード中の未使用の要素の抽出機能をコンパイラに対して容易に実装可能になる。すなわち、コード中の未使用の要素の抽出機能をコンパイラの一部の機能として、または、コンパイラの追加機能として容易に実現可能となる。
【０１７３】
更に、コンパイラ装置１００は、ｄｅｐｒｅｃａｔｅｄ属性に対する警告の出力処理に併せて、ｄｅｐｒｅｃａｔｅｄ属性に対する警告の有無により未使用シンボルを決定する。このため、未使用シンボルを決定するためのルーチンを、コンパイルと別個に行わずに済む。具体的には、コンパイルとは別個に、各シンボルが使用されているか否かのチェック処理を行わなくてよくなる。これにより、コンパイル装置１００は、未使用シンボルの抽出を効率的に行える。また、未使用シンボルを抽出するためのルーチンを別個に行うよりも、未使用シンボルの抽出を高速化できる。
【０１７４】
また、コンパイラ装置１００は、ソースファイル１１１，１１２における未使用の要素をユーザに提示することで、ユーザによるソースコードの見直し箇所の特定を支援することができる。また、コンパイラ装置１００は、リストＬ３０を用いて、コンパイルの効率化を図ることもできる。具体的には次の通りである。
【０１７５】
図２８は、コンパイラ装置の他の機能例を示す図である。例えば、コンパイラ装置１００は、図９で例示した機能に加えて、リスト記憶部１９０およびコンパイル制御部１９１を更に有してもよい。リスト記憶部１９０は、ＲＡＭ１０２やＨＤＤ１０３の所定の記憶領域を用いて実現される。コンパイル制御部１９１は、プロセッサ１０１がＲＡＭ１０２に記憶されたプログラムを実行することで実現される。
【０１７６】
リスト記憶部１９０は、リスト結合部１８２により生成されたリストＬ３０を、ソースファイル１１１，１１２のファイル名に対応付けて記憶する。
コンパイル制御部１９１は、リスト記憶部１９０に記憶された情報に基づいて、ソースファイルにおけるコンパイル対象箇所を絞り込む。具体的には、コンパイル制御部１９１は、コンパイルの対象となるソースファイルに対して作成済のリストを、リスト記憶部１９０から検索し、当該リストにおいて使用フラグが“ＦＡＬＳＥ”である要素を、コンパイルの対象外に設定する。例えば、コンパイル制御部１９１は、コンパイラに対して該当の要素をコンパイルの対象外とすることを指示する所定のメタデータを、対象のソースファイルに追加してもよい。あるいは、コンパイル制御部１９１は、オリジナルのソースファイルからコンパイルの対象外とする要素を削除した新たなソースファイルを作成し、新たなソースファイルをコンパイルするようにコンパイラに指示してもよい。
【０１７７】
次に、コンパイル制御部１９１の機能に基づくコンパイラ装置１００の処理手順を説明する。
図２９は、第２の実施の形態のコンパイル制御例を示すフローチャートである。以下、図２９に示す処理をステップ番号に沿って説明する。
【０１７８】
（Ｓ８１）コンパイル制御部１９１は、コンパイルコマンドを受け付ける。コンパイルコマンドは、例えば、コンパイル対象のソースファイル１１１のファイル名を含む。
（Ｓ８２）コンパイル制御部１９１は、指定されたソースファイルに対する作成済のリストが、リスト記憶部１９０にあるか否かを判定する。作成済のリストがある場合、コンパイル制御部１９１は、ステップＳ８３に処理を進める。作成済のリストがない場合、コンパイル制御部１９１は、ステップＳ８４に処理を進める。例えば、ソースファイル１１１に対する作成済のリストは、リストＬ３０である。
【０１７９】
（Ｓ８３）コンパイル制御部１９１は、該当のリストで使用フラグが“ＦＡＬＳＥ”の要素をコンパイルの対象外に設定する。例えば、コンパイル制御部１９１は、ソースファイル１１１に含まれる要素のうち、リストＬ３０において使用フラグが“ＦＡＬＳＥ”に設定されているものをコンパイルの対象外に設定する。前述のように、コンパイル制御部１９１は該当の要素をコンパイルの対象外とすることを指示する所定のメタデータを、ソースファイル１１１に追加してもよい。あるいは、コンパイル制御部１９１は、該当の要素を削除した新たなソースファイルを作成してもよい。後者の場合、コンパイル制御部１９１は、オリジナルのソースファイル１１１に代えて、当該新たなソースファイルによるコンパイルの開始をコンパイラ（例えば、そのうちの字句解析部１５１）に指示してもよい。
【０１８０】
（Ｓ８４）字句解析部１５１は、字句解析処理を開始する。以降、構文解析部１５２、意味解析部１５３、最適化部１７１および出力生成部１７２の一連の機能により、オブジェクトファイルが生成される（コンパイルが実行される）。なお、この場合、コンパイル制御部１９１は、属性追加部１６１によるｄｅｐｒｅｃａｔｅｄ属性の追加処理を抑制してもよい。
【０１８１】
このように、コンパイラ装置１００は、作成済のリストＬ３０に基づいてソースファイル１１１の中の使用されていない要素（シンボル）のコンパイルを省略することができる。コンパイラ装置１００は、ソースファイル１１２についても同様に、リストＬ３０に基づいて、ソースファイル１１２の中の使用されていない要素（シンボル）のコンパイルを省略することができる。
【０１８２】
これにより、コンパイルの効率化を図れる。例えば、コンパイルに伴う処理を高速化し、コンパイルの所要時間を短縮することができる。
なお、第１の実施の形態の情報処理は、処理部１ｂにプログラムを実行させることで実現できる。また、第２の実施の形態の情報処理は、プロセッサ１０１にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体１３に記録できる。
【０１８３】
例えば、プログラムを記録した記録媒体１３を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体１３に記録されたプログラムまたは他のコンピュータから受信したプログラムを、ＲＡＭ１０２やＨＤＤ１０３などの記憶装置に格納し（インストールし）、当該記憶装置からプログラムを読み込んで実行してもよい。
【符号の説明】
【０１８４】
１  情報処理装置
１ａ  記憶部
１ｂ  処理部
２  表示装置
３，４  ソースコード
５，６  出力
【図１】
2018156133.tif 000003
【図２】
2018156133.tif 000004
【図３】
2018156133.tif 000005
【図４】
2018156133.tif 000006
【図５】
2018156133.tif 000007
【図６】
2018156133.tif 000008
【図７】
2018156133.tif 000009
【図８】
2018156133.tif 000010
【図９】
2018156133.tif 000011
【図１０】
2018156133.tif 000012
【図１１】
2018156133.tif 000013
【図１２】
2018156133.tif 000014
【図１３】
2018156133.tif 000015
【図１４】
2018156133.tif 000016
【図１５】
2018156133.tif 000017
【図１６】
2018156133.tif 000018
【図１７】
2018156133.tif 000019
【図１８】
2018156133.tif 000020
【図１９】
2018156133.tif 000021
【図２０】
2018156133.tif 000022
【図２１】
2018156133.tif 000023
【図２２】
2018156133.tif 000024
【図２３】
2018156133.tif 000025
【図２４】
2018156133.tif 000026
【図２５】
2018156133.tif 000027
【図２６】
2018156133.tif 000028
【図２７】
2018156133.tif 000029
【図２８】
2018156133.tif 000030
【図２９】
2018156133.tif 000031