とある C++ の魔導書

ひょんな事から雑誌に記事を書く機会を頂きました.今回は,その宣伝を兼ねてイントロ的な何かを.創刊号は C++ オンリーだそうです.「無謀のキワミ」と言う声も聞こえましたが,創刊者達の意思の表れ(多くは C++WG JPのメンバー)だろうと思います(ちなみに,Vol. 2 以降は C++ 縛りではないそうです).紙面の半分以上が Boost ライブラリ に関わる記事になりそうなので,Boost.勉強会 に参加した人/参加しようと思っていた人には良いのではないかと思います.あと C++ を dis りたい人も買って読んで dis って下さい:p

なぜ C++ は難しいか?

C++ はやっぱりダメだよ.マスターする(ある程度まともに使えるようになる)まで何年かかるんだよ!何冊本を読ませるんだよ!!

先日,知人との雑談中に上記のような事を言われました.何が難しいかを真面目に考え出すと 「C++ は難しいから」と言う定説 - Life like a clown のようにどんどんと発散してしまうため深くは考えない事にしますが,開発言語としては敬遠される事が多いと言う事実はやはり一人の C++er としては悲しいことです.

C++でプラットフォーム非依存なライブラリが欲しい。入出力、ネットワーク、XML、文字列、日時、スレッド、暗号化などの基本的な機能がそろったもの。Qtもいい線いっている(非同期HTTPまであるのに)と思ったら暗号化まわりの実装がほとんどない。boostも豊富な割には暗号化とか文字エンコーディングとかないし。以下で紹介されているものもどれも帯に短し襷に長してな感じ。C#だとかJavaのクラスライブラリくらい揃ったクラスライブラリがほんと欲しい。暗号化なんて難しくて作れない。基本機能ってほんとに面倒なのでなんとかならない?

::memolet | C++ライブラリ:ラウンドアップ

C++ が難しいと言われる最も大きな要因は C から受け継いだ危険性(うっかりメモリリークさせてしまう)ですがこの話はまたいつかにするとして,それ以外の要因では「標準ライブラリの少なさ」に起因する部分があります.何らかの機能を実現する際,それらの多くは標準ライブラリだけでは事足りないため,標準ライブラリ以外のものも利用して実現する必要があります.この結果,サードパーティが提供しているライブラリ状況を知らない人がコードを書くと,ややもすると車輪の再開発/再実装をしてしまうと言う問題が発生します.また,ライブラリ状況を知っている人であっても「どのライブラリを使用するか」を選定しなければならず,選定ミスによる開発時間の増加や知識の共有と言う面などで障害になる事がありました.

ただ,ここ数年で C++ のライブラリの状況もだいぶ変わってきています.準標準的な位置づけである Boost C++ Libraries の去年暮れにリリースされた ver. 1.41.0 で Boost.PropertyTree (XMLJSON などのパーサ)が追加されました.これによって,入出力 (Boost.IOStreams, Boost.Asio), ネットワーク (Boost.Asio), XML (Boost.PropertyTree), 文字列 (Boost.StringAlgorithms), 日時 (Boost.DateTime), スレッド (Boost.Thread) と基本的な機能が一通り揃いました(文字エンコード辺りがまだ?).さらに,これらの多くを標準ライブラリとして取り込もうと言う動きもあり,状況はだいぶ改善の方向に向かっています.

Boost ベースのプログラミング

Boost が低レベル部分の機能(基本的な機能)を一通り提供するようになったため,今後は標準ライブラリ + Boost でプログラミング(開発)を行う事をいかに定着させるかにかかってくるかと思います*1.これを促進するためには,

  • 様々な事例毎に,その事例を Boost ベースで解決するための方法(≒プログラム)を紹介・解説する.
  • 使われる頻度の高い上位層の機能を Boost ベースで実装し公開する(e.g., Socket に対する HTTP/FTP/SMTP/POP3XML に対応する RSS など).

などが挙げられます.Boost の使用を前提とし,グルー言語的な使い方/書き方を浸透させる事によって,ある程度は現在の状況が改善する(誰が書いてもそこそこ同じような記述になる)のではと期待しています.そして,そういったBoost ベースの書き方を浸透させると言う意味では,Web 上での単発的な記事だけではなく今回の雑誌ように,ある程度まとまった特集を組んでくれる書籍の力が必要であるように感じます.その意味でも,今回の雑誌は意味があります(と言う宣伝文句:p).

私のやること

ここからはメモ.今のところ,Boost.Asio をベースとした上位プロトコルの実装記事を書こうと思っています.紙面の容量次第ですが,恐らくは HTTP/HTTPS の実装の話になるかと思います.目標は,

  • Boost.Asio のチュートリアル的な使い方の解説
  • (ある程度は)そのまま使えるような Boost.Asio ベースの HTTP/HTTPS クラスの掲載

の両方が達成できれば良いなぁと思っているのですが,どうなるかは未知数です・・・ HTTP などの上位プロトコルの実装は,やること自体は単純で読むものとしてはあまり面白くないので,どのような形で紹介するかもちょっと検討中.インターフェースに関しては,当初 CLX C++ Libraries - http と同等にする予定だったのですが,思うところがあって変える予定.

あのメンバの中で記事を書くと言うのは恐ろしい.

*1:組み込み系など制限のきつい分野の現状はよく分からないのですが,そうではない分野でもまだまだ Boost 禁止な規則を設ける所も多いそうなので.