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
440
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
990
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
171
14k
No one is an island. Learnings from fostering a developers community.
thoeni
20
3.1k
Docker and Python
trallard
43
3.2k
A better future with KSS
kneath
238
17k
Testing 201, or: Great Expectations
jmmastey
41
7.2k
How STYLIGHT went responsive
nonsquared
96
5.3k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.7k
Optimising Largest Contentful Paint
csswizardry
33
3k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
20
2.4k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5.2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
30
2.1k
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 も触れてとても技術的に⾯⽩い 職場です! • ⼀緒に働く仲間を募集してます!