Go Wiki: AssemblyPolicy
このドキュメントでは、Go の暗号パッケージにアセンブリコードを追加する時期と方法について説明します。
一般的なルールは次のとおりです。
- アセンブリではなく、ポータブルな Go を優先します。アセンブリのコードは、N 個のパッケージではなく、(N 個のパッケージ * M 個のアーキテクチャ) を維持することを意味します。
- アセンブリの使用を最小限に抑えます。55% の速度向上に 2 倍のアセンブリを使用するよりも、50% の速度向上に少量のアセンブリを使用することを望みます。コミットメッセージでアセンブリ/Go の境界をどこに設定したかの決定を説明し、ベンチマークで裏付けます。
- スタンドアロンの Go プログラム、または avo のような
go get可能なプログラムのいずれかを使用して、自明でない量のアセンブリを生成するには、より高レベルのプログラムを使用します。その他の再現可能なプロセス (形式的に検証されたコードジェネレーターなど) の出力も考慮されます。実装戦略については、事前に課題トラッカーで議論してください。 - Go で記述された高レベルロジックから呼び出される、小さく、テスト可能なユニット (25 ~ 75 行) を使用します。Go で記述されたロジックから呼び出される小さく、テスト可能な関数が遅すぎる場合は、Go と互換性のあるラッパーを持つ小さく、テスト可能なアセンブリユニットを使用し、Go テストが個々のユニットをテストできるようにします。
- すべてのアセンブリ関数には、アセンブリと並行してテストされる参照 Go 実装が必要です。TargetSpecific に従って構造とテストのプラクティスを行います。
- プラットフォームが根本的に異なる機能 (高レベルの暗号化命令など) を持たない限り、アセンブリユニットと参照 Go 実装のインターフェースはアーキテクチャ間で同じでなければなりません。
- Go セキュリティチームが明示的に特定の implemention の所有を約束しない限り、外部の貢献者がその維持を約束する必要があります。変更が必要な場合 (たとえば、より広範なリファクタリングの一部として) で、メンテナーが利用できない場合、アセンブリは削除されます。
- コードは CI でテストする必要があります。つまり、命令をサポートするビルダーが必要であり、複数の (またはフォールバック) パスがある場合は、それらを個別にテストする必要があります。(ヒント: CPU 機能の検出を無効にするには
GODEBUG=cpu.X=offを使用します。) - コンパイラの改善に伴い再評価できるように、実装がアセンブリを必要とする理由 (特定のパフォーマンス上の利点、命令へのアクセスなど) を Go コードに文書化します。
現在標準ライブラリにあるすべてのアセンブリがこのポリシーに準拠しているわけではありません。既存のアセンブリの変更は、その実装が準拠するように更新されるまで推奨されません。新しいアセンブリは準拠している必要があります。
このコンテンツはGo Wikiの一部です。