2つ以上のソフトウェアプログラムを比較することは、ソフトウェアの開発、デバッグ、及び/又はテストにとって有用であり得る。例えば、ソフトウェア開発ツールは、2つ以上のソフトウェアプログラムの間の比較を用いて、ソフトウェア開発のいくつかの側面を支援又は自動化することができる。
ソフトウェアプログラムを比較するとき、ソフトウェアプログラムのソースコードそのものを比較することよりも、ソフトウェアプログラムのソースコードの抽象的表現を比較することの方が有用であることがある。本開示のいくつかの実施形態は、ソフトウェアプログラムの抽象的表現であり得る抽象コードグラフを生成することに関する。本開示において、「抽象化する」という用語は、ソースコードの抽象的表現を用いてソースコードを表現するプロセス又は抽象的表現を生成するプロセスを指し得る。本開示において、「抽象的概念」という用語は、抽象的表現を指し得る。
抽象的表現を用いてソフトウェアプログラムを表現するとき、ソフトウェアプログラムを表現する2つ以上の方法が存在し得る。例えば、ソフトウェアプログラムは、複数の抽象度で表現され得る。例えば、ソフトウェアプログラムの高い抽象的表現は、ソフトウェアプログラムの機能全体を表現し得る。ソフトウェアプログラムのより低い抽象的表現は、ソフトウェアプログラムのソースコードの行の表現を含み得る。ソフトウェアプログラムのさらに低い抽象的表現は、ソフトウェアプログラムのソースコードの構成要素の表現を含み得る。本開示において、「抽象(的)」という用語及び「具象(的)」という用語は、いずれもソフトウェアプログラムの表現の抽象度を指す対義語である。本開示において、最低抽象度又は具象的という抽象度である具象的抽象度は、抽象化されていない文字通りの表現を含み得る。本開示において、「抽象(的)」という用語は、ある一般化レベルを指し得る。本開示において、「構成要素」という用語は、ソースコードの要素を指し得、例えば、「構成要素」は、ソースコードの構文(syntactic)ワード又はトークンを指し得る。
2つ以上の方法でソフトウェアプログラムを表現する別の例について、構文フレーズ内の構成要素が、異なる抽象度で表現され得る。例えば、いくつかの例において、コード行「closable.close();」の抽象的概念は、「closable」が抽象的概念「var」により表現され、「close()」が「close」として文字通りに表現され得るように、され得る。追加的又は代替的に、コード行「closable.close();」の別の抽象的概念は、「closable」が文字通りに表現され、「close()」が抽象的概念「MethodCall」により表現され得るように、されることもある。したがって、「closable.close();」の例示的な2つの非限定的な抽象的概念は、「var.close」及び「closable.MethodCall」であり得る。
ソフトウェアプログラムの抽象的表現は、特定のソフトウェアプログラムと他のソフトウェアプログラムとの比較から、文字通りの特定のソフトウェアプログラムと他のソフトウェアプログラムとの比較よりも意味のある結果をもたらすことを可能にし得る。例えば、いくつかの例において、変数名が取り除かれたソフトウェアプログラムの抽象的表現を比較することが有用であり得る。例えば、文字通りのコード行「closable.close();」と別の文字通りのコード行「foo.close();」との比較は、変数名の差異に起因して一致しないとして報告され得る。一方、変数名が取り除かれると、「var.close();」という抽象的表現と「var.close();」という抽象的表現とは、相関を有し得、したがって、これらの抽象的表現の間の比較は、より意味のあるものであり得る。
以下でさらに詳細に説明されるように、本開示のいくつかの実施形態において、1つ以上の抽象コードグラフが、特定のソフトウェアプログラムについて生成され得る。抽象コードグラフは、以下で詳細に説明されるように、特定のソフトウェアプログラム及びその対応する構成要素を異なる抽象度で表現し得、特定のソフトウェアプログラムの異なるタイプの解析を実行することを可能にし得る。
例えば、多数の既存のソフトウェアプログラム(例えば、数千、数万、数十万、数百万といった既存のソフトウェアプログラム)を含み得る、既存のソフトウェアプログラムのリポジトリが存在し得る。本開示において、例えば1つ以上のリポジトリにおいて、解析のために利用可能であり得る既存のソフトウェアプログラム及びこれらの対応するソースコードは、「ビッグコード(big code)」と呼ばれ得る。本開示のシステム又は動作を用いて、ビッグコードの抽象コードグラフを生成することができる。ビッグコードの抽象コードグラフを解析して、頻繁に出現する抽象コードグラフを識別することができ、これは、ビッグコードにおける頻繁に出現するコードパターンを示し得る。本開示において、ビッグコードにおける頻繁に出現するコードパターンは、「頻出コードパターン」と呼ばれ得る。例えば、いくつかの頻出コードパターンは、例えば、事前条件の欠落といった、フォールト、エラー、又は脆弱性に関連し得る、あるいは、このようなフォールト、エラー、又は脆弱性を含み得る。他の頻出コードパターンは、フォールト、エラー、又は脆弱性に関連し得る修正又はパッチに関連し得る。
開発、デバッグ、及び/又はテストされているソフトウェアプログラムを解析することは有用であり得る。本開示において、開発、デバッグ、及び/又はテストされているソフトウェアプログラムは、「テスト対象ソフトウェア」と呼ばれ得る。テスト対象ソフトウェアを、例えばフォールト、エラー、又は脆弱性に関連する頻出コードパターン等の頻出コードパターンと比較することは有用であり得る。本開示のシステム又は動作を用いて、テスト対象ソフトウェアの抽象コードグラフを生成することができる。本開示のシステム又は動作を用いて、テスト対象ソフトウェアの1つ以上の抽象コードグラフを、ビッグコードの1つ以上の抽象コードグラフ又は1つ以上の頻出コードパターンと比較することができる。
テスト対象ソフトウェアの抽象コードグラフ及び/又はビッグコードの抽象コードグラフは、ソフトウェアの開発、デバッグ、及び/又はテストにとって有用であり得る。例えば、ソフトウェア開発ツールは、抽象コードグラフを使用して、ソフトウェア開発者を支援することができる。例えば、統合開発環境は、開発されているソフトウェアプログラムの抽象コードグラフを解析し、抽象コードグラフにより示され得る、ソフトウェアプログラムの側面について、開発者を促すことができる。追加的又は代替的に、ソフトウェア開発ツールは、抽象コードグラフを使用して、ソフトウェアの開発、テスト、及び/又はデバッグのいくつかの側面を自動化することもある。例えば、ソフトウェア開発ツールは、テスト対象ソフトウェアの抽象コードグラフを、ビッグコードの1つ以上の抽象コードグラフと比較することにより、バグ、エラー、又は脆弱性について、テスト対象ソフトウェアをテストすることができる。追加的又は代替的に、ソフトウェア開発ツールは、ソフトウェアプログラムにおけるバグ、エラー、又は脆弱性を修復することに関与することもある。例えば、ソフトウェア開発ツールは、例えば、参照によりその全体が本明細書に組み込まれる、2017年11月24日に出願された米国特許出願第15/822106号に記載されているように、抽象コードグラフに基づいて修復候補を識別することができる。
図1Aは、本開示に記載の少なくとも1つの実施形態に従って抽象コードグラフ130を生成するよう構成されている例示的なシステム100のブロック図である。システム100は、抽象構文木110に基づいて抽象コードグラフ130を生成するよう構成され得る。さらに、システム100は、本開示に記載の少なくとも1つの実施形態に従って、抽象コードグラフ130の1つ以上のサブグラフ150を生成するよう構成され得る。これらの実施形態又は他の実施形態において、システム100は、抽象コードグラフ130及び/又は1つ以上のサブグラフ150のうちの1つ以上を解析するよう構成され得る。
いくつかの実施形態において、抽象構文木110は、ソースコードの構成要素をノードとして表現し、構成要素間の関係をノード間のリンクとして表現する概念マッピング又はグラフを含み得る。
例えば、図1Bは、本開示に記載の少なくとも1つの実施形態に従った例示的な抽象構文木110Aを示している。抽象構文木110Aは、図1Aの抽象構文木110の例であり得る。図示されているが、抽象構文木110Aは概念的であり得る。例えば、抽象構文木110Aは、テーブル、リスト、又は他のデータ構造として、コンピュータメモリに記憶され得る。
いくつかの実施形態において、抽象構文木110Aは、ルートノード103A、1つ以上のブランチノード106、及び1つ以上のリーフノード109を含み得る。図1Bにおいて、ブランチノード106A及びブランチノード106Bという2つのブランチノードが示されている(これらは、集合的にブランチノード106と呼ばれる且つ/又は個々にブランチノード106と呼ばれる)。図1Bにおいて、リーフノード109A、リーフノード109B、リーフノード109C、リーフノード109D、及びリーフノード109Eという5つのリーフノードが示されている(これらは、集合的にリーフノード109と呼ばれる且つ/又は個々にリーフノード109と呼ばれる)。しかしながら、ブランチノード及び/又はリーフノードの数は、異なる実装に応じて変わり得る。
いくつかの実施形態において、抽象構文木110Aは、抽象構文木110Aを生成し得るコンパイラから得られ得る。追加的又は代替的に、抽象構文木110Aは、何らかの他のソースから得られることもある。追加的又は代替的に、システム100が、ソースコードから抽象構文木110Aを生成することもある。
いくつかの実施形態において、抽象構文木110Aは、ソースコードの1つ以上の構文フレーズを表現し得る。いくつかの実施形態において、例えば、ルートノード103A、ブランチノード106、及びリーフノード109等の各ノードは、ソースコードの1つの構成要素を表現し得る。いくつかの実施形態において、抽象構文木110Aのノードは、構成要素を第1の抽象度で表現し得る。いくつかの実施形態において、抽象構文木110Aは、構成要素を、具象的抽象度で、すなわち、文字通りに、表現し得る。
いくつかの実施形態において、各ノードは、ソースコードの1つの位置において見つけられた1つの構成要素を表現し得る。例えば、特定の構成要素は、ソースコードの構文フレーズ内で2回出現することがある。この構文フレーズを表現する抽象構文木110Aは、特定の構成要素が構文フレーズ内の異なる位置において見つけられたので、特定の構成要素をそれぞれ表現する2つのノードを含み得る。そのような場合、特定の構成要素を表現する2つのノードの間の連結は、異なり得、構文フレーズ内の構成要素の位置における差異を表現し得る。
例えば、図1Bを参照すると、抽象構文木110Aは、ソースコード「if (closable != null) closable.close();」を表現し得る。ルートノード103Aは、構成要素「if」を「IfStmt」として表現し得る。ブランチノード106Aは、構成要素「!=」を「Op !=」として表現し得る。リーフノード109Aは、ソースコード内の第1の位置における構成要素「closable」を「Var closable」として表現し得る。リーフノード109Bは、構成要素「null」を「Const null」として表現し得る。ブランチノード106Bは、構成要素「close()」を「MethodCall」として表現し得る。リーフノード109Cは、ソースコード内の第2の位置における構成要素「closable」を「Var closable」として表現し得る。リーフノード109Dは、構成要素「close()」を「Id close」として表現し得る。リーフノード109Eは、「close()」のリターンの構成要素を「Void」として表現し得る。
図示されている例において、リーフノード109A及びリーフノード109Cの両方ともが、構成要素「closable」を表現し得る。リーフノード109Aは、ソースコード内の第1の位置における構成要素「closable」を表現し、リーフノード109Cは、ソースコード内の第2の位置における構成要素「closable」を表現する。リーフノード109Aは、ソースコード内の第1の位置における構成要素「closable」とソースコード内の構成要素「!=」との間の関係を表現するブランチノード106Aに連結され得る。リーフノード109Cは、ソースコード内の第2の位置における構成要素「closable」とソースコード内の構成要素「close()」との間の関係を表すブランチノード106Bに連結され得る。
本開示の範囲から逸脱することなく、抽象構文木110Aに対して、変更、追加、又は省略が可能である。ブランチノード106の1つのレイヤのみを用いて図示されているが、抽象構文木110Aは、ブランチノード106の任意の数のレイヤを含んでもよい。いくつかの実施形態において、図1Aの抽象構文木110は、図1C及び図1Dを参照してより詳細に説明される差分(difference)抽象構文木であり得る。
図1Cは、本開示に記載の少なくとも1つの実施形態に従った例示的な抽象構文木110B及び例示的な抽象構文木110Cを示している。抽象構文木110B及び抽象構文木110Cは各々、上述した図1Aの抽象構文木110の例であり得る。抽象構文木110Bは、第1のソースコードの第1の構成要素と、第1のソースコードの第1の構成要素の間の関係と、の表現を含み得る。抽象構文木110Cは、第2のソースコードの第2の構成要素と、第2のソースコードの第2の構成要素の間の関係と、の表現を含み得る。
いくつかの実施形態において、抽象構文木110Bは、ルートノード103B、1つ以上のブランチノード106、及び1つ以上のリーフノード109を含み得る。抽象構文木110Bに関連して、図1Cにおいて、ブランチノード106A及びブランチノード106Bという2つのブランチノードが示されている(これらは、集合的にブランチノード106と呼ばれる且つ/又は個別にブランチノード106と呼ばれる)。抽象構文木110Bに関連して、図1Cにおいて、リーフノード109A、リーフノード109B、リーフノード109C、リーフノード109D、及びリーフノード109Eという5つのリーフノードが示されている(これらは、集合的にリーフノード109と呼ばれる且つ/又は個別にリーフノード109と呼ばれる)。しかしながら、ブランチノード及び/又はリーフノードの数は、異なる実装に応じて変わり得る。
本開示において、例えばリーフノード109Aといったノードの番号は、2つ以上の図において繰り返され得る。これは、1つの図において与えられる例が、他の図において続けられ得るからである。例えば、図1Fの抽象コードグラフ130Aは、図1Bの例示的な抽象構文木110Bに基づき得る。したがって、図1Bのノード及び番号は、図1Fのノード及び番号に対応し得る。追加的又は代替的に、図におけるノードは、ソフトウェアの例示的な構成要素に関連し得、ソフトウェアの例示的な構成要素は、2つ以上の図を参照して説明され続けられることがある。例えば、リーフノード109Aは、2つ以上の図について、構成要素「closable」に対応し得る。例えば、リーフノード109Aは、図1B及び図1Eにおいて、構成要素「closable」を表現し得る。
いくつかの実施形態において、抽象構文木110Cは、ルートノード103C、1つ以上のブランチノード106、及び1つ以上のリーフノード109を含み得る。抽象構文木110Cにおいて、ルートノード103Cは、ブランチノードとして機能するが、抽象構文木110Cは、1つ以上のブランチノード106を含み得る。抽象構文木110Cに関連して、図1Cにおいて、リーフノード109G、リーフノード109H、及びリーフノード109Iという3つのリーフノードが示されている(これらは、集合的にリーフノード109と呼ばれる且つ/又は個別にリーフノード109と呼ばれる)。しかしながら、ブランチノード及び/又はリーフノードの数は、異なる実装に応じて変わり得る。
いくつかの実施形態において、抽象構文木110Bは、図1Bに関する上記の抽象構文木110Aの説明に従って、第1のソースコードの1つ以上の構文フレーズを表現し得る。また、抽象構文木110Cは、図1Bに関する上記の抽象構文木110Aの説明に従って、第2のソースコードの1つ以上の構文フレーズを表現し得る。いくつかの実施形態において、第1のソースコードと第2のソースコードとは、例えば、第1のソースコードと第2のソースコードとが、同じ又は類似する構成要素を含む、同じ又は類似する関数を実行する、同じソフトウェアプログラムの一部である、同じエンティティにより開発又は記述されている、あるいは、類似するフォールト、エラー、又は脆弱性に関連する等、関連し得る。例えば、抽象構文木110Cは、エラーに関連付けられたコードパターンを表現し得、抽象構文木110Bは、このエラーに対処し得る修復候補を表現し得る。
例えば、第2のソースコードは、構文フレーズ「closable.close();」を含み得、第1のソースコードは、構文フレーズ「if (closable != null) closable.close();」を含み得る。第2のソースコードは、第1のソースコードと同じ関数を実行し得る。第1のソースコードは、第2のソースコードよりもセキュアであり得る、あるいは、第2のソースコードよりもフォールト又はエラーの低い可能性を含み得る。第1のソースコードは、第2のソースコードに関する開発提案の修復候補であり得る。第1のソースコードは、第2のソースコードと同じソフトウェアプログラムからのものであり得る。追加的又は代替的に、第1のソースコードは、ビッグコードからのものであり得るのに対し、第2のソースコードは、テスト対象ソフトウェアからのものであり得る。
例えば、図1Cを参照すると、抽象構文木110Cは、第2のソースコード「closable.close();」を表現し得る。ルートノード103Cは、構成要素「close()」を「MethodCall」として表現し得る。リーフノード109Gは、第2のソースコード内の構成要素「closable」を「Var closable」として表現し得る。リーフノード109Hは、構成要素「close()」を「Id close」として表現し得る。リーフノード109Iは、「close()」のリターンの構成要素を「Void」として表現し得る。
例えば、図1Cを参照すると、抽象構文木110Bは、第1のソースコード「if (closable != null) closable.close();」を表現し得る。ルートノード103Bは、構成要素「if」を「IfStmt」として表現し得る。ブランチノード106Aは、構成要素「!=」を「Op !=」として表現し得る。リーフノード109Aは、第1のソースコード内の第1の位置における構成要素「closable」を「Var closable」として表現し得る。リーフノード109Bは、構成要素「null」を「Const null」として表現し得る。ブランチノード106Bは、構成要素「close()」を「MethodCall」として表現し得る。リーフノード109Cは、第1のソースコード内の第2の位置における構成要素「closable」を「Var closable」として表現し得る。リーフノード109Dは、構成要素「close()」を「Id close」として表現し得る。リーフノード109Eは、「close()」のリターンの構成要素を「Void」として表現し得る。
本開示の範囲から逸脱することなく、抽象構文木110B及び/又は抽象構文木110Cに対して、変更、追加、又は省略が可能である。例えば、抽象構文木110B及び抽象構文木110Cは、任意の数のブランチノード及びリーフノードを含んでもよい。ブランチノード106の1つのレイヤのみを用いて図示されているが、抽象構文木110B及び抽象構文木110Cは、ブランチノード106の任意の数のレイヤを含んでもよい。図1Dを参照して以下で説明されるように、抽象構文木110B及び抽象構文木110Cを使用して、差分抽象構文木を生成することができる。
図1Dは、本開示に記載の少なくとも1つの実施形態に従った例示的な差分抽象構文木110Dを示している。差分抽象構文木110Dは、図1Aの抽象構文木110の例であり得る。差分抽象構文木110Dは、上述した抽象構文木110Aの例であり得る。しかしながら、差分抽象構文木110Dは、第1のソースコードの第1の構成要素と、第1のソースコードの第1の構成要素の間の関係と、第2のソースコードの第2の構成要素と、第2のソースコードの第2の構成要素の間の関係と、の1つ以上の表現を含み得る。追加的又は代替的に、抽象構文木110Dは、第1のソースコードと第2のソースコードとの間の関係の1つ以上の表現を含むこともある。これらの実施形態又は他の実施形態において、抽象構文木110Dは、第1のソースコードの第1の構成要素と第2のソースコードの第2の構成要素との間の関係の1つ以上の表現を含み得る。また、差分抽象構文木110Dは、2つ以上のルートノードを含み得る。追加的又は代替的に、差分抽象構文木110Dは、1つ以上のノードが、以前には、例えば図1Cの抽象構文木110B又は図1Cの抽象構文木110Cといった以前の抽象構文木のルートノードであった、というインジケーションを含むこともある。
いくつかの実施形態において、差分抽象構文木110Dは、1つ以上のルートノード、1つ以上のブランチノード106、及び1つ以上のリーフノード109を含み得る。差分抽象構文木110Dに関連して、図1Dにおいて、ブランチノード106A及びブランチノード106Dという2つのブランチノードが示されている(これらは、集合的にブランチノード106と呼ばれる且つ/又は個別にブランチノード106と呼ばれる)。差分抽象構文木110Dに関連して、図1Dにおいて、リーフノード109A、リーフノード109B、リーフノード109J、リーフノード109K、及びリーフノード109Lという5つのリーフノードが示されている(これらは、集合的にリーフノード109と呼ばれる且つ/又は個別にリーフノード109と呼ばれる)。しかしながら、ブランチノード及び/又はリーフノードの数は、異なる実装に応じて変わり得る。
差分抽象構文木110Dは、図1Cの抽象構文木110B及び抽象構文木110Cに基づいて生成され得る。差分抽象構文木110Dは、コンパイラにより、図1Aのシステム100により、又は、何らかの他の適切な機構若しくは動作により、生成され得る。
差分抽象構文木110Dは、図1Cの抽象構文木110Bの1つ以上のノードと図1Cの抽象構文木110Cの1つ以上のノードとをマージすることにより、生成され得る。このマージは、新たなノードをもたらすこともあるし、単に、1つ以上のノードを既存のノードに含めることもある。本開示において、2つ以上のノードの間のマージから生じるノードは、「マージノード」と呼ばれ得る。本開示において、マージノードを形成するためにマージされる2つ以上のノードは、「構成ノード」と呼ばれ得る。マージノードは、その全ての構成ノードの特性を保持することができる。構成ノードは、構成要素を表現し得るので、マージノードも構成要素を表現し得る。構成ノードは、構成要素を、ある抽象度で表現するので、マージノードも、構成要素を、その抽象度で表現し得る。マージノードはまた、構成ノードが連結されていた全てのノードに連結され得る。
例えば、図1Dの差分抽象構文木110Dを形成するために、図1Cの抽象構文木110Bの1つ以上のノードが、図1Cの抽象構文木110Cの1つ以上のノードとマージされ得る。例えば、図1Cの抽象構文木110Bのリーフノード109Cと図1Cの抽象構文木110Cのリーフノード109Gとがマージされて、マージノードである図1Dのリーフノード109Jが形成され得る。リーフノード109Cとリーフノード109Gとのマージは、リーフノード109C及びリーフノード109Gがこれらのそれぞれのソースコード内で同じ構成要素を表現しているという判定に基づき得る。リーフノード109Jは、リーフノード109C及びリーフノード109Gが連結されていた全てのノードに連結され得る。したがって、リーフノード109Jは、ブランチノード106B及びルートノード103Cに連結され得る。追加的又は代替的に、ブランチノード106Bが、ルートノード103Cとマージされて、ブランチノード106Dが形成され得るので、リーフノード109Jは、ブランチノード106Dに連結され得る。
図1Cのリーフノード109Cと図1Cのリーフノード109Gとがマージされて図1Dのリーフノード109Jが形成されることに関して与えられた例と同様に、図1Cのリーフノード109Dが、図1Cのリーフノード109Hとマージされて、図1Dのリーフノード109Kが形成され得、図1のリーフノード109Eが、図1Cのリーフノード109Iとマージされて、図1Dのリーフノード109Lが形成され得、図1のブランチノード106Bが、図1Cのルートノード103Cとマージされて、図1Dのブランチノード106Dが形成され得る。
図1Cを参照して上述した例を続けると、リーフノード109Cは、第1のソースコード内の構成要素「closable」を「Var closable」として表現し得、リーフノード109Gは、第2のソースコード内の構成要素「closable」を「Var closable」として表現し得る。したがって、リーフノード109Cとリーフノード109Gとがマージされて、リーフノード109Jが形成され得、ここで、リーフノード109Jも、構成要素「closable」を「Var closable」として表現し得る。また、リーフノード109Cは、ブランチノード106Bに連結され、リーフノード109Gは、ルートノード103Cに連結されていたので、リーフノード109Jは、ブランチノード106B及びルートノード103Cの両方、すなわち、マージノードであるブランチノード106D、に連結され得る。
この例において、図1Cのルートノード103Cが、図1Cのブランチノード106Bとマージされて、図1Dのブランチノード106Dが形成され得る。第1のソースコードのルートノード(ルートノード103B)及び第2のソースコードのルートノード(ルートノード103C)は、これらがルートノードであったというインジケーションを保持することができる。したがって、ブランチノード106Dは、これが第2のソースコードのルートノードであったというインジケーションを含み得る。追加的又は代替的に、差分抽象構文木110Dは、2つ以上のルートノードを含むこともある。
本開示の範囲から逸脱することなく、差分抽象構文木110Dに対して、変更、追加、又は省略が可能である。例えば、差分抽象構文木110Dは、任意の数のブランチノード及びリーフノードを含んでもよい。ブランチノード106の1つのレイヤのみを用いて図示されているが、差分抽象構文木110Dは、ブランチノード106の任意の数のレイヤを含んでもよい。2つの抽象構文木に基づくものとして図示されているが、差分抽象構文木110Dは、任意の数の抽象構文木に基づいてもよい。追加的又は代替的に、差分抽象構文木110Dは、任意の数のソースコードに基づいてもよい。
図1Aに戻ると、いくつかの実施形態において、システム100は、抽象コードグラフ生成器120を含み得る。抽象コードグラフ生成器120は、抽象構文木110に基づいて抽象コードグラフ130を生成するよう構成され得る。いくつかの実施形態において、抽象コードグラフ生成器120は、抽象構文木110における各ノードについて1つ以上の抽象ノードを生成するよう構成され得る。これらの実施形態又は他の実施形態において、抽象コードグラフ生成器120は、抽象構文木110の1つ以上のノード及び/又は生成されたノードを、抽象コードグラフ130のノードへとマージするよう構成され得る。いくつかの実施形態において、抽象コードグラフ生成器120は、任意の順序で又は実質的に同時に若しくは同時に、抽象ノードを生成しマージを実行するよう構成され得る。
いくつかの実施形態において、抽象コードグラフ生成器120は、抽象コードグラフを生成するための1つ以上の動作をコンピューティングシステムが実行することを可能にするよう構成されているコード及びルーチンを含み得る。追加的又は代替的に、抽象コードグラフ生成器120は、(例えば、1つ以上の動作を実行する又は1つ以上の動作の実行を制御する)プロセッサ、(例えば、1つ以上の動作を実行する又は1つ以上の動作の実行を制御する)マイクロプロセッサ、フィールドプログラマブルゲートアレイ(FPGA)、又は特定用途向け集積回路(ASIC)を含むハードウェアを使用して実装されてもよい。いくつかの他の例において、抽象コードグラフ生成器120は、ハードウェアとソフトウェアとの組合せを使用して実装され得る。本開示において、抽象コードグラフ生成器120により実行されるとして説明される動作は、システムに実行するように抽象コードグラフ生成器120が指示し得る動作を含み得る。
本開示の範囲から逸脱することなく、抽象コードグラフ生成器120に対して、変更、追加、又は省略が可能である。例えば、いくつかの実施形態において、抽象コードグラフ生成器120は、ソースコードから抽象構文木110を生成することにより、抽象構文木110を得るよう構成され得る。別の例において、抽象コードグラフ生成器120は、抽象構文木110を最初に得ることなく、ソースコードから抽象コードグラフ130を生成することもある。これらの実施形態又は他の実施形態において、抽象構文木110は、以前に生成されていることがあり、その表現が、抽象コードグラフ生成器120により得られ得る。いくつかの実施形態において、抽象構文木110は、図1Dを参照して上述したような差分抽象構文木であり得る。別の例において、抽象コードグラフ生成器120は、ノードをマージしないことがある。さらに、動作の順序は、異なる実装に応じて変わり得る。抽象コードグラフ130を生成するために抽象コードグラフ生成器120により用いられ得る動作の例が、図1Bの抽象構文木110Aに基づいて図1Eの中間抽象コードグラフ125Aを介して図1Fの例示的な抽象コードグラフ130Aを生成することに関連して、説明され得る。
例えば、図1Eは、本開示に記載の少なくとも1つの実施形態に従った例示的な中間抽象コードグラフ125Aを示している。少なくともいくつかの実施形態に関して、中間抽象コードグラフ125Aは、抽象コードグラフ生成器120が抽象コードグラフ130を生成することにどのように達し得るかを理解するのを単に助け得る。概して、中間抽象コードグラフ125Aは、ソースコードを1つ以上の抽象度で表現することを含め、ソースコードを表現し得る。図示されているが、中間抽象コードグラフ125Aは概念的であり得る。
いくつかの実施形態において、中間抽象コードグラフ125Aは、抽象ルートノード102、ルートノード103A、1つ以上の抽象ブランチノード105、1つ以上のブランチノード106、1つ以上の抽象リーフノード108、及び1つ以上のリーフノード109を含み得る。図1Eにおいて、抽象ブランチノード105A及び抽象ブランチノード105Bという2つの抽象ブランチノードが示されている(これらは、集合的に抽象ブランチノード105と呼ばれる且つ/又は個々に抽象ブランチノード105と呼ばれる)。図1Eにおいて、ブランチノード106A及びブランチノード106Bという2つのブランチノードが示されている(これらは、集合的にブランチノード106と呼ばれる且つ/又は個々にブランチノード106と呼ばれる)。図1Eにおいて、抽象リーフノード108A、抽象リーフノード108B、抽象リーフノード108C、抽象リーフノード108D、抽象リーフノード108E、抽象リーフノード108F、及び抽象リーフノード108Gという7つの抽象リーフノードが示されている(これらは、集合的に抽象リーフノード108と呼ばれる且つ/又は個々に抽象リーフノード108と呼ばれる)。図1Eにおいて、リーフノード109A、リーフノード109B、リーフノード109C、リーフノード109D、及びリーフノード109Eという5つのリーフノードが示されている(これらは、集合的にリーフノード109と呼ばれる且つ/又は個々にリーフノード109と呼ばれる)。しかしながら、抽象ブランチノード、ブランチノード、抽象リーフノード、及び/又はリーフノードの数は、異なる実装に応じて変わり得る。
例示の目的で、中間抽象コードグラフ125Aは、図1Fの抽象コードグラフ130Aを生成することにおける中間ステップとして、図1Aの抽象コードグラフ生成器120により生成され得る。中間抽象コードグラフ125Aは、図1Bの抽象構文木110Aにおける各ノードについて1つ以上の抽象ノードを生成することにより、生成され得る。いくつかの実施形態において、抽象コードグラフ生成器120は、ソフトウェア抽象化を実行する任意の適切な動作に従って、抽象構文木110Aの各ノードを抽象化することができる。抽象化は、抽象化される構成要素に対応し得る1つ以上のルールに従って実行され得る。これらの実施形態又は他の実施形態において、ルールは、例えば、「variable」、「operation」、又は「MethodCall」といった、抽象化される構成要素のカテゴリ又は分類に対応し得る。例えば、最低抽象度において、変数は、例えば「Var closable」又は「Name closable」といった、変数の型及び名前により表現され得る。より高い抽象度において、変数は、例えば「Type File」といった、名前ではなく型により表現され得る。さらに高い抽象度において、変数は、型又は名前なく、「Var」又は「variable」により表現され得る。本開示において、他のノードに基づいて抽象的概念として生成されるノードは、「抽象ノード」と呼ばれ得る。
例えば、抽象コードグラフ生成器120は、リーフノード109Bの構成要素の抽象的表現であり得る抽象リーフノード108Cを生成することができる。抽象リーフノード108A及び抽象リーフノード108Bは両方とも、リーフノード109Aの構成要素の抽象的表現であり得る。いくつかの実施形態において、抽象リーフノード108Aは、抽象リーフノード108Bよりも抽象的であり得る。
図1Bを参照して上述した例を続けると、中間抽象コードグラフ125Aは、ソースコード「if (closable != null) closable.close();」を表現し得る。抽象ルートノード102は、構成要素「if」を、ルートノード103Aの「IfStmt」という表現よりも抽象的であり得る「StmtList」として表現し得る。抽象ブランチノード105Aは、構成要素「!=」を、ブランチノード106Aの「Op !=」という表現よりも抽象的であり得る「Expr」として表現し得る。リーフノード109Aは、ソースコード内の第1の位置における構成要素「closable」を、図1Bの抽象構文木110Aの「Var closable」という表現と同じ抽象度であり得る「Name closable」として表現し得る。抽象リーフノード108Bは、ソースコード内の第1の位置における構成要素「closable」を、リーフノード109Aの「Name closable」という表現よりも抽象的であり得る「Type File」として表現し得る。抽象リーフノード108Aは、ソースコード内の第1の位置における構成要素「closable」を、リーフノード109Aの「Name closable」という表現及び抽象リーフノード108Bの「Type File」という表現よりも抽象的であり得る「Var」として表現し得る。抽象リーフノード108Cは、構成要素「null」を、リーフノード109Bの「Const null」という表現よりも抽象的であり得る「Const」として表現し得る。抽象ブランチノード105Bは、構成要素「close()」を、ブランチノード106Bの「MethodCall」という表現よりも抽象的であり得る「StmtList」として表現し得る。リーフノード109Cは、ソースコード内の第2の位置における構成要素「closable」を、図1Bの抽象構文木110Aの「Var closable」という表現と同じ抽象度であり得る「Name closable」として表現し得る。抽象リーフノード108Eは、ソースコード内の第2の位置における構成要素「closable」を、リーフノード109Cの「Name closable」という表現よりも抽象的であり得る「Type File」として表現し得る。抽象リーフノード108Dは、ソースコード内の第2の位置における構成要素「closable」を、リーフノード109Cの「Name closable」という表現及び抽象リーフノード108Eの「Type File」という表現よりも抽象的であり得る「Var」として表現し得る。抽象リーフノード108Fは、構成要素「close()」を、リーフノード109Dの「Id close」という表現よりも抽象的であり得る「Id」として表現し得る。抽象リーフノード108Gは、「close()」のリターンの構成要素「Void」を、リーフノード10Eの「Void」という表現よりも抽象的であり得る「ExprList」として表現し得る。
中間抽象コードグラフ125Aから、図1Fを参照して以下で説明されるように抽象コードグラフ130Aを生成するために、抽象コードグラフ生成器120は、同じ構成要素を同じ抽象度で表現しているノードをマージすることができる。マージは、図1Dを参照して上述したマージと実質的に同じ方法で実行され得る。しかしながら、この場合、2つの構成ノードが、同じ構成要素を、同じ抽象度で、すなわち、同じように、表現しているという追加の判定が存在し得る。
例えば、図1Bを参照して上述した例に再度戻ると、リーフノード109A、リーフノード109C、抽象リーフノード108A、抽象リーフノード108B、抽象リーフノード108D、及び抽象リーフノード108Eの各々は、同じ構成要素「closable」を表現している。これらの実施形態又は他の実施形態において、リーフノード109Aは、リーフノード109Cとマージされ得る。なぜならば、リーフノード109A及びリーフノード109Cは、構成要素「closable」を同じ抽象度で表現しているからである。追加的又は代替的に、リーフノード109A及びリーフノード109Cは、構成要素「closable」を他の抽象度で表現している抽象リーフノード108とはマージされ得ない。同様に、これらの実施形態又は他の実施形態において、抽象リーフノード108Bは、抽象リーフノード108Eとマージされ得る。なぜならば、抽象リーフノード108B及び抽象リーフノード108Eは、構成要素「closable」を同じ抽象度で(この場合には「Type File」として)表現しているからである。同様に、これらの実施形態又は他の実施形態において、抽象リーフノード108Aは、抽象リーフノード108Dとマージされ得る。なぜならば、抽象リーフノード108A及び抽象リーフノード108Dは、構成要素「closable」を、同じ抽象度で(この場合には「Var」として)表現しているからである。追加的又は代替的に、抽象リーフノード108Bは、抽象リーフノード108A又は抽象リーフノード108Dとはマージされ得ない。なぜならば、抽象リーフノード108Bは、構成要素「closable」を、抽象リーフノード108A及び抽象リーフノード108Dとは異なる抽象度で表現しているからである。
本開示の範囲から逸脱することなく、中間抽象コードグラフ125Aに対して、変更、追加、又は省略が可能である。例えば、ブランチノード106の1つのレイヤのみを用いて図示されているが、中間抽象コードグラフ125Aは、ブランチノード106の任意の数のレイヤを含んでもよい。別の例において、抽象構文木110Aの全てのノードが、抽象ノードの生成のための基礎であるとは限らない。これらの実施形態又は他の実施形態において、抽象構文木110Aの1つ以上のノードが、当該1つ以上のノードに基づいて生成される抽象ノードを有しないこともある。中間抽象コードグラフ125Aを使用して、例えば図1Fを参照して説明される抽象コードグラフ等の抽象コードグラフ130Aを生成することができる。
図1Fは、本開示に記載の少なくとも1つの実施形態に従った例示的な抽象コードグラフ130Aを示している。抽象コードグラフ130Aは、図1Aの抽象コードグラフ130の例であり得る。概して、抽象コードグラフ130Aは、ソースコードの構成要素と、ソースコードの構成要素の間の関係と、の表現を含み得る。抽象構文木と比較すると、抽象コードグラフ130Aは、追加的又は代替的に、抽象ノード及びマージノードを含むことがある。図示されているが、抽象コードグラフ130Aは概念的であり得る。例えば、抽象コードグラフ130Aは、テーブル、リスト、又は他のデータ構造として、コンピュータメモリに記憶され得る。
いくつかの実施形態において、抽象コードグラフ130Aは、抽象ルートノード102、ルートノード103A、1つ以上の抽象ブランチノード105、1つ以上のブランチノード106、1つ以上の抽象リーフノード108、及び1つ以上のリーフノード109を含み得る。図1Fにおいて、抽象ブランチノード105A及び抽象ブランチノード105Bという2つの抽象ブランチノードが示されている(これらは、集合的に抽象ブランチノード105と呼ばれる且つ/又は個別に抽象ブランチノード105と呼ばれる)。図1Fにおいて、ブランチノード106A及びブランチノード106Bという2つのブランチノードが示されている(これらは、集合的にブランチノード106と呼ばれる且つ/又は個別にブランチノード106と呼ばれる)。図1Fにおいて、5つの抽象リーフノードが示されており、図1Fに示されているこれら5つの抽象リーフノードのうち、抽象リーフノード108C、抽象リーフノード108F、及び抽象リーフノード108Gという3つの抽象リーフノードは、図1Eに関連して先に示されていた。抽象リーフノード108H及び抽象リーフノード108Iという2つの抽象リーフノードは、新たに追加されたものである。これらの抽象リーフノードは、集合的に抽象リーフノード108と呼ばれる且つ/又は個別に抽象リーフノード108と呼ばれる。図1Fにおいて、4つのリーフノードが示されており、図1Fに示されているこれら4つのリーフノードのうち、リーフノード109B、リーフノード109D、及びリーフノード109Eという3つのリーフノードは、図1Eに関連して先に示されていた。リーフノード109Fという1つのリーフノードは、新たに追加されたものである。これらのリーフノードは、集合的にリーフノード109と呼ばれる且つ/又は個別にリーフノード109と呼ばれる。しかしながら、抽象ブランチノード、ブランチノード、抽象リーフノード、及び/又はリーフノードの数は、異なる実装に応じて変わり得る。
いくつかの実施形態において、抽象コードグラフ130Aは、ソースコードの構成要素をノードとして表現し、構成要素間の関係をノード間の連結として表現する概念マッピング又はグラフを含み得る。いくつかの実施形態において、抽象コードグラフ130Aは、ソースコードの1つ以上の構文フレーズを表現し得る。いくつかの実施形態において、例えば、ルートノード103A、ブランチノード106、及びリーフノード109等の各ノードは、ソースコードの1つの構成要素を表現し得る。いくつかの実施形態において、抽象コードグラフ130Aは、抽象構文木110Aからの1つ以上のノードを含み得る。いくつかの実施形態において、ルートノード103A、ブランチノード106、及びリーフノード109の各々は、抽象構文木110Aにおいて見つけられるノードに直接的に関連し得る又は抽象構文木110Aにおいて見つけられるノードと同じであり得る。
さらに、抽象コードグラフ130Aの一部のノードは、ソースコードの構成要素を、抽象構文木110Aのノードがソースコードの構成要素を表現していた抽象度よりも高い抽象度で表現し得る抽象ノードを含み得る。例えば、抽象リーフノード108は、ソースコードの構成要素を、図1B又は図1Fのリーフノード109が構成要素を表現している抽象度よりも高い抽象度で表現し得る。別の例において、抽象ブランチノード105は、ソースコードの構成要素を、図1B又は図1Fのブランチノード106が構成要素を表現している抽象度よりも高い抽象度で表現し得る。
抽象コードグラフ130Aは、抽象構文木110におけるノードに直接的に関連し得る又は抽象構文木110Aにおけるノードと同じであり得るノード(例えば、ルートノード103A、ブランチノード106、及びリーフノード109等)を含み得るので、抽象コードグラフ130Aは、抽象構文木110Aの全ての情報を含み得る。抽象コードグラフ130Aは、抽象構文木110Aのノードよりも抽象的であり得るノード(例えば、抽象ルートノード102、抽象ブランチノード105、及び抽象リーフノード108等)を含み得るので、抽象コードグラフ130Aは、抽象構文木110Aよりも多くの情報を含み得、いくつかの例において、抽象構文木110Aよりも多くのノードを含み得る。
いくつかの実施形態において、抽象コードグラフ130Aは、1つ以上のマージノードを含み得る。マージノードは、元々のノードが表現していた構成要素と元々のノードが構成要素を表現していた抽象度とを含め、元々のノードの全ての情報を含み得る。さらに、特定のマージノードは、構成ノードが連結されていた全てのノードに連結され得る。したがって、抽象コードグラフ130Aは、抽象構文木110Aよりも少ないノードを含むとしても、同じ情報を含み得る。
例示の目的で、抽象コードグラフ130Aは、図1Aの抽象コードグラフ生成器120により生成され得る。さらに、抽象コードグラフ130Aは、図1Bの抽象構文木110Aに基づき得る。抽象コードグラフ130Aは、抽象構文木110Aにおける各ノードについて抽象ノードを生成し、抽象構文木110Aからのノード及び抽象ノードをマージすることにより、生成され得る。
図1Bを参照して上述した例を続けると、抽象コードグラフ130Aは、ソースコード「if (closable != null) closable.close();」を表現し得る。抽象ルートノード102は、構成要素「if」を、ルートノード103Aの「IfStmt」という表現よりも抽象的であり得る「StmtList」として表現し得る。抽象ブランチノード105Aは、構成要素「!=」を、ブランチノード106Aの「Op !=」という表現よりも抽象的であり得る「Expr」として表現し得る。抽象リーフノード108Iは、ソースコード内の第1の位置における構成要素「closable」を、リーフノード109Fの「Name closable」という表現よりも抽象的であり得る「Type File」として表現し得る。抽象リーフノード108Hは、ソースコード内の第1の位置における構成要素「closable」を、リーフノード109Fの「Name closable」という表現及び抽象リーフノード108Hの「Type File」という表現よりも抽象的であり得る「Var」として表現し得る。抽象リーフノード108Cは、構成要素「null」を、リーフノード109Bの「Const null」という表現よりも抽象的であり得る「Const」として表現し得る。抽象ブランチノード105Bは、構成要素「close()」を、ブランチノード106Bの「MethodCall」という表現よりも抽象的であり得る「StmtList」として表現し得る。抽象リーフノード108Fは、構成要素「close()」を、リーフノード109Dの「Id close」という表現よりも抽象的であり得る「Id」として表現し得る。抽象リーフノード108Gは、「close()」のリターンの構成要素「Void」を、リーフノード109Eの「Void」という表現よりも抽象的であり得る「ExprList」として表現し得る。
本開示の範囲から逸脱することなく、抽象コードグラフ130Aに対して、変更、追加、又は省略が可能である。例えば、ブランチノード106の1つのレイヤのみを用いて図示されているが、抽象コードグラフ130Aは、ブランチノード106の任意の数のレイヤを含んでもよい。
抽象ノードの生成及びノードのマージは、任意の順序で又は実質的に同時に実現され得る。例えば、抽象ノードの生成が、最初に、図1Eの中間抽象コードグラフ125Aに示されているように生じ、次いで、ノードのマージが、図1Fの抽象コードグラフ130Aをもたらすように生じ得る。代替的に、ノードのマージが、最初に、図1Gの中間抽象コードグラフ125Bに示されているように生じ、次いで、抽象ノードの生成が、図1Fの抽象コードグラフ130Aをもたらすように生じることもある。代替的に、抽象ノードの生成及びノードのマージが、実質的に同時に生じることもある。
例えば、図1Gは、本開示に記載の少なくとも1つの実施形態に従った例示的な中間抽象コードグラフ125Bを示している。少なくともいくつかの実施形態に関して、中間抽象コードグラフ125Bは、抽象コードグラフ生成器120が抽象コードグラフ130Aを生成することにどのように達し得るかを理解するのを単に助け得る。概して、中間抽象コードグラフ125Bは、ソースコードをある抽象度で表現することを含め、ソースコードを表現し得る。図示されているが、中間抽象コードグラフ125Bは概念的であり得る。
いくつかの実施形態において、中間抽象コードグラフ125Bは、ルートノード103A、1つ以上のブランチノード106、及び1つ以上のリーフノード109を含み得る。図1Gにおいて、ブランチノード106A及びブランチノード106Bという2つのブランチノードが示されている(これらは、集合的にブランチノード106と呼ばれる且つ/又は個々にブランチノード106と呼ばれる)。図1Gにおいて、4つのリーフノードが示されている。例示の目的で、これらのリーフノードは、図1Fに対応するように順序付けられラベル付けされている。図1Gの4つのリーフノードは、リーフノード109B、リーフノード109D、リーフノード109E、及びリーフノード109Fを含む(これらは、集合的にリーフノード109と呼ばれる且つ/又は個々にリーフノード109と呼ばれる)。しかしながら、ブランチノード及び/又はリーフノードの数は、異なる実装に応じて変わり得る。
例示の目的で、中間抽象コードグラフ125Bは、図1Fの抽象コードグラフ130Aを生成することにおける中間ステップとして、図1Aの抽象コードグラフ生成器120により生成され得る。中間抽象コードグラフ125Bは、図1Bの抽象構文木110Aの1つ以上のノードをマージすることにより、生成され得る。このマージは、図1Cを参照して上述したマージと同じ方法で、又は、図1Cを参照して上述したマージと実質的に類似する方法で、生じ得る。
例えば、抽象コードグラフ生成器120は、図1Bの抽象構文木110Aのリーフノード109Aとリーフノード109Cとをマージして、マージノードである図1Gのリーフノード109Fを形成することができる。リーフノード109Aとリーフノード109Cとのマージは、リーフノード109A及びリーフノード109Cがソースコード内で同じ構成要素を表現しているという判定に基づき得る。リーフノード109Fは、リーフノード109A及びリーフノード109Cが連結されていた全てのノードに連結され得る。したがって、リーフノード109Fは、ブランチノード106A及びブランチノード106Bに連結され得る。
図1Bを参照して上述した例を続けると、リーフノード109Aは、ソースコード内の第1の位置における構成要素「closable」を「Var closable」として表現し得る。リーフノード109Cは、ソースコード内の第2の位置における構成要素「closable」を「Var closable」として表現し得る。したがって、抽象コードグラフ生成器120は、リーフノード109Aとリーフノード109Cとをマージして、リーフノードFを形成することができ、ここで、リーフノードFも、構成要素「closable」を「Var closable」として表現し得る。また、リーフノード109Aは、ブランチノード106Aに連結され、リーフノード109Bは、ブランチノード106Bに連結されていたので、リーフノード109Fは、ブランチノード106A及びブランチノード106Bの両方に連結され得る。
中間抽象コードグラフ125Bから、図1Fを参照して上述したように抽象コードグラフ130Aを生成するために、抽象コードグラフ生成器120は、中間抽象コードグラフ125Bにおける各ノードについて1つ以上の抽象ノードを生成することができる。この抽象化は、図1Eを参照して上述した抽象化と同様の方法で行われ得る。
例えば、図1Fの抽象コードグラフ130Aを形成するために、抽象コードグラフ生成器120は、中間抽象コードグラフ125Bのルートノード103Aに基づいて、抽象ルートノード102を生成することができる。また、抽象コードグラフ生成器120は、中間抽象コードグラフ125Bのブランチノード106に基づいて、抽象ブランチノード105を生成することができる。また、抽象コードグラフ生成器120は、中間抽象コードグラフ125Bのリーフノード109に基づいて、抽象リーフノード108を生成することができる。例えば、抽象リーフノード108I及び抽象リーフノード108Hは、中間抽象コードグラフ125Bのリーフノード109Fに基づき得る。
本開示の範囲から逸脱することなく、中間抽象コードグラフ125Bに対して、変更、追加、又は省略が可能である。例えば、ブランチノード106の1つのレイヤのみを用いて図示されているが、中間抽象コードグラフ125Bは、ブランチノード106の任意の数のレイヤを含んでもよい。差分抽象コードグラフ130Bは、抽象コードグラフ130の例であり得る。図1Hは、抽象コードグラフ130の別の例を示している。
図1Hは、本開示に記載の少なくとも1つの実施形態に従った例示的な差分抽象コードグラフ130Bを示している。差分抽象コードグラフ130Bは、図1Aの抽象コードグラフ130の例であり得る。概して、差分抽象コードグラフ130Bは、第1のソースコードの第1の構成要素と、第1のソースコードの第1の構成要素の間の関係と、第2のソースコードの第2の構成要素と、第2のソースコードの第2の構成要素の間の関係と、の表現を含み得る。図示されているが、差分抽象コードグラフ130Bは概念的であり得る。
いくつかの実施形態において、差分抽象コードグラフ130Bは、図1Dの差分抽象構文木110Dに基づき得る。いくつかの実施形態において、差分抽象コードグラフ130Bは、図1E~図1Gを参照して上述したのと同じ原理に従って生成され得る。いくつかの実施形態において、差分抽象コードグラフ130Bは、図1Aの抽象コードグラフ生成器120により生成され得る。
差分抽象コードグラフ130Bは、差分抽象コードグラフ130Bの1つ以上のノードの生成元であるソースコードに関する情報を保持することができる。代替的又は追加的に、差分抽象コードグラフ130Bは、差分抽象コードグラフ130Bのどのノードが例えば抽象構文木110B等の抽象構文木におけるルートノードであったかに関する情報を含むこともある。
いくつかの実施形態において、差分抽象コードグラフ130Bは、1つ以上の抽象ルートノード102、1つ以上のルートノード103B、1つ以上の抽象ブランチノード105、1つ以上のブランチノード106、1つ以上の抽象リーフノード108、及び1つ以上のリーフノード109を含み得る。図1Hにおいて、抽象ブランチノード105A及び抽象ブランチノード105Bという2つの抽象ブランチノードが示されている(これらは、集合的に抽象ブランチノード105と呼ばれる且つ/又は個々に抽象ブランチノード105と呼ばれる)。図1Hにおいて、ブランチノード106A及びブランチノード106Bという2つのブランチノードが示されている(これらは、集合的にブランチノード106と呼ばれる且つ/又は個々にブランチノード106と呼ばれる)。図1Hにおいて、抽象リーフノード108C、抽象リーフノード108J、抽象リーフノード108K、抽象リーフノード108L、及び抽象リーフノード108Mという5つの抽象リーフノードが示されている(これらは、集合的に抽象リーフノード108と呼ばれる且つ/又は個々に抽象リーフノード108と呼ばれる)。図1Hにおいて、リーフノード109B、リーフノード109K、リーフノード109L、及びリーフノード109Mという4つのリーフノードが示されている(これらは、集合的にリーフノード109と呼ばれる且つ/又は個々にリーフノード109と呼ばれる)。しかしながら、抽象ブランチノード、ブランチノード、抽象リーフノード、及び/又はリーフノードの数は、異なる実装に応じて変わり得る。
本開示の範囲から逸脱することなく、差分抽象コードグラフ130Bに対して、変更、追加、又は省略が可能である。例えば、ブランチノード106の1つのレイヤのみを用いて図示されているが、差分抽象コードグラフ130Bは、ブランチノード106の任意の数のレイヤを含んでもよい。
図1Aに戻ると、いくつかの実施形態において、システム100は、本開示に記載の少なくとも1つの実施形態に従ったサブグラフ生成器140を含み得る。概して、サブグラフ生成器140は、抽象コードグラフ130から1つ以上のサブグラフ150を生成するよう構成され得る。いくつかの実施形態において、サブグラフ生成器140は、抽象コードグラフ130のノードのサブセットを、1つ以上のサブグラフ150として選択するよう構成され得る。
概して、サブグラフ150は、ソースコードの構成要素と、ソースコードの構成要素の間の関係と、の表現を含み得る。サブグラフ150は概念的であり得る。例えば、サブグラフ150は、テーブル、リスト、又は他のデータ構造として、コンピュータメモリに記憶され得る。
いくつかの実施形態において、サブグラフ150は、サブグラフ150を含む新たなデータ構造又はグラフを含み得る。これらの実施形態又は他の実施形態において、サブグラフ150に含められる、抽象コードグラフ130のノードは、新たなデータ構造を生成することなく、抽象コードグラフ130において指定され得る。本開示において、抽象コードグラフ130のノードを選択及び/又は指定してサブグラフ150を形成することは、抽象コードグラフ130から又は抽象コードグラフ130に基づいてサブグラフ150を生成することと呼ばれ得る。
いくつかの実施形態において、サブグラフ150は、抽象コードグラフ130のノードからのものであり得る又は抽象コードグラフ130のノードに基づき得る1つ以上のノードを含み得る。例えば、サブグラフ150は、抽象コードグラフ130のノードから組み込まれる又は抽象コードグラフ130のノードに基づいて生成されるノードを含み得る。いくつかの実施形態において、サブグラフ150は、抽象コードグラフ130のノードを含み得る。いくつかの実施形態において、抽象コードグラフ130は、1つ以上のサブグラフ150を含み得る。例えば、抽象コードグラフ130の1つ以上のノードが、サブグラフ150のうちの1つ以上の一部として指定され得る。本開示において、サブグラフ150の生成は、サブグラフが、抽象コードグラフ130に基づいて生成されるか又は抽象コードグラフ130に含まれるかに関係なく、ノードの選択と呼ばれることがある。
サブグラフ150は、1つ以上のノードを含み得る。サブグラフ150のノードは、ルートノード、1つ以上のブランチノード、及び1つ以上のリーフノードを含み得る。サブグラフ150は、抽象コードグラフ130に基づき得るので、サブグラフ150も、マージノード及び構成ノードを含むことがある。本開示において、サブグラフ150におけるリーフノードは、「スプリット(split)ノード」と呼ばれ得る。本開示において、サブグラフ150のスプリットノードと相関する、抽象コードグラフ130のノードも、「スプリットノード」と呼ばれ得る。抽象コードグラフ130のスプリットノードは、抽象コードグラフ130のリーフノードではないことがある。
いくつかの実施形態において、サブグラフ生成器140は、1つ以上のルールに従って、抽象コードグラフ130の1つ以上のノードを選択し得る。いくつかの実施形態において、サブグラフ150を形成するための上記ルールは、抽象コードグラフ130の少なくとも1つのルートノードが選択されるようなルールを含み得る。追加的又は代替的に、上記ルールは、選択される各ノードが少なくとも1つの他のノードに連結されるようなルールを含むこともある。追加的又は代替的に、上記ルールは、選択される各ノードが1つ以上の連結を介して抽象コードグラフ130の少なくとも1つのルートノードに関連するようなルールを含むこともある。追加的又は代替的に、上記ルールは、抽象コードグラフ130のルートノードから抽象コードグラフ130のリーフノードへの、抽象コードグラフ130における全ての可能なパスが、特定のサブグラフ150におけるスプリットノードと相関する、抽象コードグラフ130における1つのノードしか含まないようなルールを含むこともある。
いくつかの実施形態において、サブグラフ生成器140は、サブグラフを生成するための1つ以上の動作をコンピューティングシステムが実行することを可能にするよう構成されているコード及びルーチンを含み得る。追加的又は代替的に、サブグラフ生成器140は、(例えば、1つ以上の動作を実行する又は1つ以上の動作の実行を制御する)プロセッサ、(例えば、1つ以上の動作を実行する又は1つ以上の動作の実行を制御する)マイクロプロセッサ、FPGA、又はASICを含むハードウェアを使用して実装されてもよい。いくつかの他の例において、サブグラフ生成器140は、ハードウェアとソフトウェアとの組合せを使用して実装され得る。本開示において、サブグラフ生成器140により実行されるとして説明される動作は、システムに実行するようにサブグラフ生成器140が指示し得る動作を含み得る。
本開示の範囲から逸脱することなく、サブグラフ生成器140に対して、変更、追加、又は省略が可能である。例えば、いくつかの実施形態において、サブグラフ生成器140は、抽象構文木110から又はソースコードからサブグラフ150を生成することができる。いくつかの実施形態において、サブグラフ生成器140は、いずれのルールとも無関係に、ノードの全ての可能な組合せを生成することができる。さらに、動作の順序は、異なる実装に応じて変わり得る。
図1Fを参照することに戻ると、サブグラフの例が、図1Fの抽象コードグラフ130Aに関して示される。サブグラフ150は、抽象コードグラフ130Aと別個のものであり得るが、本開示において、抽象コードグラフ130Aの1つ以上のノードは、サブグラフ150の一部として参照され得る。
特定のサブグラフを生成する例として、抽象ルートノード102、ルートノード103A、抽象ブランチノード105A、ブランチノード106A、抽象リーフノード108C、抽象リーフノード108H、抽象ブランチノード105B、ブランチノード106B、抽象リーフノード108F、及び抽象リーフノード108Gの全てが、特定のサブグラフの一部として選択され得る。
上記において、サブグラフ生成器140の動作に関して、いくつかのルールが説明された。いくつかの実施形態において、1つ以上のこれらのルールは、有効なサブグラフ150を決定するために、サブグラフ生成器140により実施され得る。ここで、ルールに従ってサブグラフを生成する例及びルールに違反するサブグラフの例が示される。しかしながら、サブグラフ生成器140は、上述したルール以外の1つ以上の他のルールを使用して、サブグラフ150を生成してもよい。
サブグラフ生成器140は、抽象コードグラフ130Aの少なくとも1つのルートノードが選択されるようなルールを実施することができ、次いで、有効なサブグラフ150が全て、抽象ルートノード102を含み得るようになる。すなわち、抽象ルートノード102を含まないサブグラフ150は、抽象コードグラフ130Aの少なくとも1つのルートノードが選択されるようなルールに違反する。例えば、抽象ブランチノード105A、ブランチノード106A、抽象リーフノード108C、及び抽象リーフノード108Hは、単独で、抽象コードグラフ130Aの少なくとも1つのルートノードが選択されるようなルールに従った有効なサブグラフを形成しない。しかしながら、図1Fの抽象ブランチノード105Bは、図1Cの抽象構文木110Cのルートノードであったので、抽象ブランチノード105B、ブランチノード106B、抽象リーフノード108H、抽象リーフノード108F、及び抽象リーフノード108Gは、単独で、抽象コードグラフ130Aの少なくとも1つのルートノードが選択されるようなルールに従った有効なサブグラフを形成することができる。
サブグラフ生成器140は、選択される各ノードが少なくとも1つの他のノードに連結されるようなルールを実施することができ、次いで、有効なサブグラフ150が、少なくとも1つの他のノードに連結されていないノードを含み得ないようになる。すなわち、連結を有しないノードを含むサブグラフ150は、選択される各ノードが少なくとも1つの他のノードに連結されるようなルールに違反する。例えば、抽象ルートノード102、ルートノード103A、抽象ブランチノード105A、及び抽象リーフノード108Cは、選択される各ノードが少なくとも1つの他のノードに連結されるようなルールに従った有効なサブグラフを形成しない。
サブグラフ生成器140は、選択される各ノードが1つ以上の連結を介して抽象コードグラフ130Aの少なくとも1つのルートノードに関連するようなルールを実施することができ、次いで、有効なサブグラフ150が、1つ以上の連結を介して抽象コードグラフ130Aのルートノードに関連しないノードを含み得ないようになる。すなわち、1つ以上の連結を介して抽象コードグラフ130Aのルートノードに関連しない1つ以上のノードを含むサブグラフ150は、選択される各ノードが1つ以上の連結を介して抽象コードグラフ130Aの少なくとも1つのルートノードに関連するようなルールに違反する。例えば、抽象ルートノード102、ルートノード103A、抽象ブランチノード105A、抽象ブランチノード105B、抽象リーフノード108F、及び抽象リーフノード108Gは、選択される各ノードが1つ以上の連結を介して抽象コードグラフ130Aの少なくとも1つのルートノードに関連するようなルールに従ったサブグラフを形成しない。
いくつかの実施形態において、選択される各ノードが1つ以上の連結を介して抽象コードグラフ130Aの少なくとも1つのルートノードに関連するようなルールにおいて参照されるルートノードに対する関連は、より抽象的なものからより抽象的でないものへと一様に至らせる関連又は親から子へと至らせる関連を含み得ない。例えば、抽象ルートノード102、ルートノード103A、抽象ブランチノード105A、ブランチノード106A、抽象リーフノード108H、ブランチノード106B、及び抽象リーフノード108Gは、選択される各ノードが1つ以上の連結を介して抽象コードグラフ130Aの少なくとも1つのルートノードに関連するようなルールに従った有効なサブグラフを形成しない。なぜならば、抽象リーフノード108Gは、より抽象的なものからより抽象的でないものへと至らせる連結(ブランチノード106Bと抽象リーフノード108Hとの間の連結)を介して抽象ルートノード102に関連するからである。
本開示において、抽象コードグラフ130Aのルートノードから抽象コードグラフ130Aのリーフノードへの、抽象コードグラフ130Aにおける全ての可能なパスが、特定のサブグラフ150におけるスプリットノードと相関する、抽象コードグラフ130Aにおける1つのノードしか含まないようなルールは、「スプリットノードルール」と呼ばれ得る。候補サブグラフがスプリットノードルールに従っているかどうかを判定するのをチェックすることに関連する動作が示される。
例示の目的で、候補サブグラフのノードが識別され得る。候補サブグラフのノードの中から、スプリットノードが識別され得る。スプリットノードは、候補サブグラフのリーフノードとして識別され得る。抽象コードグラフ130Aのルートノードから抽象コードグラフ130Aの各リーフノードへのパスが識別され得る。いくつかの実施形態において、「パス」は、最短パスのみを含み得る。例えば、抽象ブランチノード105A及びブランチノード106Aの両方がサブグラフに含められる場合、抽象ルートノード102からルートノード103Aを介し抽象ブランチノード105Bを介しブランチノード106Bを介し抽象リーフノード108Hを介するブランチノード106Aへのパスは、有効なパスとみなされ得ない。また、いくつかの実施形態において、サブグラフは、サブグラフにおける各エッジが向きを持つような有向非巡回グラフとみなされ得る。これらの実施形態又は他の実施形態において、サブグラフの「パス」は、エッジの向きに従うノードの間の連結のみを含み得る。識別されたパスが、スプリットノードと比較されて、パスのうちのいずれかが2つ以上のスプリットノードを含むかどうかが判定され得る。識別されたパスのうちのいずれかが2つ以上のスプリットノードを含むという判定に応じて、この候補サブグラフがスプリットノードルールに従った有効なサブグラフではないという判定がなされ得る。一方、識別されたパスのうちのいずれも2つ以上のスプリットノードを含まないという判定に応じて、この候補サブグラフが、スプリットノードルールに従った有効なサブグラフとして識別され得る。
サブグラフルールの実施の例として、候補サブグラフは、抽象ルートノード102、ルートノード103A、抽象ブランチノード105A、ブランチノード106A、抽象リーフノード108C、抽象リーフノード108H、抽象ブランチノード105B、ブランチノード106B、抽象リーフノード108F、及び抽象リーフノード108Gを含み得る。この例において、候補サブグラフのリーフノード、したがって、スプリットノードは、抽象リーフノード108C、抽象リーフノード108H、抽象リーフノード108F、及び抽象リーフノード108Gを含み得る。抽象ルートノード102から、リーフノード109B、リーフノード109F、リーフノード109D、及びリーフノード109Eへの全てのパスが識別され得る。候補サブグラフは、抽象コードグラフの抽象ルートノード102から抽象コードグラフのリーフノード109の各々への全ての可能なパスが1つのスプリットノードしか含まないスプリットノードルールの下での有効なサブグラフであり得る。例えば、抽象ルートノード102からリーフノード109Bへの全ての可能なパスは、1つのスプリットノードすなわち抽象リーフノード108Hしか含まない。さらに、抽象ルートノード102からリーフノード109Fへの全ての可能なパスは、1つのスプリットノードすなわち抽象ブランチノード108Hしか含まない。さらに、抽象ルートノード102からリーフノード109Dへの全ての可能なパスは、1つのスプリットノードすなわち抽象リーフノード108Fしか含まない。さらに、抽象ルートノード102からリーフノード109Eへの全ての可能なパスは、1つのスプリットノードしか含まない。
このサブグラフルールに違反する候補サブグラフの例は、抽象ルートノード102、ルートノード103A、抽象ブランチノード105A、ブランチノード106A、抽象リーフノード108C、抽象リーフノード108H、及び抽象ブランチノード105Bだけを含むサブグラフである。この候補サブグラフは、抽象ルートノード102とリーフノード109Fとの間に2つのスプリットノードを含むパスが存在するので、スプリットノードルールに従った有効なサブグラフではない。有効なサブグラフのスプリットノードは、抽象リーフノード108C、抽象リーフノード108H、及び抽象ブランチノード105Bである。2つのスプリットノードを含むパスは、抽象ルートノード102からルートノード103Aを介し抽象ブランチノード105Bを介しブランチノード106Aを介し抽象リーフノード108Hを介し抽象リーフノード108Iを介するリーフノード109Fへのパスである。このパスは、抽象ブランチノード105B及び抽象リーフノード108Hの両方を含み、これらの両方はスプリットノードである。
サブグラフ150は、説明されたルールのうちのどれにも従わないこともあるし、説明されたルールのうちの1つに従うこともあるし、説明されたルールのうちのいくつかに従うこともあるし、説明されたルールの全てに従うこともある。すなわち、サブグラフ生成器140は、説明されたルールのうちのどれも実施しないこともあるし、説明されたルールのうちの1つを実施することもあるし、説明されたルールのうちのいくつかを実施することもあるし、説明されたルールの全てを実施することもある。いくつかの実施形態において、本開示に記載のルールを表現又は実装する異なる方法が存在し得る。例えば、選択される各ノードが少なくとも1つの他のノードに連結されるようなルールは、「分離ノード無」と表現され得る。いくつかの実施形態において、サブグラフ150を特徴付ける追加の又は代替のルールが存在することもある。
いくつかの実施形態において、サブグラフを特徴付けるルールは、サブグラフの原理(principle)に関連し得る。サブグラフの原理は、サブグラフに基づくソースコードの再構築に関連し得る。例えば、再構築されるソースコードは、サブグラフに基づいて生成され得る。再構築は、ソースコードの各構成要素を、サブグラフからの当該構成要素の表現で置換し得る。いくつかの実施形態において、再構築は、ソースコードの各構成要素を、サブグラフにおいて見つけられた、当該構成要素の最も抽象的でない表現で置換し得る。いくつかの実施形態において、先祖ノードを使用して、サブグラフではなく抽象コードグラフ130Aに含まれる子孫ノードを表現することができる。サブグラフの原理は、サブグラフからの最も抽象的でない表現が再構築において使用される場合、再構築において、各構成要素が1つの抽象度で表現されることが可能であるだけであり得ることを含み得る。例えば、抽象ルートノード102、ルートノード103A、抽象ブランチノード105A、ブランチノード106A、抽象リーフノード108C、抽象リーフノード108H、及び抽象ブランチノード105Bの上記で与えられた例において、抽象ブランチノード105B及び抽象リーフノード108Hの両方を使用して、ソースコード内の異なる位置においてリーフノード109Fにより表現される構成要素を表現することができる。
図1Aに戻ると、いくつかの実施形態において、システム100は、抽象コードグラフ解析器160を含み得る。概して、抽象コードグラフ解析器160は、1つ以上の抽象コードグラフ130及び/又は1つ以上のサブグラフ150を解析するよう構成され得る。
例えば、いくつかの実施形態において、抽象コードグラフ解析器160は、抽象コードグラフ130を他の抽象コードグラフと比較するよう構成され得る。いくつかの実施形態において、抽象コードグラフ解析器160は、抽象コードグラフ130を、同じソフトウェアプログラムからの他の抽象コードグラフと比較することができる。これらの実施形態又は他の実施形態において、抽象コードグラフ解析器160は、抽象コードグラフ130を、他のソフトウェアプログラムからの他の抽象コードグラフ(例えば、ビッグコードから生成された他の抽象コードグラフ)と比較することができる。例えば、いくつかの実施形態において、抽象コードグラフ解析器160は、抽象コードグラフ130を、ビッグコードからの抽象コードグラフと比較して、テスト対象コードにおいて見つけられ得る頻出コードパターンを識別することができる。これらの実施形態又は他の実施形態において、抽象コードグラフ解析器160は、ビッグコードの1つ以上の抽象コードグラフ130の比較を用いて、頻出コードパターンを識別することができる。
例えば、いくつかの実施形態において、抽象コードグラフ解析器160は、1つ以上のサブグラフ150を他のサブグラフと比較するよう構成され得る。いくつかの実施形態において、抽象コードグラフ解析器160は、1つ以上のサブグラフ150を、同じソフトウェアプログラムからの他のサブグラフと比較することができる。これらの実施形態又は他の実施形態において、抽象コードグラフ解析器160は、1つ以上のサブグラフ150を、他のソフトウェアプログラムからの他のサブグラフ(例えば、ビッグコードから生成された他のサブグラフ)と比較することができる。例えば、いくつかの実施形態において、抽象コードグラフ解析器160は、1つ以上のサブグラフ150を、ビッグコードからのサブグラフと比較して、テスト対象コードにおいて見つけられ得る頻出コードパターンを識別することができる。これらの実施形態又は他の実施形態において、抽象コードグラフ解析器160は、ビッグコードの1つ以上のサブグラフの比較を用いて、頻出コードパターンを識別することができる。
追加的又は代替的に、抽象コードグラフ解析器160は、1つ以上の抽象コードグラフ130を1つ以上のサブグラフ150と比較することもある。抽象コードグラフ130及びサブグラフ150の一方又は両方は、同じソフトウェアプログラムからのものであることもあるし、異なるソフトウェアプログラムからのものであることもあるし、ビッグコードからのものであることもある。
いくつかの実施形態において、抽象コードグラフ解析器160は、2つ以上の抽象コードグラフ130の1つ以上のノード及び/又は2つ以上の抽象コードグラフ130の構造全体を比較することにより、2つ以上の抽象コードグラフ130を互いと比較することができる。いくつかの実施形態において、システム100は、ハッシュ値を生成するための任意の適切な動作に従って、抽象コードグラフ130のうちの1つ以上を表すハッシュ値を生成することができる。いくつかの実施形態において、抽象コードグラフ解析器160は、1つ以上の抽象コードグラフ130のハッシュ値を比較することができる。
抽象コードグラフ130及び/又はサブグラフ150を比較する例について、いくつかの実施形態において、ソースコードが、抽象コードグラフ130及び/又はサブグラフ150から再構築され得る。再構築されたソースコードは、例えば、元々のソースコードと同じ構成要素を含むことによって等、元々のソースコードに関連し得る。しかしながら、再構築されたソースコードは、構成要素のうちの1つ以上の構成要素の抽象的表現を含み得るのに対し、元々のソースコードは、文字通りの構成要素を含み得る。再構築されたソースコードは、テキストを含み得る。再構築されたソースコードのテキストは、例えばメッセージダイジェスト5(MD5)等、ハッシュ化アルゴリズムによりハッシュ化され得る。ハッシュ化アルゴリズムは、ハッシュ値を生成し得る。ハッシュ化アルゴリズムは、例えばビッグコードからのものであり得る抽象コードグラフ130及び/又はサブグラフ150に対して実行され得る。ハッシュ値が比較され得る。ハッシュ値間の一致は、ハッシュ値が基づくテキストが関連する又は同じであることを示し得る。
いくつかの実施形態において、抽象コードグラフ解析器160は、抽象コードグラフを解析するための1つ以上の動作をコンピューティングシステムが実行することを可能にするよう構成されているコード及びルーチンを含み得る。追加的又は代替的に、抽象コードグラフ解析器160は、(例えば、1つ以上の動作を実行する又は1つ以上の動作の実行を制御する)プロセッサ、(例えば、1つ以上の動作を実行する又は1つ以上の動作の実行を制御する)マイクロプロセッサ、FPGA、又はASICを含むハードウェアを使用して実装されてもよい。いくつかの他の例において、抽象コードグラフ解析器160は、ハードウェアとソフトウェアとの組合せを使用して実装され得る。本開示において、抽象コードグラフ解析器160により実行されるとして説明される動作は、システムに実行するように抽象コードグラフ解析器160が指示し得る動作を含み得る。
本開示の範囲から逸脱することなく、抽象コードグラフ解析器160に対して、変更、追加、又は省略が可能である。さらに、動作の順序は、異なる実装に応じて変わり得る。
システム100を使用して、特定のソフトウェアプログラムを解析することができる。特定のソフトウェアプログラムは、テスト対象ソフトウェアであり得る。システム100は、特定のソフトウェアプログラムに関連する抽象構文木110を生成することができる。追加的又は代替的に、抽象コードグラフ生成器120が、特定のソフトウェアプログラムに関連する抽象コードグラフ130を生成することもある。追加的又は代替的に、サブグラフ生成器140が、抽象コードグラフ130に関連する1つ以上のサブグラフ150を生成することもある。追加的又は代替的に、抽象コードグラフ解析器160が、特定のソフトウェアプログラムに関連する抽象コードグラフ130及び/又はサブグラフ150のうちの1つ以上を解析することもある。特定のソフトウェアプログラムの解析は、抽象コードグラフ130及び/又はサブグラフ150と、ビッグコードからのソフトウェアプログラムを含み得る他のソフトウェアプログラムと、の比較を含み得る。
追加的又は代替的に、システム100を使用して、ビッグコードを解析することもできる。システム100は、一度に、ビッグコードにおいて見つけられた1つのソフトウェアプログラムを解析することができる。システム100は、解析結果のリポジトリを形成することができる。例えば、システム100は、ビッグコードにおいて見つけられたソフトウェアプログラムに関連する抽象構文木110を生成することができる。追加的又は代替的に、抽象コードグラフ生成器120が、ビッグコードにおいて見つけられたソフトウェアプログラムに関連する抽象コードグラフ130を生成することもある。追加的又は代替的に、サブグラフ生成器140が、ビッグコードにおいて見つけられたソフトウェアプログラムに関連する1つ以上のサブグラフ150を生成することもある。追加的又は代替的に、抽象コードグラフ解析器160が、ビッグコードにおいて見つけられたソフトウェアプログラムに関連する抽象コードグラフ130及び/又はサブグラフ150のうちの1つ以上を解析することもある。ビッグコードの解析から生じる抽象構文木110、抽象コードグラフ130、及び/又はサブグラフ150のうちの1つ以上は、リポジトリに記憶され得る。追加的又は代替的に、識別された1つ以上のコードパターンが、リポジトリに記憶されることもある。
いくつかの実施形態において、システム100は、ビッグコードのソフトウェアプログラムの解析に基づいて、ビッグコードにおける頻出コードパターンを識別することができる。例えば、システム100は、特定のソフトウェアプログラムを解析することができ、特定のソフトウェアプログラムに基づいて、抽象構文木110、抽象コードグラフ130、及び1つ以上のサブグラフ150を生成することができる。システム100は、抽象構文木110、抽象コードグラフ130、及び/又はサブグラフ150を、リポジトリの他の抽象構文木、他の抽象コードグラフ、及び/又は他のサブグラフと比較することができる。いくつかの実施形態において、例えば、特定のソフトウェアプログラムの特定の抽象コードグラフ130は、リポジトリの他の抽象コードグラフ130のうちの1つ以上と相関し得、システム100は、特定の抽象コードグラフ130の出現の数のカウンタをインクリメントすることができる。
いくつかの実施形態において、抽象コードグラフ130及び/又はサブグラフ150を記憶するのではなく、抽象コードグラフ130及び/又はサブグラフ150を表すデータ値が、リポジトリに記憶され得る。例えば、抽象コードグラフ130及び/又はサブグラフ150を表すハッシュ値が記憶され得る。抽象コードグラフ解析器160は、1つ以上の抽象コードグラフ130及び/又はサブグラフ150のハッシュ値を比較することができる。いくつかの実施形態において、リポジトリは、抽象コードグラフ130及び/又はサブグラフ150の1つのインスタンスのみを含み得、解析された特定の抽象コードグラフ130及び/又はサブグラフ150の出現の数のカウントを含み得る。追加的又は代替的に、リポジトリは、抽象コードグラフ130及び/又はサブグラフ150を表すハッシュ値と、解析された特定の抽象コードグラフ130及び/又はサブグラフ150の出現の数のカウントと、だけを含み得る。
いくつかの実施形態において、頻出コードパターンが、ビッグコードにおける抽象コードグラフ130及び/又はサブグラフ150の出現の頻度に基づいて識別され得る。本開示において、ビッグコード又はテスト対象ソフトウェアにおける、抽象コードグラフへと抽象化され得るコードの出現は、ビッグコード又はテスト対象ソフトウェアにおける抽象コードグラフの出現と呼ばれ得る。本開示において、抽象コードグラフを頻出コードパターンとして識別することは、抽象コードグラフが基づくコードを頻出コードパターンとして識別することを指し得る。
例えば、ビッグコードの解析により、特定の抽象コードグラフ130が、閾数等の閾値よりも多くビッグコードにおいて出現したと判定された場合、抽象コードグラフ130及び/又は抽象コードグラフ130に関連するソースコードが、頻出コードパターンとして識別され得る。これらの実施形態又は他の実施形態において、閾値は、解析及び/又は生成された抽象コードグラフの総数;及び/又は、リポジトリのサイズ;に基づき得る。例えば、閾値は、リポジトリにおける抽象コードグラフの総数のパーセンテージであり得る。追加的又は代替的に、閾値は、解析されたソフトウェアプログラムの数に基づくこともある。例えば、リポジトリの抽象コードグラフが頻出コードパターンに関連するかどうかの判定は、どれだけの数のソフトウェアプログラムがこの抽象コードグラフに関連付けられているかに基づき得る。例えば、解析された全てのソフトウェアプログラムの75%を超えるソフトウェアプログラムにおいて見つけられた抽象コードグラフは、頻出コードパターンであると判定され得る。
いくつかの実施形態において、1つ以上のソフトウェアプログラムの解析の結果が、デバッグ動作において使用され得る。例えば、テスト対象コードが、システム100により解析され得る。例えば、システム100は、テスト対象ソフトウェアに基づいて、1つ以上のサブグラフ150を生成することができる。システム100は、1つ以上のサブグラフ150を、リポジトリにおいて見つけられた他のソフトウェアの他のサブグラフ150と比較することができる。1つ以上のデバッグ動作は、テスト対象ソフトウェアの特定のサブグラフ150とリポジトリの別のサブグラフとの間の相関を示す、比較の結果に基づき得る。
例えば、ソフトウェア開発中に、プロンプトが、1つ以上の抽象コードグラフ及び/又はサブグラフの比較の結果に基づいて、生成され得る且つ/又は開発者に対して表示され得る。例えば、人間のソフトウェア開発者は、例えば「closable.close();」等のコード行を統合開発環境に入力することができる。このコード行のサブグラフと他のサブグラフとの比較に基づいて、統合開発環境は、例えば「if (closable != null)」等の事前条件を提案することができる。
デバッグ動作において、抽象コードグラフ及び/又はサブグラフの間の比較の結果が使用される別の例において、自動ソフトウェア開発は、抽象コードグラフに基づいてコードを生成することができる。例えば、自動ソフトウェア開発ツールは、リポジトリからの抽象コードグラフに基づいてコードを生成することができる。
デバッグ動作において、抽象コードグラフ及び/又はサブグラフの間の比較の結果が使用される別の例において、ソフトウェアの自動テストが、1つ以上の抽象コードグラフを含む、ソフトウェア解析の結果に基づいてガイドされ得る。例えば、テスト対象ソフトウェアは、潜在的に脆弱であるとして識別された、ビッグコードのコードパターンに対応し得る特定の抽象コードグラフ130を含み得る。ソフトウェアの自動テストは、特定の抽象コードグラフ130に関連するコードにフォーカスし得る。
デバッグ動作において、抽象コードグラフ及び/又はサブグラフの間の比較の結果が使用される別の例において、自動ソフトウェア修復動作は、比較の結果に基づいて修復候補を選択することができる。例えば、テスト対象ソフトウェアは、例えば「closable.close();」等のコード行であり得る。このコード行のサブグラフは、例えば「if (closable != null) closable.close();」等の、ビッグコードからのコード行のサブグラフと相関し得る。ビッグコードからのこのコード行は、これらのサブグラフの相関に基づく、テスト対象ソフトウェアにおけるコード行についての修復候補であり得る。いくつかの実施形態において、リポジトリからのサブグラフは、差分抽象コードグラフに基づき得る。本開示の範囲から逸脱することなく、システム100に対して、変更、追加、又は省略が可能である。例えば、いくつかの実施形態において、抽象コードグラフ解析器160は、コードパターンに対して作用することがある。さらに、動作の順序は、異なる実装に応じて変わり得る。さらに、別個に説明されているが、いくつかの実施形態において、抽象コードグラフ生成器120、サブグラフ生成器140、及び抽象コードグラフ解析器160のうちの2つ以上は、同じシステムの一部であることもあるし、説明されたのとは異なって分割されることもある。本開示におけるこれらの要素と他の要素との間の線引きは、限定的なものではなく、本開示において用いられているコンセプト及び原理の理解及び説明を助けるように意図されている。
図2は、本開示に記載の少なくとも1つの実施形態に従って構成され得る例示的なコンピューティングシステム200のブロック図である。図2に示されているように、システム200は、プロセッサ202、メモリ204、データストレージ206、及び通信ユニット208を含み得る。
概して、プロセッサ202は、様々なコンピュータハードウェア又はソフトウェアモジュールを含む任意の適切な専用又は汎用のコンピュータ、コンピューティングエンティティ、又は処理デバイスを含み得、任意の適用可能なコンピュータ読み取り可能な記憶媒体に記憶されている命令を実行するよう構成され得る。例えば、プロセッサ202は、マイクロプロセッサ、マイクロコントローラ、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、又は、プログラム命令を解釈及び/又は実行し、且つ/又はデータを処理するよう構成されている任意の他のデジタル回路若しくはアナログ回路を含み得る。プロセッサ202は、図2において1つのプロセッサとして示されているが、プロセッサ202は、本開示に記載の任意の数の動作を個別的又は集合的に実行するよう構成されている、任意の数のネットワーク又は物理的位置にわたって分散される任意の数のプロセッサを含んでもよい。
いくつかの実施形態において、プロセッサ202は、メモリ204、データストレージ206、又はメモリ204とデータストレージ206との両方に記憶されているプログラム命令を解釈及び/又は実行し、且つ/又は、メモリ204、データストレージ206、又はメモリ204とデータストレージ206との両方に記憶されているデータを処理することができる。いくつかの実施形態において、プロセッサ202は、データストレージ206からプログラム命令をフェッチして、プログラム命令をメモリ204にロードすることができる。プログラム命令がメモリ204にロードされた後、プロセッサ202は、図1Aの抽象コードグラフ生成器120、サブグラフ生成器140、及び/又は抽象コードグラフ解析器160に関して上述した1つ以上の動作を実行するための命令等のプログラム命令を実行することができる。
メモリ204及びデータストレージ206は、コンピュータ実行可能な命令又はデータ構造を運ぶ又は記憶する1つ以上のコンピュータ読み取り可能な記憶媒体を含み得る。そのようなコンピュータ読み取り可能な記憶媒体は、プロセッサ202等の汎用又は専用のコンピュータによりアクセスされ得る任意の利用可能な媒体を含み得る。限定ではなく例として、そのようなコンピュータ読み取り可能な記憶媒体は、ランダムアクセスメモリ(RAM)、読み取り専用メモリ(ROM)、電気的に消去可能なプログラム可能な読み取り専用メモリ(EEPROM)、コンパクトディスク読み取り専用メモリ(CD-ROM)若しくは他の光ディスクストレージ、磁気ディスクストレージ若しくは他の磁気記憶デバイス、フラッシュメモリデバイス(例えば、ソリッドステートメモリデバイス)、又は、コンピュータ実行可能な命令又はデータ構造の形態の所望のプログラムコードを運ぶ又は記憶するために使用され得る任意の他の記憶媒体であって、汎用又は専用のコンピュータによりアクセスされ得る任意の他の記憶媒体、を含む非一時的なコンピュータ読み取り可能な記憶媒体を含み得る。上記の組合せも、コンピュータ読み取り可能な記憶媒体の範囲に含まれ得る。コンピュータ実行可能な命令は、例えば、プロセッサ202に所定の動作又は動作群を実行させるよう構成されている命令及びデータを含み得る。
本開示の範囲から逸脱することなく、システム200に対して、変更、追加、又は省略が可能である。例えば、データストレージ206は、複数の位置に配置され、ネットワークを介してプロセッサ202によりアクセスされてもよい。
図3は、本開示に記載の少なくとも1つの実施形態に従って構成される、抽象コードグラフを生成するよう構成されている例示的な方法300のフローチャートである。いくつかの実施形態において、方法300に関連付けられている動作のうちの1つ以上の動作は、図1のシステム100により実行され得る。方法300は、任意の適切なシステム、装置、又はデバイスにより実行され得る。例えば、図2のコンピューティングシステム200が、方法300に関連付けられている動作のうちの1つ以上の動作を実行できる。別個のブロックで図示されているが、方法300のブロックのうちの1つ以上のブロックに関連付けられているステップ及び動作は、所望の実装に応じて、追加のブロックに分割されることもあるし、より少ないブロックに組み合わされることもあるし、除去されることもある。概して、方法300は、抽象構文木を得て、抽象構文木に基づいて抽象コードグラフを生成することができる。
方法300は、ブロック310を含み得る。ブロック310において、抽象構文木が得られ得る。抽象構文木は、図1Aの抽象構文木110に関連して上述したものであり得る。ブロック310において得られる抽象構文木は、ソースコードの構成要素と、ソースコード内の構成要素の間の関係と、を表現し得る。図1Bの抽象構文木110Aは、ブロック310において得られる抽象構文木の例であり得る。追加的又は代替的に、図1Dの差分抽象構文木110Dが、ブロック310において得られる抽象構文木の例であることもある。抽象構文木は、第1のASTノード及び第2のASTノードを含み得る。
第1のASTノードは、ソースコード内の第1の位置に配置されている第1の構成要素を表現し得る。第1のASTノードは、第1の構成要素を第1の抽象度で表現し得る。図1Bのリーフノード109Aが、第1のASTノードの例であり得る。「if (closable != null) closable.close();」が、ソースコードの例であり得る。構成要素「closable」が、第1の構成要素の例であり得る。表現「Var closable」が、第1の構成要素(「closable」)を第1の抽象度で表現した例であり得る。例示的なソースコード(「if (closable != null) closable.close();」)内の構成要素「closable」の1番目の出現が、ソースコード内の第1の位置の例であり得る。
第2のASTノードは、ソースコード内の第2の位置に配置されている第2の構成要素を表現し得る。図1Bのブランチノード106Aが、第2のASTノードの例であり得る。構成要素「!=」が、第2の構成要素の例であり得る。ソースコード内の「!=」の位置が、第2の位置の例であり得る。
第1のASTノードは、第1の位置における第1の構成要素と第2の位置における第2の構成要素との間の関係を表現するように、抽象構文木において第2のASTノードに連結され得る。図1Bのリーフノード109Aとブランチノード106Aとの間の連結が、第1のASTノードと第2のASTノードとの間の連結の例であり得る。構成要素「closable」と構成要素「!=」とがソースコード内で互いに関連する点が、第1の構成要素と第2の構成要素との間の関係の例であり得る。
方法300は、ブロック320を含み得る。ブロック320において、抽象コードグラフが、抽象構文木に基づいて生成され得る。抽象コードグラフは、図1Fを参照して上述したものであり得る。図1Fの抽象コードグラフ130Aが、ブロック320において生成される抽象コードグラフの例であり得る。追加的又は代替的に、図1Hの差分抽象コードグラフ130Bが、ブロック320において生成される抽象コードグラフの例であることもある。
ブロック320は、1つ以上のブロックを含み得る。いくつかの実施形態において、ブロック320の内部に示されているブロックは、抽象コードグラフを生成することに関連し得る。いくつかの実施形態において、ブロック320は、省かれることがあり、ブロック320の内部に示されているブロックが、ブロック320とは別個に実行され得る。
いくつかの実施形態において、方法300は、ブロック322を含み得る。ブロック322において、第1のACGノードが、第1のASTノードに基づいて生成され得る。第1のACGノードは、第1の構成要素を第1の抽象度で表現し得る。図1Fのリーフノード109Fが、第1のACGノードの例であり得る。表現「Name closable」が、第1の構成要素(「closable」)を第1の抽象度で表現した例であり得る。
方法300は、ブロック324を含み得る。ブロック324において、第2のACGノードが、第2のASTノードに基づいて生成され得る。図1Fのブランチノード106Aが、第2のACGノードの例であり得る。
方法300は、ブロック326を含み得る。ブロック326において、第3のACGノードが、第1のACGノードに基づいて生成され得る。第3のACGノードは、第1の構成要素を第2の抽象度で表現し得る。第2の抽象度は、第1の抽象度よりも抽象的である。図1Fの抽象リーフノード108Hが、第3のACGノードの例であり得る。表現「Var」が、第1の構成要素(「closable」)を第2の抽象度で表現した例であり得る。表現「Var」が表現「Name closable」よりも抽象的であり得るという事実が、第2の抽象度が第1の抽象度よりも抽象的であることの例であり得る。
第3のACGノードは、第2のACGノードが抽象コードグラフにおいて第3のACGノードを介して第1のACGノードに関連し得るように、第1のACGノードと第2のACGノードとの間に連結され得る。第1のACGノードと第2のACGノードとの間の関連は、第1のASTノードが抽象構文木において第2のASTノードに連結されていることに基づき得る。図1Fのブランチノード106Aと抽象リーフノード108Hとリーフノード109Fとの間の連結が、第2のACGノードと第3のACGノードと第1のACGノードとの間の関連の例であり得る。
いくつかの実施形態において、追加の動作が実行され得る。例えば、抽象構文木は、ソースコード内の第3の位置に配置されている第1の構成要素を表現し得る第3のASTノードをさらに含み得る。第3のASTノードは、第1の構成要素を第1の抽象度で表現し得る。図1Bのリーフノード109Cが、第3のASTノードの例であり得る。例示的なソースコード(「if (closable != null) closable.close();」内の構成要素「closable」の2番目の出現が、ソースコード内の第3の位置の例であり得る。
これらの実施形態又は他の実施形態において、第1のASTノードに基づいて第1のACGノードを生成することは、第1のASTノード及び第3のASTノードの両方が第1の構成要素を第1の抽象度で表現していることに応じて、第1のASTノードと第3のASTノードとを第1のACGノードへとマージすることを含み得る。図1Gのリーフノード109Fと図1Bのリーフノード109Aと図1Bのリーフノード109Cとの間の関係が、第1のASTノードと第3のASTノードとを第1のACGノードへとマージすることの例であり得る。例えば、第1のASTノードの例であり得る図1Bのリーフノード109Aと第2のASTノードの例であり得る図1Bのリーフノード109Cとがマージされて、第1のACGノードが形成され得、ここで、図1Gのリーフノード109Gが、第1のACGの例であり得る。いくつかの実施形態において、第1のASTノードと第3のASTノードとのマージは、第1のACGノードの生成より前に生じることもあるし、第1のACGノードの生成と実質的に同時に生じることもある。
いくつかの実施形態において、追加の動作が実行され得る。例えば、抽象構文木は、ソースコード内の第3の位置に配置されている第3の構成要素を表現し得る第3のASTノードをさらに含み得る。図1Bのブランチノード106Bが、第3のASTノードの例であり得る。構成要素「close()」が、第3の構成要素の例であり得る。
これらの実施形態又は他の実施形態において、抽象構文木は、ソースコード内の第4の位置に配置されている第1の構成要素を表現し得る第4のASTノードであって、第1の構成要素を第1の抽象度で表現する第4のASTノードをさらに含み得る。第3のASTノードは、第3の位置における第3の構成要素と第4の位置における第1の構成要素との間の関係を表現し得るように、抽象構文木において第4のASTノードに連結され得る。図1Bのリーフノード109Cが、第4のASTノードの例であり得る。第4のASTノードは、構成要素「closable」を表現し得る。例示的なソースコード(「if (closable != null) closable.close();」内の構成要素「closable」の2番目の出現が、ソースコード内の第4の位置の例であり得る。表現「Var closable」が、第1の構成要素を第1の抽象度で表現した例であり得る。図1Bのリーフノード109Cとブランチノード106Bとの間の連結が、第3のASTノードと第4のASTノードとの間の連結の例であり得る。構成要素「closable」と構成要素「close()」とがソースコード内で互いに関連する点が、第3の構成要素と第4の構成要素との間の関係の例であり得る。
これらの実施形態又は他の実施形態において、ブロック320は、追加の動作をさらに含み得る。ブロック320は、第4のASTノードに基づいて第4のACGノードを生成することを含み得る。第4のACGノードは、第1の構成要素を第1の抽象度で表現し得る。リーフノード109Cが、第4のACGノードの例であり得る。構成要素「closable」を「Name closable」として表現することが、第1の構成要素を第1の抽象度で表現することの例であり得る。
これらの実施形態又は他の実施形態において、ブロック320は、第3のASTノードに基づいて第5のACGノードを生成することをさらに含み得る。図1Eのブランチノード106Bが、第5のACGノードの例であり得る。
これらの実施形態又は他の実施形態において、ブロック320は、第4のACGノードに基づいて、第1の構成要素を第2の抽象度で表現し得る第6のACGノードを生成することをさらに含み得る。第6のACGノードは、第4のACGノードが抽象コードグラフにおいて第6のACGノードを介して第5のACGノードに関連し得るように、第4のACGノードと第5のACGノードとの間に連結され得る。第4のACGノードと第5のACGノードとの間の関連は、第4のASTノードが抽象構文木において第3のASTノードに連結されていることに基づき得る。図1Eの抽象リーフノード108Dが、第6のACGノードの例であり得る。表現「Var」が、第1の構成要素(「closable」)を第2の抽象度で表現した例であり得る。図1Eのブランチノード106Bと抽象リーフノード108Dとリーフノード109Cとの間の連結が、第5のACGノードと第6のACGノードと第4のACGノードとの間の関連の例であり得る。
これらの実施形態又は他の実施形態において、ブロック320は、第1のACGノード及び第4のACGノードの両方が第1の構成要素を第1の抽象度で表現していることに応じて、第1のACGノードと第4のACGノードとを、第1の構成要素を第1の抽象度で表現する第7のACGノードへとマージすることをさらに含み得る。図1Fのリーフノード109Fが、第7のACGノードの例であり得る。例えば、第1のACGノードの例であり得る図1Eのリーフノード109Aと第4のACGノードの例であり得る図1Eのリーフノード109Cとがマージされて、第7のACGノードが形成され得、ここで、図1Fのリーフノード109Fが、第7のACGノードの例であり得る。いくつかの実施形態において、第1のACGノードと第4のACGノードとのマージは、第1のACGノード及び/又は第4のACGノードの生成より前に生じることもあるし、第1のACGノード及び/又は第4のACGノードの生成と実質的に同時に生じることもある。
これらの実施形態又は他の実施形態において、ブロック320は、第3のACGノード及び第6のACGノードの両方が第1の構成要素を第2の抽象度で表現していることに応じて、第3のACGノードと第6のACGノードとを、第1の構成要素を第2の抽象度で表現する第8のACGノードへとマージすることをさらに含み得る。図1Fの抽象リーフノード108Hが、第8のACGノードの例であり得る。例えば、第3のACGノードの例であり得る図1Eの抽象リーフノード108Aと第6のACGノードの例であり得る図1Eの抽象リーフノード108Dとがマージされて、第8のACGノードが形成され得、ここで、図1Fの抽象リーフノード108Hが、第8のACGノードの例であり得る。いくつかの実施形態において、第3のACGノードと第6のACGノードとのマージは、第3のACGノード及び/又は第6のACGノードの生成より前に生じることもあるし、第3のACGノード及び/又は第6のACGノードの生成と実質的に同時に生じることもある。
本開示の範囲から逸脱することなく、方法300に対して、変更、追加、又は省略が可能である。さらに、動作の順序は、異なる実装に応じて変わり得る。
当業者は、システム100、方法300、並びに、本出願において開示された他のプロセス及び方法に関して、そのようなプロセス及び方法において実行される機能が、異なる順序で実行されることがあることを認識するであろう。さらに、説明されたステップ及び動作は、例として提供されているに過ぎず、これらのステップ及び動作のうちの一部は、開示された実施形態の本質を損なうことなく、任意的であることもあるし、より少ないステップ及び動作に組み合わされることもあるし、追加のステップ及び動作に拡張されることもある。
本開示に記載の実施形態は、以下でより詳細に説明されるような様々なコンピュータハードウェア又はソフトウェアモジュールを含む専用又は汎用のコンピュータの使用を含み得る。
本開示に記載の実施形態は、コンピュータ実行可能な命令又はデータ構造を運ぶ又は記憶するコンピュータ読み取り可能な媒体を使用して実装され得る。そのようなコンピュータ読み取り可能な媒体は、汎用又は専用のコンピュータによりアクセスされ得る任意の利用可能な媒体であり得る。限定ではなく例として、そのようなコンピュータ読み取り可能な媒体は、ランダムアクセスメモリ(RAM)、読み取り専用メモリ(ROM)、電気的に消去可能なプログラム可能な読み取り専用メモリ(EEPROM)、コンパクトディスク読み取り専用メモリ(CD-ROM)若しくは他の光ディスクストレージ、磁気ディスクストレージ若しくは他の磁気記憶デバイス、フラッシュメモリデバイス(例えば、ソリッドステートメモリデバイス)、又は、コンピュータ実行可能な命令又はデータ構造の形態の所望のプログラムコードを運ぶ又は記憶するために使用され得る任意の他の記憶媒体であって、汎用又は専用のコンピュータによりアクセスされ得る任意の他の記憶媒体、を含む非一時的なコンピュータ読み取り可能な記憶媒体を含み得る。これらの実施形態及び他の実施形態において、本開示に記載の「非一時的」という用語は、米国連邦巡回控訴高等裁判所によるIn re Nuijten判決(500 F.3d 1346)(Fed. Cir. 2007)において特許可能な主題の範囲外であると見出されたタイプの一時的な媒体のみを含まないとして解釈されるべきである。上記の組合せも、コンピュータ読み取り可能な媒体の範囲に含まれ得る。
コンピュータ実行可能な命令は、例えば、汎用コンピュータ、専用コンピュータ、又は専用処理デバイス(例えば1つ以上のプロセッサ)に所定の機能又は機能群を実行させる命令及びデータを含み得る。主題が、構造的特徴及び/又は方法的動作に特有の言葉で説明されているが、請求項において定められる主題は、必ずしも、上述した特定の特徴又は動作に限定されるものではないことを理解されたい。そうではなく、上述した特定の特徴及び動作は、請求項を実施する例示的な形態として開示されている。
本開示において使用される場合、「モジュール」又は「コンポーネント」という用語は、モジュール又はコンポーネントの動作を実行するよう構成されている特定のハードウェア実装、及び/又は、コンピューティングシステムの汎用ハードウェア(例えば、コンピュータ読み取り可能な媒体等)に記憶され得る且つ/又はコンピューティングシステムの汎用ハードウェア(例えば、処理デバイス等)により実行され得るソフトウェアオブジェクト又はソフトウェアルーチンを指し得る。いくつかの実施形態において、本開示に記載の異なるコンポーネント、モジュール、エンジン、及びサービスは、コンピューティングシステム上で実行されるオブジェクト又はプロセスとして(例えば、別個のスレッドとして)実装され得る。
本開示に記載のシステム及び方法のうちの一部は、(汎用ハードウェアに記憶される且つ/又は汎用ハードウェアにより実行される)ソフトウェアにより実装されるとして一般に説明されるが、特定のハードウェア実装又はソフトウェアと特定のハードウェア実装との組合せも可能であり企図されている。本説明において、「コンピューティングエンティティ」は、本開示において前に定義された任意のコンピューティングシステム、又は、コンピューティングシステム上で動作する任意のモジュール又はモジュールの組合せであり得る。
本開示及び特に請求項(例えば、請求項の本体部分)において使用される用語は、一般に、「オープンな」用語であるとして意図される(例えば、「~を備える」という用語は、「~を備えるが、~に限定されるものではない」として解釈されるべきであり、「~を有する」という用語は、「少なくとも~を有する」として解釈されるべきであり、「~を含む」という用語は、「~を含むが、~に限定されるものではない」として解釈されるべきである、等)。
さらに、導入される請求項記載事項の特定の数が意図される場合、そのような意図は、当該請求項中に明示的に記載され、そのような記載がない場合、そのような意図は存在しない。例えば、理解の助けとして、請求項中に、請求項記載事項を導入するための「少なくとも1つの」及び「1つ以上の」といった導入句の使用が含まれることがある。しかしながら、このような導入句の使用は、「a」又は「an」といった不定冠詞による請求項記載事項の導入が、同一の請求項中に「1つ以上の」又は「少なくとも1つの」といった導入句と「a」又は「an」といった不定冠詞とが含まれるとしても、当該導入された請求項記載事項を含む特定の請求項が、当該請求項記載事項を1つしか含まない実施形態に限定されることを意味するとして解釈されるべきではない(例えば、「a」及び/又は「an」は、「少なくとも1つの」又は「1つ以上の」を意味するとして解釈されるべきである)。請求項記載事項を導入するために使用される定冠詞の使用についても同じことが当てはまる。
さらに、導入される請求項記載事項の特定の数が明示的に記載されている場合であっても、そのような記載は、少なくとも記載されている数を意味するとして解釈されるべきである(例えば、他の修飾語のない「2つの記載事項」という単なる記載は、少なくとも2つの記載事項又は2つ以上の記載事項を意味する)ことが、当業者であれば認識されよう。さらに、「A、B、及びC等のうちの少なくとも1つ」又は「A、B、及びC等のうちの1つ以上」に類する表記が使用される場合、一般に、そのような構造は、Aのみ、Bのみ、Cのみ、A及びBの両方、A及びCの両方、B及びCの両方、又は、A、B、及びCの全て、等を含むことが意図される。例えば、「及び/又は」という用語の使用は、このように解釈されることが意図される。
さらに、2つ以上の選択可能な用語を表すいかなる離接語又は離接句も、明細書、特許請求の範囲、又は図面のいずれであろうと、それら用語のうちの1つ、それらの用語の組合せ、又は、それらの用語の全てを含む可能性を意図するとして理解されるべきである。例えば、「A又はB」という句は、「A」若しくは「B」又は「A及びB」の可能性を含むとして理解されるべきである。
さらに、「第1の」、「第2の」、「第3の」等といった用語は、本開示において、特定の順序又は数の要素を意味するように必ずしも使用されるとは限らない。一般に、「第1の」、「第2の」、「第3の」等といった用語は、共通識別子としての異なる要素を区別するために使用される。「第1の」、「第2の」、「第3の」等といった用語が特定の順序を意味するという説明がなければ、これらの用語は、特定の順序を意味するとして理解されるべきではない。さらに、「第1の」、「第2の」、「第3の」等といった用語が特定の数の要素を意味するという説明がなければ、これらの用語は、特定の数の要素を意味するとして理解されるべきではない。例えば、第1のウィジェットは、第1のサイドを有するとして記載されることがあり、第2のウィジェットは、第2のサイドを有するとして記載されることがある。第2のウィジェットに関する「第2のサイド」という用語の使用は、第2のウィジェットの当該サイドを、第1のウィジェットの「第1のサイド」と区別するものであり、第2のウィジェットが2つのサイドを有することを意味するものではない。
本開示において記載された全ての例及び条件付き文言は、当該技術を促進させるために本発明者によって寄与されるコンセプト及び本発明を読者が理解するのを助ける教育上の目的のために意図され、そのような具体的に記載された例及び条件に限定されるものではないとして解釈されるべきである。本開示の実施形態が詳細に説明されたが、それら実施形態に対する様々な変形、置換、及び変更が、本開示の主旨及び範囲から逸脱することなく可能であることを理解されたい。
以上の実施形態に関し、さらに以下の付記を開示する。
(付記1)
抽象コードグラフを生成する方法であって、
ソースコードの構成要素と、前記ソースコード内の前記構成要素の間の関係と、を表現する抽象構文木(AST)を得るステップであって、前記抽象構文木は、
前記ソースコード内の第1の位置に配置されている第1の構成要素を表現する第1のASTノードであって、前記第1の構成要素を第1の抽象度で表現する第1のASTノードと、
前記ソースコード内の第2の位置に配置されている第2の構成要素を表現する第2のASTノードであって、前記第1のASTノードは、前記第1の位置における前記第1の構成要素と前記第2の位置における前記第2の構成要素との間の関係を表現するように、前記抽象構文木において前記第2のASTノードに連結される、第2のASTノードと、
を含む、ステップと、
前記抽象構文木に基づいて、抽象コードグラフ(ACG)を生成するステップであって、
前記第1のASTノードに基づいて、前記第1の構成要素を前記第1の抽象度で表現する第1のACGノードを生成することと、
前記第2のASTノードに基づいて、第2のACGノードを生成することと、
前記第1のACGノードに基づいて、前記第1の構成要素を第2の抽象度で表現する第3のACGノードを生成することであって、前記第2の抽象度は、前記第1の抽象度よりも抽象的であり、前記第3のACGノードは、前記第2のACGノードが前記抽象コードグラフにおいて前記第3のACGノードを介して前記第1のACGノードに関連するように、前記第1のACGノードと前記第2のACGノードとの間に連結され、前記第1のACGノードと前記第2のACGノードとの間の関連は、前記第1のASTノードが前記抽象構文木において前記第2のASTノードに連結されていることに基づく、生成することと、
を含むステップと、
を含む、方法。
(付記2)
前記抽象構文木は、前記ソースコード内の第3の位置に配置されている前記第1の構成要素を表現する第3のASTノードであって、前記第1の構成要素を前記第1の抽象度で表現する第3のASTノードをさらに含み、
前記第1のASTノードに基づいて、前記第1のACGノードを生成することは、前記第1のASTノード及び前記第3のASTノードの両方が前記第1の構成要素を前記第1の抽象度で表現していることに応じて、前記第1のASTノードと前記第3のASTノードとを前記第1のACGノードへとマージすることを含む、付記1に記載の方法。
(付記3)
前記抽象構文木は、前記ソースコード内の第3の位置に配置されている第3の構成要素を表現する第3のASTノードをさらに含み、
前記抽象構文木は、前記ソースコード内の第4の位置に配置されている前記第1の構成要素を表現する第4のASTノードであって、前記第1の構成要素を前記第1の抽象度で表現する第4のASTノードをさらに含み、前記第3のASTノードは、前記第3の位置における前記第3の構成要素と前記第4の位置における前記第1の構成要素との間の関係を表現するように、前記抽象構文木において前記第4のASTノードに連結され、
前記抽象コードグラフを生成する前記ステップは、
前記第4のASTノードに基づいて、前記第1の構成要素を前記第1の抽象度で表現する第4のACGノードを生成することと、
前記第3のASTノードに基づいて、第5のACGノードを生成することと、
前記第4のACGノードに基づいて、前記第1の構成要素を前記第2の抽象度で表現する第6のACGノードを生成することであって、前記第6のACGノードは、前記第4のACGノードが前記抽象コードグラフにおいて前記第6のACGノードを介して前記第5のACGノードに関連するように、前記第4のACGノードと前記第5のACGノードとの間に連結され、前記第4のACGノードと前記第5のACGノードとの間の関連は、前記第4のASTノードが前記抽象構文木において前記第3のASTノードに連結されていることに基づく、生成することと、
前記第1のACGノード及び前記第4のACGノードの両方が前記第1の構成要素を前記第1の抽象度で表現していることに応じて、前記第1のACGノードと前記第4のACGノードとを、前記第1の構成要素を前記第1の抽象度で表現する第7のACGノードへとマージすることと、
前記第3のACGノード及び前記第6のACGノードの両方が前記第1の構成要素を前記第2の抽象度で表現していることに応じて、前記第3のACGノードと前記第6のACGノードとを、前記第1の構成要素を前記第2の抽象度で表現する第8のACGノードへとマージすることと、
をさらに含む、付記1に記載の方法。
(付記4)
前記抽象構文木は、差分抽象構文木を含み、
前記差分抽象構文木は、
前記ソースコードの前記構成要素と、
前記ソースコード内の前記構成要素の間の前記関係と、
他のソースコードの他の構成要素と、
前記他のソースコード内の前記他の構成要素の間の関係と、
前記構成要素と前記他の構成要素との間の関係と、
を表現し、
前記方法は、
前記差分抽象構文木を生成するステップであって、
前記ソースコードの前記構成要素と、前記ソースコード内の前記構成要素の間の前記関係と、を表現する第1の抽象構文木を得ることであって、前記第1の抽象構文木は、前記ソースコード内の第3の位置に配置されている第3の構成要素を表現する第3のASTノードを含む、得ることと、
前記他のソースコードの前記他の構成要素と、前記他のソースコード内の前記他の構成要素の間の前記関係と、を表現する第2の抽象構文木を得ることであって、前記第2の抽象構文木は、前記他のソースコード内の第4の位置に配置されている前記第3の構成要素を表現する第4のASTノードを含む、得ることと、
前記第3のASTノード及び前記第4のASTノードの両方が前記第3の構成要素を表現していることに応じて、前記第3のASTノードと前記第4のASTノードとを、前記第3の構成要素を表現する、前記差分抽象構文木の第5のASTノードへとマージすることと、
を含む、ステップ
をさらに含む、付記1に記載の方法。
(付記5)
前記抽象コードグラフを、複数の既存のソフトウェアプログラムに基づく複数の抽象コードグラフと比較するステップと、
前記抽象コードグラフを前記複数の抽象コードグラフと比較したことに基づいて、前記複数の既存のソフトウェアプログラムの中での、前記抽象コードグラフに対応するコードパターンの出現を識別するステップと、
前記出現を識別したことに基づいて、前記ソースコードについてデバッグ動作を実行するステップと、
をさらに含む、付記1に記載の方法。
(付記6)
1つ以上のサブグラフルールに従って、前記抽象コードグラフのサブグラフを得るステップであって、前記サブグラフは、1つ以上のACGノードを含む、ステップ
をさらに含む、付記1に記載の方法。
(付記7)
前記1つ以上のサブグラフルールに従って、全ての可能なサブグラフを得るステップ
をさらに含む、付記6に記載の方法。
(付記8)
前記サブグラフは、前記サブグラフのリーフノードである1つ以上のスプリットノードを含み、前記1つ以上のサブグラフルールは、前記抽象コードグラフのルートノードから前記抽象コードグラフのリーフノードへの、前記抽象コードグラフにおける全ての可能なパスが、前記サブグラフのスプリットノードと相関する、前記抽象コードグラフにおける1つのノードしか含まないことを含む、付記6に記載の方法。
(付記9)
前記サブグラフを、複数の既存のソフトウェアプログラムに基づく複数のサブグラフと比較するステップと、
前記サブグラフを前記複数のサブグラフと比較したことに基づいて、前記複数の既存のソフトウェアプログラムの中での、前記サブグラフに対応するコードパターンの出現を識別するステップと、
前記出現を識別したことに基づいて、前記ソースコードについてデバッグ動作を実行するステップと、
をさらに含む、付記6に記載の方法。
(付記10)
システムに複数の動作を実行させるよう構成されているコンピュータ実行可能な命令を含む1つ以上のコンピュータ読み取り可能な記憶媒体であって、前記複数の動作は、
ソースコードの構成要素と、前記ソースコード内の前記構成要素の間の関係と、を表現する抽象構文木(AST)を得る動作であって、前記抽象構文木は、
前記ソースコード内の第1の位置に配置されている第1の構成要素を表現する第1のASTノードであって、前記第1の構成要素を第1の抽象度で表現する第1のASTノードと、
前記ソースコード内の第2の位置に配置されている第2の構成要素を表現する第2のASTノードであって、前記第1のASTノードは、前記第1の位置における前記第1の構成要素と前記第2の位置における前記第2の構成要素との間の関係を表現するように、前記抽象構文木において前記第2のASTノードに連結される、第2のASTノードと、
を含む、動作と、
前記抽象構文木に基づいて、抽象コードグラフ(ACG)を生成する動作であって、
前記第1のASTノードに基づいて、前記第1の構成要素を前記第1の抽象度で表現する第1のACGノードを生成することと、
前記第2のASTノードに基づいて、第2のACGノードを生成することと、
前記第1のACGノードに基づいて、前記第1の構成要素を第2の抽象度で表現する第3のACGノードを生成することであって、前記第2の抽象度は、前記第1の抽象度よりも抽象的であり、前記第3のACGノードは、前記第2のACGノードが前記抽象コードグラフにおいて前記第3のACGノードを介して前記第1のACGノードに関連するように、前記第1のACGノードと前記第2のACGノードとの間に連結され、前記第1のACGノードと前記第2のACGノードとの間の関連は、前記第1のASTノードが前記抽象構文木において前記第2のASTノードに連結されていることに基づく、生成することと、
を含む動作と、
を含む、1つ以上のコンピュータ読み取り可能な記憶媒体。
(付記11)
前記抽象構文木は、前記ソースコード内の第3の位置に配置されている前記第1の構成要素を表現する第3のASTノードであって、前記第1の構成要素を前記第1の抽象度で表現する第3のASTノードをさらに含み、
前記第1のASTノードに基づいて、前記第1のACGノードを生成することは、前記第1のASTノード及び前記第3のASTノードの両方が前記第1の構成要素を前記第1の抽象度で表現していることに応じて、前記第1のASTノードと前記第3のASTノードとを前記第1のACGノードへとマージすることを含む、付記10に記載の1つ以上のコンピュータ読み取り可能な記憶媒体。
(付記12)
前記抽象構文木は、前記ソースコード内の第3の位置に配置されている第3の構成要素を表現する第3のASTノードをさらに含み、
前記抽象構文木は、前記ソースコード内の第4の位置に配置されている前記第1の構成要素を表現する第4のASTノードであって、前記第1の構成要素を前記第1の抽象度で表現する第4のASTノードをさらに含み、前記第3のASTノードは、前記第3の位置における前記第3の構成要素と前記第4の位置における前記第1の構成要素との間の関係を表現するように、前記抽象構文木において前記第4のASTノードに連結され、
前記抽象コードグラフを生成する前記動作は、
前記第4のASTノードに基づいて、前記第1の構成要素を前記第1の抽象度で表現する第4のACGノードを生成することと、
前記第3のASTノードに基づいて、第5のACGノードを生成することと、
前記第4のACGノードに基づいて、前記第1の構成要素を前記第2の抽象度で表現する第6のACGノードを生成することであって、前記第6のACGノードは、前記第4のACGノードが前記抽象コードグラフにおいて前記第6のACGノードを介して前記第5のACGノードに関連するように、前記第4のACGノードと前記第5のACGノードとの間に連結され、前記第4のACGノードと前記第5のACGノードとの間の関連は、前記第4のASTノードが前記抽象構文木において前記第3のASTノードに連結されていることに基づく、生成することと、
前記第1のACGノード及び前記第4のACGノードの両方が前記第1の構成要素を前記第1の抽象度で表現していることに応じて、前記第1のACGノードと前記第4のACGノードとを、前記第1の構成要素を前記第1の抽象度で表現する第7のACGノードへとマージすることと、
前記第3のACGノード及び前記第6のACGノードの両方が前記第1の構成要素を前記第2の抽象度で表現していることに応じて、前記第3のACGノードと前記第6のACGノードとを、前記第1の構成要素を前記第2の抽象度で表現する第8のACGノードへとマージすることと、
をさらに含む、付記10に記載の1つ以上のコンピュータ読み取り可能な記憶媒体。
(付記13)
前記抽象構文木は、差分抽象構文木を含み、
前記差分抽象構文木は、
前記ソースコードの前記構成要素と、
前記ソースコード内の前記構成要素の間の前記関係と、
他のソースコードの他の構成要素と、
前記他のソースコード内の前記他の構成要素の間の関係と、
前記構成要素と前記他の構成要素との間の関係と、
を表現し、
前記複数の動作は、
前記差分抽象構文木を生成する動作であって、
前記ソースコードの前記構成要素と、前記ソースコード内の前記構成要素の間の前記関係と、を表現する第1の抽象構文木を得ることであって、前記第1の抽象構文木は、前記ソースコード内の第3の位置に配置されている第3の構成要素を表現する第3のASTノードを含む、得ることと、
前記他のソースコードの前記他の構成要素と、前記他のソースコード内の前記他の構成要素の間の前記関係と、を表現する第2の抽象構文木を得ることであって、前記第2の抽象構文木は、前記他のソースコード内の第4の位置に配置されている前記第3の構成要素を表現する第4のASTノードを含む、得ることと、
前記第3のASTノード及び前記第4のASTノードの両方が前記第3の構成要素を表現していることに応じて、前記第3のASTノードと前記第4のASTノードとを、前記第3の構成要素を表現する、前記差分抽象構文木の第5のASTノードへとマージすることと、
を含む、動作
をさらに含む、付記10に記載の1つ以上のコンピュータ読み取り可能な記憶媒体。
(付記14)
前記複数の動作は、
前記抽象コードグラフを、複数の既存のソフトウェアプログラムに基づく複数の抽象コードグラフと比較する動作と、
前記抽象コードグラフを前記複数の抽象コードグラフと比較したことに基づいて、前記複数の既存のソフトウェアプログラムの中での、前記抽象コードグラフに対応するコードパターンの出現を識別する動作と、
前記出現を識別したことに基づいて、前記ソースコードについてデバッグ動作を実行する動作と、
をさらに含む、付記10に記載の1つ以上のコンピュータ読み取り可能な記憶媒体。
(付記15)
前記複数の動作は、
1つ以上のサブグラフルールに従って、前記抽象コードグラフのサブグラフを得る動作であって、前記サブグラフは、1つ以上のACGノードを含む、動作
をさらに含む、付記10に記載の1つ以上のコンピュータ読み取り可能な記憶媒体。
(付記16)
前記サブグラフは、前記サブグラフのリーフノードである1つ以上のスプリットノードを含み、前記1つ以上のサブグラフルールは、前記抽象コードグラフのルートノードから前記抽象コードグラフのリーフノードへの、前記抽象コードグラフにおける全ての可能なパスが、前記サブグラフのスプリットノードと相関する、前記抽象コードグラフにおける1つのノードしか含まないことを含む、付記15に記載の1つ以上のコンピュータ読み取り可能な記憶媒体。
(付記17)
前記複数の動作は、
前記サブグラフを、複数の既存のソフトウェアプログラムに基づく複数のサブグラフと比較する動作と、
前記サブグラフを前記複数のサブグラフと比較したことに基づいて、前記複数の既存のソフトウェアプログラムの中での、前記サブグラフに対応するコードパターンの出現を識別する動作と、
前記出現を識別したことに基づいて、前記ソースコードについてデバッグ動作を実行する動作と、
をさらに含む、付記15に記載の1つ以上のコンピュータ読み取り可能な記憶媒体。
(付記18)
システムであって、
1つ以上のプロセッサと、
前記1つ以上のプロセッサに通信可能に接続され、命令を記憶している1つ以上のコンピュータ読み取り可能な記憶媒体であって、前記命令は、前記1つ以上のプロセッサによる実行に応じて、前記システムに複数の動作を実行させるよう構成されており、前記複数の動作は、
ソースコードの構成要素と、前記ソースコード内の前記構成要素の間の関係と、を表現する抽象構文木(AST)を得る動作であって、前記抽象構文木は、
前記ソースコード内の第1の位置に配置されている第1の構成要素を表現する第1のASTノードであって、前記第1の構成要素を第1の抽象度で表現する第1のASTノードと、
前記ソースコード内の第2の位置に配置されている第2の構成要素を表現する第2のASTノードであって、前記第1のASTノードは、前記第1の位置における前記第1の構成要素と前記第2の位置における前記第2の構成要素との間の関係を表現するように、前記抽象構文木において前記第2のASTノードに連結される、第2のASTノードと、
を含む、動作と、
前記抽象構文木に基づいて、抽象コードグラフ(ACG)を生成する動作であって、
前記第1のASTノードに基づいて、前記第1の構成要素を前記第1の抽象度で表現する第1のACGノードを生成することと、
前記第2のASTノードに基づいて、第2のACGノードを生成することと、
前記第1のACGノードに基づいて、前記第1の構成要素を第2の抽象度で表現する第3のACGノードを生成することであって、前記第2の抽象度は、前記第1の抽象度よりも抽象的であり、前記第3のACGノードは、前記第2のACGノードが前記抽象コードグラフにおいて前記第3のACGノードを介して前記第1のACGノードに関連するように、前記第1のACGノードと前記第2のACGノードとの間に連結され、前記第1のACGノードと前記第2のACGノードとの間の関連は、前記第1のASTノードが前記抽象構文木において前記第2のASTノードに連結されていることに基づく、生成することと、
を含む動作と、
を含む、1つ以上のコンピュータ読み取り可能な記憶媒体と、
を有する、システム。
(付記19)
前記抽象構文木は、前記ソースコード内の第3の位置に配置されている前記第1の構成要素を表現する第3のASTノードであって、前記第1の構成要素を前記第1の抽象度で表現する第3のASTノードをさらに含み、
前記第1のASTノードに基づいて、前記第1のACGノードを生成することは、前記第1のASTノード及び前記第3のASTノードの両方が前記第1の構成要素を前記第1の抽象度で表現していることに応じて、前記第1のASTノードと前記第3のASTノードとを前記第1のACGノードへとマージすることを含む、付記18に記載のシステム。
(付記20)
前記抽象構文木は、前記ソースコード内の第3の位置に配置されている第3の構成要素を表現する第3のASTノードをさらに含み、
前記抽象構文木は、前記ソースコード内の第4の位置に配置されている前記第1の構成要素を表現する第4のASTノードであって、前記第1の構成要素を前記第1の抽象度で表現する第4のASTノードをさらに含み、前記第3のASTノードは、前記第3の位置における前記第3の構成要素と前記第4の位置における前記第1の構成要素との間の関係を表現するように、前記抽象構文木において前記第4のASTノードに連結され、
前記抽象コードグラフを生成する前記動作は、
前記第4のASTノードに基づいて、前記第1の構成要素を前記第1の抽象度で表現する第4のACGノードを生成することと、
前記第3のASTノードに基づいて、第5のACGノードを生成することと、
前記第4のACGノードに基づいて、前記第1の構成要素を前記第2の抽象度で表現する第6のACGノードを生成することであって、前記第6のACGノードは、前記第4のACGノードが前記抽象コードグラフにおいて前記第6のACGノードを介して前記第5のACGノードに関連するように、前記第4のACGノードと前記第5のACGノードとの間に連結され、前記第4のACGノードと前記第5のACGノードとの間の関連は、前記第4のASTノードが前記抽象構文木において前記第3のASTノードに連結されていることに基づく、生成することと、
前記第1のACGノード及び前記第4のACGノードの両方が前記第1の構成要素を前記第1の抽象度で表現していることに応じて、前記第1のACGノードと前記第4のACGノードとを、前記第1の構成要素を前記第1の抽象度で表現する第7のACGノードへとマージすることと、
前記第3のACGノード及び前記第6のACGノードの両方が前記第1の構成要素を前記第2の抽象度で表現していることに応じて、前記第3のACGノードと前記第6のACGノードとを、前記第1の構成要素を前記第2の抽象度で表現する第8のACGノードへとマージすることと、
をさらに含む、付記18に記載のシステム。