(57)【要約】      （修正有）【課題】ソースコードの既読部分を表示し、コードリーディング作業の効率を向上させることができる、コードリーディング支援装置、コードリーディング支援方法、及び、コードリーディング支援プログラムを提供する。【解決手段】コードリーディング支援装置１は、ユーザが解読を行った既読コードブロックを特定する操作を受け付ける受付部１３と、既読コードブロックが含まれる既読関数と、既読関数に含まれるすべてのコードブロックと、既読コードブロックと既読関数との呼び出し関係とを表現する既読グラフを生成する生成部１７とを有する。既読関数に含まれる第１コードブロックは、既読グラフにおいて当該第１コードブロックを包含する第２コードブロックと重なる位置に配置され、かつ、第２コードブロックに対して所定幅だけずらして配置される。【選択図】図２
2019215919.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードの解読を支援するコードリーディング支援装置であって、
前記ソースコードに記述された複数の関数、及び、前記複数の関数間の呼び出し関係、及び、前記複数の関数のそれぞれにおける制御構造を表すコードブロックに関する情報を取得する取得部と、
前記ソースコードに記述された複数の前記コードブロックのうち、ユーザが解読を行った既読コードブロックを特定する操作を受け付ける受付部と、
前記複数の関数のうち、前記既読コードブロックが含まれる既読関数と、前記既読関数に含まれるすべての前記コードブロックと、前記既読コードブロックと前記既読関数との呼び出し関係とを表現する既読グラフを生成する生成部と、
を有し、
前記既読関数に含まれるすべての前記コードブロックは、第１コードブロックと当該第１コードブロックを包含する第２コードブロックを含み、
前記第１コードブロックは、前記既読グラフにおいて前記第２コードブロックと重なる位置に配置され、かつ、当該第２コードブロックに対して所定幅だけずらして配置される
コードリーディング支援装置。
【請求項２】
ソースコードの解読を支援するコードリーディング支援装置であって、
前記ソースコードに記述された複数の関数、及び、前記複数の関数間の呼び出し関係、及び、前記複数の関数のそれぞれにおける制御構造を表すコードブロックに関する情報を取得する取得部と、
前記ソースコードに記述された複数の前記コードブロックのうち、ユーザが解読を行った既読コードブロックを特定する操作を受け付ける受付部と、
前記複数の関数のうち、前記既読コードブロックが含まれる既読関数と、前記既読関数に含まれるすべての前記コードブロックと、前記既読コードブロックと前記既読関数との呼び出し関係とを表現する既読グラフを生成する生成部と、
を有し、
前記既読コードブロックと、前記既読関数に含まれるすべての前記コードブロックのうちの前記既読コードブロック以外の他のコードブロックとは、視覚的に異なる態様で前記既読グラフにおいて表現される
コードリーディング支援装置。
【請求項３】
前記他のコードブロックは、前記既読グラフにおいて所定の形状の枠で表現される請求項２記載のコードリーディング支援装置。
【請求項４】
前記既読コードブロックは、前記既読グラフにおいて第１の色で着色されて表現され、
前記他のコードブロックは、前記既読グラフにおいて前記第１の色とは異なる第２の色で着色されて表現される
請求項２記載のコードリーディング支援装置。
【請求項５】
ソースコードの解読を支援するコードリーディング支援方法であって、
前記ソースコードに記述された複数の関数、及び、前記複数の関数間の呼び出し関係、及び、前記複数の関数のそれぞれにおける制御構造を表すコードブロックに関する情報を取得するステップと、
前記ソースコードに記述された複数の前記コードブロックのうち、ユーザが解読を行った既読コードブロックを特定する操作を受け付けるステップと、
前記複数の関数のうち、前記既読コードブロックが含まれる既読関数と、前記既読関数に含まれるすべての前記コードブロックと、前記既読コードブロックと前記既読関数との呼び出し関係とを表現する既読グラフを生成するステップと、
を有し、
前記既読関数に含まれるすべての前記コードブロックは、第１コードブロックと当該第１コードブロックを包含する第２コードブロックを含み、
前記第１コードブロックは、前記既読グラフにおいて前記第２コードブロックと重なる位置に配置され、かつ、当該第２コードブロックに対して所定幅だけずらして配置される
コードリーディング支援方法。
【請求項６】
ソースコードの解読を支援するコードリーディング支援方法であって、
前記ソースコードに記述された複数の関数、及び、前記複数の関数間の呼び出し関係、及び、前記複数の関数のそれぞれにおける制御構造を表すコードブロックに関する情報を取得するステップと、
前記ソースコードに記述された複数の前記コードブロックのうち、ユーザが解読を行った既読コードブロックを特定する操作を受け付けるステップと、
前記複数の関数のうち、前記既読コードブロックが含まれる既読関数と、前記既読関数に含まれるすべての前記コードブロックと、前記既読コードブロックと前記既読関数との呼び出し関係とを表現する既読グラフを生成するステップと、
を有し、
前記既読コードブロックと、前記既読関数に含まれるすべての前記コードブロックのうちの前記既読コードブロック以外の他のコードブロックとは、視覚的に異なる態様で前記既読グラフにおいて表現される
コードリーディング支援方法。
【請求項７】
ソースコードの解読を支援するためのコードリーディング支援プログラムであって、コンピュータに、
前記ソースコードに記述された複数の関数、及び、前記複数の関数間の呼び出し関係、及び、前記複数の関数のそれぞれにおける制御構造を表すコードブロックに関する情報を取得するステップと、
前記ソースコードに記述された複数の前記コードブロックのうち、ユーザが解読を行った既読コードブロックを特定する操作を受け付けるステップと、
前記複数の関数のうち、前記既読コードブロックが含まれる既読関数と、前記既読関数に含まれるすべての前記コードブロックと、前記既読コードブロックと前記既読関数との呼び出し関係とを表現する既読グラフを生成するステップと、
を実行させ、
前記既読関数に含まれるすべての前記コードブロックは、第１コードブロックと当該第１コードブロックを包含する第２コードブロックを含み、
前記第１コードブロックは、前記既読グラフにおいて前記第２コードブロックと重なる位置に配置され、かつ、当該第２コードブロックに対して所定幅だけずらして配置される
コードリーディング支援プログラム。
【請求項８】
ソースコードの解読を支援するためのコードリーディング支援プログラムであって、コンピュータに、
前記ソースコードに記述された複数の関数、及び、前記複数の関数間の呼び出し関係、及び、前記複数の関数のそれぞれにおける制御構造を表すコードブロックに関する情報を取得するステップと、
前記ソースコードに記述された複数の前記コードブロックのうち、ユーザが解読を行った既読コードブロックを特定する操作を受け付けるステップと、
前記複数の関数のうち、前記既読コードブロックが含まれる既読関数と、前記既読関数に含まれるすべての前記コードブロックと、前記既読コードブロックと前記既読関数との呼び出し関係とを表現する既読グラフを生成するステップと、
を実行させ、
前記既読コードブロックと、前記既読関数に含まれるすべての前記コードブロックのうちの前記既読コードブロック以外の他のコードブロックとは、視覚的に異なる態様で前記既読グラフにおいて表現される
コードリーディング支援プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本実施形態は、コードリーディング支援装置、及び、コードリーディング支援方法、並びに、コードリーディング支援プログラムに関する。
【背景技術】
【０００２】
ソフトウェアを開発、改良、保守するためには、ソフトウェアの理解が重要となる。しかし、ソフトウェアは大規模になればなるほど、その構造は複雑なものとなり、把握することが困難になる。従来、プログラムのデバックを行う場合、ディスプレイやプリントアウトされた紙に表示されたソースコードを、目視によりチェックすることが一般的に行われている。
【０００３】
しかし、大量のソースコードによって生成された大規模プログラムの場合、これらのソースコードを解読する作業（以下、コードリーディングと示す）は困難を伴い、高いスキルも要求される。コードリーディングを支援するために、ソースコードを静的に解析して、プログラムにおける関数の呼び出し関係を自動的に作成し、図示する装置が知られている。また、ソースコードから生成されたUMLクラス図やシーケンス図上に、デバック実行で得られた情報をマッピングし、実行パスを表示する装置も知られている（例えば、非特許文献１参照）。
【０００４】
一般的に、実行パスを辿りながらコードリーディングを行う場合、関数内の一部を読む場合がある。しかし、上述の装置においては、関数の呼び出し関係を図で確認しながらソースコードを解読する場合、生成される関数呼び出し関係の図は、図示する要素の最小単位が関数であるため、関数の中のどの部分が既読であり、どの部分が未読であるかを確認することができないという問題があった。UMLクラス図やシーケンス図上に実行パスを表示する場合にも、クラス図中のどの部分が既読であり、どの部分が未読であるかを判別できないという問題があった。
【０００５】
また、大規模なソースコードの場合、複数の作業者で分担してコードリーディングを行うが、既読部分がわからなければ、メンバ間で進捗を確認したり、各自が理解した内容を共有したりするのは困難であるため、コードリーディング作業の効率が悪くなってしまうという問題があった。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】大村裕、渡部卓雄著「プログラム理解のためのコードリーディング支援ツールの提案と実装」日本ソフトウェア科学大会論文集  ３１  ４４３−４４６、２０１４年
【発明の概要】
【発明が解決しようとする課題】
【０００７】
本実施形態は、ソースコードの既読部分を表示し、コードリーディング作業の効率を向上させることができる、コードリーディング支援装置、及び、コードリーディング支援方法、並びに、コードリーディング支援プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
実施形態によれば、ソースコードの解読を支援するコードリーディング支援装置が提供される。前記コードリーディング支援装置は、前記ソースコードに記述された複数の関数、及び、前記複数の関数間の呼び出し関係、及び、前記複数の関数のそれぞれにおける制御構造を表すコードブロックに関する情報を取得する取得部と、前記ソースコードに記述された複数の前記コードブロックのうち、ユーザが解読を行った既読コードブロックを特定する操作を受け付ける受付部と、前記複数の関数のうち、前記既読コードブロックが含まれる既読関数と、前記既読関数に含まれるすべての前記コードブロックと、前記既読コードブロックと前記既読関数との呼び出し関係とを表現する既読グラフを生成する生成部と、を有する。前記既読関数に含まれるすべての前記コードブロックは、第１コードブロックと当該第１コードブロックを包含する第２コードブロックを含む。前記第１コードブロックは、前記既読グラフにおいて前記第２コードブロックと重なる位置に配置され、かつ、当該第２コードブロックに対して所定幅だけずらして配置される。
【図面の簡単な説明】
【０００９】
【図１】本実施形態に係わる情報処理装置の構成の一例を示す概略図。
【図２】本実施形態に係わるコードリーディング支援装置の構成の一例を示す概略ブロック図。
【図３】コードリーディングの対象となるソースコードの一例を示す図。
【図４】関数情報表の一例を示す図。
【図５】呼び出し関係情報表の一例を示す図。
【図６】コードブロック情報表の一例を示す図。
【図７】コードリーディング支援動作中の表示画面の一例を示す図。
【図８】移動履歴情報表の一例を示す図。
【図９】既読コードブロック情報表の一例を示す図。
【図１０】図１０は、既読グラフの一例を説明する図。
【図１１】本実施形態におけるコードリーディング支援方法の一例を説明するフローチャート。
【発明を実施するための形態】
【００１０】
以下、図面を参照して実施形態を説明する。
【００１１】
図１は、本実施形態に係わる情報処理装置の構成の一例を示す概略図である。図１に示すように、情報処理システム１００は、本体装置１０１と、各種データを記憶する記憶装置１０２と、各種データを表示する表示装置１０３とを有して構成されている。本体装置１０１は、パーソナルコンピュータなどのコンピュータ装置本体であり、CPU１０１a、図示しないメモリなどを搭載している。また、本体装置１０１には、入力装置として、キーボード１０４及びマウス１０５が接続されている。本体装置１０１は、これらの入力装置を用いてユーザから入力される指示に基づいて、各種プログラムを実行する。
【００１２】
記憶装置１０２には、ソースコード１０６と、このソースコード１０６のコードリーディングを支援するためにソースコードの解析を行うコードリーディング支援プログラム１０７とが記憶されている。
【００１３】
ユーザは、キーボード１０４及びマウス１０５を用い、ソースコード１０６を入力とし、コードリーディング支援プログラム１０７を本体装置１０１上において実行することにより、ソースコードの解析結果を表示装置１０３に表示させることができる。なお、ソースコード１０６やコードリーディング支援プログラム１０７は、本体装置１０１内の図示しないメモリに格納していてもよい。また、本体装置１０１にインターネット回線２００などを介して接続されているクラウドサーバ３００などに記憶しておき、必要に応じてダウンロードして実行してもよい。
【００１４】
次に、このように構成されるコードリーディング支援装置１の構成について説明する。図２は、本実施の形態に係わるコードリーディング支援装置の構成の一例を示す概略ブロック図である。ユーザがソースコード１０６を入力し、コードリーディング支援プログラム１０７を本体装置１０１上において実行することにより、コードリーディング支援装置１が実行される。
【００１５】
コードリーディング支援装置１は、コード解析部１１と、ユーザ操作受付部１３と、既読推定部１５と、既読グラフ生成部１７とを有して構成される。また、コードリーディング支援装置１は、コード情報記憶部１２と、ユーザ操作記憶部１４と、推定情報記憶部１６と、コード画像生成部１８と、既読グラフ画像生成部１９とも有する。
【００１６】
コード解析部１１は、入力されたソースコード１０６の構文解析を行う。解析の結果として、関数情報、関数の呼び出し関係情報、コードブロック情報を取得する。
【００１７】
関数情報は、ソースコード１０６に記述されている関数について、関数名、関数定義の開始行番号、及び、終了番号の情報である。取得した関数情報は、コード情報記憶部１２の関数情報表１２１に記録する。
【００１８】
関数情報表１２１に記録する関数情報について、ソースコードの一例を用いて具体的に説明する。図３は、コードリーディングの対象となるソースコードの一例を示す図である。また、図４は、関数情報表の一例を示す図である。
【００１９】
図３に示すソースコード１０６は、C言語で記述されており、関数a、b、c、d、e、f、の６つの関数が定義されている。
【００２０】
関数aは、１行目から３行目に記述されているので、開始行番号は１、終了行番号は３となる。関数bは、５行目から１１行目に記述されているので、開始行番号は５、終了行
番号は１１となる。関数cは、１３行目から１５行目に記述されているので、開始行番号は１３、終了行番号は１５となる。関数dは、１７行目から１９行目に記述されているので、開始行番号は１７、終了行番号は１９となる。関数eは、２１行目から２３行目に記述されているので、開始行番号は２１、終了行番号は２３となる。関数fは、２５行目から２７行目に記述されているので、開始行番号は２５、終了行番号は２７となる。
【００２１】
関数情報表１２１には、１つの関数につき、関数名、開始行番号、終了行番号、の３つのデータを１レコードとして登録する。従って、図３に示すソースコード１０６をコード解析部１１で解析した結果、関数情報表１２１には、図４に示すように、関数a、関数b、関数c、関数d、関数e、関数fの６つの関数についての６つのレコードが登録される。
【００２２】
関数の呼び出し関係情報は、ソースコード１０６に記述されている関数において、関数内から他の関数を呼び出している場合に、呼び出し元関数と呼び出し先関数の関係を示す情報である。具体的には、呼び出し元の関数名、呼び出し先の関数名、関数を呼び出している行番号の情報である。取得した関数の呼び出し関係情報は、コード情報記憶部１２の呼び出し関係情報表１２２に記録する。
【００２３】
呼び出し関係情報表１２２に記録する、関数の呼び出し関係情報について、図３に示すソースコードの一例を用いて具体的に説明する。図５は、呼び出し関係情報表の一例を示す図である。
【００２４】
図３に示すソースコード１０６に記述された、関数a、関数b、関数c、関数d、関数e、関数fの６つの関数について、それぞれ関数内部から他の関数を呼び出しているか否かを解析する。関数aは、２行目において関数bを呼び出している。関数bは、７行目において関数cを呼び出している。また、９行目において関数fを呼び出している。関数cは、１４行目において関数dを呼び出している。関数dは、１８行目において関数eを呼び出している。関数eは、他の関数を呼び出していない。関数fは、２６行目において関数eを呼び出している。
【００２５】
呼び出し関係情報表１２２には、１つの関数の呼び出し関係につき、呼び出し元関数名、呼び出し先関数名、呼び出し行番号、の３つのデータを１レコードとして登録する。従って、図３に示すソースコード１０６をコード解析部１１で解析した結果、呼び出し関係情報表１２２には、図５に示すように、関数aから関数bの呼び出し、関数bから関数cの呼び出し、関数bから関数fの呼び出し、関数cから関数dの呼び出し、関数dから関数eの呼び出し、関数fから関数eの呼び出し、の６つの呼び出し関係についての６つのレコードが登録される。
【００２６】
コードブロック情報は、ソースコード１０６に記述されている関数について、関数内に存在するコードブロックの範囲と、コードブロック間の包含関係を示す情報である。なお、コードブロックとは、関数内におけるコードのまとまりであり、分岐や選択などの制御構造を表すものである。例えば、「｛」で開始され、「｝」で終了するコードのまとまりを、コードブロックと設定することができる。
【００２７】
各コードブロックには、解析対象のソースコード１０６内で一意に識別可能なIDが割り当てられる。ソースコード１０６の同じ行に複数のコードブロックが存在する場合、包含関係を行番号から計算し、コードブロックの範囲が広いものを親コードブロックとする。
【００２８】
コードブロック情報として取得する情報は、具体的には、コードブロックID、開始行番号、終了行番号、親コードブロックIDの情報である。取得したコードブロック情報は、コード情報記憶部１２のコードブロック情報表１２３に記録する。コードブロック情報について、図６を用いて具体的に説明する。図６は、コードブロック情報表の一例を示す図である。図６（ａ）は、コードブロックの範囲を明示したソースコードの一例であり、図６（ｂ）は、図６（ａ）のソースコードに対応するコードブロック情報表１２３を示している。なお、図６（ａ）に示したソースコードは、図３に示すソースコードと同様である。
【００２９】
まず、ソースコード１０６の１行目から順に、コードブロックの開始を示す「｛」を探索する。すると、１行目に「｛」が抽出される。従って、最初のコードブロック（ID１のコードブロック）の開始行番号は１となる。続いて、当該コードブロックの終了を示す「｝」を探索する。すると、３行目に「｝」が抽出される。従って、ID１のコードブロックの終了行番号は３となる。
【００３０】
続いて、５行目に、次のコードブロックの開始を示す「｛」が抽出される。従って、２番目のコードブロック（ID２のコードブロック）の開始行番号は５となる。続いて、当該コードブロックの終了を示す「｝」を探索する。すると、「｝」を抽出する前に、次のコードブロックの開始を示す「｛」が、６行目で抽出される。従って、ID２のコードブロックが終了する前に、ID３のコードブロックが開始され、その開始行番号は６であると解析される。
【００３１】
次に、後から開始されたコードブロックである、ID３のコードブロックの終了を示す「｝」を探索する。すると、７行目に「｝」が抽出される。従って、ID３のコードブロックの終了行番号は７となる。続いて、ID２のコードブロックの終了を示す「｝」を探索する。すると、「｝」を抽出する前に、次のコードブロックの開始を示す「｛」が、８行目で抽出される。従って、ID２のコードブロックが終了する前に、ID４のコードブロックが開
抽出される。従って、ID２のコードブロックが終了する前に、ID４のコードブロックが開始され、その開始行番号は８であると解析される。
【００３２】
次に、後から開始されたコードブロックである、ID４のコードブロックの終了を示す「｝」を探索する。すると、９行目に「｝」が抽出される。従って、ID４のコードブロックの終了行番号は９となる。続いて、ID２のコードブロックの終了を示す「｝」を探索する。すると、１１行目に「｝」が抽出される。従って、ID２のコードブロックの終了行番号は１１となる。
【００３３】
このようにして、コードブロックの開始を示す「｛」と、終了を示す「｝」を順に探索していくことにより、コードブロックの範囲を特定する。図６(ａ)に示すソースコードの場合、コードブロックはID１からID８の８個のコードブロックが存在し、各コードブロックの範囲は、各IDの左側に図示した太線で示す範囲であると解析される。
【００３４】
なお、６行目から９行目は、複数のコードブロックが存在する。具体的には、６行目と７行目には、ID２とID３のコードブロックが存在し、８行目と９行目には、ID２とID４のコードブロックが存在する。そこで、それぞれのコードブロックについて、包含関係を調べる。
【００３５】
ID２のコードブロックの開始行番号は５、終了行番号は１１であるので、その範囲は７行である。一方、ID３のコードブロックの開始行番号は６、終了行番号は７であるので、その範囲は２行である。従って、ID２のコードブロックの範囲のほうが、ID３のコードブロックの範囲より広いため、ID３のコードブロックはID２のコードブロックのコードブロックに包含されていると判定される。すなわち、ID３のコードブロックの親コードブロックIDは２であると解析される。
【００３６】
また、ID４のコードブロックの開始行番号は８、終了行番号は９であるので、その範囲は２行である。従って、ID２のコードブロックの範囲のほうが、ID４のコードブロックの範囲より広いため、ID４のコードブロックはID２のコードブロックのコードブロックに包含されていると判定される。すなわち、ID４のコードブロックの親コードブロックIDは２であると解析される。
【００３７】
コードブロック情報表１２３には、１つのコードブロックにつき、コードブロックID、開始行番号、終了行番号、親コードブロックID、の４つのデータを１レコードとして登録する。従って、図６（ａ）に示すソースコード１０６をコード解析部１１で解析した結果、コードブロック情報表１２３には、図６（ｂ）に示すように、ID１からID８のコードブロックについて、８つのレコードが登録される。
【００３８】
コード情報記憶部１２は、コード解析部１１によってソースコード１０６を解析した結果得られた、関数情報と、関数の呼び出し関係情報と、コードブロック情報とを記憶する。関数情報は、関数情報表１２１に格納され、関数の呼び出し関係情報は、呼び出し関係情報表１２２に格納され、コードブロック情報は、コードブロック情報表１２３に格納される。関数情報表１２１と、呼び出し関係情報表１２２と、コードブロック情報表１２３に格納されたデータは、必要に応じて、ユーザ操作受付部１３、既読推定部１５、既読グラフ生成部１７から読み出される。
【００３９】
ユーザ操作受付部１３は、表示装置１０３に表示されているソースコード１０６上にセットされたカーソル位置の行番号と文字列とを読み込んで、当該行において関数が呼び出されている場合、呼び出されている関数の定義箇所を探索する。そして、呼び出し先の関数を表示するよう、コード画像生成部１８に依頼する。なお、ユーザ操作受付部１３は、コードリーディング支援装置１の動作中に、表示装置１０３に表示されている関数定義移動ボタン１７２をユーザが押下することにより、動作する。
【００４０】
ここで、コードリーディング支援装置１の動作中に、表示装置１０３に表示されている画面について、図７を用いて説明する。図７は、コードリーディング支援動作中の表示画面の一例を示す図である。
【００４１】
図７に示すように、コードリーディング支援動作中、表示装置１０３には、ソースコード表示画面１８１と、既読グラフ表示画面１７１と、関数定義移動ボタン１７２とが表示される。
【００４２】
ソースコード表示画面１８１には、解析対象のソースコード１０６において、ユーザが目視チェックを行っている箇所が表示される。ソースコード表示画面１８１には、特定の行を指し示すカーソル１８２が配置されている。ソースコード表示画面１８１の表示内容（画面上に表示されるソースコードの部分）は、コード画像生成部１８によって生成される。
【００４３】
既読グラフ表示画面１７１には、ユーザが既読したコードブロック、及び、当該コードブロックの呼び出し関係が図示される。既読グラフ表示画面１７１の表示内容は、既読グラフ画像生成部１９によって生成される。
【００４４】
関数定義移動ボタン１７２は、カーソル１８２が位置する行において、関数が呼び出されている場合、呼び出し先の関数の定義箇所を、ソースコード表示画面１８１に表示させる。関数定義移動ボタン１７２をユーザが押下すると、カーソル１８２が位置する行番号と文字列（ソースコード１０６における当該行の記述内容）とがユーザ操作受付部１３に入力される。
【００４５】
ユーザ操作受付部１３は、入力された文字列の字句解析を、コード解析部１１に依頼する。カーソル１８２が位置する行において関数が呼び出されている場合、コード解析部１１から、関数名を取得する。例えば、図７において、ソースコードの１４行目にカーソル１８２が位置する状態で関数定義移動ボタン１７２が押下された場合、ユーザ操作受付部１３には、行番号１４と、文字列“d();”が入力される。ユーザ操作受付部１３は、コード解析部１１に文字列“d();”の解析を依頼する。そして、解析の結果として、関数名dをコード解析部１１から取得する。
【００４６】
次に、ユーザ操作受付部１３は、呼び出されている関数の定義箇所を探索する。具体的には、関数情報表１２１から、コード解析部１１から取得した関数名のレコードを抽出し、当該レコードの開始行番号を取得する。例えば、コード解析部１１から関数名dを取得した場合、関数情報表１２１から関数名がdであるレコードを探索する。図４に示す関数情報表１２１の場合、４行目のレコードが抽出され、開始行番号１７を取得する。そして、ユーザ操作受付部１３は、関数情報表１２１から取得した開始行番号をコード画像生成部１８に入力し、当該行番号を含む箇所のソースコードをソースコード表示画面１８１に表示するよう依頼する。
【００４７】
また、ユーザ操作受付部１３は、移動元の行番号（関数定義移動ボタン１７２が押下されたときに、カーソルが位置していた行番号）と、移動先の行番号（コード画像生成部１８に対し、表示の依頼をした行番号）とを、移動履歴情報として、ユーザ操作記憶部１４の移動履歴情報表１４１に記録する。図８は、移動履歴情報表の一例を示す図である。移動履歴情報表１４１は、関数定義移動ボタン１７２をユーザが押下ことにより、ある関数から、当該関数内で呼び出されている別の関数に表示を移動させた際に、その移動の履歴を記録するものである。移動履歴情報表１４１には、１つの移動履歴につき、移動元行番号、移動先行番号、の２つのデータを１レコードとして登録する。
【００４８】
例えば、関数aから関数b、関数bから関数c、関数cから関数dへの移動を、関数定義移動ボタン１７２を押下することにより実行した場合について、以下、説明する。１レコード目には、関数aから関数bへの移動に関する情報が記録される。すなわち、移動元行番号には、関数aにおいて関数bを呼び出している行番号である２が登録され、移動先行番号には、関数bの開始行番号である１５が登録される。２レコード目には、関数bから関数cへの移動に関する情報が記録される。すなわち、移動元行番号には、関数bにおいて関数cを呼び出している行番号である７が登録され、移動先行番号には、関数cの開始行番号である１３が登録される。３レコード目には、関数cから関数dへの移動に関する情報が記録される。すなわち、移動元行番号には、関数cにおいて関数dを呼び出している行番号である１４が登録され、移動先行番号には、関数dの開始行番号である１７が登録される。
【００４９】
ユーザ操作記憶部１４は、関数定義移動ボタン１７２をユーザが押下ことにより、ある関数から、当該関数内で呼び出されている別の関数に、ソースコードの表示箇所を移動させた際の移動の履歴を、移動履歴情報表１４１に格納して記憶する。移動履歴情報表１４１に格納されたデータは、必要に応じて、既読推定部１５から読み出される。
【００５０】
既読推定部１５は、ソースコードにおいて、ユーザが既読した部分の判定、及び、既読部分の推定を行う。既読部分の判定、及び、推定は、コードブロック単位で行う。既読部分の判定は、移動履歴情報表１４１に基づき行う。すなわち、移動履歴情報表１４１の移動元行番号、及び、移動先行番号に、行番号が含まれているコードブロックは、既読とする。
【００５１】
まず、移動履歴情報表１４１に記録した行番号が含まれる関数の関数名を、関数情報表１２１から抽出し、どの関数からどの関数へ移動したかを特定する。例えば、図８に示す移動履歴情報表１４１の場合、１レコード目は移動元が関数a、移動先が関数bであり、２レコード目は、移動元が関数b、移動先が関数cである。更に、３レコード目は、移動元が関数cであり、移動先が関数dであると特定される。
【００５２】
次に、ｎ番目のレコードの移動先の関数名と、ｎ＋１番目のレコードの移動元の関数名が一致するか否かを判定する。両者が一致する場合、関数定義移動ボタン１７２により関数の呼び出しが行われ移動履歴が記録されているので、移動履歴情報表１４１において関数の呼び出し関係につながりがあると判定する。一方、両者が一致しない場合、ユーザが画面をスクロールするなどして呼び出し先の関数に移動したために移動履歴が記録されていないので、移動履歴情報表１４１において関数の呼び出し関係につながりがないと判定する。
【００５３】
上述の一例の場合、１番目のレコードの移動先の関数名と、２番目のレコードの移動元の関数名は、共に関数bであるので、１番目のレコードから２番目のレコードへの呼び出し関係にはつながりがあると判定する。また、２番目のレコードの移動先の関数名と、３番目のレコードの移動元の関数名は、共に関数cであるので、２番目のレコードから３番目のレコードへの呼び出し関係にもつながりがあると判定する。
【００５４】
つながりがあると判定された場合、移動履歴情報表１４１に移動元行番号と移動先行番号が含まれるコードブロックのIDを、既読コードブロックとして、コードブロック情報表１２３から抽出する。上述の一例の場合、移動履歴情報表１４１に記録されている行番号は、２、５、７、１３、１４、１７であり、これらが含まれるコードブロックのIDは、ID１、ID２、ID３、ID５、ID５、ID６となる。
【００５５】
そして、これらのコードブロックが属する関数名を関数情報表１２１から抽出し、推定情報記憶部１６の既読コードブロック情報表１６１に記録する。例えば、図４に示す関数情報表１２１の場合、行番号２を含むID１のコードブロックは、関数aに属し、行番号５を含むID２のコードブロックは、関数bに属する。また、行番号７を含むID３のコードブロックは、関数bに属し、行番号１３を含むID５のコードブロックは、関数cに属する。また、行番号１４を含むID５のコードブロックは、関数cに属し、行番号１７を含むID６のコードブロックは、関数dに属する。
【００５６】
既読推定部１５は、既読と判定したコードブロックの関数名とコードブロックIDとを、推定情報記憶部１６の既読コードブロック情報表１６１に記録する。図９は、既読コードブロック情報表の一例を説明する図である。なお、既読コードブロック情報表１６１には、IDが重複するコードブロックは、ひとつのレコードにまとめて記録する。上述の場合、ID５のコードブロックが重複しているため、既読コードブロック情報表１６１には、５つのレコードが登録される。
【００５７】
すなわち、関数名がa、コードブロックIDが１のレコードと、関数名がb、コードブロックIDが２のレコードと、関数名がb、コードブロックIDが３のレコードと、関数名がc、コードブロックIDが５のレコードと、関数名がd、コードブロックIDが６のレコードが、既読コードブロック情報表１６１に登録される。
【００５８】
次に、移動履歴情報表１４１において関数の呼び出し関係につながりがないレコードがあると判定された場合について、説明する。例えば、図８に示す移動履歴情報表１４１の２レコード目、すなわち、関数bから関数cへの移動をユーザがスクロールなどで行ったために、移動履歴情報表１４１に記録されていない場合について説明する。
【００５９】
この場合、１番目のレコードの移動先の関数名は関数bであるが、２番目のレコードの移動元の関数名は関数cであるので、１番目のレコードから２番目のレコードへの呼び出し関係にはつながりがないと判定する。つながりがないと判定した場合、関数bと関数cとをつなぐ呼び出し関係を、呼び出し関係表１２２から探索する。すなわち、呼び出し関係表１２２の呼び出し先関数名が関数cであるレコードを抽出し、当該レコードの呼び出し元関数名が関数bであるか否かを判定する。抽出したレコードが複数存在する場合、抽出した全てのレコードについて判定する。
【００６０】
抽出したレコードのなかに、呼び出し元関数名が関数bであるものが存在する場合、呼び出し関係の探索を終了する。一方、呼び出し元関数名が関数bであるものが存在しない場合、当該レコードの呼び出し元関数名を呼び出し先関数名とし、再び呼び出し関係表１２２の探索を行う。呼び出し元関数名が関数bであるレコードに到達した場合、つながりがない部分の推定を完了し、探索を終了する。
【００６１】
図５に示す呼び出し関係表１２２の場合、２レコード目が抽出される。このレコードは、呼び出し先関数名が関数bであるので、ここで探索を終了する。そして、抽出したレコードの呼び出し行番号に記録されている行が含まれるコードブロックを、コードブロック情報表１２３から抽出する。上述の場合、抽出したレコードの呼び出し行番号は７であり、７行目が含まれるコードブロックはID３である。
【００６２】
ここで、移動履歴情報表１４１に移動元行番号と移動先行番号が含まれるコードブロックのIDを、既読コードブロックとして、コードブロック情報表１２３から抽出する。上述の一例の場合、移動履歴情報表１４１に記録されている行番号は、２、５、１４、１７であり、これらが含まれるコードブロックのIDは、ID１、ID２、ID５、ID６となる。これらは、既読部分と判定されたコードブロックである。これら４つのコードブロックに、関数の呼び出し関係のつながりを探索することにより既読部分と推定されたコードブロック（＝ID３）を追加し、５つのコードブロックのIDと関数名とを、既読コードブロック情報表１６１に登録する。
【００６３】
推定情報記憶部１６は、ユーザが既読した、あるいは既読したと推定されるコードブロックの一覧を、既読コードブロック情報表１６１に格納して記憶する。既読コードブロック情報表１６１に格納されたデータは、必要に応じて、既読グラフ生成部１７から読み出される。
【００６４】
既読グラフ生成部１７は、ユーザが既読した、あるいは既読したと推定される関数を、既読グラフとして生成する。既読グラフは、コード情報記憶部１２と、推定情報記憶部１６に格納されている情報に基づき生成される。図１０は、既読グラフの一例を説明する図である。
【００６５】
既読グラフは、関数を図で表現する。既読コードブロック情報表１６１から関数名を取得し、取得した関数を、関数を表す記号と関数名とを用いて図示する。例えば、図１０に示すように、既読コードブロック情報表１６１から取得した関数、すなわち、ユーザが既読した関数は、黒丸形状で示す関数記号１７３の上部に関数名が表記される。例えば、図９に示す既読コードブロック情報表１６１に基づき既読グラフを生成する場合、図１０に示すように、既読グラフには、関数a、関数b、関数c、関数dの４つの関数が図示される。
【００６６】
次に、図示した関数の開始行番号と終了行番号とを。関数情報表１２１から取得する。そして、取得した行番号の範囲に含まれるコードブロックを、コードブロック情報表１２３から取得する。例えば、図４に示す関数情報表１２１の場合、関数cの開始行番号は１３、終了行番号は１５となる。図６に示すコードブロック情報表１２３の場合、この範囲に含まれるのは、ID５のコードブロックである。取得したコードブロックは、当該関数記号１７３の下に、例えば縦長の矩形状のコードブロック記号１７４で図示される。なお、コードブロック記号１７４の近傍に、コードブロックIDを記してもよい。
【００６７】
例えば、関数bのように、複数のコードブロックを有する関数は、抽出されたコードブロックの親子関係（包含関係）を、コードブロック情報表１２３で確認する。関数記号１７３の下に、親コードブロックを示すコードブロック記号１７４を図示し、子コードブロックを示すコードブロック記号１７５ａ、１７５ｂは、親コードブロック記号１７４の上に重ねて図示する。なお、複数の子コードブロックが包含されている場合、開始行番号の小さいコードブロックから順に、親コードブロック記号１７４の上に配置する。
【００６８】
なお、子コードブロック記号１７５ａ、１７５ｂによって親コードブロック記号１７４が見えづらくなるのを防止するため、子コードブロック記号１７５ａ、１７５ｂは、親コードブロック記号１７４に対して左右どちらかに所定幅だけずらして図示したり、親コードブロック記号１７４よりも細い幅で図示したりするとよい。
【００６９】
なお、既読コードブロック情報表１６１に記録されているコードブロックと、記録されていないコードブロックは、既読・未読を色覚的に容易に区別可能にするために、異なる表記方法を用いる。
【００７０】
例えば、既読コードブロック情報表１６１に記録されているコードブロック（既読コードブロック、または、既読と推定されたコードブロック）は、コードブロック記号１７４のように内部を網掛け表記したり、所定の色で着色したりする。一方、既読コードブロック情報表１６１に記録されていないコードブロック（未読コードブロック）は、コードブロック記号１７５ｂのように、矩形の外枠だけ図示したり、既読コードブロックのコードブロック記号１７４と異なる色で着色したりする。
【００７１】
次に、既読グラフに図示したコードブロック記号に関し、関数の呼び出し関係を図示する。既読コードブロック情報表１６１には、コードリーディングを開始してから呼び出した順にコードブロックIDが記録されている。従って、ｎ番目のレコードに格納されているコードブロックIDを示すコードブロック記号と、ｎ＋１番目のレコードに格納されている関数名を示す関数記号１７３との間を矢印１７６でつなぎ、呼び出し関係を図示する。
【００７２】
図４に示す関数情報表１２１と、図６に示すコードブロック情報表１２３と、図９に示す既読コードブロック情報表１６１を用いると、例えば、図１０に示す既読グラフが生成される。すなわち、最初に関数aのID１のコードブロックを既読する。ID１のコードブロックから関数bが呼び出される。関数bは、包含関係を有する３つのコードブロックから構成されており、ID２の親コードブロックに、ID３とID４の子コードブロックが含まれている。関数bを呼び出すことで、まず、ID２の親コードブロックが既読となり、続いてID３の子コードブロックを既読する。ID３の子コードブロックから関数cが呼び出され、関数cのID５のコードブロックが既読となる。続いて、ID５のコードブロックから関数dが呼び出され、関数dのID６のコードブロックが既読となる。
【００７３】
図１０の既読グラフは、関数の呼び出し関係と、関数を構成するコードブロックが明確に表現されており、既読のコードブロックと未読のコードブロックとが識別可能に表現されている。従って、ユーザが、ソースコードの既読部分と未読部分を容易に把握することができる。
【００７４】
コード画像生成部１８は、コードリーディング支援装置１に入力されたソースコード１０６を、コード解析部１１で字句解析し、該ソースコードを記述した言語の表記に応じた記述内容を、ソースコード表示画面１８１に表示する画像を生成する。また、ユーザが関数定義移動ボタン１７２を押下する都度、カーソル１８２が配置されている行に記述されている呼び出し先の関数の定義箇所が、ソースコード表示画面１８１に表示されるよう、画像を生成しなおす。
【００７５】
既読グラフ画像生成部１９は、既読グラフ生成部１７が生成した既読グラフに基づき、既読グラフ表示画面１７１に表示する画像を生成する。また、ユーザが関数定義移動ボタン１７２を押下する都度、既読グラフ生成部１７が生成した既読グラフを読み込み、画像を生成しなおす。
【００７６】
次に、本実施形態におけるコードリーディング支援方法について、図１１を用いて説明する。図１１は、本実施形態におけるコードリーディング支援方法の一例を説明するフローチャートである。
【００７７】
まず、記憶装置１０２などに格納されているソースコード１０６を、コードリーディング支援装置１に読み込む（Ｓ１）。コード解析部１１は、読み込んだソースコード１０６の字句解析を行う（Ｓ２）。解析の結果、表示装置１０３のソースコード表示画面１８１に、先頭行から所定行数分のソースコード１０６が表示される。ユーザは、ソースコード表示画面１８１に表示されるカーソル１８２をマウス１０５やキーボード１０４入力によりスクロールさせ、次にチェックする関数が呼び出されている行にカーソル１８２を移動させる。
【００７８】
この状態で、ユーザが関数定義移動ボタン１７２を押下すると、カーソル１８２が位置する行番号と文字列（ソースコード１０６における当該行の記述内容）とがユーザ操作受付部１３に入力される（Ｓ３）。続いて、コード解析部１１において、入力された文字列の字句解析が行われ、カーソル１８２位置に記述された関数名（移動先の関数名）が特定される（Ｓ４）。ユーザ操作記憶部１４は、関数の移動の履歴を、移動履歴情報表１４１に格納して記憶する。
【００７９】
次に、既読推定部１５は、移動履歴情報表１４１、及び、既読コードブロック情報表１６１を参照し、前回既読箇所の判定及び推定を行ってから、ユーザが新たに既読した部分の判定及び既読部分の推定を行う（Ｓ５）。新たに既読と特定されたコードブロック、または、既読と推定されたコードブロックに関する情報は、既読コードブロック情報表１６１に記憶される。
【００８０】
続いて、既読グラフ生成部１７は、既読コードブロック情報表１６１に新たに追加されたレコードや、コード情報記憶部１２に格納されている必要な情報を用いて、既読グラフを生成する。既読グラフ画像生成部１９は、既読グラフ生成部１７で生成された既読グラフに基づき、既読グラフ表示画面１７１に表示する画像を生成する（Ｓ６）。そして、表示装置１０３の既読グラフ表示画面１７１に、Ｓ６で生成した既読グラフ画像を出力し表示させる（Ｓ７）。
【００８１】
次の関数に移動してコードリーディングを継続する場合（Ｓ８、ＮＯ）、Ｓ３に戻り、次にチェックする関数が呼び出されている行にカーソル１８２を移動させて、関数定義移動ボタン１７２を押下する。一方、コードリーディングを終了する場合（Ｓ８、ＹＥＳ）、既読コードブロック情報表１６１を既読情報として保存し（Ｓ９）、一連の処理を終了する。
【００８２】
このように、本実施形態によれば、コードリーディングを行う際に、ソースコードの既読部分に関し、既読した関数の名称、該関数に含まれるコードブロック、コードブロックと関数間の呼び出し関係を組み合わせ、その構造を表現した既読グラフを表示する。更に、既読グラフには、コードブロック単位で、既読、未読を識別可能に表現させる。従って、関数内のどのコードブロックを辿ってソースコードの解読を行ったかを容易に把握することができる。また、未読部分も容易に把握することができる。
【００８３】
更に、解読を行った経路（実行パス）の情報が、既読コードブロック情報表に保存しているので、複数の作業者で分担してコードリーディングを行う場合にも、各自の既読部分を他の作業者が共有することができ、コードリーディングの作業効率が向上する。
【００８４】
また、ユーザが、画面をスクロールするなどして呼び出し先の関数に移動したために、一部のコードブロック・関数間の移動履歴が記録されていない場合にも、前後の移動履歴やコード情報記憶部１２に格納されているソースコード１０６の構造情報を用いて、つながりのない部分のパスを推定し、当該パスに存在するコードブロックを既読であると推定することができる。従って、ソースコードの既読部分を漏れなく抽出し記録することができるので、コードリーディングの作業効率が更に向上する。
【００８５】
なお、上述では、記憶装置１０２に格納されているコードリーディング支援プログラム１０７をＣＰＵ１０１ａで実行することにより、コードリーディング支援装置１が動作する場合について説明したが、本体装置１０１内部にコードリーディング支援装置１のアプリケーションが実装されていてもよい。
【００８６】
また、上述では、コードリーディング対象のソースコードに関する情報（関数情報表、呼び出し関係情報表、コードブロック情報表）は、コードリーディング支援装置１で解析して取得しているが、ソースコードと同様に、外部から入力してもよい。
【００８７】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、一例として示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれると共に、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【００８８】
１…コードリーディング支援装置、１１…コード解析部、１２…コード情報記憶部、１３…ユーザ操作受付部、１４…ユーザ操作記憶部、１５…既読推定部、１６…推定情報記憶部、１７…既読グラフ生成部、１８…コード画像生成部、１９…既読グラフ画像生成部、１００…情報処理システム、１０１…本体装置、１０２…記憶装置、１０３…表示装置、１０４…キーボード、１０５…マウス、１０６…ソースコード、１０７…コードリーディング支援プログラム、１２１…関数情報表、１２２…呼び出し関係情報表、１２３…コードブロック情報表、１４１…移動履歴情報表、１６１…既読コードブロック情報表、１７１…既読グラフ表示画面、１７２…関数定義移動ボタン、１８１…ソースコード表示画面、１８２…カーソル、２００…インターネット回線、３００…クラウドサーバ、
【図１】
2019215919.tif 000003
【図２】
2019215919.tif 000004
【図３】
2019215919.tif 000005
【図４】
2019215919.tif 000006
【図５】
2019215919.tif 000007
【図６】
2019215919.tif 000008
【図７】
2019215919.tif 000009
【図８】
2019215919.tif 000010
【図９】
2019215919.tif 000011
【図１０】
2019215919.tif 000012
【図１１】
2019215919.tif 000013