🦀
Ruby経験者がRustを触って比較してみた 2020冬
少し前になりますが、お世話になっていた職場で新しい技術に触れさせて頂ける機会を頂いので、Rustを使ってみました。RustはRubyと世界観が似ていて、理解しやすい部分も多くありました。
今回は、Ruby/Railsの世界と比較して、やったことをまとめてみようと思います。
Rustのいいところ
そもそもなぜRustに興味を持ち、使ってみようと思ったのか。
Rust公式
- コンパイル型言語のメリット
- 使ってみた感想を後述
- パフォーマンスが良い
- 使ってみた感想を後述
- 並列処理
- 今回はたどり着けず
- Web Assembly
- 調べてみると、Rustだけではなく他言語も対応していてあまり興味をひかれず、対象外
- CLIツール
- 簡単に作れて配布が楽。
- 使ってみた感想を後述
Rustを書いてみる
Rust のチュートリアル(The book)を読んで、Guessing gameという例題をプログラミングしました。
感想
- 所有権で、変数のスコープ・ライフサイクルをより厳密に管理できる
- 保守的にプログラミングすると自然に書けて、ケアレスミスを防いでくれるガイドのよう
- C言語/C++、C#、Rubyっぽさもあり、バックグラウンドがあれば文法はそれほど難しくない
- コンパイルすると、参照や定義がきちんと追跡できる。実装にも役立つし、読むのにも良い
- Rubyみたいなダックタイピングでゆるふわコーディングはできないので、なれるまでコンパイルエラーは増えそう
- buildしたものを実行するだけなら光速
- 実行は速いが、バイナリのファイルサイズは大きくなる
- 個人的には結構好き
Rubyとの用語比較
Rubyがわかれば、これを見ればイメージつかめると思います。Gemに関連する使い勝手も結構似ていて使いやすいと思いました。
Ruby | Rust |
---|---|
Gem | Crate |
Bundler | Cargo |
Class | Struct |
インスタンスメソッド | メソッド |
Array | 配列、Vecなど |
Hash | HashMapなど |
array.each | for x in array |
APIサーバーの実装をRailsと比較する
簡単な例に習って、Rest APIサーバーを PostgreSQLで実装しました
感想
- 小規模なら全然あり
- buildや実行が速い。と思う
- Railsみたいにライブラリが重くないからというのもありそう
- アーキテクチャに熱い人は使い勝手が良さそう
- テストしやすさは、評価できず
Railsとの比較
今回は、公式を見てRocketを使ってみた。後から教えてもらったが、実際に普及しているのはActix-webらしい。以降はRocketとRailsの比較。
項目 | Rails | Rocket |
---|---|---|
ORM | ActiveRecord | Diesel ただし、DBによってライブラリを使い分ける必要がある。DieselはPostgreSQLとMySQL, SQLiteのみ。 |
ディレクトリ構成 | 厳格に決められている | 自由 アーキテクチャやレイヤー構成を自分たちで決めて運用する必要がある |
Routing | routes.rbにDSLで記述 | rocketをマウントする際に、controller的 functionを渡す functionのattribute(プリプロセッサのようなもの)でパスを定義 |
Controller | Controller クラスで実装 | functionで実装。特に制限はなし リクエストのパラメータは、Structを定義してparseする。parseはいい感じやってくれるので結構簡単。 |
Model | Modelクラスで実装 | Structで実装。特に制限はなし ORMしたものとは別に、insert時に使うモデルやselectで取得したものを分けて扱える。 ActiveModelがいっぱいある感じ。似たようなものが増えそうだが、影響範囲が明確なので保守性は良さそう |
Migration | DSLで記述 | Up/Downを分けてSQLを記述 SQLで書いた方が分かりやすい気がする。Up/Downも明確。 |
CLIツールを作ってみた
簡単に作れるとのことで、身近に使えるものが思いついたので作ってみた。
発表順などでランダムに順番決めるときに使える。
感想
- crates.ioに公開するまではとても簡単にできた
- 手順はこちら
- インストールする人はcargo 使えば簡単に導入できる
- バイナリを直接インストールする方法は結構大変だった
- 手順に載っているので、軽くできそうで試してみる
- TravisCI でプラットフォームごとにビルドして、Trustというライブラリのinstall.sh でインストールできるようにする必要がある
- TravisCIでビルドするけど、デプロイタスクが失敗
- macosはTrustでサポートされてない
- 詰んだ?
- ローカルでビルドすれば mac osのバイナリを作れる
- Trustのinstall.shは GitHubのReleaseの最新版をの添付ファイルをプラットフォームに応じて取ってくる
- TravisCIのスクリプト例を参考に、名前付け・アップロード
- 結構大変だったけど、なんとかできた
- 確かにCargoなしでもインストールは楽にできる
- 後から検証してみると、rustcは必要っぽい。
- CLIを作るのにライブラリのインターフェースは向いてるので、作りやすかった
- npmでも使えるし、 Rubyからコールすることもできるので将来性ある(Routie)
まとめ
かなり雑なまとめではあるものの、Ruby経験者が雰囲気掴むのには良いかと思います。Trustでのインストールのあたりは、確かな情報があれば教えてもらえるとありがたいです。
英語情報の日本語化は結構されているけど、コミュニティーが英語メインのようで細かい情報はそちらを探す必要がありそうでした。
Discussion