プログラミング言語の文法を学ぶ

プログラミング言語C
第2版

Brian W. Kernighan,
Dennis M. Ritchie 著
石田 晴久 訳
共立出版 発行
1989年6月
343ページ
2940円(税込)
新版 明解C言語
入門編

柴田望洋 著
ソフトバンク パブリッシング 発行
2004年8月
340ページ
2310円(税込)
Cプログラミング
専門課程

藤原 博文 著
技術評論社 発行
1994年12月
367ページ
2650円(税込)
プログラミング言語C++第3版
Bjarne Stroustrup 著
長尾 高弘 訳
アジソン・ウェスレイ・パブリッシャーズ・ジャパン
1998年11月
1031ページ
7350円(税込)
新装版
Cプログラマのための
C++入門

柴田 望洋 著
ソフトバンク パブリッシング 発行
1999年6月
337ページ
2520円(税込)
Effective C++
改訂2版

Scott Meyers 著
吉川 邦夫 訳
アスキー 発行
1998年5月
271ページ
3990円(税込)
More Effective C++
:最新35のプログラミング技法

Scott Meyers 著
安村 通晃,伊賀 聡一郎,飯田 朱美 訳
アジソン・ウェスレイ・パブリッシャーズ・
ジャパン 発行
1998年8月
297ページ
3990円(税込)
Exceptional C++
Herb Sutter 著
浜田 真理 訳
浜田 光之 監修
ピアソン・エデュケーション 発行
2000年11月
249ページ
3570円(税込)
Modern C++ Design
ジェネリック・プログラミングおよびデザイン・パターンを
利用するための究極のテンプレート活用術

Andrei Alexandrescu 著
村上 雅章 訳
ピアソン・エデュケーション 発行
2001年12月
337ページ
3780円(税込)
プログラミング言語Java
第3版

Ken Arnold,James Gosling,
David Holmes 著
柴田 芳樹 訳
ピアソン・エデュケーション 発行
2001年6月
597ページ
3990円(税込)
改訂版 
Java言語
プログラミングレッスン
(上/下)

結城 浩 著
ソフトバンク パブリッシング 発行
2003年10月
354ページ(上),315ページ(下)
2520円(上/下,税込)
Effective Java
プログラミング言語ガイド

Joshua Bloch 著
柴田 芳樹 訳
ピアソン・エデュケーション
発行
2001年11月,
236ページ
2730円(税込)
プログラミングC#
Tom Archer 著
豊田 孝 監訳
日経BPソフトプレス 発行
2001年9月
464ページ+CD-ROM
4179円(税込)
ステップバイステップで学ぶ
Microsoft Visual Basic .NET実践講座Vol.1基礎編/Vol.2活用編

Michael Halvorson 著
日本ユニテック 訳
日経BPソフトプレス 発行
2002年6月
428ページ+CD-ROM(Vol.1),
263ページ+CD-ROM(Vol.2)
各2604円(税込)

 プログラミングの第一歩は,とにかくプログラミング言語の文法を学ぶことです。以下,主要な言語別にお薦めの書籍を紹介していきましょう。

C言語

 C言語の入門書と言えば,誰もが最初に挙げるのがBrian W. KernighanとDennis M. Ritchieが著した「プログラミング言語C第2版」です。この本は著者2人の頭文字をとってK&Rとも呼ばれ,長い間Cプログラマの間で「バイブル」「原典」とされてきました。本書の第1版に「Cの言語仕様を定義する」本という役割があったことが大きな理由です。実際,初期のコンパイラはこの本の巻末資料をもとに作られたものです。もっとも現在はANSIやISO/IECが言語仕様を策定しているため,厳密な仕様を知りたければそれらの仕様書を見るのが筋と言えるでしょう。

 K&Rの良い点は,入門書としてわかりやすいことに加え,C言語の設計思想を開発者自身の言葉で読める点です。「はじめに」の章でCが低水準であることや言語仕様を小さく保つことによるメリットについて述べているほか,本文中でもいたるところでこうした点を重視したことを感じさせます。特に,Cが「プログラマは,自分が何をしようとしているかを知っている」という基本哲学で作られたものである(フールプルーフではない),としている点はすべてのCプログラマが肝に銘じておくべきことと言えます。サンプル・コードの簡潔な記述法からも学べる点が多いでしょう。

 K&Rは出版当時の基準で言えば十分わかりやすい本と言えますが,最近の手取り足取り親切に教えてくれる本と比較すると,理解しにくい点があるのも事実です。例えばビット演算や論理演算について知っていることが前提ですし,コンピュータの内部では文字を何らかの数字(ASCIIコード)で表している,といったことも既知として扱っています。ほかの言語を触った経験がなかったり,こうした知識に不安がある場合は,先に「新版 明解C言語 入門編」を読むことをお勧めします。

 本書の特徴は,配列やポインタ演算などメモリー・イメージを表す図をふんだんに使って非常にわかりやすく解説している点です。これらの図を眺めながら本文を読むことで,頭の中にCのメモリー操作を自然にイメージできるようになるでしょう。もちろん,2進数や整数の内部表現,ビット演算など前提となる知識についても解説しています。入門書では省略されることが珍しくない「名前空間」や「整数の昇格」などにも一応触れているので,この一冊だけで「基本的な文法を習得した」というレベルまで到達できます。

 ただ,Cは文法を学んだだけではなかなか使いこなせるようにならないことで有名な言語です。初心者のうちは,コードが期待通りに動かなくて何時間も悩んだりすることも珍しくないでしょう。ポインタの操作や文字列処理,暗黙の型変換といった点については,もう1冊何らかの本を読む必要があるのです。

 こうした「入門書の次に読むべき本」は,書店で「実践編」「応用編」などが書名に含まれる本を探せば何冊か見つかると思います。ここでは「Cプログラミング専門課程」を挙げておきましょう。本書は,文字列処理やポインタを操作する際の注意点,構造体やプリプロセサ・マクロの使い方,分割コンパイルの方法など,実際にプログラムを組む際に必要となる知識を解説した本です。アドレスを画面に出力するサンプルなどを実際に動かしてみれば,ポインタの型が持つ意味や変数の内部表現などについての理解を深めることができるでしょう。バイト・オーダーや構造体のパディングといった実際の開発で問題になりやすい点に触れているのも,これからCを本格的に使おうという人には有用なはずです。10年以上前に出た本なので,雑談の部分はよくわからないかもしれませんが,本論部分は十分役に立ちます。

C++言語

 おおざっぱに言えば,C++言語はC言語にクラス,演算子オーバーロード,テンプレートなどいくつかの機能を追加したものです。したがってC++言語の学び方には,大きく分けて(1)先にC言語を学んでからC++を学ぶ,(2)いきなりC++を学ぶの2通りがあります。(1),(2)のどちらがいいかは意見の分かれるところですが,筆者のお勧めは(1)です。これは,一度にたくさんのことを学ぶと消化不良になりやすい,という点のほかに,C++を一から学べるような良書が少ないことも理由の一つです。CとC++ではごく一部互換性のない点もありますが,C言語を学ぶこと自体は無駄ではありません。C++で開発するといっても,Cで組まれたライブラリを利用するなど,Cのソースコードを読む必要が生じることは必ずあるからです。

 C++の文法書の原典と呼べるのは,C++の開発者であるBjarn Stroustrupが著した「プログラミング言語C++第3版」です。C++が用意するすべての言語機能をカバーするのはもちろんのこと,C++の標準ライブラリの一部であるSTL(Standard Template Library)の使い方についても多くのページを割いています。第1章にはC++の設計思想に触れた節もあり,Cとの互換性をできるだけ維持する一方で安全性のためにあえて100%の互換性を求めなかったこと,Cのメモリー使用量や実行速度についてのメリットをできるだけ失わないようにしたこと,高水準の組み込み型や演算子は開発者が自分で定義すれば済むので用意しなかったことなどを述べています。こうした点はほかの文法書でもある程度触れられていますが,言語の設計者自身の言葉で読めるのは原典ならではと言えるでしょう。

 ただ,すべての文法事項とSTLの解説を1冊にまとめたこともあり,個々のトピックの説明はそれほど丁寧ではありません。加えて,オブジェクト指向の概念についての説明も,初めて読む人には不足していると言えます。たとえC言語を知っているにせよ,いきなりこの本を読むのは辛いと感じる人がいらっしゃるかもしれません。

 そのような人には,先に紹介した「新版 明解C言語 入門編」と同じ著者の「新装版 CプログラマのためのC++入門」をお薦めします。本書はタイトル通り,Cの知識を前提にC++で追加されたクラスや演算子オーバーロードなどの機能を解説した本です。単に各言語機能の使い方を説明するだけでなく,「なぜそのような機能が必要なのか」をきちんと解説しているため,「本当にわかった」という気にさせてくれます。voidポインタの扱いなど,CとC++の細かい違いを解説している点も役に立つでしょう。

 本書の最初の版が出たのはANSI/ISO C++の仕様策定よりも何年も前なので,ヘッダー・ファイルの扱いなどコードのスタイルに一部古い点があります。ただ,クラスや演算子オーバーロードなどの使い方を学ぶことが目的なら特に問題はありません。こうした点や,本書でごくわずかしか触れていないテンプレートについては,「プログラミング言語C++」などのほかの本で学べばいいでしょう。

 Cの場合と同様,C++も文法を理解しただけではなかなか使いこなせるようにはなりません。文法書を読んだら,次はぜひScott Meyerの「Effective C++ 改訂2版」と「More Effective C++」を読んでみてください。Effective C++は,C++プログラマが従うべきガイドラインやテクニックを50個紹介した本です。取り上げている項目は,「基底クラスでは仮想デストラクタを定義する」「継承した非仮想関数を再定義してはならない」といったもので,各項目について「なぜそうすべきか」「なぜそうしてはいけないか」をサンプル・コードを示しながら数ページを割いて説明しています。「More Effective C++」はその続編にあたり,コンストラクタや非メンバー関数を仮想関数のように振る舞わせる方法など,もう少し高度なテクニックを紹介しています。

 「Effective C++」と「More Effective C++」の両方に目を通した人は,ISO/ANSIのC++標準化委員会のメンバーの一人であるHerb Sutterが著した「Exceptional C++」にも挑戦してみましょう。この本は,インターネットのニューズグループcomp.lang.c++.moderatedの定期記事「Guru of the Week」の一部をまとめて加筆/修正を行ったもので,47個の「課題」とそれに対する「解答」という形式で,C++のコーディングやクラス設計のテクニックとガイドラインを解説しています。問題には,イテレータの使い方の誤りをコードから探す,といった単純な間違い探しもあれば,目的を満たすクラスを一から作成させるものもあります。短時間で答えられる問題はそれほど多くないので,クイズ形式で楽しみながら…という本を期待すると裏切られるかもしれません。

 EffectiveシリーズのScott Meyerが本書の序文の中で,何度もひっかかったと述べていることからわかるように,取り上げている問題の中にはかなり難しい(間違いやすい)ものもあります。本書の問題に対してある程度答えられるようになったら,もう上級者の仲間入りと考えてよいでしょう。エキスパートを目指す人はぜひ目を通してみてください。

 C++のテンプレートは非常に応用範囲が広いので,文法書とは別に解説書を1~2冊読むことをお勧めします。ここでは「Modern C++ Design」を挙げておきましょう。本書は,C++を使った開発において頻繁に直面する問題を,テンプレートを使ってスマートに解決するためのテクニックを紹介しています。

 扱っている題材は,整数定数を型にマッピングしたり,型のリストをテンプレートを使って管理するといったテクニックから,テンプレートによるAbstruct Factory,Visitor,Singletonなどのデザインパターンの実装まで多岐にわたります。本書を読めば,テンプレートが単にコンテナやアルゴリズムを記述するためだけのものではなく,継承/多態性に優るとも劣らない設計/実装上の有用な機能であることがわかるでしょう。

 本書の良い点は,動機や前提となる知識をきちんと解説しているおかげで非常にわかりやすいことです。GoF本などに見られる,テンプレートを使わない実装と問題点についても詳細に議論しているため,テンプレートに関するテクニック以外にも学べる点がたくさんあります。すべてのC++プログラマに読んでいただきたい良書です。

 自分でクラス・テンプレートを書くことは少ないが,STLはよく利用する,という人も多いかもしれません。そういう人は,STLを活用するための50個の鉄則を紹介した「Effective STL」(Scott Meyer著,ピアソン・エデュケーション発行)を読んでみてください。誌面の都合で写真は省略していますが,こちらも非常によい本です。

Java

 Javaの言語仕様は,乱暴に言えばC++から多重継承や演算子オーバーロードといった難しい機能を取り除いたものになっています。したがって,C++プログラマであれば,それほど苦労なく学べるはずです。一から学ぶ場合にはオブジェクト指向の概念を理解できるかどうかがカギになるでしょう。

 Javaの文法書の原典と呼べるのは,Javaの開発者であるJames GoslingやBill Joyなど4人が著した「Java言語仕様」(ピアソン・エデュケーション発行)になります。ただ,この本は純粋な仕様書なので最初から通して読むのは大変です。教科書としては,James Goslingが著者に名を連ねている「プログラミング言語Java 第3版」がJavaにおけるK&Rに相当する本と言えるでしょう。

 本書はほかの言語でのプログラミングの経験があり,かつ基本的なオブジェクト指向の概念を習得済みであることを前提にしています。ただ,教科書として書かれただけあって読み進めるのに苦労するということはありません。少なくともC++のユーザーであれば,いきなり本書を読んでも十分読みこなせるはずです。継承やポリモーフィズムといったオブジェクト指向の概念については軽く触れるだけですが,Javaの特徴の一つであるインタフェースについては十分にページを割いています。もちろん,きちんとした文法書だけあってフィールドの初期化順序やオペランドの評価順序などの細かい言語仕様についてもきちんと触れています。後半では,スレッドと同期,I/Oストリーム,コレクション,といった基本的なクラスライブラリの使い方についても取り上げているので,これ1冊でJavaについての基礎的な知識が身に付きます。一度にすべて読むのが大変という人は,とりあえず前半の200ページ程度を読むだけでもいいでしょう。

 一方,これからJavaでプログラミングを始めたいという人には,結城 浩著「改訂版Java言語プログラミングレッスン」をお薦めします。本書は,変数とは何か,どんな役に立つのか,といったプログラミングの基本事項をわかりやすく解説する一方で,クラス継承において重要なis-a関係,has-a関係などについてもしっかり触れています。わかりやすさを重視するあまりに「どう書けばよいか」に終始する入門書が多いなか,クラスのstaticメンバーがなぜ必要かなど,「なぜ」をきちんと説明している点も本書をお薦めする理由の一つです。説明の順序が多少前後する部分もあるので,しばらく考えてわからなかったら先に進む,という方針で読み進めてみてください。

 文法を一通り理解したらもう1冊本を読んだ方がいい,という点はJavaでも変わりません。ここではEffectiveシリーズの一つ,「Effective Java」を挙げておきます。この本もEffective C++などと同じく,Javaらしいコードを書くための57個のガイドラインやテクニックを紹介しています。取り上げている項目は,「cloneを注意してオーバーライドする」「継承よりコンポジションを選ぶ」「過剰な同期を避ける」など,クラス設計の指針からコーディング上の注意まで多岐にわたります。共用体や列挙体をクラスで置き換える方法など,C/C++言語からの書き換えについて1章を割いている点も,C/C++の経験が長い人には役に立つでしょう。上級者向けのテクニックを紹介するというより,Javaプログラマとして当然知っておくべき知識を身に付けるという趣旨の本なので,レベルにかかわらず読んでほしい1冊です。

C#Visual Basic.NET

 .NET環境用の開発言語であるC#とVisual Basic(VB) .NETについてもいくつか本を紹介しておきましょう。まずC#の文法書としては「プログラミングC#」をお薦めしておきます。C#の言語仕様はJavaと同じくC/C++を基にしており,Javaとは兄弟みたいなものです。JavaやC++を知っていれば覚えることはそんなに多くありません。それだけに,デリゲート,ボクシング,属性(Attribute),インデクサといったC#特有の機能をきちんと解説しているかどうかが文法書を選ぶ際のポイントとなります。その点,本書は属性とデリゲートに1章ずつあてているほか,インデクサについてもある程度のページを割いています。

 ところで,「プログラミングC#」という書名から,プログラミング言語Cなどと同じく言語の開発者が書いた本か,と思った人はハズレです。よくみると「言語」が抜けていますね。ちなみに原書のタイトルは「Inside C#」と,邦題とまるで違ったりします。そのため,というわけではないでしょうか,言語の設計思想はもちろんのこと,文法上の細かい点についてもあまり触れていません。ページあたりの文字数が少ないので短時間で読めるというメリットがある半面,詳細な議論を期待すると裏切られるかもしれません。

 VB .NETについて学ぼうという人のほとんどは,VB 6.0など以前のVBを触った経験がある人でしょう。一から.NET用の言語を学ぶなら,VBよりもC#を選択する人が多いでしょうし,またその方がお勧めだからです。そのせいもあってか,VB .NETについては,純粋な文法書はあまり出版されていません。文法も大事だけど,開発環境含めて,すぐにVB .NETを使えるようになりたいというニーズの方が多いのでしょう。

 VB 6.0以前の知識を生かして,とにかく早くVB .NETが使えるようになりたいという人には,「ステップバイステップで学ぶMicrosoft Visual Basic .NET実践講座 Vol.1/2」をお薦めしておきます。本書は,VB .NETを操作しながら文法,クラスライブラリ,開発環境の使い方を段階的に学んでいく,総合的な解説書です。.NET Frameworkやクラスライブラリといった言葉を前面に出さずに解説しているので,VB 6.0のユーザーが旧来のスタイルでプログラミングしたい場合にそれほど違和感なく読めるのが特徴です。一応「変数とは何か」といった説明もあり,一からVB .NETについて学ぶ人でも何とか読めると思います。

 一方,VB .NETのエキスパートを目指すなら,Francesco Balena著「プログラミングMicrosoft Visual Basic .NET Vol.1/2」(日経BPソフトプレス発行)を読んでみてください。こちらも文法,クラスライブラリ,開発環境の操作法をすべて説明する総合的な解説書です。ただし,入門書と違って操作方法のチュートリアルなどはありません。

 Balenaの前著「プログラミングVisual Basic 6.0 Vol.1/2」は非常にしっかりと書かれたVB 6.0の解説書でしたが,この本もまた「これでもか」とういうくらいに詳細に書かれています。文法の説明にはVol.1の300ページ以上を割いており,デリゲートや属性についてもきちんと説明しています。Vol.1の残りの部分ではコレクション,ストリーム,スレッドなどを,Vol.2ではWindowsフォームやADO.NETを利用したデータベース接続などを取り上げています。文法書に相当する部分はVol.1にまとまっているので,VB .NETの文法書がほしい人はVol.1だけを購入する手もあるでしょう。