厳密にC / C ++が埋め込まれている理由[終了]


15

簡単に答えられないので、この質問は好きではありませんでしたが、おそらく「Embeddedが言語の変更を妨げているのはなぜですか」と言い換えることができます。

たとえば、組み込み用のC / C ++がほとんど見られます(ADAについても以前に言及されたと聞いたことがありますか?間違っている場合は修正してください)

しかし、埋め込みの世界が言語を変えないようにするにはどうすればよいのでしょうか?Cが使いやすいだけなのか、それともCがすべてうまくいくので、実際に変更の「必要性」がないのでしょうか。

これはいつも私を困惑させ、不平を言っているわけではありません。それをいくつかの言語に保つことで、物事は標準化されます。しかし、まだ疑問が残っています。

これは一種の主観的な質問ですが、私の主な質問は「なぜ」であり「IF / WHEN」ではありません


2
組み込みシステムで見たい特定の高レベル言語はありますか?編集:むしろ、Cが提供していない言語機能に興味がありますか?
ジョンL

1
@JonL-Cに欲しい低レベルの機能がたくさんあります。例えば、大きな整数内でのビット/ニブル/バイト/ワード操作の改善。より良い安全サポート、例えばAdaの機能の種類。
Rocketmagnet

3
されて埋め込まれていないここでは、組込みシステムのための高レベルの言語の集まりです厳密C.:electronics.stackexchange.com/questions/3423/...
Kellenjb

1
「埋め込み」にはさまざまな意味があります。トースターを実行する4ビットマイクロコントローラーは、ECUまたはセットトップボックスとは異なります。このスペクトルはあなたの質問に答えるのを難しくします。
トビージャフィー

1
そして、予想通り、これは閉じられました。この質問には質の高い回答が得られ、人々はそれを素晴らしい質問として続けるように期待していましたが、そうではありません。代わりに、複数の賛成票を受け取る1つの文である多くの回答が得られます。フラグ投票で下票戦争を行う散文である回答があり、他の回答は1日でより多くのフラグを生成し、残りのサイトを結合しました。問題は、多くの人々にとって、彼らが変わらなかった理由に関して多くの異なる正しい答えがあるということです。
Kortuk

回答:


18

まず第一に、それは有用な区別ではないため、「埋め込み」を忘れてください。すべての重要なプロパティは「リソース制約」です。多くの場合、最も重要なリソースは時間です。この場合、リアルタイムシステムについて説明しますが、メモリまたは電力でもかまいません。

  • 新しい言語の採用は難しく、まれです。再トレーニング、新しいツール、および新しい言語で作業するための良い方法を見つける必要があります。これは、特に早期導入者にとっては費用がかかります。また、鶏卵の問題でもあります。大規模なユーザーベースがなければ、良質のツールやライブラリーはありませんが、大規模なユーザーベースはありません。したがって、新しい言語は、既存の言語よりも大きな利点を持っている必要があります。そうでなければ、チャンスはありません。

  • 言語のほとんどの「最近の」新しい開発は、利用可能なCPUパワーとユーザーが必要とするものの間のギャップを埋めています。言い換えれば、それらは速度が非効率である可能性がありますが、プログラマーの方が簡単であることによって補います。Java、Python、Perl、Tclのような、本質的にインタープリターによって(おそらくコンパイル後に)実行され、動的メモリ管理を多用する言語の台頭を考えてください。しかし、これは、a)利用可能なリソースを最大限に活用し、さらにプログラミングの労力を犠牲にし、b)リソースの予測可能な使用を望んでいるリソースに制約のある世界とはよく一致しません。

  • CおよびC ++(または適切なサブセット)は、一般的に使用されている最高レベルの言語であり(十分なツール、十分なトレーニングを受けたプログラマー、および豊富なライブラリがすべて利用可能)、それほど遠くない予測可能なスペースおよび時間の要件を満たすことができます現在のハードウェアで可能なことから。唯一の競争相手は私がエイダだと思うが、それは悪いスタートに苦しんでいる:最初の実装は遅すぎると非効率的であると認識されていた、そして今(良い実装が利用可能であっても)言語は少し遅れている機能(C ++と比較して)。個人的には、これは残念だと思いますが、他のことも同じで、CやC ++で行われた飛行機よりも、Adaでプログラムされた飛行機で飛んでみたいと思います。


+1-いい答え。Adaはおもしろい言語のようですが、小さなマイクロコンピュータ用のAdaコンパイラはありますか?
オリグレイザー

GCC AdaコンパイラであるGNATがあります。しかし、それはマイクロスではあまり使用されていないので、すぐに実行できるものを見つけるのは難しいでしょう。
Wouter van Ooijen

ええ、WikiページでGNATが言及されているのを見ました。あなたは正しい、小さなマイクロにはあまり向いていませんが、68k、x86、MIPSなどのミッションクリティカルなもの(たとえばDDCI)については、かなりのサポートがあるようです(予想どおり)
Oli Glaser

以下のDeekで言及されているように、SPARK Adaもあります。私は...私は、彼らが時間を呼び出すこととらえどころのないもののいくつかを持っているときにそれをチェックアウトする必要があります
オリグレイザー

2
Gduの形式のAdaは、Arduinoで見られるように、AVRマイクロプロセッサーで正常に動作します。私が作成した最小のGnat実行可能ファイルは65バイトでした。確かに、LEDを点滅させるだけでしたが、同等のArduinoスケッチは1Kを超えていました。私の実行可能ファイルが600バイトに達するまでに、2つのステッピングモーターを個別に駆動していました... SPARKは必要ありません-LEDブリンカーが正式に正しいことを証明したい場合を除きます!
ブライアンドラモンド

9

8ビットおよび16ビットのマイクロコントローラーベースの組み込みシステムを使用すると、これらの非常に控えめなストレージ制限の限られたリソースに適合するソフトウェアを開発することが容易になります(ローエンドの8ビットマイクロコントローラーの場合は数100 バイトのRAM 、2〜8 KiBのROMまたはEPROM / Flashでコードを保存)。

これらの場合、Cやアセンブリのような小さな言語が最も一般的に使用される開発言語である傾向があります。非常に大まかな相対的な比較として、完全なアセンブラとC99コンパイラは単一のフロッピーディスクに収めることができますが、最新のC ++開発システム(STLなどを使用)には複数のMiBが必要です。

エンベデッド環境でハイエンドマイクロ(ハイエンド16ビット、ほとんどが32ビット、かなりまれな64ビット)とDSPを見ると、制限が弱まり、ソフトウェア開発が開発の大部分を占める場合がありますそのため、C ++などのオブジェクト指向プログラミング(OOP)言語や、新しい言語(Java、Perl、Ruby、Python)などの機能を備えたより高度な言語を含む、最も生産的な開発ツールを使用することは理にかなっています。

アセンブリとCでは、使用されているメモリ量を予測できるため、スペースに制約のある設計が可能ですが、テンプレート、例外処理、ランタイムバインディングなどの高度な機能により、必要なメモリフットプリントを正確に知ることができません事前に標準C ++プログラムの場合。C ++のサブセットであるMISRA C ++について、コメントするのに十分な知識がありません。

バイトコードを実行する仮想マシン(Java、Perl、Python)に基づいた言語は、組み込み開発者の経験では成熟度が低く、これらの言語はプログラマーを特定のハードウェアから隔離するように設計されているため、良心の理解が難しくなりますこのような組み込みハードウェアシステムの制限と制限。これらは、RAMのGiBでない場合、MiBを備えた高速32ビットプロセッサ(ARMv7など)での問題ではありません。

私が知っているすべてのBASIC実装は、言語機能が非常に単純化されており、1960年代のDartmouth BASICの遺産にほぼ忠実です。つまり、この言語には複雑なランタイムライブラリや例外処理がなく、インタープリターやコンパイラーは非常に簡単に記述でき、ファイルサイズも小さくなります。ほとんどのマイクロコントローラーには、少なくとも1つのBASICコンパイラーがあります。

Cおよびアセンブリが主に小規模または古い組み込みシステムで使用され、新しいミッドエンドからハイエンドの組み込みシステムの制限がある従来のデスクトップパーソナルコンピューターとわずかに異なる理由は、大まかに一言で説明したいと思います。


5

答えのほとんどは、歴史的な理由をすでに述べています(よく知られている、誰もがそれを使用し、習慣を変えるのは簡単ではない、など)。私はそれらに同意しますが、別の重要な理由があることを心に留めておく必要があります。

それはだない(QWERTYキーボードのように)「Cが不良または古くなっ選択肢があるが、我々はまだ習慣のそれを使う」ということ。

Cは、特にタイムクリティカルなアプリケーションでの組み込み開発に最適です。どうして?

  • リアルタイムプログラムの実装に簡単に使用できるほど低レベルです。ナノ秒単位で時間を測定する必要がある場合、5マイクロ秒ごとに割り込みをキャッチする必要がある場合、または合計64バイトのRAMを正確に使用する必要がある場合、非常に高レベルの言語では、ほとんどの場合、解決が不可能または非常に困難です。Cは、高レベルの言語よりもハードウェアをはるかによく制御します。これは、組み込み開発とPC開発の最も重要な違いの1つです。

  • Assemblyに比べて、高速で簡単にコーディングできるほど高いレベルです。

したがって、Cは、Assemblyの速度とハードウェアへの直接アクセスと、高水準言語の読みやすさと理解の間の最良の(または最高の1つ)妥協点です。


1
Cが好む主な側面は、特定のプラットフォーム向けにコードを最適化できる一方で、そのようなコードを他のプラットフォームで(おそらく効率的ではない)実行できることだと思います。PICのようなものでは、多くのC命令が予想通り機械命令に変換されます。のようなループunsigned char i=63,j=128; do {something;} while(--j); while(--i);はほど読めませんがunsigned int i=16000; do {something;} while(--i);、PICでより速く実行され、より効率的になります。コードがARMに移動された場合、2番目のアプローチはより効率的ですが、最初のアプローチは引き続き機能します。
-supercat

4

これは、通常のプログラミングで(最も使用される)言語が(実際に)変更されない理由とまったく同じです。

  1. 膨大な量の既存のコード(ライブラリ/既存の実装)
  2. これらの言語(IDE、シミュレーター、...)で動作できる大きなツールセット

4

組み込みの世界では、ソフトウェアの更新を提供することは非常に困難(または不可能)になる可能性があるため、正確性を保証することは非常に重要です。悲しいことに、Cはこの点に関してほとんど助けを提供せず、プログラマーが速くてゆったりと遊ぶことができます。

組み込みシステムにCを使用するのは苦痛であり、const、参照、ストリンガータイピングなどの制約の形式で提供される多くの利点のために、少なくともC ++に移行できることを願っています。

変更は商業的に実行可能ではないため、答えは単純にCにとどまっているということだと思います。誰もがCを知っており、Cのコンパイラ、Cのライブラリ、Cを生成するツールがたくさんあります。新しい言語を使用すると、ゼロから始めることになります。

私はそれが人々がまだPHPを使用している理由だと思います

PHP double claw hammer.


質問について議論したい場合は、コメントまたはメタを使用します。良い質問のためにユーザーを軽くたたきたい場合は、それを支持するかコメントします。
Kortuk

いつでもPascalを使用できます-探している追加の制限があるようです:-)。または何らかの形のスーパーリント。
ラッセルマクマホン

2
Cの非常に重要な理由の1つは、C ++コンパイラよりも基本的なCコンパイラを書く方がはるかに簡単だということです。より重要なタスクが私を引き離す前に、私はしばらくの間1つに取り組みました。楽しいもの!C ++コンパイラを作成していますか?あー ただし、私はユーザーとしてC ++を好みます。
ダロン

1
@RussellMcMahon-使用しているMCU用のPascalコンパイラがないため、Pascalを使用できません。
Rocketmagnet

@darron-それは非常に良い点です。ただし、gppのような非常に優れたオープンソースC ++コンパイラがあります。彼らはそれのためにバックエンドを書く必要があります。
Rocketmagnet

4

SPARK Adaのことを聞いた人はいませんか?

これはAda言語の「小さな」バージョンであり、アビオニクスや医療機器などの安全性が重要なアプリケーションなどの組み込みシステム向けの関連開発ツールです。

研究では、信頼性の高いSPARKコーディングを使用したC / C ++と比較して、処理速度がわずか5〜10%低下していることが示されています。

組み込みシステムでのCの拡散は、経済的な理由によるものだと思います。

  • それはすでに存在し、通常ほとんどのアプリケーションで動作します-そして、ボリュームベースのほとんどのアプリケーションは重要ではなく、洗濯機がオーバーランしても死ぬことはありません-なぜ変わるのですか?

  • SPARKツールセットは、それ自体およびそれを使用するためのトレーニングスタッフにとって追加の費用になります。

  • SPARK(または他の非C言語)の組み込みコントローラー/管理システムへの追加の利点は、消費者の目で製品の価格の必要なプレミアムを正当化するのに十分ではないかもしれません-特に「良い」ライバルブランドの販売を見ている場合低価格で。

  • AdaCore社は、コア以外の問題に対処するためにテクニカルサポートスタッフの大幅な増加を必然的に要求するため、マスマーケットアプリケーションに深く入り込まないように注意しています。AdaCoreは高レベルの専門企業であり、それ自体を誇りに思っており、ハイテク企業で製品とサービスを売り込んでいます。主な利害関係者が本当に望んでいない限り、言語が新しい市場に浸透することは珍しいことです。

だから、@ Wouter、Adaの埋め込みコードがなくても空で死ぬことを心配する必要はありません!

それはすでに長年飛行機システムにあります。ペースメーカーも同様です。

しかし、食器洗い機、建物サービス制御システム、実験室の炉のコントローラー、およびそれほど厳しく規制されていない他のアリーナにとって、それは経済的に余分な距離を行く価値がありますか?


おもしろい、ありがとう-スパークのことは聞いたことがないだろう、チェックしてみよう。
オリグレイザー

一部の研究では、Cの既存のアプリケーションに比べて高速化が示されています
ブライアンドラモンド

3

Cの人気の主な理由は、最初はCが人気があり多くの人がそれを知っていること、そして2番目はJava、C#などの新しい人気のある言語もC ++の多くの側面さえも組み込み作業に適していないことだと思います。基本的に、私が言及した他の3つの言語は、プログラムの非決定的な実行をもたらす動的メモリ、動的メモリを伴うオブジェクト、大きなメモリ要件に大きく依存しています(OOのより重要な側面の1つは、多数のクラス)、ジャストインタイムコンパイルの人気の高まり(および多くの組み込みプラットフォームは、独自のCコードをまったくコンパイルすることさえできません)...

また、JavaやC#などに同梱されているライブラリの多くは、多数の組み込みプロジェクトには役に立たないという事実もあります。

一方、PascalやBasicなどの古い言語があります。私の観点からは、Cはそれ自体を「業界標準」言語にし、非常に多くのプログラマーとエンジニアが今日Cを学習しているため、それほど人気が​​ありません。いくつかの学校では、パスカルやベーシックも学習されていません。また、現在人気のある多くの言語にはCに似た構文があり、Pascalを使用するとCプログラマにとって奇妙に感じるという事実もあります。

FORTRANについては、ニッチ分野に入っており、その使用に適したエコシステムがある分野で働いているエンジニアや科学者が主に使用していると思います。組み込みシステムでは使用されないので、PascalとBasicで言及した以外の特定の理由は見当たりません。

この回答では、主に小規模なシステムに焦点を当てていたことに注意してください。GNU / Linuxまたは他のUnix派生物などのより複雑なオペレーティングシステムを使用する組み込みデバイスも多くあり、それらのプログラミングには、多かれ少なかれポピュラー言語を使用できます。


1
Cは人気があるのでCは人気ですか?:
stevenvh

2
@stevenvhはい、それは本当です。それは一種の正のフィードバックループです。人気が高いほど、人気が高くなります。
-AndrejaKo

3

Cは非常に単純な言語であり、ファンシーアセンブリ言語と呼ばれることもあります。C構造はマシンレベルの構造にかなり直接マップされるため、上記のアセンブリコードを提供できる抽象化の最小量に非常に近いです。

この理由およびその他のいくつかの理由により、Cコンパイラを新しいチップに実装するのは非常に簡単です。作業の大部分は既に完了しており、複雑さや問題が比較的少ないため、低レベルのコントロールを使用すると、ハードウェアの癖をかなり簡単に処理できます。

C ++は(実際には元々)Cの上にソースコード変換層として実装できます。つまり、CコンパイラでC ++(または少なくともそのバージョン)を無料で入手できます。

CとC ++を使用すると、新しいチップに必要なほとんどすべてのブートストラップが可能になり、開始するのに論理的な場所になります。


3

他の人が言及していないいくつかの理由:

  • 問題空間:Cは小さく単純なシステムに適しています。外部信号に反応し、いくつかの数値をプッシュするだけであれば、Cはかなりうまく機能します(複雑なデータ構造、malloc、複雑なエラー処理はありません)。

  • 生産量:大量の生産を行う場合、プログラミングは1回限りのコストになるため、各ハードウェアユニットを節約し、プログラマーにより多くを費やすことは経済的に賢明です。



1

実際、小規模な組み込みシステムでは、CはC ++よりもはるかに人気があります。そして、その理由は他の言語を使用しないのと同じです。C ++には、Cとは異なる機能のほとんどを提供しない限り、ランタイムが必要です。

別にアセンブリから、Cは私がネイティブコードにコンパイルことを知っている唯一の言語であるランタイムがオプションである持っているため。そのため、制限された環境で最小のフットプリントと最速の実行時間が保証されます(アセンブリを使用する場合を除く)。

一方、中規模および大規模の組み込みシステム(つまり、より多くのメモリとクロック、より大きなワードサイズを意味する)では、C(またはC ++)がそれほど普及しているとは言いません。Python、Forth、さらにはJavaをサポートするシステムを見てきました。

しかし、もちろん、上で述べたのと同じ理由で、C / C ++を使用するという選択肢はほとんど常にあります。そして、オプションがあり、あなたがすでに小さな組み込み用のCに慣れている人であれば、なぜ別の言語を選ぶのですか?


4
C ++は多くのオーバーヘッドを生成する可能性がありますが、MSP430に使用した完全準拠のC ++コンパイラはランタイムを必要としませんでした。C++はネイティブコードにコンパイルしました。申し訳ありませんが、他の人に悪いことだと言って、私はあなたに反対票を投じました。あなたは私が間違っていると確信する参照を提供することでダウン票を削除することができます(これは難しいでしょう、私はプロジェクトのためにコンパイルされたC ++のアセンブリリストを読んで、それが効率的にコンパイルされることを確認することの一部です)評判への影響(この時点で正味+8を受け取ります)
-Kortuk

3
Kortukに完全に同意します。C ++の一部には広範なランタイムサポートが必要ですが、そうでない部分は依然としてはるかに優れたC(および完全にオブジェクト指向)です。このサブセットへの制限は、一部のコンパイラおよびリンカースイッチによって簡単に実施されます。一部の部分(たとえば、恐ろしいprintf)では、C ++には少なくとも、ランタイムサポートをあまり必要としない言語の可能性があります(std :: coutのみが小規模システムで実装されている場合...)
Wouter van Ooijen

1
@Kortuk、そこにはっきりしていないことを申し訳ありませんが、「Cが唯一の言語である...」と言ったとき、C ++にはこれらの両方がないことを意味しませんでした、私はCに2つの組み合わせがあることを意味しましたC ++にはそれらの1つがあります。私はランタイム部分に重点を置いていました。また、ランタイムなしでC ++を使用することは完全に不可能であると言っているわけではありませんが、それはかなり珍しいことです。たとえば、ランタイムを使用せずに例外処理やRTTIなどを使用する方法はわかりませんが、これらは非常に重要な機能です。しかし、私がこれを表現した方法が誤解の可能性につながった場合、私は謝罪します。
fceconel

@fceconel、ランタイム環境でC ++を使用したことはありません。ここで組み込みシステムについて説明します。マイクロコントローラーでランタイムを使用したことはありません。この質問は、あなたが読んだかもしれないのとは少し異なります。C/ C ++が唯一の一般的な選択肢であり、C ++ではなくCである理由を尋ねています。私は認めますが、私のマイクロではcoutが決して起こらないような単純なものを使用します。私はスクリーンではなくいくつかの無料のピンを持っています。
-Kortuk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.