なぜ Rust なのか
時雨堂では C++ から Rust へ主軸を移し始めています。なぜ Rust を採用したのかと、採用した結果どうかを雑に書いていこうと思います。
社員に Rust チョットデキル がいる
まず最大の理由はこれです。社員に Rust 歴が 10 年以上あり、Rust で分散システムが作れる人がいるからです。詳しい人が居るというのは本当に大事です。
C++ 向けの独自ビルドツールに疲れた
お手伝いしてくれている人に C++ チョットデキル がいるのですが、C++ のビルド周りを色々手がけてくれており、Python で独自のビルドツールをコツコツメンテしてくれていたのですが、良い機会だろうということで Cargo にお世話になることにしました。
LLM の台頭
Rust といえばコンパイルを通すのがとても大変という認識だったのですが、思った以上に LLM が解決してくれることが多いという印象です。実際 Rust チョットデキル 人も同じような印象のようです。
基本的にはこの 3 つが理由です。それ以外に Rust にして良かった点などを雑に上げていこうと思います。
build.rs 便利
build.rs が本当に便利です。prebuilt とかを実現するにしても、Rust でモリモリコードを書いてしまえばいいので。
fmt / clippy 便利
prek と一緒に使っています。本当に便利です。
Tokio 便利
非同期ランタイムは Tokio を採用しています。普段、非同期マルチスレッドの世界で戦っているので、Tokio みたいなのがあるのは本当に助かります。Erlang/OTP の世界で生きている自分にとってもわかりやすいです。
tokio-util や tokio-metrics や tokio-console など、色々便利なライブラリがそろっているのもありがたいです。
Rustls 便利
TLS は Rustls (aws-lc-rs) を採用しておりますが、tokio-rustls が本当に便利です。HTTPS をはじめ TLS は必須技術なので、とても助かっています。
Tracing 便利
ログは最初は自前で実装しないとだめか ... みたいな気持ちだったのですが、まずは log を使っていって、そこから tracing に切り替えました。tracing とても良くできていて感動します。本当に便利です。
PBT / Fuzzing 便利
Property-Based Testing や Fuzzing も一通りそろってるのが助かります。proptest と cargo-fuzz 本当に便利です。扱いやすい上にバグをモリモリ見つけてくれます。
aws-lc-rs 便利
暗号ライブラリは必須なんですが、AWS が BoringSSL フォークの AWS-LC の Rust バインディングを出してくれているのがありがたいです。
no_std 良い
積極的に no_std 化するようにしています。最小限のライブラリで実現していおくことで、コードが読みやすくなるというスタンスです。
Rowan 良い
これは完全に個人的なのですが、formatter / linter を作る際に Rowan を愛用しており、なんて便利なライブラリなんだ ... となっています。
ちょっとした不満も書いていこうと思います。
- target ディスク容量取り過ぎ
- 依存がすぐ膨れすぎ
- GitHub Action で Cache がほぼ使い物にならない
以上。