Re:C++入門書を書きたいが、いまC++を新規に学ぶ人、つまり対象読者はどんな人だろうか。

# きっかけ

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">文章が変になったのでもう一度、C++入門書を書きたいが、いまC++を新規に学ぶ人、つまり対象読者はどんな人だろうか。 <a href="https://t.co/tddQVh2Rz1">https://t.co/tddQVh2Rz1</a></p>&mdash; Ryou Ezoe (@EzoeRyou) <a href="https://twitter.com/EzoeRyou/status/918837779181604864?ref_src=twsrc%5Etfw">October 13, 2017</a></blockquote>

というわけで

[本の虫: C++17の参考書を書き上げた](https://cpplover.blogspot.jp/2017/10/c17.html)

を見に行った。

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

これは本当だろうか？

# C++のコンパイラとか入手

## Windows
### Visual Studio

Windowsを使うユーザー数は無視できず、ではWindowsで使えるC++開発環境はなにか、となるとやはりVisual Studioが挙げられる。

そこまで罠なく環境構築できるし、問題となっていたインストール速度も2017で大幅な改善が図られた。エディタとしては正規表現に難があるが使えなくもない。IntelliSenseは他者の追従を許さない。デバッガとしても優秀である。

もちろんC++erの皆様はVisual Studioが内蔵するC++コンパイラ`cl.exe`、通称MSVCの糞さについてはよくご存知だとは思うが、バグが多いものの一応C++14 constexprが利用でき、間もなく待望のC++98の機能であるTwo Phase Look-upが実装される(今更)。

MSVCが気に食わなければコンパイラをClangに差し替えることもできる(ただしClangのバージョンが3.8)。

### C++Builder

みんなVSばかり叩くが、こいつの糞さを忘れてはいけない。`bcc32.exe`とかいう救いようのない糞を内蔵している。内蔵コンパイラをClangに切り替えるというニュースが昨年業界を駆け巡ったが、蓋を開けてみれば`bcc32c.exe`と言う名のLLVM3.3/Clang3.3とかいう化石が増えただけだった。**化石生産機**。

### MSYS2

GCCやClangをWindowsで使おうと思ったらとりあえずMSYS2を検討するべきだ。導入もインストーラーから入れるぶんには罠なくできる。パッケージ管理システムにはArch Linuxでおなじみ`pacman`が採用され、ほぼ最新のコンパイラやライブラリ群が利用できる。ついでにみんなだいすきgitも手に入る。もちろん`PKGBUILD`を書いて`makepkg`とかもできるし、
https://github.com/Alexpux/MINGW-packages/
でmsys2公式が`PKGBUILD`を提供してくれている。

何もしなくても`mintty.exe`が使われ、文字化けなく利用でき、デフォルトの`.bashrc`にかかれている`PS1`環境変数もおしゃれな感じにカスタマイズされている。

ただプログラミングこれから始めるぞ、ってひとに勧められるかと、Windowsユーザーの殆どはコマンドなんて叩いたことはないだろうから、勧めにくい。

### Windows Subsystem for Linux(WSL)

LinuxがWindowsの上で動くというやつだ。Windows10で追加されたが、あれは`fork()`システム命令は一応あるが遅く、UNIX文化と相容れないので個人的にはないなぁと思っている。

### MinGW

どういうわけかもっとも罠の多いこいつでGCC環境を作りたがる。`mingw-get`とかいうわけがわからんパッケージ管理システムを使わされる。

## Linux

Linuxといってもパッケージ管理システムからして多種多様なわけだが、RedHatとGentooから逃げておけば特に困らずに環境構築できるはずだ。コマンド一つで環境が整う。はっきり言ってコンパイラを手に入れるだけであればLinuxのほうが楽だ。

## macOS

一見パッケージ管理システムがあるから楽かと思いきやそうでもない。どうもXCodeから逃げられないようだ。というか筆者はMac使いだったのはプログラミングのプの字も知らない小学校3年までであるので(Mac OS 8とかのころ)

# C++プログラム執筆環境

コンパイラが手に入ってもC++のコードを快適に書けるかは別問題だ。Syntax Highlightは絶対欲しいし、IntelliSenseもほしい。ターミナルが統合されててほしいし、gitのようなバージョン管理システムやビルドシステムとの連携があると嬉しい。

## マルチプラットフォーム

### Vim

テキストエディタ戦争の片翼。[最近`:terminal`を実装したらしい](https://mattn.kaoriya.net/software/vim/20170724011404.htm)。Windowsで使うにはちょっとつらい。

[vim-jpのお陰でコミュニティが活性化しており](http://tyru.hatenablog.com/entry/20130326/vimmers_over_vim_jp)、なんか強い。

Windows以外では元から入っているかさもなくばコマンド一つで手に入る。

## Emacs

テキストエディタ戦争の片翼。Emacs 24.2あたりからターミナルが使えるようになったらしい。使ったことない。Windowsで使うにはちょっとつらい。

Windows以外では元から入っているかさもなくばコマンド一つで手に入る。

## VSCode

最近流行りのElectronとかいうアプリごとにChromeと悪魔合体した何かを立ち上げてくるGUIエンジンで作られている。内部で[相当dirtyなハックを](https://cpplover.blogspot.jp/2017/10/vs-codedomcanvas.html)重ねた結果、Atomなんかよりはるかにメモリー消費が少ないし動作が軽い(それでもメモリー食うが)。

プラグイン開発が盛んで、昔のFirefoxを思い出す。それらのお陰でgitやらcmakeやらも快適に使える。

MSが作っているだけあって、Windowsではインストーラーから罠なく導入できるし、Linuxでも.deb/.rpmが配布されていて、Arch LinuxではAURにあるので導入には困らない。

## Qt Creator

意外とまともなGUIコード開発環境が手に入る。今日も[VSCodeつらい、Qt Creatorいいそ](https://qiita.com/MuriNishimori/items/b4c7304bb4d1f378865b)みたいな記事が上がってた。

## Code Lite

cmakeと組み合わせて使う文には悪くない。Qt Creatorより軽快なイメージ。

# C++環境構築は解説不要か

環境構築はWindowsだとちょっとつらいソフトもいくつかあるが、基本的には手順をStep-by-stepで解説する必要はない、というか解説書いてもわりところころ変わるから意味がない。

しかし、こういう環境があるよ、という紹介は必要だろう。**さもないと学習用C言語開発環境とかbcc32とかいう糞of糞に正面衝突してしまう。**

# 対象読者はすでに別の言語でプログラミングの基礎にある程度触れていることを想定して書いてよいか

これは筆者の勝手だから別にいいのだが、ちょっとまってほしい。

**はたしてまともなC++入門書は存在するだろうか**

個人的な持論として、CでOSSに貢献するためのC入門とC++を学ぶためのC入門は大きく違う、と思っている。

いやいや、「独習C++」とか「やさしいC++」とか書店に行けばたくさんあるだろ、というかも知れない。しかしちょっとまってほしい。

**果たしてC++11以前とC++以降では同じ言語だろうか**

言語仕様、標準ライブラリ共に大幅に拡張されたC++11の前後を同室と捉えるのには賛同し難い。もちろんC++は互換性に非常に気を使う言語だからごく僅かなbreaking changeはあるものの(`auto` keywordなど)昔のコードは今でもコンパイルできる。

しかしながら、今新しくプログラムを書く、といったときにプログラムの設計は大きく違うはずだ。

いやいや、「プログラミング言語C++ 第4版」があるだろ、という声があるかもしれない(残念ながらまだ入手していない)

**しかしそれ以外になにかあったろうか**

そういうわけで、C++のまともな入門書の需要は存在する、と思う。

もちろん他の言語から来た人向けの解説書と言うのはこれまた需要がある。
ちょうど今JavaScriptのそういった本が
https://github.com/asciidwango/js-primer
まさに執筆中だ。C++にもこういうのがあっていいはずだ。

# まとめ

江添さんが次に書くべきC++入門書は、プログラミング入門書である必要はない、**とは言い切れない**。

もちろん何を書くかは自由なのだが。