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
450
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
1k
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
98
5.3k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.4k
Product Roadmaps are Hard
iamctodd
PRO
50
11k
Automating Front-end Workflow
addyosmani
1367
200k
Bash Introduction
62gerente
610
210k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Building Your Own Lightsaber
phodgson
104
6.2k
The Language of Interfaces
destraynor
156
24k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
11
950
For a Future-Friendly Web
brad_frost
176
9.5k
Writing Fast Ruby
sferik
628
61k
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 も触れてとても技術的に⾯⽩い 職場です! • ⼀緒に働く仲間を募集してます!