システムレイヤーに関する世界観です。
プログラミングにおいては、よく「高水準」とか「低水準」といった言葉で、「レイヤー分け」という考え方が行われる。
たとえば、以下はGNOMEで使われているGTKのレイヤー。
ここでは、以下のようなレイヤーがあることが分かる。
レイヤー | コンポーネント |
---|---|
高水準 | GNOME(デスクトップ環境・アプリケーション) GTK(ウィジェットツールキット) |
中水準 | Pango(多言語テキスト表示) GDK(ピクセルグラフィックス描画) ATK(アクセシビリティ) GIO(IO・仮想ファイルシステム) |
低水準 | Cairo(ベクターグラフィックス描画) GLib(型・オブジェクト指向) |
ディスプレイサーバ | Xlib(X11) Wayland(ディスプレイサーバ) Linux(カーネル) |
詳しくはGTKを参照のこと。
まず、高水準・低水準とは、多くの場合、「よりマシンに近いか」「よりユーザーのやりたいことや機能に近いか」といったことから使われる言葉である。
たとえば、Linuxカーネルは比較的低水準のレイヤーである。マシンのデバイスコントローラの情報はデバイスドライバが唯一知っていて、それをカーネルが使って操作する。
カーネルの移植性の低い低水準のコードは、機種依存のi-nodeを直接操作するストレージ操作や、TCP/UDPを用いたプロトコル(送受信の手順や決まり)やコネクション操作とルーティングやパケット送受信操作などがあり、これの少し上に、移植性の少し高いVFSを用いたファイルシステムや、socketを用いたネットワークの高水準な機能があり、それらを行うことで、「カーネルレベル」の操作を行う。
カーネル内部の処理よりも高水準なのは、システムコールである。カーネルはシステムコールを受け付け、プログラマはシステムコールを使ってカーネルに新しいサービスをお願いする。
少し上の水準では、Cライブラリの水準がある。コマンドやデーモンなどは、Cライブラリとシステムコールをバランスよく使いながら、移植性の少し高いコードを書く。
さらに上には、シェルによってコマンド操作をするユーザーフレンドリな環境があり、シェルスクリプトなどは単純なスクリプト処理を行う。
GUI環境であれば、こうしたUNIX環境の上に、X11 - Xlib - GTK - GNOMEなどの高水準なシステムプログラムがある。
X11では、低レベルなウィンドウの表示操作や、マウスやキーボードやディスプレイの間でのビットマップ表示操作を行う。XはXプロトコルでXサーバーとXクライアントの間で通信を行う。Xlibを用いることで、Xプロトコルの詳細を知らなくても、簡単なライブラリAPIでXのプログラマブルな操作ができる。さらにメニューやボタンを実現し、コンテナやボックスの概念を導入し、強力なオブジェクト指向と使いやすいシグナルインターフェースを使うことのできるGTKがあり、GTKはGLibやGDKの上のレイヤーで成り立つ。GTKを使って作られたデスクトップ環境がGNOMEであり、この上にGNOMEアプリケーションが動く。
KDEであればX11 - Qt - KDE Frameworks - Plasmaとなる。
この上でユーザーはユーザーフレンドリなGUIアプリケーションを実行する。たとえばMozilla FirefoxやLibreOfficeなどである。
サーバープログラムであれば、ApacheなどのWebサーバーや、JavaやRubyなどのミドルウェアの上に、CGIやRailsなどのAPサーバーがあり、MySQLやPostgreSQLなどのDBサーバーがある。
このように、コンピュータでは「低水準から高水準へ」という考え方の下で、システムが成立している。自分がどのような水準のプログラムを書きたいかという目線から、どれくらいの水準でソフトウェアを開発するかを考える必要がある。