Rustの所有権までをどう説明をつなぐか
来月の連載の内容が所有権なのだけど、所有権を説明し理解してもらうまでに、そもそも前提知識がいくつか必要そうな気がしている。とくにメモリ周りの話は普段レイヤーの高めの言語でプログラムを書いているプログラマはなかなか接したことのない内容のはずで、そこで理解が追いつかない、ということが多いように思う。
このあたりをどうつなぐかについて考えていきたい。
まず Rust はメモリを意識して書かなければならない言語なのかという点は議論の余地があると思うが、
- 書き味そのものは、C や C++ のように明示的な確保と破棄を書かせないという点においては Java のような高級言語と同じで、裏で解決してくれる仕組みが多々あるから、基本的には「意識しなくていい」部類に入る。
- ただし、たとえばツリーを作った際再帰的なデータ構造を定義すると思うが、そういう場面で「ヒープに寄せる」などの Java のような高級言語では直面しないテクいことをする必要がある。そういう面では「意識しなくてはならない」部類に入る。
という二面性があるように思う。ただ、「ヒープに寄せる」などは結構日常的にやる作業な気がするので、私は Rust はある程度メモリを意識して書かなければならないプログラミング言語だと思う。
ということで、連載にはメモリ領域に関する話をまず最初に盛り込むと良さそうに思っている。
Rust でよく使用するメモリ領域は下記のとおりかな。
- スタック領域
- ヒープ領域
- 静的領域
それぞれが何で、どういうときに使ってどういうときに嬉しいかみたいな話を先に書く必要がありそう。
メモリの解説はこの連載のここがかなり詳しい。
この説明をしたあとに、さらに他のプログラミング言語でどのようにメモリ管理がされてきたかについて説明する必要がある。そもそもレイヤーが高めでメモリ管理を意識することのないプログラミング言語を使用してきた読者が大半だろうから、メモリ管理には実は種類がある、みたいな話はきちんといれる必要がありそう。
説明するとしたら、
- 自動変数
- 動的確保
- RAII
- GC (Mark & Sweep もしくは近年流行りの?ARC)
ここまで説明して、ようやく所有権の話と革新性がすっと入ってくるようになる気がする。
所有権そのものについては、図式などで直感的かつ抽象的に読者に訴えかける手はあると思うが、結局のところメモリという枠組みで何が起こっているかを説明しないと理解したことにならないような気がする。何よりいずれ躓くことになりそうなので、このあたりを抽象的な図式でごまかさない感じにはしたいと思っている。
このあたりは自分が以前使用したハンズオンでのスライドの図式を少し直して解決できないかなと思ってはいる。ただあの図もあくまで模式図なので、微妙に細部が間違っている可能性があるのが難点かも。
136p からはじまるスライドの一連のアニメーションとかよさそうな。GIF にして記事に貼っておくとよさそうに思う。
この図にライフタイムをくっつけられるといいけれど、今のところよい表現の仕方を思いついていない。もう少し複雑なコードの例で図示しないとあまり意味のあるものにならなそう。