言語の相互運用性とは、2つの異なるプログラミング言語が同じシステムの一部としてネイティブに相互作用し、同じ種類のデータ構造を操作する能力のことです。 [ 1 ]
プログラミング言語同士が相互運用できる方法は数多くあります。HTML 、CSS、JavaScriptは、 Webページで連携して使用されるため相互運用可能です。オブジェクト指向言語の中には、共有ホスト仮想マシンのおかげで相互運用可能なものもあります(例:共通言語ランタイムの.NET CLI準拠言語とJava仮想マシンのJVM準拠言語)。[ 2 ]
オブジェクトモデルとは、オブジェクトを言語に依存しない方法で表現できるようにする標準化されたモデルであり、同じオブジェクトを複数のプログラムや言語で使用できるようにするためのものです。CORBAとCOMは、最も普及しているオブジェクトモデルです。

仮想マシン (VM) は、複数の異なる言語がコンパイルされる特殊な中間言語です。同じ仮想マシンを使用する言語は、メモリ モデルとコンパイラを共有するため相互運用が可能であり、したがって、ある言語のライブラリを同じ VM 上の他の言語で再利用できます。VM は、参加する言語の正しさを保証し、言語に型情報の共通基盤を提供する型システムを組み込むことができます。コンパイルまたは解釈中に中間言語を使用することで、最適化の機会が増えます。[ 1 ]

外部関数インターフェース(FFI)を使用すると、ある言語で書かれたプログラムから別の言語で書かれた関数を呼び出すことができます。型や実行モデルの違いなど、外部関数をホスト言語で書かれた関数として単純に扱うことができない場合がよくあります。FFIを使用すると、ホスト言語で別の言語のライブラリの機能を提供するラッパーライブラリを構築できます。多くの場合、その言語により適したスタイルで記述できます。ほとんどの言語には、今日のプログラミングの共通語であるC言語へのFFIが用意されています。
オブジェクト指向言語は、データのコンテナとコードをペアにしようと試みますが、各言語がそれを行う方法を選択する方法は若干異なる場合があります。これらの設計上の決定は、必ずしも他の言語に簡単にマッピングできるとは限りません。たとえば、多重継承を許可する言語で多重継承を使用するクラスは、多重継承を許可しない言語にうまく変換できません。この問題に対する一般的なアプローチは、別の言語の機能と互換性のある言語のサブセットを定義することです。[ 3 ]このアプローチでは、サブセット外の機能を使用するコードが相互運用できるようにするには、そのインターフェースの一部をサブセットで理解できるクラスにラップする必要があります。
プログラミング言語におけるメモリ解放の処理方法の違いも、相互運用性を実現しようとする際の課題の一つです。自動解放を行う言語は、手動解放を行う言語とはうまく相互運用できず、決定論的な破棄を行う言語は、非決定論的な破棄を行う言語とは互換性がありません。言語の制約に基づいて、これらの異なる動作を橋渡しするための様々な戦略が存在します。例えば、通常は手動解放を行うC++プログラムは、解放動作を変更してオブジェクトを削除するもののメモリを解放しないようにすることで、Javaスタイルのガベージコレクタと相互運用できます。この場合、ガベージコレクタがメモリを安全に解放するためには、各オブジェクトを手動で解放する必要があります。
純粋関数型言語と手続き型言語の相互運用性を実現しようとすると、可変性が問題となる。Haskellのような言語には可変型がなく、C++もそのような厳密な保証を提供していない。多くの関数型をオブジェクト指向言語にブリッジした場合、基となるオブジェクトが変更されないことを保証できない。
{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)