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

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

このコミットは、Go言語の公式ドキュメントの一部である doc/go1.2.html ファイルに対する変更です。このファイルは、Go 1.2リリースにおける主要な変更点、特にgcコンパイラとリンカに関するセマンティックな変更を記述するリリースノートの役割を担っています。

コミット

  • コミットハッシュ: 83da0fd989d7e5c981bde26a8a9cc0d0f88fe9ed
  • Author: Rob Pike r@golang.org
  • Date: Mon Sep 16 13:03:00 2013 +1000

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

https://github.com/golang/go/commit/83da0fd989d7e5c981bde26a8a9cc0d0f88fe9ed

元コミット内容

doc/go1.2.html: compiler changes
Document the semantic changes within the gc toolchain.

Also delete the mention of unbalanced right delims in template
That change was rolled back.

Absent typos, things we've forgotten, and new things that happen,
the release notes are ready.

R=golang-dev, adg, dominik.honnef
CC=golang-dev
https://golang.org/cl/13368052

変更の背景

このコミットの主な目的は、Go 1.2のリリースノートである doc/go1.2.html を更新し、gcツールチェインにおけるセマンティックな変更点を正確に反映させることです。具体的には、以下の2つの主要な背景があります。

  1. gcコンパイラとリンカの変更点の文書化: Go 1.2では、コンパイラとリンカにいくつかの重要な変更が加えられました。これらの変更は、Goプログラムの動作やビルドプロセスに影響を与える可能性があるため、ユーザーが理解できるように公式ドキュメントに詳細を記述する必要がありました。
  2. 以前の変更のロールバックの反映: 以前のコミットで導入された「テンプレートにおける不均衡な右区切り文字の診断」に関する変更がロールバックされました。このロールバックに伴い、リリースノートからその記述を削除し、ドキュメントの正確性を保つ必要がありました。

これらの変更は、Go 1.2のリリースに向けて、ユーザーが新しいバージョンにスムーズに移行できるよう、正確で最新の情報をドキュメントとして提供することを目的としています。

前提知識の解説

このコミットの変更内容を理解するためには、以下のGo言語および関連技術に関する前提知識が必要です。

  • Go言語のツールチェイン (gcツールチェイン):
    • Go言語のプログラムをビルドするために使用される一連のツール群を指します。これには、コンパイラ(gc)、アセンブラ(go tool asm)、リンカ(go tool link)、およびその他のユーティリティが含まれます。
    • gcはGo言語の公式コンパイラであり、Goソースコードを機械語に変換します。
    • リンカは、コンパイルされたオブジェクトファイルとライブラリを結合して実行可能ファイルを生成します。
  • cgo:
    • GoプログラムからC言語のコードを呼び出すためのGoツールです。cgoを使用することで、既存のC/C++ライブラリをGoプロジェクトに統合したり、パフォーマンスが重要な部分をC/C++で記述したりすることが可能になります。
    • cgoは、GoとCの間のデータ変換や関数呼び出しのメカニズムを提供します。
  • ARMアーキテクチャ:
    • Advanced RISC Machinesの略で、モバイルデバイスや組み込みシステムで広く使用されているCPUアーキテクチャです。Go言語はARMを含む複数のアーキテクチャをサポートしています。
  • Goランタイムにおけるmg変数:
    • Goランタイムは、Goプログラムの実行を管理するシステムです。
    • m (machine): OSのスレッドを表します。Goランタイムは、複数のmを管理し、その上でGoルーチンを実行します。
    • g (goroutine): Go言語の軽量な並行処理単位であるGoルーチンを表します。GoルーチンはOSスレッドよりもはるかに軽量で、数百万個を同時に実行できます。
    • これらの変数は、Goランタイムの内部実装で使用され、スケジューラやメモリ管理などの低レベルな操作に関与します。
  • アセンブリ命令 (MOVBS, MOVHS, MOVB, MOVH):
    • これらはアセンブリ言語の命令であり、データをレジスタ間で移動させるために使用されます。
    • MOVB (Move Byte): 1バイトのデータを移動します。
    • MOVH (Move Half-word): 2バイト(ハーフワード)のデータを移動します。
    • MOVBS (Move Byte Signed): 1バイトのデータを符号拡張して移動します。
    • MOVHS (Move Half-word Signed): 2バイトのデータを符号拡張して移動します。
    • これらの命令は、特に異なるサイズのデータを扱う際に、符号の扱い(符号拡張するかどうか)が重要になります。
  • 外部リンキング (External Linking):
    • Goのリンカが、Go以外のリンカ(通常はシステムのCリンカ)を使用して最終的な実行可能ファイルを生成するプロセスです。これは、C/C++ライブラリとのリンクや、共有ライブラリのビルドに必要となる場合があります。
  • 共有ライブラリ (Shared Libraries):
    • 複数のプログラムで共有されるコードとデータを含むライブラリファイルです。これにより、ディスクスペースの節約やメモリ使用量の削減が可能です。
  • 動的リンキング (Dynamic Linking):
    • プログラムの実行時に共有ライブラリをロードし、リンクするプロセスです。これにより、プログラムの起動時間を短縮したり、ライブラリの更新を容易にしたりできます。
  • package:
    • Goソースファイルの先頭に記述されるもので、そのファイルが属するパッケージを指定します。Goプログラムは、mainパッケージのmain関数から実行が開始されます。

これらの概念を理解することで、コミットがGo言語のコンパイラ、ランタイム、およびビルドシステムにどのような影響を与えるかをより深く把握できます。

技術的詳細

このコミットは、Go 1.2のリリースノートである doc/go1.2.html を更新し、gcコンパイラとリンカに関する以下のセマンティックな変更点を記述しています。

  1. cgoにおけるC++コードのサポート:
    • Go 1.2から、cgoコマンドがC++コードを含むライブラリとのリンクをサポートするようになりました。これにより、GoプログラムからC++で書かれた既存のライブラリをより容易に利用できるようになります。以前は、C++コードとの連携にはより複雑な手順が必要でした。
  2. package句の欠落がエラーに:
    • 以前のgcコンパイラは、Goソースファイルにpackage句が欠落している場合、そのファイルを暗黙的にpackage mainに属するとみなしていました。Go 1.2からは、package句の欠落はエラーとして扱われるようになり、明示的なパッケージ宣言が必須となりました。これは、コードの明確性と一貫性を向上させるための変更です。
  3. ARMアーキテクチャにおける外部リンキングのサポート:
    • ARMアーキテクチャ向けに、gcツールチェインが「外部リンキング」をサポートするようになりました。これは、共有ライブラリのビルドや、動的リンキングが必要な環境でのGoプログラムの利用に向けた重要な一歩です。これにより、Goプログラムがシステムレベルのライブラリとより密接に連携できるようになります。
  4. ARMランタイムにおけるmg変数への参照方法の変更:
    • ARMアーキテクチャのランタイムにおいて、以前はR9R10レジスタを直接使用して、ランタイム内部のm(マシン)とg(Goルーチン)変数にアクセスすることが可能でした。Go 1.2からは、これらの変数には適切な名前(シンボル)を使用して参照する必要があり、直接レジスタを参照する方法は廃止されました。これは、ランタイムの内部実装の詳細を隠蔽し、より安定したAPIを提供するための変更です。
  5. ARMリンカにおけるMOVBSMOVHS命令の導入:
    • ARMアーキテクチャの5lリンカ(Goのリンカ)において、MOVBSMOVHS命令が導入されました。これらはそれぞれMOVBMOVHの同義語として定義されていますが、符号付きのサブワード移動をより明確に区別するために導入されました。既存の符号なしバージョンにはUサフィックス(例: MOVBU)が付いていました。これにより、アセンブリコードの可読性と意図が向上します。
  6. テンプレートにおける不均衡な右区切り文字に関する記述の削除:
    • 以前のGoのテンプレートエンジンでは、不均衡な右区切り文字が診断されずに受け入れられていましたが、この変更はロールバックされました。そのため、リリースノートからこの変更に関する記述が削除されました。これは、ドキュメントが現在のGoの動作を正確に反映していることを保証するための修正です。

これらの変更は、Go言語のコンパイラとランタイムの進化、特にクロスプラットフォームサポートと低レベルな最適化に関する継続的な取り組みを反映しています。

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

このコミットは、doc/go1.2.html ファイルのみを変更しています。

--- a/doc/go1.2.html
+++ b/doc/go1.2.html
@@ -180,28 +180,50 @@ support for Go 1.2.
 In the current (4.8.2) release of GCC, gccgo implements Go 1.1.2.
 </p>
 
-<h3 id=\"gc_changes\">TODO</h3>
+<h3 id=\"gc_changes\">Changes to the gc compiler and linker</h3>
 
 <p>
-TODO: write prose
+Go 1.2 has several semantic changes to the workings of the gc compiler suite.
+Most users will be unaffected by them.
 </p>
 
-<ul>
-<li>cmd/5a: removed support for R9/R10 (use m/g instead) (CL 9840043).\n-</li>
+<p>
+The <a href=\"/cmd/cgo/\"><code>cgo</code></a> command now
+works when C++ is included in the library being linked against.\n+See the <a href=\"/cmd/cgo/\"><code>cgo</code></a> documentation\n+for details.\n+</p>
 
-<li>cmd/5l: add MOVBS, MOVHS etc for sub-word moves (CL 12682043).\n-</li>
+<p>
+The gc compiler displayed a vestigial detail of its origins when\n+a program had no <code>package</code> clause: it assumed\n+the file was in package <code>main</code>.\n+The past has been erased, and a missing <code>package</code> clause\n+is now an error.\n+</p>
 
-<li>cmd/5l: support for external linking for linux/arm (CL 12871044).\n-</li>
+<p>
+On the ARM, the toolchain supports \"external linking\", which\n+is a step towards being able to build shared libraries with the gc\n+tool chain and to provide dynamic linking support for environments\n+in which that is necessary.\n+</p>
 
-<li>cmd/cgo, cmd/go: support including C++ code with cgo (CL 8248043).\n-</li>
+<p>
+In the runtime for the ARM, with <code>5a</code>, it used to be possible to refer\n+to the runtime-internal <code>m</code> (machine) and <code>g</code>\n+(goroutine) variables using <code>R9</code> and <code>R10</code> directly.\n+It is now necessary to refer to them by their proper names.\n+</p>
 
-<li>cmd/gc: make missing package error fatal (CL 12677043).\n-</li>
-</ul>
+<p>
+Also on the ARM, the <code>5l</code> linker (sic) now defines the\n+<code>MOVBS</code> and <code>MOVHS</code> instructions\n+as synonyms of <code>MOVB</code> and <code>MOVH</code>,\n+to make clearer the separation between signed and unsigned\n+sub-word moves; the unsigned versions already existed with a\n+<code>U</code> suffix.\n+</p>
 
 <h3 id=\"cover\">Test coverage</h3>
 
@@ -500,21 +522,12 @@ one can fold the second \"if\" into the \"else\" and have only one \"end\", like this:\n The two forms are identical in effect; the difference is just in the syntax.\n </p>\n \n-<p>\n-Finally, the package \n-now correctly diagnoses unmatched right delimiters.\n-They were accepted without complaint before, and templates that had them\n-will now fail to parse.\n-</p>\n-\n <p>\n  <em>Updating</em>: Neither the \"else if\" change nor the comparison functions\n  affect existing programs. Those that\n  already define functions called <code>eq</code> and so on through a function\n  map are unaffected because the associated function map will override the new\n  default function definitions.\n-Templates with unmatched right delimiters will now fail to parse and will need\n-to be fixed by hand.\n </p>\

コアとなるコードの解説

このコミットは、doc/go1.2.html ファイル内のGo 1.2リリースノートの「Changes to the gc compiler and linker」セクションを大幅に更新しています。

主な変更点は以下の通りです。

  1. セクションタイトルの変更と導入文の追加:

    • 以前の「TODO」という仮のタイトルが「Changes to the gc compiler and linker」に置き換えられました。
    • 「Go 1.2 has several semantic changes to the workings of the gc compiler suite. Most users will be unaffected by them.」という導入文が追加され、このセクションがgcツールチェインのセマンティックな変更について説明すること、そしてほとんどのユーザーには影響がないことが示されています。
  2. 箇条書きリストから段落形式への変更と詳細化:

    • 以前の箇条書きリスト(<ul>タグ)で簡潔に記述されていた変更点が削除され、より詳細な説明を含む複数の段落(<p>タグ)に置き換えられました。これにより、各変更点の背景と影響がより明確に伝わるようになりました。
  3. 具体的な変更点の追加と説明:

    • cgoのC++サポート: cgoがC++を含むライブラリとのリンクをサポートするようになったことが明記され、詳細についてはcgoのドキュメントを参照するよう促されています。
    • package句の欠落エラー: package句が欠落している場合にgcコンパイラがエラーを出すようになったことが説明されています。これは、以前の暗黙的なpackage mainの挙動が変更されたことを示しています。
    • ARMにおける外部リンキング: ARMアーキテクチャで外部リンキングがサポートされ、共有ライブラリや動的リンキングへの道が開かれたことが記述されています。
    • ARMランタイムのm/g変数参照: ARMランタイムでR9/R10レジスタによるm/g変数への直接参照が廃止され、適切な名前で参照する必要があることが説明されています。
    • ARMリンカのMOVBS/MOVHS命令: ARMの5lリンカがMOVBSMOVHS命令を導入し、符号付き/符号なしのサブワード移動を明確に区別するようになったことが説明されています。
  4. テンプレートの不均衡な右区切り文字に関する記述の削除:

    • 以前のバージョンで「テンプレートが不均衡な右区切り文字を正しく診断するようになった」という記述が削除されました。これは、この変更がロールバックされたため、ドキュメントから不正確な情報を削除する目的で行われました。

これらの変更は、Go 1.2のリリースにおけるコンパイラとリンカの重要な進化をユーザーに伝えるためのものであり、ドキュメントの正確性、網羅性、および可読性を向上させています。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Go言語のソースコード(特にcmdディレクトリ内のコンパイラとリンカ関連のコード)
  • Go言語のコミット履歴と変更ログ
  • Go言語のIssueトラッカー(関連するバグ修正や機能追加の議論)