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

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

本コミットは、Go言語のテストスイートにおいて、deferfin.go および fixedbugs/issue5493.go の2つのテストファイルに対し、gccgo コンパイラ環境下での実行をスキップする変更を導入するものです。これらのテストは、Goランタイムのガベージコレクション (GC) の挙動、特に「正確なGC (precise GC)」に関連するものであり、gccgo のGC実装が当時のGo標準コンパイラ (gc) とは異なる特性を持っていたため、テストが失敗する可能性があったことが示唆されています。

コミット

commit d12b08d228aff8b62d6a90297689856bf67890f7
Author: Ian Lance Taylor <iant@golang.org>
Date:   Thu Dec 12 17:13:27 2013 -0800

    test: disable a couple of precise GC tests for gccgo

    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/41610043

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

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

元コミット内容

test: disable a couple of precise GC tests for gccgo

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/41610043

変更の背景

このコミットの背景には、Go言語の複数のコンパイラ実装が存在し、それぞれが異なるガベージコレクション (GC) の特性を持っていたという事実があります。当時、Go言語には主に以下の2つのコンパイラがありました。

  1. gc (Go Compiler): Goプロジェクトが公式に開発・メンテナンスしている主要なコンパイラ。
  2. gccgo: GCC (GNU Compiler Collection) のフロントエンドとしてGo言語をサポートするコンパイラ。

test/deferfin.gotest/fixedbugs/issue5493.go は、GoランタイムのGCの特定の挙動、特に「正確なGC (precise GC)」が期待されるシナリオを検証するためのテストでした。しかし、gccgo のGC実装は、当時の gc コンパイラが目指していた「完全な正確なGC」とは異なり、「部分的に保守的なGC (partially conservative GC)」であったため、これらのテストが gccgo 環境下で期待通りに動作しない、あるいは失敗する可能性がありました。

テストスイートの健全性を保つためには、特定の環境で意図的に失敗するテストを無効化するか、その環境での実行をスキップする必要があります。このコミットは、gccgo のGC特性がこれらのテストの前提と合致しないため、gccgo 環境でのテスト実行をスキップすることで、テストの安定性を確保することを目的としています。これは、異なるコンパイラ実装間での互換性の課題、特にランタイムの低レベルな挙動に関する課題を浮き彫りにしています。

前提知識の解説

ガベージコレクション (GC)

ガベージコレクションは、プログラムが動的に確保したメモリ領域のうち、もはや使用されていない(参照されていない)ものを自動的に解放する仕組みです。これにより、プログラマは手動でのメモリ管理の負担から解放され、メモリリークなどのバグを減らすことができます。

正確なGC (Precise GC) と 保守的なGC (Conservative GC)

GCには大きく分けて「正確なGC」と「保守的なGC」の2種類があります。

  1. 正確なGC (Precise GC):

    • 定義: プログラムの実行中に、メモリ上のどの値がポインタ(メモリアドレスを指す値)であり、どの値が単なる整数などの非ポインタデータであるかを正確に識別できるGCです。
    • 利点: ポインタを正確に識別できるため、到達可能なオブジェクトを正確に特定し、不要なメモリを確実に解放できます。これにより、メモリの利用効率が最大化され、誤って使用中のメモリを解放してしまう「ダングリングポインタ」の問題を防ぐことができます。
    • 実装の複雑さ: 正確なGCを実装するには、コンパイラがポインタの情報をGCに提供する必要があります。例えば、スタック上のどの位置にポインタがあるか、ヒープ上のオブジェクトのどのフィールドがポインタであるか、といった情報です。これは、コンパイラとランタイムの密接な連携を必要とし、実装が複雑になる傾向があります。
  2. 保守的なGC (Conservative GC):

    • 定義: メモリ上の値がポインタであるかどうかを確実に識別できない場合でも、それがポインタである「可能性がある」と見なして処理を進めるGCです。つまり、メモリ上の任意のビットパターンが、たまたま有効なメモリアドレスを指しているように見える場合、それをポインタとして扱います。
    • 利点: コンパイラからの特別なポインタ情報が不要なため、実装が比較的容易です。既存のC/C++のような言語のランタイムにGCを追加する際によく用いられます。
    • 欠点:
      • メモリリークの可能性: 実際にはポインタではない値がポインタと誤認されると、その値が指す先のメモリ領域が「使用中」と判断され、解放されずに残ってしまう可能性があります。これにより、メモリリークが発生し、メモリ使用量が増加する可能性があります。
      • 移動型GCとの相性: オブジェクトをメモリ上で移動させる「移動型GC (Moving GC)」とは相性が悪いです。なぜなら、移動型GCはオブジェクトを移動させた後に、そのオブジェクトを指すすべてのポインタを更新する必要がありますが、保守的なGCではポインタを正確に識別できないため、更新すべきポインタを見つけられない可能性があるからです。

Go言語のGCとコンパイラ

  • Go標準コンパイラ (gc): Go言語の初期から、gc コンパイラは「正確なGC」を目指して開発されてきました。特に、Go 1.5以降では、完全に正確なGCが実現され、スタック上のポインタも正確に識別できるようになりました。これにより、GoのGCは非常に効率的で低レイテンシなものとなっています。
  • gccgo: gccgo はGCCのフレームワーク上でGo言語を実装しているため、そのGC実装はGCCの既存のGCメカニズム(例えば、Boehm-Demers-Weiser conservative garbage collectorなど)に依存するか、それに影響を受けることがあります。このコミットが作成された2013年時点では、gccgo のGCは gc コンパイラのような完全な正確なGCではなかった、あるいは特定のシナリオでその挙動が異なっていたことが示唆されています。コミットメッセージの「partially conservative GC」という記述がこれを裏付けています。

runtime.GOARCHruntime.Compiler

Go言語の runtime パッケージは、実行環境に関する情報を提供します。

  • runtime.GOARCH: プログラムが実行されているターゲットアーキテクチャ(例: "amd64", "386", "arm" など)を示す文字列定数です。
  • runtime.Compiler: プログラムをコンパイルしたコンパイラの名前(例: "gc", "gccgo" など)を示す文字列定数です。

これらの定数を使用することで、特定のアーキテクチャやコンパイラに依存するコードの条件分岐を行うことができます。本コミットでは、runtime.Compiler == "gccgo" を用いて gccgo 環境を識別し、テストの実行をスキップしています。

技術的詳細

このコミットは、Go言語のテストスイートにおける条件付きコンパイル(または条件付き実行)の典型的な例を示しています。特定のコンパイラ実装の特性に起因するテストの不整合を解消するために、ランタイム情報 (runtime.Compiler) を利用してテストの実行フローを制御しています。

具体的には、以下の2つのテストファイルが修正されています。

  1. test/deferfin.go:

    • このテストは、defer ステートメントとファイナライザ (runtime.SetFinalizer) の組み合わせがGCとどのように相互作用するかを検証していると考えられます。特に、オブジェクトがGCによって回収されるタイミングと、ファイナライザが実行されるタイミングの正確性が問われるテストです。
    • 元のコードでは runtime.GOARCH != "amd64" の場合にテストをスキップしていました。これは、32ビット環境など、amd64 以外のアーキテクチャではGCの挙動が異なるか、あるいはテストの前提が満たされないためと考えられます。
    • 今回の変更で、これに加えて runtime.Compiler == "gccgo" の場合もテストをスキップする条件が追加されました。これは、gccgo のGCが defer やファイナライザの正確なセマンティクスを gc コンパイラと同じように保証できない、あるいはその挙動がテストの期待値と異なるためと考えられます。
  2. test/fixedbugs/issue5493.go:

    • このテストは、GoのバグトラッカーのIssue 5493に関連するもので、特定のGCの挙動、特に「部分的に保守的なGC」が問題を引き起こす可能性のあるシナリオを検証していると考えられます。コメントには「Does not work on 32-bits due to partially conservative GC. Try to enable when we have fully precise GC.」と明記されており、GCの正確性がこのテストの成功に不可欠であることが示されています。
    • 元のコードでは runtime.GOARCH != "amd64" の場合にテストをスキップしていました。これは、32ビット環境でのGCが「部分的に保守的」であるため、テストが失敗することを示しています。
    • 今回の変更で、スキップ条件が runtime.GOARCH != "amd64" || runtime.Compiler == "gccgo" に拡張されました。これは、gccgo のGCもまた、このテストが要求する「完全な正確なGC」の特性を満たしていない、あるいは「部分的に保守的なGC」の挙動を示すため、テストが失敗する可能性があったことを意味します。

これらの変更は、Go言語のテストスイートが、異なるコンパイラ実装やアーキテクチャ間でのランタイムの挙動の差異を考慮して設計されていることを示しています。特に、GCのような低レベルなランタイム機能は、コンパイラの実装に大きく依存するため、このような条件分岐が必要となることがあります。

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

test/deferfin.go

--- a/test/deferfin.go
+++ b/test/deferfin.go
@@ -23,6 +23,10 @@ func main() {\n  if runtime.GOARCH != "amd64" {\n  	return\n  }\n+	// Likewise for gccgo.\n+	if runtime.Compiler == "gccgo" {\n+		return\n+	}\n  N := 10\n  count := int32(N)\n  var wg sync.WaitGroup

test/fixedbugs/issue5493.go

--- a/test/fixedbugs/issue5493.go
+++ b/test/fixedbugs/issue5493.go
@@ -31,9 +31,10 @@ func run() error {\n }\n \n func main() {\n-	// Does not work on 32-bits due to partially conservative GC.\n+	// Does not work on 32-bits, or with gccgo, due to partially\n+	// conservative GC.\n 	// Try to enable when we have fully precise GC.\n-	if runtime.GOARCH != "amd64" {\n+	if runtime.GOARCH != "amd64" || runtime.Compiler == "gccgo" {\n 		return\n 	}\n 	count = N

コアとなるコードの解説

test/deferfin.go の変更

	// Likewise for gccgo.
	if runtime.Compiler == "gccgo" {
		return
	}

このコードは、runtime.Compiler"gccgo" である場合に、main 関数(つまりテスト全体)の実行を即座に終了させます。これにより、gccgo コンパイラでビルドされた場合、このテストは実行されずにスキップされます。コメント // Likewise for gccgo. は、既存の runtime.GOARCH != "amd64" と同様に、特定の環境でのテストスキップを意図していることを示唆しています。

test/fixedbugs/issue5493.go の変更

	// Does not work on 32-bits, or with gccgo, due to partially
	// conservative GC.
	// Try to enable when we have fully precise GC.
	if runtime.GOARCH != "amd64" || runtime.Compiler == "gccgo" {
		return
	}

このコードは、テストの実行条件をより厳しくしています。

  • runtime.GOARCH != "amd64": 既存の条件で、32ビット環境など amd64 以外のアーキテクチャではテストをスキップします。これは、32ビット環境でのGCが「部分的に保守的」であるため、テストが失敗することを示しています。
  • || runtime.Compiler == "gccgo": 新たに追加された条件で、gccgo コンパイラでビルドされた場合もテストをスキップします。これは、gccgo のGCもまた、このテストが要求する「完全な正確なGC」の特性を満たしていない、あるいは「部分的に保守的なGC」の挙動を示すため、テストが失敗する可能性があったことを意味します。

この変更により、fixedbugs/issue5493.go テストは、amd64 アーキテクチャ上で gc コンパイラによってビルドされた場合にのみ実行されるようになります。コメントが更新され、「or with gccgo」が追加されたことで、gccgo が32ビット環境と同様に「部分的に保守的なGC」の特性を持つことが明確に示されています。

これらの変更は、Go言語のテストスイートが、異なるコンパイラ実装やアーキテクチャ間でのランタイムの挙動の差異を考慮して設計されていることを示しています。特に、GCのような低レベルなランタイム機能は、コンパイラの実装に大きく依存するため、このような条件分岐が必要となることがあります。

関連リンク

  • Go Bug Tracker Issue 5493: このコミットで参照されている fixedbugs/issue5493.go のテストが関連するバグトラッカーのIssue。具体的な内容はGoの公式バグトラッカーで検索することで確認できます。
  • Go CL 41610043: コミットメッセージに記載されているGo Code Reviewのリンク。この変更がレビューされた際の議論や詳細なコンテキストが含まれている可能性があります。

参考にした情報源リンク

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

本コミットは、Go言語のテストスイートにおいて、deferfin.go および fixedbugs/issue5493.go の2つのテストファイルに対し、gccgo コンパイラ環境下での実行をスキップする変更を導入するものです。これらのテストは、Goランタイムのガベージコレクション (GC) の挙動、特に「正確なGC (precise GC)」に関連するものであり、gccgo のGC実装が当時のGo標準コンパイラ (gc) とは異なる特性を持っていたため、テストが失敗する可能性があったことが示唆されています。

コミット

commit d12b08d228aff8b62d6a90297689856bf67890f7
Author: Ian Lance Taylor <iant@golang.org>
Date:   Thu Dec 12 17:13:27 2013 -0800

    test: disable a couple of precise GC tests for gccgo

    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/41610043

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

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

元コミット内容

test: disable a couple of precise GC tests for gccgo

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/41610043

変更の背景

このコミットの背景には、Go言語の複数のコンパイラ実装が存在し、それぞれが異なるガベージコレクション (GC) の特性を持っていたという事実があります。当時、Go言語には主に以下の2つのコンパイラがありました。

  1. gc (Go Compiler): Goプロジェクトが公式に開発・メンテナンスしている主要なコンパイラ。
  2. gccgo: GCC (GNU Compiler Collection) のフロントエンドとしてGo言語をサポートするコンパイラ。

test/deferfin.gotest/fixedbugs/issue5493.go は、GoランタイムのGCの特定の挙動、特に「正確なGC (precise GC)」が期待されるシナリオを検証するためのテストでした。しかし、gccgo のGC実装は、当時の gc コンパイラが目指していた「完全な正確なGC」とは異なり、「部分的に保守的なGC (partially conservative GC)」であったため、これらのテストが gccgo 環境下で期待通りに動作しない、あるいは失敗する可能性がありました。

テストスイートの健全性を保つためには、特定の環境で意図的に失敗するテストを無効化するか、その環境での実行をスキップする必要があります。このコミットは、gccgo のGC特性がこれらのテストの前提と合致しないため、gccgo 環境でのテスト実行をスキップすることで、テストの安定性を確保することを目的としています。これは、異なるコンパイラ実装間での互換性の課題、特にランタイムの低レベルな挙動に関する課題を浮き彫りにしています。

前提知識の解説

ガベージコレクション (GC)

ガベージコレクションは、プログラムが動的に確保したメモリ領域のうち、もはや使用されていない(参照されていない)ものを自動的に解放する仕組みです。これにより、プログラマは手動でのメモリ管理の負担から解放され、メモリリークなどのバグを減らすことができます。

正確なGC (Precise GC) と 保守的なGC (Conservative GC)

GCには大きく分けて「正確なGC」と「保守的なGC」の2種類があります。

  1. 正確なGC (Precise GC):

    • 定義: プログラムの実行中に、メモリ上のどの値がポインタ(メモリアドレスを指す値)であり、どの値が単なる整数などの非ポインタデータであるかを正確に識別できるGCです。
    • 利点: ポインタを正確に識別できるため、到達可能なオブジェクトを正確に特定し、不要なメモリを確実に解放できます。これにより、メモリの利用効率が最大化され、誤って使用中のメモリを解放してしまう「ダングリングポインタ」の問題を防ぐことができます。
    • 実装の複雑さ: 正確なGCを実装するには、コンパイラがポインタの情報をGCに提供する必要があります。例えば、スタック上のどの位置にポインタがあるか、ヒープ上のオブジェクトのどのフィールドがポインタであるか、といった情報です。これは、コンパイラとランタイムの密接な連携を必要とし、実装が複雑になる傾向があります。
  2. 保守的なGC (Conservative GC):

    • 定義: メモリ上の値がポインタであるかどうかを確実に識別できない場合でも、それがポインタである「可能性がある」と見なして処理を進めるGCです。つまり、メモリ上の任意のビットパターンが、たまたま有効なメモリアドレスを指しているように見える場合、それをポインタとして扱います。
    • 利点: コンパイラからの特別なポインタ情報が不要なため、実装が比較的容易です。既存のC/C++のような言語のランタイムにGCを追加する際によく用いられます。
    • 欠点:
      • メモリリークの可能性: 実際にはポインタではない値がポインタと誤認されると、その値が指す先のメモリ領域が「使用中」と判断され、解放されずに残ってしまう可能性があります。これにより、メモリリークが発生し、メモリ使用量が増加する可能性があります。
      • 移動型GCとの相性: オブジェクトをメモリ上で移動させる「移動型GC (Moving GC)」とは相性が悪いです。なぜなら、移動型GCはオブジェクトを移動させた後に、そのオブジェクトを指すすべてのポインタを更新する必要がありますが、保守的なGCではポインタを正確に識別できないため、更新すべきポインタを見つけられない可能性があるからです。

Go言語のGCとコンパイラ

  • Go標準コンパイラ (gc): Go言語の初期から、gc コンパイラは「正確なGC」を目指して開発されてきました。特に、Go 1.5以降では、完全に正確なGCが実現され、スタック上のポインタも正確に識別できるようになりました。これにより、GoのGCは非常に効率的で低レイテンシなものとなっています。
  • gccgo: gccgo はGCCのフレームワーク上でGo言語を実装しているため、そのGC実装はGCCの既存のGCメカニズム(例えば、Boehm-Demers-Weiser conservative garbage collectorなど)に依存するか、それに影響を受けることがあります。このコミットが作成された2013年時点では、gccgo のGCは gc コンパイラのような完全な正確なGCではなかった、あるいは特定のシナリオでその挙動が異なっていたことが示唆されています。コミットメッセージの「partially conservative GC」という記述がこれを裏付けています。

runtime.GOARCHruntime.Compiler

Go言語の runtime パッケージは、実行環境に関する情報を提供します。

  • runtime.GOARCH: プログラムが実行されているターゲットアーキテクチャ(例: "amd64", "386", "arm" など)を示す文字列定数です。
  • runtime.Compiler: プログラムをコンパイルしたコンパイラの名前(例: "gc", "gccgo" など)を示す文字列定数です。

これらの定数を使用することで、特定のアーキテクチャやコンパイラに依存するコードの条件分岐を行うことができます。本コミットでは、runtime.Compiler == "gccgo" を用いて gccgo 環境を識別し、テストの実行をスキップしています。

技術的詳細

このコミットは、Go言語のテストスイートにおける条件付きコンパイル(または条件付き実行)の典型的な例を示しています。特定のコンパイラ実装の特性に起因するテストの不整合を解消するために、ランタイム情報 (runtime.Compiler) を利用してテストの実行フローを制御しています。

具体的には、以下の2つのテストファイルが修正されています。

  1. test/deferfin.go:

    • このテストは、defer ステートメントとファイナライザ (runtime.SetFinalizer) の組み合わせがGCとどのように相互作用するかを検証していると考えられます。特に、オブジェクトがGCによって回収されるタイミングと、ファイナライザが実行されるタイミングの正確性が問われるテストです。
    • 元のコードでは runtime.GOARCH != "amd64" の場合にテストをスキップしていました。これは、32ビット環境など、amd64 以外のアーキテクチャではGCの挙動が異なるか、あるいはテストの前提が満たされないためと考えられます。
    • 今回の変更で、これに加えて runtime.Compiler == "gccgo" の場合もテストをスキップする条件が追加されました。これは、gccgo のGCが defer やファイナライザの正確なセマンティクスを gc コンパイラと同じように保証できない、あるいはその挙動がテストの期待値と異なるためと考えられます。
  2. test/fixedbugs/issue5493.go:

    • このテストは、GoのバグトラッカーのIssue 5493に関連するもので、特定のGCの挙動、特に「部分的に保守的なGC」が問題を引き起こす可能性のあるシナリオを検証していると考えられます。コメントには「Does not work on 32-bits due to partially conservative GC. Try to enable when we have fully precise GC.」と明記されており、GCの正確性がこのテストの成功に不可欠であることが示されています。
    • 元のコードでは runtime.GOARCH != "amd64" の場合にテストをスキップしていました。これは、32ビット環境でのGCが「部分的に保守的」であるため、テストが失敗することを示しています。
    • 今回の変更で、スキップ条件が runtime.GOARCH != "amd64" || runtime.Compiler == "gccgo" に拡張されました。これは、gccgo のGCもまた、このテストが要求する「完全な正確なGC」の特性を満たしていない、あるいは「部分的に保守的なGC」の挙動を示すため、テストが失敗する可能性があったことを意味します。

これらの変更は、Go言語のテストスイートが、異なるコンパイラ実装やアーキテクチャ間でのランタイムの挙動の差異を考慮して設計されていることを示しています。特に、GCのような低レベルなランタイム機能は、コンパイラの実装に大きく依存するため、このような条件分岐が必要となることがあります。

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

test/deferfin.go

--- a/test/deferfin.go
+++ b/test/deferfin.go
@@ -23,6 +23,10 @@ func main(){\n  if runtime.GOARCH != "amd64" {\n  	return\n  }\n+	// Likewise for gccgo.\n+	if runtime.Compiler == "gccgo" {\n+		return\n+	}\n  N := 10\n  count := int32(N)\n  var wg sync.WaitGroup

test/fixedbugs/issue5493.go

--- a/test/fixedbugs/issue5493.go
+++ b/test/fixedbugs/issue5493.go
@@ -31,9 +31,10 @@ func run() error {\n }\n \n func main(){\n-	// Does not work on 32-bits due to partially conservative GC.\n+	// Does not work on 32-bits, or with gccgo, due to partially\n+	// conservative GC.\n 	// Try to enable when we have fully precise GC.\n-	if runtime.GOARCH != "amd64" {\n+	if runtime.GOARCH != "amd64" || runtime.Compiler == "gccgo" {\n 		return\n 	}\n 	count = N

コアとなるコードの解説

test/deferfin.go の変更

	// Likewise for gccgo.
	if runtime.Compiler == "gccgo" {
		return
	}

このコードは、runtime.Compiler"gccgo" である場合に、main 関数(つまりテスト全体)の実行を即座に終了させます。これにより、gccgo コンパイラでビルドされた場合、このテストは実行されずにスキップされます。コメント // Likewise for gccgo. は、既存の runtime.GOARCH != "amd64" と同様に、特定の環境でのテストスキップを意図していることを示唆しています。

test/fixedbugs/issue5493.go の変更

	// Does not work on 32-bits, or with gccgo, due to partially
	// conservative GC.
	// Try to enable when we have fully precise GC.
	if runtime.GOARCH != "amd64" || runtime.Compiler == "gccgo" {
		return
	}

このコードは、テストの実行条件をより厳しくしています。

  • runtime.GOARCH != "amd64": 既存の条件で、32ビット環境など amd64 以外のアーキテクチャではテストをスキップします。これは、32ビット環境でのGCが「部分的に保守的」であるため、テストが失敗することを示しています。
  • || runtime.Compiler == "gccgo": 新たに追加された条件で、gccgo コンパイラでビルドされた場合もテストをスキップします。これは、gccgo のGCもまた、このテストが要求する「完全な正確なGC」の特性を満たしていない、あるいは「部分的に保守的なGC」の挙動を示すため、テストが失敗する可能性があったことを意味します。

この変更により、fixedbugs/issue5493.go テストは、amd64 アーキテクチャ上で gc コンパイラによってビルドされた場合にのみ実行されるようになります。コメントが更新され、「or with gccgo」が追加されたことで、gccgo が32ビット環境と同様に「部分的に保守的なGC」の特性を持つことが明確に示されています。

これらの変更は、Go言語のテストスイートが、異なるコンパイラ実装やアーキテクチャ間でのランタイムの挙動の差異を考慮して設計されていることを示しています。特に、GCのような低レベルなランタイム機能は、コンパイラの実装に大きく依存するため、このような条件分岐が必要となることがあります。

関連リンク

  • Go Bug Tracker Issue 5493: このコミットで参照されている fixedbugs/issue5493.go のテストが関連するバグトラッカーのIssue。具体的な内容はGoの公式バグトラッカーで検索することで確認できます。
  • Go CL 41610043: コミットメッセージに記載されているGo Code Reviewのリンク。この変更がレビューされた際の議論や詳細なコンテキストが含まれている可能性があります。

参考にした情報源リンク