Rust part33 (566レス)
上下前次1-新
25: デフォルトの名無しさん [sage] 2025/08/18(月) 21:46:08.37 ID:dnUOS2YV(1) AAS
 その書き込みもRust製のPingoraを通って投稿されてRust製のPingoraを通って皆が読んでるよ 
26: デフォルトの名無しさん [sage] 2025/08/18(月) 22:00:15.90 ID:lyr3W+Wr(1) AAS
 横長のGUIが衰退したら次は縦長のGUIが再発明されたりする 
 じゃあ再発明しても変化しない仕様はなんだ 
 0で割り算できない仕様とか 
27: デフォルトの名無しさん [sage] 2025/08/19(火) 19:22:34.36 ID:XX3oox1B(1) AAS
 COBOLみたいに固定長レコードを基本として基本的に動的アロケーションをしない方向のモダンな言語もあっていいと思う 
 Rustを待たずとも、あれはあれでメモリ安全の究極の形の一つ 
28(3): デフォルトの名無しさん [sage] 2025/08/23(土) 19:14:03.74 ID:K0SmVlfv(1) AAS
 >複数の値 (いわゆる多値) を関数が返せる言語はそれほど多くない。 
 >LISP 系は多値のサポートがあることが多いけどそれ以外だと Go くらいじゃないかな? 
  
 Rustの()は値0個で(a,b,c)は値3個の多値 
 という認識で合ってますか? 
29: デフォルトの名無しさん [sage] 2025/08/23(土) 19:50:48.28 ID:CHT0FIec(1) AAS
 >>28 
 いいえ。 
 多値ではなくタプルです。 
30: デフォルトの名無しさん [sage] 2025/08/23(土) 21:56:54.53 ID:cDLDYI8A(1) AAS
 夏のオージ演 
31: デフォルトの名無しさん [sage] 2025/08/23(土) 22:15:56.19 ID:vghJtGax(1) AAS
 多値の取り扱いの仕方の一つがタプル 
 そしてRust公式にも Functions can use tuples to return multiple values. と明記されている 
 >>28の引用文についてRustは関数で多値を返すことができる言語の一つ 
32: デフォルトの名無しさん [sage] 2025/08/23(土) 22:45:01.43 ID:b43T5BM2(1) AAS
 Rustのタプルは多値で合っているが、言語によってはタプルというオブジェクト[のポインタ]を1つ返す場合もある。 
 そのような言語ではタプル≠多値で、Rustではタプル=多値。 
 Rustで関数がタプルを返す時に、各環境で可能なら複数のレジスタを使って返し、レジスタ返しの数を超えていれば、例えば呼び出し元スタックフレームの指定領域に直接書き込んで返す。 
 したがってRustは多値返しをサポートする言語。 
33: デフォルトの名無しさん [sage] 2025/08/24(日) 06:23:07.67 ID:yIg8YRK3(1/4) AAS
 分野によって用語の意味にブレがあるからそういうのを厳密に考えてもあんまり意味ない。 
 狭義の多値は継続 (continuation) に複数の値が渡ることをいうのでたぶん >>28 はその意味で言ってて、その意味ではタプルは多値ではない。 
 単なる言語ユーザの目線ではタプルにまとめて受け渡すことと複数の値を受け渡すことには何も違いはないから同一視しても何も困らないよ。 
 形式論理とかの世界の話。 
34: デフォルトの名無しさん [sage] 2025/08/24(日) 06:51:31.37 ID:Q1fxgDlW(1) AAS
 重要なことはオーバーヘッドの有無 
 タプルをオブジェクトの一種として扱う言語はオブジェクトを用意してそのアドレス単値のみを渡すため間接アクセスのオーバーヘッドが生じる 
 タプルを多値として扱うRustは多値として渡せるためオーバーヘッドが生じない 
 もちろんRustではタプルをBoxに入れることでアドレス単値のみ返すことも可能でオブジェクト方式の言語は常にそれをしていることになる 
35(1): デフォルトの名無しさん [sage] 2025/08/24(日) 07:38:29.67 ID:yIg8YRK3(2/4) AAS
 アーキテクチャによって ABI は違うかもしれないけど一般的な実装としては 
 関数の返却値が大きい時は呼出し側でメモリを確保してそれを隠れた引数として渡すようなメカニズムになってる。 
 返却値はスタックを介さない。 
 これは C++ でも同じ。 
36: デフォルトの名無しさん [sage] 2025/08/24(日) 07:52:38.38 ID:lHuVCVKu(1/3) AAS
 >>35 
 ほぼ合っているが一部だけ違う 
 間違ってる部分は「スタックを介さない」 
 正解は「スタックを介す」ことで高速に引き渡す 
  
 サイズの大きな値を返す場合 
 具体的には呼び出し元でスタックポインタを増減することでスタックフレームを拡大してその確保領域のアドレスを隠れた引数としてレジスタ渡しする 
 呼び出された関数側ではその確保領域に直接書き込んで値を返す 
  
 ヒープ領域を確保して受け渡す方式と比べるとメモリ領域確保のコストがない点とスタック上でそのままメモリキャッシュに乗る点で有利 
37: デフォルトの名無しさん [sage] 2025/08/24(日) 07:56:09.24 ID:lHuVCVKu(2/3) AAS
 ちなみにRustでx64アーキテクチャの時 
 16バイトまでならレジスタ渡しになり上記スタック領域は使われないため更に速い 
38: デフォルトの名無しさん [sage] 2025/08/24(日) 08:16:24.05 ID:lHuVCVKu(3/3) AAS
 ごめん、肝心なところ書き間違えてる 
 ✕ 16バイトまでならレジスタ渡し 
 ○ 16バイトまでならレジスタ返し 
39: デフォルトの名無しさん [sage] 2025/08/24(日) 10:58:20.04 ID:lOj53x5G(1) AAS
 言語が多値返却をサポートしてるかどうかというのは文法としてサポートしてるかどうかという意味 
  
 文法的にはサポートしてないけど「〇〇使えば多値返却できる」のは当たり前 
 一般的なプログラミング言語で「Functions can use 〇〇 to return multiple values」の〇〇に当てはまるものがない言語は無いので意味がない 
  
 文法的にサポートしているかどうかと内部実装がどの程度最適化されるのかはまた別の話 
40(1): デフォルトの名無しさん [sage] 2025/08/24(日) 11:01:04.53 ID:o5OQy7cK(1/2) AAS
 多値が返せるか?の意味なんて、ユーザ的には戻り値の分割代入ができるか?ってだけだし 
 ダラダラ言わずに返せますで終わりでよくね 
41: デフォルトの名無しさん [] 2025/08/24(日) 11:17:14.32 ID:DLpoJrbF(1) AAS
 Rustは多値を返す機能があるだけでなく 
 その実装も本当に多値を返すため効率よく実行も速いことが特徴 
42(1): デフォルトの名無しさん [sage] 2025/08/24(日) 11:34:24.43 ID:yIg8YRK3(3/4) AAS
 >>40 
 仕様を読むときは言語の理屈や用語をわかってないとちゃんと読めない。 
  
 複数の要素をひとつにまとめたもの (タプルや構造体) をひとつ返すというのと複数の値を返せるというのは違うことなんだが、 
 Rust では同一視することにしたというならそれはそれで同一視しているという理屈をわかってないといけない。 
43(1): デフォルトの名無しさん [] 2025/08/24(日) 11:46:57.61 ID:s620v8qa(1) AAS
 >>42 
 それは屁理屈 
 プログラマとしては多値を返せる機能があればよいわけで、 
 それがタプルという形で実現されていようが困ることは何一つない 
 逆に、タプルをサポートしていればそれだけで十分であり、 
 タプルでない多値をサポートするメリットが何もない 
44: デフォルトの名無しさん [sage] 2025/08/24(日) 11:50:38.02 ID:yIg8YRK3(4/4) AAS
 >>43 
 実際に (複数の要素をタプルなどにまとめるのではなく) 多値をサポートしてる言語はあるわけだが、ディスってんの? 
 言語の理屈の構成の仕方の話であって言語としてのメリットの話なんかしてない。 
45: デフォルトの名無しさん [sage] 2025/08/24(日) 11:58:39.52 ID:sGVh/967(1) AAS
 多値をサポートしてる言語の例としてGoが上で挙げられているけどさ 
 Goはタプルがなくてみんな困っている 
 タプルがある言語では多値がなくて困った話は聞かれない 
 機能として『タプル ⊃ 多値』 だからだよ 
46: デフォルトの名無しさん [sage] 2025/08/24(日) 12:05:10.36 ID:DXAve6fe(1) AAS
 Goでタプルがなくて辛いという話は聞いたことがないな 
 最適化の観点抜きで機能的に他でカバーできるから不要と言ってしまうと、 
 例えばオブジェクトは全部ヒープに置いてスマポの所有権移動だけにしてしまえば複雑なムーブは不要となり遥かにシンプルになる 
 それはそれで一つの考え方だが、Rustはそういう言語ではないと思っているのだろう? 
47: デフォルトの名無しさん [sage] 2025/08/24(日) 12:08:19.32 ID:veJK4T2Q(1/3) AAS
 返却された値がスタック上でどう扱われるかというのは言語仕様でなく最適化の問題だから、そこはRustではなくLLVMの話 
 言語仕様としては「Rustではタプルを簡単に作れる」「タプルの中身を別々の変数に束縛できる」というだけ 
 多値返却の目的からすればこれで十分だし、多くの言語はこれに相当する 
  
 Goは本当に多値返却という仕様で、これはタプルを返すのとは違う 
 そもそもタプルが言語仕様になくて、関数の返り値でだけ多値を返せるという変わった仕様 
 だから、2つの戻り値を返す関数を1変数で受け取ることができなかったりする 
 (Rustでいえば「戻り値を分解せず1つのタプル変数 t で受け取る -> t.0, t.1 のようにアクセスする」という書き方がGoではできない) 
  
 だから言語仕様としての話をしたいのか、「関数から複数の戻り値を返す」という目的の話をしたいのかで話は変わる 
 後者については、最近の多くの言語ではサポートしてるし、そんなに話がズレることもない 
 前者の意味でなら、Rustは多値返却の構文を持つ言語とは違う 
48: デフォルトの名無しさん [sage] 2025/08/24(日) 12:16:23.06 ID:aQdKZ7zp(1) AAS
 Goの多値とRustのタプルは同じ 
 どちらも実装は多値として返すため多値レジスタ返しが可能ならばそうするため効率が最も優れている 
 関数定義もほぼ同じ 
 func foo() (type1, type2) {… 
 fn foo() -> (type1, type2) {… 
49(1): デフォルトの名無しさん [sage] 2025/08/24(日) 12:16:31.50 ID:tCu5AZNy(1) AAS
 バカなやつほど抽象度の区別ができない 
 バカなやつほどオレオレ定義で用語を使う 
 バカなやつほど主語を書かない 
  
 本当に相手にする価値があるか考えよう 
 改善の見込みがないバカなら何を書いても時間の無駄でしかない 
上下前次1-新書関写板覧索設栞歴
あと 517 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.019s