私はファームウェア開発者で、通常は C またはアセンブリでファームウェアを開発しています。しかし、組み込みライブラリの C++ で完全に実装されたプロジェクトに出会いました。オブジェクト指向言語がハードウェア レベルで使用できることはわかっていますが、組み込みシステムの開発時にオブジェクト指向言語があまり普及していない理由を知りたいと思います。
5 に答える
本当の理由: 概念の複雑さのため。C とアセンブリは、システム内で何が起こっているかを追跡するための単純なメンタル モデルを提供します。オブジェクト指向プログラムには、何が起こっているのかを理解するのを難しくする、より複雑なモデルが必要です。
組み込みシステムは、よりオープンエンドのサーバーや PC 環境に対して、システムで何が起こっているかについて非常に厳密な制御を必要とする環境である傾向があります。これには、単純で透過的なプログラミング構造が必要です。C とアセンブリはどちらも、システムで実際に何が起こっているかを、最も低いハードウェア レベルで高いレベルで可視化します。
一般にオブジェクト指向言語、特に C++ は、コードが実行されるときにシステムで何が起こっているかの詳細の多くを抽象化するため、システムの内部動作について推論することがはるかに難しくなります。
これが私が何を意味するかを説明する例です。次のコード スニペットを検討してください。
i++;
これを C プログラムで見ると、これが何をするかについてほぼ正確なアイデアが得られ、使用される CPU サイクルの数、関連するレジスタの数などの桁数がわかります。
同じ行が C++ プログラムで何をするのでしょうか? まあ、それは依存します。i の型と ++ 演算子がどのようにオーバーロードされているかによって異なります。私が何を意味するか分かりますか?
これらのどれも、C++ やオブジェクト指向が悪いと言っているわけではありません。そうではない。多くの組み込み開発者が必要と感じているように、システムで実際に何が起こっているかについての詳細に関心がある場合は、はるかに複雑なメンタル モデルが必要です。
技術的な観点から、組み込みシステムのリソースは限られています。オブジェクト指向言語は、純粋な手続き型のバイナリよりもはるかに大きなバイナリを作成する傾向があるため、多くの言語はできるだけ軽いものを選択します。たとえば、私はスマートカード会社で働いており、私のチームは、RAM が 1.5 ~ 1.75 KB、EEPROM が 96 ~ 136 KB の非常に低コストのカードを扱っています。この種の組み込み環境には、ほとんどのオブジェクト指向言語 (特に Java などの重い言語) は適合しません。私たちは標準的な C ライブラリを一切使用していません。すべてがゼロから作成されています。適切なコーディング手法と、rtti を生成しない、vmt を最小化する、スタック ベースのオブジェクトのみを使用するなどのコンパイラ オプションを使用すれば、C++ が適しているかもしれませんが、それは私の推測です。
「オブジェクト指向言語」は広すぎます。根本的に異なる特性を持つオブジェクト指向言語がたくさんあります。「C++ で実行できる」ということは、「どのオブジェクト指向言語でも実行できる」という意味ではありません。たとえば、それほど強力ではない AVR MCU 用の Python プログラムを作成できたことを幸運に思います。デバイスには 2kB の RAM と 32kB のフラッシュ メモリがあり、Python インタープリター自体はそれらに収まりません。
C++ は、高レベル部分と低レベル部分を同時に持つ言語です。これはオブジェクト指向ですが、最終的には、C またはアセンブリで直接記述した場合と同様に、適切な OO コードが生のマシン コードにコンパイルされます。「高レベル」(または高レベルのみ)と見なされる他のオブジェクト指向言語は、同じことを行うことができません。実際には、特定の言語の実装がすべてです。
他のすべての人が言ったことへの1つの追加:
顧客が要求するため、C++ 組み込みコードはあまり作成しません。私のフィールド コードでは認証を取得する必要がある場合があり、認証ガイドラインは C++ ではなく C に対してのみ存在します。
したがって、C++ がより良い製品につながるとしても、プロジェクトは C で実装する必要があります。