minghaiの日記 このページをアンテナに追加 RSSフィード

2014-04-02

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

また1年振りの更新となりかけました。

Andres Raba氏により2011年から開発が続けられている、非公式PDFSICPを全訳しました。

ファイル

恒例の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年のため、ASCIINTTpTeXの違い等がコードには含まれており、現状には合っていない感じを受けておりました。私自身は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な方々の助けをぜひ頂きたいです。

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

お助け下さい。その2

現在、転職先を探しています。インフラ系の知識もありますが、基本的にはプログラマの仕事を探しています。過去の記事を参照して頂けますとわかりますとおり、Web系の開発や携帯の開発等を仕事と趣味の両面にて行ってきました。HTML5方面もあまり深くはありませんが、手広く勉強しており、過去にはCoffeeScript本の翻訳等も行っています。

何か良い話がございましたらnarumi ドット katoh アットマーク gmail ドット com までメールを下さい。

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

通りすがり通りすがり 2014/04/06 02:28 突然のコメント失礼いたします。
通りすがりの者です。翻訳作業お疲れ様でした。
SICPというものについては存知上げませんでしたが、
和訳PDFの分量と、その後の解説文の丁寧さに圧倒されました。
minghaiさんのように、高い能力を持ち、
学習成果を公けにすることにまで
強い情熱を燃やす方がいるのを見ると
日本もまだまだ捨てたもんじゃないなと思います。

何の力にもなれず申し訳ありませんが、
minghaiさんならきっと良い職が見つかると思います。
心身の健康にお気をつけて、ご自身の目標に邁進されますよう。

minghaiminghai 2014/04/06 04:20 通りすがりさん、ありがとうございます!

daradara 2014/08/12 09:11 翻訳の前書きを読んだだけですが、意味不明でした。そこで原文を読んでみたら読みやすいのでびっくりしました。訳が酷すぎるとamazonとかで言われ続けた和田の翻訳がネットに上がっているのでそれと比べてみましたが、和田訳と比べても酷いと思います。基本的な勘違いというか、読めていないと思います。UTF 版というのは気に入りましたので、翻訳もどうにかして欲しい所です。

minghaiminghai 2014/08/12 12:14 daraさん、

どこがどう酷いのか教えて頂ければ直ぐにでも対応します。
githubにてpullリクエストを送って頂ければ即反映も可能です。

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

daradara 2014/08/13 11:51 こことここがこう間違っているという、単純なものではないので説明しにくいですね。

例えば、最初の数行を大学1年生が読んで、何のことかわかるでしょうか。英語を「日本語」に変えるのは goo 翻訳でもやれます。ただ意味が通じない(何が言いたいかわからない)だけです。そして、それでは翻訳の意味がありません。

例えば

教育者、将軍、栄養士、精神分析医、そして両親といった人々はプログラムを作ります。軍隊、学生、そしていくつかの団体はプログラムに従って行動します。大きな問題を攻略するには一連のプログラムを用います。しかしそれらは(初めからよく考えられていたのではなく)途中で生み出されたものがほとんどです。これらのプログラムは目下の問題だけに当てはまるように思われる課題で満ち溢れています。プログラムを作ることそれ自体を知的な活動としてその真価を理解するためには、コンピュータプログラミングに向かわなければなりません。

くらい噛み砕かないと意味がないと思います。そうすれば、ここでは(i)一般に大きな問題の解決にはプログラムが必要なこと、(ii)(広い意味での)プログラムが必ずしもよく考えられていないこと、そして、(iii)プログラムをきちんと作るためには(狭い意味での、コンピューター)プログラムを学ぶことが重要だということ、が述べられているのが明確になると思います。「途中でひょっこり」じゃ何のことかわかりません。

「成果」の意味での issue は通例単数で、かつ古い、あるいは稀な用法だと辞書にあるので、ここではそういう意味でないと思われるとか、また appear は「現れる」ではなく、「に見える」だとか、そういう単純な指摘では終わらないということをご理解戴けたでしょうか。

minghaiminghai 2014/08/13 13:19 Daraさん、ありがとうございます。参考になりました。

仰ることは良くわかります。しかし、Daraさんの訳を意訳し過ぎだと考える人も世の中には多いのではないでしょうか?

>(初めからよく考えられていたのではなく)

このような原文に無い表現を追加することを好む方もいらっしゃるかもしれませんが、同時にそういったものを好まない方も大勢いらっしゃいます。
翻訳は和田訳が常に議論を呼ぶように、誰にとっても満足できる翻訳は常に存在しないものだと考えます。

>途中でひょっこり

この訳は辞書の表現をそのまま拝借しました。
英辞郎の結果で「*spring into existence* ひょっこり現れる」を用いています。
この訳はご指摘の通り稚拙ですが、ユーモアのある前文においては良いかと思いました。
これを「途中で生み出された」と訳すのはとてもわかり易くなりますので参考にさせて頂きます。
ただし、原文は過去のことのみを述べている訳ではないのでその部分は表現を変えようかと思います。

今回、具体的にご指摘頂いた頭の部分に関しては参考にさせて頂きますが、そのままは採用しないつもりです。

Daraさんの仰るご意見には総体的には大いに納得できるものがありますが、だからと言って私がそのために全文を再び訳し直すようなことは致しません。
私はやれるだけのことをやりました。
後は皆さんの具体的な指摘を反映するか、または皆さんが私の成果の派生を好きに作って頂ければそれで満足です。
Daraさんが私の成果を用いてforkを行い、Dara訳をリリースすることはCC <http://d.hatena.ne.jp/keyword/CC>
BY-NC-SA <http://d.hatena.ne.jp/keyword/BY-NC-SA> 3.0の下、自由に行うことが可能です。

ご納得頂けないかと思いますが今後も具体的なご指摘以外には対応しないつもりです。


以上、ありがとうございました。

bakabakamanbakabakaman 2015/06/21 16:46 minghaiさんのSICP翻訳版を愛読しています。
私のブログにリンクを貼らせていただきました。
よろしくお願いいたします。

http://ra9ra9.exblog.jp/

sasagawasasagawa 2015/11/01 11:34 学習用のScheme処理系と簡易開発環境を無償提供しています。SICPのほか、素数夜曲、Scheme手習いを意識したR7RS準拠の処理系です。SICPの図形言語も簡易グラフィクスで簡単に試せます。(サンプルコードが付属しています。)お試しください。
http://homepage1.nifty.com/~skz/Scheme/normal.html

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証