以下、図面を参照して、各実施形態について説明する。
(第1実施形態)
まず、第1実施形態について説明する。本実施形態に係る変更度計測装置は、ソフトウェア製品の開発における派生開発等を効率的に行うために、2つのソースコードに含まれる関数間の変更度を計測するために用いられる。以下の説明においては、本実施形態に係る変更度計測装置を、便宜的に、関数間変更度計測装置と称する。
ここで、関数間の変更度の計測するために当該関数間の差分を抽出することが考えられるが、当該関数間の差分を抽出するためのツールとしては、例えばDiffと称されるテキスト比較ツールがある。
しかしながら、このようなテキスト比較ツールにおいては所定のプログラミング言語で記述されている関数を含む2つのソースコード(テキスト)を比較することによって当該2つのソースコードに含まれる関数間の差分が抽出されるため、例えば機能的には大きな変更がされていない場合であっても、リファクタリング等によりソースコード(関数)の記述が大幅に変更されている場合には、大きな差分が抽出され、高い変更度が計測されることになる。同様に、例えば機能的に大きな変更がされた場合であっても、ソースコード(関数)の記述の変更が小規模である場合には、抽出される差分が小さくなるため、低い変更度が計測されることになる。
このため、本実施形態においては、2つの関数が機能的な観点から異なっている程度を定量化するために、機械学習を用いた自然言語処理の応用の1つとして当該関数(本体)から当該関数の関数名を予測する技術を利用する。
具体的には、例えば2つの関数の関数名(予測名)が「sortByName」及び「sortByIndex」(ソート機能を表す関数名)であれば、当該2つの関数の機能は類似している(つまり、変更度は小さい)と考えられる。一方、2つの関数の関数名(予測名)が「sortByName」及び「showDialog」であれば、当該2つの関数の機能は類似していない(つまり、変更度は大きい)と考えられる。
本実施形態に係る関数間変更度計測装置10は、上記した関数名の予測結果を利用することによって、機能的な観点に基づく関数間の変更度(機能としての変更の大小を考慮した関数間の変更度)を計測する構成を有する。
図1は、本実施形態に係る関数間変更度計測装置の機能構成の一例を示すブロック図である。
図1に示すように、関数間変更度計測装置10は、入力部11、関数名予測部12、変更度計測部13及び出力部14を含む。
入力部11は、例えば関数間変更度計測装置10を使用するユーザ(ソフトウェア製品の開発を行うユーザ)によって指定された2つのソースコード(以下、第1及び第2ソースコードと表記)を入力する。
本実施形態において入力部11によって入力される第1及び第2ソースコードは、上記したように所定のプログラム言語で記述された関数を含む。また、第1及び第2ソースコードは、例えばソフトウェアプロダクトライン開発における同種同系列のソフトウェア製品(例えば、バージョンが異なるソフトウェア製品)を実現するためのソースコードであるものとする。
なお、入力部11によって入力される第1及び第2ソースコードは、関数間変更度計測装置10に含まれる格納部(図示せず)に予め格納されていてもよいし、当該関数間変更度計測装置10の外部のサーバ装置等から受信されたものであってもよい。
関数名予測部12は、入力部11によって入力された第1ソースコードに含まれる関数(以下、第1関数と表記)を構文解析し、当該構文解析結果に基づいて当該第1関数の関数名を予測する。また、関数名予測部12は、入力部11によって入力された第2ソースコードに含まれる関数(以下、第2関数と表記)を構文解析し、当該構文解析結果に基づいて当該第2関数の関数名を予測する。
変更度計測部13は、関数名予測部12による第1関数の関数名の予測結果及び第2関数の関数名の予測結果を比較することによって、第1及び第2関数の変更度を計測(計算)する。
出力部14は、変更度計測部13によって計測された変更度を出力する。本実施形態において、出力部14は、例えば変更度を表示する表示処理部である場合を想定しているが、当該変更度を外部のサーバ装置等に送信する送信部等であっても構わない。
図2は、図1に示す関数間変更度計測装置10のシステム構成の一例を示す。ここでは、関数間変更度計測装置10が例えばパーソナルコンピュータ(PC)等であるものとして説明するが、当該関数間変更度計測装置10は他の電子機器(情報処理装置)であってもよい。
図2に示すように、関数間変更度計測装置10は、CPU101、不揮発性メモリ102、主メモリ103、BIOS-ROM104、システムコントローラ105、入力デバイス106、表示デバイス107及びエンベデッドコントローラ(EC)108等を備える。
CPU101は、関数間変更度計測装置10内の各コンポーネントの動作を制御するプロセッサである。CPU101は、ストレージデバイスである不揮発性メモリ102から主メモリ103にロードされる様々なプログラムを実行する。このプログラムには、オペレーティングシステム(OS)及び関数間の変更度を計測するためのプログラム(以下、関数間変更度計測プログラムと表記)等が含まれる。
また、CPU101は、BIOS-ROM104に格納された基本入出力システム(BIOS)も実行する。BIOSは、ハードウェア制御のためのプログラムである。
システムコントローラ105は、CPU101のローカルバスと各種コンポーネントとの間を接続するデバイスである。
入力デバイス106は、例えばキーボード及びマウス等を含む。表示デバイス107は、例えば液晶表示装置のようなディスプレイ等を含む。EC108は、電力管理のためのワンチップマイクロコンピュータである。
図2においては、CPU101、不揮発性メモリ102、主メモリ103、BIOS-ROM104、システムコントローラ105、入力デバイス106、表示デバイス107及びEC108のみが示されているが、関数間変更度計測装置10は、例えばHDD(Hard Disk Drive)及びSSD(Solid State Drive)のような他の記憶装置を備えていてもよいし、外部装置との通信を実行するように構成された通信デバイス等を備えていてもよい。
なお、本実施形態において、図1に示す各部11~14の一部または全ては、例えば図2に示すCPU101(つまり、関数間変更度計測装置10のコンピュータ)に上記した関数間変更度計測プログラムを実行させること、すなわち、ソフトウェアによって実現されるものとする。関数間変更度計測プログラムは、コンピュータ読み取り可能な記憶媒体に予め格納して頒布可能であるし、ネットワークを介して関数間変更度計測装置10にダウンロードされても構わない。
ここでは、各部11~14の一部または全てがソフトウェアによって実現されるものとして説明したが、当該各部11~14の一部または全ては、例えばハードウェアによって実現されてもよいし、ソフトウェア及びハードウェアの組み合わせによって実現されてもよい。
以下、本実施形態に係る関数間変更度計測装置10の動作について説明する。まず、図3を参照して、本実施形態に係る関数間変更度計測装置10(変更度計測部13)の動作の概要について説明する。
本実施形態において、関数間変更度計測装置10(関数名予測部12)は、関数を入力することによって当該関数の関数名の予測結果を出力するように機械学習により生成された学習済モデル12aを予め保持しているものとする。この学習済モデルから出力される関数名の予測結果には、例えば当該関数名の複数の候補(以下、関数名候補と表記)と、当該複数の関数名候補の各々が当該学習済モデルに入力された関数の関数名(正当な関数名)である確率(以下、関数名の確率と表記)とが含まれるものとする。
ここで、上記した学習済モデル12aに第1関数が入力された場合を想定する。この場合、学習済モデル12aは、例えば第1関数の3つの関数名候補及び当該3つの関数名候補の各々の確率を、第1関数の関数名の予測結果として出力する。
一方、学習済モデル12aに第2関数が入力された場合を想定する。この場合、学習済モデル12aは、例えば第2関数の3つの関数名候補及び当該3つの関数名候補の各々の確率を、第2関数の関数名の予測結果として出力する。
本実施形態においては、上記した第1関数の関数名の予測結果及び第2関数の関数名の予測結果に基づいて第1及び第2関数間の変更度が計測される。この場合、第1及び第2関数間の変更度は、例えば第1関数の3つの関数名候補の確率分布と第2関数の3つの関数名候補の確率分布との差異に基づいて計測(計算)される。
次に、図4のフローチャートを参照して、関数間変更度計測装置10の処理手順の一例について説明する。
まず、入力部11は、例えばユーザによって指定された2つのソースコード(第1及び第2ソースコード)を入力する(ステップS1)。なお、第1及び第2ソースコードは、上記したようにバージョンが異なるソフトウェア製品を実現するためのソースコード(以下、バージョン違いのソースコードと表記)であるものとする。
次に、ステップS1において入力された第1及び第2ソースコードの各々から、変更度を計測する関数(第1及び第2関数)が切り出される(ステップS2)。
ここで、第1及び第2ソースコードにはそれぞれ複数の関数が含まれている(記述されている)ことが一般的であるが、当該第1及び第2ソースコードは上記したようにバージョン違いのソースコードであり、変更度を計測すべき第1ソースコードに含まれる第1関数と第2ソースコードに含まれる第2関数との対応関係を示す情報(以下、関数対応情報と表記)は、予め管理されているものとする。この関数対応情報は例えばソフトウェア製品の開発を行うユーザによって利用されるソースコード管理ツール(プラットフォーム)等において管理されているものとし、関数名予測部12は、このような関数対応情報に基づいて、第1ソースコードから第1関数を切り出し、第2ソースコードから第2関数を切り出す。
ステップS2の処理が実行されると、関数名予測部12は、上記した学習済モデルを用いて、当該ステップS2において切り出された第1関数の関数名及び第2関数の関数名を予測する。
ここで、本実施形態においては、関数名の予測に、例えばcode2seq(Generating Sequences from Structured Representations of Code)に開示されている学習済モデル(以下、code2seqの学習済モデルと表記)を用いることができる。
以下、code2seqの学習済モデルの概要について簡単に説明する。code2seqの学習済モデルは、ニューラルネットワーク等の機械学習アルゴリズムを適用して生成されており、ソースコードの断片である関数の関数名を予測するために、当該関数を構文解析して当該関数を表すAST(抽象構文木)を構築し、当該ASTの左端ノードから右端ノードへのパスを当該ニューラルネットワークへの入力に利用する。
ここで、図5は、ASTの一例を概略的に示している。ASTは、ソースコード(関数)において意味を成す最小単位(トークン)をノードとする木構造を有する。図5に示す例では、code2seqの学習済モデルに入力されるパス情報の例として、パス情報201~203が示されている。なお、パス情報201は、ASTの左端ノードであるノード201aから右端ノードであるノード201bへのパスである。また、パス情報202は、ASTの左端ノードであるノード202aから右端ノードであるノード202bへのパスである。更に、パス情報203は、ASTの左端ノードであるノード203aから右端ノードであるノード203bへのパスである。
code2seqの学習済モデルは、上記したパス情報201~203のような複数のパス情報(例えば、200パス程度)を入力することにより、例えば一連の単語から構成される複数の関数名候補及び当該関数名候補の各々の確率を出力するように構築(生成)されている。
関数名予測部12は、第1及び第2関数(を表すASTのパス情報)をcode2seqの学習済モデルに入力することによって、第1関数の複数の関数名候補及び当該関数名候補の各々の確率と、第2関数の複数の関数名候補及び当該関数名候補の各々の確率とを取得する(ステップS3)。
なお、関数名の予測にcode2seqの学習済モデルが用いられる場合には、ビームサーチによって複数の関数名候補及び当該関数名候補の各々予測確率分布を得ることができる。この関数名候補として得られる関数名の数は、ビームサーチのビーム幅によって定められる。
本実施形態においてはcode2seqの学習済モデルが用いられるものとして説明したが、入力された関数の関数名を予測することができるものであれば、他のアルゴリズムに基づいて生成された学習済モデルが用いられても構わない。
また、例えば学習済モデルから出力された複数の関数名候補の中に予め定められている値(例えば、数%)よりも確率が低い関数名候補が含まれている場合には、当該関数名候補を排除し、残りの関数名候補のみを取得するようにしてもよい。この場合、取得された関数名候補の確率を正規化するような処理を更に実行してもよい。すなわち、本実施形態においては、上記した第1関数の関数名及び第2関数の関数名の予測結果に対して、適宜、形式化するような処理を実行してもよい。
次に、変更度計測部13は、ステップS3において取得された第1関数の複数の関数名候補の確率の分布(以下、第1確率分布と表記)と、第2関数の複数の関数名候補の確率の分布(以下、第2確率分布と表記)とに基づいて、第1及び第2関数間の変更度を計測(判別)する(ステップS4)。
ステップS4においては、第1及び第2確率分布の差異に基づいて変更度が計測される。この第1及び第2確率分布の差異は、例えばKL(Kullback-Leibler)ダイバージェンスまたはJS(Jensen-Shannon)ダイバージェンスのような計算手法(メトリクス)を用いて計算されるものとする。
出力部14は、ステップS4において計測された変更度を出力する(ステップS5)。この場合、出力部14は、変更度を表示デバイス107に出力し、当該変更度を当該表示デバイス107に表示してもよい。
以下、本実施形態に係る関数間変更度計測装置10の動作の具体例について説明する。ここでは、図6に示すように、同種同系列のソフトウェア製品を実現するためのバージョン違いのソースコードとして、バージョン1のソースコード301、バージョン2.1のソースコード302及びバージョン2.2のソースコード303が存在するものとする。なお、ソースコード301~303には複数の関数が含まれているが、図6においては、当該ソースコード301~303に含まれている複数の関数のうち、上記した変更度を計測すべき関数(つまり、対応する関数)のみが示されている。
ここで、ソースコード301に含まれる関数及びソースコード302に含まれる関数間の変更度を計測する場合を想定する。図7は、ソースコード301及び302が関数間変更度計測装置10に入力されることによって計測された当該ソースコード301に含まれる関数及び当該ソースコード302に含まれる関数間の変更度が表示された表示デバイス107の表示画面107aの一例を示す。
図7に示すように、表示画面107aには、ソースコード301に含まれる関数(バージョン1の関数)の関数名の予測結果、ソースコード302に含まれる関数(バージョン2.1の関数)の関数名の予測結果、KLダイバージェンス値及び当該関数間の変更度が表示されている。
ソースコード301に含まれる関数の関数名の予測結果は、当該関数の複数の関数名候補及び当該複数の関数名候補の各々の確率を含む。図7に示す例では、ソースコード301に含まれる関数の関数名の予測結果として、関数名候補「sort」及び当該関数名候補の確率「72.6%」と、関数名候補「reverse」及び当該関数名候補の確率「15.6%」と、関数名候補「bubblesort」及び当該関数名候補の確率「11.8%」とが表示されている。
ソースコード302に含まれる関数の関数名の予測結果は、当該関数の複数の関数名候補及び当該複数の関数名候補の各々の確率を含む。図7に示す例では、ソースコード302に含まれる関数の関数名の予測結果として、関数名候補「printArray」及び当該関数名候補の確率「72.6%」と、関数名候補「dumpArray」及び当該関数名候補の確率「30.5%」と、関数名候補「sort」及び当該関数名候補の確率「13.5%」とが表示されている。
KLダイバージェンス値は、上記したKLダイバージェンスを用いて計算された、ソースコード301に含まれる関数の関数名の予測結果に基づく確率分布(ソースコード301に含まれる関数の複数の関数名候補の各々の確率の分布)及びソースコード302に含まれる関数の関数名の予測結果に基づく確率分布(ソースコード302に含まれる関数の複数の関数名候補の各々の確率の分布)の差異を表す数値である。図7に示す例では、KLダイバージェンス値として「4.893」が表示されている。
ここで、本実施形態における変更度は、上記したKLダイバージェンス値に基づいて計測されるものとする。具体的には、変更度は例えば「無」、「小」及び「大」を含み、KLダイバージェンス値=0であれば、機能としての関数間の差異がないと判別され、変更度「無」が計測されるものとする。また、0<KLダイバージェンス値<1.5であれば、機能としての関数間の差異が小さいと判別され、変更度「小」が計測されるものとする。更に、KLダイバージェンス値≧1.5であれば、機能としての関数間の差異が大きいと判別され、変更度「大」が計測されるものとする。
この場合、図7に示す例ではKLダイバージェンス値は「4.893」であるため、表示画面107aには、当該KLダイバージェンス値に基づいて計測された変更度「大」が表示されている。
上記した図6に示すソースコード301に含まれる関数とソースコード302に含まれる関数とを比較すると、テキストの大部分が共通しているため、Diffのようなテキスト比較ツールを用いた場合には変更度は小さいと判別される可能性が高い。しかしながら、本実施形態においては、KLダイバージェンス値に基づいて機能としての関数間の差異が大きいと判別されることによって、変更度「大」を計測することができる。
次に、ソースコード301に含まれる関数及びソースコード303に含まれる関数間の変更度を計測する場合を想定する。図8は、ソースコード301及び303が関数間変更度計測装置10に入力されることによって計測された当該ソースコード301に含まれる関数及び当該ソースコード303に含まれる関数間の変更度が表示された表示デバイス107の表示画面107bの一例を示す。
図8に示すように、表示画面107bには、ソースコード301に含まれる関数(バージョン1の関数)の関数名の予測結果、ソースコード303に含まれる関数(バージョン2.2の関数)の関数名の予測結果、KLダイバージェンス値及び当該関数間の変更度が表示されている。
図8に示す例では、上記した図7と同様に、ソースコード301に含まれる関数の関数名の予測結果として、関数名候補「sort」及び当該関数名候補の確率「72.6%」と、関数名候補「reverse」及び当該関数名候補の確率「15.6%」と、関数名候補「bubblesort」及び当該関数名候補の確率「11.8%」とが表示されている。
ソースコード303に含まれる関数の関数名の予測結果は、当該関数の複数の関数名候補及び当該複数の関数名候補の各々の確率を含む。図8に示す例では、ソースコード303に含まれる関数の関数名の予測結果として、関数名候補「sort」及び当該関数名候補の確率「70.8%」と、関数名候補「bubbleSort」及び当該関数名候補の確率「23.7%」と、関数名候補「reverse」及び当該関数名候補の確率「5.5%」とが表示されている。
KLダイバージェンス値は、ソースコード301に含まれる関数の関数名の予測結果に基づく確率分布(ソースコード301に含まれる関数の複数の関数名候補の各々の確率の分布)及びソースコード303に含まれる関数の関数名の予測結果に基づく確率分布(ソースコード303に含まれる関数の複数の関数名候補の各々の確率の分布)の差異を表す数値である。図8に示す例では、KLダイバージェンス値として「1.254」が表示されている。
上記したようにKLダイバージェンス値=0であれば変更度「無」が計測され、0<KLダイバージェンス値<1.5であれば変更度「小」が計測され、KLダイバージェンス値≧1.5であれば変更度「大」が計測されるものとすると、図8に示す例ではKLダイバージェンス値は「1.254」であるため、表示画面107bには、当該KLダイバージェンス値に基づいて計測された変更度「小」が表示されている。
上記した図6に示すソースコード301に含まれる関数とソースコード303に含まれる関数とを比較すると、テキストは大幅に変更されているため、Diffのようなテキスト比較ツールを用いた場合には変更度が大きいと判別される可能性が高い。しかしながら、ソースコード301に含まれる関数はバブルソートと称されるアルゴリズムに基づくソート関数であり、ソースコード303に含まれる関数はセレクションソートと称されるアルゴリズムに基づくソート関数であり、当該ソースコード301に含まれる関数及びソースコード303に含まれる関数は機能的には共通している。この場合、本実施形態においては、KLダイバージェンス値に基づいて機能としての関数間の差異が小さいと判別されるため、変更度「小」を計測することができる。
なお、図7及び図8においては、ソースコードに含まれる関数の関数名の予測結果、KLダイバージェンス値及び変更度が表示画面に表示されるものとして説明したが、当該表示画面には少なくとも変更度が表示されればよく、予測結果及びKLダイバージェンス値のうちの少なくとも一方は省略されても構わない。
また、ここでは変更度「無」、「小」及び「大」の3つのうちの1つが計測されるものとして説明したが、例えば変更度「小」と変更度「大」」との間に相当する変更度「中」等が更に計測されてもよい。更に、本実施形態においては、上記したKLダイバージェンス値(つまり、関数名の予測結果に基づく確率分布の差異を表す数値)を変更度として用いてもよいし、当該KLダイバージェンスに基づいて算出される数値を変更度として用いてもよい。すなわち、本実施形態における変更度は、任意の基準による解釈に基づくものであってもよい。
上記したように本実施形態においては、第1関数を含む第1ソースコード及び第2関数を含む第2ソースコードを入力し、当該入力された第1ソースコードに含まれる第1関数を構文解析し、当該構文解析結果に基づいて当該第1関数の関数名を予測し、当該入力された第2ソースコードに含まれる第2関数を構文解析し、当該構文解析結果に基づいて当該第2関数の関数名を予測する。本実施形態においては、第1関数の関数名の予測結果及び第2関数の関数名の予測結果を比較することによって、第1及び第2関数間の変更度(第1変更度)が計測される。
本実施形態においては、このような構成により、2つのソースコードに含まれる関数間の適切な変更度を計測することができる。
具体的には、Diffのようなテキスト比較ツールを用いて変更度を計測する場合には、変更度を計測する関数を構成する要素(空行及び空白等を含まない要素)が順番通りに並んで(記述されて)いなければ当該関数の共通部分として認識しないため、当該関数間で機能が共通していたとしても当該関数を表すテキスト(記述)が大幅に変更されている場合には、当該関数間の変更度が大きいと判別される可能性が高い。一方、関数間で機能が共通していない場合であっても、共通部分が多く含まれているような場合には、当該関数間の変更度が小さいと判別される可能性がある。
これに対して、本実施形態においては、関数を表すテキスト(記述)が大幅に変更されている場合であっても、予測された関数名に基づく差異が小さいような場合には変更度が小さいと判別する(つまり、変更度「小」を計測する)ことができる。一方、関数を表現するテキストに共通部分が多く含まれているような場合であっても、予測された関数名に基づく差異が大きいような場合には、変更度が大きいと判別する(つまり、変更度「大」を計測する)ことができる。
すなわち、本実施形態においては、機能的な変更に基づいて適切な関数間の変更度を計測することが可能となる。
なお、本実施形態においては、関数を入力することによって当該関数名の予測結果を出力するように機械学習により生成された学習済モデルを用いて、第1ソースコードに含まれる第1関数及び第2ソースコードに含まれる第2関数の関数名が予測される構成により、精度の高い予測結果を得ることが可能となる。
更に、上記した学習済モデルは関数名の予測結果として複数の関数名候補(関数名の複数の候補)と当該複数の関数名候補の各々が当該関数名である確率とを出力するように生成されており、本実施形態において、変更度は、第1関数の関数名の予測結果として学習済モデルから出力された第1関数の複数の関数名候補の各々が当該第1関数の関数名である確率の分布と、第2関数の関数名の予測結果として学習済モデルから出力された第2関数の複数の関数名候補の各々が当該第2関数の関数名である確率の分布との差異に基づいて計測される。このような構成によれば、学習済モデルを用いて適切な変更度を計測することが可能となる。
なお、本実施形態においては、上記した第1関数の複数の関数名候補の各々が当該第1関数の関数名である確率の分布(第1関数の複数の関数名候補の確率分布)と第2関数の複数の関数名候補の各々が当該第2関数の関数名である確率の分布(第2関数の複数の関数名候補の確率分布)との差異がKLダイバージェンスまたはJSダイバージェンスを用いて計算されるものとして説明したが、当該差異は他の手法により計算されてもよい。
なお、ニューラルネットワーク(学習済モデル)上では関数名はベクトル表現として表されるため、本実施形態においては、当該ベクトル表現に基づく関数の差異を例えばコサイン類似度またはユークリッド距離を用いて計算し、当該差異に基づいて変更度を計測するように構成されていてもよい。
ここでは第1関数の関数名の予測結果(確率分布またはベクトル表現)と第2関数の関数名の予測結果(確率分布またはベクトル表現)との差異に基づいて変更度が計測されるものとして説明したが、当該変更度は、当該予測結果の類似度を用いて計測されても構わない。
なお、本実施形態においては、上記したように計測された変更度が表示(出力)されることによって、ユーザは第1及び第2関数間における変更の度合いを容易に把握することが可能であるが、本実施形態に係る関数間変更度計測装置10は、例えば当該変更度に加えて、第1及び第2関数の関数名の予測結果(関数名候補及び確率)を更に表示(出力)する構成であってもよい。このような構成によれば、ユーザは、第1及び第2関数の関数名の予測結果に基づいて、当該第1及び第2関数間の変更の内容(概要)を把握することも可能となる。
また、本実施形態においては単に第1及び第2ソースコードが関数間変更度計測装置10(入力部11)によって入力されるものとして説明したが、当該第1及び第2ソースコードは、図9に示すソースコード管理ツール(構成管理ツール)15において管理されていてもよい。ソースコード管理ツール15は例えばソフトウェア製品を実現するためのソースコード(のバージョン等)を管理する機能を有しており、当該ソースコード管理ツール15を利用することによって、本実施形態において説明した同種同系列のソフトウェア製品を実現するためのソースコードを効率的に取り出して入力するようなことが可能となる。すなわち、本実施形態においては、関数間変更度計測装置10にソースコード管理ツール15を埋め込むことによって、バージョン違いの関数をユーザが任意で指定し、当該指定された関数を含むソースコードを当該ソースコード管理ツール15から取り出して関数名の予測及び変更度の計測を行うような構成を容易に実現することができる。
なお、本実施形態に係る関数間変更度計測装置10は例えば派生開発を効率的に行うために用いられるが、当該関数間変更度計測装置10によって計測される変更度は、ソースコードに含まれる関数を変更した際に、当該関数の変更内容が適切であるか否かを確認する際の指標として用いることも可能である。具体的には、リファクタリングにより関数が変更されたにもかかわらず、機能としての変更度が大きいと判別された(つまり、変更度「大」が計測された)ような場合には、当該関数に対して意図しない変更がされている可能性があるため、当該関数の確認を促すようなことが可能となる。一方、機能を変更するように関数を変更したにもかかわらず、機能としての変更度が小さいと判別された(つまり、変更度「小」が計測された)ような場合には、当該関数の確認を促すようなことが可能となる。また、同じ関数のバージョン違いのもので機能としての変更度が大きいと判別された場合には、元の関数から機能の内容が大幅に変更された可能性があるため、関数名自体を変更する必要性について確認を促すようにしてもよい。
また、本実施形態においては、学習済モデルを用いてソースコードに含まれる関数から当該関数の関数名を予測し、当該予測された関数名の差異に基づいて関数間の変更度を計測するものとして説明したが、本実施形態は、例えばソースコード(に含まれる関数)が入力されることによって当該ソースコード(に含まれる関数)の要約を出力する(つまり、ソースコードからソースコードの要約を予測する)ように構築された学習済モデルを用いて、当該要約の差異に基づいてソースコード(に含まれる関数)間の変更度を計測するような構成としてもよい。すなわち、本実施形態に係る変更度計測装置は、第1及び第2ソースコードを入力し、当該入力された第1ソースコードの構文解析結果に基づいて当該第1ソースコードの要約を予測し、当該入力された第2ソースコードの構文解析結果に基づいて当該第2ソースコードの要約を予測し、当該要約を比較することによって、第1及び第2ソースコード間の変更度を計測するソースコード間変更度計測装置として実現されてもよい。この場合における学習済モデルから出力される予測結果は、例えばコメントのような形式のものであってもよいし、人手で任意に付される要約データのような形式のものであってもよい。
また、本実施形態においては、ソースコードに記述されているクラスから予測されたクラス名の差異に基づいて当該ソースコード(クラス)間の変更度を計測する構成等とすることも可能である。
すなわち、本実施形態は、入力されるソースコード(または当該ソースコードに含まれる関数)によって実現される機能に関する予測結果の差異に基づいて変更度を計測するように構成されていてもよい。
(第2実施形態)
次に、第2実施形態について説明する。本実施形態は、前述した第1実施形態において計測される変更度と、前述したDiffのようなテキスト比較ツールを用いて計測される変更度とを出力する点で、当該第1実施形態とは異なる。
図10は、本実施形態に係る関数間変更度計測装置の機能構成の一例を示すブロック図である。図10においては、前述した図1と同一の部分には同一参照符号を付して、その詳しい説明を省略する。なお、図10に示す第1変更度計測部13は、前述した第1実施形態において説明した変更度計測部13と同一の機能部である。
図10に示すように、関数間変更度計測装置10は、第2変更度計測部16を含む。第2変更度計測部16は、前述したDiffのようなテキスト比較ツールを用いて、入力部11によって入力された第1ソースコードに含まれる第1関数(を表すテキスト)及び第2ソースコードに含まれる第2関数(を表すテキスト)の差異に基づく変更度を計測する。
なお、関数間変更度計測装置10のシステム構成は前述した第1実施形態と同様であるが、上記した第2変更度計測部16の一部または全ては、前述した図2に示すCPU101に関数間変更度計測プログラムを実行させること、すなわち、ソフトウェアによって実現されるものとする。なお、第2変更度計測部16の一部または全ては、ハードウェアによって実現されてもよいし、ソフトウェア及びハードウェアの組み合わせによって実現されてもよい。
次に、図11のフローチャートを参照して、関数間変更度計測装置10の処理手順の一例について説明する。
まず、前述した図4に示すステップS1~S3の処理に相当するステップS11~S13の処理が実行される。
次に、第1変更度計測部13は、ステップS13において取得された第1関数の複数の関数名候補の各々の分布(第1確率分布)と、第2関数の複数の関数名候補の各々の分布(第2確率分布)とに基づいて、第1及び第2関数間の第1変更度を計測する(ステップS14)。
なお、ステップS14の処理(つまり、当該ステップS14において計測される第1変更度)は前述した図4に示すステップS4の処理(つまり、当該ステップS4において計測される変更度)と同様であるため、ここではその詳しい説明を省略する。本実施形態においては、例えばKLダイバージェンス値(関数名の予測結果に基づく確率分布の差異を表す数値)が第1変更度として計測されるものとする。また、本実施形態における第1変更度は、機能としての第1及び第2関数間の変更度に相当する。
次に、第2変更度計測部16は、ステップS12において切り出された第1及び第2関数間の第2変更度を、テキスト比較ツールを用いて計測する(ステップS15)。本実施形態において、第2変更度は、例えば第1及び第2関数間のテキストの差異を表す数値として計測されるものとする。本実施形態における第2変更度は、テキストとしての第1及び第2関数間の変更度に相当する。
なお、詳細な説明については省略するが、ステップS15においては、前述した第1実施形態における変更度と同様に、第1及び第2関数間でのテキストの差が大きい場合に変更度「大」が計測され、当該第1及び第2関数間でのテキストの差異が小さい場合に変更度「小」が計測されるような処理が実行されてもよい。
なお、ここでは便宜的にステップS11~ステップS15の処理が順に実行されるものとして説明したが、ステップS13及びS14の処理と、ステップS15の処理とは、順番が入れ替えられてもよいし、並列に実行されてもよい。
ステップS15の処理が実行されると、出力部14は、ステップS14において計測された第1変更度と、ステップS15において計測された第2変更度とを出力する(ステップS16)。
ここで、ステップS16においては例えば第1及び第2変更度を表示デバイス107に表示することができるが、図12は、第1及び第2変更度が表示された表示デバイス107の表示画面の一例を示している。
なお、図12においては、上記したように第1変更度としてKLダイバージェンス値(つまり、第1及び第2関数の関数名の予測結果に基づく確率分布の差異を表す数値)が計測され、第2変更度として第1及び第2関数間のテキストの差異を表す数値が計測された場合を想定している。
図12に示す表示画面107cにおいては、例えば横軸を第1変更度、縦軸を第2変更度とするグラフ上に、計測された第1及び第2変更度の対応関係をプロットすることにより、当該第1及び第2変更度が表示されている。これによれば、第1及び第2変更度の比較結果を容易に把握することが可能となる。
なお、図12に示す領域401に第1及び第2変更度の対応関係がプロットされる場合には、機能としての第1及び第2関数間の変更度は小さいが、テキストとしての第1及び第2関数間の変更度は大きいことを意味している。また、図12に示す領域402に第1及び第2変更度の対応関係がプロットされる場合には、機能としての第1及び第2関数間の変更度は大きいが、テキストとしての第1及び第2関数間の変更度は小さいことを意味している。
一方、例えば領域403に第1及び第2変更度の対応関係がプロットされる場合には、機能としての第1及び第2関数間の変更度及びテキストとしての第1及び第2関数間の変更度が概ね同様であることを意味している。
表示画面107cには1つの第1及び第2変更度の対応関係のみがプロットされた例が示されているが、例えば第1及び第2ソースコードの各々に含まれる複数の関数のうちの変更度が計測される2つの関数の組毎に第1及び第2変更度が計測された場合には、図13に示すような表示画面107dを表示することも可能である。この表示画面107dによれば、第1及び第2ソースコード全体の変更度を把握することも可能である。
上記したように本実施形態においては、第1ソースコードに含まれる第1関数を表すテキストと第2ソースコードに含まれる第2関数を表すテキストとを比較することによって第1及び第2関数間の第2変更度を計測し、当該計測された第2変更度を第1変更度とともに出力する構成により、ユーザは、第2変更度をも考慮して、第1及び第2関数間における変更の度合いを把握することができる。
更に、本実施形態においては、上記した図12及び図13に示すようなグラフ上に第1及び第2変更度(の対応関係)を表示することにより、ユーザは、当該第1及び第2変更度の比較結果を容易に把握することができる。
なお、本実施形態においては第1及び第2変更度をグラフ上に表示するものとして説明したが、当該第1及び第2変更度は、表形式等の他の形式で表示されてもよい。更に、第1及び第2変更度は前述した第1実施形態において説明したように変更度「無」、「小」及び「大」のように表されてもよく、このような第1及び第2変更度を比較可能な態様で表示してもよい。
すなわち、本実施形態においては、第1及び第2変更度を出力し、当該出力された第1及び第2変更度をユーザが把握することができる態様であれば、当該第1及び第2変更度の内容及び表示形式等は、適宜、変更されても構わない。
以上述べた少なくとも1つの実施形態によれば、ソースコードに含まれる関数間の変更度を計測することが可能な変更度計測装置、方法及びプログラムを提供することができる。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれると同様に、特許請求の範囲に記載された発明とその均等の範囲に含まれるものである。