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

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

このコミットは、Go言語の実験的なSSA(Static Single Assignment)形式のインタープリタであるexp/ssa/interpパッケージにおける、Microsoft Windows環境でのビルドエラーおよび実行時問題の修正を目的としています。具体的には、syscall.Killsyscall.Writeというシステムコール関連の関数がWindows環境では移植性がなく、問題を引き起こしていたため、これらの関数をプラットフォーム固有のファイルに分離し、Windows環境では一時的に無効化(パニックを発生させる)することで対応しています。

コミット

commit 5fa6721a311f1a4a71cf88502c44537e519b4787
Author: Alan Donovan <adonovan@google.com>
Date:   Fri Feb 8 11:58:24 2013 -0500

    exp/ssa/interp: fix MS Windows breakage.
    
    syscall.{Kill,Write} are not portable to MS Windows, so we
    disable them for now.
    
    R=iant, rsc
    CC=golang-dev
    https://golang.org/cl/7312066

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

https://github.com/golang/go/commit/5fa6721a311f1a4a71cf88502c44537e519b4787

元コミット内容

このコミットは、exp/ssa/interpパッケージ内のexternal.goファイルに定義されていたext۰syscall۰Killおよびext۰syscall۰Write関数が、Microsoft Windows環境で正しく動作しない、あるいはビルドできない問題に対処しています。これらの関数は、GoのSSAインタープリタが外部のシステムコールをエミュレートするために使用されていましたが、syscallパッケージの特定の関数(syscall.Killsyscall.Write)がOS間で互換性がなかったため、Windowsでの「破損」を引き起こしていました。

変更の背景

Go言語はクロスプラットフォーム対応を重視していますが、低レベルのシステムコールを扱うsyscallパッケージの関数は、オペレーティングシステムによってその振る舞いや利用可能性が大きく異なります。特に、プロセスへのシグナル送信を行うsyscall.Killや、ファイルディスクリプタへの書き込みを行うsyscall.Writeは、Unix系システムとWindowsシステムで実装が大きく異なります。

exp/ssa/interpは、GoプログラムのSSA形式を解釈・実行するための実験的なインタープリタであり、その性質上、Goプログラムが呼び出す可能性のある様々な関数(組み込み関数、標準ライブラリ関数、システムコールなど)をエミュレートまたは直接呼び出す必要があります。しかし、external.goに直接記述されていたsyscall.Killsyscall.Writeのエミュレーションコードは、Unix系システムを前提としたものであり、Windows環境ではコンパイルエラーや実行時エラーを引き起こしていました。

この「破損」を修正するため、開発者はこれらのOS依存性の高い関数を、Goのビルドタグ(build tags)を用いてプラットフォームごとに分離することを決定しました。これにより、Windows環境ではこれらの関数が一時的に無効化され、ビルドと実行が可能になります。

前提知識の解説

Go言語のSSA (Static Single Assignment) 形式

SSA形式は、コンパイラ最適化において非常に重要な中間表現(IR)の一つです。SSA形式では、各変数が一度だけ代入されるようにプログラムが変換されます。これにより、データフロー解析や最適化が容易になります。Go言語のコンパイラも内部的にSSA形式を利用しており、exp/ssaパッケージは、このSSA形式をプログラムで操作・解析するための実験的なAPIを提供します。

exp/ssa/interpパッケージ

exp/ssa/interpパッケージは、exp/ssaパッケージで生成されたSSA形式のGoプログラムを解釈・実行するインタープリタです。これは、コンパイルせずにGoコードの動作を検証したり、デバッグしたりする際に役立ちます。インタープリタは、Goプログラムが呼び出す様々な関数(特に標準ライブラリやシステムコール)をエミュレートするか、ホストOSのネイティブ関数を呼び出す必要があります。

Go言語のビルドタグ (Build Tags)

Go言語には、特定のファイルが特定の環境でのみコンパイルされるように制御する「ビルドタグ」という機能があります。ソースファイルの先頭に// +build tagnameのようなコメントを記述することで、そのファイルがコンパイルされる条件を指定できます。

  • // +build windows: Windows環境でのみコンパイル。
  • // +build linux darwin: LinuxまたはmacOS環境でのみコンパイル。
  • // +build !windows: Windows以外の環境でコンパイル。
  • // +build windows,plan9: WindowsまたはPlan 9環境でコンパイル。

この機能は、OS固有のコードやアーキテクチャ固有のコードを記述する際に非常に有用です。

syscallパッケージ

syscallパッケージは、Goプログラムからオペレーティングシステムの低レベルなシステムコールにアクセスするためのインターフェースを提供します。これにより、ファイル操作、プロセス管理、ネットワーク通信など、OSカーネルが提供する機能に直接アクセスできます。しかし、システムコールはOSに強く依存するため、syscallパッケージ内の関数はOSによって実装が異なったり、利用できなかったりすることがあります。

  • syscall.Kill: プロセスにシグナルを送信するシステムコール。Unix系ではプロセスIDとシグナル番号を指定しますが、Windowsでは異なるAPI(例: TerminateProcess)を使用します。
  • syscall.Write: ファイルディスクリプタにデータを書き込むシステムコール。

技術的詳細

このコミットの技術的解決策は、Goのビルドタグを巧みに利用して、OS固有のコードパスを分離することにあります。

  1. external.goからの関数削除: 元々external.goに一元的に記述されていたext۰syscall۰Killext۰syscall۰Writeの実装が削除されました。これにより、このファイルはプラットフォーム非依存の共通部分のみを含むようになります。

  2. external_unix.goの新規作成:

    • このファイルには// +build !windows,!plan9というビルドタグが付与されています。これは、「WindowsでもPlan 9でもない環境」(つまり、Linux、macOSなどのUnix系システム)でのみこのファイルがコンパイルされることを意味します。
    • このファイルには、元のexternal.goにあったext۰syscall۰Killext۰syscall۰WriteのUnix系システム向けの実装がそのまま移動されました。これらの実装は、Goのsyscallパッケージのsyscall.Killsyscall.Writeを直接呼び出しています。
  3. external_windows.goの新規作成:

    • このファイルには// +build windows plan9というビルドタグが付与されています。これは、「WindowsまたはPlan 9環境」でのみこのファイルがコンパイルされることを意味します。
    • このファイルには、ext۰syscall۰Killext۰syscall۰Writeのスタブ実装が記述されています。これらのスタブは、関数が呼び出された際にpanic(パニック)を発生させるようになっています。これは、Windows環境ではこれらのシステムコールがまだ適切にエミュレートされていない、あるいはサポートされていないことを示しており、将来的な実装の必要性を示唆しています。

このアプローチにより、GoコンパイラはターゲットOSに応じて適切なexternal_*.goファイルを選択してコンパイルするため、Windows環境ではsyscall.Killsyscall.Writeの非互換な実装がコンパイルされなくなり、ビルドエラーが解消されます。同時に、Unix系システムでは既存の機能が維持されます。

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

src/pkg/exp/ssa/interp/external.go

--- a/src/pkg/exp/ssa/interp/external.go
+++ b/src/pkg/exp/ssa/interp/external.go
@@ -1,3 +1,7 @@
+// Copyright 2013 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
 package interp
 
 // Emulated functions that we cannot interpret because they are
@@ -173,26 +177,6 @@ func ext۰syscall۰Getpid(fn *ssa.Function, args []value, slots []value) value {
 	return syscall.Getpid()
 }
 
-func ext۰syscall۰Kill(fn *ssa.Function, args []value, slots []value) value {
-// We could emulate syscall.Syscall but it\'s more effort.
-err := syscall.Kill(args[0].(int), syscall.Signal(args[1].(int)))
-err = err // TODO(adonovan): fix: adapt concrete err to interpreted iface (e.g. call interpreted errors.New)
-return iface{}
-}
-
-func ext۰syscall۰Write(fn *ssa.Function, args []value, slots []value) value {
-// We could emulate syscall.Syscall but it\'s more effort.
-p := args[1].([]value)
-b := make([]byte, 0, len(p))
-for i := range p {
-b = append(b, p[i].(byte))
-}
-n, _ := syscall.Write(args[0].(int), b)
-err := iface{} // TODO(adonovan): fix: adapt concrete err to interpreted iface.
-return tuple{n, err}
-
-}
-
 // The set of remaining native functions we need to implement (as needed):
 
 // bytes/bytes.go:42:func Equal(a, b []byte) bool

src/pkg/exp/ssa/interp/external_unix.go (新規ファイル)

--- /dev/null
+++ b/src/pkg/exp/ssa/interp/external_unix.go
@@ -0,0 +1,32 @@
+// Copyright 2013 The Go Authors.  All rights reserved.\n
+// Use of this source code is governed by a BSD-style\n
+// license that can be found in the LICENSE file.\n
+\n
+// +build !windows,!plan9\n
+\n
+package interp\n
+\n
+import (\n
+\t"exp/ssa"\n
+\t"syscall"\n
+)\n
+\n
+func ext۰syscall۰Kill(fn *ssa.Function, args []value, slots []value) value {\n
+\t// We could emulate syscall.Syscall but it\'s more effort.\n
+\terr := syscall.Kill(args[0].(int), syscall.Signal(args[1].(int)))\n
+\terr = err // TODO(adonovan): fix: adapt concrete err to interpreted iface (e.g. call interpreted errors.New)\n
+\treturn iface{}\n
+}\n+\n+func ext۰syscall۰Write(fn *ssa.Function, args []value, slots []value) value {\n
+\t// We could emulate syscall.Syscall but it\'s more effort.\n
+\tp := args[1].([]value)\n
+\tb := make([]byte, 0, len(p))\n+\tfor i := range p {\n+\t\tb = append(b, p[i].(byte))\n+\t}\n+\tn, _ := syscall.Write(args[0].(int), b)\n+\terr := iface{} // TODO(adonovan): fix: adapt concrete err to interpreted iface.\n+\treturn tuple{n, err}\n+\n+}\n```

### `src/pkg/exp/ssa/interp/external_windows.go` (新規ファイル)

```diff
--- /dev/null
+++ b/src/pkg/exp/ssa/interp/external_windows.go
@@ -0,0 +1,19 @@
+// Copyright 2013 The Go Authors.  All rights reserved.\n
+// Use of this source code is governed by a BSD-style\n
+// license that can be found in the LICENSE file.\n
+\n
+// +build windows plan9\n
+\n
+package interp\n
+\n
+import (\n
+\t"exp/ssa"\n
+)\n
+\n+func ext۰syscall۰Kill(fn *ssa.Function, args []value, slots []value) value {\n
+\tpanic("syscall.Kill not yet implemented")\n
+}\n+\n+func ext۰syscall۰Write(fn *ssa.Function, args []value, slots []value) value {\n
+\tpanic("syscall.Write not yet implemented")\n
+}\n```

## コアとなるコードの解説

### `external.go`の変更

`external.go`からは、`ext۰syscall۰Kill`と`ext۰syscall۰Write`の具体的な実装が完全に削除されました。これにより、このファイルはOSに依存しない共通のインターフェース定義や、他のプラットフォーム非依存のエミュレーション関数のみを保持するようになりました。

### `external_unix.go`の新規追加

このファイルは、Unix系OS(Linux, macOSなど)向けに`ext۰syscall۰Kill`と`ext۰syscall۰Write`の実装を提供します。
-   `// +build !windows,!plan9`というビルドタグにより、WindowsとPlan 9以外の環境でのみコンパイルされます。
-   `ext۰syscall۰Kill`は、引数からプロセスIDとシグナルを取得し、`syscall.Kill`を呼び出してシグナルを送信します。
-   `ext۰syscall۰Write`は、引数からファイルディスクリプタとバイトスライスを取得し、バイトスライスを`[]byte`に変換した後、`syscall.Write`を呼び出して書き込みを行います。
-   どちらの関数も、エラー処理がまだ完全ではないことを示す`TODO`コメントが含まれています。これは、SSAインタープリタがネイティブのエラー型をインタープリタ内のエラー型に変換する仕組みがまだ未熟であったことを示唆しています。

### `external_windows.go`の新規追加

このファイルは、WindowsおよびPlan 9向けに`ext۰syscall۰Kill`と`ext۰syscall۰Write`のスタブ実装を提供します。
-   `// +build windows plan9`というビルドタグにより、WindowsまたはPlan 9環境でのみコンパイルされます。
-   `ext۰syscall۰Kill`と`ext۰syscall۰Write`のどちらも、関数が呼び出されると`panic("syscall.Kill not yet implemented")`または`panic("syscall.Write not yet implemented")`というメッセージでパニックを発生させます。
-   これは、これらのシステムコールがWindows環境のSSAインタープリタではまだサポートされていないことを明示しており、これらの機能が必要なGoプログラムをWindows上でSSAインタープリタで実行しようとすると、実行時エラーが発生することを示しています。これは一時的な措置であり、将来的にWindows固有の実装が追加される可能性を示唆しています。

この変更により、GoのビルドシステムはターゲットOSに応じて適切なファイルセットを選択し、Windows環境でのビルドエラーを回避しつつ、Unix系環境での既存の機能を維持することが可能になりました。

## 関連リンク

-   Go言語のビルドタグに関する公式ドキュメント: [https://pkg.go.dev/cmd/go#hdr-Build_constraints](https://pkg.go.dev/cmd/go#hdr-Build_constraints)
-   Go言語の`syscall`パッケージ: [https://pkg.go.dev/syscall](https://pkg.go.dev/syscall)
-   Go言語のSSA形式に関する情報 (Go Wiki): [https://go.dev/wiki/SSA](https://go.dev/wiki/SSA)

## 参考にした情報源リンク

-   Go言語の公式ドキュメント
-   Go言語のソースコードリポジトリ
-   Go言語のIssueトラッカーおよびコードレビューシステム (Gerrit)
-   Go言語に関する技術ブログやフォーラム(Go build tags, Go SSA interpreterに関する議論)
-   Wikipedia: Static Single Assignment form```markdown
# [インデックス 15174] ファイルの概要

このコミットは、Go言語の実験的なSSA(Static Single Assignment)形式のインタープリタである`exp/ssa/interp`パッケージにおける、Microsoft Windows環境でのビルドエラーおよび実行時問題の修正を目的としています。具体的には、`syscall.Kill`と`syscall.Write`というシステムコール関連の関数がWindows環境では移植性がなく、問題を引き起こしていたため、これらの関数をプラットフォーム固有のファイルに分離し、Windows環境では一時的に無効化(パニックを発生させる)することで対応しています。

## コミット

commit 5fa6721a311f1a4a71cf88502c44537e519b4787 Author: Alan Donovan adonovan@google.com Date: Fri Feb 8 11:58:24 2013 -0500

exp/ssa/interp: fix MS Windows breakage.

syscall.{Kill,Write} are not portable to MS Windows, so we
disable them for now.

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

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

[https://github.com/golang/go/commit/5fa6721a311f1a4a71cf88502c44537e519b4787](https://github.com/golang/go/commit/5fa6721a311f1a4a71cf88502c44537e519b4787)

## 元コミット内容

このコミットは、`exp/ssa/interp`パッケージ内の`external.go`ファイルに定義されていた`ext۰syscall۰Kill`および`ext۰syscall۰Write`関数が、Microsoft Windows環境で正しく動作しない、あるいはビルドできない問題に対処しています。これらの関数は、GoのSSAインタープリタが外部のシステムコールをエミュレートするために使用されていましたが、`syscall`パッケージの特定の関数(`syscall.Kill`と`syscall.Write`)がOS間で互換性がなかったため、Windowsでの「破損」を引き起こしていました。

## 変更の背景

Go言語はクロスプラットフォーム対応を重視していますが、低レベルのシステムコールを扱う`syscall`パッケージの関数は、オペレーティングシステムによってその振る舞いや利用可能性が大きく異なります。特に、プロセスへのシグナル送信を行う`syscall.Kill`や、ファイルディスクリプタへの書き込みを行う`syscall.Write`は、Unix系システムとWindowsシステムで実装が大きく異なります。

`exp/ssa/interp`は、GoプログラムのSSA形式を解釈・実行するための実験的なインタープリタであり、その性質上、Goプログラムが呼び出す可能性のある様々な関数(組み込み関数、標準ライブラリ関数、システムコールなど)をエミュレートまたは直接呼び出す必要があります。しかし、`external.go`に直接記述されていた`syscall.Kill`と`syscall.Write`のエミュレーションコードは、Unix系システムを前提としたものであり、Windows環境ではコンパイルエラーや実行時エラーを引き起こしていました。

この「破損」を修正するため、開発者はこれらのOS依存性の高い関数を、Goのビルドタグ(build tags)を用いてプラットフォームごとに分離することを決定しました。これにより、Windows環境ではこれらの関数が一時的に無効化され、ビルドと実行が可能になります。

## 前提知識の解説

### Go言語のSSA (Static Single Assignment) 形式

SSA形式は、コンパイラ最適化において非常に重要な中間表現(IR)の一つです。SSA形式では、各変数が一度だけ代入されるようにプログラムが変換されます。これにより、データフロー解析や最適化が容易になります。Go言語のコンパイラも内部的にSSA形式を利用しており、`exp/ssa`パッケージは、このSSA形式をプログラムで操作・解析するための実験的なAPIを提供します。

### `exp/ssa/interp`パッケージ

`exp/ssa/interp`パッケージは、`exp/ssa`パッケージで生成されたSSA形式のGoプログラムを解釈・実行するインタープリタです。これは、コンパイルせずにGoコードの動作を検証したり、デバッグしたりする際に役立ちます。インタープリタは、Goプログラムが呼び出す様々な関数(特に標準ライブラリやシステムコール)をエミュレートするか、ホストOSのネイティブ関数を呼び出す必要があります。

### Go言語のビルドタグ (Build Tags)

Go言語には、特定のファイルが特定の環境でのみコンパイルされるように制御する「ビルドタグ」という機能があります。ソースファイルの先頭に`// +build tagname`のようなコメントを記述することで、そのファイルがコンパイルされる条件を指定できます。

-   `// +build windows`: Windows環境でのみコンパイル。
-   `// +build linux darwin`: LinuxまたはmacOS環境でのみコンパイル。
-   `// +build !windows`: Windows以外の環境でコンパイル。
-   `// +build windows,plan9`: WindowsまたはPlan 9環境でコンパイル。

この機能は、OS固有のコードやアーキテクチャ固有のコードを記述する際に非常に有用です。

### `syscall`パッケージ

`syscall`パッケージは、Goプログラムからオペレーティングシステムの低レベルなシステムコールにアクセスするためのインターフェースを提供します。これにより、ファイル操作、プロセス管理、ネットワーク通信など、OSカーネルが提供する機能に直接アクセスできます。しかし、システムコールはOSに強く依存するため、`syscall`パッケージ内の関数はOSによって実装が異なったり、利用できなかったりすることがあります。

-   **`syscall.Kill`**: プロセスにシグナルを送信するシステムコール。Unix系ではプロセスIDとシグナル番号を指定しますが、Windowsでは異なるAPI(例: `TerminateProcess`)を使用します。
-   **`syscall.Write`**: ファイルディスクリプタにデータを書き込むシステムコール。

## 技術的詳細

このコミットの技術的解決策は、Goのビルドタグを巧みに利用して、OS固有のコードパスを分離することにあります。

1.  **`external.go`からの関数削除**: 元々`external.go`に一元的に記述されていた`ext۰syscall۰Kill`と`ext۰syscall۰Write`の実装が削除されました。これにより、このファイルはプラットフォーム非依存の共通部分のみを含むようになります。

2.  **`external_unix.go`の新規作成**:
    -   このファイルには`// +build !windows,!plan9`というビルドタグが付与されています。これは、「WindowsでもPlan 9でもない環境」(つまり、Linux、macOSなどのUnix系システム)でのみこのファイルがコンパイルされることを意味します。
    -   このファイルには、元の`external.go`にあった`ext۰syscall۰Kill`と`ext۰syscall۰Write`のUnix系システム向けの実装がそのまま移動されました。これらの実装は、Goの`syscall`パッケージの`syscall.Kill`と`syscall.Write`を直接呼び出しています。

3.  **`external_windows.go`の新規作成**:
    -   このファイルには`// +build windows plan9`というビルドタグが付与されています。これは、「WindowsまたはPlan 9環境」でのみこのファイルがコンパイルされることを意味します。
    -   このファイルには、`ext۰syscall۰Kill`と`ext۰syscall۰Write`のスタブ実装が記述されています。これらのスタブは、関数が呼び出された際に`panic`(パニック)を発生させるようになっています。これは、Windows環境ではこれらのシステムコールがまだ適切にエミュレートされていない、あるいはサポートされていないことを示しており、将来的な実装の必要性を示唆しています。

このアプローチにより、GoコンパイラはターゲットOSに応じて適切な`external_*.go`ファイルを選択してコンパイルするため、Windows環境では`syscall.Kill`と`syscall.Write`の非互換な実装がコンパイルされなくなり、ビルドエラーが解消されます。同時に、Unix系システムでは既存の機能が維持されます。

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

### `src/pkg/exp/ssa/interp/external.go`

```diff
--- a/src/pkg/exp/ssa/interp/external.go
+++ b/src/pkg/exp/ssa/interp/external.go
@@ -1,3 +1,7 @@
+// Copyright 2013 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
 package interp
 
 // Emulated functions that we cannot interpret because they are
@@ -173,26 +177,6 @@ func ext۰syscall۰Getpid(fn *ssa.Function, args []value, slots []value) value {
 	return syscall.Getpid()
 }
 
-func ext۰syscall۰Kill(fn *ssa.Function, args []value, slots []value) value {
-// We could emulate syscall.Syscall but it\'s more effort.
-err := syscall.Kill(args[0].(int), syscall.Signal(args[1].(int)))
-err = err // TODO(adonovan): fix: adapt concrete err to interpreted iface (e.g. call interpreted errors.New)
-return iface{}
-}
-
-func ext۰syscall۰Write(fn *ssa.Function, args []value, slots []value) value {
-// We could emulate syscall.Syscall but it\'s more effort.
-p := args[1].([]value)
-b := make([]byte, 0, len(p))
-for i := range p {
-b = append(b, p[i].(byte))
-}
-n, _ := syscall.Write(args[0].(int), b)
-err := iface{} // TODO(adonovan): fix: adapt concrete err to interpreted iface.
-return tuple{n, err}
-
-}
-
 // The set of remaining native functions we need to implement (as needed):
 
 // bytes/bytes.go:42:func Equal(a, b []byte) bool

src/pkg/exp/ssa/interp/external_unix.go (新規ファイル)

--- /dev/null
+++ b/src/pkg/exp/ssa/interp/external_unix.go
@@ -0,0 +1,32 @@
+// Copyright 2013 The Go Authors.  All rights reserved.\n
+// Use of this source code is governed by a BSD-style\n
+// license that can be found in the LICENSE file.\n
+\n
+// +build !windows,!plan9\n
+\n
+package interp\n
+\n
+import (\n
+\t"exp/ssa"\n
+\t"syscall"\n
+)\n
+\n
+func ext۰syscall۰Kill(fn *ssa.Function, args []value, slots []value) value {\n
+\t// We could emulate syscall.Syscall but it\'s more effort.\n
+\terr := syscall.Kill(args[0].(int), syscall.Signal(args[1].(int)))\n
+\terr = err // TODO(adonovan): fix: adapt concrete err to interpreted iface (e.g. call interpreted errors.New)\n
+\treturn iface{}\n
+}\n+\n+func ext۰syscall۰Write(fn *ssa.Function, args []value, slots []value) value {\n+\t// We could emulate syscall.Syscall but it\'s more effort.\n
+\tp := args[1].([]value)\n
+\tb := make([]byte, 0, len(p))\n+\tfor i := range p {\n+\t\tb = append(b, p[i].(byte))\n+\t}\n+\tn, _ := syscall.Write(args[0].(int), b)\n+\terr := iface{} // TODO(adonovan): fix: adapt concrete err to interpreted iface.\n+\treturn tuple{n, err}\n+\n+}\n```

### `src/pkg/exp/ssa/interp/external_windows.go` (新規ファイル)

```diff
--- /dev/null
+++ b/src/pkg/exp/ssa/interp/external_windows.go
@@ -0,0 +1,19 @@
+// Copyright 2013 The Go Authors.  All rights reserved.\n
+// Use of this source code is governed by a BSD-style\n
+// license that can be found in the LICENSE file.\n
+\n
+// +build windows plan9\n
+\n
+package interp\n
+\n
+import (\n
+\t"exp/ssa"\n
+)\n
+\n+func ext۰syscall۰Kill(fn *ssa.Function, args []value, slots []value) value {\n
+\tpanic("syscall.Kill not yet implemented")\n
+}\n+\n+func ext۰syscall۰Write(fn *ssa.Function, args []value, slots []value) value {\n
+\tpanic("syscall.Write not yet implemented")\n
+}\n```

## コアとなるコードの解説

### `external.go`の変更

`external.go`からは、`ext۰syscall۰Kill`と`ext۰syscall۰Write`の具体的な実装が完全に削除されました。これにより、このファイルはOSに依存しない共通のインターフェース定義や、他のプラットフォーム非依存のエミュレーション関数のみを保持するようになりました。

### `external_unix.go`の新規追加

このファイルは、Unix系OS(Linux, macOSなど)向けに`ext۰syscall۰Kill`と`ext۰syscall۰Write`の実装を提供します。
-   `// +build !windows,!plan9`というビルドタグにより、WindowsとPlan 9以外の環境でのみコンパイルされます。
-   `ext۰syscall۰Kill`は、引数からプロセスIDとシグナルを取得し、`syscall.Kill`を呼び出してシグナルを送信します。
-   `ext۰syscall۰Write`は、引数からファイルディスクリプタとバイトスライスを取得し、バイトスライスを`[]byte`に変換した後、`syscall.Write`を呼び出して書き込みを行います。
-   どちらの関数も、エラー処理がまだ完全ではないことを示す`TODO`コメントが含まれています。これは、SSAインタープリタがネイティブのエラー型をインタープリタ内のエラー型に変換する仕組みがまだ未熟であったことを示唆しています。

### `external_windows.go`の新規追加

このファイルは、WindowsおよびPlan 9向けに`ext۰syscall۰Kill`と`ext۰syscall۰Write`のスタブ実装を提供します。
-   `// +build windows plan9`というビルドタグにより、WindowsまたはPlan 9環境でのみコンパイルされます。
-   `ext۰syscall۰Kill`と`ext۰syscall۰Write`のどちらも、関数が呼び出されると`panic("syscall.Kill not yet implemented")`または`panic("syscall.Write not yet implemented")`というメッセージでパニックを発生させます。
-   これは、これらのシステムコールがWindows環境のSSAインタープリタではまだサポートされていないことを明示しており、これらの機能が必要なGoプログラムをWindows上でSSAインタープリタで実行しようとすると、実行時エラーが発生することを示しています。これは一時的な措置であり、将来的にWindows固有の実装が追加される可能性を示唆しています。

この変更により、GoのビルドシステムはターゲットOSに応じて適切なファイルセットを選択し、Windows環境でのビルドエラーを回避しつつ、Unix系環境での既存の機能を維持することが可能になりました。

## 関連リンク

-   Go言語のビルドタグに関する公式ドキュメント: [https://pkg.go.dev/cmd/go#hdr-Build_constraints](https://pkg.go.dev/cmd/go#hdr-Build_constraints)
-   Go言語の`syscall`パッケージ: [https://pkg.go.dev/syscall](https://pkg.go.dev/syscall)
-   Go言語のSSA形式に関する情報 (Go Wiki): [https://go.dev/wiki/SSA](https://go.dev/wiki/SSA)

## 参考にした情報源リンク

-   Go言語の公式ドキュメント
-   Go言語のソースコードリポジトリ
-   Go言語のIssueトラッカーおよびコードレビューシステム (Gerrit)
-   Go言語に関する技術ブログやフォーラム(Go build tags, Go SSA interpreterに関する議論)
-   Wikipedia: Static Single Assignment form