今月の活動 (HSP3アナライザーミニなど)
- 前回 (2021-03-31) https://vain0x.github.io/blog/2021-03-31/diary/
ミローネ言語
https://github.com/vain0x/milone-lang
コンパイラを複数のプロジェクトに分けた。依存関係は以下の通り:
syntax -> shared
translation -> shared
cli -> syntax
cli -> translation
- shared: 共通部分。リスト操作とか
- syntax: 構文解析から型検査まで
- translation: クロージャ変換からCコードの生成まで
- cli: CLIの本体。syntaxの出力をtranslationの入力に変換する役目もある
syntaxとtranslationが互いに依存しないので、コンパイル時間を減らせる……はず。思ったより効果を感じてない。
検査と変換における中間表現の型を分ける意図もあった。型検査まではプログラムが壊れていることも考慮しながら処理する必要があるが、変換ではそうでないから。
HSP3アナライザーミニ
https://github.com/vain0x/hsp3-ginger/tree/2fc92cc570/hsp3-analyzer-mini
- 最初のバージョンはパースが雑なので、複数行文字列の付近が処理できないなどの課題があった
- その後、再帰下降のパーサを作ったが、それを解析に使うところまでは作ってなくて、放置してしまっていた
- また、(別のプロジェクトだけど) シグネチャヘルプの実装とかも作ったのにリリースできてなかった
- 書いたものはリリースしたいので、ちまちま進めてる
- いまのところスコープの解析 (定義・使用箇所の検出) がおおよそ動くようになってきた
- あと、静的解析を作って遊びたい
- 試しに
repeat
-loop
の間にreturn
があったら警告するリント (syntax_linter.rs) を書いた
双方向テンプレートエンジンの試作
vain0x/bitemp: Experiment of bidirectional template engine for fearless duplication
- コードが同じことの繰り返しで、ひどく冗長になることがある
- 関数や型などの抽象を導入して解決できることもあるが、できないこともある
- (コードの「見た目の同じ」だからといって「意味的に同じ」とは限らないので、表層的なDRY原則の適用はうまくいかないことがある、という話をしばしば目にする)
- 見た目の同じようなコードの繰り返しを一括で変更することはしばしばあり、その変更作業はめんどくさい
- そういうときのために、複製されたコードを一括で変更できるようなツールがあると便利かもしれない、と思った
- 以前、テンプレートエンジンを使って「共通部分」(テンプレート)と「違う部分」(パラメータ)から必要なコードを生成するような仕組みを試したことがある
- 結局、テンプレートが複雑になって、いまいちだった
- コードが自動生成物になると、それを直接編集できず、代わりにテンプレートやパラメータをいじって目的のコードが出るようにする、という間接作業が発生するのがよくない
- コードを編集した結果から逆算してテンプレートを更新してほしい、という感じがあった
- そういうわけで試しに作ってみたが、逆算の仕組みが単純すぎて、いまのところ使える代物ではなさそう
余談:
- SASS/SCSSなどの「alt-CSS」も、ブラウザ上で実際の表示を見ながら調整した結果をファイルに書き戻す手間があった。(CSSはできる。ブラウザ拡張で対処可能なものかもしれないけど。)
simple-sub-fs の作りかけ
vain0x/simple-sub-fs: simple-sub re-written in F#
- 部分型つけ (subtyping) を含む型推論の手法の1つとして ML sub というのがある
- それを簡潔にしたという
simple-sub
のペーパーがあって、それを読んだり実装をポートしながら理解を深めようとしていたが、途中で止まっている - この手法で破綻しない理由を追いきれてない