Rustとか言うダブスタ言語 (173レス)
上下前次1-新
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
1(5): 2024/10/17(木)08:07 AAS
値型と参照型で振る舞い変えるダブスタ言語だけど使ってるやついる?
93(1): 2024/10/20(日)13:33 AAS
>>91 >>92
型の違いなどはどの言語もコンパイル時にエラーか実行時にエラーとなる
もちろんRustのようにコンパイル時にエラーとなる言語の方が優れている
94(1): 2024/10/20(日)14:06 AAS
Rust書いた事ない人が言いそうな事だな。
vs-codeなりなんなりでコード書いてればコンパイルするまでもなく書いてるそばから rust analyzer が間違いを指摘してくれるのに。どう直せばいいかも細かく出てくるよ。
95: 2024/10/20(日)14:26 AAS
>>93
実行時エラーが出るまでわからないプログラミング言語はその仕様が静的にエラーを指摘できない言語仕様になってるからな
例えばC/C++のサニタイザーも実行させて問題が発生した時に初めてコードに問題があることがわかる
実行前に静的に様々な問題が判明できる最先端の言語はRustで間違いない
96: 2024/10/20(日)16:04 AAS
プログラム板のRustスレにいる人が出張してきてるね
97(1): 警備員[Lv.16] 2024/10/20(日)16:28 AAS
>>94
それIDEが無いと無理でしょ
98(2): 警備員[Lv.16] 2024/10/20(日)16:30 AAS
ふつうにコピーして渡してるのか参照で渡してるのかくらいプログラムのコード見て分かるようになったほうが遥かにいいだろ
Rust信者は盲信してるだけで普通の感性が全くない頭悪い人間ども
99: 2024/10/20(日)16:45 AAS
>>98
実際にプログラミングをすればわかる
ほとんどのムーブは関数呼び出しの引数や返り値に表れる
そしてほとんどの関数の引数はムーブではなく参照を受け取る
つまりムーブで渡してしまう関数は限られた特殊なものだけなのだ
レアケースなのですぐに意識できるため困る人が出現していない
100: 2024/10/20(日)16:48 AAS
>>97
普段コード書くのに何のエディタ使ってるんだよ。今時、emacsでもvimでもrust analyzer使えるぞ?
もし Langurge Server Protocol に対応してないエディタ使ってたらそれがこそプログラム書いてない証拠。
101: 2024/10/20(日)16:57 AAS
rustfmtとclippyとrustcだけがあれば十分
LSPは補助輪として優秀だが必須ではない
むしろLSPに依存しないとコーディングできなき人は下に見られる
102(1): 2024/10/20(日)17:00 AAS
>>98
Rustでは必ず区別がつきますよ
参照で渡すときは「&変数名」となります
まずは基本知識を身に着けましょうね
103(1): 2024/10/20(日)17:42 AAS
C#でもIDEが無ければ
var b = a;
のコードが参照なのかコピーなのか分からないんだが
int b = a; のように型を付ければ分かるのはRustも同じで、 let b: i32 = a; と書くこともできる
104(2): 警備員[Lv.17] 2024/10/20(日)19:34 AAS
>>102
いやポインタ渡してんだから移譲が参照渡しだろうが!
105: 警備員[Lv.17] 2024/10/20(日)19:35 AAS
>>103
参照かコピーかわからなくてもaはその後も使えるけどな
106: 警備員[Lv.17] 2024/10/20(日)19:37 AAS
俺が言ってるのはコピーか参照かわからんじゃなくてどっちがその後でその変数が使えるかわからんだ
どっちも使えなくすればそれでいいんよ
で.mcopyがあればそれはそのあとでもつかえるよって簡単にわかっていいよねって話なんだが
でなんでそれをやってないかというとそういうの考えずに作った欠陥言語だからってわけ
107: 警備員[Lv.17] 2024/10/20(日)19:38 AAS
おれがダブスタって言ってるのは常にこのことについて言ってんだわ
108(1): 警備員[Lv.17] 2024/10/20(日)19:39 AAS
IDEでデバッガー使って>>11これをやってんのがお前ら
わかる?
109(1): 2024/10/20(日)19:42 AAS
>>104
ムーブは参照渡しではありません
ムーブは値渡しです
コピーも値渡しです
ムーブとコピーは元が残るかどうかの違いだけで同じカテゴリに属します
110(2): 警備員[Lv.17] 2024/10/20(日)19:46 AAS
>>109
ムーブが値渡しぃ?
大量のデータわざわざコピーしてんの?
111: 2024/10/20(日)19:52 AAS
>>104
移譲はポインタ渡しをしない
以下は生成コードレベルの話になるが
関数へ引数を渡す時に
移譲でもコピーでも小さい値(例えば64bitのLinux環境なら48バイト以下)ならばレジスタ(最大6個使用)で関数に渡される
移譲でもコピーでも巨大な値ならば最適化によりポインタ渡しになる
つまり移譲とコピーは全く同じ
112: 2024/10/20(日)20:04 AAS
>>108
C#から来るととっつきにくいかもしれないけの、C++をやってた人は割と入りやすいし、学んだ言語による慣れの問題だと思う
&記号の意味もC++に近いし、ムーブもC++にある概念だし
113: 2024/10/20(日)20:23 AAS
>>110
ムーブもコピーも値渡しなので関数へは基本的にレジスタ群に値を入れて渡されるよ
例えば以下の例
// ムーブされる構造体例
struct MovablePoint { x: i64, y: i64, }
// コピーされる構造体例
#[derive(Copy, Clone)]
省4
114: 2024/10/20(日)20:27 AAS
>>110
雑にいえばポインタだけコピーする感じ
10万文字の文字列を扱う場合でも、大抵は文字列はヒープに確保されて、スタックにはそのアドレスや文字列長などの管理用のデータだけ置かれる
ムーブする際はその管理用のデータだけコピーするので、巨大な文字列のコピーは起こらない
ムーブした後はヒープのデータの所有権 (解放の責務も含む) がムーブ先の変数に移すので、ムーブ前の変数はそれを使えなくなる
ファイルハンドルなんかも同じで、解放などの責務を持つリソースについて気軽なコピーをさせないよう制限してる感じ
115: 2024/10/20(日)20:38 AAS
1みたいなこの手の無能はほぼレジスタの知識がない
バイナリレベルを学んでないから話が噛み合わない
116: 2024/10/20(日)20:48 AAS
Rustはメモリ周りを意識させられる言語なのはその通りなので、そこは受け切れざるを得ない
そこまでの効率性を求めない分野だったらRustである必要もないので、素直に他の言語を使うのも選択肢だと思う
(個人的にはリソース管理だけでなく、型表現の豊かさなどRustの利点は他にもあると思ってるけど)
C++やってた身からすると、C++で踏みがちな罠に繋がる道がほとんど塞がれてる感じで、それがかなり有用なのよ
117: 2024/10/20(日)22:04 AAS
Rustは非常にシンプルでこの3つしかない
・ムーブ値渡し
・コピー値渡し
・参照渡し (値への参照が渡される)
Rustはレジスタのない環境(例: Wasm)にも対応しているのでレジスタを意識する必要はない
(むしろ環境指定してる場合を除いてレジスタを仮定してはいけない)
参照とアドレスはイコールではない
省2
118(1): 2024/10/20(日)23:54 AAS
結局>>1が自己中に勝手な妄想で勘違いしてイチャモンつけていただけだったな
119(1): 2024/10/21(月)00:19 AAS
なんだかプログラム学習で変数という概念に引っかかっている人を相手しているみたいな気分だな
Rust書いてる人的にはひっかかる要素がなさすぎて、たぶん1が一体何にひっかかってるのかすら誰もわかってない
120: 2024/10/21(月)00:31 AAS
あいつは世間知らずのC#教で何かにケチつけたいだけの人間ですから
121(2): 警備員[Lv.18] 2024/10/21(月)02:03 AAS
Rust信者ってメモリのアドレスを渡す事を参照渡しって言わないんだね
メモリのアドレス渡すから参照渡しなんだろ
122(2): 警備員[Lv.18] 2024/10/21(月)02:05 AAS
>>118
いや妄想では無いよね
プリミティヴ型と普通の型で振る舞い変えるのは事実だろ
俺はそれについてダブスタと言ってんの
事実を捻じ曲げて自分が勝ってるように見せるのやめてくれな?
123(1): 警備員[Lv.18] 2024/10/21(月)02:06 AAS
>>119
とかいうおまえも>>11こういうことやってんだろうなぁw
デバッガーに頼らないといけない言語だもんなぁ
124: 警備員[Lv.18] 2024/10/21(月)02:12 AAS
引っかかる要素無いのはお前が何も考えずにRust使ってるからなんじゃないの?
普通の感性してるなら同じ宣言してるのに振る舞い変えるなよって思うが
125: 2024/10/21(月)02:36 AAS
>>121
値自体のデータを渡すことが値渡し
値への参照データを渡すことが参照渡し
値が固定長ならば参照データはアドレスのみ
値が可変長ならば参照データはアドレスと長さ
値が動的型(dyn Trait)ならば参照データはアドレスとその実型用vtable(を指すアドレス)
それぞれの状況に応じてそれら参照データが渡される
126: 2024/10/21(月)02:50 AAS
fn main() {
// copyの例
let x = 5;
print_value(x);
println!("After value passing: x = {}", x); // xは依然として使用可能
// 参照渡しの例
let mut y = String::from("hello");
省12
127: 2024/10/21(月)03:04 AAS
普通は関数呼んだあとも変数使える方が便利だしそのようにするのよ。参照で渡せる場合はそうする。
逆にムーブが発生する場合は意図的に所有権を渡している。その違いは関数見りゃ解るし、引数の型見ればわかる。
128: 2024/10/21(月)03:25 AAS
>>121
例えば文字列(str)への参照を受け渡す場合
アドレスだけ渡されても長さがわからなければ意味ないでしょ
可変長サイズのデータの参照はアドレス+長さになります
常識的に考えればわかるよね
129(1): 2024/10/21(月)03:31 AAS
>>123
その>>11を見たらめちゃくちゃデタラメで意味不明な書き込みだぞ
>これは値型だからこいつに代入しても使える~
>こいつは参照型だからもうこの変数使わないどこ~
>とかやってんだろうなw
130: 2024/10/21(月)03:56 AAS
>>1さんは参照がムーブすると思い込んでる病気なのよ
131: 2024/10/21(月)05:13 AAS
LSPとデバッガの区別も付いてないし。プログラミングしてないのは明らか。
132(1): 2024/10/21(月)05:22 AAS
>>29
例えばこの例で書かれたような拙いプログラムでも別にいいのよ。どうせコンパイラが最適化して重複削除するから変数領域すら確保されない、実際copyされるわけないし、スタックでリークする要素全くないし。
何を心配してるのか分からん。
133: 2024/10/21(月)05:53 AAS
あー変数への代入と束縛の違いもわかってなさそう。
rustのletは代入じゃなくて束縛ですよ。
ムーブしたなら同じアドレスに対する名前がつけ変わるだけですよ。
134: 警備員[Lv.18] 2024/10/21(月)07:14 AAS
>>129
すまんどこがでたらめなんだ?
お前らがデバッガー見てやってることだけど
135(1): 警備員[Lv.18] 2024/10/21(月)07:24 AAS
>>132
だからさぁ
メモリリークしちゃうのが問題なんじゃなくてこんな拙いクソコードを書く可能性があるって話してんの
わかる?
136(1): 警備員[Lv.18] 2024/10/21(月)07:27 AAS
でそれを回避しようとするにはデバッガー見て
>>11をしないといけない
なんならlet a = 3.402823eの場合はプリミティヴ型だからコンパイルエラーは出ない
だからいちいち割り当てていかないと上のような訳のわからないコードを描いてしまうことになる
137(1): 2024/10/21(月)08:38 AAS
>>122
>>プリミティヴ型と普通の型で振る舞い変えるのは事実だろ
そんな事実はない
そもそも普通の型なんていう分類はない
何を言いたいのか?
138: 2024/10/21(月)08:43 AAS
他の言語とは違って
Rustではデータ競合も参照競合も発生しないため
意図せずデータが書き換わってしまうことが発生しないので
デバッガーのお世話になったことが一度もない
>>136
デバッガーなんてRustで使わないので
あなたの文章の意味がわからないです
139: 2024/10/21(月)09:00 AAS
>>135
メモリリークしない事は理解できたのね。
心配はなくなったね。
仮に拙い書き方でもコンパイル出来たら出てくるコードは最適化されてて正しく動くんだから問題ないよね。むしろ優秀だよね。
140: 2024/10/21(月)09:03 AAS
Rustの前に、自分が本当に伝えたいことを整理する日本語コミュニケーション能力を学んだほうがいい
主張の正当性の前に、何言ってるかすら誰にも伝わってないのはわかるだろう
141: 2024/10/21(月)12:44 AAS
そりゃ無職だからなあ
142(1): 2024/10/21(月)15:59 AAS
>>1
>>値型と参照型で振る舞い変えるダブスタ言語だけど使ってるやついる?
参照ではない値の型をTとして
その値の参照の型を&Tとすると
値Tと参照&Tで振る舞いが異なるのは当たり前じゃないかな?
値そのものとそこを指す参照(アドレスなど)に違いは必ず出るよ
何を言いたいのか主張がよくわからないね
省3
143: 2024/10/21(月)21:34 AAS
>>11についていえば、参照に&付けるのはC++もそうだよ
// aに巨大なデータが格納されてるとする
auto a = vector<uint8_t>();
auto b = a; // コピー
auto& c = a; // 参照
auto d = move(a); // ムーブ, これ以降aやcは使用不可
&を付けないと巨大なコピーが行われるので、C++開発者は気を付けて書く必要がある
省4
144: 2024/10/21(月)21:34 AAS
更に言えば、C++だとムーブ後の変数を使ってもコンパイルエラーにならず実行時に問題を引き起こすので、使うのに注意が要る
デフォルトがコピーなのは安全だけど、意図せぬパフォーマンス低下を引き起こしやすい
(「ムーブは可能だけどコピーは不可能なクラス」を作る方法もある)
Rustはムーブ後の変数の使用をコンパイルエラーにした上でデフォルトをこちらにして、コストのかかるコピーを明示が必要にするという考え
145: 2024/10/21(月)21:40 AAS
なので >>11 は自分の知ってる言語に無い概念を理解しようとすらしてないだけだと思う
Cしか知らない人がOOP言語の入門書を読んで「クラス」の章に文句言い続けてるようなのと変わらない
146: 2024/10/21(月)21:55 AAS
これはRustがどうとかじゃなくて、GCがある言語とそうでない言語の違い
GCのある言語の方が簡単なのはその通りなので、メモリ周りの詳細を気にしたくないなら素直に他の言語を使った方が良い
世の中の多くのプロジェクトはそれで十分なはず
147: 2024/10/21(月)22:03 AAS
CPUリソースもメモリリソースもGC言語はムダに消費してしまいます
GC言語を使うと速いマシンが必要になったり複数のマシンが必要になったりします
クラウド利用の場合も利用料金が高くなってしまいます
GC言語は電気代の面でもムダでありCo2排出量も増やすことになりふさわしくありません
148: 2024/10/21(月)22:06 AAS
C++でも「これは&を付けないと無駄なコピーが生じるな」「これはムーブ済みだから使ってはいけないな」とかを気を付けて書いてたんだよ
&を付け忘れて無駄なコピーが生じても、ムーブした後の変数に誤ってアクセスしても、C++コンパイラはそれを指摘してくれない
Rustのコンパイラはこれらをエラーにしてくれるし、エラー原因を示すメッセージも丁寧だから、この点はC++よりもずっと分かりやすい
149(1): 警備員[Lv.7][新芽] 2024/10/22(火)12:28 AAS
>>137
事実はあるだろ
プリミティヴ型とプリミティヴ型ではない型でそれぞれ
let b=a;
をやった時println(a);が出来るのと出来ないのがある
これを振る舞いが変わらないとはならない
>>142
省1
150(2): 警備員[Lv.7][新芽] 2024/10/22(火)12:29 AAS
let b = a;
をすると一律でaが使えなくなるならそれでいいんだよ
だけどこのダブスタ言語はaが使えなくなるときとaが使える時両方あるってのが問題
いっそのこと値型であろうとメモリ解放してやればいいんだよ
なんのためにこのメモリをブロック終了まで保持してんだ?
151: 警備員[Lv.7][新芽] 2024/10/22(火)12:30 AAS
移譲で使えなくなるのが問題無いなら値型も使えなくなって問題ないだろ
152: 2024/10/22(火)13:12 AAS
>>149
デタラメはよくないですよ
Rustは大きく分けると2種類の型があります
・Copyトレイト実装型 (Copy型)
・Copyトレイト非実装型 (!Copy型)
前者はプリミティブ型であるi32やf64やcharなどだけでなく
std::fs::FileTypeやstd::net::SocketAddrなどもCopy型です
省3
153(1): 2024/10/22(火)13:27 AAS
>>150
ブロック終了までメモリ確保してるってのが間違いって何度も言ってるのにまだわからないの?プリミティブ型で開放するメモリなど最初からないってのよ。
ましてや定数ならそもそも変数領域さえ作らない。
ムーブがデフォなんじゃなくて、コピーが基本でコピーが出来ない型だけムーブなの。c++みたいにムーブの時だけmoveって書く仕様なら納得するの?
そうなったらそうで絶対文句言うのよ。イコールって書いたらコンパイルエラーが出たとか、moveって書いてもムーブ出来ない時があるってね。c++でムーブセマンティクスが流行らなかったのはそれだからね。
154: 2024/10/22(火)14:08 AAS
ダブスタっていうなら、それこそC++の
「ムーブするかコピーするかを決めるのはコンパイラ様だ!
人ごときがstd::moveとか書こうが無視してコピーしてやる!エラーも警告も出さねえぜ!」
ってやつのことだよな。あれがクソっていうなら同意。
155(1): 2024/10/22(火)17:54 AAS
>>150
Rustでは明示的に指定しない限りコストの高いヒープ領域メモリを使用しない
スタック領域メモリが使われるわけだが関数やブロック内で既に使い終わっている変数があればそれが使っていた領域を安全に再利用するので最小限のサイズしかスタックを消費しない
さらにレジスタがある環境ならばレジスタを使用すれば済む分はスタックを消費しない
そしてスタック領域メモリの解放とは関数の呼び出し元に戻る時にスタックポインタなどを元の位置に戻すことのみしかコストはかからない
156(2): 警備員[Lv.4][新芽] 2024/10/22(火)19:31 AAS
>>153
だとしても再度使えるようにするのは意味わからんだろ
開放しろって話
>>155
だからコストかからないとかどうとかじゃなくてコードから把握できないから全て渡したら解放にしろよって話なんだわ
解放しない場合は.mcopyだの後ろにつけとけばいいだろ
なんでお前ら人の話聞かないの?
157(1): 2024/10/22(火)19:48 AAS
>>156
いやヒープも使ってない変数を解放出来るプログラム言語存在しないだろ?
解放しないんじゃなくて出来ないのよ?
何もしない空関数呼ぶの?
それこそ馬鹿でしょ。
何基準に合わせろと言うのよ?
ムーブの時だけmove付けろならまだ話になるが。
省1
158(2): 2024/10/22(火)20:10 AAS
// MCopyトレイトを定義
pub trait MCopy {
fn mcopy(&self) -> Self;
}
// プリミティブ型に対して一括実装
macro_rules! impl_mcopy {
($($t:ty),*) => {
省19
159: 2024/10/22(火)21:17 AAS
>ブロック終了までメモリ確保してる
スタックとヒープの違いが本当に分からないんだな
「構文上のルール統一のために変数を使えなくする」は可不可でいえばできるけど、それで何かしらリソースが解放されたりパフォーマンス上のメリットがあるわけでもない
パフォーマンスやリソース管理などの理由があるケースでのみムーブされるだけなんだし
160(1): 2024/10/22(火)21:29 AAS
型によって管理が変わるって他の言語でもあるだろ
C#で
{
var a = new Foo();
}
という書き方が問題ないかは Foo の実装に依存する
なんでGCに任せられない型があるの?ダブスタを解消するために「全ての型で明示的なDisposeの呼び出しが必要」にしたりしないの?
省1
161: 2024/10/22(火)21:37 AAS
>>156
何を解放しろと主張しているの?
その整数値は例えばレジスタに即値ロードされるか
あるいは他の関数からレジスタに入って返り値として返ってくるんだよ
もし何の用途にも使われなければ最適化でそのレジスタの使用すらなくなるし
もし他の関数に渡すなら別のレジスタにコピーされて引数として渡される
そしてレジスタは次々と別の用途に使われていく
省1
162(1): 2024/10/23(水)00:10 AAS
ダブスタだ解放だとゴネてるから意味不明だけど
1が言いたいのって、Haskell見た初心者が「記号だらけで意味不明でクソ。英単語で構文を作れ」
って言うレベルの難癖なんじゃねえの?
163: 2024/10/23(水)06:33 AAS
>>6
参照型&TはCopyトレイトを実装しているのでコピーされて何度でも使えるよ
>>7
&strも&Stringどちらも参照型だよ
strは可変長なのでそのまま扱わずに参照型&strとして用いるよ
Stringもそのまま扱うのは生成する時だけで読み取りは&strとして扱うよ
書き換えの時は可変参照型&mut Stringとして扱うよ
164(1): 警備員[Lv.6][新芽] 2024/10/23(水)07:22 AAS
>>157
メモリ解放すればいいだろ
165: 警備員[Lv.6][新芽] 2024/10/23(水)07:24 AAS
>>162
pragmaまみれの構文書いてるやつは言うことが違うね
166: 警備員[Lv.6][新芽] 2024/10/23(水)07:26 AAS
>>160
Dispose()を呼ばなければならないのは例外だから
プリミティヴ型は基本型のなの通り基本なんだよ?
167: 2024/10/23(水)07:40 AAS
>>164
このスレでメモリの仕組み理解してないのあなた1人だけよ。ありもしない幻想に囚われてる。
rustどころか他の言語も危ういから無理せずもっと簡単なのから試したほうがいいよ。
一応望みの物は >>158 に置いてあるのでちゃんと使ってよね。
168: 2024/10/23(水)17:11 AAS
>>49 >>122
プリミティブ型とは何かを勘違いしているのではないか
Rustではヒープメモリを前提とせずに使える基本パーツの型を指す
この公式ページに一覧が挙げられている
外部リンク:doc.rust-lang.org
このようにarrayやsliceやstrなども当然プリミティブ型である
169: 2024/10/24(木)16:02 AAS
ムーブが基本でtrait Copyを実装しているCopy型だけ特別にコピーだね
プリミティブ型の中にもCopy型と!Copy型の両方あるね
170: 2024/10/25(金)12:56 AAS
結局1は俺が何言ってるか理解できない日本語すらわからんバカ共と話すことはないって
自分の中では大勝利して満足したんだろうか
171: 2024/10/25(金)19:17 AAS
>>158
Rustはトレイト境界の指定によりジェネリックで簡潔&安全にこのように書けるよ
trait MCopy {
fn mcopy(&self) -> Self;
}
impl<T: Copy> MCopy for T {
fn mcopy(&self) -> Self {
省14
172: 2024/10/27(日)14:31 AAS
multiple readers XOR single writerなので
可変がなければ参照はいくつでもコピーできるね
対照的に可変参照は独占的オンリーワンになる
173: 01/31(金)08:58 AAS
【結婚難】違反SEの代償【孤独死】
☆大損害だから稼働減らして収入増やせ☆
金稼ぎ妨害!
共働き妨害!
時間外労働違反
↓
偽装委託多重派遣
省10
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.020s