(57)【要約】本明細書において、コード検証システムについて説明する。コード検証システムは、コードクローンの分析および視覚化を伴う拡張コードレビューを提供して、ソフトウェア開発者が同一のコードの同様のインスタンスを自動的に識別するよう支援し、長期にわたるソフトウェアコードのバージョンにおける差分を視覚化する。システムは、コードクローン検索技術を使用して、コードクローンを識別し、開発者が変更を加えるものと同様のコードに関する情報をユーザに提示する。システムは、１つまたは複数の関連するクローンを有するコードセグメントに変更が加えられると、開発者または他のチームに自動通知を提供することができる。コード検証システムはまた、開発者がソフトウェアコード本体のアーキテクチャの進化を理解するよう支援する。コード検証システムは、ソフトウェアコードベースの２つのバージョン間のコードクローン検出結果に基づきアーキテクチャの差分を判定する分析コンポーネントを提供する。コード検証システムはまた、識別した差分を開発者およびソフトウェア開発プロセスに関与する他の人に直感的かつ有益な方法で表示するユーザインタフェースコンポーネントを提供する。
2014503910.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェア開発者が修正しているソフトウェアコードに関連するソフトウェアコードが存在することを前記ソフトウェア開発者に通知するためのコンピュータ実装方法であって、
ソフトウェアコードベースを構文解析して、前記ソフトウェアコードに関連する情報を識別するステップと、
前記構文解析したソフトウェアコードベースにインデックスを付して、ソフトウェアコードのマッチするセクションの迅速な識別を提供するステップと、
ソフトウェアコードを編集している開発者によって提供されるソフトウェアコードの変更を検出するステップと、
前記ソフトウェア開発者によって提供される前記コードの変更に関連する任意のコードクローンを識別するステップと、
前記クローンが識別されたことを検出すると、少なくとも１つのクローンが存在するため、前記検出された変更を前記識別されたクローンに適用するか否かを前記ソフトウェア開発者が判定することが可能であることを、前記ソフトウェア開発者に通知するステップと
を含み、
前述のステップを、少なくとも１つのプロセッサにより実施する、方法。
【請求項２】
前記ソフトウェアコードベースを構文解析するステップは、言語の特徴、コードブロック、変数情報、クラスおよび他のデータ構造の情報、ならびに関数情報のうちの少なくとも１つを識別するステップを含む、請求項１に記載の方法。
【請求項３】
前記ソフトウェアコードベースを構文解析するステップは、前記開発者が現在取り組んでいるソースコードを構文解析して、以前に構文解析したソフトウェアコードと前記インデックスにおいて比較するステップを含む、請求項１に記載の方法。
【請求項４】
前記ソフトウェアコードにインデックスを付すステップは、前記開発者のコンピューティング装置からのソフトウェアコードおよび少なくとも１つの他のコードベースにインデックスを付すステップを含む、請求項１に記載の方法。
【請求項５】
前記ソフトウェアコードにインデックスを付すステップは、前記インデックスに基づくクエリおよび検索の機能を提供して、前記開発者が取り組んでいるソフトウェアの現在の範囲に関連するコードクローンを識別するステップを含む、請求項１に記載の方法。
【請求項６】
前記ソフトウェアコードにインデックスを付すステップは、開発者がソフトウェアコードをコード管理システムにまたは他の重要なマイルストーンにおいてチェックインすると、前記インデックスを更新するステップを含む、請求項１に記載の方法。
【請求項７】
前記ソフトウェアコードを構文解析するステップおよび前記ソフトウェアコードにインデックスを付すステップは、ソフトウェアコードの変更を継続的に識別してインデックスを付すコードベースインデックス付けサーバにおいて継続して起こる、請求項１に記載の方法。
【請求項８】
前記ソフトウェアコードの変更を検出するステップは、前記開発者によるタイピングを検出して、前記ソフトウェアコード内で識別された不具合を解決するステップと、前記ユーザがタイプすると、前記インデックスに対して変更をクエリでサブミットして、前記開発者が取り組んでいる前記コードに関連するコードクローンを識別するステップとを含む、請求項１に記載の方法。
【請求項９】
前記ソフトウェアコードの変更を検出するステップは、前記開発者がある特定のコードブロックを選択し、前記選択したコードブロックに関連するコードクローンを識別するためにオプションを選択したことを検出するステップを含む、請求項１に記載の方法。
【請求項１０】
前記コードクローンを識別するステップは、前記インデックスにクエリを行うステップと、前記コードの変更の周囲の前記コードの一部を提供して関連するコードを識別するステップとを含む、請求項１に記載の方法。
【請求項１１】
前記コードクローンを識別するステップは、前記開発者が取り組んでいる前記コードベースと同一または異なるコードベースにおけるクローンを識別するステップを含む、請求項１に記載の方法。
【請求項１２】
前記開発者に通知するステップは、統合開発環境（ＩＤＥ）内の前記クローンを識別するユーザインタフェースメッセージを提供するステップを含む、請求項１に記載の方法。
【請求項１３】
前記開発者に通知するステップは、前記識別されたコードクローンに関連付けられた別の開発者に追加の通知を提供するステップを含む、請求項１に記載の方法。
【請求項１４】
コードクローンの識別およびアーキテクチャの変更の視覚化を伴う、ソフトウェアコードレビューを拡張するためのコンピュータシステムであって、
以下のコンポーネント内に具現化されたソフトウェア命令を実行するよう構成されたプロセッサおよびメモリと、
プログラミング言語で記述されたソフトウェアコードを構文解析して、インデックス付けのために前記ソフトウェアコードに関連する情報を識別する構文解析コンポーネントと、
構文解析中に識別された前記ソフトウェアコード情報にインデックスを付して、コード情報の迅速な探索およびマッチングを提供するインデックス付けコンポーネントと、
ソフトウェアコードの識別された範囲へのソフトウェア開発者による現在の変更を検出する変更検出コンポーネントと、
前記ソフトウェア開発者によって加えられる前記検出された変更の前記識別された範囲に関連する１つまたは複数のコードクローンを識別するコードクローン検出コンポーネントと、
ソースコードのアーキテクチャモデルを作成し、前記アーキテクチャモデルを他のアーキテクチャモデルと比較してアーキテクチャの差分を識別する差分視覚化コンポーネントと、
前記識別されたコードクローンおよび前記識別されたアーキテクチャの差分を視覚的に前記ソフトウェア開発者に提供するユーザインタフェースコンポーネントと
を備えたコンピュータシステム。
【請求項１５】
前記変更検出コンポーネントは、前記ソフトウェア開発者がソフトウェアコードを編集するために使用する統合開発環境（ＩＤＥ）に関連づけられ、前記変更検出コンポーネントはタイピングおよび他のソフトウェア開発者の入力を監視して、前記ソフトウェア開発者がソフトウェアコードに変更を加えていることを検出し、既知のコードクローンのインデックスと比較するために、１つまたは複数のコード範囲を前記コードクローン検出コンポーネントにサブミットする、請求項１４に記載のコンピュータシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コードクローンの通知およびアーキテクチャの変更の視覚化に関する。
【背景技術】
【０００２】
ソフトウェア開発プロセスは、その最も簡単なレベルで、ソフトウェア開発者がソフトウェアコードを言語（例えば、Ｃ＋＋、Ｃ＃、アセンブリ）で書き、コンパイラなどのツールを使用して、そのコードをバイナリ実行可能モジュールに組み込むことを含む。ソフトウェアがより複雑になるにつれて、複数の開発者がプロジェクトに取り組み、チェックインマネージャ、集中構築システムなどのより高性能のツールを使用する場合がある。チームが、アーキテクチャレベルおよびソースコードレベルで行われるピアレビューなどのプロセスを設ける場合もある。よく知られているプロセスは、主要な開発者以外の少なくとも１人の開発者に、チェックインごとにレビューさせるというものである。開発者はまた、ユニットテスト、静的コードチェッカ、ランタイムコードチェッカなどの１つまたは複数の自動検証ツールを実行させる場合もある。ＭＩＣＲＯＳＯＦＴ（商標）ＶＩＳＵＡＬ  ＳＴＵＤＩＯ（商標）などの最近の統合開発環境（ＩＤＥ）は、潜在的なコードの不具合を開発者にできるだけ早期に知らせようと試みる。例えば、ＩＤＥは、開発者がソフトウェアコードをタイプするとそのコードを解析し、ミススペル、宣言されていない参照変数などを識別することができる。
【０００３】
コードの再利用は一般に、「車輪の再発明」を避けて各新たな問題を解決するために奨励されている。長期間使用されているソフトウェアコードは、そのコードが長期にわたりおそらく多くの適用および分析を受けてきたので、不具合がより少ない可能性が高い。さらに、多くのソフトウェア問題は繰り返し起こり、そのため、コードを再利用することにより、既知の良好な実践方法を用いて古い問題を解決すること、および開発者に新たな問題またはある特定のプロジェクトに固有のソフトウェアコードに焦点を当てさせることが可能となる。コードの再利用は小規模で起こり、その場合、開発者は同一のプロジェクトに対して同様のコードを複数回使用するが、コードの再利用は大規模で起こることも可能であり、その場合、企業であるプロジェクトに取り組んでいる開発者が、その企業の別のプロジェクトからのコードを再利用する。その２人の開発者は、同一のチームで取り組まなくてもよく、または再利用されるコードについて知るために互いに連絡をとらなくてもよい。
【０００４】
コードの再利用における１つの問題は、コードの再利用がバグの伝搬にもつながることである。コピーされたコード（本明細書ではクローンと呼ぶ）におけるソフトウェアの不具合は、そのコードのインスタンスの全てに存在することになる。開発者がコードを企業内にわたってまたはさらに広くコピーする場合、あるプロジェクトで不具合を解決する開発者が、その不具合が存在するかもしれない他のプロジェクトに気づかない場合がある。このため、各チームが問題を発見および解決するよう重複して努力することになり、またはさらに悪いことには、あるチームでは既知であり解決されている問題が、コードを再利用した別のチームでは解決されないということにつながる。今日、コードレビュー中に、レビュアは、その人自身の知識内にあるクローンに限られており、現在のインスタンスで解決された同一の不具合を持つ全てのクローンについて知っているわけではない。全てのクローンコピーが考慮されることを保証することは困難である。別の問題は、ソフトウェアコードは、特に複数の開発者が長期にわたりそのコードに取り組んでいる場合、長期にわたり視覚化の困難な方法で進化しているということである。変更を加える開発者は、ソースコードの２つのバージョン間のアーキテクチャの差分を理解したいかもしれない。例えば、コードベースのクラスレベル、名前空間レベル、またはモジュールレベルの差分は複雑であり、それらの差分を多くのソースファイルを通じて同時に探り出し把握することは困難であろう。
【発明の概要】
【０００５】
本明細書において、コード検証システムについて説明する。コード検証システムは、コードクローンの分析および視覚化を伴う拡張コードレビューを提供し、ソフトウェア開発者が同一のコードの同様のインスタンスを自動的に識別するよう支援し、長期にわたるソフトウェアコードのバージョンにおける差分を視覚化する。システムは、コードクローン検索技術を使用して、コードクローンを識別し、開発者が変更を加えるものと同様のコードに関する情報をユーザに提示する。システムは、１つまたは複数の関連するクローンを有するコードセグメントに変更が加えられると、開発者または他のチームに自動通知を提供することができる。コード検証システムはまた、開発者がソフトウェアコード本体のアーキテクチャの進化を理解するよう支援する。コード検証システムは、アーキテクチャの差分を判定する分析コンポーネント、および、識別した差分を開発者およびソフトウェア開発プロセスに関与する他の人に直感的かつ有益な方法で表示するユーザインタフェースコンポーネントを提供する。これにより、開発者が変更の理由を理解し、または、不当なアーキテクチャの変更をそれらが度を越す前に気付くよう支援することができる。システムは、コードクローンに同様の視覚化を提供し、開発者があるクローンと別のクローンとの間の差分を視覚化することを可能にすることができる。これにより、レビュアがコードベースの２つのバージョン間のアーキテクチャレベルの差分を分析及び視覚化することが可能となり、アーキテクチャレベルの差分の直感的理解を提供し、アーキテクチャレベルのコードレビューの有効性が改善される。従って、コード検証システムにより、コードの正確性が増し、以前に解決されている不具合を有する未検出のコードクローンによるエラーのコストが、重複する努力を避けることによって削減される。
【０００６】
「発明の概要」は、以下の「発明を実施するための形態」でさらに説明する概念の抜粋を簡潔な形で導入するために提供される。「発明の概要」は、特許請求する主題の主要な特徴または本質的な特徴を特定することを意図するものでもなく、特許請求する主題の範囲を限定するために使用することを意図するものでもない。
【図面の簡単な説明】
【０００７】
【図１】１つの実施形態における、コード検証システムのコンポーネントを例示するブロック図である。
【図２】１つの実施形態における、ソフトウェア開発者が修正しているソフトウェアコードに関連するソフトウェアコードが存在することをその開発者に通知する、コード検証システムの処理を例示するフロー図である。
【図３】１つの実施形態における、ソフトウェアコード内の変更に関連するアーキテクチャレベルの変更をソフトウェア開発者に表示する、コード検証システムの処理を例示するフロー図である。
【図４】１つの実施形態における、ソフトウェア開発者にコードクローンに関して通知する、コード検証システムにより表示されるユーザインタフェースを例示するディスプレイ図である。
【図５】１つの実施形態における、ソフトウェアコードに対するアーキテクチャの変更の視覚化をソフトウェア開発者に提供する、コード検証システムにより表示されるユーザインタフェースを例示するディスプレイ図である。
【発明を実施するための形態】
【０００８】
本明細書において、コード検証システムについて説明する。コード検証システムは、コードクローンの分析および視覚化を伴う拡張コードレビューを提供し、ソフトウェア開発者が同一のコードの同様のインスタンスを自動的に識別するよう支援し、長期にわたるソフトウェアコードのバージョンにおける差分を視覚化する。システムは前述したコードクローン検索技術（例えば、２０１０年４月１日出願の「コードクローンの検出および分析」と題する米国特許出願番号１２／７５２，９４２を参照）を使用して、コードクローンを識別し、開発者が変更を加えるものと同様のコードに関する情報をユーザに提示する。例えば、システムは、開発者がコードブロックに変更を加えるものと同様のソフトウェアコードを有する位置を表示するツールチップのポップアップまたはウィンドウを提供することができる。より粗いレベルでは、システムは、そのコードが１つまたは複数のクローンを含むコードセグメントに対してチェックインがおこなわれると、開発者または他のチームに自動通知を提供することができる。システムは、変更されるべきコードの一片のクローンコピーを識別し、同一の変更の適用の可能性についてクローンコピーをチェックするようコードレビュアに提案することができる。
【０００９】
コード検証システムはまた、開発者がソフトウェアコード本体のアーキテクチャの進化を理解するよう支援する。例えば、ソフトウェア設計者は、プロジェクトの２つのマイルストーン（例えば、Ｍ１およびＭ２）間のアーキテクチャの進化を理解したいかもしれない。別の例として、２つのソース制御ブランチ間のコードブランチの統合を行う開発者は、２つのブランチにおけるソースコード間のアーキテクチャレベルの差分を理解したいかもしれない。コード検証システムは、アーキテクチャの差分を判定する分析コンポーネント、および、識別した差分を開発者およびソフトウェア開発プロセスに関与する他の人に直感的かつ有益な方法で表示するユーザインタフェースコンポーネントを提供する。これにより、開発者が変更の理由を理解し、または不当なアーキテクチャの変更をそれらが度を越す前に気付くよう支援することができる。システムは、コードクローンに同様の視覚化を提供し、開発者があるクローンと別のクローンとの間の差分を視覚化することを可能にすることができる。これにより、レビュアがコードベースのソースコードの２つのバージョン間のアーキテクチャレベルの差分を分析および視覚化することが可能となり、アーキテクチャレベルの差分の直感的理解を提供し、アーキテクチャレベルのコードレビューの有効性が改善される。従って、コード検証システムにより、コードの正確性が増し、以前に解決されている不具合を有する未検出のコードクローンによるエラーのコストが、重複する努力を避けることによって削減される。
【００１０】
開発者は迅速にコードを再利用するために、しばしばコードを複製する。複製されたコードの一片は、コードクローンとも呼ばれる。コードの一片に変更を加えるごとに頻繁に、同一の変更をそのクローンコピーにもまた適用するべきである。今日、コードレビュー中に、レビュアは、同一の変更をそのクローンコピーに適用する必要があるかどうかを、レビュア自身のコードベースの知識を考慮して考え出すことができるだけである。全てのクローンコピーを考慮すると保証することは困難である。コード検証システムはこれを、現在のコードベースのソースコードに、またはコードベースのより拡張した範囲で、インデックスを付すコードクローン検索エンジンに対して、変更されたコード片を検索することによって解決し、コードレビュアに、複製されたコピーをチェックするよう自動的に知らせる。
【００１１】
今日、コードレビュアがコードレビュー中に、ソースコードの２つのバージョン間のアーキテクチャレベルの差分を理解することは困難である。既存のツールは、追加および削除された行、単語、または文字などのテキストレベルの差分を指摘することはうまくできるが、ソフトウェアコードは非常に多くの方法で構築することができるので、これらのツールでは、より高レベルのビューは何ら提供できない。コードの現在のバージョンについてのアーキテクチャの情報を表示する、クラスビューア、名前空間ビューアなどの良好な既存のツールもある。しかしながら、これらのツールには、ソフトウェアコードの２つのバージョンを比較し、および何が変わったかを開発者が視覚化するよう支援する機能は有していない。このため、コードレビュアがアーキテクチャレベルのコードのリファクタリングが有用かどうかを考え出すのはさらに困難となる。
【００１２】
図１は、１実施形態における、コード検証システムのコンポーネントを例示するブロック図である。システム１００は、構文解析コンポーネント１１０、インデックス付けコンポーネント１２０、変更検出コンポーネント１３０、コードクローン検出コンポーネント１４０、差分視覚化コンポーネント１５０、ユーザインタフェースコンポーネント１６０、および通信コンポーネント１７０を備える。これらのコンポーネントのそれぞれについて、本明細書でさらに詳細に説明する。
【００１３】
構文解析コンポーネント１１０は、プログラミング言語で書かれたソフトウェアコードを構文解析し、インデックス付けのためにソフトウェアコードに関連する情報を識別する。本明細書では単に構文解析と称するが、このプロセスには、構文解析、字句分析、最適化などを含む、ソフトウェアコードのコンパイルに関与する一般的なプロセスを含むことができる。構文解析コンポーネント１１０は、変数名、コードブロック、言語のキーワード（例えば、「ｉｆ」、「ｔｈｅｎ」および「ｗｈｉｌｅ」）、変数宣言、クラス定義、および任意の他のコード特徴を識別することができる。構文解析コンポーネント１１０は、プラグインモジュール、または様々なプログラミング言語に対処するサブコンポーネントを含むことができる。構文解析コンポーネント１１０は、チェックインされた大規模なコード本体、ならびに開発者がアクティブに編集中のローカルのコード本体で動作することができる。いくつかの実施形態においては、構文解析コンポーネント１１０は、ユーザがタイプおよび／または中断すると、入力された新しいテキストを構文解析する（例えば、ＭＩＣＲＯＳＯＦＴ（商標）ＩＮＴＥＬＬＩＳＥＮＳＥ（商標））。
【００１４】
インデックス付けコンポーネント１２０は、構文解析中に識別されたソフトウェアコード情報にインデックスを付し、コード情報の迅速な探索およびマッチングを提供する。コンポーネント１２０は、大規模なコード本体のインデックス、または複数のコード本体のインデックスを作成し、入力コードにマッチする既知のコードが存在するかどうかを判定するクエリを受け取ることができる。例えば、インデックスには大規模なプロジェクトのコードを含むことができ、システム１００は開発者が現在何をタイプしているかに基づいてクエリをサブミットすることができる。システム１００はまた、開発者の現在の編集位置周辺のコードのサブセットに基づきクエリを行い、現在の位置に関連するコードクローンを識別することもできる。インデックス付けコンポーネント１２０は、開発者のコンピューティング装置上でローカルに動作するか、または開発者のコンピューティング装置からアクセス可能なサーバ上で動作してもよい。インデックス付けコンポーネント１２０は、新しいコードの変更または追加のコードベースが長期にわたり識別されるよう、それらを組み込む漸進的な方法で動作する。
【００１５】
変更検出コンポーネント１３０は、ソフトウェアコードの識別された範囲への開発者による現在の変更を検出する。コンポーネント１３０は、開発者がソフトウェアコードの編集のために使用するＩＤＥに組み込まれることが可能である。いくつかの実施形態においては、変更検出コンポーネント１３０がタイピングおよび他の開発者の入力を監視し、開発者がソフトウェアコードに変更を加えていることを検出する。検出された変更は、ある特定のソースファイルにおける、または１つまたは複数のビジュアル編集ツールを介した、ソフトウェアコードの追加、削除、または更新を含むことができる。変更検出コンポーネント１３０は、１つまたは複数のコード範囲を識別し、既知のコードクローンのインデックスと比較するために、その範囲をコードクローン検出コンポーネント１４０にサブミットする。
【００１６】
コードクローン検出コンポーネント１４０は、ソフトウェア開発者によって加えられた検出された変更の識別された範囲に関連する１つまたは複数のコードクローンを識別する。システムは、開発者の現在の位置周辺のコードまたはコードの範囲をインデックス付けコンポーネント１２０にサブミットし、同一または他のソフトウェアプロジェクトにおける同様またはマッチングするコードの範囲を識別する。コードクローン検出コンポーネント１４０は、開発者のコンピューティング装置上に記憶されたクローンを識別するようローカルに動作するか、または、企業内のサーバ上、もしくは複数のソフトウェアプロジェクトのソースコードのインデックス付けを行うパブリックインターネットサーバ上のような、より広域のレベルで動作してもよい。いくつかの実施形態においては、コードクローン検出コンポーネント１４０は、粒度情報（例えば、ブロックレベル、関数レベル、モジュールレベルの類似性）に基づき、または現在のコード位置周辺の決められたサイズ（例えば、現在の位置＋／−１００文字）に基づき、コードクローンの始まりおよび終わりを識別する。クローンを様々な異なる方法で定義および識別することができ、本明細書の説明は、システム１００をどれか１つの特定の方法に限定しようとするものではない。特に、プログラミング言語が異なれば、コードクローンを識別するのに適したソースコードの粒度は変化することになる。
【００１７】
差分視覚化コンポーネント１５０は、ソースコードのアーキテクチャモデルを作成し、そのアーキテクチャモデルを他のアーキテクチャモデルと比較して、アーキテクチャの差分を識別する。コンポーネント１５０は、同一のソースコードの２つのバージョン（例えば、今日のものから１つおよび先週のものから１つ）を入力として受け取り、２つのバージョンを比較して、アーキテクチャの差分をソフトウェア開発者または設計者に表示することができる。コンポーネント１５０はまた、異なるコード本体同士を比較して、開発者がアーキテクチャの類似性および差分を視覚化するよう支援することもできる。いくつかの実施形態において、ＩＤＥは、コードレビュープロセス中に差分視覚化コンポーネント１５０を起動し、それにより、開発者がチェックインされたコードと新しいコードとの間のアーキテクチャレベルにおける差分を、容易に識別することができる。ソフトウェアコードを、様々な設計およびアーキテクチャにファクタリング（factored）、およびリファクタリングすることができる。しばしば、テキストレベルで著しく変化するソースコードが、アーキテクチャレベルではほとんど変化しない、またその逆の場合もある。例えば、開発者がプログラムにて変数ごとに名前を変える場合、テキストはほとんどマッチしないが、アーキテクチャは同一となるであろう（例えば、同一のクラス、クラス間の同一の関係性など）。
【００１８】
ユーザインタフェースコンポーネント１６０は、識別されたコードクローンおよび識別されたアーキテクチャの差分を開発者に提供する。ユーザインタフェースコンポーネント１６０は、ＧＵＩ（ｇｒａｐｈｉｃａｌ  ｕｓｅｒ  ｉｎｔｅｒｆａｃｅ）、プログラマティックＡＰＩ（ａｐｐｌｉｃａｔｉｏｎ  ｐｒｏｇｒａｍｍｉｎｇ  ｉｎｔｅｒｆａｃｅ）、または情報を開発者に提供する他のインタフェースを含むことができる。コンポーネント１６０は、ＩＤＥの一部としてまたは拡張可能なＩＤＥに統合されたプラグインとして動作して、ユーザがソフトウェアコードを編集するとクローンの識別を提供し、要求に応じてアーキテクチャの比較を提供することができる。いくつかの実施形態において、システム１００は、ソースコードの変更をレビューするコードレビュープロセスの一部として動作し、コードレビュープロセス中、ＧＵＩまたは他のインタフェースを提供して、現在の変更に関連するコードクローンおよびアーキテクチャの差分を開発者および／またはレビュアに表示する。コンポーネント１６０はまた、ウェブ、携帯電話、または情報を視覚化するのに適切な他のインタフェースを提供することもできる。いくつかの実施形態において、ユーザインタフェースコンポーネント１６０は、コードの所有者または他の開発者のソフトウェアコードを基にしたクローンコードが変更されたことを検出すると彼らに通知を提供する通知サブコンポーネントを含む。これにより、開発者が互いをまたはコードの共有について知っていてもいなくても、開発者が関連コード内で他の開発者によって識別された自分達のコードにおける問題を解決することが可能となる。
【００１９】
通信コンポーネント１７０は、システム１００が分散されている場合に、システム１００の他のコンポーネント間の通信を提供する任意のコンポーネントである。システムは、単一の開発者のクライアントコンピューティング装置上で完全に動作することができるが、一部のユーザは、システム１００をより大規模なコード本体に適用することによって付加価値を見出すであろう。システム１００は、個々のコンポーネントを１つまたは複数のサーバ上に配置することが可能であり、それにより、単一の開発者のコンピューティング装置上で利用可能なものよりも大規模なコード本体にアクセスすること、およびシステム１００の機能を実施するために使用される開発者のコンピューティング装置からのリソース消費の負荷を取り除くこととの両方が可能となる。例えば、コードクローンの検出およびアーキテクチャのモデリングは、コードの複数のバージョンおよび複数のコードベースにアクセスするサーバによって提供されうる。そのような場合、個々の開発者のＩＤＥは、通信コンポーネント１７０を介してサーバに接続し、開発者を支援する情報を受け取ることができる。通信コンポーネント１７０は、ＬＡＮ（ｌｏｃａｌ  ａｒｅａ  ｎｅｔｗｏｒｋ）またはインターネット上のＴＣＰ（ｔｒａｎｓｍｉｓｓｉｏｎ  ｃｏｎｔｒｏｌ  ｐｒｏｔｏｃｏｌ）などの、様々な一般のネットワークプロトコルおよびネットワークを使用することができる。システムはまた、クラウドコンピューティングのリソースを活用して、ＭＩＣＲＯＳＯＦＴ（商標）ＷＩＮＤＯＷＳ（登録商標）ＡＺＵＲＥ（商標）が提供する機能のような処理、記憶、または他の機能を、拡張可能なクラウドベースのサーバに分散させることもできる。
【００２０】
コード検証システムを実装するコンピューティング装置は、中央処理ユニット、メモリ、入力装置（例えば、キーボードおよびポインティングデバイス）、出力装置（例えば、ディスプレイ装置）、および記憶装置（例えば、デイスクドライブまたは他の不揮発性記憶媒体）を含むことができる。メモリおよび記憶装置は、本システムを実装するまたは有効にするコンピュータ実行可能命令（例えば、ソフトウェア）で符号化されることが可能なコンピュータ可読記憶媒体である。さらに、データ構造およびメッセージ構造を、通信リンク上の信号などのデータ送信媒体を介して記憶または送信することができる。インターネット、ローカルエリアネットワーク、ワイドエリアネットワーク、ポイントツーポイントダイアルアップ接続、携帯電話ネットワークなどの、様々な通信リンクを使用することができる。
【００２１】
本システムの実施形態を、様々な動作環境で実装することができ、それらの動作環境には、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルド装置またはラップトップ装置、マルチプロセッサシステム、マイクロプロセッサベースのシステム、プログラム可能な家庭用電化製品、デジタルカメラ、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、上記システムまたは装置の何れかを含む分散コンピューティング環境、セットトップボックス、ＳＯＣ（ｓｙｓｔｅｍ  ｏｎ  ａ  ｃｈｉｐ）などを含む。コンピュータシステムは、携帯電話、携帯情報端末、スマートフォン、パーソナルコンピュータ、プログラム可能な家庭用電化製品、デジタルカメラなどであることが可能である。
【００２２】
本システムを、プログラムモジュールなどの１つまたは複数のコンピュータまたは他の装置により実行されるコンピュータ実行可能命令の一般的コンテキストで説明することができる。一般に、プログラムモジュールには、特定のタスクを実施するまたは特定の抽象データ型を実装する、ルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含む。一般的には、プログラムモジュールの機能性を、様々な実施形態において所望の通り結合または分散することができる。
【００２３】
図２は、１実施形態における、ソフトウェア開発者が修正しているソフトウェアコードに関連するソフトウェアコードが存在することをその開発者に知らせる、コード検証システムの処理を例示するフロー図である。ブロック２１０で始まり、システムはソフトウェアコードベースを構文解析し、そのソフトウェアコードに関連する情報を識別する。システムは、言語の特徴、コードブロック、変数情報、クラスおよび他のデータ構造の情報、関数情報などを識別することができる。システムは、構文解析した情報を、ユーザがソフトウェアコードを修正する際にクエリを行うためにインデックスに提供する。システムはまた、開発者が現在取り組んでいるソースコードを構文解析して、以前に構文解析したソフトウェアコードとインデックスにおいて比較する。
【００２４】
ブロック２２０へと続き、システムは、構文解析したソフトウェアコードベースにインデックスを付して、ソフトウェアコードのマッチするセクションの迅速な識別を提供する。インデックスには、開発者のコンピューティング装置からのソフトウェアコード、または潜在的に多数の開発者による潜在的に多数のソフトウェアプロジェクトへの寄与を網羅するより広範なコードベースを含むことができる。システムはインデックスに基づくクエリおよび検索の機能を提供して、開発者が取り組んでいるソフトウェアの現在の範囲に関連するコードクローンを識別する。開発者が、コード管理システムにまたは他の重要なマイルストーンにおいて、ソフトウェアコードをチェックインすると、システムはインデックスを更新することができる。システムはまた、開発者がソースコードを編集する際に関連する情報を探索するために、開発者のコンピューティング装置においてローカルのインデックスを提供することもできる。
【００２５】
先の２つのステップは、継続して、次に続くステップより先に、または次に続くステップとは別個のサーバで行うことができる。例えば、システムは、ソフトウェアコードの変更を継続的に識別してインデックスを付すコードクローンインデックス付けサービスを提供することができる。開発者のコンピューティング装置で実行されている別個のサービスにより、開発者が加えた変更を識別し、インデックスサービスにクエリを行って関連するソフトウェアコードを識別してもよい。あるいは、またはさらに、システムは、その同一のコンピューティング装置上で関連するコードを識別するために、インデックスサービスを開発者のコンピューティング装置上に提供してもよい。
【００２６】
ブロック２３０へと続き、システムは、ソフトウェアコードを編集している開発者によって提供されるソフトウェアコードの変更を検出する。システムは、開発者によるタイピングを検出して、ソフトウェアコード内で識別された不具合を解決することができる。ユーザがタイプすると、システムは、インデックスに対して変更をクエリでサブミットして、開発者が取り組んでいるコードに関連するコードを識別することができる。システムはまた、ＩＤＥ、またはＩＤＥがそれを通してソフトウェアの変更を記述する情報をシステムに提供することができ、かつそれに応じてコードクローンに関する情報を受け取ることができる他のソフトウェアプログラムに、ＡＰＩを提供することもできる。いくつかの実施形態においては、開発者がある特定のコードブロックを選択し、選択したコードブロックに関連するコードクローンを識別するためにオプション（例えば、「同様のコードを見つける」）を選択することができる。
【００２７】
ブロック２４０へと続き、システムは、開発者によって提供されるコードの変更に関連する任意のコードクローンを識別する。システムは、インデックスを調べて、コードの変更の周囲のそのコードの一部分、または変更前のそのコードの以前のバージョンを提供して、関連するコードの識別を支援する。コードクローンは、現在のコードベース内、関連するコードベース内、またはソフトウェアコードのある特定の範囲を偶然共有する全く関連のないコードベース内に存在し得る。開発者がコードブロックをマクロおよびミクロ両方のレベルで再利用することは、よくあることである。開発者がある特定の関数またはプログラムループを再利用することもあれば、開発者がモジュール全体またはクラス全体を再利用することもある。システムは、様々なレベルおよび粒度でクローンを識別することができる。いくつかの実施形態においては、システムは、ユーザまたはアプリケーションが修正できる構成パラメータを提供して、クローンを識別するレベルを構成する。
【００２８】
判定ブロック２５０へと続き、システムが少なくとも１つのクローンを識別した場合、システムはブロック２６０へと続き、識別しなかった場合には、システムは完了する。システムは、クローンインデックスサーバから、または開発者のコンピューティング装置上で実行中のローカルのインデックスから、識別されたクローンのリストを受け取ることができる。リストには、クローンのソースコードの記憶位置（例えば、ＵＲＬ（ｕｎｉｆｏｒｍ  ｒｅｓｏｕｒｃｅ  ｌｏｃａｔｏｒ）またはファイルパス）、ファイル名情報、行番号情報、クローンに関連付けられた開発者などのクローンを記述する情報を含むことができる。
【００２９】
ブロック２６０へと続き、システムは、少なくとも１つのクローンが存在し、それにより、検出された変更を識別されたクローンに適用するかどうかをソフトウェア開発者が判定することが可能であるということを、その開発者に通知する。システムは、ポップアップメッセージ、ツールチップ、ＩＤＥ内のドッキングリスト、または識別されたクローンを開発者に表示する他のユーザインタフェースを提供することができる。システムは、表示すべきクローンの閾値（例えば、１０）を判定すること、またはクローン間をナビゲートするユーザインタフェース制御を提供することができる。開発者がクローンを修正するためにアクセスしない場合もあり、コードの変更を他の開発者に通知するように、システムが開発者に連絡先情報を提供することができる。システムはまた、コードクローンに関与する他の開発者に、電子メールメッセージなどの自動通知を提供することもできる。通知には、変更を記述する情報、変更を加えた開発者を識別する情報、および、変更の動機を記述する開発者によって提供される任意の情報を含むことができる。ブロック２６０の後、これらのステップは終了する。
【００３０】
図３は、１実施形態における、ソフトウェアコード内の変更に関連するアーキテクチャレベルの変更をソフトウェア開発者に表示する、コード検証システムの処理を例示するフロー図である。ブロック３１０で開始し、システムは、１つまたは複数のアーキテクチャの特徴を含む第１のソフトウェアコードのバージョンを受け取る。ソフトウェアコードには、開発者が取り組んでいるプロジェクトの一部であるコードベース、または他のコードベースを含むことができる。開発者は、アーキテクチャの比較を受け取りたいソフトウェアコードの２つのバージョンを識別することができる。いくつかの実施形態においては、システムがユーザインタフェースを提供し、それを介して開発者はアーキテクチャの比較を要求することができる。
【００３１】
ブロック３２０へと続き、システムは、受け取った第１のソフトウェアコードのバージョンの概念視覚化を提供する第１のアーキテクチャモデルを作成する。モデルには、クラス、モジュール、名前空間、ならびに、ソフトウェアコードをアーキテクチャレベルで記述する他のプログラミング言語および環境の特徴を含むことができる。モデルには、１つまたは複数のインメモリデータ構造、および第１のソフトウェアコードのバージョンのアーキテクチャをビューするための表示された視覚化したものを含んでもよい。システムは、以前に記憶したソフトウェアコードのアーキテクチャモデルを作成および記憶することができる（例えば、チェックイン、リリース、または他のマイルストーン）。
【００３２】
ブロック３３０へと続き、システムは、１つまたは複数のアーキテクチャの特徴を含む第２のソフトウェアコードのバージョンを受け取る。第２のバージョンは、同一のコードベース、または開発者がアーキテクチャの差分を識別したい関連するコードベースの次のバージョンであることができる。開発者が第２のソフトウェアバージョンを識別するか、その第２のソフトウェアバージョンは開発者が現在取り組んでいるソースコードのバージョンであると、システムが自動的に推測することができる。いくつかの実施形態において、システムは、第１のソフトウェアバージョンおよび第２のソフトウェアバージョンを、ソース管理システム内のコードブランチを統合する、またはソフトウェアコードをチェックインするといったプロセスの一部として、自動的に識別する。
【００３３】
ブロック３４０へと続き、システムは、受け取った第２のソフトウェアコードのバージョンの概念視覚化を提供する第２のアーキテクチャモデルを作成する。第１のアーキテクチャモデルと同様、第２のモデルは、第２のソフトウェアコードのバージョンのアーキテクチャの構造を強調表示する。モデルには、ユニットテスト、またはソフトウェアコードの各バージョン上で実行される他のベンチマークから得られた性能情報を含むことができる。
【００３４】
ブロック３４５へと続き、システムはコードベースの２つのバージョン間でコードクローン検出を行う。生の検出結果は、一方の関数／断片（ｓｎｉｐｐｅｔ）がコードベースの第１のバージョンからのものであり、他方の関数／断片がコードベースの第２のバージョンからのものである１組のクローンの関数／断片のペアであることもあり得る。コードベースの２つのバージョン間の生のクローンペアは、アーキテクチャレベルのクローンを識別する次のステップでさらに使用される。ブロック３５０へと続き、システムは第１のアーキテクチャモデルおよび第２のアーキテクチャモデル、ならびに生のクローンペア情報を比較して、２つのモデル間の１つまたは複数の差分を識別する。差分には、加えられたアーキテクチャの特徴、削除されたアーキテクチャの特徴、コードクローンの検出結果に基づくコードの類似性（例えば、共有されているコードの割合）の識別、行われたリファクタリングの識別などを含むことができる。アーキテクチャの比較により、モデル内で使用されているクローンなどの各モデルを記述する統計、モデルの性能特性などを識別することもできる。システムは、この情報を比較して、性能またはクローンの使用の増減を示すことができる。比較により、変化していないオブジェクトを識別することもでき、これもまた開発者にとって有益な情報であり得る。
【００３５】
ブロック３６０へと続き、システムは、ソフトウェアコードのバージョン間のアーキテクチャの差分を、開発者に変更を示す視覚的ディスプレイで表示する。ディスプレイには、主たるコードの構成要素を矢印と共に示すブロック図を含むことができ、その矢印は、構成要素間または他の視覚化したものとの間のデータフローを表し、アーキテクチャレベルでの変更を簡潔に伝達するのに有用である。いくつかの実施形態においては、システムは、変更の量または他の差分を示す統計をいくつかの表示された構成要素上で表示することができる。ブロック３６０の後、これらのステップは終了する。
【００３６】
図４は、１実施形態における、ソフトウェア開発者にコードクローンに関して通知する、コード検証システムにより表示されるユーザインタフェースを例示するディスプレイ図である。ディスプレイには、ソフトウェアコードを編集および管理する１つまたは複数のツールを提供するＩＤＥウィンドウ４１０を含む。ＩＤＥウィンドウ４１０には、開発者が現在ビューしているおよび／または編集しているある特定のソフトウェアコードソースファイルを表示するコードウィンドウ４２０を含む。ＩＤＥウィンドウ４１０はまた、コードクローンを検出するオプションを含む１組のコードレビューオプション４３０を含む。コードウィンドウ４２０は複数の識別されたクローンを含む。例えば、コードウィンドウ４２０は、強調表示された第１の識別されたコード範囲４４０、およびポップアップウィンドウ４５０内に表示された識別されたコードクローンを含む。ポップアップウィンドウ４５０は、クローン名、および、そのクローンに関連付けられたソースファイルを開くためのリンクなどのクローンに関する情報を提供する。開発者はこの情報を使用してコードクローンをビューすることができる。クローンが開発者のバージョンよりも最新のコードを含み、開発者がその変更をコピーする場合もある。また、開発者の変更もクローン内に属し、開発者がクローンを修正するか、クローンの所有者にクローンを修正するよう通知する場合もある。
【００３７】
図５は、１実施形態における、ソフトウェアコードに対するアーキテクチャの変更の視覚化をソフトウェア開発者に提供する、コード検証システムにより表示されるユーザインタフェースを例示するディスプレイ図である。ディスプレイは、ソフトウェアコードを編集および管理する１つまたは複数のツールを提供するＩＤＥウィンドウ５１０を含む。ＩＤＥウィンドウ５１０は、開発者が選択したソフトウェアプロジェクトに関連する、本明細書で説明した視覚化を表示するアーキテクチャ比較ウィンドウ５２０を含む。ＩＤＥウィンドウ５１０はまた、コードのバージョン間のアーキテクチャの差分を表示するオプションを含む１組のコードレビューオプション５３０を含む。アーキテクチャ比較ウィンドウ５２０は、アーキテクチャの特徴および変更を識別する複数のブロックを含む。例えば、アーキテクチャ比較ウィンドウ５２０は、第１の名前空間５４０を含む。名前空間５４０は、クラス５５０を含む。クラス５５０は、２つのバージョン間でクラスコードの８０％が変化していることを示す統計情報５６０を提供する。別のクラスは、そのクラスがコードのバージョン間で実測性能の３０％を失っているという指示５７０を提供している。別の名前空間５８０は、その名前空間が新しく、第１のソフトウェアコードのバージョンに存在しないこと示している。システムは、これらおよび他の変更を表示して、それにより、開発者はテキストへの生の変更に加えてコードの変更が何を意味するかについてのハイレベルのビューを受け取る。
【００３８】
いくつかの実施形態においては、コード検証システムは、コードをレビューする複数の段階で開発者を支援する。セルフレビューである第１段階において、システムは、開発者がソフトウェアコードを修正すると、開発者がソフトウェアコードに加えているそのコードおよび／またはアーキテクチャの変更に関連するコードクローンに関して開発者に入力を与える。レビューの第２段階において、開発者の仲間または開発者の管理者などのレビュアが、システムを使用して、コードクローンの使用またはコードクローンへの変更、およびソフトウェア開発者が加えたアーキテクチャの変更の両方に関して、ソフトウェア開発者の変更をビューする。さらにハイレベルにおいては、チーム設計者または大規模なコード本体に関与する他の人達が、システムを使用して、コードの履歴における主要なポイント（例えば、マイルストーンまたはリリース）間で行われる個々の変更（単数または複数）をビューして、変更の本質を視覚化することができる。
【００３９】
いくつかの実施形態において、コード検証システムを使用して、コードの再利用を防ぐことができる。ソフトウェアコードはしばしば、企業または他の事業体が自らのソフトウェアコードにおいては負いたくない著作権の制限または他の制限を含む。本システムを使用して、開発者が避けるべきプロジェクト内のコードにマッチするソフトウェアプロジェクト内のコードを識別することができ、それにより開発者または他のレビューが違法となるコードを除去することができる。同様に、企業は、本システムを使用して、識別された脆弱性が、その企業のコードベースのセット全体にわたって解決されることを保証することができる。本システムにより、コードの類似性の広範囲にわたる分析、および以前には利用可能ではなかったレベルでの再利用が可能となる。
【００４０】
前述により、コード検証システムの具体的な実施形態を本明細書において例示の目的で説明したが、本発明の趣旨および範囲から逸脱することなく様々な修正を加えることができることは理解されよう。従って、本発明は、添付の特許請求の範囲による場合を除き制限されるものではない。
【図１】
2014503910.tif 000003
【図２】
2014503910.tif 000004
【図３】
2014503910.tif 000005
【図４】
2014503910.tif 000006
【図５】
2014503910.tif 000007
【国際調査報告】
2014503910.tif 000008
2014503910.tif 000009