Rustとか言うダブスタ言語 (173レス)
1-

1
(5): 2024/10/17(木)08:07 AAS
値型と参照型で振る舞い変えるダブスタ言語だけど使ってるやついる?
2
(1): 2024/10/17(木)08:12 AAS
いる
3: 2024/10/17(木)08:13 AAS
>>2
どうやって心の整理つけてる?
俺はこんなクソ設計の塊みたいなダブスタ言語使いたくないって思っちゃったわ
4
(1): 2024/10/17(木)08:37 AAS
何がダブスタと思ってるのかわからない
何がわからないのかわからない
キミが使いこなせないのはわかった
がんばれー
5: 2024/10/17(木)08:46 AAS
一定の複雑さをオーバーすると発狂する低能
6
(1): 2024/10/17(木)12:46 AAS
>>4
だから値型と参照型でlet a = bの振る舞いが違ってくるでしょ
値型の場合bは再度使えるけど参照型の場合bはprintfでも使えない(コンパイルエラーになる)
同じコードで
let a = str bと
let a = String::bで比べてみたらわかるよ
7
(1): 2024/10/17(木)12:47 AAS
ちなみにわかってると思うけどstr型は値型でString::型は参照型なタコ
8
(1): 2024/10/17(木)18:42 AAS
所有権の考え方ってRustやるなら変数より前に習うぐらいじゃないの?
9: 2024/10/17(木)18:46 AAS
すまん文法間違えてた
正しくはstrは &str
String::bは std::string bだ
10: 2024/10/17(木)18:47 AAS
>>8
そのうえで値型と参照型で振る舞いを変えるダブスタ言語だなぁって思いました。
11
(6): 2024/10/17(木)18:49 AAS
これは値型だからこいつに代入しても使える~
こいつは参照型だからもうこの変数使わないどこ~
とかやってんだろうなw
12
(1): 2024/10/17(木)18:53 AAS
用途に応じて使う型を変えることの何がダブスタなんだろう・・・
13: 2024/10/17(木)18:54 AAS
単純作業で修行しなはれ
値を代入したり譲渡したり何なり
14
(1): 2024/10/17(木)19:06 AAS
値型なんてあったかな
プリミティブ型とは違うのか
15
(1): 2024/10/17(木)19:07 AAS
>>12
普通のプログラミング言語はちがうけど
値型だろうが参照型だろうが変数が使えなくなることなんて割と無い
16: 2024/10/17(木)19:07 AAS
>>14
それがいわゆる値型
メモリそのものに値が入ってるから値型
17
(1): 2024/10/17(木)19:08 AAS
>>15
所有権を移してるんでないか?
18: 2024/10/17(木)19:08 AAS
参照型はアドレスが入ってる
19: 2024/10/17(木)19:09 AAS
>>17
だからその所有権移したりコピーした値を渡したりダブスタだろって言う話
20
(1): 2024/10/17(木)19:12 AAS
所有権の管理を俺様ではなくたかがプログラム言語ごときが勝手にやるのが気に食わないっていうのなら言ってることはわかるけど
ダブスタと言われると意味が分からない
21: 2024/10/17(木)19:13 AAS
>>20
ダブスタだろ
値型と参照型で振る舞い変えるんだから
22: 2024/10/17(木)19:14 AAS
ここで言う値型が、所有権を失ったり失わなかったりコロコロ挙動が変わるならまあダブスタだけど
参照だって定義してるんならそりゃ動きも変わるだろう
23
(1): 2024/10/17(木)19:17 AAS
そこまで理解していて「わからない」とか言ってるのがわからない
24: 2024/10/17(木)19:26 AAS
>>23
いやなんで2つの振る舞いにしたの?ってなるくね?
値型もメモリコピーしないで参照型のように値渡したら開放するでいいじゃん
25
(1): 2024/10/17(木)22:33 AAS
Rustに値型と参照型という区別はないぞ
参照という概念はあるけど、これは &i32 なども作れるもので、「整数なら値型」といったものではない
どちらかというとC++に近い

let a = b でbが所有権を失うかどうかは、その型が「コピー可能かどうか」で決まる
26
(1): 2024/10/17(木)23:08 AAS
Rustでグラフィックやると面白い
まぁCでもC++でもいいけど
27: 2024/10/17(木)23:56 AAS
>>25
メモリコピーできるかできないかだろ?
でそのメモリコピーできるかできないかで変数の振る舞いを変えるの?
28: 2024/10/17(木)23:57 AAS
>>26
でもあれって結局DirectXラップするだけなのでは?
それともDirectXすら使わずに1から作るってことかい?
29
(2): 2024/10/18(金)00:06 AAS
例えばめちゃくちゃ誇張した表現にはなるが

fn main() {
let a=3.402823e+38;←便宜上float16の最大値とする(4byte)
Hoge(a);←Rustわかってないやつはここでaが移譲されたと勘違いする
let b=3.402823e+38;←もう一度使いたいがために宣言する
Hage(b);
.
.
.
}

こんな感じのことやってたらチリ積でメモリリークしてないか?(↑の例をだと8byteのメモリリーク)
aやbが解放されないから
30
(1): 2024/10/18(金)00:08 AAS
コピーするかしないかって相当重要なポイントだと思うんだけど
なんだろうWeb系ばっかやってるとそういうのどうでもいいと思うのかね?
31: 2024/10/18(金)00:14 AAS
>>30
いや重要なのはわかるけど変数に代入したあとは解放なりなんなりすればよくないか?
それか普通の言語のように記述を変えるか
let b = mcopy(a);
とかならだれも文句言わないけど
32: 2024/10/18(金)00:16 AAS
a.mcopy;とかでもいいよaはメモリコピーインターフェースを実装しているならこれが一般的な書き方になるか?
33
(1): 2024/10/18(金)00:17 AAS
だから型を変えることで記述変えてるじゃん?
他の言語の記法が絶対正義でRust固有のものは常に間違ってるっていうなら、それはもうどうしようもない
34: 2024/10/18(金)00:22 AAS
Rustの良いところってintやfloat,longなんかにbit数書いてるところだよね
あれたまにど忘れしちゃうときあるからみたらわかるの便利
35: 2024/10/18(金)00:25 AAS
>>33
記述は変えてなくね?
36
(1): 2024/10/18(金)06:24 AAS
>>29
RAIIでググれ
変数はスコープを外れたら寿命が尽きるからリークにはならないし、そもそもスタックとヒープの違いを理解してないと思う
37: 2024/10/18(金)07:28 AAS
所有権はメモリだけでなくリソース管理の問題でもある
ファイルハンドルなんかが良い例で、実態はせいぜい数バイトしかないからコピー自体にコストがかかるわけではないんだけど、ファイルというリソースに絡むから所有権の管理の対象になる
あるファイルへのアクセスを行う変数が同時に複数ある状態を許容しない、ということ

共有するなら Rc や Arc などの『シェアされてる』ことを示す型でのラップが必要だし、実際にアクセスする際に Mutex などでのガードが必要になる
これらをコンパイル時に制限することでバグを生みにくい設計にしようというのがRust的な考え方
38: 2024/10/19(土)00:29 AAS
全く見たことがない言語なんだ、なんか発狂している海外のエンジニアを見るとこの言語は大丈夫なのかとは思う
39: 2024/10/19(土)02:18 AAS
名前通りだよまったく
40: 2024/10/19(土)05:07 AAS
rustではコピートレイトが実装されてる型というのがあって、基本的にはプリミティブな型がそれに相当するの。で、それらはスタックに確保されるから解放しなくていいの。コピートレイトを実装出来る条件というのがあって、デストラクタが不要な物に限るの。解放しなくていいものだけ。わかりやすいでしょ?
41: 2024/10/19(土)07:17 AAS
ヒープに確保したらどんな型だろうが開放しないといけないのでは?
42: 2024/10/19(土)08:22 AAS
i32型ならスタックに確保される。
ヒープに確保したかったらBox<i32>で、それはもう別の型。なのでコピー出来ない。
43: 2024/10/19(土)08:47 AAS
わあわかりやすい
44
(1): 2024/10/19(土)09:07 AAS
デストラクト不要のプリミティブ型は小文字で書かれてて、それ以外の型は大文字で書かれてるでしょ。
一応その辺でCopyが出来るか区別つくようにはなってる。
45
(1): 2024/10/19(土)09:39 AAS
米ホワイトハウス「ソフトウェアはメモリ安全でなければならない」との声明を発表:「C」「C++」よりも「Rust」などのプログラミング言語を推奨
https://atmarkit.itmedia.co.jp/ait/articles/2403/18/news045.html

米国国防総省のDARPA、CからRustへのコード変換を自動化する「TRACTOR」プログラムを開始
https://atmarkit.itmedia.co.jp/ait/spv/2408/14/news045.html
46: 警備員[Lv.11][芽] 2024/10/19(土)11:35 AAS
>>36
だからmain関数で宣言してたらソフト終了するまでメモリ解放されないだろアホ
>>44
でもメモリコピーするクラスというか型は各々作れるよね?そのときどうすんの?
俺は素直に変数.mcopyで良いと思うが
47
(1): 2024/10/19(土)12:02 AAS
struct Point {
x: i32,
y: i32.
}

例えばこのようなPoint構造体を作ったら。それは新しい型であってデフォルトではCopy出来ない。

もしこの構造体の所に
#[derive(Copy,Clone)]
という指定を付けるとCopyトレイトが実装されるのでコピー出来るようになる。ただ慣習的には構造体は暗黙的にコビーされるのは良くないので、Cloneだけ実装して明示的にCloneしてねというのが推奨。
48: 警備員[Lv.11][芽] 2024/10/19(土)12:05 AAS
>>47
だったらはなから変数.mcopyでいいだろ
49
(1): 警備員[Lv.11][芽] 2024/10/19(土)12:06 AAS
それつけなかったらプリミティヴも移譲にするでいいじゃん
そっちのほうがはるかに神言語のそれだろ
50: 2024/10/19(土)12:10 AAS
let p1 = Point { x:100, y:200 };
let p2 = p1; // copy が実装されてる場合
let p3 = p1.clone(); // 明示的な clone
51: 2024/10/19(土)12:20 AAS
C言語から来た人は型をメモリのサイズで捉えてる人が多いよ。関数型言語で言うところの型というのは機能や文脈や制限や寿命やら色々な情報を含むもので全部区別すべきもの。これが凄い便利機能なわけ。
暗黙的な型変換をする言語は型の力を利用出来ないのでバグる。
52
(1): 2024/10/19(土)12:33 AAS
あと勘違いしてるかもしれないけど、プログラム上の変数のスコープの範囲と、実際の寿命の範囲は別物だよ。
Rustコンパイラは変数が使われている所を全て把握しているので用が済んだ変数はスコープ抜けなくても最適化で消されてる。
定数になるものなら変数の領域すら確保されない。
53: 2024/10/19(土)12:46 AAS
fn main() {
// 整数型
let a: i32 = 42;
let b = a.clone();

// 浮動小数点型
let c: f64 = 3.14;
let d = c.clone();

// ブール型
let e: bool = true;
let f = e.clone();

// 文字型
let g: char = 'A';
let h = g.clone();
}

明示的に書いたほうが分かり易いという人は全部 clone って書いてもいいんですよ。
54
(1): 警備員[Lv.11][芽] 2024/10/19(土)12:46 AAS
>>52
それ君らが嫌いなガベコレとなにが違うの?
55: 2024/10/19(土)12:51 AAS
ガベコレは用が済んだタイミングで即解放されるんじゃなくて、GCを走らせたタイミングで解放です。
なのでメモリを倍ぐらい余分に確保しとかないと足らなくなることがある。
56: 2024/10/19(土)15:46 AAS
無職ってすぐ人に聞こうとするよな
だから無職なんだろうけど
57: 2024/10/19(土)16:17 AAS
>>54
ガベージコレクション(GC)は
・「ガベージ=ゴミ=使われなくなったメモリ」がどんどん溜まっていく
・そのため実行中のあるタイミングで溜まってきたゴミをまとめて収集(コレクション)する
・ゴミかどうかは実行中に使われなくなったかどうかを何らかの方法で追跡して判断する
・このGCを判断実行できるように冗長なメモリ管理をすることとゴミが溜まるためメモリ消費量が多い
・これらの処理を行なえるようGCランタイムと呼ばれるプログラムが必ず内蔵される

このGCにメモリ管理を依存する言語がGC言語と呼ばれている
C/C++/Rustは依存しないため非GC言語
58: 2024/10/19(土)16:48 AAS
【GC言語】常に安全にメモリ自動解放されるがGCのため遅くてメモリ利用量も多い
【Rust】常に安全にメモリ自動解放されて速くて省メモリ
【C/C++】安全ではなく解放済み領域をメモリ参照してしまうことも発生
59: 警備員[Lv.12][芽] 2024/10/19(土)19:17 AAS
まぁどんだけ安全でもダブスタ言語なんて使いたく無いけどね
60: 2024/10/19(土)19:23 AAS
それは単に使わなければ良いだけじゃないの?
61: 2024/10/19(土)19:23 AAS
それは単に使わなければ良いだけじゃないの?
62: 2024/10/19(土)19:39 AAS
>>45
アメリカでは政府も国防総省もRust言語なんだね
63
(1): 2024/10/19(土)21:27 AAS
メモリの仕組み理解してからRustやろうね
できればCかC++やってから
64
(1): 警備員[Lv.13][芽] 2024/10/19(土)21:29 AAS
>>63
いや理解してんだわ
だからこそ同じ書き方で2つの振る舞いをするRustが嫌いなの
65: 2024/10/19(土)21:35 AAS
JavaやC#もそういうことはある
66: 2024/10/19(土)21:37 AAS
「本当に理解した?」
「はいっ!」←こういう新人いるよね
67
(1): 2024/10/19(土)21:44 AAS
こいつは何をダブスタって言ってるんだ?
68
(1): 2024/10/19(土)21:50 AAS
>>64
誤解してるんじゃないの?
Rustにはコピー可能型とコピー不可能型の2種類しかない
それを理解すれば振る舞いは常に一意に定まることがわかる
69: 2024/10/19(土)22:03 AAS
無職はほっとけよ
仕事してないんだから
70: 警備員[Lv.4][新芽] 2024/10/19(土)22:59 AAS
このスレには、僕のスッキリしない部分を言語化して説明してくれる人が多くて助かります
71: 警備員[Lv.14] 2024/10/19(土)23:29 AAS
>>67
移譲とメモリコピーで振る舞い変える
72
(1): 警備員[Lv.14] 2024/10/19(土)23:30 AAS
>>68
だから.cloneを明記しないと移譲になるでいいじゃん
73
(1): 2024/10/19(土)23:46 AAS
>>72
コピーとcloneは明確に異なると定められている
コピーはプログラマーが実装することはなくビットパターンごとサイズ分のメモリがコピーされる
cloneはプログラマーが自由に実装することができて例えばヒープ領域を持つデータならその部分も含めてコピーすることもできるしコピーせずに共有することもできてcloneは型毎に自由度がある
このようにコピーとcloneは明確に異なっている
74: 2024/10/19(土)23:49 AAS
コピーと同じ動作になるのはムーブ
どちらもプログラマーは実装することができない
ただしムーブはムーブ元の値が無効になるという点のみコピーと異なる
75
(1): 2024/10/20(日)02:08 AAS
ムーブとコピーで同じイコールを書くのが気に入らないって事かな?

所有権の移譲とか言うから分かりにくいんだと思う。「メモリ管理責任」が無いからコピー、有れば「メモリ管理責任」ごとムーブするだけ。

で、プリミティブ型はそもそも移動する意味がないしコピーの方が速い。

優先順位の考え方が逆で、イコールはコピー出来る型ならコピー、出来ない型ならムーブする。ムーブも出来ない型ならコンパイルエラー。で、エラーが出る場合は明示的にcloneを書いたりする。でcloneも出来ない型なら更に他の方法で対策する。
そうやって型で制約をはめる事で誰が書いても同じ挙動になるようにしている。
76: 警備員[Lv.14] 2024/10/20(日)03:27 AAS
>>73
じゃあなおさら変数.mcopyが必要だね
77
(2): 警備員[Lv.14] 2024/10/20(日)03:30 AAS
>>75
そうやって色々試して型探ってくよりはるかにプリミティヴ系も=のみの場合はメモリ解放して使えなくなるくらいのほうが楽だろ
コピーは上で言ってるように.mcopyを明示的に示せばいいだけ
78: 2024/10/20(日)04:25 AAS
>>77
なんか物事の捉え方がインタプリタと勘違いしてない?

コンパイラなんだからコンパイル時に全部処理されるのよ?
79: 2024/10/20(日)04:29 AAS
プログラム的な意味論とそれが最適化されて出力された後のコードの挙動まで解説しないと駄目なのかな?
80
(1): 2024/10/20(日)06:39 AAS
>>77
ムーブとコピーはプリミティブな相補的な動作なので
.move()や.copy()といったメソッド呼び出しは不可能
トレイトCopy実装型は常にコピーされ
Copy非実装型は常にムーブされる
Rustは非常にシンプルでわかりやすくなっている
81: 警備員[Lv.15] 2024/10/20(日)09:19 AAS
>>80
だからそれを同じ
let b = a;
let d = c;
で表現させちゃダメだろ
↑見てどっちがプリミティヴかわかるか?
82
(2): 警備員[Lv.15] 2024/10/20(日)09:20 AAS
低レベル言語やってるやつって保守のこと全く考えないのかな?
83: 2024/10/20(日)09:30 AAS
C#でいうと
var a = new Foo();
var b = a;

で a と b が同じオブジェクトを指す状態になるけど、これを許容しないのがRust
この場合は b だけが Foo に責任を持つべきで、そのためにaは所有権を無くす (「解放する」ではなく「所有権を移す」だけ)
これはメモリ使用量というよりも管理の問題で、「a の操作がbに影響を与える」ことによる複雑性を取り除くために厳しくしてる

var a = 1;
var b = a;

C#でもそうだけど、これはスタックメモリに積まれるもので、単に値コピーされる
これは関数を抜ければ解放される (GCのような機構を必要としない) し、C#でもaの書き換えがbに作用しないはず
Rustでもこれでaを使えなくする理由はないので単にコピーされる

Rustでもオブジェクトを共有する仕組みはあるけど、その場合は共有のための型 (Rc<T> のような型) を使うことになる
これは特にマルチスレッドの場合に有用で、スレッドを跨いで共有されるオブジェクトは「ロックをかけないと内部の値にアクセスできない」型で包まないとコンパイルエラーになる仕組みがある
これは個人的にすごく便利だと思う部分で、Rustだと安心してコードを書ける感じがする
84
(1): 2024/10/20(日)09:41 AAS
C#でも
var b = a;
でbがaと同じオブジェクトを参照するかコピーされるかは型に依存するでしょ
85: 2024/10/20(日)09:46 AAS
【結婚難】金稼ぎ共働き妨害するな【孤独死】

☆犠牲になるのは犯罪幇助SEの結婚相手☆

実態派遣で非婚や離婚や中絶や少子化や親不孝を促進

・キモい
・モラルない
・ファッションセンスない
・コミュニケーション苦手
・時間外労働違反で共働き妨害
・泥棒客先に開発報酬を奪わせる
・泥棒客先に知的財産を奪わせる
・裁判官が技術判断不正をする

SEは多重派遣の料金詐欺は非婚
https://codelearn.jp/articles/about-engineer-marriage
86: 2024/10/20(日)09:55 AAS
>>82
保守性は言語でなく開発者や組織のレベルの問題
あえて言語の特徴を書くなら、OOP言語だとクラスのフィールドに参照型の値がある場合に、それが他のクラスと共有されるものであるかを知る方法がないけど、Rustはそれが明確という利点がある

struct Foo { a: T } のTがStringならこれはFooの中に閉じ込められてるし、Rc<String> なら他と共有される (ただしスレッドは跨がない) し、Rc<Mutex<String>> なら複数スレッドから共有されるかつ書き換わる可能性があることを意味する

そのために面倒な部分があるのは確かで、C#やJavaは逆にそれらを簡略化してるともいえる
87
(1): 2024/10/20(日)10:41 AAS
>>82
Rustの保守性がこれまでの言語と比べて格段に保守性が高く優れているのは様々な仕組みで実現されている
例えばRustのデータ参照競合の防止機構やデータ競合の防止機構は保守においてそれらによるバグ混入を確実にコンパイルエラーとして検出する
88: 2024/10/20(日)11:20 AAS
初学者がコードを見た時のとっつきにくさはあると思う
けどこれは simple vs easy みたいもので、Rustは難しいけど仕組みを理解すればシンプルではある
89: 警備員[Lv.16] 2024/10/20(日)12:59 AAS
>>87
だからわざわざそれをコンパイルエラーで確認するのかって話になるだろ
>>84
でもaは使えなくならないよね
90
(1): 2024/10/20(日)13:05 AAS
>>1
値型と参照型って何のこと?
Rustは全ての型に対して値と参照の両方があるよ
もしプログラマーがそれらを取り違えばコンパイルエラーとなるから問題は起きないよ
まずは正しい現状認識をしてから批判しようね
91
(1): 警備員[Lv.16] 2024/10/20(日)13:19 AAS
>>90
だからわざわざコンパイルエラー確認しましょうってことだろ?
どっち使ってんのかわかんないから
どっち使ってるかわかんねぇからコンパイルエラーで確認しましょうってそんなスマートか?
俺なら無理
92
(1): 警備員[Lv.16] 2024/10/20(日)13:20 AAS
普通の人間ならコンパイルエラーで確認するより書かれたプログラムの中身見て判断できるようになったほうがいいよねってなると思うよ
それがいわゆる可読性というやつや
93
(1): 2024/10/20(日)13:33 AAS
>>91 >>92
型の違いなどはどの言語もコンパイル時にエラーか実行時にエラーとなる
もちろんRustのようにコンパイル時にエラーとなる言語の方が優れている
1-
あと 80 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.025s