JP2021036442A - コードリーディング支援装置、及び、コードリーディング支援方法、並びに、コードリーディング支援プログラム - Google Patents

コードリーディング支援装置、及び、コードリーディング支援方法、並びに、コードリーディング支援プログラム Download PDF

Info

Publication number
JP2021036442A
JP2021036442A JP2020181401A JP2020181401A JP2021036442A JP 2021036442 A JP2021036442 A JP 2021036442A JP 2020181401 A JP2020181401 A JP 2020181401A JP 2020181401 A JP2020181401 A JP 2020181401A JP 2021036442 A JP2021036442 A JP 2021036442A
Authority
JP
Japan
Prior art keywords
read
code
function
code block
reading support
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2020181401A
Other languages
English (en)
Other versions
JP6983976B2 (ja
Inventor
翔 守田
Sho Morita
翔 守田
翼 青木
Tasuku Aoki
翼 青木
剛典 神代
Takenori Kamishiro
剛典 神代
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Toshiba Corp
Original Assignee
Toshiba Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Priority claimed from JP2019154682A external-priority patent/JP6790199B2/ja
Application filed by Toshiba Corp filed Critical Toshiba Corp
Priority to JP2020181401A priority Critical patent/JP6983976B2/ja
Publication of JP2021036442A publication Critical patent/JP2021036442A/ja
Application granted granted Critical
Publication of JP6983976B2 publication Critical patent/JP6983976B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Abstract

【課題】ソースコードの既読部分を表示し、コードリーディング作業の効率を向上させることができる、コードリーディング支援装置及びコードリーディング支援方法並びにコードリーディング支援プログラムを提供する。【解決手段】コードリーディング支援装置は、ユーザが解読を行った既読コードブロックを特定する第1操作を受け付けるユーザ操作受付部と、第1既読コードブロックが含まれる第1既読関数と、第1既読関数に含まれるすべてのコードブロックと、第1既読コードブロックと第1既読コードブロックに記述されている第2既読関数との呼び出し関係とを表現する既読グラフを生成する生成部と、を有する。ユーザ受付部によってユーザが解読を行った第2既読コードブロックを特定する第2操作が受け付けられた場合、既読グラフは、第2既読コードブロックに記述されている第3既読関数を追加するように更新される。【選択図】図2

Description

本実施形態は、コードリーディング支援装置、及び、コードリーディング支援方法、並びに、コードリーディング支援プログラムに関する。
ソフトウェアを開発、改良、保守するためには、ソフトウェアの理解が重要となる。しかし、ソフトウェアは大規模になればなるほど、その構造は複雑なものとなり、把握することが困難になる。従来、プログラムのデバックを行う場合、ディスプレイやプリントアウトされた紙に表示されたソースコードを、目視によりチェックすることが一般的に行われている。
しかし、大量のソースコードによって生成された大規模プログラムの場合、これらのソースコードを解読する作業(以下、コードリーディングと示す)は困難を伴い、高いスキルも要求される。コードリーディングを支援するために、ソースコードを静的に解析して、プログラムにおける関数の呼び出し関係を自動的に作成し、図示する装置が知られている。また、ソースコードから生成されたUMLクラス図やシーケンス図上に、デバック実行で得られた情報をマッピングし、実行パスを表示する装置も知られている(例えば、非特許文献1参照)。
一般的に、実行パスを辿りながらコードリーディングを行う場合、関数内の一部を読む場合がある。しかし、上述の装置においては、関数の呼び出し関係を図で確認しながらソースコードを解読する場合、生成される関数呼び出し関係の図は、図示する要素の最小単位が関数であるため、関数の中のどの部分が既読であり、どの部分が未読であるかを確認することができないという問題があった。UMLクラス図やシーケンス図上に実行パスを表示する場合にも、クラス図中のどの部分が既読であり、どの部分が未読であるかを判別できないという問題があった。
また、大規模なソースコードの場合、複数の作業者で分担してコードリーディングを行うが、既読部分がわからなければ、メンバ間で進捗を確認したり、各自が理解した内容を共有したりするのは困難であるため、コードリーディング作業の効率が悪くなってしまうという問題があった。
大村裕、渡部卓雄著「プログラム理解のためのコードリーディング支援ツールの提案と実装」日本ソフトウェア科学大会論文集 31 443−446、2014年
本実施形態は、ソースコードの既読部分を表示し、コードリーディング作業の効率を向上させることができる、コードリーディング支援装置、及び、コードリーディング支援方法、並びに、コードリーディング支援プログラムを提供することを目的とする。
実施形態によれば、ソースコードの解読を支援するコードリーディング支援装置が提供される。前記コードリーディング支援装置は、前記ソースコードに記述された複数の関数、及び、前記複数の関数間の呼び出し関係、及び、前記複数の関数のそれぞれにおける制御構造を表すコードブロックに関する情報を取得する取得部と、前記ソースコードに記述された複数の前記コードブロックのうち、ユーザが解読を行った第1既読コードブロックを特定する第1操作を受け付ける受付部と、前記複数の関数のうち、前記第1既読コードブロックが含まれる第1既読関数と、前記第1既読関数に含まれるすべての前記コードブロックと、前記第1既読コードブロックと当該第1既読コードブロックに記述されている第2既読関数との呼び出し関係とを表現する既読グラフを生成する生成部と、を有する。前記第2既読関数に含まれるすべてのコードブロックのうち前記受付部によってユーザが解読を行った第2既読コードブロックを特定する第2操作が受け付けられた場合、前記既読グラフは、前記第2既読コードブロックに記述されている第3既読関数を追加するように更新される。
本実施形態に係わる情報処理装置の構成の一例を示す概略図。 本実施形態に係わるコードリーディング支援装置の構成の一例を示す概略ブロック図。 コードリーディングの対象となるソースコードの一例を示す図。 関数情報表の一例を示す図。 呼び出し関係情報表の一例を示す図。 コードブロック情報表の一例を示す図。 コードリーディング支援動作中の表示画面の一例を示す図。 移動履歴情報表の一例を示す図。 既読コードブロック情報表の一例を示す図。 図10は、既読グラフの一例を説明する図。 本実施形態におけるコードリーディング支援方法の一例を説明するフローチャート。
以下、図面を参照して実施形態を説明する。
図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で解析して取得しているが、ソースコードと同様に、外部から入力してもよい。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、一例として示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれると共に、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
1…コードリーディング支援装置、11…コード解析部、12…コード情報記憶部、13…ユーザ操作受付部、14…ユーザ操作記憶部、15…既読推定部、16…推定情報記憶部、17…既読グラフ生成部、18…コード画像生成部、19…既読グラフ画像生成部、100…情報処理システム、101…本体装置、102…記憶装置、103…表示装置、104…キーボード、105…マウス、106…ソースコード、107…コードリーディング支援プログラム、121…関数情報表、122…呼び出し関係情報表、123…コードブロック情報表、141…移動履歴情報表、161…既読コードブロック情報表、171…既読グラフ表示画面、172…関数定義移動ボタン、181…ソースコード表示画面、182…カーソル、200…インターネット回線、300…クラウドサーバ、

Claims (4)

  1. ソースコードの解読を支援するコードリーディング支援装置であって、
    前記ソースコードに記述された複数の関数、及び、前記複数の関数間の呼び出し関係、及び、前記複数の関数のそれぞれにおける制御構造を表すコードブロックに関する情報を取得する取得部と、
    前記ソースコードに記述された複数の前記コードブロックのうち、ユーザが解読を行った第1既読コードブロックを特定する第1操作を受け付ける受付部と、
    前記複数の関数のうち、前記第1既読コードブロックが含まれる第1既読関数と、前記第1既読関数に含まれるすべての前記コードブロックと、前記第1既読コードブロックと当該第1既読コードブロックに記述されている第2既読関数との呼び出し関係とを表現する既読グラフを生成する生成部と、
    を有し、
    前記第2既読関数に含まれるすべてのコードブロックのうち前記受付部によってユーザが解読を行った第2既読コードブロックを特定する第2操作が受け付けられた場合、前記既読グラフは、前記第2既読コードブロックに記述されている第3既読関数を追加するように更新される
    コードリーディング支援装置。
  2. 前記第1操作は、前記第2既読関数が呼び出されている行にカーソルを移動させて、所定のボタンを押下する操作を含み、
    前記第2操作は、前記第3既読関数が呼び出されている行に前記カーソルを移動させて、前記ボタンを押下する操作を含む
    請求項1記載のコードリーディング支援装置。
  3. ソースコードの解読を支援するコードリーディング支援方法であって、
    前記ソースコードに記述された複数の関数、及び、前記複数の関数間の呼び出し関係、及び、前記複数の関数のそれぞれにおける制御構造を表すコードブロックに関する情報を取得するステップと、
    前記ソースコードに記述された複数の前記コードブロックのうち、ユーザが解読を行った第1既読コードブロックを特定する第1操作を受け付けるステップと、
    前記複数の関数のうち、前記第1既読コードブロックが含まれる第1既読関数と、前記第1既読関数に含まれるすべての前記コードブロックと、前記第1既読コードブロックと当該第1既読コードブロックに記述されている第2既読関数との呼び出し関係とを表現する既読グラフを生成するステップと、
    を有し、
    前記第2既読関数に含まれるすべてのコードブロックのうちユーザが解読を行った第2既読コードブロックを特定する第2操作が受け付けられた場合、前記既読グラフは、前記第2既読コードブロックに記述されている第3既読関数を追加するように更新される
    コードリーディング支援方法。
  4. ソースコードの解読を支援するためのコードリーディング支援プログラムであって、コンピュータに、
    前記ソースコードに記述された複数の関数、及び、前記複数の関数間の呼び出し関係、及び、前記複数の関数のそれぞれにおける制御構造を表すコードブロックに関する情報を取得するステップと、
    前記ソースコードに記述された複数の前記コードブロックのうち、ユーザが解読を行った第1既読コードブロックを特定する第1操作を受け付けるステップと、
    前記複数の関数のうち、前記第1既読コードブロックが含まれる第1既読関数と、前記第1既読関数に含まれるすべての前記コードブロックと、前記第1既読コードブロックと当該第1既読コードブロックに記述されている第2既読関数との呼び出し関係とを表現する既読グラフを生成するステップと、
    を実行させ、
    前記第2既読関数に含まれるすべてのコードブロックのうちユーザが解読を行った第2既読コードブロックを特定する第2操作が受け付けられた場合、前記既読グラフは、前記第2既読コードブロックに記述されている第3既読関数を追加するように更新される
    コードリーディング支援プログラム。
JP2020181401A 2019-08-27 2020-10-29 コードリーディング支援装置、及び、コードリーディング支援方法、並びに、コードリーディング支援プログラム Active JP6983976B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2020181401A JP6983976B2 (ja) 2019-08-27 2020-10-29 コードリーディング支援装置、及び、コードリーディング支援方法、並びに、コードリーディング支援プログラム

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
JP2019154682A JP6790199B2 (ja) 2019-08-27 2019-08-27 コードリーディング支援装置、及び、コードリーディング支援方法、並びに、コードリーディング支援プログラム
JP2020181401A JP6983976B2 (ja) 2019-08-27 2020-10-29 コードリーディング支援装置、及び、コードリーディング支援方法、並びに、コードリーディング支援プログラム

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
JP2019154682A Division JP6790199B2 (ja) 2019-08-27 2019-08-27 コードリーディング支援装置、及び、コードリーディング支援方法、並びに、コードリーディング支援プログラム

Publications (2)

Publication Number Publication Date
JP2021036442A true JP2021036442A (ja) 2021-03-04
JP6983976B2 JP6983976B2 (ja) 2021-12-17

Family

ID=79170129

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2020181401A Active JP6983976B2 (ja) 2019-08-27 2020-10-29 コードリーディング支援装置、及び、コードリーディング支援方法、並びに、コードリーディング支援プログラム

Country Status (1)

Country Link
JP (1) JP6983976B2 (ja)

Also Published As

Publication number Publication date
JP6983976B2 (ja) 2021-12-17

Similar Documents

Publication Publication Date Title
CN110928772A (zh) 一种测试方法及装置
US20090319995A1 (en) Enhancing source code debugging and readability using visual symbols
JP2015043198A (ja) 解析システム、解析方法および解析プログラム
US11726781B2 (en) Code reading supporting device, code reading supporting method, and storage medium
KR102013657B1 (ko) 연관된 다중 파일 정적 분석 장치
Grati et al. Extracting sequence diagrams from execution traces using interactive visualization
KR101711772B1 (ko) 시스템 구축 지원 장치
JP6440895B2 (ja) ソフトウェア分析装置及びソフトウェア分析方法
JP5327230B2 (ja) 運用管理支援プログラム、該プログラムを記録した記録媒体、運用管理支援装置、および運用管理支援方法
JP2007241426A (ja) アプリケーションの障害原因の特定作業支援システム
JP2010237841A (ja) 動作検証装置および動作検証プログラム
JP6790199B2 (ja) コードリーディング支援装置、及び、コードリーディング支援方法、並びに、コードリーディング支援プログラム
JP6983976B2 (ja) コードリーディング支援装置、及び、コードリーディング支援方法、並びに、コードリーディング支援プログラム
CN111026604B (zh) 一种日志文件解析方法及装置
CN112667517A (zh) 自动化测试脚本的获取方法、装置、设备及存储介质
CN111460235A (zh) 图谱数据的处理方法、装置、设备及存储介质
CN109359042B (zh) 一种基于路径搜索算法的自动化测试方法
JP6121558B2 (ja) プログラム図作成装置、プログラム図作成方法、及びプログラム図作成プログラム
JPH03260742A (ja) プログラムのトレース表示方法
WO2021210099A1 (ja) パターン抽出装置、パターン抽出方法及びプログラム
JP2010205162A (ja) モジュール情報作成装置、モジュール情報作成装置のモジュール情報作成方法及びプログラム
JP2009104562A (ja) 業務支援システム及びそれに用いられるプログラム
JP2015114786A (ja) 情報処理システム及びプログラム
JP2019096131A (ja) プログラム関連分析装置
CN113760584A (zh) 一种性能分析数据的获取方法、装置、设备及存储介质

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20201029

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20211026

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20211029

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20211124

R151 Written notification of patent or utility model registration

Ref document number: 6983976

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R151