web-dev-qa-db-ja.com

システムプログラミングとは正確には何ですか?

システムプログラミングの意味を理解したことがありません。与えられた通常の定義は、「... Osに近いことを行うか、Os機能を拡張する...」です。

一部のライブラリではなくWindows APIを直接使用して、ファイルI/Oでシステムプログラミングを行うと言っていますか? Android OSシステムプログラミングですか?アプリのようなコンソールからLinuxカーネルを公開するようなものを書いた場合Android私はシステムプログラミングをしていますか?洗濯機を制御するソフトウェアを書くのはシステムプログラミングを書くのですか?

私はプログラミングの初心者ですが、これで終わりがありません。 「アプリケーションプログラミング」と対比して説明してください。

29
kentjh

私は個人的に Wikipediaからの定義 が好きです:

システムプログラミング(またはシステムプログラミング)は、プログラミングシステムソフトウェアのアクティビティです。アプリケーションプログラミングと比較した場合のシステムプログラミングの主な特徴は、アプリケーションプログラミングがユーザーにサービスを提供するソフトウェア(例:ワードプロセッサ)を生成することを目的としているのに対し、システムプログラミングはコンピューターハードウェア(例:ディスクデフラグツール)にサービスを提供するソフトウェアを生成することを目的としています。 )。より高度なハードウェア認識が必要です。

21

その質問を決定する際に練習をするためにあなた自身に尋ねることができるいくつかの質問があります。

  • システムはもともとこのプログラムなしで販売されましたか? Angry Birdsはスマートフォンの「キラーアプリ」かもしれません(誰かがそれを購入する理由です)が、それは電話が導入されてからずっと後に書かれた別のサードパーティアプリです。それを書くのはアプリケーションプログラミングだったでしょう。しかし、同じスマートフォンのディスプレイドライバは、それを使用する上で不可欠であり、システムプログラミングでした。
  • コードを大幅に書き直さずにコードを別のプラットフォームに移植することを想像できますか? TeXとtroffは、ほとんど変更のないほぼすべてのシステムに移植されているため、一般的に使用されるツールチェーンの最下部に位置していますが、これらはアプリケーションです。 TeXが出力を書き込むファイルシステム。 UFSまたはVFATは境界線の場合です。あなたはcouldファイルシステムを別のOSに移植して、それが完全に素晴らしい場合は、通常、人々は素晴らしいアイデアを引き継ぎ、独自のOS用の独自のファイルシステムを作成します。それはファイルシステムをシステムソフトウェアにします。
  • 機能はカーネルまたは個別のバイナリに実装されていますか? (ここでもファイルシステムは中核を占めています。多くのファイルシステムの多くの部分は実際にはカーネルコードですが、多くの場合、ユーザー空間にかなりの部分があります。)グラフィックディスプレイドライバーは、原則としてプラグ可能な外部コンポーネントですが、多くの場合、実装されていますカーネル内、または少なくともカーネル(またはハードウェア)への特権付き直接アクセス。それはシステムプログラミングでしょう。一方、グラフィックディスプレイスタックを使用するコンピュータゲームはアプリケーションです。

あなたの質問に、Android OSは間違いなくシステムプログラミングでした。WindowsAPI呼び出しを使用するプログラムの記述はアプリケーションプログラミングです。クロスプラットフォームライブラリを使用する場合ほど簡単ではありません。 SDLやOpenGLなどですが、原則として移植可能で、サードパーティのコードであり、ユーザー空間で実行されます。Linuxカーネルの状態を公開するコンソールアプリは、興味深い思考実験です。 Linuxの構造(「Linux」は適切にはカーネルだけであり、ディストリビューションではないことに注意してください)について、そしておそらくそれを使用するためにも、多くのことを知っている必要があるためです。

15
Kilian Foth

要約すると、ドライバーのようなOSの機能を拡張または強化するソフトウェアの作成、システムユーティリティのOSへの更新、またはまったく新しいOSですらあります。

それは主にメモリ管理を含みます。ネットワーク、ファイルアクセス、デバイス管理など、Wordの最も広い意味でのI/O操作。プロセス管理(マルチタスク、プロセス管理など);ユーザー<->システムの相互作用方法(インとアウトの両方)とユーザー管理。基本的に、アプリケーションではないOSの一部であるものはすべてシステムプログラミングです。

5
Onno

Windows APIを直接使用することは、ある時点では、Windows用のアプリケーションを作成する一般的な方法でした。つまり、システムプログラミングではありません。

システムプログラミングは、単に「OSに近い」だけではありません。これは、コンピュータシステムのコア機能に不可欠なものです。したがって、OSの作成はシステムプログラミングです。そのOSのビデオドライバー、ファイルシステムドライバー、ネットワークドライバーの作成はシステムプログラミングです。言語/チップセットの特定の組み合わせに対応するコンパイラを作成するのはシステムプログラミングです。

4
80x24 console

通常、それは「技術者ではないエンドユーザーが存在することを知らないか、自分が使用していることや何をしているのか非常にはっきりと知らない低レベルのもの」を指します。

システムプログラミングと見なされることが多いいくつかの例:

  • オペレーティングシステムとドライバー
  • コンパイラ
  • エミュレーターと仮想化
  • ディストリビューションの作成、つまりユーザーランドイメージの作成。

    これには通常、C標準ライブラリ、initシステム、シェルなどの基本的なユーザーランドコンポーネントの選択が含まれます。

システムプログラミングは、多くの場合、CやAssemblyのような自動ガベージコレクションなしで低コンパイルレベル言語で行われ、 POSIX Cインターフェイス を介して、あまり一般的でないシステムコールにアクセスする傾向があります。

いくつかのシステムプログラミングトピックをカバーする実践的なチュートリアルを維持しています here

これを定義するとき、私はすべての技術的な詳細から完全に明らかにしません。そうすれば簡単になります。

アプリケーションを使用すると、ユーザーはいくつかのテクノロジを使用して何か便利なことを実行できます。したがって、アプリケーションプログラミングは、ユーザーに機能を直接提供することを目的としています。

一方、システムプログラミングは、アプリケーションプログラミングを可能にするための土台を築きます。これは、ユーザーではなくアプリケーションプログラマに機能を提供します。

この定義は保持されますが、それは視点とコンテキストと役割の問題です。コンピュータプログラマにとって、プログラミングツールはアプリケーションです。エンドユーザーにとっては、それらは意味をなさず、まったく意味がありません。

0
Martin Maat