Neunomizuの日記

俺だけが俺だけじゃない

SICPを第4章まで読んでLisp(Scheme)のしょぼいインタプリタを作った

SICPを4章まで読んだ結果

コンピュータの仕組みの興味が湧いたので,実際にプログラミング言語を動かすことが大事だと思い何かしらの言語のコンパイラを作りたいと思いました.噂によるとSICPという本がLisp方言のSchemeコンパイラまで作るらしいので,春休みから取り掛かりました.

春休みを全て使うことはできなかったとはいえ実際に第4章まで終わった4/4(終わってないです) しかも「一応終わらせること」が目的で,「納得するように終わらせること」が目的ではなかったので,演習問題は割とネットの力を借りています.

コンパイラは無理でしたがこの段階で最低限の機能のついたインタプリタを作成することができました(本書の記述とネットの巨人の肩に乗っただけ?).

名付けてdioLispです.

インタプリタの機能の紹介

このLispインタプリタには最低限の機能しかないことを先に言っておきます.というのも色々な機能を盛り込むのもいいのですが,簡潔な言語としてSICPに採用されたSchemeの設計思想に反する気がして気が引けたからです(ただの手抜き).

  1. pair(cons,car,cdr)の実装
  2. 四則演算の実装
  3. coming soon...(実装サボってますすみません(T_T))

SICPを4章まで読んだ(インタプリタを作った)ことで得られたこと

インタプリタを作った過程で得られたことをざっと振り返ると以下のようになります.他にもある気がしますが,自分が目次を見て思い出すのはこれくらいです.

  • コンピュータ・サイエンスの基礎について入門できた(気がする)
  • 複雑な機構も単純な要素からなるとわかった
  • データの抽象化に関する処理に慣れた
  • 再帰関数に慣れた
  • 1つの事象を複数の手法で取り組むということが習慣になった
  • 手続きを再生産することの重要性を実感した
  • 破壊的代入の怖さがわかった
  • 並列(concurrent)処理と並行(parallel)処理の違いがわかった
  • ストリームという概念を把握した
  • 言語処理系の処理が説明できるようになった.

これから始めるつもりの人にアドバイス

各章に関して

個人的に難易度は

<易> 1章<<3章<<<2章<<<<4章 <難>

です.

私は1章から順番にやりました.本書ではそれまでの章の知識を前提知識として扱うので飛ばしてやることはおすすめしません.

演習問題について

演習問題を全て自分で解くのも大事ですが,すごく時間がかかると思うので時間と相談してやってください.ちなみに私は全て自分でやるのは贅沢でいいと思いますし,わからない部分は人のソースコードを見てしまうのも理解してしまえば実力はつくと思うのでいいと思います(ネットには全て自分で解く人もいますが,優秀なエンジニアさんばかりなので無理する必要はないと思うということです).

@beginners

あまり気負い過ぎないようにしてください.私は第4章は人の回答を見てばかりで自分の脳に欠陥があるんじゃないかと思い,春休みの終盤は本当に悲壮感でいっぱいでした...この本はかなり要求水準が高いと思うので,できなくても落ち込まないでください.

次の目標

Lispインタプリタを作った程度でコンピュータのことはまだまだわかりません(おい,そして君はまだ4章も終わってないじゃないか).

今後はもっと低レイヤーの部分がやりたいと思っています.今まで通りアルゴリズムとデータ構造の勉強をしながら,OS・CPUなどハードウェアの勉強も始めたいです(ちょうどハードウェアに関しては大学の授業も始まりました).

(CPUに関しては「CPUの創り方」という本を実は友人とやっているので多分次の記事はそれになります(?))

5章に関しては演習問題は適宜見ながら今後とりあえず読もうという感じです.

教科書

SICPのURLです