ABI【Application Binary Interface】
概要

プログラムは通常、ソースコードを書いてコンパイルすることで機械語のプログラムへと変換される。この変換後の実行可能な形態は「バイナリコード」と呼ばれる。ABIは、このバイナリコード同士がどのように連携して動作するかを定義する仕組みで、関数の呼び出し方法、引数や戻り値の受け渡し方、レジスタやスタックの使い方、データ型のサイズやメモリ上での配置方法などを定める。これに従うことで、別々にコンパイルされたプログラムやライブラリでも相互に利用できるようになる。
ABIは特定のCPUアーキテクチャやOSごとに定義されることが多い。例えば、同じプログラムでも、異なるプロセッサや異なるOS環境ではABIが異なる場合がある。ある環境でコンパイルされたバイナリは、ABIが異なる別の環境ではそのまま動作しない。開発者やソフトウェア配布者は、対象とする環境のABIに合わせてプログラムをビルドする必要がある。
様々なプログラムから共通して利用されるライブラリでは、バージョン間のABIの互換性が重要になる。ライブラリの内部実装が変更されてもABIが互換であれば、既存のプログラムを再コンパイルせずにそのまま利用できる、ABIが変更されると、既存のプログラムは新しいライブラリと正常に連携できなくなる。多くのプログラムから参照されるソフトウェアの開発では、ABI互換性の維持が重要な設計上の要素となる。
APIとの違い
ABIはしばしば「API」(Application Programming Interface)と比較される。APIはソースコードレベルでのインターフェースを定義するものであり、どのような関数やクラスを利用できるかを開発者に示すものである。一方、ABIはコンパイル後のバイナリレベルでの互換性を扱うものであり、プログラムの内部表現や実行時の呼び出し規則などを規定する。APIが「どの機能を呼び出せるか」を示すのに対し、ABIは「その呼び出しが機械語レベルでどのように実行されるか」を定めている。