2009-12-27

C++0xの本について

C++0xの本を執筆する予定である。詳しいことは何も決まっていない。出版社は技術評論社で、タイトルは、現時点では、「パーフェクトC++0x」ということになっている。技術評論社は、すでに「パーフェクトC#」、「パーフェクトJava」を出しており、今回、そのC++版を出したいらしい。

昨日、参考として、すでに刊行されている二冊の「パーフェクト」シリーズが、無料で自宅に送られてきた。だいぶ分厚い本である。ただ、C++も、真面目に書こうとすれば、これだけ分厚くなることは間違いない。

しかし、パーフェクトとは、またずいぶん気負ったタイトルである。「C++入門」でも、「はじめてのC++」でも、「サルでもわかるC++」でもないのだ。

思うに、プログラミングということには、二種類あるとおもう。プログラミング言語の文法と、プログラミングの本質的な概念(変数、条件分岐、ループ、サブルーチン、その他アルゴリズム等)とだ。よく、「ひとつのプログラミング言語を学べば、他の言語は、さほど苦労せずに覚えられる」と言われているのは、この後者、つまりは、文法とは離れた本質的な概念を理解しているから、これを学び直す必要がないので、その分、苦労しないのだと思う。必要なのは、言語の文法を覚えるだけである。

プログラミングの完全なる初心者は、この二種類のどちらも分からない。したがって、初心者用のプログラミング教本は、この二種類を並行して教えなければならない。

私が書きたいのは、言語の文法に特化した本だ。もちろん、テンプレートを用いた、ジェネリックでメタメタなアルゴリズム本も興味はあるが、それは書くなら別の本だ。さらに、「どのようにして」コードを書くか? ではなく、「なぜ」コードをこのように書かなければならないのか? という疑問に答える本にしたい。世の中には、プログラミング言語の理解が十分ではなく、適当に書いてコンパイルし、コンパイラがエラーを出したから、このコードは誤り、これはコンパイルが通ったから、正しい、などと結論する種類の人間がいる。そういう人が、「言語の文法とは、こうなっていたのか」と理解できるような本にしたい。

テンプレートを解説している本はいくつもある。特殊化、部分的特殊化、テンプレート・テンプレート引数(Template template arguments)までを解説している本は、いくつもある。しかし、それだけでは、テンプレートを理解するには足りない。Argument Deductionについて知らなければならない。Dependant Nameについて知らなければならない。Two Phase Lookupについて知らなければならない。SFINAEについて知らなければならない。私はこれらも含めて、C++を解説する本を書きたい。

パーフェクトシリーズを読むと、幸い、これは完全な初心者に向けた本ではなさそうである。項目ごとに、独立して書いてもよさそうだ。

問題は、どのようにすれば、C++の言語仕様を、もらさず書けるのだろうか。ひとつ思い浮かんだのは、規格書の目次の通りに書くというのはどうだろう。

これには問題もある。まず、本を1ページ目から逐次読んでいくようには書けない。むしろ、調べたい項目を目次や索引で探して読む、辞書になってしまうだろう。

そういう本はあまりみたことがない。第一、問題がある。

たとえば、Rvalue referenceの場合、Rvalue referenceだけを解説し、Move Semanticsは、章を分けて、ライブラリ側で記述することになる。rvalue referenceとmove semanticsは一緒にしておいた方が、短期的にはわかりやすい。しかし、分けるのは妥当だと思う。というのも、Move Semanticsという言語機能はないからだ。言語に機能として存在するのは、Rvalue referenceだけである。Move Semanticsというのは、誤解を恐れず言えば、rvalue referenceを、オブジェクトがmove可能かどうかという、フラグとして利用するだけなのだ。

たとえば、switchとgotoの場合、解説が飛び飛びになる。gotoで飛ぶべきラベルは、ラベル・ステートメントの中で、caseやdefaultと一緒に説明される。switch自身は、セレクション・ステートメントの中の、switchステートメントで解説される。goto自身は、ジャンプ・ステートメントの中の、gotoステートメントで解説される。これはさすがに、文法上は正しいとしても、解説が飛び飛びになってしまって、わかりにくいかもしれない。

規格書の、コア言語部分と、言語に近いライブラリをあわせても、500ページぐらいだと思う。もちろん、規格の翻訳書にするつもりはないので、ページ数が合うことはないだろうが、書ける量ではないだろうか。

いまあるぼんやりとした案では、コア言語機能と、言語に近いライブラリ(atomicやthreadなど)は、一通り解説したい。ライブラリは、イテーレーターやコンテナ、関数オブジェクト、メタ関数などといった、ライブラリを使うにあたって、本質的に必要な概念を説明したい。ライブラリの詳細を細かく深く解説するというのは、できれば、本を分けるべきだと思う。

いずれにせよ、まだ何も決まっていない。それに、執筆にはかなり長い時間がかかる。

現実的に切実な問題としては、当面の生活費をどうするかという実に個人的な問題もある。技術書は、金にはならないだろうし。

1 comment:

tannz said...

すごく楽しみです。