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
420
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
920
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
109
49k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.5k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
The World Runs on Bad Software
bkeepers
PRO
65
11k
The Cult of Friendly URLs
andyhume
78
6k
Teambox: Starting and Learning
jrom
133
8.8k
Into the Great Unknown - MozCon
thekraken
32
1.5k
Done Done
chrislema
181
16k
Designing for humans not robots
tammielis
250
25k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.3k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.2k
RailsConf 2023
tenderlove
29
900
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 も触れてとても技術的に⾯⽩い 職場です! • ⼀緒に働く仲間を募集してます!