C ライブラリでは、異なるバージョンまたは (場合によっては) 異なるコンパイラでコンパイルされたライブラリを混在させても問題が発生することはほとんどないように思われます。また、多くの言語は、C ライブラリと直接または最小限の労力でインターフェイスできるようです。
これはABIが標準だからですか?
ABI は、言語標準では体系化されていません。C 標準ドラフトのいずれかのコピーを取得して、自分で確認することができます。
また、ABI が標準に含まれていないのには十分な理由があります。この標準は、C コンパイラを実装できるすべてのハードウェアと OS を予測することはできません。
ABI は間違いなく標準ではありません。少なくとも、C 標準にはありません。各オペレーティング システムまたはツール チェーンはこれらのことを指定しますが、言語自体は指定しません。たとえば、Linux マシンで Windows プログラムを実行してみてください。
ABIは、オペレーティングシステムやツールチェーンによって定義されており、標準では定義されていません。たとえば、パラメータが関数呼び出しに渡される方法を定義します。スタックフレームのレイアウト、またはシステムコールの呼び出し方法。
ほとんどの言語がCライブラリとインターフェイスできる理由は、ほとんどのオペレーティングシステムが(多かれ少なかれ)Cで記述されており、CライブラリをAPIとして公開し、それに基づいてABIを定義しているためです。また、特定の言語で記述されたライブラリが特定のOSとインターフェイスする場合は、このOSのABIとインターフェイスできる必要があります。
ABIはC標準の一部ではありません。しかし、ABIを標準化するための努力がなされてきました。「 Linuxシステムプログラミング」からの引用:
複数のオペレーティングシステム(特にUnixシステム上のi386)で、特定のアーキテクチャに対して単一のABIを定義する試みがいくつか行われていますが、その取り組みはあまり成功していません。代わりに、オペレーティングシステム(Linuxを含む)は、適切と思われる方法で独自のABIを定義する傾向があります。