🦀

私の Rust 学習記録 2021

2022/04/21に公開

※ この記事は 2021/10 時点での内容です。

社内勉強会で 2021 年に発表した内容で、外部公開しようと思って寝かせてしまっていました。
記事としての鮮度は落ちてますが、頑張って書いたものなので Zenn に公開しておきます。


概要

社内異動を機に業務で Rust を書けることになった私の Rust 学習記録です。

https://twitter.com/daido1976/status/1457271601142001665

今までの言語経験はメインが Ruby、少し JS/TS、趣味で Go をやっていたぐらいです。

学習の方針

なんでもかんでも Rust で書く。

Rust は GC のないシステムプログラミング言語として大体 C 言語と同等のレイヤーからカバーできるので、書こうと思えば OS から Web アプリまで書ける。
yew のような UI 構築用のライブラリもあるので、フロントエンド開発もできる。

というわけでなんでもかんでも Rust で書ける。

リポジトリ運用

デプロイの必要がない学習用のコードは https://github.com/daido1976/learn-rust に全てまとめた。

1 リポジトリにまとめた方が、

  • 読み書きする時にいろんなリポジトリを往復しなくてよい
  • gitignore や README を毎回書かなくて良い

上記のような利点があるので、自分は学習用のコードは他の言語も含めて learn-xx リポジトリにまとめている。
https://github.com/daido1976?tab=repositories&q=learn

学習記録

番外編除いて大体 2 ヶ月ぐらい。2021 年時点では終わってないプロジェクトがほとんど。

Tour of Rust

https://tourofrust.com/

A Tour of Go のコピーかと思ったらちゃんと Rust に最適化されててよかった。

the book

https://doc.rust-jp.rs/book-ja/

まずは全体を斜め読みしてから実践パートで手を動かした。
けっこう難しくて自分は一度 Tour of Rust をやってから読み直してちょうどよいぐらいだった。

その他にも日本の Rust コミュニティは活発に翻訳作業をやってくれていて公式ドキュメント群の日本語訳はたくさんある。嬉しい。

Home | Rustの日本語ドキュメント/Japanese Docs for Rust

インタプリタ

https://github.com/daido1976/monkey

Go 言語でつくるインタプリタ を Rust で書く。

字句解析器(Lexer)、構文解析器(Parser)、評価とあるうちの Lexer の実装までしか終わってない。Go で写経してから Rust に書き直す方式でやってたらめっちゃ時間かかる。

個人的に他言語の実装を〇〇(習得したい言語)で書き直すというのは、初期の学習としてとても効率が良いと感じた。一番良いのは作りたいものを作る、だろうけど。
写経とは違い実装を自分の頭で考えることになるので、記憶にも残りやすい。

GitHub CLI extension

https://github.com/daido1976/gh-default-branch/tree/v0.1

全然 Rust じゃなくてよかったやつ、というのがソースコード見るとバレる。Command で外部コマンド叩きまくってるだけ。
リリースとインストール周りは勉強になったので Zenn で記事にした。

https://zenn.dev/daido1976/articles/ceac2fe5168be8

DDD

https://github.com/daido1976/learn-rust/tree/main/ddd

上記記事を参考に ドメイン駆動設計入門 のサンプルコードを Rust で書き直した。
Rust も DDD も学びたいと思ってた自分にとってはめちゃありがたい教材。
記事になってるところまでしか書けてないので、残りもやる。

競プロ

https://github.com/daido1976/learn-rust/tree/main/leetcode

Rust で 5 問ほど解いた。
後述もするが、ここで特に実装ファイルにテストが書ける Rust いいねってなった。

Todo アプリ API

https://github.com/daido1976/learn-rust/tree/main/todo_api

Todo アプリ API の CRUD 処理を作る。データの書き込み先はファイル。
これで、以下要素に触れられるので教材としてちょうど良い。

  • HTTP でやりとりをする Web サーバの構築
  • ファイル I/O
  • JSON の扱い

ネットワークプログラミング

https://github.com/daido1976/learn-rust/tree/main/socket

Rust で始めるネットワークプログラミング の写経。
とりあえず一章の TCP、UDP のクライアント/サーバをそれぞれ作ってみようってやつだけやった。

自作 DB

https://github.com/daido1976/learn-rust/tree/main/minidb

WEB+DB PRESS Vol.122 の『特集 3 作って学ぶ RDBMS のしくみ』を写経。
まだ半分。

TUI アプリ

https://github.com/daido1976/learn-rust/tree/main/tui

Rust and TUI: Building a command-line interface in Rust - LogRocket Blog の写経。一応完成までやった。面白かった。
LogRocket はちょこちょこ Rust 関連のブログ公開してる。

rust Archives - LogRocket Blog

簡易シェル

https://github.com/daido1976/learn-rust/tree/main/lsh

とりあえず動くけどほとんど 簡易シェル LSH を Rust で実装してみた - Don't Repeat Yourself を写経しただけ、もう少しコマンド増やしたい。

他の人が似たようなことやってたやつ。

自作ブラウザ

https://github.com/daido1976/learn-rust/tree/main/toy_browser

まだほぼプロジェクト作っただけ。
ブラウザ関連でいうと ちいさな Web ブラウザを作ってみよう も並行してやりたい(やることいっぱいあるね)

番外編

番外編として Rust を書く以外で Rust 学習に有用だったことを記載する。

C 言語

https://github.com/daido1976/learn-c

低レイヤーを学ぶため。
苦しんで覚えるC言語 ふつうの Linux プログラミング を参考に。
メモリ管理(ポインタ)についてや、文字が内部的には数値であること、文字列が文字の配列であること、配列が先頭のメモリアドレスを保持してるだけなことを知った。
スクリプト言語を触ってると忘れがちだけど文字列ってけっこう複雑。

Haskell

https://github.com/daido1976/learn-haskell

型システムと関数型言語のパラダイムを学ぶため。
すごい Haskell 本エンジニア Hub の特集記事 を参考に。

その他

感想

  • Rust の難しさには二つある
    • 厳密な型システムや関数型言語由来を含む言語仕様の多さによる難しさ
      • Haskell や Scala をやってた人は多分難しさを感じないやつ
    • 低レイヤー的難しさ
      • C/C++ をやってた人は多分難しさを感じないやつ
  • cargo check が最高
  • 同じファイルにテスト書けるのも地味に素晴らしい、競プロや書き捨てスクリプトを書きたい時などめちゃ便利
  • モジュールシステムも明快でいい、use 書かずともほぼ LSP(rust-analyzer)の補完任せでいける
  • 所有権やライフタイムも大体 rust-analyzer が提示してくれる Quick Fix 適用しとけば 8 割直る、それでもダメな時は cargo check してエラーをググれば大体いける(自分が今まで書いてるコードのレベルなら)
  • 経験値としてはこれでようやくちょっと読み書きできるようになったかなというレベル、まだ並行処理やスマートポインタが出てくると手が出ないし Rust の言語仕様を活かした書き方もできてないのでこれからがんばります

最後に

私の好きな記事の一文を引用しておきます。Rust 書くモチベーションが上がります。

https://kerkour.com/rust-for-web-development-2-years-later/

Rust will make you a better programmer: Rust is complicated and won’t leave you alone if you don’t understand how it works in detail. It takes time and patience to main, but once you do, you’ll have learned so many things that you’ll never approach programming as before.

Discussion