Rustのしんどそうなところを見ていくつもり1 [プログラミング]
前にとりあえず書いていこうと思ったRustですが、やっぱり言語仕様も大事だと思い直して少し調べてみました。
・ムーブセマンティクス
元々C++の概念で、最初は不完全に実装されたんだけど、新しいのだとわりとサポートされているっぽい。
https://yohhoy.hatenablog.jp/entry/2012/12/15/120839
なんか参照渡しと何が違うのかよくわからないけど、結局こんなことが書いてありました。
やっていることは同じなんだけど、きちんと言語仕様の中に組み入れるということなんでしょう。そう言った意味では、null安全なOptionの扱いと同じことなんだろうと思います。
https://qiita.com/elipmoc101/items/3c8b6d8332a9019e578c#null%E5%AE%89%E5%85%A8
Appleの言語でSwiftがありますが、そのOptionalと同じものだと思われます。どっちが先かはわかりませんが、私が触れたのはSwiftの方が先でした。Nullのチェックを必須にすることでコンパイルの時にバグを防げるというところは、わざわざ言語的に組み入れるという点では似ている気がします。
こういう時の説明がわかりやすいように単純化しすぎて、ムーブセマンティクスのメリットもよくわからなかったりしましたが、関数の返り値をムーブセマンティクスで返すと他の最近の言語っぽく渡せるんだねと思ったりしました。
それとC++でのムーブセマンティクスとRustのものが同じかどうかはわかりません。今見ていきます。
https://qiita.com/myhr47/items/262b8b8f1edd8097d03c
書き方は違ってもそんなに違いはないみたいですが、所有権という概念はC++の方にはないのかもしれないですね。そもそもC++では今までの普通の渡し方ができるので、Rustほどギチギチに指摘するようなことはないようです。
というか、書くときはコンパイラに怒られるのがシンドいけど、問題のない動きをさせるのには役立っている、と言うことなんでしょうね。
これはチュートリアルサイトに書いてあるということで、再掲の再掲となりますが、まさにそういうことなんだろうと思います。Rustの変数に関する考え方をプログラマに強いていて、それをコンパイラで規定しているというわけでしょう。気持ちよく直感的に書くということよりも、制限をして動作に問題を発生させないようにしている事を優先している。
ちょっと面倒ですが、やっているうちにコンパイルエラーを避ける書き方を覚えるんじゃないでしょうか。これもガベージコレクションを使わないコーディングスタイルを維持するための方策なのかな? とりあえずメモリの操作の問題であることには違いない。
わりと当たり前な事なのかスコープとのからみを説明しているところがあんまりないなぁと思ったり。結局、所有権のありかってのはスコープのどこで有効かって事もあるんじゃないかと思うんだけど、違うかな(てきとー)。とりあえず渡してしまった後の変数にアクセスしようとすると、もう渡してしまったのでエラーが出るってことですよね。まぁそうした方がオブジェクトを使おうとしたのに消されたり、メモリが解放されているのに再度解放しようとしたりってことはなくなるのかもしれません。
・Null安全
これもムーブセマンティクスと同じように、今まであったものを仕組みを作って強いるタイプのものです。今度はNullが入るかどうかチェックする行動を必須とするというものですね。私はSwiftのOptionalで初めて出会いました。基本的にSwiftもRustのも同じものだと思います。多分やっていることは一緒。
https://qiita.com/elipmoc101/items/3c8b6d8332a9019e578c#null%E5%AE%89%E5%85%A8
ゼロはゼロとして、NullはNullとして扱うというのは真っ当なんだろうなと思ったり。Swiftでは面倒なので強制アンラッピングをしてコード的にすんなり終えてしまったりしていましたが、本当はいけないんですよ。というか、Optionalを導入した意味がないじゃんw。
同じようにRustでもきちんとNullチェックはしましょうねって話。結局これもコンパイラで事前に問題を取り除くというスタンスなわけで。コーディングをある程度強いることで、メモリの誤用を防いでいるということなんでしょうね。
・ムーブセマンティクス
元々C++の概念で、最初は不完全に実装されたんだけど、新しいのだとわりとサポートされているっぽい。
https://yohhoy.hatenablog.jp/entry/2012/12/15/120839
なんか参照渡しと何が違うのかよくわからないけど、結局こんなことが書いてありました。
さて、ここまでの説明から“「所有権の移動」なら普通のポインタ(T*)でも出来るんじゃない?”と疑問がわくかもしれません。はい。正解です!変数pからqへの所有権の移動は、ポインタのコピー+移動元のNULLクリアの組合せでもちゃんと実現できます。つまり「ムーブセマンティクス」という考え方そのものは、以前からある考え方であり、かつ実装パターン(イディオム)に過ぎないのです。
やっていることは同じなんだけど、きちんと言語仕様の中に組み入れるということなんでしょう。そう言った意味では、null安全なOptionの扱いと同じことなんだろうと思います。
https://qiita.com/elipmoc101/items/3c8b6d8332a9019e578c#null%E5%AE%89%E5%85%A8
Appleの言語でSwiftがありますが、そのOptionalと同じものだと思われます。どっちが先かはわかりませんが、私が触れたのはSwiftの方が先でした。Nullのチェックを必須にすることでコンパイルの時にバグを防げるというところは、わざわざ言語的に組み入れるという点では似ている気がします。
こういう時の説明がわかりやすいように単純化しすぎて、ムーブセマンティクスのメリットもよくわからなかったりしましたが、関数の返り値をムーブセマンティクスで返すと他の最近の言語っぽく渡せるんだねと思ったりしました。
それとC++でのムーブセマンティクスとRustのものが同じかどうかはわかりません。今見ていきます。
https://qiita.com/myhr47/items/262b8b8f1edd8097d03c
書き方は違ってもそんなに違いはないみたいですが、所有権という概念はC++の方にはないのかもしれないですね。そもそもC++では今までの普通の渡し方ができるので、Rustほどギチギチに指摘するようなことはないようです。
というか、書くときはコンパイラに怒られるのがシンドいけど、問題のない動きをさせるのには役立っている、と言うことなんでしょうね。
所有権がどのように機能するのかについてのプログラマのメンタルモデルがRustの実装する実際のルールにマッチしない
これはチュートリアルサイトに書いてあるということで、再掲の再掲となりますが、まさにそういうことなんだろうと思います。Rustの変数に関する考え方をプログラマに強いていて、それをコンパイラで規定しているというわけでしょう。気持ちよく直感的に書くということよりも、制限をして動作に問題を発生させないようにしている事を優先している。
ちょっと面倒ですが、やっているうちにコンパイルエラーを避ける書き方を覚えるんじゃないでしょうか。これもガベージコレクションを使わないコーディングスタイルを維持するための方策なのかな? とりあえずメモリの操作の問題であることには違いない。
わりと当たり前な事なのかスコープとのからみを説明しているところがあんまりないなぁと思ったり。結局、所有権のありかってのはスコープのどこで有効かって事もあるんじゃないかと思うんだけど、違うかな(てきとー)。とりあえず渡してしまった後の変数にアクセスしようとすると、もう渡してしまったのでエラーが出るってことですよね。まぁそうした方がオブジェクトを使おうとしたのに消されたり、メモリが解放されているのに再度解放しようとしたりってことはなくなるのかもしれません。
・Null安全
これもムーブセマンティクスと同じように、今まであったものを仕組みを作って強いるタイプのものです。今度はNullが入るかどうかチェックする行動を必須とするというものですね。私はSwiftのOptionalで初めて出会いました。基本的にSwiftもRustのも同じものだと思います。多分やっていることは一緒。
https://qiita.com/elipmoc101/items/3c8b6d8332a9019e578c#null%E5%AE%89%E5%85%A8
ゼロはゼロとして、NullはNullとして扱うというのは真っ当なんだろうなと思ったり。Swiftでは面倒なので強制アンラッピングをしてコード的にすんなり終えてしまったりしていましたが、本当はいけないんですよ。というか、Optionalを導入した意味がないじゃんw。
同じようにRustでもきちんとNullチェックはしましょうねって話。結局これもコンパイラで事前に問題を取り除くというスタンスなわけで。コーディングをある程度強いることで、メモリの誤用を防いでいるということなんでしょうね。
タグ:RUST
コメント 0