以下、図面を参照して、実施形態について説明する。
図1は、本実施形態に係るコード読解支援装置の機能構成の一例を示すブロック図である。本実施形態に係るコード読解支援装置は、例えば複数のユーザ(作業者)によってソフトウェア製品の保守作業が行われるような環境において、特定のユーザが当該ソフトウェア製品を実現するためのソースコードを読解することを支援するために用いられる。
なお、コード読解支援装置10は、ソフトウェア製品の保守作業時にユーザによって使用されるパーソナルコンピュータ等の情報処理装置であり、統合開発環境(以下、IDEと表記)を当該ユーザに提供する。IDEは様々なツールの集合から構成されており、ユーザは、当該IDEを構成する様々なツールを用いて効率的なソフトウェア製品の保守作業等を行うことができる。
図1に示すように、コード読解支援装置10は、格納部11、操作受付部12、ソースコード編集部13、調査記録部14、調査頻度取得部15及び出力処理部16を含む。
格納部11には、例えばコード読解支援装置10を使用するユーザが読解すべき(つまり、内容を理解すべき)ソースコードが格納される。この格納部11に格納されているソースコードは、所定のプログラミング言語で記述され、複数の関数を含む。
なお、格納部11には、当該格納部11に格納されているソースコードに対する解析結果が更に格納されていてもよい。ソースコードに含まれる複数の関数には他の関数を呼び出す関数(以下、呼び出し元関数と表記)及び他の関数によって呼び出される関数(以下、呼び出し先関数と表記)が含まれるが、格納部11に格納されている解析結果には、格納部11に格納されているソースコードを構成する全ての関数を示す構成関数情報及び当該呼び出し元関数と呼び出し先関数との呼び出し関係を示す情報(以下、リンク情報と表記)等が含まれる。
構成関数情報には、ソースコードに含まれる複数の関数の各々を示す複数の関数情報(ノード情報)が含まれる。本実施形態における関数情報としては関数名等が用いられるが、当該関数情報は、関数を識別することができる情報であれば例えば当該関数に割り当てられた識別情報(ID)等であってもよい。また、リンク情報は、例えば呼び出し元関数を示す関数情報(以下、呼び出し元関数情報と表記)と、呼び出し先関数を示す関数情報(以下、呼び出し先関数情報と表記)とを対応づけて含むデータ構造を有する。
なお、上記した解析情報を得るためにはソースコードを解析する必要があるが、当該ソースコードの解析は、例えばIDEを構成するツールを用いて実行することができる。
操作受付部12は、コード読解支援装置10に対するユーザの各種操作(指示)を受け付ける機能を有する。
ソースコード編集部13は、格納部11に格納されているソースコードを表示し、操作受付部12によって受け付けられたユーザの操作に従って、当該ソースコードを編集する機能を有する。
調査記録部14は、ソースコード編集部13によって表示されたソースコードに対する読解において、当該ソースコードに含まれる複数の関数のうちユーザが調査した関数を示す関数情報を、操作受付部12によって受け付けられたユーザの操作に基づいて特定する。調査記録部14は、特定された関数情報を調査記録テーブルに記録する(保持させる)。なお、関数情報が記録された調査記録テーブルは、例えば格納部11に格納される。すなわち、調査記録部14は、ユーザによるソースコードの読解において当該ユーザが調査した関数(統計データ)を記録するための機能部である。
調査頻度取得部15は、ユーザが格納部11に格納されているソースコードを読解する場合に、調査記録テーブルに保持されている関数情報を参照して、例えば他のユーザが調査した関数毎の頻度を示す調査頻度情報を取得する。
出力処理部16は、調査頻度取得部15によって取得された調査頻度情報を出力する。このように出力処理部16によって出力された調査頻度情報は、ソースコードを読解するユーザによって参照される。
すなわち、上記した調査頻度取得部15及び出力処理部16は、ユーザによるソースコードの読解を支援するための機能部である。
なお、出力処理部16は、調査頻度情報を、上記したソースコードの解析結果(構成関数情報及びリンク情報)とともに出力してもよい。
図2は、図1に示すコード読解支援装置10のシステム構成の一例を示す。図2に示すように、コード読解支援装置10は、CPU101,不揮発性メモリ102、主メモリ103,BIOS-ROM104、システムコントローラ105、入力デバイス106、表示デバイス107及びエンベデッドコントローラ(EC)108等を備える。
CPU101は、コード読解支援装置10内の各コンポーネントの動作を制御するプロセッサである。CPU101は、ストレージデバイスである不揮発性メモリ102から主メモリ103にロードされる様々なプログラムを実行する。このプログラムには、オペレーティングシステム(OS)、ユーザに対してIDEを提供するためのアプリケーションプログラム及び当該アプリケーションプログラム(ツール)に組み込まれるプラグイン等が含まれる。
なお、CPU101は、BIOS-ROM14に格納された基本入出力システム(BIOS)も実行する。BIOSは、ハードウェア制御のためのプログラムである。
システムコントローラ105は、CPU101のローカルバスと各種コンポーネントとの間を接続するデバイスである。
入力デバイス106は、例えばキーボード及びマウス等を含む。表示デバイス107は、例えば液晶表示装置のようなディスプレイ等を含む。EC108は、電力管理のためのワンチップマイクロコンピュータである。
図2においては、CPU101、不揮発性メモリ102、主メモリ103、BIOS-ROM104、システムコントローラ105、入力デバイス106、表示デバイス107及びEC108のみが示されているが、コード読解支援装置10は、例えばHDD(Hard Disk Drive)及びSSD(Solid State Drive)のような他の記憶装置を備えていてもよいし、外部装置との通信を実行するように構成された通信デバイス等を備えていてもよい。
なお、本実施形態において、上記した図1に示す格納部11は、例えば図2に示す不揮発性メモリ102または他の記憶装置等によって実現される。
また、図1に示す各部12~16の一部または全ては、例えば図2に示すCPU101(つまり、コード読解支援装置10のコンピュータ)にIDEを提供するためのアプリケーションプログラム及び当該アプリケーションプログラムに組み込まれるプラグインを実行させること、すなわちソフトウェアによって実現されるものとする。具体的には、例えば操作受付部12及びソースコード編集部13は、IDEによって提供される機能部(ツール)に相当するが、調査記録部14、調査頻度取得部15及び出力処理部16は、例えばプラグイン(機能拡張用のソフトウェア)によって実現される機能部である。
ここでは、各部12~16の一部または全てがソフトウェアによって実現されるものとして説明したが、当該各部12~16の一部または全ては、例えばハードウェアによって実現されてもよいし、ソフトウェア及びハードウェアの組み合わせによって実現されてもよい。
以下、本実施形態に係るコード読解支援装置10の動作について説明する。ここでは、ユーザが調査した関数を記録する処理(以下、調査記録処理と表記)及びユーザによるソースコードの読解を支援するために調査頻度情報を出力する処理(以下、調査頻度出力処理と表記)について主に説明する。
まず、図3のフローチャートを参照して、調査記録処理の処理手順の一例について説明する。なお、調査記録処理は上記したようにユーザが調査した関数を記録する処理であるが、ここでは、当該関数を調査するユーザを、便宜的に、第1ユーザと称する。
第1ユーザが調査する関数を記録する場合、当該第1ユーザは、例えば上記した格納部11に格納されているソースコード(以下、対象ソースコードと表記)が例えば表示デバイス107に表示された状態で、当該調査の記録を開始する操作(以下、記録開始操作と表記)を行う。これによれば、第1ユーザによって行われた記録開始操作が操作受付部12によって受け付けられる(ステップS1)。
ここで、一般に対象ソースコードは複数の機能を実現するように記述されているが、第1ユーザは、当該対象ソースコードの読解において、特定の機能を実現する関数を調査する場合が多い。このため、対象ユーザは、記録開始操作を行う際に、上記した複数の機能のうち調査の対象となる機能(以下、調査対象機能と表記)を指定するものとする。すなわち、ステップS1において、操作受付部12は、記録開始操作(に基づく第1ユーザの指示)を受け付けるとともに、当該記録開始操作を行う際に指定された調査対象機能を示す機能情報を取得する。
ステップS1の処理が実行されると、図4に示すようにコード読解支援装置10の動作モードは、待機モードから調査記録モードに遷移する。
次に、調査記録部14は、操作受付部12によって取得された機能情報を調査記録テーブルに設定し、空の関数リストを生成する(ステップS2)。なお、空の関数リストは、関数情報が登録(追加)されていないリストである。
ステップS2の処理が実行されると、第1ユーザは表示デバイス107に表示された対象ソースコードを読解するが、当該対象ソースコードが読解されている間に当該第1ユーザの操作(イベント)が操作受付部12によって受け付けられた場合を想定する。
この場合、操作受付部12によって受け付けられた操作が調査の記録を終了する操作(以下、記録終了操作と表記)であるか否かが判定される(ステップS3)。
記録終了操作でないと判定された場合(ステップS3のNO)、操作受付部12によって受け付けられた操作は、関数表示操作であるものとする。関数表示操作は、対象ソースコードの読解において第1ユーザが調査する関数(対象ソースコードに含まれる複数の関数のうちの少なくとも1つ)を表示するための操作である。
この関数表示操作が操作受付部12によって受け付けられた場合、ソースコード編集部13は、当該関数表示操作に基づいて対象ソースコードに含まれる複数の関数のうちの少なくとも1つ(以下、調査対象関数と表記)を表示デバイス107に表示する。
なお、関数表示操作は、例えば関数名等を指定することによって当該関数名に該当する関数を検索し、当該検索された関数が記述された箇所を表示させる操作(以下、関数検索操作と表記)及び現在表示されている関数(呼び出し元関数)内に記述されている他の関数(呼び出し先関数)を指定することによって、当該他の関数が定義されている箇所を表示させる操作(以下、ジャンプ操作と表記)等を含むが、所定の関数を表示させる操作であれば他の操作であってもよい。
この場合、調査記録部14は、上記した関数表示操作に応じて表示デバイス107に表示された調査対象関数(つまり、第1ユーザが調査した関数)をステップS2において生成された関数リストに追加するか否かを判定する(ステップS4)。ステップS4においては、調査対象関数(を示す関数情報)が既に関数リスト内に存在する場合には、当該調査対象関数を関数リストに追加しないと判定する。一方、調査対象関数(を示す関数情報)が関数リスト内に存在しない場合には、当該調査対象関数を関数リストに追加すると判定する。
すなわち、本実施形態においては、例えば1回の読解(保守作業)において調査対象関数が複数回調査された(つまり、関数表示操作に応じて表示された)されたとしても、当該調査対象関数を示す関数情報は、一度しか関数リストに追加されないものとする。ただし、調査対象関数が複数回調査されたことを頻度情報に反映する場合には、当該調査対象関数を示す関数情報が複数回関数リストに追加されるようにしてもよい。
調査対象関数を関数リストに追加すると判定された場合(ステップS4のYES)、調査記録部14は、当該調査対象関数を示す関数情報(ノード情報)を当該関数リストに追加する(ステップS5)。
ステップS5の処理が実行されると、ステップS3に戻って処理が繰り返される。なお、ステップS4において調査対象関数を関数リストに追加しないと判定された場合(ステップS4のNO)、ステップS5の処理は実行されず、ステップS3に戻って処理が繰り返される。
一方、記録終了操作であると判定された場合(ステップS3のYES)、図4に示すようにコード読解支援装置10の動作モードは、調査記録モードから待機モードに遷移する。これにより、調査記録部14は、上記したように繰り返し実行されるステップS5において第1ユーザが調査した関数の各々を示す関数情報が追加された関数リストを調査記録テーブルに記録(登録)する(ステップS6)。なお、ステップS6において、関数リストは、上記したステップS2において設定された機能情報に対応づけて調査記録テーブルに記録される。
上記した調査記録処理によれば、第1ユーザが対象ソースコードを読解した際に調査した関数(を示す関数情報)の履歴を調査記録テーブルに記録しておくことができる。
なお、図5は、上記した図3に示す調査記録処理が実行されることによって関数リスト(関数情報)が記録された調査記録テーブルのデータ構造の一例を示す。
図5に示す例によれば、調査記録テーブルには、機能情報「機能1」に対応づけて関数リスト「func1、func3」が保持(記録)されていることが示されている。この関数リストに含まれる「func1」及び「func3」は、それぞれ第1ユーザが調査した関数を示す関数情報に相当する。
すなわち、このような調査記録テーブルによれば、上記した第1ユーザが機能情報「機能1」によって示される機能1を指定して対象ソースコードに含まれる関数情報「func1」及び「func3」の各々によって示される関数を調査したことが示されている。
なお、図5には、第1ユーザが対象ソースコードに対する一度の読解において調査した関数を示す関数情報(関数リスト)のみが示されているが、上記した機能情報及び関数リストを対応づけて含む情報(以下、調査記録情報と表記)は、当該第1ユーザがソースコードの読解を行う(つまり、図3に示す処理が実行される)度に調査記録テーブルに追加される。なお、ソースコードの読解が第1ユーザ以外の複数のユーザの各々によって行われた場合についても同様である。
これによれば、例えば複数のユーザが同一のソースコードの読解を行う(つまり、保守作業を行う)ような場合において、当該ソースコードの読解において各ユーザが調査した関数の履歴(調査記録情報)を調査記録テーブルに蓄積しておくことができる。
次に、図6のフローチャートを参照して、調査頻度出力処理の処理手順の一例について説明する。ここでは、例えば複数のユーザの各々が上記した対象ソースコードの読解を行うことによって上記した図3に示す調査記録処理が繰り返し実行され、複数の調査記録情報が既に調査記録テーブルに記録(保持)されているものとする。
ここで、上記した第1ユーザ以外のユーザ(以下、第2ユーザと表記)が上記した対象ソースコードの読解を行う場合を想定する。この場合において、第2ユーザが対象ソースコードの内容を理解することが困難である場合、当該第2ユーザは、対象ソースコードの読解を支援するための調査頻度情報を表示(出力)させる操作(以下、調査頻度表示操作と表記)を行う。これによれば、第2ユーザによって行われた調査頻度表示操作が操作受付部12によって受け付けられる(ステップS11)。
ここで、第2ユーザが読解する対象ソースコードが上記したように複数の機能を実現するように記述されている場合、第2ユーザは、調査頻度情報の表示の対象となる機能(以下、表示対象機能)を指定するものとする。すなわち、ステップS11において、操作受付部12は、調査頻度表示操作(に基づく第2ユーザの指示)を受け付けるとともに、当該調査頻度表示操作を行う際に指定された表示対象機能を示す機能情報を取得する。
ステップS11の処理が実行されると、調査頻度取得部15は、空の関数頻度リストを生成する(ステップS12)。なお、空の関数頻度リストとは、関数情報及び頻度情報が登録(追加)されていないリストである。
次に、上記した図3に示す処理が繰り返し実行されることによって調査記録テーブルに記録(蓄積)された調査記録情報の各々について、以下のステップS13~S20の処理が実行される。
まず、調査頻度取得部15は、調査記録テーブルに記録されている調査記録情報のうちの1つを取得する(ステップS13)。ステップS13において取得された調査記録情報を便宜的に対象調査記録情報と称する。
ここで、対象調査記録情報には機能情報及び関数リストが対応づけて含まれているが、調査頻度取得部15は、当該機能情報(以下、第1機能情報と表記)と上記した表示対象機能(第2ユーザによって指定された機能)を示す機能情報(以下、第2機能情報と表記)とが一致するか否かを判定する(ステップS14)。
第1機能情報と第2機能情報とが一致しないと判定された場合(ステップS14のNO)、後述するステップS21の処理が実行される。
一方、第1機能情報と第2機能情報とが一致すると判定された場合(ステップS14のYES)、調査頻度取得部15は、第1機能情報に対応づけて対象調査記録情報に含まれている関数リスト中の関数情報の各々について、以下のステップS15~S19の処理が実行される。
まず、調査頻度取得部15は、対象調査記録情報に含まれる関数リスト中の関数情報のうちの1つを取得する(ステップS15)。ステップS15において取得された関数情報を便宜的に対象関数情報と称する。
次に、調査頻度取得部15は、対象関数情報がステップS12において生成された関数頻度リストに存在する(つまり、対象関数情報が既に関数頻度リストに登録されている)か否かを判定する(ステップS16)。
対象関数情報が関数頻度リストに存在しないと判定された場合(ステップS16のNO)、調査頻度取得部15は、当該対象関数情報を関数頻度リストに追加する(ステップS17)。
ここで、関数頻度リストは関数情報(によって示される関数)毎に当該関数が調査された頻度(回数)を管理するためのリストであり、当該関数頻度リストにおいては、関数情報に対応づけて頻度情報が保持される。このため、調査頻度取得部15は、関数情報に対応づけられる頻度情報(によって示される頻度)「1」を関数頻度リストに設定する(ステップS18)。
一方、対象関数情報が関数頻度リストに存在すると判定された場合(ステップS16のYES)、調査頻度取得部15は、当該対象関数情報に対応づけて関数頻度リストに保持されている頻度情報によって示される頻度に1を加算する(ステップS19)。
ステップS18またはS19の処理が実行されると、対象調査記録情報に含まれる関数リスト中の全ての関数情報について上記したステップS15以降の処理が実行されたか否かが判定される(ステップS20)。
全ての関数情報について処理が実行されていないと判定された場合(ステップS20のNO)、ステップS15に戻って処理が繰り返される。なお、この場合におけるステップS15においては、当該ステップS15以降の処理が実行されていない関数情報が取得される。
一方、全ての関数情報について処理が実行されたと判定された場合(ステップS20のYES)、調査記録テーブルに保持されている全ての調査記録情報について上記したステップS13以降の処理が実行されたか否かが判定される(ステップS21)。
全ての調査記録情報について処理が実行されていないと判定された場合(ステップS21のNO)、ステップS13に戻って処理が繰り返される。なお、この場合におけるステップS13においては、当該ステップS13以降の処理が実行されていない調査記録情報が取得される。
一方、全ての調査記録情報について処理が実行されたと判定された場合(ステップS21のYES)、調査頻度取得部15は、上記した関数情報及び頻度情報を対応づけて保持する関数頻度リストに第2機能情報(第2ユーザによって指定された表示対象機能を示す機能情報)を付加した調査頻度情報を取得する(ステップS22)。
ステップS22の処理が実行されると、出力処理部16は、当該ステップS22において取得された調査頻度情報を出力する(ステップS23)。この場合、調査頻度情報は、例えば表示デバイス107等に表示されればよいが、コード読解支援装置10の外部のサーバ装置等に出力(送信)されてもよい。
上記した調査頻度出力処理によれば、表示対象機能を調査対象機能として指定して複数のユーザが調査した関数毎の頻度を示す頻度情報を取得(つまり、表示対象機能に対応づけて調査記録テーブルに保持されている関数情報に基づいて調査頻度情報を取得)し、第2ユーザによる読解を支援するために当該頻度情報を出力(表示)することができる。
なお、図7は、上記した図6に示す調査頻度出力処理が実行されることによって出力される(つまり、調査頻度取得部15によって取得される)調査頻度情報のデータ構造の一例を示す。
図7に示すように、調査頻度情報は上記した関数情報及び頻度情報を対応づけて含む関数頻度リストを含み、当該関数頻度リストには機能情報が付されている(紐づけられている)。
図7に示す例では、機能1を調査の対象として、複数のユーザが関数情報「func1」によって示される関数を1回調査し、関数情報「func3」によって示される関数を2回調査したことが示されている。
このような調査頻度情報によれば、第2ユーザは、機能1を実現するために記述された対象ソースコードを読解する場合に、主に関数情報「func1」によって示される関数及び関数情報「func3」によって示される関数を調査する必要があることを容易に理解することができる。
ここで、上記した図6においては単に調査頻度情報を出力する場合について説明したが、当該調査頻度情報は、例えば格納部11に格納されている対象ソースコードの解析結果とともに表示するような構成としてもよい。
以下、図8のフローチャートを参照して、調査頻度情報を対象ソースコードの解析結果とともに表示する際の処理手順の一例について説明する。なお、図8に示す処理は、例えば図6に示すステップS22の処理が実行された(つまり、調査頻度情報が取得された)後に実行されるものとする。換言すれば、図8に示す処理は、図6に示すステップS23の処理の代わりに実行されてもよいし、当該ステップS23の処理とともに実行されてもよい。
ここで、格納部11に格納されている対象ソースコードの解析結果には、上記したように構成関数情報及びリンク情報が含まれる。
この場合、出力処理部16は、対象ソースコードの解析結果に含まれる構成関数情報の全てを所定の領域にコピーし、当該構成関数情報に含まれる関数情報の各々について以下のステップS31~S34の処理を実行する。
まず、出力処理部16は、構成関数情報に含まれる複数の関数情報のうちの1つを取得する(ステップS31)。ステップS31において取得された関数情報を便宜的に対象関数情報と称する。
次に、出力処理部16は、対象関数情報が調査頻度情報に含まれる関数頻度リストに存在するか否かを判定する(ステップS32)。
対象関数情報が関数頻度リストに存在すると判定された場合(ステップS32のYES)、出力処理部16は、当該対象関数情報に対応づけて関数頻度リストに保持されている頻度情報を、上記したようにコピーされた構成関数情報に含まれる対象関数情報に対して設定する(ステップS33)。
一方、対象関数情報が関数頻度リストに存在しないと判定された場合(ステップS32のNO)、出力処理部は、頻度情報「0」を、コピーされた構成関数情報に含まれる対象関数情報に対して設定する(ステップS34)。
ステップS33またはS34の処理が実行されると、構成関数情報に含まれる全ての関数情報について上記したステップS31以降の処理が実行されたか否かが判定される(ステップS35)。
全ての関数情報について処理が実行されていないと判定された場合(ステップS35のNO)、ステップS31に戻って処理が繰り返される。なお、この場合におけるステップS31においては、当該ステップS31以降の処理が実行されていない関数情報が取得される。
一方、全ての関数情報について処理が実行されたと判定された場合(ステップS35のYES)、出力処理部16は、上記したように頻度情報が設定された関数情報(以下、調査頻度付き関数情報と表記)及びリンク情報を出力する(ステップS36)。これによれば、第2ユーザは、対象ソースコードに含まれる関数情報の各々によって示される関数が調査された頻度を把握するとともに、当該関数間の呼び出し関係をも把握することができる。
なお、第2ユーザによる視認性を向上させるために、上記した調査頻度付き関数情報及びリンク情報は対象ソースコードに含まれる複数の関数間の呼び出し関係を表す図(以下、コールフロー図と表記)の形式で出力(表示)されてもよい。
以下、上記した本実施形態に係るコード読解支援装置10の動作について具体的に説明する。まず、上記した調査記録処理の具体例について説明する。
ここで、図9は、ユーザが対象ソースコードを読解する際にコード読解支援装置10の表示デバイス107に表示される画面(以下、単にコード読解支援装置10の表示画面と表記)の一例を示す。
図9に示す例では、コード読解支援装置10の表示画面には、ソースコード表示(編集)領域107a、記録開始ボタン107b、記録終了ボタン107c及び調査頻度表示ボタン107dが設けられている。
ソースコード表示領域107aは、上記した対象ソースコード(つまり、格納部11に格納されているソースコード)を表示するための領域である。コード読解支援装置10を使用するユーザは、当該コード読解支援装置10(の入力デバイス106)を操作することによって、ソースコード表示領域107aに表示された対象ソースコードを編集することができる。
なお、上記した関数検索操作及びジャンプ操作等を含む関数表示操作は、ソースコード表示領域107a(に表示された対象ソースコード)上で行うことが可能である。
記録開始ボタン107bは、調査の記録を開始するためのボタンである。すなわち、この記録開始ボタン107bを押下(指定)する操作は、上記した図3において説明した記録開始操作に相当する。
記録終了ボタン107cは、調査の記録を終了するためのボタンである。すなわち、この記録終了ボタン107cを押下(指定)する操作は、上記した図3において説明した記録終了操作に相当する。
調査頻度表示ボタン107dは、調査頻度(情報)を表示(出力)するためのボタンである。すなわち、この調査頻度表示ボタン107dを押下(指定)する操作は、上記した図6において説明した調査頻度表示操作に相当する。
ここで、図9に示す表示画面には、第1機能指定領域107e及び第2機能指定領域107fが更に設けられている。
第1機能指定領域107eは、記録開始操作を行う際にユーザが機能(調査対象機能)を指定するための領域である。この第1機能指定領域107eにおいて調査対象機能を指定して記録開始操作(つまり、記録開始ボタン107bを押下する操作)を行うことによって、調査の記録を開始する指示に付随する調査対象機能を示す機能情報が操作受付部12によって取得される。
第2機能指定領域107fは、調査頻度表示操作を行う際にユーザが機能(表示対象機能)を指定するための領域である。この第2機能指定領域107fにおいて表示対象機能を指定して調査頻度表示操作(つまり、調査頻度表示ボタン107dを押下する操作)を行うことによって、調査頻度(情報)を表示する指示に付随する表示対象機能を示す機能情報が操作受付部12によって取得される。
なお、第1機能指定領域107e及び第2機能指定領域107fにおいて指定される機能とは、例えば図10に示すようなシステム仕様書(対象ソースコードによって実現されるシステムの仕様書)に記載されている各項目(ソフトウェア製品が有する機能名)に相当するものとする。第1機能指定領域107e及び第2機能指定領域107fにおいて機能が指定される場合、例えば当該機能の機能名等(機能情報)が第1機能指定領域107e及び第2機能指定領域107fに直接入力されればよい。なお、コード読解支援装置10の表示デバイス107に上記したシステム仕様書を表示し、当該システム仕様書に記載されている項目の中から所望の機能(を示す機能情報)を選択させるようなユーザインタフェース(UI)をユーザに対して提供するような構成であってもよい。
ここで、上記した調査記録処理においては上記したコード読解支援装置10の表示画面に対するユーザの操作に応じて調査記録テーブルに調査記録情報(機能情報及び関数リスト)が保持されるが、以下、ユーザの操作に応じて調査記録テーブルに保持される調査記録情報の具体例について説明する。
まず、図11は、ユーザAによって行われる操作の一例を示している。図11に示す例によれば、ユーザAは記録開始ボタン107bを押下する操作(つまり、記録開始操作)行っているが、この際に第1機能指定領域107eにおいて機能1が指定されていることにより、当該機能1を示す機能情報「機能1」が記録開始操作に付随する付随データとして取得される。
上記したユーザAの記録開始操作が受け付けられることによりコード読解支援装置10の動作モードが待機モードから調査記録モードに遷移した場合、機能1を示す機能情報「機能1」が調査記録テーブルに設定されるとともに、空の関数リストが生成される。
ここで、ユーザAがソースコード表示領域107aにおいて関数検索操作を行い、関数func1を検索した(つまり、関数func1を当該ソースコード表示領域107aに表示させた)場合を想定する。この場合、関数func1を示す関数情報「func1」が関数検索操作に付随する付随データとして取得され、当該関数情報「func1」が上記した関数リストに追加される。
更に、ユーザAがソースコード表示領域107aにおいてジャンプ操作を行い、関数func1から関数func3にジャンプした(つまり、関数func3を当該ソースコード表示領域107aに表示させた)場合を想定する。この場合、関数func3を示す関数情報「func3」が関数リストに追加される。なお、このようなジャンプ操作が行われた場合の付随データは関数情報「func1」及び「func3」であるが、関数情報「func1」については既に関数リストに追加されているため、ここでは関数情報「func3」のみが関数リストに追加される。
次に、ユーザAによって記録終了ボタン107cを押下する操作(つまり、記録終了操作)が行われたものとすると、上記した機能1を示す機能情報「機能1」に対応づけて関数情報「func1」及び「func3」が追加された関数リスト(つまり、機能情報「機能1」及び関数リスト「func1、func3」を含む調査頻度情報)が調査記録テーブルに記録される。
図11に示す操作がユーザAによって行われた場合(つまり、ユーザAによる読解が行われた場合)には、上記した図5に示す調査記録テーブルを得ることができる。
なお、ここでは詳細な説明を省略するが、図11に示す操作がユーザAによって行われた後に例えばユーザBによって図12に示す操作が行われた場合(つまり、ユーザBによる読解が行われた場合)には、図5に示す調査記録テーブルは、図13に示す調査記録テーブルに更新される。更に、図12に示す操作がユーザBによって行われた後に例えばユーザCによって図14に示す操作が行われた場合(つまり、ユーザCによる読解が行われた場合)には、図13に示す調査記録テーブルは、図15に示す調査記録テーブルに更新される。
このように本実施形態においては、複数のユーザの各々が対象ソースコードを読解する度に当該ユーザの各々によって調査された関数を含む関数リストを機能情報(ユーザによって指定された調査対象機能)に対応づけて蓄積することができる。
次に、図16を参照して、調査頻度出力処理の具体例について説明する。ここでは、格納部11に図15に示す調査記録テーブルが既に格納されているものとする。なお、図16に示す説明において、調査記録テーブルには、調査記録情報111~113が保持されている。調査記録情報111は、上記したユーザAの操作に応じて調査記録テーブルに記録された調査記録情報である。また、調査記録情報112は、上記したユーザBの操作に応じて調査記録テーブルに記録された調査記録情報である。また、調査記録情報113は、上記したユーザCの操作に応じて調査記録テーブルに記録された調査記録情報である。
ここで、例えばユーザDによって、第2機能指定領域107fにおいて機能1が表示対象機能として指定され、調査頻度表示ボタン107dを押下する操作が行われた場合を想定する。
この場合、空の関数頻度リスト200が生成され、調査記録テーブルに記録されている調査記録情報111~113の各々について、図6に示すステップS13~S20の処理が実行される。
まず、調査記録情報111について処理が実行された場合、当該調査記録情報111に含まれる機能情報「機能1」によって示される機能1は、上記した第2機能指定領域107fにおいてユーザDによって指定された機能1と一致する。
この場合、調査記録情報111に含まれる関数情報「func1」及び「func3」を関数頻度リスト200に追加するとともに、当該関数情報の各々に対応づけて頻度情報「1」を設定する(ステップS41)。これにより、空の関数頻度リスト200は、関数頻度リスト201に更新される。
次に、調査記録情報112について処理が実行された場合、当該調査記録情報112に含まれる機能情報「機能2」によって示される機能2は、上記した第2機能指定領域107fにおいてユーザDによって指定された機能1と一致しないため、関数頻度リスト201は更新されない(ステップS42)。
更に、調査記録情報113について処理が実行された場合、当該調査記録情報113に含まれる機能情報「機能1」によって示される機能1は、上記した第2機能指定領域107fにおいてユーザDによって指定された機能1と一致する。
この場合、調査記録情報113に含まれる関数情報「func3」に対応づけて関数頻度リスト201に保持されている頻度情報によって示される頻度に1を加算する(ステップS42)。これにより、関数頻度リスト201は、関数頻度リスト202に更新される。
上記したように図15に示す調査記録テーブルに対して調査頻度出力処理が実行された場合には、関数頻度リスト202に機能1(対象機能)を示す機能情報「機能1」が付加された調査頻度情報を取得することができる。
このような調査頻度情報が出力された場合、ユーザDは、機能1に関して対象ソースコードを読解する際には関数情報「func1」によって示される関数func1及び関数情報「func3」によって示される関数func3を調査することが効率的であると容易に把握することができる。
次に、調査頻度情報を対象ソースコードの解析結果とともに表示する際の処理の具体例について説明する。
まず、図17及び図18を参照して、対象ソースコード及び当該対象ソースコードの解析結果の具体例について説明する。図17は対象ソースコードの一例を示してしおり、図18は当該対象ソースコードの解析結果(構成関数情報及びリンク情報)を示している。
ここで、図17に示す対象ソースコードには、関数func1~関数func5が記述されている(つまり、対象ソースコードは関数func1~関数func5から構成されている)。このため、図18に示す構成関数情報には、関数情報「func1」、「func2」、「func3」、「func4」及び「func5」が含まれている。
また、図17に示す対象ソースコードにおいては、関数func1内に関数func2及びfunc3が記述されている。この場合、関数func1は呼び出し元関数であり、関数func2及びfunc3は呼び出し先関数であり、関数func1と関数func2及びfunc3とは呼び出し関係がある。
同様に、対象ソースコードにおいては、関数func2内に関数func4及びfunc5が記述されている。この場合、関数func2は呼び出し元関数であり、関数func4及びfunc5は呼び出し先関数であり、関数func2と関数func4及びfunc5とは呼び出し関係がある。
更に、対象ソースコードにおいては、関数func3内に関数func4が記述されている。この場合、関数func3は呼び出し元関数であり、関数func4は呼び出し先関数であり、関数func3と関数func4とは呼び出し関係がある。
図18に示すリンク情報は、上記した呼び出し関係を示している。例えばリンク情報において対応づけられている呼び出し元関数情報「func1」及び呼び出し先関数情報「func2」は、関数func1が呼び出し元関数であり、関数func2が呼び出し先関係であり、当該関数func1と関数func2との間に呼び出し関係があることを示している。なお、リンク情報によって示される他の呼び出し関係についての説明は省略する。
ここで、IDEを構成するツール(例えば、コールフロー作成ツール)によれば、上記した対象ソースコードの解析結果(構成関数情報及びリンク情報)を用いて図19に示すようなコールフロー図(複数の関数間の呼び出し関係を表す図)を生成して出力(表示)することが可能であるが、本実施形態においては、このようなコールフロー図に上記した調査頻度情報を付して出力する。以下、本実施形態において調査頻度情報を付して出力されるコールフロー図を便宜的に調査頻度付きコールフロー図と称する。
図20は、調査頻度付きコールフロー図を出力するための処理を具体的に説明するための図である。ここでは、図16において説明した調査頻度情報と図18に示す構成関数情報及びリンク情報(対象ソースコードの解析結果)とを用いて調査頻度付きコールフロー図が出力される場合について説明する。
まず、対象ソースコードの解析結果に含まれる構成関数情報が所定の領域にコピーされる(ステップS51)。
次に、コピーされた構成関数情報に含まれる関数情報のうち、調査頻度情報に含まれる関数頻度リストに存在する関数情報に対して頻度情報を設定する。
図20に示す例によれば、関数情報「func1」は関数頻度リストに存在するため、当該関数情報「func1」に対して、当該関数頻度リストにおいて関数情報「func1」に対応づけて保持されている頻度情報「1」を設定する(ステップS52)。
同様に、関数情報「func3」は関数頻度リストに存在するため、当該関数情報「func3」に対して、当該関数頻度リストにおいて関数情報「func3」に対応づけて保持されている頻度情報「2」を設定する(ステップS53)。
なお、コピーされた構成関数情報に含まれる関数情報のうち、関数頻度リストに存在しない関数情報に対しては頻度情報「0」が設定される。
本実施形態においては、このような対象ソースコードを構成する全ての関数の各々を示す関数情報に対して頻度情報が設定された構成関数情報(調査頻度付き関数情報)と上記したリンク情報とを用いることによって、図21に示すような調査頻度付きコールフロー図を表示することができる。このような調査頻度付きコールフロー図においては、対象ソースコードを構成する関数を表すノードの近傍に当該関数(を示す関数情報)に対して設定された頻度情報(によって示される頻度)が表示されるため、各関数の調査頻度を関数間の呼び出し関係を考慮して把握することができる。
ここでは、ユーザA~Cによって記録開始操作が行われた後にユーザDによって調査頻度表示操作が行われる場合について説明したが、調査頻度表示操作は、ユーザA~Cのうちの1人のユーザ(つまり、過去に調査の記録を行ったユーザ)によって行われてもよい。また、記録開始操作(つまり、対象ソースコードに含まれる関数に対する調査の記録)は同一のユーザによって繰り返し行われてもよい。
上記したように本実施形態においては、ソースコードに含まれる複数の関数のうち第1ユーザが調査した関数を示す関数情報が当該第1ユーザの操作に基づいて特定され、当該特定された関数情報は調査記録テーブルに保持される。また、本実施形態においては、第2ユーザがソースコード読解する場合に、調査記録テーブルに保持されている関数情報を参照して、第1ユーザが調査した関数毎の頻度を示す調査頻度情報を取得し、当該取得された調査頻度情報を出力(表示)する。
このような構成によれば、第2ユーザはソースコードを読解する際に、例えば過去に他のユーザが調査した関数の頻度を当該ユーザの調査の傾向として把握する(つまり、当該傾向に沿ってソースコードを読解することが有用であることを把握する)ことができるため、当該第2ユーザによるソースコードの読解を支援することが可能となる。
なお、本実施形態においては、第1ユーザが調査した関数を示す関数情報を特定するための当該第1ユーザの操作が例えば関数検索操作(ソースコードに含まれる関数を検索して、当該検索された関数を表示させる操作)及びジャンプ操作(第1関数が表示されている状態で第1関数内に記述された第2関数を指定して、当該指定された第2関数を表示させる操作)であるものとして説明したが、当該第1ユーザの操作は、例えばソースコードに含まれる複数の関数のうちの少なくとも1つを表示させる操作(関数表示操作)であればよい。また、第1ユーザの操作は、当該第1ユーザが特定の関数を調査したことを推定することが可能であれば、関数を表示させる操作以外であってもよい。
また、本実施形態においては、第1ユーザがソースコードを読解する際に当該第1ユーザによって指定された機能(調査対象機能)に対応づけて関数情報が調査記録テーブルに保持され、第2ユーザによって指定された機能(表示対象機能)に対応づけて調査記録テーブルに保持されている関数情報に基づいて調査頻度情報が取得される構成であるため、第2ユーザが意図する頻度情報(つまり、所望の機能に関する調査の傾向)を出力することができる。
なお、本実施形態においては、調査頻度表示操作が行われる際に第2ユーザが表示対象機能を指定するものとして説明したが、当該表示対象機能は、例えば調査記録テーブルに保持されている機能情報の中から選択されるような構成とすることも可能である。
更に、本実施形態においては、調査頻度情報を、呼び出し元関数と呼び出し先関数との間の呼び出し関係を表すコールフロー図に付して出力する(つまり、調査頻度付きコールフロー図を出力する)構成としてもよい。このような構成によれば、例えば調査された頻度が高い関数を呼び出し関係に沿って調査していくようなことが可能となり、より第2ユーザによるソースコードの読解を支援することができる可能性がある。
なお、本実施形態においては、例えば図7等に示すような調査頻度情報が表示されればよいが、当該調査頻度情報は他の態様で表示されても構わない。具体的には、本実施形態においてはソースコードがコード読解支援装置10の表示画面に設けられているソースコード表示領域107aに表示されるが、調査頻度情報は、ソースコードに含まれる複数の関数のうちの調査された頻度が高い関数がソースコード表示領域107a上で強調表示されてもよい。
同様に、本実施形態においては、図21に示すような調査頻度付きコールフロー図が表示されるものとして説明したが、当該調査頻度付きコールフロー図においても調査された頻度の高い関数(を表すノード)を強調表示するようにしてもよい。
更に、調査頻度情報は、例えばコード読解支援装置10に備えられる表示デバイス107に出力されるのではなく、外部のサーバ装置等に出力されても構わない。このような構成によれば、例えば外部のサーバ装置において調査頻度情報を用いた処理が実行され、当該処理の結果を第2ユーザに提供するようなことが可能となる。
また、本実施形態においては、コード読解支援装置10が図1に示す構成を有するものとして説明したが、当該構成は適宜変更されても構わない。具体的には、ソフトウェア製品の保守作業が長期間行われるような場合には、格納部11に格納される調査記録テーブルのサイズが増大することが想定されるため、当該調査記録テーブルは外部のサーバ装置等において管理される構成としてもよい。このような構成の場合、コード読解支援装置10は、通信デバイスを備え、必要に応じて調査記録テーブルをサーバ装置から取得(ダウンロード)するように動作すればよい。また、コード読解支援装置10は、例えばユーザが使用するユーザ端末とは別個の装置であり、例えばクラウドコンピューティングサービスを提供するサーバ装置等として実現されていてもよい。このような構成の場合には、ユーザ端末を介してユーザの操作を受け付けるとともに、調査頻度情報等をユーザ端末に送信(出力)するように動作すればよい。
更に、本実施形態においては、便宜的に、1つのコード読解支援装置10を用いてソフトウェア製品の保守作業が行われるものとして説明したが、当該保守作業は複数のユーザの各々が使用する複数のコード読解支援装置10を用いて行われてもよい。この場合、上記した調査記録テーブルが複数のコード読解支援装置10からアクセス可能なサーバ装置等において管理され、当該複数のコード読解支援装置10(複数のユーザ)によって共有されるような構成とすればよい。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれると同様に、特許請求の範囲に記載された発明とその均等の範囲に含まれるものである。