SSブログ

Rustのしんどそうなところを見ていくつもり3 [プログラミング]

Rustの勉強記事ですが、公式チュートリアルを見てそこに突っ込んでいくスタイルはやめにして、気になるトピックをググってつまみ食いすることにしました。と言いつつ、公式チュートリアルに戻ったりしていますが気にしないw。

 
●所有権
 
https://qiita.com/cactaceae/items/2c70a9947364c60ec100

所有権に関してはわかりやすくまとまっていますね。きちんとダメなパターンを網羅しているのが良いですね。

・変数を束縛(代入)すると元の変数はアクセスできなくなる
・参照は幾つでも作れる
・mutableは一つだけ

わかりやすい。だけど、参照はいくらでも作れるっていうのはちょっと意外だったなぁ。所有権の印象から参照も制限されるんじゃないかと思っていたけど、実はそうでもなかったという。ただ実体となるデータのありかは一つで、普通の代入だとコピーされずにムーブセマンティクスで渡される。

しかし、参照でどこからでもいじれるんなら、ムーブセマンティクスとかで厳密に所有権を明示しても意味が薄れるんじゃないかなぁと思うんだけど…。まぁそこのところは上手くいっているんでしょう。まぁできるっていうんだから、副作用は少ないんでしょうね。というか、そんなに参照って作るもんでもないしな。わりとどこからでも中身を見られるけど、変更は一つのところしかできないということですね。

ゼロコストと言われていますが、実行時のコストゼロなんだろうし、コーディングするときに人間がコンパイラに怒られるというコストがあるわけですよね。まぁJavaにはポインタがない的なことと同じのような気がする。





●トレイト、静的ディスパッチ、動的ディスパッチ

既存の概念を知っている人は入りやすいのだろうけど、知らない人はなんのこっちゃです。ただトレイトなどは他の言語とは微妙に違うらしいので、Rustで初めて見る方が理解がすんなり行くかもしれません。というわけで、初めてみていきます。


公式(?)ドキュメントを読むと訳がわかりませんw。

https://doc.rust-jp.rs/the-rust-programming-language-ja/1.9/book/trait-objects.html

コードがポリモーフィズムを伴う場合、実際に実行するバージョンを決定するメカニズムが必要です。 これは「ディスパッチ」(dispatch)と呼ばれます。 ディスパッチには主に静的ディスパッチと動的ディスパッチという2つの形態があります。 Rustは静的ディスパッチを支持している一方で、「トレイトオブジェクト」(trait objects)と呼ばれるメカニズムにより動的ディスパッチもサポートしています。


ん??? ポリモーフィズムってなんだったっけ。オブジェクト指向を勉強した時に見た気がするけど、改めて何かと言われると語れない。というか、説明の時に説明なのに、その中に説明が必要な言葉が出てくると嫌になるよね〜。

https://jpazamu.com/object-polymorphism/

あ〜、オブジェクトのインスタンスによって、同じ名前のメソッドを使っても違う動作をするってことかね。どのオブジェクトに対しても同じ操作でいいので、使う時に直感的であるとともに、まとめて処理することも可能だということらしい。僕的には使う時のダックタイピング的な考えしかなかったんだけど、それよりも効率の方が大事ですね。

メソッドを使う時に内部的に違うものを呼ぶことになる訳ですが、その時の仕組みがディスパッチということらしい。dispatchの英語の本来の意味としては、派遣するとか送るとかいう意味ですね。静的ディスパッチが基本らしいですが、動的ディスパッチもできるということらしい。

https://rustforbeginners.hatenablog.com/entry/zero-cost-abstraction

結局ディスパッチは、同じ名前のメソッドの挙動を割り振る時に送り込む方向を決める際に、静的にコードを置いちゃうか、動的に臨機応変に場所取りをするか、というところなんだろうと思う。トレイトを使っても基本的に静的ディスパッチなんだけど、場合によっては動的ディスパッチで対応できますよということらしい。


前後しますが、トレイトっていうのは
トレイトはRustにおいてインターフェイスを記述する唯一の概念である

ってことで、C#とかJavaのいわゆるインターフェイスですよね。実際の実装とは別に宣言しておいて使うものかと思っていますが間違いじゃないですよね。でも実装もできるみたいで、今までの考え方からすると何がしたいのかよくわからない…。

ゼロコスト抽象化とは、抽象化に関して理想的な量しかコストを払わないということです。Rustのトレイトでは、静的ディスパッチによって一切の抽象化コストを払わなくていいし、しょうがなく払う必要がある時にはコストを払って動的ディスパッチによって書くことも出来ます。これは、動的ディスパッチしかない言語に比べて、抽象化のコストが低いことを意味していて、それが理想的な量なので、余計なコストが「ゼロコスト」だと言っているということです。

ゼロと言ってる割には、動的ディスパッチを使っている時点で、意味的には最小コストの方が合っていると思われます。なんかこういう誇大広告みたいなのは嫌なんだよね。基本的に使うにあたってゼロコスト抽象化が何かは理解する必要はないかもしれないですね。





●Rustが使われる分野

よくGolangと比較されるみたいですが、全然守備範囲が違いますよね。RustがC/C++言語でやっていたシステム開発の範囲を得意とするのと、GolangがGCを使って並列処理をするのを得意にするのと、やれる範囲が違う。

Golangだとファイルサイズがデカすぎるし、システム開発をするにはあまりGCの仕組みはそぐわない。RustでGolangができることもやれるけれど、Golangほど考えないで書ける訳じゃないし、初見でサンプルを見てスラスラ書けるレベルの言語ではない。

大雑把にいうと、気軽にかけるか否かということだと思う。その点ではRustはあまりお手軽な言語とは言い難いし、逆によく考えて作り込めば面倒なことをやっただけ解決できることも多いということだろう。


これから使われる分野としては

・ローレベルなシステム開発
・WebAssemblyでのWeb系

が主で、Rustで書き慣れた人がその他の分野に進出するかもねというところ。結局、C/C++の分野の代替+αだよね。ただC/C++は今まで使われ倒してきたので、その分の貯金みたいなものはあると思うので、すぐに入れ替わるということはないと思う。だけど、もはや危険な部分が多いC/C++を使い続けるよりも、Rustを使い始めた方がいいのは目に見えている。

ただまだRustは言語仕様として完全に固まっていないところがあるんだよね。エラー処理とかはかなり微妙な感じだし、その他のところも破壊的な変更を前提に開発されているというところが安心して使えるという感じはしない。やはりC/C++の枯れた部分はそれなりに評価されるべきところもあるかもしれない。というか、Rustはまだ流動的なので脆弱性がどうとかいうところまでには至っていない。

まぁそこまでいけばもうC/C++の代替に近付いたってことなんだろうけど、まだ大きなプロジェクトは言い出しっぺのMozillaぐらいしかないだろうし、そのうち増えてくるんだろうけど使う人が増えない限りは盛り上がらないよね。ただJavaみたいに全部の覇権を取る、みたいな野望はないみたいなのでそこのところは良かったかな。結局Javaは局所的にしか使われなかったし、Rustもそうなるんだろうと思う。

正直、広い使われ方はしないだろうと思うけど、それも熟してくるとわかんないけどね。他の言語を勉強するのを嫌がって、なんでもRustを使いたがる人も出てくるだろうから。プログラミング言語はコンパイル言語あり、インタプリタ言語あり、で色々あって成り立っている訳だし、全部一つで済ますとかいうことは絶対にないだろうし。ポテンシャルは高いけど、人に対する負荷が高いという点に於いては、ホビー的に使う人は競技プログラミングの人ぐらいなのかなと思ったりもする。お手軽と言うには程遠い気はする。少なくとも最初に学ぶ言語としては向いていない。


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

コメント 0