2023/01/05
PL/0' コンパイラ完成
やったこと
- PL/0' コンパイラのデバッグ
昨日の続きで、写経したはずなのになぜか吐かれているエラーを潰していた。
ほとんどのエラーの原因は記述漏れか Go と C の仕様を間違えていたことだった。
本のコードに倣って文字は byte 型、トークンの文字列は [MAXHOGE]byte 型にしていたのだが、予約語は string 型で定義していた。
入力ファイルから読み取ったトークンと予約語を比較してトークンが予約語かどうか判別する部分で、 string にキャストした [MAXHOGE]byte 型と string 型の比較の結果が (出力される文字列は同じなのに) false になっていた。
文字列の値や型を標準出力してみてもトークンと予約語は一致していたが、長さを見てみるとトークンの方が MAXHOGE の長さで固定になっていることに気づいた。
これは [MAXHOGE]byte を string でキャストするとゼロ値の要素がヌル文字になることが原因と分かった。
また、 C ではインクリメント・デクリメント演算子は式のため式の中で使用できるが、 Go では文なので式の中で使えない。
そのため C のプログラムを Go で写経する時に、 C でのインクリメントが前置か後置かで Go でのインクリメントを書く場所を変えなければいけない。
これのミスもエラーの原因になっていた。
一日中デバッグしていて他のことが何もできなかったが、完成したのでヨシ!
テストを書いていない (というか書けないような密結合になっている) ため、エラーの原因の特定に時間がかかったが、処理を追いながら確認していくなかで理解が深まった気がするから結果的に良かった。
以前からコンパイラを作ってみたいと思っていて興味はあったが、手を動かせていなかった。
今回、本の内容と写経・デバッグで、コンパイラの処理の流れや使われているアルゴリズム、理論をどう実装に落とし込むかが理解できて自信がついた。
今後の課題としては以下のようなことがある。
- PL/0' くらいの規模の言語を一から実装する
- ワンパスコンパイラでないものを実装する
- 最適化の理論と実装を学ぶ
- LL(1) 文法以外の文法の理論と実装を学ぶ
- より複雑な言語機能 (クラス、 GC など) の実装を学ぶ
- スタックマシン以外の仮想マシンで動くものを実装する
知らないことは山ほどあるから地道にやっていきたい。 次はタイガーブックだー 🔥
思ったこと
12 月に受けた TOEIC の結果が公開されていた。 今回の点数は 855 (R:445, L:410) だった。 受けた後の手応えでは前回とあんま変わらんかなと思っていたが、順調に上がっていて良かった (DMM 英会話に感謝 🙏)。 ようやく TOEIC から解放された!
今日の英会話
経済や政策の話だと語彙と内容の難易度が少し上がる感じがする。
social security は社会保障って意味なの知らなかった。