[インデックス 12674] ファイルの概要
このコミットは、Go言語の公式FAQドキュメントである doc/go_faq.html
に対するマイナーな更新です。このファイルは、Go言語に関するよくある質問とその回答をまとめたもので、Goの設計思想、実装の詳細、利用方法など、多岐にわたる情報を提供しています。
コミット
- コミットハッシュ:
c3eaef71ab3039921f4cf28bd4abd22aae002922
- 作者: Shenghou Ma minux.ma@gmail.com
- コミット日時: 2012年3月17日 土曜日 15:53:40 +0800
- コミットメッセージ:
doc/go_faq: minor update R=adg, r CC=golang-dev https://golang.org/cl/5849052
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c3eaef71ab3039921f4cf28bd4abd22aae002922
元コミット内容
doc/go_faq: minor update
R=adg, r
CC=golang-dev
https://golang.org/cl/5849052
変更の背景
このコミットは、Go言語のFAQドキュメントの正確性と明確性を向上させるためのマイナーな更新です。具体的には、Goコンパイラが生成するバイナリ形式に関する記述を最新の情報に合わせ、また、Goの標準パッケージへの参照方法をより簡潔で一般的な形式に修正しています。
当時のGo言語はまだ比較的新しく、開発が活発に行われていました。そのため、コンパイラの機能拡張(特にサポートするプラットフォームの拡大)や、ドキュメントにおける表現の洗練が頻繁に行われていた時期と考えられます。この変更は、Goコンパイラが単一のOS向けバイナリだけでなく、複数の主要OS向けのバイナリを生成できるようになったことを反映し、ユーザーに正確な情報を提供することを目的としています。また、パッケージ参照の変更は、ドキュメントの一貫性と可読性を高めるための一般的な改善と見られます。
前提知識の解説
Go言語 (Golang)
Goは、Googleによって開発されたオープンソースのプログラミング言語です。静的型付け、コンパイル型言語でありながら、動的型付け言語のような開発のしやすさを目指しています。並行処理を強力にサポートするgoroutineとchannel、高速なコンパイル、シンプルな構文、強力な標準ライブラリが特徴です。システムプログラミング、Webサービス、ネットワークプログラミングなどで広く利用されています。
Goコンパイラ (gc)
gc
は、Go言語の公式かつ主要なコンパイラツールチェーンです。Go言語のソースコードを機械語のバイナリに変換します。gc
は、Plan 9オペレーティングシステムのCコンパイラツールチェーンにルーツを持ち、その設計思想や一部の技術的要素を受け継いでいます。gc
は、Go言語のランタイムと密接に連携し、ガーベージコレクションやスケジューリングなどの機能を提供します。
Plan 9
Plan 9 from Bell Labsは、ベル研究所で開発された分散オペレーティングシステムです。Unixの後継として設計され、ネットワーク透過性、ファイルシステム中心の設計、UTF-8の採用など、多くの革新的なアイデアを導入しました。Go言語のツールチェーン(特にコンパイラ gc
)は、Plan 9のCコンパイラツールチェーンから大きな影響を受けており、その一部の技術や設計パターンがGoのツールに引き継がれています。
ELF (Executable and Linkable Format)
ELFは、Unix系オペレーティングシステム(Linux、BSDなど)で広く使用されている実行可能ファイル、オブジェクトファイル、共有ライブラリの標準ファイル形式です。プログラムのコード、データ、シンボル情報などが構造化されて格納されており、OSがプログラムをメモリにロードして実行するために必要な情報を含んでいます。
Mach-O (Mach Object)
Mach-Oは、AppleのmacOS(旧OS X)およびiOSで使用されている実行可能ファイル、オブジェクトファイル、共有ライブラリのファイル形式です。Machカーネルをベースとしたシステムで利用され、ELFと同様にプログラムの実行に必要な情報を含みますが、その内部構造はELFとは異なります。
PE (Portable Executable)
PEは、Microsoft Windowsオペレーティングシステムで使用されている実行可能ファイル、オブジェクトファイル、DLL(Dynamic Link Library)のファイル形式です。Windows NT系OSで導入され、プログラムのコード、データ、リソース、インポート/エクスポート情報などが格納されています。
Goパッケージ参照 (/pkg/go
と go
パッケージ)
Go言語では、コードは「パッケージ」という単位で管理されます。標準ライブラリのパッケージは、通常、fmt
や net/http
のように、そのパッケージ名で参照されます。初期のドキュメントやコードベースでは、特定のパッケージがファイルシステム上のパス(例: /pkg/go
)で言及されることがありましたが、より一般的な慣習としては、単にパッケージ名(例: go
パッケージ)で参照されます。この変更は、ドキュメントの記述をよりGo言語の慣習に合わせるためのものです。
技術的詳細
このコミットの技術的詳細は、Goコンパイラ gc
のバイナリ生成能力と、Go言語のドキュメンテーションの進化に焦点を当てています。
-
バイナリ生成の多様性: Goコンパイラ
gc
は、そのルーツであるPlan 9のCコンパイラツールチェーンのローダーのバリアントを使用しています。このローダーは、当初は主にUnix系システムで一般的なELFバイナリを生成すると説明されていました。しかし、Go言語がクロスプラットフォーム開発を強く志向する中で、macOS向けのMach-O形式やWindows向けのPE形式のバイナリも生成できるようになりました。この変更は、gc
が単一のプラットフォームに限定されず、主要なデスクトップOSすべてに対応する実行ファイルを生成できるという、Go言語の重要な特徴をFAQで明確に伝えるものです。これは、Goがシステムプログラミング言語として幅広い環境で利用される基盤を示しています。 -
ドキュメントにおけるパッケージ参照の標準化: Go言語の標準ライブラリには、字句解析器(lexer)や構文解析器(parser)など、コンパイラの実装に役立つツールが含まれています。これらは
go
パッケージ(具体的にはgo/scanner
やgo/parser
など)として提供されています。変更前のFAQでは、これらのツールが/pkg/go
というパスで参照されていました。これは、Goのソースコードリポジトリ内の物理的なパスを指している可能性があります。しかし、Goのパッケージは通常、インポートパス(例:import "go/parser"
)で参照されるため、ドキュメントにおいてもより抽象的で一般的な「go
パッケージ」という表現に修正されました。これは、ユーザーがGoのパッケージを理解し、利用する際の一般的な慣習に合わせた、ドキュメントの品質向上の一環です。
これらの変更は、Go言語が初期段階からクロスプラットフォーム対応を重視し、そのドキュメントも常に正確で分かりやすいものにしようと努力していたことを示しています。
コアとなるコードの変更箇所
--- a/doc/go_faq.html
+++ b/doc/go_faq.html
@@ -1317,7 +1317,7 @@ standard GCC back end. <code>Gc</code> is written in C using
<code>yacc</code>/<code>bison</code> for the parser.\n Although it\'s a new program, it fits in the Plan 9 C compiler suite\n (<a href=\"http://plan9.bell-labs.com/sys/doc/compiler.html\">http://plan9.bell-labs.com/sys/doc/compiler.html</a>)\n-and uses a variant of the Plan 9 loader to generate ELF binaries.\n+and uses a variant of the Plan 9 loader to generate ELF/Mach-O/PE binaries.\n </p>\n \n <p>\n@@ -1327,7 +1327,7 @@ especially of open source distribution—you\'d need a Go compiler to\n set up a Go environment. <code>Gccgo</code>, which came later, makes it possible to\n consider writing a compiler in Go, which might well happen. (Go would be a\n fine language in which to implement a compiler; a native lexer and\n-parser are already available in <a href=\"/pkg/go/\"><code>/pkg/go</code></a>.)\n+parser are already available in the <a href=\"/pkg/go/\"><code>go</code></a> package.)\n </p>\n \n <p>\n```
## コアとなるコードの解説
このコミットでは、`doc/go_faq.html` ファイル内の2箇所が変更されています。
1. **バイナリ形式に関する記述の更新**:
- **変更前**: `and uses a variant of the Plan 9 loader to generate ELF binaries.`
- **変更後**: `and uses a variant of the Plan 9 loader to generate ELF/Mach-O/PE binaries.`
- この変更は、Goコンパイラ `gc` が生成できるバイナリ形式の範囲を拡張したことを反映しています。以前は主にUnix系システムで使われるELF形式のバイナリを生成すると記述されていましたが、GoがmacOS (Mach-O) やWindows (PE) もサポートするようになったため、それらの形式も明記されました。これにより、Goのクロスプラットフォーム対応能力がFAQで正確に伝えられるようになりました。
2. **Goパッケージ参照の修正**:
- **変更前**: `parser are already available in <a href="/pkg/go/"><code>/pkg/go</code></a>.)`
- **変更後**: `parser are already available in the <a href="/pkg/go/"><code>go</code></a> package.)`
- この変更は、Goの標準ライブラリに含まれる字句解析器や構文解析器が利用可能であるという記述において、その参照方法を修正しています。変更前は `/pkg/go` という、おそらくファイルシステム上のパスを思わせる記述でしたが、変更後は `go` パッケージという、より一般的なGo言語のパッケージ参照の慣習に合わせた表現になっています。`<a href="/pkg/go/">` のリンク自体は変わっていませんが、表示されるテキストがより自然な表現になりました。これはドキュメントの可読性と一貫性を向上させるための細かな修正です。
これらの変更は、Go言語の進化と、それに伴うドキュメントの継続的なメンテナンスの重要性を示しています。
## 関連リンク
- **Gerrit Change-ID**: [https://golang.org/cl/5849052](https://golang.org/cl/5849052) (GoプロジェクトのコードレビューシステムであるGerrit上の変更リストへのリンク)
- **Plan 9 C compiler suite**: [http://plan9.bell-labs.com/sys/doc/compiler.html](http://plan9.bell-labs.com/sys/doc/compiler.html) (Plan 9のCコンパイラに関するドキュメント)
## 参考にした情報源リンク
- **Go言語公式サイト**: [https://golang.org/](https://golang.org/)
- **ELF (Executable and Linkable Format) - Wikipedia**: [https://ja.wikipedia.org/wiki/Executable_and_Linkable_Format](https://ja.wikipedia.org/wiki/Executable_and_Linkable_Format)
- **Mach-O - Wikipedia**: [https://ja.wikipedia.org/wiki/Mach-O](https://ja.wikipedia.org/wiki/Mach-O)
- **Portable Executable - Wikipedia**: [https://ja.wikipedia.org/wiki/Portable_Executable](https://ja.wikipedia.org/wiki/Portable_Executable)
- **Go言語のコンパイラとツールチェーンについて**: (一般的なGoのコンパイラに関する情報源、例: 公式ブログ、技術記事など)
- **Go言語のパッケージ管理**: (一般的なGoのパッケージに関する情報源、例: 公式ドキュメント、チュートリアルなど)