近況 2019-11-30

今月の活動について (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

https://github.com/vain0x/hsp3-ginger/tree/1153375d59ae5c29081c03b4cfd21447cd5f71be/hsp3-analyzer-mini

  • HSP3 の LSP サーバー
  • 前述の通り knowbug のクライアントを実装していて、他の関数の引数の順番や細部の挙動を忘れたときに定義を見に行くのがめんどうだった
  • さすがにつらかったので、雑実装でささっと動くものを作ってみた
    • 行ごとに分割して「プリプロセッサ行」「普通の行」「複数行コメント・複数行文字列の内部の行」に分割して、各種類ごとに分ける、みたいなことをしてる
    • HSP は構文的な自由度が低いので、構文解析が雑でもそこそこうまくいく、という性質がある
    • (あるいは、構文的な自由度が高い言語でも「うまくフォーマットされた状態のソースコードしか解析しない」という制約を付ける場合も、このぐらいの雑さでわりかし動かせるはず)
  • 思い立ってから3日でほぼ形になった
  • たまにクラッシュするけどだいたい動いてて、めっちゃ便利
    • Rust は UTF-8 のマルチバイト文字列の内部へのインデックスにアクセスするとパニック (クラッシュ) するので、クラッシュしないようにエラー処理をしたつもりでもそのあたりで死にがち
  • スクリプトエディタのカーソル位置などをとる API を使って LSP の機能を乗せようと試した
    • API の一部が動いていなかったので修正待ち

ゾアライド言語

https://github.com/vain0x/zoaride-lang

  • アドベントカレンダーの季節だから何か記事を書きたい
  • いまもっとも記事にしたいのは LSP/DAP なので、LSP/DAP を持つ自作言語を作るシリーズを始めることにする
  • 名前はゾアライド言語
    • zoa-: LSP学習記シリーズで作ったクラゲ言語の後継だから
    • r: ごろあわせ
    • -ide: IDE 志向だから
  • まだ何も実装していない
  • おそらくアドベントカレンダーの記事は字句解析・構文解析あたりで終わる
  • 12/9 に投稿予定

その他

競プロ

週末は AtCoder に……あまり参加していない。来年は頑張る。

関連記事