MP0

MPがありません。

Rustをやってみた

この記事は OIT Advent Calendar 16日目の記事です。

予定変更してだいたい2ヵ月くらい前から卒研の合間に少しずつRustを勉強し始めているのでその感想を書こうかと思います。
まだそんなにがっつり使いこんでいないので参考程度に見てください。

Rustってどんな言語?

C並みの速度で実行することができてかつメモリ管理の安全性と並行処理に関する機能を強化したり、関数型言語由来の機能を取り入れた言語です。
メモリ安全性を保証するためにほかの言語と比べてかなり独特な仕様があります。
www.rust-lang.org

やろうと思ったきっかけ

前々から低レイヤーを触れる言語をできるようになっておきたいという思いがあって、
でもCを極めようとするのはしんどいしC++もがっつりやろうとすると闇が深そうな印象があったので最近出た低レイヤー向けの言語をやろうと考え、
独自のメモリ安全性を保証するための概念が気になったのと、現代的な機能がたくさんあったのでRustをすることにしました。

2ヵ月くらい使ってみた感想

現代的な機能や関数型由来の機能が多くてミスのすくないプログラムを書きやすい

まず変数はデフォルトでimmutableです。mutableな変数を使いたい場合はlet mutと宣言する必要があって、関数に渡すときとかもmutをつけないと値を変更できません。
慣れてないと面倒ですがわかりやすいです。
また、Maybeに相当するOption、Eitherに相当するResultというのがあって、クロージャも当然使えます。
型推論もありますね

メモリ安全性を保証するための機能はすばらしいと思った

Rustでは1つの値に対して変数は1つしか対応させられないようになっています。
そのためか、他のプログラミング言語では変数に値を代入するといいますが、Rustでは束縛するといいます。
そして変数は値に対する所有権をもち、変数がスコープから外れると所有権をもっている値のリソースを解放します。
何らかの値を束縛している変数を新しい変数に束縛しなおした場合は、新しい変数に所有権が移動して前の変数からは値を参照できなくなります。
この仕組みのおかげで、メモリの解放し忘れがなくなります。

テストが気軽に書ける

同じファイル内の関数をテストしたい場合は、テスト実行用の関数を書いて関数を宣言する前に#[test]と記述してコンパイルして
rustc --test ファイル名でテストが実行できます。

所有権になれるのがなかなかつらい

所有権という考え方自体はいいと思うのですが、配列やコレクションの要素にも所有権があって、コレクションを操作するときはそのあたりも考慮しなければいけなくてかなり難しいです。
例えばイテレータを取得するとき、普通のイテレータとコレクションの要素の参照のイテレータがあって、
普通のイテレータを取得すればもとのコレクションの要素の所有権がイテレータのほうに移ってしまってコレクションを束縛していた変数が使えなくなったりとか、
コレクションの要素の参照のイテレータを使うなら要素を使うときに参照外ししないといけなかったりとか、考えることが多いです。
さらにクロージャを使う際も所有権が絡みでいろいろ覚えることがあります。

それと話はそれますが配列の値を参照するときのインデックスもunsginedでないとだめで、あまり考えずに整数型を使ってプログラミングしていると
あとあとキャストしないといけなくて面倒だったりします。

標準入力から値を受け取るのがつらい

競プロの問題解くときとか結構つらいです。
以下C++との比較です。

int num1, num2;
cin >> num1 >> num2;
let mut buffuer = String::new();
io::stdin().read_line(&mut buffer).unuwrap();
let trimed = buffer.trim().to_string();
let nums: Vec<i32> = trimed.split(" ").map(|x| x.parse().unwrap()).collect();
let (num1, num2) = (nums[0], nums[1]);

外部ライブラリを使えばだいぶましになるそうです。

まとめ

Rustはいい言語だとは思うのですが、慣れるまで動くものを作るのにだいぶ時間がかかってしまいそうだと感じています。
慣れても所有権を意識しながらプログラムを書かないといけないので適当に書いているとコンパイルが通るまですごい時間がかかりそう。
そもそも今まで自由度の高い言語をよくさわっていた人間がRustみたいな制約が厳しい言語を急にやろうとするのは厳しいのかなという気もしますが、せっかくなので頑張って使えるようになりたいと思います