C++
出典: フリー百科事典『ウィキペディア(Wikipedia)』
| C++ | |
|---|---|
| パラダイム | マルチパラダイム |
| 登場時期 | 1980年代前半 |
| 設計者 | ビャーネ・ストロヴストルップ |
| 型付け | nominative, 安全でない強い静的型付け |
| 主な処理系 | GCC、Microsoft Visual C++ |
| 方言 | ANSI C++ 1998、 ANSI C++ 2003 |
| 影響を受けた言語 | C言語、Simula、Ada |
| 影響を与えた言語 | Java、C#、D言語、PHP |
C++(シープラスプラス、日本においてはシープラプラとも)は、汎用プログラミング言語の一つである。静的な型システムを持ち、手続き型プログラミング・データ抽象・オブジェクト指向プログラミング・ジェネリックプログラミングといった複数のプログラミングパラダイムをサポートするマルチパラダイムプログラミング言語である。また、高度な機能を使用してもプログラムの実行性能が低下しすぎないように、言語仕様・ライブラリに様々な工夫が施されている。1990年代以降、C++は、最もよく利用される商用のプログラミング言語の1つとなっている。
C++は、1983年にベル研究所のコンピュータ科学者であったビャーネ・ストロヴストルップが、C言語の拡張として開発した。当時の名前は「C with Classes」(クラス付きのC言語)というものであった。拡張はクラスの追加に始まり、仮想関数、多重定義、多重継承、テンプレート、例外処理といった機能が続いていった。C++言語の標準は1998年にISO/IEC 14882:1998として承認され、現在のバージョンは2003年に制定されたISO/IEC 14882:2003である。非公式にであるが新しいバージョンが策定中で、2010年までには正式に制定されるであろうことを見越し、「C++0x」と呼ばれている。(多くの人はおそらくそれが09年ギリギリになるだろうと考えている。)
目次 |
[編集] 歴史
ストロヴストルップはC with Classesの開発を1979年に開始した。彼は大規模なソフトウェアの開発に有用な特徴をSimulaが備えていることに気がついたが、Simulaは実行速度が遅く実用的でなかった。一方でBCPLは実行速度こそ速かったものの、大規模なソフトウェア開発を念頭に置いた場合にあまりにも低級であった。これらの事情を鑑みて、ストロヴストルップは当時既に汎用的な言語であったC言語にSimulaの特徴を取り入れることを試みた。この取り組みにあたってはALGOL68 やAda、 CLU、 ML等の言語の影響も受けている。最初はクラスと派生クラス、型検査機構の強化、インライン関数、デフォルト引数の機能を、Cfrontを介してC言語に追加した。1985年10月に最初の商用リリースがなされた[1]。
1983年にはC with ClassesからC++に名称を変更した。この際に、仮想関数と、関数と演算子の多重定義、参照型、const型、ユーザー制御可能な自由領域メモリ制御、型検査機構の改良、新しいコメント形式(「//」による行レベルのコメントアウト)などの機能が追加された。1985年には『The C++ Programming Language』の初版が出版された(邦訳『プログラミング言語C++』(1988年))。この時点では公式な標準が策定されていなかった為に、この本が事実上のリファレンスとなった。1989年C++のヴァージョン2.0として、多重継承と抽象クラス、静的メンバ関数、constメンバ関数、protectedメンバ等の機能が追加されたものがリリースされた。1990年に『The Annotated C++ Reference Manual (ARM)』が出版され、将来の標準化の土台となるものを提供した。後に追加された機能にはテンプレートと例外処理、名前空間、新形式のキャスト、ブール型が含まれた。
C++言語の進化に伴い、標準ライブラリもまた進化していった。C++標準ライブラリに最初に追加されたのは、従来のC言語の printf や scanf といった関数を置き換えるしくみを提供する、ストリームI/Oライブラリであった。それ以降の標準ライブラリへの追加で最も重要なものはStandard Template Library (STL)である。
長年にわたる作業の後、ANSIとISOの合同委員会はC++言語を1998年に標準化した(ISO/IEC 14882:1998)。1998年の標準の公式なリリースから数年間に渡って委員会は不具合の報告を続け、2003年に訂正版を出版した。2005年に「Library Technical Report 1」 (TR1)というテクニカルレポートがリリースされた。これは標準の公式な一部ではないが、次のバージョンのC++に含まれると期待される、標準ライブラリへの数多くの拡張を与えている。現在メンテナンスされているC++コンパイラの大部分が、TR1のサポートに取り組んでいる。
2003年12月に制定された日本工業規格JIS X 3014:2003(プログラム言語 C++)は、ISO/IEC 14882:2003 (E)の翻訳である。
[編集] C++という名称
この名称はRick Mascittiの功績で、最初に使用されたのは1983年の12月である。初期の研究期間では、開発中の言語は「C with Classes」と呼ばれていた。最終名は、変数の値を1つ加算する、C言語の「++」演算子からの派生である。また一般的な命名規則での「+」の使用は、機能強化されたコンピュータプログラムを意味する。ストロヴストルップによれば「この名前は、C言語からの変更の革新的な本質を示している」ということである。C+は、より初期の無関係なプログラミング言語の名前であった。
ストロヴストルップは著書「The C++ Programming Language」の前文で名前の起源を語り、ジョージ・オーウェルの「1984年」の付録から「C++」が連想されるかもしれないと付け加えている。新語法という架空の言語の解説に宛てられた3つの章の中に、科学技術に関する専門用語とジャーゴンの解説に宛てられた「C vocabulary」という章がある。新語法で「ダブルプラス」は最上級の修飾語である。ゆえに新語法で「C++」は「最も極端な専門用語またはジャーゴン」という意味になるであろう。
1992年、Rick Mascittiは名前について非公式に質問されると、彼はおふざけのつもりで命名したという旨の回答をした。彼はこの言語の正式な名称になるとは夢にも思わなかったのである。
[編集] 古くからの問題
伝統的にC++コンパイラには多岐に渡る問題点がある。C++言語の標準では、名前修飾や例外処理の実装や、その他の実装依存の機能については規定しておらず、異なるコンパイラが生成するオブジェクトコードには互換性がない。しかし、C++言語の標準化とは別に、特定の機種やOS上で動作するコンパイラを標準化する試みがある(例:C++ ABI[2])。このような機能のために、現在では多くのコンパイラが第二の標準に対応している。
長年にわたって、異なるC++のコンパイラはC++言語を異なるレベルの遵守性を持って実装してきて、それらの実装はテンプレートの部分特殊化のようにさまざまな領域に広がっていた。最近のほとんどのC++のコンパイラは標準C++ 1998[3]のほとんどの機能をサポートしている。論点の1つは 、テンプレートの宣言から離れてテンプレートを宣言することを許す export というキーワードである。最初に export を実装したコンパイラは2003年初め(規格の発表の5年後)にリリースされたComeau C++であった。続いて2004年Borland C++ Builder Xのベータ版のコンパイラがやはり export を実装してリリースされた。これらどちらのコンパイラもEDG C++フロントエンドに基づいていた。多くのC++の本(例えばイヴァン・ホートンのBeginning ANSI C++)がコンパイルされないだろうが、export というキーワードに関する問題への参照がなかった export というキーワードを実装したコードの例を提供したということも心に留めておくべきである。Microsoft Visual C++やGCCのようなコンパイラはまったくそれをサポートしていない。C++標準化委員会の書記官ハーブ・サッターは、export は将来のC++の標準から除かれるべきである ([1])と勧めていたが、結局結論はそれをC++の標準に残すというものに達した。
[編集] 将来
C++に対しては、今もなお要望が絶えない。特にBoostはC++の方向性の決定に大きく貢献し、さらにC++標準化委員会へ改良すべき点などを意見している。現在はマルチパラダイムプログラミングをより自然に行えるようにすることに力が注がれており、たとえばBoostでは、C++の関数型プログラミングやメタプログラミングの可能性を模索している。
C++ 0xと呼ばれている新しいバージョンのC++標準ではこれらが取り込まれることになると思われる。
[編集] 特徴
C言語に、オブジェクト指向プログラミングをサポートするための改良が加えられたものといえるが、他のオブジェクト指向を念頭において作られた言語と違い、旧来のCと同様に手続き型言語としても扱えるという特徴がある(このとき、C++をbetter Cというふうに呼ぶことがある)。また基本的にC言語に対して上位互換性がある。初期のC++はCへのトランスレータとして実装された(すなわち、C++プログラムを一旦Cプログラムに変換してからコンパイルしていた)。
その後、先祖であるC言語の標準規格制定時には、const修飾など、C++の機能がC言語に取り入れられることにもなった。現在ではC言語とC++との間には厳密な互換性はない。特にC99の出現により、C言語との互換性は完全に失われている。
次のような多種多様な機能を持っており、言語仕様は大変複雑である。言語仕様を完全に満たしているコンパイラは、現在数えるほどしかない。
ここから、よりオブジェクト指向を強化し、「なんでもあり」ではない代わりに分かりやすくスマートな設計を目指した新たな言語(Java、D言語など)が作られることとなった。
[編集] 単一行コメント
かつてC言語とC++との分かりやすい差異として、// で始まり改行で終わる、単一行コメントの有無があった。
単一行コメントはもともと、C言語の祖先にあたるBCPLに含まれていた仕様である。現在のC++のコンパイラの多くがC言語のコンパイラとしても使えるようになっているのと同様に、C言語が生まれて間もない頃は、C言語に加えB言語やBCPLのコンパイルができるコンパイラが用いられていた。それらコンパイラは、C言語のソースであってもBCPLと同様に単一行コメントが使用できるよう独自の拡張がなされていたため、BCPLの単一行コメントに慣れ親しんでいたプログラマ達は、C言語でも単一行コメントを使い続けた。その慣習がC++の誕生時まで生き残っていたため、C++では単一行コメントを「復活」させることになったのである。
そのためもあって、C言語での仕様外の単一行コメントの使用は半ば常習と化し、現在ではC99によって、C言語でも正式に単一行コメントがサポートされるようになった。
[編集] 標準ライブラリ
詳細は標準C++ライブラリを参照。
C++の標準ライブラリは大きく次のように分けられる。多種多様な実行環境が存在することを考慮して、スレッドやGUIに関するライブラリは標準に含まれていない。
C++では、C言語には存在しなかった、スタックや動的配列などのデータ構造を表現するライブラリが存在する。 その標準ライブラリの中でも特にコンテナ、イテレータ、アルゴリズムを表現するものをSTLと呼ぶ。STLでは、C++のテンプレートと相まって、非常に強力で汎用的なデータ操作を行える。
[編集] 外部ライブラリ
以下に、C++で広く使われていると思われるライブラリを挙げる。
- Boost 次期C++標準とも言われる様々なライブラリの集合。 正規表現を扱うBoost.Regex++や無名関数(ラムダ計算)を簡潔に記述できるBoost Lambda Libraryなどが有名。
- Apache Xerces C++での主要XMLパーサの一つ。Java版も存在する。
- CppUnit C++でのユニットテストフレームワーク。 クラス毎の動作確認に威力を発揮する。→xUnit
[編集] 主なC++処理系
[編集] 脚注
- ^ "Bjarne Stroustrup's FAQ - When was C++ invented? (English)" 2006-05-30閲覧.
- ^ "C++ ABI" 2006-05-30閲覧.
- ^ Herb Sutter (2003年4月15日). "C++ Conformance Roundup" Dr. Dobb's Journal. 2006年5月30日閲覧.
[編集] 関連項目
[編集] 参考文献
- 『プログラミング言語C++第3版』(1998) ビャーネ・ストロヴストルップ著 長尾高弘訳 アジソンウェスレイパブリッシャーズジャパン ISBN 978-4756118950
- 『C++の設計と進化』(2005) ビャーネ・ストロヴストルップ著 επιστημη監修 岩谷宏訳 ソフトバンククリエイティブ ISBN 978-4797328547

