Don't Repeat Yourself

Don't Repeat Yourself (DRY) is a principle of software development aimed at reducing repetition of all kinds. -- wikipedia

Rust を始めるための資料集

かとじゅんさんのお誘いで、私塾匠真堂にて登壇させていただき、Rust に関する話をさせていただきました。ありがとうございました。

今回のセッションを通じて Rust を始めたくなった方向けに、Rust をはじめるための資料をいくつかリストアップしてます。よかったらどうぞ。

プログラミング言語の学習方法について

みなさんは新しいプログラミング言語を学ぶ際、どのように学びますか?

私は、軽く制御構文やデータ型の作り方などを学んだ後は、すぐにアプリケーションを作ってみて、詰まったらリファレンスを参照するといった学び方をしていることが多いです。

逆に、リファレンスをまず眺めて、文法をしっかり把握した後にアプリケーションを作ってみるという方もいるかもしれません。

いずれにせよ、

  • リファレンスを眺める。
  • アプリケーションを何かしら作ってみる。

の2つを、多くのプログラマは新しいプログラミング言語を習得する際にやっているのではないでしょうか?ということで、この2つについて、私の知る限りで資料を列挙したいと思います。

各資料の紹介時には、どういったシチュエーションで使用できるか、どのような特徴をもった資料かを簡単に補足説明しました。

Rust についてまず概観を掴む

Rust がどのような言語なのかについて、まず概略でいいから掴みたいという方向けにおすすめできる記事です。(他にもいい記事があるので、思い出し次第追加します)

  • 最速で知る! プログラミング言語Rustの基本機能とメモリ管理【第二言語としてのRust】: 少し古めの記事ではあるのですが、この頃から Rust のコンセプトは大きくは変わっていません。Rust がどのような言語かについて簡単に触れた後、所有権などを図を用いて説明しており大変わかりやすいです。
  • Rust は何が新しいのか: これは少々突っ込んだ話側かもしれませんが、Rust の「新しさ」について解説された記事です。Rust ではムーブセマンティクスと呼ばれる概念を使ってメモリ管理をしているわけですが、そのムーブセマンティクスは C++ から輸入され、Rust 向けにアレンジされた概念です。C++ におけるムーブセマンティクスの利点とペイン、そしてそれらを Rust がどう解決したかについて簡潔にまとまっています。
  • プログラミング言語 Rust のご紹介: これは私が以前発表した資料ですが、Rust の2020年時点での現状や言語機能、日本でのコミュニティ活動をまとめてみたものです。
  • Rust入門ガイド (sapporo.rs) #Rust - Qiita: sapporo.rs という勉強会で発表されたプレゼンのようですが、Rust の特徴が非常に簡潔にまとまっていてよいです。どういう用途に使用できそうか、という話まで込みで書かれており、Rust を使うイメージがわかない場合には読まれるとよいかと思います。

文法を学ぶ

2021年現在では、下記がおすすめできるかなと思っています。

  • 100 Exercises To Learn Rust [未邦訳]: 100個の練習問題を通じてRustを学ぶものです。必要な知識が過不足なく入れられている印象です。2024年ごろに登場した入門書です。作者は『Zero To Production In Rust』という本を書いた方で、情報源も信頼できると思います。
  • Comprehensive Rust🦀 [未邦訳]: Google社が提供するRustのチュートリアルで、4〜5日で一巡できるように設計されています。まだ英語しかありませんが、簡潔に書かれています。Rustのメモリ管理を理解するためには、そもそも他のプログラミング言語でのメモリ管理をある程度知っておかなければならなかったりしますが、そうした「Rustをやる前に必要になる前提知識」も簡潔ながら抑えられておりよさそうです。
  • Rust の最初のステップ: Microsoft社が提供する Rust の入門講座で、文法を1から学んで最終的にはちょっとした CLI アプリを作るところまで到達します。Rust を書き始める際に必要な項目がコンパクトにまとまっており、一番最初に取り組むチュートリアルとしておすすめできます。
  • Tour of Rust [一部邦訳]: これは現時点で最初の一歩におすすめできる資料かなと思います。Go 言語には A Tour of Go という、Go を始める際にうってつけな教材があります。それの Rust 版です。Rust の文法を1ページ1ページ解説しつつ、横で Playground を使ってコードを実際に実行して挙動を確かめるところまでセットでできます。まずこれを軽く通してみて、簡単に文法の概観を掴むとよいのではないかと思います。
  • Rust by Example: 文法の細かい解説というよりは、サンプルスクリプトを通じて Rust を学んでいける資料に仕上がっています。細かい解説はいいから、とりあえずサクサク写経しつつ概観を掴んで実際にアプリケーションを作って学んでいきたい、という方におすすめできるかなと思います。
  • とほほの Rust 入門: あのとほほさんの Rust 入門です。非常に簡潔に Rust の文法が網羅されており、サクサク Rust の文法を見ていく場合に適しているように思います。
  • Rustlings [未邦訳]: コンパイルエラーになる Rust コードのコンパイルを通るようにしていく問題集です。Rust のコンパイルエラーを直していく過程で、さまざまな Rust の文法について学んでいくことができるように設計されています。Rust にちょっと慣れてきたくらいでやってみるといいかもしれません。
  • RustCoder ―― AtCoder と Rust で始める競技プログラミング入門: 競技プログラミングを Rust でやりたい方向けに書かれた資料だとは思いますが、Rust の基本的な文法がよく解説されています。その章の文法を学んだ後に、AtCoder の問題を解いてみるという形式になっており、非常に導入がスムーズに感じます。
  • Rust入門: この本も日本語で書かれた Rust 入門に適した本で、Rust の概要をサクッと学んでみたい方にオススメです。各概念について完結にまとめられていて、必要に応じて概念図も用意されており、実用的なドキュメントになっていると思います。
  • Rustハンズオン@エウレカ社: 拙作で恐縮ですが、以前依頼されて行ったハンズオンをスライドとして公開しています。簡単に文法を解説したあと、cat コマンドや grep コマンドを作り、さらに grep コマンドについてはいくつか拡張をするという構成になっています。3時間程度あれば終わることを想定して作られたハンズオンです。

これまでは TRPL を薦めてきましたし、実際私も TRPL の第1版の日本語訳で入門しました。今でも TRPL は第一のリファレンスに使えます。一方で、国内海外問わず、TRPL がまずまずハードだという声も聞きます。近年 Rust ユーザーの増加により、入門用のドキュメントだんだん種類が増えてきました。これから学ばれる方の他の言語での習熟度や、これまで取り組んできた領域によってどの資料が合うかは変わってきます。上のリストのものをいくつか試してみて、ご自身にあうと思うものを選ばれるとよいと思います。

何かアプリケーションを実装してみる

Rust では本当にさまざまなものが作れます。また、それらの作り方について解説したチュートリアルがかなりの数存在しており、最初に取り掛かる際におすすめできそうなものをご紹介します。Rust らしい書き方を学ぶには、やはりこうしたチュートリアルのコードを写経してみるのがいいのではないでしょうか。

  • Command Line Applications in Rust [未邦訳]: 非常に小さな機能を持つgrepの実装を通じて、Rustの文法機能の実践面での使い方も理解することまでが視野に入ったチュートリアルです。CLIツールの自作はRustで作りたいものがとくにない方にとくにおすすめです。grep以外にも、たとえばlsなどを実装してみてもおもしろいのではないかと思います。
  • Writing OS in Rust: Rust は OS を作るのに適した言語なのですが、Rust で OS を作るチュートリアルです。一方でただ OS を作るだけではなく、Rust の細かい機能の解説や文法の解説、ワークアラウンドの解説などが記事のなかに散りばめられています。
  • Rustで始める自作組込みOS入門: Rust でマイコン上で動作する組み込みの OS を作るチュートリアルです。ARMv7-M を題材に、割り込み、プロセスの切り替え、スケジューラまでを実装していきます。組み込みOSの開発に興味がある場合にはよい題材となるはずです。
  • Let's build a browser engine! [未邦訳]: Rust でブラウザエンジンを実装するチュートリアルです。最終的に HTML と CSS をパースし、その情報から画面に結果を描画するところまで作り上げられます。HTML パーサーなどでハードに代数データとパターンマッチを使うことになるので、その練習にいいかもしれません。
  • Build Your Own Shell using Rust [未邦訳]: 小さなシェルを作ってみるチュートリアルです。Rust での標準入出力の使い方やプロセスの扱い方などを学ぶことができます。
  • Zero To Production [未邦訳]: Rust で Web アプリを1から作っていくチュートリアルです。CI や Docker ビルドなどまで、本番での使用を想定してコンテンツが用意されています。Web 系の人は一度目を通すと参考になる部分があるかもしれません。
  • Hecto: Build your own text editor in Rust [未邦訳]: Rust でテキストエディタを作るチュートリアルです。最終的にシンタックスハイライトまでついたテキストエディタができあがります。
  • Risp (in (Rust) (Lisp)) [未邦訳]: Rust で作る Lisp 処理系、その名も Risp を実装するチュートリアルです。はじめて触る言語で Lisp を作ってみるというのをよくやるという方は多いと思いますが、このチュートリアルを一周するとそれなりに作れます。ちなみに Make a Lisp (mal) にも Rust 版が存在しており、mal をこなすのも一つの手だと思います。
  • Series: Writing a JVM in Rust [未邦訳]: RustでJVMを実装してみようという記事です。クラスファイルのパーサーの実装をし、仮想マシンの命令を実装して、GCくらいまでをこなします。もともとJVM言語を使っていた方や、言語処理系の実装に興味がある方はとくに面白いと思います。
  • Build your own Git [未邦訳]: Gitを作ろうというチュートリアルです。課題を解く形式なので、若干Rustに慣れている必要があるとは思いますが、文法を一通り学んだ後のとっかかりとしてはおもしろいかもしれません。

あるいは、ここで紹介したチュートリアルではなくて、何か別の言語向けに書かれたチュートリアルを Rust に直してみるのもいいトレーニングかもしれません。実際、私も LSH という小さな C で書かれたシェルを Rust に直してみるなどの遊びをしてみました。

ちょっと突っ込んだ話を知りたい

たとえばもう少し体系的に学びたいとか、特定の文法機能を実アプリケーションでどのように使いこなしたら良いのかを知りたい、といった話題に応えてくれるドキュメントです。

  • The Rust Programming Language: 通称 TRPL。Rust を使う際のバイブル的な存在です。が、すべてをこなすとハードな仕上がりになっている(と個人的には思う)ので、発展的な話題は一旦見切って何かサンプルのアプリケーションの実装に移るといいかもしれません。Rust を書いている最中に何度も立ち返ることになるドキュメントでもあります。Rust だけでなく、コンピュータ一般に関する細かい解説も載っており、読むだけでも勉強になるドキュメントに仕上がっています。
  • Learn Rust With Entirely Too Many Linked Lists [未邦訳]: Rust で LinkedList を実装しながら、LinkedList のように再帰的な構造をもつデータ構造を Rust ではどう扱ったらよいかについて学ぶことができます。また、所有権や unsafe 、スマートポインタの扱い方などのワークアラウンドについても確認することができます。
  • Rust Language Cheat Sheet [未邦訳]: Rust のチートシートではあるものの一歩踏み込んだ話題にも触れていて、たとえば「ムーブが起きた際には、一体裏側では何が起きているの?」などといった細かい話を図付きで確認することができます。メモリレイアウトがどうなっているかは、やはり図で示されるととても理解しやすいです。
  • Rust Cookbook [未邦訳]: Rust は標準ライブラリが薄く作られています。これには理由があるのですが、クレート(ライブラリ)探しを少々がんばる必要があります。「シングルトンを Rust でやりたい」「データベースにつなぎたい」「日付を扱いたい」といったユースケースごとに、どのようなクレート(ライブラリ)を使用したらいいかを教えてくれる本です。
  • The Rustnomicon: Rust には、生ポインタを扱えるようにする unsafe という機能があります。この unsafe を扱う際には数々の危険行為が存在するわけですがそれらについていろいろ教えてくれる本です。Rust でシステムプログラミングをする際には、この本を一読しておくことをおすすめします。
  • The Rust Reference: Rust を構成する各機能について、入門書以上のことが書いてあります。ある機能について、どういうことができるのかなどをより深く知りたくなった場合、この本を参照することがままあります。
  • Rust API ガイドライン: たとえば変数名や関数名はどうつけたらよいのかといった話や、ドキュメントの書き方、どのように関数の引数をデザインしたらよいか、型のよい使い方などが書かれています。
  • Effective Rust[未邦訳]: 文法に少し慣れてきた頃におすすめできるドキュメントです。たとえばマクロをどのタイミングで使ったらよいかや、エラー型の作り方、あるいはボローチェッカーのおさらいや、CIをどうすべきかなど、実アプリケーションをRustで構築する上で必要になる、「入門の次」について教えてくれるドキュメントになっています。他のプログラミング言語におけるEffectiveシリーズと似た立ち位置の一冊に仕上がっていると思います。
  • Common Newbie Mistakes and Bad Practices in Rust: Bad Habits[未邦訳]: これは非公式ですが、他言語出身者が Rust を書き始める際にやりがちな(Rust 的には)ミスを紹介し、それを Rust ではどう回避するのかを教えてくれる記事です。少し慣れてきたころに読むと、役に立つ情報がたくさんあるはずです。

コミュニティの力を借りる

Rust を一人で学んでいると、どうしてもわからないことが出てくると思います。私もそうでした。

Rust には、現在日本の Zulip (Slack のようなコミュニケーションツール)があります。ここで質問してみるのはいかがでしょうか。#beginner や #code というチャンネルがあり、多くの方が質問をしています。

https://rust-lang-jp.zulipchat.com/rust-lang-jp.zulipchat.com

もし英語のコミュニケーションに抵抗のない方であれば、

  • Reddit: クレート(ライブラリ)の作者や Rust 言語の設計者本人からの回答を得られることがたまにあります。日本語で2次情報に当たり続けるより確度の高い情報を得られる可能性があります。
  • ユーザーフォーラムで質問する: こちらも同様に英語圏の詳しい人が答えてくれます。

仲間を見つける

勉強会が都内を中心にいくつか開催されています。COVID-19 の関係で現在はオンライン開催が多くなっていますが、2020年中ですと、下記のような勉強会が開催されていました。

また、日本向けの Rust カンファレンスである Rust.Tokyo というものを毎年11月頃に開催予定しております。2020年は RustFest Global という形で開催しました。2021年は再び Rust.Tokyo として開催していきたいと思っています。

Webサイト(2020年のままです🙇‍♀️) rust.tokyo

Twitter アカウント https://x.com/rustlang_tokyo


更新履歴

  • 2024-05-28: いくつかチュートリアル系でおもしろそうな話題を追加。
  • 2024-04-07: 『AtCoder と Rust で始める!競技プログラミング入門』→『RustCoder ―― AtCoder と Rust で始める競技プログラミング入門』。ならびに、URLを修正。『Effective Rust』を追加。
  • 2022-10-13: 最近アクティブでないLT会を削除。Slack の rust-jp グループを削除。Zulip の rust-jp グループを追加。
  • 2022-01-01: Rustで始める自作組込みOS入門 を追加。
  • 2021-12-05: Rustハンズオン@エウレカ社、Risp (in (Rust) (Lisp))、Common Newbie Mistakes and Bad Practices in Rust: Bad Habits を追加。