March 23, 2012
標準のむかう道: The C++ Standard Library著者Nicolai Josuttisへのインタヴュー

source: http://www.informit.com/articles/printerfriendly.aspx?p=1846582


Danny Kalevが“The C++ Standard Library: A Tutorial and Reference, 2nd edition”の著者であるNicolai Josuttis氏に、氏の新著について、またC++11の好ましい点、好ましくない点について、そしてなぜC++が氏の最良の言語でないのかについてインタビューを行った。


Danny Kalev: The C++ Standard Library: A Tutorial and Reference の第一版は1999年、C++98として知られるC++の最初の標準規格が承認された次の年に出版されました。この第一版と、もうすぐ出版される第二版の主な違いについて教えてください。

Nicolai Josuttis: えっと、僕はC++11の標準化プロセスを追いかけていなかったんだ。2008年末、vectorやpairのようなクラスがC++98/03とどう変わったのか調べるべく僕は初めて新しい標準を見た。とても衝撃を受けたね。"いったいぜんたい、このクラス宣言にある && はどういう意味なんだ?" …理解するまでとても戸惑ったのを覚えているよ。さて、C++98との違いについて聞くなら、僕はまるっきり違うと答えるね。単純なプログラムの書きかたも、複雑なクラス定義も劇的に変わっている。例えば、C++11のpair<>は行数にして倍ほど増えている。

でも、変化の方向は正しいと思う。C++11はC++の力-パフォーマンス-に重点を置いている。だが、これはプログラマがよいクラスを設計する難易度が上がるという障害を伴う。…ふむ、そう困難でもなくなるかもしれない。プログラマが知るべきことをきちんと知っていれば。…だが、今や知るべきことをきちんと知るのは非常に難しい。ある意味で、C++11はまったく新しい言語で、僕の本は新しいC++プログラミングスタイルと新しいクラスを含めて、この変化を単に反映したものだと言えるかもしれない。

Danny: どうして第二版を書こうと思ったのですか?読者の要求があったからですか?それともC++11標準が出たからですか?

Nicolai: どっちもだよ。C++11をカヴァーするよう更新してほしい、というリクエストは常だ。

Danny: C++を主に使っていて、C++11の変化についていきたいと考えているプログラマにとって、C++11標準ライブラリをマスターする最良の方法はなんでしょうか?一般的なC++erにとって重要なC++標準ライブラリの特徴とはなんでしょうか?

Nicolai: 僕の本を買ってください;-) どの特徴が重要になるかは、プログラマと問題領域に依るね。もちろん、concurrencyやmultithreadingサポートという点にそそられるプログラマはきっと多いだろう。だけど他のプログラマは乱数生成(これはC++11標準の26.5節に記述されている)に興味があるかもしれない。一般的なプログラマにとって、最も重要な変更は多分言語コアにあるはずだ - 標準ライブラリの使い方を劇的に変えるようなものもあるからね。

Danny: templateは標準ライブラリの根幹です。containerやalgorithm、iteratorはtemplateの上に組み上げられてますし。では、多態や仮想関数、継承といった古典的なOOPの原理は、今日的C++ではもはや過去のものなのでしょうか?

Nicolai: ふむ、いくつか回答を思いついたよ。まずは、templateは(実行時ではなくコンパイル時の)多態に使えるよ、ということ。次に、C++は純粋オブジェクト指向言語でもなければ、純粋ジェネリック言語でもない、ということ。C++の真価はこの二つを組み合わせたときにこそ発揮されるのだ。…最後に、端的な回答を。"はい。そのとおり"。

Danny: では、C++の言語コアについてお話を聞かせてください。lambda expression の利点は、もしあるなら、いったい何でしょうか。この機能が一般的なプログラマのコードで広く使われるようになると思いますか?それとも主にC++ライブラリの中で使われるに止まると思いますか?lambda expressionが潜在的に持っている短所はありますか?

Nicolai: 僕がC++でプログラムを書くとき、もう二度とalgorithmと関数オブジェクトを組みあわせて使わないことを宣言するよ。でも公平を期していうなら、最近あんまりプログラミングしてないんだけど。それでもまぁ、僕はそんなに特殊な部類には入らないと思う。僕の意見では、lambdaが導入されてようやく、algorithmを使ったコードを高速かつ読みやすく書けるようになったと思う。これはすばらしいことだ。まぁ、lambdaには問題もあるね。(関数オブジェクトのように)lambdaは局所的な振舞いを規定するけれど、複数の呼び出しの間で状態を保持しない。この点では、関数オブジェクトの出番はまだあると言えるだろう。

Danny: rvalue referenceはC++11言語コアで一番大きな変更だと思います(この機能の詳細についてはこちらを参照のこと)。実際のアプリケーションでこの機能を使う機会はありましたか?使える機能だと思いましたか?この機能の利点はなんでしょう?

Nicolai: 申しわけない。このところ僕のプロジェクトではC++をあまり使っていないんだ。繰りかえしになるけど、僕のC++11の知識は第二版を書く中で身につけたものなんだ。でも、実際に試行して、機能についてはコミュニティのエキスパート達と議論を重ねてきた。だから、この本は初心者が書いたものじゃない。言わば、"熟練した初心者"が書いたものなんだ ;-)

さて、そういう訳で、新機能のなかでrvalue referenceが一番重要な変更かどうかは分からないよ。まぁC++の利点 - 例えばパフォーマンス -をさらに強化する鍵であるとは思う。しかしながら、この本のなかで、ムーヴセマンティクスとrvalue referenceが導入された動機と、機能の説明をするのがどれほど大変なことか分かっている。僕にとっての、C++の一番目を惹く変化は auto、range-based for、initializer listかな。これら三つの機能のおかげで、もうこの機能なしではやっていけないくらいに、小さな例示コードをとても明快に書けるようになった。

Danny: よくC++11は妥協の産物だと言われます。特定の機能(例えば、自動ガーベッジコレクタ、スレッドプール、ソケットライブラリ)は標準に載りませんでした - 標準策定期間が伸びてしまうので。あなたはこのC++11標準はよくできていると思いますか?2003年の時点で持っていた期待に沿うものですか?

Nicolai: この本を書き終えて、僕はC++11の大ファンだと胸をはって言えるよ。あわせて、これらの小さな単純化と改良は相当なものだとも。でもまた、C++を構成する機能とコンポーネントを使い熟すのは時として困難だ。そして、templateのインスタンシエーションにまつわるエラーメッセージはいまだに大問題だ。(Danny註:templateまわりのエラーメッセージは解読するのが骨である) 思うに、標準委員会は単純化にそれほど気を払っていないようだ。ええと、これは標準化作業に関わっている人への苦情ではないよ。彼らは信じられないほど大変な仕事を、よくやってのけていると思う。C++では、メンテナンス中のすべてのソフトウェアで彼らの成果を感じることができるはずだ。多くの問題は、後方互換性を維持することに由来する不均質性に起因しているからね。

Danny: C++11にはなにが欠けていると思いますか? どんな機能やライブラリが次のC++標準で取り入れられて欲しいですか

Nicolai: ファイルシステムがないのは痛いね。あとUTF8やUTF16、Unicodeのようなキャラクタセットのサポートもまだまだかな(本のなかで、UTF8からUTF16に変換する例があるけれど、この手のものがほとんどない)。コンセプトがないのはべつに問題ないね。実際、コンセプトがC++11規格から外れる前から、第二版ではコンセプトを出さないようにしようと思っていたし。(註:コンセプトについて、議論の流れや標準から外すに至った経緯についてより詳細を知りたければこちらをご覧ください)

Danny: ではあなた自身についてもうすこしお話しください。あなたは長年C++標準委員会のメンバーを務めていらっしゃいます。C++11の標準化に際して、どの方面で主に活動されましたか?一緒に設計したライブラリはありますか?

Nicolai: 僕は一流のエキスパートじゃないんだ。多分、委員会のほとんどのメンバーのほうが僕よりC++に詳しいんじゃないかな。僕は主により適切なものになるように質問したり対処したりだよ。C++98のときも、C++11のときも、後半になって飛び込んで、それから、重点的に、矛盾点がないかないかどうか見たり、欠陥を修正したり、動作を明確にしたりしていたね。僕が出した唯一のものはarray<> クラステンプレートの初期実装かな。でもあれもBjarne Stroustrup氏の"The C++ Programming Language“にあるc_arrayクラスの翻案だけどね。

Danny: 近年、C++に対する関心がまた高まってきているように思います("C++ルネッサンス"とか言われている)。これは、プログラミング界がC++以外の言語の見果てぬ夢から醒めたのでしょうか。それとも単にC++自体が良くなったのでしょうか? あと、これは少し個人的なことになりますけれど、好きな言語はありますか? 最近どんなプロジェクトに関与しましたか?

Nicolai: プログラミングは僕の今の仕事にはあまり重要ではない。SOA(Service Oriented Architecture)とシステムインテグレーションのエキスパートとして、ここのところ僕の主な関心事は、多数の企業間、および、多数のシステム内で分散した動作("ビジネスプロセス”)を実現する技術や方法を確立することでプロジェクトや企業をサポートすることだ(註:SOAについてのより詳細はこちら)。ゆえに、僕のトピックはシステム開発というよりシステムランドスケープのメンテナンスだね。

C++は実は僕の好きな言語ではない。まぁ実際のところ、好きな言語なんてないんだけど。僕とプログラミング言語の最後の格闘は15年前になるね。さて、質問はどの問題をどんなコンテキストで解決しているのか?ということでいいのかな。コンテキストに応じて、主にawkとsedがあるUnix shell script、Java、C++、Excelなんかで動作を"プログラミング"しているね(註:Excelはプログラミング言語ではないと思われるかもしれないが、僕の考えでは、特定の問題については、プログラミング言語としての力量を備えていると思う)。

もしパフォーマンスが本質的な問題なら、C++以外の手はないと思うね。でも、この言語をつかうためには、高いコストを払う必要がある。C++が複雑であるがゆえに、他の言語に比べて普通のプログラマに対するサポートが信じられないほど悪い。これこそがC++の欠点だ。僕の本が売れるのはこれのお陰と言ってもいいんだけど。C++は仕事を生むと言える。これは今のご時勢ありがたいことだね。

  1. kaosf reblogged this from zakkas783-blog-blog
  2. cknbstr-blog reblogged this from zakkas783-blog-blog
  3. shousen-h reblogged this from zakkas783-blog-blog
  4. oglo-blog reblogged this from zakkas783-blog-blog
  5. zakkas783-blog-blog posted this