非公式PDF版SICPの全訳を公開しました

また1年振りの更新となりかけました。
Andres Raba氏により2011年から開発が続けられている、非公式PDF版SICPを全訳しました。

ファイル

恒例のgithubです。

https://github.com/minghai/sicp-pdf

jsicp.pdfが日本語版の本体です。
ejsicp.pdfはデバッグ用の日本語・英語併記となります。

ライセンスはCC BY-NC-SA 3.0です。商業使用は認められないことにご注意下さい。
http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png

SICPとは何か?

SICPとはMITが作成した何も知らない新入生向けのプログラミングの教科書です。

プログラミングと強調したことには理由があります。この本は良くあるプログラミング言語の教科書ではなく、あくまでもプログラミングを勉強するための教科書だからです。このことはこの本の中でも、最初の前書き、序文にて何度でも繰り返し強調されています。筆者達がこの本をそれまでの教科書から著しく際立たせる特徴として誇る理由です。

米国の新聞、ボストングローブ紙のMITの創立150周年記念企画にて作成されたMITでの最も重要な発明リストにもこのSICPは選ばれています。

127番 もっとも重要な本

Harold Abelson and Gerald Jay Sussman, a pair of MIT computer science professors, wrote “Structure and Interpretation of Computer Programs,” which remains a classic for encouraging the teaching of not one specific programming language, but big-picture themes students could apply across a range of programming scenarios.

MITの計算機科学の二人の教授、Harold AbelsonとGerald Jay Sussmanは"SICP"を出版しました。
これは1つの特定のプログラミング言語を教えるのではなく、学生が一連のプログラミングの
シナリオに渡って適用できる大局的なテーマを教えることを促す古典としてあり続けています。

より深い「なぜSICPが重要であるか」については以下のカリフォルニア大学バークリー校の
Brian Harvey氏による以下の記事に説明されています。

Why Structure and Interpretation of Computer Programs matters

この中で氏はSICPが革命的である3つの理由を挙げています。

  1. 計算機科学入門の教科書のハードルを上げた
  2. Schemeを選択した
  3. 新入生が達成できることの期待レベルについて毅然として楽観した

1番が最も重要なことであり、かつ上でも述べられたことです。

2番はこの教科書の前書きや序文でも再三繰り返されている点です。SchemeとはLispと呼ばれるプログラミング言語のある方言です。大学の授業では実社会で人気のあるC言語Java等を教えることが多いと言われています。しかし、SICPLispを選択しました。その理由はLispがあまりにも簡単で、ほとんど教える必要の無い言語であるためです。この説明には実は嘘があり、本当にLispの標準仕様を全て理解することは実はとても大変です。Lispの標準規格であるCommon Lisp教科書は電話帳並の太さを誇ります。実はここに仕掛けがあるのですがSICPがプログラミングの教科書であり、プログラミング言語の教科書ではないという事実をもう一度思い出して下さい。SICPLispの教科書ではないのです。従ってSICPではSchemeの極一部の機能しか教えません。しかし、それで十分なのです。これこそがLispの特徴であるのですが、Lispは世の中に存在する言語の中で最も文法が簡単な言語の1つです。LispはそもそもLIst Processorの略であり、リスト処理機という意味です。Lispでは全てのプログラムがリストと呼ばれる構造で記述され、プログラムとデータが区別されません。通常のプログラミング言語では言語の構文と文法、それにデータ構造を長々と覚えていかなければなりません。しかし、Lispではとりあえずの文法を覚えれば後はその流れで使うことができます。そしてこのLispの単純さはLisp自身をLispで扱うことの簡単さへと繋り、そのことがSICPというプログラミングの教科書に信じられない程の奥深さを与える布石となるのです。

3番はSICPという教科書の恐しさをとても良く表しています。SICPという教科書は信じられない程の幅広い内容を一気に扱います。例えば簡単に流れを追って見ると1章ではプログラミングの基礎とモデル、抽象化の意味を学び、2章までに渡ってプログラミングで利用される代表的なデータ構造とアルゴリズムを学びます。3章ではオブジェクト指向の元となる概念、状態とその変更について学び、並行プログラミングにて生じる問題について習い、従来の一方向なプログラミングとは異なる制約伝播システムについて習い、さらに時間により生じる問題を解決するために遅延評価とストリームの実装を習います。4章ではこれらの問題をより深く探求するために言語の評価機とインタプリタを開発し、独自のScheme実装として遅延評価を行うSchemeインタプリタの実装を始めとして、非決定性プログラム言語の開発、論理プログラム言語の開発へと進みます。そして5章ではプログラムの最もプリミティブな解釈の理解を目的として、計算機を自ら設計し、機械語を設計し、それを実行する評価機を実装し、そのためのSchemeコンパイラを実装します。さらにはSchemeインタプリタコンパイル済みコードとの連携までを実装します。これだけのことを学部1年生の前期で行うと言ったら、普通の情報処理学科の学生であれば気絶するのではないでしょうか? :-) 実際には、MITですら5章全部を教えるのは不可能だと考え4章と5章の一部は外していると前書きにて説明しています。しかし、それでもSICPの教える内容は通常のものではありません。しかし、SICPはこれだけのことを教えるために、綿密に設計されています。1章から5章への流れは丁寧に積み上げられており、特に課題は同じ問題が違う形で、何度も丁寧に繰り返されます。学生はこの流れの中で、何が問題の本質であり、どのように解決されていくのかについて、計算機科学の歴史を追体験して行くことになります。

SICPの面白い点として他には、SICPが数多くのプログラミングパラダイムを一度に学べることが挙げられます。

この教科書は最初に置換モデルを学習し、その中の制約においてプログラムを行います。通常のプログラミング言語にて最も最初に習う、破壊的代入が最初に出てくるのはなんと3章です。そこで初めて、ここまで学生達が学んできたプログラミングパラダイム関数型プログラミングであることを学ぶのです。3章ではオブジェクト指向プログラム言語に対する批判等も脚注に書かれ、盛り上がってきます。遅延評価においては課題を通して、プログラミング言語の設計において遅延評価の利用はプログラマに決定権を与えるべきであろうかという問題が読者に提起されます。3章の制約システムや4章の論理プログラミングを知っている人は日本のIT業界では割と少ないほうなのではないでしょうか。きっと楽しめると思います。

SICPは初心者向けの教科書です。しかし、中身はとても本格的な教科書になります。その範囲はとても広く、まさにこの本は計算機科学の入口の塊です。読者は常に脚注から計算機科学の歴史を学び、さらなる学習のための参考資料を知ることができます。PDF版の利点として参考文献には数多くのリンクが貼られていて直ぐに論文を読むことができます。恐らくですが、実際に情報処理学科を出た人達が読んでも学ぶことが多い入門書です。実際に私は情報工学科の出身ですが、それでもこの本からとても多くのことを学ぶことができました。

SICPの難点

SICPは新入生向けの教科書です。内容はとても簡単な所からスタートします。ところが難点としてSICPの内容は高校生までの数学と物理の電子回路の内容を"良く"理解していることを前提としています。
ぶっちゃけてしまえば、課題として出てくる数学や電子回路の話が結構難しいのです。
例えば微分積分素数、剰余、確率、極限、級数、行列の理解が必要となります。
ネットで検索すると結構SICPを始めて2章までに脱落してしまう人がいるように思います。

しかし、どうか諦めないで下さい。色々なレビューに書かれていますが、本当のお楽しみは3章以降だと思います。数学的な内容は意地でも頑張って理解して下さい。数学ガール等を先に読んでおくと内容の理解が進むかと思います。私は(株)ワークスアプリケーションズ様が主催して下さった「プログラマのための数学」勉強会の内容がSICPにて展開される数値解析の内容とほぼ重なりとても参考になりました。

http://nineties.github.io/math-seminar/
http://www.youtube.com/playlist?list=PLzJWjr7AvxH0YYpi2uAH_QHLaSJQ5fZrR


SICPの難点として、課題が非常に多い点も挙げられます。これらの課題は内容の理解にとても重要なため、全て行うことがお勧めなのですが、量が半端ではありません。そのため全てを行うことを自分に課してしまうとあまりに負荷が高くてやってられなくなります。どうせ後半にはオープンな課題として、これが答えられたら博士課程の価値がある等といった課題も出てきます。ですので、気楽にほどほどに行ってください。

ちなみに、検索すると世界中でSICPを勉強している人達の回答が見られますが、5章辺りになると皆、課題をやっていません :-)

最後に、SICPの重要なテーマに抽象化が存在するのですが、抽象化レベルの高い話は簡単に道に迷います。特に4章、5章ではプログラムが大きくなり、自分が何をやっているのか全くわからなくなります。しかも、最後の最後に至るまでプログラムが完成し、実行することがありません。これを克服するためにはさっさとSICPのサイトから完成したプログラムをダウンロードして、先に終わりを読んで実行してしまうことです。そしてプログラム全体を読みながら教科書を読むことで初めて全貌が掴めてくることでしょう。

SICPを読む前に

Schemeの処理系を手に入れましょう。

MacWindowsの方にはRacketがお勧めです。

http://racket-lang.org/

RacketはLisp処理系の一方言ですが、グラフィカルなIDEを持ち、複数の言語を使用することが可能で、その中にはSchemeSICP専用の言語拡張が含まれます。特にSICP 2.2.4節で習うピクチャー言語は専用の処理系を必要とするので通常は実行することができませんが、Dr. RacketのSICP拡張を用いることで実際に実行することが可能になります。

http://www.neilvandyke.org/racket-sicp/

RacketとSICP拡張のインストール方法に関しては以下のサイトがスクリーンショットも豊富にまとめて下さっています。

http://www.applelife100.com/2013/04/02/programmin-environment-for-sicp/

Linuxを使用されている硬派な方にはMIT Schemeがお勧めです。教科書ではMITの実装と他の実装の違いが良く話題になりますので複数入れて比較してみるのも面白いでしょう。

http://www.gnu.org/software/mit-scheme/


どの選択を行っても、最初にデバッガの使用法について学んでおくことをお勧めします。
プログラミング入門者が最も最初に嵌るのが入力ミスであり、次にデバッグです。デバッガの使用法を知る人と知らない人とでは生産性に10倍以上の差がつきます。

非公式日本語版PDFについて

非公式日本語版PDFはAndres Raba氏による非公式PDF版の翻訳です。
https://github.com/sarabander/sicp-pdf

非公式PDF版には元となったLytha Ayth氏によるTexinfo版が存在します。
http://www.neilvandyke.org/sicp-texi/

非公式Texinfo版はMITによるSICPのオンライン上での全文公開を用いて作成されました。
http://mitpress.mit.edu/sicp/

元々、非公式PDF版は非公式Texinfo版に対してTeX組版を挿入し、texi2pdfを行うことでPDF化するという戦略が取られていました。
しかし、残念なことにtexi2pdfが内部的に利用するpdfTeXは海外では主流なのですが、日本では独自にpTeXの開発が進んだために傍流でした。当然のごとく、texi2pdfでは日本語を表示することができませんでした。

その窮地を救って下さったのが以下のサイトでした。
http://moimoitei.blogspot.jp/2010/06/generate-pdf-with-bookmark-on.html

この記事が提供して下さったtexinfo.texを用いることで、無事にtexi2pdfの代わりにtexi2dviとdvipdfmxを併用することで日本語を出力することが可能になりました。しかし、LaTeXではなく、直接TeXを使うことが大きな障害でした。またこの記事も2010年のため、ASCIIやNTTのpTeXの違い等がコードには含まれており、現状には合っていない感じを受けておりました。私自身はSICPの勉強はしたかったのですが、TeXに時間を必要以上に取られることはストレスに感じておりました。この時点では翻訳のみを完成させた後に、MathjaxでWebに逃げる予定でいました。

その後、大きな転機となったのが、Andres Raba氏によるXeLaTeXの採用です。Raba氏はPerlによる力技でTexinfoをLaTeXに変換し、改めてLaTeXでの組版へと舵を切ったのでした。XeLaTeXはこれもまだ日本では傍流であり、滅多には使用されていません。しかし、幸いなことに以下のサイトにてXeLaTeXにて日本語を使用するためのパッケージを開発して下さった人がいらしたのです。

http://zrbabbler.sp.land.to/zxjatype.html

この2つの奇跡により、俄然とやる気がでてきました。実際には翻訳が完成してから、Raba氏提供によるPerlスクリプトにてLaTeX形式に変換し、日本語をきちんと表示するまでには語るも涙な苦労がとんでもなくあったのですが、割愛します。ただこの課程でtexinfoファイルとtexファイルの両方を同期させる苦労に耐えきれなくなったために現在、LaTeXファイルを直接変更しており、既にTexinfoファイルの内容は古いままになっております。現在においてinfoファイルをEmacsで閲覧したいという方は少ないと思いますが、もしご希望の方がいらしましたら御自身で反映してpatchを送ってくださるととても助かります。よろしくお願いいたします。

最終的には日本では最もTeX環境が進んでいるのは意外にもWindows環境であったために、LinuxからWindows環境へと移行しています。xelatexの実行はTeXWorksから行うことができたためとても捗りました。

非公式日本語PDF版ビルド環境を構築するためにはWindowsW32TeXをインストールして下さい。あべのり様の作成して下さったTeXインストーラを使えば簡単に可能です。

http://www.math.sci.hokudai.ac.jp/~abenori/soft/abtexinst.html

次にIPAフォントをインストールして下さい。
http://ipafont.ipa.go.jp/

フォントをダウンロードした後にフォントファイルを開くとインストールボタンが表示されますので、それを押せばインストールが完了します。明朝とゴシックの両方を必ずインストールして下さい。

後はTeXWorksでtexファイルを開いて黄緑色の再生ボタンを押せば勝手にコンパイルしてPDFを表示してくれます。

なお、この時にstyファイルが無いというエラーが最初は大量に出ると思いますが、どんなスタイルファイルが無いのかメモしてませんでした。すみませんが、検索して適当にインストールして下さい。

翻訳について

最初に、ど素人の翻訳なのであまり期待はしないで下さい。修正は大歓迎ですのでpullリクエストを下さい。

SICPの英語の大きな特徴は長文です。1つの文が5行や7行当たり前です。このことは教養の高い英語では当たり前のようです。しかし、これは翻訳においては問題になります。日本語と英語の語順の違いから、長い英語を逐語訳すると読めたものじゃなくなります。特に英語では頭から流れでどんどんと代名詞に置き換えられていくため、日本語にする場合に英語は終わりから訳すのだとかいうローカルルールを適用すると見事に破綻する場合があります。このため、原文では1文で書かれている長文をぶった切って短い文の集合にする場合が多くなりました。ただし、その分、原文の順をできるだけ守り、著者の意図を重視した流れに訳したつもりです。

SICPは新入生向けの教科書であり、入門書です。ですから、とにかく優しく訳したいと願いました。本文は全て「です、ます」に訳してあります。これは通常の教科書では珍しいかと思いましたが、少しでも読者の精神的な負担を減らしたいと考えました。

専門用語については可能な限り、検索しまくって正しいと思われる用語を適用しました。しかし、私に学が無い分、おかしな訳も混じっているかもしれません。ご指摘をお待ちしております。

最後に、法的問題を回避するために、私は和田先生が公開して下さった「公式な」翻訳を読んでおりません。そのため訳に違いがあるかと思います。その場合には、当たり前ですが、和田先生のほうを信用して下さい。日本を代表する先生と私のようなど素人では最初から勝負になりません。:-)

そもそも、2013年8月にピアソン桐原が撤退し、SICPが無くなると聞いたときにこれを訳せば喜ばれるのではないかと始めました。まさか後から和田先生が公式訳を公開するとは全く想像していませんでした。一時は本当に公開を止めようかと悩んでいたのですが明示的にオープンなライセンスで公開することには意義があるのではないかと考えました。ただ、何かあったらあっという間に消える程度の存在なのは確かです。

翻訳にも著作権が存在します。そのため、和田先生の公式訳を引っ張ってきて、こちらの非公式訳に入れるような修正は行わないで下さい。何卒、よろしくお願いいたします。

お助け下さい。その1

現状のPDFは読めば読む程、細かなミスに気付く状態です。ぜひ、誤りをご報告下さい。

また現状のPDFは日本語の禁則処理等が破綻しており、まだまだ問題が存在します。TeXnicianな方々の助けをぜひ頂きたいです。

よろしくお願いいたします。