かれこれ四半世紀に渡って「プログラミング」をしている。その間に,10を超える「プログラミング言語」を学び,20冊近くのプログラミング関連の本を翻訳した。幸いにも,20年程前からずっとかかわってきたプログラムは,だいぶ変化はしたが未だに店頭で販売されているし,翻訳した本も多くの書店に並んでいる。どちらも(少しは)みなさんのお役に立っていそうである。
ところが,ここ2,3年,もうひとつ別のことをやりたくなってきていた。自分でプログラミングの本を書けば,少し毛色の変わったものが書けるのではないかと思い始めたのだ。店の棚を見回してみると,筆者が得意とする「言葉」 — 我々の分野の言葉で言うと「自然言語」 — を扱ったプログラミングの本はほとんどないようだし,一度に3つも4つも言語を覚えてもらおうという(無茶なことを考える)本もあまりないようだ。
なぜ,3つも4つも一度に覚えてもらおうと考えたか説明しよう。コンピュータと長いことつきあっていると,何年かに1度,「これはすごい!」「こいつはメチャクチャ便利だ」と思うことがある。最近の例をあげれば,インターネットのブラウザ(ホームページ)に出会ったときがそれにあたる。自分の作った文書を,画像や音楽付きで,世界中のどこからでも見えるようにしてしまうとは。「すごいことを思いつく人がいるモンだ」と感動された方も多いのではないだろうか。
少しさかのぼれば表計算ソフトにもびっくりさせられた。手作業なら,1カ所でも直しが入れば,全部,電卓かそろばんで集計し直しだったのに,自動的に「再計算」をやってくれるのだから。これを「便利」と言わないで何を便利と言えようか。
プログラミングをしていても,こういった「感動」を味わうことができる。どうせなら感動は大きい方がいい。それがプログラミング言語を3つも一度に取り上げる第1の理由だ。ブラウザや表計算ほどわかりやすくはないのだが,この本で学ぶ,JavaScript(ジャバスクリプト),Perl(パール),Java(ジャバ)の3つの「プログラミング言語」は,それぞれ筆者に,直接あるいは間接的に,大きな感動を与えてくれた言語だ。なぜ感動したのか,どのように感動したのかをわかっていただければ,この本の大きな目的がひとつ果たせたことになる。
第2の理由は,同じ概念を色々な方向から学ぶことによって,その意味がよくわかると思うからだ。職場や学校で一緒に過ごしている人と旅に出かけるとその人の別の面がわかるように,また,海外に出ると日本のことをもう一度見直すきっかけになるように,他のプログラミング言語と比べることによって,ある言語で学んだ概念の持つ意味がより深く理解できる。また,このように比較することにより,言語に共通する重要な概念を繰り返し(しかも少しずつ角度を変えて)学ぶことになるので,しっかりと身に付く。
そうは言っても,ひとつの言語を覚えるのが大変ならば,1冊の本で3つも覚えるというのは無理な話だ。冒頭に書いたように筆者は10を超えるプログラミング言語を使ってプログラムを書いたことがあり,現在も5種類ぐらいの言語を日常的に使っている。日本語,英語,中国語,韓国語など,自然言語を10も20も覚えられる人はそうはいない。しかし,プログラミング言語ならばそれほど難しくないのだ。自然言語には何万もの「単語」があって,それを覚えるのが大変だ。しかし,プログラミング言語の世界で使われる「単語」の数は高々100ぐらいしかない。しかも,ここ10年程,多くの言語で「単語」の共通化が進み,同じ単語を同じ意味で使うようになってきた。ひとつ覚えてしまえば,あとはそれほど大きな違いはない。新しい言語を覚えるというよりは,隣の県で使われている,ちょっと違った方言を覚えるようなものなのだ。
第3の理由は,プログラミング言語は,まずは「広く,浅く」ではなく「狭く,深く」学ぶのが実用的だと思うからだ。筆者の作るプログラムは,ほとんどが自然言語処理 — 言葉をコンピュータで扱うこと — のためのプログラムだ。画像を扱うプログラムや音楽を扱うプログラムは(本を書いたり訳したりするときぐらいしか)作らない。多くの読者も,「入門」のレベルを終えるとプログラミングの対象分野はいくつかに絞られてくると思う。そのときには,それぞれの分野でよく使う概念や手法などを学ばなくてはいけないのだが,入門レベルで「広く」を目指そうとすると,どうしても「浅い」内容にならざるを得なくて,おもしろい例題を見つけにくいのではないかと思う。
そこでこの本ではあえて,取り上げる主なトピックを2つだけに絞って,それを3つの言語でいろいろに取り上げることで,(ある程度)「深く」を狙った。そうすることにより,実践に近いような,またおもしろいことができると考えたからだ。本書で見る例題は,すべて筆者のオリジナルのもので,多くはこれまでの仕事や家庭生活で必要を感じて(「すごい。この機能は便利だ!」と感動しながら)作ったものをベースにしている。だから,実践的という面では保証付きだ。他の分野を対象にしてプログラムを作る時にも,この「実践感覚」を味わった経験はきっと生きるはずである。
以上が,3つのプログラミング言語を1冊で学ぶという本ができあがった理由だ。けっして無謀な企てではない。
さて,「本を出したい」と考えていた私の所へ,偶然にも「プログラミングの本を書きませんか」という話をもってきてくださったのが,今回お世話になった株式会社チューリングの鈴木光治さんだ。大まかな構想は頭の中にあったものの,それを具体的な形にする作業はやはり大変で,お話をいただいてからだいぶ時間がたってしまい,そのうちに鈴木さんはご自分で新会社を設立してしまわれた。こちらも自分たちの会社を経営する身だ。ここはひとつ,新会社を応援しなければとピッチをあげて書き出して,ようやく新会社の第1号に名乗りを上げることができた。
鈴木さんには,本文に目を通していただいたのはもちろん,私の書いたプログラムをご自分の環境で試していただいて,色々な改善点を指摘していただいた。そして何より,筆者にプログラミングの本を書く決断をさせてくださったことに大変感謝している。
また,丙栞氏には,多忙な中,氏の隠された才能を発揮してたくさんの楽しいイラストを描いていただいた。堅苦しくなりがちな本文の雰囲気をだいぶ和らげていただいたように思う。ここに感謝する。
この本は次のような人を対象に書いた。
中学校で習う英語と数学,それに国語(日本語)の知識を一度は身につけた人を念頭において書いた。英語や数学など細かいことは忘れてしまったという人でも,必要なことは思い出せるように書いたつもりだ。
だからといって,低レベルな説明に終始したわけではない。難しい概念を真正面から「定義」するのではなく,できるだけ直感的に,感覚的に理解できるよう,具体例を示して,なぜそのような概念が必要なのか,役に立つのかを説明するように心がけた。すべての概念を,例題で実際に使われる場面に即して説明している。「深く,狭く」を目指すことによって,このようなことが可能になったと考える。
プログラミングに数学に知識はそれほど必要ではない。むしろ,物事の処理を分析して1ステップずつに分解するのが得意かどうかが重要だ。
私の周囲には,仕事柄「以前は言語学をやっていた」というような人が何人かいる。もちろんプログラムをほとんど作らない人もいるのだが,多くの人は結構楽しんでプログラムを作っているようだ(中にはプログラミングの方が専門になってしまった人もいる)。だから,これまでの経験や知識とプログラミングが上手になるかならないかはあまり関係がないらしい。この本が,プログラミングの素質を持つ人が,それを開花させるきっかけのひとつになれれば,とてもうれしい。