ホーム 言 語 仕 様



Embedded C++言語仕様は、ANSI/ISO C++言語仕様に対する修正という形で定義している。具体的には、Embedded C++言語仕様に含めなかった機能について「なぜ含めなかったのか」を示す理由書と、現在一般に公開されているANSI/ISO C++言語ドラフト(*1)に対する修正書という形で言語仕様を規定している。

Embedded C++言語仕様策定のポイント 言語仕様の概要 削除された機能とその理由


Embedded C++言語仕様策定のポイント

ANSI/ISO C++言語仕様から、Embedded C++言語仕様を策定した際のポイントは、以下の通りである。

  • オブジェクト指向的に有用な部分は残しつつ、複雑な機能は削除
  • 組み込みシステム設計の要求を満たさない機能は削除
    • 過度のメモリ消費を要求するもの  
    • 応答の予測が難しいもの  
    • コードのROM化を妨げるもの  
  • ANSI/ISO C++言語規格で、まだ仕様が確定していない機能は削除

言語仕様の概要

Embedded C++ 言語仕様は、ANSI/ISO フルセット C++から次の機能を除いている。これにより、オブジェクト指向のメリットを十分に残し、メモリに余裕のないプロセッサの標準的な組み込みプログラマが安心して利用できる言語仕様を提供している。

  • mutable指定子
  • 例外処理
  • 実行時型識別
  • ネームスペース
  • テンプレート
  • 多重継承と仮想継承

上記を除いたEmbedded C++言語仕様が提供する主な機能は表3の通りである。(文法については付録を参照)

表3  Embedded C++ 言語仕様が提供する主な機能

* inline関数宣言
* new/deleteによるメモリ確保/解放
* 局所スコープにおけるオブジェクト宣言位置の自由化
* スコープ決定演算子による名前の決定
* リンケージ指定
* 参照型
* デフォルト引数
* 無名共用体
* 関数の多重定義
* 利用者定義演算子
* クラス宣言

- アクセス制御
- 単一継承
- 静的データメンバ
- メンバへのポインタ
- 仮想関数
- 抽象クラス
- コンストラクタ/デストラクタ
- 利用者定義変換

これらの機能の詳細については、C++言語に関する書籍等を参照されたい。



削除された機能とその理由

削除した機能について、含めなかった理由を説明する。

(1) mutable指定子
mutable指定子の機能は、const指定されたオブジェクト(constオブジェクト)に対して変更可能なメンバを設けることである。通常constオブジェクトは、その中身が変わらないことが保証されているわけだが、mutable指定子を伴って宣言されたメンバに関してだけは、その保証を無効にする、つまり値を変更することができる。
しかし、組込み系のプログラミングでは、constオブジェクトはROM領域に置かれることが期待されており、mutable指定子の存在は、この期待を裏切ることにつながる。このため、Embedded C++ 言語仕様には含めない。

(2) 例外処理
例外処理の機能は、エラー処理をスマートに書くことである。伝統的なエラー処理では、プログラムの末端でif文による条件判断を行なってエラーリカバリをしたり、関数の戻り値としてエラー状態を示す値を返し、それを上位関数で検知してエラー処理を行なっていた。しかしこのような手法では、プログラム本体部分と、エラー処理部分のコードがプログラム中に混在し、見通しの悪いプログラムになってしまう。C++言語ではこの欠点を解消するために、例外処理機能を提供している。
しかし例外処理機能は、例外が起こった時にデストラクト処理(*2)が必要なオブジェクトを管理しなければならず,そのためにプログラマが意図しないメモリを消費してしまうという問題がある。また例外が起こってから実際に例外ハンドラ処理を始めるまでの間にデストラクト処理を行なわなければならず、そのために例外が起こってから実際に例外ハンドラ処理(*3)が実行されるまでの時間が見積にくいという問題もある。このため、Embedded C++ 言語仕様には含めない。

(3) 実行時型識別
実行時型識別の機能は、キャストされて元の型がわからなくなった多相型オブジェクト(*4)の実際の型を知ることである。この機能を実現するためには、多相型オブジェクトの型情報を実行中に管理しなければならず、そのためにプログラマが意図しないメモリを消費してしまうという問題がある。このメモリは、実行時型識別機能を使うか使わないに関わらず、消費されてしまう。
また本委員会が想定する組込みプログラムでは、多相型オブジェクトはそれほど多く利用されることはないと判断し、Embedded C++言語仕様の機能に含めない。

(4) ネームスペース
ネームスペースの機能は、プログラム中で使われる識別子名の衝突を避けるために、プログラマが独自に識別子の名前を付けられる空間(名前空間=ネームスペース)を宣言することである。しかしこの機能はEmbedded C++言語仕様を検討していた1996年7月の段階で、まだANSI/ISO委員会で意味論の細部を検討しており、その動作が確定していなかった。
またEmbedded C++が対象としている組込みシステムは、利用可能なメモリもそれほど多くはなく、プログラム規模も大きくないと考えている。そのようなシステムの場合、識別子名の衝突はそれほど大きな問題ではなく、回避可能であると判断した。このため、Embedded C++の機能に含めない。

(5) テンプレート
テンプレートの機能は、型自体を引数的に扱うことにより、より汎用的なクラス/関数を作成することである。しかしこの機能もネームスペース機能と同じく、Embedded C++言語仕様を検討していた1996年7月の段階で、まだANSI/ISO委員会で意味論の細部を検討しており、その動作が確定していなかった。
またテンプレート機能を不用意に使うと、プログラムサイズを増大させ、コンパイル時間も長くなるという問題も生じる。そこで、Embedded C++の機能には含めない。

(6)多重継承と仮想継承
多重継承の機能は、複数のクラスの性質(メンバとメソッド(*5))を受け継ぐことである。しかし、複数のクラスの性質を受け継ぐようなクラス階層を設計し、その全体を把握してプログラミングを行なうことは、ソフトウェアの専門家にとってさえも難しく、気軽に使えるような機能ではない。また不用意に多重継承を使うと、ソースプログラムの可読性を下げ、再利用を難しくしてしまうという問題もある。このように、多重継承機能は簡単に理解できるサブセットを作るという目的から外れるで、Embedded C++の機能には含めない。
 また、仮想継承は、多重継承を行なった時に意味がある機能であり、この機能も含めていない。



[用語集]------------

(*1)ANSI/ISO C++言語ドラフト
ANSI/ISO委員会が1996年12月2日に発表した、いわゆるCD-2(committee draft-2)と呼ばれるドキュメントのこと。http://www.setech.com/x3.html や http://www.maths.warwick.ac.uk/c++/pub/ などで入手可能(英文)。

(*2)デストラクト処理
C++言語では、オブジェクトが使われなくなった時に、そのオブジェクトの後始末をするための処理が自動的に呼ばれる。この処理のことをデストラクト処理と言いう。

(*3)例外ハンドラ処理
プログラム実行中にエラーが発見された時に呼び出される処理のこと。

(*4)多相型オブジェクト
仮想関数を持つクラスのオブジェクトのこと。

(*5)メソッド
クラスに関係する操作を行なう処理のこと。



BACK HOME NEXT