Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rust の中で TypeScript を書くには

hotwatermorning
July 16, 2024
420

Rust の中で TypeScript を書くには

hotwatermorning

July 16, 2024
Tweet

Transcript

  1. ⾃⼰紹介 湯朝 剛介(@hotwatermorning) • 前職は C++ でオーディオアプリケーションを 開発し、2022 年より株式会社 LabBase

    にて Web サービスの開発を担当 ◦ フロントエンドを Svelte で書くのが楽しい • 趣味は作曲(DTM) • 「C++ポケットリファレンス」 技術評論社(共著)
  2. C の API を⽤意する⽅法 • もっともポータブル。⼤抵の⾔語には C のバインディングが存 在する •

    ただし扱えるデータ構造は貧弱(数値型とポインタ程度) • 呼び出しは関数名しかチェックされないため安全でない ◦ 間違った引数を渡す可能性がある
  3. FFI は⾯倒 • いずれも結局 FFI のために関数を定義してそれをそれぞれの⾔ 語から呼び出せるように処理を整える必要がある。 • わざわざ FFI

    のために関数を定義してそれを呼び出すのではな く、もっと直感的に別の⾔語を呼び出したい!
  4. rust-cpp • @mystor という⼈が開発した、Rust の中に C++ のコードを 書けるようにする Crate ◦

    https://docs.rs/cpp/latest/cpp/index.html • cpp!() マクロのなかに C++ のコードを書くとそれが実⾏時に C++ のコードとして実⾏される ◦ 単に C++ っぽく書けるとかではなく、本当に C++ のコードが書ける • Slint (https://slint.dev/) という新しい UI ライブラリで実際に採⽤されている
  5. TypeScript in Rust Land • Rust のソースコード中に TypeScript のソースコードを書いて 実⾏する仕組みを実装してみた。

    ◦ https://github.com/hotwatermorning/poc-rust-ts-block • ts_block!() というマクロの中に TypeScript のコードを書く と、 TypeScript としてそれを実⾏できる • Proof of Concept なので、rust-cpp にあるような引数を渡す 仕組みなどは未実装
  6. 仕組みについて • rust-cpp の実装を参考にしている • build.rs を使って、 main.rs から TypeScript

    のコードを抽出 し、 TypeScript のソースコードを⾃動⽣成 • その後 main.rs コンパイル時に、ts_block!() マクロが⾃⾝の 内部のコードを、⾃動⽣成された TypeScript ファイルの呼び 出しに変換する
  7. build.rs の処理 • Rust ⾃⾝が Rust のソースコードを解析するための仕組みを ⾊々⽤意している(syn クレートなど) •

    それを使って、指定したソースファイル(main.rs)から ts_block!() マクロの中⾝の部分だけを抽出する。 • 抽出したコード⽚を OUT_DIR 環境変数で指定されたパス内の autogen.ts ファイルに書き込む ◦ このとき、コード⽚の内容から⽣成したハッシュ値で 関数名を設定しておく
  8. build.rs 実⾏時の ts_block!() の扱い • build.rs は Rust が⽤意している仕組みを使ってソースコード をパースしているだけ。

    • したがってこのタイミングでは ts_block!() マクロの展開は⾏ われないことに注意。
  9. main.rs のコンパイル時の処理 • ts_block!() マクロが展開される。 • このマクロは、マクロ内部のテキストを元にハッシュ値を⽣成 し、そのハッシュ値の付いた TypeScript の関数を呼び出すよ

    うなコードを⽣成する。 • TypeScript は関数名を渡して処理を実⾏できるように⾃動⽣ 成ファイルが作られているので、 tsx コマンドを使って TypeScript をコマンドラインから実⾏する