【1日目】Rust入門者に贈るRust入門者がRustと闘う物語 -Rustとその愉快な仲間(Cargo)の登場-


最近、巷で話題のRust。システムプログラミング言語などの低レイヤー言語は触ったことがない筆者が、裸一貫で闘っていく、そんな物語です。

本日は、初日ということで、RustとCargoのインストールを行っていきたいと思います。一応スクリプトも書きます。

はじめに

※物語共通で使用するので不要な方は飛ばしてください。

開発環境や参考サイト、学習フローチャートなどの概要について話します。

本物語について

私は、今業務で使用している言語や趣味でしようしている言語を含め、使用している全ての言語を独学で勉強してきました(せざるを得なったためですが)。

そして、毎回のことのように何度も壁にぶつかり、やっとの思いで扱えるようになるため、プログラミング言語の取得は、修行のようなものだと考えています。

これは私自身の能力不足なのかもしれませんが、大小はあるにしても誰しもが共通して感じるものなのかなと思いまして、後にRustに入門する方々に参考になればと思い、物語として記録しておきます。

本物語の目的

・初心者としてありがちな凡ミスやくだらないエラーを赤裸々に記録し、後続する方々の参考にして頂くため
・自分用のメモ

本物語での記述について

ファイル名:わかりやすく日本語で書いていますが、自らの環境で真似するのはお勧めできません。

表現の置換:私の最も得意として楽に記述できる言語がJavaScript(特にES6の書き方が好きです)のため、多くの部分でJavaScriptで置換して表現します。多くの人がわかるようにPythonで置換しようと思ったのですが、Pythonの書き方は(個人的に)独特なので、これまた知名度の高いJavaScriptで置換しようと考えました。

エラーやつまづきポイント:敢えて全てのエラーの記録をお伝えしますし、遠回りの手法をお伝えすることがあります。これは私を反面教師にして同じ轍を進まなくて済むためと考えています。

※なお、全体を共通して「厳密性」より「なんとなく」を優先することが多々あるかと思います。その点ご了承ください。

対象読者

・今からRustに入門しようとしている方
・プログラミング自体はある程度できるけど、組み込み系やOS設計などの低レイヤーの部分は触れたことがないという方
・開発自体は好きだが、言語がある程度使えるまでの道のりがしんどい方

Why Rust

・業務でWebAssemblyが必要になりそうだった
・何か1つの言語を1から丁寧に学んでみたかった
・流行っていて今後本格的に低レイヤー言語としての地位を獲得しそうな雰囲気がした
・調べると、難しこと以外でデメリットが見当たらなかった
・名前が良い響き

開発環境とスキルセット

再現性は不明ですが、念のため記しておきます。

開発環境

PC: macOS Catalina 10.15.2
開発エディタ: VSCode
Rust: 1.41.0

スキルセット

基本的にWebフロントエンドとソフトウェア開発(金融系など)がメインですが、、

業務で使用
Javascript(デフォルト)(Node.js, Vue.js, React.js, Jquery, etc)
Python(主にAPIなどのバックエンド)(あまりフレームワークは使わない)
Swift(単純な業務アプリ等)
PHP(Wordpressカスタマイズとか頼まれたら)(比較的苦手)

趣味程度
Golang(速度が必要な処理でAPI作成)
Julia(計量経済学を学習した際に)
R(計量経済学を学習した際に)

主にWebのお仕事をもらいつつ、頼まれたら業務に必要なアプリ作ったりしています。
Swiftが一応システムプログラミング言語ですが、そこまで複雑じゃない業務管理アプリ程度しか作ったことがないので、システムプログラミングエンジニアとしては初心者です。
Golangは、Node.jsで速度処理に困った際に比較で学んだのがきっかけで業務での使用はないです。いつかお仕事できればいいな。

ちなみに、よく聞かれるので、JavaとRubyの使用経験についても記載しておきます。
・Java(Kotlin等も)は無茶振りで超単純なアプリを作ったくらいで、趣味にも入らないくらいです。
・Rubyは、変なセミナーに誘われることが多かったので怖くて触れてません。

学習スケジュール(予定)

そもそも私自身Rustを学ぶ目的というか必要がありまして、実は金融系ソフトウェアの開発にあたりWebAssemblyを使うかもしれない可能性があり、そのため最終的にWebAssembly系で何かできたらと思っています。

恥ずかしながら、こうしてスケジュールを組んで学習というのが初でして、いまいち書き方がわかりませんが、以下のようにしております。

基礎学習

n日目 やること
1日目 Rustと周辺ツールのインストールとセットアップ
2日目 変数束縛, 関数, プリミティブ型, コメント, if, ループ
3日目 所有権, 参照と借用, ライフタイム, ミュータビリティ, 構造体, 列挙型
4日目 マッチ, パターン, メソッド構文, ベクタ, 文字列, ジェネリクス
5日目 トレイト, Drop, if let, トレイトオブジェクト, クロージャ, 共通の関数呼出構文
6日目 クレートとモジュール, conststatic, アトリビュート, type エイリアス, 型間のキャスト, 関連型

こちらを参考にして、スケジュールを組んでいます。

基本的に1日5時間くらいで学習できる想定です。

---2/12追記
こちらですが、誤って2016年の資料でしたので、正しくはこちらになります。次回からの章で訂正したスケジュールを掲載します。(2018年6月ごろの英語版がベースとのこと)

応用学習

未定ですが、WebAssemblyで何かしたい。

参考サイト等(仮)

Rustチュートリアルがしっかりしてるサイト

---2/12追記
こちらですが、誤って2016年の資料でしたので、正しくはこちらになります。(2018年6月ごろの英語版がベースとのこと)

何をやったか(1日目)

Rustと周辺ツールのインストールとセットアップ

Rustインストール

基本的に、ここを参考。
Mac(bashを使用)では、以下でいけるとの記載。

コマンド.sh
curl -sSf https://static.rust-lang.org/rustup.sh | sh

しかし、以下のように返答が返ってきました。

レスポンス本文.sh
The location of rustup.sh has moved.
Run the following command to install from the new location:
    curl https://sh.rustup.rs -sSf | sh

コマンドが変わったようなので、改めて、

コマンド.sh
curl https://sh.rustup.rs -sSf | sh

を実行し、

途中の質問.sh
Current installation options:


   default host triple: x86_64-apple-darwin
     default toolchain: stable
               profile: default
  modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation

では、初心者のためもちろん1を選択。

まあまあ時間かかって(1時間45分くらい)、インストールが完了。

完了メッセージ.sh
Rust is installed now. Great!

次にパスを通す必要があるらしいので、パスを通す。

パスを通す.sh
source $HOME/.cargo/env

パスが通ったか確認

パスの確認.sh
rustc --version

-result: rustc 1.41.0 (5e1a79984 2020-01-27)

Rustのコードを書いてみる

main.rs
fn main() {
    println!("Hello, world!");
}

を適当なディレクトリに作成。

コンパイル.sh
rustc main.rs

でコンパイルして、

runScript.sh
./main

-result: Hello, world!

とりあえず動いたのでOK.

所感

JavaScriptの関数表現に似つつ、中身はPython2
コンパイルが必要なのは低レイヤーぽくて良いけど、めんどくさそう

Cargoのインストール

CargoはRustのビルドシステムであり、パッケージマネージャであり、RustaceanはCargoをRustプロジェクトの管理にも使います。

と記載がある。

一応cargoが入ってるか確認

cargo入ってるか確認.sh
cargo --version

-result: cargo 1.41.0

入っていたので、次へ進む。

cargoはsrcディレクトリにソースファイルを入れる必要があるらしいので、先ほどのスクリプトを書いたディレクトリで以下を実行

srcを作ろう.sh
mkdir src && mv main.rs src/ 

##一応コンパイルしたやつも削除しておく。
rm main

Cargo.tomlという設定ファイルを現在のディレクトリに置く。

Cargo.toml
[package]

name = "hello_world"
version = "0.0.1"
authors = [ "あなたの名前 <[email protected]>" ]

今現在のファイル構成

ファイル構成
./
  - src/main.rs
  - Cargo.toml

この状態で、ビルドと実行を行う。

ビルドと実行.sh
cargo build

-result: Finished dev [unoptimized + debuginfo] target(s) in 1.73s

./target/debug/hello_world

-result: Hello, world!

##同じことが以下でもできるらしい。
cargo run

-result: Running `target/debug/hello_world`
         Hello, world!

cargoはプロジェクトファイルが変更された時だけ再ビルドする代物らしい。便利そう。
バイナリコードを早くしたいときは、cargo build --releaseをする。(コンパイルに時間がかかるらしい)

cargoプロジェクトの作成

cargoプロジェクト作成.sh
cargo new hello_world --bin

でcargoプロジェクトが作成できるらしい。よりシンプルなnpm initみたいな感じ。gitもできるのは少し嬉しい。README.mdができないのは仕様?

所感

ビルドシステムって言葉がよくわからない。名前だけで言ったら、Golangのbazelとかなのかな。ビルドツールっていう意味だとしたら、JavaScriptのgulpとかかな?
パッケージマネージャはJavaScriptでいうnpm, yarnくらいのところだろうか。
RustaceanっていうのはRustのベテランって意味らしい。

よくわからなかったこと、問題点など

・ビルドシステムってなんとなく聞いたことがあるけど、正確な意味はなんなんだろうか。単純にビルドできる環境のような意味合いで良いのだろうか、、、

気をつけた方が良いこと

・シンプルにRustのインストールに結構時間がかかるので、時間に余裕がある時にインストールするのが良いと思います。

まとめ

Rustのインストールと写経しかできなかった(まさかこんなにインストールに時間がかかると思わなかった)ので、当たり前ですが今のところは特に壁はないですね(日本語以外)。
ただビルドとかは、いかにもシステムプログラミング言語な感じがしてワクワクします。明日の学習が楽しみですね。
どうでも良いですが、自分なりにわかりやすくQiita投稿をしたつもりなのですが、案外時間かかりますね、、

次の記事

追加しました。こちら