(57)【特許請求の範囲】
【請求項１】
プログラムのソースコードを取得するソースコード取得手段と、
前記プログラムを構成するモジュールのなかから、第１のモジュールと前記第１のモジュールから呼び出される第２のモジュールとの指定を受け付けるモジュール指定手段と、
前記プログラムを動作させるための動作条件の指定を受け付ける動作条件指定手段と、
前記ソースコードを解析して前記指定した動作条件で前記プログラムを動作させた場合に、前記第１のモジュール及び前記第２のモジュールから共通に参照可能な情報を、前記第１のモジュールと前記第２のモジュール間の依存の関係を示す情報として抽出する依存関係抽出手段と、
前記依存関係抽出手段によって抽出された情報を提示する提示手段と、
を備えることを特徴とするモジュール依存関係抽出装置。
【請求項２】
前記依存関係抽出手段は、前記指定した動作条件で前記プログラムを動作させた場合に前記第１のモジュール及び前記第２のモジュールから共通に参照可能な関数及び／又はグローバル変数を前記ソースコードから抽出する、
ことを特徴とする請求項１に記載のモジュール依存関係抽出装置。
【請求項３】
前記依存関係抽出手段が抽出した関数及び／又はグローバル変数のうち、前記プログラム内の前記第１のモジュール及び前記第２のモジュール以外からは参照されない関数及び／又はグローバル変数を、削除可能な対象として特定する削除対象特定手段をさらに備え、
前記提示手段は、前記削除対象特定手段が特定した関数及び／又はグローバル変数が前記ソースコード内で記載又は定義さている部分を、前記ソースコード内の他の部分と区別して表示する、
ことを特徴とする請求項２に記載のモジュール依存関係抽出装置。
【請求項４】
前記提示手段が表示した削除可能な部分が、前記ソースコードから削除された場合に削減されるハードウェアリソースの量を見積もるリソース見積手段をさらに備え、
前記提示手段は、前記リソース見積手段が見積もったハードウェアリソースの量を提示する、
ことを特徴とする請求項３に記載のモジュール依存関係抽出装置。
【請求項５】
前記抽出手段が抽出した関数及び／又はグローバル変数のうち、削除対象特定手段が削除可能な対象と特定しなかった関数及び／又はグローバル変数に基づいて、前記第１のモジュールに対する前記第２のモジュールの依存度を算出する依存度算出手段をさらに備え、
前記提示手段は、前記依存度算出手段が算出した依存度を提示する、
ことを特徴とする請求項３又は４に記載のモジュール依存関係抽出装置。
【請求項６】
プログラムのソースコードを取得し、
前記プログラムを構成するモジュールのなかから、第１のモジュールと前記第１のモジュールから呼び出される第２のモジュールとの指定を受け付け、
前記プログラムを動作させるための動作条件の指定を受け付け、
前記ソースコードを解析して前記指定した動作条件で前記プログラムを動作させた場合に、前記第１のモジュール及び前記第２のモジュールから共通に参照可能な情報を、前記第１のモジュールと前記第２のモジュール間の依存の関係を示す情報として抽出し、
前記抽出された情報を提示する、
ことを特徴とするモジュール依存関係抽出方法。
【請求項７】
コンピュータを、
プログラムのソースコードを取得するソースコード取得手段、
前記プログラムを構成するモジュールのなかから、第１のモジュールと前記第１のモジュールから呼び出される第２のモジュールとの指定を受け付けるモジュール指定手段、
前記プログラムを動作させるための動作条件の指定を受け付ける動作条件指定手段、
前記ソースコードを解析して前記指定した動作条件で前記プログラムを動作させた場合に、前記第１のモジュール及び前記第２のモジュールから共通に参照可能な情報を、前記第１のモジュールと前記第２のモジュール間の依存の関係を示す情報として抽出する依存関係抽出手段、
前記依存関係抽出手段によって抽出された情報を提示する提示手段、
として機能させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、モジュール依存関係抽出装置、モジュール依存関係抽出方法、及び、プログラムに関する。
【背景技術】
【０００２】
一般に、ソフトウェアを構成するモジュール間の依存度が小さい程、モジュールに対応する機能の改修や削除をする際に他のモジュールへの影響が小さくなり（独立性が高くなり）、ソフトウェアの保守性が向上する。特許文献１、２には、ソフトウェアのモジュール間の依存度を定量的に測定する技術について記載されている。
【０００３】
具体的には、特許文献１には、オブジェクト指向の言語で作成されたソフトウェア（プログラム）に対して、依存関係の種別ごとに依存度を定量化して算出することが記載されている。また、特許文献２には、Ｃ言語等のオブジェクト指向をサポートしていない言語であっても、モジュール間で共有するグローバル変数に対するアクセス回数に基づいて、モジュール間の依存度を算出することが記載されている。
【０００４】
特許文献１、２では、ソフトウェア（プログラム）が扱うデータの範囲には制約が無いことを前提にプログラムやソースコードを解析して、モジュール間の依存度を算出する。特許文献１、２に記載の方法で算出されるモジュール間の依存度は、新規にプログラムを開発するような場合に、モジュールの独立性を示す尺度として有効である。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０００−２１５０４５号公報
【特許文献２】特開２０１０−２８２４４１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
これに対し、例えば、パソコン上で開発されたソフトウェア（プログラム）を組み込み機器等に移植したい場合がある。この場合、組み込み機器のハードウェアリソースの制約等のため、移植するプログラムが扱うデータに制限を加えて、その制限下では実行されない機能を削除する開発がなされることがある。このような場合、削除対象となる機能に対応するモジュールは、扱うデータの範囲に依存して容易に削除できる場合と、削除に伴って広範囲に渡りプログラムの改修が必要となるため容易に削除できない場合とがある。
【０００７】
ここで、このモジュールを容易に削除できるか否かを、特許文献１、２に記載の手法で算出したモジュール間の依存度に基づいて判断することが考えられる。即ち、依存度が高い場合は独立性が低いため削除が困難と判断し、依存度が低い場合は独立性が高いため削除が容易と判断する。しかしながら、特許文献１、２に記載の手法では、プログラムが扱うデータ範囲に制限が加えられている場合には、モジュール間の依存度を正しく測定することができない。従って、上述したように既存のプログラムを組み込み機器等に移植する際に機能を削除するような開発を行う場合、特許文献１、２に記載の手法で算出されたモジュール間の依存度を、モジュールの独立性を示す尺度として利用するのは不適当であった。
【０００８】
本発明は、上記実情に鑑みてなされたものであり、プログラムが扱うデータ範囲に制限が加えられた場合であっても、モジュール間の依存関係を正確に抽出することができるモジュール依存関係抽出装置、モジュール依存関係抽出方法、及び、プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
上記目的を達成するため、本発明のモジュール依存関係抽出装置は、
プログラムのソースコードを取得するソースコード取得手段と、
前記プログラムを構成するモジュールのなかから、第１のモジュールと前記第１のモジュールから呼び出される第２のモジュールとの指定を受け付けるモジュール指定手段と、
前記プログラムを動作させるための動作条件の指定を受け付ける動作条件指定手段と、
前記ソースコードを解析して前記指定した動作条件で前記プログラムを動作させた場合に、前記第１のモジュール及び前記第２のモジュールから共通に参照可能な情報を、前記第１のモジュールにおける前記第２のモジュールの依存の関係を示す情報として抽出する依存関係抽出手段と、
前記依存関係抽出手段によって抽出された情報を提示する提示手段と、
を備えることを特徴とする。
【発明の効果】
【００１０】
本発明によれば、指定された動作条件に従ってソースコードを解析してモジュール間の依存関係を抽出する。従って、プログラムが扱うデータ範囲に制限が加えられた場合であっても、モジュール間の依存関係を正確に抽出することができる。
【図面の簡単な説明】
【００１１】
【図１】本発明の実施形態に係るモジュール依存関係抽出装置の物理的な構成を示す図である。
【図２】本発明の実施形態に係るモジュール依存関係抽出装置の機能構成図である。
【図３】依存関係抽出処理の動作を説明するためのフローチャートである。
【図４】解析対象となるソースコードの例を示す図である。
【図５】（Ａ）は、対象モジュール指定部によって指定されたモジュールの構成を示す図である。（Ｂ）は、動作条件指定部によって指定された動作条件を示す図である。
【図６】共通参照情報抽出処理の動作を説明するためのフローチャートである。
【図７】共通参照情報提示画面の例を示す図である。
【図８】削除可能コードが他の部分と区別されて表示されているソースコードの例を示す図である。
【図９】ＵＤＰパケット送信処理の動作を説明するためのフローチャートである。
【図１０】ＵＤＰパケット通信プログラムのソースコードの一部を示す図（その１）である。
【図１１】ＵＤＰパケット通信プログラムのソースコードの一部を示す図（その２）である。
【図１２】ＵＤＰパケット通信プログラムのソースコードの一部を示す図（その３）である。
【図１３】ＵＤＰパケット通信プログラムのソースコードの一部を示す図（その４）である。
【図１４】対象モジュール指定部によって指定されたモジュールの構成を示す図である。
【図１５】削除可能コードが他の部分と区別されて表示されているソースコードの例を示す図（その１）である。
【図１６】削除可能コードが他の部分と区別されて表示されているソースコードの例を示す図（その２）である。
【図１７】削除可能コードが他の部分と区別されて表示されているソースコードの例を示す図（その３）である。
【図１８】削除可能コードが他の部分と区別されて表示されているソースコードの例を示す図（その４）である。
【図１９】削除可能コードが他の部分と区別されて表示されているソースコードの例を示す図（その５）である。
【発明を実施するための形態】
【００１２】
以下、本発明の実施形態について、図面を参照しながら詳細に説明する。なお、図中同一または相当部分には同一符号を付す。また、特に言及が無い場合、本発明の実施形態で示すプログラムのソースコードはＣ言語で記載されているものとする。また、本発明の実施形態における「関数」は、ユーザが独自に定義した関数を指し、Ｃ言語で標準的に準備されているprintf等の関数は含ないものとする。また、以下の説明で適宜例示するソースコードには、説明を容易にするため左側に行番号を付す。
【００１３】
本発明の実施形態に係るモジュール依存関係抽出援装置１００は、プログラム内から指定したモジュール間における依存の関係を示す情報を抽出する装置である。
【００１４】
パソコン上で開発したプログラムを組み込み機器に移植する際に、組み込み機器のリソース（例えば、メモリ使用量等）には制約があるため、特定の機能に対応するモジュールを削除する開発を行う場合がある。このような場合、削除対象のモジュールが他のモジュールに対してどのように依存していたかをユーザ（開発者）に提示することは、開発作業を支援する上で重要である。本発明の実施形態に係るモジュール依存関係抽出援装置１００は、このような場面で好適に利用される。
【００１５】
モジュール依存関係抽出装置１００は、物理的には、図１に示すように、通信部１１と、操作部１２と、表示部１３と、記憶部１４と、入出力Ｉ／Ｆ部１５と、制御部１６と、を備える。各部はバス１７を介して互いに接続されている。
【００１６】
通信部１１は、通信ネットワーク２を介して、ネットワーク２上の図示せぬ情報処理装置等と通信を行うものであり、通信インタフェース等を備える。例えば、通信部１１は、依存関係抽出のために解析するプログラムのソースコードを、これらネットワーク２上の情報処理装置から受信してもよい。
【００１７】
操作部１２は、モジュール依存関係抽出装置１００に様々な情報を入力するために使用するものであり、キーボード等の入力装置を備える。
【００１８】
表示部１３は、様々な情報を出力するものであり、液晶ディスプレイ等の表示装置を備える。
【００１９】
記憶部１４は、様々な情報、プログラム、などのアプリケーション等を記憶するものであり、ハードディスクドライブ等の補助記憶装置を備える。
【００２０】
入出力Ｉ／Ｆ部１５は、入出力機器３を接続するためのインタフェースである。例えば、依存関係抽出のために解析するプログラムのソースコードを、入出力Ｉ／Ｆ部１５を介して、ＣＤ−ＲＯＭドライブ等の入出力機器３から取り込むこともできる。
【００２１】
制御部１６は、データの演算処理を行うと共に、バス１７を介して通信部１１、操作部１２、出力部１３、記憶部１４、入出力Ｉ／Ｆ部１５を制御するものであり、ＣＰＵ（Central Processing Unit）１６ａ、ＲＯＭ（Read Only Memory）１６ｂ、ＲＡＭ（Random Access  Memory）１６ｃ等を備える。制御部１６における演算処理及び制御処理は、具体的には、ＣＰＵ１６ａが、ＲＡＭ１６ｃを作業領域として使用して各種データを一時的に記憶させながら、ＲＯＭ１６ｂに記憶されている制御プログラムを実行することにより行われる。
【００２２】
モジュール依存関係抽出装置１００は、機能的には、図２に示すように、ソースコード記憶部２１と、ソースコード取得部２２と、対象モジュール指定部２３と、動作条件指定部２４と、依存関係抽出部２５と、提示部２６とを備える。なお、これらの各部とは、図１に示した制御部１６が、同じく図１に示した通信部１１、操作部１２、出力部１３、記憶部１４、又は入出力Ｉ／Ｆ部１５を制御することにより実現される。
【００２３】
ソースコード記憶部２１には、複数のソースコードが格納されている。各ソースコードには、１乃至複数の関数が記載（定義）されている。
【００２４】
ソースコード取得部２２は、操作部１２を介して入力されたユーザからの指示に基づいて、モジュール間の依存関係を抽出するための解析対象とするプログラムのソースコードを１乃至複数取得する。なお、ソースコード取得部２２は、ソースコード記憶部２１に格納されている全てのソースコードを解析対象として取得してもよい。また、ソースコード取得部２２は、インターネット等を介して、外部のサーバ等からソースコードを取得してもよい。なお、ソースコード取得部２２によって取得されたソースコードを取得ソースコードと呼称して以下説明する。
【００２５】
対象モジュール指定部２３は、操作部１２を介して入力されたユーザからの指示に基づいて、取得ソースコードに対応するプログラムを構成するモジュールのなかから、依存関係抽出の対象とするモジュールを指定する。具体的には、対象モジュール指定部２３は、依存元のモジュール（第１のモジュール）と、第１のモジュールから呼び出される依存先のモジュール（第２のモジュール）とを指定する。なお、プログラムから機能を削除する開発を支援するためにモジュール依存関係抽出装置１００を利用する場合は、削除対象となる機能に対応するモジュールを第２のモジュールに指定するのが望ましい。
【００２６】
なお、本実施形態におけるモジュールは、１乃至複数の関数の集合を表すものとする。従って、対象モジュール指定部２３は、ユーザからの指示に基づいて、取得ソースコード内で定義されている関数のなかから、第１のモジュールと第２のモジュールとに属する関数を関数名等で指定する。
【００２７】
動作条件指定部２４は、操作部１２を介して入力されたユーザからの指示に基づいて、取得ソースコードに対応するプログラムを動作させるための入力データの条件（動作条件）を指定する。
なお、本実施形態では、動作条件は、パソコン上で作成された既存のプログラムを組み込み機器等に移植する際に、組み込み機器のハードウェアリソースの制約のために、移植先のプログラムで制限される入力データの範囲を示す。例えば、メモリの空き容量を入力データとしてメモリの空き容量に応じた処理を実行させる既存のプログラムを組み込み機器に移植する場合、この入力データの最大値を移植先でのメモリの空き容量の限界値とする動作条件を設定すればよい。
【００２８】
依存関係抽出部２５は、取得プログラムを解析して、指定された動作条件下でプログラムを動作させた場合の第１のモジュールと第２のモジュール間の依存の関係を示す情報を抽出する。依存関係抽出部２５は、共通参照情報抽出部２５１と、削除対象特定部２５２と、削除可能リソース見積部２５３と、モジュール間依存度算出部２５４とを備える。
【００２９】
共通参照情報抽出部２５１は、取得ソースコードを解析して、指定された動作条件下でプログラムを動作させた場合に第１のモジュールと第２のモジュールとの両方から共通に参照可能な情報（関数及びグローバル変数）を抽出する。
【００３０】
削除対象特定部２５２は、共通参照情報抽出部２５１によって抽出された関数及びグローバル変数のうち、第２のモジュールの削除に伴ってプログラム内から一緒に削除可能となるものを特定する。具体的には、削除対象特定部２５２は、抽出された関数及びグローバル変数のうち、指定された動作条件下でプログラムを動作させた場合に第１のモジュールと第２モジュール以外のモジュール（関数）からは参照されないものを削除可能対象として特定する。
【００３１】
削除可能リソース見積部２５３は、削除対象特定部２５２が削除可能と特定した関数及びグローバル変数をプログラムから削除した場合の、ハードウェアリソースの削減量を見積もる。
【００３２】
モジュール間依存度算出部２５４は、共通参照情報抽出部２５１によって抽出された関数とグローバル変数のうち、削除対象特定部２５２が削除でないと判断した関数とグローバル変数に基づいて、第１のモジュールに対する第２のモジュールの依存の程度を表すモジュール間依存度を算出する。
【００３３】
（依存関係抽出処理）
続いて、モジュール依存関係抽出装置１００によって実施される、プログラム内を構成するモジュール間の依存の関係を抽出する依存関係抽出処理の動作について、適宜具体例を挙げて詳細に説明する。ユーザは、モジュール依存関係抽出装置１００の操作部１２を介して、依存関係抽出処理を開始するための指示を入力する。この指示に応答して、モジュール依存関係抽出装置１００は、図３のフローチャートに示す依存関係抽出処理を実行する。
【００３４】
依存関係抽出処理が実行されると、まず、ユーザは、モジュール依存関係抽出装置１００の操作部１２を操作して、解析対象とするプログラムのソースコードを指定する。ソースコード取得部２２は、この指定を受けて、指定されたソースコード（取得ソースコード）をソースコード記憶部２１から取得する（ステップＳ１０１）。例えば、図４に示すソースコードが取得されたものとして、以下説明する。
【００３５】
図３に戻り、ソースコードの取得が完了すると、ユーザは、操作部１２を操作して、取得したソースコードから依存関係抽出の対象とする依存元となる第１のモジュールと、第１のモジュールから呼び出される依存先の第２のモジュールとを指定する。対象モジュール指定手段は、この指定を受け付け、受け付けた内容に基づいて第１のモジュールと第２のモジュールとを特定する（ステップＳ１０２）。
【００３６】
例えば、図５（Ａ）に示すように、図４に示す取得ソースコードから、第１のモジュールとして関数「mod1_func0()」、第２のモジュールとして関数「mod2_func1()」、「mod2_func2()」、「mod2_func3()」、「mod2_func4()」、「mod2_func5()」、「mod2_func6()」が指定されたものとして、以下説明する。
【００３７】
図３に戻り、第１のモジュールと第２のモジュールとの指定が完了すると、ユーザは、操作部１２を操作して、取得ソースコードに対応するプログラムを実行させるための動作条件を指定（入力）する。動作条件指定部２４は、この指定を受け付け、受け付けた内容に基づいて動作条件を取得する（ステップＳ１０３）。
【００３８】
例えば、図５（Ｂ）に示すように、図４に示す取得ソースコード内で扱われる変数「val」の値は任意、変数「val2」の値は１００未満でプログラムを動作させることを示す動作条件が指定されたものとして、以下説明する。
【００３９】
図３に戻り、動作条件の指定が完了すると、共通参照情報抽出部２５１は、取得ソースコードに対応するプログラムを指定された動作条件で実行した場合に、第１のモジュールと第２のモジュールの両方から共通に参照可能な情報を抽出する共通参照情報抽出処理を実行する（ステップＳ１０４）。共通参照情報抽出処理については、図６のフローチャートを用いて詳細に説明する。
【００４０】
共通参照情報抽出処理が開始されると、まず、共通参照情報抽出部２５１は、取得ソースコードを解析して、取得ソースコードに対応するプログラムを指定された動作条件で実行した場合に、第１のモジュールと第２のモジュールの両方から共通に参照される可能性がある関数とグローバル変数とを抽出する（ステップＳ１０４１）。
【００４１】
例えば、図４に示す取得ソースコードに対応するプログラムを、図５（Ｂ）で指定された動作条件「val2<100」で実行した場合、取得ソースコードの１６行目と２４行目に記載されている関数「mod2_func3()」、「mod2_func6()」が実行されることは無い。従って、第１のモジュール（関数「mod1_func0()」）からは、関数「mod2_func3()」、「mod2_func6()」は参照されず、これらの関数は抽出の対象から除外される。また、取得ソースコードの１２行目の処理は指定動作条件下においても実行される可能性があるため、第１のモジュールと第２のモジュールの両方から関数「mod2_func1()」とグローバル変数「g_val1」とが参照可能であることが分かる。以下、同様に取得ソースコードを解析して、最終的に関数「mod2_func1()」、「mod2_func2()」、「mod2_func4()」、「mod2_func5()」と、グローバル変数「g_val1」とがステップＳ１０４１の処理で抽出される。
【００４２】
図６に戻り、続いて、共通参照情報抽出部２５１は、取得ソースコードを解析して、取得ソースコードに対応するプログラムを指定された動作条件で実行した場合に、ステップＳ１０４１で抽出された関数から参照される可能性がある他の関数（サブルーチン）があるか否かを判別する（ステップＳ１０４２）。
例えば、上述の例では、ステップＳ１０４１で抽出された関数「mod2_func1()」、「mod2_func2()」、「mod2_func4()」、「mod2_func5()」のそれぞれについて、他の関数を参照しているか否かが判別される。ここでは、そのような関数は検出されなかったものとして、以下説明する。
【００４３】
図６に戻り、他の関数（サブルーチン）があると判別した場合（ステップＳ１０４２；Ｙｅｓ）、共通参照情報抽出部２５１は、この関数（サブルーチン）が定義されているソースコードの部分を解析して、指定された動作条件下で、この関数から参照される可能性がある関数とグローバル変数とを抽出する（ステップＳ１０４３）。
【００４４】
以下、共通参照情報抽出部２５１は、指定された動作条件下で、ステップＳ１０４３で抽出された関数から参照される可能性がある関数（サブルーチン）があるか否かを判別し、サブルーチンがある場合に、そのサブルーチンから参照可能な関数とグローバル変数とを抽出する処理を繰り返す。
【００４５】
一方、関数（サブルーチン）が無いと判別した場合（ステップＳ１０４２；Ｎｏ）、これ以上抽出する関数とグローバル変数は無いこととなり、共通参照情報抽出処理は終了する。
【００４６】
図３に戻り、共通参照情報抽出処理が完了すると、提示部２６は、共通参照情報抽出処理によって抽出された情報（関数とグローバル変数）を表示部１３に表示（提示）する（ステップＳ１０５）。
【００４７】
上述の例では、図７（Ａ）に示すように、抽出された関数「mod2_func1()」、「mod2_func2()」、「mod2_func4()」、「mod2_func5()」とグローバル変数「g_val1」との名称が一覧表示される共通参照情報提示画面が表示部１３に表示される。
【００４８】
図３に戻り、続いて、操作部１２を介して、ユーザから削除可能コード表示の指示要求が有った場合、削除対象特定部２５２は、共通参照情報抽出処理（ステップＳ１０４）によって抽出された関数及びグローバル変数のうち、指定された動作条件下でプログラムを実行させた場合に、第１のモジュール及び第２のモジュール以外からは参照されない関数及びグローバル変数を削除可能な関数及びグローバル変数として特定する（ステップＳ１０６）。
【００４９】
上述の例では、図４に示す取得ソースコード内の３２〜３５行目の記載から、第１のモジュール及び第２のモジュール以外のモジュール（関数「mod4_func()」）内で、共通参照情報抽出処理（ステップＳ１０４）で抽出された関数「mod2_func2()」が参照されているのがわかる。従って、関数「mod2_func2()」は削除可能な対象からは除外され、最終的に、関数「mod2_func1()」、「mod2_func4()」、「mod2_func5()」と、グローバル変数「g_val1」とが削除可能と特定される。
【００５０】
図３に戻り、続いて、提示部２６は、ステップＳ１０６で特定された削除可能な関数及びグローバル変数が取得ソースコード内で記載されている部分を、削除可能なコードとして他の部分と区別可能に表示する画面を作成して表示部１３に表示する（ステップＳ１０７）。
【００５１】
上述の例では、図８に示すように、削除可能と特定された関数「mod2_func1()」、「mod2_func4()」、「mod2_func5()」と、グローバル変数「g_val1」とが記載されている１行目、１２行目、２０行目、及び２２行目の部分が削除可能部分として点線で囲まれた取得ソースコードが表示される。
【００５２】
図３に戻り、続いて、操作部１２を介して、ユーザから削減可能なハードウェアリソース表示の指示要求が有った場合、リソース見積部２５３は、ステップＳ１０７で削除可能コードとして表示した部分を削除した場合のハードウェアリソース（例えば、記憶容量（ＲＯＭ容量）やメモリ使用量（ＲＡＭ容量））の削減量を見積もる（ステップＳ１０８）。そして、提示部２６は、見積もったハードウェアリソースの削減量を、表示部１３に表示（提示）する（ステップＳ１０９）。
【００５３】
例えば、ＲＯＭ容量であれば、リソース見積部２５３は、削除可能コードとして表示した部分のみをコンパイルし、生成されたバイナリコードのサイズを計測することで見積もればよい。また、ＲＡＭ容量であれば、リソース見積部２５３は、削除可能コードと特定したグローバル変数のソースコード内での宣言部分を参照してこのグローバル変数に割り当てられるメモリを予測して、ＲＡＭ容量を見積もればよい。
【００５４】
上述の例では、関数「mod2_func1()」、「mod2_func4()」、及び「mod2_func5()」をコンパイルすることによって得られるバイナリコードのサイズ分のＲＯＭ容量、及びグローバル変数「g_val1」を記憶するために要するＲＡＭ容量が、削除可能コードを削除した場合のハードウェアリソースの削減量となる。なお、ＲＡＭ容量の削減量については、本来、ＯＳのリソースや、タスクや割り込みのコンテキストなどに要する容量の評価も必要であるが、本実施の形態ではタスクを削除していないため、評価に入れないこととする。
【００５５】
続いて、操作部１２を介して、ユーザから、モジュール間依存度表示の指示要求が有った場合、モジュール間依存度算出部２５４は、第２のモジュールの第１のモジュールに対する依存の程度を示すモジュール間依存度を算出する（ステップＳ１１０）。具体的には、モジュール間依存度算出部２５４は、共通参照情報抽出処理（ステップＳ１０４）で抽出した関数、グローバル変数のうち、ステップＳ１０６で削除可能とならなかった関数、グローバル変数に着目して、モジュール間依存度を算出する。
【００５６】
例えば、削除対象にならなかった関数やグローバル変数が多いほど、第２のモジュールを削除するのが困難であり、第２のモジュールは第１のモジュールにより依存していると考えられる。従って、例えば、モジュール間依存度算出部２５４は、削除対象にならなかった関数やグローバル変数の数をモジュール間依存度として算出すればよい。なお、この場合、上述の例では、抽出された関数とグローバル変数のうち、関数「mod2_func2()」のみが削除対象とならなかったため、依存度は１と算出される。
【００５７】
若しくは、削除対象にならなかった関数に戻り値が有ったり、引数の数が多いほどより依存しているとも考えられるため、モジュール間依存度算出部２５４は、「削除対象とならなかった関数の数＋削除対象とならなかった各関数の引数の数の合計＊２＋削除対象とならなかった関数のうち戻り値がある関数の数＋削除対象とならなかったグローバル変数の数」等の計算式によってモジュール間依存度を算出してもよい。
【００５８】
続いて、提示部２６は、算出されたモジュール間依存度を、表示部１３に表示（提示）する（ステップＳ１１１）。以上で、依存関係抽出処理は終了する。
【００５９】
（具体的なプログラムを用いた依存関係抽出処理の例）
続いて、より具体的なプログラム（ＩＰｖ６（Internet Protocol Version 6）による通信機能を有する通信装置に組み込まれるＵＤＰパケット通信用のプログラム）を対象に、上述した依存関係抽出処理について説明する。
【００６０】
始めに、ＵＤＰパケット通信用のプログラム（ＵＤＰパケット通信プログラム）によるパケット送信の処理（ＵＤＰパケット送信処理）の概要について、図９に示すフローチャートを参照して説明する。なお、ＵＤＰパケット送信処理は、通信装置の制御部がＵＤＰパケット通信プログラムを実行することによって行われる処理である。
【００６１】
ＵＤＰパケット送信プログラムが実行されると、通信装置の制御部は、自身のＭＡＣアドレスからリンクローカルアドレスを設定（生成）する（ステップＳ２０１）。
【００６２】
続いて、通信装置の制御部は、ローカルネットワーク内に対して近隣要請を送出し、設定したリンクローカルアドレスに重複が無いかどうかを検索する（ステップＳ２０２）。検索の結果、重複するリンクローカルアドレスがあると判別した場合（ステップＳ２０３；Ｙｅｓ）、同じアドレスを持つノードがネットワーク上に存在することがわかり、通信装置の制御部は、そのリンクローカルアドレスを無効に設定する（ステップＳ２０４）。
【００６３】
検索の結果、重複するリンクローカルアドレスがないと判別した場合（ステップＳ２０３；Ｎｏ）、又は、ステップＳ２０４の処理により重複するリンクローカルアドレスの無効の設定が完了した場合、通信装置の制御部は、設定したリンクローカルアドレスを送信元アドレスとして含むルータ要請メッセージをルータに送信する（ステップＳ２０５）。
【００６４】
続いて、通信装置の制御部は、ルータ要請メッセージを送信したルータからレスポンスとして受信したルータ広告に新規のプレフィックスが設定されているか否かを判別する（ステップＳ２０６）。
【００６５】
新規のプレフィックスが設定されていると判別した場合（ステップＳ２０６；Ｙｅｓ）、通信装置の制御部は、このプレフィックスを用いてＩｐｖ６グローバルアドレスを設定（生成）する（ステップＳ２０７）。
【００６６】
続いて、通信装置の制御部は、ネットワーク内に対して近隣要請を送出し、設定したＩｐｖ６グローバルアドレスに重複が無いかどうかを検索する（ステップＳ２０８）。検索の結果、重複するリンクローカルアドレスがあると判別した場合（ステップＳ２０９；Ｙｅｓ）、同じＩｐｖ６グローバルアドレスを持つノードがネットワーク上に存在することがわかり、通信装置の制御部は、そのＩｐｖ６グローバルアドレスを無効に設定する（ステップＳ２１０）。
【００６７】
検索の結果、重複するＩｐｖ６グローバルアドレスがないと判別した場合（ステップＳ２０９；Ｎｏ）、又は、ステップＳ２１０の処理によりＩｐｖ６グローバルアドレスの無効の設定が完了した場合、通信装置の制御部は、設定したＩｐｖ６グローバルアドレスを用いて、ＵＤＰパケットを送信先に送信する（ステップＳ２１１）。
【００６８】
一方、新規のプレフィックスが設定されていないと判別した場合（ステップＳ２０６；Ｎｏ）、通信装置の制御部は、既存のプレフィックスから既に設定されているＩｐｖ６グローバルアドレスを用いて、ＵＤＰパケットを送信先に送信する（ステップＳ２１１）。以上でＵＤＰパケット送信処理は終了する。
【００６９】
続いて、上述したＵＤＰパケット通信プログラムに対応するソースコードＳＣ１〜４を図１０〜図１３に示す。図１０に示すソースコードＳＣ１には、ＵＤＰパケット通信プログラムで最初に実行される関数「main()」が記載されている。ソースコードＳＣ１の７行目で関数「main()」から呼ばれる関数「com_init()」は、上述したＵＤＰパケット送信処理のステップＳ２０１〜ステップＳ２１０に対応する処理（起動時近隣探索）を実行するための関数である。また、１２行目の関数「send_udp()」は、ＵＤＰパケット送信処理のステップＳ２１１に対応する処理（ＵＤＰパケットの送信）を実行するための関数である。
なお、ＵＤＰパケットの送信処理とは別のタスクで受信処理を実行させるために、６行目の関数「start_task()」で、ＵＤＰパケットを受信した際の処理を行う関数「icmp6_input()」が別タスクとして実行される。
【００７０】
また、図１１に示すソースコードＳＣ２の３〜２８行目には、起動近接探索を行う関数「com_init()」が記載（定義）されている。また、ソースコードＳＣ２の３０〜４９行目には、関数「com_init()」のサブルーチンであり、ルータとの通信を行う関数「router_com()」が記載されている。
【００７１】
また、図１２に示すソースコードＳＣ３の３〜２７行目には、ＵＤＰパケットを受信した際の処理を行う関数「icmp6_input()」が記載（定義）されている。この関数「icmp6_input()」は、上述したように、ＵＤＰパケットの送信処理とは別タスクで実行される。なお、関数「icmp6_input()」が呼び出されるとき、受信バッファを示すグローバル変数「in_buf」には、受信したＵＤＰパケットが格納されているものとする。関数「icmp6_input()」は、受信したＵＤＰパケットの種別に応じて、必要な処理を実行させるための各種の関数を呼び出す。
【００７２】
また、図１３に示すソースコードＳＣ４の４〜８行目、１０〜１５行目、１７〜２９行目、及び、３１〜３５行目には、他の関数から呼ばれる関数「send_ns_dad()」、「send_rs()」、「send_na()」、及び、「send_echo_repl()」が記載（定義）されている。
【００７３】
続いて、上述したＵＤＰパケット通信プログラムを組み込み機器に移植する際に、「ネットワーク内でアドレスが重複することがないことを前提にアドレスを重複検索する機能を削除する開発」を行う必要があり、その開発作業を支援するために、上述したＵＤＰパケット通信プログラムを対象とした依存関係抽出処理を実行した場合について説明する。
【００７４】
この場合、まず、ステップＳ１０１（ソースコードの指定）では、図１０〜図１３に示すソースコードＳＣ１〜４が抽出される。
【００７５】
また、ステップＳ１０２（モジュールの指定）では、重複検索をする機能を削除する開発を支援するために行う処理であるため、重複検索に関する関数「send_ns_dad()」、「rcv_na_dad」、「detach_addr()」が第２のモジュールとして指定される。また、これらの関数を呼び出している関数「com_init()」が第１のモジュールとして指定される。即ち、図１４（Ａ）に示すように第１のモジュールと第２のモジュールとが指定される。
【００７６】
また、ステップＳ１０３（動作条件の指定）では、特に動作条件を指定しない「任意」が設定されたものとする。
【００７７】
続いて、ステップＳ１０４（共通参照情報抽出処理）が実行され、第１のモジュールと第２のモジュールとから共通に参照可能な関数とグローバル変数とが抽出される。図１１に示すソースコードＳＣ２の１０行目、１２行目、１３行目、２３行目、及び、２６行目の記載から、指定した動作条件下において、第１のモジュールに属する関数「com_init()」から第２のモジュールに属する関数「send_ns_dad()」、「rcv_na_dad(）」、「detach_addr()」が参照可能であることがわかる。従って、共通に参照される関数として、まずこれらの関数が抽出される。続いて、図１３に示すソースコードＳＣ４の４〜８行目の記載から、抽出した関数「send_ns_dad()」が関数「make_ns_dad_packet(）」、「icmp6_output」及びグローバル変数「out_buf」を参照することがわかるため、これらも抽出対象とする。従って、最終的に、共通参照情報抽出処理により、関数「send_ns_dad()」、「rcv_na_dad()」、「detach_addr()」、「make_ns_dad_packet(）」、「icmp6_output()」と、グローバル変数「out_buf」とが抽出される。そして、ステップＳ１０５（共通参照可能情報の表示）では、図７（Ｂ）に示すような共通参照情報提示画面が表示部１３に表示される。
【００７８】
続いて、ステップＳ１０６（削除対象の特定）が行われる。抽出された関数のうち、関数「icmp6_output()」は、図１３に示すソースコードＳＣ４の１３、２８、３４行目の記載から、モジュール１（関数「com_init()」）とモジュール２（関数「send_ns_dad()」、「rcv_na_dad」、「detach_addr()」）以外のモジュール（関数「send_rs()」と関数「send_na()」と関数「send_echo_repl()」）からも参照可能であることがわかるため、削除対象からは除外される。また、同じく抽出されたグローバル変数「out_buf」は、ソースコードＳＣ４の１２、２０行目の記載から、モジュール１とモジュール２以外のモジュール（関数「send_rs()」と関数「send_na()」）からも参照可能であることがわかるため、削除対象からは除外される。従って、最終的に、削除対象として、関数「send_ns_dad()」、「rcv_na_dad()」、「detach_addr()」、「make_ns_dad_packet(）」が特定される。
【００７９】
続いて、ステップＳ１０７（削除対象コードの表示）では、これらの削除対象として特定された関数とグローバル変数とがソースコード内で記載又は定義されている部分が削除可能部分として、図１５、図１６に示すように、点線で囲まれて表示される。
【００８０】
続いて、ステップＳ１１０（モジュール間依存度の算出）では、上述したように、抽出された関数及びグローバル変数のうち、関数「icmp6_output()」とグローバル変数「out_buf」が、削除対象から除外されている。従って、モジュール間依存度を削除対象とならなかった関数・グローバル変数の数とした場合、モジュール間依存度は２と算出され、ステップＳ１１１（モジュール間依存度の表示）で、算出したモジュール間依存度が表示される。
【００８１】
なお、関数「icmp6_output()」の引数は１つであり、戻り値は無い（void型）。従って、モジュール間依存度を「削除対象とならなかった関数の数＋削除対象とならなかった各関数の引数の数の合計＊２＋削除対象とならなかった関数のうち戻り値がある関数の数＋削除対象とならなかったグローバル変数の数」の計算式で算出した場合、モジュール間依存度は「１＋１＊２＋０＋１＝４」と算出され、ステップＳ１１１（モジュール間依存度の表示）で、算出したモジュール間依存度が表示される。
【００８２】
尚、上記の例（重複検索の送信）では、ステップＳ１０３(動作条件の指定)の処理において、特に動作条件を指定しなかった。これに対し、重複検索の受信では、ステップ１０２（モジュールの指定）で第１のモジュールに「icmp6_input()」、第２のモジュールに「send_na()」を指定し、ステップ１０３で、動作条件に変数ns_typeのとりうる値を「NS_AR」または「NS_NUD」と指定してもよい。なお、この動作条件は、「他の通信装置が送信した重複検査を受信しても処理しない」ことを意味する。このとき、図６に示したフロー図の処理に従うと、図１９の２０行目の「make_na_dad_packet()」が削除可能な関数となる。なお、上記重複検索受信処理においては、第２のモジュールの指定を、「変数ns_typeを参照する全てのモジュール」としてもよい。
【００８３】
続いて、ＵＤＰパケット通信プログラムを組み込み機器に移植する際に、「ルータを使用しない環境での使用を前提にルータ通信に関する機能を削除する開発」を行う必要があり、その開発作業を支援するために、上述したＵＤＰパケット通信プログラムを対象とした依存関係抽出処理を実行した場合について説明する。なお、重複検索する機能を削除する開発を支援する際に実行した依存関係抽出処理の説明と同じ処理については、適宜説明を省略する。
【００８４】
この場合、ステップＳ１０２（モジュールの指定）では、ルータ通信機能を削除する開発を支援するために行う処理であるため、ルータ通信に関する関数「router_com()」、「proc_ra()」が第２のモジュールとして指定される。また、これらの関数を呼び出している関数「com_init()」、「icmp6_input()」が第１のモジュールとして指定される。即ち、図１４（Ｂ）に示すように第１のモジュールと第２のモジュールとが指定される。
【００８５】
続いて、ステップＳ１０４（共通参照情報抽出処理）が実行される。図１１に示すソースコードＳＣ２の１６行目の記載から、指定した動作条件下において、第１のモジュールに属する関数「com_init()」から第２のモジュールに属する関数「router_com()」が参照可能であることがわかる。また、図１２に示すソースコードＳＣ３の１３行目の記載から、指定した動作条件下において、第１のモジュールに属する関数「icmp6_input()」から第２のモジュールに属する関数「proc_ra()」が参照可能であることがわかる。従って、共通に参照される関数として、まずこれらの関数「router_com()」、「proc_ra()」が抽出される。さらに、ソースコードＳＣ３の１３行目の記載から、抽出した関数「proc_ra()」がグローバル変数「in_buf」を参照することがわかるため、グローバル変数「in_buf」も抽出対象とする。続いて、図１１に示すソースコードＳＣ２の３５、３６、４２行目の記載から、抽出した関数「router_com()」が関数「send_rs()」、「proc_rs_reply()」とグローバル変数「retry_cnt」とを参照することがわかるため、これらも抽出対象とする。さらに、図１３に示すソースコードＳＣ４の１２、１３行目の記載から、抽出した関数「send_rs()」が、関数「make_rs_packet()」、「icmp6_output()」とグローバル変数「out_buf」とを参照することがわかるため、これらも抽出対象とする。従って、最終的に、共通参照情報抽出処理により、関数「router_com()」、「proc_ra()」、「send_rs()」、「proc_rs_reply()」、「make_rs_packet()」、「icmp6_output()」と、グローバル変数「in_buf」、「retry_cnt」、「out_buf」とが抽出される。そして、ステップＳ１０５（共通情報の表示）では、図７（Ｃ）に示すような共通参照情報提示画面が表示される。
【００８６】
続いて、ステップＳ１０６（削除対象の特定）が行われる。抽出された関数のうち、関数「icmp6_output()」は、図１３に示すソースコードＳＣ４の７、２８、３４行目の記載から、モジュール１（関数「com_init()」、「icmp6_input()」）とモジュール２（関数「router_com()」、「proc_ra()」）以外のモジュール（関数「send_ns_dad()」と関数「send_na()」と関数「send_echo_repl()」）からも参照可能であることがわかるため、削除対象からは除外される。また、同じく抽出されたグローバル変数「out_buf」は、ソースコードＳＣ４の６、２０行目の記載から、モジュール１とモジュール２以外のモジュール（関数「send_ns_dad()」と関数「send_na()」）からも参照可能であることがわかるため、削除対象からは除外される。また、同じく抽出されたグローバル変数「in_buf」は、図１２に示すソースコードＳＣ３の１８行目等の記載から、モジュール１とモジュール２以外のモジュール（関数「get_dst_addr()」等）からも参照可能であることがわかるため、削除対象からは除外される。従って、最終的に、削除対象として、関数「router_com()」、「proc_ra()」、「send_rs()」、「proc_rs_reply()」、「make_rs_packet()」とグローバル変数「retry_cnt」とが特定される。
【００８７】
続いて、ステップＳ１０７（削除対象コードの表示）では、これらの関数とグローバル変数とがソースコードＳＣ１〜ＳＣ４内で記載又は定義されている部分が、削除可能部分として、図１７〜図１９に示すように、点線で囲まれて表示される。
【００８８】
続いて、ステップＳ１１０（モジュール間依存度の算出）では、上述したように、抽出された関数及びグローバル変数のうち、関数「icmp6_output()」とグローバル変数「out_buf」、「in_buf」が、削除対象から除外されている。従って、モジュール間依存度を削除対象とならなかった関数・グローバル変数の数とした場合、モジュール間依存度は３と算出され、ステップＳ１１１（モジュール間依存度の表示）で、算出したモジュール間依存度が表示される。
【００８９】
なお、関数「icmp6_output()」は引数は１つであり、戻り値は無い（void型）。従って、モジュール間依存度を「削除対象とならなかった関数の数＋削除対象とならなかった各関数の引数の数の合計＊２＋削除対象とならなかった関数のうち戻り値がある関数の数＋削除対象とならなかったグローバル変数の数」の計算式で算出した場合、モジュール間依存度は「１＋１＊２＋０＋２＝５」と算出され、ステップＳ１１１（モジュール間依存度の表示）で、算出したモジュール間依存度が表示される。
【００９０】
このように、本実施形態によれば、指定されたデータの制限（動作条件）に基づいてソースコードの解析を行い、モジュール間で共通に参照される情報を抽出する。従って、プログラムが扱うデータ範囲に制限が加えられた場合であっても、モジュール間の依存関係を正確に抽出することができる。
【００９１】
また、既存のソフトウェア（プログラム）を組み込み機器に移植するために、組み込み機器のハードウェアリソースの制約に合致するように機能を削除する開発が一般的に行われている。このような場合、本実施形態に係るモジュール依存関係抽出装置１００を用いて、この制約を動作条件として指定し、削除する機能に対応するモジュールを依存関係を抽出するモジュール（第２のモジュール）に指定して依存関係抽出処理を行えば、削除する機能に関連する情報がユーザに提示することができる。従って、このような機能を削除する開発を行うユーザを、効率よく支援することが可能となる。
【００９２】
また、本実施形態では、指定された動作条件下で、第１のモジュールと第２のモジュールとから共通に参照可能な関数とグローバル変数とをユーザに提示する。従って、ユーザは、第１のモジュールと第２のモジュールとが、どのような情報を介して結びついているかを容易に確認することができるため、第２のモジュールを削除するような開発を支援することが可能となる。
【００９３】
また、本実施形態では、動作条件に基づいて、共通参照情報として抽出された関数及びグローバル変数のうち、削除可能な関数及びグローバル変数を特定して、ソースコードの他の部分と区別して表示する。従って、ユーザは、この表示を確認することにより、機能を削除する開発をする際に、ソースコードのどの部分を削除すればよいのかを容易に知ることができ、ユーザの開発作業を支援することが可能となる。
【００９４】
また、本実施形態では、表示した削除可能部分を実際に削除した場合に、削減できるハードウェアリソースの量を見積もって表示するため、ユーザに有意義な情報を提示して、ユーザの開発作業を支援することが可能となる。
【００９５】
また、本実施形態では、指定したモジュール間のモジュール間依存度を算出して表示するため、ユーザに有意義な情報を提示して、ユーザの開発作業を支援することが可能となる。
【００９６】
なお、本発明は、上記実施形態に限定されず、本発明の要旨を逸脱しない部分での種々の変更は勿論可能である。
【００９７】
例えば、上記実施形態では、モジュールから共通に参照される関数とグローバル変数とを抽出して表示したり、削除可能な関数とグローバル変数が記載されているソースコードの部分を表示した。しかしながら、関数のみ、又はグローバル変数のみを抽出して表示したり、関数のみ、又はグローバル変数のみを削除可能対象として表示してもよい。
【００９８】
また、上記実施形態では、図８等に示すように、ソースコード内で削除可能な部分を点線の囲みで表示したが、文字色や字体を他の部分と異ならせて表示してもよい。要するに、削除可能部分をソースコード内の他の部分と区別して表示できれば、任意の表示形態が採用可能である。
【００９９】
また、上記実施形態では、Ｃ言語で記載されているソースファイルを例にして主に説明したが、ＪＡＶＡ（登録商標）やＢＡＳＩＣ等の他のプログラム言語で記載されているソースファイルにも本願発明が適用できるのは勿論である。なお、その場合、それぞれの言語の文法に沿った手法でソースコードを解析して、関数やグローバル変数の抽出等の処理を行わなければならないのは勿論である。
【０１００】
また、例えば、本発明に係るモジュール間存関係抽出装置１００の動作を規定する動作プログラムを既存のパーソナルコンピュータや情報端末機器等に適用することで、当該パーソナルコンピュータ等を本発明に係るモジュール依存関係抽出装置１００として機能させることも可能である。
【０１０１】
また、このようなプログラムの配布方法は任意であり、例えば、ＣＤ−ＲＯＭ（Compact Disk Read-Only Memory）、ＤＶＤ（Digital Versatile Disk）、ＭＯ（Magneto Optical Disk）、メモリカードなどのコンピュータ読み取り可能な記録媒体に格納して配布してもよいし、インターネットなどの通信ネットワークを介して配布してもよい。
【符号の説明】
【０１０２】
１００ モジュール依存関係抽出装置
２１ ソースコード記憶部
２２ ソースコード取得部
２３ 対象モジュール指定部
２４ 動作条件指定部
２５ 依存関係抽出部
２５１ 共通参照情報抽出部
２５２ 削除対象特定部
２５３ 削除可能リソース見積部
２５４ モジュール間依存度算出部
２６ 提示部
【図１】
0005800724.tif 000002
【図２】
0005800724.tif 000003
【図３】
0005800724.tif 000004
【図４】
0005800724.tif 000005
【図５】
0005800724.tif 000006
【図６】
0005800724.tif 000007
【図７】
0005800724.tif 000008
【図８】
0005800724.tif 000009
【図９】
0005800724.tif 000010
【図１０】
0005800724.tif 000011
【図１１】
0005800724.tif 000012
【図１２】
0005800724.tif 000013
【図１３】
0005800724.tif 000014
【図１４】
0005800724.tif 000015
【図１５】
0005800724.tif 000016
【図１６】
0005800724.tif 000017
【図１７】
0005800724.tif 000018
【図１８】
0005800724.tif 000019
【図１９】
0005800724.tif 000020