C++11の参考書をGitHubで公開したことはすでに発表した。
GitHub: EzoeRyou/cpp-book
GitHubからzipでダウンロード
GitHub Pagesでの閲覧:C++11の文法と機能
本の虫: C++11参考書の公開:C++11の文法と機能
私はもう時間切れで、三週間後にはインターネット接続はおろか、コンピューターすら失う身だが、日本語のC++参考書の行く末について案じてみたいと思う
日本では、全国どこでも日本語が通じる。日本にいる限り、日本語以外の言語を使う必要がない。法律の書かれている言語から日常生活の言語から教育で使う言語まで、すべて日本語で行われている。
これは、凄いことでもあるが、悲劇でもある。日本人は英語を学ぶ必要性を実感できないのだ。にもかかわらず、プログラミングは、英語を必要とする。
英語は、文法的にはあまりよろしくない言語である。例外的な文法の多さ、発音と一致しない文字表記、純粋な10進数ではない数体系などなど、およそきれいな言語ではない。しかし、英語は事実上の業界標準となっている。プログラミングの世界では、共通語になっている。文法は汚いが、世の中にはもっと悲惨な文法の言語があることを考えれば、これでもまだマシな方なのだ。
好む、好まぬの問題ではない。もし、複数の言語話者が集まって一つのソフトウェアプロジェクトに参加する場合、共通言語の第一候補は、英語しかないのだ。
プログラミングの参考書や論文は、英語で書かれたものが最も多い。日本人が開発したソフトウェアや、日本語特有の処理をするソフトウェアには、その性質上、日本語の資料が豊富かもしれないが、大多数のプログラミング資料は、英語に片寄っている。
これはC++でも同じことだ。C++の標準規格や論文は、英語で書かれてる。標準委員会の議論は、英語で行われている。
したがって、C++の参考書を書くには、英語から日本語に翻訳しなければならないわけだ。
多くの稚拙なC++の参考書は、C++の標準規格を一度も読んだことがないド素人によって書かれている。このド素人は、C++の標準規格ではなく、手元にあるコンパイラーを信用する。「コンパイラーでコンパイルを通せば、それは合法なコードに違いない。コンパイルがエラーになれば、そのコードは違法なのだ」といった具合だ。これは正しいC++のコードの合法、違法を確かめる方法ではない。
多くの通常のプログラマーにとって、C++コンパイラーは信用すべきものである。しかし、C++の参考書の筆者にとって、コンパイラーとは、単に些細なタイプミスを検出する程度のものであり、常に疑ってかかるべきものなのだ。コンパイルが通ったからといって、規格準拠なコードであるとはいえないし、コンパイルエラーになったからと言って、規格上正しくないコードというわけでもない。これは、コンパイラーというものが、所詮は人間によって書かれたものである以上、不具合があるのは当然だからだ。私はC++11参考書を書くにあたって、実に多くのコンパイラーの規格違反のバグを見つけ、報告してきた。
そこでC++の参考書を書く際の大本の一時ソースとなるのは、C++の標準規格だ。しかし、これとて、盲信してはならない。C++の標準規格は、人間によって英語という自然言語で書かれている。当然間違いはある。C++の参考書の執筆者は、C++標準規格の文面すら疑わなければならないのだ。私はC++11参考書を書くにあたって、いくつもの文面上の誤りを見つけ、報告し、訂正してきた。
しかし、ド素人は違う。ド素人は手元にある特定のコンパイラーの特定のバージョンでコンパイルが通るかどうかだけを信頼する。信頼の連鎖の末端にある、最も信用してはならないものを信用する。
その結果として、ド素人の書いたC++11参考書は、規格では用いない独自の用語を使い、規格通りではない誤った認識のもとに解説している。
私のC++11参考書は、もちろん、C++の標準規格の文面すら疑いつつ書かれた。それも、C++のコア言語を標準規格に従って網羅的に解説した、単なる既存の本の翻訳ではない、最初から日本語で書かれた唯一の本なのだ。
そして私の今の境遇だ。今更言ってもはじまらないが、金がない。
C++11の参考書の紙の本
読者の中には、C++11の参考書の紙の本を売ればいいのではないかと思う者がいるかもしれない。これは、全然金にならないのだ。死んだ木の本は、全くと言っていいほど金にならないのだ。
一冊十万円の本が飛ぶように売れるのならばともかく、紙の本の値段は、所詮は一冊数千円だ。そして、プログラミングの参考書というのは、数万冊も売れれば、相当に売れたという世界なのだ。もし、十万冊売れたのならば、誰もが書名を知るほどの名著、すなわちK&RやSICPやKnuthに匹敵するような伝説的な本なのだ。もし、ミリオン、すなわち百万冊売れたならば、それは本の内容が神がかっていたから売れたというよりも、日本のプログラマーに共通の宗教を疑うべき事態だ。なぜならば、日本のプログラマーの人口というのは、諸説あるが、せいぜい100万人もいかないだろうから。
それに、十万冊売れるプログラミングの参考書というのは、入門書だ。いわゆる猫でも〜的な本だ。ド素人の書いた本だ。私の書いたような、上級者向けの網羅的な本ではない。私の書いたC++11の参考書は、これまでに比べるものがないほどに素晴らしく規格準拠なC++の参考書である。問題は、このような上級者向けの参考書は、需要がとても少ないということだ。本当に必要とする人間は、せいぜい数千人だろう。
もし紙の本のミリオンセラーが目的ならば、私が書くのはプログラミングの参考書ではなく、恋愛小説だ。その方が可能性が高いからだ。
しかも、紙の本の出版には、屈辱的な契約に同意しなければならない。その契約内容はどこの出版社でも同じで、「契約の期間中、筆者は著作権を含むあらゆる知的財産権を独占的、排他的に出版社に代行管理させること」というものだ。たとえ筆者が全文章を書き上げたとしても(誤字脱字程度の修正に著作権は発生しない)、筆者は出版中は著作権を主張できないのだ。そんなバカな話があるか。著作権は、著作者に限定的な期間の間、独占的な権利を与えるものである。なんで著作者が著作権を取り上げられなければならないのだ。
出版社側の言い訳としては、「本の組版、製本、流通、管理などには、相当の手間と費用がかかり、まったく売れないというリスクをこちらが背負うのだから、当然のことだ」ということになる。
そもそも、プログラミングの参考書とは、自由であるべきなのだ。自由にコピペしたり改変したりできないプログラミングの参考書など無価値だ。また、複製して他人に渡せないプログラミングの参考書など無価値だ。不自由なプログラミングの参考書は無価値なのだ。
今や、情報を公開するコストは、極端に下がった。なぜわざわざ不自由な死んだ木の本で公開するのに、自由を諦めなければならないのか。
では、電子書籍はどうか。電子書籍を販売するプラットフォームは様々ある。多くは仕様が非公開のフォーマット、そのフォーマットを解釈する専用の不自由なソフトウェア、邪悪なDRM(デジタル制限管理)で汚染されているので、読者は電子書籍を注意深く選ばなければならない。中には、そのような邪悪な嫌がらせをしていない電子書籍の販売プラットフォームもあるし、また、単にファイルを販売するようなプラットフォームもある。
問題は、この手の電子書籍に、高い金を払う慣習が存在しないということだ。読者はもちろん了解しているように、正しく動作するDRMは存在しない。ファイルは速やかに共有される。
私にとって、共有は問題ではない。情報の共有は素晴らしいことであり、知的財産権などという馬鹿げたものを持ちだして、情報の共有を妨害するのは、人類の進化を妨害するのと同じなのだ。シンギュラリティを提唱したRay Kurzweilは、人間の進化は、もはや遺伝子やタンパク質で行われるのではなく、技術で行われると書いた。人間は空を飛ぶために肉体を変化させる必要はないのだ。技術は、情報を記録し、共有し、伝えることで進化する。情報の共有を妨害するのは、人類の進化を妨害する、人類に対する罪である。
したがって、何らかの方法で有料ダウンロードを設けても意味がないのだ。そもそも情報自体に金を払う慣習が根付いていない。
私がC++の参考書の執筆を続けるのに必要なのは、そういったたぐいの金ではない、月々数十万の収入を数年は見込めるような、つまりは安定した収入だ。さらに、C++標準化委員会の会議に出席できるような費用(会議はほとんどアメリカ合衆国で開かれる)もあればよい。
金は必要である。金がないために、私は3週間後にインターネット接続はおろか、コンピューターすら失うわけだ。金がないために、私はこれ以上C++の参考書の執筆が続けられないわけだ。金は必要である。
そもそも、英語で書かれているC++の標準規格はどうなのか。金はどこから出るのか。C++の標準規格は、C++標準化委員会で議論され、検証され、文面案を書き、投票されて、ドラフトに入り、最終的に規格として制定される。どこから金が出ているのか。C++標準化委員会のメンバーは、個人で参加している者もいるが、大半はスポンサーがいる。スポンサーがC++の規格や、教育や、コンパイラーやライブラリの実装などに長けた人間に金を出して、C++の標準規格の作業に従事させているのだ。そうすることによって、スポンサーは、C++の規格を、スポンサーにとって都合がいいように、影響を与えることができる。
日本では、今、このスポンサーが存在しない。かつては存在したのだ。
C++標準化員会は、私もいまいち仕組みがよく分かっていないのだが、私としては、C++ Working Groupという単位の印象が強い。C++WGは、主要な各国に支部があり、日本にも支部がある。私もそこに、スポンサーなしの個人として籍をおいている。
最初のC++の正式な規格、C++98は、1998年に制定された。当時、日本では、C++の標準規格の日本語訳がほしいと考えるスポンサーがたくさんいた。そのため、スポンサーに雇われたC++WGのメンバー達は、作業を分担してC++の標準規格の全文を翻訳し、同等のJIS規格として制定した。
しかし、いまC++11の規格書の日本語訳は存在しない。一体どうなっているのか。C++標準化委員会は何をしているのか。これは、スポンサーがいないためである。
これは私の誤解と偏見で語るのだが、どうもC++WGの日本支部というのは、その前身が、EC++団体の人間だったらしいのだ。
当時、自社内で独自にC++のコンパイラーを開発できることは、業界市場で技術的優位に立つためにとても重要なことだった。しかし、C++の実装は難しい。そのため、どうも日本企業が寄り集まって、実装しやすいC++の劣化サブセットを作ろうと考えたらしい。EC++は悲惨である。多くの機能が、実装が難しいとか、オーバーヘッドがあるとかいった理由で取り除かれた。
この日本独自の、今のスラングでいえば、ガラパゴス的な劣化C++は、Bjarne Stroustrupの目にも止まった。Stroustrupは、C++になにか独占的な権利を主張することはしないが、ただ分裂しないことが重要だと考えていた。そのため、EC++団体にメールを送り、どうせやるなら、C++の標準化委員会に来てやらないかと声をかけたそうだ。
これにより、EC++が標準化委員会でも議論された。議論の結果、EC++で、オーバーヘッドがあるとされて取り除かれた機能の多くは、ゼロオーバーヘッドで実装できると論破された。その結果は、Performance TRとして公開された。
私にC++コンパイラー実装の知識がないのを棚に上げていうが、EC++はあまりにも悲惨だった。Stroustrup自身が言っているように。
私の知る限り、EC++は死んだ(2004)、もしまだ死んでいないのなら、死ぬべきである。
Stroustrup: FAQ
時代は変わった。一社独自で閉鎖的に開発されたコンパイラーというものは、大抵クソであり、不自由なプラットフォームで強制的に(始終呪いの言葉を投げかけられながら)使わされるのでもなければ、誰も使いたがらないものである。あのAppleですら、コンパイラーを自社で閉鎖的に開発するなどということはしていない。いまだに自社での閉鎖的な開発にこだわっているMicrosoftのC++風のコンパイラーは、あのザマだ。
しかし、これは同時に、日本国内の企業による、C++のスポンサーを減らしてしまった。どうも日本の企業というのは、いまだに閉鎖的な囲い込みと邪悪な制限を好むらしい。
最近、C++WGの日本支部には、新しい顔ぶれが入ってきた。多くは、スポンサーを持たない、個人の参加者である。
日本国内にC++のスポンサーが減ると、当然、C++WGの日本支部の活動も滞る。規格書の翻訳どころか、定期的な会合も開かれない。NBコメントをまとめて送るような活動もない。今、日本のC++WGの若い個人で参加しているメンバーがC++14で追加された新機能に関する会合を開くが、これはC++標準化委員会の中では行われない。単に個人の勉強会という形で行われる。スポンサーのいない世界では、標準化委員会の公式の会合というのは、手続きが煩雑なだけで利点がないのだ。
スポンサーがいないということは、個人の有志が思い思いに、気ままに活動するということだ。とてもではないが、標準規格の日本語訳はおぼつかない。
もちろん、たまに私のような変人がでるかもしれない。しかし、所詮は後ろ盾のない趣味のような活動なのだから、長続きしない。何の保証もない。いずれ誰かがやるかもしれないというものだ。
もし、今後も日本語のC++の参考書や情報がほしいのならば、そういう活動に対して金が出るべきだ。スポンサーが出るべきだ。
私が自分を売り込む宣伝活動をすべきだというかもしれない。しかし、私は、別に何も困らないのだ。C++の最新の規格に追随するには、数ヶ月ごとに発行される論文集を読めばいいだけの話だ。それは、数ヶ月おきにネットカフェかどこかで入手すればいいだけの話だ。ここ数年の論文集は、このブログで逐一解説している。たとえば、これは今月出た最新の論文集だ。
本の虫: 2013-10 post-Chicago mailingの簡易レビュー
私はインターネット接続を失うので、今後はこのような簡易レビューはできないが、論文自体は、せいぜい数十MBに満たないサイズなので、簡単にダウンロードできるし、オフラインでもじっくり読める。それを日本語で解説することができなくなるというだけの話だ。
第一、私は日本人で最も優秀なC++規格の研究者というわけではない。私よりフォーマルな英語の読める人間はいくらでもいるし、コンパイラーも実装できるだろうし、ライブラリも実装できるだろうし(私はメタプログラミングはともかく、データ構造やアルゴリズムには詳しくない)、私よりデータ構造やアルゴリズムや、数学や物理学や自然言語処理やその他もろもろの専門的な技術に詳しい人間は山ほどいる。しかし、その手の人間は、C++の規格を深く学ぶよりも、もっと他にもすることがあるので、その仕事に時間を取られていて、私ほどC++の規格をじっくり学ぶ時間がないだけだ。
もし、C++の日本語の情報を提供することに多大な金が動くようになれば、私より優秀な人間が市場に参入してくるので、私に勝ち目はない。しかし、今は、日本国内ではC++の規格に金がまったく動かないので、私のような非才な人間でも、C++の規格に関しては、優位に立つことができるわけだ。
もちろん、すべてが悪いわけではない。好むと好まざるとに関わらず、プログラミングには英語が必須である。日本のような、日本語だけでプログラミングがある程度学べてしまうような環境は例外的なのだ。日本語の資料がなければ、日本語でプログラミングを学ぶ方法がなければ、日本人プログラマーとて、自然と英語を余儀なくされる。英語が必要になる。その方が、長期的には、いいのかもしれない。