組み込みソフトウェア市場でCが優位を占めるのはなぜですか?[閉まっている]


14

ほとんどすべての人が祝福を言うでしょう。

パフォーマンス

さて、Cはアスレチックコードを書くことができます。しかし、そうすることができる他の言語があります、結局のところ!そして、最新のコンパイラの最適化能力は素晴らしいです。DOES Cは、他の言語が持っていないことをいくつかの利点がありますか?または、ドメイン内でより柔軟な機器を使用する必要はありませんか?


1
FWIW、ArduinoはC#で制御できます:arduino.cc/playground/Interfacing/Csharp
FrustratedWithFormsDesigner

@Frustrated:はい、しかしそれは一例であり、デバイスを構築するほとんどの人はArduinoを使用しています。
エドS.



1
@ dan04、ほとんどの場合、それは実際には問題ではありませんでした。Texas Instruments Defense Systems and Electronics Groupの6DOFシミュレーショングループは、1988年頃に小さな実験を行いました。それまでは、すべてのシミュレーションをFORTRANで実行していました。彼らはPASCALでそれを書いてみて、それがどれほどひどいことになるか見てみました。彼らは、PASCALがパフォーマンスにわずかな打撃を与えたが、それを補うよりも信頼性とデバッグの容易さが向上したことを発見しました。率直に言って、彼らはPASCALの強力な型チェックが良いことであることに気づきました。(そして、はい、彼らはアレイをやっていた。)
ジョンR.ストローム14

回答:


41

ほとんどすべての人が祝福を言うでしょう。

パフォーマンス!

それはその一部です。決定的なリソースの使用は、最初はリソースが限られているデバイスで重要ですが、他の理由もあります。

  1. 低レベルのハードウェアAPIへの直接アクセス。
  2. これらのデバイスの大部分に対応するCコンパイラを見つけることができます。私の経験では、これは高級言語には当てはまりません。
  3. C(ランタイムおよび生成された実行可能ファイル)は「小さい」です。コードを実行するために、大量のものをシステムにロードする必要はありません。
  4. ハードウェアAPI /ドライバーは、おそらくCまたはC ++で作成されます。

14
+1コンパイラの可用性。アセンブリですべてを記述していたとき、最初のgenコンパイラは神からの送信でした。
クリストファービブス

8
+1、決定的なリソース使用が最も重要な理由の1つだと思います。食器洗い機であらゆる種類の派手なガベージコレクションを実行するためのメモリがあまりありません。
user281377

4
「決定的なリソースの使用」にも+1。多くの組み込みシステムでは、この要件は動的メモリ割り当ての使用を排除します。他の多くの言語は、動的メモリ割り当てに大きく依存しています(C ++の多くの有益な側面でさえ動的メモリが必要です)。
マイケルバー

2
箇条書きをもう1つ追加します。これは、技術的な理由ではなく、社会的な理由であることが判明しました。あなたの視点に応じて、これは良いことも悪いこともあります。
マイケルバー

1
システムの人間として言えば、私は大規模な抽象化に不安を感じています。動作を停止するか、おかしなことをするまで、彼らは素晴らしいです。その場合、デバッグするのは大きな頭痛の種になります。これは、低レベルのシステムでは望みのものではありません。
エドS.

18

Cは、アセンブリ言語を記述するだけでなく、プラットフォーム間でUnixを移植できるように作成されたため、CPUをモデル化するように設計されました。

つまり、Cプログラムは、組み込みハードウェアの場合のように、実際のCPUに非常に近い抽象化レベルを必要とするプログラムのプログラミング言語として機能します。

注:Cは1970年頃に設計されたもので、CPUはそれより単純でした。


3
1:これは間違いである理由。おそらく、人々は最新のプロセッサの機能をキャプチャする新しい高レベル言語を設計しようとしましたが、誰もがそれをキャッチする言語を設計していません。
ケンブルーム

2
@ vines、Cは大きなランタイムライブラリを持つ小さな言語です。これらはすべてランタイムライブラリで実行できます。プラットフォーム固有であるため、標準Cライブラリに自動的に移行されません。

3
+1。Cは、最大64キロワードの18ビットワードを持つPDP-7向けに作成され、最初に使用されました。より多くの「現代の」言語は、そのような空間に適合するのがより困難です。特に UnixのようなOSを書くために。
グレイフェード

2
@greyfade:そうではありません。UNIXの起源はPDP-7でしたが、Cはそうではありませんでした。The C Programming Languageの序文から引用すると、「Cは元々、Dennis RitchieによってDEC PDP-11上のUNIXオペレーティングシステム用に設計および実装されていました。」
ジェリーコフィン

1
@vines:言語のスレッド化の直接的なサポートを検討することは確かに合理的ですが(cf、Concurrent C)、キャッシュのポイントの多くは、プログラマーや言語の介入なしで物事を高速化することです。
ジェリーコフィン

11

支配の理由の1つは、タスクに適切な種類のツールがあることです。JavaとC / C ++の両方の組み込みプラットフォームで開発した後、C ++の基本的なアプローチはより自然であることがわかります。言語が高すぎるために開発者がフープを飛び越えていると感じないようにすることは、非常に迷惑なことです。1つの良い例は、Javaに符号なし変数がないことです。

また、VM /解釈言語の便利な機能は通常実行不可能であり、ガーベッジコレクションなどの実装から除外されます。


3
「JavaとC / C ++の両方」-CとC ++は異なる言語であるため、「3つすべて:Java CとC ++」を意味することを願っています。
BЈовић

1
@BЈовић:数年後に返信して、はい、私は3つすべてを意味することを確認しました。私は両方ともこの定義に従っていました。「2つ以上のもののそれぞれを含めることを示し、強調するための機能語として使用」(2つ以上のもの):
セレブドール

10

C自体はランタイムサポートをほとんど必要としないため、オーバーヘッドははるかに低くなります。ランタイムサポートにメモリやストレージを費やしたり、そのサポートを最小限に抑えるために時間や労力を費やしたり、プロジェクトの設計でそれを許可したりする必要はありません。


1
あなたその機能を必要とし、それを自分で再発明することは本当に起こりませんか?たとえば、switchesで構築された大規模なステートマシンは恐ろしく、クラス階層で構築された同じマシンは素晴らしく、保守可能です。
ブドウ

1
@vines-通常、入力に定義されたセットがあり、スイッチ上に構築されたステートマシン/ラダーが「舞台裏」の多態的な呼び出しの階層よりも明確で文書化可能である場合。
マーティンベケット

2
@Martin:オブジェクト指向開発の経験が少ない人にとって、ポリモーフィックな呼び出しは「魔法」でも「舞台裏」でもありません。巨大なswitch / ifステートメントがより明確で文書化可能であるという考えはまったく奇妙に思えます。
マイケルボルグワード

3
pin27がHighになったときに何が起こるかを見つけます。オプション1、「case PIN27:」を検索します。オプション2は、ファンクターのマップ上でイテレーターをトレースし、実行時にピン27に割り当てられたPINオブジェクトに対して呼び出されるイテレーターを見つけます。多くのオブジェクト指向コードの問題は、それを読む唯一の方法が本質的にそれを実行することであるということです。実行時デバッグのないプラットフォーム、または紙上または頭の中でコードをトレースすることを意味するコンソール上。
マーティンベケット

2
この議論にわずかに接していswitchますが、多くの組み込みアプリケーションでまだラダーロジック(と言うよりも原始的なバージョン)が使用されている理由があります。デバッグしやすく、検証しやすい。
ギーコサウルス

9

他の回答で述べたように、Cは1970年代初期にミニコンピューターアーキテクチャのアセンブリ言語を置き換えるために開発されました。当時、これらのコンピューターは通常、メモリや周辺機器を含めて数万ドルかかりました。

今日では、内蔵RAMおよびI / Oコントローラーを含む単一の量で4ドル以下の価格の16ビット組み込みマイクロコントローラーを使用して、同等以上のコンピューター能力を得ることができます。32ビットのマイクロコントローラのコストは、おそらく1〜2ドルです。

私がこれらの小さな人をプログラミングしているとき、それは彼らが座っているボードを設計していないときの90%の時間です、私はプロセッサが何をしようとしているのかを視覚化するのが好きです。アセンブラで十分に高速にプログラムできれば、そうするでしょう。

あらゆる種類の抽象化レイヤーは必要ありません。私はしばしば、画面に表示されている逆アセンブラーをステップ実行してデバッグします。そもそもCでプログラムを作成した場合、それは非常に簡単です。


1
一部の組み込みアプリケーションでは、その「1〜2ドル」が非常に重要です。車の価格への影響に誰も気付かないでしょうが、サーモスタットやCDプレーヤーには気付くでしょう。
デビッドソーンリー

3
@David Thornley、うん、完全に同意します。だから私は現在、異なるクライアントのために8、16、および32ビットのマイクロを同時に使用するプロジェクトを持っています。(電力消費は、小型デバイスを使用するもう1つの理由です。)
tcrosley

1
価格は、ピンカウントよりもプロセッサコストによって決定されます。ボードはチップよりもはるかに高価です。
イットリル

7

コンパイラーが改善され、ハードウェアのパフォーマンスが向上したため、C ++がますます使用されているため、完全に支配しているわけではありません。ただし、Cはまだいくつかの理由で非常に人気があります。

  1. 幅広いサポート。ほとんどすべてのチップベンダーがACコンパイラを提供しており、サンプルコードとドライバーはすべてcで記述されています。C ++コンパイラはますます一般的になっていますが、特定のチップの死んだ証明書ではなく、バグが多いことがよくあります。また、組み込みエンジニアはcで作業できることも知っています。それは業界の共通語です。

  2. パフォーマンス。うん、あなたはそれを言った。パフォーマンスは依然として重要であり、コアルーチンが依然としてアセンブラーで記述されているか、アセンブリ出力を参照してcで少なくとも最適化されている環境では、この重要性を過小評価しないでください。多くの場合、組み込みターゲットは非常に低コストで、非常に小さなメモリとわずかなmipsしかありません。

  3. サイズ。C ++は大きくなる傾向があります。確かに、STLを使用するものはもっと大きくなります。一般に、プログラムサイズとメモリフットプリントの両方の面で。

  4. 保守主義。非常に保守的な業界です。その理由の1つは、障害のコストが高くなることが多く、多くの場合デバッグを利用しにくいことです。1つには、変更する必要がないためです。小さな組み込みプロジェクトの場合、cはうまく機能します。


11
参照してください、それは、C ++について最も一般的な神話の1つであると思われる#3のものです。Cで5つの異なるタイプのタイプセーフコンテナを記述すると、少なくとも5つの異なるタイプで単一のSTLコンテナを使用するのと同じくらいの「膨張」が発生します。Cプログラマは、不透明型(void *)にコンテナを書くことでこれを回避します。これをSTLテンプレートと比較すると、カテゴリエラーになります。それは確かにC.を好むための最も一般的な「な理由」の一つであるにもかかわらず認めざるを得ない
エドワード・ストレンジ

cのすべての機能を複製すると、最終的にc ++と同じフットプリントになることに完全に同意します。cの「利点」は、選択的にできることです。重要なプロジェクトではc ++を使用したいと思いますが、ターゲットハードウェアが実用的でない点に制約されることがあります。#1が本当に私の経験の主な理由であると言った。
ルークグラハム

6

組み込みシステムの最大の特徴はパフォーマンスです。しかし、あなたが言ったように、なぜ他のパフォーマンス言語ではなくCなのでしょうか?

これまで多くの人がコンパイラの利用可能性について言及しましたが、開発者の利用可能性について誰も言及していません。OCamlよりも多くの開発者が既にCを知っています。

これらが3つの大きなポイントです。


6

組み込みソフトウェアは大きく異なります。

デスクトップアプリでは、抽象化とライブラリにより開発時間を大幅に節約できます。問題に別の数メガバイトまたはギガバイトのRAMまたは2 + GHz 64ビットCPUコアを追加する余裕があり、他の誰か(ユーザー)がそのハードウェアにお金を払っています。アプリが実行されるシステムがわからない場合があります。

組み込みプロジェクトでは、リソースが非常に限られていることがよくあります。私が取り組んだあるプロジェクト(PIC 17Xシリーズプロセッサ)では、ハードウェアに2Kワードのプログラムメモリ、8レベルの(ハードウェア内)スタック、192バイト(<0.2kB)のRAMがありました。異なるI / Oピンには異なる機能があり、必要に応じてハードウェアレジスタに書き込むことでハードウェアを構成しました。デバッグには、オシロスコープとロジックアナライザーが含まれます。

組み込みでは、抽象化が邪魔になることが多く、所有していないリソースを管理(およびコスト)します。たとえば、ほとんどの組み込みシステムにはファイルシステムがありません。電子レンジは組み込みシステムです。車のエンジンコントローラー。一部の電動歯ブラシ。一部のノイズキャンセリングヘッドフォン。

組み込みシステムの開発で私にとって非常に重要な要素の1つは、命令、リソース、メモリ、実行時間の観点からコードが何に変換されるかを把握し、制御することです。多くの場合、命令の正確なシーケンスは、ハードウェアインターフェイスの波形のタイミングなどを制御します。

抽象化と舞台裏の「マジック」(ガベージコレクターなど)は、デスクトップアプリに最適です。ガベージコレクターを使用すると、メモリを動的に割り当てることができる場合に、メモリリークを追跡する時間を大幅に節約できます。

ただし、リアルタイムの組み込みの世界では、物事にかかる時間(場合によってはナノ秒まで)を把握し、制御する必要があります。また、問題でRAMを2メガバイトもCPUを高速化することもできません。1つの簡単な例:デューティサイクルを制御してLEDのソフトウェア調光を行う場合(CPUにはLEDのオン/オフ制御のみがあります)、プロセッサがオフになり、たとえば100ミリ秒のガベージコレクションが表示されるため、これは問題ありません明るいフラッシュまたは外出。

より仮説的な例は、スパークプラグを直接点火するエンジンコントローラーです。そのCPUがオフになり、50ミリ秒のガベージコレクションが行われると、エンジンが一時的に停止するか、間違ったクランクシャフト位置で発火し、エンジンを失速させる(通過中?)か、機械的に損傷する可能性があります。誰かを殺すことができます。


それはCとは無関係であるのと同じことです。あなたが言及する問題はGCの振る舞いだけです... C ++にはGCがなく、何を知っていますか?私は個人的に、ラインコメントとより厳密な型の安全性のためにそれを使用しています =)
ブドウ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.