安全性、速度、並行性を兼ね備えた言語と、巷でうわさの「Rust」を覗いてみる(その1)
今回は巷で話題になっている言語「Rust」を覗いていきたいと思います。
私が業務に利用している言語はGoです。
Goはガベージコレクション(以下、GC)があるのですが、RustはGCがありません。
GCのおかげで安全にメモリを利用できるわけですが、RustはGCが無くても安全にメモリを利用できるらしいです。
ちょっと何言ってるかわからなくないですか?
GoではGCを実行するコストが問題になりますが、Rustではその問題が発生しないにも関わらず、メモリを安全につかえるなんて・・・。
気になりますよね?
ということで、公式のガイドに沿って入門してみたいと思います。
まずはインストールする
とにもかくにも、インストールしないと始まりません。
WSLにRustをインストールするので、以下のコマンドを実行しました。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
stable-x86_64-unknown-linux-gnu unchanged - rustc 1.56.1 (59eed8a2a 2021-11-01)
Rust is installed now. Great!
To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).
ビルドツール兼パッケージマネージャのCargoも同時にインストールされました。
$ cargo --version
cargo 1.56.0 (4ed5d137b 2021-10-04)
新しいプロジェクトを作成する
公式通りに以下のコマンドを実行します。
$ cargo new hello-rust
Created binary (application) `hello-rust` package
このコマンドでプロジェクトのひな形が作成されました。
作成されたディレクトリ内の Cargo.toml の内容を確認してみます。
[package]
name = "hello-rust"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
他の言語でもよく見る定義です。
src/main.rs がソースファイルのようです。fn main() {
println!("Hello, world!");
}
$ cargo run
Compiling hello-rust v0.1.0 (/home/*****/hello-rust)
Finished dev [unoptimized + debuginfo] target(s) in 1.40s
Running `target/debug/hello-rust`
Hello, world!
問題なくコンパイルされ出力されました。
最適化無しでデバッグ用の情報をつけてくれてるようなメッセージが表示されています。
パッケージを使う
Rustではパッケージのことをクレートと呼ぶみたいです。木の枠組みのイメージですかね?
クレートのサイトアイコンもそんなデザインに見えます。 (個人的にはチーズにも見えましたが。)
公式どおりに Cargo.toml にパッケージを追加します。
[dependencies]
ferris-says = "0.2"
そして cargo build を実行します。
$ cargo build
Updating crates.io index
Downloaded smallvec v0.4.5
Downloaded unicode-width v0.1.9
Downloaded textwrap v0.13.4
Downloaded smawk v0.3.1
Downloaded ferris-says v0.2.1
Downloaded 5 crates (97.7 KB) in 0.98s
Compiling smawk v0.3.1
Compiling unicode-width v0.1.9
Compiling smallvec v0.4.5
Compiling textwrap v0.13.4
Compiling ferris-says v0.2.1
Compiling hello-rust v0.1.0 (/home/*****/github.com/*****/hello-rust)
Finished dev [unoptimized + debuginfo] target(s) in 44.18s
いくつかのパッケージがダウンロードされました。
ダウンロードされたパッケージは ~/.cargo/ に保存されているようでした。
では、このパッケージを使っていきます。
use ferris_says::say;
use std::io::{stdout, BufWriter};
fn main() {
let stdout = stdout();
let message = String::from("🍣を食べながら🍺を飲む");
let width = message.chars().count();
let mut writer = BufWriter::new(stdout.lock());
say(message.as_bytes(), width, &mut writer).unwrap();
}
$ cargo run
Compiling hello-rust v0.1.0 (/home/*****/github.com/*****/hello-rust)
Finished dev [unoptimized + debuginfo] target(s) in 0.32s
Running `target/debug/hello-rust`
____________
/ 🍣を食べな \
| がら🍺を飲 |
\ む /
------------
\
\
_~^~^~_
\) / o o \ (/
'_ - _'
/ '-----' \
すこしフェリスのセリフがオッサン化しましたが、出力は良好です。
この記事を書いた人
-
2008年にアーティスへ入社。
システムエンジニアとして、SI案件のシステム開発に携わる。
その後、事業開発部の立ち上げから自社サービスの開発、保守をメインに従事。
ドメイン駆動設計(DDD)を中心にドメインを重視しながら、保守可能なソフトウェア開発を探求している。
この執筆者の最新記事
関連記事
最新記事
FOLLOW US
最新の情報をお届けします
- facebookでフォロー
- Twitterでフォロー
- Feedlyでフォロー