パフォーマンス上の理由からCを使用する必要があります” [閉まっている]

StackOverflow https://stackoverflow.com/questions/1223710

質問

この多くの言語の時代には、ほぼすべてのタスクに優れた言語があるように思われます。速いというのは、「十分に速い」という意味です。私は、数字を比較したい非常に合理的なオープンマインドな人々と仕事をしており、私が持っているのは思考と意見だけです。主観的な意見を超えて「現実の世界」に進む道を見つけてください。

組み込みおよび(Linux)システムのプログラミングに他の言語を使用できるかどうかについて調査するのを手伝ってもらえますか?私は非常によく間違った仮説を推し進めることができ、これを示す研究を大いに評価します。 「単なる彼/彼女の意見」を維持するのに役立つように、良い数字をリンクまたは含めるようにしてください。最小限のコメント。


これらは私の特定の要件です

  • メモリは深刻な制約ではありません
  • 移植性は深刻な問題ではありません
  • これはリアルタイムシステムではありません
役に立ちましたか?

解決

" C以外は何もありません[十分]"は初期の最適化であり、初期の最適化が間違っているすべての理由で間違っています。システムがC以外のものが望ましいほど複雑である場合、「十分に高速」でなければならないシステムの部分があります。より軽い制約の部品。たとえば、Pythonでコードを書くことで、バグを減らしてプロジェクトをより早く完了できる場合は、Cまたはアセンブリコードをフォローアップして、タイムクリティカルな部分を高速化できます。

パフォーマンス要件を満たすためにコード全体をCまたはアセンブリで記述する必要があることが判明した場合でも、Pythonのような言語でプロトタイピングを行うことには大きなメリットがあります。作業中のPythonプロトタイプを使用して、必要なパフォーマンスに達するまで徐々にCコードでパーツを置き換えることができます。

したがって、開発作業を最も正確かつ迅速に実行できるツールを使用し、実際のデータを使用して最適化する必要がある場所を決定します。組み込みシステムであっても、Cが開始するのに最適なツールである場合もありますが、必ずしもそうとは限りません。

他のヒント

私の経験では、組み込みプログラミングおよびシステムプログラミングにCを使用することは必ずしもパフォーマンスの問題ではありません。多くの場合、移植性の問題です。 Cは、ほぼすべてのプラットフォーム、特に組み込みシステムプラットフォームで最も移植性が高く、十分にサポートされている言語である傾向があります。

組み込みシステムで他の何かを使用したい場合、多くの場合、使用可能なオプションを把握し、パフォーマンス、メモリ消費、ライブラリサポートなどが「十分」であるかどうかを判断する必要があります。状況に応じて。

組み込みシステムにCを使用することには、いくつかの非常に良い理由があります。マイナーの1つだけです。 Embeddedはハードウェアに非常に近いため、ハードウェアと通信するには手動でメモリをアドレス指定する必要があります。すべてのAPIとSDKはほとんどCで使用できます。

JavaまたはMono用のVMを実行できるプラットフォームはごくわずかです。これは、パフォーマンスへの影響だけでなく、実装コストが高いためです。

パフォーマンスとは別に、別の考慮事項があります。ほとんどの場合、CまたはC ++で使用されるように設計された低レベルAPIを処理します。

一部のSDKを使用できない場合は、より高いレベルの言語を使用した開発で時間を節約するのではなく、トラブルに陥るだけです。少なくとも、多くの関数宣言と定数定義をやり直すことになります。

Cの場合:

  • Cは、多くの場合、プロセッサ用のコンパイラでサポートされている唯一の言語です。
  • Cでもライブラリとサンプルコードのほとんどは確率です。
  • ほとんどの組み込み開発者は、長年のCの経験がありますが、それ以外の経験はほとんどありません。
  • 直接ハードウェアインターフェースと手動メモリ管理を許可します。
  • アセンブリ言語との簡単な統合。

Cはこれから何年も続くでしょう。組み込み開発では、変更の試みを窒息させる独占です。 JavaやLuaのようなVMを必要とする言語は、組み込み環境の主流になることはありません。コンパイルされた言語は、Cを超える魅力的な新機能を提供する場合、チャンスになります。

ウェブ上には、異なる言語間でいくつかのベンチマークがあります。それらのほとんどは、実際に最適化するためのより多くの制御を提供するため、上部にCまたはC ++実装があります。

例:コンピューター言語ベンチマークゲーム

C(またはPascal、Modula-2、Adaのような他の手続き言語)および組み込み用のアセンブリに反対するのは困難です。これらの言語の成功には大きな歴史があります。一般に、未知のリスクを取り除きたいと思います。私の意見では、Cまたはアセンブリ以外のものを使用しようとすることは不明です。そうは言っても、C、Python、Lua、JavaScriptのいずれかをスクリプト言語として使用する混合モデルを使用しても問題はありません。

必要なのは、必要なときにすばやく簡単にCに移動できることです。

チームに彼らに立証されていない何かで行くように説得するなら、プロジェクトはあなたのクッキーです。崩れた場合、おそらくあなたのせいだと思われます。

この記事 (Michael Barr著)は、組み込みシステムでのC、C ++、アセンブラー、およびその他の言語の使用について説明し、それぞれの相対的な使用状況を示すグラフを含んでいます。

また、適切なタイトルの別の記事 C ++を拒否する不適切な理由

特に組み込みシステムでは、リアルタイムのパフォーマンスが必要な状況があります。また、メモリに厳しい制約があります。 Cのような言語を使用すると、実行時間と実行スペースをより詳細に制御できます。

だから、あなたが何をしているのかにもよりますが、Cは「もっと良い」かもしれません。またはより適切。

次の記事をご覧ください

Adaは、組み込みシステムおよびミッションクリティカルなシステム向けに設計された高レベルのプログラミング言語です。

これは、どこでもデータチェックが組み込まれた高速で安全な言語です。それは飛行機の自動操縦装置がプログラムされているものです。

このリンクにはAdaとCの比較。

D プログラミング言語をご覧ください。 Pythonがそれよりも優れている領域があるため、パフォーマンスチューニングを使用できます。リストを保持していないので、ベンチマーク比較を実際に示すことはできませんが、Peter Olssonが指摘したように、ベンチマーク&言語実装にはD Digital Marsがあります。

これらの素敵な質問もご覧ください:

Cはどこにでもあり、ほぼすべてのアーキテクチャで利用できます。通常は、プロセッサの可用性の初日からです。 C ++はすぐ近くです。システムがC ++をサポートでき、必要な専門知識がある場合は、Cに優先して使用します。Cだけであり、Cを使用しない理由はほとんどありません。

C ++はより大きな言語であり、組み込みシステムでリソースを消費したり、容認できない方法で動作したりする可能性のある構造とテクニックがサポートされていますが、それは言語を使用しない理由ではなく、適切に使用する方法です。

JavaおよびC#(Micro.NetまたはWinCE上)は、非リアルタイムの実行可能な代替手段である可能性があります。

私は実際にはシステム/組み込みプログラマーではありませんが、組み込みプログラムは一般に決定論的なパフォーマンスを必要とするようです-一般に決定論的ではないため、多くのガベージコレクション言語をすぐに除外します。ただし、確定的ガベージコレクション(たとえば、Metronome for Java: http://www.ibm.com/developerworks/java/library/j-rtj4/index.html

問題は制約の1つです。言語/ランタイムが決定論的、メモリ使用量などの要件を満たしていますか。

Cは本当にあなたの最良の選択です。

移植性のあるCコードを作成し、特定のコンパイラの機能や言語のコーナーケースに深く入り込むことには違いがあります(これらはすべて避ける必要があります)。ただし、コンパイラーおよびコンパイラーのバージョン間での移植性。コードを開発または維持できる従業員の数。コンパイラーは、より使いやすく、より良く、よりクリーンで、より信頼性の高いコードを生成します。

Cはどこにも行きません。すべての新しい言語は、以前のすべての言語の欠陥を修正するように設計されています。 Cは、これらの新しい言語が修正しようとしているすべての欠陥を抱えていますが、依然として強力です。

C#とC ++を比較する記事は次のとおりです。

http://systematicgaming.wordpress.com/ 2009/01/03 / performance-c-vs-c /

http://journal.stuffwithstuff。 com / 2009/01/03 / debunking-c-vs-c-performance /

組み込みCプログラミングに焦点を当てていないため、正確にあなたが求めたものではありません。しかし、それでも面白いです。最初のものは、C ++のパフォーマンスと「安全でない」を使用する利点を示しています。プロセッサを集中的に使用するタスクのコード。 2つ目は1つ目をやや非難し、C#コードを少し違った方法で記述した場合、パフォーマンスがほぼ同じであることを示しています。

したがって、多くの場合、CまたはC ++がパフォーマンスの面で明確な勝者になる可能性があります。しかし、多くの場合、マージンはわずかです。 Cを使用するかどうかは、まったく別のトピックです。私の意見では、実際に手元のタスクに依存する必要があります。しかし、組み込みシステムでは、多くの選択肢がありません。

2人の人がLuaについて言及しています。組み込みシステムで働いたことのある人は、Luaは便利だと言っていますが、Lua自体は実際には独自の言語ではなく、Cに組み込むことができるライブラリです。組み込みシステムでの使用をターゲットにしています。 LuaコードをCから呼び出すことができます。しかし、純粋なCは、誰もが知っているので、メンテナンスがより簡単になります(必ずしも簡単ではありませんが)。

組み込みプラットフォームによっては、メモリの制約が問題になる場合、ほとんどの場合、ガベージコレクションされていないプログラミング言語を使用する必要があります。

この点で

Cは、チームで最もよく知られ、利用可能なライブラリとツールで最も広くサポートされている可能性があります。

真実は-常にではありません。

。これだけで(RAMに)ある場合は、運が悪いです。 JavaMEはよりコンパクトに見えますが、それでもすべては自由に使えるリソースに依存しています。

Cコンパイラは、C ++と比較して言語機能が少ないため、デスクトップシステム上でもはるかに高速です。そのため、組み込みシステムでは違いは些細なことではないと思います。これは反復時間の短縮につながりますが、OTOHにはC ++の便利さ(コレクションなど)がないため、長い目で見れば遅くなります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top