西暦はどれも2018年/平成30年です。プッシュしていてなるほどと思ったので自分も書くことにした。坩堝に書いてもいいなぁと思ったけれどあそこに技術的な文章を載せるのは微妙に違う気がする。セキュキャンが終わった後に体験記的ななにかを坩堝にまとめて書くことにする。今日までに主要な二項演算子と代入式の実装が終わった。事前にanqoubc(編注:アセンブリが全く読めなくてやばかったので、Cコンパイラ開発を本格的に始める前に鮟鱇が趣味で作っていたコンパイラ型のbc。レポジトリはこのへん。)とかをやっていたのが功を奏して、ここまでは順調。セキュキャン応募が通った時点ではアセンブリ何も分からん状態だったのに思えば遠くに来たもんだ(来てない)。この次は関数の実装をしたい。昨日Ruiさん・hikaliumさんとhangoutsをして、・引数のない関数。・引数の型をintに固定した関数で、引数の個数チェックをしない。みたいな雰囲気で組んでいくと良いということだった。今すぐにでも実装に取り掛かりたいが、残念ながら試験勉強をしないといけないのでつらい。金曜日くらいに注文したドラゴンブックが今日届いた。読みたいが時間がない。1000ページ近くあるしもはや辞書だ。頭から読むと途中で萎えそうだし、興味のあるところを適当につまみ食いするのが良いのかもしれない。この日記をpushしようと思ったけどなんとなく嫌だったのでやめる。死ぬほどどうでも良いけど、どことなくロビンソンクルーソーの日記に自然と似る。7月12日0時をまたいでしまったので既に13日だけど気分は12日。バイトに行かずに家に帰って、1時間だけ開発した後コンピネ(編注:コンピュータ・ネットワークの試験勉強)をやっていた。22時位からもう一度開発。引数を持つ関数の呼び出しができるようになった。引数を持たないやつは楽でよかったけど、引数を持つやつは結構手間取った。bytesで渡す必要がある。pushを使わないといけない。最終的にコードはきれいになったけど。次は関数定義ですねぇ。これをすればフィボナッチ数列とかを吐けるようになるので気分が良さそう。試験勉強しないといけないけど。今の所変数をスタックに割り当てるのはコード生成のフェーズで行っている。これだと、関数呼び出しと変数を本質的に区別できない。今のところは関数呼び出しっぽかったら変数名を関数名として読み替えているけど、関数ポインタが入ると破綻しそう。解決策としては、変数の情報収集をパーズの段階でやらないとだめのようだ。8ccの実装もそうなっていた。なってくると環境(編注:スコープのこと)が欲しくなる。LISPを実装したときと同じようにやればいいのかしら。すると変数のための構造体が欲しくなるんだけど、8ccだと見たところそういうものは無いんだよな。コードリーディングをする必要がありそう。関数定義までは全部グローバル変数扱いでいいんじゃないっすかね。昨日は書き忘れたが、戻り値intで引数なしの関数定義をできるようにした。あとreturn文を実装した。今日は引数がintの関数定義をできるようにして、条件演算子(三項演算sうわなにをするやめr)(このあたりの話は(編注:Cコンパイラゼミの)Slackでもちょっと話題になっていた)を実装して、フィボナッチ数列を計算するプログラムを通せるようにした。楽しくなってまいりました。フィボナッチ数列を計算するワンライナーCプログラムはC++ではill-formedのようだ。ドラゴンブックの初めのところをチラ見した感じ、今CodeEnvのvar_mapで持っているものは「記号表」と呼ぶらしい。パーズのときに作るようなので、今の自分の実装とは異なっている。いまのままだとパーズ時に変数なのか関数呼び出しなのか区別がつかないので、そのうち変える必要がある。exprとどう見極めるかが難しい。いまのところ左辺にはtIDENTが一つしかこないからどうにかなるけれど、そのうち破綻するので方法を考えるなりドラゴンブックを読むなりしないといけない。明日はif文と!=を実装したい。!=を実装し忘れていたのは結構驚きだった。明日hangoutsが23時からある。