"違いを知ることは、設計の自由を知ることだ。"
関数呼び出し規約(Calling Convention)は、単なる実装細部ではない。
それは、異なる設計文化、異なる歴史、異なる哲学の表れである。
本章では、
現代最も広く使われる二つのABI――
System V ABI(UNIX系)とWindows ABIを比較し、
その設計思想と本質的な違いを深掘りしていく。
まず前提として:ABIとは何か?
ABI(Application Binary Interface)とは:
- 関数の呼び出し方法(引数の受け渡し、戻り値の扱い)
- データ型のサイズと配置(アライメント規則)
- バイナリフォーマット(例:ELF, PE)
などを包括的に定義する、低レベル設計の国際法である。
ABIに従うことで:
- 異なるコンパイラでビルドされたモジュール同士
- 異なる言語で書かれたプログラム同士
が、バイナリレベルで相互運用可能となる。
System V ABI(Unix/Linux系)とは
System V ABIは、主に:
- Linux
- FreeBSD
- macOS
- その他UNIX互換OS
で使用される、UNIX文化圏の標準ABIである。
特徴:
- 引数は最初の6個までレジスタ渡し(x86-64では
RDI, RSI, RDX, RCX, R8, R9
) - それ以降はスタック上に積む
- スタックは16バイト境界にアライメントされる
- 呼び出し側がレジスタ保存を責任持つ(Caller-save中心)
哲学的には、
**「高速性」と「呼び出しコスト削減」**を重視している。
Windows ABI(Microsoft x64 calling convention)とは
Windows ABI(特に64bit版)は、Microsoftが定めた標準であり:
- Windows NT系(Windows 10/11、Windows Server)
- それに準拠する全アプリケーション/ドライバ
で使用される。
特徴:
- 引数は最初の4個までレジスタ渡し(
RCX, RDX, R8, R9
) - それ以降はスタックに置く
- **Shadow Space(32バイト)**を事前にスタック上に確保する
- 呼び出し先がShadow Spaceに必ずアクセスできることを保証
- Callee-save(呼び出される側保存)のレジスタ群が多い(
RBX, RBP, RDI, RSI, R12〜R15
)
哲学的には、
**「堅牢性」と「拡張性」**を強く意識している。
引数渡しの違い
項目 | System V ABI | Windows ABI |
---|---|---|
レジスタ数 | 最大6個 | 最大4個 |
レジスタ順序 | RDI, RSI, RDX, RCX, R8, R9 | RCX, RDX, R8, R9 |
追加引数の渡し方 | スタック(右から左) | スタック(左から右) |
特記事項 | レジスタ優先・高性能志向 | Shadow Spaceによる堅牢設計 |
System Vは高速性と柔軟性、
Windows ABIは予測性と安全性を設計目標にしていることが分かる。
スタックアライメントの違い
System Vでは:
- 関数呼び出し時に16バイト境界にスタックをアラインしなければならない
- SIMD命令(例:SSE, AVX)を考慮した設計
Windows ABIでは:
- 関数エントリ時に、**Shadow Space(32バイト)**を積んだうえで16バイトアライメントを保証する
- 固定レイアウトによる堅牢化を志向
この違いもまた、
**「設計自由度を重視するか」「堅牢性を重視するか」**という設計思想の分岐を示している。
レジスタ保存(Caller-save vs Callee-save)
System Vは:
- 呼び出し側(Caller)が重要なレジスタを保存する文化
- 呼び出される関数は、破壊的にレジスタを使用できる
- 小規模・高速な関数呼び出しを最適化
Windows ABIは:
- 呼び出される側(Callee)が広範囲にレジスタ保存責任を負う
- 呼び出し元にやさしい(レジスタ破壊リスク低減)
- 安定性とモジュール間互換性を強く意識
ここでも、
**「速さを取るか、堅牢さを取るか」**という対照が際立つ。
呼び出し規約選択がもたらす設計への影響
呼び出し規約の違いは:
- 最適化戦略
- クロスプラットフォーム開発難易度
- バイナリ互換性の取り扱い
- システムコールインターフェース設計
などに直結する。
設計者は、
単なる性能指標だけでなく、長期的な保守性や可搬性も視野に入れた選択を迫られる。
結語:呼び出し規約は、文化の結晶である
System VとWindows ABI。
それぞれが歩んだ道は異なる。
だがどちらも、その文化圏における設計哲学の結晶である。
- どちらが正しいわけでも、優れているわけでもない
- 選択は、設計者の目的と世界観に依存する
"設計とは、選択の連続であり、文化の反映である。呼び出し規約は、その沈黙の文化をコードに刻む、静かな契約である。"