静的リンク
静的リンク(せいてきリンク、英語: static link)とは、コンピュータプログラム作成時において、ライブラリあるいはアプリケーションプログラムのモジュールをビルドする際に、各モジュールに必要なプログラムコードの実体すべてをリンケージエディタによってリンクしてモジュールに含める方式。
コンパイラによってソースコードから生成されたオブジェクトファイルを、リンク時につなぎ合わせ、実行可能形式のバイナリ(実行ファイル)を作成する。
静的リンキング、スタティックリンキングとも言う。
静的リンクの利点としては、モジュール自身に必要なコードが含まれているため自己完結できることや、シンボルの解決が事前に(静的に)実施されるためプログラム実行時のオーバーヘッドがないことなどが挙げられる。ライブラリやアプリケーションの実行モジュールが静的リンクによって単一のバイナリとしてビルドされている場合、配布やインストールが簡単になり、依存関係の管理もしやすい。
静的リンクの欠点としては、例えばライブラリXを独立したモジュールAとモジュールBにそれぞれ静的リンクする場合、各モジュールに重複するコードやデータがあったとしても、それぞれに実体が存在するため総合的なモジュールの合計サイズが大きくなってしまうことや、ライブラリの実装を変更したときに、たとえライブラリのインターフェイスに変更がなくてもプログラムを再リンクする必要があることなどが挙げられる[1]。静的リンクされるコードの量が増えると、ビルド時のリンク時間が増大し、開発サイクルが鈍化する原因となる。また、重複するコードやデータはメモリを圧迫し、キャッシュが頻繁にクリアされることで実行速度が低下する原因にもなる。大多数のユーザーが使わないような雑多な機能に関連する処理(サブルーチン)やデータ(グローバル変数)あるいは他のユーザーインターフェイス (UI) 言語のリソースなども静的リンクによってすべて単一のバイナリに含まれている場合、モジュールがメモリにロードされるとデッドスペースと化してしまう。
なお、静的リンクライブラリは通例処理系ごとに固有のアプリケーションバイナリインタフェース (ABI) に依存する形式となるため、ABI互換のない処理系間で共有・再利用することはできない。異なる処理系や異なるプログラミング言語の間でバイナリコードを再利用する場合、ABI互換性の高いC言語形式のインターフェイスを持つ関数を動的リンクライブラリに公開(エクスポート)する方法が一般的である。この方法はJava Native InterfaceやP/Invokeといった相互運用の仕組みで利用されている。
対義語
[編集]共有ライブラリあるいはダイナミックリンクライブラリ (DLL) にプログラムコードの実体を分割しておき、プログラムの実行開始時にローダによって初めて結合する方式を動的リンクと呼ぶ。動的リンクの利点と欠点は静的リンクの逆となる[2]。