Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 16404] ファイルの概要

このコミットは、Go言語のツールチェインからcmd/covというコードカバレッジツールを削除するものです。このツールは、機能不全、移植性の欠如、リリースバイナリへの非包含、そしてより優れた代替ツールの登場を理由に廃止されました。

コミット

commit 650a1ef66fa67654e51d0aeaef4247f49525acdc
Author: Rob Pike <r@golang.org>
Date:   Fri May 24 11:06:06 2013 -0700

    cmd/cov: delete
    It doesn't work, it's not portable, it's not part of the released
    binaries, and a better tool is due.
    
    Fixes #1319.
    Fixes #4621.
    
    R=golang-dev, bradfitz, dave, rsc
    CC=golang-dev
    https://golang.org/cl/9681044

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/650a1ef66fa67654e51d0aeaef4247f49525acdc

元コミット内容

cmd/cov: delete
It doesn't work, it's not portable, it's not part of the released
binaries, and a better tool is due.

Fixes #1319.
Fixes #4621.

R=golang-dev, bradfitz, dave, rsc
CC=golang-dev
https://golang.org/cl/9681044

変更の背景

このコミットの主な目的は、Go言語の標準ツールセットからcmd/covというコードカバレッジツールを完全に削除することです。コミットメッセージには、削除の具体的な理由が明記されています。

  1. 機能不全 (It doesn't work): ツールが期待通りに動作しない、または信頼性が低い状態であったことを示唆しています。
  2. 移植性の欠如 (it's not portable): cmd/covはC言語で実装されており、特定のOSやアーキテクチャに依存する可能性がありました。Go言語のクロスプラットフォーム性を考慮すると、これは大きな問題です。
  3. リリースバイナリへの非包含 (it's not part of the released binaries): このツールがGoの公式リリースに含まれていなかったため、広く利用されることがなく、メンテナンスの優先度が低かったと考えられます。
  4. より良いツールの登場 (a better tool is due): これは、Go言語の標準的なコードカバレッジツールであるgo tool cover(またはgo test -cover)の登場を示唆しています。この新しいツールは、Go言語ネイティブで実装され、より堅牢で移植性が高く、Goのエコシステムに統合されています。

これらの理由から、cmd/covはGoプロジェクトにとって不要かつ負担となり、削除が決定されました。コミットメッセージに記載されているFixes #1319Fixes #4621は、このツールに関連する具体的なバグや問題がこれらのIssueで追跡されていたことを示しています。

前提知識の解説

コードカバレッジとは

コードカバレッジ(Code Coverage)とは、ソフトウェアテストにおいて、テストケースが実行された際に、プログラムのソースコードがどの程度実行されたかを測定する指標です。これにより、テストがコードのどの部分を網羅しているか、あるいは網羅していないかを把握できます。主なカバレッジの種類には、ステートメントカバレッジ、ブランチカバレッジ、ファンクションカバレッジなどがあります。コードカバレッジツールは、通常、ソースコードに計測用のコード(インストゥルメンテーション)を挿入し、実行時にその計測データを収集することでカバレッジを測定します。

Go言語におけるコードカバレッジツール

Go言語には、標準で強力なコードカバレッジツールが組み込まれています。これは主にgo test -coverコマンドを通じて利用され、go tool coverコマンドで詳細なレポート(HTML形式など)を生成できます。このツールはGo言語で書かれており、Goのビルドシステムと密接に統合されています。

cmd/covの歴史的背景

このコミットで削除されたcmd/covは、Go言語の初期に存在したコードカバレッジツールの一つです。コミットログのファイル変更履歴を見ると、main.c, tree.c, tree.hといったC言語のソースファイルが含まれていることから、このツールがC言語で実装されていたことがわかります。Go言語自体がC言語のツールチェイン(Plan 9のツールなど)から影響を受けていた初期の段階では、このようなC言語で書かれた補助ツールが存在することは珍しくありませんでした。しかし、Go言語のエコシステムが成熟し、Go言語ネイティブのツールが開発されるにつれて、C言語で書かれたツールはメンテナンスの負担や移植性の問題から徐々に置き換えられていきました。

技術的詳細

cmd/covの削除は、単にディレクトリを削除するだけでなく、Goのビルドシステムや関連スクリプトからの参照も削除する必要がありました。

  1. C言語実装の削除: src/cmd/covディレクトリ全体が削除されています。これには、Makefile、ドキュメントファイル(doc.go)、そして主要なC言語ソースファイル(main.c, tree.c, tree.h)が含まれます。C言語で書かれたコードカバレッジツールは、Goのランタイムやコンパイラとの連携において、Goネイティブのツールに比べて複雑さやオーバーヘッドがあった可能性があります。特に、Goの実行バイナリの内部構造を解析し、実行パスを追跡するためには、低レベルなシステムコールやアセンブリレベルの知識が必要となるため、C言語での実装は特定のプラットフォームに強く依存しがちです。

  2. ビルドシステムからの参照削除: src/cmd/dist/build.cは、Goのビルドプロセスを管理するC言語のプログラムです。このファイルからcmd/covへの参照が削除されています。具体的には、リリースビルドに含めないディレクトリのリスト(unreleased配列)や、インストール、ビルド、クリーンアップの対象からcmd/covが除外されています。これにより、将来のGoのビルドにおいてcmd/covが誤ってビルドされたり、配布されたりすることがなくなります。

  3. スクリプトからの参照削除: src/sudo.bashは、Goのツールをインストールする際に使用される可能性のあるシェルスクリプトです。このスクリプトからもcmd/covへの参照が削除されています。これは、ユーザーがsudo.bashを実行した際に、存在しないcmd/covツールを扱おうとしてエラーが発生するのを防ぐためです。

これらの変更は、cmd/covがGoのツールチェインから完全に切り離され、その存在がシステムから抹消されることを意味します。これは、Go言語のツール開発がよりGoネイティブなアプローチへと移行し、C言語ベースのレガシーなツールが整理されていく過程の一部と見なすことができます。

コアとなるコードの変更箇所

このコミットでは、以下のファイルが削除され、または変更されました。

  • 削除されたファイル:
    • src/cmd/cov/Makefile
    • src/cmd/cov/doc.go
    • src/cmd/cov/main.c
    • src/cmd/cov/tree.c
    • src/cmd/cov/tree.h
  • 変更されたファイル:
    • src/cmd/dist/build.c
    • src/sudo.bash

コアとなるコードの解説

src/cmd/cov/ ディレクトリ内のファイル (削除)

  • Makefile: cmd/covツールのビルド手順を定義していたファイルです。削除により、このツールがビルドシステムから完全に切り離されました。
  • doc.go: cmd/covツールのドキュメント(使用方法、オプションなど)を記述していたGoファイルです。Goのドキュメンテーションシステムに統合されていましたが、ツール自体の削除に伴い不要となりました。
  • main.c: cmd/covツールの主要なロジックが記述されていたC言語のソースファイルです。プロセスのアタッチ、ブレークポイントの設定、コード実行の追跡、カバレッジデータの収集とレポート生成など、ツールの核となる機能が含まれていました。特に、u.h, libc.h, bio.h, tree.hといったヘッダファイルや、ureg_amd64.h, mach.hといった低レベルなシステム関連のヘッダがインクルードされていることから、OSのプロセス管理やバイナリ解析に深く関与していたことが伺えます。
  • tree.c: main.cから参照されていたtree.hで定義されるデータ構造(おそらく赤黒木などのツリー構造)の実装が含まれていたC言語のソースファイルです。コードカバレッジの範囲を効率的に管理するために使用されていた可能性があります。
  • tree.h: tree.cで使用されるツリー構造の定義が含まれていたC言語のヘッダファイルです。

これらのファイルが削除されたことで、cmd/covツール自体がGoのソースツリーから物理的に消滅しました。

src/cmd/dist/build.c (変更)

このファイルはGoのビルドシステムの一部であり、Goのツールやパッケージのビルド、インストール、クリーンアップのプロセスを制御します。 変更点としては、cmd/covがビルド対象から除外され、特にリリースビルドにおいてcmd/profと同様にスキップされるようになりました。

  • static char *unreleased[] = { ... } から "src/cmd/cov", の行が削除されました。これは、リリースブランチに含めるべきではないディレクトリのリストからcmd/covが除外されたことを意味します。
  • install(char *dir) 関数内で、cmd/covがインストール対象から除外される条件が削除されました。
  • static char *buildorder[] = { ... } から "cmd/cov", の行が削除されました。これは、ビルド順序のリストからcmd/covが除外されたことを意味します。
  • static char *cleantab[] = { ... } から "cmd/cov", の行が削除されました。これは、クリーンアップ対象のリストからcmd/covが除外されたことを意味します。
  • clean(void) 関数内で、cmd/covがクリーンアップ時にスキップされる条件が削除されました。

これらの変更により、Goのビルドシステムはもはやcmd/covの存在を認識せず、ビルドやインストール、クリーンアップの対象から完全に外れることになります。

src/sudo.bash (変更)

このシェルスクリプトは、Goのツールを/usr/local/binのようなシステムパスにインストールする際に使用される補助スクリプトです。 変更点としては、cmd/covへの参照が削除されました。

  • if ! [ -x $GOTOOLDIR/cov -a -x $GOTOOLDIR/prof ]; then の行が if ! [ -x $GOTOOLDIR/prof ]; then に変更されました。これにより、covツールの存在チェックが不要になりました。
  • for i in prof cov の行が for i in prof に変更されました。これにより、covツールに対するループ処理が削除されました。

これらの変更により、sudo.bashスクリプトはcmd/covツールを扱わなくなり、存在しないツールへの参照によるエラーを防ぎます。

関連リンク

参考にした情報源リンク