shimについて
コンピュータプログラミングにおける「shim」とは、API呼び出しを透過的に傍受し、そこに渡される引数を変更、操作したり、他の処理へリダイレクトする役割を持つ
ライブラリのことです。これは、新しい環境で古いAPIを利用可能にしたり、あるいは古い環境でも新しいAPIをサポートするために用いられることがあります。また、発展したソフトウェアプラットフォームとは異なるプラットフォームでプログラムを実行するためにも使用されます。
shimの利用シーン
特に古いAPIをサポートするためのshimは、APIの動作の変更によって、以前の機能に依存していたアプリケーションで互換性の問題が生じる場合に重要です。このような状況では、古いAPIの上に一種の互換性レイヤーを設けることで、古いアプリケーションが新しいシステム上でも動作するように保持されます。これにより、古いシステムや環境での円滑な運用が可能になります。
一方で、新しいAPI用のshimは、特定の環境での手段を用いて、新しいAPIを古い環境に持ち込むための
ライブラリとして機能します。
実際の例
具体的な例として、Webのポリフィルが挙げられます。これは特定のウェブブラウザで新しい
ウェブ標準が使えないとき、古い標準や
JavaScriptを使って新しい標準を実装するものです。また、
AppleTalkのサポートは、Macコンピュータで
Appleが
Open Transportネットワークシステムを短期間支えた例です。この時、
AppleTalkは古いプログラムを支えるために
Open Transportの「スタック」として再実装された上で、さらにAPI shimとして展開されました。
Microsoft WindowsにおけるApplication Compatibility Toolkit (ACT)では、この用語は後方互換
ライブラリとして解釈されます。この場合、shimは古いバージョンのWindowsに依存するアプリケーションに対して、その古い動作を仮想的にシミュレートします。特に、最小特権ユーザーアカウント (LUA)に起因する問題を解決するために利用されることがあります。
Linuxにおいては、bind.soというshim
ライブラリが存在します。この
ライブラリは任意のアプリケーションが、権限にかかわらずリッスンソケットへのバインドや送信元IPアドレスの指定をできるようにします。この特性は、LD_PRELOADというメカニズムを利用して、任意のプログラムにshimや他の
ライブラリを読み込ませることで実現されています。
さらに、プログラミングにおける「type tunnel」パターンでは、汎用のインターフェース層が一連のshimを駆使して、異なる型を基にしたAPIが単一のプリミティブ型を使用できるように変換する役割も果たしています。
まとめ
shimは、プログラミング環境において非常に重要な役割を果たしています。APIの互換性を維持することで、古いアプリケーションのサポートを続け、新しいテクノロジーの導入を円滑にするための役立つツールです。