[インデックス 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
の追加。
- 様々なOS (darwin, freebsd, linux, netbsd, openbsd, windows) およびアーキテクチャ (386, amd64, arm, cgo variants) における定数
変更の背景
このコミットは、Go言語の標準ライブラリに新しい機能や改善が追加される際に、そのAPIが公開されることを記録するために行われました。特に、以下の背景が考えられます。
crypto/tls
のバージョン管理強化: TLS (Transport Layer Security) プロトコルは、インターネット上での安全な通信を確立するために不可欠です。時間の経過とともに、古いバージョンのTLS/SSLにはセキュリティ上の脆弱性が発見されることがあります。MinVersion
とMaxVersion
フィールドの追加は、アプリケーションが使用するTLSプロトコルの最小バージョンと最大バージョンを明示的に設定できるようにすることで、セキュリティを強化し、古い脆弱なプロトコルバージョンの使用を防止することを目的としています。これにより、開発者はより安全な通信設定を強制できるようになります。VersionSSL30
,VersionTLS10
,VersionTLS11
といった定数は、これらのバージョンを明確に指定するためのものです。go/ast
の構文木表現の改善:go/ast
パッケージはGoのソースコードを抽象構文木 (AST) として表現するためのツールを提供します。TypeAssertExpr
は型アサーション (x.(T)
) を表すASTノードです。Lparen
とRparen
フィールドの追加は、型アサーションの括弧(
と)
の位置情報をASTノードに含めることで、ツールがより正確なソースコードの再構築や分析を行えるようにすることを目的としています。これは、Goのツールチェイン(例えば、go fmt
やリンターなど)の精度向上に寄与します。syscall
パッケージの機能拡張とOS互換性向上:syscall
パッケージは、Goプログラムが基盤となるオペレーティングシステムのシステムコールに直接アクセスするためのインターフェースを提供します。PRIO_PGRP
,PRIO_PROCESS
,PRIO_USER
定数とGetpriority
,Setpriority
関数の追加は、プロセス、プロセスグループ、またはユーザーのスケジューリング優先度を操作するための機能を提供します。これは、システムリソースの管理や、特定のプロセスのパフォーマンス特性を調整する際に重要です。これらの機能は、Unix系システムで一般的に利用されるgetpriority(2)
およびsetpriority(2)
システムコールに対応します。- Windows固有の定数
ERROR_HANDLE_EOF
とPROCESS_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
: 指定されたwhich
、who
、および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が追加されるプロセスは以下のようになります。
- 機能の実装: まず、Goの標準ライブラリに新しい機能が実装されます。この段階では、APIはまだ公開されていません。
- APIの定義: 実装された機能のうち、外部に公開されるべきAPI要素(関数、型、定数など)が決定されます。
api/next.txt
への追加: 決定されたAPI要素が、このコミットのようにapi/next.txt
に追記されます。このファイルへの追加は、GoのAPIレビュープロセスの一部であり、Goチームのメンバーによってレビューされます。- APIチェッカーによる検証: Goのビルドシステムには、
api/next.txt
と実際の公開APIを比較するAPIチェッカーが組み込まれています。これにより、api/next.txt
に記載されていないAPIが誤って公開されたり、記載されているAPIが削除されたりするなどの互換性違反が検出されます。 - リリース:
api/next.txt
に記載されたAPIは、次のGoのメジャーリリースで正式に公開され、安定したAPIとして利用可能になります。
このコミットは、上記のステップ3に該当します。crypto/tls
、go/ast
、syscall
パッケージに新しい機能が追加され、それらの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/tlsgo/ast
パッケージのドキュメント: https://pkg.go.dev/go/astsyscall
パッケージのドキュメント: https://pkg.go.dev/syscallgetpriority(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など)