アプリケーションバイナリインタフェース

アプリケーションバイナリインタフェース（ABI, ）とは、アプリケーション（ユーザ）プログラムとシステム（オペレーティングシステムやライブラリ）との間の、バイナリレベルのインタフェースである。また、アプリケーション相互間や、それらの部品（プラグイン等）とのバイナリインタフェースもある。

ABIはアプリケーションプログラミングインタフェース (API) とは異なる。APIはソースコードとライブラリ間のインタフェースを定義したものであり、同じAPIをサポートしたシステム間では同じソースコードをコンパイルして利用できる。一方、ABIはオブジェクトコードレベルのインタフェースであり、互換ABIをサポートするシステム間では同じ実行ファイルを変更無しで動作させることができる。

 概要 
ABIには、以下のような定義が含まれる。
 CPU - 命令セット、エンディアンなど。
 データ - データ型、大きさ、配置（アラインメント）など。
 呼出規約 - 関数の引数がどのように渡され、リターン値がどのように渡されるかを定義したもの。
 システムコール - システムコール番号と具体的なシステムコールの仕組み。
 実行ファイルやライブラリの詳細なフォーマット（UNIXならば、COFFやELFなど）。

Intel Binary Compatibility Standard (iBCS) のような完全なABIではIntel Binary Compatibility Standard (iBCS)、オペレーティングシステム (OS) が何であれ必要な共有ライブラリが存在するなどの前提条件が満たされていれば、そのABIをサポートしたシステム間でプログラム（実行ファイル）を全く修正せずに動作させることができる。

他のABIとして例えばC++の名前修飾Itanium C++ ABI (compatible with multiple architectures)や例外の伝播Itanium C++ ABI: Exception Handling (compatible with multiple architectures)や呼出規約があるが、あくまでも同じプラットフォーム上のコンパイラ間のABIであり、プラットフォーム間の互換性までは要求されない。

 EABI 
EABI (Embedded Application Binary Interface) とは、組み込みシステムのソフトウェアについてのファイルフォーマット、データ型、レジスタ使用法、スタックフレームの構成、関数の引数渡し方法などについての規約を意味する。

あるEABIをサポートするコンパイラで生成したオブジェクトコードは、同じEABIをサポートする別のコンパイラで生成したコードと互換性があり、コンパイラが異なっていても同じEABIに対応していればライブラリやオブジェクトコード間でリンク可能である。アセンブリ言語でコードを書く場合でもEABIに準拠するように書けば、他のコードとのリンクが保証される。

EABIと汎用OS向けABIとの主な違いは、アプリケーションのコードでも特権命令の使用が許されている点、ダイナミックリンクが要求されない点（完全に不可能とされている場合もある）、メモリを節約するためスタックフレームをなるべくコンパクトに構成している点が挙げられる。

EABIが広く使われているCPUアーキテクチャとしては、PowerPC"PowerPC Embedded Processors Application Note"、ARMEABI2、MIPSMIPS EABIがある。

EABIの選択は性能に影響することがある。

 ABI共通化の試みとその成果 
Unix系OSでは、同じハードウェアプラットフォーム上で非互換な複数のOSが動作する。

例えばRISCチップにおいては以下のような例がある。
 POWER系 : AIX 5L / Solaris10g / Linux等
 MIPS系 : UX/4800 / Irix 等
 Itanium系 : HP-UX / Linux 等

最も互換Unix系OSが多いのは、IA-32系であろう。それらOS間でABIを定義して相互にアプリケーションが動作できるようにしようという試みがいくつかあった。しかし、そのような計画が成功したことはない。Linuxにおいては、Linux Standard Base（LSB）が同様の試みを行っている（LSBはABI以外にも多くの規定を試みている）。

一方、採用ベンダ数が多く、複数のUnix系OSが乱立していたMIPS系においては、何度もABIの共通化を目指した試みがなされている。

例えば、1990年代中盤〜後半にかけてUNIXワークステーション / サーバにおいて、MIPS系CPUを採用したNEC(UX/4800)、Sony(NEWS)、住友電工（EWS4800などのNECからのOEM品とSUMIStation）、日本タンデムコンピュータ（MIPS系だったNonStopServer）によるOCMP (Open Computing Environment for MIPS Platform) が定義され、シェアの維持など一定の成果を挙げた。OCMPはMIPS-ABIの日本語対応の側面とAPバスの標準化による周辺デバイスの共通化の側面がある。

 脚注 

 関連項目 
 プログラミング (コンピュータ)
 バイナリ
 束縛 (情報工学)
 SWIG

 外部リンク 
 KDE Techbase Policies - リリース毎にバイナリ互換性を失わないための（いくつかの例を交えた）開発経験則のよい解説
 Mac OS X ABI Function Call Guide
 Debian ARM EABI port
 µClib: Motorola 8/16-bit embedded ABI
 AMD64 (x86-64) Application Binary Interface
 Application Binary Interface (ABI) for the ARM Architecture
 MIPS EABI documentation
 Sun Studio 10 Compilers and the AMD64 ABI - いくつかの主要ABIの比較と解説

Category:プログラミング
Category:オペレーティングシステムの仕組み