2005-07-28
いまいち盛り上がりに欠けるEmbedded C++(EC++)ですが、一体どんなものなのか見ておくことにしたいと思います。
EC++は標準C++のサブセットを目指した規格で、以下の内容にポイントを置いて言語仕様が策定されたようです。
*1- オブジェクト指向的に有用な部分は残しつつ、複雑な機能は削除
- 組み込みシステム設計の要求を満たさない機能は削除
- 過度のメモリ消費を要求するもの
- 応答の予測が難しいもの
- コードのROM化を妨げるもの
- ANSI/ISO C++言語規格で、まだ仕様が確定していない機能は削除
具体的には以下の仕様が削除されています。
- mutable指定子
- 例外処理
- 実行時型識別
- 名前空間
- テンプレート
- 多重継承と仮想継承
- wchar_tとlong doubleのためのライブラリ
- 国際文字名
- 新しいキャスト
さらには、テンプレートが削除されたことで、STLをはじめとする標準C++ライブラリの大多数が削除されることになりました。結果として、C++の黎明期とさほど変わらないような状態まで、言語仕様がコンパクトになっています。
EC++か標準C++かの判別は、__embedded_cplusplusマクロの定義状態で判別することができます。EC++は標準C++のサブセットを目指していましたが、現実には互換性のない部分がかなりあります。そのため、両方に対応するコードを書くには、条件付コンパイルが必須です。
まず、EC++は名前空間がサポートされていないため、ライブラリ機能を使おうとするとシンタックスに一貫性がなくなります。例えば、標準C++ではstd::size_tと書きますが、EC++は単にsize_tと書かなければなりません。<stddef.h>をインクルードしようにもEC++ではサポートされていません。
次に、組み込み環境の多くは
フリースタンディング環境に該当しますが、標準C++ではサポートされないライブラリの多くがEC++ではサポートされています。つまり、EC++で実装されたコードをそのまま標準C++に持っていっても、ライブラリが不足しているために使えないのです。
最後に、EC++は例外処理機構をサポートしていないため、EC++で実装されたコードは例外安全をはじめとする
例外処理の影響に配慮されていないと思われます。したがって、そうしたコードを標準C++に持っていっても、信頼性に大きな問題があります。
このように、EC++は標準C++のサブセットであると考えるより、まったく別の言語だと考えた方がよさそうです。テンプレートと例外処理を使うつもりがないのであれば、「より良いC(better C)」として使うには、手軽で便利な言語であるといえます。
*1 EC++ Japanese Home Page - language_specより引用。
Comment