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

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

このコミットは、Go言語の標準ライブラリからimage/bmpおよびimage/tiffパッケージを削除し、それらをcode.google.com/p/go.imageサブリポジトリへ移動したことを記録しています。これは、Go標準ライブラリの肥大化を防ぎ、より専門的な機能は外部パッケージとして提供するというGoプロジェクトの方針の一環です。

コミット

commit 10498f4d335f6bf0089791b263e795233ff79ec5
Author: Nigel Tao <nigeltao@golang.org>
Date:   Tue Jan 31 14:01:53 2012 +1100

    image: remove image/bmp and image/tiff from std.
    
    They have moved to the code.google.com/p/go.image subrepo.
    
    R=rsc
    CC=golang-dev
    https://golang.org/cl/5552052

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

https://github.com/golang/go/commit/10498f4d335f6bf0089791b263e795233ff79ec5

元コミット内容

Go標準ライブラリからimage/bmpおよびimage/tiffパッケージを削除しました。これらのパッケージは、code.google.com/p/go.imageサブリポジトリに移動されました。

変更の背景

Go言語の標準ライブラリは、その堅牢性と安定性で知られていますが、同時に「小さく保つ」という哲学も持っています。これは、すべての可能な機能を標準ライブラリに含めるのではなく、コアで汎用的な機能に限定し、より専門的またはニッチな機能は外部パッケージとして提供することを意味します。

このコミットが行われた2012年当時、Goのエコシステムはまだ初期段階にあり、パッケージ管理や外部ライブラリの利用に関するベストプラクティスが確立されつつありました。image/bmpimage/tiffは、特定の画像フォーマットのエンコード/デコード機能を提供していましたが、これらはすべてのGoアプリケーションにとって必須の機能ではありませんでした。

そのため、標準ライブラリのフットプリントを削減し、よりコアな機能に集中するために、これらのパッケージを標準ライブラリから切り離し、独立したサブリポジトリ(現在のGoモジュールに相当する概念)として管理する決定がなされました。これにより、標準ライブラリのビルド時間や配布サイズが削減され、また、これらの画像フォーマットが必要な開発者は、必要に応じて外部パッケージとしてインポートできるようになりました。

前提知識の解説

Go言語の標準ライブラリ (Standard Library)

Go言語は、非常に充実した標準ライブラリを提供しており、ネットワーク、ファイルI/O、暗号化、データ構造など、多くの一般的なプログラミングタスクをカバーしています。標準ライブラリのパッケージは、Goのインストールにバンドルされており、追加のダウンロードなしに利用できます。Goの設計哲学の一つに「batteries included(バッテリー付属)」がありますが、これは標準ライブラリが多くの一般的なニーズを満たすことを意味します。しかし、同時に「小さく保つ」という哲学もあり、すべての機能を標準ライブラリに含めるわけではありません。

Goのサブリポジトリ (Sub-repositories / External Packages)

Goプロジェクトでは、標準ライブラリには含めないが、Goチームが公式にメンテナンスするパッケージ群を「サブリポジトリ」として提供していました。これらは、code.google.com/p/go.imageのように、code.google.com/p/以下のパスでホストされていました(現在はGitHubなどの別の場所に移行しています)。これらのサブリポジトリは、標準ライブラリとは独立してバージョン管理され、必要に応じて開発者がgo getコマンドなどで取得して利用することができました。これは、現在のGoモジュールシステムにおける外部パッケージの概念の先駆けとも言えます。

BMP (Bitmap) 形式

BMPは、Microsoft Windowsで広く使用されているビットマップ画像ファイル形式です。圧縮されていないピクセルデータを直接格納するため、ファイルサイズが大きくなる傾向がありますが、画像の品質は維持されます。シンプルな構造のため、比較的容易に解析・生成が可能です。

TIFF (Tagged Image File Format) 形式

TIFFは、主に印刷業界や写真編集で利用される高機能な画像ファイル形式です。様々な圧縮方式(LZW、JPEG、PackBitsなど)や色深度、レイヤー、メタデータなどをサポートしており、非常に柔軟性が高いのが特徴です。そのため、BMPに比べて構造が複雑で、エンコーダ/デコーダの実装も複雑になりがちです。

技術的詳細

このコミットの技術的な変更は、主に以下の点に集約されます。

  1. パッケージの削除: src/pkg/image/bmpsrc/pkg/image/tiffディレクトリとその内容が完全に削除されました。これには、画像読み込み(reader.go)、関連するユーティリティ(buffer.go, compress.go, consts.go)、およびテストファイル(reader_test.go, buffer_test.go)が含まれます。
  2. Makefileの更新: Goのビルドシステムで使用されるsrc/pkg/Makefileから、削除されたimage/bmpimage/tiffへの参照が削除されました。これにより、これらのパッケージが標準ライブラリの一部としてビルドされなくなります。
  3. テストコードの修正: src/pkg/image/decode_test.goから、image/bmpimage/tiffのインポート文が削除されました。また、テストデータとして使用されていたBMPおよびTIFF形式の画像ファイルも削除され、テストケースが調整されました。特に、imageTests変数内の"testdata/video-001.bmp""testdata/video-001.tiff"への参照が削除されています。

この変更により、Goの標準ライブラリをインポートするだけのアプリケーションは、BMPやTIFFのデコード/エンコード機能を含まなくなります。これらの機能が必要な場合は、明示的に外部のgo.imageサブリポジトリ(またはその後のGoモジュール)をインポートする必要があります。これは、依存関係をより細かく制御し、アプリケーションのバイナリサイズを最適化する上で重要なステップでした。

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

このコミットのコアとなる変更は、主に以下のファイルに集中しています。

  • src/pkg/Makefile: 標準ライブラリのビルド対象からimage/bmpimage/tiffを削除。
  • src/pkg/image/bmp/ディレクトリ全体: BMP画像フォーマットのデコードに関連するすべてのGoソースファイルとMakefileが削除。
  • src/pkg/image/tiff/ディレクトリ全体: TIFF画像フォーマットのデコードに関連するすべてのGoソースファイルとMakefileが削除。
  • src/pkg/image/decode_test.go: 削除されたimage/bmpimage/tiffパッケージへのインポートと、それらを使用するテストケースの参照を削除。
  • src/pkg/image/testdata/video-001.bmp: テストデータとして使用されていたBMP画像ファイルが削除。
  • src/pkg/image/testdata/video-001.tiff: テストデータとして使用されていたTIFF画像ファイルが削除。
  • src/pkg/image/tiff/testdata/: TIFF関連のテストデータファイルがすべて削除。

具体的な差分としては、src/pkg/MakefileDIRS変数とNOTEST変数からimage/bmpimage/tiffが削除されている点、そしてsrc/pkg/image/decode_test.goのimportブロックから_ "image/bmp"_ "image/tiff"が削除されている点が挙げられます。

コアとなるコードの解説

src/pkg/Makefileの変更

--- a/src/pkg/Makefile
+++ b/src/pkg/Makefile
@@ -89,13 +89,11 @@ DIRS=\
 	html\
 	html/template\
 	image\
-	image/bmp\
 	image/color\
 	image/draw\
 	image/gif\
 	image/jpeg\
 	image/png\
-	image/tiff\
 	index/suffixarray\
 	io\
 	io/ioutil\
@@ -181,7 +179,6 @@ NOTEST=\
 	exp/ebnflint\
 	go/doc\
 	hash\
-	image/bmp\
 	image/gif\
 	net/http/pprof\
 	net/http/httptest\

この変更は、Goの標準ライブラリのビルドプロセスにおいて、image/bmpimage/tiffがもはや標準パッケージとして扱われないことを示しています。DIRS変数はビルド対象のディレクトリをリストアップし、NOTEST変数はテストを実行しないディレクトリをリストアップします。これらのリストから該当パッケージが削除されることで、Goのビルドシステムはこれらのパッケージを標準ライブラリの一部としてコンパイルしなくなります。

src/pkg/image/bmp/ および src/pkg/image/tiff/ ディレクトリの削除

これらのディレクトリが完全に削除されたことは、BMPおよびTIFFのデコード/エンコード機能の実装コードが標準ライブラリから物理的に取り除かれたことを意味します。これには、画像フォーマットの解析ロジック、ピクセルデータ処理、エラーハンドリングなどが含まれていました。

src/pkg/image/decode_test.goの変更

--- a/src/pkg/image/decode_test.go
+++ b/src/pkg/image/decode_test.go
@@ -11,11 +11,9 @@ import (
 	"os"
 	"testing"
 
-	_ "image/bmp"
 	_ "image/gif"
 	_ "image/jpeg"
 	_ "image/png"
-	_ "image/tiff"
 )
 
 type imageTest struct {
@@ -25,7 +23,7 @@ type imageTest struct {
 }
 
 var imageTests = []imageTest{
-	{"testdata/video-001.png", "testdata/video-001.bmp", 0},
+	{"testdata/video-001.png", "testdata/video-001.png", 0},
 	// GIF images are restricted to a 256-color palette and the conversion
 	// to GIF loses significant image quality.
 	{"testdata/video-001.png", "testdata/video-001.gif", 64 << 8},
@@ -33,10 +31,7 @@ var imageTests = []imageTest{
 	{"testdata/video-001.png", "testdata/video-001.5bpp.gif", 128 << 8},
 	// JPEG is a lossy format and hence needs a non-zero tolerance.
 	{"testdata/video-001.png", "testdata/video-001.jpeg", 8 << 8},
-	{"testdata/video-001.png", "testdata/video-001.png", 0},
-	{"testdata/video-001.png", "testdata/video-001.tiff", 0},
-
-	// Test grayscale images.
+	// Grayscale images.
 	{"testdata/video-005.gray.png", "testdata/video-005.gray.jpeg", 8 << 8},
 	{"testdata/video-005.gray.png", "testdata/video-005.gray.png", 0},
 }

この変更は、Goのテストフレームワークが、もはや標準ライブラリの一部ではないimage/bmpimage/tiffパッケージをインポートしないように修正されたことを示しています。_ "image/bmp"のようなブランクインポートは、パッケージのinit関数を実行するために使用されますが、パッケージ自体は直接使用されません。この場合、image.RegisterFormat関数がinit内で呼び出され、Goのimageパッケージが特定の画像フォーマットをデコードできるようになります。これらのインポートが削除されたことで、Goの標準imageパッケージは、BMPやTIFFフォーマットを自動的に認識しなくなりました。

また、imageTests配列からBMPとTIFFのテストケースが削除され、代わりにPNG画像が使用されるように変更されています。これは、これらのフォーマットが標準ライブラリから削除されたことに伴う、テストの整合性を保つための変更です。

関連リンク

参考にした情報源リンク