昨日は+=とかを実装した。<<=の字句解析の実装で勘違いしてアワアワしたりした。今日は京阪電車の中で夏季投稿大会のお知らせを投げた。どのくらいの人が参加するだろうか。自分の記事はセキュキャン周りにするつもり。このdiary.mdをちょっと改変して投げても良いかもしれない。8月1日ついに7月が終わってしまった。テストも明日で終わり。昨日はあの後グヨーバユ変数を実装した。テキストのコードがそのままでは動かなかったので難儀した。結局.dataと.textを適宜入れていなかったことが問題だったようだ。GCCとかだと.commというよくわからんものでグローバル変数を実現している。Ruiさんから説明されたけどいまいちよくわからんかった。このあたりは自分で手を動かして確かめるしか無いようだ。ネットにもそういう記事があったので、機会があればちゃんと調べたいなぁ......今がその機会かもしれない。今日はchar型を実装した。正確に言えば昨日から実装は初めたのだけど、上手く実装する方法が思いつかなくて今日になった。charというのは1つの独立した型なのだけど、実際にCのなかで扱われるときはほとんどintと変わりがない。1バイトを頑張って読み込んだり書き込んだりさえすれば、あとはintとして扱っても問題ないようだ。それを実現するのにAST_VARのところでchar2intをかまそうとしたんだけど、よく考えたらAST_ASSIGNの左辺に変数があるばあいでもAST_VARが呼ばれるので、それだと「左辺値じゃないよ」エラーが出て怒られる。つらかったが必要なところ全てにchar2intをかますことでどうにかした。実際sizeof(ch)みたいな式を評価することを考えてもこっちのほうが良いとは思う。movsblを使って読み込まないとだめだよーと書いてあったので素直にそうしたんだけど、でもいまいち問題がどこにあるのかよくわかっていない。intを介さないような実装であればmovbだけでもどうにかなるんじゃないのかなぁ。あとmovsblのインターフェースが個人的に謎だった。byteを移動させてるはずなのに32bitで受け取るとはこれいかに。いえばドメイン移管の手続きが途中で止まっているとさくらインターネットからメールが来ていた。返信が必要なメールなんて初めてだ。あとCDがArchLinuxでマウントできなくて死んだ。計数(編注:計算機科学のための数学演習)をやろう。計数の最後の問題が解けなかったことに心残りはあるけどまぁいいや。AT&TからIntelにスイッチする?みたいな話がSlackで行われていたが、結局AT&Tのままになった。みんなIntelのほうが好きで、AT&Tが好きな人は一人もいなかったことが面白かった。今からsizeof演算子を実装してから文字列リテラルを実装する。8クイーン問題までもう少しだ。sizeof演算子を実装。AST_NOPが役立った。文字列リテラルを実装。printfとかを呼ぼうとするとよくわからないリンクエラーが出る。以前のanqoubcを思い出して、リンク時に-no-pieをくっつけるとちゃんと動いた。Katoさんが投げていた。結局-no-pieをつけるか@PLTをつけるかだった。朝から文字列リテラルの実装を変更した。グローバル変数として文字列リテラルを持つことでいい感じになった。23時から個人ミーティング。hikaliumさんに「我々の仕事がない」などと言われながらも色々と指摘をうけた。いう経験殆ど無いので新鮮。エスケープシーケンスはsizeofでバグるのでちゃんと数えよう。行とカラムをトークンに足す。それをエラー出力として利用する。strの関数を作って、トークンの種類と行とカラムを出力する。文字列全部読み込んで文字列にしたほうが楽。StringBuilderを利用。forをwhileで実装する変数にアクセスする場合は全てそのアドレスを基底にすると、構造体とかでいい感じになる。アセンブリコメントを出力すると見やすくなる。親のオフセットに子のオフセットを足す。アロー演算子はパーザで置き換え。ifSpectreの脆弱性があるよ!cast型を読み替えるだけでいいはず。va_argsABIを見よう!コメントを実装。1トークン先読みでできるはず。個人ミーティング終了。sizeofをAST_INTに書き換えるやつだけやって寝る。昨日指摘された点を修正。errorを吐く時にソースファイルの行数と列数を出すようにしたり、エスケープシーケンスを自前で処理することでsizeofに対して正しく返すようにしたりした。sizeof(“abc”)ってあんまり書かない(書く必要がない)けど、これが動くっていうのは、ちゃんと文字列リテラルがcharの配列になっているっていうことを如実に表していて面白い。シングルクオートで文字を書けるやつを実装。constantと言うらしい。仕様によると複数文字が入っている’abc’みたいなのの値は処理系依存だそうだ。始めの文字だけが効力を持つようにした。死ぬほど実行が早くなった。書き換えるに当たってVimで置換して機械的に置き換えたら、かなりの数のテストが動かなくなり焦った。前のテストからそのまま続いて次のテストが実行されるため、スタックがクリアされるわけではない。それで新たにバグが明らかになったようだった。修正を入れたらちゃんと通るようになった。今日は落ち穂拾いの日だなぁ。昨日forをwhileで書き直す話が出たのだけど、よく考えたらwhileをforで書き直せばいいのではという話に思い当たったので実装。analyze_ast_detail()も戻り値でもとの値を置換することを徹底していなかったせいでバグが出た。バグを潰せたのでよし。