
AIによるコード生成が日常的になった現在、プロジェクト内で類似したコードが増加する傾向にあります。こうした重複コードは保守性を低下させ、技術的負債の原因となります。今回紹介する「similarity-ts」は、このような課題に対処するために開発された高速なコード重複検出ツールです1。
similarity-tsはRustで実装されており、TypeScript/JavaScriptをはじめ、Python、Rust、Go、Javaなど複数のプログラミング言語に対応しています。特にTypeScript/JavaScriptのサポートは「Production Ready」として実用レベルに達しており、大規模プロジェクトでも高速に動作します2。
主な特徴と機能
similarity-tsの最大の特徴は、Abstract Syntax Tree(AST)ベースの構造比較を採用している点です。これにより、変数名が異なっていても構造的に類似したコードを検出できます。
ゼロコンフィグレーション
ツールの使い方は非常にシンプルです。プロジェクトのルートディレクトリで以下のコマンドを実行するだけで、重複コードの検出が始まります1。
# インストール
cargo install similarity-ts
# 実行
similarity-ts
# 詳細な結果を表示
similarity-ts . --print
多言語サポート
現在サポートされている言語と成熟度は以下の通りです2:
- Production Ready: TypeScript/JavaScript
- Beta: Python、Rust
- Experimental: Go、Java、C/C++、C#、Ruby、Elixir
言語ごとに最適化されたパーサーを使用しており、TypeScript/JavaScriptにはoxc-parser
、PythonとRustにはtree-sitter
が採用されています。
技術的な仕組み:TSEDアルゴリズム
similarity-tsの中核となるのは、TSED(Tree Similarity of Edit Distance)アルゴリズムです。これはarXivで公開された論文に基づいており、木構造の編集距離を計算することでコードの類似性を判定します1。
アルゴリズムの概要
TSEDアルゴリズムは、APTED(All Path Tree Edit Distance)アルゴリズムをベースに、実際のコード量に基づくペナルティを適用して類似度を計算します。これにより、単純な文字列比較では見逃してしまう構造的な類似性を検出できます3。
パフォーマンス最適化
開発者のmizchi氏は、当初TypeScriptで実装したものの、計算量の多さから大規模プロジェクトではクラッシュしてしまったと述べています。そこでRustに書き直し、以下の最適化を施しました1:
- Bloomフィルタによる事前フィルタリング: 明らかに異なる関数ペアを高速に除外(約5倍の高速化)
- マルチスレッド処理: ファイル読み込みと解析を並列化(約4倍の高速化)
- 効率的なメモリ管理: Rustの所有権システムを活用した最適化
これらの最適化により、全体で約50倍の高速化を実現しています。
実際の使用例と出力
similarity-tsを実行すると、以下のような出力が得られます1:
Similarity: 89.09%, Score: 8.0 points
src/utils/getUserById.ts:4-12 getUserById
src/utils/findUserById.ts:8-16 findUserById
この例では、getUserById
関数とfindUserById
関数が89.09%の類似度を持っていることが示されています。スコアは編集距離に基づいて計算され、低いほど類似度が高いことを意味します。
活用シーンと今後の展望
主な活用シーン
- AIコード生成の品質管理: AIが生成した類似コードの検出と統合
- リファクタリング: 重複コードの特定と共通化
- コードレビュー: 新しいコードが既存コードと重複していないかの確認
- 技術的負債の可視化: プロジェクト全体の重複度を測定
今後の展望
開発者は今後の改善点として以下を挙げています1:
- 型定義リテラルの高速比較
- コード品質の測定機能
- より高度なセマンティクスの類似性検出
similarity-tsは、AI時代におけるコード品質管理の新しいアプローチを提示しています。開発者が意識せずに生成してしまう重複コードを効率的に検出し、より保守性の高いコードベースの実現に貢献するツールといえるでしょう。
プロジェクトの詳細やインストール方法については、GitHubリポジトリをご覧ください。また、アルゴリズムの技術的な詳細に興味がある方は、関連する学術論文も参考になるでしょう。
Sources
- similarity-tsの紹介 - Zenn(mizchi氏による解説記事)
- similarity-ts GitHub Repository - GitHub公式リポジトリ
- Revisiting Code Similarity Evaluation with Abstract Syntax Tree Edit Distance - arXiv(TSEDアルゴリズムに関する論文)