2017-10-13

C++17の参考書を書き上げた

C++17の新機能のほぼすべてを解説した参考書を書き上げた。

GitHub: EzoeRyou/cpp17book: textbook for C++17

GitHub Pages: C++の新機能

この参考書は、後ほどアスキードワンゴから出版される予定になっている。

内容としては2017年に制定された新しい標準規格、C++17に追加された新しいコア言語と標準ライブラリのほぼすべてを解説した内容になっている。

C++17には数学関数も追加されていて、これの執筆には読者から多大な貢献を得た。

C++17の新機能: 数学の特殊関数群

この本はGPLv3でライセンスされ、紙書籍での出版も、GPLv3で行うことを予定している。

さて、C++17はすでに規格制定され、C++20まではまだ少し時間がある。この暇に、今まで得たC++の知識を使って本を書くべきだと思ったので、次も本を書くことに注力したい。今考えているのはC++の入門書だ。

入門書という分野について、私にはあまり好ましい印象がない。世の中のいわゆる入門書をめくると、なにやらSI屋がよろこぶようなエクセル方眼紙エビデンスよろしくスクリーンショットをベタベタと貼り付けて、無駄に紙面を50ページも100ページも使い、結局何を説明しているかというと、Microsoftの不自由なVisual Studioのインストール方法だけを説明していたりする。完全に訳がわからない。私の書く入門書はそのような本にはしない。

そもそも、今C++の入門書を必要とする人間は、一体どういう環境にあるのだろう。

この2017年にC++入門者の筆頭に上がるのは競技プログラマーだ。彼らは大抵のオンラインジャッジシステムでサポートしていてパフォーマンスが出て必要なアルゴリズムを書き起こせる言語であるC++を使う。興味深いことに、彼らはC++にある素晴らしい機能の筆頭に、next_permutationという標準ライブラリの存在を挙げる。next_permutationを実務で使う状況というのはまれにしか起こらないと思うのだが、不思議なことだ。

既存の自由ソフトウェアに貢献したいが、そのソフトウェアがC++で書かれている場合、これはC++を学ぶ必要がある。そういう人もいるだろう。

仕事でC++を書く必要が出てきて学ぶという人もいるだろう。C++が使われる仕事として一番わかり易いのは、不自由なゲーム専用機などの組み込み機器だと思われる。

すでにC言語は知っているが、C++を学びたいという人。15年前ならばそういう人はいくらでもいたが、果たしてこの2017年にいるのだろうか。ただ、例えばLinuxカーネルの開発に参加したい場合、これはC言語を学ぶしかない。カーネル開発者は未だにC言語が必要なので学び、C++を知らないが学びたいという人は多いのかもしれない。

これを考えると、次に書くべきC++入門書は、プログラミング入門書である必要はない。対象読者はすでに別の言語でプログラミングの基礎にある程度触れていることを想定して書いてもよいはずだ。つまり、環境構築や、変数とは箱のようなものであるといった比喩表現はいらない。

ドワンゴ広告

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

8 comments:

Anonymous said...

個人的には、C++で書かれたアルゴリズム本というのもいいかと思います。
いろんなアルゴリズムを網羅してユースケースが何個か乗ってる感じの。
そろそろAPNGがブラウザで対応するころかと思いますが、
アルゴリズム解説しているページが日本語ではない気がします。
そういう近代的なアルゴリズム解説なんかも暇があればどうでしょうか?
個人的にはGIFもよくわかってません。

喫煙者 said...

俺はc++やりたくて1~2年前にプログラミング学んだよ
ezoeの参考書も役に立ったので感謝してるよ

bore rere said...

この一年c++03を勉強してきたが、下記のような落とし穴が多すぎるので初学者向けにそういったものをフォローすればよいのではないか。

・継承されるクラスは仮装デストラクタ
・RAII
・STLの利用(関数オブジェクトとアルゴリズムとか、初学者は想像もつかない)
・c++03環境でのc++11の便利クラスの再現方法

Anonymous said...

情報工学の大学生は意外に多いと思います。lispとC++は情報工学の学生なら半ば必然です。
情報工学系の論文はlispで記述されることも多いですから。しかし、lispは「実用」にはならないので、例えばAIを研究する際に計算パワーが必要なケースでは役に立ちません。
そのような研究室の学生がC++を使うのは妥当な選択と思います。多くの学生はその際にC++を学ぶと思います。
私の子供が情報工学系の大学に行ってますが、やはり研究室ではC++を使うような話をしてました。
また機械工学の学生はCADのために意外にコンピュータを使います。もしかするとCAD自体を開発しているような機械工学系の研究室もC++を使っている可能性はありそうです。

mSecレベルの安定した応答性能を要求される分野にGCのある言語は使い物にならないので、ゲームや大きめのデバイスのファームウェアでC++使うことは多いですね。(AndroidがヌルサクでないのはUI制御にJavaを使っているから。しかしアクションゲームで10mSecの遅延は許されません。)
C++はメモリが豊富にあるマシンで処理性能を追求しつつ、プログラム開発の生産性も上げる必要がある分野で有用な言語ですので、そのような分野で新たにC++を学ぶ人はそこそこいると思います。

逆にC++はヒープが使えない環境では魅力が半減します。C++脳でnewを使わないプログラミング、正直想像できませんが、そのような分野はOSのカーネルや小型CPUのファームウェアが該当します。malloc/freeが使えなくてもC言語はやはり十分に有用です。その分野の人たちがC言語を止めてC++を使う時代はまだまだ来ないような気がします。

因みに、ヒープはメモリ設計の手を抜けるようにする代わりにメモリをちょっと多目に用意する必要があります。その贅沢が許されない分野ではヒープは使えません。

Anonymous said...

主要なプログラミングコンテストはC++17をサポートしているのでしょうか?

Anonymous said...

C++17はまだ発行されてないので、まともなサイトならC++14は対応してると思います。

Anonymous said...

画像処理・動画処理ではC++が依然としてニーズがあります。企業ではC#とかPythonも使われているようですが、上のcommentにもありますように、大学では代々引き継がれたC++のソースコードを使いまわすことはよく見られる光景です。まさしく、メモリは気にせず、処理性能を追求したい分野かと。

学生と話していると、classだのinheritだのOOPどうとかよりも、STLの上手な使い方を知りたがっているようです。

Anonymous said...

コンパイラーでの確認を怠ってるとハゲを避難しておきながら自分も実コンパイラーで確認しないんだなエゾエゾは。
間違いだらけのN4659もそうだけど実コンパイラーで確認しちゃいかん掟でもあるんかね。