2022-05-26 14:00:00

Rustに入門して4日が経ちました

今週からRustを勉強し始めました。Rustは、WebAssemblyでも使われたり、「今後フロントエンドはRustになる」と豪語する人もいるようなプログラミング言語ですね。一応、肩書はフロントエンドエンジニアである僕もずっと気になっていましたが、なかなか手を出すタイミングや時間がなく、そのまま月日が流れていました。

そんな中、最近見つけた面白そうなチュートリアルでちょうどRustが使われていたので、せっかくなのでこれを機にRust勉強しようと思ってようやく重い腰を上げました。

Rustの勉強方法は、こちらのサイトの記事を読みながら、Sandboxなプロジェクトで実際に手を動かしながら、メモをコメントで取る方法で進めています。ちなみに勉強用のSandboxプロジェクトはこちらに公開しています。興味がある人はご覧ください~。

さて、ようやくこの記事の本題ですが、Rustを勉強してようやく4日が経ちました。そしてやっとChapter4まで進めました。なのでここいらで簡単に勉強してみての感想を書いてみようと思います。

【個人の感想】C++を知っていると習得早い

Wikipedia によると、RustはC言語、C++に代わるシステムプログラミング言語を目指しているそうです。なのでCがC++、特にC++を知っている人は理解が早いと思います。僕はC++は「C++で仕事でプログラム一応書いたことあるよ」くらいには知っているので結構サクサク進められました。

C++はとても素晴らしい言語ですが、理解が難しい変態言語です(個人の感想です)。RustはC++よりは見やすい言語だと僕は思います。なのでRustを学んだあとにC++に入門するのもいいかもしれません。

開発環境について

Rustの環境はrustupを使えば簡単に作れます。rustccargoもこれで入れることができます。ビルドツールのcargoはcmakeやmakefileと比べるとかなり直感的で使いやすくて良いと今のところは思います。

tomlファイルも初めて使いましたが、大体iniファイルに似ているなーってのが感想です。(iniファイルとはいくつかの点で違うみたいですが、まだ必要に迫られていないので調べていない)。ちなみに、tomlとは、Tom's Obvious Minmal Languageの略だそうで、日本語で「トムの明確な最小限の言語」という意味だそうです。トムは提唱者のTom Preston-Wernerさんのことで、Githubの中の人、Gravatarの作成者です (この人)。

1章 Hello World

println!というものがある。これは関数ではなくマクロだそうで、マクロについては19章で説明があるらしい。!はよくつけるのを忘れます。

Rustのプログラムはrustcを使ってコンパイルできるが、それよりCargo(cargo)を使ったほうが効率もいいし便利。たぶん通常はCargoを使ってプログラムを作るだと思います。

Cargoを使ったプロジェクトは自分で一から作っても良いですが、cargo new {project名}で簡単に作成できます。そしてビルドはcargo buildcargo runでビルド+実行を同時に行えます。

また、これは別途調べたんですけど、cargo-watchをインストールするとホットリロードできます。

2章 数あてゲームの実装

とても簡単で単純なものですが、ゲームを作ります。この章で変数やライブラリの使い方など超基本の文法を勉強することができます。「俺は説明書は読まない!あとは使いながら慣れていくぜ」派のプロの方々はたぶんこの章までやればいったんはOKだと、個人的には思います(とはいえ、続きの章ではリソースの話やスマートポインタの話とかもあるようなのでちゃんと読むほうが良いとは思います)。

気になった点としては、Rustの変数は通常immutableで、mutableな変数を作るにはmut識別子が必要のようです。この、標準がimmutableな変数で、mutableにするのに識別子が必要という考えは良いと思いました。

immutableとmutableについて

  • mutableな変数: 値の変更が可能な変数
    • JavaScriptならconstで宣言した変数
    • Kotlinならvalで宣言した変数
    • C++ならconst intのようにconstをつけて宣言した変数
  • immutableな変数: 値の変更ができない変数
    • JavaScriptならlet
    • Kotlinならvar
    • C++ならconstなしの普通の変数

一般的に、プログラミングは不用意に値が書き換えられないようにimmutableな変数として宣言するほうが良い。

3章 一般的なプログラミングの概念

この章から本格的にRustの文法などの詳しい話に入ってきます。3章では「変数」、「型」、「関数」、「コメント」、「制御フロー」について解説されています。コメントについては大した内容もなさそうだったので読んでいないです。

変数については、簡単な解説は2章でありますが、ここではもっと詳しく説明がされています。 immutable、mutableの話のほか、スコープ、シャドーイング、定数について説明があります。 シャドーイングは、変数を再宣言することができる機能です。

型の書き方はTypeScriptとかSwiftの、イマドキの言語と同じで変数名の後に型宣言を書く形式のようです。また、キャストはas i32のようにasでキャストできるようです。 後、どうやらRustは暗黙の型変換はできないようです [参考]。型に厳しいのはよいですね(初心者はもしかすると煩わしく感じるかもしれないですが・・・)

関数のセクションでは、文と式の違いについて書かれています。この概念はRustではとても大事なようですが、他言語でも同じように大事な知識なのでここで知っておくとよいと思います。

最後に制御文について、ifloopwhileforについて書かれています。 Rustのifは文ではなく式なので変数に代入することができたりします。また、loopはbreakでループを抜けない限り無限ループをする文のようですね。そしてRustのfor文はPythonのfor文と同じ感じです(foreach形式のfor文)

4章 所有権を理解する

4章は所有権についてです。さすがC++の後継を狙うプログラミング言語、リソースの所有権が重要になってきますね。多分、ムーブというセマンティクスはC++やっていない人は初耳なのではないだろうか?

ムーブセマンティクス以外にも、参照やスライスといった話もあり、「Rustに入門してるなー」と思えるような内容がしっかり描かれているのでちゃんと読んだほうが良いですね。

今後の予定

引き続き「The Rust Programming Language」を読み進めます。最低限、15章までは読んだほうがよさそう。