(57)【要約】【課題】  オブジェクト指向プログラムから，静的な解析によって不変オブジェクトを高速かつ高精度に抽出する。【解決手段】  プログラム入力受付部１０は抽出対象プログラム２を受け付ける。プログラム構文解析部１２は，抽出対象プログラム２を解析し，その全クラスを未分類に分類し，全クラスの親子情報とフィールド情報とを取得する。不変物抽出部１３は，可変フィールドを持つクラスを可変物に変更する。また，可変物のクラスについて，その祖先クラスであって可変物ではないクラスを中立物に変更し，その子孫クラスを可変物に変更する。さらに，中立物のクラスの祖先クラスであり可変物ではないクラスを中立物に変更する。さらに，未分類のままのクラスを不変物に変更し，不変物のクラスを特定する不変物抽出情報を出力する。【選択図】  図１
2009129127.tif 000002
【特許請求の範囲】
【請求項１】
処理対象とするオブジェクト指向プログラムを入力として受け付けるプログラム入力処理と，
前記入力されたオブジェクト指向プログラムを構文解析し，当該オブジェクト指向プログラムの全クラスについて，クラス間の親子情報およびフィールド情報を取得するクラス情報取得処理と，
クラスの種類として，未分類，不変物，可変物および中立物を設け，前記オブジェクト指向プログラムから解析された全クラスを未分類に分類する初期分類処理と，
前記フィールド情報をもとに，前記未分類に分類されているクラスが可変フィールドを持つかを判定し，前記未分類に分類されているクラスが可変フィールドを持つ場合に，当該クラスの種類を可変物に変更する第１の分類変更処理と，
前記種類が可変物に分類されているクラスについて，前記親子情報をもとに，当該クラスの祖先であって種類が可変物ではないクラスを特定し，当該特定したクラスの種類を中立物に変更する第２の分類変更処理と，
前記種類が可変物に分類されているクラスについて，前記親子情報をもとに，当該クラスの子孫クラスの種類を可変物に変更する第３の分類変更処理と，
前記種類が中立物に分類されているクラスについて，前記親子情報をもとに，当該クラスの祖先であって種類が可変物ではないクラスを特定し，当該特定したクラスの種類を中立物に変更する第４の分類変更処理と，
前記第１の分類変更処理，前記第２の分類変更処理，前記第３の分類変更処理および前記第４の分類変更処理の処理後に，前記全クラスから未分類に分類されているクラスを取り出し，当該取り出したクラスの種類を不変物に変更する不変物抽出処理と，
前記不変物に分類されたクラスに関する情報を，不変物抽出情報として出力する不変物情報出力処理とを，
コンピュータに実行させるためのプログラムの不変物抽出処理プログラム。
【請求項２】
不変物に分類するクラスを示す不変物指定情報を入力として受け付ける不変物指定情報入力処理と，
前記第１の分類変更処理，前記第２の分類変更処理，前記第３の分類変更処理および前記第４の分類変更処理のいずれかの処理において，種類を可変物または中立物へ変更するクラスが，前記不変物指定情報で指定されたクラスである場合に，当該クラスを不正不変物として出力する不正不変物出力処理とを，
前記コンピュータに実行させるための請求項１に記載のプログラムの不変物抽出処理プログラム。
【請求項３】
処理対象とするオブジェクト指向プログラムを入力として受け付けるプログラム入力部と，
前記入力されたオブジェクト指向プログラムを構文解析し，当該オブジェクト指向プログラムの全クラスについて，クラス間の親子情報およびフィールド情報を取得するクラス情報取得部と，
クラスの種類として，未分類，不変物，可変物および中立物を設け，前記オブジェクト指向プログラムから解析された全クラスを未分類に分類する初期分類部と，
前記フィールド情報をもとに，前記未分類に分類されているクラスが可変フィールドを持つかを判定し，前記未分類に分類されているクラスが可変フィールドを持つ場合に，当該クラスの種類を可変物に変更する第１の分類変更部と，
前記種類が可変物に分類されているクラスについて，前記親子情報をもとに，当該クラスの祖先であって種類が可変物ではないクラスを特定し，当該特定したクラスの種類を中立物に変更する第２の分類変更部と，
前記種類が可変物に分類されているクラスについて，前記親子情報をもとに，当該クラスの子孫クラスの種類を可変物に変更する第３の分類変更部と，
前記種類が中立物に分類されているクラスについて，前記親子情報をもとに，当該クラスの祖先であって種類が可変物ではないクラスを特定し，当該特定したクラスの種類を中立物に変更する第４の分類変更部と，
前記第１の分類変更処理，前記第２の分類変更処理，前記第３の分類変更処理および前記第４の分類変更処理の処理後に，前記全クラスから未分類に分類されているクラスを取り出し，当該取り出したクラスの種類を不変物に変更する不変物抽出部と，
前記不変物に分類されたクラスに関する情報を，不変物抽出情報として出力する不変物情報出力部とを備える
プログラムの不変物抽出処理装置。
【請求項４】
コンピュータが，
処理対象とするオブジェクト指向プログラムを入力として受け付け，
前記入力されたオブジェクト指向プログラムを構文解析し，当該オブジェクト指向プログラムの全クラスについて，クラス間の親子情報およびフィールド情報を取得し，
クラスの種類として，未分類，不変物，可変物および中立物を設け，前記オブジェクト指向プログラムから解析された全クラスを未分類に分類し，
前記フィールド情報をもとに，前記未分類に分類されているクラスが可変フィールドを持つかを判定し，前記未分類に分類されているクラスが可変フィールドを持つ場合に，当該クラスの種類を可変物に変更し，
前記種類が可変物に分類されているクラスについて，前記親子情報をもとに，当該クラスの祖先であって種類が可変物ではないクラスを特定し，当該特定したクラスの種類を中立物に変更し，
前記種類が可変物に分類されているクラスについて，前記親子情報をもとに，当該クラスの子孫クラスの種類を可変物に変更し，
前記種類が中立物に分類されているクラスについて，前記親子情報をもとに，当該クラスの祖先であって種類が可変物ではないクラスを特定し，当該特定したクラスの種類を中立物に変更し，
前記全クラスから未分類に分類されているクラスを取り出し，当該取り出したクラスの種類を不変物に変更し，
前記不変物に分類されたクラスに関する情報を，不変物抽出情報として出力する
ことを特徴とするプログラムの不変物抽出処理方法。
【請求項５】
処理対象とするオブジェクト指向プログラムを入力として受け付けるプログラム入力処理と，
前記入力されたオブジェクト指向プログラムを構文解析し，当該オブジェクト指向プログラムの全クラスについて，クラス間の親子情報およびフィールド情報を取得するクラス情報取得処理と，
クラスの種類として，未分類，不変物，可変物および中立物を設け，前記オブジェクト指向プログラムから解析された全クラスを未分類に分類する初期分類処理と，
前記フィールド情報をもとに，前記未分類に分類されているクラスが可変フィールドを持つかを判定し，前記未分類に分類されているクラスが可変フィールドを持つ場合に，当該クラスの種類を可変物に変更する第１の分類変更処理と，
前記種類が可変物に分類されているクラスについて，前記親子情報をもとに，当該クラスの祖先であって種類が可変物ではないクラスを特定し，当該特定したクラスの種類を中立物に変更する第２の分類変更処理と，
前記種類が可変物に分類されているクラスについて，前記親子情報をもとに，当該クラスの子孫クラスの種類を可変物に変更する第３の分類変更処理と，
前記種類が中立物に分類されているクラスについて，前記親子情報をもとに，当該クラスの祖先であって種類が可変物ではないクラスを特定し，当該特定したクラスの種類を中立物に変更する第４の分類変更処理と，
前記第１の分類変更処理，前記第２の分類変更処理，前記第３の分類変更処理および前記第４の分類変更処理の処理後に，前記全クラスから未分類に分類されているクラスを取り出し，当該取り出したクラスの種類を不変物に変更する不変物抽出処理と，
前記不変物に分類されたクラスに関する情報を，不変物抽出情報として出力する不変物情報出力処理とを，
コンピュータに実行させるためのプログラムの不変物抽出処理プログラムを記憶する記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，オブジェクト指向プログラムの静的解析処理における不変オブジェクト抽出処理に関する。より詳しくは，クラス構造が静的に定まっているオブジェクト指向プログラムから，プログラム実行を行うことなく，不変オブジェクトを抽出する技術に関する。
【背景技術】
【０００２】
不変オブジェクトとは，オブジェクト生成後は，そのオブジェクトの木構造や値を変更することができないようなオブジェクト指向プログラムにおける実行時データ構造をいう。
【０００３】
不変オブジェクトは，しばしば，プログラム開発者によって意図的にプログラム内に用意される。不変オブジェクトの設定は，例えば，その型のオブジェクトは全て不変オブジェクトになるような不変クラスを定義することによって行われる。
【０００４】
例えば，Ｊａｖａ（登録商標）において不変オブジェクトにするためには，クラス定義のときに以下の条件を満たすようにする。
【０００５】
・  フィールドを変更する可能性があるメソッドを用意しない。
【０００６】
・  すべてのフィールドをfinalにする。
【０００７】
・  すべてのメソッドもしくはクラス自体をfinalと宣言してオーバーライドを禁止する。
【０００８】
・  フィールドが不変でないオブジェクトを参照する場合に，そのオブジェクトの参照を公開しない。
【０００９】
非特許文献１にも記載されているように，プログラム開発者が不変物クラスを正しく定義することによって，以下のようなメリットが生じ，プログラムの生産性を向上させることが良く知られている。
【００１０】
具体的には，不変オブジェクトでは値が変化する危険性がないため，不変オブジェクトへの参照をキャッシュする場合に，その参照がその後も必ず同じ値を指すことを前提に自由にキャッシュを実行することが可能となる。さらに，不変オブジェクトのプロパティも変化しないため，不変オブジェクトのフィールドやメソッドの結果も自由にキャッシュすることができる。
【００１１】
また，不変オブジェクトが正しく作成されている場合，すなわち，オブジェクト参照がコンストラクタの外部に渡らないように作成されている場合には，そのオブジェクトの状態は変更されないため，「書き込み−書き込み」や「読み込み−書き込み」などの競合が発生せず，アクセスの際の同期をとる必要がなくなる。
【００１２】
さらに，通常のメソッドにオブジェクトを渡す場合でも，不変オブジェクトであれば，オブジェクトが変更されて返されるという危険がなくなる。
【００１３】
不変オブジェクトによるプログラムの生産性向上を図る観点から，不変オブジェクトの自動抽出技術が重要になっている。
【００１４】
そこで，非特許文献２には，Ｊａｖａ（登録商標）プログラムから不変オブジェクトを抽出する手法も開示されている。この手法では，全クラスを不変と可変とに分類し，全インスタンスフィールドが不変であれば不変に分類し，可変のインスタンスフィールドが
１つでも存在すれば可変に分類し，未分類のクラスを可変に分類するものである。
【非特許文献１】Brian Goetz, ”Java theory and practice: To mutate or not to mutate?”, <http://www-128.ibm.com/developerworks/java/library/j-jtp02183.html>, ２００２年２月１８日
【非特許文献２】S. Porat, et. al., “Automatic Detection of Immutable Fields in Java”, Proceedings of CASCON 2000, page 10, Canada, ２０００年
【発明の開示】
【発明が解決しようとする課題】
【００１５】
上記非特許文献２の処理手法では，処理の速度性能が良くないうえ，循環的参照構造を持つクラス群を抽出することができない場合があるという問題があった。
【００１６】
循環的参照構造を持つクラス群は，クラスの定義に必要な情報を相互あるいは循環的に参照しあうクラス群であり，実際は不変クラスであるにもかかわらず，従来手法では抽出されないクラスの一例である。
【００１７】
本発明は，上記課題に鑑みてなされたものであり，クラス構造が静的に定まっているオブジェクト指向プログラムから，プログラムを実行させることなく高速かつ高精度で不変オブジェクトを抽出する処理技術を提供することを目的とする。
【課題を解決するための手段】
【００１８】
本発明では，クラスの種類として，不変物，可変物および中立物の３つを設ける。さらに，不変物に分類される条件を以下のように設定する。
【００１９】
不変物条件１：クラスのフィールド全てが，代入禁止かつ型が不変物クラスである。
【００２０】
不変物条件２：クラスの祖先クラス全てが，不変物または中立物に分類されている。
【００２１】
不変物条件３：クラスの子孫クラス全てが，不変物に分類されている。
【００２２】
また，中立物に分類される条件は，不変物条件１，２とする。
【００２３】
対象プログラムの全クラスから，解析処理結果の親子情報とフィールド情報とを用いて，上記の不変物条件１〜３に合わないクラスを記録していき，初期種類のまま残っているクラスを不変物に分類されるクラスとして抽出する。
【００２４】
本発明にかかるプログラムは，１）処理対象とするオブジェクト指向プログラムを入力として受け付けるプログラム入力処理と，２）前記入力されたオブジェクト指向プログラムを構文解析し，当該オブジェクト指向プログラムの全クラスについて，クラス間の親子情報およびフィールド情報を取得するクラス情報取得処理と，３）クラスの種類として，未分類，不変物，可変物および中立物を設け，前記オブジェクト指向プログラムから解析された全クラスを未分類に分類する初期分類処理と，４）前記フィールド情報をもとに，前記未分類に分類されているクラスが可変フィールドを持つかを判定し，前記未分類に分類されているクラスが可変フィールドを持つ場合に，当該クラスの種類を可変物に変更する第１の分類変更処理と，５）前記種類が可変物に分類されているクラスについて，前記親子情報をもとに，当該クラスの祖先であって種類が可変物ではないクラスを特定し，当該特定したクラスの種類を中立物に変更する第２の分類変更処理と，
前記種類が可変物に分類されているクラスについて，前記親子情報をもとに，当該クラスの子孫クラスの種類を可変物に変更する第３の分類変更処理と，６）前記種類が中立物に分類されているクラスについて，前記親子情報をもとに，当該クラスの祖先であって種類が可変物ではないクラスを特定し，当該特定したクラスの種類を中立物に変更する第４の分類変更処理と，７）前記第１の分類変更処理，前記第２の分類変更処理，前記第３の分類変更処理および前記第４の分類変更処理の処理後に，前記全クラスから未分類に分類されているクラスを取り出し，当該取り出したクラスの種類を不変物に変更する不変物抽出処理と，８）前記不変物に分類されたクラスに関する情報を，不変物抽出情報として出力する不変物情報出力処理とを，コンピュータに実行させるためのものである。
【００２５】
前記コンピュータは，以下のように動作する。
【００２６】
まず，処理対象とするオブジェクト指向プログラムを入力として受け付け，入力されたオブジェクト指向プログラムを構文解析し，当該オブジェクト指向プログラムの全クラスについて，クラス間の親子情報およびフィールド情報を取得する。そして，クラスの種類として，未分類，不変物，可変物および中立物を設け，前記オブジェクト指向プログラムから解析された全クラスを未分類に分類する。
【００２７】
次に，フィールド情報をもとに，未分類に分類されているクラスが可変フィールドを持つかを判定し，未分類に分類されているクラスが可変フィールドを持つ場合に，当該クラスの種類を可変物に変更する。さらに，種類が可変物に分類されているクラスについて，親子情報をもとに，当該クラスの祖先であって種類が可変物ではないクラスを特定し，当該特定したクラスの種類を中立物に変更する。さらに，種類が可変物に分類されているクラスについて，親子情報をもとに，当該クラスの子孫クラスの種類を可変物に変更する。次に，種類が中立物に分類されているクラスについて，前記親子情報をもとに，当該クラスの祖先であって種類が可変物ではないクラスを特定し，当該特定したクラスの種類を中立物に変更する。
【００２８】
これらの処理後に，全クラスから依然未分類に分類されているクラスを取り出し，当該取り出したクラスの種類を不変物に変更し，不変物に分類されたクラスに関する情報を，不変物抽出情報として出力する。
【００２９】
このように，本発明では，不変物および可変物の他に中立物という種類を設定することによって，不変物となるクラスを誤りなく抽出することができる。
【００３０】
また，従来手法であれば，可変物として分類されることが多い循環的参照構造を持つクラス群も，不変物として抽出することができる。
【００３１】
さらに，本発明にかかるプログラムは，９）不変物に分類するクラスを示す不変物指定情報を入力として受け付ける不変物指定情報入力処理と，１０）前記第１の分類変更処理，前記第２の分類変更処理，前記第３の分類変更処理および前記第４の分類変更処理のいずれかの処理において，種類を可変物または中立物へ変更するクラスが，前記不変物指定情報で指定されたクラスである場合に，当該クラスを不正不変物として出力する不正不変物出力処理とを，前記コンピュータに実行させるためのものである。
【００３２】
必要であれば，不変物を人手によって指定できるようにする。通常，あるクラスが不変物か否かは，そのクラスが参照している他のクラスが不変物であるかに依存している。したがって，初期条件として，不変物であるクラスが指定されることによって，当該指定をもとにより多くの不変物を抽出することが可能となる。
【００３３】
また，人手による不変物の指定が矛盾する場合に，矛盾が生じているクラスに関する情報を不正不変物として出力することができる。
【発明の効果】
【００３４】
本発明によれば，オブジェクト指向プログラムを実際に実行させることなく，静的解析処理の結果を用いて，不変オブジェクトを，高速かつ誤りなく抽出することが可能となる。
【００３５】
よって，本発明によって出力された不変物抽出情報を用いて，例えば「クラスｘｘは不変クラスとして実装する」などの仕様どおりに，プログラムが実装されているかを検証することができる。
【００３６】
また，ある種のＡＰＩでは実引数として不変インスタンスを要求するものがあるが，このような場合の確認を行うことができる。
【００３７】
また，不変物インスタンスには手続き呼び出しでの副作用がないため，高度なプログラム解析における参考情報として利用することができる。
【発明を実施するための最良の形態】
【００３８】
図１に，本発明の実施の最良の形態における構成例を示す。
【００３９】
本発明にかかる不変物抽出装置１は，抽出対象プログラム２および不変物指定情報３を入力とし，抽出不変物情報４または不正不変物指定情報５を出力とする。
【００４０】
抽出対象プログラム２は，不変物抽出の対象である実行準備可能な任意のオブジェクト指向プログラムである。
【００４１】
本形態では，抽出対象プログラム２は，Ｊａｖａ（登録商標）プログラムとし，プログラムで使用される可能性がある全クラスを読み込むことが可能であり，各クラスの親子関係および各クラスのフィールドが静的に決定しており（動的に変更できない），フィールドにfinal制約（代入を一度しか許容しない制約）を課すことが可能なものとする。
【００４２】
不変物指定情報３は，必要に応じて入力される，不変物として指定されるクラスを示す情報である。
【００４３】
抽出不変物情報４は，抽出対象プログラム２から抽出された，不変物に分類されたクラスの識別子群を含む情報である。
【００４４】
不正不変物指定情報５は，不変物指定情報３によって不正であることが判明した，不正不変物として判定されたクラスの識別子を含む情報である。
【００４５】
不変物抽出装置１は，ＣＰＵおよびメモリからなるコンピュータであり，ソフトウェアプログラムなどによって構成される，プログラム入力受付部１０，不変物指定入力受付部１１，プログラム構文解析部１２，不変物抽出部１３，および結果出力部１４を備える。
【００４６】
プログラム入力受付部１０は，抽出対象プログラム２としてＪａｖａ（登録商標）クラスファイル群を受け付ける処理部である。
【００４７】
不変物指定入力受付部１１は，必要があれば，不変物として指定されたクラスを示す不変物指定情報３を受け付ける処理部である。
【００４８】
プログラム構文解析部１２は，抽出対象プログラム２の既知の解析処理を実行する処理部であり，初期種類生成部１２１，親子情報生成部１２２，フィールド情報生成部１２３を備える。
【００４９】
プログラム構文解析部１２は，入力された抽出対象プログラム２（クラスファイル群）に既知の構文解析処理を行い，クラス情報を生成する処理部である。
【００５０】
初期種類生成部１２１は，抽出対象プログラム２のクラスについて初期の分類種類として「未分類」を設定する処理部である。不変物指定入力受付部１１によって不変物指定情報３が入力された場合には，不変物指定情報３をもとに，該当するクラスの初期種類を「不変物」とする。
【００５１】
親子情報生成部１２２は，抽出対象プログラム２の解析処理の結果から，各クラスの祖先クラスおよび子孫クラスを示す親子情報を利用可能にする処理部である。
【００５２】
フィールド情報生成部１２３は，抽出対象プログラム２の解析処理の結果から，フィールド情報を利用可能にする処理部である。フィールド情報には，代入制約，配列の不変性などが含まれる。
【００５３】
不変物抽出部１３は，初期種類，親子情報，フィールド情報をもとに，抽出対象プログラム２中の各クラスを，不変物か否かに分類する処理部である。また，クラスの初期種類に不正がないかを判定し，初期種類が不正であった場合には対応する不正物指定を，不正な指定として抽出する。
【００５４】
結果出力部１４は，不変物抽出部１３によって抽出された不変物であるクラスを示す抽出不変物情報４または，不変物指定が不正であるクラスを示す不正不変物指定情報５を出力する処理部である。
【００５５】
図２および図３を用いて，不変物抽出装置１の処理の流れを説明する。
【００５６】
ステップＳ１：  不変物抽出装置１のプログラム入力受付部１０は，抽出対象プログラム２としてＪａｖａ（登録商標）クラスファイル群を受け付ける。
【００５７】
ステップＳ２：  不変物指定入力受付部１１は，不変物指定情報３として，クラスを一意に特定する名前である完全限定クラス名群を受け付ける。不変物指定情報３の入力は任意であり，空集合を受け付けるようにしてもよい。
【００５８】
ステップＳ３：  プログラム構文解析部１２は，既知の構文解析処理（例えば，ＪａｋａｒｔａＢＣＥＬ（Byte Code Engineering Library））を使用して，抽出対象プログラム２（クラスファイル群）のクラス情報を生成する。
【００５９】
ステップＳ４：  初期種類生成部１２１は，抽出対象プログラム２の構文解析されたクラス群のすべてについて，完全限定クラス名をキーとし，分類先の種類の「未分類」を値とするハッシュ表（種類ハッシュ表）を作成する。さらに，抽象対象プログラム２の言語仕様において不変物とされているクラスの値を「不変物」とする。例えば，Ｊａｖａ（登録商標）ではStringなどが該当する。また，不変物指定情報３が入力されていれば，不変物指定情報３の完全限定クラス名群に指定されたクラスの値を「不変物」とする。
【００６０】
ステップＳ５：  親子情報生成部１２２は，抽象対象プログラム２の構文解析されたクラス群すべてについて親子情報を生成する。具体的には，ＢＣＥＬのJavaClass.getInterfaces ( )およびJavaClass.getSuperClass ( )などの手続きを用いる。クラスの親子関係の組ごとに親情報と子情報とを作成する。
【００６１】
親情報は，完全限定クラス名をキーとし，その親クラスの完全限定クラス名を値とするハッシュ表（親情報ハッシュ表）である。また，子情報は，完全限定クラス名をキーとし，その子クラスの完全限定クラス名を値とするハッシュ表（子情報ハッシュ表）である。
【００６２】
ステップＳ６：  フィールド情報生成部１２３は，抽出対象プログラム２の構文解析されたクラス群すべてについてフィールド情報を生成する。
【００６３】
フィールド情報は，完全限定クラス名をキーとし，単位フィールド情報を値とするハッシュ表（フィールドハッシュ表）である。
【００６４】
単位フィールド情報は，そのフィールドの型である完全限定クラス名とそのフィールドが「明らかに可変であるか」を示す論理値との組である。単位フィールド情報を，完全限定クラス名をキーとし，「明らかに可変であるか」を示す論理値を値とするハッシュ表で表現する。
【００６５】
ここでは，final制約がなければ「明らかに可変である」に該当する。また，フィールド型が配列型であれば「明らかに可変である」に該当する。
【００６６】
一方，final制約がある基本型フィールドは，不変であるので，フィールド情報に登録しない。
【００６７】
ステップＳ７：  不変物抽出部１３は，それまでに生成された，初期種類，親子情報，フィールド情報をもとに，抽出対象プログラム２中の各クラスから「不変物」に分類されるクラスを抽出する。また，不変物指定情報３によってクラスの種類に不正がないかを判定し，種類が不正であった場合には対応する不正不変物指定を抽出する。
【００６８】
不変物抽出部１３は，抽出対象プログラム２の各クラスについて，設定された種類が変化しなくなるまで，以下の手順で種類を決定する。
【００６９】
ステップＳ７０：  可変フィールドを持つクラスについて，その種類が「未分類」であれば「可変物」に変更する。
【００７０】
ステップＳ７１：  ステップＳ７１の処理で，種類が「可変物」であるクラスについて，その親クラスまたは子クラスのうち種類が「不変物」であるクラスを不正不変物指定とする。
【００７１】
ステップＳ７２：  種類が「可変物」であるクラスの祖先クラスについて，その種類が「可変物」ではないクラスの種類を「中立物」に変更する。
【００７２】
ステップＳ７３：  種類が「可変物」であるクラスの子孫クラスの種類を「可変物」に変更する。
【００７３】
ステップＳ７４：  ステップＳ７２，Ｓ７３の処理で，種類が「可変物」であるクラスについて，その親クラスのうち種類が「不変物」であるクラスを不正不変物指定とする。
【００７４】
ステップＳ７５：  種類が「中立物」であるクラスについて，その祖先クラスのうち種類が「可変物」ではないクラスの種類を「中立物」に変更する。
【００７５】
ステップＳ７６：  ステップＳ７０〜Ｓ７５の処理後，種類が「未分類」であるクラスの種類を「不変物」に変更する。
【００７６】
ステップＳ８：  結果出力部１４は，種類が「不変物」であるクラスの完全限定クラス名群を示す抽出不変物情報４を出力する。また，不正不変物指定に該当するクラスの完全限定クラス名群を示す不正不変物指定情報５を出力する。
【００７７】
図４〜図６は，不変物抽出部１３を実現する疑似コード例を示す図である。図４〜図６は，不変物抽出部１３を示す１つの擬似コードであり，各図における「step」の番号は，前述のステップＳ７０〜Ｓ７６とほぼ対応している。
【００７８】
図４の疑似コードの第１行目に示す処理において，「Map」は，java.util.Mapでありハッシュ表に相当する。また，その引数は，それぞれ順に，初期種類（種類），親情報，子情報，フィールド情報に相当する。
【００７９】
「Set」はjava.util.Set，「HashSet」はjava.util.HashSetであり，値のないハッシュ表に相当する。
【００８０】
「LinkedList」は，java.util.LinkedListであり，データ構造キュー（ＦＩＦＯ）に相当する。
【００８１】
図６の疑似コードの第１２〜１４行目で，「フィールド情報が空集合（null）であるフィールドを持つクラスは可変フィールドを持つ」としている。これは，フィールドについては必ずしもリンクが可能ではないような抽出対象プログラム２も入力として扱うことができるようにするためである。すなわち，型（クラス）のコードがないフィールドを持つクラスを含むような抽出対象プログラム２の入力を受け付けた場合に，このようなクラスは，可変フィールドを持つクラスとして処理される。
【００８２】
図７は，図４〜図６に不変物抽出部１３で使用しているクラス種類（Kind），クラス名（ClassName），不正不変物指定（InvalidInputException）のコード例を示す図である。
【００８３】
クラスの種類を示すクラスKindは，未分類，不変物，中立物，可変物の４つの値のいずれか１つを示す列挙型である。
【００８４】
完全限定クラス名を表現するクラスClassNameは，文字列（String）を保持する型である。
【００８５】
不正不変物指定情報５を表現するクラスInvalidInputExceptionは，不正は不変物指定とされたClassNameを保持する型である。
【００８６】
なお，以上の処理を行う不変物抽出装置１としてコンピュータを機能させるためのプログラムは，コンピュータが読み取り可能な可搬媒体メモリ，半導体メモリ，ハードディスクなどの適当な記録媒体に格納することができ，これらの記録媒体に記録して提供され，または，通信インタフェースを介して種々の通信網を利用した送受信により提供される。
【図面の簡単な説明】
【００８７】
【図１】不変物抽出装置の構成例を示す図である。
【図２】不変物抽出装置の処理の流れを示す図である。
【図３】不変物抽出処理の流れを示す図である。
【図４】不変物抽出部を実現する擬似コード例（１）を示す図である。
【図５】不変物抽出部を実現する擬似コード例（２）を示す図である。
【図６】不変物抽出部を実現する擬似コード例（３）を示す図である。
【図７】不変物抽出部で使用しているクラス種類，クラス名，不正不変物指定のコード例を示す図である。
【符号の説明】
【００８８】
１  不変物抽出装置
１０  プログラム入力受付部
１１  不変物指定入力受付部
１２  プログラム構文解析部
１２１  初期種類生成部
１２２  親子情報生成部
１２３  フィールド情報生成部
１３  不変物抽出部
１４  結果出力部
２  抽出対象プログラム
３  不変物指定情報
４  抽出不変物情報
５  不正不変物指定情報
【図１】
2009129127.tif 000003
【図２】
2009129127.tif 000004
【図３】
2009129127.tif 000005
【図４】
2009129127.tif 000006
【図５】
2009129127.tif 000007
【図６】
2009129127.tif 000008
【図７】
2009129127.tif 000009