今月の活動について (ミローネ言語, knowbug, 競プロ, AtGraph, checklist)
ミローネ言語
F# サブセットのコンパイラ
https://github.com/vain0x/milone-lang
- いくつかの不具合の修正
- 型シノニムのせいで関数の汎化が阻害される不具合
- 型シノニムとして定義された型変数の let-depth が浅いせい
- 単一化する前に型シノニムを展開するだけで解決
- 相互再帰関数のクロージャ変換がうまくいかなかった不具合
- こんな感じ で後方で定義された関数の呼び出しの連鎖があって、その呼び出しがキャプチャ変数を持つケースに対応できていなかった
- 再帰関数のスタックフレームの消費を軽減するための対処
- 中間表現を変換する再帰関数はノードの深さだけ繰り返し呼ばれてスタックに積まれる
- そういう関数が大量のローカル変数を持っていてスタックフレームが大きいと、スタックオーバーフローが起こってしまう
- とりあえず問題を起こす巨大関数を分割することで対処
- 根本的には過剰なローカル変数を減らす最適化とががいりそう (GCC -O3 でもできない?)
- あとはひたすらレコード型を使わないようにする変更
そしてついに セルフホスティングを達成 ! 記念に記事を書いた:
knowbug
HSP3 デバッグウィンドウ
https://github.com/vain0x/knowbug
https://github.com/vain0x/knowbug/commits/master?after=6286b749c2a951d1cb1cc3cb38a07c2db7df6383+69
- ミローネ言語にかかりきりになって間があいた
- 間が空いたときはリファクタリングから進めるのが定番になりつつある
- ファイル名や関数名を snake_case に統一するとか
- 文字列エンコーディング変換の実装がいまいちだったので書き直したり
- 例えば C++17 では
basic_string
のバッファーに変更操作を行えるので、vector
に書き込んでからコピーするという操作は無駄
- 例えば C++17 では
- 細かい不具合を直したり
- まだまだ微妙だけど、納得できるレベルになるまで時間がかかりそうなので、やや見切り発車ながら v2.0.0 beta をリリース
- オブジェクトツリーの挙動が微妙すぎるので v1 の挙動に一時的に戻している
- shift_jis 版は v1 と比べると機能が減って使いづらくなっただけ感がなくもない
競プロ
週末は AtCoder に参加。AGC に不参加だったり台風で1週飛んだため2回だけ。
- 競プロ参戦記 #66 Travel by Car | ABC 143
- 先週日曜の ABC 144 の参戦記はまだ
AtGraph
https://github.com/vain0x/at-graph
- 何らかのアプリを作りたいが何を作ればいいか分からないので、とりあえず手あたり次第に書いてみるシリーズ第一弾
- AtCoder の入力のような形式でグラフを与えるとビジュアライズしてくれるアプリ
- Dagre というグラフのレイアウトを計算するライブラリを使っている
- 実装はサンプルコードをちょっといじっただけという趣だが、すでに一定の実用性があるのでよい
- デプロイは GitHub Pages
- ソースコード自体を docs 以下に置く
- 依存ライブラリは CDN から ES モジュールとして import
- No more webpack
checklist
https://github.com/vain0x/checklist
- 何らかのアプリ~書いてみるシリーズ第二弾
- チェックリストを作って共有できるアプリ
- URL の
#
以降にすべての状態が含まれているので、URL を貼るだけで共有できる- 状態を JSON にシリアライズして、Gzip で圧縮して、Base64 でエンコードして、
#
以降に貼る - というのを状態が変わるたびにやる
- ページロード時は
#
以降を逆の手順で状態を復元する - 状態そのものをシリアライズするとアプリのバージョンアップで過去の URL が壊れるので、状態とは微妙に異なる中間表現に変換してからシリアライズしている
- チェックリストは文字列を含むので状態が非常に大きく、URL が数百文字になってしまう
- 実用的には、文字列データはストレージにおいてIDで参照するとかの方がよさそう
- 状態を JSON にシリアライズして、Gzip で圧縮して、Base64 でエンコードして、
- hyperapp v2 の練習でもある
- v2 の主な変更点は、v1 の Wired Actions が消えて、effects や subscriptions が入ったこと
- かなりとっつきづらくなったが、慣れると便利そう
- effects とかはテスタブルにするために入ったらしいが、まだテストは試していない
- これもデプロイは GitHub Pages
- No more webpack と思いきや、依存ライブラリの1つ (pako) をブラウザ上で動かせるように webpack でバンドルするということをした
- サンキュー webpack