トップ «前の日記(2013-09-29) 最新 次の日記(2013-10-03)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2013-09-30

_ 今、Cで開発するためのスタンダードを知るための本

例によってアスキーの鈴木さんから、本をもらった。花井さんのモダンC言語プログラミングだ。なお、似たような題の洋書があって、しかも花井さんは翻訳もするので、その本の翻訳書と勘違いされる可能性もありそうだが、完全にオリジナルだ。

Cは、Unixと共に(というか少し遅れて)生まれたということは、すでに40年以上の歴史があり、それだけの年月がたてば、COBOLなどと同じく老害言語と言われてもこれっぽっちもおかしくはない。

ところが、COBOLと異なり開発者市場がどんどん先細り(あるいは固定化)されるということはなく、むしろ増えている。それどころか最近の調査では最も利用されている(TIOBE 2013)。

一方、C++が先鞭をつけたビジネスプログラミングへのオブジェクト指向プログラミングの適用は、Java、Objective-C、C#と種類を増やし、開発に関する知見に留まらず、開発に利用するツールへの知見も増え続けている。そこに、Perl、Rubyといったスクリプト言語によるWeb開発の知見が、DevOpsとして運用までを含めたフローを回すこととして結実した。

本書で学べるのは、古い開発言語であるCでの開発に対して、後者のモダンなプログラミング言語/環境の成果を適用するための考え方やツールだ。花井さんの知見が存分に盛り込まれているので、21世紀にCで開発するならば、現代の実用Cプログラミングのノウハウとしても得るところは大きい。

全体は、Linux(xubuntu)を利用して環境を構築する(Windows読者のためにVirtual Boxを利用する方法が紹介されているが、これには問題があると思う。後述)。Cの規格としてはC99、コンパイラはgccを前提としているが、そこはあまり重要ではない。

全体は6章とサンプルの取扱い説明。

1章で、Cの現況とモダンな開発スタイルの概要を示す。

コードの設計にはデザインパターンを適用し、IDEを駆使してコードを記述し、コードの記述にはTDDを適用し、適用されているためにリファクタリングが可能となり当然リファクタリングし、CIサーバを使ってソースを管理し、問題を追跡し、自動ビルドし、リリースする。

2章は、環境の構築(クライアント開発マシン)。環境としては上で書いたようにXubuntu、IDEにはEclipse。知っている人は知っているが、僕は何が嫌いといって、Eclipseほど嫌いなものはない。ここで重要なのは、Eclipseのような使い辛いものを取り上げていることではなく(というか、使い辛いかどうかは個人のセンスと、利用者がそれまでの経験から組み立てた利用モデルの問題である)、ソースコードレベルデバッガの利用しやすさであるとか、TODO管理であるとか、コードナビゲーションであるとかの、現代のIDEが最初から特に考えなくてもサポートしている機能の紹介で、つまるところ、テキストエディタベースの開発は非効率だということの説明だ。もちろん僕はEmacs(テキストエディタではなく環境そのものだが)とGDBを使うことがあるが、どれだけEmacs+GDBが優れていてもVisual Studioのデバッガに比べれば手数が多すぎて使っていられないのと同様に、Eclipseを使うほうが効率的だ。したがって、まずはモダンなIDE(Eclipseって今となってはモダン(近代的)だな)を利用することの利点を得心して欲しい。

3章では、一転、Cプログラマであれば、当然使いこなすべき手法として関数ポインタと構造体を組み合わせることで、オブジェクトとしてモジュールを構成する手法とについて説明する。

4章では、3章の知識を元に特に重要なデザインパターンを適用する方法について詳説する。当然ステートパターン、効率云々とリファクタリングに関連してくるがテンプレートメソッドパターン、あとは確かに使うこともあるオブザーバパターン、チェインオフレスポンシビリティパターン(これは地味だが、使う)、ビジターパターンで、すさまじく実利的に割り切った選択で感心する。いやもう、ステートパターンを利用しないコードは考えられないし、一歩間違うと諸悪の根源となるがテンプレートメソッドパターンを使えば確実にコードは整理できるので、実に良い選択とも言える(諸悪の根源となることを防ぐために、5章があるとも言える)。

3章、4章は読んでいてシステマティックなのでおもしろいが、そのためにはCを普通に読み書きできることが必要だ。

したがって、C何も知りませんが明日から仕事です、という人には本書を副読本としてはお勧めしても、この本だけではあまり役には立たない。

むしろ、普通にCで構造的にモジュールを組んで仕事している開発者が、より柔軟に、より安全に、より合理的に、より高速に、Cを使って開発すること全般を知り、取捨選択のためのノウハウを覚えるための本だ(ポインタをたどる分の実行時オーバーヘッドとポインタを確保する分のメモリオーバーヘッドがトレードオフとなるが、そのあたりの切り分けの説明も含んでいたりする)。

5章が、モダンなプログラミングには当然必要となる、TDDとリファクタリングの説明。この2つがペアで説明されていることは本当に良いことだ。

6章で、継続的インテグレーションとデプロイとして、Jenkinsを使ったCIサーバの構築。Python(Jenkinsの記述に利用される)の簡単な説明も含む。SCMとしてはGitを使って説明している。BTSについては概要のみで省略(必要な人はチケット駆動開発あたりをキーワードにして調べればいくらでも見つかるし、直観的にも利用できるから、それで良いのだろう)。

BTSを省略している代わりというわけではないだろうが、この章では意外なほど、Valgrindを使ったメモリ破壊エラー検出のための仕組みの導入にページを割いている。花井さんはCの開発をわかっているからなぁ。というわけで、この選択は良いものだと思う。

モダンC言語プログラミング 統合開発環境、デザインパターン、エクストリーム・プログラミング、テスト駆動開発、リファクタリング、継続的インテグレーションの活用(花井志生)

というわけで、Cで仕事をする、しているのであるならば、本書を読み、勧められているツールや環境を導入し、設計を考えるのが間違いなく良い。とにかく、他の言語ではスルーできる多くの問題を削減するためのノウハウを確実に得ることができるからだ。

さて、Virtual Boxの問題だが、少なくともWindows8(ただしHyper-Vを有効にした場合)やWindows2008サーバ以降では、動きが遅い。遅すぎる。これらのHyper-V搭載OSは、あらかじめCPUが仮想化されて動いているため、Virtual Boxがエミュレーションでの動作となるからだ。したがって、これらのモダンなWindowsでは、Hyper-Vを素直に使うほうが良い。 (ちょうど、USBを使ったWindows XP限定アプリケーションのテストをするために、Windows2008R2に、Virtual Boxを導入して仕事をしているのだが(Virtual Boxの良い点は、USBの仮想マシンからの操作をサポートしていることだ)、Windwos XPSP3を導入してから、マイクロソフトアップデートを適用するまで正味2日以上かかって閉口した。144個のパッチを検出/適用するために、ずーっとCPU100%で張り付いている。最初は、KB898461の問題かと思ったが、メモリは2Gほど確保しているので、そうではなかった)

あと、気になった点。

本書の読者はCを知っていることを前提としているからだとは思うが、P.74~75のStackオブジェクト生成マクロの説明はちょっとまずいかも知れない。

Stack* createStack()
{
    int buff[16];
    return newStack(buff);
}

追記。花井さんが上のようなコードを示しているわけではなく、いかにもやってしまう人がいそうだなという例。

いや、そんな読者は居ないと言えるなら良いが、データセグメントへの配置例か、ヒープの確保/解放をP.73の例に入れておくと良かったように思う。

あと、P.75の下から2行目は、Stack stack2 = newStack(buf2);の間違いだと思います。

関連して、良く似た名称だけど本書とはまったく関係ないのが次の本。

C Programming: A Modern Approach(K. N. King)

どちらかというと、Cの入門書(教科書)らしい。がすごく高評価なのでこれはこれで良い本らしい。

本日のツッコミ(全2件) [ツッコミを入れる]
_ bero (2013-09-30 14:09)

Windows8だとHyper-Vを明示的に有効化しない限りCPU仮想モードにならないと思います<br>無効な場合VirturlBoxも普通に動きます。<br>どちらを使うかは好みの問題と思いますが、書籍で(対象をWindows8に限定しない)VirturlBoxを使う理由はあると思います。(注釈があったらベターとは思いますが)<br>Hyper-V有効だとAndroidエミュレータのアクセラレータ(HAXM)等も動かなくなるので、私は無効化してしまいました

_ arton (2013-09-30 15:27)

ツッコミありがとうございます。確かにWindows8のHyper-Vは自分で有効化する必要がありますね。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|

ジェズイットを見習え