コンピューティングにおいて、抽象化レイヤーまたは抽象化レベルとは、サブシステムの動作の詳細を隠蔽する方法です。抽象化レイヤーを使用するソフトウェアモデルの例としては、ネットワークプロトコルのOSIモデル、OpenGL、その他のグラフィックスライブラリなどがあり、これらは関心の分離を可能にし、相互運用性とプラットフォーム非依存性を促進します。
コンピュータサイエンスにおいて、抽象化レイヤーとは、特定の実装から切り離された概念モデルまたはアルゴリズムの一般化です。これらの一般化は、さまざまな特定の実装に存在する類似性を表現するモデルによって最もよくカプセル化される広範な類似性から生じます。優れた抽象化レイヤーによって提供される簡素化は、有用な概念または設計パターンを抽出することで、それを正確に適用できる状況を迅速に認識できるようにし、容易な再利用を可能にします。下位レベルの要素を構成要素に組み合わせるだけでは、その根底にある複雑さからユーザーを保護しない限り、抽象化レイヤーとはみなされません。[ 1 ]
ある層が別の層に依存している場合、その層は別の層の上に位置しているとみなされます。各層は上位の層がなくても存在できますが、機能するためには下位の層が必要です。多くの場合、抽象化層は階層構造を形成します。OSIモデルは7つの抽象化層で構成されています。モデルの各層は、デジタル通信のニーズの異なる部分をカプセル化して処理することで、関連するエンジニアリングソリューションの複雑さを軽減します。
デイビッド・ウィーラーの有名な格言に、「コンピュータ科学におけるすべての問題は、間接化のレベルをもう1つ増やすことで解決できる」というものがあります。 [ 2 ]これはしばしば意図的に誤って引用され、「間接化」の代わりに「抽象化」が使われます。また、バトラー・ランプソンに誤って帰属されることもあります。ケブリン・ヘニーのこの格言の系は、「…間接化の層が多すぎるという問題を除いて」です。[ 3 ]
コンピュータアーキテクチャでは、コンピュータシステムは通常、次のような複数の抽象化レベルで構成されていると表現されます。
プログラマブルロジックはハードウェアの一部とみなされることが多いが、論理定義はデバイスのソフトウェアまたはファームウェアの一部とみなされることもある。ファームウェアには低レベルソフトウェアのみが含まれる場合もあれば、オペレーティングシステムやアプリケーションを含むすべてのソフトウェアが含まれる場合もある。ソフトウェア層はさらに、ハードウェア抽象化層、物理的および論理的なデバイスドライバ、ファイルシステムなどのリポジトリ、オペレーティングシステムカーネル、ミドルウェア、アプリケーションなどに分割できる。また、VHDL、マシン語、アセンブリ言語などの低レベルプログラミング言語と、コンパイル言語、インタプリタ、またはスクリプト言語を区別することもできる。[ 4 ]
Unixオペレーティングシステムでは、ほとんどの種類の入出力操作は、デバイスから読み取られる、またはデバイスに書き込まれるバイトストリームとして扱われます。このバイトストリームモデルは、デバイス非依存性を実現するために、ファイルI/O、ソケットI/O、および端末I/Oに使用されます。アプリケーションレベルでデバイスへの読み書きを行うには、プログラムはデバイスを開く関数を呼び出します。デバイスは、端末などの実デバイス、またはネットワークポートやファイルシステム内のファイルなどの仮想デバイスの場合があります。デバイスの物理的な特性はオペレーティングシステムによって制御され、オペレーティングシステムはプログラマがデバイスとの間でバイトの読み書きを可能にする抽象インターフェースを提供します。その後、オペレーティングシステムは、デバイスへのバイトストリームの読み書きに必要な実際の変換を実行します。
OpenGLなどのほとんどのグラフィックスライブラリは、インターフェースとして抽象的なグラフィックデバイスモデルを提供します。ライブラリは、プログラマが提供するコマンドを、グラフィック要素やオブジェクトを描画するために必要な特定のデバイスコマンドに変換する役割を担います。プロッタの特定のデバイスコマンドはCRTモニターのデバイスコマンドとは異なりますが、グラフィックスライブラリは、グラフィックオブジェクトの描画に一般的に役立つ一連のプリミティブを提供する抽象的なインターフェースを提供することで、実装やデバイス固有の詳細を隠蔽します。