書籍紹介『アンダースタンディング コンピュテーション――単純な機械から不可能なプログラムまで』
初稿:2014-09-19
書籍紹介『アンダースタンディング コンピュテーション――単純な機械から不可能なプログラムまで』
書いた人:ささだ
書籍情報
:
- 書籍名
- アンダースタンディング コンピュテーション――単純な機械から不可能なプログラムまで
- 著者、監訳者、訳者
- Tom Stuart 著、笹田 耕一 監訳、笹井 崇司 訳
- 発売日
- 2014年09月18日
- ISBN
- ISBN978-4-87311-697-6
- 原書
- Understanding Computation
公式ページより。
本書は計算理論をRubyでわかりやすく紹介する書籍です。コンピュータサイエンスの主要なテーマである「計算とは何か」という問いに対して、難しい数学の知識を利用をせず、Rubyを使って実際にプログラムを作りながら解説します。さらに、なぜこれらのアイデアが大切なのか、そしてそのアイデアは我々の日常的なプログラミングにどう関係していくのかを解き明かしていきます。日本語版ではまつもとゆきひろさんによる「日本語版まえがき」を収録。プログラミングの根底にある理論を学ぶことで、より広く深くプログラミングを考えたいプログラマ必携の一冊です。
書籍の紹介
なんの因果か、監訳者をさせてもらったので、宣伝するために記事を書きます。
本書「アンダースタンディング コンピュテーション」は、あおり文どおり、コンピュータサイエンスで出てくる、チューリングマシンとか、なんとか意味論とか、そういう難しそうな話を、Ruby で動くコードを使って紹介しているので、数学とかわからなくても安心! な俺得な本です。
まずは意味論について紹介して、その後オートマトン、チューリングマシンと進み、万能計算機についての紹介をします。そして、ラムダ計算やらなにやら、万能計算機と同等の計算能力をもつ計算モデルを紹介し、それらがチューリングマシンと同様に万能であることを説明します。何言ってるかよくわからないかもしれませんが、本書を読むと、何が万能やねん、とか、これらが同じように万能であるか、とか、そういう説明する方法なんかがわかると思うので、興味があったら是非読んで下さい。
最近私が Ruby のベンチマークで追加した https://github.com/ruby/ruby/blob/trunk/benchmark/bm_app_lc_fizzbuzz.rb のコードが、いわゆる FizzBuzz のコードになっているのですが、ラムダ計算で実装されたものになります。なんじゃこりゃ、と思うかもしれませんが、これがどう、何故動くのか、本書ではキッチリ説明してあります(というか、このコード自体が本書からの引用です。著者の許可を得ています)。
で、万能計算機の限界(計算不能性)を紹介して、最後に型推論の簡単なところを紹介して終わります。ある大学の先生に紹介したんですが、「このページ数にこんなに詰め込んであって凄い!」という書評を頂きました。というわけで、興味がある方は買って下さい。
さて、るびまなので、あんまり内容と関係ないんですが、どんな Ruby コードが書いてあるか紹介してみると、Ruby で Ruby らしくない、副作用のないコードを使っています。これはかなり衝撃的でした。
たとえば、スタックの実装ですが、こんな感じです。
スタックへの push は、まぁ Ruby だと、インスタンス変数で持った配列へのアクセスとして実装されるんじゃないかと思います。が、この実装では、新しいスタックを作って返しています。
本書から当該箇所への言及を引用します。
これは純粋関数的(purely functional)なスタックです。#push メソッドと#pop メソッドは非破壊的です。これらは既存のスタックを変更する代わりに、新しい Stack インスタンスを返しています。この実装は毎回新しいオブジェクトを生成するため、破壊的な #push と #pop 操作を持つ伝統的なスタック(そうしたければ、Array をそのまま使えます)よりも効率は悪くなりますが、取り扱いが簡単になります。なぜなら、2箇所以上で使われる Stack を変更したときの影響について、気にしなくてもよいためです。
関数型言語などで使われるアプローチですね。ちなみに、それらの言語では、このようにまるっとしたコピーを作らないで、できるだけ中身を共有するような効率の良い実装が使われることが多いと思います。
というかそもそも、私は Struct をこんなふうに使うなんて知らなかったですよ!
ちなみに、本書で開発するチューリングマシンを使うと、次のように遊ぶことができます(これも、本書からの引用)。
楽しそうですネ!
本書に出てくるコードは、http://computationbook.com/code からすべてダウンロードできます。
監訳者あとがき
監訳者後書きとして書いたものを、転載しても良い、とのことだったので転載します。
これなら私でも読める、と思いました。
私(監訳者)はプログラミング言語処理系を開発する仕事をしています。ですが、プログラミング言語に関わる理論が苦手で、なるべく近寄らないようにしていました。この分野の教科書では、数学というツールを使い、無駄なく、緻密な議論が華麗に展開されていくことが多いですが、その基礎を知らないと、とっつきにくく感じられることもあると思います(私にはそうでした)。また、オートマトンやラムダ計算など、個々のトピックは知っていても、なぜそれらを学ぶ必要があるのか、いまいちピンとこない人もいるのではないでしょうか(私がそうでした)。このように、プログラミングは得意としていても、プログラミング理論というと二の足を踏んでしまう人は、一定数存在するのではないかと思います。
今回、本書(原著タイトル:Understanding Computation)の監訳の話を頂いたとき、このように理論分野が苦手でしたが、これなら私でも読める、と思わせる説得力がありました。難しいテーマを扱っているにも関わらず、読みやすい文章に、具体的なRubyプログラム。とくに、6章にある、FizzBuzz問題をラムダ計算で解く、数ページにもわたる最終的なProcオブジェクトだけでのRubyプログラムは圧巻です。
本書はコンピュータサイエンスの主要なテーマである「計算とはどういうものか」という問いに対して、プログラムの意味から始めて、単純な機械から万能機械、計算可能性から決定不能問題といった重要なトピックをわかりやすく紹介しながら、答えを探っていきます。さらに、紹介した理論を一歩ずつRubyプログラムで実現していくため、プログラムの挙動を通じて理解を深めていくことができます。プログラムは手元の計算機環境で実行することができるので、読者は納得するまでいじって試すことができます。
まえがきの冒頭に、「本書は、プログラミング言語と計算理論に興味のあるプログラマ、特に数学やコンピュータサイエンスのバックグラウンドのない人のために書かれています」とあります。いまさら大学の講義を受けるのも難しいけれど、プログラミング言語理論にはちょっと興味があった、という人にとって、本書はうってつけです。もちろん、この道を学ぼうとする初学者にとっても、よい導きの書となるでしょう。本書に出会うことができる学生さんが、本当に羨ましいです。
なお、本書は計算理論やプログラミング言語理論の教科書ではありません。厳密さよりもわかりやすさを優先しているため、形式的な議論などは行なわれていません。この分野をより専門的に勉強したい方は、別の教科書などを参照してください。
日本語訳のサポートページは http://www.oreilly.co.jp/books/9784873116976/ にあります。より発展的な内容を勉強するための、本書の次に読むべき本なども紹介しています。また、登場するRubyプログラムは、すべて http://computationbook.com/code にて原著者によって公開されています。自習などで役に立てて下さい。
このように、高度な内容を含み、訳出が難しい部分のある原書でしたが、笹井崇司さんによりわかりやすく翻訳して頂きました。また、Rubyの父であるまつもとゆきひろさん(matz)に前書きを寄稿して頂きました。
本書の監訳では、稲葉一浩さん(@kinaba)、福森匠大さん(http://sorah.jp/)、遠藤侑介さん(@mametter)、酒井政裕さん(@masahiro_sakai)、住井英二郎さん(東北大学)、坂口和彦さん(筑波大学)、山下伸夫さん(聖徳大学)、上野雄大さん(東北大学)という錚々たる識者の方々に内容をレビューしてもらい、助言を頂きました。この場を借りて、御礼申し上げます。とくに、遠藤さんには全編に渡って丁寧にレビューして頂き、専門家としての多くのご指摘を頂きました。また、鳥井雪さん(妻)には一緒に勉強しながら全編をチェックして頂きました。苦手な分野での初めての監訳で、品質をここまで高めることができたのは、協力して下さった皆様のおかげです。
本書が、あなたの楽しいコンピューティングライフの一助になれば幸いです。
目次
おわりに
目次を読んで、「興味がある人」という人には良い本だと思うので、良かったら買ってね!
(売り上げは、私の懐にはほとんど影響しないのだけど…)