yunomuのブログ

趣味のこと

『型システムのしくみ』を読みました

型システムのしくみ ― TypeScriptで実装しながら学ぶ型とプログラミング言語www.lambdanote.com

 TypeScriptを使ってTypeScriptっぽいプログラミング言語の型チェッカーを実装しながら型システムの仕組みについて学ぶ本です。せっかくなので手を動かしながら、ライブラリのバグ修正しながら読んでました(読んでる途中で修正されてました)。

 内容はさほど難しくはなく、分量としてはだいたい実装しながらでも1週間程度で終わるくらいじゃないかなというところ。

 パーサはあらかじめ用意されていて、そこで使う構文木を定義しつつ、パーサが吐いた構文木の型をチェックする関数を実装していくという雰囲気で、「なんでTypeScriptなんだろう?」と思ったけど、実装しているファイルの中にテスト用のプログラミング言語を文字列で埋め込んで動作確認しなきゃいけないのが気持ち悪かったけど、そういうことなら確かにTypeScriptかもなあと思った。パーサを別に用意しつつ構文木の定義を見ながら型チェッカーを書くというのを1ファイルで簡単にやろうとするとこうなる。対象言語がTypeScript風なのも、記述量が少なくて型を明示できるやつとなると確かにあまり無いかも。

 やってみて思ったのは、オブジェクト型って意外と面倒じゃないんだなというのと、再帰型はそりゃ面倒だよなというの。あとたぶん同じような理由で相互再帰関数や後で定義する変数を先に使うやつの実装なんかも面倒なんだろう。相互再帰関数については演習問題の補足でなんとかなるというような事が書いてあったけど。

 ジェネリクスは、やっぱり想像通り面倒だったし、説明のしかたが面倒くさくなっていたのもまあ仕方ないくらい実際入り組んだものではあった。それは、そうか。

 スコープの話もちょっと出てきたし、部分型のところなんかで何をもって型検査をOKとするかという話なんかも出てきて、今まで見てきた多数のプログラミング言語ではあれをああやってたんだろうとかそういう事情があったんだろうなとかいう想像ができて楽しかった。

 そもそも型はエラーを出すためのものなのでこれをもって何ができるというものでもないというのはなんか冒頭にも書いてあったような気はするけど、何がわかったのっていうとちょっと説明が難しいところは実際あるとは思う。

 これをもって実際のプログラミング言語の実装を見てどういう風にやってるのかを調べてみるのも楽しそうだし、思い切って型推論の方にいってみるのもいいし、『Types and Programming Languages』をあらためて読んでみるのも楽しそうな気はするんだけど、日本語訳版の『型システム入門』は古本で2万くらいするのでなかなか手が出ないところではある。というか本当はそっちが読みたかった……。