注目★★★★★Lobsters
API と ABI、何が違う?ライブラリ互換性の本質
30秒で把握
- 1API はソースコード インターフェース、ABI はバイナリ実行インターフェース、両者は独立して破壊される可能性がある
- 2ABI 破壊時はライブラリのソネーム変更で依存関係を明示、API 破壊は開発者にソースコード修正を強制するため回避すべき
- 3Debian 等のディストリビューション では .shlibs ファイルで ABI 互換性の有無を記録し、パッケージ依存性を自動解決する
要約
API はソースコード レベルのインターフェースで、関数名・引数・戻り値の定義を意味する。ABI はコンパイル後のバイナリが見る実行時インターフェースで、メモリレイアウト・スタック上の引数配置・ポインタサイズなど機械レベルの詳細を指す。ライブラリ更新時、API 互換性を保ちながら ABI を破壊することもあり、その場合は古いバイナリが動作しなくなる。ABI を破壊する場合、Debian ではライブラリのソネーム (例: libc.so.6) を変更し、新しいバイナリインターフェースが導入された時点で依存関係を更新する。API の後方互換性を破壊するのは悪い実践だが、GNOME や KDE などのメジャーライブラリでは発生することもある。
あなたへの影響
C/C++ ライブラリを自社で提供・管理するチームは API と ABI 変更の影響範囲を明確に分離し、バージョニング戦略に反映させるべき。
推奨:特に Linux ディストリビューション上で複数プロジェクトが同じライブラリに依存する場合、ABI 互換性の維持が重要になる。