システムソフトウェア

システムソフトウェア（）は、電子機器類（コンピュータも含む）の基本的な制御や管理を行うためのソフトウェア。
コンピュータのハードウェア管理や制御などを行うソフトウェア全般をまとめて指すための用語（総称）。システムプログラムとも。対比される用語・概念はアプリケーションソフトウェア（応用ソフトウェア）。類似の用語には「基本ソフトウェア」「システム制御ソフトウェア」などもある。

1960年代から使われるようになった用語であり、何を「システムソフトウェア」と呼ぶかは、電子機器の種類やそのメーカーによって異なっており、また時代によっても変化してきており、その境界は明確ではないが、一般論として言えば、ファームウェアやオペレーティングシステム（OS）、ミドルウェアなどの総称として使われており、機器によってはそれらを組み合わせたものもそう呼ばれる。たとえばデバイスドライバ、またプログラミング言語の処理系（つまりコンパイラやインタプリタなど）もそう分類されることは一般的である。とはいえ、PCなど汎用コンピュータ製品では「OS」や「ファームウェア」などとひとつひとつ区別をはっきり付けることが多いため（多くなってきたため）、PCに関してはこれらをまとめてシステムソフトウェアと呼ぶ機会は少なくなっている。（その結果、近年では）テレビ、家庭用ゲーム機など、コンピュータを応用したデジタル機器でよく用いられる用語となっている。

概要 
通常、各アプリケーションプログラムを稼働させるための、よりシステム（ハードウェアなど）に近い、共通的なソフトウェア・プログラムが、システムソフトウェアと呼ばれている。しかしその範囲は、時代やシステムや観点によっても異なる。

初期のコンピューターや、一部の組み込み機器、専用機器などでは、アプリケーションプログラムとシステムソフトウェアは明確に分離されていない。オペレーティングシステムが登場した後でも、当初はユーザーインターフェース、マルチタスク、ネットワーク、ライブラリなどの機能は、アプリケーションプログラムの領域であった。

現在のオペレーティングシステムでも、付属するゲームなどは製品上はオペレーティングシステムの一部だが、技術的にはアプリケーションプログラムである。狭義にはオペレーティングシステムの中でもカーネルがシステムプログラムとされるが、ユーザーインターフェースである各種シェルや、ネットワーク機能なども含める場合もある。また個々のハードウェア用のドライバーは、オペレーティングシステムに付属する場合、ハードウェアまたはアプリケーションソフトウェアに付属する場合、単体販売される場合もある。更にミドルウェアが存在する場合は、オペレーティングシステムの観点からはアプリケーションプログラムの一種であるが、ミドルウェア上のアプリケーションプログラム（ユーザープログラム）の観点からはミドルウェア自体も一種のシステムプログラムである。同様に各種のユーティリティソフトウェアも、オペレーティングシステムから見れば単なるアプリケーションソフトウェアだが、ユーザー（人間）から見ればシステム制御系のものも存在している。

マイクロソフト社に対する独占禁止法訴訟では、ウェブブラウザ(Internet Explorer)がオペレーティングシステム(Microsoft Windows)の一部かどうか、分離不可能かどうかが議論となった。

システムプログラミング 
システムプログラミング（）は、システムソフトウェアのプログラミングを指す。以下では、オペレーティングシステムやデバイスドライバの開発におけるシステムプログラミングについて述べる。アプリケーションソフトウェアのプログラミングとの主な違いは、ハードウェアとの関わりが大きい点である。他にも以下のような特徴がある。

 プログラマはハードウェアやその他のシステムの特徴を前提として、それらを利用してコードを作成する。例えば、そのハードウェアで効率がよいとわかっているアルゴリズムを採用したりする。
 以下のような低レベルなプログラミング言語が使われることが多い。
 リソースに制限のある環境で動作可能な言語を使う。
 効率がよく、実行時オーバーヘッドの小さい言語を使う。
 ランタイムライブラリが非常に小さいか、全くライブラリを持たない言語を使う。
 メモリアクセスや制御構造を直接制御できる。
 プログラムの一部を直接アセンブリ言語で書くことが出来る。
 リソースが制限されているためデバッガが使えない場合もあり、そうするとデバッグが困難になる。このため、エミュレータ上でデバッグを行ったりする。

システムプログラミングはアプリケーションプログラミングとかなり異なるため、プログラマはそれぞれの領域に特化する傾向がある。

高い実行効率が求められるため、プログラマーにはアルゴリズムとデータ構造に関する深い知識が要求されることもあるが、資源の制約などで高度なアルゴリズムやデータ構造が使えないという縛りの下でのプログラミングが必要なこともある。

システムプログラミングでは、プログラミングに利用できる道具が制限されることが多い。ガベージコレクションは一般的ではないし、デバッグが困難な場合もある。ランタイムライブラリはあったとしても貧弱で、あまりエラーチェックをしない。このような制限があるため、モニタリングやデータロギングといった技法が使われることが多い。オペレーティングシステム（特にカーネル）はそのようなロギングを多用している。

古くは、システムプログラマは例外なくアセンブリ言語を使っていた。高水準言語をシステムソフトウェアに使った初期のものとしては、バロース B5000のALGOL、MulticsのPL/Iがある。1960年代後半から、BLISS、BCPL、C言語などが使われるようになり、UNIXの普及もあって1980年代にはそれが一般化した。macOSのI/O Kitドライバなどでは、Embedded C++ が使われることもある。

21世紀に入ると、セキュリティの重要性が否応にも増していることから、型システムによってより強い安全性が保証されたプログラミング言語でシステムソフトウェアを書くことも、研究レベルでは進んでいる。

オペレーティングシステムやネットワーク関連の実装ではシステムプログラミングが必要となる（例えば、仮想記憶を実装する場合やデバイスドライバを実装する場合など）。

関連項目
ソフトウェア工学
オペレーティングシステム
アプリケーションソフトウェア
ファームウェア

脚注

外部リンク
Webopedia
sourceforge.net

しすてむそふとうえあ