Open8

Quartzコンパイラについて考え直す

myuonmyuon

究極的にやりたいこと

ゲームのスクリプトやアプリケーションのプラグインを書く用途などに使える、気軽にかける現代的な言語

そのために必要と思われること

  • 特定の言語の上で動くこと
  • モダンな環境(言語機能もエコシステムも)が整っていること
  • インタープリターとして動くこと、特に実行時にソースコードを読み込んで解釈できるようにすること
  • コンパイルがそれなりに早いこと

不要と思われること

  • セルフホストされていること
  • プログラムが(一般的なコンパイル言語と比較しても)高速に動作すること
myuonmyuon

例えばQuartz → WASMなコンパイラをRustで書いたとして、

  • このコンパイラ自体をWASMに出力ができれば、WASM上(例えばブラウザ上)でもコンパイルが可能になる
  • バイナリで配ったとしても、他の言語で動くようにもできそう(単にバイナリを持ってくれば良いので)
  • ただ、ランタイムは共通である必要があるのでWASMを使うというのは一つの選択肢である
    • Web APIが欲しいならweb_sys相当のものを作る必要がある。
    • WASIにスムーズに接続できる必要はありそう
    • ブラウザ上で動かすなら、WASIのランタイムを書いてあげる必要はある
myuonmyuon

やりたいこと:

  • オールインワンなバイナリを落としてくる。LSPとしてもコンパイラとしても動作する。
  • コードを書いて、実行することができる。
  • 実行すると、ゲームが動いたりして欲しい

あるいは、

  • Goで元々ゲームを作っている
  • これのロジックをQuartzで書きたい。Quartzで書いたものが、同じエンジンの上で動く必要がある。これは、QuartzをコンパイルしたWASM functionをGoから呼べれば良いと思われる。
  • また、HMRをするためには、Go言語側から再度コンパイルして差し替えるなどの処理はしたいかも。
myuonmyuon
  • ついでに、Quartzで書いたコードがブラウザでも動いて欲しい
  • これはWASMの外側の部分が共通のインターフェイスである必要がありそう。
myuonmyuon

上記を達成するために、

  • 外から持ってくるWASMのモジュールと、Quartz側の宣言ができることが必要
  • 特に、ライブラリなどで自動で一気に生成したくなりそう。これはマクロが必要かも
myuonmyuon

あとはGCとasync/await〜〜〜おしまいだ…

myuonmyuon

https://webassembly.org/features/

しょうがないので、extension全乗っかりでWasm GCを使っていこう
Node.jsとブラウザを主なサポート対象とすれば良さそう。バイナリ配る部分は、Nodeに依存するところは一応許容するということでどうにかなりそうではある。

myuonmyuon
let a = 10;

fun main() {
  let b = 10;
  let v = vec[int].new(1,2,3,4,5);
  v.append(6);
  v.(10) = v.(9) + v.get(10) ?? 10;

  let k = v.map(fun (x) {
    return x;
  });

  let m = map[string,int].new();
  m.("key") = 10;
  m.("foobar") += 7;
  m.("set") = m.get("not_found") ?? 0;
}