以下、図面を参照して実施形態を説明する。
図1は、本実施形態に係わる情報処理装置の構成の一例を示す概略図である。図1に示すように、情報処理システム100は、本体装置101と、各種データを記憶する記憶装置102と、各種データを表示する表示装置103とを有して構成されている。本体装置101は、パーソナルコンピュータなどのコンピュータ装置本体であり、CPU101a、図示しないメモリなどを搭載している。また、本体装置101には、入力装置として、キーボード104及びマウス105が接続されている。本体装置101は、これらの入力装置を用いてユーザから入力される指示に基づいて、各種プログラムを実行する。
記憶装置102には、ソースコード106と、このソースコード106のコードリーディングを支援するためにソースコードの解析を行うコードリーディング支援プログラム107とが記憶されている。
ユーザは、キーボード104及びマウス105を用い、ソースコード106を入力とし、コードリーディング支援プログラム107を本体装置101上において実行することにより、ソースコードの解析結果を表示装置103に表示させることができる。なお、ソースコード106やコードリーディング支援プログラム107は、本体装置101内の図示しないメモリに格納していてもよい。また、本体装置101にインターネット回線200などを介して接続されているクラウドサーバ300などに記憶しておき、必要に応じてダウンロードして実行してもよい。
次に、このように構成されるコードリーディング支援装置1の構成について説明する。図2は、本実施の形態に係わるコードリーディング支援装置の構成の一例を示す概略ブロック図である。ユーザがソースコード106を入力し、コードリーディング支援プログラム107を本体装置101上において実行することにより、コードリーディング支援装置1が実行される。
コードリーディング支援装置1は、コード解析部11と、ユーザ操作受付部13と、既読推定部15と、既読グラフ生成部17とを有して構成される。また、コードリーディング支援装置1は、コード情報記憶部12と、ユーザ操作記憶部14と、推定情報記憶部16と、コード画像生成部18と、既読グラフ画像生成部19とも有する。
コード解析部11は、入力されたソースコード106の構文解析を行う。解析の結果として、関数情報、関数の呼び出し関係情報、コードブロック情報を取得する。
関数情報は、ソースコード106に記述されている関数について、関数名、関数定義の開始行番号、及び、終了番号の情報である。取得した関数情報は、コード情報記憶部12の関数情報表121に記録する。
関数情報表121に記録する関数情報について、ソースコードの一例を用いて具体的に説明する。図3は、コードリーディングの対象となるソースコードの一例を示す図である。また、図4は、関数情報表の一例を示す図である。
図3に示すソースコード106は、C言語で記述されており、関数a、b、c、d、e、f、の6つの関数が定義されている。
関数aは、1行目から3行目に記述されているので、開始行番号は1、終了行番号は3となる。関数bは、5行目から11行目に記述されているので、開始行番号は5、終了行番号は11となる。関数cは、13行目から15行目に記述されているので、開始行番号は13、終了行番号は15となる。関数dは、17行目から19行目に記述されているので、開始行番号は17、終了行番号は19となる。関数eは、21行目から23行目に記述されているので、開始行番号は21、終了行番号は23となる。関数fは、25行目から27行目に記述されているので、開始行番号は25、終了行番号は27となる。
関数情報表121には、1つの関数につき、関数名、開始行番号、終了行番号、の3つのデータを1レコードとして登録する。従って、図3に示すソースコード106をコード解析部11で解析した結果、関数情報表121には、図4に示すように、関数a、関数b、関数c、関数d、関数e、関数fの6つの関数についての6つのレコードが登録される。
関数の呼び出し関係情報は、ソースコード106に記述されている関数において、関数内から他の関数を呼び出している場合に、呼び出し元関数と呼び出し先関数の関係を示す情報である。具体的には、呼び出し元の関数名、呼び出し先の関数名、関数を呼び出している行番号の情報である。取得した関数の呼び出し関係情報は、コード情報記憶部12の呼び出し関係情報表122に記録する。
呼び出し関係情報表122に記録する、関数の呼び出し関係情報について、図3に示すソースコードの一例を用いて具体的に説明する。図5は、呼び出し関係情報表の一例を示す図である。
図3に示すソースコード106に記述された、関数a、関数b、関数c、関数d、関数e、関数fの6つの関数について、それぞれ関数内部から他の関数を呼び出しているか否かを解析する。関数aは、2行目において関数bを呼び出している。関数bは、7行目において関数cを呼び出している。また、9行目において関数fを呼び出している。関数cは、14行目において関数dを呼び出している。関数dは、18行目において関数eを呼び出している。関数eは、他の関数を呼び出していない。関数fは、26行目において関数eを呼び出している。
呼び出し関係情報表122には、1つの関数の呼び出し関係につき、呼び出し元関数名、呼び出し先関数名、呼び出し行番号、の3つのデータを1レコードとして登録する。従って、図3に示すソースコード106をコード解析部11で解析した結果、呼び出し関係情報表122には、図5に示すように、関数aから関数bの呼び出し、関数bから関数cの呼び出し、関数bから関数fの呼び出し、関数cから関数dの呼び出し、関数dから関数eの呼び出し、関数fから関数eの呼び出し、の6つの呼び出し関係についての6つのレコードが登録される。
コードブロック情報は、ソースコード106に記述されている関数について、関数内に存在するコードブロックの範囲と、コードブロック間の包含関係を示す情報である。なお、コードブロックとは、関数内におけるコードのまとまりであり、分岐や選択などの制御構造を表すものである。例えば、「{」で開始され、「}」で終了するコードのまとまりを、コードブロックと設定することができる。
各コードブロックには、解析対象のソースコード106内で一意に識別可能なIDが割り当てられる。ソースコード106の同じ行に複数のコードブロックが存在する場合、包含関係を行番号から計算し、コードブロックの範囲が広いものを親コードブロックとする。
コードブロック情報として取得する情報は、具体的には、コードブロックID、開始行番号、終了行番号、親コードブロックIDの情報である。取得したコードブロック情報は、コード情報記憶部12のコードブロック情報表123に記録する。コードブロック情報について、図6を用いて具体的に説明する。図6は、コードブロック情報表の一例を示す図である。図6(a)は、コードブロックの範囲を明示したソースコードの一例であり、図6(b)は、図6(a)のソースコードに対応するコードブロック情報表123を示している。なお、図6(a)に示したソースコードは、図3に示すソースコードと同様である。
まず、ソースコード106の1行目から順に、コードブロックの開始を示す「{」を探索する。すると、1行目に「{」が抽出される。従って、最初のコードブロック(ID1のコードブロック)の開始行番号は1となる。続いて、当該コードブロックの終了を示す「}」を探索する。すると、3行目に「}」が抽出される。従って、ID1のコードブロックの終了行番号は3となる。
続いて、5行目に、次のコードブロックの開始を示す「{」が抽出される。従って、2番目のコードブロック(ID2のコードブロック)の開始行番号は5となる。続いて、当該コードブロックの終了を示す「}」を探索する。すると、「}」を抽出する前に、次のコードブロックの開始を示す「{」が、6行目で抽出される。従って、ID2のコードブロックが終了する前に、ID3のコードブロックが開始され、その開始行番号は6であると解析される。
次に、後から開始されたコードブロックである、ID3のコードブロックの終了を示す「}」を探索する。すると、7行目に「}」が抽出される。従って、ID3のコードブロックの終了行番号は7となる。続いて、ID2のコードブロックの終了を示す「}」を探索する。すると、「}」を抽出する前に、次のコードブロックの開始を示す「{」が、8行目で抽出される。従って、ID2のコードブロックが終了する前に、ID4のコードブロックが開抽出される。従って、ID2のコードブロックが終了する前に、ID4のコードブロックが開始され、その開始行番号は8であると解析される。
次に、後から開始されたコードブロックである、ID4のコードブロックの終了を示す「}」を探索する。すると、9行目に「}」が抽出される。従って、ID4のコードブロックの終了行番号は9となる。続いて、ID2のコードブロックの終了を示す「}」を探索する。すると、11行目に「}」が抽出される。従って、ID2のコードブロックの終了行番号は11となる。
このようにして、コードブロックの開始を示す「{」と、終了を示す「}」を順に探索していくことにより、コードブロックの範囲を特定する。図6(a)に示すソースコードの場合、コードブロックはID1からID8の8個のコードブロックが存在し、各コードブロックの範囲は、各IDの左側に図示した太線で示す範囲であると解析される。
なお、6行目から9行目は、複数のコードブロックが存在する。具体的には、6行目と7行目には、ID2とID3のコードブロックが存在し、8行目と9行目には、ID2とID4のコードブロックが存在する。そこで、それぞれのコードブロックについて、包含関係を調べる。
ID2のコードブロックの開始行番号は5、終了行番号は11であるので、その範囲は7行である。一方、ID3のコードブロックの開始行番号は6、終了行番号は7であるので、その範囲は2行である。従って、ID2のコードブロックの範囲のほうが、ID3のコードブロックの範囲より広いため、ID3のコードブロックはID2のコードブロックのコードブロックに包含されていると判定される。すなわち、ID3のコードブロックの親コードブロックIDは2であると解析される。
また、ID4のコードブロックの開始行番号は8、終了行番号は9であるので、その範囲は2行である。従って、ID2のコードブロックの範囲のほうが、ID4のコードブロックの範囲より広いため、ID4のコードブロックはID2のコードブロックのコードブロックに包含されていると判定される。すなわち、ID4のコードブロックの親コードブロックIDは2であると解析される。
コードブロック情報表123には、1つのコードブロックにつき、コードブロックID、開始行番号、終了行番号、親コードブロックID、の4つのデータを1レコードとして登録する。従って、図6(a)に示すソースコード106をコード解析部11で解析した結果、コードブロック情報表123には、図6(b)に示すように、ID1からID8のコードブロックについて、8つのレコードが登録される。
コード情報記憶部12は、コード解析部11によってソースコード106を解析した結果得られた、関数情報と、関数の呼び出し関係情報と、コードブロック情報とを記憶する。関数情報は、関数情報表121に格納され、関数の呼び出し関係情報は、呼び出し関係情報表122に格納され、コードブロック情報は、コードブロック情報表123に格納される。関数情報表121と、呼び出し関係情報表122と、コードブロック情報表123に格納されたデータは、必要に応じて、ユーザ操作受付部13、既読推定部15、既読グラフ生成部17から読み出される。
ユーザ操作受付部13は、表示装置103に表示されているソースコード106上にセットされたカーソル位置の行番号と文字列とを読み込んで、当該行において関数が呼び出されている場合、呼び出されている関数の定義箇所を探索する。そして、呼び出し先の関数を表示するよう、コード画像生成部18に依頼する。なお、ユーザ操作受付部13は、コードリーディング支援装置1の動作中に、表示装置103に表示されている関数定義移動ボタン172をユーザが押下することにより、動作する。
ここで、コードリーディング支援装置1の動作中に、表示装置103に表示されている画面について、図7を用いて説明する。図7は、コードリーディング支援動作中の表示画面の一例を示す図である。
図7に示すように、コードリーディング支援動作中、表示装置103には、ソースコード表示画面181と、既読グラフ表示画面171と、関数定義移動ボタン172とが表示される。
ソースコード表示画面181には、解析対象のソースコード106において、ユーザが目視チェックを行っている箇所が表示される。ソースコード表示画面181には、特定の行を指し示すカーソル182が配置されている。ソースコード表示画面181の表示内容(画面上に表示されるソースコードの部分)は、コード画像生成部18によって生成される。
既読グラフ表示画面171には、ユーザが既読したコードブロック、及び、当該コードブロックの呼び出し関係が図示される。既読グラフ表示画面171の表示内容は、既読グラフ画像生成部19によって生成される。
関数定義移動ボタン172は、カーソル182が位置する行において、関数が呼び出されている場合、呼び出し先の関数の定義箇所を、ソースコード表示画面181に表示させる。関数定義移動ボタン172をユーザが押下すると、カーソル182が位置する行番号と文字列(ソースコード106における当該行の記述内容)とがユーザ操作受付部13に入力される。
ユーザ操作受付部13は、入力された文字列の字句解析を、コード解析部11に依頼する。カーソル182が位置する行において関数が呼び出されている場合、コード解析部11から、関数名を取得する。例えば、図7において、ソースコードの14行目にカーソル182が位置する状態で関数定義移動ボタン172が押下された場合、ユーザ操作受付部13には、行番号14と、文字列“d();”が入力される。ユーザ操作受付部13は、コード解析部11に文字列“d();”の解析を依頼する。そして、解析の結果として、関数名dをコード解析部11から取得する。
次に、ユーザ操作受付部13は、呼び出されている関数の定義箇所を探索する。具体的には、関数情報表121から、コード解析部11から取得した関数名のレコードを抽出し、当該レコードの開始行番号を取得する。例えば、コード解析部11から関数名dを取得した場合、関数情報表121から関数名がdであるレコードを探索する。図4に示す関数情報表121の場合、4行目のレコードが抽出され、開始行番号17を取得する。そして、ユーザ操作受付部13は、関数情報表121から取得した開始行番号をコード画像生成部18に入力し、当該行番号を含む箇所のソースコードをソースコード表示画面181に表示するよう依頼する。
また、ユーザ操作受付部13は、移動元の行番号(関数定義移動ボタン172が押下されたときに、カーソルが位置していた行番号)と、移動先の行番号(コード画像生成部18に対し、表示の依頼をした行番号)とを、移動履歴情報として、ユーザ操作記憶部14の移動履歴情報表141に記録する。図8は、移動履歴情報表の一例を示す図である。移動履歴情報表141は、関数定義移動ボタン172をユーザが押下ことにより、ある関数から、当該関数内で呼び出されている別の関数に表示を移動させた際に、その移動の履歴を記録するものである。移動履歴情報表141には、1つの移動履歴につき、移動元行番号、移動先行番号、の2つのデータを1レコードとして登録する。
例えば、関数aから関数b、関数bから関数c、関数cから関数dへの移動を、関数定義移動ボタン172を押下することにより実行した場合について、以下、説明する。1レコード目には、関数aから関数bへの移動に関する情報が記録される。すなわち、移動元行番号には、関数aにおいて関数bを呼び出している行番号である2が登録され、移動先行番号には、関数bの開始行番号である15が登録される。2レコード目には、関数bから関数cへの移動に関する情報が記録される。すなわち、移動元行番号には、関数bにおいて関数cを呼び出している行番号である7が登録され、移動先行番号には、関数cの開始行番号である13が登録される。3レコード目には、関数cから関数dへの移動に関する情報が記録される。すなわち、移動元行番号には、関数cにおいて関数dを呼び出している行番号である14が登録され、移動先行番号には、関数dの開始行番号である17が登録される。
ユーザ操作記憶部14は、関数定義移動ボタン172をユーザが押下ことにより、ある関数から、当該関数内で呼び出されている別の関数に、ソースコードの表示箇所を移動させた際の移動の履歴を、移動履歴情報表141に格納して記憶する。移動履歴情報表141に格納されたデータは、必要に応じて、既読推定部15から読み出される。
既読推定部15は、ソースコードにおいて、ユーザが既読した部分の判定、及び、既読部分の推定を行う。既読部分の判定、及び、推定は、コードブロック単位で行う。既読部分の判定は、移動履歴情報表141に基づき行う。すなわち、移動履歴情報表141の移動元行番号、及び、移動先行番号に、行番号が含まれているコードブロックは、既読とする。
まず、移動履歴情報表141に記録した行番号が含まれる関数の関数名を、関数情報表121から抽出し、どの関数からどの関数へ移動したかを特定する。例えば、図8に示す移動履歴情報表141の場合、1レコード目は移動元が関数a、移動先が関数bであり、2レコード目は、移動元が関数b、移動先が関数cである。更に、3レコード目は、移動元が関数cであり、移動先が関数dであると特定される。
次に、n番目のレコードの移動先の関数名と、n+1番目のレコードの移動元の関数名が一致するか否かを判定する。両者が一致する場合、関数定義移動ボタン172により関数の呼び出しが行われ移動履歴が記録されているので、移動履歴情報表141において関数の呼び出し関係につながりがあると判定する。一方、両者が一致しない場合、ユーザが画面をスクロールするなどして呼び出し先の関数に移動したために移動履歴が記録されていないので、移動履歴情報表141において関数の呼び出し関係につながりがないと判定する。
上述の一例の場合、1番目のレコードの移動先の関数名と、2番目のレコードの移動元の関数名は、共に関数bであるので、1番目のレコードから2番目のレコードへの呼び出し関係にはつながりがあると判定する。また、2番目のレコードの移動先の関数名と、3番目のレコードの移動元の関数名は、共に関数cであるので、2番目のレコードから3番目のレコードへの呼び出し関係にもつながりがあると判定する。
つながりがあると判定された場合、移動履歴情報表141に移動元行番号と移動先行番号が含まれるコードブロックのIDを、既読コードブロックとして、コードブロック情報表123から抽出する。上述の一例の場合、移動履歴情報表141に記録されている行番号は、2、5、7、13、14、17であり、これらが含まれるコードブロックのIDは、ID1、ID2、ID3、ID5、ID5、ID6となる。
そして、これらのコードブロックが属する関数名を関数情報表121から抽出し、推定情報記憶部16の既読コードブロック情報表161に記録する。例えば、図4に示す関数情報表121の場合、行番号2を含むID1のコードブロックは、関数aに属し、行番号5を含むID2のコードブロックは、関数bに属する。また、行番号7を含むID3のコードブロックは、関数bに属し、行番号13を含むID5のコードブロックは、関数cに属する。また、行番号14を含むID5のコードブロックは、関数cに属し、行番号17を含むID6のコードブロックは、関数dに属する。
既読推定部15は、既読と判定したコードブロックの関数名とコードブロックIDとを、推定情報記憶部16の既読コードブロック情報表161に記録する。図9は、既読コードブロック情報表の一例を説明する図である。なお、既読コードブロック情報表161には、IDが重複するコードブロックは、ひとつのレコードにまとめて記録する。上述の場合、ID5のコードブロックが重複しているため、既読コードブロック情報表161には、5つのレコードが登録される。
すなわち、関数名がa、コードブロックIDが1のレコードと、関数名がb、コードブロックIDが2のレコードと、関数名がb、コードブロックIDが3のレコードと、関数名がc、コードブロックIDが5のレコードと、関数名がd、コードブロックIDが6のレコードが、既読コードブロック情報表161に登録される。
次に、移動履歴情報表141において関数の呼び出し関係につながりがないレコードがあると判定された場合について、説明する。例えば、図8に示す移動履歴情報表141の2レコード目、すなわち、関数bから関数cへの移動をユーザがスクロールなどで行ったために、移動履歴情報表141に記録されていない場合について説明する。
この場合、1番目のレコードの移動先の関数名は関数bであるが、2番目のレコードの移動元の関数名は関数cであるので、1番目のレコードから2番目のレコードへの呼び出し関係にはつながりがないと判定する。つながりがないと判定した場合、関数bと関数cとをつなぐ呼び出し関係を、呼び出し関係表122から探索する。すなわち、呼び出し関係表122の呼び出し先関数名が関数cであるレコードを抽出し、当該レコードの呼び出し元関数名が関数bであるか否かを判定する。抽出したレコードが複数存在する場合、抽出した全てのレコードについて判定する。
抽出したレコードのなかに、呼び出し元関数名が関数bであるものが存在する場合、呼び出し関係の探索を終了する。一方、呼び出し元関数名が関数bであるものが存在しない場合、当該レコードの呼び出し元関数名を呼び出し先関数名とし、再び呼び出し関係表122の探索を行う。呼び出し元関数名が関数bであるレコードに到達した場合、つながりがない部分の推定を完了し、探索を終了する。
図5に示す呼び出し関係表122の場合、2レコード目が抽出される。このレコードは、呼び出し先関数名が関数bであるので、ここで探索を終了する。そして、抽出したレコードの呼び出し行番号に記録されている行が含まれるコードブロックを、コードブロック情報表123から抽出する。上述の場合、抽出したレコードの呼び出し行番号は7であり、7行目が含まれるコードブロックはID3である。
ここで、移動履歴情報表141に移動元行番号と移動先行番号が含まれるコードブロックのIDを、既読コードブロックとして、コードブロック情報表123から抽出する。上述の一例の場合、移動履歴情報表141に記録されている行番号は、2、5、14、17であり、これらが含まれるコードブロックのIDは、ID1、ID2、ID5、ID6となる。これらは、既読部分と判定されたコードブロックである。これら4つのコードブロックに、関数の呼び出し関係のつながりを探索することにより既読部分と推定されたコードブロック(=ID3)を追加し、5つのコードブロックのIDと関数名とを、既読コードブロック情報表161に登録する。
推定情報記憶部16は、ユーザが既読した、あるいは既読したと推定されるコードブロックの一覧を、既読コードブロック情報表161に格納して記憶する。既読コードブロック情報表161に格納されたデータは、必要に応じて、既読グラフ生成部17から読み出される。
既読グラフ生成部17は、ユーザが既読した、あるいは既読したと推定される関数を、既読グラフとして生成する。既読グラフは、コード情報記憶部12と、推定情報記憶部16に格納されている情報に基づき生成される。図10は、既読グラフの一例を説明する図である。
既読グラフは、関数を図で表現する。既読コードブロック情報表161から関数名を取得し、取得した関数を、関数を表す記号と関数名とを用いて図示する。例えば、図10に示すように、既読コードブロック情報表161から取得した関数、すなわち、ユーザが既読した関数は、黒丸形状で示す関数記号173の上部に関数名が表記される。例えば、図9に示す既読コードブロック情報表161に基づき既読グラフを生成する場合、図10に示すように、既読グラフには、関数a、関数b、関数c、関数dの4つの関数が図示される。
次に、図示した関数の開始行番号と終了行番号とを。関数情報表121から取得する。そして、取得した行番号の範囲に含まれるコードブロックを、コードブロック情報表123から取得する。例えば、図4に示す関数情報表121の場合、関数cの開始行番号は13、終了行番号は15となる。図6に示すコードブロック情報表123の場合、この範囲に含まれるのは、ID5のコードブロックである。取得したコードブロックは、当該関数記号173の下に、例えば縦長の矩形状のコードブロック記号174で図示される。なお、コードブロック記号174の近傍に、コードブロックIDを記してもよい。
例えば、関数bのように、複数のコードブロックを有する関数は、抽出されたコードブロックの親子関係(包含関係)を、コードブロック情報表123で確認する。関数記号173の下に、親コードブロックを示すコードブロック記号174を図示し、子コードブロックを示すコードブロック記号175a、175bは、親コードブロック記号174の上に重ねて図示する。なお、複数の子コードブロックが包含されている場合、開始行番号の小さいコードブロックから順に、親コードブロック記号174の上に配置する。
なお、子コードブロック記号175a、175bによって親コードブロック記号174が見えづらくなるのを防止するため、子コードブロック記号175a、175bは、親コードブロック記号174に対して左右どちらかに所定幅だけずらして図示したり、親コードブロック記号174よりも細い幅で図示したりするとよい。
なお、既読コードブロック情報表161に記録されているコードブロックと、記録されていないコードブロックは、既読・未読を色覚的に容易に区別可能にするために、異なる表記方法を用いる。
例えば、既読コードブロック情報表161に記録されているコードブロック(既読コードブロック、または、既読と推定されたコードブロック)は、コードブロック記号174のように内部を網掛け表記したり、所定の色で着色したりする。一方、既読コードブロック情報表161に記録されていないコードブロック(未読コードブロック)は、コードブロック記号175bのように、矩形の外枠だけ図示したり、既読コードブロックのコードブロック記号174と異なる色で着色したりする。
次に、既読グラフに図示したコードブロック記号に関し、関数の呼び出し関係を図示する。既読コードブロック情報表161には、コードリーディングを開始してから呼び出した順にコードブロックIDが記録されている。従って、n番目のレコードに格納されているコードブロックIDを示すコードブロック記号と、n+1番目のレコードに格納されている関数名を示す関数記号173との間を矢印176でつなぎ、呼び出し関係を図示する。
図4に示す関数情報表121と、図6に示すコードブロック情報表123と、図9に示す既読コードブロック情報表161を用いると、例えば、図10に示す既読グラフが生成される。すなわち、最初に関数aのID1のコードブロックを既読する。ID1のコードブロックから関数bが呼び出される。関数bは、包含関係を有する3つのコードブロックから構成されており、ID2の親コードブロックに、ID3とID4の子コードブロックが含まれている。関数bを呼び出すことで、まず、ID2の親コードブロックが既読となり、続いてID3の子コードブロックを既読する。ID3の子コードブロックから関数cが呼び出され、関数cのID5のコードブロックが既読となる。続いて、ID5のコードブロックから関数dが呼び出され、関数dのID6のコードブロックが既読となる。
図10の既読グラフは、関数の呼び出し関係と、関数を構成するコードブロックが明確に表現されており、既読のコードブロックと未読のコードブロックとが識別可能に表現されている。従って、ユーザが、ソースコードの既読部分と未読部分を容易に把握することができる。
コード画像生成部18は、コードリーディング支援装置1に入力されたソースコード106を、コード解析部11で字句解析し、該ソースコードを記述した言語の表記に応じた記述内容を、ソースコード表示画面181に表示する画像を生成する。また、ユーザが関数定義移動ボタン172を押下する都度、カーソル182が配置されている行に記述されている呼び出し先の関数の定義箇所が、ソースコード表示画面181に表示されるよう、画像を生成しなおす。
既読グラフ画像生成部19は、既読グラフ生成部17が生成した既読グラフに基づき、既読グラフ表示画面171に表示する画像を生成する。また、ユーザが関数定義移動ボタン172を押下する都度、既読グラフ生成部17が生成した既読グラフを読み込み、画像を生成しなおす。
次に、本実施形態におけるコードリーディング支援方法について、図11を用いて説明する。図11は、本実施形態におけるコードリーディング支援方法の一例を説明するフローチャートである。
まず、記憶装置102などに格納されているソースコード106を、コードリーディング支援装置1に読み込む(S1)。コード解析部11は、読み込んだソースコード106の字句解析を行う(S2)。解析の結果、表示装置103のソースコード表示画面181に、先頭行から所定行数分のソースコード106が表示される。ユーザは、ソースコード表示画面181に表示されるカーソル182をマウス105やキーボード104入力によりスクロールさせ、次にチェックする関数が呼び出されている行にカーソル182を移動させる。
この状態で、ユーザが関数定義移動ボタン172を押下すると、カーソル182が位置する行番号と文字列(ソースコード106における当該行の記述内容)とがユーザ操作受付部13に入力される(S3)。続いて、コード解析部11において、入力された文字列の字句解析が行われ、カーソル182位置に記述された関数名(移動先の関数名)が特定される(S4)。ユーザ操作記憶部14は、関数の移動の履歴を、移動履歴情報表141に格納して記憶する。
次に、既読推定部15は、移動履歴情報表141、及び、既読コードブロック情報表161を参照し、前回既読箇所の判定及び推定を行ってから、ユーザが新たに既読した部分の判定及び既読部分の推定を行う(S5)。新たに既読と特定されたコードブロック、または、既読と推定されたコードブロックに関する情報は、既読コードブロック情報表161に記憶される。
続いて、既読グラフ生成部17は、既読コードブロック情報表161に新たに追加されたレコードや、コード情報記憶部12に格納されている必要な情報を用いて、既読グラフを生成する。既読グラフ画像生成部19は、既読グラフ生成部17で生成された既読グラフに基づき、既読グラフ表示画面171に表示する画像を生成する(S6)。そして、表示装置103の既読グラフ表示画面171に、S6で生成した既読グラフ画像を出力し表示させる(S7)。
次の関数に移動してコードリーディングを継続する場合(S8、NO)、S3に戻り、次にチェックする関数が呼び出されている行にカーソル182を移動させて、関数定義移動ボタン172を押下する。一方、コードリーディングを終了する場合(S8、YES)、既読コードブロック情報表161を既読情報として保存し(S9)、一連の処理を終了する。
このように、本実施形態によれば、コードリーディングを行う際に、ソースコードの既読部分に関し、既読した関数の名称、該関数に含まれるコードブロック、コードブロックと関数間の呼び出し関係を組み合わせ、その構造を表現した既読グラフを表示する。更に、既読グラフには、コードブロック単位で、既読、未読を識別可能に表現させる。従って、関数内のどのコードブロックを辿ってソースコードの解読を行ったかを容易に把握することができる。また、未読部分も容易に把握することができる。
更に、解読を行った経路(実行パス)の情報が、既読コードブロック情報表に保存しているので、複数の作業者で分担してコードリーディングを行う場合にも、各自の既読部分を他の作業者が共有することができ、コードリーディングの作業効率が向上する。
また、ユーザが、画面をスクロールするなどして呼び出し先の関数に移動したために、一部のコードブロック・関数間の移動履歴が記録されていない場合にも、前後の移動履歴やコード情報記憶部12に格納されているソースコード106の構造情報を用いて、つながりのない部分のパスを推定し、当該パスに存在するコードブロックを既読であると推定することができる。従って、ソースコードの既読部分を漏れなく抽出し記録することができるので、コードリーディングの作業効率が更に向上する。
なお、上述では、記憶装置102に格納されているコードリーディング支援プログラム107をCPU101aで実行することにより、コードリーディング支援装置1が動作する場合について説明したが、本体装置101内部にコードリーディング支援装置1のアプリケーションが実装されていてもよい。
また、上述では、コードリーディング対象のソースコードに関する情報(関数情報表、呼び出し関係情報表、コードブロック情報表)は、コードリーディング支援装置1で解析して取得しているが、ソースコードと同様に、外部から入力してもよい。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、一例として示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれると共に、特許請求の範囲に記載された発明とその均等の範囲に含まれる。