時計を壊せ

駆け出してからそこそこ経ったWebプログラマーの雑記

#dwangocpp に参加するためにLTしてきた

僕は8年くらいC++を書いていなかった。今年の前半はC++11を学ぶことにしていたので少しづつ触ってはいたが、流石に8年ぶりとなるのでC++の基礎的な文法から学び直すこととなり、せいぜいhello worldに毛が生えた程度のものしか書いてこなかった。autoなどC++11で導入された主要な機能を試す程度だ。
よりC++11について深い理解を得るための機会と実装ネタが必要だと感じていたところだった。

ドワンゴC++勉強会 #1が開催される事を知った。
江添とでちまるとボレロ村上の闇の共演という珍妙なサブタイトルを理解するのに苦しんだが、
どうやらこの勉強会は、Cプリプロセッサメタプログラミングと、コンパイルメタプログラミングについて学ぶことが出来る勉強会のようだ。
僕もYAPC::Asia 2014perl 5 meta programmingというトークを応募している程度にはメタプログラミングには関心が深い。これは面白そうだ!と是非参加したくなった。
しかし、定員は既に埋まっており、補欠登録をしている人は100人を超えそうな人数でとても入れそうになかった。
また、諸般の事情により貧相なネットワーク環境しか無い僕がニコ生配信を見るのは厳しかった。
しかし、僕はLT枠には空きがある事を発見した。C++erは至る所で闇の軍団と呼ばれている程に恐れられていると聞いているので、発表する敷居が高いということだろうか。
たしかに、既に応募されているLTもC++をdeepに利用している人のLTである事は容易に分かるタイトルであった。
僕は悩んだが、これは絶好の機会であるので、行くべきである。最近はTOMLのparserをperl5で実装していたので、parserの実装をネタにすることにした。C99を含む他言語をある程度は理解しているC++初心者には適度な難易度であろう。また、他に並行して4つ程ライブラリをperl5で開発していたが、この難易度であれば恐らく問題はなかろうという目論見だった。
そうして、C++初心者書がC++11でparserを書いてみた話という話でLTを応募し、無事参加する事が出来た。主催の@EzoeRyouさん、株式会社ドワンゴさんのご厚意に感謝致します。

内容としては予告通りの内容で、資料も公開して頂いている。

LT資料にも書いているがconstexprの可能性は素晴らしいと思った。
inline関数と違い、コンパイル時に処理し、定数化出来るという違いは大きい。
parser generatorの実装もできるだろうと思った。実際、発表者の id:boleros 氏は既に bolero-MURAKAMI/Sprout · GitHub でSprout.Weedという機能として実装していると伺った。いずれ試してみたい。
Cプリプロセッサマクロでループを表現する手法など高度なマクロの利用方法も素晴らしかった。既に洗脳が解けたので真似する気はあまり無いが、実際、マクロを利用したい場面は多い。僕も学生の頃にTerm::ANSIColor相当の機能を持つマクロ群を書いた事があるし、最近ではAndroid NDKでpicohttpparserのbindingをC99で書いたときにロギングのために__func__などを仕込むマクロを書いた。やろうと思えばなんでも出来るという勇気を貰った。(小並感)
C++の歴史は既に何度か資料を読んでいたが、日本のC++ WGの近況については衝撃を受けた。海外のWGではどのように運営されているのか少し興味が湧いた。

さて、僕のLTの話だが肝心の実装は間に合ったのか?結果から言えば、実装は間に合わなかった。LTは実装の途中で便利だと思ったC++11の機能を紹介し、お茶を濁した。エンジニアとして成果物が一切無いという屈辱のLTをすることとなった。*1

LT資料*2

落ち葉拾いであるが、perl5もリファレンスカウント方式のGCなのでshared_ptrが持つ根本的な問題についてはある程度は理解しているつもりだ。その上で、素晴らしい機能だと思う。
相互includeについては、当然ながら宣言はhppに、実装はcppにという具合に分割しており、#pragma onceを付けていた。宣言の時点で相互includeが発生したが為に困ってしまった。*3

今年の前半の最終日である今日中には完成させたいと思っているが、現状の設計ではconstexprを使う場面はやはりなさそうである。いずれconstexprを使ってparserをコンパイル時に生成する事も試したい。具体的にはstrptime(3)や正規表現エンジンを実装できたら有用だと思っている。

最後に改めて、主催の@EzoeRyouさん、株式会社ドワンゴさんに感謝を申し上げます。ありがとうございました。

*1:その為か@EzoeRyouさんに本の虫: ドワンゴC++勉強会#1を開催したで実際のLTの内容に一切触れずお茶を濁すような気遣いをさせてしまったようだ。

*2:写真はイメージです

*3:後の試行錯誤により、pragma onceではなくifndefによって重複読み込みを回避すると再定義エラーは出なくなったが、結局定義に必要な型情報が得られずコンパイルエラーとなってしまった。