じぶん対策

日々学んだことをアウトプットして備忘録にしています。

2024年末の今、Rustに入門してみる

はじめに

今回はRustへの入門記事です。

2024年の抱負として、技術書を読んだり、個人開発を習慣化したりといったことを目標にしていました。

2024年の抱負

実際、今年は技術書を読んだり、個人開発をしてはいるんですが、習慣化という点ではまだまだです。

これらをやりたい背景として、自分コンフォートゾーンをガンガン抜け出したいんだなと気づいたので、以前から気になっていたRustに挑戦してみることにしました。

個人的にRustに興味がある理由としては、以下の点が挙げられます。

  • PHP、TypeScriptを中心に業務をしているので、CLIツールを作るのが少し面倒
  • 純粋な静的型付け言語に興味がある
  • 言語設計の良さを聞く機会が多いので、設計面での学びがあるかもしれない
  • バイナリとして実行されるのでコンテナ技術との相性が良さそう

ほかにもGo言語も候補にあがっていましたが、現時点での評価としては簡単に学習できつつも設計の悪さを感じる記事を多く目にしました。簡単に学習できること自体はPHP等も同じだと思っているので、優先順位は設計などを学べそうだったり、最終的な安全性が高いRustが上でした。Go自体もあまり触ったことがないので、将来的には触ってみたいと思っています。

また、Rustは私がWEBエンジニアになった2022年から注目されている言語で、その後も注目度が高まっている印象があります。

ただ、当時は学習コストが高い印象があり、軽く触れてはいたものの挫折していました。

2024年時点で、JetBrainsがRustのIDEであるRustRoverをリリースしたり、Rust関連の書籍が増えたりと、学習環境が整ってきている印象があります。

また、ChatGPTなどプログラミング学習に使えるAI等周辺環境も良くなりつつあるので、再度挑戦してみることにしました。

業務で使いたいなと思うユースケースとしては、下記のようなものがあります。

  • LambdaのカスタムランタイムでRustを使い、高速な処理を実現する
    • コストに直結するので、高速な処理ができると嬉しい
  • CLIツールを作成する
    • PHPやTypeScriptで作成するのがやや大変
  • 基盤周りなど、コード量が多くなくても、アクセス数が多かったり、コンテナ技術との相性が求められるもの

参考資料

書籍も購入しました

基礎知識

Rustとは

Rustは、Mozillaが開発したシステムプログラミング言語です。
現在はRust Foundationが開発をしているOSSです。
このRust Foundationは、AWSGoogleHUAWEIMicrosoftMozilla等によって設立された非営利団体です。

システムプログラミング言語が何かわからなかったんですが、他の言語との区別として、下記のようなポイントがあるようです。

  • システムプログラミング言語はシステムプログラミングのための言語で、CやC++が有名
  • システムプログラミングとは、OSやデバイスドライバ、組み込みシステムなどの低レベルなプログラミングを指す
  • アプリケーション向けの言語との違いは、物理的なハードウェアへのより直接的なアクセス手段を提供していること

参考: システムプログラミング言語 - Wikipedia

ざっくりよく知られている特徴をあげておきます。

  • メモリ安全性を保証する
    • Rustは所有権システム(Ownership)という仕組みがあり、メモリ管理のエラーをコンパイル時点で検出できる
  • 高パフォーマンス
    • C、C++に匹敵するパフォーマンスを持つ
  • 並行性のサポート
    • 安全なスレッド間の共有を保証する

チュートリアル

The Rust Bookにチュートリアルがあるので、ざっくり必要な部分だけを抜粋してみます。

インストール

Linux/MacOSの場合

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

Cargoを使ったプロジェクトの作成

Heloo, World!自体はもっとシンプルにできるんですが、Rustを使う場合は基本的に公式ビルドシステムであるCargoを使います。

cargo new [プロジェクト名]
cd [プロジェクト名]
cargo run

セットアップした時点でHello, World!プログラムが作成されています。
cargo runでコンパイルと実行がされるので、Hello, World!と表示されるはずです。

また、セットアップした時点でCargo.tomlというファイルが作成されており、これがnpmでいうpackage.jsonのように依存関係の管理やプロジェクトの設定を行うことができるものです。

全体的な雰囲気を掴みたい場合はThe Rust Bookの数当てゲームのプログラミングの章が良さそうです。

書き方でおさえておくところ

変数

変数はデフォルトでイミュータブルになります。
再代入ができないので、他の言語とはやや扱いが異なります。
Rustの文脈では代入ではなく「束縛」という言葉を使うことが多いようです。(bindの訳かな)

let x = 0;
x = 1; // error[E0384]: cannot assign twice to immutable variable `x`

イミュータブルな変数を作成する場合は、明示的にmutキーワードを使います。

let mut x = 0;
x = 1; // OK

データ型

Rustにおける値は全てデータ型を持っています。

まずはスカラー型。C言語と同じようにbit数によって分かれています。

  • スカラー

    • 整数型
      • i8, i16, i32, i64, isize
      • u8, u16, u32, u64, usize
        • iは符号あり、uは符号なしでそれぞれビット数を表す
        • isize, usizeはアーキテクチャに依存する符号あり、符号なし整数型
    • 浮動小数点型
      • f32, f64
  • 論理値型

    • true
    • false
  • 文字型

    • char型
      • シングルクォートで囲む
      • Unicodeスカラー値を表す
      • 文字列型ではなく、文字型
      • String型は言語ではなく、標準ライブラリで提供される。
      • 結構ややこしい概念なので、The Rust Bookを参照
  • 複合型

    • 複数の値を一つの型にまとめることができる。以下種類
      • タプル
        • 複数の方の値を一つの型にまとめる
        • タプルの位置ごとに異なる型を持つことができる
        • タプルの要素にはドット記法でアクセスできる
          • let tup: (i32, f64, u8) = (500, 6.4, 1);
          • let five_hundred = tup.0;
      • 配列
        • 配列は全要素同じ型でなければならない
        • 固定長であり、一度宣言されたら要素数を変更することはできない
      • ベクタ
        • 配列と異なり、要素数を変更できる
        • ベクタは標準ライブラリで提供される

関数

関数はfnキーワードで定義します。

fn another_function(x: i32) {
    println!("The value of x is: {}", x);   // xの値は{}です
}

仮引数には型を指定する必要があります。

また、関数はそれを呼び出したコードに値を返すことができます。

fn five() -> i32 {
    5
}

関数本体ブロックの最後の式の値がその関数の戻り値になります。returnキーワードは早期リターンする場合に使います。

関数の最後の式が戻り値になるので、セミコロンをつけてしまうと文になり、エラーになります

さいごに

Rustの基礎をざっくりと抑えてみました。
今回の内容はまだ言語の基礎的な部分でRustらしい部分は出てきていませんが、学習を進めながらまた記事にしていきたいと思います。