南山の先生

学部別インデックス

理工学部・ソフトウェア工学科

井上 克郎

職名 教授
専攻分野 ソフトウェア工学、ソフトウェア分析、ソフトウェア再利用
主要著書・論文 "Code Clone Analysis: Research, Tools, and Practices"(共著), Springer, ISBN 987-981-16-1926-7, Aug., 2021.

"32bit UNIXシステムの2038年問題に対するプログラム修正法の提案"(共著), 情報処理学会論文誌、Vol.62、No.4、pp.1051-1055、2021.

"演習で身につくソフトウェア設計入門 ―構造化分析設計法とUML"(単著), エヌ・ティー・エス、2006.
将来的研究分野 プログラムの起源分析など
担当の授業科目 ソフトウェア工学概論
ソフトウェア工学特別講義[S]

プログラムの同じ部分を探してみよう!

コンピュータを動かすプログラムは、非常に単純な作業の繰り返しで作られています。例えば、高度なAI(人工知能)のプログラムや複雑なEC(電子商取引)のプログラムなども、分解して調べてみれば、数値や文字などを取り出したり別の入れ物に入れたりする、それらを比較する、などの単純な作業の組み合わせを、何万回、何億回繰り返し実行し、目的とする高度で複雑な機能を実現しています。

このようなプログラムは、人間が一つ一つの作業を選んで組み合わせて、プログラムとして作成していきます。近年、AI関連技術の発展で、自動プログラミングの期待も高まっていますが、実用になるにはまだ時間がかかると思います。

こういう状況で、少しでもプログラムの作成の手間を軽減するためによく行われるのが、すでに完成したプログラムの繰り返しの利用です。既存のプログラムの一部をコピーして、同じような作業をする必要のある部分にペーストして作っていくことがよくあります。いわゆるコピペという作業で、レポートや文学作品などの文章のコピペは問題のある行為ですが、プログラムの一部のコピペは、作業の効率化や信頼性向上の面からも、積極的に行われることが多いです。

しかし、コピペで作られたプログラムは、そのコピー元のプログラムの性質を引き継いでいます。元プログラムに欠陥(バグ)が含まれていた場合、ペースト先のプログラムにもバグが伝播することになり、やっかいなことになります。コピペをした人は、何も知らずにバグを含んだものを取り込んでしまい、バグを修正することが簡単にはできません。

また、それぞれの元プログラムには、著作権やライセンスがあり、その利用方法が決められていますが、コピペで作られた新たなプログラムを、コピー元のそれらの利用方法とは違った使い方をしてしまうとトラブルとなる場合もあります。

プログラムの中にあるコピペで作られた部分を探し出す技術をコードクローン検出(Code Clone Detection)と呼びます。コードクローン検出するツール(プログラム)の研究がいろいろ行われ、実際のソフトウェアの開発現場でも活用されてきています。私たちも、コードクローン検出ツールCCFinderを開発し、いろいろなプログラムの中のコピペを発見しました。

図は、3種類の大きなプログラム(FreeBSD, Linux, NetBSD)のそれぞれの中に存在するコピペ、または2つのプログラムのまたがるコピペを検出して図にしたものです。黒い点一つひとつが数百行もの長さになる大規模なコピペを示しています。対角線は、自分自身をコピペしたものとして常に検出されるので黒い線になっています。また対角線の上半分は下半分と対象なので表示していません。

この図で、黒い点が密集している四角形(FreeBSDとNetBSD)は、2つのプログラムの間で、多数のコピペが行われたことを示しており、2つのプログラムの開発が密接に関連していることをうかがわせます。逆にLinuxは他の2つのプログラムの開発とは疎遠なことがわかります。

このような検出結果をもとにして、プログラムのバグの情報の共有を行なったり、プログラムの改善の方針を決めたりしていきます。また、プログラムがどのように進化し、発展したかも推測することができます。

プログラムの開発や修正を行うためのいろいろな技術の総称をソフトウエア工学と呼んでいます。コードクローンの検出技術は、ソフトウェア工学の重要な技術の一つとなっています。多くの皆さんがソフトウェア工学に興味を持っていただくことを期待しています。

出典:Toshihiro Kamiya, Shinji Kusumoto, Katsuro Inoue: "CCFinder: A Multilinguistic Token-Based Code Clone Detection System for Large Scale Source Code", IEEE Transaction on Software Engineering vol. 28, no. 7, pp. 654-670 (July 2002).

図-南山の先生-井上.png