Shim
From Wikipedia, the free encyclopedia

shimとは、コンピュータプログラミングにおいて、透過的にAPI呼び出しを傍受し、渡される引数を変更したり、操作自体を処理したり、他の場所へ操作をリダイレクトするライブラリである[1][2]。shimは、新しい環境で古いAPIをサポートするため、あるいは古い環境で新しいAPIをサポートするために使用されることがある。また、開発されたソフトウェアプラットフォームとは異なるプラットフォーム上でプログラムを実行するためにも使用される。
古いAPI用のshimは、通常APIの動作が変更されたことで、従来の機能に依存していた古いアプリケーションが互換性の問題を起こすときに登場する。このような場合、古いAPIは新しいコードの上に薄い互換レイヤーを設けることでサポートされ得る。新しいAPI用のshimは「その環境の手段のみを用いて、新しいAPIを古い環境にもたらすライブラリ」と定義される[3]。
Webのポリフィルは、特定のウェブブラウザで新しいウェブ標準が利用できない場合に、古い標準やJavaScriptを用いて新しい標準を実装する[3]。
AppleTalkのサポートは、Macコンピュータにおいて、AppleがOpen Transportネットワークシステムを短期間サポートしていた時期に実現された。何千ものMac用プログラムがAppleTalkプロトコルに基づいており、これらをサポートするためにAppleTalkはOpen Transportの「スタック」として再実装され、さらにこの新しいライブラリ上にAPI shimとして再実装された。
Microsoft WindowsのApplication Compatibility Toolkit (ACT) では、この用語は後方互換ライブラリを意味する。shimは、古いバージョンのWindowsに依存するレガシーアプリケーションのために、古いバージョンの動作をシミュレートしたり、変更されていないAPIの呼び出し方法が不適切なアプリケーションに対処したりする。たとえば、最小特権ユーザーアカウント (LUA)に関連するバグを修正する目的で用いられる[4]。
bind.soは、Linux用のshimライブラリであり、任意のアプリケーションが、権限にかかわらず、リッスンソケットへのバインドや送信元IPアドレスの指定を可能にする[5]。これは、任意のプログラムにshimや他のライブラリを読み込むことができるLD_PRELOADメカニズムを利用している。
「type tunnel」パターンにおいては、汎用のインターフェース層が一連のshimを利用して、異種の型集合を基盤となるAPIが使用する単一のプリミティブ型に変換する[6]。