2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

呼び出し規約ABI比較:System V vs Windows ABI

Posted at

"違いを知ることは、設計の自由を知ることだ。"

関数呼び出し規約(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。
それぞれが歩んだ道は異なる。
だがどちらも、その文化圏における設計哲学の結晶である。

  • どちらが正しいわけでも、優れているわけでもない
  • 選択は、設計者の目的と世界観に依存する

"設計とは、選択の連続であり、文化の反映である。呼び出し規約は、その沈黙の文化をコードに刻む、静かな契約である。"

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?