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

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

このコミットは、Go言語のランタイム(runtime)パッケージ内のコメントを更新するものです。具体的には、Goのビルドシステムにおけるファイルパスの命名規則の変更に伴い、古くなったコメントを修正しています。これにより、コードの可読性と正確性が向上し、将来のGoランタイムの理解やメンテナンスが容易になります。

コミット

commit e0213576732f5eb408d3301832a296c20176d330
Author: Shenghou Ma <minux.ma@gmail.com>
Date:   Sun Jan 22 10:34:17 2012 -0800

    runtime: update out-of-date comment

    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/5532118

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

https://github.com/golang/go/commit/e0213576732f5eb408d3301832a296c20176d330

元コミット内容

このコミットの元の内容は、Goランタイムのソースコード内にある、ファイルパスに関するコメントが古くなっていたため、それを最新の命名規則に合わせて更新するというものです。特に、アセンブリファイルやCGO(C言語との連携)に関連する部分で、ファイル名のパターンが変更されたことに対応しています。

変更の背景

Go言語の初期開発段階では、ソースコードの構造や命名規則が進化していました。このコミットが行われた2012年頃は、Goのランタイムが様々なアーキテクチャ(ARM, x86, x86-64など)やオペレーティングシステム(Linux, FreeBSD, Darwinなど)に対応するために、コードベースが活発に整理されていた時期です。

以前のGoランタイムでは、特定のアセンブリファイルやシステムコール関連のファイルを参照する際に、../$GOOS/arm/sys.s$GOOS/asm.s のような相対パスやOS名をプレフィックスとする形式がコメント内で使われていた可能性があります。しかし、Goのビルドシステムやランタイムの内部構造の変更に伴い、これらのファイルが sys_$GOOS_arm.sasm_$GOARCH.s のように、より明確で一貫性のある命名規則に移行したと考えられます。

この変更は、コードの機能自体には影響を与えませんが、開発者がGoランタイムの内部を理解する上で非常に重要です。コメントが古いままだと、参照されているファイルが見つからなかったり、誤解を招いたりする可能性があるため、コードのメンテナンス性や新規開発者のオンボーディングを向上させる目的で実施されました。

前提知識の解説

このコミットを理解するためには、以下のGo言語およびシステムプログラミングに関する基本的な知識が必要です。

  • Goランタイム (Go Runtime): Goプログラムが実行される際に、メモリ管理(ガベージコレクション)、ゴルーチン(軽量スレッド)のスケジューリング、チャネル通信、システムコールなど、低レベルな操作を司る部分です。Goランタイムの多くはGo言語で書かれていますが、パフォーマンスが要求される部分やOSとの直接的なインターフェースには、アセンブリ言語やC言語が使用されています。
  • アセンブリ言語 (.s ファイル): Goランタイムには、特定のCPUアーキテクチャ(例: ARM, x86)に特化したアセンブリ言語で書かれたファイルが含まれています。これらは、コンテキストスイッチ、システムコール、アトミック操作など、Go言語だけでは実現が難しい、あるいは効率が悪い処理を直接ハードウェアに指示するために使われます。ファイル拡張子 .s はアセンブリソースコードを示します。
  • CGO: Go言語からC言語のコードを呼び出すためのメカニズムです。Goプログラムが既存のCライブラリを利用したり、OSの低レベルAPIにアクセスしたりする際に使用されます。CGOを介した呼び出しは、GoのランタイムとCのランタイムの間でスタックの切り替えなど、複雑な処理を伴います。
  • $GOOS$GOARCH: Goのビルドシステムで使用される環境変数です。
    • $GOOS (Go Operating System): ビルドターゲットのオペレーティングシステムを示します(例: linux, darwin (macOS), windows, freebsd)。
    • $GOARCH (Go Architecture): ビルドターゲットのCPUアーキテクチャを示します(例: amd64, 386, arm)。 Goのソースコードでは、これらの変数を使って、特定のOSやアーキテクチャに依存するコードパスを条件付きでコンパイルしたり、対応するアセンブリファイルやCファイルを参照したりします。
  • ファイル命名規則の進化: ソフトウェアプロジェクト、特に低レベルなシステムコードでは、時間の経過とともにファイルやディレクトリの命名規則が改善されることがあります。これは、コードベースの規模が拡大したり、新しいプラットフォームがサポートされたりする際に、一貫性や明確性を保つために行われます。このコミットは、まさにそのような命名規則の進化の一環として行われたものです。

技術的詳細

このコミットの技術的詳細は、Goランタイムがどのように異なるOSやアーキテクチャに対応しているか、そしてCGOがどのように機能するかという点に集約されます。

Goランタイムは、クロスプラットフォーム対応のために、OSやアーキテクチャ固有のコードを分離して管理しています。これは、ファイル名に $GOOS$GOARCH を含めることで実現されます。例えば、sys_linux_amd64.s はLinux x86-64用のアセンブリファイルであることを示します。

このコミット以前は、コメント内でこれらのファイルを指す際に、より一般的なパターン(例: $GOOS/asm.s)や相対パス(例: ../$GOOS/arm/sys.s)が使われていたようです。しかし、Goのビルドシステムが成熟し、ファイル配置の標準化が進むにつれて、これらのファイルは asm_$GOARCH.ssys_$GOOS_$GOARCH.s のような、より具体的な命名規則に統一されました。

cgocall.c における変更の背景: cgocall.c は、GoとCの間の呼び出し(CGO)を管理するGoランタイムのCソースファイルです。GoからC関数を呼び出す際、Goのゴルーチンのスタックから、OSが割り当てたCのスタック(m->g0 スタック)に切り替える必要があります。この切り替えは、アセンブリ言語で書かれた runtime.asmcgocall 関数によって行われます。同様に、CからGo関数を呼び出すコールバックの場合、runtime.cgocallback 関数が m->g0 スタックから元のゴルーチンのスタックに切り替えます。

以前のコメントでは、これらのアセンブリ関数が $GOARCH/asm.s のようなパスにあると記述されていましたが、実際のファイル名が asm_$GOARCH.s のように変更されたため、コメントもそれに合わせて更新されました。これは、Goのビルドシステムが、特定のアーキテクチャのアセンブリファイルを asm_amd64.sasm_arm.s のように直接参照するようになったことを反映しています。

sys_freebsd_386.s および thread_darwin.c における変更の背景: これらのファイルも同様に、特定のOSやアーキテクチャに特化したシステムコールやスレッド管理に関連するコードを含んでいます。コメント内のファイル参照が、より具体的な sys_linux_386.ssys_darwin_{amd64,386}.s のような命名規則に更新されたのは、Goランタイムが各プラットフォームのアセンブリファイルをより明確に区別するようになったためです。

この変更は、Goランタイムの内部構造を理解しようとする開発者にとって、非常に役立ちます。正確なコメントは、コードの意図を明確にし、関連するファイルを見つけやすくするため、デバッグや機能追加の際に時間の節約につながります。

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

このコミットでは、以下の4つのファイルでコメントが変更されています。

  1. src/pkg/runtime/asm_arm.s

    --- a/src/pkg/runtime/asm_arm.s
    +++ b/src/pkg/runtime/asm_arm.s
    @@ -277,7 +277,7 @@ TEXT runtime·abort(SB),7,$-4
     //	}else
     //		return 0;
     //
    -// To implement runtime·cas in ../$GOOS/arm/sys.s
    +// To implement runtime·cas in sys_$GOOS_arm.s
     // using the native instructions, use:
     //
     //	TEXT runtime·cas(SB),7,$0
    
  2. src/pkg/runtime/cgocall.c

    --- a/src/pkg/runtime/cgocall.c
    +++ b/src/pkg/runtime/cgocall.c
    @@ -17,7 +17,7 @@
     // so as not to block other goroutines or the garbage collector,
     // and then calls runtime.asmcgocall(_cgo_Cfunc_f, frame).
     //
    -// runtime.asmcgocall (in $GOARCH/asm.s) switches to the m->g0 stack
    +// runtime.asmcgocall (in asm_$GOARCH.s) switches to the m->g0 stack
     // (assumed to be an operating system-allocated stack, so safe to run
     // gcc-compiled code on) and calls _cgo_Cfunc_f(frame).
     //
    @@ -55,7 +55,7 @@
     // with 6c instead of gcc, can refer to dotted names like
     // runtime.cgocallback and p.GoF.)
     //
    -// runtime.cgocallback (in $GOOS/asm.s) switches from m->g0's
    +// runtime.cgocallback (in asm_$GOARCH.s) switches from m->g0's
     // stack to the original g (m->curg)'s stack, on which it calls
     // runtime.cgocallbackg(p.GoF, frame, framesize).
     // As part of the stack switch, runtime.cgocallback saves the current
    
  3. src/pkg/runtime/sys_freebsd_386.s

    --- a/src/pkg/runtime/sys_freebsd_386.s
    +++ b/src/pkg/runtime/sys_freebsd_386.s
    @@ -238,7 +238,7 @@ int i386_set_ldt(int, const union ldt_entry *, int);\n // setldt(int entry, int address, int limit)\n TEXT runtime·setldt(SB),7,$32\n 	MOVL	address+4(FP), BX	// aka base\n-\t// see comment in linux/386/sys.s; freebsd is similar\n+\t// see comment in sys_linux_386.s; freebsd is similar\n \tADDL\t$0x8, BX\n \n \t// set up data_desc
    
  4. src/pkg/runtime/thread_darwin.c

    --- a/src/pkg/runtime/thread_darwin.c
    +++ b/src/pkg/runtime/thread_darwin.c
    @@ -39,7 +39,7 @@ runtime·semacreate(void)\n void\n runtime·osinit(void)\n {\n-\t// Register our thread-creation callback (see {amd64,386}/sys.s)\n+\t// Register our thread-creation callback (see sys_darwin_{amd64,386}.s)\n \t// but only if we're not using cgo.  If we are using cgo we need\n \t// to let the C pthread libary install its own thread-creation callback.\n \tif(!runtime·iscgo)\n@@ -338,7 +338,7 @@ runtime·mach_semdestroy(uint32 sem)\n \t}\n }\n \n-// The other calls have simple system call traps in sys.s\n+// The other calls have simple system call traps in sys_darwin_{amd64,386}.s\n int32 runtime·mach_semaphore_wait(uint32 sema);\n int32 runtime·mach_semaphore_timedwait(uint32 sema, uint32 sema, uint32 nsec);\n int32 runtime·mach_semaphore_signal(uint32 sema);\n    ```
    
    

コアとなるコードの解説

各ファイルの変更は、コメント内のファイルパスの記述を、Goランタイムの実際のファイル命名規則に合わせて修正するものです。

  1. src/pkg/runtime/asm_arm.s:

    • 変更前: // To implement runtime·cas in ../$GOOS/arm/sys.s
    • 変更後: // To implement runtime·cas in sys_$GOOS_arm.s
    • 解説: runtime·cas (Compare And Swap) はアトミック操作を行うためのアセンブリ関数です。以前のコメントでは、この関数が ../$GOOS/arm/sys.s という相対パスにあると示されていましたが、これはGoのビルドシステムにおけるアセンブリファイルの配置規則の変更により古くなりました。新しいコメント sys_$GOOS_arm.s は、Goが特定のOS ($GOOS) とアーキテクチャ (arm) に対応するシステム固有のアセンブリファイルを sys_linux_arm.ssys_darwin_arm.s のように命名していることを正確に反映しています。
  2. src/pkg/runtime/cgocall.c:

    • 変更前 (1): // runtime.asmcgocall (in $GOARCH/asm.s) switches to the m->g0 stack
    • 変更後 (1): // runtime.asmcgocall (in asm_$GOARCH.s) switches to the m->g0 stack
    • 変更前 (2): // runtime.cgocallback (in $GOOS/asm.s) switches from m->g0's
    • 変更後 (2): // runtime.cgocallback (in asm_$GOARCH.s) switches from m->g0's
    • 解説: runtime.asmcgocallruntime.cgocallback は、CGO呼び出し時にGoとCのスタックを切り替えるための重要なアセンブリ関数です。以前のコメントでは、これらの関数が $GOARCH/asm.s$GOOS/asm.s のようなパスにあるとされていましたが、Goのビルドシステムでは、アーキテクチャ固有のアセンブリファイルが asm_amd64.sasm_arm.s のように asm_ プレフィックスと $GOARCH サフィックスで命名されるようになりました。この変更は、実際のファイル名とコメントの整合性を保ち、開発者が正しいアセンブリファイルを見つけやすくします。
  3. src/pkg/runtime/sys_freebsd_386.s:

    • 変更前: // see comment in linux/386/sys.s; freebsd is similar
    • 変更後: // see comment in sys_linux_386.s; freebsd is similar
    • 解説: runtime·setldt は、FreeBSD/386環境でLocal Descriptor Table (LDT) を設定するためのアセンブリ関数です。このコメントは、Linux/386版の同様のコードを参照するように促しています。以前の linux/386/sys.s というパスは、Goのファイル命名規則の変更により sys_linux_386.s に変わりました。この修正により、参照先のファイルパスが正確になり、開発者が関連するコードを容易に特定できるようになります。
  4. src/pkg/runtime/thread_darwin.c:

    • 変更前 (1): // Register our thread-creation callback (see {amd64,386}/sys.s)
    • 変更後 (1): // Register our thread-creation callback (see sys_darwin_{amd64,386}.s)
    • 変更前 (2): // The other calls have simple system call traps in sys.s
    • 変更後 (2): // The other calls have simple system call traps in sys_darwin_{amd64,386}.s
    • 解説: thread_darwin.c はmacOS (Darwin) 環境でのスレッド管理に関連するCソースファイルです。ここでは、スレッド作成コールバックの登録や、その他のシステムコールトラップがアセンブリファイルで実装されていることがコメントされています。以前のコメントでは、これらのアセンブリファイルが {amd64,386}/sys.ssys.s のように記述されていましたが、Goの命名規則では sys_darwin_amd64.ssys_darwin_386.s のように、OSとアーキテクチャを明示する形式が採用されています。この修正により、コメントが実際のファイル名と一致し、macOS環境での低レベルなスレッド操作やシステムコール実装を理解する上で正確な情報が提供されます。

これらの変更はすべて、Goランタイムのソースコード内のコメントを、実際のファイルパスや命名規則に合わせて更新するという、保守的ながらも重要な改善です。これにより、コードの正確性、可読性、そして将来のメンテナンス性が向上します。

関連リンク

参考にした情報源リンク

  • Go言語のソースコード (特に src/runtime ディレクトリ内のファイル構造と命名規則)
  • Go言語の公式ドキュメントおよびブログ記事 (CGO, ビルドシステムに関する情報)
  • Gitのコミット履歴と差分表示 (変更内容の確認)
  • 一般的なシステムプログラミングとアセンブリ言語の知識