Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rust の中で TypeScript を書くには
Search
hotwatermorning
July 16, 2024
0
480
Rust の中で TypeScript を書くには
https://uniquevision.connpass.com/event/323686
の発表資料
hotwatermorning
July 16, 2024
Tweet
Share
More Decks by hotwatermorning
See All by hotwatermorning
Rust×mediasoupで作るビデオチャットシステム.pdf
hotwatermorning
0
1.1k
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Music & Morning Musume
bryan
46
6.6k
How STYLIGHT went responsive
nonsquared
100
5.6k
Balancing Empowerment & Direction
lara
1
350
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.3k
The World Runs on Bad Software
bkeepers
PRO
69
11k
Art, The Web, and Tiny UX
lynnandtonic
299
21k
Side Projects
sachag
455
42k
Speed Design
sergeychernyshev
31
1k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
53k
Transcript
Rust の中で TypeScript を 書くには 株式会社 LabBase 湯朝剛介 2024/07/16
⾃⼰紹介 湯朝 剛介(@hotwatermorning) • 前職は C++ でオーディオアプリケーションを 開発し、2022 年より株式会社 LabBase
にて Web サービスの開発を担当 ◦ フロントエンドを Svelte で書くのが楽しい • 趣味は作曲(DTM) • 「C++ポケットリファレンス」 技術評論社(共著)
None
None
本⽇使うコード • https://github.com/hotwatermorning/poc-rust-ts-block
FFIは⾯倒 • FFI (ある⾔語の処理を別の⾔語から呼び出す仕組み)は⾯倒 • それぞれの⾔語は⽂法やライブラリだけではなく、内部でどの ようにリソースを管理しているかの仕組みも異なり、そのまま では相互に関数を呼び出せない。 • ⽅法1:C
の API を⽤意する • ⽅法2:別のツールを使う
C の API を⽤意する⽅法 • もっともポータブル。⼤抵の⾔語には C のバインディングが存 在する •
ただし扱えるデータ構造は貧弱(数値型とポインタ程度) • 呼び出しは関数名しかチェックされないため安全でない ◦ 間違った引数を渡す可能性がある
別のツールを⽤意する⽅法 • GRPC, MessagePack, OpenAPI など • それぞれに⻑所∕短所あり。ユースケースに合わせて使い分け ることになる。 •
仕組みが巨⼤で扱いにくかったり、ツールに使い⽅を合わせる 必要がある。
FFI は⾯倒 • いずれも結局 FFI のために関数を定義してそれをそれぞれの⾔ 語から呼び出せるように処理を整える必要がある。 • わざわざ FFI
のために関数を定義してそれを呼び出すのではな く、もっと直感的に別の⾔語を呼び出したい!
rust-cpp • @mystor という⼈が開発した、Rust の中に C++ のコードを 書けるようにする Crate ◦
https://docs.rs/cpp/latest/cpp/index.html • cpp!() マクロのなかに C++ のコードを書くとそれが実⾏時に C++ のコードとして実⾏される ◦ 単に C++ っぽく書けるとかではなく、本当に C++ のコードが書ける • Slint (https://slint.dev/) という新しい UI ライブラリで実際に採⽤されている
rust-cpp
ソースコード中に別の⾔語を埋め込む • わざわざ関数を定義しないで処理を呼び出せるので便利そう • C++ 以外でもできるか試してみたい
TypeScript in Rust Land • Rust のソースコード中に TypeScript のソースコードを書いて 実⾏する仕組みを実装してみた。
◦ https://github.com/hotwatermorning/poc-rust-ts-block • ts_block!() というマクロの中に TypeScript のコードを書く と、 TypeScript としてそれを実⾏できる • Proof of Concept なので、rust-cpp にあるような引数を渡す 仕組みなどは未実装
TypeScript in Rust Land
仕組みについて • rust-cpp の実装を参考にしている • build.rs を使って、 main.rs から TypeScript
のコードを抽出 し、 TypeScript のソースコードを⾃動⽣成 • その後 main.rs コンパイル時に、ts_block!() マクロが⾃⾝の 内部のコードを、⾃動⽣成された TypeScript ファイルの呼び 出しに変換する
build.rs について • コードの⾃動⽣成やビルド時の前処理などを、Rust のコード を使って⾏うためのソースファイル • ほかのソースコードがコンパイルされるのに先⽴って実⾏され る •
この時に、ビルドに必要な情報(ビルドディレクトリのパスな ど)が環境変数として渡される
build.rs の処理 • Rust ⾃⾝が Rust のソースコードを解析するための仕組みを ⾊々⽤意している(syn クレートなど) •
それを使って、指定したソースファイル(main.rs)から ts_block!() マクロの中⾝の部分だけを抽出する。 • 抽出したコード⽚を OUT_DIR 環境変数で指定されたパス内の autogen.ts ファイルに書き込む ◦ このとき、コード⽚の内容から⽣成したハッシュ値で 関数名を設定しておく
None
build.rs 実⾏時の ts_block!() の扱い • build.rs は Rust が⽤意している仕組みを使ってソースコード をパースしているだけ。
• したがってこのタイミングでは ts_block!() マクロの展開は⾏ われないことに注意。
main.rs のコンパイル時の処理 • ts_block!() マクロが展開される。 • このマクロは、マクロ内部のテキストを元にハッシュ値を⽣成 し、そのハッシュ値の付いた TypeScript の関数を呼び出すよ
うなコードを⽣成する。 • TypeScript は関数名を渡して処理を実⾏できるように⾃動⽣ 成ファイルが作られているので、 tsx コマンドを使って TypeScript をコマンドラインから実⾏する
ts_block!() の展開
まとめ • FFI は⾟いが、Rust の提供している仕組みを使うことでその⾟ さを軽減できる可能性がある。 • 他の⾔語や何らかの設定ファイルなどを埋め込むのにも使えそ う。 •
Rust のマクロや構⽂解析の機能は強⼒。⾃分の書いたプログ ラム⾃⾝をいじれる⾯⽩さがある。
おわりに • 弊社は Rust も TypeScript も触れてとても技術的に⾯⽩い 職場です! • ⼀緒に働く仲間を募集してます!