(1)第1の実施の形態
以下、本発明の一実施の形態を詳述する。本実施の形態では、ソースコードの調査を支援する構成について主に説明する。
本実施の形態に示すソースコード解析システムでは、例えば、ソースコードを所定のブロックに分割し、当該ブロックと紐づく文書から、当該ブロックの意味を示す文言を抽出し、ブロックを示すアイコンとアイコン間の流れとを示すフローチャートにおいて、各アイコンに意味を対応付けた図(概略フローの一例)を生成して出力する。
上記構成によれば、ソースコード上の複数行が所定のブロックにまとまり、自然言語でブロックの意味が表現されるので、ソースコードの全体像を把握し易くなる。
ただし、概略フローにより、確認箇所のあたりを付けたとしても、実際のソースコードにおける確認箇所が分かり難い問題がある。
この点、本ソースコード解析システムでは、例えば、ソースコード上に、ブロックを特定するための情報(例えば、枠)と、当該ブロックの意味を示す文言とを重ねて表示(オーバレイ表示)する。
上記構成によれば、実際のソースコードにおける確認箇所を容易に特定することができる。
また、概略フローが出力された場合、概略フローにおいても、大まかにあたりを付けた後に、更に細かくあたりを付けるといったように、確認の粒度を変更したい場合がある。
この点、本ソースコード解析システムでは、例えば、表示するブロックの粒度を指定可能なインターフェースを備え、概略フローにおいて、指定した粒度のブロックを表示する。例えば、if文(第1の粒度のブロック)の中にif文(第2の粒度のブロック)がある場合、第1の粒度が指定されている場合は、第1の粒度のブロックが表示され、第2の粒度が指定されている場合は、第1の粒度のブロックおよび第2の粒度のブロックが表示される。
上記構成によれば、大まかにあたりを付けた後に、更に細かくあたりを付けることができるようになる。
次に、本発明の実施形態を図面に基づいて説明する。ただし、本発明は、実施の形態に限定されるものではない。
(1-1)構成
図1において、100は全体として第1の実施の形態によるソースコード解析システムを示す。
図1は、ソースコード解析システム100に係る構成の一例を示す図である。
ソースコード解析システム100は、解析装置110と、ファイルサーバ装置120と、クライアント端末130とを備える。解析装置110と、ファイルサーバ装置120と、クライアント端末130とは、ネットワーク140を介して通信可能に接続されている。
解析装置110は、ソースコードを解析し、解析した結果を出力することで、ユーザによるソースコードの調査を支援する装置である。解析装置110は、構成要素として、特定部、設定部、出力部、入力部、第1の生成部、第2の生成部、変換部、取得部、編集部等を備え、上記支援を行う。ここでは、各構成要素がソフトウェアによって実現された場合の例を示したが、一部または全部の構成要素がハードウェアによって実現されてもよい。各構成要素の詳細については、図2等を用いて後述する。
なお、ソースコードは、コンピュータ言語で記述されたテキストデータである。ソースコードは、人間により作成されたものであってもよいし、コンピュータにより自動的または機械的に作成されたものであってもよいし、人間およびコンピュータにより作成されたものであってもよい。付言するならば、コンピュータにより作成されるソースコードとしては、第1のコンピュータ言語のソースコードを第2のコンピュータ言語のソースコードに変換する変換プログラムにより作成されたソースコード、プログラムからソースコードを作成するといった逆変換を行う逆変換プログラムにより作成されたソースコード等が挙げられる。
解析装置110は、例えば、汎用のサーバ装置であり、CPU(Central Processing Unit)111と、メインメモリ112と、外部記憶装置113と、入出力部114と、ネットワークアダプタ115とを備える。
CPU111は、解析装置110全体の動作制御を司るプロセッサである。メインメモリ112は、例えば、揮発性の半導体メモリから構成され、CPU111のワークメモリとして利用される。外部記憶装置113は、ハードディスク装置、SSD(Solid State Drive)等の大容量の不揮発性の装置から構成され、各種プログラム、各種データ等が格納される。外部記憶装置113に格納されたプログラムが解析装置110の起動時、必要時等にメインメモリ112に読み出され、当該プログラムをCPU111が実行することにより解析装置110の機能が実現(解析装置110の処理が実行)される。
入出力部114は、キーボード、ポインティングディバイス等である入力装置116と、液晶ディスプレイ、有機EL(Electro-Luminescence)ディスプレイ等である出力装置117との間の信号のやり取りを行うインターフェースである。ネットワークアダプタ115は、例えば、NIC(Network Interface Card)を含んで構成され、外部(ファイルサーバ装置120、クライアント端末130等)との間の通信時におけるプロトコル制御を行う。
ファイルサーバ装置120は、ソフトウェアに係る文書を蓄積するサーバ装置である。ソフトウェアに係る文書としては、ソフトウェアの仕様書、ソフトウェアの設計書、ソフトウェアのマニュアル、ソフトウェアの保守文書、ソフトウェアのソースコード等が挙げられる。ソフトウェアの設計書としては、要件定義書、機能仕様書、詳細設計書、テスト仕様書、仕様変更票、プログラム変更書、コードレビュー報告書等が挙げられる。
ファイルサーバ装置120は、解析装置110、クライアント端末130等からの要求に応じてソフトウェアに係る文書、当該文書に含まれる内容を応答する。
ファイルサーバ装置120は、例えば、CPU121と、メインメモリ122と、外部記憶装置123と、入出力部124と、ネットワークアダプタ125とを備える。なお、ファイルサーバ装置120に係る構成要素(CPU121、メインメモリ122、外部記憶装置123、入出力部124、ネットワークアダプタ125、入力装置126、および出力装置127)は、解析装置110に係る構成要素(CPU111、メインメモリ112、外部記憶装置113、入出力部114、ネットワークアダプタ115、入力装置116、および出力装置117)と同じであるため、その説明を省略する。
クライアント端末130は、ユーザが利用する端末である。クライアント端末130は、例えば、ユーザにより指定されたソースコードの解析を解析装置110に指示し、解析装置110で行われた解析の結果を出力する。
クライアント端末130は、例えば、汎用のパーソナルコンピュータであり、CPU131と、メインメモリ132と、外部記憶装置133と、入出力部134と、ネットワークアダプタ135とを備える。なお、クライアント端末130に係る構成要素(CPU131、メインメモリ132、外部記憶装置133、入出力部134、ネットワークアダプタ135、入力装置136、および出力装置137)は、解析装置110に係る構成要素(CPU111、メインメモリ112、外部記憶装置113、入出力部114、ネットワークアダプタ115、入力装置116、および出力装置117)と同じであるため、その説明を省略する。
図2は、解析装置110に係る構成の一例を示す図である。
解析装置110は、制御部200、ソースコード解析部210、ソースコード変換部220、粒度別加工部230、フロー雛形生成部240、粒度選択部250、情報生成部260、表示部270、および編集部280を備える。
制御部200は、ユーザにより指定されたソースコード291をファイルサーバ装置120に要求し、当該ソースコード291をメインメモリ112に記憶する。
ソースコード解析部210は、ソースコード分割部211、制御文単位分割処理部212、順次処理分割部213、関数呼出し単位分割処理部214、コメント単位分割処理部215、およびソース片抽象度評価部216を備える。
ソースコード分割部211は、所定の単位とするソース片(ブロックの一例)にソースコード291を分割する。所定の単位とは、選択処理または反復処理を示す制御文の単位、関数を呼出す処理を示す関数呼出しの単位、後述の一行コメントの単位等である。ソース片は、ソースコード291を意味のあるまとまりとして表示するためのソースコード291における一または複数の行からなるブロックを示す。また、ソース片には、ソース片のネストの深さ(制御文の階層)を示す粒度が設定される。
制御文単位分割処理部212は、制御文ルールDB292を用いて、ソースコード291を制御文の単位で分割したソース片をソース片DB293に記憶する。
順次処理分割部213は、ソースコード291中の順次処理を分割する。順次処理分割部213は、関数呼出し単位分割処理部214およびコメント単位分割処理部215を備える。順次処理分割部213は、例えば、ソースコード291から関数呼出しが記述された行を検出したときは、関数呼出し単位分割処理部214を呼出し、コメントが記述された行を検出したときは、コメント単位分割処理部215を呼び出す。
関数呼出し単位分割処理部214は、順次処理を関数呼出し単位で分割したソース片をソース片DB293に記憶する。
コメント単位分割処理部215は、順次処理を一行コメント単位で分割したソース片をソース片DB293に記憶する。なお、コメントには、大きく2種類ある。
1つは、コメントの行が何をしているかを説明するコメント(以下、「行末コメント」と記す)である。行末コメントでは、行の途中から末尾までがコメントとなっているコメントである。例えば、下記のコメントは、行末コメントである。
i=0;/*変数の初期化*/
もう1つは、コメント以降の行が何をしているかを説明するのに広く用いられるコメント(「一行コメント」と記す)である。一行コメントでは、一行全てがコメントとなっているコメントである。例えば、下記の各行のコメントは、一行コメントである。
/**************/
/* 100数えて表示する */
/**************/
なお、コメントにする方法としては、所定の記号から行末までをコメントとして扱う方法(いわゆる行コメント)、2つの所定の記号で括った内部をコメントとして扱う方法(いわゆるブロックコメント)等があり、何れの方法によってコメントにされてもよい。
ソース片抽象度評価部216は、ソース片DB293のソース片の抽象度を評価し、ソース片DB293に記憶する。本ソースコード解析システム100では、3段階(high、medium、low)でソース片を評価する例について説明する。
ソースコード変換部220は、ソース片DB293を参照し、ソースコード291中のソース片の開始および終了を示す行でない行を所定の文字列(例えば、dummyコード)に変換する。
粒度別加工部230は、ソース片DB293を参照し、ソースコード変換部220により変換されたソースコードをもとに粒度ごとに疑似的なソースコード(以下、「疑似コード」と記す)を生成し、生成した疑似コードを疑似コードDB294に記憶する。
フロー雛形生成部240は、疑似コードDB294を参照し、ソースコードからフローチャートを生成する公知のツール(フロー図生成ツール)に各粒度の疑似コードを入力し、粒度毎にフローチャートの雛形(以下、「フロー雛形」と記す)を生成する。なお、フロー雛形は、フローチャートの一例である。
粒度選択部250は、出力装置137において、フロー雛形生成部240により生成されたフロー雛形を示す画面情報をGUI(Graphical User Interface)上に表示させ、入力装置136を介してユーザにより選択されたフロー雛形の粒度をメインメモリ112に記憶する。
情報生成部260は、関連文章特定部261、付加情報生成部262、および概略フロー生成部263を備える。
関連文章特定部261は、ソース片とソース片の抽象度とをもとに、ソース片と関連付く文章を特定する。
付加情報生成部262は、ソース片と関連がある文章の見出しを抽出し、抽出した見出し(付加情報の一例)を、ソース片を示す情報(リンク情報)とともに付加情報DB295に記憶する。なお、文章の見出しは、例えば、当該文章が含まれる、章のタイトル、節のタイトル、および項のタイトルのうち少なくとも1つであってもよい。
概略フロー生成部263は、付加情報生成部262により生成された付加情報をフロー雛形生成部240により生成されたフロー雛形に貼り付けて概略フローを生成する。
表示部270は、ソースコード表示部271および概略フロー表示部272を備える。
ソースコード表示部271は、ソース片DB293と付加情報DB295ともとに、ソースコード291と付加情報とを重ね合わせた画面情報を生成してクライアント端末130に送信する。クライアント端末130の出力装置137では、ソースコード291と付加情報とが重ね合わされた画面が表示される。
概略フロー表示部272は、概略フロー生成部263により生成された概略フローを示す画面情報を生成してクライアント端末130に送信する。クライアント端末130の出力装置137では、概略フローを示す画面が表示される。
編集部280は、付加情報編集部281および他粒度フロー情報反映部282を備える。
付加情報編集部281は、ユーザが編集した付加情報を受け付け、付加情報DB295を更新する。
他粒度フロー情報反映部282は、ユーザにより編集された付加情報を他の粒度の概略フローの付加情報に反映する。
解析装置110の機能(制御部200、ソースコード解析部210、ソースコード変換部220、粒度別加工部230、フロー雛形生成部240、粒度選択部250、情報生成部260、表示部270、編集部280等)は、例えば、CPU111が外部記憶装置113に格納されたプログラムをメインメモリ112に読み出して実行すること(ソフトウェア)により実現されてもよいし、専用の回路等のハードウェアにより実現されてもよいし、ソフトウェアとハードウェアとが組み合わされて実現されてもよい。また、解析装置110の機能の一部は、解析装置110と通信可能な他のコンピュータにより実現されてもよい。
(1-2)データ
図3は、解析装置110が備える制御文ルールDB292の一例(制御文ルールテーブル300)を示す図である。
制御文ルールテーブル300は、コンピュータ言語ごとに、制御文の文法のルールを示す情報を格納する。
ここで、制御文は、プログラムの実行(流れ)の制御を行うための制御構文である。制御文としては、選択処理を示す構文(換言するならば、命令の流れに条件分岐を設定するための構文)、反復処理を示す構文(換言するならば、命令の流れに処理の繰り返しを設定するための構文)が挙げられる。
制御文ルールテーブル300では、制御文301としては、条件分岐(例えば、if文)と、カウント制御ループ(例えば、for文)と、条件制御ループ(例えば、while文)とを例示しているが、これに限られるものでなはい。例えば、制御文301には、他の条件制御ループ(例えば、do-while文)、多分岐(例えば、Switch文)等の制御文が含まれていてもよい。
また、コンピュータ言語302としては、C言語とPythonとを例示しているが、これに限られるものではない。例えば、コンピュータ言語302には、COBOL、FORTRANといった他の手続き型言語、JAVA(登録商標)、SQLといった非手続き型言語等が含まれていてもよい。
図4は、解析装置110が備えるソース片DB293の一例(ソース片テーブル400)を示す図である。
ソース片テーブル400には、ソース片に係る情報(レコード)が格納される。より具体的には、ソース片テーブル400には、ソース片番号401(#)、ソース片識別子402(piece_id)、ソース片開始行番号403(piece_start)、ソース片終了行番号404(piece_end)、ネスト深さ405(nesting_depth)、抽象度406(abst_piece)、およびソース片内容407(content)の情報が対応付けられて格納されている。
ソース片番号401は、ソース片のレコードを識別可能な識別情報である。ソース片識別子402は、ソース片を識別可能な識別情報である。ソース片開始行番号403は、ソースコードにおいて、ソース片が開始する行の場所(位置)を示す情報(例えば、行を示す行番号)である。ソース片終了行番号404は、ソースコードにおいて、ソース片が終了する行の場所(位置)を示す情報(例えば、行を示す行番号)である。ネスト深さ405は、ソース片のネストの深さ(制御文の階層)を示す情報である。例えば、ソース片がfor文に対応するソース片であり、当該ソース片がif文の中にある場合は、当該ソース片のネスト深さ405には「if文の階層+1」が設定される。抽象度406は、ソース片の抽象度を示す情報である。本実施の形態では、「high」、「medium」、「low」の何れかが設定される。ソース片内容407は、ソース片の内容(ソース片に対応する行のソースコード)を示す情報である。
図5は、解析装置110が備える疑似コードDB294の一例(疑似コードテーブル500)を示す図である。
疑似コードテーブル500には、疑似コードに係る情報(レコード)が格納される。より具体的には、疑似コードテーブル500には、疑似コード番号501(#)、疑似コード識別子502(code_id)、粒度503(abst_pseudo)、および疑似コード内容504(content)の情報が対応付けられて格納されている。
疑似コード番号501は、疑似コードのレコードを識別可能な識別情報である。疑似コード識別子502は、疑似コードを識別可能な識別情報である。粒度503は、疑似コードの粒度を示す情報である。疑似コード内容504は、疑似コードの内容(疑似コードの中身)を示す情報である。
図6は、解析装置110が備える付加情報DB295の一例(付加情報テーブル600)を示す図である。
付加情報テーブル600には、付加情報に係る情報(レコード)が格納される。より具体的には、付加情報テーブル600には、付加情報番号601(#)、付加情報識別子602(info_id)、ソース片識別子603(piece_id)、および付加情報内容604(content)の情報が対応付けられて格納されている。
付加情報番号601は、付加情報のレコードを識別可能な識別情報である。付加情報識別子602は、付加情報を識別可能な識別情報である。ソース片識別子603は、付加情報に係るソース片を識別可能な識別情報である。付加情報内容604は、付加情報の内容(付加情報の中身)を示す情報である。
(1-3)処理
図7は、解析装置110が制御文の単位にソースコードを分割する処理(制御文単位分割処理)の一例を示す図である。制御文単位分割処理は、例えば、クライアント端末130を介して、ソースコードの解析がユーザにより指示されたことを契機として開始する。なお、制御文単位分割処理が開始するタイミングは、定期的であってもよいし、予め指定された時間であってもよいし、その他のタイミングであってもよい。
S701では、解析装置110は、解析対象のソースコードの拡張子から、コンピュータ言語の種別を認識する。
S702では、解析装置110は、制御文ルールDB292を参照し、認識したコンピュータ言語に対応する制御文(制御文の文法のルール)を読み込む。
次に、解析装置110は、ソースコードの最初の行から最後の行まで、S703~S705の処理を順次に行う。
S703では、解析装置110は、処理対象の行が制御文であるか否かを判定する。解析装置110は、処理対象の行が制御文であると判定した場合、S704に処理を移し、処理対象の行が制御文でないと判定した場合、S705に処理を移す。例えば、解析装置110は、処理対象の行が制御文の開始を示す構文である、または、処理対象の行が制御文の終了を示す構文であると判断した場合、S704に処理を移す。
S704では、解析装置110は、ソース片に係る情報をソース片DB293に格納する。
例えば、解析装置110は、処理対象の行が制御文の開始を示す構文であると判定した場合は、ソース片のレコードをソース片DB293に新規に格納する。この際、解析装置110は、ソース片のレコードの番号とソース片の識別子とを発番する。また、解析装置110は、ソース片終了行番号404が未格納である直前のレコードを特定し、特定したレコードのネスト深さ405の値を取得する。なお、ソース片終了行番号404が未格納であるレコードがない場合は、「-1」を取得する。
すなわち、解析装置110は、発番したソース片のレコードの番号をソース片番号401に、発番したソース片の識別子をソース片識別子402に、処理対象の行の行番号をソース片開始行番号403に、取得したネスト深さ405の値に「1」を加算した値をネスト深さ405に格納する。
また、例えば、解析装置110は、処理対象の行が制御文の終了を示す構文であると判定した場合は、ソース片DB293を更新する。この際、ソース片終了行番号404が未格納である直前のレコードを当該制御文のレコードとして特定する。続いて、解析装置110は、特定したレコードのソース片開始行番号403の行番号(開始行番号)から処理対象の行の行番号(終了行番号)までをソース片と捉え、開始行番号から終了行番号までの行をソースコードから抽出する。
すなわち、解析装置110は、処理対象の行の行番号を、特定したレコードのソース片終了行番号404に、抽出した内容を、特定したレコードのソース片内容407に格納する。
S705では、解析装置110は、ソースコードの最後の行まで処理が終わったか否か(処理対象の行が最後の行であるか否か)を判定する。解析装置110は、処理対象の行が最後の行でないと判定した場合、処理対象の行を次の行に進めてS703に処理を移し、処理対象の行が最後の行であると判定した場合、制御文単位分割処理を終了する。
例えば、制御文単位分割処理において、ソースコードがソースコード710である場合、ソース片711、ソース片712、ソース片713の順に、ソース片番号401、ソース片識別子402、ソース片開始行番号403、およびネスト深さ405がソース片DB293に記憶される。その後、ソース片713、ソース片712、ソース片711の順にソース片終了行番号404およびソース片内容407がソース片DB293に記憶される。なお、抽象度406の値については、図11に示す抽象度評価処理において記憶される。
図8は、解析装置110が順次処理を分割する処理(順次処理分割処理)の一例を示す図である。順次処理分割処理は、例えば、制御文単位分割処理が終了したことを契機として行われる。なお、順次処理分割処理が開始するタイミングは、定期的であってもよいし、予め指定された時間であってもよいし、その他のタイミングであってもよい。
S801では、解析装置110は、解析対象のソースコードを読み込む。
次に、解析装置110は、ソースコードの最初の行から最後の行まで、S802~S808の処理を順次に行う。
S802では、解析装置110は、処理対象の行が関数呼出しであるか否かを判定する。解析装置110は、処理対象の行が関数呼出しであると判定した場合、S803に処理を移し、処理対象の行が関数呼出しでないと判定した場合、S804に処理を移す。
S803では、解析装置110は、関数呼出し単位分割処理を行う。関数呼出し単位分割処理では、関数呼出しを起点として処理が分割され、分割された処理がソース片としてソース片DB293に格納される。この際、解析装置110は、当該ソース片の終わりの行まで処理対象の行を進めることがある。なお、関数呼出し単位分割処理については、図9を用いて後述する。
S804では、解析装置110は、処理対象の行が一行コメントであるか否かを判定する。解析装置110は、処理対象の行が一行コメントであると判定した場合、S805に処理を移し、処理対象の行が一行コメントでないと判定した場合、S808に処理を移す。
S805では、解析装置110は、コメント単位分割処理を行う。コメント単位分割処理では、一行コメントを起点として処理が分割され、分割された処理がソース片としてソース片DB293に格納される。この際、解析装置110は、当該ソース片の終わりの行まで処理対象の行を進めることがある。なお、コメント単位分割処理については、図10を用いて後述する。
ここで、例えば、制御文単位分割処理部によって先にソースコード全体を制御文区切りで分割するため、制御文によって分割されたソース片と順次処理分割処理で分割されたソース片とが同じになる場合がある。そこで、S806およびS807の処理を行うことで、重複して登録されたソース片のレコードを削除している。
S806では、解析装置110は、ソース片のソース片開始行番号およびソース片終了行番号が同じレコードがソース片DB293に登録されているか否か(重複しているレコードがあるか否か)を判定する。解析装置110は、重複しているレコードがあると判定した場合、S807に処理を移し、重複しているレコードがないと判定した場合、S808に処理を移す。
S807では、解析装置110は、重複しているレコードをソース片DB293から削除する。
なお、S806およびS807に代えて、ソース片に係る情報を格納する処理(後述のS907、S911、S1007、S1011)において、重複する情報があるか否かを判定して、重複する情報がない場合にソース片DB293に格納する処理を行うようにしてもよい。また、例えば、後述のS907、S911、S1007、S1011において、ソース片に係る情報を格納することなく、ソース片に係る情報を順次処理分割処理に返し、S806およびS807に代えて、重複する情報があるか否かを判定して、重複する情報がない場合にソース片DB293に格納する処理を行うようにしてもよい。
S808では、解析装置110は、ソースコードの最後の行まで処理が終わったか否か(処理対象の行が最後の行であるか否か)を判定する。解析装置110は、処理対象の行が最後の行でないと判定した場合、処理対象の行を次の行に進めてS802に処理を移し、処理対象の行が最後の行であると判定した場合、順次処理分割処理を終了する。
図9は、関数呼出し単位分割処理の一例を示す図である。
S901では、解析装置110は、解析対象のソースコードと呼出し行番号(処理対象の行の行番号)とを読み込む。
S902では、解析装置110は、開始行番号(start_step)に、関数呼出し前で直近の制御文の開始若しくは終了の次の行番号、または、関数呼出し前で直近の関数呼出しの次の行番号を順次処理開始行番号として設定する。
つまり、順次処理開始行番号は、下記の何れかである。
・関数呼出しの直前の制御文の開始の次の行番号
・関数呼出しの直前の制御文の終了の次の行番号
・関数呼出しの直前の関数呼出しの次の行番号
例えば、ソースコードがソースコード920であり、関数呼出しが関数呼出し921「call_A();」であり、呼出し行番号が行番号922「8」である場合、関数呼出し前で直近の対象が制御文923の終了であるので、順次処理開始行番号は、行番号924「5」となる。
S903では、解析装置110は、終了行番号(end_step)に、関数呼出し後で直近の制御文の開始若しくは終了の前の行番号、関数呼出し後で直近の関数呼出しの前の行番号、または、関数呼出し後で直近の一行コメントの前の行番号を順次処理終了行番号として設定する。
つまり、順次処理終了行番号は、下記の何れかである。
・関数呼出しの直後の制御文の開始の前の行番号
・関数呼出しの直後の制御文の終了の前の行番号
・関数呼出しの直後の関数呼出しの前の行番号
・関数呼出しの直後の一行コメントの前の行番号
例えば、ソースコードがソースコード920であり、関数呼出しが関数呼出し921「call_A();」であり、呼出し行番号が行番号922「8」である場合、関数呼出し後で直近の対象が制御文925の開始であるので、順次処理終了行番号は、行番号926「10」となる。
S904では、解析装置110は、呼出し行番号から順次処理開始行番号を減算した値が「0」より大きいか否か(呼出し行番号の直前に順次処理があるか否か)を判定する。解析装置110は、呼出し行番号から順次処理開始行番号を減算した値が「0」より大きいと判定した場合、S905に処理を移し、呼出し行番号から順次処理開始行番号を減算した値が「0」以下であると判定した場合、S908に処理を移す。
S905では、解析装置110は、順次処理開始行番号から「呼出し行番号-1」までをソース片(格納ソース片)として特定し、格納ソース片に係る情報をソース片DB293に格納する。なお、ソースコード920の例では、格納ソース片としてソース片927が特定される。
より具体的には、解析装置110は、格納ソース片のレコードの番号と格納ソース片の識別子とを発番する。また、解析装置110は、格納ソース片をソースコードから抽出する。すなわち、解析装置110は、発番した格納ソース片のレコードの番号をソース片番号401に、発番した格納ソース片の識別子をソース片識別子402に、順次処理開始行番号をソース片開始行番号403に、「呼出し行番号-1」をソース片終了行番号404に、抽出した内容をソース片内容407に格納する。
S906では、解析装置110は、ソース片DB293から、格納ソース片を含む最小のソース片のレコードを特定する。
S907では、解析装置110は、特定したレコードのネスト深さ405の値に「1」を加えた値を格納ソース片のレコードのネスト深さ405に格納する。
S908では、解析装置110は、順次処理終了行番号から呼出し行番号を減算した値が「0」より大きいか否か(呼出し行番号の直後に順次処理があるか否か)を判定する。解析装置110は、順次処理終了行番号から呼出し行番号を減算した値が「0」より大きいと判定した場合、S909に処理を移し、順次処理終了行番号から呼出し行番号を減算した値が「0」以下であると判定した場合、関数呼出し単位分割処理を終了する。
S909では、解析装置110は、「呼出し行番号+1」から順次処理終了行番号までをソース片(格納ソース片)として特定し、格納ソース片に係る情報をソース片DB293に格納する。なお、ソースコード920の例では、格納ソース片としてソース片928が特定される。
より具体的には、解析装置110は、格納ソース片のレコードの番号と格納ソース片の識別子とを発番する。また、解析装置110は、格納ソース片をソースコードから抽出する。すなわち、解析装置110は、発番した格納ソース片のレコードの番号をソース片番号401に、発番した格納ソース片の識別子をソース片識別子402に、「呼出し行番号+1」をソース片開始行番号403に、順次処理終了行番号をソース片終了行番号404に、抽出した内容をソース片内容407に格納する。
S910では、解析装置110は、ソース片DB293から、格納ソース片を含む最小のソース片のレコードを特定する。
S911では、解析装置110は、特定したレコードのネスト深さ405の値に「1」を加えた値を格納ソース片のレコードのネスト深さ405に格納する。
図10は、コメント単位分割処理の一例を示す図である。
S1001では、解析装置110は、解析対象のソースコードと一行コメント行番号(処理対象の行の行番号)とを読み込む。
S1002では、解析装置110は、開始行番号(start_step)に、一行コメント前で直近の制御文の開始若しくは終了の次の行番号、または、一行コメント前で直近の一行コメントの次の行番号を順次処理開始行番号として設定する。
つまり、順次処理開始行番号は、下記の何れかである。
・一行コメントの直前の制御文の開始の次の行番号
・一行コメントの直前の制御文の終了の次の行番号
・一行コメントの直前の一行コメントの次の行番号
例えば、ソースコードがソースコード1020であり、一行コメントが一行コメント1021「/* 一行コメ */」であり、一行コメント行番号が行番号1022「8」である場合、一行コメント前で直近の対象が制御文1023の終了であるので、順次処理開始行番号は、行番号1024「5」となる。
S1003では、解析装置110は、終了行番号(end_step)に、一行コメント後で直近の制御文の開始若しくは終了の前の行番号、一行コメント後で直近の関数呼出しの前の行番号、または、一行コメント後で直近の一行コメントの前の行番号を順次処理終了行番号として設定する。
つまり、順次処理終了行番号は、下記の何れかである。
・一行コメントの直後の制御文の開始の前の行番号
・一行コメントの直後の制御文の終了の前の行番号
・一行コメントの直後の関数呼出しの前の行番号
・一行コメントの直後の一行コメントの前の行番号
例えば、ソースコードがソースコード1020であり、一行コメントが一行コメント1021「/* 一行コメ */」であり、一行コメント行番号が行番号1022「8」である場合、一行コメント後で直近の対象が制御文1025の開始であるので、順次処理開始行番号は、行番号1026「10」となる。
S1004では、解析装置110は、一行コメント行番号から順次処理開始行番号を減算した値が「0」より大きいか否か(一行コメント行番号の直前に順次処理があるか否か)を判定する。解析装置110は、一行コメント行番号から順次処理開始行番号を減算した値が「0」より大きいと判定した場合、S1005に処理を移し、一行コメント行番号から順次処理開始行番号を減算した値が「0」以下であると判定した場合、S1008に処理を移す。
S1005では、解析装置110は、順次処理開始行番号から「一行コメント行番号-1」までをソース片(格納ソース片)として特定し、格納ソース片に係る情報をソース片DB293に格納する。なお、ソースコード1020の例では、格納ソース片としてソース片1027が特定される。
より具体的には、解析装置110は、格納ソース片のレコードの番号と格納ソース片の識別子とを発番する。また、解析装置110は、格納ソース片をソースコードから抽出する。すなわち、解析装置110は、発番した格納ソース片のレコードの番号をソース片番号401に、発番した格納ソース片の識別子をソース片識別子402に、順次処理開始行番号をソース片開始行番号403に、「一行コメント行番号-1」をソース片終了行番号404に、抽出した内容をソース片内容407に格納する。
S1006では、解析装置110は、ソース片DB293から、格納ソース片を含む最小のソース片のレコードを特定する。
S1007では、解析装置110は、特定したレコードのネスト深さ405の値に「1」を加えた値を格納ソース片のレコードのネスト深さ405に格納する。
S1008では、解析装置110は、順次処理終了行番号から一行コメント行番号を減算した値が「0」より大きいか否か(一行コメント行番号の直後に順次処理があるか否か)を判定する。解析装置110は、順次処理終了行番号から一行コメント行番号を減算した値が「0」より大きいと判定した場合、S1009に処理を移し、順次処理終了行番号から一行コメント行番号を減算した値が「0」以下であると判定した場合、コメント単位分割処理を終了する。
S1009では、解析装置110は、「一行コメント行番号+1」から順次処理終了行番号までをソース片(格納ソース片)として特定し、格納ソース片に係る情報をソース片DB293に格納する。なお、ソースコード1020の例では、格納ソース片としてソース片1028が特定される。
より具体的には、解析装置110は、格納ソース片のレコードの番号と格納ソース片の識別子とを発番する。また、解析装置110は、格納ソース片をソースコードから抽出する。すなわち、解析装置110は、発番した格納ソース片のレコードの番号をソース片番号401に、発番した格納ソース片の識別子をソース片識別子402に、「一行コメント行番号+1」をソース片開始行番号403に、順次処理終了行番号をソース片終了行番号404に、抽出した内容をソース片内容407に格納する。
S1010では、解析装置110は、ソース片DB293から、格納ソース片を含む最小のソース片のレコードを特定する。
S1011では、解析装置110は、特定したレコードのネスト深さ405の値に「1」を加えた値を格納ソース片のレコードのネスト深さ405に格納する。
図11は、解析装置110がソース片の抽象度を評価する処理(抽象度評価処理)の一例を示す図である。抽象度評価処理は、例えば、順次処理分割処理が終了したことを契機として行われる。なお、抽象度評価処理が開始するタイミングは、定期的であってもよいし、予め指定された時間であってもよいし、その他のタイミングであってもよい。
S1101では、解析装置110は、ソース片DB293を読み込む。
S1102では、解析装置110は、各ソース片のレコードのネスト深さ405の値を読み込む。
S1103では、解析装置110は、ソース片のレコードのネスト深さ405の値をもとにソース片を降順に並べ、ネスト深さ405の最大値から順に3等分する。
S1104では、解析装置110は、ソース片に抽象度を設定する。解析装置110は、3等分したうち、最大値に近い区分に属するソース片の抽象度を「low」、真ん中の区分に属するソース片を「middle」、最小値(なお、「0」であってもよい)に近い区分に属するソース片の抽象度を「high」に設定する。
S1105では、解析装置110は、設定したソース片の抽象度を抽象度406としてソース片DB293に格納する。
図12は、解析装置110がソースコードの順次処理をdummyコードに変換する(dummyコード変換処理)の一例を示す図である。dummyコード変換処理は、例えば、順次処理分割処理が終了したことを契機として行われる。なお、dummyコード変換処理が開始するタイミングは、抽象度評価処理が終了したタイミングであってもよいし、定期的であってもよいし、予め指定された時間であってもよいし、その他のタイミングであってもよい。
S1201では、解析装置110は、解析対象のソースコードを読み込み、ソースコードのコピー(以下では、「ソースコピー」と記す)をメインメモリ112に保持する。
S1202では、解析装置110は、ソース片DB293を参照し、ネスト深さ405の最大値を変数iに設定する。
S1203では、解析装置110は、変数iが「-1」であるか否かを判定する。解析装置110は、変数iが「-1」であると判定した場合、S1207に処理を移し、変数iが「-1」でないと判定した場合、S1204に処理を移す。
S1204では、解析装置110は、ソース片DB293を参照し、ネスト深さ405の値が「i」であるレコードのソース片開始行番号403およびソース片終了行番号404の値(開始行番号および終了行番号)を取得する。なお、解析装置110は、ネスト深さ405の値が「i」であるレコードが複数ある場合は、複数のレコードを取得する。
S1205では、解析装置110は、ソースコピー中の開始行番号から終了行番号までにおいて、制御文の開始の行および終了の行と、関数呼出しの行と、一行コメントの行との何れでもない行をdummyコードに置き換える。
S1206では、解析装置110は、変数iを「1」減算し、S1203に処理を移す。
S1207では、解析装置110は、ソースコピーにおいてdummyコードが連続する行がある場合、先頭のdummyコードを残してあとは全て空行にする。解析装置110は、空行に変換することで、行番号が変更されてしまう事態を回避する。例えば、ソース片DB293に格納されたソース片の開始行番号および終了行番号のずれに対応する処理を行う必要がなくなる。
S1208では、解析装置110は、ソースコピーをdummyコード変換済みソースコードとしてメインメモリ112に出力(記憶)する。
例えば、dummyコード変換処理によれば、ソースコピー1210は、dummyコード変換済みソースコード1220に変換される。
図13は、解析装置110が疑似コードを生成する処理(疑似コード生成処理)の一例を示す図である。疑似コード生成処理は、例えば、dummyコード変換処理が終了したことを契機として行われる。なお、疑似コード生成処理が開始するタイミングは、定期的であってもよいし、予め指定された時間であってもよいし、その他のタイミングであってもよい。
S1301では、解析装置110は、dummyコード変換済みソースコードを処理対象のソースコードとして読み込む。
S1302では、解析装置110は、ソース片DB293を参照し、ネスト深さ405の最大値を変数iに設定する。
S1303では、解析装置110は、変数abst(疑似コードの粒度)に初期値(例えば、「1」)を設定する。
S1304では、解析装置110は、変数iが「0」であるか否かを判定する。解析装置110は、変数iが「0」であると判定した場合、疑似コード生成処理を終了し、変数iが「0」でないと判定した場合、S1305に処理を移す。
S1305では、解析装置110は、ソース片DB293を参照し、ネスト深さ405の値が「i」であるレコードのソース片開始行番号403およびソース片終了行番号404の値(開始行番号および終了行番号)を取得する。なお、解析装置110は、ネスト深さ405の値が「i」であるレコードが複数ある場合は、複数のレコードを取得する。
S1306では、解析装置110は、処理対象のソースコードにおいて、開始行番号の行をdummyコードに置き換え、開始行番号の次の行から終了行番号の行までを空行に置き換え、疑似コードとする。
S1307では、解析装置110は、疑似コードを疑似コードDB294に格納する。
より具体的には、解析装置110は、疑似コードのレコードの番号と疑似コードの識別子とを発番する。すなわち、解析装置110は、発番した疑似コードのレコードの番号を疑似コード番号501に、発番した疑似コードの識別子を疑似コード識別子502に、変数abstの値を粒度503に、疑似コードを疑似コード内容504に格納する。
S1308では、解析装置110は、変数abstを「1」加算し、変数iを「1」減算し、処理対象のソースコードを変数abstの疑似コードとし、S1304に処理を移す。
例えば、疑似コード生成処理では、dummyコード変換済みソースコード1310に基づいて、粒度「1」の疑似コード1320が生成され、疑似コード1320に基づいて、粒度「2」の疑似コード1330が生成される。なお、dummyコード変換済みソースコードについては、粒度「0」の疑似コードとして扱ってもよい。
図14は、解析装置110がソース片に関連付く文章を特定する処理(文章特定処理)の一例を示す図である。文章特定処理は、例えば、抽象度評価処理が終了したことを契機として行われる。なお、文章特定処理が開始するタイミングは、定期的であってもよいし、予め指定された時間であってもよいし、その他のタイミングであってもよい。
文章特定処理では、ソース片DB293に記憶されている全てのソース片について、S1401~S1410の処理が行われる。
S1401では、解析装置110は、ソース片DB293を参照し、処理対象のソース片に係る情報を読み込む。例えば、解析装置110は、当該ソース片のレコードのソース片識別子402と抽象度406とソース片内容407との値を読み込む。
S1402では、解析装置110は、抽象度406の値が「high」であるか否かを判定する。解析装置110は、抽象度406の値が「high」であると判定した場合、S1403に処理を移し、抽象度406の値が「high」でないと判定した場合、S1404に処理を移す。
S1403では、解析装置110は、「機能仕様書」を対象にソース片との関連付けを実行し、S1407に処理を移す。例えば、解析装置110は、ソース片と機能仕様書における各文章との関連度(類似度)を算出し、算出した関連度がしきい値より大きい文章を、ソース片に関連付く文章であると判定する。
S1404では、解析装置110は、抽象度406の値が「middle」であるか否かを判定する。解析装置110は、抽象度406の値が「middle」であると判定した場合、S1405に処理を移し、抽象度406の値が「middle」でないと判定した場合、S1406に処理を移す。
S1405では、解析装置110は、「詳細設計書」を対象にソース片との関連付けを実行し、S1407に処理を移す。例えば、解析装置110は、ソース片と詳細設計書における各文章との関連度(類似度)を算出し、算出した関連度がしきい値より大きい文章を、ソース片に関連付く文章であると判定する。
S1406では、解析装置110は、「プログラム変更書」を対象にソース片との関連付けを実行し、S1407に処理を移す。例えば、解析装置110は、ソース片とプログラム変更書における各文章との関連度(類似度)を算出し、算出した関連度がしきい値より大きい文章を、ソース片に関連付く文章であると判定する。
S1407では、解析装置110は、文章が関連付いたか否かを判定する。解析装置110は、文章が関連付いたと判定した場合、S1408に処理を移し、文章が関連付いていないと判定した場合、S1409に処理を移す。
S1408では、解析装置110は、ソース片識別子402と、関連付いた文章の見出し(例えば、当該文章が含まれる、章のタイトル、節のタイトル、項のタイトル等)とをメインメモリ112に出力し、S1410に処理を移す。
S1409では、解析装置110は、ソース片識別子402とソース片内容407とをメインメモリ112に出力し、S1410に処理を移す。
S1410では、解析装置110は、ソース片DB293の最後のレコードまで処理が終わったか否か(処理対象のソース片が最後のソース片であるか否か)を判定する。解析装置110は、処理対象のソース片が最後のソース片であると判定した場合、処理対象のソース片を次のソース片に進めてS1401に処理を移し、処理対象のソース片が最後のソース片でないと判定した場合、文章特定処理を終了する。
文章特定処理については、上述の内容に限られるものではない。
例えば、ソフトウェア開発は、基本的には、要件定義、基本設計(外部設計)、詳細設計(内部設計)、コーディング(プログラミング)、テストの順に行われる。
要件定義書は、例えば、ソフトウェアの新規開発または改修における要件定義において作成される文書であり、エンドユーザの要件をシステム的に定義した文書である。つまり、要件定義書は、ソフトウェアで実現すべきことを定義した文書であり、システム開発の最初の工程で作成される文書であり、最も抽象度が高い文書(以下、「第1抽象度の文書」と記す)の一例である。
また、要件定義に対するテストとして、システムテストが行われる。システムテストでは、システムテスト仕様書が作成される。つまり、システムテスト仕様書は、要件定義書で定義された要件をテストするための項目が記述された文書であり、システム開発の最初の工程に対応する工程で作成される文書であり、第1抽象度の文書の一例である。
機能仕様書は、例えば、ソフトウェアの新規開発における基本設計において作成される文書であり、ソフトウェアが実現する機能を定義した文書である。つまり、機能仕様書は、ソフトウェアがどういう動きをするのか(何を作るか)を定めた文書であり、ソフトウェア開発の2番目の工程で作成される文書であり、2番目に抽象度が高い文書(以下、「第2抽象度の文書」と記す)の一例である。
仕様変更票は、例えば、ソフトウェアの改修における基本設計において作成される文書であり、現行の機能から変更する機能を定義した文書である。つまり、仕様変更票は、ソフトウェアがどういう動きをするのか(何を作るか)を定めた文書であり、ソフトウェア開発の2番目の工程で作成される文書であり、第2抽象度の文書の一例である。
また、基本設計に対するテストとして、基本設計テストが行われる。基本設計テストでは、基本設計テスト仕様書が作成される。つまり、基本設計テスト仕様書は、機能仕様書または仕様変更票で定義された機能をテストするための項目が記述された文書であり、システム開発の2番目の工程に対応する工程で作成される文書であり、第2抽象度の文書の一例である。
詳細設計書は、例えば、ソフトウェアの新規開発における詳細設計において作成される文書であり、機能仕様書に基づく具体的な設計を定義した文書である。つまり、詳細設計書は、ソフトウェアの動きをどうやって実現するかを定めた文書であり、ソフトウェア開発の3番目の工程で作成される文書であり、3番目に抽象度が高い文書(以下、「第3抽象度の文書」と記す)の一例である。
プログラム変更書は、例えば、ソフトウェアの新規開発における詳細設計において作成される文書であり、現行の設計から変更する設計を定義した文書である。プログラム変更書は、ソフトウェアの動きをどうやって実現するかを定めた文書であり、ソフトウェア開発の3番目の工程で作成される文書であり、第3抽象度の文書の一例である。
また、詳細設計に対するテストとして、詳細設計テストが行われる。詳細設計テストでは、詳細設計テスト仕様書が作成される。つまり、詳細設計テスト仕様書は、詳細設計書またはプログラム変更書で定義された設計をテストするための項目が記述された文書であり、システム開発の3番目の工程に対応する工程で作成される文書であり、第3抽象度の文書の一例である。
コードレビュー報告書は、ソフトウェアの新規開発または改修におけるコーディングにおいて作成される文書であり、ソースコードレビューの結果を示す文書である。つまり、コードレビュー報告書は、ソフトウェア開発の4番目の工程で作成される文書であり、最も抽象度が低い文書(以下、「第4抽象度の文書」と記す)の一例である。
以上の内容を踏まえ、文章特定処理においては、ソース片の抽象度に対応して、検索対象の文書を決定してもよい。例えば、解析装置110は、ソース片の抽象度が「high」である場合、第1抽象度の文書または第2抽象度の文書を対象にソース片との関連付けを行い、ソース片の抽象度が「middle」である場合、第3抽象度の文書を対象にソース片との関連付けを行い、ソース片の抽象度が「low」である場合、第4抽象度の文書を対象にソース片との関連付けを行ってもよい。
また、ソースコードと関連付く文書を特定する方法については、任意の技術を採用できる。例えば、解析装置110は、ソース片に含まれる用語分類の重要度を記憶しておき、ソースコードのソース片から用語(ソースコード用語)と当該ソースコード用語の分類とを抽出する。また、解析装置110は、当該ソース片の抽象度に対応する文書から用語(文書用語)を抽出する。そして、解析装置110は、抽出したソースコード用語の群と抽出した文書用語の群とで共通する用語について重み付けして関連度を算出する。解析装置110は、最も関連度の高い文書を特定する。なお、ソース片と関連付く文書を特定する方法については、例えば、特願2019-98042に記載の技術を援用してもよい。
図15は、解析装置110が付加情報を生成する処理(付加情報生成処理)の一例を示す図である。付加情報生成処理は、例えば、文章特定処理が終了したことを契機として行われる。なお、付加情報生成処理が開始するタイミングは、定期的であってもよいし、予め指定された時間であってもよいし、その他のタイミングであってもよい。
S1501では、解析装置110は、文章特定処理での出力を読み込む。
S1502では、解析装置110は、出力が文章であるか否かを判定する。解析装置110は、出力が文章であると判定した場合、S1503に処理を移し、出力が文章でないと判定した場合、S1504に処理を移す。
S1503では、解析装置110は、文章の見出し(章のタイトル、節のタイトル、項のタイトル等)を付加情報とする。
S1504では、解析装置110は、ソース片内容407をそのまま付加情報とする。
S1505では、解析装置110は、付加情報DB295に付加情報を格納する。
より具体的には、解析装置110は、付加情報のレコードの番号と付加情報の識別子とを発番する。すなわち、解析装置110は、発番した付加情報のレコードの番号を付加情報番号601に、発番した付加情報の識別子を付加情報識別子602に、付加情報が関連付いたソース片のソース片識別子402の値をソース片識別子603に、付加情報を付加情報内容604に格納する。
(1-4)画面
図16は、出力画面の一例(概略フロー画面1610およびソース表示画面1620)を示す図である。
概略フロー画面1610では、所定の粒度の概略フロー1611が表示される。例えば、ユーザにより指定された粒度に対応した概略フロー1611が表示される。なお、概略フロー画面1610の初期表示に用いられる粒度としては、ユーザにより選択された粒度であってもよいし、最も高い粒度であってもよいし、最も低い粒度であってもよいし、予め設定された粒度であってもよい。
概略フロー1611は、ソースコードの開始および終了を長円形、基本となる処理を長方形、条件分岐する処理をひし形等、特別な処理を意味する図形であるアイコン1612を矢印で繋ぎ合わせて疑似コードを表現したフローチャートである。
概略フロー1611によれば、ユーザは、ソースコードにおける処理を、所定の粒度でまとめられた図形として把握できる。例えば、ユーザは、ソースコードの処理を所定の粒度でまとめられた図形として把握できるので、ソースコードを一行ずつ読み解いていく場合に比べて、ソースコードの全体像の把握にかかる時間が短縮され、見るべき箇所の切り分けを容易にすることができる。また、フローチャートは、コンピュータ言語に依存しない表現方法であるので、ユーザは、例えば、コンピュータ言語の知識がなくても、ソースコードの内容をおおまかに把握することができる。
また、概略フロー1611では、アイコン1612において、付加情報を示す付加情報表示1613が含まれる。なお、付加情報表示1613の付加情報は、ソース片に関連付いた文章の見出しであったり、ソースコードの内容であったり、ユーザにより変更された内容であったりする。例えば、付加情報表示1613の付加情報が自然言語である場合には、ユーザは、ソースコードを更に容易に把握することができるようになる。
ソース表示画面1620では、ソース表示1621が表示される。ソース表示1621では、ソースコードの内容に対応するソース片であって、所定の粒度および所定の粒度より粗い粒度のソース片を示すソース片表示1622がソースコードに重畳して表示され、当該ソース片表示1622に付加情報表示1623が対応付けられて表示されている。
ソース表示画面1620によれば、ユーザは、ソース片表示1622より、ソースコードの処理を所定の粒度でまとめられたソース片として把握できるので、ソースコードを一行ずつ読み解いていく場合に比べて、ソースコードの全体像の把握にかかる時間が短縮され、見るべき箇所の切り分けを容易にすることができる。また、ソース表示画面1620によれば、ユーザは、実際のソースコードにおける確認箇所を容易に特定することができる。
また、ソース表示画面1620では、付加情報表示1623において付加情報が表示される。例えば、付加情報表示1623の付加情報が自然言語である場合には、ユーザは、ソースコードを更に容易に把握することができるようになる。
なお、ユーザは、粒度を切り替えるためのボタン(図示は省略)を押下することで、概略フロー1611およびソース表示1621の粒度を切り替えることができる。更に、ユーザは、概略フロー1611とソース表示1621とを切り替えるためのボタン(図示は省略)を押下することで、概略フロー1611とソース表示1621とを切り替えることができる。更に、ユーザは、概略フロー1611とソース表示1621とを同時に表示するためのボタン(図示は省略)を押下することで、概略フロー1611とソース表示1621とを同時に表示することができる。
図17は、画面遷移の一例(分岐処理に関するソース片の見え方)を示す図である。
図17に示すように、粒度「n」における疑似コード1710では、ソース片1711に処理A1712とソース片1713とが含まれ、ソース片1713に処理B1714とソース片1715とが含まれ、ソース片1715に処理C1716が含まれている。なお、処理A1712、処理B1714、および処理C1716は、例えば、ダミーコードである。
この場合、概略フロー1717では、ソース片1711、処理A1712、ソース片1713、処理B1714、ソース片1715、および処理C1716の各々に対応するアイコン1718が表示される。
次に粒度が粗い粒度「n+1」における疑似コード1720では、粒度「n」のソース片1715および当該ソース片1715に含まれる処理C1716は、処理X1721としてまとめられている。つまり、疑似コード1720では、ソース片1711に処理A1712とソース片1713とが含まれ、ソース片1713に処理B1714と処理X1721とが含まれている。なお、処理X1721は、例えば、ダミーコードである。
この場合、概略フロー1722では、ソース片1711、処理A1712、ソース片1713、および処理B1714の各々に対応するアイコン1718と、処理X1721に対応するアイコン1723とが表示される。
次に粒度が粗い粒度「n+2」における疑似コード1730では、粒度「n+1」のソース片1713と当該ソース片1713に含まれる処理B1714および処理X1721とは、処理Y1731としてまとめられている。つまり、疑似コード1730では、ソース片1711に処理A1712と処理Y1731とが含まれている。なお、処理Y1731は、例えば、ダミーコードである。
この場合、概略フロー1732では、ソース片1711および処理A1712の各々に対応するアイコン1718と、処理Y1731に対応するアイコン1733とが表示される。
なお、図17では、粒度を徐々に粗くする例を示したが、これに限られるものではない。例えば、ユーザは、指定した粒度の概略フローを表示することができる。また、例えば、ユーザは、粒度「n+2」の概略フロー1732を表示して、大まかにあたりを付けた後に、粒度「n+1」の概略フロー1722を表示して更に細かくあたりを付けることができる。
図18は、画面遷移の一例(順次処理に関するソース片の見え方)を示す図である。
図18に示すように、粒度「n」における疑似コード1810では、ソース片1811に処理A1812とソース片1813とが含まれ、ソース片1813に処理B1814とソース片1815とが含まれ、ソース片1815に処理C1816と処理D1817と処理E1818とが含まれている。なお、処理A1812、処理B1814、処理C1816、処理D1817、および処理E1818は、例えば、ダミーコードである。
この場合、概略フロー1819では、ソース片1811、処理A1812、ソース片1813、処理B1814、ソース片1815、処理C1816、処理D1817、および処理E1818の各々に対応するアイコンが表示される。
次に粒度が粗い粒度「n+1」における疑似コード1820では、粒度「n」のソース片1815と、当該ソース片1815に含まれる処理C1816、処理D1817、および処理E1818とは、処理X1821としてまとめられている。つまり、疑似コード1820では、ソース片1811に処理A1812とソース片1813とが含まれ、ソース片1813に処理B1814と処理X1821とが含まれている。なお、処理X1821は、例えば、ダミーコードである。
この場合、概略フロー1822では、ソース片1811、処理A1812、ソース片1813、処理B1814、および処理X1821の各々に対応するアイコンが表示される。
次に粒度が粗い粒度「n+2」における疑似コード1830では、粒度「n+1」のソース片1813と当該ソース片1813に含まれる処理B1814および処理X1821とは、処理Y1831としてまとめられている。つまり、疑似コード1830では、ソース片1811に処理A1812と処理Y1831とが含まれている。なお、処理Y1831は、例えば、ダミーコードである。
この場合、概略フロー1832では、ソース片1811、処理A1812、および処理Y1831の各々に対応するアイコンが表示される。
本実施の形態によれば、ソースコードを容易に把握することができる。
(2)付記
上述の実施の形態には、例えば、以下のような内容が含まれる。
上述の実施の形態においては、本発明をソースコード解析システムに適用するようにした場合について述べたが、本発明はこれに限らず、この他種々のシステム、装置、方法、プログラムに広く適用することができる。
また、上述の実施の形態において、各テーブルの構成は一例であり、1つのテーブルは、2以上のテーブルに分割されてもよいし、2以上のテーブルの全部または一部が1つのテーブルであってもよい。
また、上述の実施の形態において、説明の便宜上、XXテーブルを用いて各種のデータを説明したが、データ構造は限定されるものではなく、XX情報等と表現してもよい。
また、上記の説明において、各機能を実現するプログラム、テーブル、ファイル等の情報は、メモリや、ハードディスク、SSD(Solid State Drive)等の記憶装置、または、ICカード、SDカード、DVD等の記録媒体に置くことができる。
また、上述の実施の形態において、例えば、CPUは、MPU(Micro Processing Unit)、GPU(Graphics Processing Unit)、AI(Artificial Intelligence)チップ等であってもよい。
また、上述の実施の形態において、例えば、メインメモリは、例えば、ROM(Read Only Memory)、RAM(Random Access Memory)等であってもよい。ROMは、SRAM(Static Random Access Memory)、NVRAM(Non Volatile RAM)、マスクROM(Mask Read Only Memory)、PROM(Programmable ROM)等である。RAMは、DRAM(Dynamic Random Access Memory)等である。
また、上述の実施の形態において、例えば、外部記憶装置は、ハードディスクドライブ(Hard Disk Drive)、フラッシュメモリ(Flash Memory)、SSD(Solid State Drive)、光学式記憶装置等であってもよい。光学式記憶装置は、CD(Compact Disc)、DVD(Digital Versatile Disc)等である。外部記憶装置に格納されているプログラム、データ等は、メインメモリに随時読み込まれる。
また、上述の実施の形態において、例えば、ネットワークアダプタは、通信媒体を介して他の装置と通信する通信インターフェースである。ネットワークアダプタは、例えば、NIC(Network Interface Card)、無線通信モジュール、USB(Universal Serial Interface)モジュール、シリアル通信モジュール等であってもよい。ネットワークアダプタは、通信可能に接続する他の装置から情報を受信する入力装置として機能することもできる。また、ネットワークアダプタは、通信可能に接続する他の装置に情報を送信する出力装置として機能することもできる。
また、上述の実施の形態において、例えば、入力装置は、ユーザから情報を受付けるユーザインターフェースである。入力装置は、例えば、キーボード、マウス、カードリーダ、タッチパネル等であってもよい。
また、上述の実施の形態において、例えば、出力装置は、各種の情報を出力(表示出力、音声出力、印字出力等)するユーザインターフェースである。出力装置は、例えば、各種情報を可視化する表示装置、音声出力装置(スピーカ)、印字装置等である。表示装置は、LCD(Liquid Crystal Display)、グラフィックカード等であってもよい。
上述した実施の形態は、例えば、以下の特徴的な構成を有する。
ソースコード解析システム(例えば、ソースコード解析システム100)は、所定のコンピュータ言語(C言語、Python、COBOL、FORTRANといった他の手続き型言語、JAVA(登録商標)、SQLといった非手続き型言語等)の制御構文を示す情報(例えば、制御文ルールDB292)と、プログラムのソースコード(例えば、ソースコード291)とに基づいて、上記ソースコードにおいて、制御構文の開始と終了とに含まれる一または複数の行からなるブロック(例えば、制御文単位のソース片)を識別するための識別情報(例えば、ソース片開始行番号403およびソース片終了行番号404)を特定する特定部(例えば、回路、解析装置110、ソースコード解析部210)と、上記特定部により特定された識別情報により識別される各ブロックに、制御構文のネストの深さが浅いほど粒度が粗いことを示す粒度情報(例えば、ネスト深さ405)を設定する設定部(例えば、回路、解析装置110、ソースコード解析部210)と、上記設定部により設定された粒度情報に基づいて、所定の粒度(例えば、粒度「n+1」)に対応するブロック(例えば、ソース片1713、ソース片1813)と、上記所定の粒度よりも粒度が粗いブロック(例えば、ソース片1711、ソース片1811)とを示すブロック情報(アイコン、ソース片表示等)を上記ソースコードに対応させて出力する出力部(例えば、回路、解析装置110、表示部270)と、を備える。
上記構成では、ソースコードに対応させてブロック情報を出力するので、例えば、ユーザは、ブロック単位にソースコードを確認することができ、ソースコードを先頭から1行ずつ追う場合と比べて、ソースコードを容易に把握することができる。
上記特定部は、上記ソースコードにおいて、関数の呼出しを示す行(例えば、行番号922)の直前または直後に、選択処理および反復処理以外の処理である順次処理を示す一または複数の行がある場合、上記一または複数の行からなるブロック(例えば、ソース片927、ソース片928)を識別するための識別情報を特定する(例えば、図9参照)。
関数の呼出しの直前または直後の順次処理は、意味ある区切りとなり得るため、上記構成により、当該順次処理がブロックにされることで、例えば、ユーザは、当該順次処理がブロックにされない場合と比べて、ソースコードをより容易に把握することができるようになる。
上記特定部は、上記ソースコードにおいて、一行全てがコメントとなっている一行コメントを示す行(例えば、行番号1022)の直前または直後に、選択処理および反復処理以外の処理である順次処理を示す一または複数の行がある場合、上記一または複数の行からなるブロック(例えば、ソース片1027、ソース片1028)を識別するための識別情報を特定する(例えば、図10参照)。
一行コメントの直前または直後の順次処理は、意味ある区切りとなり得るため、上記構成により、当該順次処理がブロックにされることで、例えば、ユーザは、当該順次処理がブロックにされない場合と比べて、ソースコードをより容易に把握することができるようになる。
ユーザにより指定された粒度を入力する入力部(例えば、回路、解析装置110、粒度選択部250)を備え、上記出力部は、上記設定部により設定された粒度情報に基づいて、上記入力部により入力された粒度に対応するブロックと、上記粒度よりも粒度が粗いブロックとを示すブロック情報を上記ソースコードに対応させて出力する(例えば、図16参照)。
上記構成では、ユーザにより指定された粒度に応じてブロック情報が出力されるので、例えば、ユーザは、所望する粒度のブロック単位でソースコードを確認でき、ソースコードをより容易に把握することができる。
上記所定の粒度に対応するブロックを示すアイコンと、上記所定の粒度よりも粒度が粗いブロックとを示すアイコンと、アイコン間を繋ぐ矢印とを含んで構成されるフローチャート(例えば、フロー雛形、概略フロー)を示す画面情報を生成する第1の生成部(例えば、回路、解析装置110、フロー雛形生成部240、粒度選択部250、情報生成部260)を備え、上記出力部は、上記第1の生成部により生成された画面情報を出力する。
上記構成では、フローチャートが出力されるので、例えば、ユーザは、コンピュータ言語の知識がなくても、ソースコードをおおまかに把握することができる。
上記ソースコードにおける制御構文の開始と終了との行以外の連続する行を、上記連続する行を1つにまとめたことを示す所定の文字列(例えば、dummyコード)に変換し、変換したソースコードにおいて、上記所定の粒度より細かい粒度のブロックの行を、上記ブロックの行を1つにまとめたことを示す所定の文字列(例えば、dummyコード)に変換する変換部(例えば、回路、解析装置110、ソースコード変換部220)を備え、上記第1の生成部は、上記変換部により変換されたソースコードを用いて上記フローチャートを生成する。
上記構成では、所定の粒度に応じたソースコードが生成されるので、例えば、フローチャートを生成可能な既存のツールに、所定の粒度に応じたソースコードを入力することで、所定の粒度に応じたフローチャートを生成することができるようになる。
上記ソースコードに上記ブロック情報を重畳した画面情報を生成する第2の生成部(例えば、回路、解析装置110、情報生成部260)を備え、上記出力部は、上記第2の生成部により生成された画面情報を出力する。
上記構成では、ソースコードにブロック情報が重畳して表示されるので、例えば、ユーザは、実際のソースコードにおける確認箇所を容易に特定することができる。
上記プログラムに係る複数の文書から、上記各ブロックについて、ブロックと関連がある文章の見出しを示す見出し情報を取得する取得部(例えば、回路、解析装置110、情報生成部260)を備え、上記出力部は、上記ブロック情報を上記見出し情報と対応付けて出力する。
上記構成では、ブロック情報に見出し情報が対応付けられて出力されるので、例えば、ユーザは、ソースコードを更に容易に把握することができるようになる。
ユーザによる操作に応じて、上記見出し情報を編集する編集部(例えば、回路、解析装置110、編集部280)を備える。
上記構成によれば、ユーザは、ブロック情報に自動的に対応付けられた見出し情報を変更することができるようになる。
また上述した構成については、本発明の要旨を超えない範囲において、適宜に、変更したり、組み替えたり、組み合わせたり、省略したりしてもよい。
「A、B、およびCのうちの少なくとも1つ」という形式におけるリストに含まれる項目は、(A)、(B)、(C)、(AおよびB)、(AおよびC)、(BおよびC)または(A、B、およびC)を意味することができると理解されたい。同様に、「A、B、またはCのうちの少なくとも1つ」の形式においてリストされた項目は、(A)、(B)、(C)、(AおよびB)、(AおよびC)、(BおよびC)または(A、B、およびC)を意味することができる。