システムプログラミング、またはシステムプログラミングとは、コンピュータシステムソフトウェアをプログラミングする活動のことです。[ 1 ]アプリケーションプログラミングと比較した場合のシステムプログラミングの主な特徴は、アプリケーションプログラミングはユーザーに直接サービスを提供するソフトウェア(例:ワードプロセッサ)の作成を目的としているのに対し、システムプログラミングは他のソフトウェアにサービスを提供する、パフォーマンスに制約がある、またはその両方を満たすソフトウェアおよびソフトウェアプラットフォーム(例:オペレーティングシステム、計算科学アプリケーション、ゲームエンジン、産業オートメーション、サービスとしてのソフトウェアアプリケーション)の作成を目的としている点です。[ 1 ]
システムプログラミングには、高度なハードウェア知識が求められます。その目的は、利用可能なリソースを効率的に活用することです。これは、ソフトウェア自体のパフォーマンスが極めて重要である場合もあれば、わずかな効率改善でも、時間やコストの大幅な節約に直接つながる場合もあります。
システムプログラミングには、以下の特徴があります。
システムプログラミングにおいては、利用できるプログラミング機能が限られている場合が多い。自動ガベージコレクションの利用は一般的ではなく、デバッグが困難な場合もある。ランタイムライブラリは、たとえ利用可能であっても、通常は機能がはるかに劣り、エラーチェックも不十分である。こうした制約があるため、監視とログ記録が頻繁に用いられる。オペレーティングシステムには、非常に高度なログ記録サブシステムが備わっている場合もある。
オペレーティングシステムやネットワークの特定の部分を実装するには、システムプログラミングが必要です。例えば、ページング(仮想メモリ)の実装や、オペレーティングシステム用のデバイスドライバの実装などが挙げられます。
当初、システム プログラマーは必ずアセンブリ言語で記述していました。1960年代後半に高水準言語でハードウェア サポートの実験が行われ、 PL/S、BLISS、BCPL 、およびBurroughs Large Systems用の拡張ALGOLなどの言語が生まれました。Forthもシステム言語として使用されています。1970 年代には、Unixの成長に後押しされてC が広く普及しました。最近では、 C++のサブセットであるEmbedded C++が使用されるようになり、たとえばmacOSの I/O Kit ドライバで使用されています。[ 2 ] Google のエンジニアは、大規模分散システムでの開発者の生産性に対処するために、並行処理、ガベージ コレクション、 C や C++ よりも高速なプログラムコンパイルなどの開発者向け機能を備えたGo を2007 年に作成しました。 [ 3 ] 2015 年に、システム プログラミングでよく使用される汎用プログラミング言語であるRust が登場しました。Rust はメモリ安全性を念頭に置いて設計され、C や C++ と同等のパフォーマンスを発揮します。
歴史的な理由から、一部の組織では、より正確にはシステム管理者と呼ばれるべき職務を「システムプログラマー」という用語で表現しています。これは、コンピュータ資源が歴史的にメインフレームによって支配されてきた組織で特に顕著ですが、メインフレームに関係しない職務にもこの用語が使われることがあります。このような用法は、IBMメインフレームの管理には、 OS/MVS、DOS/VSE 、 VM/CMSなどのオペレーティングシステムと統合されるカスタムアセンブラコード(IBMの基本アセンブリ言語 (BAL))の作成が伴うことが多かったことに由来します。実際、一部のIBMソフトウェア製品には、顧客のプログラミング担当者による相当量のコード貢献がありました。この種のプログラミングは次第に少なくなり、アセンブリ言語ではなくC言語で行われることが増えていますが、システムプログラマーという用語は、システムプログラミング活動に定期的に従事しない場合でも、IBMメインフレームを管理するスタッフの事実上の職名として依然として使用されています。