計算機プログラムの構造と解釈[第2版]

いやー、やっと読み終わりました。隔週の読書会で読んでいたのですが、第1回が 2016-03-23 で、完走するのに約4年半かかりました。読書会自体も合計で92回やっていて、事前の予習というか問題を解く時間も含めると約300時間かかりました。おそらく1冊の書籍にかけた期間と時間の両方で過去最大だったと思います(^_^;)

2020年分の振り返り

今年は5章をやっていたわけですが、LISPマシン向けのレジスタ計算機シミュレーターを作成し、そのシミュレーター上で動作するインタプリタコンパイラを作成するということで、ほんとLISPづくしだったなと思います。問題を解くためコードは一通り理解したので、最終的にはLispコードからどういうマシン語が生成されるか、逆にマシン語からLISPコードへの逆コンパイルもできるようになりました。といっても、非常に簡素な仕様なのと、やる前に脳みそに全コードのスタックを積むという事前作業が必要になりますけども(^_^;)

この辺りまで来るとマシン語上でデバッグプリント入れたり、コンパイルされた結果を見比べてデバッグできるようになりました。果たしてこのような経験がこの先の人生で役立つことがあるのかまったく分かりませんが、普段の業務とはまったく異なる言語とコードと概念に触れることができたのは非常に得難い経験であったと思います。

過去の振り返りについては毎年の振り返りから抜粋しておいたので、参考まで。年々少しずつ成長?している感じが伝わるでしょうか。。

2016年

まったく偶然ですが社内でSICPの読書会も始めました。隔週で毎回1時間でやっていて、2016年の間に19回やって2.2.3 公認インターフェースとしての並びまで来ました。問題も基本的に全て解いていて、恐らく読み終わるのにあと1年以上掛かると思いますw

私はLISPで書くのがどうしても馴染めず、途中からPythonで問題を解いてるんですが、cons/car/cdr/list/map/filterなどの標準関数もPythonで再実装することになり、おかげで言語仕様の違いとかも分かって勉強になりました。2016年に今更SICPを勉強することに意味があるかは正直わかりませんが*1、楽しいので続けるつもりです。現時点での成果は以下ぐらいですがw

  • LISPのリストは一方向リンクリストしかない。他言語の配列やリストはなんて便利なんだろう。。!
  • 再帰的な構造について意識するようになったというか、再帰の問題しかないw
  • LISPのコードでもPythonで書き直せば理解できるという安心感を得た
  • LISPのコードは宣言的でSQLみたい。まぁ、LISP式なので当たり前なのだけど
  • デバッグ辛すぎる。手続き的アプローチと宣言的アプローチは適材適所で使い分けしよう!

2017年

無事?その後も社内読書会が1年続きまして、2.2.3から3.3.5まで進みました。基本隔週1時間でやっていて、今年は23回(通算42回)やりました。このペースだとあと2年近くかかりそうです(^_^;)

この辺りまで進むと普通におもしろいですね。いままで知っていた概念を整理できることもありますし、まったく見たことがないものもたまにあって勉強になります。基本的に予習して問題も解いた上で参加してるんですが、読書会で理解が曖昧なところや勘違いにも気づけるのもいいです。

去年まではPythonで問題を解いていたんですが、2.3.1からPythonでは言語仕様的に解けないというか別の問題になってしまうこともあり、DrRacketを使ってneil/sicpで解いてます。おかげでSICPの問題を解く範囲でのLISPの読み書きには抵抗がなくなりましたw

あと、読書会でソースの共有をする際に便利なので問題 2.87からはGitHubにソースを公開するようになりました。

2018年

無事?その後も社内読書会が1年続きまして、3.3.5から4.1.3まで進みました。基本隔週1時間でやっていて、今年は19回(通算62回)やりました。このペースだとあと1年半近くかかりそうです(^_^;)

ついに4章に入り、evalの実装まで来ました。こんなにサクッと作れるのは衝撃です。最近はSICPの範囲ではありますがLISPのコードを読むのも、机上デバッグするのも普通にできるようになった気がします。ちょっとした単体テストまで書くようになりました。

いやー、しかし、みなさんLISPデバッグってどうやってるんでしょうね。うまく組めた時はいいんですが、期待通りに動作しないときのデバッグは基本的に机上デバッグになっちゃうものなんでしょうか。。手続き型言語デバッグプリントを入れるのがほんと簡単だなーと思います。

2019年

今年も無事に社内読書会が1年続きまして、4.1.3 から 4.4.4 まで進みました。最近は3週間に1回ぐらいの開催間隔で、今年は14回(通算76回)やりました。このペースだとあと2年ぐらいかかるかもです(^_^;)

ということで今年1年は4章をやっていたんですが、非常に濃かったです。節ごとにまったく違うアプローチの評価器を実装するという内容で、いままで見たことのない世界を見れました。あと、引き続き動くコードで問題を解くということは続けているので、よくわからない知識はついていると思います。コードはGitHubに上げてるので興味がある方はどうぞ。

いよいよ来年は5章に入ります。すぐに役立つかはともかくとして、将来的には役に立つ知識が身につくと思っているので楽しみにしてます。

各種リンク

もしこの内容を見てSICPを読もうと思う方はいないと思いますが、念のため参考リンクを載せておきます。

  • SICP Web Site for the Japanese Edition
    • SICPの日本語版をWebで公開してくれています。もともと私は書籍を持っていたのですが、持ち運びも不要で、メモにリンクを埋められるということでこのWeb版を使って読み進めていました。
  • Welcome to the SICP Web Site
    • オリジナルの英語版のサイトです。日本語訳だとどうしても意図が読み取れない時に読んでいました。あと、本文中のコードは以下からダウンロードできるので非常に便利です。
  • GitHub - n3104/sicp
    • 私が解いた問題をPushしているGitHubプロジェクトです。DrRacket上で動作することを確認しています。
  • Solutions Index – SICP exercises
    • 4章まではこのサイトの回答と自分の回答を見比べながら答え合わせをしていました。
  • Serendip - Webデザイン・プログラミング
    • 5章からはこの方のサイトの過去記事にそれぞれの問題の回答が載っていたので自分の回答を見比べながら答え合わせをしていました。

最後に

とにかく完走できてよかったという一言に付きます。完走できたのは一緒に読書会をやっているメンバーがいたからなので、感謝の気持ちしかありません。いやー、ほんとお疲れさまでした&ありがとうございました!

*1:バークレイのカリキュラムもLISPからPythonに変わってるみたいですし。。 http://cs61a.org/