C++の歴史

江添亮
http://cpplover.blogspot.jp/
boostcpp@gmail.com
@EzoeRyou

GFDL 1.3 with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

Themes

Sky - Beige - Simple - Serif - Night - Default

Transition Styles

Cube - Page - Concave - Zoom - Linear - Fade - None - Default

C++の原作者

Bjarne Stroustrup

C++のオリジナルの設計者にして最初の実装者

1979年

Stroustrup、ケンブリッジで博士号を取得するべく研究中

分散システム上で動作するソフトウェアの研究

実証のため、大規模なシミュレーターを書かなければならない

Simulaで書いた

Simulaの利点

「Simulaで書くのは最高だった」

クラス機能によって、問題をそのままコードに落とし込める

クラス自体がコルーチンのように並列実行できる

強い型システムとコンパイル時警告

Simulaの欠点

分割コンパイルしてリンクが遅い

実行速度が遅い

メモリ確保がすべてGC

これらを無効にする方法がない

リンクが遅い

僅かな部分をコンパイルして、
コンパイル済みのバイナリへのリンクが遅い

すべてのソースコードを単一のファイルで
コンパイルするのに比べて、30倍遅い

ガベージ・コレクション

メモリ確保はすべてGC

明示的にリソース管理をしているのにすべてGC

実行時間の80%がGCで浪費

研究中断の危機

シミュレーターが遅すぎて使い物にならない

このままでは研究が実証できない

Stroustrupの博士号が危うい

書き直し

BCPLで全面的に書きなおした

BCPL

「BCPLに比べれば、Cがとても高級な言語に見えた」

型がない

コンパイル時チェックもない

何もない

速い実行

BCPLはとても速い

リンクが速い

実行速度も速い

シミュレーターは動いた

Stroustrupの誓い

二度とまともなツールなしに大規模な問題に取り組まないと誓う

  • 良きツールはSimulaの表現力を持つべきである
  • 良きツールはBCPLのリンク速度を持つべきである
  • 良きツールは他の言語のバイナリとリンクして使えるべきである
  • 良きツールはBCPLの実行速度を持つべきである

その後

Stroustrupは、なんとか博士号を取得。

ケンブリッジを去る

Bell Labで職を得る

Bell Labの特徴

十分なコンピューター資源が与えられる

優秀な同僚(K&Rも在籍)との議論が推奨される

仕事内容、「なにか面白いことをやれ」

結果は一年後に報告

研究

ネットワークに繋がれたコンピューター群
その上で動作するUNIXカーネルについて

  • 分散カーネルのネットワークトラフィックの解析
  • カーネルのモジュール化

誓い

まともなツールなしでは
二度と大規模な問題には挑まない

まともなツールを作る

Cpre

C言語に独自のプリプロセッサーを組み合わせたツール

C言語にSimulaのクラス機能をもたらす

C with Classes

名前を変えてツールから言語へ

手で書くCと変わりない実行効率

他の言語とリンクできるバイナリ互換

線形探索より複雑なアルゴリズムを使わず実装可能

1982年

C with Classesは複数のプロジェクトで使われるようになった

これより進化させるには、本物の言語として、新たに設計と実装が必要

得られた経験をもとに、新しい言語C++を作る

C++という名前

Rick Mascittiが提案

元ネタはK&RのC言語

その元ネタはMartin RichardsのBCPL

さらに元ネタはKen TompsonのB言語

CFront

StroustrupによるC++のリファレンス実装

移植性を重視

C++の完全なコンパイラー

無料

リファレンス実装

C++の設計と進化のための実装

ツールとしては貧弱

C++が十分に普及すれば独立した実装が出るはず

それまでの間、動く実装を提供

移植性

世の中にはコンピューターの種類が多すぎる

名前すら聞いたことのないようなOSがある

アセンブリや中間コードを出力したのでは対応しきれない

C言語コンパイラーはほとんどの環境にあり、移植性が高い

Cコードを出力

完全なコンパイラー

CPP済みのC++コードを受け取る

パース、内部表現に変換、解析、Cコードで出力

単なるプリプロセッサーではない

無料

C++普及のために必要

多くの自称良いツールは

  1. 高価で買えない
  2. 動作するコンピューターも高価で買えない
  3. しかも販売開始は常に「来年」

商用の需要

多くの教授が、商用コンパイラーを要求した

  • 業界で使える
  • コンサルできる

そこで商用版も発売した

結果、CFrontの改変版が各社から発売

ジェネリックプログラミング

アルゴリズムとデータ構造は
特定の型やバイト列とは独立して実装できる

オブジェクトのサイズや、構築やコピー方法さえ引数化できれば
後は汎用的に実装できるはず

汎用化できる例


int min( int x, int y )
{ return x < y ? x : y ; }

double min( double x, double y )
{ return x < y ? x : y ; }

汎用化できる例


struct int_list_node
{
    int value ;
    int_list_node * prev ;
    int_list_node * next ;
} ;

プリプロセッサーは有害

プリプロセッサーは字句的に処理する

文法やスコープを考慮しない暴君

文法とスコープを尊重する機能がほしい

テンプレート

型を引数にできる機能


template < typename T >
T min ( T x, T y )
{ return x < y ? x : y ; }

汎用的なコンテナー

テンプレートはコンテナーを書くために設計された

コンテナーとは値の集合を管理するためのクラス

実装に使うデータ構造がどうあれ、操作は汎用化できる

STL

C++の標準ライブラリ

主にコンテナーとアルゴリズム

Alexander Stepanovが設計、実装

Adaでの挫折

Adaも早くからテンプレート機能を持っていた

Stepanovは、当初AdaでSTLの実装に挑戦

当時のAdaコンパイラの実装の問題により挫折

C++で花開く

その後、Bell研究所に転職 StepanovがC++にやってきた

C++でようやくSTL実装に成功

メタプログラミング

コンパイル時に行うプログラミング

起源

1994年、Erwin Unruhが標準化委員会で提示したテンプレートのコード

コード自体はコンパイルエラー

ただし、エラーメッセージが、素数のみ出力される

UnruhはC++における最初のメタプログラマーとなる

思わぬ誤算

Unruhの意図

テンプレートはコンパイル時プログラミングを行えるほど複雑である

ゆえに、もっと制限を加えるべき

大多数の標準化委員会の感想

「すばらしいものだ」

メタプログラミングの繁栄

その後、多くのメタプログラミング技法が発見される

メタプログラミングをサポートするための機能が多く追加される

今後も発展が期待される

標準規格とは?

理想

あるプログラムが合法か違法か決定できるもの

現実

C++では、すべてのプログラムに白黒をつけることができない

定められない挙動の例

  • int型の具体的なビット数
  • 浮動小数点数の実装方法
  • ゼロ除算

目的

C++の標準規格を制定する

C++の分裂を防ぐ

実装依存

ある種の挙動は規定せずに実装にまかせる

D&E時代の標準化委員会

ANSIとISOがある

下院(ANSI)と上院(ISO)のような関係

ANSI

ほとんどの規格制定はANSIで行う

議論、提案、文面変更など

メンバーはたいてい企業の代表

投票権はひとつの企業につき一票

特定の企業を代表しない個人も一票

年三回ほど、一週間の会議が開かれる。

ISO

ANSIの作業結果を投票により承認する

主要な各国に支部がある

投票権は、ひとつの国につき一票

規格制定の流れ

  1. ANSIがCDを出す
  2. ISOの各国支部がNBコメントを出す
  3. 1.に戻る

最終的に、FCDを出す

ISOの各国支部が投票する。

可決されれば規格制定

慣習的に、規格制定は全員一致

用語

CD
Committee Draft、委員会による規格案
FCD
Final Committee Draft、正式規格とほぼ変わらない文面案
NBコメント
National Body Comment、各国支部による意見

現在の状況

ドラフト編集作業では、特に国籍にはこだわらない

アメリカの標準団体が強権を発揮することもない

関心のある企業、グループ、個人が提案

議論、文面案作成、ドラフト入り

新機能の提案を会議のために準備し、会議で可決される

現在の規格制定

CDに対して各国支部が国を代表するNBコメントを出す

最終的な投票も一国一票

慣習的に全国一致で規格制定

投票権というよりは拒否権

はやく正式な規格が制定されてほしいという利害は一致

十分に妥協できるところで規格制定

現在の会議以外の活動

会議以外の議論は非公開のメーリングリスト

非公開の理由は、積極的な議論を促すため

しかし、今の時代には閉鎖的

開かれた議論へ

C++の標準化と啓蒙を目的としたC++財団を設立

誰でも参加できるメーリングリストを設置

それまで納期ごとに一括公開していた論文を、逐一公開

その他、C++の教育記事執筆など

ドラフト規格をGitHubに

C++のドラフト規格のソースコード(tex)をGitHubで公開

Pull Requestも絶賛受付中

cplusplus/draft

C++98

1998年

遅れに遅れた標準規格が制定

規格制定にあまりに時間をかけすぎてしまった

C++実装が規格に追いつくための時間が必要

委員に最新技術に追いつくための時間が必要

標準化委員会の活動をしばらく縮小

C++03

2003年

文面の曖昧な点や矛盾点を修正したマイナーアップデート

新機能はほとんどなし

C++0x

世はC++のさらなる進化を必要としている

標準化委員会の活動、再び活発化

大規模な文面変更と新機能追加

200x年に制定予定なのでC++0x

C++11

2011年

遅れに遅れて、ようやく規格制定

「C++0xのxは16進数」というジョークまで

特にコンセプト機能でもめた

一旦ドラフト入りしたコンセプト機能を取り除くだけで一年半以上遅れた

C++1y/C++14?

2014年制定予定

C++11に対するマイナーアップデート

文面の曖昧性や矛盾点を多く解決

小粒な新機能を追加

Clangがすでに機能完全に実装済み

GCCも積極的に実装中

C++17?

2017年制定予定

次のメジャーアップデート

多くの新機能を追加する

C++ Working Group Japan

ISOのC++WGの日本支部

日本を代表して意見と投票を行う

設立

1992年、1993年頃

C++WG JP設立前にも私的な会議が何度か行われていた

慶応SFCの斎藤信夫先生が設立に尽力

「日本でも標準化にコミットするための委員会をつくろうと思う」

斎藤信夫先生が初代主査

C++WG JPの組織

日本の情報規格調査会傘下

委員
企業のスポンサーを受けた代表で投票権を持つ
エキスパートメンバー
スポンサーを持たない個人で投票権を持たない
メールメンバー
主にメーリングリスト経由で参加している人

EC++という黒歴史

複雑になりすぎたC++のサブセットを作ろうという日本の動き

実装が簡単でオーバーヘッドのないサブセット

C++WG JPとは独立した業界団体

8-bit, 16-bitマイコンでも使えるC++のサブセットの規定

1995年11月10日に第一回会議が行われる

参加者

NEC、日立、富士通、松下、三菱、日本モトローラ、東芝の半導体部門の開発ツール担当者

ツールベンダ

Cygnus,GreenHills,PlumHall,Dinkumware,ADaC, 日本ノーベル,横河YDC

Stroustrupは感心せず

C++に独占権利を主張するわけではないが・・・

言語の分裂は利用者も分断してしまう

どうせやるならば、標準化委員会で議論してはどうかと提案

EC++が標準化員会に

EC++団体が標準化委員会に合流

国際会議で提案を発表

しかし、ゼロオーバーヘッドで実装できるとの反論多数

反論がPerformance TRとしてまとめられる。

EC++失敗

日本独自のよくわからない理由で機能削減されたサブセット規格

各社独自の閉鎖的な環境で開発されたコンパイラー

プラットフォームは非力なマイコン

使われるわけがない

C++WG JP冬の時代

2000年代から、存続の危機に

スポンサー不足

既存のスポンサーはEC++のコンパイラー実装のため

余裕のある一部大企業を除いてスポンサー大量離脱

その一部大企業も、もはや標準化委員会の籍をおいているだけ

国際会議はおろか、国内会議にも出席せず

教育者不足

2005年

C++WG JPに籍をおいていた最後の教育関係者にして三代目の主査が逝去

東京工科大学の越田一郎先生

以降、C++WG JPに教育関係者なし

しばらく主査は東芝の林田が担当

現在の主査は日本アイ・ビー・エムの安室

人材不足

2007年

もはや国際会議に日本代表を送るスポンサーがいない

国内会議にも3,4人しか出てこない

林田の意見

企業側の標準C++への関心低下

C++の仕様が大きくなりすぎたため、
1企業単独で C++コンパイラを開発するのは困難となり
EDG や Dinkumware などを購入して C++を構築するようになった
このため、標準C++に対する関心が低下した。

江添の意見

言語規模にかかわらずコンパイラーの開発は広い分野の人間を必要とする

一社単独の閉鎖的な環境でコンパイラーを開発できる時代ではない

そのような不自由なコンパイラーは、規格準拠度が低い

自社のコードだけコンパイルが通ればよいという考えに陥りやすい

EDGやDinkumwareのような不自由ソフトウェアではなく

GCCやClangのような自由ソフトウェアに金を出すべきだった

存続の危機

2006年

スポンサー、教育者、人、何もかもが不足

国内活動すらままならない

このままでは存続すら危うい

生き残りをかけた勧誘

日本を代表して意見表明するC++WG JPを残さなければならない

せめて、人材だけは維持しなければならない

人づてにエキスパートメンバーを勧誘

エキスパートメンバーが大幅に増える

個人に年会費などはない

いびつな勢力図

極小数のスポンサーつき委員

圧倒的多数の活動的なスポンサーなし個人

いびつながらも国内会議が続けられるように

C++WG JP存続

国内会議

国際会議でドラフト入りした提案論文のレビュー

レビュー:論文を全訳して問題点の洗い出し

NBコメントの取りまとめと議論

スポンサー離れの弊害

C++03までは、規格の日本語訳をJIS規格として出していた

人と金を出すスポンサーからの要請

今はスポンサーもいない

大多数の人も義務のないスポンサーなしの個人

C++11のJIS規格のための翻訳が行われない

C++11以降は、会議すら行われない

新しい動き

標準化委員会の会議は、メンバーしか参加できない

会議には、場所の確保やら議事録の作成やら、事務仕事が多い

しかし、大多数のメンバーはスポンサーを持たない個人

なぜそんな閉鎖的な会議にするのか?

勉強会という名の会議

委員会の外の非公式な勉強会

費用はほとんどかからない

委員会外からも参加者を募れる

最近の活動は、もっぱら非公式勉強会

東京在住のエキスパートメンバーが主催

参考文献

取材協力

足立 高徳(ARMを翻訳した人)

林田 誠司(東芝)

2014年

日本のC++界に激震走る

江添亮

ドワンゴ入社

なんと

C++の啓蒙活動に金が出る

国際会議に行ける

これまで行く金がなかった

国際会議の参加方法

National Bodyを通して参加

すなわちC++WG JP

参加するには

日本代表(Head of Delegation)となる

日本国を代表し

全C++利用者を代表し

全権委任されて

日本国の代表として参加

重すぎる肩書

あまりにも重すぎて

上位組織が認めない

先例

2009年に、一人だけ参加した者がいる

当時の議長に私的に連絡を取り

議長のお友達として潜り込んだ

ハァッ?

日本のNational Bodyに身を置いている人間が

何故そんな屈辱的な非正規の方法で

国際会議に参加しなければならないのか

日本代表のなり方

上位組織に認めてもらう必要がある

具体的な方法

上位組織の個人と、委員会の外で私的に懇意になって認めてもらう

ふざけるなッ!

National Bodyの存在意義は

国家の代表を国際会議に送り込むことだ

ここにその機会と能力のある人間がいる

国際会議に参加できないとはどういうことだ

議長のお友達枠で潜り込むとはどういうことだ

委員会の外の活動とはどういうことだ

C++小委員会は

個人メンバーの活動に支えられてきた

ITSCJは金が欲しい

ITSCJ = 社団法人情報規格調査会

金は規格賛助員の会費で賄われてきた

規格賛助員とは、企業がなるもの

最近ITSCJには金がない

ITSCJの規格賛助員が減ったため

ITSCJに魅力がないから減った

金欲しい

でも、規格賛助員は増えない

上位組織の決定

個人メンバーは金を出さないので不公平である

よって、個人メンバーの扱いを変える

役職剥奪

従来のエキスパートメンバーとメールメンバー資格は

個人メンバーからは剥奪

みすぼらしい役職

アドバイザーを新設

個人メンバーはアドバイザーに押し込める

この機会に個人メンバーの数を減らす噂

これまでC++小委員会の活動を

支えていた個人メンバーに

何たる扱いだ

個人メンバーがいなくなれば

C++WG JPはさらに活動停滞する

江添亮は規格賛助員になれたとして

何の活動もない組織になぜ金を払う必要があるのだ

上位組織の成果

金を払わない個人メンバーを追い出して

ますます金を払う価値のない組織にした

おめでとう

これは政治だ