[インデックス 1532] ファイルの概要
このコミットは、Go言語の初期開発段階において、sys.readfile
というシステムコールが削除されたことに伴い、そのテストケースである test/readfile.go
ファイルを削除するものです。この変更は、Go言語のI/O操作のAPI設計における進化の一環として行われました。
コミット
commit 87b1f05dbe96d799e6a7ecfa6671f819d5090242
Author: Ian Lance Taylor <iant@golang.org>
Date: Wed Jan 21 11:56:47 2009 -0800
sys.readfile has been removed. Remove the test case for it.
It was disabled last week anyhow.
R=r,rsc
DELTA=24 (0 added, 24 deleted, 0 changed)
OCL=23205
CL=23220
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/87b1f05dbe96d799e6a7ecfa6671f819d5090242
元コミット内容
sys.readfile
が削除されたため、そのテストケースを削除する。
先週、すでに無効化されていた。
変更の背景
このコミットは、Go言語の初期開発フェーズ、特に2009年1月という非常に早い段階で行われたものです。Go言語は、その設計思想として「シンプルさ」「効率性」「並行性」を重視しており、APIの設計もこれらの原則に基づいて進化してきました。
sys.readfile
は、Go言語の初期に存在した、ファイルを読み込むための低レベルなシステムコールへの直接的なラッパーのような機能であったと推測されます。しかし、Go言語の標準ライブラリは、より抽象化され、プラットフォームに依存しない、かつエラーハンドリングが容易なI/Oインターフェースを提供することを目指していました。
このコミットメッセージにある「It was disabled last week anyhow.(先週、すでに無効化されていた)」という記述は、sys.readfile
がすでに非推奨または使用停止の方向に向かっており、このコミットはその最終的なクリーンアップの一環であることを示唆しています。Go言語のI/Oパッケージ(io
、os
、bufio
など)が成熟するにつれて、低レベルなsys
パッケージの直接的なファイルI/O関数は不要となり、よりGoらしい(Go-idiomaticな)方法に置き換えられていったと考えられます。
前提知識の解説
- Go言語の初期開発: Go言語は2009年11月に一般公開されましたが、その開発は数年前からGoogle社内で進められていました。このコミットは、その公開前の活発な開発期間における変更です。当時のGo言語のAPIは現在とは大きく異なり、試行錯誤の段階にありました。
sys
パッケージ: Go言語の初期には、sys
というパッケージが存在し、低レベルなシステムコールへのアクセスを提供していました。これは、現在のsyscall
パッケージやos
パッケージの一部機能に相当しますが、より直接的で抽象度の低いAPIを提供していた可能性があります。Go言語の設計思想として、可能な限りプラットフォーム非依存の抽象化されたAPIを提供することが重視されたため、sys
パッケージの多くの機能は標準ライブラリの他のパッケージに統合されるか、削除されていきました。- ファイルI/Oの進化: 多くのプログラミング言語と同様に、Go言語もファイルの読み書きには様々なアプローチがあります。初期の直接的なシステムコールラッパーから、より高レベルな抽象化(例:
os.Open
、io.Reader
インターフェース、bufio.Scanner
など)へと進化することで、開発者はより安全で効率的、かつ移植性の高いコードを書けるようになります。 - テスト駆動開発 (TDD): ソフトウェア開発において、機能の追加や変更を行う際には、その機能が正しく動作することを保証するためにテストコードが書かれます。機能が削除された場合、その機能に関連するテストコードも削除されるのが一般的です。このコミットは、
sys.readfile
という機能が削除されたため、それに対応するテストファイルtest/readfile.go
も削除されたという、テスト駆動開発の原則に則ったクリーンアップ作業です。
技術的詳細
このコミットの技術的な詳細は、sys.readfile
という特定のAPIがGo言語のコアから削除されたという点に集約されます。
Go言語のI/Oモデルは、io.Reader
と io.Writer
というインターフェースを中心に構築されています。これにより、ファイル、ネットワーク接続、メモリ上のバッファなど、様々なデータソースやシンクに対して統一的なI/O操作を行うことができます。sys.readfile
のような特定のファイル読み込み関数が削除されたのは、おそらく以下の理由が考えられます。
- 抽象化の推進:
sys.readfile
は、特定のファイル読み込み操作に特化しすぎており、Go言語が目指す汎用的なI/Oインターフェース(io.Reader
など)の設計思想と合致しなかった可能性があります。より汎用的なインターフェースを提供することで、コードの再利用性と柔軟性が向上します。 - エラーハンドリングの一貫性: Go言語はエラーを戻り値として明示的に返すことで、堅牢なエラーハンドリングを奨励しています。
sys.readfile
のような低レベルAPIは、エラー処理が不十分であったり、Go言語のエラーハンドリングパターンに適合していなかった可能性があります。 - プラットフォーム非依存性:
sys
パッケージは、特定のOSのシステムコールに密接に関連していることが多く、プラットフォーム間の移植性を損なう可能性があります。Go言語はクロスプラットフォーム開発を強く意識しているため、このような依存性を減らす方向でAPIが設計されていきました。 - より高レベルなAPIの提供:
os
パッケージのos.ReadFile
(Go 1.16で導入されたが、その前身となる機能は存在したはず) やioutil.ReadFile
(Go 1.16でos.ReadFile
に置き換えられ非推奨) のような、より使いやすく、かつ効率的なファイル読み込み関数が標準ライブラリに提供されることで、低レベルなsys.readfile
はその役割を終えました。
このコミットは、Go言語のAPIが、より洗練され、Goらしい設計原則に沿った形へと進化していく過程の一端を示しています。
コアとなるコードの変更箇所
このコミットでは、既存のファイルが削除されたのみで、コードの追加や変更はありません。
--- a/test/readfile.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// # $G $F.go && $L $F.$A && ./$A.out readfile.go
-// # This is some data we can recognize
-
-package main
-
-func main() {
- var s string;
- var ok bool;
-
- s, ok = sys.readfile("readfile.go");
- if !ok {
- print("couldn't readfile\n");
- sys.Exit(1)
- }
- start_of_file :=
- "// $G $F.go && $L $F.$A && ./$A.out readfile.go\\n" +\
- "// # This is some data we can recognize\\n" +\
- "\\n" +\
- "package main\\n";
- if s[0:102] != start_of_file {
- print("wrong data\\n");
- sys.Exit(1)
- }
-}
削除されたファイル test/readfile.go
の内容は以下の通りです。
package main
: メインパッケージとして定義されています。func main()
: エントリーポイントとなる関数です。sys.readfile("readfile.go")
: このテストの核心部分であり、sys.readfile
関数を使って自身のソースコードreadfile.go
を読み込もうとしています。- エラーハンドリング:
!ok
で読み込みが失敗した場合にエラーメッセージを出力し、sys.Exit(1)
でプログラムを終了しています。 - 内容の検証: 読み込んだ文字列
s
の先頭102バイトが期待される文字列 (start_of_file
) と一致するかを検証しています。これは、ファイルの内容が正しく読み込まれたことを確認するための基本的なテストロジックです。
コアとなるコードの解説
このコミットの「コアとなるコード」は、削除された test/readfile.go
ファイルそのものです。このファイルは、Go言語の初期のテストフレームワークと、当時存在した sys.readfile
関数の使用方法を示しています。
ファイルの内容から、当時のGo言語のテストの実行方法に関するコメント行 (// # $G $F.go && $L $F.$A && ./$A.out readfile.go
) が見られます。これは、コンパイル ($G $F.go
)、リンク ($L $F.$A
)、実行 (./$A.out
) という一連のステップを示しており、現在の go test
コマンドが提供する統合されたテスト実行環境とは異なる、より手動に近いプロセスであったことが伺えます。
sys.readfile
は、ファイル名を引数に取り、ファイルの内容を文字列として返し、成功したかどうかを示すブール値を返す設計であったことがわかります。これは、現在の os.ReadFile
がバイトスライスとエラーを返すのとは異なるシグネチャです。
このテストファイルが削除されたことは、sys.readfile
がGo言語の標準ライブラリから完全に廃止され、もはやその機能が提供されないことを意味します。これにより、Go言語のI/O操作は、より現代的で統一されたAPIへと移行していったのです。
関連リンク
- Go言語の公式ドキュメント: https://golang.org/doc/
- Go言語のI/Oパッケージ (
io
,os
,bufio
):io
パッケージ: https://pkg.go.dev/ioos
パッケージ: https://pkg.go.dev/osbufio
パッケージ: https://pkg.go.dev/bufio
参考にした情報源リンク
- Go言語のGitHubリポジトリ: https://github.com/golang/go
- Go言語の初期のコミット履歴 (GitHub): https://github.com/golang/go/commits/master?after=87b1f05dbe96d799e6a7ecfa6671f819d5090242+10000 (このコミットの周辺の履歴を辿ることで、当時の文脈を理解するのに役立ちます)
- Go言語の歴史に関する記事やブログ (一般的な情報源): Go言語の初期の設計決定やAPIの変遷について解説している記事は多数存在します。例えば、Go言語のブログや、Go言語の設計者による講演録などが参考になります。
- The Go Blog: https://go.dev/blog/
- Go at Google: Language Design in the Service of Software Engineering (Rob Pike): https://talks.golang.org/2012/go-at-google.slide (Go言語の設計思想に関する講演資料)