(57)【要約】【課題】可読性が向上したソースコードを生成する。【解決手段】条件抽出部１２は、複数のプログラムから呼出される被呼出プログラムのソースコードに含まれる条件分岐の所定の条件を抽出する。判定部１３は、条件抽出部１２によって抽出された所定の条件が、複数のプログラムの所定のプログラムによる、被呼出プログラムの呼出に関する条件であるか否か判定する。コード抽出部１４は、判定部１３の判定結果に基づいて、被呼出プログラムのソースコードから、所定のプログラムから呼出されたときに実行されるコードを抽出する。【選択図】図３
2015141566.tif 000002
【特許請求の範囲】
【請求項１】
複数のプログラムから呼出される被呼出プログラムのソースコードに含まれる条件分岐の所定の条件を抽出する条件抽出部と、
前記条件抽出部によって抽出された前記所定の条件が、前記複数のプログラムのうち前記被呼出プログラムを呼出した呼出プログラムに関する条件であるか否か判定する判定部と、
前記判定部の判定結果に基づいて、前記ソースコードから、前記呼出プログラムから呼出されたときに実行されるコードを抽出するコード抽出部と、
を有することを特徴とする情報処理装置。
【請求項２】
請求項１に記載の情報処理装置であって、
前記所定の条件のパターンを記憶した条件パターン記憶部をさらに有し、
前記抽出部は、前記条件パターン記憶部を参照し、前記所定の条件を抽出することを特徴とする情報処理装置。
【請求項３】
請求項２に記載の情報処理装置であって、
前記パターンは、前記複数のプログラムによる前記被呼出プログラムの呼出に関する前記所定の条件のパターンを示すことを特徴とする情報処理装置。
【請求項４】
請求項２に記載の情報処理装置であって、
前記パターンは、コンテキストスイッチ文の条件のパターンを示すことを特徴とする情報処理装置。
【請求項５】
請求項１〜４のいずれか一項に記載の情報処理装置であって、
前記呼出プログラムに関する情報を記憶した判定パラメータ記憶部をさらに有し、
前記判定部は、前記判定パラメータ記憶部を参照し、前記条件抽出部によって抽出された前記所定の条件が、前記呼出プログラムに関する条件であるか否か判定することを特徴とする情報処理装置。
【請求項６】
請求項５に記載の情報処理装置であって、
前記判定部は、前記判定パラメータ記憶部を参照し、前記抽出部によって抽出された前記条件を真または偽に変換し、
前記コード抽出部は、前記判定部の真偽の変換結果に基づいて、前記呼出プログラムから呼出されたときに実行されるコードを抽出することを特徴とする情報処理装置。
【請求項７】
請求項６に記載の情報処理装置であって、
前記判定部は、前記抽出部によって抽出された前記条件が、前記判定パラメータ記憶部に記憶されている前記呼出プログラムに関する条件である場合、前記条件を真に変換し、
前記抽出部によって抽出された前記条件が、前記判定パラメータ記憶部に記憶されている前記呼出プログラムに関する条件でない場合、前記条件を偽に変換することを特徴とする情報処理装置。
【請求項８】
請求項１〜７のいずれか一項に記載の情報処理装置であって、
前記コード抽出部によって抽出されたコードを出力する出力部をさらに有することを特徴とする情報処理装置。
【請求項９】
請求項８に記載の情報処理装置であって、
前記出力部は、前記呼出プログラムごとの抽出されたコードを出力することを特徴とする情報処理装置。
【請求項１０】
請求項８に記載の情報処理装置であって、
前記出力部から出力されるコードは、新たなプログラムコードとして用いられることを特徴とする情報処理装置。
【請求項１１】
情報処理装置のソースコード最適化方法であって、
複数のプログラムから呼出される被呼出プログラムのソースコードに含まれる条件分岐の所定の条件を抽出する条件抽出ステップと、
前記条件抽出ステップによって抽出された前記所定の条件が、前記複数のプログラムのうち前記被呼出プログラムを呼出した呼出プログラムに関する条件であるか否か判定する判定ステップと、
前記判定ステップの判定結果に基づいて、前記ソースコードから、前記呼出プログラムから呼出されたときに実行されるコードを抽出するコード抽出ステップと、
を有することを特徴とするソースコード最適化方法。
【請求項１２】
情報処理装置のプログラムであって、
複数のプログラムから呼出される被呼出プログラムのソースコードに含まれる条件分岐の所定の条件を抽出する条件抽出部と、
前記条件抽出部によって抽出された前記所定の条件が、前記複数のプログラムのうち前記被呼出プログラムを呼出した呼出プログラムに関する条件であるか否か判定する判定部と、
前記判定部の判定結果に基づいて、前記ソースコードから、前記呼出プログラムから呼出されたときに実行されるコードを抽出するコード抽出部と、
して前記情報処理装置を機能させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、ソースコード最適化方法、およびプログラムに関するものである。
【背景技術】
【０００２】
長い年月にわたってリファクタリングされていないプログラムは、例えば、度重なる機能拡張や保守による修正が積み重なり、ソースコードの複雑化および肥大化が進行する。
【０００３】
プログラムソースコードの複雑化および肥大化を進行させる要因として、「コンテキスト（文脈）スイッチ文の埋め込み」がある。これは、例えば、それぞれコンテキストが異なる複数のプログラムから呼び出される共通プログラムがある場合に、共通プログラム側の特定箇所において、「もし呼び出しコンテキストが〜だったら」などといった特定コンテキストに対する条件分岐と、特定コンテキストに対する処理とを共通プログラム内に埋め込む行為である。
【０００４】
なお、特許文献１には、ソースコード修正の際の理解を助け、リファクタリングの有効な支援を実現したリファクタリング支援装置およびプログラムが開示されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００８−１８１３１１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
コンテキストスイッチ文を含むソースコードは、可読性が低下するという問題がある。例えば、機能拡張や修正などの繰り返しによってコンテキストスイッチ文が増加すると、ソースコードは複雑化および肥大化が進行し、可読性が低下する。
【０００７】
特許文献１には、条件分岐の複雑さを判定し、判定結果をグラフ表示することでリファクタリングを支援することが開示されているのみで、可読性が向上したソースコードを生成することに関しては何ら開示されていない。
【０００８】
そこで本発明は、可読性が向上したソースコードを生成する技術を提供することを目的とする。
【課題を解決するための手段】
【０００９】
本願は、上記課題の少なくとも一部を解決する手段を複数含んでいるが、その例を挙げるならば、以下の通りである。上記課題を解決すべく、本発明に係る情報処理装置は、複数のプログラムから呼出される被呼出プログラムのソースコードに含まれる条件分岐の所定の条件を抽出する条件抽出部と、前記条件抽出部によって抽出された前記所定の条件が、前記複数のプログラムのうち前記被呼出プログラムを呼出した呼出プログラムに関する条件であるか否か判定する判定部と、前記判定部の判定結果に基づいて、前記ソースコードから、前記呼出プログラムから呼出されたときに実行されるコードを抽出するコード抽出部と、を有することを特徴とする。
【００１０】
また、上記の情報処理装置においては、前記所定の条件のパターンを記憶した条件パターン記憶部をさらに有し、前記抽出部は、前記条件パターン記憶部を参照し、前記所定の条件を抽出することを特徴とするものであってもよい。
【００１１】
また、上記の情報処理装置においては、前記パターンは、前記複数のプログラムによる前記被呼出プログラムの呼出に関する前記所定の条件のパターンを示すことを特徴とするものであってもよい。
【００１２】
また、上記の情報処理装置においては、前記パターンは、コンテキストスイッチ文の条件のパターンを示すことを特徴とするものであってもよい。
【００１３】
また、上記の情報処理装置においては、前記呼出プログラムに関する情報を記憶した判定パラメータ記憶部をさらに有し、前記判定部は、前記判定パラメータ記憶部を参照し、前記条件抽出部によって抽出された前記所定の条件が、前記呼出プログラムに関する条件であるか否か判定することを特徴とするものであってもよい。
【００１４】
また、上記の情報処理装置においては、前記判定部は、前記判定パラメータ記憶部を参照し、前記抽出部によって抽出された前記条件を真または偽に変換し、前記コード抽出部は、前記判定部の真偽の変換結果に基づいて、前記呼出プログラムから呼出されたときに実行されるコードを抽出することを特徴とするものであってもよい。
【００１５】
また、上記の情報処理装置においては、前記判定部は、前記抽出部によって抽出された前記条件が、前記判定パラメータ記憶部に記憶されている前記呼出プログラムに関する条件である場合、前記条件を真に変換し、前記抽出部によって抽出された前記条件が、前記判定パラメータ記憶部に記憶されている前記呼出プログラムに関する条件でない場合、前記条件を偽に変換することを特徴とするものであってもよい。
【００１６】
また、上記の情報処理装置においては、前記コード抽出部によって抽出されたコードを出力する出力部をさらに有することを特徴とするものであってもよい。
【００１７】
また、上記の情報処理装置においては、前記出力部は、前記呼出プログラムごとの抽出されたコードを出力することを特徴とするものであってもよい。
【００１８】
また、上記の情報処理装置においては、前記出力部から出力されるコードは、新たなプログラムコードとして用いられることを特徴とするものであってもよい。
【００１９】
また、本発明に係る情報処理装置のソースコード最適化方法は、複数のプログラムから呼出される被呼出プログラムのソースコードに含まれる条件分岐の所定の条件を抽出する条件抽出ステップと、前記条件抽出ステップによって抽出された前記所定の条件が、前記複数のプログラムのうち前記被呼出プログラムを呼出した呼出プログラムに関する条件であるか否か判定する判定ステップと、前記判定ステップの判定結果に基づいて、前記ソースコードから、前記呼出プログラムから呼出されたときに実行されるコードを抽出するコード抽出ステップと、を含むことを特徴とする。
【００２０】
また、本発明に係る情報処理装置のプログラムは、複数のプログラムから呼出される被呼出プログラムのソースコードに含まれる条件分岐の所定の条件を抽出する条件抽出部と、前記条件抽出部によって抽出された前記所定の条件が、前記複数のプログラムのうち前記被呼出プログラムを呼出した呼出プログラムに関する条件であるか否か判定する判定部と、前記判定部の判定結果に基づいて、前記ソースコードから、前記呼出プログラムから呼出されたときに実行されるコードを抽出するコード抽出部と、して前記情報処理装置を機能させることを特徴とする。
【発明の効果】
【００２１】
本発明によれば、可読性が向上したソースコードを生成することができる。
【００２２】
上記した以外の課題、構成、および効果は、以下の実施形態の説明により明らかにされる。
【図面の簡単な説明】
【００２３】
【図１】本発明の一実施形態に係る情報処理装置の概略を説明する図である。
【図２】スライシングの例を説明する図である。
【図３】情報処理装置の機能ブロックの一例を示した図である。
【図４】条件パターン記憶部１７のデータ構成例を説明する図である。
【図５】条件抽出部１２の条件の抽出を説明する図である。
【図６】判定パラメータ記憶部１８のデータ構成例を示した図である。
【図７】判定部１３の判定結果を説明する図である。
【図８】コード抽出部１４によるコード抽出を説明する図である。
【図９】情報処理装置１の動作例を示したフローチャートである。
【図１０】ソースコード記憶部１６に記憶されたソースコードの例を示した図である。
【図１１】条件抽出部１２による条件の抽出結果の例を示した図である。
【図１２】判定部１３による条件の判定結果の例を示した図である。
【図１３】コード抽出部１４によるコード抽出の結果の例を示した図である。
【図１４】コンテキストスライシングの全体処理を示したフローチャートである。
【図１５】図１４のステップＳ１１の詳細な処理を示したフローチャートである。
【図１６】ソースコードの例を示した図である。
【図１７】図１６のソースコードを抽象モデル化した図である。
【図１８】図１４のステップＳ１２の詳細な処理を示したフローチャートである。
【図１９】図１８のステップＳ３６の詳細な処理を示したフローチャートである。
【図２０】図１９のステップＳ４２，Ｓ４４の詳細な処理を示したフローチャートである。
【図２１】図２０のステップＳ５２の詳細な処理を示したフローチャートである。
【図２２】図２１のステップＳ６７の詳細な処理を示したフローチャートである。
【図２３】図２０のステップＳ５４の詳細な処理を示したフローチャートである。
【図２４】ソースファイルを最適化する関数の詳細な処理を示したフローチャートである。
【図２５】図２４のステップＳ１０２の詳細な処理を示したフローチャートである。
【図２６】図２５のステップＳ１１２の詳細な処理を示したフローチャートである。
【図２７】図２６のステップＳ１２２の詳細な処理を示したフローチャートである。
【図２８】図２７のステップＳ１３２の詳細な処理を示したフローチャートである。
【図２９】ソースファイルを出力する関数の詳細な処理を示したフローチャートである。
【図３０】図２９のステップＳ１８２の詳細な処理を示したフローチャートである。
【図３１】図３０のステップＳ１９２の詳細な処理を示したフローチャートである。
【図３２】図３１のステップＳ２０２の詳細な処理を示したフローチャートである。
【図３３】図３２のステップＳ２１２の詳細な処理を示したフローチャートである。
【図３４】情報処理装置１のハードウェア構成例を示した図である。
【発明を実施するための形態】
【００２４】
図１は、本発明の一実施形態に係る情報処理装置の概略を説明する図である。図１には、情報処理装置１と、ソースコード２と、条件パターン３と、判定パラメータ４とが示してある。
【００２５】
ソースコード２は、情報処理装置１によってリファクタリング（以下では、スライシングと呼ぶことがある）されるソースコードである。スライシングされるソースコード２は、例えば、ユーザによって、情報処理装置１に入力される。
【００２６】
条件パターン３および判定パラメータ４は、情報処理装置１が、ソースコード２をスライシングするための情報である。条件パターン３および判定パラメータ４は、例えば、ユーザによって、情報処理装置１に入力される。情報処理装置１は、条件パターン３および判定パラメータ４に基づいて、ソースコード２をスライシングする。
【００２７】
図２は、スライシングの例を説明する図である。図２に示すソースコード２ａは、拡張または修正等が行われる前のソースコードを示している。ソースコード２ａは、コンテキストが異なる複数のプログラムＰＧＡ〜ＰＧＣ（呼出側プログラム）から呼び出されて実行される共通プログラム（被呼出プログラム）である。
【００２８】
図２に示すソースコード２ａには、コンテキストスイッチ文が含まれていない。よって、ソースコード２ａは、プログラムＰＧＡ〜ＰＧＢの何れから呼び出されても、「コード群Ｘ」、「コード群Ｙ」、および「コード群Ｚ」が実行される。
【００２９】
ソースコード２は、ソースコード２ａを拡張または修正等を行った後のソースコードの例を示している。ソースコード２には、拡張または修正等によって、コンテキストスイッチ文が埋め込まれている。すなわち、ソースコード２には、「もし呼び出しコンテキストが〜だったら」などといった特定コンテキストに対する条件処理と、特定コンテキストに対する処理とが埋め込まれている。つまり、ソースコード２は、元のソースコード２ａとは異なり、呼出側のプログラムＰＧＡ〜ＰＧＣに応じて、実行されるコードが切替えられるようになっている。
【００３０】
例えば、ソースコード２は、プログラムＰＧＡから呼び出された場合、「コード群Ｘ＿Ａ」、「コード群Ｙ」、および「コード群Ｚ＿ＡＣ」が実行される。また、ソースコード２は、プログラムＰＧＢから呼び出された場合、「コード群Ｘ」、「コード群Ｙ」、および「コード群Ｙ＿Ｂ」が実行される。また、ソースコード２は、プログラムＰＧＣから呼び出された場合、「コード群Ｘ」、「コード群Ｙ」、および「コード群Ｚ＿ＡＣ」が実行される。
【００３１】
ソースコードは、拡張または修正等によって、コンテキストスイッチ文が埋め込まれると、ソースコード２に示すように複雑化および肥大化し、可読性が低下する。そこで、情報処理装置１は、ソースコード２をスライシングする。
【００３２】
例えば、情報処理装置１は、ソースコード２を、コンテキストごとに（プログラムＰＧＡ〜ＰＧＣごとに）実行されるコードにスライス（分離）する。より具体的には、ソースコード２ｂに示すように、プログラムＰＧＡから呼び出された場合に実行されるコードのみを、ソースコード２から抽出して出力する。
【００３３】
このように、情報処理装置１は、複雑化および肥大化したソースコード２をスライスする。これにより、ソースコード２の可読性を向上することができる。
【００３４】
図３は、情報処理装置の機能ブロックの一例を示した図である。図３に示すように、情報処理装置１は、入力部１１と、条件抽出部１２と、判定部１３と、コード抽出部１４と、出力部１５と、ソースコード記憶部１６と、条件パターン記憶部１７と、判定パラメータ記憶部１８とを有している。
【００３５】
入力部１１は、ユーザから、ソースコード２、条件パターン３、および判定パラメータ４を受付ける。入力部１１は、ユーザから受付けたソースコード２をソースコード記憶部１６に記憶し、条件パターン３を条件パターン記憶部１７に記憶し、判定パラメータを判定パラメータ記憶部１８に記憶する。
【００３６】
条件抽出部１２は、ソースコード記憶部１６に記憶されたソースコード２に含まれる、実行するコードを切り替える所定の条件（条件分岐の条件）を抽出する。条件抽出部１２は、条件パターン記憶部１７を参照して、所定のパターンに合致する条件（条件句）を抽出する。条件分岐には、例えば、ｉｆ文やｓｗｉｔｃｈ文などがある。
【００３７】
図４は、条件パターン記憶部１７のデータ構成例を説明する図である。条件パターン記憶部１７には、パターン番号１７ａと、条件パターン１７ｂとが記憶される。
【００３８】
パターン番号１７ａは、条件パターン１７ｂを識別する番号である。
【００３９】
条件パターン１７ｂは、呼出側のプログラムＰＧＡ〜ＰＧＢによる、ソースコード２のプログラムの呼出に関する条件分岐の条件のパターンを示す。すなわち、条件パターン１７ｂは、コンテキストスイッチ文の条件のパターンを示す。
【００４０】
条件パターン１７ｂは、例えば、正規表現で与えられる。例えば、条件パターン１７ｂに示す「〜」の部分は、任意の内容でよいことを示している。
【００４１】
図５は、条件抽出部１２の条件の抽出を説明する図である。図５には、スライシングされるソースコード２が示してある。図５に示すソースコード２は、説明のため、図２に示したソースコード２とコード内容が異なっている。
【００４２】
図４のパターン番号「１」には、「ｃｔｘ１文字列が〜だったら」という条件パターン１７ｂが記憶されている。条件抽出部１２は、図５のソースコード２に、「ｃｔｘ１文字列が〜だったら」（〜の部分は、任意の内容）というパターンの条件（条件のコード）が含まれている場合、そのパターンに合致する条件を全て抽出する。
【００４３】
例えば、図５のソースコード２には、「ｃｔｘ１文字列が〜だったら」という条件は、下線２１ａ，２１ｂに含まれている。従って、条件抽出部１２は、ソースコード２の例の場合、下線２１ａ，２１ｂの条件を抽出する。
【００４４】
また、図４のパターン番号「２」には、「ｃｔｘ２整数が〜だったら」という条件パターン１７ｂが記憶されている。条件抽出部１２は、図５のソースコード２に、「ｃｔｘ２整数が〜だったら」（〜の部分は、任意の内容）というパターンの条件が含まれている場合、そのパターンに合致する条件を全て抽出する。
【００４５】
例えば、図５のソースコード２には、「ｃｔｘ２整数が〜だったら」という条件は、下線２１ｃに含まれている。従って、条件抽出部１２は、ソースコード２の例の場合、下線２１ｃの条件を抽出する。
【００４６】
また、図４のパターン番号「３」には、「ｃｔｘ３文字列が〜だったら」という条件パターン１７ｂが記憶されている。条件抽出部１２は、図５のソースコード２に、「ｃｔｘ３文字列が〜だったら」（〜の部分は、任意の内容）というパターンの条件が含まれている場合、そのパターンに合致する条件を全て抽出する。
【００４７】
例えば、図５のソースコード２には、「ｃｔｘ３文字列が〜だったら」という条件は、下線２１ｄ，２１ｅに含まれている。従って、条件抽出部１２は、ソースコード２の例の場合、下線２１ｄ，２１ｅの条件を抽出する。
【００４８】
なお、条件パターン１７ｂは、プログラム関数で与えてもよい。例えば、ソースコード２内の「ｃｔｘ１文字列が〜だったら」というパターンの条件を抽出するようなプログラムを関数として与えてもよい。
【００４９】
図３の説明に戻る。判定部１３は、条件抽出部１２によって抽出された条件が、判定パラメータ記憶部１８に記憶されているコンテキスト（呼出側のプログラムＰＧＡ〜ＰＧＣ）に関する条件であるか否か判定する。判定部１３は、条件抽出部１２によって抽出された条件が、判定パラメータ記憶部１８に記憶されているコンテキストに関する条件である場合、抽出された条件を「真」（「ｔｒｕｅ」または「１」）と判定する。判定部１３は、条件抽出部１２によって抽出された条件が、判定パラメータ記憶部１８に記憶されている、コンテキストに関する条件でない場合、抽出された条件を「偽」（「ｆａｌｓｅ」または「０」）と判定する。
【００５０】
図６は、判定パラメータ記憶部１８のデータ構成例を示した図である。判定パラメータ記憶部１８には、コンテキストに関する情報が記憶される。図６には、コンテキストがプログラムＰＧＡの場合の、判定パラメータが示してある。
【００５１】
判定パラメータは、条件抽出部によって抽出される条件に対応付けて記憶される。例えば、判定パラメータは、図６の「ｃｔｘ１＝ＰＧＡ」に示すように記憶される。これにより、判定部１３は、判定パラメータ記憶部１８を参照することにより、条件抽出部１２によって抽出された条件（コンテキストスイッチ文の条件）が、例えば、プログラムＰＧＡに関する条件であるか否か判定することができる。
【００５２】
なお、ソースコード２からプログラムＰＧＢのコードをスライシングする場合は、例えば、「ｃｔｘ１＝ＰＧＢ」等とすればよい。また、ソースコード２からプログラムＰＧＣのコードをスライシングする場合は、例えば、「ｃｔｘ１＝ＰＧＣ」等とすればよい。
【００５３】
図７は、判定部１３の判定結果を説明する図である。図７の上部には、図５に示したソースコード２が示してある。図７の下部には、判定部１３による判定結果が示してある。
【００５４】
図５で説明したように、条件抽出部１２は、条件パターン記憶部１７を参照して、ソースコード２から、コンテキストの呼出に関する条件分岐の条件を抽出する（図７の下線２１ａ〜２１ｅ）。
【００５５】
判定部１３は、条件抽出部１２によって抽出された条件が、判定パラメータ記憶部１８に記憶されている、ソースコード２のプログラムの呼出に関する条件である場合、抽出された条件を「ｔｒｕｅ」に変換する。判定部１３は、条件抽出部１２によって抽出された条件が、判定パラメータ記憶部１８に記憶されている、ソースコード２のプログラムの呼出に関する条件でない場合、抽出された条件を「ｆａｌｓｅ」に変換する。
【００５６】
例えば、図６に示す判定パラメータの例の場合、判定部１３は、図７に示す下線２１ａの条件を、下線２２ａに示すように、「ｔｒｕｅ」に変換する。判定部１３は、下線２１ｃの条件を、下線２２ｂに示すように、「ｔｒｕｅ」に変換する。判定部１３は、下線２１ｄの条件を、下線２２ｃに示すように、「ｔｒｕｅ」に変換する。判定部１３は、下線２１ｂの条件を、下線２２ｄに示すように、「ｆａｌｓｅ」に変換する。判定部１３は、下線２１ｅの条件を、下線２２ｅに示すように、「ｆａｌｓｅ」に変換する。
【００５７】
なお、図６の例に示す判定パラメータは、プログラムＰＧＡに関するパラメータである。従って、図７の例では、プログラムＰＧＡに関するコンテキストスイッチ文の条件が、「ｔｒｕｅ」に変換され、プログラムＰＧＡ以外に関するコンテキストスイッチ文の条件は、「ｆａｌｓｅ」に変換されている。
【００５８】
図３の説明に戻る。コード抽出部１４は、判定部１３の判定結果に基づいて、ソースコード２のコンテキストスイッチ文のコードから、呼出側のプログラムＰＧＡ〜ＰＧＣによって呼び出されたときに実行されるコードを抽出する。
【００５９】
図８は、コード抽出部１４によるコード抽出を説明する図である。図８の上部には、図７に示した判定部１３による判定結果が示してある。図８の下部には、コード抽出部１４によって抽出されたコードが示してある。
【００６０】
コード抽出部１４は、判定部１３の判定結果に基づいて、実行されることが自明なコードを抽出する。例えば、下線２２ａ，２２ｂの条件は、「ｔｒｕｅ」であり、下線２２ａ，２２ｂの条件分岐のコードは、実行されることが自明である。従って、コード抽出部１４は、コード２３ａ，２３ｂに示すように、下線２２ａ，２２ｂの条件を有する条件分岐のコードを抽出する。
【００６１】
下線２２ｃの条件は、「ｔｒｕｅ」であり、「ｔｒｕｅ  ＆＆  ｖａｌｕｅ１＞０」は、「ｖａｌｕｅ１＞０」の条件と等価になる。従って、コード抽出部１４は、下線２２ｃの条件を有する条件分岐のコードを、コード２３ｃに示すように抽出する。
【００６２】
下線２２ｄ，２２ｅの条件は、「ｆａｌｓｅ」であり、「ｆａｌｓｅ  ＆＆  ｖａｌｕｅ１＞０  ｜｜  ｆａｌｓｅ  ＆＆  ｖａｌｕｅ２＞０」は、条件「０」と等価になる。条件「０」の条件分岐のコードは、実行されないことが自明なので、コード抽出部１４は、下線２２ｄ，２２ｅの条件を有する条件分岐のコードを抽出しない。
【００６３】
なお、図８のソースコード２では、プログラムＰＧＡによって呼び出されたときに実行されるコードのみが抽出されている。
【００６４】
図３の説明に戻る。出力部１５は、コード抽出部１４によって抽出されたコードを出力する。出力部１５は、例えば、コード抽出部１４によって抽出されたコードを、テキストデータで出力する。
【００６５】
図９は、情報処理装置１の動作例を示したフローチャートである。図９に示すフローチャートは、例えば、ユーザがソースコード２、条件パターン３、および判定パラメータ４を情報処理装置１に入力したときに実行される。
【００６６】
まず、入力部１１は、ユーザが入力したソースコード２、条件パターン３、および判定パラメータ４を受付ける（ステップＳ１）。入力部１１は、ユーザから受付けたソースコード２をソースコード記憶部１６に記憶し、条件パターン３を条件パターン記憶部１７に記憶し、判定パラメータを判定パラメータ記憶部１８に記憶する。
【００６７】
図１０は、ソースコード記憶部１６に記憶されたソースコードの例を示した図である。ソースコード記憶部１６には、例えば、図１０に示すようなソースコード３１が記憶される。
【００６８】
図９の説明に戻る。次に、条件抽出部１２は、条件パターン記憶部１７を参照して、ソースコード記憶部１６に記憶されたソースコード３１の、呼出側プログラムからの呼出に関する条件分岐の条件（コンテキストスイッチ文の条件）を抽出する（ステップＳ２）。
【００６９】
図１１は、条件抽出部１２による条件の抽出結果の例を示した図である。図１１には、図１０に示したソースコード３１が示してある。条件抽出部１２は、条件パターン記憶部１７を参照し、コンテキストスイッチ文の条件を、下線３２ａ〜３２ｅのように抽出したとする。
【００７０】
図９の説明に戻る。次に、判定部１３は、判定パラメータ記憶部１８を参照し、ステップＳ２にて抽出された条件が、判定パラメータ記憶部１８に記憶されている呼出側のプログラムに関する条件であるか否か判定する（ステップＳ３）。判定部１３は、ステップＳ２にて抽出された条件が、判定パラメータ記憶部１８に記憶されている呼出側のプログラムに関する条件である場合、ステップＳ４の処理へ移行する。判定部１３は、ステップＳ２において抽出された条件が、判定パラメータ記憶部１８に記憶されている呼出側のプログラムに関する条件でない場合、ステップＳ５の処理へ移行する。
【００７１】
判定部１３は、ステップＳ３にて抽出された条件が、判定パラメータ記憶部１８に記憶されている呼出側のプログラムに関する条件であると判定した場合（ステップＳ３にて「ｙｅｓ」の場合）、抽出された条件を「ｔｒｕｅ」に変換する（ステップＳ４）。
【００７２】
判定部１３は、ステップＳ３にて抽出された条件が、判定パラメータ記憶部１８に記憶されている呼出側のプログラムに関する条件でないと判定した場合（ステップＳ３にて「Ｎｏ」の場合）、抽出された条件を「ｆａｌｓｅ」に変換する（ステップＳ５）。
【００７３】
判定部１３は、ステップＳ２にて抽出された全ての条件において、ステップＳ３の判定処理を行ったか否か判定する（ステップＳ６）。判定部１３は、ステップＳ２にて抽出された全ての条件において、ステップＳ３の判定処理を行った場合、ステップＳ７の処理へ移行する。判定部１３は、ステップＳ２にて抽出された全ての条件において、ステップＳ３の判定処理を行っていない場合、ステップＳ３の処理へ移行する。
【００７４】
図１２は、判定部１３による条件の判定結果の例を示した図である。図１２には、図１０に示したソースコード３１が示してある。判定部１３は、判定パラメータ記憶部１８を参照し、条件抽出部１２によって抽出された図１１に示す下線３２ａ〜３２ｅの条件が、判定パラメータ記憶部１８に記憶されている呼出側プログラムに関する条件であるか否か、下線３３ａ〜３３ｅのように判定したとする。
【００７５】
図９の説明に戻る。次に、コード抽出部１４は、ソースコード３１から、判定パラメータ記憶部１８に記憶されている呼出側プログラムから呼び出されたときに実行されるコードを抽出する（ステップＳ７）。
【００７６】
図１３は、コード抽出部１４によるコード抽出の結果の例を示した図である。図１３には、コード抽出部１４によって抽出されたソースコード３４が示してある。コード抽出部１４は、実行されることが自明な条件分岐のコードを抽出する。従って、図１２に示すソースコード３１は、図１３のソースコード３４に示すように抽出される。
【００７７】
図９の説明に戻る。次に、出力部１５は、コード抽出部１４によって抽出されたコードを、例えば、テキストデータで出力する（ステップＳ８）。出力されたテキストデータは、例えば、情報処理装置１のディスプレイに表示され、または、ファイルとして出力される。
【００７８】
上述したフロー図の各処理単位は、情報処理装置１の処理を理解容易にするために、主な処理内容に応じて分割したものである。処理単位の分割の仕方や名称によって、本願発明が制限されることはない。例えば、上記フローチャートでは、判定部１３は、条件抽出部１２によって全てのコンテキストスイッチ文の条件が抽出された後、抽出された条件が、判定パラメータ記憶部１８に記憶されている呼出側のプログラムに関する条件であるか否か判定した。これに対し、判定部１３は、条件抽出部１２によって１つの条件が抽出されたときに、その条件が、判定パラメータ記憶部１８に記憶されている呼出側のプログラムに関する条件であるか否か判定するようにしてもよい。また、情報処理装置１の処理は、処理内容に応じて、さらに多くの処理単位に分割することもできる。また、１つの処理単位がさらに多くの処理を含むように分割することもできる。
【００７９】
情報処理装置１の別の詳細な動作例を説明する。
【００８０】
図１４は、コンテキストスライシングの全体処理を示したフローチャートである。図１４に示すフローチャートは、例えば、ユーザがソースコード２、条件パターン３、および判定パラメータ４を情報処理装置１に入力したときに実行される。
【００８１】
まず、情報処理装置１は、初期処理を行う（ステップＳ１１）。例えば、入力部１１は、スライシングの対象となるソースコード、条件パターン、および判定パラメータをユーザから受付ける。
【００８２】
次に、情報処理装置１は、ソースコードのモデリングを行う（ステップＳ１２）。例えば、条件抽出部１２は、ソースコードの字句構文解析を行い、ソースコードをコードブロック、条件分岐、および条件句に分解してそれぞれの開始位置および終了位置を行番号および列番号で取得する。
【００８３】
次に、情報処理装置１は、コンテキストスイッチ文を最適化する（ステップＳ１３）。例えば、判定部１３は、条件句に判定パラメータによる判定を実施し、コード抽出部１４は、条件分岐文を最適化する。なお、ここでの最適化とは、呼出側プログラムによって呼び出された場合に実行されるコードを被呼出側プログラムのソースコードから抽出し、ソースコードの可読性を向上することを言う。
【００８４】
次に、情報処理装置１は、最適化されたソースコードを出力する（ステップＳ１４）。例えば、出力部１５は、コード抽出部１４によって条件分岐文が最適化されたソースコードを出力する。
【００８５】
図１５は、図１４のステップＳ１１の詳細な処理を示したフローチャートである。
【００８６】
まず、入力部１１は、ユーザから、条件パターンを受付ける（ステップＳ２１）。入力部１１は、受付けた条件パターンを、条件パターン記憶部１７に記憶する。
【００８７】
次に、入力部１１は、ユーザから、判定パラメータを受付ける（ステップＳ２２）。入力部１１は、受付けた判定パラメータを、判定パラメータ記憶部１８に記憶する。
【００８８】
次に、入力部１１は、ユーザから、ソースコードを受付ける（ステップＳ２３）。入力部１１は、受付けたソースコードを、ソースコード記憶部１６に記憶する。
【００８９】
図１６は、ソースコードの例を示した図である。図１６に示すように、ソースコードは、例えば、コードブロックと、ＩＦ節と、ＩＦ句と、条件節と、条件句と、無関係ブロックとにモデリングすることができる。無関係ブロックとは、ＩＦ節、ＩＦ句、条件節、および条件句以外のコードブロックをいう。
【００９０】
図１７は、図１６のソースコードを抽象モデル化した図である。図１６のソースコードをクラス図で抽象化すると図１７に示すようになる。なお、全てのオブジェクトは、コードの開始行数と開始列数とを有し、また、終了行数と終了列数とを有している。
【００９１】
図１８は、図１４のステップＳ１２の詳細な処理を示したフローチャートである。
【００９２】
まず、条件抽出部１２は、対象ソースコードの字句解析を行い、トークンリストを生成する（ステップＳ３１）。条件抽出部１２は、例えば、ＪＡＶＡ（登録商標）の標準ＡＰＩ（Application Programming Interface）であるｊａｖａ．ｉｏ．ＳｔｒｅａｍＴｏｋｅｎｉｚｅｒを用いて、トークンリストを生成する。
【００９３】
次に、条件抽出部１２は、ソースファイルオブジェクトを生成する（ステップＳ３２）。
【００９４】
次に、条件抽出部１２は、字句解析された対象ソースコードを読み込み、次のトークンがあるか否か判定する（ステップＳ３３）。条件抽出部１２は、次のトークンがあれば、ステップＳ３４の処理へ移行する。条件抽出部１２は、次のトークンがなければ、ステップＳ３８の処理へ移行する。
【００９５】
条件抽出部１２は、ステップＳ３３にて、次のトークンがあると判定した場合、そのトークンが‘ＩＦ’であるか否か判定する（ステップＳ３４）。条件抽出部１２は、トークンが‘ＩＦ’である場合、ステップＳ３５の処理へ移行する。条件抽出部１２は、トークンが‘ＩＦ’でない場合、ステップＳ３３の処理へ移行する。なお、‘ＩＦ’は、‘ｉｆ’であってもよい。以下では、‘ＩＦ’には、‘ｉｆ’も含まれるとする。
【００９６】
条件抽出部１２は、‘ＩＦ’までの行を無関係ブロックとし、ソースファイルオブジェクトに追加する（ステップＳ３５）。
【００９７】
次に、条件抽出部１２は、ＩＦ節を抽出する関数を呼び出し、ＩＦ節を抽出する（ステップＳ３６）。
【００９８】
次に、条件抽出部１２は、ソースファイルオブジェクトに、抽出したＩＦ節を追加する（ステップＳ３７）。条件抽出部１２は、ステップＳ３３の処理へ移行する。
【００９９】
条件抽出部１２は、ステップＳ３３にて、次のトークンがないと判定した場合、最後の行までを無関係ブロックとし、ソースファイルオブジェクトに追加する（ステップＳ３８）。
【０１００】
図１９は、図１８のステップＳ３６（ＩＦ節を抽出する関数）の詳細な処理を示したフローチャートである。
【０１０１】
まず、条件抽出部１２は、ＩＦ節オブジェクトを生成する（ステップＳ４１）。
【０１０２】
次に、条件抽出部１２は、ＩＦ句を抽出する関数を呼び出し、ＩＦ句を抽出する（ステップＳ４２）。
【０１０３】
次に、条件抽出部１２は、字句解析されたソースコードの次のトークンが‘ＥＬＳＥ’であるか否か判定する（ステップＳ４３）。条件抽出部１２は、字句解析されたソースコードの次のトークンが‘ＥＬＳＥ’である場合、ステップＳ４４の処理へ移行する。条件抽出部１２は、字句解析されたソースコードの次のトークンが‘ＥＬＳＥ’でない場合、ステップＳ４６の処理へ移行する。なお、‘ＥＬＳＥ’は、‘ｅｌｓｅ’であってもよい。以下では、‘ＥＬＳＥ’には、‘ｅｌｓｅ’も含まれるとする。
【０１０４】
条件抽出部１２は、ステップＳ４３にて、字句解析されたソースコードの次のトークンが‘ＥＬＳＥ’であると判定した場合、ＩＦ句を抽出する関数を呼び出し、ＥＬＳＥのコードブロック内のＩＦ句を抽出する（ステップＳ４４）。
【０１０５】
次に、条件抽出部１２は、ＩＦ節オブジェクトに、抽出したＩＦ句を追加する（ステップＳ４５）。
【０１０６】
条件抽出部１２は、ステップＳ４３にて、字句解析されたソースコードの次のトークンが‘ＥＬＳＥ’でないと判定した場合、ＩＦ節オブジェクトに、抽出したＩＦ句を追加する（ステップＳ４６）。
【０１０７】
図２０は、図１９のステップＳ４２，Ｓ４４（ＩＦ句を抽出する関数）の詳細な処理を示したフローチャートである。
【０１０８】
まず、条件抽出部１２は、ＩＦ句オブジェクトを生成する（ステップＳ５１）。
【０１０９】
次に、条件抽出部１２は、条件節を抽出する関数を呼び出す（ステップＳ５２）。
【０１１０】
次に、条件抽出部１２は、ＩＦ句オブジェクトに、抽出した条件節を追加する（ステップＳ５３）。
【０１１１】
次に、条件抽出部１２は、コードブロックを抽出する関数を呼び出す（ステップＳ５４）。なお、ＩＦ句は、条件節と、条件節が合致したときに実行されるコードブロックとによって構成されるので、条件抽出部１２は、コードブロックを抽出する関数を呼び出す。また、コードブロックの中に、条件節が含まれる場合がある。その場合、コードブロックを抽出する関数内において、再帰的に条件節を抽出する関数を呼び出す。
【０１１２】
次に、条件抽出部１２は、ＩＦ句オブジェクトに、抽出したコードブロックを追加する（ステップＳ５５）。
【０１１３】
図２１は、図２０のステップＳ５２（条件節を抽出する関数）の詳細な処理を示したフローチャートである。
【０１１４】
まず、条件抽出部１２は、条件節オブジェクトを生成する（ステップＳ６１）。
【０１１５】
次に、条件抽出部１２は、次のトークンが「（」であるか、「論理演算子」であるか、「）」であるか判定する（ステップＳ６２）。条件抽出部１２は、次のトークンが「（」である場合、ステップＳ６３の処理へ移行する。条件抽出部１２は、次のトークンが「論理演算子」である場合、ステップＳ６５の処理へ移行する。条件抽出部１２は、次のトークンが「）」である場合、ステップＳ６６の処理へ移行する。
【０１１６】
条件抽出部１２は、ステップＳ６２にて、次のトークンが「（」であると判定した場合、条件節を抽出する関数を呼び出し、条件節を抽出する（ステップＳ６３）。なお、次のトークンが「（」の場合、条件節がネスト構造になっているので、再び自分自身（条件節を抽出する関数）を呼び出す。
【０１１７】
次に、条件抽出部１２は、条件節オブジェクトに、抽出した条件節を追加する（ステップＳ６４）。
【０１１８】
条件抽出部１２は、ステップＳ６２にて、次のトークンが「論理演算子」であると判定した場合、条件節オブジェクトに論理演算子を追加する（ステップＳ６５）。
【０１１９】
条件抽出部１２は、ステップＳ６２にて、次のトークンが「）」であると判定した場合、条件節オブジェクトに論理演算子が追加されているか否か判定する（ステップＳ６６）。条件抽出部１２は、条件節オブジェクトに論理演算子が追加されている場合、ステップＳ６７の処理へ移行する。条件抽出部１２は、条件節オブジェクトに論理演算子が追加されていない場合、条件節の抽出処理を終了する。
【０１２０】
条件抽出部１２は、ステップＳ６６にて、条件節オブジェクトに論理演算子が追加されていると判定した場合、条件句を抽出する関数を呼び出す（ステップＳ６７）。
【０１２１】
次に、条件抽出部１２は、条件節オブジェクトに、抽出した条件句を追加する（ステップＳ６８）。
【０１２２】
図２２は、図２１のステップＳ６７（条件句を抽出する関数）の詳細な処理を示したフローチャートである。
【０１２３】
まず、条件抽出部１２は、条件句オブジェクトを生成する（ステップＳ７１）。
【０１２４】
次に、条件抽出部１２は、条件文字列を条件句オブジェクトに追加する（ステップＳ７２）。
【０１２５】
図２３は、図２０のステップＳ５４（コードブロックを抽出する関数）の詳細な処理を示したフローチャートである。
【０１２６】
まず、条件抽出部１２は、コードブロックオブジェクトを生成する（ステップＳ８１）。
【０１２７】
次に、条件抽出部１２は、次のトークンが「｝」であるか否か判定する（ステップＳ８２）。条件抽出部１２は、次のトークンが「｝」である場合、ステップＳ８７の処理へ移行する。条件抽出部１２は、次のトークンが「｝」でない場合、ステップＳ８３の処理へ移行する。
【０１２８】
条件抽出部１２は、ステップＳ８２にて、次のトークンが「｝」でないと判定した場合、次のトークンが（「｝」と判定されたかったトークンが）「ＩＦ」であるか否か判定する（ステップＳ８３）。条件抽出部１２は、次のトークンが「ＩＦ」である場合、ステップＳ８４の処理へ移行する。条件抽出部１２は、トークンが「ＩＦ」でない場合、ステップＳ８２の処理へ移行する。
【０１２９】
条件抽出部１２は、ステップＳ８３にて、トークンが「ＩＦ」であると判定した場合、そのトークンの前までの行を無関係ブロックとし、コードブロックオブジェクトに追加する（ステップＳ８４）。
【０１３０】
次に、条件抽出部１２は、条件節を抽出する関数（図２１のフローチャート）を呼び出す（ステップＳ８５）。
【０１３１】
次に、条件抽出部１２は、コードブロックオブジェクトに、抽出したＩＦ節を追加する（ステップＳ８６）。
【０１３２】
次に、条件抽出部１２は、最後の行までを無関係ブロックとし、コードブロックオブジェクトに追加する（ステップＳ８７）。
【０１３３】
以上の処理によって、情報処理装置１は、対象ソースコードをモデリングする。なお、モデル化した個々のモデルオブジェクトには、対象ソースコードにおける開始行数と開始列数、および、終了行数と終了列数が含まれているが、上記のフローチャートの説明では、省略している。
【０１３４】
次に、図１４のステップＳ１３の処理（コンテキストスイッチ文の最適化処理）の詳細について説明する。条件抽出部１２は、ソースファイルを最適化する関数を呼び出す。
【０１３５】
図２４は、ソースファイルを最適化する関数の詳細な処理を示したフローチャートである。
【０１３６】
ソースファイルオブジェクトには、１以上のコードブロックが含まれている。条件抽出部１２は、全てのコードブロックに対し、最適化処理を行ったか否か判定する（ステップＳ１０１）。条件抽出部１２は、全てのコードブロックに対し、最適化処理を行っていない場合、ステップＳ１０２の処理へ移行する。条件抽出部１２は、全てのコードブロックに対し、最適化処理を行っている場合、ソースファイルの最適化処理を終了する。
【０１３７】
条件抽出部１２は、ステップＳ１０１にて、全てのコードブロックに対し、最適化処理を行っていないと判定した場合、コードブロックを最適化する関数を呼び出す（ステップＳ１０２）。
【０１３８】
図２５は、図２４のステップＳ１０２（コードブロックを最適化する関数）の詳細な処理を示したフローチャートである。
【０１３９】
コードブロックには、ＩＦ節のコードブロックと無関係コードブロックとがある。条件抽出部１２は、最適化するコードブロックがＩＦ節（ＩＦ節のコードブロック）であるか否か判定する（ステップＳ１１１）。条件抽出部１２は、最適化するコードブロックがＩＦ節である場合、ステップＳ１１２の処理へ移行する。条件抽出部１２は、最適化するコードブロックがＩＦ節でない場合、コードブロックを最適化する処理を終了する。
【０１４０】
条件抽出部１２は、ステップＳ１１１にて、最適化するコードブロックがＩＦ節であると判定した場合、ＩＦ節を最適化する関数を呼び出す（ステップＳ１１２）。
【０１４１】
図２６は、図２５のステップＳ１１２（ＩＦ節を最適化する関数）の詳細な処理を示したフローチャートである。
【０１４２】
条件抽出部１２は、全てのＩＦ句に対し、最適化処理を行ったか否か判定する（ステップＳ１２１）。条件抽出部１２は、全てのＩＦ句に対し、最適化処理を行っていない場合、ステップＳ１２２の処理へ移行する。条件抽出部１２は、全てのＩＦ句に対し、最適化処理を行っている場合、ステップＳ１２３の処理へ移行する。
【０１４３】
条件抽出部１２は、ステップＳ１２１にて、全てのＩＦ句に対し、最適化処理を行っていないと判定した場合、ＩＦ句を最適化する関数を呼び出す（ステップＳ１２２）。
【０１４４】
条件抽出部１２が、ステップＳ１２１にて、全てのＩＦ句に対し、最適化処理を行っていると判定した場合、コード抽出部１４は、ＩＦ句のうち、条件節が「ｆａｌｓｅ」のＩＦ句を削除する（ステップＳ１２３）。
【０１４５】
次に、コード抽出部１４は、ＩＦ句のうち、条件節が「ｔｒｕｅ」のＩＦ句があれば、それ以降のＩＦ句（ＥＬＳＥのブロック）を削除する（ステップＳ１２４）。
【０１４６】
図２７は、図２６のステップＳ１２２（ＩＦ句を最適化する関数）の詳細な処理を示したフローチャートである。
【０１４７】
条件抽出部１２は、最適化するＩＦ句に条件節が含まれているか否か判定する（ステップＳ１３１）。条件抽出部１２は、最適化するＩＦ句に条件節が含まれている場合、ステップＳ１３２の処理へ移行する。条件抽出部１２は、最適化するＩＦ句に条件節が含まれていない場合、ステップＳ１３４の処理へ移行する。
【０１４８】
条件抽出部１２は、ステップ１３１にて、最適化するＩＦ句に条件節が含まれていると判定した場合、条件節を最適化する関数を呼び出す（ステップＳ１３２）。
【０１４９】
次に、条件抽出部１２は、条件節が「ｆａｌｓｅ」であるか否か判定する（ステップＳ１３３）。条件抽出部１２は、条件節が「ｆａｌｓｅ」である場合、その中のコードブロックを最適化する必要がないので、ＩＦ句の最適化処理を終了する。条件抽出部１２は、条件節が「ｆａｌｓｅ」でない場合、ステップＳ１３４の処理へ移行する。
【０１５０】
条件抽出部１２は、ステップＳ１３３にて、条件節が「ｆａｌｓｅ」であると判定した場合、ＩＦ句が有しているコードブロックの全てにおいて、最適化処理を行ったか否か判定する（ステップＳ１３４）。条件抽出部１２は、ＩＦ句が有しているコードブロックの全てにおいて、最適化処理を行った場合、ＩＦ句の最適化処理を終了する。条件抽出部１２は、ＩＦ句が有しているコードブロックの全てにおいて、最適化処理を行っていない場合、ステップＳ１３５の処理へ移行する。
【０１５１】
条件抽出部１２は、ステップＳ１３４にて、ＩＦ句が有しているコードブロックの全てにおいて、最適化処理を行っていないと判定した場合、コードブロックを最適化する関数（図２５のフローチャートの処理）を呼び出す（ステップＳ１３５）。
【０１５２】
図２８は、図２７のステップＳ１３２（条件節を最適化する関数）の詳細な処理を示したフローチャートである。
【０１５３】
まず、条件抽出部１２は、条件節が有している条件句が、これ以上細分化できない条件句（１つの条件句）であるか否か判定する（ステップＳ１４１）。条件抽出部１２は、条件節が有している条件句が、これ以上細分化できない条件句である場合、ステップＳ１４２の処理へ移行する。条件抽出部１２は、条件節が有している条件句が、細分化できる条件句である場合、ステップＳ１４６の処理へ移行する。
【０１５４】
条件抽出部１２は、ステップＳ１４１にて、条件節が有している条件句が、これ以上細分化できない条件句であると判定した場合、その条件句が、条件パターン記憶部１７に記憶されている条件パターンに一致しているか否か判定する（ステップＳ１４２）。条件抽出部１２は、条件句が、条件パターン記憶部１７に記憶されている条件パターンに一致している場合、ステップＳ１４３の処理へ移行する。条件抽出部１２は、条件句が、条件パターン記憶部１７に記憶されている条件パターンに一致していない場合、条件節の最適化処理を終了する。
【０１５５】
条件抽出部１２が、ステップＳ１４２にて、条件句が、条件パターン記憶部１７に記憶されている条件パターンに一致していると判定した場合、判定部１３は、判定パラメータ記憶部１８を参照して、その条件句の真偽を判定する（ステップＳ１４３）。判定部１３は、判定パラメータ記憶部１８を参照して、その条件句が真であると判定した場合、ステップＳ１４４へ移行する。判定部１３は、判定パラメータ記憶部１８を参照して、その条件句が偽であると判定した場合、ステップＳ１４５へ移行する。
【０１５６】
判定部１３は、ステップＳ１４３にて、条件句が真であると判定した場合、その条件句を「ｔｒｕｅ」に置き換える（ステップＳ１４４）。
【０１５７】
判定部１３は、ステップＳ１４３にて、条件句が偽であると判定した場合、その条件句を「ｆａｌｓｅ」に置き換える（ステップＳ１４５）。
【０１５８】
条件抽出部１２は、ステップＳ１４１にて、条件節が有している条件句を細分化できると判定した場合、次の条件節があるか否か判定する（ステップＳ１４６）。条件抽出部１２は、次の条件節があると判定した場合、ステップＳ１４７の処理へ移行する。条件抽出部１２は、次の条件節がないと判定した場合、ステップＳ１４８の処理へ移行する。
【０１５９】
条件抽出部１２は、ステップＳ１４６にて、次の条件節があると判定した場合、条件節を最適化する関数を呼び出す（ステップＳ１４７）。すなわち、条件抽出部１２は、図２８のフローチャートの処理を再帰的に呼び出す。
【０１６０】
条件抽出部１２が、ステップＳ１４６にて、次の条件節がないと判定した場合、コード抽出部１４は、条件節が「論理和」の条件節であるか、「論理積」の条件節であるか、論理否定の条件節であるか判定する（ステップＳ１４８）。コード抽出部１４は、「論理和」の条件節であると判定した場合、ステップＳ１４９の処理へ移行する。条件抽出部１２は、「論理積」の条件節であると判定した場合、ステップＳ１５１の処理へ移行する。条件抽出部１２は、「論理否定」の条件節であると判定した場合、ステップＳ１５３の処理へ移行する。
【０１６１】
コード抽出部１４は、ステップＳ１４８にて、「論理和」の条件節であると判定した場合、条件節のうち、「ｆａｌｓｅ」の条件句を削除する（ステップＳ１４９）。
【０１６２】
次に、コード抽出部１４は、条件節に１つでも「ｔｒｕｅ」があれば、条件節を「ｔｒｕｅ」に置き換える（ステップＳ１５０）。
【０１６３】
コード抽出部１４は、ステップＳ１４８にて、「論理積」の条件節であると判定した場合、条件節のうち、「ｔｒｕｅ」の条件句を削除する（ステップＳ１５１）。
【０１６４】
次に、コード抽出部１４は、条件節に１つでも「ｆａｌｓｅ」があれば、条件節を「ｆａｌｓｅ」に置き換える（ステップＳ１５２）。
【０１６５】
次に、コード抽出部１４は、条件節の真偽が確定していれば、その論理値を否定した結果を条件節にセットする（ステップＳ１５３）。
【０１６６】
次に、図１４のステップＳ１４の処理（最適化されたソースコードの出力）の詳細について説明する。出力部１５は、最適化されたソースコードのソースファイルを出力する関数を呼び出す。
【０１６７】
図２９は、ソースファイルを出力する関数の詳細な処理を示したフローチャートである。
【０１６８】
出力部１５は、全てのコードブロックに対し、出力処理を行ったか否か判定する（ステップＳ１８１）。出力部１５は、全てのコードブロックに対し、出力処理を行った場合、ソースファイルの出力処理を終了する。出力部１５は、全てのコードブロックに対し、出力処理を行っていない場合、ステップＳ１８２の処理へ移行する。
【０１６９】
出力部１５は、ステップＳ１８１にて、全てのコードブロックに対し、出力処理を行っていないと判定した場合、コードブロックを出力する関数を呼び出す（ステップＳ１８２）。
【０１７０】
図３０は、図２９のステップＳ１８２（コードブロックを出力する関数）の詳細な処理を示したフローチャートである。
【０１７１】
まず、出力部１５は、出力するコードがＩＦ節か否か判定する（ステップＳ１９１）。出力部１５は、出力するコードがＩＦ節である場合、ステップＳ１９２の処理へ移行する。出力部１５は、出力するコードがＩＦ節でない場合、ステップＳ１９３の処理へ移行する。
【０１７２】
出力部１５は、ステップＳ１９１にて、出力するコードがＩＦ節であると判定した場合、ＩＦ節を出力する関数を呼び出す（ステップＳ１９２）。
【０１７３】
出力部１５は、ステップＳ１９１にて、出力するコードがＩＦ節でないと判定した場合、無関係ブロックを開始位置から終了位置までを出力する（ステップＳ１９３）。
【０１７４】
図３１は、図３０のステップＳ１９２（ＩＦ節を出力する関数）の詳細な処理を示したフローチャートである。
【０１７５】
出力部１５は、全てのＩＦ句を出力したか否か判定する（ステップＳ２０１）。出力部１５は、全てのＩＦ句を出力した場合、条件節の出力処理を終了する。出力部１５は、全てのＩＦ句を出力していない場合、ステップＳ２０２の処理へ移行する。
【０１７６】
出力部１５は、ステップＳ２０１にて、全てのＩＦ句を出力していないと判定した場合、ＩＦ句を出力する関数を呼び出す（ステップＳ２０２）。
【０１７７】
図３２は、図３１のステップＳ２０２（ＩＦ句を出力する関数）の詳細な処理を示したフローチャートである。
【０１７８】
まず、出力部１５は、出力するコードに条件節があるか否か判定する（ステップＳ２１１）。出力部１５は、出力するコードに条件節がある場合、ステップＳ２１２の処理へ移行する。出力部１５は、出力するコードに条件節がない場合、ステップＳ２１３の処理へ移行する。
【０１７９】
出力部１５は、ステップＳ２１１にて、出力するコードに条件節があると判定した場合、条件節を出力する関数を呼び出す（ステップＳ２１２）。
【０１８０】
出力部１５は、ステップＳ２１１にて、出力するコードに条件節がないと判定した場合、ＩＦ句内の全てのコードブロックにおいて、コードブロックの出力処理を行ったか否か判定する（ステップＳ２１３）。出力部１５は、ＩＦ句内の全てのコードブックにおいて、コードブロックの出力処理を行った場合、ＩＦ句の出力処理を終了する。出力部１５は、ＩＦ句内の全てのコードブックにおいて、コードブロックの出力処理を行っていない場合、ステップＳ２１４の処理へ移行する。
【０１８１】
出力部１５は、コードブロックを出力する関数（図３０のフローチャートの処理）を呼び出す（ステップＳ２１４）。
【０１８２】
図３３は、図３２のステップＳ２１２（条件節を出力する関数）の詳細な処理を示したフローチャートである。
【０１８３】
まず、出力部１５は、条件節が有している条件句が、これ以上細分化できない条件句であるか否か判定する（ステップＳ２２１）。出力部１５は、条件節が有している条件句が、これ以上細分化できない条件句である場合、ステップＳ２２２の処理へ移行する。出力部１５は、条件節が有している条件句が、細分化できる条件句であると判定した場合、ステップＳ２２３の処理へ移行する
【０１８４】
出力部１５は、ステップＳ２２１にて、条件節が有している条件句を細分化できないと判定した場合、条件句の文字列を出力する（ステップＳ２２２）。
【０１８５】
出力部１５は、ステップＳ２２１にて、条件節が有している条件句を細分化できると判定した場合、次の条件節があるか否か判定する（ステップＳ２２３）。出力部１５は、次の条件節がないと判定した場合、条件節の出力処理を終了する。出力部１５は、次の条件節があると判定した場合、ステップＳ２２４の処理へ移行する。
【０１８６】
出力部１５は、ステップＳ２２３にて、次の条件節があると判定した場合、条件節を出力する関数を呼び出す（ステップＳ２２４）。すなわち、出力部１５は、図３３のフローチャートを再帰的に呼び出す。
【０１８７】
次に、出力部１５は、条件節が最後でない場合、論理演算子を出力する（ステップＳ２２５）。
【０１８８】
上記の処理によって、最適化されたソースコードがファイル出力される。なお、上述したフロー図の各処理単位は、情報処理装置１の処理を理解容易にするために、主な処理内容に応じて分割したものである。処理単位の分割の仕方や名称によって、本願発明が制限されることはない。情報処理装置１の処理は、処理内容に応じて、さらに多くの処理単位に分割することもできる。また、１つの処理単位がさらに多くの処理を含むように分割することもできる。
【０１８９】
図３４は、情報処理装置１の機能を実現するハードウェア構成の一例を示す図である。
【０１９０】
情報処理装置１は、例えば、図３４に示すような、ＣＰＵ（Central Processing Unit）等の演算装置４１と、ＲＡＭ（Random Access Memory）などの主記憶装置４２と、ＨＤＤ（Hard Disk Drive）等の補助記憶装置４３と、有線又は無線により通信ネットワークと接続するための通信インターフェイス（Ｉ／Ｆ）４４と、マウス、キーボード、タッチセンサーやタッチパネルなどの入力装置４５と、液晶ディスプレイなどの表示装置４６と、ＤＶＤ（Digital Versatile Disk）などの持ち運び可能な記憶媒体に対する情報の読み書きを行う読み書き装置４７と、を備えるコンピューターで実現することができる。
【０１９１】
例えば、条件抽出部１２、判定部１３、およびコード抽出部１４の機能は、補助記憶装置４３などから主記憶装置４２にロードされた所定のプログラムを演算装置４１が実行することで実現される。入力部１１は、例えば、演算装置４１が入力装置４５を利用することで実現される。出力部１５は、例えば、演算装置４１が表示装置４６または読み書き装置４７を利用することで実現される。また、出力部１５は、抽出されたコードをＨＤＤなどの記憶装置に記憶する場合、補助記憶装置４３を利用することで実現される。ソースコード記憶部１６、条件パターン記憶部１７、および判定パラメータ記憶部１８は、例えば、演算装置４１が主記憶装置４２または補助記憶装置４３を利用することで実現される。
【０１９２】
なお、上記の所定のプログラムは、例えば、読み書き装置４７により読み取られた記憶媒体からインストールされてもよいし、通信Ｉ／Ｆ４４を介してネットワークからインストールされてもよい。
【０１９３】
上述した情報処理装置１の機能構成は、情報処理装置１の構成を理解容易にするために、主な処理内容に応じて分類したものである。構成要素の分類の仕方や名称によって、本願発明が制限されることはない。情報処理装置１の構成は、処理内容に応じて、さらに多くの構成要素に分類することもできる。また、１つの構成要素がさらに多くの処理を実行するように分類することもできる。また、各構成要素の処理は、１つのハードウェアで実行されてもよいし、複数のハードウェアで実行されてもよい。
【０１９４】
このように、情報処理装置１は、複数のプログラムから呼出される被呼出プログラムのソースコードに含まれる条件分岐の所定の条件を抽出し、抽出した所定の条件が、複数のプログラムの所定のプログラムによる、被呼出プログラムの呼出に関する条件であるか否か判定する。そして、情報処理装置１は、判定結果に基づいて、ソースコードから、所定のプログラムから呼出されたときに実行されるコードを抽出する。これにより、呼出側プログラムの条件分岐によって複雑化または肥大化した被呼出プログラムは、簡素化され、可読性を向上することができる。また、被呼出プログラムの保守性を向上することができる。
【０１９５】
また、抽出されたコードを新たなプログラムコードとして用いることもできる。抽出されたコードは、分岐条件およびコードが削除されているので、処理速度が向上する可能性がある。
【０１９６】
なお、上記では、コンテキストスイッチ文の条件分岐として、ｉｆ文およびｓｗｉｔｃｈ文があるとしたが、プログラムの流れを切り替える条件分岐であれば、これらに限られない。
【０１９７】
また、上記では、１つのコンテキスト別プログラムソースコードを出力する例について説明したが、複数のコンテキスト別プログラムソースコードを出力することもできる。すなわち、情報処理装置１は、複数の呼出側プログラムのそれぞれに対応してコードを抽出し、複数の呼出側プログラムのそれぞれにおける、最適化されたソースコードを出力することもできる。例えば、判定パラメータ記憶部１８に、複数の呼出側プログラムの情報（判定パラメータ）を記憶する。判定部１３は、個々の呼出側プログラムの情報に基づいて、抽出された条件を判定し、コード抽出部１４は、判定部１３の判定結果に基づいて、ソースコードから、呼出側プログラムのそれぞれにおいて呼出されたときに実行されるコードを抽出する。そして、出力部１５は、呼出側プログラムごとに抽出されたコードを出力する。
【０１９８】
以上、本発明について実施形態を用いて説明したが、本発明の技術的範囲は上記実施形態に記載の範囲には限定されない。上記実施形態に多様な変更または改良を加えることが可能であることが当業者には明らかである。また、そのような変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。また、本発明は、ソースコードを最適化するソースコード最適化方法、および情報処理装置１でソースコードの最適化を実現するプログラム、および当該プログラムを記憶した記憶媒体として提供することもできる。
【符号の説明】
【０１９９】
１：情報処理装置、２，２ａ，２ｂ：ソースコード、３：条件パターン、４：定パラメータ、ＰＧＡ〜ＰＧＣ：プログラム、１１：入力部、１２：条件抽出部、１３：判定部、１４：コード抽出部、１５：出力部、１６：ソースコード記憶部、１７：条件パターン記憶部、１８：判定パラメータ記憶部１８、１７ａ：パターン番号、１７ｂ：条件パターン。
【図１】
2015141566.tif 000003
【図２】
2015141566.tif 000004
【図３】
2015141566.tif 000005
【図４】
2015141566.tif 000006
【図５】
2015141566.tif 000007
【図６】
2015141566.tif 000008
【図７】
2015141566.tif 000009
【図８】
2015141566.tif 000010
【図９】
2015141566.tif 000011
【図１０】
2015141566.tif 000012
【図１１】
2015141566.tif 000013
【図１２】
2015141566.tif 000014
【図１３】
2015141566.tif 000015
【図１４】
2015141566.tif 000016
【図１５】
2015141566.tif 000017
【図１６】
2015141566.tif 000018
【図１７】
2015141566.tif 000019
【図１８】
2015141566.tif 000020
【図１９】
2015141566.tif 000021
【図２０】
2015141566.tif 000022
【図２１】
2015141566.tif 000023
【図２２】
2015141566.tif 000024
【図２３】
2015141566.tif 000025
【図２４】
2015141566.tif 000026
【図２５】
2015141566.tif 000027
【図２６】
2015141566.tif 000028
【図２７】
2015141566.tif 000029
【図２８】
2015141566.tif 000030
【図２９】
2015141566.tif 000031
【図３０】
2015141566.tif 000032
【図３１】
2015141566.tif 000033
【図３２】
2015141566.tif 000034
【図３３】
2015141566.tif 000035
【図３４】
2015141566.tif 000036