グローバルナビゲーションへ

本文へ

フッターへ

お役立ち情報Blog



安全性、速度、並行性を兼ね備えた言語と、巷でうわさの「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 を実行してみます。

$ 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ではパッケージのことをクレートと呼ぶみたいです。木の枠組みのイメージですかね?

The Rust community’s crate registry

クレートのサイトアイコンもそんなデザインに見えます。 (個人的にはチーズにも見えましたが。)

公式どおりに 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  \ (/
          '_   -   _'
          / '-----' \

すこしフェリスのセリフがオッサン化しましたが、出力は良好です。

この記事を書いた人

tkr2f
tkr2f事業開発部 web application engineer
2008年にアーティスへ入社。
システムエンジニアとして、SI案件のシステム開発に携わる。
その後、事業開発部の立ち上げから自社サービスの開発、保守をメインに従事。
ドメイン駆動設計(DDD)を中心にドメインを重視しながら、保守可能なソフトウェア開発を探求している。
この記事のカテゴリ

FOLLOW US

最新の情報をお届けします