web-dev-qa-db-ja.com

なぜオペレーティングシステムはCおよびC ++で低レベルの処理を行うのですか?なぜC ++だけではないのですか?

WindowsのWikipediaページ には、Windowsがブートローダーとタスクスイッチャーのアセンブリで記述されており、Cカーネルルーチン用のC++。

IIRC、extern "C" 'dブロックからC++関数を呼び出すことができます。純粋なCアプリがそれらを使用できるように、カーネル関数にCを使用できます(printfなど)。しかし、それらをextern "C "ブロックにラップするだけの場合、なぜCでコードするのですか?

20
Cole Johnson

これは主に歴史的な理由によるものです。 Windowsカーネルの一部は、もともとCで記述されていました。1983年、30年以上前の Windows 1.0が解き放たれた だったため、C++はほとんどリリースされていませんでした。マイクロソフトは下位互換性をセールスポイントにして、バグ互換バージョンのCパーツをC++で書き直すため、効果的な利益を得るために多大な労力を必要とするため、これらのCライブラリは「永遠に」存続します。

31
back2dos

ほとんどの人が指摘しているように、理由ははるかに歴史的ですが、他に誰も言及していない何かがあり、私が人々がまだ低レベルのCコードを書く理由だと思います。

Cは、仕様が(比較的)短いという意味で小さな言語です。 C++はhugeであり、それは控えめな表現です。これはプログラマにとってはそれほど重要ではないかもしれません(ただし、そうは思うと思います)が、正式な検証を実行する場合は非常に重要です。さらに、バグなどの防止に役立つCコード分析用の確立されたツールがあります。

そして、これは、展開されるバグのコストが他の業界に比べて非常に高い組み込みソフトウェアでは非常に重要です(すべてのユーザーにパッチをすぐに適用できるWebと比較してください)。ミッションクリティカルなソフトウェアと医療関連のものは言うまでもありません。

BitCのように、この点でさらに優れた言語を使用して、低レベルのプログラミングでCを支配的な場所から追い出そうとする試みがありましたが、今のところ成功していません。

24
K.Steff
  1. Cランタイムははるかに小さいです。
  2. C++から下位レベルの構成への変換は、Cの場合よりも透過的ではありません(2つの簡単な例については、参照とvtableを参照してください)。
  3. Cは通常、安定したABIを持っています。 C++は通常はそうしません。つまり、最低限、システムコールインターフェイスはCスタイルである必要があります。さらに、何らかの動的モジュールが必要な場合は、一貫したABIがあると非常に役立ちます。
15
wnoise

理由は技術的なものではありません。アセンブリの少しは避けられませんが、それらはforcedではなく、時々Cを使用しますwantします。私の会社では、ほぼ完全にC++で書かれた独自のカーネルを使用していますが、組み込みカーネルはC++アプリケーションでモノリシックにコンパイルされるため、他のほとんどの人のようにカーネルへのCインターフェイスをサポートする必要はありません。 Cインターフェイスを使用する場合、C++で記述するために_extern "C"_を使用するのはpossibleですが、Cでインターフェイスコードを記述する方が簡単な場合がよくあります。

ほとんどの場合サードパーティのコードが原因で、Cファイルが少しずつあります。サードパーティの低レベルコードは、ほとんどの場合Cで提供されます。これは、CコードをC++アプリに組み込む方が他の方法よりはるかに簡単だからです。

11
Karl Bielefeldt

カーネル開発者は多くの場合、ソースからすぐに明らかになり、コードが実際に何をしているのかが明らかなときに、より幸せに感じる人です。

C++には多くの機能があり、コードが何を行うかを非表示にするだけでなく、オーバーロード、仮想メソッド、テンプレート、リファレンス、スローなどの機能も備えています。それを使用するコード。

C++のパワーは、ライブラリとフレームワークを作成する非常に強力なツールであり、それによってアプリケーション開発が簡単になります。 C++アプリケーション開発者は、ライブラリを使用してアプリケーションを作成する能力が非常に高い場合でも、ライブラリがテンプレートで満たされた内部で完全に失われることがよくあります。また、C++ライブラリを正しく作成することは非常に困難なプログラミングタスクであり、アプリケーション開発者の利益のために優れたフレームワークを提供するためにのみ行われます。 C++ライブラリは内部的に単純ではありません。アプリケーションプログラマーの観点から見ると、パワフルでありながら単純です(または可能性があります...)。

ただし、カーネルAPIをC++ APIにすることはできません。言語に依存しないAPIである必要があるため、C++の素晴らしい機能のほとんどは、そのインターフェイスで直接使用できません。さらに、カーネルは実際には独立して開発された「ライブラリ」と「アプリケーション」の部分に分割されておらず、論理的に1つのライブラリに移動することで、アプリケーションの大量作成を容易にしています。

また、セキュリティと安定性はカーネル内でより重要であり、仮想メソッドははるかに動的であるため、プレーンコールバックや他のCのようなメカニズムよりも分離および検証がはるかに困難です。

要するに、もちろん、カーネルを含むCプログラムをC++として作成することはできますが、C++の能力のほとんどはカーネルでは十分に活用されていません。そして、多くの人は、プログラミングツールは、すべきでないことをするのを妨げるべきだと主張するでしょう。 C++はそうしません。

6
hyde

Bjarne Stroustrup、 1999年7月のインタビューで

これらの言語はどれも、他の現代の言語とは根本的に異なり、劇的に優れていませんでした。しかし、彼らは十分によく、幸運と社会的要因の受益者でした

5
david

Cは、その設計上、非常に低レベルの言語です。それはアセンブラーから一歩離れています。ターゲットとするチップセットが分かれば、少しの知識があれば、CをASMに手動で「コンパイル」できます。この種の「金属に近い」言語は、高レベルの最適化(パフォーマンス、メモリ効率など)の鍵となります。ただし、これは金属にこれほど近いため、この言語を使用しても無料では得られません。これは手続き型の非オブジェクト指向言語であるため、このような構造で作業するには、メモリ内に多値構造を作成して使用するための多くの定型コードが必要です。

C++は「Cワンベター」であり、someを犠牲にして、動的メモリ割り当て、組み込み構造マーシャリング、事前定義されたコードの大規模なライブラリなど、使いやすい多数の機能が追加されています。 =効率の低下(管理されたランタイム環境よりもはるかに優れています)。平均的なコーダーの場合、メモリ割り当てなどの保持型制御を必要としないコードベースの領域のデメリットをはるかに上回るメリットがあります。

この2つの組み合わせはかなり伝統的なものです。 Cを使用して、コードベースの最もパフォーマンスが重要でメモリ効率の高い領域を記述します。これをC++コードからのメソッド呼び出しを介してより抽象化された方法で操作できます。これは、uber-performantよりもエレガントに整理および設計できます。 、非常に最適化されたCコード。

3
KeithS

Cでは、ほとんどの時間を目前の問題と解決策のコーディング方法について考えることに費やす可能性があります。 C++では、C++とその無数の機能、関数、不明瞭な構文について考えることになります。

また、多くのC++ショップでは、最新の一連のデザインパターン、または偉大なる神ストロウストルプの最新の理解できない発音に夢中になる「ファッションポリス」によってコードが監視されます。 Prettyコードは実際のコードよりも価値が高くなり、Boostテンプレートの最新のセットの使用を見つけることは、ビジネスのための実際のソリューションを見つけることよりも賞賛されます。

私の経験では、すべての巧妙な機能とOO C++の純粋さ)について、プレーンなCでコーディングすることで、作業をより迅速かつ効率的に行うことができます。

1
James Anderson

C++パーツに使用されているC++コンパイラーにCパーツを適切に移植できない可能性があります。たぶん、Cコードは、C++コンパイラーで壊れるような方法でCコンパイラーとおかしいです。

高品質のC++コンパイラーを使用している場合、プロジェクトでCとC++を混合する理由はほとんどありません。ほとんど。

1つの理由は、プロジェクトが他のプロジェクトとCコードを共有し、コードがC++としてコンパイルされず、そのコードのC++フォークを維持したくない場合です。

0
Kaz