システムプログラミング言語

システムプログラミング言語とは、システムプログラミングでよく使用されるプログラミング言語のことである。このような言語は、システムソフトウェアを書くために設計されており、アプリケーションソフトウェアを書く場合とは異なる設計アプローチが求められる。
システムソフトウェアとは、コンピューターのハードウェアの操作・制御のために設計されたコンピューターのソフトウェアであり、アプリケーションソフトウェアを実行するためのプラットフォームを提供する。システムソフトウェアのカテゴリーとしては、オペレーティングシステム、ユーティリティソフトウェア、デバイスドライバ、コンパイラ、リンカなどがある。
機能.
アプリケーション向けの言語とは違い、システムプログラミング言語は、典型的には、物理的なハードウェアへのより直接的なアクセス手段を提供する。BCPLは、この意味での典型的なシステムプログラミング言語だった。システムプログラミング言語はしばしばビルトインの入出力（input/output; I/O）機能を欠いていた。かつては、システムソフトウェアが独自の基本的な入出力メカニズムを開発したり、基本的なモニタ入出力やスクリーン管理機能の上に作られることが普通だったためである。PL/I、C、Pascalなどの言語が広く普及するにつれ、システムプログラミング向け言語とアプリケーションプログラミング向けの言語の境界はぼやけていった。
歴史.
コンピュータの黎明期のシステムソフトウェアは、他のプログラミング言語が存在しなかったため、アセンブリ言語で書かれていた。同時に、効率的なオブジェクトコードの存在、コンパイル時間の短縮、デバッグのしやすさなどの理由もあった。FORTRANなどのアプリケーション向け言語もシステムプログラミングのために使用されることがあったが、アセンブリ言語として書き出すために追加のルーチンが必要だった。
中レベル言語.
中レベル言語は「高レベル言語のような多くの構文と機能を持つが、言語内で（アセンブリ言語と同様に）機械の機能への直接アクセスも提供するもの」である。最初期の中レベル言語は1960年頃にBurroughsメインフレームで使用されたESPOLである。次に現れたのがNiklaus WirthのPL360であった（もともとBurroughsシステム上でクロスコンパイラとして実装されたものである）。PL360は、ALGOL 60の一般的な文法を持っていたが、各ステートメントはCPUレジスタやメモリを直接操作するものだった。その他には、MOL-360やPL/Sがある。
一例として、よくあるPL360のcodice_1というステートメントを挙げる。このステートメントの意味は、「レジスタ8とレジスタ7をandし、その結果を8ビット左シフトした後、レジスタ6の中身とorし、さらにその結果をレジスタ9に格納せよ」という意味になる。
高レベル言語.
PL360は、構文レベルではアセンブリ言語と同等であったが、より高いレベルの構文を持つプログラミング言語でも、システムプログラミングに適した特定の拡張を行えるものもあった。その種の言語の初期の一例としては、LRLTRANがある。この言語は、Fortranに、文字とビットの操作、ポインタ、アドレスの直接指定によるジャンプテーブルの機能を追加したものである。
その後、C言語のようなプログラミング言語が開発されると、システムソフトウェアを書くのに十分な機能のセットが開発され、適切なハードウェア上で効率よく実行できるオブジェクトプログラムを生成できるコンパイラが作られるようになった。一般に、こうした言語では、効率よく実装できない少数の機能を直接は書かず、ハードウェアの特定の機能にアクセスする必要があるマシン依存の機能を使用するために、インラインのアセンブリコードが埋め込まれる。C言語のasm文などは、この目的でよく使用される。同様の言語が数多く開発されてきたが、現在まで生き残っているのはC言語とC++である。
"System Programming Language"（SPL）という名前のHP 3000コンピュータシリーズ上のプログラミング言語もあった。この言語は、オペレーティング・システムHP Multi-Programming Executiveや、その他のシステム・ソフトウェアのパーツを作るために使われていた。