週記 2022/01/24~2022/01/30
2022/01/24
14時ごろに起きる。
久々に「掃除機をかけるぞ!」という気持ちになり、掃除機の電源を入れたものの、充電が無くて断念。やる気を出した時に限って….
Twitterを見ていると、ファミリーマートの悪魔的ニンニクチャーシュー丼のツイートが流れてきた。
なんだこれは!と思い、ファミリーマートのサイトを確認すると、東京で販売されているがっつきメシシリーズの一つのよう。
関西圏はどんなものが…atta、スタミナホルモン丼!!悪魔的コンビニ弁当!!500円!!!買わねば
Brainfuckの処理系を書く。受け取ったコードをそのまま実行すると遅いので、最適化処理を書いてみる。
頻出するループ処理を一つの高レベルな命令に置き換えるのが定石らしいので、一番簡単そうなメモリの0代入を最適化する処理を書いてみた。
値を代入する命令を追加して、[-]
(ポインターが指している値を0になるまでデクリメントする)をそれに置き換えるだけ。今回の実装はコードを木構造で持っているので、枝を切って付け替える感じ。
最適化の処理を書くにあたって、Jikkaの最適化と、Clippyがlint対象を探す際の処理を参考にした。いい感じ。
次は値の加算(+=
みたいなやつ)[->>>>>+<<<<<]
を最適化する処理を書きたい。
今はインタープリンターだけど、コンパイラを作るとしたらどうするのが良いのだろう。C言語にトランスコンパイルして楽する事もできそうだけど、LLVMを自分で呼び出してコンパイルもしてみたい。元気があったらどっちも実装したいけど、うーむ…
2022/01/25
15時ごろに起きる。
鶏肉を焼いたものとキャベツを昼食にする。食べ終わって、何だか物足りなかったのでカップ麺を作る。
Brainfuckの処理系を書く。コードの最適化処理をいくつか書いてみたけど、一向に早くならない。命令を実行した回数(最適化が効いていたら減るはず)を数える処理を挟んで確認してみると、最適化前と比べて回数が増えていた(!)。どうしてと思ったけど、相手がBrainfuckなのでどんな感じに最適化されているのかがよく分からない…人間に優しい出力が欲しくなり、早々にC言語へのトランスコンパイルを実装した。実装は簡単で、命令に対応するコード片を繋げるだけ。
最適化前と最適化後のコードをC言語にトランスコンパイルして差分を確認してみると、whileループが減っていて、ちゃんと最適化出来ているように見えるけど…うーん…
2022/01/26
12時ごろに起きる。
ふと改札機を見たら、イコちゃんが改札機の中に閉じ込められていた。なんだこれは…。気になったのでググってみると、2011年ごろから設置されている(?)らしく、イコちゃんは10年も改札機の中に…
ファミリーマートに寄る。ホルモン丼が気になっていて、弁当コーナーを見てみたものの販売しておらず。夜なので売り切れてしまったのかな?うーん?
Brainfuckの処理系を書く。[-<<<<<+>>>>>]
(*(ptr-5) += *ptr; *ptr = 0;
)のような処理を最適化する処理を追加してみたら、テストに使っているマンデルブロ集合を描画するプログラムが動かなくなってしまった…ポインターが変な感じになるっぽいけど、よく分からず…
一旦テスト環境を整えたいわね。
2022/01/27
16時ごろに起きる。
暴力団の事務所を家宅捜査したというニュース動画を見る。いっぱい来てるな〜と思い、よく見てみると警視庁、神奈川県警、岩手県警、茨城県警、千葉県警(?)、海上保安庁、麻薬取締部、東京税関の計8組織が捜索に入っていた。税関が家宅捜索するのはあまり知らないけど、どんな感じなんだろう。悪いことはするもんじゃ無いわね…
Brainfuckの処理系を書く。昨日書いてうまく動かなかった最適化処理をデバッグする(テストはどうした)。暫くガチャガチャしても原因がわからず、最適化前と最適化後でインタープリンターの動作を見比べてみると原因が判明。[-<<<<<+>>>>>]
を*(ptr-5) += *ptr; *ptr = 0;
だと思っていたけど、本当はif (*ptr > 0) {*(ptr-5) += *ptr; *ptr = 0;}
だった…
ポインターが指している値が0かどうか確認しないで実行していたので、本来のコードと違う動きになっていた感じ。凡ミスが過ぎる
C言語にトランスコンパイルするとちゃんと動くので不思議に思っていたけど、ガッツリ未定義動作だった…
2022/01/28
16時ごろに起きる。
ちんすこうを貰った。とても良い
YouTubeでペンギンの動画に遭遇してしまい、気が付いたら1時間経っていた…
Brainfuckの処理系を書く。コードが雑多になってきたので、リファクタリングをした。テストで使う処理をまとめたり、最適化処理を抽象化したり。
木構造もどきを再帰関数でそのまま実行していたけど、制御フローが複雑で頭が爆発してしまったので、木構造を命令の配列に直して実行する形式に書き換えた。
早寝をしたいけど、なかなか難しい…
2022/01/29
15時ごろに起きる。
調べたWindowsでのプロファイリング事情を適当に書き出す。忘れないうちに…
Windows11にしてから、タスクバーのアプリをクリックして切り替えようと思っても、アイコンがオレンジ色になるだけで、10秒くらい待たされることがある。これが微妙にストレスで、PCを再起動しても直ったり直らなかったりするのがいやらしい。
こういう時はシステムファイルに破損が無いか確認するのが定石。確認するツールを走らせて(sfc /scannow
)、しばらく放置すると破損を見つけたので修復したという出力が。大喜びでPCを再起動してみると、特に直っていなかった。意味無いじゃねえか!と思ったけど、破損しっぱなしよりは良いか…
Brainfuckの処理系を書く。命令を分割したり、コピー処理を最適化する処理を追加した。マンデルブロ集合を描画するプログラムは最適化をかけても早くならなかったので、ハノイの塔を解くプログラムを実行してみると、最適化前と最適化後で実行速度に大きな差が出た。最適化が効いて嬉しいけど、なんでマンデルブロ集合のやつは早くならないんだろう…
平成ノブシコブシのオールナイトニッポンを聴く。先週のアンガールズに続いてオードリーの代役。なかなか良さげ。
2022/01/30
16時ごろに起きる。
焼きそばを食べる。見た目は結構な量だけど、食べてみるとそれほどでもない気もする。
Brainfuckの処理系を書く。設計も固まってきて、ちょっとしたリファクタリングと、ひたすら最適化を実装する。if let hoge…
という構文を多用するので、if_chain!
マクロを使っているけど、マクロが複雑だからかコードのフォーマットが効かない。ちょっとヤな感じ。nightly版でif let … && if let …
という記法が使えるようになっているけど、早くstableに降りて来ないかな〜。
どこが最適化されているのか表示できるようになったので、いろんなコードの最適化結果を眺めてみる。最適化の効果が劇的なハノイの塔を解くやつはループの殆どが最適化されていたのに対して、マンデルブロ集合を描画するやつはそんなに最適化されていなくて、定形ループがほとんど生き残っていた。もっと最適化パターンを実装しないとか…
AMD uProfをいじる。「UEFIからIBS(Instruction Based Sampling)を有効化しろ!」という警告が出たので、UEFIを漁ってみたけど設定項目が無かった。どうしたものか…
Brainfuck処理系開発記みたいになってるな…