(57)【要約】      （修正有）【課題】抽象コードグラフを生成する方法及びシステムを提供する。【解決手段】方法は、抽象コードグラフ（ACG）を生成することと、抽象構文木（AST）を得るステップを含む。ASTは、第１の構成要素を第１の抽象度で表現される第１のASTノードと、第２の構成要素を表現し得る第２のASTと、ASTに基づいて、ACGを生成するステップを含む。ACGを生成するステップは、第１のASTノードに基づいて、第１のACGノードを生成し、第２のASTノードに基づいて、第２のACGノードを生成する。ACGを生成するステップは、第１のACGノードに基づいて、第１の構成要素を第２の抽象度で表現する第３のACGノードを生成する。第３のACGノードは、ASTに基づいて、第１のACGノードと第２のACGノードとの間に連結される。【選択図】図３
2019160284.tif 000002
【特許請求の範囲】
【請求項１】
抽象コードグラフを生成する方法であって、
ソースコードの構成要素と、前記ソースコード内の前記構成要素の間の関係と、を表現する抽象構文木（AST）を得るステップであって、前記抽象構文木は、
前記ソースコード内の第１の位置に配置されている第１の構成要素を表現する第１のASTノードであって、前記第１の構成要素を第１の抽象度で表現する第１のASTノードと、
前記ソースコード内の第２の位置に配置されている第２の構成要素を表現する第２のASTノードであって、前記第１のASTノードは、前記第１の位置における前記第１の構成要素と前記第２の位置における前記第２の構成要素との間の関係を表現するように、前記抽象構文木において前記第２のASTノードに連結される、第２のASTノードと、
を含む、ステップと、
前記抽象構文木に基づいて、抽象コードグラフ（ACG）を生成するステップであって、
前記第１のASTノードに基づいて、前記第１の構成要素を前記第１の抽象度で表現する第１のACGノードを生成することと、
前記第２のASTノードに基づいて、第２のACGノードを生成することと、
前記第１のACGノードに基づいて、前記第１の構成要素を第２の抽象度で表現する第３のACGノードを生成することであって、前記第２の抽象度は、前記第１の抽象度よりも抽象的であり、前記第３のACGノードは、前記第２のACGノードが前記抽象コードグラフにおいて前記第３のACGノードを介して前記第１のACGノードに関連するように、前記第１のACGノードと前記第２のACGノードとの間に連結され、前記第１のACGノードと前記第２のACGノードとの間の関連は、前記第１のASTノードが前記抽象構文木において前記第２のASTノードに連結されていることに基づく、生成することと、
を含むステップと、
を含む、方法。
【請求項２】
前記抽象構文木は、前記ソースコード内の第３の位置に配置されている前記第１の構成要素を表現する第３のASTノードであって、前記第１の構成要素を前記第１の抽象度で表現する第３のASTノードをさらに含み、
前記第１のASTノードに基づいて、前記第１のACGノードを生成することは、前記第１のASTノード及び前記第３のASTノードの両方が前記第１の構成要素を前記第１の抽象度で表現していることに応じて、前記第１のASTノードと前記第３のASTノードとを前記第１のACGノードへとマージすることを含む、請求項１に記載の方法。
【請求項３】
前記抽象構文木は、前記ソースコード内の第３の位置に配置されている第３の構成要素を表現する第３のASTノードをさらに含み、
前記抽象構文木は、前記ソースコード内の第４の位置に配置されている前記第１の構成要素を表現する第４のASTノードであって、前記第１の構成要素を前記第１の抽象度で表現する第４のASTノードをさらに含み、前記第３のASTノードは、前記第３の位置における前記第３の構成要素と前記第４の位置における前記第１の構成要素との間の関係を表現するように、前記抽象構文木において前記第４のASTノードに連結され、
前記抽象コードグラフを生成する前記ステップは、
前記第４のASTノードに基づいて、前記第１の構成要素を前記第１の抽象度で表現する第４のACGノードを生成することと、
前記第３のASTノードに基づいて、第５のACGノードを生成することと、
前記第４のACGノードに基づいて、前記第１の構成要素を前記第２の抽象度で表現する第６のACGノードを生成することであって、前記第６のACGノードは、前記第４のACGノードが前記抽象コードグラフにおいて前記第６のACGノードを介して前記第５のACGノードに関連するように、前記第４のACGノードと前記第５のACGノードとの間に連結され、前記第４のACGノードと前記第５のACGノードとの間の関連は、前記第４のASTノードが前記抽象構文木において前記第３のASTノードに連結されていることに基づく、生成することと、
前記第１のACGノード及び前記第４のACGノードの両方が前記第１の構成要素を前記第１の抽象度で表現していることに応じて、前記第１のACGノードと前記第４のACGノードとを、前記第１の構成要素を前記第１の抽象度で表現する第７のACGノードへとマージすることと、
前記第３のACGノード及び前記第６のACGノードの両方が前記第１の構成要素を前記第２の抽象度で表現していることに応じて、前記第３のACGノードと前記第６のACGノードとを、前記第１の構成要素を前記第２の抽象度で表現する第８のACGノードへとマージすることと、
をさらに含む、請求項１に記載の方法。
【請求項４】
前記抽象構文木は、差分抽象構文木を含み、
前記差分抽象構文木は、
前記ソースコードの前記構成要素と、
前記ソースコード内の前記構成要素の間の前記関係と、
他のソースコードの他の構成要素と、
前記他のソースコード内の前記他の構成要素の間の関係と、
前記構成要素と前記他の構成要素との間の関係と、
を表現し、
前記方法は、
前記差分抽象構文木を生成するステップであって、
前記ソースコードの前記構成要素と、前記ソースコード内の前記構成要素の間の前記関係と、を表現する第１の抽象構文木を得ることであって、前記第１の抽象構文木は、前記ソースコード内の第３の位置に配置されている第３の構成要素を表現する第３のASTノードを含む、得ることと、
前記他のソースコードの前記他の構成要素と、前記他のソースコード内の前記他の構成要素の間の前記関係と、を表現する第２の抽象構文木を得ることであって、前記第２の抽象構文木は、前記他のソースコード内の第４の位置に配置されている前記第３の構成要素を表現する第４のASTノードを含む、得ることと、
前記第３のASTノード及び前記第４のASTノードの両方が前記第３の構成要素を表現していることに応じて、前記第３のASTノードと前記第４のASTノードとを、前記第３の構成要素を表現する、前記差分抽象構文木の第５のASTノードへとマージすることと、
を含む、ステップ
をさらに含む、請求項１に記載の方法。
【請求項５】
前記抽象コードグラフを、複数の既存のソフトウェアプログラムに基づく複数の抽象コードグラフと比較するステップと、
前記抽象コードグラフを前記複数の抽象コードグラフと比較したことに基づいて、前記複数の既存のソフトウェアプログラムの中での、前記抽象コードグラフに対応するコードパターンの出現を識別するステップと、
前記出現を識別したことに基づいて、前記ソースコードについてデバッグ動作を実行するステップと、
をさらに含む、請求項１に記載の方法。
【請求項６】
１つ以上のサブグラフルールに従って、前記抽象コードグラフのサブグラフを得るステップであって、前記サブグラフは、１つ以上のACGノードを含む、ステップ
をさらに含む、請求項１に記載の方法。
【請求項７】
前記１つ以上のサブグラフルールに従って、全ての可能なサブグラフを得るステップ
をさらに含む、請求項６に記載の方法。
【請求項８】
前記サブグラフは、前記サブグラフのリーフノードである１つ以上のスプリットノードを含み、前記１つ以上のサブグラフルールは、前記抽象コードグラフのルートノードから前記抽象コードグラフのリーフノードへの、前記抽象コードグラフにおける全ての可能なパスが、前記サブグラフのスプリットノードと相関する、前記抽象コードグラフにおける１つのノードしか含まないことを含む、請求項６に記載の方法。
【請求項９】
前記サブグラフを、複数の既存のソフトウェアプログラムに基づく複数のサブグラフと比較するステップと、
前記サブグラフを前記複数のサブグラフと比較したことに基づいて、前記複数の既存のソフトウェアプログラムの中での、前記サブグラフに対応するコードパターンの出現を識別するステップと、
前記出現を識別したことに基づいて、前記ソースコードについてデバッグ動作を実行するステップと、
をさらに含む、請求項６に記載の方法。
【請求項１０】
システムに複数の動作を実行させるよう構成されているコンピュータ実行可能な命令を含む１つ以上のコンピュータ読み取り可能な記憶媒体であって、前記複数の動作は、
ソースコードの構成要素と、前記ソースコード内の前記構成要素の間の関係と、を表現する抽象構文木（AST）を得る動作であって、前記抽象構文木は、
前記ソースコード内の第１の位置に配置されている第１の構成要素を表現する第１のASTノードであって、前記第１の構成要素を第１の抽象度で表現する第１のASTノードと、
前記ソースコード内の第２の位置に配置されている第２の構成要素を表現する第２のASTノードであって、前記第１のASTノードは、前記第１の位置における前記第１の構成要素と前記第２の位置における前記第２の構成要素との間の関係を表現するように、前記抽象構文木において前記第２のASTノードに連結される、第２のASTノードと、
を含む、動作と、
前記抽象構文木に基づいて、抽象コードグラフ（ACG）を生成する動作であって、
前記第１のASTノードに基づいて、前記第１の構成要素を前記第１の抽象度で表現する第１のACGノードを生成することと、
前記第２のASTノードに基づいて、第２のACGノードを生成することと、
前記第１のACGノードに基づいて、前記第１の構成要素を第２の抽象度で表現する第３のACGノードを生成することであって、前記第２の抽象度は、前記第１の抽象度よりも抽象的であり、前記第３のACGノードは、前記第２のACGノードが前記抽象コードグラフにおいて前記第３のACGノードを介して前記第１のACGノードに関連するように、前記第１のACGノードと前記第２のACGノードとの間に連結され、前記第１のACGノードと前記第２のACGノードとの間の関連は、前記第１のASTノードが前記抽象構文木において前記第２のASTノードに連結されていることに基づく、生成することと、
を含む動作と、
を含む、１つ以上のコンピュータ読み取り可能な記憶媒体。
【請求項１１】
前記抽象構文木は、前記ソースコード内の第３の位置に配置されている前記第１の構成要素を表現する第３のASTノードであって、前記第１の構成要素を前記第１の抽象度で表現する第３のASTノードをさらに含み、
前記第１のASTノードに基づいて、前記第１のACGノードを生成することは、前記第１のASTノード及び前記第３のASTノードの両方が前記第１の構成要素を前記第１の抽象度で表現していることに応じて、前記第１のASTノードと前記第３のASTノードとを前記第１のACGノードへとマージすることを含む、請求項１０に記載の１つ以上のコンピュータ読み取り可能な記憶媒体。
【請求項１２】
前記抽象構文木は、前記ソースコード内の第３の位置に配置されている第３の構成要素を表現する第３のASTノードをさらに含み、
前記抽象構文木は、前記ソースコード内の第４の位置に配置されている前記第１の構成要素を表現する第４のASTノードであって、前記第１の構成要素を前記第１の抽象度で表現する第４のASTノードをさらに含み、前記第３のASTノードは、前記第３の位置における前記第３の構成要素と前記第４の位置における前記第１の構成要素との間の関係を表現するように、前記抽象構文木において前記第４のASTノードに連結され、
前記抽象コードグラフを生成する前記動作は、
前記第４のASTノードに基づいて、前記第１の構成要素を前記第１の抽象度で表現する第４のACGノードを生成することと、
前記第３のASTノードに基づいて、第５のACGノードを生成することと、
前記第４のACGノードに基づいて、前記第１の構成要素を前記第２の抽象度で表現する第６のACGノードを生成することであって、前記第６のACGノードは、前記第４のACGノードが前記抽象コードグラフにおいて前記第６のACGノードを介して前記第５のACGノードに関連するように、前記第４のACGノードと前記第５のACGノードとの間に連結され、前記第４のACGノードと前記第５のACGノードとの間の関連は、前記第４のASTノードが前記抽象構文木において前記第３のASTノードに連結されていることに基づく、生成することと、
前記第１のACGノード及び前記第４のACGノードの両方が前記第１の構成要素を前記第１の抽象度で表現していることに応じて、前記第１のACGノードと前記第４のACGノードとを、前記第１の構成要素を前記第１の抽象度で表現する第７のACGノードへとマージすることと、
前記第３のACGノード及び前記第６のACGノードの両方が前記第１の構成要素を前記第２の抽象度で表現していることに応じて、前記第３のACGノードと前記第６のACGノードとを、前記第１の構成要素を前記第２の抽象度で表現する第８のACGノードへとマージすることと、
をさらに含む、請求項１０に記載の１つ以上のコンピュータ読み取り可能な記憶媒体。
【請求項１３】
前記抽象構文木は、差分抽象構文木を含み、
前記差分抽象構文木は、
前記ソースコードの前記構成要素と、
前記ソースコード内の前記構成要素の間の前記関係と、
他のソースコードの他の構成要素と、
前記他のソースコード内の前記他の構成要素の間の関係と、
前記構成要素と前記他の構成要素との間の関係と、
を表現し、
前記複数の動作は、
前記差分抽象構文木を生成する動作であって、
前記ソースコードの前記構成要素と、前記ソースコード内の前記構成要素の間の前記関係と、を表現する第１の抽象構文木を得ることであって、前記第１の抽象構文木は、前記ソースコード内の第３の位置に配置されている第３の構成要素を表現する第３のASTノードを含む、得ることと、
前記他のソースコードの前記他の構成要素と、前記他のソースコード内の前記他の構成要素の間の前記関係と、を表現する第２の抽象構文木を得ることであって、前記第２の抽象構文木は、前記他のソースコード内の第４の位置に配置されている前記第３の構成要素を表現する第４のASTノードを含む、得ることと、
前記第３のASTノード及び前記第４のASTノードの両方が前記第３の構成要素を表現していることに応じて、前記第３のASTノードと前記第４のASTノードとを、前記第３の構成要素を表現する、前記差分抽象構文木の第５のASTノードへとマージすることと、
を含む、動作
をさらに含む、請求項１０に記載の１つ以上のコンピュータ読み取り可能な記憶媒体。
【請求項１４】
前記複数の動作は、
前記抽象コードグラフを、複数の既存のソフトウェアプログラムに基づく複数の抽象コードグラフと比較する動作と、
前記抽象コードグラフを前記複数の抽象コードグラフと比較したことに基づいて、前記複数の既存のソフトウェアプログラムの中での、前記抽象コードグラフに対応するコードパターンの出現を識別する動作と、
前記出現を識別したことに基づいて、前記ソースコードについてデバッグ動作を実行する動作と、
をさらに含む、請求項１０に記載の１つ以上のコンピュータ読み取り可能な記憶媒体。
【請求項１５】
前記複数の動作は、
１つ以上のサブグラフルールに従って、前記抽象コードグラフのサブグラフを得る動作であって、前記サブグラフは、１つ以上のACGノードを含む、動作
をさらに含む、請求項１０に記載の１つ以上のコンピュータ読み取り可能な記憶媒体。
【請求項１６】
前記サブグラフは、前記サブグラフのリーフノードである１つ以上のスプリットノードを含み、前記１つ以上のサブグラフルールは、前記抽象コードグラフのルートノードから前記抽象コードグラフのリーフノードへの、前記抽象コードグラフにおける全ての可能なパスが、前記サブグラフのスプリットノードと相関する、前記抽象コードグラフにおける１つのノードしか含まないことを含む、請求項１５に記載の１つ以上のコンピュータ読み取り可能な記憶媒体。
【請求項１７】
前記複数の動作は、
前記サブグラフを、複数の既存のソフトウェアプログラムに基づく複数のサブグラフと比較する動作と、
前記サブグラフを前記複数のサブグラフと比較したことに基づいて、前記複数の既存のソフトウェアプログラムの中での、前記サブグラフに対応するコードパターンの出現を識別する動作と、
前記出現を識別したことに基づいて、前記ソースコードについてデバッグ動作を実行する動作と、
をさらに含む、請求項１５に記載の１つ以上のコンピュータ読み取り可能な記憶媒体。
【請求項１８】
システムであって、
１つ以上のプロセッサと、
前記１つ以上のプロセッサに通信可能に接続され、命令を記憶している１つ以上のコンピュータ読み取り可能な記憶媒体であって、前記命令は、前記１つ以上のプロセッサによる実行に応じて、前記システムに複数の動作を実行させるよう構成されており、前記複数の動作は、
ソースコードの構成要素と、前記ソースコード内の前記構成要素の間の関係と、を表現する抽象構文木（AST）を得る動作であって、前記抽象構文木は、
前記ソースコード内の第１の位置に配置されている第１の構成要素を表現する第１のASTノードであって、前記第１の構成要素を第１の抽象度で表現する第１のASTノードと、
前記ソースコード内の第２の位置に配置されている第２の構成要素を表現する第２のASTノードであって、前記第１のASTノードは、前記第１の位置における前記第１の構成要素と前記第２の位置における前記第２の構成要素との間の関係を表現するように、前記抽象構文木において前記第２のASTノードに連結される、第２のASTノードと、
を含む、動作と、
前記抽象構文木に基づいて、抽象コードグラフ（ACG）を生成する動作であって、
前記第１のASTノードに基づいて、前記第１の構成要素を前記第１の抽象度で表現する第１のACGノードを生成することと、
前記第２のASTノードに基づいて、第２のACGノードを生成することと、
前記第１のACGノードに基づいて、前記第１の構成要素を第２の抽象度で表現する第３のACGノードを生成することであって、前記第２の抽象度は、前記第１の抽象度よりも抽象的であり、前記第３のACGノードは、前記第２のACGノードが前記抽象コードグラフにおいて前記第３のACGノードを介して前記第１のACGノードに関連するように、前記第１のACGノードと前記第２のACGノードとの間に連結され、前記第１のACGノードと前記第２のACGノードとの間の関連は、前記第１のASTノードが前記抽象構文木において前記第２のASTノードに連結されていることに基づく、生成することと、
を含む動作と、
を含む、１つ以上のコンピュータ読み取り可能な記憶媒体と、
を有する、システム。
【請求項１９】
前記抽象構文木は、前記ソースコード内の第３の位置に配置されている前記第１の構成要素を表現する第３のASTノードであって、前記第１の構成要素を前記第１の抽象度で表現する第３のASTノードをさらに含み、
前記第１のASTノードに基づいて、前記第１のACGノードを生成することは、前記第１のASTノード及び前記第３のASTノードの両方が前記第１の構成要素を前記第１の抽象度で表現していることに応じて、前記第１のASTノードと前記第３のASTノードとを前記第１のACGノードへとマージすることを含む、請求項１８に記載のシステム。
【請求項２０】
前記抽象構文木は、前記ソースコード内の第３の位置に配置されている第３の構成要素を表現する第３のASTノードをさらに含み、
前記抽象構文木は、前記ソースコード内の第４の位置に配置されている前記第１の構成要素を表現する第４のASTノードであって、前記第１の構成要素を前記第１の抽象度で表現する第４のASTノードをさらに含み、前記第３のASTノードは、前記第３の位置における前記第３の構成要素と前記第４の位置における前記第１の構成要素との間の関係を表現するように、前記抽象構文木において前記第４のASTノードに連結され、
前記抽象コードグラフを生成する前記動作は、
前記第４のASTノードに基づいて、前記第１の構成要素を前記第１の抽象度で表現する第４のACGノードを生成することと、
前記第３のASTノードに基づいて、第５のACGノードを生成することと、
前記第４のACGノードに基づいて、前記第１の構成要素を前記第２の抽象度で表現する第６のACGノードを生成することであって、前記第６のACGノードは、前記第４のACGノードが前記抽象コードグラフにおいて前記第６のACGノードを介して前記第５のACGノードに関連するように、前記第４のACGノードと前記第５のACGノードとの間に連結され、前記第４のACGノードと前記第５のACGノードとの間の関連は、前記第４のASTノードが前記抽象構文木において前記第３のASTノードに連結されていることに基づく、生成することと、
前記第１のACGノード及び前記第４のACGノードの両方が前記第１の構成要素を前記第１の抽象度で表現していることに応じて、前記第１のACGノードと前記第４のACGノードとを、前記第１の構成要素を前記第１の抽象度で表現する第７のACGノードへとマージすることと、
前記第３のACGノード及び前記第６のACGノードの両方が前記第１の構成要素を前記第２の抽象度で表現していることに応じて、前記第３のACGノードと前記第６のACGノードとを、前記第１の構成要素を前記第２の抽象度で表現する第８のACGノードへとマージすることと、
をさらに含む、請求項１８に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示に記載の実施形態は、抽象コードグラフ（ACG：abstract  code  graph）を用いてソフトウェアを表現することに関する。
【背景技術】
【０００２】
ソフトウェアは、多くの業界において重要であり得る。ソフトウェアの開発、テスト、及び／又はデバッグは、ソフトウェアの開発、テスト、及び／又はデバッグのいくつかの側面を支援又は自動化するツールから恩恵を受け得る。
【０００３】
本開示において特許請求される主題は、あらゆる欠点を解決する実施形態又は上記のような環境においてのみ動作する実施形態に限定されるものではない。そうではなく、この背景技術の記載は、本開示に記載のいくつかの実施形態が実施され得る１つの例示的な技術領域を示すために提供されているに過ぎない。
【発明の概要】
【０００４】
一実施形態の一態様に従うと、抽象コードグラフを生成する方法が提示され得る。この方法は、ソースコードの構成要素と、ソースコード内の構成要素の間の関係と、を表現し得る抽象構文木（AST：abstract  syntax  tree）を得るステップを含み得る。抽象構文木は、第１のASTノード及び第２のASTノードを含み得る。第１のASTノードは、ソースコード内の第１の位置に配置されている第１の構成要素を表現し得る。第１のASTノードは、第１の構成要素を第１の抽象度（level  of  abstraction）で表現し得る。第２のASTノードは、ソースコード内の第２の位置に配置されている第２の構成要素を表現し得る。第１のASTノードは、第１の位置における第１の構成要素と第２の位置における第２の構成要素との間の関係を表現するように、抽象構文木において第２のASTノードに連結され得る。この方法は、抽象構文木に基づいて抽象コードグラフ（ACG）を生成するステップをさらに含み得る。抽象コードグラフを生成するステップは、第１のASTノードに基づいて第１のACGノードを生成することを含み得る。第１のACGノードは、第１の構成要素を第１の抽象度で表現し得る。抽象コードグラフを生成するステップはまた、第２のASTノードに基づいて第２のACGノードを生成することを含み得る。抽象コードグラフを生成するステップはまた、第１のACGノードに基づいて、第１の構成要素を第２の抽象度で表現する第３のACGノードを生成することを含み得る。第２の抽象度は、第１の抽象度よりも抽象的であり得る。第３のACGノードは、第２のACGノードが抽象コードグラフにおいて第３のACGノードを介して第１のACGノードに関連するように、第１のACGノードと第２のACGノードとの間に連結され得る。第１のACGノードと第２のACGノードとの間の関連は、第１のASTノードが抽象構文木において第２のASTノードに連結されていることに基づき得る。
【０００５】
実施形態の目的及び／又は利点が、少なくとも請求項において特に示される要素、特徴、及び組合せにより、実現又は達成される。
【０００６】
前述の総括的な説明及び以下の詳細な説明の両方ともが、例として与えられ、説明的なものであり、特許請求される本開示を限定するものではないことを理解されたい。
【図面の簡単な説明】
【０００７】
例示的な実施形態が、添付の図面を使用して、より具体的且つ詳細に記載及び説明される。
【図１Ａ】抽象コードグラフを生成するよう構成されている例示的なシステムのブロック図。
【図１Ｂ】例示的な抽象構文木のブロック図。
【図１Ｃ】例示的な２つの抽象構文木のブロック図。
【図１Ｄ】例示的な差分抽象構文木のブロック図。
【図１Ｅ】例示的な中間抽象コードグラフのブロック図。
【図１Ｆ】例示的な抽象コードグラフのブロック図。
【図１Ｇ】例示的な別の中間抽象コードグラフのブロック図。
【図１Ｈ】例示的な差分抽象コードグラフのブロック図。
【図２】例示的なコンピューティングシステムのブロック図。
【図３】抽象コードグラフを生成する例示的な方法のフローチャート。
【発明を実施するための形態】
【０００８】
２つ以上のソフトウェアプログラムを比較することは、ソフトウェアの開発、デバッグ、及び／又はテストにとって有用であり得る。例えば、ソフトウェア開発ツールは、２つ以上のソフトウェアプログラムの間の比較を用いて、ソフトウェア開発のいくつかの側面を支援又は自動化することができる。
【０００９】
ソフトウェアプログラムを比較するとき、ソフトウェアプログラムのソースコードそのものを比較することよりも、ソフトウェアプログラムのソースコードの抽象的表現を比較することの方が有用であることがある。本開示のいくつかの実施形態は、ソフトウェアプログラムの抽象的表現であり得る抽象コードグラフを生成することに関する。本開示において、「抽象化する」という用語は、ソースコードの抽象的表現を用いてソースコードを表現するプロセス又は抽象的表現を生成するプロセスを指し得る。本開示において、「抽象的概念」という用語は、抽象的表現を指し得る。
【００１０】
抽象的表現を用いてソフトウェアプログラムを表現するとき、ソフトウェアプログラムを表現する２つ以上の方法が存在し得る。例えば、ソフトウェアプログラムは、複数の抽象度で表現され得る。例えば、ソフトウェアプログラムの高い抽象的表現は、ソフトウェアプログラムの機能全体を表現し得る。ソフトウェアプログラムのより低い抽象的表現は、ソフトウェアプログラムのソースコードの行の表現を含み得る。ソフトウェアプログラムのさらに低い抽象的表現は、ソフトウェアプログラムのソースコードの構成要素の表現を含み得る。本開示において、「抽象（的）」という用語及び「具象（的）」という用語は、いずれもソフトウェアプログラムの表現の抽象度を指す対義語である。本開示において、最低抽象度又は具象的という抽象度である具象的抽象度は、抽象化されていない文字通りの表現を含み得る。本開示において、「抽象（的）」という用語は、ある一般化レベルを指し得る。本開示において、「構成要素」という用語は、ソースコードの要素を指し得、例えば、「構成要素」は、ソースコードの構文（syntactic）ワード又はトークンを指し得る。
【００１１】
２つ以上の方法でソフトウェアプログラムを表現する別の例について、構文フレーズ内の構成要素が、異なる抽象度で表現され得る。例えば、いくつかの例において、コード行「closable.close();」の抽象的概念は、「closable」が抽象的概念「var」により表現され、「close()」が「close」として文字通りに表現され得るように、され得る。追加的又は代替的に、コード行「closable.close();」の別の抽象的概念は、「closable」が文字通りに表現され、「close()」が抽象的概念「MethodCall」により表現され得るように、されることもある。したがって、「closable.close();」の例示的な２つの非限定的な抽象的概念は、「var.close」及び「closable.MethodCall」であり得る。
【００１２】
ソフトウェアプログラムの抽象的表現は、特定のソフトウェアプログラムと他のソフトウェアプログラムとの比較から、文字通りの特定のソフトウェアプログラムと他のソフトウェアプログラムとの比較よりも意味のある結果をもたらすことを可能にし得る。例えば、いくつかの例において、変数名が取り除かれたソフトウェアプログラムの抽象的表現を比較することが有用であり得る。例えば、文字通りのコード行「closable.close();」と別の文字通りのコード行「foo.close();」との比較は、変数名の差異に起因して一致しないとして報告され得る。一方、変数名が取り除かれると、「var.close();」という抽象的表現と「var.close();」という抽象的表現とは、相関を有し得、したがって、これらの抽象的表現の間の比較は、より意味のあるものであり得る。
【００１３】
以下でさらに詳細に説明されるように、本開示のいくつかの実施形態において、１つ以上の抽象コードグラフが、特定のソフトウェアプログラムについて生成され得る。抽象コードグラフは、以下で詳細に説明されるように、特定のソフトウェアプログラム及びその対応する構成要素を異なる抽象度で表現し得、特定のソフトウェアプログラムの異なるタイプの解析を実行することを可能にし得る。
【００１４】
例えば、多数の既存のソフトウェアプログラム（例えば、数千、数万、数十万、数百万といった既存のソフトウェアプログラム）を含み得る、既存のソフトウェアプログラムのリポジトリが存在し得る。本開示において、例えば１つ以上のリポジトリにおいて、解析のために利用可能であり得る既存のソフトウェアプログラム及びこれらの対応するソースコードは、「ビッグコード（big  code）」と呼ばれ得る。本開示のシステム又は動作を用いて、ビッグコードの抽象コードグラフを生成することができる。ビッグコードの抽象コードグラフを解析して、頻繁に出現する抽象コードグラフを識別することができ、これは、ビッグコードにおける頻繁に出現するコードパターンを示し得る。本開示において、ビッグコードにおける頻繁に出現するコードパターンは、「頻出コードパターン」と呼ばれ得る。例えば、いくつかの頻出コードパターンは、例えば、事前条件の欠落といった、フォールト、エラー、又は脆弱性に関連し得る、あるいは、このようなフォールト、エラー、又は脆弱性を含み得る。他の頻出コードパターンは、フォールト、エラー、又は脆弱性に関連し得る修正又はパッチに関連し得る。
【００１５】
開発、デバッグ、及び／又はテストされているソフトウェアプログラムを解析することは有用であり得る。本開示において、開発、デバッグ、及び／又はテストされているソフトウェアプログラムは、「テスト対象ソフトウェア」と呼ばれ得る。テスト対象ソフトウェアを、例えばフォールト、エラー、又は脆弱性に関連する頻出コードパターン等の頻出コードパターンと比較することは有用であり得る。本開示のシステム又は動作を用いて、テスト対象ソフトウェアの抽象コードグラフを生成することができる。本開示のシステム又は動作を用いて、テスト対象ソフトウェアの１つ以上の抽象コードグラフを、ビッグコードの１つ以上の抽象コードグラフ又は１つ以上の頻出コードパターンと比較することができる。
【００１６】
テスト対象ソフトウェアの抽象コードグラフ及び／又はビッグコードの抽象コードグラフは、ソフトウェアの開発、デバッグ、及び／又はテストにとって有用であり得る。例えば、ソフトウェア開発ツールは、抽象コードグラフを使用して、ソフトウェア開発者を支援することができる。例えば、統合開発環境は、開発されているソフトウェアプログラムの抽象コードグラフを解析し、抽象コードグラフにより示され得る、ソフトウェアプログラムの側面について、開発者を促すことができる。追加的又は代替的に、ソフトウェア開発ツールは、抽象コードグラフを使用して、ソフトウェアの開発、テスト、及び／又はデバッグのいくつかの側面を自動化することもある。例えば、ソフトウェア開発ツールは、テスト対象ソフトウェアの抽象コードグラフを、ビッグコードの１つ以上の抽象コードグラフと比較することにより、バグ、エラー、又は脆弱性について、テスト対象ソフトウェアをテストすることができる。追加的又は代替的に、ソフトウェア開発ツールは、ソフトウェアプログラムにおけるバグ、エラー、又は脆弱性を修復することに関与することもある。例えば、ソフトウェア開発ツールは、例えば、参照によりその全体が本明細書に組み込まれる、２０１７年１１月２４日に出願された米国特許出願第１５／８２２１０６号に記載されているように、抽象コードグラフに基づいて修復候補を識別することができる。
【００１７】
図１Ａは、本開示に記載の少なくとも１つの実施形態に従って抽象コードグラフ１３０を生成するよう構成されている例示的なシステム１００のブロック図である。システム１００は、抽象構文木１１０に基づいて抽象コードグラフ１３０を生成するよう構成され得る。さらに、システム１００は、本開示に記載の少なくとも１つの実施形態に従って、抽象コードグラフ１３０の１つ以上のサブグラフ１５０を生成するよう構成され得る。これらの実施形態又は他の実施形態において、システム１００は、抽象コードグラフ１３０及び／又は１つ以上のサブグラフ１５０のうちの１つ以上を解析するよう構成され得る。
【００１８】
いくつかの実施形態において、抽象構文木１１０は、ソースコードの構成要素をノードとして表現し、構成要素間の関係をノード間のリンクとして表現する概念マッピング又はグラフを含み得る。
【００１９】
例えば、図１Ｂは、本開示に記載の少なくとも１つの実施形態に従った例示的な抽象構文木１１０Ａを示している。抽象構文木１１０Ａは、図１Ａの抽象構文木１１０の例であり得る。図示されているが、抽象構文木１１０Ａは概念的であり得る。例えば、抽象構文木１１０Ａは、テーブル、リスト、又は他のデータ構造として、コンピュータメモリに記憶され得る。
【００２０】
いくつかの実施形態において、抽象構文木１１０Ａは、ルートノード１０３Ａ、１つ以上のブランチノード１０６、及び１つ以上のリーフノード１０９を含み得る。図１Ｂにおいて、ブランチノード１０６Ａ及びブランチノード１０６Ｂという２つのブランチノードが示されている（これらは、集合的にブランチノード１０６と呼ばれる且つ／又は個々にブランチノード１０６と呼ばれる）。図１Ｂにおいて、リーフノード１０９Ａ、リーフノード１０９Ｂ、リーフノード１０９Ｃ、リーフノード１０９Ｄ、及びリーフノード１０９Ｅという５つのリーフノードが示されている（これらは、集合的にリーフノード１０９と呼ばれる且つ／又は個々にリーフノード１０９と呼ばれる）。しかしながら、ブランチノード及び／又はリーフノードの数は、異なる実装に応じて変わり得る。
【００２１】
いくつかの実施形態において、抽象構文木１１０Ａは、抽象構文木１１０Ａを生成し得るコンパイラから得られ得る。追加的又は代替的に、抽象構文木１１０Ａは、何らかの他のソースから得られることもある。追加的又は代替的に、システム１００が、ソースコードから抽象構文木１１０Ａを生成することもある。
【００２２】
いくつかの実施形態において、抽象構文木１１０Ａは、ソースコードの１つ以上の構文フレーズを表現し得る。いくつかの実施形態において、例えば、ルートノード１０３Ａ、ブランチノード１０６、及びリーフノード１０９等の各ノードは、ソースコードの１つの構成要素を表現し得る。いくつかの実施形態において、抽象構文木１１０Ａのノードは、構成要素を第１の抽象度で表現し得る。いくつかの実施形態において、抽象構文木１１０Ａは、構成要素を、具象的抽象度で、すなわち、文字通りに、表現し得る。
【００２３】
いくつかの実施形態において、各ノードは、ソースコードの１つの位置において見つけられた１つの構成要素を表現し得る。例えば、特定の構成要素は、ソースコードの構文フレーズ内で２回出現することがある。この構文フレーズを表現する抽象構文木１１０Ａは、特定の構成要素が構文フレーズ内の異なる位置において見つけられたので、特定の構成要素をそれぞれ表現する２つのノードを含み得る。そのような場合、特定の構成要素を表現する２つのノードの間の連結は、異なり得、構文フレーズ内の構成要素の位置における差異を表現し得る。
【００２４】
例えば、図１Ｂを参照すると、抽象構文木１１０Ａは、ソースコード「if  (closable  !=  null)  closable.close();」を表現し得る。ルートノード１０３Ａは、構成要素「if」を「IfStmt」として表現し得る。ブランチノード１０６Ａは、構成要素「!=」を「Op  !=」として表現し得る。リーフノード１０９Ａは、ソースコード内の第１の位置における構成要素「closable」を「Var  closable」として表現し得る。リーフノード１０９Ｂは、構成要素「null」を「Const  null」として表現し得る。ブランチノード１０６Ｂは、構成要素「close()」を「MethodCall」として表現し得る。リーフノード１０９Ｃは、ソースコード内の第２の位置における構成要素「closable」を「Var  closable」として表現し得る。リーフノード１０９Ｄは、構成要素「close()」を「Id  close」として表現し得る。リーフノード１０９Ｅは、「close()」のリターンの構成要素を「Void」として表現し得る。
【００２５】
図示されている例において、リーフノード１０９Ａ及びリーフノード１０９Ｃの両方ともが、構成要素「closable」を表現し得る。リーフノード１０９Ａは、ソースコード内の第１の位置における構成要素「closable」を表現し、リーフノード１０９Ｃは、ソースコード内の第２の位置における構成要素「closable」を表現する。リーフノード１０９Ａは、ソースコード内の第１の位置における構成要素「closable」とソースコード内の構成要素「!=」との間の関係を表現するブランチノード１０６Ａに連結され得る。リーフノード１０９Ｃは、ソースコード内の第２の位置における構成要素「closable」とソースコード内の構成要素「close()」との間の関係を表すブランチノード１０６Ｂに連結され得る。
【００２６】
本開示の範囲から逸脱することなく、抽象構文木１１０Ａに対して、変更、追加、又は省略が可能である。ブランチノード１０６の１つのレイヤのみを用いて図示されているが、抽象構文木１１０Ａは、ブランチノード１０６の任意の数のレイヤを含んでもよい。いくつかの実施形態において、図１Ａの抽象構文木１１０は、図１Ｃ及び図１Ｄを参照してより詳細に説明される差分（difference）抽象構文木であり得る。
【００２７】
図１Ｃは、本開示に記載の少なくとも１つの実施形態に従った例示的な抽象構文木１１０Ｂ及び例示的な抽象構文木１１０Ｃを示している。抽象構文木１１０Ｂ及び抽象構文木１１０Ｃは各々、上述した図１Ａの抽象構文木１１０の例であり得る。抽象構文木１１０Ｂは、第１のソースコードの第１の構成要素と、第１のソースコードの第１の構成要素の間の関係と、の表現を含み得る。抽象構文木１１０Ｃは、第２のソースコードの第２の構成要素と、第２のソースコードの第２の構成要素の間の関係と、の表現を含み得る。
【００２８】
いくつかの実施形態において、抽象構文木１１０Ｂは、ルートノード１０３Ｂ、１つ以上のブランチノード１０６、及び１つ以上のリーフノード１０９を含み得る。抽象構文木１１０Ｂに関連して、図１Ｃにおいて、ブランチノード１０６Ａ及びブランチノード１０６Ｂという２つのブランチノードが示されている（これらは、集合的にブランチノード１０６と呼ばれる且つ／又は個別にブランチノード１０６と呼ばれる）。抽象構文木１１０Ｂに関連して、図１Ｃにおいて、リーフノード１０９Ａ、リーフノード１０９Ｂ、リーフノード１０９Ｃ、リーフノード１０９Ｄ、及びリーフノード１０９Ｅという５つのリーフノードが示されている（これらは、集合的にリーフノード１０９と呼ばれる且つ／又は個別にリーフノード１０９と呼ばれる）。しかしながら、ブランチノード及び／又はリーフノードの数は、異なる実装に応じて変わり得る。
【００２９】
本開示において、例えばリーフノード１０９Ａといったノードの番号は、２つ以上の図において繰り返され得る。これは、１つの図において与えられる例が、他の図において続けられ得るからである。例えば、図１Ｆの抽象コードグラフ１３０Ａは、図１Ｂの例示的な抽象構文木１１０Ｂに基づき得る。したがって、図１Ｂのノード及び番号は、図１Ｆのノード及び番号に対応し得る。追加的又は代替的に、図におけるノードは、ソフトウェアの例示的な構成要素に関連し得、ソフトウェアの例示的な構成要素は、２つ以上の図を参照して説明され続けられることがある。例えば、リーフノード１０９Ａは、２つ以上の図について、構成要素「closable」に対応し得る。例えば、リーフノード１０９Ａは、図１Ｂ及び図１Ｅにおいて、構成要素「closable」を表現し得る。
【００３０】
いくつかの実施形態において、抽象構文木１１０Ｃは、ルートノード１０３Ｃ、１つ以上のブランチノード１０６、及び１つ以上のリーフノード１０９を含み得る。抽象構文木１１０Ｃにおいて、ルートノード１０３Ｃは、ブランチノードとして機能するが、抽象構文木１１０Ｃは、１つ以上のブランチノード１０６を含み得る。抽象構文木１１０Ｃに関連して、図１Ｃにおいて、リーフノード１０９Ｇ、リーフノード１０９Ｈ、及びリーフノード１０９Ｉという３つのリーフノードが示されている（これらは、集合的にリーフノード１０９と呼ばれる且つ／又は個別にリーフノード１０９と呼ばれる）。しかしながら、ブランチノード及び／又はリーフノードの数は、異なる実装に応じて変わり得る。
【００３１】
いくつかの実施形態において、抽象構文木１１０Ｂは、図１Ｂに関する上記の抽象構文木１１０Ａの説明に従って、第１のソースコードの１つ以上の構文フレーズを表現し得る。また、抽象構文木１１０Ｃは、図１Ｂに関する上記の抽象構文木１１０Ａの説明に従って、第２のソースコードの１つ以上の構文フレーズを表現し得る。いくつかの実施形態において、第１のソースコードと第２のソースコードとは、例えば、第１のソースコードと第２のソースコードとが、同じ又は類似する構成要素を含む、同じ又は類似する関数を実行する、同じソフトウェアプログラムの一部である、同じエンティティにより開発又は記述されている、あるいは、類似するフォールト、エラー、又は脆弱性に関連する等、関連し得る。例えば、抽象構文木１１０Ｃは、エラーに関連付けられたコードパターンを表現し得、抽象構文木１１０Ｂは、このエラーに対処し得る修復候補を表現し得る。
【００３２】
例えば、第２のソースコードは、構文フレーズ「closable.close();」を含み得、第１のソースコードは、構文フレーズ「if  (closable  !=  null)  closable.close();」を含み得る。第２のソースコードは、第１のソースコードと同じ関数を実行し得る。第１のソースコードは、第２のソースコードよりもセキュアであり得る、あるいは、第２のソースコードよりもフォールト又はエラーの低い可能性を含み得る。第１のソースコードは、第２のソースコードに関する開発提案の修復候補であり得る。第１のソースコードは、第２のソースコードと同じソフトウェアプログラムからのものであり得る。追加的又は代替的に、第１のソースコードは、ビッグコードからのものであり得るのに対し、第２のソースコードは、テスト対象ソフトウェアからのものであり得る。
【００３３】
例えば、図１Ｃを参照すると、抽象構文木１１０Ｃは、第２のソースコード「closable.close();」を表現し得る。ルートノード１０３Ｃは、構成要素「close()」を「MethodCall」として表現し得る。リーフノード１０９Ｇは、第２のソースコード内の構成要素「closable」を「Var  closable」として表現し得る。リーフノード１０９Ｈは、構成要素「close()」を「Id  close」として表現し得る。リーフノード１０９Ｉは、「close()」のリターンの構成要素を「Void」として表現し得る。
【００３４】
例えば、図１Ｃを参照すると、抽象構文木１１０Ｂは、第１のソースコード「if  (closable  !=  null)  closable.close();」を表現し得る。ルートノード１０３Ｂは、構成要素「if」を「IfStmt」として表現し得る。ブランチノード１０６Ａは、構成要素「!=」を「Op  !=」として表現し得る。リーフノード１０９Ａは、第１のソースコード内の第１の位置における構成要素「closable」を「Var  closable」として表現し得る。リーフノード１０９Ｂは、構成要素「null」を「Const  null」として表現し得る。ブランチノード１０６Ｂは、構成要素「close()」を「MethodCall」として表現し得る。リーフノード１０９Ｃは、第１のソースコード内の第２の位置における構成要素「closable」を「Var  closable」として表現し得る。リーフノード１０９Ｄは、構成要素「close()」を「Id  close」として表現し得る。リーフノード１０９Ｅは、「close()」のリターンの構成要素を「Void」として表現し得る。
【００３５】
本開示の範囲から逸脱することなく、抽象構文木１１０Ｂ及び／又は抽象構文木１１０Ｃに対して、変更、追加、又は省略が可能である。例えば、抽象構文木１１０Ｂ及び抽象構文木１１０Ｃは、任意の数のブランチノード及びリーフノードを含んでもよい。ブランチノード１０６の１つのレイヤのみを用いて図示されているが、抽象構文木１１０Ｂ及び抽象構文木１１０Ｃは、ブランチノード１０６の任意の数のレイヤを含んでもよい。図１Ｄを参照して以下で説明されるように、抽象構文木１１０Ｂ及び抽象構文木１１０Ｃを使用して、差分抽象構文木を生成することができる。
【００３６】
図１Ｄは、本開示に記載の少なくとも１つの実施形態に従った例示的な差分抽象構文木１１０Ｄを示している。差分抽象構文木１１０Ｄは、図１Ａの抽象構文木１１０の例であり得る。差分抽象構文木１１０Ｄは、上述した抽象構文木１１０Ａの例であり得る。しかしながら、差分抽象構文木１１０Ｄは、第１のソースコードの第１の構成要素と、第１のソースコードの第１の構成要素の間の関係と、第２のソースコードの第２の構成要素と、第２のソースコードの第２の構成要素の間の関係と、の１つ以上の表現を含み得る。追加的又は代替的に、抽象構文木１１０Ｄは、第１のソースコードと第２のソースコードとの間の関係の１つ以上の表現を含むこともある。これらの実施形態又は他の実施形態において、抽象構文木１１０Ｄは、第１のソースコードの第１の構成要素と第２のソースコードの第２の構成要素との間の関係の１つ以上の表現を含み得る。また、差分抽象構文木１１０Ｄは、２つ以上のルートノードを含み得る。追加的又は代替的に、差分抽象構文木１１０Ｄは、１つ以上のノードが、以前には、例えば図１Ｃの抽象構文木１１０Ｂ又は図１Ｃの抽象構文木１１０Ｃといった以前の抽象構文木のルートノードであった、というインジケーションを含むこともある。
【００３７】
いくつかの実施形態において、差分抽象構文木１１０Ｄは、１つ以上のルートノード、１つ以上のブランチノード１０６、及び１つ以上のリーフノード１０９を含み得る。差分抽象構文木１１０Ｄに関連して、図１Ｄにおいて、ブランチノード１０６Ａ及びブランチノード１０６Ｄという２つのブランチノードが示されている（これらは、集合的にブランチノード１０６と呼ばれる且つ／又は個別にブランチノード１０６と呼ばれる）。差分抽象構文木１１０Ｄに関連して、図１Ｄにおいて、リーフノード１０９Ａ、リーフノード１０９Ｂ、リーフノード１０９Ｊ、リーフノード１０９Ｋ、及びリーフノード１０９Ｌという５つのリーフノードが示されている（これらは、集合的にリーフノード１０９と呼ばれる且つ／又は個別にリーフノード１０９と呼ばれる）。しかしながら、ブランチノード及び／又はリーフノードの数は、異なる実装に応じて変わり得る。
【００３８】
差分抽象構文木１１０Ｄは、図１Ｃの抽象構文木１１０Ｂ及び抽象構文木１１０Ｃに基づいて生成され得る。差分抽象構文木１１０Ｄは、コンパイラにより、図１Ａのシステム１００により、又は、何らかの他の適切な機構若しくは動作により、生成され得る。
【００３９】
差分抽象構文木１１０Ｄは、図１Ｃの抽象構文木１１０Ｂの１つ以上のノードと図１Ｃの抽象構文木１１０Ｃの１つ以上のノードとをマージすることにより、生成され得る。このマージは、新たなノードをもたらすこともあるし、単に、１つ以上のノードを既存のノードに含めることもある。本開示において、２つ以上のノードの間のマージから生じるノードは、「マージノード」と呼ばれ得る。本開示において、マージノードを形成するためにマージされる２つ以上のノードは、「構成ノード」と呼ばれ得る。マージノードは、その全ての構成ノードの特性を保持することができる。構成ノードは、構成要素を表現し得るので、マージノードも構成要素を表現し得る。構成ノードは、構成要素を、ある抽象度で表現するので、マージノードも、構成要素を、その抽象度で表現し得る。マージノードはまた、構成ノードが連結されていた全てのノードに連結され得る。
【００４０】
例えば、図１Ｄの差分抽象構文木１１０Ｄを形成するために、図１Ｃの抽象構文木１１０Ｂの１つ以上のノードが、図１Ｃの抽象構文木１１０Ｃの１つ以上のノードとマージされ得る。例えば、図１Ｃの抽象構文木１１０Ｂのリーフノード１０９Ｃと図１Ｃの抽象構文木１１０Ｃのリーフノード１０９Ｇとがマージされて、マージノードである図１Ｄのリーフノード１０９Ｊが形成され得る。リーフノード１０９Ｃとリーフノード１０９Ｇとのマージは、リーフノード１０９Ｃ及びリーフノード１０９Ｇがこれらのそれぞれのソースコード内で同じ構成要素を表現しているという判定に基づき得る。リーフノード１０９Ｊは、リーフノード１０９Ｃ及びリーフノード１０９Ｇが連結されていた全てのノードに連結され得る。したがって、リーフノード１０９Ｊは、ブランチノード１０６Ｂ及びルートノード１０３Ｃに連結され得る。追加的又は代替的に、ブランチノード１０６Ｂが、ルートノード１０３Ｃとマージされて、ブランチノード１０６Ｄが形成され得るので、リーフノード１０９Ｊは、ブランチノード１０６Ｄに連結され得る。
【００４１】
図１Ｃのリーフノード１０９Ｃと図１Ｃのリーフノード１０９Ｇとがマージされて図１Ｄのリーフノード１０９Ｊが形成されることに関して与えられた例と同様に、図１Ｃのリーフノード１０９Ｄが、図１Ｃのリーフノード１０９Ｈとマージされて、図１Ｄのリーフノード１０９Ｋが形成され得、図１のリーフノード１０９Ｅが、図１Ｃのリーフノード１０９Ｉとマージされて、図１Ｄのリーフノード１０９Ｌが形成され得、図１のブランチノード１０６Ｂが、図１Ｃのルートノード１０３Ｃとマージされて、図１Ｄのブランチノード１０６Ｄが形成され得る。
【００４２】
図１Ｃを参照して上述した例を続けると、リーフノード１０９Ｃは、第１のソースコード内の構成要素「closable」を「Var  closable」として表現し得、リーフノード１０９Ｇは、第２のソースコード内の構成要素「closable」を「Var  closable」として表現し得る。したがって、リーフノード１０９Ｃとリーフノード１０９Ｇとがマージされて、リーフノード１０９Ｊが形成され得、ここで、リーフノード１０９Ｊも、構成要素「closable」を「Var  closable」として表現し得る。また、リーフノード１０９Ｃは、ブランチノード１０６Ｂに連結され、リーフノード１０９Ｇは、ルートノード１０３Ｃに連結されていたので、リーフノード１０９Ｊは、ブランチノード１０６Ｂ及びルートノード１０３Ｃの両方、すなわち、マージノードであるブランチノード１０６Ｄ、に連結され得る。
【００４３】
この例において、図１Ｃのルートノード１０３Ｃが、図１Ｃのブランチノード１０６Ｂとマージされて、図１Ｄのブランチノード１０６Ｄが形成され得る。第１のソースコードのルートノード（ルートノード１０３Ｂ）及び第２のソースコードのルートノード（ルートノード１０３Ｃ）は、これらがルートノードであったというインジケーションを保持することができる。したがって、ブランチノード１０６Ｄは、これが第２のソースコードのルートノードであったというインジケーションを含み得る。追加的又は代替的に、差分抽象構文木１１０Ｄは、２つ以上のルートノードを含むこともある。
【００４４】
本開示の範囲から逸脱することなく、差分抽象構文木１１０Ｄに対して、変更、追加、又は省略が可能である。例えば、差分抽象構文木１１０Ｄは、任意の数のブランチノード及びリーフノードを含んでもよい。ブランチノード１０６の１つのレイヤのみを用いて図示されているが、差分抽象構文木１１０Ｄは、ブランチノード１０６の任意の数のレイヤを含んでもよい。２つの抽象構文木に基づくものとして図示されているが、差分抽象構文木１１０Ｄは、任意の数の抽象構文木に基づいてもよい。追加的又は代替的に、差分抽象構文木１１０Ｄは、任意の数のソースコードに基づいてもよい。
【００４５】
図１Ａに戻ると、いくつかの実施形態において、システム１００は、抽象コードグラフ生成器１２０を含み得る。抽象コードグラフ生成器１２０は、抽象構文木１１０に基づいて抽象コードグラフ１３０を生成するよう構成され得る。いくつかの実施形態において、抽象コードグラフ生成器１２０は、抽象構文木１１０における各ノードについて１つ以上の抽象ノードを生成するよう構成され得る。これらの実施形態又は他の実施形態において、抽象コードグラフ生成器１２０は、抽象構文木１１０の１つ以上のノード及び／又は生成されたノードを、抽象コードグラフ１３０のノードへとマージするよう構成され得る。いくつかの実施形態において、抽象コードグラフ生成器１２０は、任意の順序で又は実質的に同時に若しくは同時に、抽象ノードを生成しマージを実行するよう構成され得る。
【００４６】
いくつかの実施形態において、抽象コードグラフ生成器１２０は、抽象コードグラフを生成するための１つ以上の動作をコンピューティングシステムが実行することを可能にするよう構成されているコード及びルーチンを含み得る。追加的又は代替的に、抽象コードグラフ生成器１２０は、（例えば、１つ以上の動作を実行する又は１つ以上の動作の実行を制御する）プロセッサ、（例えば、１つ以上の動作を実行する又は１つ以上の動作の実行を制御する）マイクロプロセッサ、フィールドプログラマブルゲートアレイ（FPGA）、又は特定用途向け集積回路（ASIC）を含むハードウェアを使用して実装されてもよい。いくつかの他の例において、抽象コードグラフ生成器１２０は、ハードウェアとソフトウェアとの組合せを使用して実装され得る。本開示において、抽象コードグラフ生成器１２０により実行されるとして説明される動作は、システムに実行するように抽象コードグラフ生成器１２０が指示し得る動作を含み得る。
【００４７】
本開示の範囲から逸脱することなく、抽象コードグラフ生成器１２０に対して、変更、追加、又は省略が可能である。例えば、いくつかの実施形態において、抽象コードグラフ生成器１２０は、ソースコードから抽象構文木１１０を生成することにより、抽象構文木１１０を得るよう構成され得る。別の例において、抽象コードグラフ生成器１２０は、抽象構文木１１０を最初に得ることなく、ソースコードから抽象コードグラフ１３０を生成することもある。これらの実施形態又は他の実施形態において、抽象構文木１１０は、以前に生成されていることがあり、その表現が、抽象コードグラフ生成器１２０により得られ得る。いくつかの実施形態において、抽象構文木１１０は、図１Ｄを参照して上述したような差分抽象構文木であり得る。別の例において、抽象コードグラフ生成器１２０は、ノードをマージしないことがある。さらに、動作の順序は、異なる実装に応じて変わり得る。抽象コードグラフ１３０を生成するために抽象コードグラフ生成器１２０により用いられ得る動作の例が、図１Ｂの抽象構文木１１０Ａに基づいて図１Ｅの中間抽象コードグラフ１２５Ａを介して図１Ｆの例示的な抽象コードグラフ１３０Ａを生成することに関連して、説明され得る。
【００４８】
例えば、図１Ｅは、本開示に記載の少なくとも１つの実施形態に従った例示的な中間抽象コードグラフ１２５Ａを示している。少なくともいくつかの実施形態に関して、中間抽象コードグラフ１２５Ａは、抽象コードグラフ生成器１２０が抽象コードグラフ１３０を生成することにどのように達し得るかを理解するのを単に助け得る。概して、中間抽象コードグラフ１２５Ａは、ソースコードを１つ以上の抽象度で表現することを含め、ソースコードを表現し得る。図示されているが、中間抽象コードグラフ１２５Ａは概念的であり得る。
【００４９】
いくつかの実施形態において、中間抽象コードグラフ１２５Ａは、抽象ルートノード１０２、ルートノード１０３Ａ、１つ以上の抽象ブランチノード１０５、１つ以上のブランチノード１０６、１つ以上の抽象リーフノード１０８、及び１つ以上のリーフノード１０９を含み得る。図１Ｅにおいて、抽象ブランチノード１０５Ａ及び抽象ブランチノード１０５Ｂという２つの抽象ブランチノードが示されている（これらは、集合的に抽象ブランチノード１０５と呼ばれる且つ／又は個々に抽象ブランチノード１０５と呼ばれる）。図１Ｅにおいて、ブランチノード１０６Ａ及びブランチノード１０６Ｂという２つのブランチノードが示されている（これらは、集合的にブランチノード１０６と呼ばれる且つ／又は個々にブランチノード１０６と呼ばれる）。図１Ｅにおいて、抽象リーフノード１０８Ａ、抽象リーフノード１０８Ｂ、抽象リーフノード１０８Ｃ、抽象リーフノード１０８Ｄ、抽象リーフノード１０８Ｅ、抽象リーフノード１０８Ｆ、及び抽象リーフノード１０８Ｇという７つの抽象リーフノードが示されている（これらは、集合的に抽象リーフノード１０８と呼ばれる且つ／又は個々に抽象リーフノード１０８と呼ばれる）。図１Ｅにおいて、リーフノード１０９Ａ、リーフノード１０９Ｂ、リーフノード１０９Ｃ、リーフノード１０９Ｄ、及びリーフノード１０９Ｅという５つのリーフノードが示されている（これらは、集合的にリーフノード１０９と呼ばれる且つ／又は個々にリーフノード１０９と呼ばれる）。しかしながら、抽象ブランチノード、ブランチノード、抽象リーフノード、及び／又はリーフノードの数は、異なる実装に応じて変わり得る。
【００５０】
例示の目的で、中間抽象コードグラフ１２５Ａは、図１Ｆの抽象コードグラフ１３０Ａを生成することにおける中間ステップとして、図１Ａの抽象コードグラフ生成器１２０により生成され得る。中間抽象コードグラフ１２５Ａは、図１Ｂの抽象構文木１１０Ａにおける各ノードについて１つ以上の抽象ノードを生成することにより、生成され得る。いくつかの実施形態において、抽象コードグラフ生成器１２０は、ソフトウェア抽象化を実行する任意の適切な動作に従って、抽象構文木１１０Ａの各ノードを抽象化することができる。抽象化は、抽象化される構成要素に対応し得る１つ以上のルールに従って実行され得る。これらの実施形態又は他の実施形態において、ルールは、例えば、「variable」、「operation」、又は「MethodCall」といった、抽象化される構成要素のカテゴリ又は分類に対応し得る。例えば、最低抽象度において、変数は、例えば「Var  closable」又は「Name  closable」といった、変数の型及び名前により表現され得る。より高い抽象度において、変数は、例えば「Type  File」といった、名前ではなく型により表現され得る。さらに高い抽象度において、変数は、型又は名前なく、「Var」又は「variable」により表現され得る。本開示において、他のノードに基づいて抽象的概念として生成されるノードは、「抽象ノード」と呼ばれ得る。
【００５１】
例えば、抽象コードグラフ生成器１２０は、リーフノード１０９Ｂの構成要素の抽象的表現であり得る抽象リーフノード１０８Ｃを生成することができる。抽象リーフノード１０８Ａ及び抽象リーフノード１０８Ｂは両方とも、リーフノード１０９Ａの構成要素の抽象的表現であり得る。いくつかの実施形態において、抽象リーフノード１０８Ａは、抽象リーフノード１０８Ｂよりも抽象的であり得る。
【００５２】
図１Ｂを参照して上述した例を続けると、中間抽象コードグラフ１２５Ａは、ソースコード「if  (closable  !=  null)  closable.close();」を表現し得る。抽象ルートノード１０２は、構成要素「if」を、ルートノード１０３Ａの「IfStmt」という表現よりも抽象的であり得る「StmtList」として表現し得る。抽象ブランチノード１０５Ａは、構成要素「!=」を、ブランチノード１０６Ａの「Op  !=」という表現よりも抽象的であり得る「Expr」として表現し得る。リーフノード１０９Ａは、ソースコード内の第１の位置における構成要素「closable」を、図１Ｂの抽象構文木１１０Ａの「Var  closable」という表現と同じ抽象度であり得る「Name  closable」として表現し得る。抽象リーフノード１０８Ｂは、ソースコード内の第１の位置における構成要素「closable」を、リーフノード１０９Ａの「Name  closable」という表現よりも抽象的であり得る「Type  File」として表現し得る。抽象リーフノード１０８Ａは、ソースコード内の第１の位置における構成要素「closable」を、リーフノード１０９Ａの「Name  closable」という表現及び抽象リーフノード１０８Ｂの「Type  File」という表現よりも抽象的であり得る「Var」として表現し得る。抽象リーフノード１０８Ｃは、構成要素「null」を、リーフノード１０９Ｂの「Const  null」という表現よりも抽象的であり得る「Const」として表現し得る。抽象ブランチノード１０５Ｂは、構成要素「close()」を、ブランチノード１０６Ｂの「MethodCall」という表現よりも抽象的であり得る「StmtList」として表現し得る。リーフノード１０９Ｃは、ソースコード内の第２の位置における構成要素「closable」を、図１Ｂの抽象構文木１１０Ａの「Var  closable」という表現と同じ抽象度であり得る「Name  closable」として表現し得る。抽象リーフノード１０８Ｅは、ソースコード内の第２の位置における構成要素「closable」を、リーフノード１０９Ｃの「Name  closable」という表現よりも抽象的であり得る「Type  File」として表現し得る。抽象リーフノード１０８Ｄは、ソースコード内の第２の位置における構成要素「closable」を、リーフノード１０９Ｃの「Name  closable」という表現及び抽象リーフノード１０８Ｅの「Type  File」という表現よりも抽象的であり得る「Var」として表現し得る。抽象リーフノード１０８Ｆは、構成要素「close()」を、リーフノード１０９Ｄの「Id  close」という表現よりも抽象的であり得る「Id」として表現し得る。抽象リーフノード１０８Ｇは、「close()」のリターンの構成要素「Void」を、リーフノード１０Ｅの「Void」という表現よりも抽象的であり得る「ExprList」として表現し得る。
【００５３】
中間抽象コードグラフ１２５Ａから、図１Ｆを参照して以下で説明されるように抽象コードグラフ１３０Ａを生成するために、抽象コードグラフ生成器１２０は、同じ構成要素を同じ抽象度で表現しているノードをマージすることができる。マージは、図１Ｄを参照して上述したマージと実質的に同じ方法で実行され得る。しかしながら、この場合、２つの構成ノードが、同じ構成要素を、同じ抽象度で、すなわち、同じように、表現しているという追加の判定が存在し得る。
【００５４】
例えば、図１Ｂを参照して上述した例に再度戻ると、リーフノード１０９Ａ、リーフノード１０９Ｃ、抽象リーフノード１０８Ａ、抽象リーフノード１０８Ｂ、抽象リーフノード１０８Ｄ、及び抽象リーフノード１０８Ｅの各々は、同じ構成要素「closable」を表現している。これらの実施形態又は他の実施形態において、リーフノード１０９Ａは、リーフノード１０９Ｃとマージされ得る。なぜならば、リーフノード１０９Ａ及びリーフノード１０９Ｃは、構成要素「closable」を同じ抽象度で表現しているからである。追加的又は代替的に、リーフノード１０９Ａ及びリーフノード１０９Ｃは、構成要素「closable」を他の抽象度で表現している抽象リーフノード１０８とはマージされ得ない。同様に、これらの実施形態又は他の実施形態において、抽象リーフノード１０８Ｂは、抽象リーフノード１０８Ｅとマージされ得る。なぜならば、抽象リーフノード１０８Ｂ及び抽象リーフノード１０８Ｅは、構成要素「closable」を同じ抽象度で（この場合には「Type  File」として）表現しているからである。同様に、これらの実施形態又は他の実施形態において、抽象リーフノード１０８Ａは、抽象リーフノード１０８Ｄとマージされ得る。なぜならば、抽象リーフノード１０８Ａ及び抽象リーフノード１０８Ｄは、構成要素「closable」を、同じ抽象度で（この場合には「Var」として）表現しているからである。追加的又は代替的に、抽象リーフノード１０８Ｂは、抽象リーフノード１０８Ａ又は抽象リーフノード１０８Ｄとはマージされ得ない。なぜならば、抽象リーフノード１０８Ｂは、構成要素「closable」を、抽象リーフノード１０８Ａ及び抽象リーフノード１０８Ｄとは異なる抽象度で表現しているからである。
【００５５】
本開示の範囲から逸脱することなく、中間抽象コードグラフ１２５Ａに対して、変更、追加、又は省略が可能である。例えば、ブランチノード１０６の１つのレイヤのみを用いて図示されているが、中間抽象コードグラフ１２５Ａは、ブランチノード１０６の任意の数のレイヤを含んでもよい。別の例において、抽象構文木１１０Ａの全てのノードが、抽象ノードの生成のための基礎であるとは限らない。これらの実施形態又は他の実施形態において、抽象構文木１１０Ａの１つ以上のノードが、当該１つ以上のノードに基づいて生成される抽象ノードを有しないこともある。中間抽象コードグラフ１２５Ａを使用して、例えば図１Ｆを参照して説明される抽象コードグラフ等の抽象コードグラフ１３０Ａを生成することができる。
【００５６】
図１Ｆは、本開示に記載の少なくとも１つの実施形態に従った例示的な抽象コードグラフ１３０Ａを示している。抽象コードグラフ１３０Ａは、図１Ａの抽象コードグラフ１３０の例であり得る。概して、抽象コードグラフ１３０Ａは、ソースコードの構成要素と、ソースコードの構成要素の間の関係と、の表現を含み得る。抽象構文木と比較すると、抽象コードグラフ１３０Ａは、追加的又は代替的に、抽象ノード及びマージノードを含むことがある。図示されているが、抽象コードグラフ１３０Ａは概念的であり得る。例えば、抽象コードグラフ１３０Ａは、テーブル、リスト、又は他のデータ構造として、コンピュータメモリに記憶され得る。
【００５７】
いくつかの実施形態において、抽象コードグラフ１３０Ａは、抽象ルートノード１０２、ルートノード１０３Ａ、１つ以上の抽象ブランチノード１０５、１つ以上のブランチノード１０６、１つ以上の抽象リーフノード１０８、及び１つ以上のリーフノード１０９を含み得る。図１Ｆにおいて、抽象ブランチノード１０５Ａ及び抽象ブランチノード１０５Ｂという２つの抽象ブランチノードが示されている（これらは、集合的に抽象ブランチノード１０５と呼ばれる且つ／又は個別に抽象ブランチノード１０５と呼ばれる）。図１Ｆにおいて、ブランチノード１０６Ａ及びブランチノード１０６Ｂという２つのブランチノードが示されている（これらは、集合的にブランチノード１０６と呼ばれる且つ／又は個別にブランチノード１０６と呼ばれる）。図１Ｆにおいて、５つの抽象リーフノードが示されており、図１Ｆに示されているこれら５つの抽象リーフノードのうち、抽象リーフノード１０８Ｃ、抽象リーフノード１０８Ｆ、及び抽象リーフノード１０８Ｇという３つの抽象リーフノードは、図１Ｅに関連して先に示されていた。抽象リーフノード１０８Ｈ及び抽象リーフノード１０８Ｉという２つの抽象リーフノードは、新たに追加されたものである。これらの抽象リーフノードは、集合的に抽象リーフノード１０８と呼ばれる且つ／又は個別に抽象リーフノード１０８と呼ばれる。図１Ｆにおいて、４つのリーフノードが示されており、図１Ｆに示されているこれら４つのリーフノードのうち、リーフノード１０９Ｂ、リーフノード１０９Ｄ、及びリーフノード１０９Ｅという３つのリーフノードは、図１Ｅに関連して先に示されていた。リーフノード１０９Ｆという１つのリーフノードは、新たに追加されたものである。これらのリーフノードは、集合的にリーフノード１０９と呼ばれる且つ／又は個別にリーフノード１０９と呼ばれる。しかしながら、抽象ブランチノード、ブランチノード、抽象リーフノード、及び／又はリーフノードの数は、異なる実装に応じて変わり得る。
【００５８】
いくつかの実施形態において、抽象コードグラフ１３０Ａは、ソースコードの構成要素をノードとして表現し、構成要素間の関係をノード間の連結として表現する概念マッピング又はグラフを含み得る。いくつかの実施形態において、抽象コードグラフ１３０Ａは、ソースコードの１つ以上の構文フレーズを表現し得る。いくつかの実施形態において、例えば、ルートノード１０３Ａ、ブランチノード１０６、及びリーフノード１０９等の各ノードは、ソースコードの１つの構成要素を表現し得る。いくつかの実施形態において、抽象コードグラフ１３０Ａは、抽象構文木１１０Ａからの１つ以上のノードを含み得る。いくつかの実施形態において、ルートノード１０３Ａ、ブランチノード１０６、及びリーフノード１０９の各々は、抽象構文木１１０Ａにおいて見つけられるノードに直接的に関連し得る又は抽象構文木１１０Ａにおいて見つけられるノードと同じであり得る。
【００５９】
さらに、抽象コードグラフ１３０Ａの一部のノードは、ソースコードの構成要素を、抽象構文木１１０Ａのノードがソースコードの構成要素を表現していた抽象度よりも高い抽象度で表現し得る抽象ノードを含み得る。例えば、抽象リーフノード１０８は、ソースコードの構成要素を、図１Ｂ又は図１Ｆのリーフノード１０９が構成要素を表現している抽象度よりも高い抽象度で表現し得る。別の例において、抽象ブランチノード１０５は、ソースコードの構成要素を、図１Ｂ又は図１Ｆのブランチノード１０６が構成要素を表現している抽象度よりも高い抽象度で表現し得る。
【００６０】
抽象コードグラフ１３０Ａは、抽象構文木１１０におけるノードに直接的に関連し得る又は抽象構文木１１０Ａにおけるノードと同じであり得るノード（例えば、ルートノード１０３Ａ、ブランチノード１０６、及びリーフノード１０９等）を含み得るので、抽象コードグラフ１３０Ａは、抽象構文木１１０Ａの全ての情報を含み得る。抽象コードグラフ１３０Ａは、抽象構文木１１０Ａのノードよりも抽象的であり得るノード（例えば、抽象ルートノード１０２、抽象ブランチノード１０５、及び抽象リーフノード１０８等）を含み得るので、抽象コードグラフ１３０Ａは、抽象構文木１１０Ａよりも多くの情報を含み得、いくつかの例において、抽象構文木１１０Ａよりも多くのノードを含み得る。
【００６１】
いくつかの実施形態において、抽象コードグラフ１３０Ａは、１つ以上のマージノードを含み得る。マージノードは、元々のノードが表現していた構成要素と元々のノードが構成要素を表現していた抽象度とを含め、元々のノードの全ての情報を含み得る。さらに、特定のマージノードは、構成ノードが連結されていた全てのノードに連結され得る。したがって、抽象コードグラフ１３０Ａは、抽象構文木１１０Ａよりも少ないノードを含むとしても、同じ情報を含み得る。
【００６２】
例示の目的で、抽象コードグラフ１３０Ａは、図１Ａの抽象コードグラフ生成器１２０により生成され得る。さらに、抽象コードグラフ１３０Ａは、図１Ｂの抽象構文木１１０Ａに基づき得る。抽象コードグラフ１３０Ａは、抽象構文木１１０Ａにおける各ノードについて抽象ノードを生成し、抽象構文木１１０Ａからのノード及び抽象ノードをマージすることにより、生成され得る。
【００６３】
図１Ｂを参照して上述した例を続けると、抽象コードグラフ１３０Ａは、ソースコード「if  (closable  !=  null)  closable.close();」を表現し得る。抽象ルートノード１０２は、構成要素「if」を、ルートノード１０３Ａの「IfStmt」という表現よりも抽象的であり得る「StmtList」として表現し得る。抽象ブランチノード１０５Ａは、構成要素「!=」を、ブランチノード１０６Ａの「Op  !=」という表現よりも抽象的であり得る「Expr」として表現し得る。抽象リーフノード１０８Ｉは、ソースコード内の第１の位置における構成要素「closable」を、リーフノード１０９Ｆの「Name  closable」という表現よりも抽象的であり得る「Type  File」として表現し得る。抽象リーフノード１０８Ｈは、ソースコード内の第１の位置における構成要素「closable」を、リーフノード１０９Ｆの「Name  closable」という表現及び抽象リーフノード１０８Ｈの「Type  File」という表現よりも抽象的であり得る「Var」として表現し得る。抽象リーフノード１０８Ｃは、構成要素「null」を、リーフノード１０９Ｂの「Const  null」という表現よりも抽象的であり得る「Const」として表現し得る。抽象ブランチノード１０５Ｂは、構成要素「close()」を、ブランチノード１０６Ｂの「MethodCall」という表現よりも抽象的であり得る「StmtList」として表現し得る。抽象リーフノード１０８Ｆは、構成要素「close()」を、リーフノード１０９Ｄの「Id  close」という表現よりも抽象的であり得る「Id」として表現し得る。抽象リーフノード１０８Ｇは、「close()」のリターンの構成要素「Void」を、リーフノード１０９Ｅの「Void」という表現よりも抽象的であり得る「ExprList」として表現し得る。
【００６４】
本開示の範囲から逸脱することなく、抽象コードグラフ１３０Ａに対して、変更、追加、又は省略が可能である。例えば、ブランチノード１０６の１つのレイヤのみを用いて図示されているが、抽象コードグラフ１３０Ａは、ブランチノード１０６の任意の数のレイヤを含んでもよい。
【００６５】
抽象ノードの生成及びノードのマージは、任意の順序で又は実質的に同時に実現され得る。例えば、抽象ノードの生成が、最初に、図１Ｅの中間抽象コードグラフ１２５Ａに示されているように生じ、次いで、ノードのマージが、図１Ｆの抽象コードグラフ１３０Ａをもたらすように生じ得る。代替的に、ノードのマージが、最初に、図１Ｇの中間抽象コードグラフ１２５Ｂに示されているように生じ、次いで、抽象ノードの生成が、図１Ｆの抽象コードグラフ１３０Ａをもたらすように生じることもある。代替的に、抽象ノードの生成及びノードのマージが、実質的に同時に生じることもある。
【００６６】
例えば、図１Ｇは、本開示に記載の少なくとも１つの実施形態に従った例示的な中間抽象コードグラフ１２５Ｂを示している。少なくともいくつかの実施形態に関して、中間抽象コードグラフ１２５Ｂは、抽象コードグラフ生成器１２０が抽象コードグラフ１３０Ａを生成することにどのように達し得るかを理解するのを単に助け得る。概して、中間抽象コードグラフ１２５Ｂは、ソースコードをある抽象度で表現することを含め、ソースコードを表現し得る。図示されているが、中間抽象コードグラフ１２５Ｂは概念的であり得る。
【００６７】
いくつかの実施形態において、中間抽象コードグラフ１２５Ｂは、ルートノード１０３Ａ、１つ以上のブランチノード１０６、及び１つ以上のリーフノード１０９を含み得る。図１Ｇにおいて、ブランチノード１０６Ａ及びブランチノード１０６Ｂという２つのブランチノードが示されている（これらは、集合的にブランチノード１０６と呼ばれる且つ／又は個々にブランチノード１０６と呼ばれる）。図１Ｇにおいて、４つのリーフノードが示されている。例示の目的で、これらのリーフノードは、図１Ｆに対応するように順序付けられラベル付けされている。図１Ｇの４つのリーフノードは、リーフノード１０９Ｂ、リーフノード１０９Ｄ、リーフノード１０９Ｅ、及びリーフノード１０９Ｆを含む（これらは、集合的にリーフノード１０９と呼ばれる且つ／又は個々にリーフノード１０９と呼ばれる）。しかしながら、ブランチノード及び／又はリーフノードの数は、異なる実装に応じて変わり得る。
【００６８】
例示の目的で、中間抽象コードグラフ１２５Ｂは、図１Ｆの抽象コードグラフ１３０Ａを生成することにおける中間ステップとして、図１Ａの抽象コードグラフ生成器１２０により生成され得る。中間抽象コードグラフ１２５Ｂは、図１Ｂの抽象構文木１１０Ａの１つ以上のノードをマージすることにより、生成され得る。このマージは、図１Ｃを参照して上述したマージと同じ方法で、又は、図１Ｃを参照して上述したマージと実質的に類似する方法で、生じ得る。
【００６９】
例えば、抽象コードグラフ生成器１２０は、図１Ｂの抽象構文木１１０Ａのリーフノード１０９Ａとリーフノード１０９Ｃとをマージして、マージノードである図１Ｇのリーフノード１０９Ｆを形成することができる。リーフノード１０９Ａとリーフノード１０９Ｃとのマージは、リーフノード１０９Ａ及びリーフノード１０９Ｃがソースコード内で同じ構成要素を表現しているという判定に基づき得る。リーフノード１０９Ｆは、リーフノード１０９Ａ及びリーフノード１０９Ｃが連結されていた全てのノードに連結され得る。したがって、リーフノード１０９Ｆは、ブランチノード１０６Ａ及びブランチノード１０６Ｂに連結され得る。
【００７０】
図１Ｂを参照して上述した例を続けると、リーフノード１０９Ａは、ソースコード内の第１の位置における構成要素「closable」を「Var  closable」として表現し得る。リーフノード１０９Ｃは、ソースコード内の第２の位置における構成要素「closable」を「Var  closable」として表現し得る。したがって、抽象コードグラフ生成器１２０は、リーフノード１０９Ａとリーフノード１０９Ｃとをマージして、リーフノードＦを形成することができ、ここで、リーフノードＦも、構成要素「closable」を「Var  closable」として表現し得る。また、リーフノード１０９Ａは、ブランチノード１０６Ａに連結され、リーフノード１０９Ｂは、ブランチノード１０６Ｂに連結されていたので、リーフノード１０９Ｆは、ブランチノード１０６Ａ及びブランチノード１０６Ｂの両方に連結され得る。
【００７１】
中間抽象コードグラフ１２５Ｂから、図１Ｆを参照して上述したように抽象コードグラフ１３０Ａを生成するために、抽象コードグラフ生成器１２０は、中間抽象コードグラフ１２５Ｂにおける各ノードについて１つ以上の抽象ノードを生成することができる。この抽象化は、図１Ｅを参照して上述した抽象化と同様の方法で行われ得る。
【００７２】
例えば、図１Ｆの抽象コードグラフ１３０Ａを形成するために、抽象コードグラフ生成器１２０は、中間抽象コードグラフ１２５Ｂのルートノード１０３Ａに基づいて、抽象ルートノード１０２を生成することができる。また、抽象コードグラフ生成器１２０は、中間抽象コードグラフ１２５Ｂのブランチノード１０６に基づいて、抽象ブランチノード１０５を生成することができる。また、抽象コードグラフ生成器１２０は、中間抽象コードグラフ１２５Ｂのリーフノード１０９に基づいて、抽象リーフノード１０８を生成することができる。例えば、抽象リーフノード１０８Ｉ及び抽象リーフノード１０８Ｈは、中間抽象コードグラフ１２５Ｂのリーフノード１０９Ｆに基づき得る。
【００７３】
本開示の範囲から逸脱することなく、中間抽象コードグラフ１２５Ｂに対して、変更、追加、又は省略が可能である。例えば、ブランチノード１０６の１つのレイヤのみを用いて図示されているが、中間抽象コードグラフ１２５Ｂは、ブランチノード１０６の任意の数のレイヤを含んでもよい。差分抽象コードグラフ１３０Ｂは、抽象コードグラフ１３０の例であり得る。図１Ｈは、抽象コードグラフ１３０の別の例を示している。
【００７４】
図１Ｈは、本開示に記載の少なくとも１つの実施形態に従った例示的な差分抽象コードグラフ１３０Ｂを示している。差分抽象コードグラフ１３０Ｂは、図１Ａの抽象コードグラフ１３０の例であり得る。概して、差分抽象コードグラフ１３０Ｂは、第１のソースコードの第１の構成要素と、第１のソースコードの第１の構成要素の間の関係と、第２のソースコードの第２の構成要素と、第２のソースコードの第２の構成要素の間の関係と、の表現を含み得る。図示されているが、差分抽象コードグラフ１３０Ｂは概念的であり得る。
【００７５】
いくつかの実施形態において、差分抽象コードグラフ１３０Ｂは、図１Ｄの差分抽象構文木１１０Ｄに基づき得る。いくつかの実施形態において、差分抽象コードグラフ１３０Ｂは、図１Ｅ〜図１Ｇを参照して上述したのと同じ原理に従って生成され得る。いくつかの実施形態において、差分抽象コードグラフ１３０Ｂは、図１Ａの抽象コードグラフ生成器１２０により生成され得る。
【００７６】
差分抽象コードグラフ１３０Ｂは、差分抽象コードグラフ１３０Ｂの１つ以上のノードの生成元であるソースコードに関する情報を保持することができる。代替的又は追加的に、差分抽象コードグラフ１３０Ｂは、差分抽象コードグラフ１３０Ｂのどのノードが例えば抽象構文木１１０Ｂ等の抽象構文木におけるルートノードであったかに関する情報を含むこともある。
【００７７】
いくつかの実施形態において、差分抽象コードグラフ１３０Ｂは、１つ以上の抽象ルートノード１０２、１つ以上のルートノード１０３Ｂ、１つ以上の抽象ブランチノード１０５、１つ以上のブランチノード１０６、１つ以上の抽象リーフノード１０８、及び１つ以上のリーフノード１０９を含み得る。図１Ｈにおいて、抽象ブランチノード１０５Ａ及び抽象ブランチノード１０５Ｂという２つの抽象ブランチノードが示されている（これらは、集合的に抽象ブランチノード１０５と呼ばれる且つ／又は個々に抽象ブランチノード１０５と呼ばれる）。図１Ｈにおいて、ブランチノード１０６Ａ及びブランチノード１０６Ｂという２つのブランチノードが示されている（これらは、集合的にブランチノード１０６と呼ばれる且つ／又は個々にブランチノード１０６と呼ばれる）。図１Ｈにおいて、抽象リーフノード１０８Ｃ、抽象リーフノード１０８Ｊ、抽象リーフノード１０８Ｋ、抽象リーフノード１０８Ｌ、及び抽象リーフノード１０８Ｍという５つの抽象リーフノードが示されている（これらは、集合的に抽象リーフノード１０８と呼ばれる且つ／又は個々に抽象リーフノード１０８と呼ばれる）。図１Ｈにおいて、リーフノード１０９Ｂ、リーフノード１０９Ｋ、リーフノード１０９Ｌ、及びリーフノード１０９Ｍという４つのリーフノードが示されている（これらは、集合的にリーフノード１０９と呼ばれる且つ／又は個々にリーフノード１０９と呼ばれる）。しかしながら、抽象ブランチノード、ブランチノード、抽象リーフノード、及び／又はリーフノードの数は、異なる実装に応じて変わり得る。
【００７８】
本開示の範囲から逸脱することなく、差分抽象コードグラフ１３０Ｂに対して、変更、追加、又は省略が可能である。例えば、ブランチノード１０６の１つのレイヤのみを用いて図示されているが、差分抽象コードグラフ１３０Ｂは、ブランチノード１０６の任意の数のレイヤを含んでもよい。
【００７９】
図１Ａに戻ると、いくつかの実施形態において、システム１００は、本開示に記載の少なくとも１つの実施形態に従ったサブグラフ生成器１４０を含み得る。概して、サブグラフ生成器１４０は、抽象コードグラフ１３０から１つ以上のサブグラフ１５０を生成するよう構成され得る。いくつかの実施形態において、サブグラフ生成器１４０は、抽象コードグラフ１３０のノードのサブセットを、１つ以上のサブグラフ１５０として選択するよう構成され得る。
【００８０】
概して、サブグラフ１５０は、ソースコードの構成要素と、ソースコードの構成要素の間の関係と、の表現を含み得る。サブグラフ１５０は概念的であり得る。例えば、サブグラフ１５０は、テーブル、リスト、又は他のデータ構造として、コンピュータメモリに記憶され得る。
【００８１】
いくつかの実施形態において、サブグラフ１５０は、サブグラフ１５０を含む新たなデータ構造又はグラフを含み得る。これらの実施形態又は他の実施形態において、サブグラフ１５０に含められる、抽象コードグラフ１３０のノードは、新たなデータ構造を生成することなく、抽象コードグラフ１３０において指定され得る。本開示において、抽象コードグラフ１３０のノードを選択及び／又は指定してサブグラフ１５０を形成することは、抽象コードグラフ１３０から又は抽象コードグラフ１３０に基づいてサブグラフ１５０を生成することと呼ばれ得る。
【００８２】
いくつかの実施形態において、サブグラフ１５０は、抽象コードグラフ１３０のノードからのものであり得る又は抽象コードグラフ１３０のノードに基づき得る１つ以上のノードを含み得る。例えば、サブグラフ１５０は、抽象コードグラフ１３０のノードから組み込まれる又は抽象コードグラフ１３０のノードに基づいて生成されるノードを含み得る。いくつかの実施形態において、サブグラフ１５０は、抽象コードグラフ１３０のノードを含み得る。いくつかの実施形態において、抽象コードグラフ１３０は、１つ以上のサブグラフ１５０を含み得る。例えば、抽象コードグラフ１３０の１つ以上のノードが、サブグラフ１５０のうちの１つ以上の一部として指定され得る。本開示において、サブグラフ１５０の生成は、サブグラフが、抽象コードグラフ１３０に基づいて生成されるか又は抽象コードグラフ１３０に含まれるかに関係なく、ノードの選択と呼ばれることがある。
【００８３】
サブグラフ１５０は、１つ以上のノードを含み得る。サブグラフ１５０のノードは、ルートノード、１つ以上のブランチノード、及び１つ以上のリーフノードを含み得る。サブグラフ１５０は、抽象コードグラフ１３０に基づき得るので、サブグラフ１５０も、マージノード及び構成ノードを含むことがある。本開示において、サブグラフ１５０におけるリーフノードは、「スプリット（split）ノード」と呼ばれ得る。本開示において、サブグラフ１５０のスプリットノードと相関する、抽象コードグラフ１３０のノードも、「スプリットノード」と呼ばれ得る。抽象コードグラフ１３０のスプリットノードは、抽象コードグラフ１３０のリーフノードではないことがある。
【００８４】
いくつかの実施形態において、サブグラフ生成器１４０は、１つ以上のルールに従って、抽象コードグラフ１３０の１つ以上のノードを選択し得る。いくつかの実施形態において、サブグラフ１５０を形成するための上記ルールは、抽象コードグラフ１３０の少なくとも１つのルートノードが選択されるようなルールを含み得る。追加的又は代替的に、上記ルールは、選択される各ノードが少なくとも１つの他のノードに連結されるようなルールを含むこともある。追加的又は代替的に、上記ルールは、選択される各ノードが１つ以上の連結を介して抽象コードグラフ１３０の少なくとも１つのルートノードに関連するようなルールを含むこともある。追加的又は代替的に、上記ルールは、抽象コードグラフ１３０のルートノードから抽象コードグラフ１３０のリーフノードへの、抽象コードグラフ１３０における全ての可能なパスが、特定のサブグラフ１５０におけるスプリットノードと相関する、抽象コードグラフ１３０における１つのノードしか含まないようなルールを含むこともある。
【００８５】
いくつかの実施形態において、サブグラフ生成器１４０は、サブグラフを生成するための１つ以上の動作をコンピューティングシステムが実行することを可能にするよう構成されているコード及びルーチンを含み得る。追加的又は代替的に、サブグラフ生成器１４０は、（例えば、１つ以上の動作を実行する又は１つ以上の動作の実行を制御する）プロセッサ、（例えば、１つ以上の動作を実行する又は１つ以上の動作の実行を制御する）マイクロプロセッサ、FPGA、又はASICを含むハードウェアを使用して実装されてもよい。いくつかの他の例において、サブグラフ生成器１４０は、ハードウェアとソフトウェアとの組合せを使用して実装され得る。本開示において、サブグラフ生成器１４０により実行されるとして説明される動作は、システムに実行するようにサブグラフ生成器１４０が指示し得る動作を含み得る。
【００８６】
本開示の範囲から逸脱することなく、サブグラフ生成器１４０に対して、変更、追加、又は省略が可能である。例えば、いくつかの実施形態において、サブグラフ生成器１４０は、抽象構文木１１０から又はソースコードからサブグラフ１５０を生成することができる。いくつかの実施形態において、サブグラフ生成器１４０は、いずれのルールとも無関係に、ノードの全ての可能な組合せを生成することができる。さらに、動作の順序は、異なる実装に応じて変わり得る。
【００８７】
図１Ｆを参照することに戻ると、サブグラフの例が、図１Ｆの抽象コードグラフ１３０Ａに関して示される。サブグラフ１５０は、抽象コードグラフ１３０Ａと別個のものであり得るが、本開示において、抽象コードグラフ１３０Ａの１つ以上のノードは、サブグラフ１５０の一部として参照され得る。
【００８８】
特定のサブグラフを生成する例として、抽象ルートノード１０２、ルートノード１０３Ａ、抽象ブランチノード１０５Ａ、ブランチノード１０６Ａ、抽象リーフノード１０８Ｃ、抽象リーフノード１０８Ｈ、抽象ブランチノード１０５Ｂ、ブランチノード１０６Ｂ、抽象リーフノード１０８Ｆ、及び抽象リーフノード１０８Ｇの全てが、特定のサブグラフの一部として選択され得る。
【００８９】
上記において、サブグラフ生成器１４０の動作に関して、いくつかのルールが説明された。いくつかの実施形態において、１つ以上のこれらのルールは、有効なサブグラフ１５０を決定するために、サブグラフ生成器１４０により実施され得る。ここで、ルールに従ってサブグラフを生成する例及びルールに違反するサブグラフの例が示される。しかしながら、サブグラフ生成器１４０は、上述したルール以外の１つ以上の他のルールを使用して、サブグラフ１５０を生成してもよい。
【００９０】
サブグラフ生成器１４０は、抽象コードグラフ１３０Ａの少なくとも１つのルートノードが選択されるようなルールを実施することができ、次いで、有効なサブグラフ１５０が全て、抽象ルートノード１０２を含み得るようになる。すなわち、抽象ルートノード１０２を含まないサブグラフ１５０は、抽象コードグラフ１３０Ａの少なくとも１つのルートノードが選択されるようなルールに違反する。例えば、抽象ブランチノード１０５Ａ、ブランチノード１０６Ａ、抽象リーフノード１０８Ｃ、及び抽象リーフノード１０８Ｈは、単独で、抽象コードグラフ１３０Ａの少なくとも１つのルートノードが選択されるようなルールに従った有効なサブグラフを形成しない。しかしながら、図１Ｆの抽象ブランチノード１０５Ｂは、図１Ｃの抽象構文木１１０Ｃのルートノードであったので、抽象ブランチノード１０５Ｂ、ブランチノード１０６Ｂ、抽象リーフノード１０８Ｈ、抽象リーフノード１０８Ｆ、及び抽象リーフノード１０８Ｇは、単独で、抽象コードグラフ１３０Ａの少なくとも１つのルートノードが選択されるようなルールに従った有効なサブグラフを形成することができる。
【００９１】
サブグラフ生成器１４０は、選択される各ノードが少なくとも１つの他のノードに連結されるようなルールを実施することができ、次いで、有効なサブグラフ１５０が、少なくとも１つの他のノードに連結されていないノードを含み得ないようになる。すなわち、連結を有しないノードを含むサブグラフ１５０は、選択される各ノードが少なくとも１つの他のノードに連結されるようなルールに違反する。例えば、抽象ルートノード１０２、ルートノード１０３Ａ、抽象ブランチノード１０５Ａ、及び抽象リーフノード１０８Ｃは、選択される各ノードが少なくとも１つの他のノードに連結されるようなルールに従った有効なサブグラフを形成しない。
【００９２】
サブグラフ生成器１４０は、選択される各ノードが１つ以上の連結を介して抽象コードグラフ１３０Ａの少なくとも１つのルートノードに関連するようなルールを実施することができ、次いで、有効なサブグラフ１５０が、１つ以上の連結を介して抽象コードグラフ１３０Ａのルートノードに関連しないノードを含み得ないようになる。すなわち、１つ以上の連結を介して抽象コードグラフ１３０Ａのルートノードに関連しない１つ以上のノードを含むサブグラフ１５０は、選択される各ノードが１つ以上の連結を介して抽象コードグラフ１３０Ａの少なくとも１つのルートノードに関連するようなルールに違反する。例えば、抽象ルートノード１０２、ルートノード１０３Ａ、抽象ブランチノード１０５Ａ、抽象ブランチノード１０５Ｂ、抽象リーフノード１０８Ｆ、及び抽象リーフノード１０８Ｇは、選択される各ノードが１つ以上の連結を介して抽象コードグラフ１３０Ａの少なくとも１つのルートノードに関連するようなルールに従ったサブグラフを形成しない。
【００９３】
いくつかの実施形態において、選択される各ノードが１つ以上の連結を介して抽象コードグラフ１３０Ａの少なくとも１つのルートノードに関連するようなルールにおいて参照されるルートノードに対する関連は、より抽象的なものからより抽象的でないものへと一様に至らせる関連又は親から子へと至らせる関連を含み得ない。例えば、抽象ルートノード１０２、ルートノード１０３Ａ、抽象ブランチノード１０５Ａ、ブランチノード１０６Ａ、抽象リーフノード１０８Ｈ、ブランチノード１０６Ｂ、及び抽象リーフノード１０８Ｇは、選択される各ノードが１つ以上の連結を介して抽象コードグラフ１３０Ａの少なくとも１つのルートノードに関連するようなルールに従った有効なサブグラフを形成しない。なぜならば、抽象リーフノード１０８Ｇは、より抽象的なものからより抽象的でないものへと至らせる連結（ブランチノード１０６Ｂと抽象リーフノード１０８Ｈとの間の連結）を介して抽象ルートノード１０２に関連するからである。
【００９４】
本開示において、抽象コードグラフ１３０Ａのルートノードから抽象コードグラフ１３０Ａのリーフノードへの、抽象コードグラフ１３０Ａにおける全ての可能なパスが、特定のサブグラフ１５０におけるスプリットノードと相関する、抽象コードグラフ１３０Ａにおける１つのノードしか含まないようなルールは、「スプリットノードルール」と呼ばれ得る。候補サブグラフがスプリットノードルールに従っているかどうかを判定するのをチェックすることに関連する動作が示される。
【００９５】
例示の目的で、候補サブグラフのノードが識別され得る。候補サブグラフのノードの中から、スプリットノードが識別され得る。スプリットノードは、候補サブグラフのリーフノードとして識別され得る。抽象コードグラフ１３０Ａのルートノードから抽象コードグラフ１３０Ａの各リーフノードへのパスが識別され得る。いくつかの実施形態において、「パス」は、最短パスのみを含み得る。例えば、抽象ブランチノード１０５Ａ及びブランチノード１０６Ａの両方がサブグラフに含められる場合、抽象ルートノード１０２からルートノード１０３Ａを介し抽象ブランチノード１０５Ｂを介しブランチノード１０６Ｂを介し抽象リーフノード１０８Ｈを介するブランチノード１０６Ａへのパスは、有効なパスとみなされ得ない。また、いくつかの実施形態において、サブグラフは、サブグラフにおける各エッジが向きを持つような有向非巡回グラフとみなされ得る。これらの実施形態又は他の実施形態において、サブグラフの「パス」は、エッジの向きに従うノードの間の連結のみを含み得る。識別されたパスが、スプリットノードと比較されて、パスのうちのいずれかが２つ以上のスプリットノードを含むかどうかが判定され得る。識別されたパスのうちのいずれかが２つ以上のスプリットノードを含むという判定に応じて、この候補サブグラフがスプリットノードルールに従った有効なサブグラフではないという判定がなされ得る。一方、識別されたパスのうちのいずれも２つ以上のスプリットノードを含まないという判定に応じて、この候補サブグラフが、スプリットノードルールに従った有効なサブグラフとして識別され得る。
【００９６】
サブグラフルールの実施の例として、候補サブグラフは、抽象ルートノード１０２、ルートノード１０３Ａ、抽象ブランチノード１０５Ａ、ブランチノード１０６Ａ、抽象リーフノード１０８Ｃ、抽象リーフノード１０８Ｈ、抽象ブランチノード１０５Ｂ、ブランチノード１０６Ｂ、抽象リーフノード１０８Ｆ、及び抽象リーフノード１０８Ｇを含み得る。この例において、候補サブグラフのリーフノード、したがって、スプリットノードは、抽象リーフノード１０８Ｃ、抽象リーフノード１０８Ｈ、抽象リーフノード１０８Ｆ、及び抽象リーフノード１０８Ｇを含み得る。抽象ルートノード１０２から、リーフノード１０９Ｂ、リーフノード１０９Ｆ、リーフノード１０９Ｄ、及びリーフノード１０９Ｅへの全てのパスが識別され得る。候補サブグラフは、抽象コードグラフの抽象ルートノード１０２から抽象コードグラフのリーフノード１０９の各々への全ての可能なパスが１つのスプリットノードしか含まないスプリットノードルールの下での有効なサブグラフであり得る。例えば、抽象ルートノード１０２からリーフノード１０９Ｂへの全ての可能なパスは、１つのスプリットノードすなわち抽象リーフノード１０８Ｈしか含まない。さらに、抽象ルートノード１０２からリーフノード１０９Ｆへの全ての可能なパスは、１つのスプリットノードすなわち抽象ブランチノード１０８Ｈしか含まない。さらに、抽象ルートノード１０２からリーフノード１０９Ｄへの全ての可能なパスは、１つのスプリットノードすなわち抽象リーフノード１０８Ｆしか含まない。さらに、抽象ルートノード１０２からリーフノード１０９Ｅへの全ての可能なパスは、１つのスプリットノードしか含まない。
【００９７】
このサブグラフルールに違反する候補サブグラフの例は、抽象ルートノード１０２、ルートノード１０３Ａ、抽象ブランチノード１０５Ａ、ブランチノード１０６Ａ、抽象リーフノード１０８Ｃ、抽象リーフノード１０８Ｈ、及び抽象ブランチノード１０５Ｂだけを含むサブグラフである。この候補サブグラフは、抽象ルートノード１０２とリーフノード１０９Ｆとの間に２つのスプリットノードを含むパスが存在するので、スプリットノードルールに従った有効なサブグラフではない。有効なサブグラフのスプリットノードは、抽象リーフノード１０８Ｃ、抽象リーフノード１０８Ｈ、及び抽象ブランチノード１０５Ｂである。２つのスプリットノードを含むパスは、抽象ルートノード１０２からルートノード１０３Ａを介し抽象ブランチノード１０５Ｂを介しブランチノード１０６Ａを介し抽象リーフノード１０８Ｈを介し抽象リーフノード１０８Ｉを介するリーフノード１０９Ｆへのパスである。このパスは、抽象ブランチノード１０５Ｂ及び抽象リーフノード１０８Ｈの両方を含み、これらの両方はスプリットノードである。
【００９８】
サブグラフ１５０は、説明されたルールのうちのどれにも従わないこともあるし、説明されたルールのうちの１つに従うこともあるし、説明されたルールのうちのいくつかに従うこともあるし、説明されたルールの全てに従うこともある。すなわち、サブグラフ生成器１４０は、説明されたルールのうちのどれも実施しないこともあるし、説明されたルールのうちの１つを実施することもあるし、説明されたルールのうちのいくつかを実施することもあるし、説明されたルールの全てを実施することもある。いくつかの実施形態において、本開示に記載のルールを表現又は実装する異なる方法が存在し得る。例えば、選択される各ノードが少なくとも１つの他のノードに連結されるようなルールは、「分離ノード無」と表現され得る。いくつかの実施形態において、サブグラフ１５０を特徴付ける追加の又は代替のルールが存在することもある。
【００９９】
いくつかの実施形態において、サブグラフを特徴付けるルールは、サブグラフの原理（principle）に関連し得る。サブグラフの原理は、サブグラフに基づくソースコードの再構築に関連し得る。例えば、再構築されるソースコードは、サブグラフに基づいて生成され得る。再構築は、ソースコードの各構成要素を、サブグラフからの当該構成要素の表現で置換し得る。いくつかの実施形態において、再構築は、ソースコードの各構成要素を、サブグラフにおいて見つけられた、当該構成要素の最も抽象的でない表現で置換し得る。いくつかの実施形態において、先祖ノードを使用して、サブグラフではなく抽象コードグラフ１３０Ａに含まれる子孫ノードを表現することができる。サブグラフの原理は、サブグラフからの最も抽象的でない表現が再構築において使用される場合、再構築において、各構成要素が１つの抽象度で表現されることが可能であるだけであり得ることを含み得る。例えば、抽象ルートノード１０２、ルートノード１０３Ａ、抽象ブランチノード１０５Ａ、ブランチノード１０６Ａ、抽象リーフノード１０８Ｃ、抽象リーフノード１０８Ｈ、及び抽象ブランチノード１０５Ｂの上記で与えられた例において、抽象ブランチノード１０５Ｂ及び抽象リーフノード１０８Ｈの両方を使用して、ソースコード内の異なる位置においてリーフノード１０９Ｆにより表現される構成要素を表現することができる。
【０１００】
図１Ａに戻ると、いくつかの実施形態において、システム１００は、抽象コードグラフ解析器１６０を含み得る。概して、抽象コードグラフ解析器１６０は、１つ以上の抽象コードグラフ１３０及び／又は１つ以上のサブグラフ１５０を解析するよう構成され得る。
【０１０１】
例えば、いくつかの実施形態において、抽象コードグラフ解析器１６０は、抽象コードグラフ１３０を他の抽象コードグラフと比較するよう構成され得る。いくつかの実施形態において、抽象コードグラフ解析器１６０は、抽象コードグラフ１３０を、同じソフトウェアプログラムからの他の抽象コードグラフと比較することができる。これらの実施形態又は他の実施形態において、抽象コードグラフ解析器１６０は、抽象コードグラフ１３０を、他のソフトウェアプログラムからの他の抽象コードグラフ（例えば、ビッグコードから生成された他の抽象コードグラフ）と比較することができる。例えば、いくつかの実施形態において、抽象コードグラフ解析器１６０は、抽象コードグラフ１３０を、ビッグコードからの抽象コードグラフと比較して、テスト対象コードにおいて見つけられ得る頻出コードパターンを識別することができる。これらの実施形態又は他の実施形態において、抽象コードグラフ解析器１６０は、ビッグコードの１つ以上の抽象コードグラフ１３０の比較を用いて、頻出コードパターンを識別することができる。
【０１０２】
例えば、いくつかの実施形態において、抽象コードグラフ解析器１６０は、１つ以上のサブグラフ１５０を他のサブグラフと比較するよう構成され得る。いくつかの実施形態において、抽象コードグラフ解析器１６０は、１つ以上のサブグラフ１５０を、同じソフトウェアプログラムからの他のサブグラフと比較することができる。これらの実施形態又は他の実施形態において、抽象コードグラフ解析器１６０は、１つ以上のサブグラフ１５０を、他のソフトウェアプログラムからの他のサブグラフ（例えば、ビッグコードから生成された他のサブグラフ）と比較することができる。例えば、いくつかの実施形態において、抽象コードグラフ解析器１６０は、１つ以上のサブグラフ１５０を、ビッグコードからのサブグラフと比較して、テスト対象コードにおいて見つけられ得る頻出コードパターンを識別することができる。これらの実施形態又は他の実施形態において、抽象コードグラフ解析器１６０は、ビッグコードの１つ以上のサブグラフの比較を用いて、頻出コードパターンを識別することができる。
【０１０３】
追加的又は代替的に、抽象コードグラフ解析器１６０は、１つ以上の抽象コードグラフ１３０を１つ以上のサブグラフ１５０と比較することもある。抽象コードグラフ１３０及びサブグラフ１５０の一方又は両方は、同じソフトウェアプログラムからのものであることもあるし、異なるソフトウェアプログラムからのものであることもあるし、ビッグコードからのものであることもある。
【０１０４】
いくつかの実施形態において、抽象コードグラフ解析器１６０は、２つ以上の抽象コードグラフ１３０の１つ以上のノード及び／又は２つ以上の抽象コードグラフ１３０の構造全体を比較することにより、２つ以上の抽象コードグラフ１３０を互いと比較することができる。いくつかの実施形態において、システム１００は、ハッシュ値を生成するための任意の適切な動作に従って、抽象コードグラフ１３０のうちの１つ以上を表すハッシュ値を生成することができる。いくつかの実施形態において、抽象コードグラフ解析器１６０は、１つ以上の抽象コードグラフ１３０のハッシュ値を比較することができる。
【０１０５】
抽象コードグラフ１３０及び／又はサブグラフ１５０を比較する例について、いくつかの実施形態において、ソースコードが、抽象コードグラフ１３０及び／又はサブグラフ１５０から再構築され得る。再構築されたソースコードは、例えば、元々のソースコードと同じ構成要素を含むことによって等、元々のソースコードに関連し得る。しかしながら、再構築されたソースコードは、構成要素のうちの１つ以上の構成要素の抽象的表現を含み得るのに対し、元々のソースコードは、文字通りの構成要素を含み得る。再構築されたソースコードは、テキストを含み得る。再構築されたソースコードのテキストは、例えばメッセージダイジェスト５（MD5）等、ハッシュ化アルゴリズムによりハッシュ化され得る。ハッシュ化アルゴリズムは、ハッシュ値を生成し得る。ハッシュ化アルゴリズムは、例えばビッグコードからのものであり得る抽象コードグラフ１３０及び／又はサブグラフ１５０に対して実行され得る。ハッシュ値が比較され得る。ハッシュ値間の一致は、ハッシュ値が基づくテキストが関連する又は同じであることを示し得る。
【０１０６】
いくつかの実施形態において、抽象コードグラフ解析器１６０は、抽象コードグラフを解析するための１つ以上の動作をコンピューティングシステムが実行することを可能にするよう構成されているコード及びルーチンを含み得る。追加的又は代替的に、抽象コードグラフ解析器１６０は、（例えば、１つ以上の動作を実行する又は１つ以上の動作の実行を制御する）プロセッサ、（例えば、１つ以上の動作を実行する又は１つ以上の動作の実行を制御する）マイクロプロセッサ、FPGA、又はASICを含むハードウェアを使用して実装されてもよい。いくつかの他の例において、抽象コードグラフ解析器１６０は、ハードウェアとソフトウェアとの組合せを使用して実装され得る。本開示において、抽象コードグラフ解析器１６０により実行されるとして説明される動作は、システムに実行するように抽象コードグラフ解析器１６０が指示し得る動作を含み得る。
【０１０７】
本開示の範囲から逸脱することなく、抽象コードグラフ解析器１６０に対して、変更、追加、又は省略が可能である。さらに、動作の順序は、異なる実装に応じて変わり得る。
【０１０８】
システム１００を使用して、特定のソフトウェアプログラムを解析することができる。特定のソフトウェアプログラムは、テスト対象ソフトウェアであり得る。システム１００は、特定のソフトウェアプログラムに関連する抽象構文木１１０を生成することができる。追加的又は代替的に、抽象コードグラフ生成器１２０が、特定のソフトウェアプログラムに関連する抽象コードグラフ１３０を生成することもある。追加的又は代替的に、サブグラフ生成器１４０が、抽象コードグラフ１３０に関連する１つ以上のサブグラフ１５０を生成することもある。追加的又は代替的に、抽象コードグラフ解析器１６０が、特定のソフトウェアプログラムに関連する抽象コードグラフ１３０及び／又はサブグラフ１５０のうちの１つ以上を解析することもある。特定のソフトウェアプログラムの解析は、抽象コードグラフ１３０及び／又はサブグラフ１５０と、ビッグコードからのソフトウェアプログラムを含み得る他のソフトウェアプログラムと、の比較を含み得る。
【０１０９】
追加的又は代替的に、システム１００を使用して、ビッグコードを解析することもできる。システム１００は、一度に、ビッグコードにおいて見つけられた１つのソフトウェアプログラムを解析することができる。システム１００は、解析結果のリポジトリを形成することができる。例えば、システム１００は、ビッグコードにおいて見つけられたソフトウェアプログラムに関連する抽象構文木１１０を生成することができる。追加的又は代替的に、抽象コードグラフ生成器１２０が、ビッグコードにおいて見つけられたソフトウェアプログラムに関連する抽象コードグラフ１３０を生成することもある。追加的又は代替的に、サブグラフ生成器１４０が、ビッグコードにおいて見つけられたソフトウェアプログラムに関連する１つ以上のサブグラフ１５０を生成することもある。追加的又は代替的に、抽象コードグラフ解析器１６０が、ビッグコードにおいて見つけられたソフトウェアプログラムに関連する抽象コードグラフ１３０及び／又はサブグラフ１５０のうちの１つ以上を解析することもある。ビッグコードの解析から生じる抽象構文木１１０、抽象コードグラフ１３０、及び／又はサブグラフ１５０のうちの１つ以上は、リポジトリに記憶され得る。追加的又は代替的に、識別された１つ以上のコードパターンが、リポジトリに記憶されることもある。
【０１１０】
いくつかの実施形態において、システム１００は、ビッグコードのソフトウェアプログラムの解析に基づいて、ビッグコードにおける頻出コードパターンを識別することができる。例えば、システム１００は、特定のソフトウェアプログラムを解析することができ、特定のソフトウェアプログラムに基づいて、抽象構文木１１０、抽象コードグラフ１３０、及び１つ以上のサブグラフ１５０を生成することができる。システム１００は、抽象構文木１１０、抽象コードグラフ１３０、及び／又はサブグラフ１５０を、リポジトリの他の抽象構文木、他の抽象コードグラフ、及び／又は他のサブグラフと比較することができる。いくつかの実施形態において、例えば、特定のソフトウェアプログラムの特定の抽象コードグラフ１３０は、リポジトリの他の抽象コードグラフ１３０のうちの１つ以上と相関し得、システム１００は、特定の抽象コードグラフ１３０の出現の数のカウンタをインクリメントすることができる。
【０１１１】
いくつかの実施形態において、抽象コードグラフ１３０及び／又はサブグラフ１５０を記憶するのではなく、抽象コードグラフ１３０及び／又はサブグラフ１５０を表すデータ値が、リポジトリに記憶され得る。例えば、抽象コードグラフ１３０及び／又はサブグラフ１５０を表すハッシュ値が記憶され得る。抽象コードグラフ解析器１６０は、１つ以上の抽象コードグラフ１３０及び／又はサブグラフ１５０のハッシュ値を比較することができる。いくつかの実施形態において、リポジトリは、抽象コードグラフ１３０及び／又はサブグラフ１５０の１つのインスタンスのみを含み得、解析された特定の抽象コードグラフ１３０及び／又はサブグラフ１５０の出現の数のカウントを含み得る。追加的又は代替的に、リポジトリは、抽象コードグラフ１３０及び／又はサブグラフ１５０を表すハッシュ値と、解析された特定の抽象コードグラフ１３０及び／又はサブグラフ１５０の出現の数のカウントと、だけを含み得る。
【０１１２】
いくつかの実施形態において、頻出コードパターンが、ビッグコードにおける抽象コードグラフ１３０及び／又はサブグラフ１５０の出現の頻度に基づいて識別され得る。本開示において、ビッグコード又はテスト対象ソフトウェアにおける、抽象コードグラフへと抽象化され得るコードの出現は、ビッグコード又はテスト対象ソフトウェアにおける抽象コードグラフの出現と呼ばれ得る。本開示において、抽象コードグラフを頻出コードパターンとして識別することは、抽象コードグラフが基づくコードを頻出コードパターンとして識別することを指し得る。
【０１１３】
例えば、ビッグコードの解析により、特定の抽象コードグラフ１３０が、閾数等の閾値よりも多くビッグコードにおいて出現したと判定された場合、抽象コードグラフ１３０及び／又は抽象コードグラフ１３０に関連するソースコードが、頻出コードパターンとして識別され得る。これらの実施形態又は他の実施形態において、閾値は、解析及び／又は生成された抽象コードグラフの総数；及び／又は、リポジトリのサイズ；に基づき得る。例えば、閾値は、リポジトリにおける抽象コードグラフの総数のパーセンテージであり得る。追加的又は代替的に、閾値は、解析されたソフトウェアプログラムの数に基づくこともある。例えば、リポジトリの抽象コードグラフが頻出コードパターンに関連するかどうかの判定は、どれだけの数のソフトウェアプログラムがこの抽象コードグラフに関連付けられているかに基づき得る。例えば、解析された全てのソフトウェアプログラムの７５％を超えるソフトウェアプログラムにおいて見つけられた抽象コードグラフは、頻出コードパターンであると判定され得る。
【０１１４】
いくつかの実施形態において、１つ以上のソフトウェアプログラムの解析の結果が、デバッグ動作において使用され得る。例えば、テスト対象コードが、システム１００により解析され得る。例えば、システム１００は、テスト対象ソフトウェアに基づいて、１つ以上のサブグラフ１５０を生成することができる。システム１００は、１つ以上のサブグラフ１５０を、リポジトリにおいて見つけられた他のソフトウェアの他のサブグラフ１５０と比較することができる。１つ以上のデバッグ動作は、テスト対象ソフトウェアの特定のサブグラフ１５０とリポジトリの別のサブグラフとの間の相関を示す、比較の結果に基づき得る。
【０１１５】
例えば、ソフトウェア開発中に、プロンプトが、１つ以上の抽象コードグラフ及び／又はサブグラフの比較の結果に基づいて、生成され得る且つ／又は開発者に対して表示され得る。例えば、人間のソフトウェア開発者は、例えば「closable.close();」等のコード行を統合開発環境に入力することができる。このコード行のサブグラフと他のサブグラフとの比較に基づいて、統合開発環境は、例えば「if  (closable  !=  null)」等の事前条件を提案することができる。
【０１１６】
デバッグ動作において、抽象コードグラフ及び／又はサブグラフの間の比較の結果が使用される別の例において、自動ソフトウェア開発は、抽象コードグラフに基づいてコードを生成することができる。例えば、自動ソフトウェア開発ツールは、リポジトリからの抽象コードグラフに基づいてコードを生成することができる。
【０１１７】
デバッグ動作において、抽象コードグラフ及び／又はサブグラフの間の比較の結果が使用される別の例において、ソフトウェアの自動テストが、１つ以上の抽象コードグラフを含む、ソフトウェア解析の結果に基づいてガイドされ得る。例えば、テスト対象ソフトウェアは、潜在的に脆弱であるとして識別された、ビッグコードのコードパターンに対応し得る特定の抽象コードグラフ１３０を含み得る。ソフトウェアの自動テストは、特定の抽象コードグラフ１３０に関連するコードにフォーカスし得る。
【０１１８】
デバッグ動作において、抽象コードグラフ及び／又はサブグラフの間の比較の結果が使用される別の例において、自動ソフトウェア修復動作は、比較の結果に基づいて修復候補を選択することができる。例えば、テスト対象ソフトウェアは、例えば「closable.close();」等のコード行であり得る。このコード行のサブグラフは、例えば「if  (closable  !=  null)  closable.close();」等の、ビッグコードからのコード行のサブグラフと相関し得る。ビッグコードからのこのコード行は、これらのサブグラフの相関に基づく、テスト対象ソフトウェアにおけるコード行についての修復候補であり得る。いくつかの実施形態において、リポジトリからのサブグラフは、差分抽象コードグラフに基づき得る。本開示の範囲から逸脱することなく、システム１００に対して、変更、追加、又は省略が可能である。例えば、いくつかの実施形態において、抽象コードグラフ解析器１６０は、コードパターンに対して作用することがある。さらに、動作の順序は、異なる実装に応じて変わり得る。さらに、別個に説明されているが、いくつかの実施形態において、抽象コードグラフ生成器１２０、サブグラフ生成器１４０、及び抽象コードグラフ解析器１６０のうちの２つ以上は、同じシステムの一部であることもあるし、説明されたのとは異なって分割されることもある。本開示におけるこれらの要素と他の要素との間の線引きは、限定的なものではなく、本開示において用いられているコンセプト及び原理の理解及び説明を助けるように意図されている。
【０１１９】
図２は、本開示に記載の少なくとも１つの実施形態に従って構成され得る例示的なコンピューティングシステム２００のブロック図である。図２に示されているように、システム２００は、プロセッサ２０２、メモリ２０４、データストレージ２０６、及び通信ユニット２０８を含み得る。
【０１２０】
概して、プロセッサ２０２は、様々なコンピュータハードウェア又はソフトウェアモジュールを含む任意の適切な専用又は汎用のコンピュータ、コンピューティングエンティティ、又は処理デバイスを含み得、任意の適用可能なコンピュータ読み取り可能な記憶媒体に記憶されている命令を実行するよう構成され得る。例えば、プロセッサ２０２は、マイクロプロセッサ、マイクロコントローラ、デジタル信号プロセッサ（DSP）、特定用途向け集積回路（ASIC）、フィールドプログラマブルゲートアレイ（FPGA）、又は、プログラム命令を解釈及び／又は実行し、且つ／又はデータを処理するよう構成されている任意の他のデジタル回路若しくはアナログ回路を含み得る。プロセッサ２０２は、図２において１つのプロセッサとして示されているが、プロセッサ２０２は、本開示に記載の任意の数の動作を個別的又は集合的に実行するよう構成されている、任意の数のネットワーク又は物理的位置にわたって分散される任意の数のプロセッサを含んでもよい。
【０１２１】
いくつかの実施形態において、プロセッサ２０２は、メモリ２０４、データストレージ２０６、又はメモリ２０４とデータストレージ２０６との両方に記憶されているプログラム命令を解釈及び／又は実行し、且つ／又は、メモリ２０４、データストレージ２０６、又はメモリ２０４とデータストレージ２０６との両方に記憶されているデータを処理することができる。いくつかの実施形態において、プロセッサ２０２は、データストレージ２０６からプログラム命令をフェッチして、プログラム命令をメモリ２０４にロードすることができる。プログラム命令がメモリ２０４にロードされた後、プロセッサ２０２は、図１Ａの抽象コードグラフ生成器１２０、サブグラフ生成器１４０、及び／又は抽象コードグラフ解析器１６０に関して上述した１つ以上の動作を実行するための命令等のプログラム命令を実行することができる。
【０１２２】
メモリ２０４及びデータストレージ２０６は、コンピュータ実行可能な命令又はデータ構造を運ぶ又は記憶する１つ以上のコンピュータ読み取り可能な記憶媒体を含み得る。そのようなコンピュータ読み取り可能な記憶媒体は、プロセッサ２０２等の汎用又は専用のコンピュータによりアクセスされ得る任意の利用可能な媒体を含み得る。限定ではなく例として、そのようなコンピュータ読み取り可能な記憶媒体は、ランダムアクセスメモリ（RAM）、読み取り専用メモリ（ROM）、電気的に消去可能なプログラム可能な読み取り専用メモリ（EEPROM）、コンパクトディスク読み取り専用メモリ（CD-ROM）若しくは他の光ディスクストレージ、磁気ディスクストレージ若しくは他の磁気記憶デバイス、フラッシュメモリデバイス（例えば、ソリッドステートメモリデバイス）、又は、コンピュータ実行可能な命令又はデータ構造の形態の所望のプログラムコードを運ぶ又は記憶するために使用され得る任意の他の記憶媒体であって、汎用又は専用のコンピュータによりアクセスされ得る任意の他の記憶媒体、を含む非一時的なコンピュータ読み取り可能な記憶媒体を含み得る。上記の組合せも、コンピュータ読み取り可能な記憶媒体の範囲に含まれ得る。コンピュータ実行可能な命令は、例えば、プロセッサ２０２に所定の動作又は動作群を実行させるよう構成されている命令及びデータを含み得る。
【０１２３】
本開示の範囲から逸脱することなく、システム２００に対して、変更、追加、又は省略が可能である。例えば、データストレージ２０６は、複数の位置に配置され、ネットワークを介してプロセッサ２０２によりアクセスされてもよい。
【０１２４】
図３は、本開示に記載の少なくとも１つの実施形態に従って構成される、抽象コードグラフを生成するよう構成されている例示的な方法３００のフローチャートである。いくつかの実施形態において、方法３００に関連付けられている動作のうちの１つ以上の動作は、図１のシステム１００により実行され得る。方法３００は、任意の適切なシステム、装置、又はデバイスにより実行され得る。例えば、図２のコンピューティングシステム２００が、方法３００に関連付けられている動作のうちの１つ以上の動作を実行できる。別個のブロックで図示されているが、方法３００のブロックのうちの１つ以上のブロックに関連付けられているステップ及び動作は、所望の実装に応じて、追加のブロックに分割されることもあるし、より少ないブロックに組み合わされることもあるし、除去されることもある。概して、方法３００は、抽象構文木を得て、抽象構文木に基づいて抽象コードグラフを生成することができる。
【０１２５】
方法３００は、ブロック３１０を含み得る。ブロック３１０において、抽象構文木が得られ得る。抽象構文木は、図１Ａの抽象構文木１１０に関連して上述したものであり得る。ブロック３１０において得られる抽象構文木は、ソースコードの構成要素と、ソースコード内の構成要素の間の関係と、を表現し得る。図１Ｂの抽象構文木１１０Ａは、ブロック３１０において得られる抽象構文木の例であり得る。追加的又は代替的に、図１Ｄの差分抽象構文木１１０Ｄが、ブロック３１０において得られる抽象構文木の例であることもある。抽象構文木は、第１のASTノード及び第２のASTノードを含み得る。
【０１２６】
第１のASTノードは、ソースコード内の第１の位置に配置されている第１の構成要素を表現し得る。第１のASTノードは、第１の構成要素を第１の抽象度で表現し得る。図１Ｂのリーフノード１０９Ａが、第１のASTノードの例であり得る。「if  (closable  !=  null)  closable.close();」が、ソースコードの例であり得る。構成要素「closable」が、第１の構成要素の例であり得る。表現「Var  closable」が、第１の構成要素（「closable」）を第１の抽象度で表現した例であり得る。例示的なソースコード（「if  (closable  !=  null)  closable.close();」）内の構成要素「closable」の１番目の出現が、ソースコード内の第１の位置の例であり得る。
【０１２７】
第２のASTノードは、ソースコード内の第２の位置に配置されている第２の構成要素を表現し得る。図１Ｂのブランチノード１０６Ａが、第２のASTノードの例であり得る。構成要素「!=」が、第２の構成要素の例であり得る。ソースコード内の「!=」の位置が、第２の位置の例であり得る。
【０１２８】
第１のASTノードは、第１の位置における第１の構成要素と第２の位置における第２の構成要素との間の関係を表現するように、抽象構文木において第２のASTノードに連結され得る。図１Ｂのリーフノード１０９Ａとブランチノード１０６Ａとの間の連結が、第１のASTノードと第２のASTノードとの間の連結の例であり得る。構成要素「closable」と構成要素「!=」とがソースコード内で互いに関連する点が、第１の構成要素と第２の構成要素との間の関係の例であり得る。
【０１２９】
方法３００は、ブロック３２０を含み得る。ブロック３２０において、抽象コードグラフが、抽象構文木に基づいて生成され得る。抽象コードグラフは、図１Ｆを参照して上述したものであり得る。図１Ｆの抽象コードグラフ１３０Ａが、ブロック３２０において生成される抽象コードグラフの例であり得る。追加的又は代替的に、図１Ｈの差分抽象コードグラフ１３０Ｂが、ブロック３２０において生成される抽象コードグラフの例であることもある。
【０１３０】
ブロック３２０は、１つ以上のブロックを含み得る。いくつかの実施形態において、ブロック３２０の内部に示されているブロックは、抽象コードグラフを生成することに関連し得る。いくつかの実施形態において、ブロック３２０は、省かれることがあり、ブロック３２０の内部に示されているブロックが、ブロック３２０とは別個に実行され得る。
【０１３１】
いくつかの実施形態において、方法３００は、ブロック３２２を含み得る。ブロック３２２において、第１のACGノードが、第１のASTノードに基づいて生成され得る。第１のACGノードは、第１の構成要素を第１の抽象度で表現し得る。図１Ｆのリーフノード１０９Ｆが、第１のACGノードの例であり得る。表現「Name  closable」が、第１の構成要素（「closable」）を第１の抽象度で表現した例であり得る。
【０１３２】
方法３００は、ブロック３２４を含み得る。ブロック３２４において、第２のACGノードが、第２のASTノードに基づいて生成され得る。図１Ｆのブランチノード１０６Ａが、第２のACGノードの例であり得る。
【０１３３】
方法３００は、ブロック３２６を含み得る。ブロック３２６において、第３のACGノードが、第１のACGノードに基づいて生成され得る。第３のACGノードは、第１の構成要素を第２の抽象度で表現し得る。第２の抽象度は、第１の抽象度よりも抽象的である。図１Ｆの抽象リーフノード１０８Ｈが、第３のACGノードの例であり得る。表現「Var」が、第１の構成要素（「closable」）を第２の抽象度で表現した例であり得る。表現「Var」が表現「Name  closable」よりも抽象的であり得るという事実が、第２の抽象度が第１の抽象度よりも抽象的であることの例であり得る。
【０１３４】
第３のACGノードは、第２のACGノードが抽象コードグラフにおいて第３のACGノードを介して第１のACGノードに関連し得るように、第１のACGノードと第２のACGノードとの間に連結され得る。第１のACGノードと第２のACGノードとの間の関連は、第１のASTノードが抽象構文木において第２のASTノードに連結されていることに基づき得る。図１Ｆのブランチノード１０６Ａと抽象リーフノード１０８Ｈとリーフノード１０９Ｆとの間の連結が、第２のACGノードと第３のACGノードと第１のACGノードとの間の関連の例であり得る。
【０１３５】
いくつかの実施形態において、追加の動作が実行され得る。例えば、抽象構文木は、ソースコード内の第３の位置に配置されている第１の構成要素を表現し得る第３のASTノードをさらに含み得る。第３のASTノードは、第１の構成要素を第１の抽象度で表現し得る。図１Ｂのリーフノード１０９Ｃが、第３のASTノードの例であり得る。例示的なソースコード（「if  (closable  !=  null)  closable.close();」内の構成要素「closable」の２番目の出現が、ソースコード内の第３の位置の例であり得る。
【０１３６】
これらの実施形態又は他の実施形態において、第１のASTノードに基づいて第１のACGノードを生成することは、第１のASTノード及び第３のASTノードの両方が第１の構成要素を第１の抽象度で表現していることに応じて、第１のASTノードと第３のASTノードとを第１のACGノードへとマージすることを含み得る。図１Ｇのリーフノード１０９Ｆと図１Ｂのリーフノード１０９Ａと図１Ｂのリーフノード１０９Ｃとの間の関係が、第１のASTノードと第３のASTノードとを第１のACGノードへとマージすることの例であり得る。例えば、第１のASTノードの例であり得る図１Ｂのリーフノード１０９Ａと第２のASTノードの例であり得る図１Ｂのリーフノード１０９Ｃとがマージされて、第１のACGノードが形成され得、ここで、図１Ｇのリーフノード１０９Ｇが、第１のACGの例であり得る。いくつかの実施形態において、第１のASTノードと第３のASTノードとのマージは、第１のACGノードの生成より前に生じることもあるし、第１のACGノードの生成と実質的に同時に生じることもある。
【０１３７】
いくつかの実施形態において、追加の動作が実行され得る。例えば、抽象構文木は、ソースコード内の第３の位置に配置されている第３の構成要素を表現し得る第３のASTノードをさらに含み得る。図１Ｂのブランチノード１０６Ｂが、第３のASTノードの例であり得る。構成要素「close()」が、第３の構成要素の例であり得る。
【０１３８】
これらの実施形態又は他の実施形態において、抽象構文木は、ソースコード内の第４の位置に配置されている第１の構成要素を表現し得る第４のASTノードであって、第１の構成要素を第１の抽象度で表現する第４のASTノードをさらに含み得る。第３のASTノードは、第３の位置における第３の構成要素と第４の位置における第１の構成要素との間の関係を表現し得るように、抽象構文木において第４のASTノードに連結され得る。図１Ｂのリーフノード１０９Ｃが、第４のASTノードの例であり得る。第４のASTノードは、構成要素「closable」を表現し得る。例示的なソースコード（「if  (closable  !=  null)  closable.close();」内の構成要素「closable」の２番目の出現が、ソースコード内の第４の位置の例であり得る。表現「Var  closable」が、第１の構成要素を第１の抽象度で表現した例であり得る。図１Ｂのリーフノード１０９Ｃとブランチノード１０６Ｂとの間の連結が、第３のASTノードと第４のASTノードとの間の連結の例であり得る。構成要素「closable」と構成要素「close()」とがソースコード内で互いに関連する点が、第３の構成要素と第４の構成要素との間の関係の例であり得る。
【０１３９】
これらの実施形態又は他の実施形態において、ブロック３２０は、追加の動作をさらに含み得る。ブロック３２０は、第４のASTノードに基づいて第４のACGノードを生成することを含み得る。第４のACGノードは、第１の構成要素を第１の抽象度で表現し得る。リーフノード１０９Ｃが、第４のACGノードの例であり得る。構成要素「closable」を「Name  closable」として表現することが、第１の構成要素を第１の抽象度で表現することの例であり得る。
【０１４０】
これらの実施形態又は他の実施形態において、ブロック３２０は、第３のASTノードに基づいて第５のACGノードを生成することをさらに含み得る。図１Ｅのブランチノード１０６Ｂが、第５のACGノードの例であり得る。
【０１４１】
これらの実施形態又は他の実施形態において、ブロック３２０は、第４のACGノードに基づいて、第１の構成要素を第２の抽象度で表現し得る第６のACGノードを生成することをさらに含み得る。第６のACGノードは、第４のACGノードが抽象コードグラフにおいて第６のACGノードを介して第５のACGノードに関連し得るように、第４のACGノードと第５のACGノードとの間に連結され得る。第４のACGノードと第５のACGノードとの間の関連は、第４のASTノードが抽象構文木において第３のASTノードに連結されていることに基づき得る。図１Ｅの抽象リーフノード１０８Ｄが、第６のACGノードの例であり得る。表現「Var」が、第１の構成要素（「closable」）を第２の抽象度で表現した例であり得る。図１Ｅのブランチノード１０６Ｂと抽象リーフノード１０８Ｄとリーフノード１０９Ｃとの間の連結が、第５のACGノードと第６のACGノードと第４のACGノードとの間の関連の例であり得る。
【０１４２】
これらの実施形態又は他の実施形態において、ブロック３２０は、第１のACGノード及び第４のACGノードの両方が第１の構成要素を第１の抽象度で表現していることに応じて、第１のACGノードと第４のACGノードとを、第１の構成要素を第１の抽象度で表現する第７のACGノードへとマージすることをさらに含み得る。図１Ｆのリーフノード１０９Ｆが、第７のACGノードの例であり得る。例えば、第１のACGノードの例であり得る図１Ｅのリーフノード１０９Ａと第４のACGノードの例であり得る図１Ｅのリーフノード１０９Ｃとがマージされて、第７のACGノードが形成され得、ここで、図１Ｆのリーフノード１０９Ｆが、第７のACGノードの例であり得る。いくつかの実施形態において、第１のACGノードと第４のACGノードとのマージは、第１のACGノード及び／又は第４のACGノードの生成より前に生じることもあるし、第１のACGノード及び／又は第４のACGノードの生成と実質的に同時に生じることもある。
【０１４３】
これらの実施形態又は他の実施形態において、ブロック３２０は、第３のACGノード及び第６のACGノードの両方が第１の構成要素を第２の抽象度で表現していることに応じて、第３のACGノードと第６のACGノードとを、第１の構成要素を第２の抽象度で表現する第８のACGノードへとマージすることをさらに含み得る。図１Ｆの抽象リーフノード１０８Ｈが、第８のACGノードの例であり得る。例えば、第３のACGノードの例であり得る図１Ｅの抽象リーフノード１０８Ａと第６のACGノードの例であり得る図１Ｅの抽象リーフノード１０８Ｄとがマージされて、第８のACGノードが形成され得、ここで、図１Ｆの抽象リーフノード１０８Ｈが、第８のACGノードの例であり得る。いくつかの実施形態において、第３のACGノードと第６のACGノードとのマージは、第３のACGノード及び／又は第６のACGノードの生成より前に生じることもあるし、第３のACGノード及び／又は第６のACGノードの生成と実質的に同時に生じることもある。
【０１４４】
本開示の範囲から逸脱することなく、方法３００に対して、変更、追加、又は省略が可能である。さらに、動作の順序は、異なる実装に応じて変わり得る。
【０１４５】
当業者は、システム１００、方法３００、並びに、本出願において開示された他のプロセス及び方法に関して、そのようなプロセス及び方法において実行される機能が、異なる順序で実行されることがあることを認識するであろう。さらに、説明されたステップ及び動作は、例として提供されているに過ぎず、これらのステップ及び動作のうちの一部は、開示された実施形態の本質を損なうことなく、任意的であることもあるし、より少ないステップ及び動作に組み合わされることもあるし、追加のステップ及び動作に拡張されることもある。
【０１４６】
本開示に記載の実施形態は、以下でより詳細に説明されるような様々なコンピュータハードウェア又はソフトウェアモジュールを含む専用又は汎用のコンピュータの使用を含み得る。
【０１４７】
本開示に記載の実施形態は、コンピュータ実行可能な命令又はデータ構造を運ぶ又は記憶するコンピュータ読み取り可能な媒体を使用して実装され得る。そのようなコンピュータ読み取り可能な媒体は、汎用又は専用のコンピュータによりアクセスされ得る任意の利用可能な媒体であり得る。限定ではなく例として、そのようなコンピュータ読み取り可能な媒体は、ランダムアクセスメモリ（RAM）、読み取り専用メモリ（ROM）、電気的に消去可能なプログラム可能な読み取り専用メモリ（EEPROM）、コンパクトディスク読み取り専用メモリ（CD-ROM）若しくは他の光ディスクストレージ、磁気ディスクストレージ若しくは他の磁気記憶デバイス、フラッシュメモリデバイス（例えば、ソリッドステートメモリデバイス）、又は、コンピュータ実行可能な命令又はデータ構造の形態の所望のプログラムコードを運ぶ又は記憶するために使用され得る任意の他の記憶媒体であって、汎用又は専用のコンピュータによりアクセスされ得る任意の他の記憶媒体、を含む非一時的なコンピュータ読み取り可能な記憶媒体を含み得る。これらの実施形態及び他の実施形態において、本開示に記載の「非一時的」という用語は、米国連邦巡回控訴高等裁判所によるIn  re  Nuijten判決（500  F.3d  1346）（Fed.  Cir.  2007）において特許可能な主題の範囲外であると見出されたタイプの一時的な媒体のみを含まないとして解釈されるべきである。上記の組合せも、コンピュータ読み取り可能な媒体の範囲に含まれ得る。
【０１４８】
コンピュータ実行可能な命令は、例えば、汎用コンピュータ、専用コンピュータ、又は専用処理デバイス（例えば１つ以上のプロセッサ）に所定の機能又は機能群を実行させる命令及びデータを含み得る。主題が、構造的特徴及び／又は方法的動作に特有の言葉で説明されているが、請求項において定められる主題は、必ずしも、上述した特定の特徴又は動作に限定されるものではないことを理解されたい。そうではなく、上述した特定の特徴及び動作は、請求項を実施する例示的な形態として開示されている。
【０１４９】
本開示において使用される場合、「モジュール」又は「コンポーネント」という用語は、モジュール又はコンポーネントの動作を実行するよう構成されている特定のハードウェア実装、及び／又は、コンピューティングシステムの汎用ハードウェア（例えば、コンピュータ読み取り可能な媒体等）に記憶され得る且つ／又はコンピューティングシステムの汎用ハードウェア（例えば、処理デバイス等）により実行され得るソフトウェアオブジェクト又はソフトウェアルーチンを指し得る。いくつかの実施形態において、本開示に記載の異なるコンポーネント、モジュール、エンジン、及びサービスは、コンピューティングシステム上で実行されるオブジェクト又はプロセスとして（例えば、別個のスレッドとして）実装され得る。
【０１５０】
本開示に記載のシステム及び方法のうちの一部は、（汎用ハードウェアに記憶される且つ／又は汎用ハードウェアにより実行される）ソフトウェアにより実装されるとして一般に説明されるが、特定のハードウェア実装又はソフトウェアと特定のハードウェア実装との組合せも可能であり企図されている。本説明において、「コンピューティングエンティティ」は、本開示において前に定義された任意のコンピューティングシステム、又は、コンピューティングシステム上で動作する任意のモジュール又はモジュールの組合せであり得る。
【０１５１】
本開示及び特に請求項（例えば、請求項の本体部分）において使用される用語は、一般に、「オープンな」用語であるとして意図される（例えば、「〜を備える」という用語は、「〜を備えるが、〜に限定されるものではない」として解釈されるべきであり、「〜を有する」という用語は、「少なくとも〜を有する」として解釈されるべきであり、「〜を含む」という用語は、「〜を含むが、〜に限定されるものではない」として解釈されるべきである、等）。
【０１５２】
さらに、導入される請求項記載事項の特定の数が意図される場合、そのような意図は、当該請求項中に明示的に記載され、そのような記載がない場合、そのような意図は存在しない。例えば、理解の助けとして、請求項中に、請求項記載事項を導入するための「少なくとも１つの」及び「１つ以上の」といった導入句の使用が含まれることがある。しかしながら、このような導入句の使用は、「a」又は「an」といった不定冠詞による請求項記載事項の導入が、同一の請求項中に「１つ以上の」又は「少なくとも１つの」といった導入句と「a」又は「an」といった不定冠詞とが含まれるとしても、当該導入された請求項記載事項を含む特定の請求項が、当該請求項記載事項を１つしか含まない実施形態に限定されることを意味するとして解釈されるべきではない（例えば、「a」及び／又は「an」は、「少なくとも１つの」又は「１つ以上の」を意味するとして解釈されるべきである）。請求項記載事項を導入するために使用される定冠詞の使用についても同じことが当てはまる。
【０１５３】
さらに、導入される請求項記載事項の特定の数が明示的に記載されている場合であっても、そのような記載は、少なくとも記載されている数を意味するとして解釈されるべきである（例えば、他の修飾語のない「２つの記載事項」という単なる記載は、少なくとも２つの記載事項又は２つ以上の記載事項を意味する）ことが、当業者であれば認識されよう。さらに、「Ａ、Ｂ、及びＣ等のうちの少なくとも１つ」又は「Ａ、Ｂ、及びＣ等のうちの１つ以上」に類する表記が使用される場合、一般に、そのような構造は、Ａのみ、Ｂのみ、Ｃのみ、Ａ及びＢの両方、Ａ及びＣの両方、Ｂ及びＣの両方、又は、Ａ、Ｂ、及びＣの全て、等を含むことが意図される。例えば、「及び／又は」という用語の使用は、このように解釈されることが意図される。
【０１５４】
さらに、２つ以上の選択可能な用語を表すいかなる離接語又は離接句も、明細書、特許請求の範囲、又は図面のいずれであろうと、それら用語のうちの１つ、それらの用語の組合せ、又は、それらの用語の全てを含む可能性を意図するとして理解されるべきである。例えば、「Ａ又はＢ」という句は、「Ａ」若しくは「Ｂ」又は「Ａ及びＢ」の可能性を含むとして理解されるべきである。
【０１５５】
さらに、「第１の」、「第２の」、「第３の」等といった用語は、本開示において、特定の順序又は数の要素を意味するように必ずしも使用されるとは限らない。一般に、「第１の」、「第２の」、「第３の」等といった用語は、共通識別子としての異なる要素を区別するために使用される。「第１の」、「第２の」、「第３の」等といった用語が特定の順序を意味するという説明がなければ、これらの用語は、特定の順序を意味するとして理解されるべきではない。さらに、「第１の」、「第２の」、「第３の」等といった用語が特定の数の要素を意味するという説明がなければ、これらの用語は、特定の数の要素を意味するとして理解されるべきではない。例えば、第１のウィジェットは、第１のサイドを有するとして記載されることがあり、第２のウィジェットは、第２のサイドを有するとして記載されることがある。第２のウィジェットに関する「第２のサイド」という用語の使用は、第２のウィジェットの当該サイドを、第１のウィジェットの「第１のサイド」と区別するものであり、第２のウィジェットが２つのサイドを有することを意味するものではない。
【０１５６】
本開示において記載された全ての例及び条件付き文言は、当該技術を促進させるために本発明者によって寄与されるコンセプト及び本発明を読者が理解するのを助ける教育上の目的のために意図され、そのような具体的に記載された例及び条件に限定されるものではないとして解釈されるべきである。本開示の実施形態が詳細に説明されたが、それら実施形態に対する様々な変形、置換、及び変更が、本開示の主旨及び範囲から逸脱することなく可能であることを理解されたい。
【０１５７】
以上の実施形態に関し、さらに以下の付記を開示する。
【０１５８】
（付記１）
抽象コードグラフを生成する方法であって、
ソースコードの構成要素と、前記ソースコード内の前記構成要素の間の関係と、を表現する抽象構文木（AST）を得るステップであって、前記抽象構文木は、
前記ソースコード内の第１の位置に配置されている第１の構成要素を表現する第１のASTノードであって、前記第１の構成要素を第１の抽象度で表現する第１のASTノードと、
前記ソースコード内の第２の位置に配置されている第２の構成要素を表現する第２のASTノードであって、前記第１のASTノードは、前記第１の位置における前記第１の構成要素と前記第２の位置における前記第２の構成要素との間の関係を表現するように、前記抽象構文木において前記第２のASTノードに連結される、第２のASTノードと、
を含む、ステップと、
前記抽象構文木に基づいて、抽象コードグラフ（ACG）を生成するステップであって、
前記第１のASTノードに基づいて、前記第１の構成要素を前記第１の抽象度で表現する第１のACGノードを生成することと、
前記第２のASTノードに基づいて、第２のACGノードを生成することと、
前記第１のACGノードに基づいて、前記第１の構成要素を第２の抽象度で表現する第３のACGノードを生成することであって、前記第２の抽象度は、前記第１の抽象度よりも抽象的であり、前記第３のACGノードは、前記第２のACGノードが前記抽象コードグラフにおいて前記第３のACGノードを介して前記第１のACGノードに関連するように、前記第１のACGノードと前記第２のACGノードとの間に連結され、前記第１のACGノードと前記第２のACGノードとの間の関連は、前記第１のASTノードが前記抽象構文木において前記第２のASTノードに連結されていることに基づく、生成することと、
を含むステップと、
を含む、方法。
【０１５９】
（付記２）
前記抽象構文木は、前記ソースコード内の第３の位置に配置されている前記第１の構成要素を表現する第３のASTノードであって、前記第１の構成要素を前記第１の抽象度で表現する第３のASTノードをさらに含み、
前記第１のASTノードに基づいて、前記第１のACGノードを生成することは、前記第１のASTノード及び前記第３のASTノードの両方が前記第１の構成要素を前記第１の抽象度で表現していることに応じて、前記第１のASTノードと前記第３のASTノードとを前記第１のACGノードへとマージすることを含む、付記１に記載の方法。
【０１６０】
（付記３）
前記抽象構文木は、前記ソースコード内の第３の位置に配置されている第３の構成要素を表現する第３のASTノードをさらに含み、
前記抽象構文木は、前記ソースコード内の第４の位置に配置されている前記第１の構成要素を表現する第４のASTノードであって、前記第１の構成要素を前記第１の抽象度で表現する第４のASTノードをさらに含み、前記第３のASTノードは、前記第３の位置における前記第３の構成要素と前記第４の位置における前記第１の構成要素との間の関係を表現するように、前記抽象構文木において前記第４のASTノードに連結され、
前記抽象コードグラフを生成する前記ステップは、
前記第４のASTノードに基づいて、前記第１の構成要素を前記第１の抽象度で表現する第４のACGノードを生成することと、
前記第３のASTノードに基づいて、第５のACGノードを生成することと、
前記第４のACGノードに基づいて、前記第１の構成要素を前記第２の抽象度で表現する第６のACGノードを生成することであって、前記第６のACGノードは、前記第４のACGノードが前記抽象コードグラフにおいて前記第６のACGノードを介して前記第５のACGノードに関連するように、前記第４のACGノードと前記第５のACGノードとの間に連結され、前記第４のACGノードと前記第５のACGノードとの間の関連は、前記第４のASTノードが前記抽象構文木において前記第３のASTノードに連結されていることに基づく、生成することと、
前記第１のACGノード及び前記第４のACGノードの両方が前記第１の構成要素を前記第１の抽象度で表現していることに応じて、前記第１のACGノードと前記第４のACGノードとを、前記第１の構成要素を前記第１の抽象度で表現する第７のACGノードへとマージすることと、
前記第３のACGノード及び前記第６のACGノードの両方が前記第１の構成要素を前記第２の抽象度で表現していることに応じて、前記第３のACGノードと前記第６のACGノードとを、前記第１の構成要素を前記第２の抽象度で表現する第８のACGノードへとマージすることと、
をさらに含む、付記１に記載の方法。
【０１６１】
（付記４）
前記抽象構文木は、差分抽象構文木を含み、
前記差分抽象構文木は、
前記ソースコードの前記構成要素と、
前記ソースコード内の前記構成要素の間の前記関係と、
他のソースコードの他の構成要素と、
前記他のソースコード内の前記他の構成要素の間の関係と、
前記構成要素と前記他の構成要素との間の関係と、
を表現し、
前記方法は、
前記差分抽象構文木を生成するステップであって、
前記ソースコードの前記構成要素と、前記ソースコード内の前記構成要素の間の前記関係と、を表現する第１の抽象構文木を得ることであって、前記第１の抽象構文木は、前記ソースコード内の第３の位置に配置されている第３の構成要素を表現する第３のASTノードを含む、得ることと、
前記他のソースコードの前記他の構成要素と、前記他のソースコード内の前記他の構成要素の間の前記関係と、を表現する第２の抽象構文木を得ることであって、前記第２の抽象構文木は、前記他のソースコード内の第４の位置に配置されている前記第３の構成要素を表現する第４のASTノードを含む、得ることと、
前記第３のASTノード及び前記第４のASTノードの両方が前記第３の構成要素を表現していることに応じて、前記第３のASTノードと前記第４のASTノードとを、前記第３の構成要素を表現する、前記差分抽象構文木の第５のASTノードへとマージすることと、
を含む、ステップ
をさらに含む、付記１に記載の方法。
【０１６２】
（付記５）
前記抽象コードグラフを、複数の既存のソフトウェアプログラムに基づく複数の抽象コードグラフと比較するステップと、
前記抽象コードグラフを前記複数の抽象コードグラフと比較したことに基づいて、前記複数の既存のソフトウェアプログラムの中での、前記抽象コードグラフに対応するコードパターンの出現を識別するステップと、
前記出現を識別したことに基づいて、前記ソースコードについてデバッグ動作を実行するステップと、
をさらに含む、付記１に記載の方法。
【０１６３】
（付記６）
１つ以上のサブグラフルールに従って、前記抽象コードグラフのサブグラフを得るステップであって、前記サブグラフは、１つ以上のACGノードを含む、ステップ
をさらに含む、付記１に記載の方法。
【０１６４】
（付記７）
前記１つ以上のサブグラフルールに従って、全ての可能なサブグラフを得るステップ
をさらに含む、付記６に記載の方法。
【０１６５】
（付記８）
前記サブグラフは、前記サブグラフのリーフノードである１つ以上のスプリットノードを含み、前記１つ以上のサブグラフルールは、前記抽象コードグラフのルートノードから前記抽象コードグラフのリーフノードへの、前記抽象コードグラフにおける全ての可能なパスが、前記サブグラフのスプリットノードと相関する、前記抽象コードグラフにおける１つのノードしか含まないことを含む、付記６に記載の方法。
【０１６６】
（付記９）
前記サブグラフを、複数の既存のソフトウェアプログラムに基づく複数のサブグラフと比較するステップと、
前記サブグラフを前記複数のサブグラフと比較したことに基づいて、前記複数の既存のソフトウェアプログラムの中での、前記サブグラフに対応するコードパターンの出現を識別するステップと、
前記出現を識別したことに基づいて、前記ソースコードについてデバッグ動作を実行するステップと、
をさらに含む、付記６に記載の方法。
【０１６７】
（付記１０）
システムに複数の動作を実行させるよう構成されているコンピュータ実行可能な命令を含む１つ以上のコンピュータ読み取り可能な記憶媒体であって、前記複数の動作は、
ソースコードの構成要素と、前記ソースコード内の前記構成要素の間の関係と、を表現する抽象構文木（AST）を得る動作であって、前記抽象構文木は、
前記ソースコード内の第１の位置に配置されている第１の構成要素を表現する第１のASTノードであって、前記第１の構成要素を第１の抽象度で表現する第１のASTノードと、
前記ソースコード内の第２の位置に配置されている第２の構成要素を表現する第２のASTノードであって、前記第１のASTノードは、前記第１の位置における前記第１の構成要素と前記第２の位置における前記第２の構成要素との間の関係を表現するように、前記抽象構文木において前記第２のASTノードに連結される、第２のASTノードと、
を含む、動作と、
前記抽象構文木に基づいて、抽象コードグラフ（ACG）を生成する動作であって、
前記第１のASTノードに基づいて、前記第１の構成要素を前記第１の抽象度で表現する第１のACGノードを生成することと、
前記第２のASTノードに基づいて、第２のACGノードを生成することと、
前記第１のACGノードに基づいて、前記第１の構成要素を第２の抽象度で表現する第３のACGノードを生成することであって、前記第２の抽象度は、前記第１の抽象度よりも抽象的であり、前記第３のACGノードは、前記第２のACGノードが前記抽象コードグラフにおいて前記第３のACGノードを介して前記第１のACGノードに関連するように、前記第１のACGノードと前記第２のACGノードとの間に連結され、前記第１のACGノードと前記第２のACGノードとの間の関連は、前記第１のASTノードが前記抽象構文木において前記第２のASTノードに連結されていることに基づく、生成することと、
を含む動作と、
を含む、１つ以上のコンピュータ読み取り可能な記憶媒体。
【０１６８】
（付記１１）
前記抽象構文木は、前記ソースコード内の第３の位置に配置されている前記第１の構成要素を表現する第３のASTノードであって、前記第１の構成要素を前記第１の抽象度で表現する第３のASTノードをさらに含み、
前記第１のASTノードに基づいて、前記第１のACGノードを生成することは、前記第１のASTノード及び前記第３のASTノードの両方が前記第１の構成要素を前記第１の抽象度で表現していることに応じて、前記第１のASTノードと前記第３のASTノードとを前記第１のACGノードへとマージすることを含む、付記１０に記載の１つ以上のコンピュータ読み取り可能な記憶媒体。
【０１６９】
（付記１２）
前記抽象構文木は、前記ソースコード内の第３の位置に配置されている第３の構成要素を表現する第３のASTノードをさらに含み、
前記抽象構文木は、前記ソースコード内の第４の位置に配置されている前記第１の構成要素を表現する第４のASTノードであって、前記第１の構成要素を前記第１の抽象度で表現する第４のASTノードをさらに含み、前記第３のASTノードは、前記第３の位置における前記第３の構成要素と前記第４の位置における前記第１の構成要素との間の関係を表現するように、前記抽象構文木において前記第４のASTノードに連結され、
前記抽象コードグラフを生成する前記動作は、
前記第４のASTノードに基づいて、前記第１の構成要素を前記第１の抽象度で表現する第４のACGノードを生成することと、
前記第３のASTノードに基づいて、第５のACGノードを生成することと、
前記第４のACGノードに基づいて、前記第１の構成要素を前記第２の抽象度で表現する第６のACGノードを生成することであって、前記第６のACGノードは、前記第４のACGノードが前記抽象コードグラフにおいて前記第６のACGノードを介して前記第５のACGノードに関連するように、前記第４のACGノードと前記第５のACGノードとの間に連結され、前記第４のACGノードと前記第５のACGノードとの間の関連は、前記第４のASTノードが前記抽象構文木において前記第３のASTノードに連結されていることに基づく、生成することと、
前記第１のACGノード及び前記第４のACGノードの両方が前記第１の構成要素を前記第１の抽象度で表現していることに応じて、前記第１のACGノードと前記第４のACGノードとを、前記第１の構成要素を前記第１の抽象度で表現する第７のACGノードへとマージすることと、
前記第３のACGノード及び前記第６のACGノードの両方が前記第１の構成要素を前記第２の抽象度で表現していることに応じて、前記第３のACGノードと前記第６のACGノードとを、前記第１の構成要素を前記第２の抽象度で表現する第８のACGノードへとマージすることと、
をさらに含む、付記１０に記載の１つ以上のコンピュータ読み取り可能な記憶媒体。
【０１７０】
（付記１３）
前記抽象構文木は、差分抽象構文木を含み、
前記差分抽象構文木は、
前記ソースコードの前記構成要素と、
前記ソースコード内の前記構成要素の間の前記関係と、
他のソースコードの他の構成要素と、
前記他のソースコード内の前記他の構成要素の間の関係と、
前記構成要素と前記他の構成要素との間の関係と、
を表現し、
前記複数の動作は、
前記差分抽象構文木を生成する動作であって、
前記ソースコードの前記構成要素と、前記ソースコード内の前記構成要素の間の前記関係と、を表現する第１の抽象構文木を得ることであって、前記第１の抽象構文木は、前記ソースコード内の第３の位置に配置されている第３の構成要素を表現する第３のASTノードを含む、得ることと、
前記他のソースコードの前記他の構成要素と、前記他のソースコード内の前記他の構成要素の間の前記関係と、を表現する第２の抽象構文木を得ることであって、前記第２の抽象構文木は、前記他のソースコード内の第４の位置に配置されている前記第３の構成要素を表現する第４のASTノードを含む、得ることと、
前記第３のASTノード及び前記第４のASTノードの両方が前記第３の構成要素を表現していることに応じて、前記第３のASTノードと前記第４のASTノードとを、前記第３の構成要素を表現する、前記差分抽象構文木の第５のASTノードへとマージすることと、
を含む、動作
をさらに含む、付記１０に記載の１つ以上のコンピュータ読み取り可能な記憶媒体。
【０１７１】
（付記１４）
前記複数の動作は、
前記抽象コードグラフを、複数の既存のソフトウェアプログラムに基づく複数の抽象コードグラフと比較する動作と、
前記抽象コードグラフを前記複数の抽象コードグラフと比較したことに基づいて、前記複数の既存のソフトウェアプログラムの中での、前記抽象コードグラフに対応するコードパターンの出現を識別する動作と、
前記出現を識別したことに基づいて、前記ソースコードについてデバッグ動作を実行する動作と、
をさらに含む、付記１０に記載の１つ以上のコンピュータ読み取り可能な記憶媒体。
【０１７２】
（付記１５）
前記複数の動作は、
１つ以上のサブグラフルールに従って、前記抽象コードグラフのサブグラフを得る動作であって、前記サブグラフは、１つ以上のACGノードを含む、動作
をさらに含む、付記１０に記載の１つ以上のコンピュータ読み取り可能な記憶媒体。
【０１７３】
（付記１６）
前記サブグラフは、前記サブグラフのリーフノードである１つ以上のスプリットノードを含み、前記１つ以上のサブグラフルールは、前記抽象コードグラフのルートノードから前記抽象コードグラフのリーフノードへの、前記抽象コードグラフにおける全ての可能なパスが、前記サブグラフのスプリットノードと相関する、前記抽象コードグラフにおける１つのノードしか含まないことを含む、付記１５に記載の１つ以上のコンピュータ読み取り可能な記憶媒体。
【０１７４】
（付記１７）
前記複数の動作は、
前記サブグラフを、複数の既存のソフトウェアプログラムに基づく複数のサブグラフと比較する動作と、
前記サブグラフを前記複数のサブグラフと比較したことに基づいて、前記複数の既存のソフトウェアプログラムの中での、前記サブグラフに対応するコードパターンの出現を識別する動作と、
前記出現を識別したことに基づいて、前記ソースコードについてデバッグ動作を実行する動作と、
をさらに含む、付記１５に記載の１つ以上のコンピュータ読み取り可能な記憶媒体。
【０１７５】
（付記１８）
システムであって、
１つ以上のプロセッサと、
前記１つ以上のプロセッサに通信可能に接続され、命令を記憶している１つ以上のコンピュータ読み取り可能な記憶媒体であって、前記命令は、前記１つ以上のプロセッサによる実行に応じて、前記システムに複数の動作を実行させるよう構成されており、前記複数の動作は、
ソースコードの構成要素と、前記ソースコード内の前記構成要素の間の関係と、を表現する抽象構文木（AST）を得る動作であって、前記抽象構文木は、
前記ソースコード内の第１の位置に配置されている第１の構成要素を表現する第１のASTノードであって、前記第１の構成要素を第１の抽象度で表現する第１のASTノードと、
前記ソースコード内の第２の位置に配置されている第２の構成要素を表現する第２のASTノードであって、前記第１のASTノードは、前記第１の位置における前記第１の構成要素と前記第２の位置における前記第２の構成要素との間の関係を表現するように、前記抽象構文木において前記第２のASTノードに連結される、第２のASTノードと、
を含む、動作と、
前記抽象構文木に基づいて、抽象コードグラフ（ACG）を生成する動作であって、
前記第１のASTノードに基づいて、前記第１の構成要素を前記第１の抽象度で表現する第１のACGノードを生成することと、
前記第２のASTノードに基づいて、第２のACGノードを生成することと、
前記第１のACGノードに基づいて、前記第１の構成要素を第２の抽象度で表現する第３のACGノードを生成することであって、前記第２の抽象度は、前記第１の抽象度よりも抽象的であり、前記第３のACGノードは、前記第２のACGノードが前記抽象コードグラフにおいて前記第３のACGノードを介して前記第１のACGノードに関連するように、前記第１のACGノードと前記第２のACGノードとの間に連結され、前記第１のACGノードと前記第２のACGノードとの間の関連は、前記第１のASTノードが前記抽象構文木において前記第２のASTノードに連結されていることに基づく、生成することと、
を含む動作と、
を含む、１つ以上のコンピュータ読み取り可能な記憶媒体と、
を有する、システム。
【０１７６】
（付記１９）
前記抽象構文木は、前記ソースコード内の第３の位置に配置されている前記第１の構成要素を表現する第３のASTノードであって、前記第１の構成要素を前記第１の抽象度で表現する第３のASTノードをさらに含み、
前記第１のASTノードに基づいて、前記第１のACGノードを生成することは、前記第１のASTノード及び前記第３のASTノードの両方が前記第１の構成要素を前記第１の抽象度で表現していることに応じて、前記第１のASTノードと前記第３のASTノードとを前記第１のACGノードへとマージすることを含む、付記１８に記載のシステム。
【０１７７】
（付記２０）
前記抽象構文木は、前記ソースコード内の第３の位置に配置されている第３の構成要素を表現する第３のASTノードをさらに含み、
前記抽象構文木は、前記ソースコード内の第４の位置に配置されている前記第１の構成要素を表現する第４のASTノードであって、前記第１の構成要素を前記第１の抽象度で表現する第４のASTノードをさらに含み、前記第３のASTノードは、前記第３の位置における前記第３の構成要素と前記第４の位置における前記第１の構成要素との間の関係を表現するように、前記抽象構文木において前記第４のASTノードに連結され、
前記抽象コードグラフを生成する前記動作は、
前記第４のASTノードに基づいて、前記第１の構成要素を前記第１の抽象度で表現する第４のACGノードを生成することと、
前記第３のASTノードに基づいて、第５のACGノードを生成することと、
前記第４のACGノードに基づいて、前記第１の構成要素を前記第２の抽象度で表現する第６のACGノードを生成することであって、前記第６のACGノードは、前記第４のACGノードが前記抽象コードグラフにおいて前記第６のACGノードを介して前記第５のACGノードに関連するように、前記第４のACGノードと前記第５のACGノードとの間に連結され、前記第４のACGノードと前記第５のACGノードとの間の関連は、前記第４のASTノードが前記抽象構文木において前記第３のASTノードに連結されていることに基づく、生成することと、
前記第１のACGノード及び前記第４のACGノードの両方が前記第１の構成要素を前記第１の抽象度で表現していることに応じて、前記第１のACGノードと前記第４のACGノードとを、前記第１の構成要素を前記第１の抽象度で表現する第７のACGノードへとマージすることと、
前記第３のACGノード及び前記第６のACGノードの両方が前記第１の構成要素を前記第２の抽象度で表現していることに応じて、前記第３のACGノードと前記第６のACGノードとを、前記第１の構成要素を前記第２の抽象度で表現する第８のACGノードへとマージすることと、
をさらに含む、付記１８に記載のシステム。
【符号の説明】
【０１７８】
１００  システム
１１０  抽象構文木
１２０  抽象コードグラフ生成器
１３０  抽象コードグラフ
１４０  サブグラフ生成器
１５０  １つ以上のサブグラフ
１６０  抽象コードグラフ解析器
２００  コンピューティングシステム
２０２  プロセッサ
２０４  メモリ
２０６  データストレージ
２０８  通信ユニット
【図１Ａ】
2019160284.tif 000003
【図１Ｂ】
2019160284.tif 000004
【図１Ｃ】
2019160284.tif 000005
【図１Ｄ】
2019160284.tif 000006
【図１Ｅ】
2019160284.tif 000007
【図１Ｆ】
2019160284.tif 000008
【図１Ｇ】
2019160284.tif 000009
【図１Ｈ】
2019160284.tif 000010
【図２】
2019160284.tif 000011
【図３】
2019160284.tif 000012