[インデックス 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/bmp
とimage/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に比べて構造が複雑で、エンコーダ/デコーダの実装も複雑になりがちです。
技術的詳細
このコミットの技術的な変更は、主に以下の点に集約されます。
- パッケージの削除:
src/pkg/image/bmp
とsrc/pkg/image/tiff
ディレクトリとその内容が完全に削除されました。これには、画像読み込み(reader.go
)、関連するユーティリティ(buffer.go
,compress.go
,consts.go
)、およびテストファイル(reader_test.go
,buffer_test.go
)が含まれます。 - Makefileの更新: Goのビルドシステムで使用される
src/pkg/Makefile
から、削除されたimage/bmp
とimage/tiff
への参照が削除されました。これにより、これらのパッケージが標準ライブラリの一部としてビルドされなくなります。 - テストコードの修正:
src/pkg/image/decode_test.go
から、image/bmp
とimage/tiff
のインポート文が削除されました。また、テストデータとして使用されていたBMPおよびTIFF形式の画像ファイルも削除され、テストケースが調整されました。特に、imageTests
変数内の"testdata/video-001.bmp"
と"testdata/video-001.tiff"
への参照が削除されています。
この変更により、Goの標準ライブラリをインポートするだけのアプリケーションは、BMPやTIFFのデコード/エンコード機能を含まなくなります。これらの機能が必要な場合は、明示的に外部のgo.image
サブリポジトリ(またはその後のGoモジュール)をインポートする必要があります。これは、依存関係をより細かく制御し、アプリケーションのバイナリサイズを最適化する上で重要なステップでした。
コアとなるコードの変更箇所
このコミットのコアとなる変更は、主に以下のファイルに集中しています。
src/pkg/Makefile
: 標準ライブラリのビルド対象からimage/bmp
とimage/tiff
を削除。src/pkg/image/bmp/
ディレクトリ全体: BMP画像フォーマットのデコードに関連するすべてのGoソースファイルとMakefileが削除。src/pkg/image/tiff/
ディレクトリ全体: TIFF画像フォーマットのデコードに関連するすべてのGoソースファイルとMakefileが削除。src/pkg/image/decode_test.go
: 削除されたimage/bmp
とimage/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/Makefile
のDIRS
変数とNOTEST
変数からimage/bmp
とimage/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/bmp
とimage/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/bmp
とimage/tiff
パッケージをインポートしないように修正されたことを示しています。_ "image/bmp"
のようなブランクインポートは、パッケージのinit
関数を実行するために使用されますが、パッケージ自体は直接使用されません。この場合、image.RegisterFormat
関数がinit
内で呼び出され、Goのimage
パッケージが特定の画像フォーマットをデコードできるようになります。これらのインポートが削除されたことで、Goの標準image
パッケージは、BMPやTIFFフォーマットを自動的に認識しなくなりました。
また、imageTests
配列からBMPとTIFFのテストケースが削除され、代わりにPNG画像が使用されるように変更されています。これは、これらのフォーマットが標準ライブラリから削除されたことに伴う、テストの整合性を保つための変更です。
関連リンク
- Go言語公式ウェブサイト: https://golang.org/
- Go言語の標準ライブラリ: https://pkg.go.dev/std
- Goの画像処理サブリポジトリ (現在の場所): https://pkg.go.dev/golang.org/x/image
参考にした情報源リンク
- Go言語のコミット履歴 (GitHub): https://github.com/golang/go/commits/master
- Go Code Review Comments (CL 5552052): https://golang.org/cl/5552052 (これはコミットメッセージに記載されているリンクであり、当時のコードレビューシステムへのリンクです。現在は直接アクセスできない場合がありますが、履歴として重要です。)
- Wikipedia: BMPファイルフォーマット: https://ja.wikipedia.org/wiki/BMP%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88
- Wikipedia: Tagged Image File Format: https://ja.wikipedia.org/wiki/Tagged_Image_File_Format
- Go Modules (現在のGoの依存関係管理): https://go.dev/blog/using-go-modules (このコミット当時はGo Modulesは存在しませんでしたが、サブリポジトリの概念が現在のモジュールシステムに繋がるため、参考情報として記載します。)