SSブログ

Rustのメモリ操作がわからないので読んで理解してみた。 [プログラミング]

Rustをちょっとやってみたんだけど、いまいちコンパイラに怒られるばかりで気持ち良くない。Golangくらいに楽にできろとは言わないけど、もうちょっと何とかならないのかなぁと思ったりする。でも、それは必要に駆られての言語仕様なのだから、面倒でもそれに従うしかないのかな。

雑誌を買って読んでみたんだけど、なかなか悪くない。

Software Design (ソフトウェアデザイン) 2021年9月号 [雑誌]

Software Design (ソフトウェアデザイン) 2021年9月号 [雑誌]

  • 出版社/メーカー: 技術評論社
  • 発売日: 2021/08/18
  • メディア: Kindle版



Rustの本を買おうとすると分厚くて高いものを買わざるを得ない気もするし、Rustの本で他の言語との比較をやれるという事はあまりないと思う。普通、Rustの言語の本で他の言語のソースを引き合いに出す事はないだろうし、雑誌でやるという意味は結構ある。Rustで引っ掛かるところは、メモリのやりとりの部分で、他の言語と同じようなつもりで書いていると、コンパイルエラーで嫌になるのがオチだろう。

結局、メモリの動的配置をどうするのかというところにあって、自動変数からmalloc(), free()の原始的な操作、ちょっと欠点があるスマートポインタ、処理が重いけど書く方の負担が少ないガベージコレクション、の次に来る仕組みであった。

ただGCと逆行するみたいなところはあって、書く方に気をつけさせるためコンパイラで問題部分をエラーにする方針のようだ。だから書くのが面倒で、数年間書いている人でさえ、そのメモリ操作に頭を悩ませると書いてあった。それって問題があるんじゃないのと思うけど、メモリリークとか二重開放とかダングリングポインタとかを、文法と書き方で防いでいるという事なのでしょう。




生産性から言うとRustはあまりよくないと言わざるを得ない。少なくとも趣味的に気軽にプログラミングしたいという人にはお勧めできません。前にGolangとRustは競合しているとか似ているとか言われたらしいんだけど、コンパイルで実行速度が速いという点以外はほとんど共通点はないように思えます。そう言い出した人は同じくらいのタイミングで、同じようなコンパイル言語くらいの認識しかなかったのでしょう。たぶん、文法的に同じようなところは、他の言語でも大して違っていないことが多いような気がします。

一番の違いはGolangがGCを使っていて、Rustはコンパイル時点でメモリを制御しているという事です。先に述べたように、Rustではコンパイルを通すのにも一苦労だし、その点Golangでメモリ上で引っかかる点はそれほどありません(高度になってくるとあるんでしょうけど)。Golangではたぶん関数の中で作った変数を参照で返しても文句言われないんじゃなかったんじゃないかな。ただ参照じゃなくてコピーされていただけなのかもしれないけど、Rust的に考えるとそんな大胆なメモリ操作は普通通るわけがないレベルではあると思うんだよね。

気軽にプログラミングしたい人はGolangを使うべきです。色々メリットがあるし、いろいろ直感的ではあります。細かいことに気を付けなくていいというのは、やりたいことに専念できるという意味でもあるので、やりたいことを実現するのにはうってつけだと思います。あんまり言語内の細かいことを気にするよりもそれで何ができるのかを考えた方が建設的だと思いませんか?

Rustは初心者にはお勧めできません。他の言語で考えなくてもいいことが大きな部分を占めているからです。例えばC++でオブジェクト指向を使わないという事はあまりないですが、やろうと思えばC言語のやり方でプリミティブな手続き型のプログラミングもできます。だけどRustはコンパイルが通るまで言語のクセを味わう事になります(主にメモリ部分)。それは本来のプログラミングでは本来的ではない部分のところではあって、それでいてどこにでも存在する問題の一つでもあります。確かにメモリ操作に関するところは、プログラミング言語の進化の一つでもあるんだけど、どれも一長一短でこれが最高で、何にでも使えますというものはないんだよね。

先の雑誌のところに書かれていたんだけど、Golangで書いていたプログラムがGCのせいでパフォーマンスが落ちてタイミングが取れなくなるために、GCのないRustで書き直したという例がある。確かにGCの処理で遅くなるとか止まるとかあるようだけど、そこまで気にするようなものを書く機会があるのかと考えると、そこはGolangでやっていて行き詰ってしまった時に考えればいいことで、最初からパフォーマンスうんぬんでRustを選ぶことはないんじゃないかと思ったりします(デバドラとかを除く)。

やっぱり実行時のパフォーマンスも大事だけど、コーディングする時の人間のパフォーマンスも考えるべきでしょう。というか、プログラムを何度も使ったり繰り返したりするのでは、実行時間が関係することもあるのでしょうが、そこまでシビアになる時ってあるのかなと考えます。それこそ、リアルタイム性が必要な時や、バッチで処理が重たくて少しでも早く終えたい場合など、わりと特殊な場面しか考えられないんですよね。

だからGCを積んでいるから遅くてGolangは嫌だという人は偏屈としか言いようがありません。競技プログラミングで少しでも時間を短くしたいとかならまだしも、Rustでコンパイラに怒られて修正する時間を使うくらいなら、Golangで一つでも便利な機能を付けた方がいいんでしょう。

ただこの先にあるWebAssemblyを今すぐ使いたいだとか、Linuxでドライバを将来作りたいとか、そういう目的があればRustでも全然OKです。今あるC言語代替の動きで、C/C++をいまさらやるのもなという人はそれはそれで積極的にやった方がいいです。一つ言語をやってしまうと、なんだかんだで詳しくならざるを得ない時が来るので、そこまで深くいくと別のところに行くのがしんどくなってしまう事もあると思います。それを考えると新しいパラダイムの言語を使うという意味もあるでしょう。

Golangはそこそこ仕事があるようになってきたみたいですが、Rustは大々的に人を集めているという話は聞いていません。自分の知らないところではあるのかもしれませんが、一般的ではないと言えるでしょう。だから仕事で使えるようになりたい言語を選ぶのだったら、PythonやJavaをやった方が飯のタネにはなるでしょうね。職業プログラマをしていくには、そこのところはシビアなのでマイナー言語にはまってしまったら仕事も選べないという状況にもなりかねません。

それは避けたいので、ニーズがある言語をやりたいという気持ちは誰にでもあると思います。完全に趣味的か大学とかで研究しているとかなら別ですけど、メジャーかどうかはわりと分かれ道になるとは思います。一時期COBOLしかできない人がたくさん出て、結局みんな営業側に回らざるを得なくなったという事もあったわけですから、プログラミングを長い間ガチでやっていきたいのなら、一つの言語にかじりつくというのは危険かもしれません。とはいえ、最近はWebアプリの案件も多いので、多言語でフルスタックな人材が求められたりはしているんですが、それだと多言語の習得は必須になりますね。




とりあえず、メモリ操作のために何でそんなことをしているのかという事はこの雑誌でわかりました。Rust自体の文法の解説はあまりないので、リファレンスとかを見ながら理解していくことになります。ただ、そこまで難しいサンプルコードは出てこないので、読み物としてさらっと読むこともできると思います。

Rustをやったことがない人はまずはパソコンに入れてコンパイルしてみてその偏屈さに辟易してから読んでもいいと思います。いきなり読んでも理解できないことはないですが、つまずいた後に見た方が理解が進むし知識的な滋養にもなります。

とりあえず、Rustを勉強するにあたって分厚い3000円以上の本を買うより、Webの情報とSoftware Designの記事を読んで、とりあえずすんなりコーディングできるようになった方がいい気がします。分厚い本はある程度、必要になってからでも遅くない気はします。Rustに飽きて放り出してしまうかもしれませんしね。


プログラミング言語Rust入門

プログラミング言語Rust入門

  • 作者: 増田 智明
  • 出版社/メーカー: 日経BP
  • 発売日: 2020/04/20
  • メディア: Kindle版




実践Rust入門 [言語仕様から開発手法まで]

実践Rust入門 [言語仕様から開発手法まで]

  • 出版社/メーカー: 技術評論社
  • 発売日: 2019/04/26
  • メディア: Kindle版



タグ:RUST
コメント(0) 
共通テーマ:パソコン・インターネット

コメント 0