科学的方法論からコンピュータを見る

『Structure and Interpretation of Computer Programs』(SICP)を読んで…

型とは何か

プログラミングを学ぶとき、最初まず呪文として知るのが型だ。 文字列はstring、整数はintegerですよとか、要するにデータの入れ物ですよ、として理解する。 「文字列1」と「整数1」を計算してエラーになるのはたぶん多くの人が通過する道で、同時にああそういうことね、と理解する。

ソフトウェア作りの面白いところは、割と適当な知識でも実際に直面してモデルを作りあげられることかもしれない。失敗のコストはないようなもので、知識として知るよりも、自分で体験して学ぶことができる。1)

そのあとで理論を学ぶのも面白い。 実際に試して自分の中でモデルを作ったあとに理論を学ぶと、しっくり理解できることは多い。抽象化に隠されているだけで、実は厳密なアルゴリズムがあって、より視野が広くなる気がする。

型の話しを具体例として考えよう。じっさい、型とはどういうことなんだろう。 プログラム言語で言語自身を拡張し、型を自分で作ることを体験2)することで、それを理解することができる。 たとえば整数しかない言語で分数の型を作りたいとすると、まず分数が何なのか、をプログラム言語で表現することになる。 分子と分母、2つの整数で表現できる。さらに分数同士の四則演算のやり方を定義する。分母を揃えるなどあるので多少ややこしくなるかもしれないが、整数の計算として表現できるだろう。 さらに今ある整数世界とつなげて拡張するために、整数と分数を計算したときのふるまいを書く。整数を分数に変換して分数同士の計算にすればいいだろう。

そうして、整数+分数が計算できるようになる。実際のデータのやり取りや計算は異なるのだが、見かけ上は同じように扱うことができる。そうした詳細を知らなくてもプログラミングすることが可能になる。 型の組み合わせごとに内部の演算は異なるが同じように見せ、ときには演算不可(文字列*小数とか)であることを示す…これが型ということだ。

科学的な方法: ピラミッド式

こうした作成方法は、科学的なエンジニアリングの見方を与えると思う。 私は何か作るときに、目的となることを1つの大きな関数で作り、後から分割するやり方で作ることが多かった。 が、こういうやり方もできる: それが何で成り立っているか考え、既存のものでボトムアップ的に表現していく方法。

人間を創造しろと言われたとき(!?)で考えてみよう。 前者のやり方→人間っぽいものをいきなり作り、後から物理法則とか考えていく
後者のやり方→物理法則、元素を作り、いい感じの惑星を作り、海、植物、動物…と作っていく。たぶんゲームの世界もこうやって作られている。物理演算作成→構造物のモデルを作る→街を作る。みたいな。

私は科学を専門的に学んだことがないので、後者のエンジニアリング的な方法にはあまり親しみがなかったが、コンピュータの多くの階層ではこちらが主流だろう。いっぽうで柔軟性に欠けるので、コンピュータの一番上の層、アプリケーション分野ではたぶん前者のアーティスト的方法がメインだ。両方向き不向きがある。どちらも使えればいいに越したことはない。

コンピュータの究極の学習は、作ってみることだ。原始的な構造にせよ、アプリケーションにせよ、なんだって作れる。よい教科書は、作ることを主軸としているか、で測れるかもしれない。

メモ

半分くらいまでは理解でき感動を味わえていたのだが、、それ以降あまりよくわからなくなった。 ピラミッド式に積み重ねていくので、一度わからなくなると、後はわからなくなる。多分訳もよくない。あとで再読。

  • 評価器〜わからん

1)
建築家が「どれだけ資材減らせるか?」にチャレンジしたらたぶん一発アウトで、ひたすら理論的に勉強しないといけないことなど考えると、いかに気楽に楽しくやれるかわかる。
2)
なんだか焼き物みたいだが、たぶんそんなノリでOK
article/sicp.txt · 最終更新: 2020/06/10 14:43 (外部編集)