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

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

このコミットは、Go言語の標準ライブラリであるosパッケージ内のファイル名からos_プレフィックスを削除する変更です。具体的には、src/lib/osディレクトリ内の複数のGoソースファイル(os_env.go, os_error.go, os_file.go, os_time.go, os_types.go)が、それぞれenv.go, error.go, file.go, time.go, types.goへとリネームされました。ただし、os_test.goは例外的にプレフィックスが維持されています。このファイル名の変更に伴い、ビルドプロセスを管理するsrc/lib/os/Makefileも更新されています。

コミット

drop the os_ prefix on the file names in os.  os_test.go can stay.

R=rsc
DELTA=793  (392 added, 392 deleted, 9 changed)
OCL=24777
CL=24804

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

https://github.com/golang/go/commit/6017895659e580d04c443dafcfa7380cabe5ecd0

元コミット内容

commit 6017895659e580d04c443dafcfa7380cabe5ecd0
Author: Rob Pike <r@golang.org>
Date:   Tue Feb 10 16:40:06 2009 -0800

    drop the os_ prefix on the file names in os.  os_test.go can stay.
    
    R=rsc
    DELTA=793  (392 added, 392 deleted, 9 changed)
    OCL=24777
    CL=24804

変更の背景

この変更の背景には、Go言語の初期開発段階におけるコードベースの整理と命名規則の統一があります。osパッケージは、オペレーティングシステムとのインタフェースを提供するGoの標準ライブラリの重要な部分です。初期のGo言語では、特定のパッケージに属するファイルにそのパッケージ名をプレフィックスとして付ける慣習があった可能性があります(例: os_file.go)。しかし、パッケージ内部のファイルは、そのパッケージに属していることが自明であるため、冗長なプレフィックスは不要であるという判断に至ったと考えられます。

os_プレフィックスを削除することで、ファイル名がより簡潔になり、コードの可読性が向上します。また、パッケージ内のファイルがそのパッケージの責務を直接的に表すようになり、Go言語の「シンプルさ」という設計哲学に合致します。os_test.goが例外的にプレフィックスを維持しているのは、テストファイルであることが明確にわかるようにするため、あるいはテストフレームワークやビルドシステムがその命名規則に依存していたためと考えられます。

前提知識の解説

Go言語のosパッケージ

Go言語のosパッケージは、オペレーティングシステムが提供する機能へのプラットフォーム非依存なインタフェースを提供します。ファイル操作、プロセス管理、環境変数へのアクセス、シグナル処理など、OSレベルの多くの機能がこのパッケージを通じて利用できます。Goプログラムがシステムリソースと対話する際の基本的な手段となります。

Go言語のファイル命名規則とパッケージ構造

Go言語では、通常、パッケージ内のソースファイルにはパッケージ名をプレフィックスとして付けません。例えば、fmtパッケージのソースファイルはprint.goformat.goのように、パッケージ名を含まない簡潔な名前が付けられます。これは、ファイルが特定のパッケージに属していることが、そのファイルのディレクトリパスによって既に示されているためです。このコミットは、まさにこのGo言語の慣習に沿うように、初期のコードベースを修正するものです。

Makefilegobuild

Go言語の初期のビルドシステムは、現在のようなgo buildコマンドとは異なり、Makefilegobuildというツールに大きく依存していました。

  • Makefile: Makefileは、ソフトウェアのビルドプロセスを自動化するためのスクリプトファイルです。makeコマンドによって実行され、ソースファイルのコンパイル順序、依存関係、リンク方法などを定義します。このコミットでは、ファイル名が変更されたため、Makefile内の参照も新しいファイル名に更新する必要がありました。
  • gobuild: gobuildは、Go言語の初期のビルドツールの一つで、Goソースファイルをコンパイルし、パッケージを構築するために使用されていました。Makefileのコメント行にgobuild -m ... >Makefileとあることから、Makefile自体がgobuildによって生成されていた可能性も示唆されます。このツールは、現在のgoコマンドに統合され、直接使用されることはなくなりました。

技術的詳細

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

  1. ファイルのリネーム: src/lib/osディレクトリ内のGoソースファイルが、os_プレフィックスを削除してリネームされました。これは、ファイルシステムレベルでの物理的な変更です。

    • os_env.go -> env.go
    • os_error.go -> error.go
    • os_file.go -> file.go
    • os_time.go -> time.go
    • os_types.go -> types.go この変更は、Go言語のコードベース全体における命名規則の統一と簡潔化を目的としています。
  2. Makefileの更新: ファイル名のリネームに伴い、src/lib/os/Makefileが更新されました。Makefileは、Goパッケージのビルドに必要なソースファイルを指定し、それらをコンパイルしてアーカイブ(.aファイル)にまとめる役割を担っています。

    • gobuildコマンドのコメント行が更新され、新しいファイル名が反映されました。これは、Makefilegobuildによって生成される際のテンプレートまたは指示が変更されたことを示唆しています。
    • O1, O2, O3といった変数(これらはコンパイルされるオブジェクトファイル群を定義していると推測されます)内のファイル名が、os_error.$Oからerror.$Oのように変更されました。ここで$Oはオブジェクトファイルの拡張子(例: .o)を表します。
    • ARコマンド(アーカイブツール)の呼び出しも、新しいオブジェクトファイル名を参照するように更新されました。ARは、コンパイルされたオブジェクトファイルをまとめてライブラリファイル(os.a)を作成するために使用されます。

これらの変更は、Go言語のビルドシステムがファイル名の変更を正しく認識し、osパッケージを問題なくビルドできるようにするために不可欠でした。特に、Makefileの変更は、ビルドの依存関係とコマンドが新しいファイル名に同期されていることを保証します。

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

このコミットにおけるコアとなるコードの変更は、src/lib/os/Makefileの修正と、複数のGoソースファイルのリネームです。

--- a/src/lib/os/Makefile
+++ b/src/lib/os/Makefile
@@ -3,8 +3,8 @@
 # license that can be found in the LICENSE file.
 
 # DO NOT EDIT.  Automatically generated by gobuild.
-# gobuild -m os_env.go os_error.go os_file.go os_test.go os_time.go\\\
-#    os_types.go stat_amd64_linux.go dir_amd64_linux.go >Makefile
+# gobuild -m dir_amd64_linux.go env.go error.go file.go stat_amd64_linux.go\\\
+#    time.go types.go >Makefile
 O=6
 GC=$(O)g
 CC=$(O)c -w
@@ -33,16 +33,16 @@ coverage: packages
 	$(AS) $*.s
 
 O1=\
-\tos_error.$O\\\
-\tos_types.$O\\\
+\terror.$O\\\
+\ttypes.$O\\\
 
 O2=\\
-\tos_env.$O\\\
-\tos_time.$O\\\
+\tenv.$O\\\
 \tstat_$(GOARCH)_$(GOOS).$O\\\
+\ttime.$O\\\
 
 O3=\\
-\tos_file.$O\\\
+\tfile.$O\\\
 
 O4=\\
 \tdir_$(GOARCH)_$(GOOS).$O\\\
@@ -50,15 +50,15 @@ O4=\\
 os.a: a1 a2 a3 a4
 
 a1:	$(O1)
-\t$(AR) grc os.a os_error.$O os_types.$O
+\t$(AR) grc os.a error.$O types.$O
 	rm -f $(O1)
 
 a2:	$(O2)
-\t$(AR) grc os.a os_env.$O os_time.$O stat_$(GOARCH)_$(GOOS).$O
+\t$(AR) grc os.a env.$O stat_$(GOARCH)_$(GOOS).$O time.$O
 	rm -f $(O2)
 
 a3:	$(O3)
-\t$(AR) grc os.a os_file.$O
+\t$(AR) grc os.a file.$O
 	rm -f $(O3)
 
 a4:	$(O4)
diff --git a/src/lib/os/os_env.go b/src/lib/os/env.go
similarity index 100%
rename from src/lib/os/os_env.go
rename to src/lib/os/env.go
diff --git a/src/lib/os/os_error.go b/src/lib/os/error.go
similarity index 100%
rename from src/lib/os/os_error.go
rename to src/lib/os/error.go
diff --git a/src/lib/os/os_file.go b/src/lib/os/file.go
similarity index 100%
rename from src/lib/os/os_file.go
rename to src/lib/os/file.go
diff --git a/src/lib/os/os_time.go b/src/lib/os/time.go
similarity index 100%
rename from src/lib/os/os_time.go
rename to src/lib/os/time.go
diff --git a/src/lib/os/os_types.go b/src/lib/os/types.go
similarity index 100%
rename from src/lib/os/os_types.go
rename to src/lib/os/types.go

コアとなるコードの解説

Makefileの変更

  1. gobuildコマンドのコメント行の更新:

    -# gobuild -m os_env.go os_error.go os_file.go os_test.go os_time.go\\\
    -#    os_types.go stat_amd64_linux.go dir_amd64_linux.go >Makefile
    +# gobuild -m dir_amd64_linux.go env.go error.go file.go stat_amd64_linux.go\\\
    +#    time.go types.go >Makefile
    

    この行は、Makefilegobuildツールによってどのように生成されるかを示すコメントです。gobuild -mオプションは、指定されたGoソースファイルを基にMakefileを生成することを意味します。変更前はos_プレフィックス付きのファイル名がリストされていましたが、変更後はプレフィックスが削除された新しいファイル名がリストされています。これは、ビルドシステムが新しいファイル名を認識し、それらをビルド対象として含めるための指示の更新です。

  2. オブジェクトファイル変数(O1, O2, O3)の更新:

    O1=\
    -\tos_error.$O\\\
    -\tos_types.$O\\\
    +\terror.$O\\\
    +\ttypes.$O\\\
    
    O2=\\
    -\tos_env.$O\\\
    -\tos_time.$O\\\
    +\tenv.$O\\\
    \tstat_$(GOARCH)_$(GOOS).$O\\\
    +\ttime.$O\\\
    
    O3=\\
    -\tos_file.$O\\\
    +\tfile.$O\\\
    

    これらの変数は、Goソースファイルをコンパイルして生成されるオブジェクトファイル(.oファイル)のリストを定義しています。$Oは、コンパイル後のオブジェクトファイルの拡張子を表す変数です。変更前はos_error.$Oのようにos_プレフィックスが含まれていましたが、変更後はerror.$Oのようにプレフィックスが削除されています。これにより、makeコマンドが新しいファイル名に対応するオブジェクトファイルを正しく参照し、ビルドプロセスを進めることができます。

  3. アーカイブコマンド(AR)の更新:

    a1:	$(O1)
    -\t$(AR) grc os.a os_error.$O os_types.$O
    +\t$(AR) grc os.a error.$O types.$O
    	rm -f $(O1)
    
    a2:	$(O2)
    -\t$(AR) grc os.a os_env.$O os_time.$O stat_$(GOARCH)_$(GOOS).$O
    +\t$(AR) grc os.a env.$O stat_$(GOARCH)_$(GOOS).$O time.$O
    	rm -f $(O2)
    
    a3:	$(O3)
    -\t$(AR) grc os.a os_file.$O
    +\t$(AR) grc os.a file.$O
    	rm -f $(O3)
    

    ARコマンドは、コンパイルされたオブジェクトファイルをまとめてos.aという静的ライブラリファイルを作成するために使用されます。grcARコマンドのオプションで、gはシンボルテーブルの作成、rは既存のアーカイブへの追加または置換、cはアーカイブの作成を意味します。ここでも、ARコマンドに渡されるオブジェクトファイル名が、os_プレフィックスのない新しい名前に更新されています。これにより、ビルドされたライブラリが正しく構成されることが保証されます。

ファイルのリネーム

similarity index 100%rename from ... rename to ...の表示は、Gitがこれらのファイルが内容を変更せずに名前だけが変更されたことを認識していることを示しています。これは、単なるファイル名の変更であり、Goソースコード自体の内容は変更されていないことを意味します。

これらの変更は、Go言語の初期のビルドシステムとコードベースの進化を示すものであり、現在のGoのシンプルで一貫した命名規則の基礎を築く一歩となりました。

関連リンク

  • Go言語のosパッケージ公式ドキュメント: https://pkg.go.dev/os
  • Go言語の初期のビルドシステムに関する議論(Goのメーリングリストや初期の設計ドキュメントなど、当時の情報源を探す必要がありますが、現在の公式ドキュメントには直接的な情報はありません。)

参考にした情報源リンク

  • Go言語のosパッケージの現在のドキュメント(Goの命名規則の理解に役立ちます)
  • Gitのdiff --git出力の解釈に関する一般的な情報
  • MakefileARコマンドに関する一般的な情報
  • Go言語の初期の歴史に関する一般的な知識(Rob Pike氏の関与など)