新しいプログラミング言語に触れてみようと思い、Rustにチャレンジしてみました。2020年で最も人気にあるプログラミング言語となったそうですね。infoQ:Rustが最も人気のあるプログラミング言語トップ20に
Rustの特徴
- 高速な実行環境
- 安全な文法
- Performance、Reliability、Productivityの3つに力を入れたシステムプログラミング言語
利用例
- FirefoxのCSSエンジン、Dropbox
- 日本で Rust を利用している会社一覧
- (こんなまとめがあるんだ…初めて知った)
1. 準備
Hello, Worldを実行できるようにWindows環境上にRustの実行環境を用意してみます。
試した環境
- Windows ver.1903
- Visual Studio Code 1.49.1
- Rust 1.46.0
セットアップ
- Microsoft C++ Build Toolsをインストール
- Rustをインストール
- CUIでインストールが進みます。
- Visual Studio CodeでのRust用拡張機能をインストール
2. 実際に実行する
Hello Worldを試す
cargo new
コマンドを利用してRustのパッケージを作ります。
コンソール
> cargo new hello
```
できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/82f4d98b-33dd-f0de-500c-85346f2588e6.png)
`cargo run`コマンドでコンパイルをして実行!
```console:コンソール
> cd hello
> cargo run
Compiling hello v0.1.0 (D:\Develop\code-writing\rust\hello)
Finished dev [unoptimized + debuginfo] target(s) in 1.22s
Running `target\debug\hello.exe`
Hello, world!
```
## for文のプログラム
for文と関数を使ったプログラムを書いてみます。
```rust:hello.rs
fn main() {
for i in 1..=10 {
println!("Hello, {} world!", to_ordinal_string(i));
}
}
fn to_ordinal_string(n: usize) -> String {
let s = match n % 10 {
1 => "st",
2 => "nd",
3 => "rd",
_ => "th",
};
format!("{}{}", n, s)
}
```
リリースモードでコンパイルして実行してみました。
```console:コンソール
> cargo run --release
Compiling hello v0.1.0 (D:\Develop\code-writing\rust\hello)
Finished release [optimized] target(s) in 0.67s
Running `target\release\hello.exe`
Hello, 1st world!
Hello, 2nd world!
Hello, 3rd world!
Hello, 4th world!
Hello, 5th world!
Hello, 6th world!
Hello, 7th world!
Hello, 8th world!
Hello, 9th world!
Hello, 10th world!
```
## イミュータブル、参照による所有権の借用
Rustの特徴である標準で変数がイミュータブル(不変)であること、所有権という概念についてもコードを書いてみました。
```rust:hello.rs
fn main() {
// イミュータブル、不変でエラーとなる
// let x = 1;
// x = x + 1;
//
// ミュータブル、可変
let mut x = 1;
x = x + 1;
println!("{}", x);
//シャドーイング
let y = 1;
let y = y + 1;
println!("{}", y);
//参照による所有権の借用
let s = "Welcome to Japan".to_string();
myprint(&s);
myprint(&s); // 共有参照のため2回目にアクセスしても大丈夫
}
fn myprint<T: std::fmt::Display>(msg: &T) {
print!("{}", msg);
}
```
上記のようにRustでは所有権の概念を使い不要なメモリ領域を開放しているため、Javaなどの他言語にあるようなGC(ガベージコレクション)による速度低下や、CやC++にあるメモリ開放漏れによるメモリーリークが発生しない安全な仕組みを実現しています。
ミュータブルな変数はプログラミングスタイルになれないと最初は難しいですが、先に挙げたVSCodeの拡張機能を入れておけば、静的にコード解析をしてくれるため、随時エラーをあげてくれます。それで段々慣れていくことが出来そうですね。
# まとめ
今回はRustに入門してみました。
コーディングを始めるまでの環境準備や、最初の実行などにはまることもなく、すんなりスタートすることができて、快適でした。参考図書の本を開いて、文章込みでここまでで1時間くらいでしょうか。一番時間がかかったのが、C++ Build Toolsのインストール時間だったと思います。
# 参考図書
- [Software Design (ソフトウェアデザイン) 2020年6月号](https://amzn.to/3cd7dHH)
- ちょっと試してみたいときのSDの特集はとても助かりますね。いつもありがとうございます。