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

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

このコミットは、Go言語の次期リリースで導入される予定のAPI変更を記録する api/next.txt ファイルを更新するものです。api/next.txt は、GoのAPI互換性ポリシーにおいて重要な役割を果たすファイルであり、将来のリリースで公開される予定の新しい関数、型、定数などがリストアップされます。これにより、開発者はGoのAPIがどのように進化していくかを事前に把握し、互換性の問題が発生しないように準備することができます。

コミット

commit 39613054af49086b96b2e0a059a300b2430c3185
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date:   Fri Jun 14 10:00:07 2013 -0700

    api: update next.txt
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/10283043

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

https://github.com/golang/go/commit/39613054af49086b96b2e0a059a300b2430c3185

元コミット内容

このコミットの元々の内容は、api/next.txt ファイルに以下のAPI要素を追加することです。

  • pkg crypto/tls:
    • 定数: VersionSSL30, VersionTLS10, VersionTLS11
    • Config 構造体へのフィールド追加: MaxVersion uint16, MinVersion uint16
  • pkg go/ast:
    • TypeAssertExpr 構造体へのフィールド追加: Lparen token.Pos, Rparen token.Pos
  • pkg syscall:
    • 様々なOS (darwin, freebsd, linux, netbsd, openbsd, windows) およびアーキテクチャ (386, amd64, arm, cgo variants) における定数 PRIO_PGRP, PRIO_PROCESS, PRIO_USER の追加。
    • Getpriority および Setpriority 関数の追加 (主にLinux向け)。
    • Windows向けの定数 ERROR_HANDLE_EOF Errno および PROCESS_TERMINATE の追加。

変更の背景

このコミットは、Go言語の標準ライブラリに新しい機能や改善が追加される際に、そのAPIが公開されることを記録するために行われました。特に、以下の背景が考えられます。

  • crypto/tls のバージョン管理強化: TLS (Transport Layer Security) プロトコルは、インターネット上での安全な通信を確立するために不可欠です。時間の経過とともに、古いバージョンのTLS/SSLにはセキュリティ上の脆弱性が発見されることがあります。MinVersionMaxVersion フィールドの追加は、アプリケーションが使用するTLSプロトコルの最小バージョンと最大バージョンを明示的に設定できるようにすることで、セキュリティを強化し、古い脆弱なプロトコルバージョンの使用を防止することを目的としています。これにより、開発者はより安全な通信設定を強制できるようになります。VersionSSL30, VersionTLS10, VersionTLS11 といった定数は、これらのバージョンを明確に指定するためのものです。
  • go/ast の構文木表現の改善: go/ast パッケージはGoのソースコードを抽象構文木 (AST) として表現するためのツールを提供します。TypeAssertExpr は型アサーション (x.(T)) を表すASTノードです。LparenRparen フィールドの追加は、型アサーションの括弧 () の位置情報をASTノードに含めることで、ツールがより正確なソースコードの再構築や分析を行えるようにすることを目的としています。これは、Goのツールチェイン(例えば、go fmt やリンターなど)の精度向上に寄与します。
  • syscall パッケージの機能拡張とOS互換性向上: syscall パッケージは、Goプログラムが基盤となるオペレーティングシステムのシステムコールに直接アクセスするためのインターフェースを提供します。
    • PRIO_PGRP, PRIO_PROCESS, PRIO_USER 定数と Getpriority, Setpriority 関数の追加は、プロセス、プロセスグループ、またはユーザーのスケジューリング優先度を操作するための機能を提供します。これは、システムリソースの管理や、特定のプロセスのパフォーマンス特性を調整する際に重要です。これらの機能は、Unix系システムで一般的に利用される getpriority(2) および setpriority(2) システムコールに対応します。
    • Windows固有の定数 ERROR_HANDLE_EOFPROCESS_TERMINATE の追加は、Windows環境でのシステムコール操作の網羅性を高めるものです。ERROR_HANDLE_EOF はファイル終端に達した際のエラーコードであり、PROCESS_TERMINATE はプロセスを終了させるためのアクセス権限を示す定数です。これにより、GoプログラムがWindowsシステムとより深く連携できるようになります。

これらの変更は、Go言語がより多様なユースケースに対応し、より堅牢でセキュアなアプリケーションを構築するための基盤を強化する一環として行われました。

前提知識の解説

このコミットを理解するためには、以下の概念について基本的な知識が必要です。

  • Go言語のAPI互換性ポリシー: Go言語は、後方互換性を非常に重視しています。一度公開されたAPIは、特別な理由がない限り変更または削除されません。api/next.txt ファイルは、このポリシーを維持するためのメカニズムの一部です。新しいAPI要素が追加される前に、このファイルにリストアップされ、レビュープロセスを経て承認されます。これにより、Goの将来のバージョンでどのようなAPIが利用可能になるかをコミュニティが事前に把握できます。
  • api/next.txt: Goの標準ライブラリに追加される新しい公開API(関数、型、メソッド、定数など)を記録するためのテキストファイルです。このファイルに記載されたAPIは、次のメジャーリリースで正式に公開される予定であることを示します。Goのツールチェインは、このファイルを使用してAPIの変更を追跡し、互換性違反を検出します。
  • TLS/SSL (Transport Layer Security/Secure Sockets Layer): インターネット上で安全な通信を行うための暗号化プロトコルです。クライアントとサーバー間の通信を暗号化し、データの盗聴、改ざん、なりすましを防ぎます。TLSには複数のバージョン(SSL 3.0, TLS 1.0, TLS 1.1, TLS 1.2, TLS 1.3など)があり、新しいバージョンほどセキュリティが強化されています。
  • 抽象構文木 (AST: Abstract Syntax Tree): プログラミング言語のソースコードを、その構文構造を反映した木構造で表現したものです。コンパイラやリンター、コードフォーマッターなどのツールは、ソースコードをASTに変換して解析や変換を行います。go/ast パッケージは、Go言語のソースコードのASTを扱うための標準ライブラリです。
  • 型アサーション (Type Assertion): Go言語において、インターフェース型の値が特定の具象型であるかどうかをチェックし、もしそうであればその具象型の値として取り出すための構文です。例えば、v, ok := i.(T) のように記述します。
  • システムコール (System Call): オペレーティングシステム (OS) のカーネルが提供するサービスを、ユーザー空間のプログラムが利用するためのインターフェースです。ファイル操作、プロセス管理、ネットワーク通信など、OSの機能にアクセスするために使用されます。syscall パッケージは、Goプログラムからこれらのシステムコールを呼び出すための機能を提供します。
  • プロセスの優先度: オペレーティングシステムが複数のプロセス間でCPU時間などのリソースをどのように割り当てるかを決定するための指標です。優先度が高いプロセスは、より多くのCPU時間を割り当てられる傾向があります。Unix系システムでは、nice 値や priority 値によってプロセスの優先度を調整できます。

技術的詳細

crypto/tls パッケージの変更

crypto/tls パッケージは、GoにおけるTLSクライアントおよびサーバーの実装を提供します。このコミットで追加された要素は、TLSプロトコルバージョンの制御と指定に関するものです。

  • const VersionSSL30 ideal-int: SSL 3.0プロトコルバージョンを表す定数です。SSL 3.0は現在ではセキュリティ上の脆弱性が指摘されており、非推奨とされていますが、互換性のために存在します。ideal-int は、Goの型なし整数定数を示します。
  • const VersionTLS10 ideal-int: TLS 1.0プロトコルバージョンを表す定数です。
  • const VersionTLS11 ideal-int: TLS 1.1プロトコルバージョンを表す定数です。
  • type Config struct, MaxVersion uint16: Config 構造体はTLS接続の設定を保持します。MaxVersion フィールドは、TLSハンドシェイク中にネゴシエートされるTLSプロトコルの最大バージョンを指定します。これにより、新しいがまだ広くサポートされていないプロトコルバージョンへの依存を避けることができます。
  • type Config struct, MinVersion uint16: Config 構造体の MinVersion フィールドは、TLSハンドシェイク中にネゴシエートされるTLSプロトコルの最小バージョンを指定します。これは、古い、セキュリティ的に脆弱なプロトコルバージョン(例: SSL 3.0やTLS 1.0)の使用を禁止するために非常に重要です。

これらのフィールドと定数を使用することで、開発者はTLSクライアントおよびサーバーが使用するプロトコルバージョンを細かく制御し、セキュリティ要件や互換性要件に合わせて調整できるようになります。

go/ast パッケージの変更

go/ast パッケージは、Goのソースコードの抽象構文木 (AST) を表現します。

  • type TypeAssertExpr struct, Lparen token.Pos: TypeAssertExpr 構造体は、Goの型アサーション式(例: x.(T))をASTで表現します。Lparen フィールドは、型アサーションの左括弧 ( のソースコード上の位置 (token.Pos) を記録します。
  • type TypeAssertExpr struct, Rparen token.Pos: 同様に、Rparen フィールドは、型アサーションの右括弧 ) のソースコード上の位置を記録します。

これらの位置情報がASTノードに含まれることで、Goのツール(例えば、go fmt や静的解析ツール)は、ソースコードの正確な位置に基づいて操作を行ったり、より詳細なエラー報告を提供したりすることが可能になります。これは、Goのツールチェインの堅牢性と精度を向上させるための重要な改善です。

syscall パッケージの変更

syscall パッケージは、GoプログラムがOSのシステムコールにアクセスするためのインターフェースを提供します。このコミットでは、主にプロセスの優先度管理とWindows固有の定数が追加されています。

  • プロセスの優先度関連定数:
    • PRIO_PGRP ideal-int: プロセスグループの優先度を操作するための定数。
    • PRIO_PROCESS ideal-int: 個々のプロセスの優先度を操作するための定数。
    • PRIO_USER ideal-int: 特定のユーザーIDに属するすべてのプロセスの優先度を操作するための定数。 これらの定数は、Unix系システムにおける getpriority(2) および setpriority(2) システムコールで使用される which 引数に対応します。
  • func Getpriority(int, int) (int, error): 指定された which (プロセス、プロセスグループ、またはユーザー) と who (ID) に基づいて、プロセスのスケジューリング優先度を取得する関数です。Unix系システムの getpriority(2) システムコールをラップします。
  • func Setpriority(int, int, int) error: 指定された whichwho、および prio (新しい優先度値) に基づいて、プロセスのスケジューリング優先度を設定する関数です。Unix系システムの setpriority(2) システムコールをラップします。
  • Windows固有の定数:
    • ERROR_HANDLE_EOF Errno: Windows APIでファイル終端に達したことを示すエラーコードです。Errno 型は、システムコールによって返されるエラー番号を表します。
    • PROCESS_TERMINATE ideal-int: Windowsの OpenProcess 関数などで使用されるアクセス権限フラグの一つで、プロセスを終了させる権限を示します。

これらの syscall パッケージへの追加は、Goプログラムが様々なOS環境でより低レベルのシステム機能にアクセスし、より高度なシステム管理タスクを実行できるようにするためのものです。特に、プロセスの優先度管理は、リソースの競合を解決したり、リアルタイムに近い処理を実現したりする際に役立ちます。

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

このコミットのコアとなる変更は、api/next.txt ファイルへの追記です。具体的な変更箇所は以下の通りです。

--- a/api/next.txt
+++ b/api/next.txt
@@ -5,6 +5,13 @@ pkg crypto/rsa, func VerifyPSS(*PublicKey, crypto.Hash, []uint8, []uint8, *PSSOp
 pkg crypto/rsa, type PSSOptions struct
 pkg crypto/rsa, type PSSOptions struct, SaltLength int
 pkg crypto/subtle, func ConstantTimeLessOrEq(int, int) int
+pkg crypto/tls, const VersionSSL30 ideal-int
+pkg crypto/tls, const VersionTLS10 ideal-int
+pkg crypto/tls, const VersionTLS11 ideal-int
+pkg crypto/tls, type Config struct, MaxVersion uint16
+pkg crypto/tls, type Config struct, MinVersion uint16
+pkg go/ast, type TypeAssertExpr struct, Lparen token.Pos
+pkg go/ast, type TypeAssertExpr struct, Rparen token.Pos
 pkg go/build, type Package struct, CXXFiles []string
 pkg go/build, type Package struct, CgoCPPFLAGS []string
 pkg go/build, type Package struct, CgoCXXFLAGS []string
@@ -654,6 +661,9 @@ pkg log/syslog (openbsd-amd64-cgo), method (*Writer) Write([]uint8) (int, error)\n pkg log/syslog (openbsd-amd64-cgo), type Priority int\n pkg log/syslog (openbsd-amd64-cgo), type Writer struct\n pkg syscall (darwin-386), const ICMP6_FILTER ideal-int
+pkg syscall (darwin-386), const PRIO_PGRP ideal-int
+pkg syscall (darwin-386), const PRIO_PROCESS ideal-int
+pkg syscall (darwin-386), const PRIO_USER ideal-int
 pkg syscall (darwin-386), const SizeofICMPv6Filter ideal-int
 pkg syscall (darwin-386), const SizeofIPv6MTUInfo ideal-int
 pkg syscall (darwin-386), func GetsockoptICMPv6Filter(int, int, int) (*ICMPv6Filter, error)
... (以下、同様のsyscallエントリが多数続く)

この差分は、api/next.txt に新しいAPI要素が追加されたことを明確に示しています。各行は pkg <パッケージ名>, <要素の種類> <要素名> ... の形式で、GoのAPIチェッカーが解析できるように記述されています。

コアとなるコードの解説

api/next.txt は、GoのAPI互換性保証の重要な部分を担っています。このファイルに新しいAPIが追加されるプロセスは以下のようになります。

  1. 機能の実装: まず、Goの標準ライブラリに新しい機能が実装されます。この段階では、APIはまだ公開されていません。
  2. APIの定義: 実装された機能のうち、外部に公開されるべきAPI要素(関数、型、定数など)が決定されます。
  3. api/next.txt への追加: 決定されたAPI要素が、このコミットのように api/next.txt に追記されます。このファイルへの追加は、GoのAPIレビュープロセスの一部であり、Goチームのメンバーによってレビューされます。
  4. APIチェッカーによる検証: Goのビルドシステムには、api/next.txt と実際の公開APIを比較するAPIチェッカーが組み込まれています。これにより、api/next.txt に記載されていないAPIが誤って公開されたり、記載されているAPIが削除されたりするなどの互換性違反が検出されます。
  5. リリース: api/next.txt に記載されたAPIは、次のGoのメジャーリリースで正式に公開され、安定したAPIとして利用可能になります。

このコミットは、上記のステップ3に該当します。crypto/tlsgo/astsyscall パッケージに新しい機能が追加され、それらのAPIが次期リリースで公開される準備が整ったことを示しています。

特に、syscall パッケージの変更は、Goがサポートする様々なOSとアーキテクチャに対して、一貫したシステムコールインターフェースを提供しようとするGoの哲学を反映しています。各OS/アーキテクチャの組み合わせに対して PRIO_PGRP, PRIO_PROCESS, PRIO_USER といった定数や Getpriority, Setpriority 関数が追加されているのは、それぞれの環境でこれらのシステムコールが利用可能になることを意味します。

関連リンク

  • Go言語のAPI互換性保証に関する公式ドキュメント: Goの公式ブログやドキュメントで「Go 1 and the Future of Go Programs」などの記事を参照すると、API互換性に関するGoチームの考え方を深く理解できます。
  • crypto/tls パッケージのドキュメント: https://pkg.go.dev/crypto/tls
  • go/ast パッケージのドキュメント: https://pkg.go.dev/go/ast
  • syscall パッケージのドキュメント: https://pkg.go.dev/syscall
  • getpriority(2) manページ (Unix系システム): man 2 getpriority
  • setpriority(2) manページ (Unix系システム): man 2 setpriority

参考にした情報源リンク

  • Go言語の公式ドキュメントおよびパッケージドキュメント
  • Goのソースコードリポジトリ (特に api/next.txt ファイルの履歴)
  • Unix系システムのmanページ (getpriority, setpriority)
  • Windows APIドキュメント (ERROR_HANDLE_EOF, PROCESS_TERMINATE)
  • TLSプロトコルに関する一般的な情報源 (RFCなど)