今月の活動について (ジャッコ言語、競プロ、気になった記事の感想など)
- 前回 (2020/2) https://vain0x.github.io/blog/2020-02-29/diary/
ジャッコ言語
新しい自作言語処理系を作り始めた。
milone-lang, picomet-lang, phancie-lang などの良かった点や反省点を整理して作り直している。
- 構文は Rust
- 中間表現は CPS
- 意味論はいまのところ C
- バックエンドはとりあえず C または C++
- Cソースコードを生成するのも一定のめんどうくささがあることに気づいてきたので、LLVM IR や WASM に切り替えるかもしれない
rust-analyzer みたいに homogeneous な構文木の上にラッパーとして AST を立てるやつは、hsp3 フォージェリや phancie-lang でやろうとした感じ、めんどくさすぎる。
- 当面、普通に enum で heterogeneous な構文木を作ることにする
言語仕様のシンプルさ、実装のシンプルさなどを重視して作っていく。
- Rust の構文リテラル
K {}
と分岐構文if cond {}
が文法的に衝突している問題は、条件式にカッコを必須にしてif (cond) {}
とする方針で解決することにした。 K {}
の方をいじるとどうしても違和感があり、「普通でない」構文になってしまうif (cond) {}
は少なくない言語で採用されていて、違和感が少ない
まだ動作するコードは吐けない。
- () → void に単純に書き換えてるせいで、void 型の変数を生成してしまったりする
競技プログラミング
週末は AtCoder。今月だけでレートを 100 近く溶かして、水に転落してしまった……
- PAST 1
- 練習。L+N 完 (M/O以外)
- ABC 165
- ABDF完
- ABC 166
- E完
- ABC 167
- E完
- ABC 168
- D完
- AGC 44
- A完
- NOMURA 2020
- ARC。B完
- ABC 169
- E完
競プロ参戦記は4月末からおやすみ中。代わりに、なるべく よるかつ コンテスト に参加している。ABC/ARC の過去問が出題されるバーチャルコンテスト。
制限時間90分で6問、難易度は灰-灰-茶-緑-水-青です。 問題はRatedのABC(042以降)とARC(058以降)からランダムに選出され、各枠ごとに一巡するまで出題は重複しません。
その他の活動
languages/confwell at master · vain0x/languages
- ini/conf を拡張した設定ファイルの用の言語 confwell の仕様を考えていた
- StrictYAML という言語の設計思想に影響を受けている
- 1.0 と “1.0” が異なる意味を持つのは非プログラマーには分かりにくい、などの指摘があり、せやなってなった
- YAML の字下げ依存はよくないと思うので conf をベースにした
ブロックの直後のセミコロンを省略できる構文 を考えて、tree-sitter で実装してみた。文法の衝突は起きていないようなので、ジャッコ言語に採用する予定
- id-arena にデバッグ出力機能を足す実験をした
- デバッグ時だけ ID と一緒にアリーナへのポインタを持ち運ぶことで値にアクセスできるようにしておく
小さいプルリクエストを出した (マージ済み):
気になった記事など
- A pipeline-rewrite operator
- C++ に
|>
演算子を導入する提案 - range ライブラリはメソッドチェイン風の記述のために
operator |
のオーバーロードを使っていて、いろいろ問題があるので、|>
を入れてはどうかみたいな流れ - JavaScript にも
|>
を入れる提案がある: tc39/proposal-pipeline-operator: A proposal for adding the simple-but-useful pipeline operator to JavaScript. - 多くの言語に
|>
が標準装備される未来もありうる
- C++ に
- すべてのエディタでSQLの自動補完をするためにSQL Language Server(sqls)を作った
- LSP 用のパーサは普通のパーサとは異なる性質が必要という話が書いてあって、せやなってなった (エラーに強いとか、構文的に不正なコードを解析できるとか)
- Next Few Years
- rust-analyzer の author による long-term “road map”
- IDE の設計・実装に関する興味深い考察が読める
- Why the Sorbet typechecker is fast, Reflections on software performance
- Ruby の型検査器 Sorbet のパフォーマンスに関する記事
- パフォーマンスがなぜ重要か、アプリのパフォーマンスが高いと何が起こるかなどが書かれていて、興味深い
- 1.0 | Deno
- Node.js の作者による新しい JavaScript ランタイム deno の v1 のリリース記事
- モジュールシステムやセキュリティに関する興味深い機能がある
- Rust 製の production-ready な処理系実装としても要注目
- イラストがエモエモのエモ
- 競プロでよくある「バランスのとれた括弧列」の定義が壊れがちな話
- AtCoder の問題文の「バランスのとれた括弧列」の定義が実は壊れていて、clar (質問) が出た話
- 再帰的な述語の定義は意外とシビア