2013-03-15

Bjarne Stroustrupのお言葉

Explicit and implicit constraints - Google Groups

ConceptのMLで、Bjarne Stroustrupが興味深い発言をしている。

この機会に言っておく。

  • 「できるからといってやるべき理由にはならない」それと
  • 「どんな技法でもできるというのは機能ではなくバグだ」

後者について、ダイクストラの有名な「Gotoは有害である」という論文を思い出せ。論点は、「新機能」(ループ構文)がgoto技法でできるすべてをよりより簡単にできるようになったということではなく、簡潔化された良きプログラミングのために、ある種の技法は避けるべきであると説いたのだ。

ConceptとConcept Liteは良きジェネリックプログラミングを単純化するためにあるのだ。すべてのメタプログラミングとマクロプログラミングの技法を置き換えるための機能ではない。君が達人で、そして君の達人的な意見とやらで、君と君のユーザーが、そんな技法を使えるべきだと思うのならば、使えばいい。だが、我々は多くの、大多数のテンプレートの正しい利用をもっと簡潔にし、もっと普及するようにしているのだ。そのためにConceptとConcept Liteがあるのだ。

今では信じられないかもしれないが、当時は、関数宣言に多数の反対者がいたのだ。「この機能は関数の使い道と、分割コンパイルの利用方法を制限してしまう」とな。そして、virtual関数にも相当の反対者がいた。「関数へのポインターの方がもっと柔軟じゃないか」とな。私には、Concept Lite(とConcept)は、goto対for、未チェック関数実引数VS関数宣言、関数へのポインターVS抽象クラスの対立と同じように思えるぞ。

とはいうものの、正直今のC++は根本的に難しい。C++を書くときには、常に規格書を参照しなければならない。C++を書くときに規格書を開いていない人間というものは、どうもちょっと私には想像できない。そんな現状の言語にしておいて何を今更と言いたくなる。

コンセプトに関しては、こんなことがあった。まだC++11がC++11という名前ではなく、C++0xと呼ばれていて、ドラフト規格にコンセプトが入っていた頃、標準委員会の日本支部で、chronoもコンセプトで実装されるべきじゃないかという提案をした者がいた。そこで日本支部としてそういうコメントを送ったところ、「おおそりゃいい、是非実装して提案してくれ」という返事が返ってきた。このコメントの提案者は、苦笑いするだけであった。その後程なくしてコンセプトはドラフトから削られた。

提案だけしておいて実装しないとは口先だけかと批判したくなるかもしれないが、その当時、ドラフト入りしていたコンセプトについて理解している日本人が何人いたというのか。私は理解できていなかった。規格を読んでもさっぱりわからなかったし、そもそも理解するだけの価値があるようには思えなかった。ようやく理解できたのは、すっかり忘れていた頃、コンセプトがドラフトから削られるというニュースを聞いて、そこで改めて規格を読み、ようやく理解できたのだ。

だいたい、コンセプトのまともな実装もなかった。ConceptGCCとて、いまAppleに雇われてClangの開発をしている人の開発していたコンセプト実装があったが、規格を読んで書いた通るはずのコードが通らず、逆に通らないはずのコードが通ってしまうなど、まともに使えたシロモノではなかった。

あげくにaxiomだとかいう機能まである始末。axiomを解釈するC++用のツールが出てくるとは思えないし、かといって人間が読むかというとそれもない。axiomによって書かれた暗号のようなコードを読むぐらいなら、コメントに自然言語で書いたほうがいい。

今回のConcept Liteは、まあこれは主に実装者が使う機能だから、まあいいのではないかと思う。少なくとも、標準ライブラリには、これこれの条件を満たした時、満たさない時にオーバーロードの候補に上がらないと規定されている関数がたくさんあり、C++11でこれを実装しようとすると、SFINAEの技法を駆使した変態的なコードになってしまう。それがboolを返すconstexpr関数を指定するだけでオーバーロードの候補から外せるとなれば、とても簡単になる。

まあやっぱり、C++0x提案時の、constrained templateとunconstrained templateに分断したのは間違いだったと思う。

No comments: