読者です 読者をやめる 読者になる 読者になる

ボレロ村上 - ENiyGmaA Code

中3女子です。

constexpr本を執筆することにした

中3女子です。


constexpr本を執筆しようと思い立った。
constexpr について、言語機能、用途、歴史的経緯、そして実装技術の観点から詳細に解説した本である。

動機

C++本のうち、例えば template や template ライブラリについて解説した本は探せばいくらでもある。
「Moderrn C++ Design」のような古典的名著から、「C++テンプレートテクニック」のような日本人の著作まで、バイブルと呼ぶべき本が多く存在する。
偉大なプログラマ達が《発見》し発展させたテンプレートメタプログラミングといった技法を、現代のわれわれは当たり前のように学ぶことができる。
解説サイトも沢山ある。ネット上には一線級の C++ プログラマの書いた技術情報とコードが溢れている。
たとえ英語が全く使えない者でも、ネット環境と最低限の検索能力さえあれば、template に関する日本語資料に困ることはない。


では、constexpr についてはどうだろうか?
以前、自分は constexpr を使うべき5の理由 - まとめ&リンク集 - ボレロ村上 - ENiyGmaA Code というエントリを書いた。
constexpr に関する纏まった日本語情報は多くない。
検索すれば、constexpr による Zero-initialization の議論など、興味深いいくつかの情報を見つけることができるが、断片的だ。
日本語圏以外であたればここに載っている以外の様々なアイディアや知見を見つけることができるだろうが、やはり総合的なものは聞かない。
書籍では、江添氏が「プログラミングの魔導書 Vol.2」で書いた 10 ページほどの constexpr 入門がある。
最近書かれた C++ 本には、もしかすると constexpr について言及された節もあるかもしれないが、確認していない。
ともかく、constexpr に関して、総合的かつ専門的に詳細にわたって解説された書籍またはサイトというものは、未だ見聞きしたことはない。
(もしあるならば、ぜひ知らせて戴きたい)


無いのであれば、誰かが書くしかない。
しかるに、constexpr という言語機能は奥の深いものではあるが、ビジネスプログラマが取り上げるには実務的でないし、言語研究者が取り上げるには実際的すぎる。
ゆえに、自分が書くしかないと思い至った次第である。
幸いにして自分は、constexpr に関する実装経験については、少なくとも日本において一線級にあると自負している。
筆無精ゆえ満足な数ではないが、いままでブログエントリや勉強会の発表に際して、いくつかの constexpr に関する技術情報を書いてきた。
そして Sprout ライブラリの実装にあたって、これまで文章にしてきたことより遙かに多くの知見を得ている。
それらを纏めて詳細な解説として本にしようと考えている。
すべての C++ プログラマに資するものにはならなくとも、少なくとも世界に一冊はそのような本が必要なはずである。

内容

さて、内容的にはおおまかに以下のように考えている。

    1. 定数式の歴史的経緯
      • まずは、C言語の define マクロによる定数から始まって、コンパイル時定数と実行時定数、テンプレートメタによる定数や enum ハック、C++11 策定にあたっての定数式の定義の議論、そして constexpr に至るまでの経緯を、歴史的に見ていく。
      • これによって、constexpr がなぜ必要だったのかを明確にする。
    2. constexpr の言語機能の基本的な紹介
      • 「中3女子でもわかる constexpr」の前半や江添氏の「constexpr 入門」で取り上げられたような本当に基礎的な constexpr の動作、また「constexpr を使うべき5の理由」で取り上げたような基本的な用途、および規格の内容を噛み砕いて纏める。
      • これをしっかり纏めることで、constexpr を使ってみようと思ったプログラマが(これで本当に正しいのか?)と悩むことは無くなるはずである。
    3. constexpr の実装技術
      • Sprout ライブラリでは、constexpr でのプログラミングにおける、規格上あるいはコンパイラの制約からくるあらゆるイディオムを随所で用いている。
      • そのため、Sprout ライブラリの設計と実装をモチーフとして、その実装技術を解説していこうと考えている。
      • できれば、汎用アルゴリズムからレイトレーシングなど固有分野まで全般的にカバーしたい。
    4. constexpr がこの先生きのこるには
      • constexpr が有用であるのは間違いないが、不足や歪さも多く存在する。
      • 類似の機能である D言語の CTFE や、関数型言語Haskell 等)との比較をもとに、constexpr の現状の問題点を明らかにする。
      • その上で、この先 constexpr に求められる機能や思想について考える。


構成としては、かの Modern C++ Design を参考にしようと思う。
というのも、MC++D は Loki というライブラリをモチーフとして、template ライブラリのデザイン論を展開する構成である。
本書では Sprout ライブラリをモチーフとして構成すると考えれば、大いに真似しやすいと思われるからである。


執筆期間については、これから内容を詰める課程で決めていこうと考えている。
まずはおおよその分量(ページ数)の目安を決めなければならない。
例えば「プログラミングの魔導書」は A4 弱のサイズで 200 ページ程で一つの記事は 10〜30 ページ、「C++テンプレートテクニック」はおよそ A5 サイズで 300 と数十ページ程である。
自分としては、とりあえず今年中には公開までいきたいと思っている。


公開の形態は、AmazonKindleストアで電子書籍を個人で販売できるので、それを利用しようかと思っている。
個人的にデッドメディアである紙の本にも執着があるので、同じく Amazon のプリントオンデマンド(POD)も考えに入れている。
商業的な需要は見込めないので(それにまだ何も出来ていないわけだから)出版社への売り込みなどはまったく考えていないが、それはそれ。

査読のお願い

さて、執筆にあたってはいくつか関門がある。
先に述べたように、自分は constexpr に関する実装経験については自負するものがある。
しかしながら、自分にはプログラマの業務経験はない。
情報科学の専門教育を受けたことも無ければ、学術論文等の執筆経験もない。
C++ の言語規格には多少心得があるが、自分の知る C++標準化委員らのそれに及ぶほど厳密性のある知識ではない。
ゆえに、言語規格の深い部分と、学術的に厳密な部分(例えば計算量のオーダー等)に関して、しかるべき人に査読やアドバイスを請わなければならない。


そのため、C++ に一家言を持つと自負する方で、constexpr本の執筆を応援して戴ける方の有志に、査読をこの場でお願いしたいと思う。
連絡は Twitter @bolero_MURAKAMI またはメール contact-lib@boleros.x0.com まで。
質問等は上記連絡先やコメント欄などどこでも受け付けます。
よろしくお願いいたします。