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
Twitterまとめ投稿 2020/03/05 [Twitter]
carbonhydratRT @tigerszk: サイバーセキュリティ関係法令Q&Aハンドブック[みんなでしっかりサイバーセキュリティ] https://t.co/Xn4eZagjfL NISCからサイバーセキュリティ対策において参照すべき関係法令を解説するハンドブックがリリースされたみたいです。ま…03/04 06:31 carbonhydratRT @ipusiron: 「プログラミング教育を受けた子供」と「独学でPCを学んだ子供」???〓 https://t.co/uvPf7pBdr403/04 06:32 carbonhydratRT @tekina_osamu: 一部の安倍支持者、自称保守が「安倍に騙された」と騒ぎ出しましたね。気づくのが遅いというか、過去20年この繰り返し。壊国に加担したという自覚もないのでしょうけど。恥知らずですね。03/04 19:02 carbonhydratRT @nachi_yanase: 「ソフトバンク光を解約する」ってボタンを押したら「解約するとこんなデメリットが起きますよ!」みたいなページが4種類ぐらい表示されて、それで解約するを押してたら最後に「ソフトバンク光の解約はお電話でのみ受け付けています」と出て終わったので、絶対…03/04 19:03 carbonhydratまぁ大体見間違いか病気だよね。 https://t.co/md2h6zZVms03/04 19:05 carbonhydratRT @pentaxxx: この事実を知りつつ苦笑で看過していた周囲の職員も含めて地獄。あ、地獄じゃなくて「兵庫錦秀会神出病院」でした。03/04 19:06 carbonhydratRT @akihiro_koyama: 同級生がTikTokとかやってる横で朝日新聞への投書をしたためる小学生、リアルに想像すると本当に悲しい気持ちになるし、どうかオッサンオバサンのなりすましてあって欲しい。03/04 19:11 carbonhydratRT @chigusasoichi: 東洋系の顔立ちなので街で新型コロナ関連の嫌な言葉を投げ掛けられることもある、とアラブ人の友達に言ったら「気持ちわかるよ、俺らも欧米に行ったら中東系の顔ってだけでテロリスト呼ばわりされるから」って言ってて、もっと優しくなれ世界、って思ったし、…03/04 19:13 carbonhydrat嘘でしょ!?チョークとは思えない「鬼滅の刃」超絶アート 卒業生たちの思い出に…描いたのは高校の先生 https://t.co/zSPsNb9hmJ 良い先生だ。これなら尊敬できるな03/04 20:29 carbonhydrat10歳の少女は隠語として「コールスロー」などを使った性的なメッセージを10代の少年よりも高い頻度でやり取りしている - GIGAZINE https://t.co/2sWY4XB8Xs まぁ男より早く子供産める体になるし、そういう… https://t.co/is0SV2XMvk03/04 20:38
2020-03-05 05:01
コメント(0)