システムソフトウェア

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

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

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

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

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

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

## システムプログラミング
**システムプログラミング**（）は、システムソフトウェアをプログラミングする行為を指す。アプリケーションソフトウェアのプログラミングとの主な違いは、ハードウェアとの関わりが大きい点である。

以下では、オペレーティングシステムやデバイスドライバの開発におけるシステムプログラミングについて述べる。

* プログラマはハードウェアやその他のシステムの特徴を前提として、それらを利用してコードを作成する。例えば、そのハードウェアで効率がよいとわかっているアルゴリズムを採用したりする。

* システムプログラミングでよく使用されるプログラミング言語のことを**[[システムプログラミング言語]]**という。システムプログラミング言語の特徴には、以下のような共通点がある。
** 計算資源に制限のある環境で動作可能である。
** 効率がよく、実行時オーバーヘッドが小さい。
** ランタイムライブラリが非常に小さいか、全く存在しない。
** メモリアクセスや制御構造を直接制御できる。
** プログラムの一部を直接アセンブリ言語で書くことが出来る。

* リソースが制限されているためデバッガが使えない場合もあり、そうするとデバッグが困難になる。このため、エミュレータ上でデバッグを行ったりする。

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

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

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

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

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

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

### システムコールを用いるプログラミング、の意味でのシステムプログラミング
現在では多くの場合に「システムプログラミング」とは、オペレーティングシステムの提供しているシステムコールを利用するプログラムの作成の意味としても使われる。
* Marc J. Rochkind：「UNIX システムコール・プログラミング」、アスキー出版局、ISBN 4-87148-260-X（1987年11月1日）。
* 冨永和人、権藤克彦：「例解 UNIX/Linux プログラミング教室　システムコールを使いこなすための12講」、オーム社、ISBN 978-4-274-22210-8 (2018年4月15日)。
* 羽山博、垰井正雄：「Linuxシステムプログラミング」、オーム社、ISBN 978-4-274-07972-6 (2004年7月20日)。
* 篠山学：「システムプログラミング入門 実行しながら理解するLinux OSのしくみ」、森北出版、ISBN 978-4-627-85551-9 (2020年10月29日)。
* 武内覚：「Linuxの仕組み　カーネルを知ってステップアップ」、技術評論社、ISBN 978-4-297-13148-7 (2022年10月29日)。

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

## 脚注

## 外部リンク
*Webopedia
*sourceforge.net