卒論でRustを書いた話
学部の卒業研究でどうしてもRustを使いたかった人の話です。
何でRust?
研究内容がコンピュータ上でのシミュレーションだったのですが、大量のデータを成形・解析する必要がありました。研究を快適に行うため、高速に動作するRustを選びました。
というのは建前で、ほとんどロマンのためにやりました。楽しかったです。
開発環境・ビルド環境
コードの開発自体はローカルPC (M1 Mac) で行いました。
しかしながらシミュレーションは研究室のサーバー (CentOS) で行っていたので、クロスコンパイルする必要がありました。
できるだけ脳みそを使わずにコンパイル用の環境を整えたかったので、
- DockerでCentOSを用意する
- Rustを手動でインストールする
- ローカルのファイルをマウントしてビルドする
というシンプル脳筋構成にしました。ビルド環境の準備はこんな感じです↓
docker run --platform=linux/x86_64 -it -v $(pwd)/src:/src --name my-centos-container centos:7 /bin/bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
yum install -y gcc
docker start -i my-centos-container
Dockerfileも用意していないですが、ちゃんと動くのでヨシ。
Rustを使う上で意識したこと
ロマンを追い求めてRustを使ったわけですが、いくつか注意した点があるので書いていきます。
これらはRustに限った話ではなくて、書籍『プリンシプル オブ プログラミング』に影響を受けた気がします。
① 日々のタスクはスクリプト言語で書く
ディレクトリを作ったり、一連のコマンドを呼び出したりといった細かいタスクは、Pythonやシェルスクリプトが得意とするところです。
パラメータが少し変わるごとにコンパイルするのは面倒だし、そもそも大体のタスクのボトルネックは自分のPC操作なので、パフォーマンスが気にならない部分は心を鬼にしてRustを封じました。
② CLIの出力は可読性の高いテキスト形式にする
Rustで作ったコマンド(CLI)は一つではなくて、複数のコマンドをまとめて扱っていました。
このとき各コマンドは必ず空白区切りの数値データを返すようにしており、これにより
- 明らかな異常値があれば目で確認できる
- gnuplotなどグラフ作成が簡単にできる
- インターフェースを統一することでコマンド間の組み合わせが楽になる
といったメリットが得られました。
③ 最適化はしない
最適化は(なるべく)しません。
最適化と称してバグを混入させる自信があったし、だいたいO(N)くらいの処理しかないのでRustの処理速度なら気にならなかったです。
最適化を避けた結果、この研究期間中に一度もバグを発生させず運用する事ができたので良かったと思います。
Rustでよかったこと
予想通り良かったのは、
- はやい
- 驚くほどバグが出ない
- コンパイラ、cargo clippyが丁寧に教えてくれるから一人でも安心
逆に意外と良かったのは、
- 型変換が思ったより冗長にならない
- だいたいf64か文字列しか使わないため
- データ処理がイテレータと相性が良い
- 一行一行に同じ処理をかけていくことが多いため
Rustで苦労したこと
あまり無いですが、強いて言うならライブラリ(クレート)のメジャーバージョンがだいたい0なので、使えそうなものを探すのに神経を使いました。
まとめ
もし研究でRustを使いたい変人が他にいるなら、ぜひ背中を押したいと思います!
近くに人間の仲間はいないかもしれませんが、Rust自体が懇切丁寧に教えてくれるのと、今どきAIに聞いたらだいたい答えてくれます。
デメリットを大きく上回るメリットとロマンが手に入るので、気軽にチャレンジしてみてください!