ボレロ村上 - ENiyGmaA Code

中3女子です。

日経ソフトウエア5月号 「constexpr」が開くコンパイル時プログラミングの世界

中3女子です。
だいぶ間が空いたが、日経ソフトウエア5月号の特集記事として
僕の書いた 「constexpr」が開くコンパイル時プログラミングの世界 が掲載されたことを報告する。

「プログラムは実行時にだけ処理が行われるもの」。
そう思い込んでいませんか。それは大きな誤解です。
最新のC++コンパイラを使えば、プログラムを実行する前のコンパイル時に処理を完了できるのです。
それを可能にするC++の機能が「constexpr」です。
本特集では、constexprの魅力を紹介します。
日経ソフトウエア

f:id:boleros:20140416152532j:plain
Amazon.co.jp: 日経ソフトウエア 2014年 05月号: 日経ソフトウエア: 本


constexprの紹介記事だが、入門から実装技法、Sproutライブラリの紹介からコンパイルレイトレーシングまで、きわめて幅広い範囲を網羅している。
この内容を8ページ(見開き4ページ)に圧縮するのにはかなり苦心した。
後半はさすがに駆け足になってしまったが、constexpr入門者にとっても上級者にとっても、それなりに読み応えのある内容になったとは思う。
これまで、活字媒体でconstexprについて書かれた文章は、プログラミングの魔導書Vol.2 での江添氏のconstexpr入門などがあるが、『「constexpr」が開くコンパイル時プログラミングの世界』は、現時点でもっともconstexprについて詳しく書かれた日本語文章であると自負している。


執筆にあたって第一に心掛けたのは、規格上の正確さと簡潔さだ。
自分の知るかぎり、活字媒体と電子媒体とにかかわらず、プログラミング記事におけるC++の記述は正確さに欠けるものが多い。
もちろん、記事によっては、字数や想定読者といった観点から、正確さよりも直観的分かりやすさを優先せざるを得ない場合もあるだろう。
例えば、スコープに関する解説でADLに少し触れる際に、Two-phase name lookup や friend に関する挙動の詳細な定義を、常に述べるべきだとは僕も思わない。


重要なのは、前提と対象を常に明確にすることだ。
例を挙げるなら、「○○と書くとエラーになる」は、明確な文章とは言えない。
これでは、規格上の問題なのか、それとも特定の処理系に起因するのか、そもそも何故エラーになるのか、といった情報が一切含まれない。
「ill-formed である」「undefined behavior であり、対象の処理系でコンパイルエラーになる」「well-formed だが、処理系で未実装」といったように明確に書くべきである。


とはいえ、厳密さに言葉を費やすには、読者がその言葉(少なくとも名詞)を承知していることを前提にしなければならない。
そのため想定読者のレベルは、いくらか高く見積もらざるを得ない。
記事はもともとC++の基本的な文法がわかる程度を想定読者とする旨書いていたが、身内のレビューで「そのりくつはおかしい」旨の指摘をされ、「ストラウストラップのプログラミング入門」を読了した程度と修正することとした。
C++の基本的な文法がわかる程度の平均的なC++erであれば、当然C++11の規格やドラフトには目を通してそれなりに理解をしているはずだが、記事を読むのはC++erばかりとは限らないし、そもそも「基本的な文法」を一般に定義することは難しい。当然の仕儀といえる。


そのような客観的な指摘から、学術的な文章作法や、重要な規格上の厳密さについてまで、レビューをお願いした方々には大変お世話になった。
やはり客観的な視点というのは重要だ。
文章を書くときに、知らず知らずのうちに説明無しに暗黙の前提を置いたり、思い込みにもとづいて書いてしまうということはよくある。
そういった瑕疵は自分で読み直しても気付かない。
思い込みによって自分の脳内で勝手に文章を補完してしまうからだ。
ブログであれば後日あらためて訂正したり説明を追加することができる。
しかし紙媒体はそうはいかない。訂正記事を出すためのコストは計り知れない。
事前により多くの人に読んでチェックをもらうことの大切さを思い知った次第である。
それにしても、自分もブログエントリや勉強会発表やライブラリの公開といった形で知見を公開しているが、明らかに自分の提供する利益よりも貰う利益のほうが多いように思う。
集合知とは元々そうしたものかもしれないが。
ともあれ、特に世話になった方々にはそのうち何らかの形でお返しをしたい。


編集の大森氏にも感謝をしたい。
constexprという現状ニッチ過ぎる感のある機能について、依頼を戴いたことはもとより、執筆にあたってもほとんど自由に書かせて貰った。
元々依頼された時点では、Brainf*ckやPietのような難解プログラミング言語や、テンプレートメタプログラミングといったパラダイムを紹介する「ちょっと変わったプログラミングの始め方」シリーズ企画の一つとしてconstexprを取り上げるという扱いであった。
ところが、初稿を提出して後に、独立した特集記事として取り上げるという連絡が来たのである。
事情は訊いていないので定かではないが、「混ぜるな危険」と判断したのかもしれない。
いずれにせよ、自分としては喜ばしい結果である。
また、大森氏には、ライターとしての後記にも、編集後記で適切なフォローを戴いた。


それにしても、ことここに至って、なぜ自分はconstexprにこうまで熱心になっているのか、理由をあらためて考えても謎だ。
モチベーションは分からない。
ただ、義務感がある。市民の義務であるという感覚が。
コンパイルは祈りに似ている。世界よ斯くあれという祈りだ。
さあ、constexprによってコンパイル時プログラミングの世界を広げよう。
プログラムの処理が、実行時という枠から完全に自由になった世界により一歩近づくために。