2023/01/04
写経は終わった
やったこと
- PL/0' コンパイラの写経
- 熱田神宮に初詣に行った
- 大須で父の PC を選んだ
- 本を買った
写経が終わった。
今日は仮想マシンと PL/0' を仮想マシン語に変換するインタプリタの部分を書いた。
書いていると、どうしてそのようなコードになるか理解できない部分がでてくるけど、本に描かれているスタックマシンなどの図や疑似コードのおかげで理解できた。
関数の再帰の構文は、以下の手順で問題無くコードが生成できるのが賢い発想だと思った。
- 関数の宣言を見たら、関数名とその先頭番地を記号表に登録して jmp 命令を生成する
- 関数の本体の直前に到達したら、↑ の jmp 命令にバックパッチ、記号表の番地も同じように修正する
- 関数呼び出しを見たら、記号表にある番地へ飛ぶ cal 命令を生成する
関数の呼び出しの命令は関数本体の番地が決まった後にバックパッチをすれば良いと思うが、再帰が起こった時に全ての呼び出し命令にバックパッチを行うのは難しいので、関数宣言の時点で jmp 命令を作ってしまって、関数呼び出しでは記号表の番地に飛ぶ = jmp 命令が実行されるためコードが生成できる。
これによって再帰でもそうでない (関数の本体の番地が分かっている場所での) 呼び出しも同じ命令を生成すればよくなる。
しかも関数の番地が分かっている場所での呼び出しは、記号表の番地を見に行くため jmp 命令を介せずに関数の番地に辿りつく。
すごい。
写経"は"終わったけど、なんかエラー吐いてたので明日からデバッグだ。
父の PC が 10 年以上前に買ったもので、そろそろ寿命なので新しい PC を大須で探した。 ドスパラとかツクモとか行くと高専一年の頃にみんなで PC を買いに行った時を思い出す。 当時はメモリもストレージも CPU も何もかもが分からなくて、ただ詳しい友達に聞いて適当に選んでいただけだったのだから成長したなーと感慨深かった。
思ったこと
日報 3 日目だけど、「(外出した日でも) 日報書くために少しは進捗出そう」とか「とりあえず Twitter, YouTube を眺めるだけの時間の浪費はやめよう」とか思えるようになっていて、いい感じ。
時間が経つと、何を考えながらコードを書いていたのか、何に感動・苦戦していたかということを忘れてしまって、最後に残った結果ばかりに目が行くことがよくある。
これを防ぐために作業ログ的なものや本の感想なども日報に残していって、後で思い出せるようにしたい。
そのためにも率直で嘘偽りのないフレッシュな感想を書くことを心掛けたい。
今日の英会話
熟語の動詞と前置詞の間に長い目的語が入ったり、文の途中や二つの文の間に補足の文が入ったりすると、前後の文や単語のつながりの理解が曖昧になって意味が取りにくいこと (苦手なところ) に気づいた。