Rustに入門してみる

2021年10月31日

Rust に入門します。

前提

MacOSかLinuxを前提とします。

インストール

$ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

公式ドキュメント通りに Rust をインストールします。

$ rustc --version
rustc 1.56.0 (09c42c458 2021-10-18)

バージョン情報を標準出力できればインストール成功です。

Hello Worldを出してみる

firstcode.rs
fn main() {
    println!("こんにちは世界!");
}

プログラムのエントリポイントとなる main 関数を定義します。簡単な内容です。println!の ! はマクロの呼び出しを意味するようです。C言語っぽい。

コンパイル
$ rustc firstcode.rs

rustcコマンドでコンパイルする対象を指定します。コンパイルすると同名の実行可能ファイルが生成されます。

$ ./firstcode 
こんにちは世界!

標準出力されました。なんてことないコードですが、生成されたバイナリがどのような依存を持つのか見てみます。

$ otool -L firstcode
firstcode:
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.100.1)
	/usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)

3つの共有ライブラリに依存していました。 libresolv は DNS のライブラリだと思いますが、どういう理由でリンクされているのでしょうね?

cargo(ビルドシステム)

Rust のライブラリ管理・ビルドは cargo を使います。他言語だとビルドやパッケージ管理が別のツールに切り出されていることがほとんどですが、 Rust では cargo が標準装備のようです。

$ cargo new first_project
     Created binary (application) `first_project` package

プロジェクトを作ります。

$ cargo build 
   Compiling first_project v0.1.0 (/Users/lockhart/pywork/rust-renshu/first_project)
    Finished dev [unoptimized + debuginfo] target(s) in 2.73s

プロジェクトをビルドします。

$ ./target/debug/first_project 
Hello, world!

ビルド結果は target ディレクトリに生成されます。debugディレクトリの中に実行可能ファイルが出来ているので、実行します。cargo new で作成したプロジェクトの main.rs は初期値が hellow world の標準出力になっています。

production向けのビルドを実行するにはオプションを指定する必要があります。

$ cargo build --release
   Compiling first_project v0.1.0 (/Users/lockhart/pywork/rust-renshu/first_project)
    Finished release [optimized] target(s) in 1.55s

デフォルトがデバッグビルドになっているんですね。productionビルドは生成物が最適化されるようになっています。

$ cargo run 
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/first_project`
Hello, world!

ビルド&実行をまとめて実行する run コマンドもあります。こちらも production ビルドで実行する場合は --release オプションをつけます。

まとめ

Rust の最初の一歩をやってみました。最近何かとシステムプログラミング界隈が Rust でざわついていますよね。最近リリースされた Next.js v12 でもデフォルトのトランスパイラが Babel から Rust に置き換えられて、ビルド速度の大幅改善に成功しているようです。(ソース

もっと深堀りしないと言語特性が分からないので、何かお題を決めて小さな成果物を作ってみようと思います。

では、今日はここまで。良き Rust ライフを!


Web系エンジニアでPython好き。バックエンド/フロントエンド問わずマルチな方面でエンジニアリングしています。