tekiehei2317's blog

Rustに入門したのでやったことメモ

投稿日: 2023-01-17

年末年始にKOBA789さんのRustでDBMSを作る記事を読んでいました。

WEB+DB PRESS Vol.122に特集「Rustで実装!作って学ぶRDBMSのしくみ」を書いた

いきなり作り始めると途中で挫折しそうだったので、最初にRustのチュートリアル的なものをやることにしました。

やったこと

Rust を始めるための資料集を参考に学習資料を選びました。入門するための資料がまとまっていて、とても助かりました。

最初は、Rustは何が新しいのか(基本的な言語機能の紹介)を読んで雰囲気を掴みました。メモリ管理が独特だと分かりました。

それから、良さげだったMicrosoftのチュートリアルをしました。7時間くらいかかったっぽいです。よく使われるクレート(serde、structopt)を使ったり、エラーハンドリングもちゃんとやるので実践的なチュートリアルでした。

Rust の最初のステップ

その次に、新しいプログラミング言語を学ぶときは大体やっている、AtCoderのBeginners Selectionを解きました。

解答: すべての提出 - AtCoder Beginners Selection

所有権システムについて

Rustの一番の特徴は、メモリの管理をそれまでの言語にないやり方でしていることだと分かりました。今わかっていることについてまとめようと思います。

まず、RustにはGCがありません。GCとは、不要になったメモリをランタイムが自動的に解放する仕組みのことです。その代わりに、所有権という仕組みがあります。

所有権は、「あるデータを所有できるのは、一度に一つの変数のみだけ」というルールのことです。こうすることによって、変数のスコープとメモリの生存期間が一致します。つまり、コンパイル時にメモリの確保と解放のタイミングを決められます。

所有権があると不便なことがあります。それは、ある変数を別の変数に代入すると、もとの変数の所有権がなくなることです。これを解決するために、借用という仕組みがあります。借用は制限付きの参照です。借用の制限には、無効なポインタを防ぐためのライフタイムや、データ競合を防ぐためのミュータブルな参照の制限(1つしか作れない)があります。

Rustを少し書いてみた感想

良かったところ

「関数型言語で標準的になった機能を多く取り入れているところ」「標準ツールが充実しているところ」が良かったです。

関数型言語から取り入れられたものは、式指向・パターンマッチ・タグ付きユニオン・Option/Resultなどです。F#やElmを書いたことがあったので、あまり抵抗なく学べました。

Rustには、テスト・リント・フォーマットの標準ツールが用意されています。また、パッケージ管理にはCargoが使えます。普段TypeScript(ブラウザ、Node.js)で開発していて、ESLintやJestの設定が面倒だと感じることもあったため、最初から準備されているのは良かったです。

難しかったところ

難しいなと思ったところは、やはりメモリ管理の部分です。まだ慣れていないのもあり、ある変数が参照なのかそうでないのか分からなかったり、&をつけるかどうかを考えるのが難しいです。例えば、mapのときは値だったけど、filterに書き換えると参照に変わってコンパイルエラーになった、というようなことがありました。あと、文字列を表す型がたくさんあって、まだ違いと使い分け方を理解できていません。

今までメモリについて何も考えずにコードを書いていたので、少しギャップがありました。所有権システムは、速度と安全性の恩恵を受けるための頼れる相棒だと思うので、演算指向のプログラムを書くときは最大の恩恵を受けられそうだなと思いました。

これからやろうと思っていること

雰囲気は掴めてきたので、本題の自作DBMSをやってみようと思います。Rustは学習資料が充実しているので、Rust自体の学習は面白いと感じる範囲でやってみようと思います。

参考