今月の活動について (knowbug の HSP3 クライアント化、HSP3 の LSP (hsp3-analyzer-mini) 作成、ゾアライド言語の始動、競プロ(サボりがち)、など)
knowbug
https://github.com/vain0x/knowbug/commits/master?after=41e0c19835ecf39f4be1726caef784fd655e875a+209
- HSP3 用のデバッガー
knowbug: hsptmp
knowbug はスクリプトファイルの中身を表示して実行中の位置をハイライトする機能があるが、未保存のファイルを実行すると表示される内容(ファイルに保存された内容)と実際の(編集中の)内容にギャップがあるという問題があった。
標準のスクリプトエディタでスクリプトを実行すると、編集中のスクリプトが hsptmp という名前の一時ファイルに入るので、それを knowbug から読むことにしたところ、この問題が解決した。(v2.0.0-beta2 としてリリース)
knowbug: サーバー・クライアント構成への転換
C++ で GUI を実装するのがつらいのでやめて、別の方法を模索することにした。
理想は VSCode のデバッグ機能を使うことだが、HSP ユーザーの多くは処理系に同梱されている「スクリプトエディタ」という IDE を使っているわけで、VSCode 必須というのはユーザーフレンドリーではない。
そこで Electron 方式に注目した。デバッガーがウェブサーバーを起動しつつ小さいブラウザを開き、そのウェブページを UI とすればいい。
hsp3-debug-spider という名前でサンプルを作成したところ、技術的な問題はだいたい解決した: https://github.com/vain0x/hsp3-ginger/tree/7316cc5adb3b662c8baf400ab5bd8ed8d5d0d8f7/hsp3-debug-spider
これも悪くはないが、もっと良い案があった。HTTP 通信ではなくプロセス間通信を使えば、クライアントはブラウザである必要がなく、特に HSP で書いたプログラムでもいい。HSP のデバッガーが HSP で書かれているというのは開発面で嬉しい。具体的には以下の通り:
- ユーザー (HSP-er) 自身により変更しやすい
- 開発者がドッグフーディングしやすい
- HSP は (C++ より) GUI が書きやすい
さっそく proof-of-concept を作成して、問題ないことを確かめた: https://github.com/vain0x/hsp3-ginger/tree/dbea8aac1db55b28e054beb8880ad82e71cf7bf3/projects/hsp3-debug-self
そういうわけで knowbug v2 はデバッガーをある種のサーバーとして動作させて HSP でクライアントを書く構成で進めることにした。
サーバー(DLL)・クライアント(HSP)構成への移行 (v2) · Issue #70 · vain0x/knowbug
“done is better than perfect” ということで、ベータ版をリリースしたので試してみてほしい。
https://twitter.com/vain0x/status/1196057770748862464
いまのところは順調。足りないライブラリをいろいろ自作しないといけなかったりして楽しい。(JSON とか)
hsp3-analyzer-mini
- HSP3 の LSP サーバー
- 前述の通り knowbug のクライアントを実装していて、他の関数の引数の順番や細部の挙動を忘れたときに定義を見に行くのがめんどうだった
- さすがにつらかったので、雑実装でささっと動くものを作ってみた
- 行ごとに分割して「プリプロセッサ行」「普通の行」「複数行コメント・複数行文字列の内部の行」に分割して、各種類ごとに分ける、みたいなことをしてる
- HSP は構文的な自由度が低いので、構文解析が雑でもそこそこうまくいく、という性質がある
- (あるいは、構文的な自由度が高い言語でも「うまくフォーマットされた状態のソースコードしか解析しない」という制約を付ける場合も、このぐらいの雑さでわりかし動かせるはず)
- 思い立ってから3日でほぼ形になった
- https://twitter.com/vain0x/status/1197302371333726209 (2019-11-21)
- https://twitter.com/vain0x/status/1198220904213311489 (2019-11-23)
- たまにクラッシュするけどだいたい動いてて、めっちゃ便利
- Rust は UTF-8 のマルチバイト文字列の内部へのインデックスにアクセスするとパニック (クラッシュ) するので、クラッシュしないようにエラー処理をしたつもりでもそのあたりで死にがち
- スクリプトエディタのカーソル位置などをとる API を使って LSP の機能を乗せようと試した
- API の一部が動いていなかったので修正待ち
ゾアライド言語
https://github.com/vain0x/zoaride-lang
- アドベントカレンダーの季節だから何か記事を書きたい
- いまもっとも記事にしたいのは LSP/DAP なので、LSP/DAP を持つ自作言語を作るシリーズを始めることにする
- 名前はゾアライド言語
- zoa-: LSP学習記シリーズで作ったクラゲ言語の後継だから
- r: ごろあわせ
- -ide: IDE 志向だから
- まだ何も実装していない
- おそらくアドベントカレンダーの記事は字句解析・構文解析あたりで終わる
12/9 に投稿予定- 言語実装 Advent Calendar 2019
- 追記: 12/21 が登録キャンセル (?) により空いたため、12/21 投稿予定に変更
その他
- n月刊ラムダノートにパターンマッチについて寄稿しました | κeenのHappy Hacκing Blog
- パターンマッチの仕組みとパターンマッチをコンパイルする方法に関する記事らしい
- ミローネ言語ではパターンマッチは雑に if/goto に展開するだけだったので、参考にしたい
- playground/play/2019-11-02-ide-by-wasm at master · vain0x/playground
- LSP を Rust で書いて WASM にコンパイルすることでクロスプラットフォームに動かせるのではないか、という案を試した
- もちろん動く
- 実行時にプラットフォームを検査する方が楽そう
- playground/play/2019-11-05-algebraic-effects at master · vain0x/playground
- 代数的エフェクト (algebraic effects) のチュートリアルをやってみた
- 自作言語にエフェクトを組み込みたいため
- CPS 変換の練習をした
- 自作言語の中間言語を CPS にしたいため
- いま気づいたけど GitHub に置いてない
- https://github.com/vain0x/hsp3-modules/blob/master/mod_mapss/README.md
- HSP の連想配列ライブラリを作ってる
- str 型変数の中身をバイナリにすることで配列要素にハッシュテーブルを詰め込む
- 「ハッシュテーブルの配列」が自然に扱えて便利、かもしれない
- https://twitter.com/vain0x/status/1198877703677472769
- HSP で JSON パーサーを書いてみた
- 構文木やオブジェクトを作るのではなく、パースイベントとエラーを出力するだけ
- あまり使い道はない
- knowbug のサーバーとクライアント間のデータ交換に JSON を使いたいので、何らかのライブラリは必要
- 普通にミュータブルな木構造を組み立てて操作する感じにするのがよさそう?
競プロ
週末は AtCoder に……あまり参加していない。来年は頑張る。