◎正当な理由による書き込みの削除について:      生島英之とみられる方へ:

C vs C++ vs Rust Part.2 YouTube動画>1本 ->画像>2枚


動画、画像抽出 || この掲示板へ 類似スレ 掲示板一覧 人気スレ 動画人気順

このスレへの固定リンク: http://5chb.net/r/tech/1639539350/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

1デフォルトの名無しさん
2021/12/15(水) 12:35:50.91ID:biBE4xC0
競え
※前スレ
C++ vs Rust
http://2chb.net/r/tech/1619219089/
2デフォルトの名無しさん
2021/12/15(水) 12:36:12.51ID:biBE4xC0
たったぞ
3デフォルトの名無しさん
2021/12/15(水) 12:36:52.73ID:z10T13Tn
C vs は余計だった
4デフォルトの名無しさん
2021/12/15(水) 13:56:40.08ID:e2FwtkWT
Cに原点回帰しようよ
5デフォルトの名無しさん
2021/12/15(水) 13:57:35.77ID:Z/edc862
GoはC++というよりCっぽいよな
6デフォルトの名無しさん
2021/12/15(水) 14:37:20.55ID:30tmY3QB
Goはモダン言語にアレルギー反応が出てしまうC老人のための言語
7デフォルトの名無しさん
2021/12/15(水) 16:01:42.93ID:pLz5Pfsh
顔真っ赤な怒り心頭Rustオジサンがなぜかスレタイに無いGoを粘着でディスり続ける
8デフォルトの名無しさん
2021/12/15(水) 16:09:17.23ID:IT6MYik3
言語仕様が優れてるとかなんとかはあるだろうけど
結局使いものになる言語は何かと言われればC/C++なんだよ
9デフォルトの名無しさん
2021/12/15(水) 16:23:40.38ID:Il5L6NWm
Rustは流行りもの
C、C++は基本
10デフォルトの名無しさん
2021/12/15(水) 17:32:42.49ID:sKDBKV7A
RustとC++が互いに馬鹿にし合うのをCが高みの見物するスレですか?
11デフォルトの名無しさん
2021/12/15(水) 18:10:14.36ID:t4BO72er
CやC++なんて、UNIXかWindowsが成功してなきゃ流行ってたわけない
(そもそもUNIXがないなら、C言語も生まれてないけど)
結局は勝ち組プラットフォームにおんぶにだっこされてるだけよ

Rustも巨大企業に推されて採用されてるから、優れてる言語かどうかに関係なく流行る

流行は巨人が決めてる
12デフォルトの名無しさん
2021/12/15(水) 18:23:30.40ID:EKKmEU1R
Rustンサーガ
パンツ一丁でオッサンが闘うヤツ
13デフォルトの名無しさん
2021/12/15(水) 18:49:53.25ID:8Epoo61s
本当のプログラマはPascalを使う
14デフォルトの名無しさん
2021/12/15(水) 19:02:30.51ID:mn4aHBsE
May the FORTH be with you.
15デフォルトの名無しさん
2021/12/15(水) 19:10:44.73ID:WtUWAuhG
いまだに組み込みはCオンリーですが、「UNIXがないなら、C言語も生まれてない」は間違いに近い
https://ja.wikipedia.org/wiki/C言語#歴史
16デフォルトの名無しさん
2021/12/15(水) 19:15:49.17ID:A/sMbUcd
>>8
でもチーム開発するならRustの安全性は100%じゃないとしても十分魅力的だなぁと思う。
17デフォルトの名無しさん
2021/12/15(水) 19:21:40.26ID:A/sMbUcd
>>15
それ読んだら、
UNIXの *ために* C言語が作られたわけじゃないけど、UNIXが *なかったら * C言語も生まれてない、と読めるけど。
18デフォルトの名無しさん
2021/12/15(水) 19:59:26.95ID:pgpgQ+mf
>>9
C・・・ベーシックアイテム。
C++・・・おしゃれアイテム。
Rust・・・意識が高くなる壷。
19デフォルトの名無しさん
2021/12/15(水) 20:02:20.26ID:pgpgQ+mf
RustやRubyは、まず伝道師から始まるからな。
どういうわけか伝道師が大量発生する。
20デフォルトの名無しさん
2021/12/15(水) 20:03:30.36ID:pgpgQ+mf
C++使いがコード書いてる間、彼らは伝道する。
神の使いなのかもしれんな。
啓示があったんだろう。
21デフォルトの名無しさん
2021/12/15(水) 20:08:47.10ID:KpHwa+U5
Rustは実用に主眼を置いた泥臭い言語なので
伝道師の言う美辞麗句は無視してよい
22デフォルトの名無しさん
2021/12/15(水) 21:48:54.34ID:A/sMbUcd
っつか、いくら伝道師わいたってRust自身がその敷居の高さで安易に手を出すやつを排除するからRubyみたいには使われないんじゃねーの?
23デフォルトの名無しさん
2021/12/16(木) 11:27:59.15ID:iS9fah9V
プログラミング勉強のため素数列を返すイテレータ関数を作ってみました
今回トレイト境界は0と1とoverflow防止足し算と比較演算子のみとなりました

use itertools::{unfold, Unfold};
fn prime<T>() -> Unfold<T, impl FnMut(&mut T) -> Option<T>>
 where T: Copy + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialOrd,
{
 unfold(T::one(), |a| {
  unfold(*a, |b| { if let Some(c) = b.checked_add(&T::one()) { *b = c; Some(c) } else { None } }).map(|b| { *a = b; b })
  .find(|b| !unfold(T::one(), |c| { if let Some(d) = c.checked_add(&T::one()) { *c = d; if d < *b { Some(d) } else { None } } else { None }})
  .find(|c| unfold(T::zero(), |d| { if let Some(e) = d.checked_add(c) { *d = e; if e <= *b { Some(e) } else { None } } else { None } }).any(|d| d == *b)).is_some())
 })
}

型指定で『i8』(符号付き8bit整数)を与えて実行してみます

fn main() {
 for p in prime::<i8>() {
  print!("{} ", p);
 }
}

出力結果
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127

i8型は127が上限値(2^7-1)なので上手く動作してるようです
コードが少し長くなってしまったので冗長なところや改善点など教えていただけると幸いです
24デフォルトの名無しさん
2021/12/16(木) 14:51:19.13ID:fwM+9qOy
クソコード過ぎでこんなの誰も見ないよ
25デフォルトの名無しさん
2021/12/16(木) 15:20:11.27ID:iS9fah9V
>>24
良いコードをご教授していただけませんか?
普通にループは使わずに足し算と比較のみで素数をその型の上限まで返すイテレータ関数です
言語はCでもC++でもRustでも構いませんのでよろしくお願いします
26デフォルトの名無しさん
2021/12/16(木) 15:29:32.29ID:Hlz92r+j
Playgroundでu16に変えたらTLEした
27デフォルトの名無しさん
2021/12/16(木) 15:30:55.42ID:OBc86cw8
>>25
>>23ですらループ使ってるじゃん
馬鹿そう
28デフォルトの名無しさん
2021/12/16(木) 15:38:05.88ID:iS9fah9V
>>27
どこにループが有りますか?
勉強不足でわからないので教えてください
29デフォルトの名無しさん
2021/12/16(木) 15:59:44.48ID:V9bBAe8M
Rustのコードはなに見てもきたねぇな
30デフォルトの名無しさん
2021/12/16(木) 16:08:39.90ID:iS9fah9V
>>29
それは私がプログラミング勉強中だからだと思います
あるいはCやC++ならば「ループを使わずに足し算と比較のみで素数をその型の上限まで返すイテレータ関数」を
綺麗にプログラミングできますか?
綺麗なコードをご教示していただけるとうれしいです
31デフォルトの名無しさん
2021/12/16(木) 17:08:55.09ID:3qs6QL/g
>>23
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2021&gist=3e0c372e78ce024307bd58c1f03df55e

.find(..).is_some() は .any() と書ける (これはclippyが指摘してくれる)
if let Some(x) = expr { .. } else { None } は let x = expr?; .. とした方がネストが浅くなる
類似の処理は名前をつけて関数に括りだした方がわかりやすい
32デフォルトの名無しさん
2021/12/16(木) 17:33:56.80ID:3qs6QL/g
>>23
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2021&gist=6d5f63ffe7c46236a0957017db33a0b9
もう少し改善できた
スレ汚しすまん
33デフォルトの名無しさん
2021/12/16(木) 17:35:37.19ID:M/ZR00Mb
>>31のコード見た後に>>23見るとゲロ吐きそうになるな
34デフォルトの名無しさん
2021/12/16(木) 18:18:18.75ID:OBc86cw8
>>28
例えばfindはtry_foldを呼び出してるがこのメソッドはwhileを使って実装されている
どこかにループあるとわかりそうなもんなんやけどな
35デフォルトの名無しさん
2021/12/16(木) 18:19:05.42ID:OBc86cw8
rustのコードはc/c++以上に見苦しい
こんな言語を業界全体でプッシュしてるのは異常だよ
36デフォルトの名無しさん
2021/12/16(木) 18:37:24.71ID:3qs6QL/g
>>35
どの業界の話だよ
37デフォルトの名無しさん
2021/12/16(木) 18:55:01.30ID:7LXHVZ3Z
日本のC++業界だよ
38デフォルトの名無しさん
2021/12/16(木) 19:06:28.01ID:0UZhzBxa
なんでこいつRustの本スレでやらないんだろ、ほんまキモイ
39デフォルトの名無しさん
2021/12/16(木) 19:15:09.93ID:bRADTu+t
本スレで自己満足やられて本気でウザかったからここでいいよ
40デフォルトの名無しさん
2021/12/16(木) 19:40:56.05ID:OBc86cw8
だからここはガイジ隔離用のスレなんやで
41デフォルトの名無しさん
2021/12/16(木) 20:00:41.75ID:iS9fah9V
>>31
色々とありがとうございます
返り型がOptionだから?を使うとif letを消せるとは気付いていませんでしたw
あとそのコードを見ると渡す値を変えないならmapよりinspectを使うといいのですね
さらにご指摘くださったfindとis_someを合わせてanyにしたり否定!と合わせてallへ変えたり
まだ類似部分の別関数への分離までは進められていないのですがようやくここまで来ました

fn prime<T>() -> Unfold<T, impl FnMut(&mut T) -> Option<T>>
 where T: Copy + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialOrd,
{
 unfold(T::one(), |a| {
  unfold(*a, |b| {
   *b = b.checked_add(&T::one())?;
   Some(*b)})
  .inspect(|b| *a = *b )
  .find(|b| unfold(T::one(), |c| {
   *c = c.checked_add(&T::one())?;
   (*c < *b).then(|| *c)})
  .all(|c| unfold(T::zero(), |d| {
   *d = d.checked_add(&c)?;
   (*d <= *b).then(|| *d)})
  .all(|d| d != *b)))
 })
}

>>34
どうもありがとうございます
調べて勉強します
42デフォルトの名無しさん
2021/12/16(木) 20:07:32.48ID:22XvzF/H
字面だけみるとPerlとどっこいの汚さだな
43デフォルトの名無しさん
2021/12/16(木) 20:20:38.68ID:aj4Oe3UU
>>35 >>42
これ全く同じ機能をC++だと美しく書けるんかいな?
前スレでもRustの動くコードは出ていたがC++の動くコードは全く出てこなかったよな
だから既にC++プログラマーは絶滅していてRust派とアンチRust派(数学100点マン等)だと思ってた
44デフォルトの名無しさん
2021/12/16(木) 20:25:07.71ID:IyRKg3i2
unfold使ったこと無いから間違ってたら教えてほしいんだけど
これO(n^4)?
45デフォルトの名無しさん
2021/12/16(木) 20:34:01.51ID:V9bBAe8M
ゲロのようだ
46デフォルトの名無しさん
2021/12/16(木) 20:37:46.92ID:Y2CVy/MB
さわやかな新宿の朝って感じですね。
ゲロの臭いでもらいゲロしそう。
47デフォルトの名無しさん
2021/12/16(木) 20:54:48.37ID:iS9fah9V
>>44
違うと思います
まずunfold自体はループするものではなくこれだけです
struct Unfold<S, F> { s: S, f: F }
fn unfold<S, F, R>(s: S, f: F) -> Unfold<S, F> where F: FnMut(&mut S) -> Option<R> {
 Unfold { s, f }
}
impl<S, F, R> Iterator for Unfold<S, F> where F: FnMut(&mut S) -> Option<R> {
 type Item = R;
 fn next(&mut self) -> Option<Self::Item> {
  (self.f)(&mut self.s)
 }
}

次に今回のコードで使われているunfoldについてですが
一番外側のunfoldは上述の構造体を返すだけになります
次のunfoldは素数でない数をスキップするだけで残り2つがO(n^2)となるでしょうか
どの言語で書いても足し算のみ使用だとこれは避けられないかと思います

あとコードが汚いとおっしゃる方は同条件で綺麗なコードを示してくださるとありがたいです
CでもC++でもRustでも構いません
48デフォルトの名無しさん
2021/12/16(木) 22:36:01.50ID:22XvzF/H
そもそも
「ループを使わずに足し算と比較のみで素数をその型の上限まで返すイテレータ関数」
というのはどこからでてきたもんなんだ?
この条件になにか意味があるの?
49デフォルトの名無しさん
2021/12/16(木) 23:05:37.82ID:iS9fah9V
>>48
まず素数なら列になるのでイテレータにするのはいいですよね
用いる型によって上限値が異なるから上限まで返すのも自然ですよね
足し算と比較は必要最低限として不可欠だと思います
どうしてもならばループは使ってもいいですよ
だから今回は可能ならばループを直接使わずに高階関数イテレータ使用でという話だけです
つまりそんな難しい話をしているわけではないと思います
他の言語のコードが出てこないのは難しいからなのでしょうか?
50デフォルトの名無しさん
2021/12/16(木) 23:20:42.17ID:22XvzF/H
Rustのことは知らんのだけどsome, any, map, findって実質ループじゃないの?
Rubyっぽい構文も見られるけどブロックを毎度呼び出してもらってるだけだからループじゃないとかいうわけ?
51デフォルトの名無しさん
2021/12/16(木) 23:59:30.49ID:iS9fah9V
>>50
登場していたSomeは値付きenumなのでデータの型です
mapは変換するだけなのでそれ自体にループ要素はないです
一方でfindなどはループを内包している高階関数になりますね
だから>>49にて「今回は可能ならばループを直接使わずに高階関数イテレータ使用」と書いたのです

宿題となっていた類似部分を別関数へ切り出しが出来ました
これでわかりやすくなったでしょうか?

fn prime<T>() -> Unfold<T, impl FnMut(&mut T) -> Option<T>>
 where T: Copy + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialOrd,
{
 unfold(T::one(), |a| {
  inc(*a, T::one(), |x| x > T::zero()) // 無条件に+1していき次の素数を探す
  .inspect(|b| *a = *b) // unfoldのため値更新
  .find(|b| inc(T::one(), T::one(), |x| x < *b) // 自分より小さい数で+1していき約数を見つける
   .all(|c| inc(T::zero(), c, |x| x <= *b) // その約数の候補を自分以下で足し算していく
     .all(|d| d != *b)))}) // 自分が倍数になっていなければOK
}

fn inc<T>(s: T, a: T, f: impl Fn(T) -> bool) -> Unfold<T, impl FnMut(&mut T) -> Option<T>>
 where T: Copy + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialOrd,
{
 unfold(s, move |x| { *x = x.checked_add(&a)?; f(*x).then(|| *x) })
}
52デフォルトの名無しさん
2021/12/17(金) 00:00:59.02ID:vT0QTAiv
>>49
人に読ませるためのコードを書いたことがないのかな?
アルゴリズム的にどうとかRustの書き方的にどうとか言う以前の問題
53デフォルトの名無しさん
2021/12/17(金) 00:18:54.26ID:IfdsKAW/
>>51
めっちゃ理解しやすくなったな
まるで宣言型論理プログラミングっぽい雰囲気だ
説明の日本語はこう書くとよい

//素数とは自分未満で次を満たす約数を見つけること
.find(|b| inc(T::one(), T::one(), |x| x < *b)
 // 条件は約数の倍数すべて(自分以下)が
 .all(|c| inc(T::zero(), c, |x| x <= *b)
  // 自分と一致しないこと
  .all(|d| d != *b)))})
54デフォルトの名無しさん
2021/12/17(金) 00:54:27.00ID:BYm5EDTZ
恥ずかしい自演
55デフォルトの名無しさん
2021/12/17(金) 01:40:56.99ID:IfdsKAW/
ん?
あと変数名をわかりやすく変えたほうがいいぞ
56デフォルトの名無しさん
2021/12/17(金) 02:46:20.43ID:/GCsHBLw
本スレでクソコード連投してた奴だな
素数列挙をジェネリックにしてうれしがるセンスが厨二病っぽい
57デフォルトの名無しさん
2021/12/17(金) 05:16:05.83ID:Ph9FgRES
計算量悪くね?
58デフォルトの名無しさん
2021/12/17(金) 07:30:23.20ID:1kSORKuu
>>17
DEC PDP-11で動かすUNIXを書くためにC言語が生まれたと思ったが?
C言語の方が後なら、最初のUNIXは何の言語で書いてあったの?
59デフォルトの名無しさん
2021/12/17(金) 07:58:24.35ID:iDAFjWCW
アセンブリ言語
60デフォルトの名無しさん
2021/12/17(金) 08:05:48.36ID:Fp+PkeDU
>>58
Wikipediaにすら「当初はアセンブリ言語のみで開発されたが、1973年にほぼ全体をC言語で書き直した。」と書かれているんだけど。
61デフォルトの名無しさん
2021/12/17(金) 12:07:05.98ID:XK6UjWpG
>>18
要するに
Cはマック
C++はスタバ
Rustはブルーボトルって理解でおk?
62デフォルトの名無しさん
2021/12/17(金) 12:36:06.54ID:M1BnXuWN
>>55
ご指摘ありがとうございます
変数名を英語やローマ字にしてもわかりにくかったため日本語にしました
あとは無駄な部分を整理した結果シンプルになりました

fn 素数列<T>() -> impl Iterator<Item=T>
 where T: Copy + num::One + num::CheckedAdd + std::cmp::PartialOrd,
{
 range(T::one(), |_| true)
 .filter(|&素数|
  range(T::one(), |約数| 約数 < 素数)
  .all(|約数|
   range(約数, |約数倍数| 約数倍数 <= 素数)
   .all(|約数倍数| 約数倍数 != 素数)))
}

fn range<T>(unit: T, cond: impl Fn(T) -> bool) -> impl Iterator<Item=T>
 where T: Copy + num::CheckedAdd,
{
 itertools::unfold(unit, move |x| {
  *x = x.checked_add(&unit)?;
  cond(*x).then(|| *x)
 })
}

fn main() {
 itertools::assert_equal(素数列::<i8>(),
  [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]);
 assert_eq!(素数列::<u8>().last(), Some(251));
}
コードが汚いとご批判くださっていた皆さま方
これでいかがでしょうか?
63デフォルトの名無しさん
2021/12/17(金) 14:02:48.80ID:1gPCJ7Gb
マジで何がしたいんだろこいつ

使えなさ加減は似たようなものだが
計算量を重視するだけ競プロ信者のほうがまだマシ
64デフォルトの名無しさん
2021/12/17(金) 15:05:48.68ID:jilrKB7M
コードゴルフみたいなパズル感覚なんじゃね
知らんけど
65デフォルトの名無しさん
2021/12/17(金) 15:26:17.81ID:FYxSWdGJ
rustの構文が本当に受け付けない
66デフォルトの名無しさん
2021/12/17(金) 15:43:15.77ID:jilrKB7M
言語の構文が受け付けないというとこの話を思い出す
http://love-motif.com/article/art_13.shtml

rustの構文に対してこんな感じで生理的嫌悪覚えてるんですか?
67デフォルトの名無しさん
2021/12/17(金) 19:26:50.90ID:dBwqVSxt
rustが流行って、こういう素数なんて書く意識高い初心者が量産されて、汚ねぇコードを治すのかと思うと
今から頭痛がしてくる
68デフォルトの名無しさん
2021/12/17(金) 19:33:47.63ID:qRSiIGna
>>61
Rustは晋三が飲んでる何とか還元水では?
意識タッケーーー!!!
69デフォルトの名無しさん
2021/12/17(金) 19:45:38.64ID:IfdsKAW/
>>65
今どきは他のプログラミング言語も似たようなものだぜ
例えば配列 [4, 9, 3, 7, 1, 8, 5] から文字列 "9-8-7-5-4-3-1" への変換

【Ruby】
a.sort().reverse().map{|x| x.to_s}.join('-')

【JavaScript】
a.sort().reverse().map(x => x.toString()).join('-')

【Rust】
a.iter().sorted().rev().map(|n| n.to_string()).join("-")

このように些細な違いのみでほとんど一緒
逆に古典的な記述法は以下のようにコードが読みにくい

【Python】
'-'.join(map(lambda x: str(x), reversed(sorted(a))))
70デフォルトの名無しさん
2021/12/17(金) 19:52:32.78ID:e4M9F+jO
>>69
FORTHの時代が来たな。
71デフォルトの名無しさん
2021/12/17(金) 20:12:51.70ID:4mtvzkHU
【Rust】
a.iter().sorted().rev().map(|n| n.to_string()).join("-")
これはどんなアセンブリコード吐くの?
72デフォルトの名無しさん
2021/12/17(金) 20:32:50.39ID:jilrKB7M
>>71
元のコードコンパイル通らないので適当に変更してみた
https://godbolt.org/z/KTTcEccfz
73デフォルトの名無しさん
2021/12/17(金) 20:41:41.40ID:IfdsKAW/
>>72
Rustでは最小限しかstdに入れない方針
use itertools::Itertools; を付ければ>>69で通る
74デフォルトの名無しさん
2021/12/17(金) 21:36:06.81ID:jaIRX2N3
>>67
どう見てもめちゃくちゃ意識低いやつのコードなんですけど・・・
どこに意識高い系要素を見出だしたんだ?
75デフォルトの名無しさん
2021/12/17(金) 23:16:23.03ID:M1BnXuWN
>>71
Rustの各イテレータメソッドは全て各々の固有の構造体(struct)を返すだけです
アセンブリコードはスタック上に確保された構造体の大きさの領域にその値が入ることになるでしょう
そしてその構造体に対してnext()という関数が実装されています
後続の別のイテレータが自分に対してそのnext()を呼び出すことになります
そして他からnext()を呼ばれた側は自分の構造体のデータを利用して値を返します
これらのアセンブリコードは普通の関数呼び出しと同じでしょう

具体例を見たほうが早いと思います
例えばもう少し簡単な以下の例を動かしましょう
fn main() {
 let v = vec![5, 6, 7, 8, 9];
 v.my_iter().my_print();
}
このベクタvに対してmy_iter()さらにmy_print()とチェーンになっている例で説明します
多くの場合はライブラリにあるイテレータを使うので自分で実装しなくていいのですが
アセンブリコードが気になる(=どう動作しているの?)とのことなのでゼロから実装します

このmy_iter()も構造体を返すだけの関数です
ここでは説明をわかりやすくするためジェネリックでなく
具体的な型『Vec<i32>』(符号付き32bit整数のベクタ)に対してmy_iter()を実装します

まずmy_iter()が返す構造体を定義します
struct MyIter {
 vec: Vec<i32>,
 index: usize,
}
ベクタの値を次々と返していけるようにベクタとそのインデックスを保有します
変数名と型の位置がC言語とRustでは逆なだけでわかると思います
インデックスのための型『usize』は符号なし整数です
76デフォルトの名無しさん
2021/12/17(金) 23:19:50.48ID:M1BnXuWN
そしてmy_iter()の関数をVec<i32>に対して実装します
まず以下のtraitの部分は今回おまじないとして無視していいです
trait MyIterTrait {
 fn my_iter(self) -> MyIter;
}
次が関数my_iter()のVec<i32>に対する実装(impl)です
impl MyIterTrait for Vec<i32> {
 fn my_iter(self) -> MyIter {
  MyIter { vec: self, index: 0 }
 }
}
このように関数my_iter()は>>75で定義した構造体MyIterを返しているだけです
アセンブリコードはC言語などと同じになるでしょう
ただしC言語では構造体はポインタ返しのみだったと思いますが
Rustでは構造体をそのまま返せてこれはスタック領域にデータが返ります

あとは冒頭に説明しましたイテレータとして機能するためのnext()が必要です
構造体MyIterに対してイテレータの実装(impl)をします
impl Iterator for MyIter {
 type Item = i32;
 fn next(&mut self) -> Option<i32> {
  if self.index < self.vec.len() {
   let ret = self.vec[self.index];
   self.index += 1;
   Some(ret)
  } else {
   None
  }
 }
}
ベクタの現在のインデックス値を Some(ret) と返しているだけです
インデックスがベクタの長さを超えたら None を返しています
77デフォルトの名無しさん
2021/12/17(金) 23:24:42.83ID:M1BnXuWN
ではこの>>76の構造体MyIterのnext()は誰がいつ呼ぶのでしょう?
ここではメソッドチェーンになっているので後続のイテレータが呼びます
具体的には>>75で v.my_iter().my_print(); でしたからmy_print()が呼び出します

そこで関数my_print()の定義です
今回もtraitの部分はおまじないと思って無視していいです
trait MyPrint {
 fn my_print(&mut self);
}
下記で任意のイテレータに対して関数my_print()を実装(impl)します
そのためこの部分だけはジェネリック指定『<I: Iterator>』のコードをご容赦ください
後ろのwhere以降の std::fmt::Display は表示を許可するためのおまじないと思ってください
impl<I: Iterator> MyPrint for I
 where I::Item: std::fmt::Display
{
 fn my_print(&mut self) {
  while let Some(val) = self.next() {
   println!("{}", val);
  }
 }
}
ここでmy_print()のselfというのはここでimpl対象=先行するイテレータすなわちMyIterになります
もちろんMyIter以外の別のイテレータに対してもこのmy_print()は機能します
今回の使い方ではselfは構造体MyIterになりますから
whileのところにあるself.next()も先程定義したMyIterのnext()になります
next()の返り値が Some である限りprintln!で表示して None になるとwhileを抜けて終了です

以上で冒頭の以下の例の全てコードが実装されましたので動きます
fn main() {
 let v = vec![5, 6, 7, 8, 9];
 v.my_iter().my_print();
}
78デフォルトの名無しさん
2021/12/17(金) 23:54:35.76ID:M1BnXuWN
今回>>77のmy_print()はメソッドチェーンの最後なので構造体を返していません
だから正確にはmy_print()はイテレータではなくイテレータに実装されたメソッド(の一つ)という立場だけです
逆に言えばメソッドチェーンの途中の全てのイテレータメソッドは各々の固有の構造体を返します
そして後続のイテレータ(など)からnext()の値を要求されたらそれを返す動作のみするのがイテレータです

長いメソッドチェーンで一番最後がnext()を要求して連鎖的に最初のnext()が呼ばれるパターンもよく有ります
なぜなら多くのケースで途中のイテレータは自分のnext()実装で先行するイテレータのnext()を呼び出すからです
そして連鎖的にnext()呼び出しが生じても動作原理は多段の関数呼び出しと同じです

したがって元の質問>>71「どんなアセンブリコード吐くの?」も
「イテレータとして機能するメソッド呼び出しは単なる関数であって構造体を返すだけ」と
「あとで後続からその構造体に実装されてるnext()関数が呼ばれる」だけなのです
特別な仕組みとか裏でインタプリタやランタイムや魔法が密かに動いている、ってことはないです
79デフォルトの名無しさん
2021/12/17(金) 23:54:47.66ID:9qxPUMA0
文章を構造化できない人はコードを構造化することもできない

ひとりよがりが過ぎる
80デフォルトの名無しさん
2021/12/17(金) 23:59:22.81ID:M1BnXuWN
>>79
では修正点や改善点などをお待ちしておりますw
81デフォルトの名無しさん
2021/12/18(土) 01:55:26.24ID:S/VVluSn
ヒトに頼るな。
82デフォルトの名無しさん
2021/12/18(土) 02:17:36.05ID:Km8Qla7W
ワロタ
83デフォルトの名無しさん
2021/12/18(土) 02:17:43.63ID:793c4/xS
どんなアセンブリコード返すのという質問なんだから >>72 みたいにアセンブリ示せばよかろうに
84デフォルトの名無しさん
2021/12/18(土) 02:43:52.24ID:8AnTZJX+
イテレータの作りを説明してくれた人ありがとう
それ自体は他の言語でもよくあるパターンだね
ただ聞きたかったのは効率を重視するはずの(と思っている)言語が
この書き方で効率のよいコードを吐けるかどうかってこと
>a.iter().sorted().rev().map(|n| n.to_string()).join("-")
Rustはimmutableが基本と言う話を聞いてるからもしかしたら
新しいオブジェクトを生成しまくってるんじゃないかと思ったんだよ
この書き方をしてC/C++と同レベルの効率のコードが吐けるのかなって
85デフォルトの名無しさん
2021/12/18(土) 02:56:00.48ID:793c4/xS
>>84
そのコードは to_string() を要素数だけ呼んで最後に join してるからヒープアロケーションの回数が気になる場合は使うべきでないコードだね
だだrustのイテレーターのメソッドチェーン自体は不要なヒープアロケーション行わないしメソッドはインライン展開できるので
ある程度複雑なメソッドチェーンでもfor文と同じようなアセンブリになると言われているよ
86デフォルトの名無しさん
2021/12/18(土) 03:05:51.15ID:DtboORpD
>>84
例えばCのfor文などと比較すると、
その変化していく変数は構造体の中だが大元の関数のスタック上すなわちローカル変数と同じだからCと変わらん
あとinline展開指定されてるものなどで関数呼び出しオーバーヘッドも消えて前後のコードが繋がって最適化されるパターンもある
だから気にせずに使っても誤差範囲
87デフォルトの名無しさん
2021/12/18(土) 03:17:03.48ID:NcZGWI1L
RustってC++に似てるな
ゲロみたいな構文だ
88デフォルトの名無しさん
2021/12/18(土) 03:38:45.07ID:DtboORpD
>>85
結局メソッドチェーンとは別問題として
一般的にVecやStringなどのヒープ使うものがループ内にあると注意やな
あとcollectでスタック使うArrayVecやArrayStringを指定する手もあるな
89デフォルトの名無しさん
2021/12/18(土) 04:55:38.30ID:DtboORpD
>>69
> 配列 [4, 9, 3, 7, 1, 8, 5] から文字列 "9-8-7-5-4-3-1" への変換
> a.iter().sorted().rev().map(|n| n.to_string()).join("-")

このコード自体は他言語との類似比較のために冗長に書かれていて無駄がある
join("-")はDisplay実装あれば通るから事前のto_string()は不要
つまりa.iter().sorted().rev().join("-")でOK

さらにsorted()はヒープに結果Vecを確保する
もし元を書き換えていいならヒープ確保をjoin()でのString一つだけで済む

let mut a = [4, 9, 3, 7, 1, 8, 5];
a.sort();
assert_eq!("9-8-7-5-4-3-1", a.iter().rev().join("-"));

このrev()を無くすためにa.sort_by(|x, y| y.cmp(x))にするとcmp関数でやや不利
一方でrev()使用は配列やVec相手ならDoubleEndedIterator実装があるからコストかからない
現実にはこのコードが核心部分でなければそこまで気にしなくていいけどな
90デフォルトの名無しさん
2021/12/18(土) 05:17:14.76ID:S/VVluSn
一つだけアドバイスしとくけど、ジェームス・ボンドが日本人だったら、大木・凡人だからね。
91デフォルトの名無しさん
2021/12/18(土) 08:35:30.45ID:7eXg1jWI
>>74
Rustを使ってればカッコイイという錯覚で、何も分かってないのに汚物のようなコードと意味不明な長文をまき散らす…
あんなに単純な初期のJavaやC#でさえスパゲッティコードだらけなのに、日本語の説明さえも気持ち悪い
92デフォルトの名無しさん
2021/12/18(土) 10:28:10.29ID:ThzZjx8/
>>91
こじらせてんな
ゲロコード君とは違う方向性だが
93デフォルトの名無しさん
2021/12/18(土) 11:41:10.36ID:mvmw4Z8Y
長文二人は属性が似過ぎだろ
こんなのが二人もいればRustスレが気持ち悪くなるわな
94デフォルトの名無しさん
2021/12/18(土) 16:44:21.13ID:QlLdBEfz
顔真っ赤で根拠も反論もない「こじらせてんな」マンが永遠と長文や短文を書き、本Rustすれに代わりキチガイを集めるスレ
95デフォルトの名無しさん
2021/12/18(土) 17:42:36.78ID:SCKEmW4H
延々とな
ガイジそう
96デフォルトの名無しさん
2021/12/18(土) 18:08:14.57ID:BJvml2Bt
元々rustスレの隔離スレなんだから大成功でしょ
97デフォルトの名無しさん
2021/12/18(土) 20:19:16.51ID:Yd1FvpqW
>>91
>あんなに単純な初期のJavaやC#でさえスパゲッティコードだらけなのに、日本語の説明さえも気持ち悪い

文の前半と後半のつながりが全くわからないので解説頼む
98デフォルトの名無しさん
2021/12/18(土) 21:02:25.05ID:S/VVluSn
> この難しさを取り除くために、Rustは、C/C++の落とし穴を排除し、その過程で使いやすく役に立つ
> 洗練された一連のツールを提供します。 低レベルな制御に「下がる」必要があるプログラマは、
> C/C++のクラッシュやセキュリティホールのリスクを負わず、 気まぐれなツールチェーンのデリケートな
> 部分を学ぶ必要なくRustで同じことができます。さらにいいことに、 Rustは、スピードとメモリ使用の観点で
> 効率的な信頼性の高いコードへと自然に導くよう設計されています。
99デフォルトの名無しさん
2021/12/18(土) 21:05:46.31ID:xTzqLdo0
顔真っ赤Rustオジサンの「 >」、やっぱ同一人物だったかw
100デフォルトの名無しさん
2021/12/18(土) 21:56:16.22ID:SfwydFh9
>>84
その、新しいオブジェクトを生成しまくってるんじゃないか、の意味が曖昧なので
自動的にヒープ領域から動的に新たなメモリ確保をすると解釈すると、それはないです
Rustでもプログラムで明示的に指定しない限り勝手にそういうことが起きることはありません

もちろん例えばVec型(伸長可能な配列)やString型(伸長可能な文字列)を新たに返す関数を使えば
それはプログラムで明示的に指定したことになり、当然ヒープ領域が使われます

一般的にイテレータの長い連鎖があっても各イテレータが返す(=用いる)構造体は各1つで
それらはコンパイル時に静的に確定してスタック上にローカル変数と同様に領域が確保されます
したがってイテレータ連鎖で動的にヒープが使われうるのは例えば
(1) イテレータがクロージャを引数として取る場合にそのクロージャのコードがヒープを使うものである場合
(2) sorted()のように前イテレータから全要素を一旦受け取る必要がある途中のイテレータが一時格納場所としてヒープを用いる場合
(3) collect()のようにイテレータ連鎖の最後に全要素を収集してVecやStringなどを新たに生成する場合
いずれもそれらの関数やクロージャをプログラムで使用した時のみ、動的にヒープが使われます
101デフォルトの名無しさん
2021/12/18(土) 22:26:29.42ID:et4A8EY0
何が気持ち悪いかというと
自分も知らなかったことを調べてきてさも知ってたかのように上から目線でレスする精神
気持ち悪い

そしてその内容がいつも間違えてるからゲロ吐く気分になる
102デフォルトの名無しさん
2021/12/19(日) 08:59:28.05ID:YgvfWs4x
多少の間違いがあっても要点をおさえて質問に正面から答えてるんならまだいいんだけどねー
困ったもんだ
103デフォルトの名無しさん
2021/12/19(日) 23:44:42.02ID:cDs+Q4pL
間違いがあれば俺が指摘修整してやるから安心しろ
おまえら雑魚はそれでいい
104デフォルトの名無しさん
2021/12/20(月) 01:37:10.75ID:6C5yewwt
おまえは間違ってるって主張だけだと数学100点の人と同じだぞ
せっかくだからどこが間違ってるか指摘してあげなよ
105デフォルトの名無しさん
2021/12/20(月) 01:50:44.40ID:+mZvzmRI
そいつらは前スレからそんな感じだから放置されてる
ガイジとかゲロとか汚などの言葉を好む
具体的なコードや具体的な指摘は出来ないダメな連中
106デフォルトの名無しさん
2021/12/20(月) 13:09:41.04ID:Wae1ffBl
プログラム勉強しはじめたんだけど、CとかC++よりもRUSTのほうがかっこよさげだからRUSTやってる
107デフォルトの名無しさん
2021/12/20(月) 17:47:27.57ID:WdsmvZWK
意識他界系かよ
108デフォルトの名無しさん
2021/12/20(月) 18:01:18.12ID:+DS1Ebvj
CやLispからはじめるのが意識高い系
Rustからはじめるのはカッコつけたいだけの単なる無知
109デフォルトの名無しさん
2021/12/20(月) 18:21:17.98ID:k0WQlEJJ
C++から始めるのは何系?
110デフォルトの名無しさん
2021/12/20(月) 18:34:34.79ID:LHZmynrD
CがあるのにC++から始めるひとはガイジ系
111デフォルトの名無しさん
2021/12/20(月) 18:37:40.57ID:WdsmvZWK
10年早い系
112デフォルトの名無しさん
2021/12/20(月) 19:11:56.15ID:S0D0uK3y
ウッホウッホホ、マウンテンゴリラです。得意なのはドラミングで毎日ドコドコやってます
113デフォルトの名無しさん
2021/12/20(月) 19:19:22.55ID:wggVCSJj
>>108
なんでrustからだとあかんの?
114デフォルトの名無しさん
2021/12/20(月) 19:54:01.15ID:ceMzU2Ib
マルチパラダイムだからでは。
115デフォルトの名無しさん
2021/12/20(月) 20:10:25.93ID:wggVCSJj
>>114
よく知りもせんなら黙ってろや
116デフォルトの名無しさん
2021/12/20(月) 20:22:01.28ID:qir2xW7W
最近c++勉強始めたんだが、cとかmapも使えないじゃん
どうしてんの?
117デフォルトの名無しさん
2021/12/20(月) 20:29:53.40ID:ceMzU2Ib
mapを作るための言語がCだから。
118デフォルトの名無しさん
2021/12/20(月) 21:00:54.00ID:MpI5dMic
RustはコンパイラもライブラリもRustで書かれているね
119デフォルトの名無しさん
2021/12/20(月) 21:10:35.52ID:WdsmvZWK
>>116
昔はアルゴリズムの教本を参考にして全部1からつくってた
120デフォルトの名無しさん
2021/12/20(月) 21:56:05.64ID:MpI5dMic
今も必要があれば車輪の再発明をする能力を持つ人と持たない人にプログラマーは二分される
前者は新たな枠組みを作ることも可能な生産者
後者は既存の枠組みを使うだけの消費者
121デフォルトの名無しさん
2021/12/20(月) 23:37:11.43ID:qir2xW7W
俺には検討もつかんわ
所詮俺は消費者か…
122デフォルトの名無しさん
2021/12/20(月) 23:37:21.66ID:qir2xW7W
見当
123デフォルトの名無しさん
2021/12/20(月) 23:47:18.19ID:ceMzU2Ib
コンシューマーって言えばカッコよくなるよ。
124デフォルトの名無しさん
2021/12/21(火) 02:18:43.99ID:ukVjEMSL
プロデューサーとコンシューマーと呼ぶと両方存在して初めて意味を持ちそうな感じがするな
125デフォルトの名無しさん
2021/12/21(火) 02:38:28.55ID:XzF1jwer
この場合の生産者は、制作者(プロデューサー)ではなくて創造者(クリエイター)の方が近い
126デフォルトの名無しさん
2021/12/21(火) 08:29:08.29ID:J9NEE3Tt
もっともらしく言ってるけど
新たな枠組みを作ることができるかどうかに
車輪の再発明をする能力は関係ないよ
127デフォルトの名無しさん
2021/12/21(火) 08:37:17.38ID:91RXJaij
プログラミングにおいて車輪の再発明すら出来ない人が
プログラミングにおいて新たな枠組みを作るのは無理
128デフォルトの名無しさん
2021/12/21(火) 08:59:49.41ID:1P8ZKx5y
ザッカーバーグとかツールレベルでいえばあるもの使ってただけだがな。
129デフォルトの名無しさん
2021/12/21(火) 09:42:52.55ID:oIl64W+t
クイックソートくらいは自作してみたほうがいい
最初混乱するだろうけど、ああなるほど!となった時に必ず経験値に加算される筈だ
130デフォルトの名無しさん
2021/12/21(火) 10:37:29.68ID:91RXJaij
>>128
そりゃ彼はプログラミングにおいて新たな枠組みを作ったわけではないからな
131デフォルトの名無しさん
2021/12/21(火) 12:47:53.03ID:ukVjEMSL
新たな枠組みって例えば何?
フレームワークのことではなさそうだけど
132デフォルトの名無しさん
2021/12/21(火) 13:12:13.10ID:fLSFmYOm
例えば画像データの取り扱いでbitmapをそのまま処理していたような時代にpngやjpgなどのアルゴリズムをはじめて考え出して
実装したようなプログラマが新たな枠組みを作ることが出来る人
既存のライブラリ使って画像処理や表示のアプリを実装しているようなプログラマが枠組みを使うだけの人
133デフォルトの名無しさん
2021/12/21(火) 13:13:16.14ID:91RXJaij
もちろん例としてプログラミングのフレームワークでもいいんじゃね?
例えばそのザッカーバーグの例ならば
Facebook社はプログラミングにおいて新たな枠組みとして世間にも広まるほどのReactを作った
一方でザッカーバーグ自体はReactを今から車輪の再発明すらできないしプログラミングにおいて新たな枠組みを作れないだろう
134デフォルトの名無しさん
2021/12/21(火) 14:51:21.09ID:SKVIwMRv
枠組みに限らず何か新しいもの自力で作るには
その対象レイヤーのものを作れる能力は必要
それは当たり前

ザッカーバーグだって掲示板システムを実装する能力があったからFacebookを作れたわけだが
それを「車輪の再発明する能力」と呼ぶのかどうか

「新しい枠組み」と「車輪の再発明をする能力」の定義が曖昧すぎて中身がない
135デフォルトの名無しさん
2021/12/21(火) 14:53:33.71ID:SKVIwMRv
結局のところ
「低レイヤーの開発をするには低レイヤーの実装能力が必要」という主張でしかない
136デフォルトの名無しさん
2021/12/21(火) 15:02:25.60ID:91RXJaij
そこは定義でもめるから深入りしない
例えば例に挙げたReactは自分の観点からは低レイヤーではなく高レイヤー
結局これでいいかね?

各分野のプログラミングにおいて車輪の再発明すら出来ない人が
その分野のプログラミングにおいて新たな枠組みを作るのは無理
137デフォルトの名無しさん
2021/12/21(火) 16:17:27.88ID:ukVjEMSL
車輪の再発明って何
自身で模倣できる程度には理解しているということ?
138デフォルトの名無しさん
2021/12/21(火) 17:55:52.77ID:dNZ8oAHl
レイヤーは相対的なものだよ
低レイヤーで通じないなら下位レイヤーとでも言おうか

Reactのユーザーから見ればReactそのものの開発は下位レイヤー
Reactを作るために下位レイヤーのJavaScriptエンジンやレンダリングエンジンを再発明できる能力が必要か?
139デフォルトの名無しさん
2021/12/21(火) 19:16:57.14ID:91RXJaij
話はシンプル
それぞれの分野で見ればよい

Reactの分野だったら
『自分でウェブフロントフレームワークを簡易なものでよいから作ったことあるか?あるいは作れるか?』
これだけの話

つまりReactの開発者たちと同じような立ち位置に立てるプログラマーなのか、
それともReactの消費者としてユーザーの立場のプログラマーなのか、の違い
140デフォルトの名無しさん
2021/12/21(火) 21:33:34.81ID:FgftkvCZ
まとめると
「新しいウェブフロントフレームワークを作るには
ウェブフロントフレームワークを作る能力が必要」

そりゃそうだ
話はシンプルシンプル
141デフォルトの名無しさん
2021/12/21(火) 22:16:57.85ID:B7hTDXPV
なんだよこれ遅っせーなー
意味分かんねーんだよこの挙動
俺のほうがもっとうまく作れる
142デフォルトの名無しさん
2021/12/21(火) 23:02:50.37ID:BV9oeByN
消費者プログラマーは色んな仕組みをわかっていなかったり理解できなかったりする人が多いね
そうなると車輪の再発明すらできないし車輪の改良もできない
もちろん車輪に代わる新たな仕組みを作り出すこともできない
143デフォルトの名無しさん
2021/12/21(火) 23:19:52.13ID:aVQrTCZW
>>138
これ本気で言ってるのか
144デフォルトの名無しさん
2021/12/21(火) 23:37:27.40ID:BV9oeByN
元の話はmapの実装方法がわからない、だから、もっと深刻な状況なのか
プログラミングする上での基本的なことは
車輪の再発明であろうと自分でやってみて体験していくべき
145デフォルトの名無しさん
2021/12/22(水) 00:26:44.89ID:hlL8iDYx
習熟のために必ずしも車輪の再発明が必要であるわけではないでしょ
146デフォルトの名無しさん
2021/12/22(水) 03:14:26.40ID:zUrn+LAM
発明する必要はないけど何もないところから自分の力だけで車輪を組み立てられるようにはなっておいた方が良い
147デフォルトの名無しさん
2021/12/22(水) 04:06:02.73ID:3N0TjzPj
Cをやるとそういう力が身に付く
148デフォルトの名無しさん
2021/12/22(水) 13:40:20.98ID:88lOWKJS
「フロントフレームワーク」なんて言い方するのかとググったら、まぁまぁ居たわ
149デフォルトの名無しさん
2021/12/22(水) 14:48:58.75ID:cbZXpGCW
IPアドレスの正規表現を再発明してるやつがいたけど
ああいうのが"新しい枠組みを作ることも可能な生産者"だったのかw
150デフォルトの名無しさん
2021/12/22(水) 15:12:06.24ID:ACMGo5I0
IPアドレスの仕組みも正規表現も別に目新しいものではないのでは?
何か特別な表現手法とかを導入する余地って残されていたか?
151デフォルトの名無しさん
2021/12/22(水) 15:54:00.21ID:EC7ouo8z
正規表現とか言ってもただの文字列だからな
数式やアルゴリズムに落とし込めないもので再発明も何も手の出しようがないだろ
152デフォルトの名無しさん
2021/12/22(水) 16:28:01.11ID:fS3VtBnk
使ってる言葉を自分なりに定義できないやつは普段物事を深く考えてない
知性の程度を簡単に測れる物差し
153デフォルトの名無しさん
2021/12/22(水) 16:32:42.08ID:d0MJTsFe
つまり…?
154デフォルトの名無しさん
2021/12/22(水) 18:46:01.74ID:+56mJT2x
>>151
えっ?
正規表現⊆アルゴリズム
じゃない?
155デフォルトの名無しさん
2021/12/22(水) 19:48:14.08ID:8fPxaOZD
正規表現は文字列の集合を表すだけですよ。
156デフォルトの名無しさん
2021/12/22(水) 20:06:24.06ID:ZbLVUWay
ある正規言語に対応する文字列やろ
157デフォルトの名無しさん
2021/12/22(水) 20:08:22.67ID:NbFNi3kC
ただの検索や置換のためだけのメタ言語だよ
問題記述能力はない
158デフォルトの名無しさん
2021/12/22(水) 22:30:17.60ID:kJHwXG4U
問題記述能力?
159デフォルトの名無しさん
2021/12/22(水) 23:57:26.44ID:oj/5QvFT
>IPアドレスの正規表現を再発明してるやつがいたけど

再発明って具体的にどういうことやってたことを言っているんだろ
160デフォルトの名無しさん
2021/12/22(水) 23:58:38.64ID:WkDs1ZLi
そのケースはアルゴリズムではないな
一般的に自分で一から作れる人はその時々に応じて最適なアルゴリズムを見つけ出すだろう
161デフォルトの名無しさん
2021/12/23(木) 00:18:12.96ID:jzS6xQy/
何がアルゴリズムで何がアルゴリズムでないか
ちゃんと境界値テストできてる?
162デフォルトの名無しさん
2021/12/23(木) 00:20:51.73ID:HHXdPx7l
数式はアルゴリズムなのか?
163デフォルトの名無しさん
2021/12/23(木) 00:32:50.26ID:GoKXBRn5
俺がすごいと思ったらすごいというのをいかに客観的評価のように見せるか議論しているようにしか見えない
164デフォルトの名無しさん
2021/12/23(木) 00:47:38.83ID:1+zdX/p3
>>163
その通り
ついでに「俺すごい」アピールをしてる

まあ議論には全くなってないがな
165デフォルトの名無しさん
2021/12/23(木) 08:21:29.85ID:zbE03cOE
>>161
一般的には(決定性)チューリング機械で可能な処理のことだけどな。

なので一部の数式(無限大集合とか)は範囲外。
166デフォルトの名無しさん
2021/12/23(木) 10:21:26.98ID:jJ3uH/7E
無限大を数値計算で扱うために優秀なソフトエンジニア達の手によって、例えば離散フーリエ変換や離散ウェーブレット変換などのアルゴリズムが工夫され考え出された
これが新しい枠組みを作り出すということ
167デフォルトの名無しさん
2021/12/23(木) 10:33:51.13ID:uWdVPWrO
無限大の連続量を有限の数値で扱う
フーリエ変換
https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%BC%E3%83%AA%E3%82%A8%E5%A4%89%E6%8F%9B
https://ja.wikipedia.org/wiki/%E9%9B%A2%E6%95%A3%E3%83%95%E3%83%BC%E3%83%AA%E3%82%A8%E5%A4%89%E6%8F%9B
168デフォルトの名無しさん
2021/12/23(木) 11:37:52.36ID:Gjq2t2pD
>>167
FTは無限大集合を扱っている訳では無いだろ。実数とか扱えないし。
169デフォルトの名無しさん
2021/12/23(木) 12:01:15.99ID:l46o0/Jm
周期信号のフーリエ級数展開なら有限だけど連続信号を扱うなら無限積分の計算が必要
FTは無限積分を数値計算するため分割統治のバタフライ演算に落とし込んで更に演算量を抑えるため各種のアルゴリズムが考案されてる
170デフォルトの名無しさん
2021/12/23(木) 12:32:25.74ID:GoKXBRn5
で、新しい枠組みを作り出すことが C vs C++ vs Rust にどう関わってくるの
171デフォルトの名無しさん
2021/12/23(木) 12:46:22.58ID:l46o0/Jm
枠組みを作ることは凡人には無理
殆どは枠組みを使う人
ただ枠組みの仕組みを知らないと使うことも出来ない
172デフォルトの名無しさん
2021/12/23(木) 12:56:14.10ID:GHRrX/7/
最早スレチの話題に突っ込んで悪いけど、無限積分を回避できている気になっているのは気のせいであって、バタフライ演算とか関係ないからね(笑)
173デフォルトの名無しさん
2021/12/23(木) 17:57:47.72ID:NwYcCv97
以前に皆さま方からアドバイスをいただいて
『足し算のみで素数列を生成するジェネリックなイテレータの実装』
を当時O(N^3)という酷さでしたが、このたびほぼ O(N) の新たなアルゴリズムと実装が出来ましたのでご報告します

足し算の総回数を O(N log log N) すなわちほぼ O(N) 近くにすることに成功しました
具体的には 1億(=10^8) までの素数生成に必要とする 足し算の総回数が 2.5億回 とリニアになりました
前回と異なりメモ化をしていますがこちらも工夫により配列の長さを O(√N / log N) に抑えることに成功しました
具体的には 1億(=10^8) までの素数生成に必要とする 配列の長さが 1231 と非常に小さな領域のみで実現できました

10^kまでの素数を順に生成時の足し算の総回数 O(N log log N)
10^1 4.70×10^1=47
10^2 2.03×10^2=203
10^3 1.90×10^3=1903
10^4 1.95×10^4=19508
10^5 2.12×10^5=212715
10^6 2.27×10^6=2278220
10^7 2.41×10^7=24148110
10^8 2.54×10^8=254082528

10^kまでの素数を順に生成時の配列の長さ O(√N / log N)
10^1 4
10^2 6
10^3 13
10^4 27
10^5 67
10^6 170
10^7 448
10^8 1231

メモリ使用もこの程度の少なさで
足し算を2.5億回とその比較だけで1億までの全ての素数を順に出力できるようになりました
このスレは数学が得意な方々が多いようなのでご検証よろしくお願いします
174デフォルトの名無しさん
2021/12/23(木) 18:08:00.97ID:NwYcCv97
今回は読みやすいようにループで記述しました
impl<T> Iterator for 素数生成Iterator<T>
 where T: Copy + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialOrd,
{
 type Item = T;
 fn next(&mut self) -> Option<T> {
  '次候補: loop {
   self.新素数 = self.新素数.checked_add(&T::one())?;
   if self.新素数 == self.倍数[self.上限] {
     self.上限 += 1;
     if self.子.is_some() {
      self.素数.push(self.子.as_mut()?.next()?);
     }
     self.倍数.push(二乗(self.素数[self.上限]));
   }
   for index in 1..self.上限 {
     while self.倍数[index] != T::zero() && self.倍数[index] < self.新素数 {
      self.倍数[index] = self.倍数[index].checked_add(&self.素数[index]).unwrap_or(T::zero());
     }
     if self.倍数[index] == self.新素数 {
      continue '次候補;
     }
   }
   break;
  }
  if self.子.is_none() {
   self.素数.push(self.新素数);
  }
  Some(self.新素数)
 }
}
175デフォルトの名無しさん
2021/12/23(木) 18:17:16.76ID:NwYcCv97
上述に「子」とあるのはメモリ節約のためのテクニックで
「子」と「孫」を再帰的に利用しているためです
「自分」だけで必要なメモリをNとすると
「子」を利用することでメモリが√Nで済むように設計しました

また、 self.上限 が配列の長さで
self.新素数 が1億(=10^8)まで進んだ時点で self.上限 が 1231 です
self.上限 が更新された時のみ、つまり1億までで1231回だけ
コードにあるように以下の二乗する関数が呼ばれます

fn 二乗<T>(n: T) -> T
 where T: Copy + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialOrd,
{
 let mut count = T::one();
 let mut result = n;
 while result != T::zero() && count < n {
  count = count.checked_add(&T::one()).unwrap();
  result = result.checked_add(&n).unwrap_or(T::zero());
 }
 result
}
176デフォルトの名無しさん
2021/12/23(木) 18:20:15.44ID:NwYcCv97
fn main() {
 assert_eq!(vec![2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127], 素数生成::<i8>().collect::<Vec<_>>());
 assert_eq!(65521, 素数生成::<u16>().last().unwrap());
 assert_eq!(78498, 素数生成::<u32>().take_while(|&p| p < 1000000).count());
}

fn 素数生成<T>() -> 素数生成Iterator<T> where T: Copy + num::One + num::CheckedAdd {
 let 孫 = 素数生成Iterator::<T>::new(None);
 let 子 = 素数生成Iterator::<T>::new(Some(孫));
 素数生成Iterator::<T>::new(Some(子))
}

struct 素数生成Iterator<T> {
 素数: Vec<T>,
 倍数: Vec<T>,
 新素数: T,
 上限: usize,
 子: Option<Box<Self>>,
}

impl<T> 素数生成Iterator<T> where T: Copy + num::One + num::CheckedAdd {
 fn new(子指定: Option<Self>) -> Self {
  let three = T::one().checked_add(&T::one()).unwrap().checked_add(&T::one()).unwrap();
  Self {
   素数: vec![T::one()],
   倍数: vec![three],
   新素数: T::one(),
   上限: 0,
   子: 子指定.map(|子| Box::new(子)),
  }
 }
}
177デフォルトの名無しさん
2021/12/23(木) 18:29:41.75ID:NwYcCv97
コードは以上です

今回はitertools::unfold()を用いなかったため、それにより省略できていた、
「イテレータ用構造体の宣言」「その初期化」「そのIteratorトレイト実装宣言」
などが今回は必要となりコードがその分だけ長くなっていますが
イテレータの実装本体部分は>>174のみです

足し算の総回数が O(N log log N) 例: 素数を1億までで2.5億回
メモリは配列の長さが O(√N / log N) 例: 素数を1億までで長さ1231使用
これらを足し算のみで実現できています
どうぞご検証よろしくお願いします
178デフォルトの名無しさん
2021/12/23(木) 18:41:40.03ID:eB9sLMVm
嫌われ者Rusterのウザウザ全文貼り付け、見るのも嫌になる自己満足オナニー
179デフォルトの名無しさん
2021/12/23(木) 18:47:57.52ID:y6QdIUGa
なんかやたら足し算のみで、って強調してるけど、
アルゴリズムはエラトステネスの篩だよね?
そう言ってくれたほうが理解しやすいよ

Rustはまだあんま良くわかってないのでコードは参考になるかも
でもテストケースに127が入ってるのはおかしくない?
180デフォルトの名無しさん
2021/12/23(木) 18:49:15.20ID:y6QdIUGa
あ、おかしくなかった
すまん
181デフォルトの名無しさん
2021/12/23(木) 19:25:25.17ID:2KeIelt0
アルゴリズムに興味がある場合はCが読みやすいということがよくわかった
182デフォルトの名無しさん
2021/12/23(木) 20:59:20.34ID:QAvlUc5m
1億までの素数を全て求めるのが2.5億回の足し算だけで出来るものなのか??
メモリもエラトステネスだと1億必要だよな?
183デフォルトの名無しさん
2021/12/23(木) 23:06:13.63ID:MjSWMWRR
一億たって100メガにすぎませんからね。
184デフォルトの名無しさん
2021/12/23(木) 23:52:41.64ID:NwYcCv97
>>182
1億回の素数判定を個別に考えると平均2.5回の足し算となりもちろん無理です
そこで過去の判定時で用いた足し算の結果を後の判定時に用いる方法で
結果的に平均2.5回の足し算で済ませています

また、単純にエラトステネスのふるいでは1億の長さの配列が必要となりますが
まず時間と空間を逆転させることで必要となる配列の長さを減らしています
さらに再帰的に子と孫のイテレータを活用することで
>>173の表のように1億(=10^8)まで判定時で配列の長さ1231に抑えています
その時点で子と孫では配列の長さ27となっています

>>183
そんなO(N)のペースでメモリを使用していくのはいずれ限界もありますし
メモリキャッシュヒットの観点からも望ましくないと思います

さらに今回は小さい方から順に素数を返すイテレータです
イテレータ利用者は1億を超えて素数を利用するかもしれませんし
逆にもっと少ない小さい数のみ利用するかもしれません
最初に上限が1億など決まって開始する古典的エラトステネスのふるいでは上手くいかないのです
185デフォルトの名無しさん
2021/12/24(金) 00:05:23.52ID:jmk0MHfo
キャッシュヒット率の話するならベンチマークとってくれ
186デフォルトの名無しさん
2021/12/24(金) 00:12:47.34ID:1YPq+lkD
わざわざ決まってる数列を順番に出力するイテレータ書くのにそんな記述が必要になるのか
ちょっと普通のループでいいからC言語で書いてみてよ
187デフォルトの名無しさん
2021/12/24(金) 00:19:39.24ID:HWkip0+R
>>185
ベンチマークをとる前に実装が必要だな
その前に新たなアルゴリズムも必要か
エラトステネスの篩は「指定された整数以下の素数を求めるアルゴリズム」だからイテレーターとは相性が悪そうだ
188デフォルトの名無しさん
2021/12/24(金) 19:37:12.56ID:MpuWLPBj
イテレータにすると、プログラミングの方向が変わるんですよ。
詳細を未来に先送りできるんです。
伝統ある手続き型の手法では、システムやライブラリを書く人が詳細を実装し、使う人は大まかな指示を出しましたよね。
イテレータ手法は、未来に詳細を決定する。
つまり使う人が細かいことを決める事になるんです。
そこらへんの詳しい話は、書籍クリーンアーキテクチャに載ってます。
この本に書かれてることがすべて正しいとは言いませんが、正しいことにしろ間違ってることにしろ、読んでおいて損はないです。
189デフォルトの名無しさん
2021/12/24(金) 19:43:08.10ID:jmk0MHfo
イテレータ特有の話と言うより遅延評価全般の話に読めるが
190デフォルトの名無しさん
2021/12/24(金) 20:57:48.40ID:4EcCA1ju
イテレータ万能説を唱えて長文するガチキチおじさんwww
yieldはgeneratorをレイトバインド
for(range)はiteratorをレイトバインド
async/awaitはfutrueをレイトバインド
詳細を未来に先送り!キリッw
191デフォルトの名無しさん
2021/12/24(金) 21:06:12.59ID:MpuWLPBj
>>190
さあご一緒に、キリツ!
192デフォルトの名無しさん
2021/12/24(金) 21:28:57.48ID:fTLW+5qu
レイト「バインド」?
193デフォルトの名無しさん
2021/12/24(金) 21:44:54.12ID:cMhJNtck
クリーンアーキテクチャを出してるから遅延評価のことじゃなく
IoCの一例としての高階関数のことを言いたいんじゃないかな?
194デフォルトの名無しさん
2021/12/24(金) 22:01:56.18ID:piC+XKnR
昔は局所化して先送りにできることは素晴らしいことだと思ってた
でも最近そんなのは些末な事で、無能な働き者が気にすることだったなと考えを改めた
木を見て森を見ずと言うべきか
195デフォルトの名無しさん
2021/12/24(金) 22:55:30.83ID:UVQKl71H
>>188
ある意味その考え方も正しいかもしれませんが
イテレータは例えば大ざっぱに分けても5種類はあるので
自分が作る部分がどの部分かによってその立場も変わると思います
(1) 発信イテレータ … >>174で示しました素数生成、レンジ(0..n)、配列やVecに対するiter()などチェーンでは先頭に来るもの
(2) 仲介イテレータ … map()、filter()、enumerate()などチェーンでは中間に来るもの
(3) 受信イテレータ … find()、fold()、collect()などチェーンでは最後に来るもの
(4) 合成イテレータ … chain()、zip()、merge()など複数のイテレータを入力とするもの
(5) 創造イテレータ … unfold()などイテレータを生み出す汎用イテレータ
とりあえず(4)(5)は置いとくにしても自分が作る部分は用途によって(1)か(2)か(3)と変わるため大きく立場も異なります

>>189
一般的に遅延評価による先送りといえば主役はクロージャですね
上述したイテレータを作り出すunfold()もクロージャを渡すことで成立しています

>>190
futureは「未来に先送り」ではなく「未来を先取り」と捉えたほうがよくないでしょうか
そして遅延評価というよりも並行並列評価する形になりますね
したがって今回の話には適さないかなと思います
196デフォルトの名無しさん
2021/12/24(金) 23:02:03.16ID:UVQKl71H
>>186
> わざわざ決まってる数列を順番に出力するイテレータ書くのにそんな記述が必要になるのか

決まってる数列ではなく毎回算出するんですよ
記述については各々のイテレータはそれぞれ何らかの構造体にすぎないので >>176に示しましたように
「(a) イテレータとなる構造体の型宣言」「(b) その構造体の初期値定義 new()」「(c) 今回は自分と子と孫がいるためその関係記述」
があってようやく、>174に示しました「(d) イテレータ自体の毎回の算出コード」がそこに加わります
一般的にも今回の特殊な用途(c)を除いた3つ(a)(b)(d)は必要です
さらに>>195でいうところの仲介型イテレータはそれらの記述に加えて
「(e) 他のイテレータのメソッドとなりチェーンできるようにするための宣言」がさらに必要となります

上述(a)(b)(d)の部分の記述だけならば
お手軽にイテレータを生成できる itertools::unfold() を使えるケースだと
例えばフィボナッチ数列を返すジェネリックなイテレータは
以下のように初期値と処理クロージャを1つunfold()に与えてやればイテレータを作れます

fn fibonacci<T>() -> impl Iterator<Item=T>
 where T: Clone + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialEq,
{
 itertools::unfold((T::one(), T::one()), |(m, n)| {
  if *m == T::zero() {
   // overflow
   return None;
  }
  // shift: ret <- m <- n <- next
  let next = m.checked_add(&*n).unwrap_or(T::zero());
  let ret = m.clone();
  *m = n.clone();
  *n = next;
Some(ret)
})
}
197デフォルトの名無しさん
2021/12/24(金) 23:05:16.16ID:UVQKl71H
>>185
そのためにもぜひ異なるアルゴリズムの実装を作ってくださるとベンチ比較できますね
いまのところ足し算で素数生成するイテレータの実装は以前に作った明らかに非常に遅い>>62
今回作った動作O(N log log N)でメモリ使用量O(√N / log N)となる>>174の2つしかないのです

>>187
そうなんですよ
エラトステネスのふるいは最初に上限数を指定するためそのままではイテレータと相性がよくないです
またメモリ使用量も大きくなってしまいます
そのため試行錯誤のうえ新たなアルゴリズムが生まれたのが今回の実装です
もっと良い方法を考えついた方は教えていただけるとうれしいです
198デフォルトの名無しさん
2021/12/24(金) 23:17:20.90ID:759ZBatD
より良い方法に興味があるんなら、普通に既存実装を研究してみたらいいんじゃない?
例えばRubyの標準添付ライブラリにも Prime.each があるよ
ソースはここ https://github.com/ruby/prime

おれはそこまで素数のアルゴリズム自体には興味ないから考えないけど
199デフォルトの名無しさん
2021/12/25(土) 01:08:34.65ID:0QMGJaE9
>>197
CかC++で書いて
200デフォルトの名無しさん
2021/12/25(土) 04:20:39.50ID:9OzOPrjS
C/C++/Rustならどの言語も理解できないほどの特異な書き方や奇妙な省略もなくどれも似たようなもんだ
どれか一つで書かれていれば普通のプログラマーなら読めるだろう
それでもわからない部分があれば質問したら皆が教えてくれるぞ
201デフォルトの名無しさん
2021/12/25(土) 06:09:26.55ID:sZ4+jXNJ
>>195
ええその通りです。
ですから使いどころを間違っていると思うのです。
202デフォルトの名無しさん
2021/12/25(土) 09:05:26.62ID:0QMGJaE9
>>200
普通のプログラマじゃなくて雑魚なんで
Rustで書かれたコードはわからないしRustの説明が欲しいわけじゃない
C/C++で書かれてれば説明無用だから全部わかるならC/C++で書いてくれない?
203デフォルトの名無しさん
2021/12/25(土) 13:08:57.90ID:6OMvh/ue
Ruby の無限generator は、遅延評価する。lazy

普通に、メソッドチェーンを左から処理していくと、
無限に処理できないので、右から処理していく

素数は、6 で割って余りが、1 か5

余りが3なら、3で割り切れる。
余りが2, 4なら、2で割り切れる
204デフォルトの名無しさん
2021/12/25(土) 13:31:00.64ID:Jczj7qaZ
素数に2,3が含まれるの忘れてる?
205デフォルトの名無しさん
2021/12/25(土) 13:54:13.44ID:0QMGJaE9
if (25 % 6 == 1) {
//25は素数?
}
206デフォルトの名無しさん
2021/12/25(土) 14:02:33.11ID:+KvRe5Is
>>205
さすがに必要条件と十分条件がわからないのはどうかと思う
207デフォルトの名無しさん
2021/12/25(土) 14:14:33.50ID:0QMGJaE9
>>206
わからない
説明して
208デフォルトの名無しさん
2021/12/25(土) 14:21:15.89ID:6Qf096MJ
>>194
その考え方がまさに木を見て森を見ず
209デフォルトの名無しさん
2021/12/25(土) 14:40:34.51ID:E7PEPPKI
>>207
6で割って余りが1か5になるのは素数であることの必要条件や
xが素数⇒x%6=1,5
210デフォルトの名無しさん
2021/12/25(土) 15:29:54.15ID:0QMGJaE9
その事実を利用してまずは数を6で割って余りが1 or 5のとき
改めて素数かどうかを判定する関数に通すってことか?
rem = X % 6
if ((rem == 1 || rem == 5) && is_prime(X)) {
// Xは素数
}
else {
// Xは合成数
}
211デフォルトの名無しさん
2021/12/25(土) 16:04:02.04ID:a8rAfIFO
必要十分を理解してないエンジンは無価値
212デフォルトの名無しさん
2021/12/25(土) 16:50:37.75ID:sZ4+jXNJ
電気モーターの時代だから。
213デフォルトの名無しさん
2021/12/25(土) 17:51:05.49ID:cg2rHVf2
>>195
発信、受信、仲介、合成、創造?
コンピューターサイエンス分野を見てもRust公式を見てもそんな用語は1つもないけど
それってもしかしてあんたの個人的な思想ですか?それなら知りたくないのでウザいので黙っててもらえますか?
したがって今回のRustオジサンは気持ち悪い基地外だと思います
214デフォルトの名無しさん
2021/12/25(土) 17:58:00.70ID:+KvRe5Is
>>213
気持ちはわかるけど最後の一文が個人的な気持ちになってて同じ穴の狢になってない?
215デフォルトの名無しさん
2021/12/25(土) 18:19:18.17ID:IFpjnGkc
>発信、受信、仲介、合成、創造
たしかにこの用語なんなん? どっから出てきたの?
どの界隈のコンセンサスで得てる言葉なの?
216デフォルトの名無しさん
2021/12/25(土) 18:20:04.09ID:IFpjnGkc
>コンサンサスで
じゃなくて、コンセンサスを
217デフォルトの名無しさん
2021/12/25(土) 18:26:25.36ID:E7PEPPKI
ワイもこの用語はわかんなかった
218デフォルトの名無しさん
2021/12/25(土) 19:07:03.87ID:PUQlITfY
仲介なんて不動産屋でしか聞いたことないわw
219デフォルトの名無しさん
2021/12/25(土) 19:14:05.00ID:9OzOPrjS
イテレーターを作ったことがない初心者プログラマーには理解が難しいと思うが
命名はともかくイテレーターがそのように分類されることは俺でもわかるぜ

>(1) 発信イテレータ … >>174で示しました素数生成、レンジ(0..n)、配列やVecに対するiter()などチェーンでは先頭に来るもの

これはRustだとimpl Iterator for XXXのみ実装のイテレーター
つまり他者のnext()は利用せずに他者に対してnext()を提供

>(2) 仲介イテレータ … map()、filter()、enumerate()などチェーンでは中間に来るもの

これはRustだとimpl Iterator for XXXおよびimpl XXX for Iteratorと両方実装のイテレーター
つまり他者のnext()を利用しつつ別の他者に対してnext()を提供

>(3) 受信イテレータ … find()、fold()、collect()などチェーンでは最後に来るもの

これはRustだとimpl XXX for Iteratorのみ実装のイテレーター
つまり他者のnext()を利用するが他者に対してnext()を提供せず

以前に議論されていた消費者プログラマー(?)だと区別を一生気付かないままかもしれぬ
220デフォルトの名無しさん
2021/12/25(土) 19:17:12.81ID:Jczj7qaZ
本来の用語は何?
221デフォルトの名無しさん
2021/12/25(土) 19:46:48.90ID:+KvRe5Is
>>218
デザインパターンのMediatorとかでは聞いたことあるのでは

>>220
2-4あたりをひっくるめてiterator adaptorというのはよく聞くけど細かい分類は >>195 の造語っぽい
222デフォルトの名無しさん
2021/12/25(土) 20:41:43.56ID:qfkDfu3c
>>219
自演バレバレやぞw
223デフォルトの名無しさん
2021/12/25(土) 21:08:04.90ID:9OzOPrjS
>>220
知らん
しかしプログラマーとしてはそれらの違いは必須の知識
なんせ真逆だからな
impl Iterator for XXX
impl XXX for Iterator

>>222
わざわざ知らない役をやって同調するバカをおびき寄せてから知ってる役をしてるってか?
しねーよ
224デフォルトの名無しさん
2021/12/25(土) 21:22:55.51ID:0QMGJaE9
足し算で素数を求めるアルゴリズムについて知りたいんだが誰かC/C++で書ける人いないの?
225デフォルトの名無しさん
2021/12/25(土) 21:41:11.69ID:Sq1Xjjv1
独自に分類名を付けようとする試みは評価するが
チュートリアルに書いてるレベルの内容で
「初心者プログラマーには理解が難しいと思うが」とか言っちゃう初心者プログラマーはどうかと思う
226デフォルトの名無しさん
2021/12/25(土) 21:53:14.53ID:Sq1Xjjv1
公式用語はsource、adapter、consumer
227デフォルトの名無しさん
2021/12/25(土) 22:31:39.88ID:sZ4+jXNJ
イテレータはライブラリ作者と利用者の間でループをやり取りするには便利なものです。
しかし、それ以外で使ってもパッとしない。
228デフォルトの名無しさん
2021/12/25(土) 23:31:43.20ID:nV1lOrYt
>>203 >>210
素数列の生成でそんな何度も割り算しまくるような無駄はしないはず
そんなことしていたら足し算平均2.5回のより遅くなってしまう
229デフォルトの名無しさん
2021/12/25(土) 23:46:56.47ID:cn6bnobm
試し割り法で検索しろ
230デフォルトの名無しさん
2021/12/26(日) 00:33:01.70ID:kT157QEc
>>228
素数が足し算平均2.5回程度で求まるアルゴリズムを説明してくれないか?
231デフォルトの名無しさん
2021/12/26(日) 02:08:18.89ID:N3NYq5+A
Rustという世界最高の言語があるのに、なぜRubyを使うのが正しいのか。
リーン・スタートアップという本を読めばわかるよ。
232デフォルトの名無しさん
2021/12/26(日) 10:42:00.41ID:bwDwv7pP
Ruby on Railsは、GitHub, Airbnb, Disney, Hulu, SoundCloud, Shopify といった世界的に有名な企業や、
日本国内でも、note、クックパッド、freee、マネーフォワード、Progate、Qiita などで使われている

2021年10月には、GitHubのコピーで、Railsを使い続ける宣言をしている、
GitLab が上場し、時価総額は約1.9兆円!

一方、GitHubはGo へ以降する

Railsを使う理由を端的に言えば、もうかるから

Ruby biz Grand prix 2020 大賞を受賞した、Ruby の女神・池澤あやかも言ってる。
他の言語では開発者を確保しにくいので、Railsに切り替えた
233デフォルトの名無しさん
2021/12/26(日) 10:47:24.01ID:bwDwv7pP
Mediator は、空港の管制塔
234デフォルトの名無しさん
2021/12/26(日) 15:09:49.43ID:h4Mdc0Ob
>>214
仲介手数料、信用創造、お前が同じ穴の狢、アホのRustオジサンです
235デフォルトの名無しさん
2021/12/26(日) 16:15:26.85ID:Tvo9Wvhs
>>173
1億までの素数を全て生成するのに足し算2.5億回で済む理由がわかった
素数でなければ1万以下の素数が約数として必ずあるから順に最大素数9973まで調べるだけでよい
1億/2 + 1億/3 + 1億/5 + 1億/7 + 1億/11 + … + 1億/9973 = 約2.5億の足し算で原理的には済むはず
236デフォルトの名無しさん
2021/12/26(日) 21:21:30.44ID:MtmTWc/M
>>224
ある数がある数で割れるかどうかのテストに足し算を使っているだけ。
例えば12を3で割れるかどうか調べる場合、0 3 6 9 12と足し算していって、12が見つかったので割れる。
237デフォルトの名無しさん
2021/12/26(日) 21:25:21.15ID:XOSaINd5
エラトステネスの篩、のことなのでは?
でも1億分のバッファとか、勿体ない気がしますね…
238デフォルトの名無しさん
2021/12/26(日) 22:30:41.92ID:RjefXsAR
そこで区間篩ですよ
239デフォルトの名無しさん
2021/12/26(日) 22:31:44.15ID:kT157QEc
発見済みの素数を使ってループして数Xが素数かどうかを調べてるだけだろ?
足し算平均2.5回って意味不明なんだが?
240デフォルトの名無しさん
2021/12/26(日) 22:57:15.49ID:Tvo9Wvhs
>>239
1億までの素数列挙の場合が足し算平均2.5回なだけじゃね?
>>173を見る限り
100万までの素数列挙なら足し算平均2.2回
1万までの素数列挙なら足し算平均1.9回
足し算の回数はO(N log log N)とあるから多少増えていくのだろう
241デフォルトの名無しさん
2021/12/26(日) 23:11:50.20ID:Tvo9Wvhs
そう書いていたら謎が解けた

>>235
> 1億/2 + 1億/3 + 1億/5 + 1億/7 + 1億/11 + … + 1億/9973 = 約2.5億の足し算で原理的には済むはず

これは1億✕(1/2 + 1/3 + 1/5 + 1/7 + 1/11 + … )だから括弧内は素数の逆数の和でlog log N
1億がNだから足し算の回数はO(N log log N)なのか
242デフォルトの名無しさん
2021/12/26(日) 23:46:34.73ID:L9HJqboW
>>239
素数かどうかを調べるのは>>236が書いているように足し算だけで可能です
必要となる足し算の数は>>241が書いているようにO(N log log N)です
足し算平均2.5回は1億まで素数を列挙した時の話であって>>240が書いているようにNに対してわずかですが増えていきます
243デフォルトの名無しさん
2021/12/27(月) 00:18:24.10ID:OK/wNcge
>>242
C言語でいいから加算で素数を求めるアルゴリズム書いてくれない?
244デフォルトの名無しさん
2021/12/27(月) 08:37:12.33ID:vZ39sN8j
このスレで出てきているテレーターがよくわからんのだけど、wikipediaの定義と違うんかいな?
https://ja.m.wikipedia.org/wiki/%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF
245デフォルトの名無しさん
2021/12/27(月) 09:31:03.72ID:2XZCOhTP
>>244
その日本語wikiは怪しいので英語のwikiを見るといい
246デフォルトの名無しさん
2021/12/27(月) 13:29:55.23ID:ZyPtB7dw
100回繰り返すのと1億回繰り返すのとどっちがマヌケに見えるか、億という言葉を使えば賢く見えるのか?
億回繰り返さないと理解できないのか、汚コードRust相談室と化したC vs C++ vs Rustスレに未来はあるのか
247デフォルトの名無しさん
2021/12/27(月) 14:18:09.83ID:Btn3kp2t
隔離スレに未来などあるわけあるか
248デフォルトの名無しさん
2021/12/27(月) 18:22:06.83ID:/o/Y1bP3
>>244
実際のコード例で体験していくと理解が早い

例えばこの計算をしたいとする
>>235
> 素数でなければ1万以下の素数が約数として必ずあるから順に最大素数9973まで調べるだけでよい
> 1億/2 + 1億/3 + 1億/5 + 1億/7 + 1億/11 + … + 1億/9973 = 約2.5億の足し算で原理的には済むはず

コードは>>176の素数生成イテレータも使って以下のイテレータ4つの連鎖で求まる

let result: i32 = 素数生成::<i32>()
 .take_while(|&p| p < 10000)
 .map(|p| 100000000 / p)
 .sum();

途中のtake_while()は条件を満たす間だけ取るイテレータでこの場合は「1万未満」が条件
map()は変換するイテレータで「素数pを1億/p」へ変換している
最後にsum()で流れてきた1億/pを「全て足して」目的を達成

このように個々の単機能イテレータを複数組み合わせて連鎖させることでプログラミングできる
249デフォルトの名無しさん
2021/12/27(月) 21:02:50.96ID:/sRDJTH0
まーたイテレータの定義をよくわかってないやつがヘンテコな説明しちゃう
250デフォルトの名無しさん
2021/12/27(月) 22:13:30.95ID:h+0xE8z4
ヘンテコなとこに気がつけなかったんだけど、どのへん?
251デフォルトの名無しさん
2021/12/27(月) 23:21:22.61ID:N7w3YVE+
今どきの言語のイテレータは>>248で合っている
しかしC++のイテレータは低レベルでポインタを抽象化したものと考えたほうがいいので注意
C++にもようやくmap()に相当するものが入ったが他言語とは異なりtransform()という名前など使いにくい
今どきのプログラミングしたいなら素直にRustを使ったほうが便利
252デフォルトの名無しさん
2021/12/27(月) 23:38:31.34ID:0wmEJTQl
>>250
イテレータとは何かを分かってない
用語の使い方見れば一目瞭然でしょ

分かってない人が書いた説明を読むよりもある程度査読されてる英語のwikiや各言語のリファレンス見たほうがいい
253デフォルトの名無しさん
2021/12/27(月) 23:39:05.80ID:pyO9ra+c
この文中に>>入れる自作自演の同一人物の基地外Rustのくせはほんと気持ち悪い。また引用で > 使う
254デフォルトの名無しさん
2021/12/27(月) 23:41:50.94ID:OK/wNcge
伝統的には値を生成するものはジェネレータと呼ぶわな
255デフォルトの名無しさん
2021/12/27(月) 23:46:27.40ID:Bqcwp6fR
>>253
はちみつ病だからスルーしてさしあげろ
256デフォルトの名無しさん
2021/12/27(月) 23:49:02.66ID:N7w3YVE+
>>254
それは観点が違うな
値を生成するものであってもイテレータとして機能するものと機能しないものがある
つまり重要な点はイテレータとして機能するか否かのみ
Rustの1..nやこのスレの素数生成はイテレータとして機能しているから明白にイテレータ
257デフォルトの名無しさん
2021/12/28(火) 01:27:16.67ID:iF4hooVM
ジェネレータはみんなイテレータだから
258デフォルトの名無しさん
2021/12/28(火) 10:31:13.05ID:wyc7do74
やっぱり頭がおかしいよ、1..nはRange { start: 1, end: n }と同じ。Rust公式でもイテレータじゃなく
単にRangeと言っているだけなのに、それが機能するかという観点ならfor inが無ければ機能しないから
イテレータじゃない。collect()がイテレータをコレクションに変換するように、for inで(暗黙)変換されるだけ。
こいつ、あちこちで暴れてる
259デフォルトの名無しさん
2021/12/28(火) 11:06:40.72ID:We8KhoPF
RangeはIterator実装してるからrustの定義ではイテレータではあるのでは
260デフォルトの名無しさん
2021/12/28(火) 11:57:32.05ID:c+MbZA8y
汚コード厨まだ居るのか
261デフォルトの名無しさん
2021/12/28(火) 12:05:42.28ID:SY7gTV8u
>>258
君もイテレータがわかってないお仲間さんなので仲良く勉強しとけ
262デフォルトの名無しさん
2021/12/28(火) 12:13:02.75ID:SY7gTV8u
プログラミング初心者でもないのにイテレータを理解してないやつがRustスレに多いのはなぜ?
263デフォルトの名無しさん
2021/12/28(火) 12:16:44.18ID:F00FUyP7
ここ本スレではなく隔離スレ
スレ民の目的はただの冷やかし
264デフォルトの名無しさん
2021/12/28(火) 14:55:22.51ID:uwqQYFJJ
"仲介イテレータ"
約 2 件 (0.26 秒)

すげー、全世界で、このスレにしかその言葉は存在しない
265デフォルトの名無しさん
2021/12/28(火) 15:25:43.05ID:c+MbZA8y
厨怪イッテレータ
266デフォルトの名無しさん
2021/12/28(火) 15:44:45.74ID:WXYqKfV2
>>262
一番レスの多い自演厨が理解してないから、そう見えるだけ
267デフォルトの名無しさん
2021/12/28(火) 16:37:20.65ID:a2iPSFXu
イテレータには狭義のイテレータと広義のイテレータがある
広義のイテレータは狭義のイテレータとイテレータメソッドを合わせたものである

(A) イテレータ(狭義)
Rustで言えばtrait Iteratorを実装するもの
コード上で「impl Iterator for 各イテレータが返す型」となって現れる
各イテレータが返す型は通常structでありimpl Iterator<Item=T>を満たす
メソッドとしてnext()を持ちこれがOption<T>を返す

(B) イテレータメソッド
Rustで言えば上述イテレータ(狭義)のメソッドとなるもの
コード上では「impl 宣言用トレイト for Iterator」の中で現れる
各イテレータメソッドが返す型は任意でありfor_each()のように無しもある
対象となったイテレータ(狭義)のnext()を利用する側となる

>>195
| (1) 発信イテレータ … >>174で示しました素数生成、レンジ(0..n)、配列やVecに対するiter()などチェーンでは先頭に来るもの
| (2) 仲介イテレータ … map()、filter()、enumerate()などチェーンでは中間に来るもの
| (3) 受信イテレータ … find()、fold()、collect()などチェーンでは最後に来るもの

その分類で言えば
(1) = (A) かつ not (B) = イテレータ(狭義)だが イテレータメソッドではない
(2) = (A) かつ (B) = イテレータ(狭義)であり イテレータメソッドでもある
(3) = not (A) かつ (B) = イテレータメソッドだが イテレータ(狭義)ではない
268デフォルトの名無しさん
2021/12/28(火) 17:20:35.84ID:UIm7WL46
>>267
>広義のイテレータは狭義のイテレータとイテレータメソッドを合わせたものである
この定義のソースはどこ?
269デフォルトの名無しさん
2021/12/28(火) 18:00:29.58ID:p0MyQfYl
素数生成君と仲介イテレータ君は同一人物だったのか
どおりで
270デフォルトの名無しさん
2021/12/28(火) 22:24:23.54ID:ndrZKvgW
>>267
> Rustで言えばtrait Iteratorを実装するもの
これは無理矢理名前をつけるとすれば Iteratee と呼ぶべきでイテレーターではないのでは
271デフォルトの名無しさん
2021/12/28(火) 22:25:36.06ID:t/L66bQ2
こいつ何度間違っても全く反省しないなww
良い子は鵜呑みにしないで自分で調べようね
272デフォルトの名無しさん
2021/12/28(火) 22:28:28.38ID:t/L66bQ2
あ、>>270のことじゃないからね
273デフォルトの名無しさん
2021/12/28(火) 22:35:42.94ID:t/L66bQ2
>>270
詫びがてら説明しておくがイテレータは数えあげる人のこと

「次くれ」→ 「はい、どうぞ」
「次くれ」→ 「はい、どうぞ」
「次くれ」→ 「もうありません」

数えあげる対象物を数えあげる人自身が持ってる場合もあれば持ってない場合もある
impl Iteratorしてるのがイテレータなのは間違いない
274デフォルトの名無しさん
2021/12/28(火) 22:49:58.47ID:a2iPSFXu
>>270
君の中ではそうなのかもしれないが
世間では>>267の(A)をイテレータと呼んでいる
そしてイテレータパターンでもnext()を持つものをイテレータと呼んでいる
したがって>>267の説明で正しい
275デフォルトの名無しさん
2021/12/28(火) 23:41:11.95ID:c9bIiubz
出典もなしに能書き垂れるのやめろ
276デフォルトの名無しさん
2021/12/28(火) 23:52:38.14ID:a2iPSFXu
デザインパターンの一つであるイテレータパターンの説明図 (wikipediaより)
C vs C++ vs Rust Part.2 YouTube動画>1本 ->画像>2枚
next()を持つものがイテレータ
つまり>>267の定義で合っている
277デフォルトの名無しさん
2021/12/28(火) 23:56:51.47ID:OoEjLphs
視野が狭く思い込んだら多くの人が警告しているのに完全に無視し「定義」だの仲介だの創造だの自分勝手に講釈を垂れる
278デフォルトの名無しさん
2021/12/28(火) 23:59:15.51ID:a2iPSFXu
Rust公式Bookでも同じ

https://doc.rust-jp.rs/book-ja/ch13-02-iterators.html
全てのイテレータは、標準ライブラリで定義されているIteratorというトレイトを実装しています。
Iteratorトレイトを実装するには、Item型も定義する必要があり、
そして、このItem型がnextメソッドの戻り値の型に使われています。
イテレータに対して直接nextメソッドを呼び出すこともできます。
279デフォルトの名無しさん
2021/12/29(水) 01:29:32.54ID:R7H13gAM
じゃ>>248が間違ってたんだね

素数生成イテレータ
take_while()イテレータ
map()イテレータ
sum()イテレータ
4つの単機能イテレータの連鎖で求まるだっけ?
280デフォルトの名無しさん
2021/12/29(水) 02:02:16.54ID:8RYkbehC
>>267に照らし合わせると
上3つが狭義のイテレータ
下3つがイテレータメソッド(広義のイテレータ)
って感じかね
間違ってるとまでは言えまい
281デフォルトの名無しさん
2021/12/29(水) 03:47:51.11ID:L3UdfSEZ
イテレーターの定義はIteratorを実装してる型で良いと思うがそれがどう C vs C++ vs Rust に繋がるのか
282デフォルトの名無しさん
2021/12/29(水) 09:34:00.36ID:/J/UmHDr
>>280
そりゃ間違ってた本人の言い訳定義だからな
御本人さんよ
283デフォルトの名無しさん
2021/12/29(水) 12:27:51.74ID:EOkSZQC4
イテレータメソッドというのは多くの言語では一般的にはイテレータを返すメソッドのこと
Java, C#, C++, JavaScript, Python, Ruby, Scala等々

RustではIterator Trait’s Methodsの意味で
“iterator methods”という言葉が使われるがこれは訳すなら”イテレータのメソッド”

Rustに限った話でもIterator Traitの個別メソッドを
”イテレータ”と呼んでるのはnext()を除いて聞いたことがないので
広義のイテレータを定義してるソースがあるなら提示してもらいたい
284デフォルトの名無しさん
2021/12/29(水) 13:18:44.91ID:gOOeSowg
>>283
必死こいて言い訳のソースを調査中だから期待して待っててね
285デフォルトの名無しさん
2021/12/29(水) 13:20:17.30ID:2nRAq0Kh
javaだと
public interface Iterator<E>
ここにあるメソッドをiterator methodsと読んでる人居るね
まあ単にイテレータのメソッドってことなんだけど
286デフォルトの名無しさん
2021/12/29(水) 13:36:57.67ID:uJWdQe45
>イテレータメソッドというのは多くの言語では一般的にはイテレータを返すメソッドのこと

ググってみたがほとんど用例が見つからん。
287デフォルトの名無しさん
2021/12/29(水) 14:15:53.78ID:cOaqDcVM
ばっかもーん!それがイテレータだ!定義しろ〜!
みたいな
288デフォルトの名無しさん
2021/12/29(水) 15:32:20.47ID:mnKs3jeD
>>284
いいわけが見つからず
必死に話題そらしを始めるに1000ペリカ
289デフォルトの名無しさん
2021/12/29(水) 17:12:35.25ID:EOas9tnv
発信イテレータ<Item=オレオレ定義>
290デフォルトの名無しさん
2021/12/29(水) 21:23:30.19ID:4Vgx4jRv
たしかに「イテレータメソッド」だと「イテレータ生成メソッド」を意味する用例もあり曖昧さがある
「の」を入れて「イテレータのメソッド」とした方がいいだろう

(A) イテレータ
trait Iteratorを実装するもの
コード上で「impl Iterator for 各イテレータが返す型」となって現れる
各イテレータが返す型は通常structでありimpl Iterator<Item=T>を満たす
メソッドとしてnext()を持ちこれがOption<T>を返す

(B) イテレータのメソッド
イテレータのメソッドとして機能するもの
コード上では「impl 宣言用トレイト for Iterator」の中で現れる
イテレータの各メソッドが返す型は任意でありfor_each()のように無しも可
対象イテレータのnext()を利用する側となる
291デフォルトの名無しさん
2021/12/29(水) 21:25:05.27ID:4Vgx4jRv
// 例: イテレータ CountUp
struct CountUp(isize);
impl Iterator for CountUp {
type Item = isize;
fn next(&mut self) -> Option<isize> {
self.0 += 1;
Some(self.0)
}
}

// 例: イテレータのメソッド average()
trait AverageMethod {
fn average(&mut self) -> isize;
}
impl<I: Iterator<Item=isize>> AverageMethod for I {
fn average(&mut self) -> isize {
let mut len = 0;
let mut sum = 0;
while let Some(n) = self.next() {
len += 1;
sum += n;
}
sum / len
}
}

fn main() {
let a = CountUp(0).take(99).average();
assert_eq!(a, 50);
}
292デフォルトの名無しさん
2021/12/30(木) 00:04:05.78ID:MoU6yrVg
反応がないとうんこしたと流してない。不安に襲われるような感じ
293デフォルトの名無しさん
2021/12/30(木) 14:31:45.54ID:Qz6d/gAR
>>291のイテレーターとメソッドをCやC++で実装することも可能ですか?
どんな感じのコードになりますか?
294デフォルトの名無しさん
2021/12/30(木) 22:06:33.40ID:uQWTVZvM
Rustを勧めるとだけ言っておく
295デフォルトの名無しさん
2021/12/31(金) 05:37:35.76ID:FgwbS9xc
ここにいるRust屋はC/C++が書けないってことがはっきりしている
296デフォルトの名無しさん
2021/12/31(金) 06:22:24.67ID:0hDlQtG+
単純にC++が不得手な分野が多すぎ
Rustだと楽に書けるからこのスレに書かれているコードがRustばかりになっている
プログラミング言語としての優劣の違い
297デフォルトの名無しさん
2021/12/31(金) 07:44:51.93ID:M33hR7ol
Rustだと楽にかける分野ってメモリ安全性関連以外ない気がする
298デフォルトの名無しさん
2021/12/31(金) 07:51:10.24ID:FgwbS9xc
Rustはイテレータ作れる文法用意されててスゴイ言語ってことか
まあトイプログラム作るのに秀でた言語いじって喜んでるレベルじゃ
あらゆる分野のアプリケーションが書かれてきたC++の実績は理解できないだろうな
せいぜい不得意なことと言えばスクリプト言語で代用される分野くらいだろ
299デフォルトの名無しさん
2021/12/31(金) 08:08:48.60ID:tc6fCfYn
>>297
パターンマッチがハマるプログラムは書きやすいと思う
言語処理系とか
300デフォルトの名無しさん
2021/12/31(金) 08:23:51.96ID:M33hR7ol
>>299
なるほど
でもそれってc/c++でもenumと構造体か共用体組み合わせればできるよね?
301デフォルトの名無しさん
2021/12/31(金) 08:33:21.86ID:BI8sFyN6
>>297
マルチスレッドは楽だと思うけどな
というかC++が辛すぎる
302デフォルトの名無しさん
2021/12/31(金) 09:32:24.05ID:Lhm1MIug
>>300
できるできないの話じゃなく
どちらが楽にできるかの話をしてたんじゃないの?
303デフォルトの名無しさん
2021/12/31(金) 10:43:31.43ID:faZP1uCu
C++20 からコルーチンが入ってジェネレータは割と書きやすくなったよ
とはいえイテレータのほうが従来通りのポインタ的用法に引きずられてるからなんともだけど
https://cpprefjp.github.io/lang/cpp20/coroutines.html
304デフォルトの名無しさん
2021/12/31(金) 11:38:15.61ID:tc6fCfYn
>>300
c++でもできるけどenumの値とunionのvariantの組み合わせはプラグラマが意識しないといけない
rustだとmatch式のcond部分に値を書けばrust-analyzerがすべてのarmのスケルトンを作ってくれるから
穴埋めしていくだけで処理が書けて楽
305デフォルトの名無しさん
2021/12/31(金) 12:10:32.68ID:M33hR7ol
>>304
まあrustの方がc++よりパターンマッチング楽なのは認めるよ間違いない
306デフォルトの名無しさん
2021/12/31(金) 21:01:38.85ID:7OQCq2Au
C++と比べてRustだとメモリ安全にできるから、スレッドセーフなコードも誰でも書けるよ
そういったメモリ安全関連の利点がなきゃ存在意義のない言語だよね

書いたコードが高速に動作するかどうか、とかはまた別の話だけど
307デフォルトの名無しさん
2021/12/31(金) 21:30:26.51ID:Cc3nB8ek
>>301
マルチスレッドの並列処理だけでなくシングルスレッドマルチタスクの並行処理も便利かつ安全に書けるところも

>>304
match式だけでなくletやif letでのデストラクチャリング&マッチングがある点も
一方でC++は多重構造の分解分配もダメでif letも値付きenumもないからほとんど何も出来ない
308デフォルトの名無しさん
2021/12/31(金) 21:55:39.97ID:2Zk/vij+
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1371r3.pdf
パターンマッチング構文が提案されてる。
309デフォルトの名無しさん
2021/12/31(金) 21:55:45.65ID:0hDlQtG+
>>298
C++で書けることは全てRustで書ける
C++が優位な点は過去実績しかない
これは両方やればはっきりと認識できる
そのスクリプト言語的な記述や利便性がRustにあるという認識は正しい
かゆいところにも手が届くスクリプト言語という側面もある
310デフォルトの名無しさん
2021/12/31(金) 22:00:54.10ID:2Zk/vij+
Rustはスクリプト言語なのか。
311デフォルトの名無しさん
2021/12/31(金) 22:02:16.06ID:tc6fCfYn
>>306
CやC++と同等の性能特性を持つ言語の選択肢は限られてるから安全性以外の理由でRustが採用されることもあると思うよ
312デフォルトの名無しさん
2021/12/31(金) 22:03:31.93ID:XhcmshbG
Rustって循環参照安全に書けないんじゃなかったけ?
313デフォルトの名無しさん
2021/12/31(金) 22:11:10.66ID:Cc3nB8ek
>>308
構文のアーム「=>」や後置のifガードなどRustのmatch式の後追いパクリw
それが仮に導入できても要である値付きenum(=タグ付き共用体)を持たないC++では活用に限界

>>312
曖昧すぎてどういう状況で何が書けないとの主張かわからないけど
C/C++で安全に書けることはRustでも安全に書ける
つまりRustで安全に書ける範囲の方が完全に広い
314デフォルトの名無しさん
2021/12/31(金) 22:18:59.59ID:tc6fCfYn
>>313
C/C++にはRustでいうところの安全(⇔unsafe)はないから "C/C++で安全に書ける物" が何を意味するかわからない

そもそも >>309 の "C++で書けること" や "Rustで書けること" ってどう定義されるの?
315デフォルトの名無しさん
2021/12/31(金) 22:24:28.60ID:tc6fCfYn
>>312
循環参照は安全に書けるよ
https://doc.rust-jp.rs/book-ja/ch15-06-reference-cycles.html
316デフォルトの名無しさん
2022/01/01(土) 00:53:57.74ID:xczakg94
Rustのmatch式はScalaの後追いパクリw
317デフォルトの名無しさん
2022/01/01(土) 01:00:44.48ID:193tzZ58
ML系のパクりだよ
https://doc.rust-lang.org/reference/influences.html
318デフォルトの名無しさん
2022/01/01(土) 01:12:03.78ID:jvk1ETyF
プログラミング言語としての比較結果は明瞭

適用可能な範囲は同じかつ最速
いずれもGCがなく低レベル操作も可能
Rust = C++ = C

したがって勝負は他の点
コード記述が楽に簡潔に書けるか
Rust > C++ > C

安全なコードを書けるか保証できるか
Rust > C++ > C
319デフォルトの名無しさん
2022/01/01(土) 01:22:01.85ID:193tzZ58
>>318
> いずれもGCがなく低レベル操作も可能
これはRustはnightly使うこと前提?
低レベルな機能についてはまだまだunstableなものが多いので少なくともstableなRustではC/C++でできること (処理系依存なものも含む) がすべてできるとは言えないのでは
https://doc.rust-lang.org/stable/unstable-book/

新たな(pre-)RFCも日々提案されてるし現状で十分とあぐらをかくべきではないと思う
320デフォルトの名無しさん
2022/01/01(土) 01:33:41.15ID:KzNGE8bI
ということは、RustはC++よりJavaと比較する言語なのでは?
321デフォルトの名無しさん
2022/01/01(土) 01:41:42.07ID:193tzZ58
>>309
> C++で書けることは全てRustで書ける
を念頭に置いた話で "全て" は言い過ぎ、C++でないとできないこともあるだろうと言いたかった

CやC++の低レベル操作は Rust でも "だいたい" できて大抵のユースケースでは困らない
と言うのが正確だと思う

Java は GC あり VM 言語だから低レベル操作の観点でのRustとの類似度で言ったらCやC++の方が近い
322デフォルトの名無しさん
2022/01/01(土) 01:44:00.63ID:KzNGE8bI
メモリーの安全性を強調する言語と言えばJavaが筆頭に挙げられるのでは?
Javaは実行時最適化を行うのでC++より速いと主張されます。
この点もRustと酷似している。
323デフォルトの名無しさん
2022/01/01(土) 01:45:59.28ID:KzNGE8bI
JavaもRustもC++と比較した優位性を主張するのですが、JavaとRustならどちらが優れているのでしょう?
324デフォルトの名無しさん
2022/01/01(土) 01:46:52.68ID:jvk1ETyF
>>319
勘違いしてないか?
それらのほとんどは既に別の手段でコードを書くことができるが更に利便性を高めようと検討されている機能だぞ
C++で言えば>>308提案のマッチングは現在できないがそれが無くとも別の手段でコードは書ける話

>>320
C++とRustは適用可能な範囲が同じ
Rustの記述性能が高いという違いしかない

>>322
Javaはガベージコレクションがあり適用可能な範囲が狭い
さらにヌルポインタ例外もありJavaはメモリ安全ではない
325デフォルトの名無しさん
2022/01/01(土) 01:50:45.71ID:KzNGE8bI
Javaは組み込みにも使われ、それどころかpico javaというJavaを効率よく実行できる組み込み用プロセッサのアーキテクチャ迄あるんですよ。
完全にRustと一致するじゃないですか。
実績を考えたらRustを完全に包含しています。
なぜJavaとの比較を嫌がるのですか?
326デフォルトの名無しさん
2022/01/01(土) 01:51:16.51ID:KzNGE8bI
もしかしてRustはJavaに負けているのですか?
327デフォルトの名無しさん
2022/01/01(土) 02:00:04.72ID:LNkbwGBY
GCがあってデータ競合も起きないマルチパラダイム言語で、C,C++以上の爆速で動く処理系があるとするならそら優秀だろうと思うわ

Javaは実際にはそんなに爆速じゃないだろうし、データ競合の対策がしやすい言語とも思えんけど
328デフォルトの名無しさん
2022/01/01(土) 02:05:29.52ID:KzNGE8bI
活気があったころは、C++と比較して20倍速いと主張するサイトもありましたよ。
まさに爆速です。
Rustと似ています。
329デフォルトの名無しさん
2022/01/01(土) 02:07:14.76ID:KzNGE8bI
安全性という観点では、RustはHaskellと似ているように思います。
熱心なHaskellユーザーはコンパイルが終わればバグが無いことを保証されると主張します。
Rustと全く同じです。
330デフォルトの名無しさん
2022/01/01(土) 02:10:16.54ID:jvk1ETyF
Javaを含めるとこうなる

安全なコードを書けるか保証できるか
Rust > Java > C++ > C

Javaはヌルポインタによる参照でエラー例外が実行時に起き得る
Rustはそれさえも起きない
したがって速さだけでなくメモリ安全の点でも Rust > Java が確定済
Javaが勝てる点がない
そのためJavaを捨ててRustへ移行するプロジェクトもある
331デフォルトの名無しさん
2022/01/01(土) 02:11:02.91ID:KzNGE8bI
Haskellもまた、C++と比較して優位性が主張されることの多い言語のひとつです。
しかし、JavaやRustと比較されることは一切在りません。
Java、Rust、Haskellでは、どれが最も優れているのでしょう?
332デフォルトの名無しさん
2022/01/01(土) 02:13:26.08ID:KzNGE8bI
でもRustはJavaより遅いですよね?
Javaは実行時最適化によりC++より20倍速いことがbenchmarkで判明していますよ。
10年以上も前に。
333デフォルトの名無しさん
2022/01/01(土) 02:15:29.86ID:KzNGE8bI
C++を改良したD言語もあります。
DとRustならどちらが優れているのでしょう?
334デフォルトの名無しさん
2022/01/01(土) 02:16:49.60ID:KzNGE8bI
出自からして、D言語もまたC++と比較して優位性が述べられる言語のひとつです。
しかし、RustやHaskellと比較されることは在りませんね。
どちらが優れているのでしょう?
335デフォルトの名無しさん
2022/01/01(土) 02:25:43.18ID:jvk1ETyF
まずは決定的な違いを勉強しなさい
GCのない言語 Rust C++ C
GCのある言語 Java D C# Go Haskell Python Ruby JavaScript ...
336デフォルトの名無しさん
2022/01/01(土) 02:31:24.00ID:KzNGE8bI
>>335
GCの有無で何が変わりますか?
JavaやRuby、Pythonは組み込みにも使われますし、宇宙にだって行きます。
Rustよりずっと広範囲に使われています。
Rustで作られた実用的なソフトウェアはFirefoxしかないじゃないですか。
しかも、そのFirefoxだって熱心な信者以外誰も使わない。
それと比較したら、これらの言語は実用的に使われています。
GCが在ろうとなかろうと。
337デフォルトの名無しさん
2022/01/01(土) 02:32:19.06ID:193tzZ58
>>324
大体代替手段があるのはそうだと思います
例えばnaked functionやglobal_asmは別途asmなりCなりからオブジェクトファイル生成してリンクするという代替手段があります (これがありならC-FFIできる言語は皆同等になってしまいますが...)

もともと C++ でできることは "全て" できるというかなり強い主張をされてた人がいたのでそれは言い過ぎじゃないかと言いたかっただけです


>>332
ご参考まで
https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/java.html
他の言語との比較もありますよ
338デフォルトの名無しさん
2022/01/01(土) 02:33:17.91ID:LNkbwGBY
Rustのポジションに取って変わりたいなら、RustみたいにLinuxのKernelコードに取り込まれていってくれるとわかりやすいんだけどね
なぜC++を含む他の言語はLinux Kernelに採用されないのか、って考えると差が明瞭になってきそうだ
339デフォルトの名無しさん
2022/01/01(土) 02:34:00.98ID:KzNGE8bI
Firefoxのバグの多さを考えても、Rustはバグを生産する言語のように思います。
340デフォルトの名無しさん
2022/01/01(土) 02:35:06.26ID:KzNGE8bI
>>338
ドライバにクラスは必要ないからでは?
341デフォルトの名無しさん
2022/01/01(土) 02:39:59.20ID:jvk1ETyF
>>336
RubyやPythonは遅すぎ&メモリ食い過ぎで話にならない
例えばクックパッド社はRubyで書かれていたのをRustへ置き換えて経費節減に成功している
342デフォルトの名無しさん
2022/01/01(土) 02:42:24.09ID:193tzZ58
そういえば Windows 10にRust使う話ってどうなったんだろうか

>>336
以下の記事にメモリ安全な既存の言語ではだめでCやC++やRustでないといけない理由
それらの中でもRustが良いとされる理由が書かれていますよ
https://msrc-blog.microsoft.com/2019/07/22/why-rust-for-safe-systems-programming/
343デフォルトの名無しさん
2022/01/01(土) 02:57:17.29ID:193tzZ58
>>339
FirefoxについてC++コードをRustに書き換えたらセキュリティに関わる脆弱性数がどうなるか分析した記事がありました
https://hacks.mozilla.org/2019/02/rewriting-a-browser-component-in-rust/
結論としては完璧ではないけどRustの方がバグを減らせるということのようです

MS ResearchやGoogleのAndroidチームも類似の調査をやっていてRust採用は効果有りと判断しているみたいです
344デフォルトの名無しさん
2022/01/01(土) 04:08:48.59ID:KzNGE8bI
JavaやHaskellも多くの人がC++より優れていると分析しています。
速く容易で安全なのです。
全ての点でC++を上回っています。
では、それらの言語を比較した場合、どれが最も優れているのでしょう?
345デフォルトの名無しさん
2022/01/01(土) 04:11:14.25ID:KzNGE8bI
ほとんどすべての言語がC++より優れていると主張します。
という事は、C++はもっとも劣った言語のひとつなのです。
Rustはもっとも劣った言語より優れていると主張しますが、優れた言語、例えばJavaやHaskellと比較したら、かなり劣っているのでは?
346デフォルトの名無しさん
2022/01/01(土) 07:34:43.36ID:JYrmLBPV
多くの人がRustとC++と比較している
比較するなら優れたもの同士を突き合わせるはずだ
なのにJavaやHaskellは影も形もないつまり論外ってことだ
全ての言語がC++に対して優位性を主張するのも
C++が最も現実的で優れた言語だと認めているからであって
わざわざ劣っているものと比較する必要なんてないからだ
347デフォルトの名無しさん
2022/01/01(土) 09:08:27.19ID:193tzZ58
>>344
JavaやHaskellがC++より常に高速というのは明確に誤りです
https://benchmarksgame-team.pages.debian.net/benchmarksgame/index.html

ではC++がこれらの言語より優れているかというとそうではありません
言語にはそれぞれ得手不得手があります
唯一絶対の尺度で優劣を決めようとするのではなく、ある特定の用途に対してどの言語が適しているかという観点で議論した方が生産的かと思います
348デフォルトの名無しさん
2022/01/01(土) 09:44:43.30ID:a+oD+kQK
スレタイ読め。
349デフォルトの名無しさん
2022/01/01(土) 10:50:55.11ID:E1HNnq3M
いつもの人の自作自演
350デフォルトの名無しさん
2022/01/01(土) 19:02:54.41ID:n4zdCVCH
GitHub・Cookpad などは、遅いRuby on Rails から、Go・Rust などへ移行している

2021年10月には、GitHubのコピーのGitLab が上場し、時価総額は約1.9兆円!
こんな大きい時価総額でも、Railsを使い続ける宣言をしている

基本、Railsは中小ベンチャーが、高品質なサービスを作るツール。
2億レコード・取引先が2万社みたいな規模でも、問題ないと言ってた

他には、組み込みのmruby の本も出た。
Webで使えるmrubyシステムプログラミング入門、近藤宇智朗、2020/11

宇宙開発などの組み込み用、MicroPython, Lua, Squirrel の代替になる。
Ubuntu 18.04, C99 対応

人工衛星イザナギ・イザナミで、使っている
351デフォルトの名無しさん
2022/01/01(土) 21:35:42.72ID:1mMbmyWc
C++もJavaも実行時にnull pointerによる参照が起きる可能性があるためどちらも安全性に劣るよね
Rustではenum Option使用でnull pointerによる参照が絶対に起きないことをコンパイル時点で保証した上で
コンパイル後は最適化でOptionがNoneの時にnull pointerを使うという二段構えにより
Rustはコストをかけずに無駄なく安全性の保証を実現しているところに感動した
352デフォルトの名無しさん
2022/01/01(土) 21:45:09.34ID:s+QWpk3m
null安全ぐらいはモダン言語なら当たり前の機能なので、もはやメリットとは感じないわ
例えばTypeScript、Swift、Kotlin、Haskellとか
353デフォルトの名無しさん
2022/01/01(土) 21:56:26.71ID:jvk1ETyF
C++とJavaが前近代的でダメな言語なだけだよな
354デフォルトの名無しさん
2022/01/01(土) 21:59:01.05ID:KzNGE8bI
Javaは速度を追求した言語だから。
355デフォルトの名無しさん
2022/01/01(土) 22:39:11.50ID:KzNGE8bI
Haskellは安全性と並列化を追求した言語です。
356デフォルトの名無しさん
2022/01/01(土) 22:58:31.22ID:1mMbmyWc
RustはHaskellの長所である型クラスをトレイトとトレイト境界で採り入れていたり
HaskellのMaybeモナドやEitherモナドを採り入れてRustの型の核としているところにも感動した
357デフォルトの名無しさん
2022/01/01(土) 23:02:32.16ID:15i3uJ8f
システムプログラミングでCに代替となれるほどRustがイケてるのは、
null安全やメモリ安全はモダンな言語だから当然として、データ競合が起きないことも保証しつつ、実行速度もCに劣らなくて、
それでいてRustと多少のアセンブラだけ使えば、OSや組み込みソフトウェアも普通に記述できるほどフットプリントの小さい低レベルな言語だから
358デフォルトの名無しさん
2022/01/01(土) 23:08:54.95ID:KzNGE8bI
システムプログラミングにはJavaのほうが向いています。
単純に速いからです。
Javaは宇宙でさえ使われる安全で実績のある言語です。
しかも速い。
実行時最適化を行わない言語では無理な速さです。
359デフォルトの名無しさん
2022/01/01(土) 23:23:23.09ID:KzNGE8bI
結局RustはHaskellの真似をするだけの偽物言語にすぎません。
Haskellの並列性、安全保証を移植するには、結局Haskellになるしかないのです。
RustはいずれHaskellになるでしょう。
その時もまだRustと呼び続けるのでしょうか。
360デフォルトの名無しさん
2022/01/01(土) 23:45:51.79ID:L78WNXLf
>>358
ねー、>>347 無視しないでよー
361デフォルトの名無しさん
2022/01/02(日) 01:31:01.49ID:uZMhOgW6
rustのnull安全?はクリティカルコンテキストでも保証されるんか?
362デフォルトの名無しさん
2022/01/02(日) 02:22:18.22ID:TQn3/Mee
もちろんです。
363デフォルトの名無しさん
2022/01/02(日) 08:42:35.10ID:/2Hc/nxf
現状でRustの欠陥は指摘なしなのか
まあ優れた言語だから主流になるとも限らんけど
ここはRust礼賛が多くて参考にならんな
364デフォルトの名無しさん
2022/01/02(日) 08:43:38.07ID:i5Las0bb
>>360
キチの相手するならメールかなんかでやってくれ
365デフォルトの名無しさん
2022/01/02(日) 12:04:39.89ID:7Z2MEM4u
キチの相手するスレやぞ
366デフォルトの名無しさん
2022/01/02(日) 14:18:19.00ID:TQn3/Mee
良いという人だって使ったことないんだから、欠点なんか出てこないよ。
367デフォルトの名無しさん
2022/01/02(日) 14:52:25.82ID:gJq1EeIU
>>361
クリティカルセクションのこと?
368デフォルトの名無しさん
2022/01/02(日) 19:27:00.77ID:ryp06yJk
int型(32ビット)でyy/MM/dd/HH/mmの形で日時を実装しているプログラムは、2022年1月1日0時0分(2201010001)に32ビットの最大値(2147483647)を越えてしまい、エラーが発生する。そういう実装をしているMicrosoft Exchangeでは既に問題が発生中。
みんな仕事始めになって気づいて大騒ぎに
369デフォルトの名無しさん
2022/01/02(日) 19:33:55.23ID:3fzUeLHI
DosDateTime爆死確認w
370デフォルトの名無しさん
2022/01/02(日) 20:28:27.33ID:yz2mFgPr
>>367
ハードウェア割り込みの割り込みコンテキストのつもりで書いた
社内独自用語なんだと思う
そこは気にせんでくれ
371デフォルトの名無しさん
2022/01/02(日) 21:12:20.77ID:l2HAFLEV
>>361
Rustのポインタ(参照)および実体にはnull/nil/undefined等が一切ない
そのためnull問題が起きることはなく所謂null安全が保証されている

nullになる可能性がある場合は汎用のオプション型であるenum Option<T>型を用いる
このOption<T>はenumとしてSome(T)とNoneの二値を取り型Tは任意な型
つまり所謂NullはenumのNoneで表現され型Tとは異なるためnull問題が起きようがない

これで効率やコストはどうなるのか?
null(RustではNone)が使われない時は型Tのまま扱うので従来と同じ
null(RustではNone)が使われうる時は型Option<T>として扱う
型Option<T>から型Tを使うにはNoneでない確認が必要だがこれこそ必須な確認コスト
ポインタ(参照)の場合は値がnullすなわち0になることがないためコンパイル後はNoneが0で表現される最適化となる
つまり結果的にはC/C++と同じになるのだがRustは上述のようにコンパイル時点でnull安全を保証できる点で異なる
372デフォルトの名無しさん
2022/01/02(日) 22:09:32.73ID:TQn3/Mee
Javaのほうが安全。
373デフォルトの名無しさん
2022/01/02(日) 22:11:45.12ID:TQn3/Mee
ぬるぽ例外が発生するから安全じゃないとか言う書き込みがあった。
これはウソ。
ないほうが良いならCはヌルポを検出できないから安全って事になる。
Javaは検出して例外を発生させるから安全なのです。
キチガイに騙されるな。
374デフォルトの名無しさん
2022/01/02(日) 22:18:47.48ID:i8dUNFkB
>ないほうが良いならCはヌルポを検出できないから安全って事になる。

発生したことを検出できないことと発生しないことを意図的に混同している
375デフォルトの名無しさん
2022/01/02(日) 23:11:16.20ID:TQn3/Mee
Firefoxの惨状を見れば全然安全でないことがわかるのに。
なぜ安全と言い張るのか。
376デフォルトの名無しさん
2022/01/02(日) 23:20:08.47ID:Uu3cvt4h
CもC++もJavaも実行時にヌルポ発生するからいずれもダメ
Rustは実行時にヌルポ発生しないことが保証されているから安全
377デフォルトの名無しさん
2022/01/02(日) 23:22:44.87ID:TQn3/Mee
RustアンチがRustを称賛してるのではないか。
378デフォルトの名無しさん
2022/01/03(月) 05:19:23.74ID:Tjf/rOJw
その可能性高いかも
379デフォルトの名無しさん
2022/01/03(月) 06:00:15.35ID:V/HN/Yqp
学会が自らキチガイを演出する手口に栗卒
380デフォルトの名無しさん
2022/01/03(月) 16:10:29.79ID:mJ9yMonw
RustはC++と同じ匂いがする
381デフォルトの名無しさん
2022/01/03(月) 17:15:54.33ID:20WoIOil
このようにRustをやってる奴は性格が捻じ曲がってる
382デフォルトの名無しさん
2022/01/03(月) 17:22:00.01ID:4XbgYwR9
rustってc++より難解だよな
こんな言語が流行るとは思わない
383デフォルトの名無しさん
2022/01/03(月) 17:25:50.42ID:ZyFGqp6z
他の言語と比べればめちゃくちゃ難解だし、Rustコミュニティでもどうすれば簡単になるのかいろいろ議論されている
384デフォルトの名無しさん
2022/01/03(月) 17:32:24.16ID:20WoIOil
ワイじゃないけど必死に褒めてるのにアンチだとか、ウジ沸いてる
385デフォルトの名無しさん
2022/01/03(月) 17:37:11.03ID:5oO4lVIX
Rustファンも、こんなスレに書き込みしないで初心者向け解説でも書けばいいのにな。
386デフォルトの名無しさん
2022/01/03(月) 17:41:11.19ID:nW60oOQF
https://seiya.me/this-website-is-now-powered-by-kerla
このOS Rustで書かれている割にはメモリリークで落ちたりするらしんだけどなんで?
387デフォルトの名無しさん
2022/01/03(月) 17:50:43.83ID:gvPAh7hb
必須じゃないけど他の言語も知らないRust初心者が異常に増えてきているからトンチンカンな推しをするだけで
コミュニティの増加は良いことだが、初心者が書いた意味不明なコードを直すのはあんたら
Null安全系の推しをしてるのはド素人
388デフォルトの名無しさん
2022/01/03(月) 18:13:06.37ID:V/HN/Yqp
メモリ安全が守れればすべてが安全と謳ってる連中は原発は止めれば安心安全とほざいてた奴等と瓜二つ
389デフォルトの名無しさん
2022/01/03(月) 20:13:37.59ID:r29FUtSQ
>>386
そもそもRustはメモリリークが起きないことは保証してくれない
参照カウントが循環参照にならないようにしたり、不要になった参照が残り続けたりしないようにするのはプログラマの責任
なのでプラグラム側になんらかのバグがあったのではないかと

メモリ管理周りを標準ライブラリやOSに全部任せられる普通のアプリケーションとは違って
全部自分でやらなきゃいけない自作OSだからバグなく作るのは難しいというのはあるかと思う
390デフォルトの名無しさん
2022/01/03(月) 21:09:45.15ID:Tjf/rOJw
COBOLならメモリーリーク起こらないよ
391デフォルトの名無しさん
2022/01/03(月) 21:31:36.31ID:Qq3YHLjM
>>389
結局C++と同じで習熟甘いやつが作れば問題起きまくりなの?
392デフォルトの名無しさん
2022/01/03(月) 21:51:41.06ID:WCyHxUxt
>>387
Rustを含めていまどきの言語がnull安全なのは常識
むしろC++やJavaが古すぎて様々な点で時代遅れにすぎない
もちろんRustはもっとその先へダングリングポインタ排除とGC排除を両立した点にある
393デフォルトの名無しさん
2022/01/03(月) 22:09:21.15ID:DUDgVZbY
このように攻撃性と倒錯を丸出しを両立してしまうと初心者っぽさが出てとても引っ掛かりやすい
どこで覚えたのかNull安全からダングリングポインタという関連性がない事を言い出す。
ゴミくずが降り積もっていく・・・
394デフォルトの名無しさん
2022/01/03(月) 22:13:14.24ID:WCyHxUxt
>>391
一般的にメモリ関係諸問題のうちメモリリークのみはGC利用でしか解消と判明している
しかし一方でRustではメモリリークを起こすのも意図的にしか起こせない
Rustには所有権の概念があるため特別に複数の所有権を認める特別な参照を
自分で明示的に使用した上でさらに循環参照を生じさせた時のみメモリリークが生じうる
もちろんそのような場面でも通常は弱参照を併用するためメモリリークは起きない
395デフォルトの名無しさん
2022/01/03(月) 22:14:15.40ID:/9oDM4ll
>>386
自分で独自OSのランタイムやGCを作って
その上で稼働させるアプリがリークを起こすかどうかは
アプリだけじゃなく作ったランタイムやGCのロジックに依存するよね
396デフォルトの名無しさん
2022/01/03(月) 22:17:11.19ID:nLr3i6Wg
nullで落としてるようなバカがnull安全な言語使っても同じく死亡するコード作るだけにしか思えんがな。
あれで救えるコードなんてほとんどないと思うが。
397デフォルトの名無しさん
2022/01/03(月) 22:35:34.97ID:pC8I0HuA
もっとその先へ!草
上のOS記事の作者はリークというかフラグメンテーションの発生だと推測してるが絶対読んでないね。
「意図的にしか起こせない」はい嘘
398デフォルトの名無しさん
2022/01/03(月) 22:36:13.58ID:CMKqgYgE
nullで落としてるようなバカって例えばGoogleのChromeチームとかかな?
まぁ全人類バカなのでしょうがないね
399デフォルトの名無しさん
2022/01/03(月) 22:54:33.28ID:fEzSC6xc
ポインタ(参照)になぜかnull値を許してしまう欠陥言語でのみnull問題が起きる
そうでない普通の言語にとってnull安全は当たり前でありそれを意識することすらない
欠陥言語の存在に対してのみnull安全なる言葉の存在意義がある
400デフォルトの名無しさん
2022/01/03(月) 22:56:23.92ID:pwAwOJBp
>>395
そりゃランタイムやライブラリがバグってたらしゃーないわ

>>396
いや、コンパイルエラーになるからそこでちゃんと直せばいい
まあバカがコンパイルエラーを回避することが目的になって余計ひどいことになる未来もあるけどw
401デフォルトの名無しさん
2022/01/03(月) 23:21:21.46ID:T+WwhkSI
null安全はマジで当たり前すぎてメリットでもなんでもないから
nullの話なんてしたくないわ
402デフォルトの名無しさん
2022/01/03(月) 23:22:53.63ID:T+WwhkSI
そもそもnullのある言語でもnull参照で死ぬなんてのは
よっぽどのクソコードでテストもしてないときだけだろ
403デフォルトの名無しさん
2022/01/03(月) 23:26:20.57ID:r29FUtSQ
関数の定義からnullableが否かが分かるのがOption<T> のうれしいところと思う
加えて引数や戻り値の所有権が分かるのもRustのうれしいポイントかと
404デフォルトの名無しさん
2022/01/03(月) 23:28:42.03ID:r29FUtSQ
fool proofの話をすると Option<T> でも闇雲に unwrap はできるので考えなしのプログラムだとクラッシュする点は変わらない
SEGVじゃなくpanicになるとか、落ちる可能性のある箇所が明示される点でnullよりはマシだが
405デフォルトの名無しさん
2022/01/03(月) 23:34:21.19ID:T+WwhkSI
ほんま、そういうことやな
null安全で助かるケースなんてそもそもわずかしかないんだ
unwrapだとかゼロ除算だとかいろんなロジックミスで結局は落ちる

borrow checkerのおかげでデータ競合が起きない、とからへんが重要なメリットと思う
406デフォルトの名無しさん
2022/01/03(月) 23:35:17.83ID:QWHqEk/O
いやいやww
407デフォルトの名無しさん
2022/01/04(火) 00:27:33.52ID:bkmFGqSu
>>402
> よっぽどのクソコードでテストもしてないときだけだろ
そう言うのがボロボロ転がってますけどw
408デフォルトの名無しさん
2022/01/04(火) 00:32:09.36ID:SqHXhMR8
こちらはNull安全協会です、今なら3,000円お支払い頂くとより安全になり免許証入れまでついてます。
本協会ではNullは許しませんが、DBなどの道路にNullが転がっています。
また外部値など入力が無いことを示すのはResult::Errや特異値:-1やNaNなどで表すものではありませんので
クソ設計はやめてください、Option::NoneでNullを示し、ほかの言語と同じく必ずmatchで検査してください。
unwrapもダメです。Null安全協会では皆様に頂いたご声援でド素人が語れてゴリラのマウントのように
ウッホウッホホと潤っています。またNull安全語り部Rusterの攻撃性は以上ですので近づかないでください
409デフォルトの名無しさん
2022/01/04(火) 10:11:55.33ID:GnZE9ial
C++の利点は何だろ?
410デフォルトの名無しさん
2022/01/04(火) 10:32:59.80ID:qi/CVito
>>409
自由であること
411デフォルトの名無しさん
2022/01/04(火) 10:52:02.62ID:eYWJvdmr
Rustはコーディング刑務所
412デフォルトの名無しさん
2022/01/04(火) 11:03:52.07ID:g6u5uJtl
Null安全性はまともなUXを提供したい場合に生産性を改善する道具
なくても落ちることはほとんどないみたいな視点でしか捉えてないなら価値を理解してない
413デフォルトの名無しさん
2022/01/04(火) 12:02:58.31ID:ri86vl0z
誰のUXやねん
誰の生産性やねん
414デフォルトの名無しさん
2022/01/04(火) 13:26:40.47ID:gSVIkeEa
>>386
GCはメモリーリークおこすし
どこで起こすかが実装によって変わる

GCはゴミなんよ
415デフォルトの名無しさん
2022/01/04(火) 13:32:57.78ID:gSVIkeEa
>>409
もっとも健全なアプリを作りうること
416デフォルトの名無しさん
2022/01/04(火) 14:39:07.88ID:h92/V+9B
>>409
鼻から悪魔が出てきたりしても言語仕様を逸脱していないこと
417デフォルトの名無しさん
2022/01/04(火) 17:56:16.15ID:llSa7WOy
Rustはコンパイルできたら問題は起きないみたいに思ってたけど違うのね
これじゃやっぱり初心者に毛が生えたようなのがゴミコード量産するのかな
418デフォルトの名無しさん
2022/01/04(火) 18:04:30.86ID:eYWJvdmr
ゴミコーダ矯正所
419デフォルトの名無しさん
2022/01/04(火) 18:35:43.62ID:mgG32sq7
それはそう
たとえPrologを使ってもバグはなくならない

でもコンパイラのチェックでなくせる類のバグならなくしたいよね
420デフォルトの名無しさん
2022/01/04(火) 19:10:18.46ID:llSa7WOy
コンパイルを通すために問題の発生するコードを書くとかも考えられるんじゃねーの
そっちのほうが分かりにくいような気がする
421デフォルトの名無しさん
2022/01/04(火) 19:35:35.54ID:aGnbM+4r
>>417
あらゆる問題が起きないかというとそうではない(というかそんなプログラミング言語存在しないと思う)けど
大部分のコードのメモリ安全性がコンパイル時に保証されるのはかなり大きなメリットだと思う

例えばuse-after-freeやバッファオーバーフロー、データ競合なんかは問題が発生してもプログラムかその場でクラッシュするとは限らず、しばらく正しく動くように見えてしまう場合もある
この手の異常の原因特定は難しいので、rustでコンパイルエラーや実行時の問題発生時のpanicなどで即問題箇所が分かるようになっているのはかなり嬉しい
422デフォルトの名無しさん
2022/01/04(火) 19:41:25.66ID:aGnbM+4r
初心者に毛の生えたようなのがゴミコード量産しないようなプログラミング言語ってそもそもどういったものなんだろうか
記述に自由度がなく誰がどう書いても同じになるような言語?
423デフォルトの名無しさん
2022/01/04(火) 19:51:44.75ID:GnZE9ial
それpythonがうたってたきがする
424デフォルトの名無しさん
2022/01/04(火) 19:52:02.24ID:pbb561T/
386みるとメモリリークの原因が不明っぽいんだけど
言語処理系にメモリ関連任せられるにしても結局原因不明のバグが残るんじゃ意味ないんでわ
425デフォルトの名無しさん
2022/01/04(火) 20:04:11.59ID:jb/bub5S
>>424
OS書いてるのに言語処理系にメモリ管理任せられるわけないだろ
自作したメモリアロケータのバグとしか思えんが
426デフォルトの名無しさん
2022/01/04(火) 20:06:56.90ID:KYGdyDbS
>>424
バグの数が0じゃなきゃ意味がないというのは違うのでは
100個バグがあるのと1個しかないのでは開発効率が全然違う
427デフォルトの名無しさん
2022/01/04(火) 20:50:34.04ID:/2oFrrnl
>>409
C++の利点は過去資産
既にバグが枯れた過去資産を活用するのが得策
その他の点ではRustが全て完全に有利
428デフォルトの名無しさん
2022/01/04(火) 20:53:09.33ID:hAXWFplk
Google&MS「バグの70%はC/C++。Rustにする」
http://2chb.net/r/prog/1619943288/
429デフォルトの名無しさん
2022/01/04(火) 21:18:13.95ID:eYWJvdmr
C++でうまくかけないヤツとか構造化の仕方がヘタクソなだけだろ
430デフォルトの名無しさん
2022/01/04(火) 21:26:13.33ID:XgtuTErn
>>424
そう思うんならそれでいいじゃない
意味ないってことで
431デフォルトの名無しさん
2022/01/04(火) 22:20:27.31ID:3laoj6Oq
>>430
それでいいということを認めるなら、>>424にもちゃんと反論しろ
432デフォルトの名無しさん
2022/01/04(火) 22:35:39.57ID:e2VKtfmk
>>428
で、バグが減ったか?まるで変わらんやろ。馬鹿馬鹿しい。
433デフォルトの名無しさん
2022/01/04(火) 22:39:34.49ID:NZNEJALT
C++の存在意義がゼロになったわけではない
C++で作られた過去の莫大なライブラリは今後も併用される
C++しか使えない過去のプログラマーの活用のためにC++を用いる案件もしばらくは残る
434デフォルトの名無しさん
2022/01/04(火) 22:40:33.65ID:f+4ZfnKj
議論したいならまず相手を選ぼうね
ルサンチさんを相手にしても理性的な議論にはならんから
435デフォルトの名無しさん
2022/01/04(火) 22:57:10.37ID:llSa7WOy
個人的には大規模なC/C++の組み込み開発で散々メモリ破壊系の不具合に泣かされてきたから組み込みでRustを使う流れがきてるのに期待してる
国産RTOSだとKMCのToppersベースのOS、SOLIDが最近Rustに対応し始めた
436デフォルトの名無しさん
2022/01/04(火) 23:30:25.45ID:C7kM4kmV
>>435
メモリ破壊ってそんな起きる?
lock,off,len,remainさえ揃ってたら破壊なんて起きなくね?
437デフォルトの名無しさん
2022/01/05(水) 00:36:25.86ID:PXsSrjEd
>>436
そんなには起きないけど1,2機種に1個ぐらいは難問と言われるような不具合があるかな?
共通してるのは再現性がとても低いかつランダムな領域のメモリを破壊する
でもいざ何週間もかけて仕込み入れて再現されて原因特定するとしょーもない不具合だったりする
それこそRustじゃコンパイル通らないような初歩的な原因だったこともある
静的解析ツールは回してるけどどうしても漏れることはある
438デフォルトの名無しさん
2022/01/05(水) 07:47:37.79ID:IIKhgKt4
嘘くせえwメモリ破壊を理由にRustに期待とか意味わからん
MMUがちゃんと設定できてないか、スタック不足でリークしてるだけとか、あるいはスレッド競合に見えるし
比べてる対象がOS前提のRustと、そんなもの無い開発を比べてないか
439デフォルトの名無しさん
2022/01/05(水) 07:48:29.43ID:jCayWhDI
>>436
同意だな
Cなんて学習の過程でなんぼでもメモリ壊すもんだから
逆説的だけどメモリなんて壊し慣れてるんだよ
どうやって壊してるのかどうやったから壊れたのか
だからだんだん目新しい壊し方が無くなってきてスリルは無くなる
440デフォルトの名無しさん
2022/01/05(水) 10:11:35.03ID:RHFS+zMh
バカだろおまえ
441デフォルトの名無しさん
2022/01/05(水) 12:14:32.80ID:R1aBhW/Q
このスレがム板内で一番勢いあるのが笑える
C++やRustの本スレより勢いあるやん
442デフォルトの名無しさん
2022/01/05(水) 17:00:20.32ID:D7gzVahT
>>437
すまん、よく分からんわ…

>>439
分かる
壊し方も調査方法もパターン化してくるし、熟れてくると糞コードセンサーが働いて「この辺じゃね?」って見当つくしな
ログもコアもダンプもないなら難しいけども
443デフォルトの名無しさん
2022/01/05(水) 17:48:42.80ID:od0+oW4W
本当に調査が難しいのは、並列処理があって競合状態が起きてるときかなあ
444デフォルトの名無しさん
2022/01/05(水) 18:37:34.29ID:5WkA2q2d
ランダムな領域のメモリを破壊が毎回起きて組み込みやってます!キリッ
445デフォルトの名無しさん
2022/01/05(水) 19:21:52.17ID:bh75XIUs
HaskellとRustはコンパイル出来た時点でバグが無いことを保証される。
446デフォルトの名無しさん
2022/01/05(水) 19:36:29.51ID:N7h+YsNa
釣り針見えてますよ
447デフォルトの名無しさん
2022/01/05(水) 20:15:39.00ID:bh75XIUs
これが釣りに見えるのか。
驚きです。
448デフォルトの名無しさん
2022/01/05(水) 21:37:09.44ID:hbslRCuW
HaskellとRustのバグはバグじゃなくて仕様と呼ぶからなw
449デフォルトの名無しさん
2022/01/05(水) 22:15:33.82ID:/CcLnr/X
どうせバカが使ってもRc、RefCellばっかのコードで全く所有権なんて活かせないコードにしかならんよ。
450デフォルトの名無しさん
2022/01/06(木) 14:37:54.75ID:eeb9qMHg
>>447
rustのコンパイラって不等号の向き間違ってますよとか教えてくれるの?
451デフォルトの名無しさん
2022/01/06(木) 15:02:23.63ID:rC5yvWMp
日付比較で不等号の向きで古いファイルが消されるか新しいファイルが消されるか決まることもあるしな
ふるい分けファイルの方が日にち稼いでいるからデカいはずだと錯覚するヤツが必ずでてきてデススパイラル撒き散らしたりな
452デフォルトの名無しさん
2022/01/06(木) 15:03:56.77ID:rC5yvWMp
×ふるい分け
○古い
453デフォルトの名無しさん
2022/01/06(木) 16:49:55.21ID:eeb9qMHg
仲介イテレータ君かな
「バグ」という言葉すら独自解釈
454デフォルトの名無しさん
2022/01/06(木) 16:54:48.74ID:/n5h7nDr
釣りじゃなくてマジだったらアカンやつだ
455デフォルトの名無しさん
2022/01/06(木) 18:00:28.75ID:XfL6smUL
でかい釣り針は不都合なものから注意をそらせるために使うもの
456デフォルトの名無しさん
2022/01/06(木) 21:02:54.57ID:WPtX8f+v
>>338
リーナスが例外(パニック含む)を受け入れないから
457デフォルトの名無しさん
2022/01/06(木) 23:56:10.56ID:Q5dnJVm5
Rustなら例外機構がそもそも無いし
パニックを引き起こさないチェック付きの代替も揃っているからな
458デフォルトの名無しさん
2022/01/07(金) 00:30:02.39ID:cXPu1ueH
SanitizerなしでCやC++書ける人にはRust不要かもね
逆に必要な人はRust使った方が幸せになりそうです
459デフォルトの名無しさん
2022/01/07(金) 00:44:00.42ID:yZQL1qV+
例外機構≠パニックという主張はGoでもあるが無理がある。チェックも近代的な言語ならほぼある
460デフォルトの名無しさん
2022/01/07(金) 01:15:29.54ID:9qeGIYdY
Rustは標準ライブラリの条件付きコンパイルをサポートしてるしそのうちpanic-freeな標準ライブラリも作れるようになるんじゃね。知らんけど
461デフォルトの名無しさん
2022/01/07(金) 01:18:46.69ID:KVbSetTk
Rustで特別に安全っていうのはあくまでメモリらへんの事なんだよね
ダングリングポインタ、データ競合、未初期化の変数を読んでしまう、とかみたいなのは起きない
こういうのはC/C++だと巨大プロジェクトではどうしても抜け漏れが出るし、よく脆弱性になるからこれが保証されるだけでもめちゃくちゃ心強い

そんで例外っていう危うい仕組みはなくても、他にも気をつけなきゃいけない事はいくらでもある
例えば内部部割り込み、デッドロック、競合状態、メモリリークとかはunsafe使ってなくても普通に起こるので、
プログラマがちゃんと理解して考えて制御しなければいけない
462デフォルトの名無しさん
2022/01/07(金) 08:07:46.87ID:qbYUQ+0I
>>445が明らかに嘘八百なのに、そのことを無視して>>447とか>>453とか言うのはさすがに無能すぎない?
463デフォルトの名無しさん
2022/01/07(金) 11:19:37.80ID:OPgAeAPs
>>462
445 = 447だし、何いってるかわかんない
464デフォルトの名無しさん
2022/01/07(金) 11:31:20.72ID:HBPsUOSr
>>463
「HaskellとRustはコンパイル出来た時点でバグが無いことを保証される。」
が大嘘ということ。
こんなことを言うのは無能か詐欺師。
465デフォルトの名無しさん
2022/01/07(金) 11:36:10.44ID:SxdBDGb9
誰でも知ってる常識を鬼の首を取ったように言うなよ
見てるほうが恥ずかしくなる
466デフォルトの名無しさん
2022/01/07(金) 11:38:11.47ID:lEqOkEly
>例外っていう危うい仕組み
この捉え方のほうが危うい
467デフォルトの名無しさん
2022/01/07(金) 11:46:55.77ID:9qeGIYdY
>>466
ここで言う例外はプログラミング言語の機能としての例外(大域脱出)のことで一般的な例外処理のことではないのでは
468デフォルトの名無しさん
2022/01/07(金) 12:40:14.57ID:syLxl2NY
>>435
組み込みでRustを使う流れがきてるのに期待してる

同意
469デフォルトの名無しさん
2022/01/07(金) 13:12:58.77ID:qCXwEiOj
>>467
「一般的な例外処理」の定義をしないで語られても
470デフォルトの名無しさん
2022/01/07(金) 13:46:09.88ID:OPgAeAPs
>>464
お前一人だけこのスレで浮いてるわw
黙っとけ
471デフォルトの名無しさん
2022/01/07(金) 13:54:43.45ID:pFd15XiZ
再帰から一気にジャンプ出来る例外案件
472デフォルトの名無しさん
2022/01/07(金) 14:57:02.30ID:0CT3Il9G
Rustの勉強も始めたが
驚き感動することが多くてはまりそうだ
try/throw/catchがないのに同じことが出来てる仕組みに感動した
?一文字でエラーを上位へ委ねることができたり
単なるenumに過ぎないはずのResult型が巧妙に使えるヤツだったり
473デフォルトの名無しさん
2022/01/07(金) 15:04:16.53ID:d3CBVc0r
>>472
おまえいい加減にしろよ
474デフォルトの名無しさん
2022/01/07(金) 15:07:55.28ID:sUYYT/1a
>>467
一般的な例外処理で大域脱出でないのがあればそう言えるけど、そんなのあったっけ。
475デフォルトの名無しさん
2022/01/07(金) 15:48:22.19ID:oWk93qwk
>>472
enumといっても値付きenumだからな
値付きenumとマッチング機構のせいでRustにC++が敗北したとみている
476デフォルトの名無しさん
2022/01/07(金) 16:14:22.26ID:9qeGIYdY
>>469
>>474
https://ja.m.wikipedia.org/wiki/%E4%BE%8B%E5%A4%96%E5%87%A6%E7%90%86
この意味での例外
確かに言語でサポートするなら大域脱出になるか
477デフォルトの名無しさん
2022/01/07(金) 17:12:07.47ID:NadPmQt/
>>476
そのwikiの定義はめちゃくちゃ曖昧だな
回復不能なエラーのことだったり、業務エラーに対するシステムエラーのことだったり
さらには設計で想定されてない問題と言いつつ
ユーザーの入力間違いや他システムと疎通が取れない場合が含まれてたり
478デフォルトの名無しさん
2022/01/07(金) 17:20:41.93ID:TtYC21gO
>>477
なら例外(処理)の明確な定義ってなんだ?
479デフォルトの名無しさん
2022/01/07(金) 17:49:08.57ID:CgdU4kfS
>>478
話の意図や文脈によっていろんな定義がありえる言葉なんだから
自分の定義を話せばいいじゃん
480デフォルトの名無しさん
2022/01/07(金) 17:57:58.23ID:htF+iGlC
>>478
まぁ、ここはプログラミング言語を取り扱っているので、各言語ごとの例外機構のことなんじゃないかな
481デフォルトの名無しさん
2022/01/07(金) 17:58:11.94ID:0CT3Il9G
GoやRustなどの言語には例外処理がないと一般的に言われているけど
これはtry/throw/catchといった特別な枠組みが存在しないことを意味してる
482デフォルトの名無しさん
2022/01/07(金) 18:14:31.53ID:BlSvqzvB
いやまず>>477が定義を示すべきだろw

> そのwikiの定義はめちゃくちゃ曖昧だな

じゃあはっきりしたやつよろしく
483デフォルトの名無しさん
2022/01/07(金) 18:40:25.34ID:zxQaNr2W
結局いつもの気持ち悪い自演コース
484デフォルトの名無しさん
2022/01/07(金) 18:51:47.76ID:g+gfmcT1
例外が発生しないので安全です。
485デフォルトの名無しさん
2022/01/07(金) 18:53:45.04ID:rW64eTg1
いやいや、まず>>467が示すべきだろう
示されたWikipediaは曖昧と言うより色々な例外が記載されてるから、この意味での例外と言われてもどれよ?
ってなってるんだから
486デフォルトの名無しさん
2022/01/07(金) 18:58:51.33ID:g+gfmcT1
古典的言語はどれも例外が発生するので危険です。
487デフォルトの名無しさん
2022/01/07(金) 19:07:57.34ID:IML2cdj0
panicよりマシだろ。
488デフォルトの名無しさん
2022/01/07(金) 19:15:54.57ID:g+gfmcT1
例外が発生しない安全な言語を使うべきです。
489デフォルトの名無しさん
2022/01/07(金) 19:16:41.68ID:g+gfmcT1
例外が発生すると大変危険です。
490デフォルトの名無しさん
2022/01/07(金) 19:28:13.38ID:qbYUQ+0I
正確には、例外が発生する「ような」状況、な。

例外すら出さずにpanicするような言語は論外。
491デフォルトの名無しさん
2022/01/07(金) 19:44:23.16ID:9qeGIYdY
元々 >>461 の言う例外とはなんのことかという話で
言語機能としての例外のことを >>461 は指しているのではないかと推測したのが >>467

461 は panic による大域脱出の発生を防げたとしても他にも気にすることがある、と言い換えても良いのかと思う

>>466 は業務エラーに対するシステムエラーなど他の意味での "例外" (例えばカーネルにおけるメモリ獲得失敗とか) はきちんと取り扱うべきという主張だと思ったので 467 を書いた

変な理解してたらスマン
492デフォルトの名無しさん
2022/01/07(金) 21:01:46.84ID:duI+LFWm
例外安全性を静的に保証できる言語なんて無かったよな
493デフォルトの名無しさん
2022/01/08(土) 07:16:32.27ID:a3IlDrHC
lowlevel、ハードウェアに近い開発者は例外を嫌う傾向にある
494デフォルトの名無しさん
2022/01/08(土) 08:43:00.56ID:MbImecmg
スタック深階層から天元突破する不思議なマホウ
エクスセプションナムパトローナ!
495デフォルトの名無しさん
2022/01/08(土) 09:24:36.18ID:y8+gbORs
>>493
signalはよく使うがな
496デフォルトの名無しさん
2022/01/08(土) 12:05:39.79ID:Q0+pmoTx
try/catchの仕組みはなくても、割り込みの対応はまあどうしても必要だよな?
497デフォルトの名無しさん
2022/01/08(土) 13:29:15.68ID:jKqZNByJ
組み込み用にexception handlerあるみたいよ
498デフォルトの名無しさん
2022/01/08(土) 13:56:43.16ID:L9/OhHd6
言語側に求められる割り込みの対応って何
割り込みの呼び出し規約に従った関数を定義できれば良い?
499デフォルトの名無しさん
2022/01/08(土) 14:36:14.89ID:lA4SvdIz
低レベルの割込み処理に言語側で出来ることはあまり無い
コンパイラ側の対応次第
組込みだとマイコンの割込みベクタテーブルに関数(いわゆる割込みハンドラ)のアドレスを設定するだけ
ハンドラ内のレジスタバンク切替えやコン テキストスイッチングなどは言語の範疇を超えるのでインラインアセンブラで記述する場合もある
500デフォルトの名無しさん
2022/01/08(土) 14:41:47.33ID:5x1u92SJ
>>494
各関数呼び出し毎にRAIIによるデストラクタ処理が入る
だから例外で一気にスタックを巻き上げるだけにはならない
結局try-catch / throwという特殊な枠組みはRustのように無くしてしまえばいいのかもしれない
501デフォルトの名無しさん
2022/01/08(土) 15:35:19.92ID:tKnKvPsu
>>500
>各関数呼び出し毎にRAIIによるデストラクタ処理が入る
Rustのように戻り値で返す場合も同じでは?
それにスタック巻き戻しを伴わないtry-catch/throwもあるよ
502デフォルトの名無しさん
2022/01/08(土) 16:01:51.30ID:L9/OhHd6
>>500
panic&catch_unwindがあるからrustにtry-catch的な機構はあるんだけど
両者を区別する理由があるからRustにはtry-catchがないと言っている?
それとも try-catch という構文がないことだけを言っている?

>>501
try-catchでも関数からの復帰のようにデストラクタが呼ばれるという話だよ
スタック巻き戻しを伴わない try-catch って panic=abort のこと?
503デフォルトの名無しさん
2022/01/08(土) 17:09:19.03ID:MlahXNcM
従来の例外は皆がwikipediaの定義を批判しているように何でもかんでも曖昧に整理されずに詰め込みすぎている
そして各言語でのtry/catchの使われ方も同様

だからRustでは分離したのではないか?
例えば相手の状態や相手からのデータや入出力次第で起こりうる各種エラーは
こちらのプログラムに関係なく起き得ることだから普通に関数の返り値によるエラー処理でよい
一方でそれらとは全く別にプログラムが原因で起きるあってはならない論理的な間違いや
もしくはリソース不足などでの続行不可能などの事象はエラー処理ではないためパニック処理として分離した
したがって曖昧な存在である例外というものは消え去った
504デフォルトの名無しさん
2022/01/08(土) 18:42:49.44ID:Q0+pmoTx
なるほど
Goのpanic/recoverは例外機構なのか、っていうとそうじゃない感じするしややこしいなあ
505デフォルトの名無しさん
2022/01/08(土) 18:50:40.59ID:Q9qOpCpC
461 == 467 == 503
506デフォルトの名無しさん
2022/01/08(土) 18:52:09.09ID:iq37Yx1h
>>503
Rustのpanic って、無かったことにできるようになったの?
Linusがpanic厳禁って言ってたよね?
507デフォルトの名無しさん
2022/01/08(土) 19:06:30.46ID:uo/Nlf0C
>>503
カーネルコードではallocできなくても継続不可能とはみなさないように
何を続行不可能な事象とするかはアプリケーションによって変わる
つまりその分け方は業務エラー/システムエラーや回復可能エラー/回復不能エラーなど従来の分け方と同じ
508デフォルトの名無しさん
2022/01/08(土) 19:52:28.22ID:1etCU7+u
>>505
ちがうよ
509デフォルトの名無しさん
2022/01/08(土) 21:04:20.72ID:MlahXNcM
>>506 >>507
そういうカーネルではアロケーション自体も自作だからそこでパニックを発生させずに
例えばシステムコール要求元にENOMEMなどを返すため>>503の分離ではエラー処理側に分類される
510デフォルトの名無しさん
2022/01/08(土) 21:50:04.90ID:VeAeICw1
例外が発生しなければ安全です。
したがって例外をサポートしない言語が安全です。
511デフォルトの名無しさん
2022/01/08(土) 21:54:31.05ID:FAQD/Dxg
>>510
なあ、例外がなければ安全だなんて言ってる無能な働き者はお前ぐらいだけど、大丈夫?
512デフォルトの名無しさん
2022/01/08(土) 23:09:37.91ID:dcBn+b5K
>>509
>もしくはリソース不足などでの続行不可能などの事象はエラー処理ではないためパニック処理として分離した
>したがって曖昧な存在である例外というものは消え去った
ここで言ってるパニック処理が例外処理そのもの
例外処理用のハンドリング方法を別途用意しただけであって例外というものが消え去ったわけではない
513デフォルトの名無しさん
2022/01/08(土) 23:12:31.28ID:dcBn+b5K
>>509
カーネルコードでアロケーションエラーを例外としてではなく通常のエラーとして処理するのは
アロケーション自体が自作だからではないよ
514デフォルトの名無しさん
2022/01/09(日) 00:21:57.46ID:fLRbfEkO
Rust坊の植民地になった。ここまでC/C++に対する優位性の証明ゼロ、分裂したRust坊を収容するスレ
あんたらが本当に必要なのはRust初心者スレだ。親の仇のようにC/C++に攻撃性を向けるのはもうやめたら?
515デフォルトの名無しさん
2022/01/09(日) 03:40:09.35ID:IJqCXjgr
トリオンが足りないのでは?
516デフォルトの名無しさん
2022/01/09(日) 04:14:04.91ID:sevz4s4M
誰もC++攻撃してないよね
517デフォルトの名無しさん
2022/01/09(日) 09:21:12.75ID:IY0PEP+W
元々はRustスレに定期的に出没する「俺は天才だからC++でも安全なコードを書ける、Rustの制約はパフォーマンスの足枷」ってうるさい奴を隔離するスレだったんだよな
あいつがフェードアウトしたのに逆の意味でスレが機能し続けるのは皮肉なもんだ
518デフォルトの名無しさん
2022/01/09(日) 09:37:17.07ID:E6fr7wut
>>503
英語版wikiの定義を読むといい

例外の定義や理解1つとっても日本がIT後進国なのを痛感する
519デフォルトの名無しさん
2022/01/09(日) 10:02:26.10ID:QVmVQA75
>>518
> 日本がIT後進国なのを痛感する
例外の話だけじゃなくてこれはいろんなとこににじみ出てるよな
いろんなwikipediaの記事も日本語版って何かあいまいだったり
説明が簡潔じゃなかったりして驚く

まぁこれに関しては国のIT進歩度というよりは
あっちの人のほうが単に理論的で
理論的に書くのが好きで
理論的に書いてないのを許さない文化がるんだと思う
520デフォルトの名無しさん
2022/01/09(日) 10:37:31.41ID:oMGs2plE
>>518-519
そういう具体性の欠片もないレスでドヤ顔されても… w
521デフォルトの名無しさん
2022/01/09(日) 10:38:49.37ID:0wOzwgXF
>>519
それが逆に数学分野や工業化学分野だと、日本の方がはるかに端正で正確な記述だと思っているのです…
522デフォルトの名無しさん
2022/01/09(日) 11:07:34.53ID:QVmVQA75
>>521
まぁ個人の感想なんで気にしないでねw
あとプログラミング言語の本も日本人が書いたものより
海外のものを翻訳したやつのほうがスッキリしてると感じる
説明も体系的というか
523デフォルトの名無しさん
2022/01/09(日) 11:28:40.59ID:B5+MKIjQ
www 503 == 520 == 521 www
524デフォルトの名無しさん
2022/01/09(日) 16:55:21.90ID:dllKbKSF
>海外のものを翻訳
ここは笑うところか?
525デフォルトの名無しさん
2022/01/09(日) 18:55:06.30ID:KYx55eM0
wikipediaで知識を語る超初心者がマウント取るための厨房すれ
526デフォルトの名無しさん
2022/01/09(日) 20:11:12.28ID:IJqCXjgr
例外をサポートしない言語は例外が発生しないので例外安全です。
527デフォルトの名無しさん
2022/01/09(日) 21:06:21.23ID:prbTf4O2
型安全性を保証しない言語は型検査エラーを起こさないので型安全ですって言ってるようなもんやん
528デフォルトの名無しさん
2022/01/09(日) 22:16:01.73ID:tE6q+RNQ
例外安全てのは例外によって引き起こされる問題に対して安全かどうかなんだからその喩えは不適切
529デフォルトの名無しさん
2022/01/09(日) 22:29:15.26ID:z2Ja0yjO
何かを言っているようで実質内容がないw
530デフォルトの名無しさん
2022/01/09(日) 22:32:02.28ID:IJqCXjgr
全てのエラーは例外が原因です。
例外サポートを無くしましょう。
531デフォルトの名無しさん
2022/01/09(日) 22:52:05.52ID:8Ry9gb1y
>>526
https://en.wikipedia.org/wiki/Exception_safety
> The guarantees presented here originated out of work on C++, but apply equally to other languages and error-handling mechanisms.
532デフォルトの名無しさん
2022/01/09(日) 23:01:24.93ID:ULYulOFy
Rustがtry-catchの例外機構を持たない理由は非常に単純で
(A) 本質的にリカバリできることは通常のエラー処理だけで十分に対処可
(B) 本質的にリカバリできないことはpanic
前者の(A)では関数がResult<T,E>で返しそれがエラー時Err(E)の時に
処理をスルーして上位へ移譲したいならfunc()?と?を1文字付加だけで済む仕組み

一方で(B)の「本質的にリカバリできない」panicとは具体的に次のどちらかとなる
(1) プログラムに論理的な間違いがある場合
(2) 何らかのリソース不足になった場合

この(1)は具体的に以下のようなケースがある
- ありえない状況に陥ってプログラマー自らpanicさせる場合
- 一部の標準ライブラリに対してありえない値を渡した場合
- 配列などで範囲外のインデックスで操作しようとした場合
- ResultやOptionで正常値でない時にunwrap()した場合
- RefCellやRwLockで実行時借用ルールを犯した場合
これらはプログラムに論理的な間違いがある場合のみ生じるためエラー処理とは本質的に異なる

一方で(2)の「何らかのリソース不足になった場合」は
プログラム自体には論理的なミスはないが何らかが溢れた以下のケース
- 数値型が溢れて計算を続行できない場合
- ヒープが溢れて新たにアロケーションできない場合
- スタックが溢れて新たに関数呼び出しができない場合
このうち数値溢れ演算はpanicを起さないチェック付き演算で置き換えて回避可能
アロケーションもpanicを生じさせないアロケーターを作ることで回避可能

# ちなみに「リカバリできないことはpanic」の考えはクロージャ単位にまで拡張されていて
# panic::catch_unwind(クロージャ)を使うとResult<T,E>を返しpanic時にErr(E)を得られるため
# そのクロージャ自体は内部でリカバリできないがpanic発生を捕捉すること自体は可能

このようにRustでは曖昧な存在である『例外』を廃して
通常のエラー処理と真の異常時であるpanicの二種類に分けて扱っている
533デフォルトの名無しさん
2022/01/09(日) 23:16:25.98ID:ShKK+0Hb
昔のテレビにはホワイトノイズあったけど、そんな感じです
534デフォルトの名無しさん
2022/01/09(日) 23:43:54.04ID:IJqCXjgr
プログラムには二種類ある。
例外か例外でないか。
例外は悪。
それ以外は善。
535デフォルトの名無しさん
2022/01/09(日) 23:45:42.71ID:pQtTDH+G
じゃあ配列の範囲例外が発生するプログラムは全部悪ですね、範囲外を示して書き換えられるようにしないと!
なるほどです!ためになります!
536デフォルトの名無しさん
2022/01/09(日) 23:50:45.64ID:uOSYnK8a
>>535
それはプログラムがバグってるから当然悪
正しいプログラムで範囲外アクセスが生じることはない
537デフォルトの名無しさん
2022/01/10(月) 00:23:41.85ID:KrhDNAF9
>>532
数値の溢れをリソース不足に分類するのは違和感あるなあ
論理的間違いに分類するのが適切では
538デフォルトの名無しさん
2022/01/10(月) 00:56:16.67ID:yjEJqFVX
>>537
例えば以下のフィボナッチ数列を表示するプログラム
fn main() {
let mut m: i32 = 1;
let mut n: i32 = 1;
loop {
println!("{}", m);
let next = m + n;
m = n;
n = next;
}
}
これは45回まで正しく表示した後に46回目に数値が溢れてpanicとなる
プログラム自体に論理的な間違いがあるわけではない
ただ数値の溢れというリソース不足を起こしただけにすぎない
539デフォルトの名無しさん
2022/01/10(月) 01:07:09.56ID:yDWpdoZh
配列の範囲外(Index bounds)と言っているのに、数値の溢れ(overflow)をリソース不足と言い出す
「論理的間違い」とか何を言ってるのかサッパリ分からんな、こんすれの隔離Rust超初心者たち…
540デフォルトの名無しさん
2022/01/10(月) 01:19:02.91ID:yjEJqFVX
>>539
その違いは明白
配列の範囲外アクセスはプログラムが論理的にバグっている時のみ生じる
数値の溢れはプログラム自体が論理的に正しくても生じる
541デフォルトの名無しさん
2022/01/10(月) 01:56:06.89ID:jIBPGNfV
数値型の範囲も論理的に考慮してくださいよ
542デフォルトの名無しさん
2022/01/10(月) 02:26:23.03ID:yjEJqFVX
>>541
それは単なるリソース不足による数値の溢れだから無意味
例えば>>538のプログラムはi32型をi64型やi128型やu128型にすれば少しは延命する
例えばu128型(unsigned 128bit整数)にすれば185個の正しいフィボナッチ数列を出力できる
しかしそこまでに過ぎずこれはリソース不足の問題である
それより上はBigIntなどの数値上の上限がない型を用いることになる
するとこれもいずれ途中でメモリ不足でアロケーションできず同様にpanicするだろう
したがってこれは「プログラムの論理的な間違い」ではなく「数値の溢れというリソース不足の問題」である
543デフォルトの名無しさん
2022/01/10(月) 02:32:35.04ID:p+yOPw5a
>>541
論理的に返答できる相手がどうかも論理的に考慮してくださいよ
544デフォルトの名無しさん
2022/01/10(月) 03:15:13.62ID:B939XhoW
例外は危険なりよ。
545デフォルトの名無しさん
2022/01/10(月) 08:11:22.08ID:G9ZH73mK
有限回のイテレーションしか回せないことが分かっているのに無限ループで書くのはプログラムの論理的な誤りじゃないんだ?
メモリだのファイルディスクリプタだのPIDだのの枯渇、いわゆる通常の「リソース不足」と違って、事前に発生が完全に予見できるのに?
546デフォルトの名無しさん
2022/01/10(月) 08:38:15.28ID:yjEJqFVX
一般的に対策としてはもっと大きな整数が扱える型を用いることになり行き着く先はBigInt
例えば以下のフィボナッチ数列を表示するプログラム
論理的な誤りがあると主張するならば具体的にどこをどう直しますか?
use num_bigint::BigInt;
fn main() {
let mut m: BigInt = 1.into();
let mut n: BigInt = 1.into();
loop {
println!("{}", m);
let next = m + n.clone();
m = n;
n = next;
}
}
547デフォルトの名無しさん
2022/01/10(月) 08:43:23.03ID:gmQTKrMe
>>538
普通は必要とされる範囲を規定してそれに適した型を使う
なのでオーバーフローは論理ミスだよ
548デフォルトの名無しさん
2022/01/10(月) 08:50:28.54ID:G9ZH73mK
>>546
しれっとBigIntに直したそのプログラムには論理的な誤りがあると主張しません
>>538のi32版は論理的な誤りがあり、+の代わりにchecked_addを使って以下のように修正できます
fn main() {
let mut m: i32 = 1;
let mut n: i32 = 1;
loop {
println!("{}", m);
if let Some(next) = m.checked_add(n) {
m = n;
n = next;
} else {
break;
}
}
}
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2021&gist=17058fd1c2a1c69f111ac09a94681ee6
549デフォルトの名無しさん
2022/01/10(月) 08:56:07.29ID:pS98ddBp
>>545
有限回のイテレーションしか回せないとしてもその回数を事前に知るのは困難ではないか?
だから無限ループを用いるとこには何ら問題ないと思う

>>547
範囲を規定できる用途ばかりではないだろう
そのケースは出来る限り多くのフィボナッチ数を出力したいのだから範囲を規定することがナンセンス
550デフォルトの名無しさん
2022/01/10(月) 08:57:32.63ID:pS98ddBp
>>548
それは>>196で既出
551デフォルトの名無しさん
2022/01/10(月) 09:03:32.42ID:yjEJqFVX
>>548
それは>>532の「このうち数値溢れ演算はpanicを起さないチェック付き演算で置き換えて回避可能」の通りだから当たり前
552デフォルトの名無しさん
2022/01/10(月) 09:03:49.79ID:cQg1KnlR
>>549
> 範囲を規定できる用途ばかりではないだろう
規定できる用途の方がはるかに多い
て言うかまともなプログラムなら規定してないなんてことはまずない
テストできないし
> そのケースは出来る限り多くのフィボナッチ数を出力したいのだから範囲を規定することがナンセンス
そんなケース滅多にないだろw
553デフォルトの名無しさん
2022/01/10(月) 09:07:37.24ID:G9ZH73mK
>>551
「チェック付き演算に置き換えて回避可能」は「本質的にリカバリできない」に含まれるのか?

ていうかそもそもその区分は何のために存在するんだ?
Rustが例外を採用しない理由として言語開発者たちがそのように主張しているのか?
それとも君の感想?
554デフォルトの名無しさん
2022/01/10(月) 09:20:25.60ID:yjEJqFVX
>>553
前者はpanicを回避可能
それでも計算続行不可能という点では後者の本質的にリカバリできないに該当なのかな
だからそれらは両立していると思うのだがどうだろうか?

あと「例外を採用しない理由」をなぜここで突然言及するのか疑問だが
もし以下の話について言っているのならば
>>532
>> Rustがtry-catchの例外機構を持たない理由は非常に単純で
>> (A) 本質的にリカバリできることは通常のエラー処理だけで十分に対処可
>> (B) 本質的にリカバリできないことはpanic

チェック付き演算を使用した場合は前者になるし
使用せずにオーバーフローすれば後者になるのだから
そこに何か明白でない論点はないと思うのだがどうだろうか?
555デフォルトの名無しさん
2022/01/10(月) 09:31:36.48ID:aaWRldUf
>>546
それリソース不足にはなるけどオーバーフローにはならないよね?
556デフォルトの名無しさん
2022/01/10(月) 09:44:54.40ID:pS98ddBp
>>552
ケースが多いか少ないかは関係ない
ケースが少ないから無視していいなんてことはプログラミング界隈ではありえない

>>555
元々こう書かれてるからそこはどちらでも関係ないかもな
多倍長整数型が溢れるのはリソース不足しか思いつかん

> >>532
> - 数値型が溢れて計算を続行できない場合
557デフォルトの名無しさん
2022/01/10(月) 11:51:44.97ID:mx4R5SfM
今日はNGしやすくて助かる
いつもこの調子で頼むよ
558デフォルトの名無しさん
2022/01/10(月) 12:01:05.13ID:m6EPjr42
>>553
リカバリできないかどうかは状況に応じて開発者が主観的に判断するものなので
「本質的にリカバリできない」かどうかを考えるのは無意味

エラーハンドリングの基本
もちろんRustの言語開発者も同じ考え方
https://doc.rust-lang.org/book/ch09-03-to-panic-or-not-to-panic.html
559デフォルトの名無しさん
2022/01/10(月) 12:12:45.84ID:pS98ddBp
Rustはそこに書いてあるようにエラーをResultで返すかpanicかの2択で済むもんな
560デフォルトの名無しさん
2022/01/10(月) 13:03:25.90ID:EipmFK9a
>>556
>> - 数値型が溢れて計算を続行できない場合
だからそれは論理間違いだろ
561デフォルトの名無しさん
2022/01/10(月) 13:56:51.54ID:uivNzQl2
数値型のオーバーフローをリソース不足と言って共感得るのは無理だろうな
プログラムにおける上限下限は暗黙的または経験則的に考慮して設計実装されるし、まともなユニットテスト書けば当然検出されるバグ

仮にオープンソースとして世に出すなら、マニュアルやバグレポートに対してどう対処するのか興味ある
562デフォルトの名無しさん
2022/01/10(月) 14:09:36.74ID:NhSa0Exb
曖昧な例外を廃して、とかいっても結局そういう「経験的」とかいう曖昧なレベルでしかなされてないってことよな
563デフォルトの名無しさん
2022/01/10(月) 14:16:44.51ID:pnnjNIgm
本人の理解が曖昧なだけだから
564デフォルトの名無しさん
2022/01/11(火) 15:22:08.76ID:2061HgWk
結局try catch例外処理なんて最初から不要なものだったんだな
だから最近の言語RustやGoにはそのような無駄なものがないわけだ
565デフォルトの名無しさん
2022/01/11(火) 15:51:54.57ID:t1MM9BO+
Rustが例外機構を無くとも同等のことを快適に記述できる要因は二つ
HaskellのEitherモナドを値付きenumとして表現したResult<T,E>を関数の戻り型としたこと
そしてResultがErrの時に?オペレーターにより見えない即時returnをするショートカットを用意したこと
566デフォルトの名無しさん
2022/01/11(火) 16:40:23.19ID:wv+/KAmB
気持ち悪い自演はもうやめてーー
567デフォルトの名無しさん
2022/01/11(火) 21:12:28.05ID:LUMp2LI9
検査例外と一緒なんだけどね
568デフォルトの名無しさん
2022/01/11(火) 21:26:17.78ID:xKqG3MQU
そういえば例外の信奉者ほどJavaの検査例外を糞味噌に言うけど、例外機構の型検査をきっちりやろうとしたら
ああいう方法しかないわけだよね。
569デフォルトの名無しさん
2022/01/11(火) 23:24:53.53ID:Ijlv3HIe
フロントエンドやサーバーサイドは間欠故障まではあっても、大抵リトライとタイムアウトで救える
バックエンドの耐障害性の設計がまともなら、だけど

そりゃエラーチェックなんて馬鹿らしくなるわな
570デフォルトの名無しさん
2022/01/11(火) 23:38:16.29ID:Htfqiioy
大半のアプリケーションでは個別にハンドリングせず
集約エラーハンドラに任せたいとエラーのほうが圧倒的多数だから
呼び出し階層全てにどの例外が発生しうるかを書いていかないといけない検査例外が嫌われるのは自然なこと

Javaの場合は例外クラスの階層の問題とかその他の要素も相まって糞味噌扱い
571デフォルトの名無しさん
2022/01/11(火) 23:39:37.20ID:2061HgWk
なるほど
こういう理解であってますか?
「Javaの検査例外」と「RustのResult/Optionエラー処理」を比較すると

(共通点)
以下をコンパイル時点で強制することで安全性を保証
「誰かがエラー時の捕獲と処理(Javaではcatch、Rustではmatch等)を必ずしていること」

(相違点)
Javaでは例外と同じtry-catchを利用 (そのため入れ子で例外が握り潰されたりややこしい)
Rustでは例外はなく通常の関数呼び出しと値返し処理となり、
関数の返す型がResultまたはOptionのenum型、
多段呼び出しの場合に途中で「?」使用によりエラー時にスルー可、
自分もしくは上位の誰かがResultまたはOptionのenum値をチェックしてエラー処理

Rustではエラー時にエラー表示して終了で良い場合は以下の楽にサボる方法もサポート
最上位のmain()がResult/Optionを返すことで自動的にエラー時に表示終了
ResultまたはOptionをunwrap()等してエラー時に即時panic終了
このpanic終了はスレッド単位やタスク単位も可能なのでサボりサーバー等も実装可
572デフォルトの名無しさん
2022/01/11(火) 23:52:36.57ID:Htfqiioy
Rustも呼び出し階層全てでどのエラーが発生しうるか型で管理しないといけないからJavaの検査例外と同じ面倒臭さがある

面倒臭いからといって全部Result<T, Box<dyn Error>>にしちゃうと何のエラーが発生するのか分からなくなってしまう

面倒臭さと堅牢さのトレードオフ
573デフォルトの名無しさん
2022/01/11(火) 23:58:57.17ID:2061HgWk
>>572
dyn Error返しでもエラー処理自体は可能なので
Rustは様々なサボり方をサポートしつつ堅牢にすることもできる選択があるので良いと思います
574デフォルトの名無しさん
2022/01/12(水) 01:37:24.08ID:nBmB5mPZ
戻り値を返さないコンストラクタやデストラクタ内でエラーが発生したら、例外
以外に通知する方法があるなら教えてほしい。

例外ハンドラを書かないって、エラー処理を一切しない、例えばディスクが一杯で
書き込めないとか、何かあると問答無用で落ちるプログラムってことだぞ。
575デフォルトの名無しさん
2022/01/12(水) 01:42:57.07ID:zk3KtN+K
例外 (panic) 以外ないね
エラーが発生しうる処理はデストラクタが呼ばれる前にやるべきかな
RustでもBufWriterなんかがスコープアウトでdrop呼び出される前に明示的にflush必要だったりする (drop内のcloseで発生するエラーは無視される)
576デフォルトの名無しさん
2022/01/12(水) 02:19:37.87ID:Fd1MyF0L
>>574
I/Oなどエラー発生の可能性が必ずありうるものはRustではResultが返る
唯一の例外がデストラクタすなわちRustではdrop
そこで問題になりうる可能性があるのはRAIIで自動的に呼ばれるデストラクタに依存して処理を行なうケース
エラーを捕捉したい時は>>575のように事前回避するがpanicさせてそれを捕捉も可能
577デフォルトの名無しさん
2022/01/12(水) 11:53:11.60ID:EMNsA0zN
>>574
コンストラクタやデストラクタ内ではエラーが発生しないように作れって習わなかった?
それでも避けようのないエラーなら落としたほうがいい
プログラム全体を落としたくなければスレッドやプロセスを落とす
578デフォルトの名無しさん
2022/01/12(水) 12:24:49.11ID:tJ2PyYKm
C++で例外安全をちゃんとやるの難しそう
579デフォルトの名無しさん
2022/01/12(水) 12:30:04.82ID:ii0KI3af
>>577
デストラクタでエラーはまずいけどコンストラクタで避ける理由は無かろう。
[迷信] コンストラクタから例外を送出してはならない
https://www.kijineko.co.jp/%E8%BF%B7%E4%BF%A1-%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF%E3%81%8B%E3%82%89%E4%BE%8B%E5%A4%96%E3%82%92%E9%80%81%E5%87%BA%E3%81%97%E3%81%A6%E3%81%AF%E3%81%AA%E3%82%89/
580デフォルトの名無しさん
2022/01/12(水) 12:31:30.95ID:ii0KI3af
>>578 Rustなんかだと何か簡単になるの?
581デフォルトの名無しさん
2022/01/12(水) 12:54:54.70ID:zk3KtN+K
unsafeのpanic-safeはそれなりに気を遣わないといけないよね
safeだと特に何も考えなくても良い?
582デフォルトの名無しさん
2022/01/12(水) 14:16:26.71ID:gLPtO7rz
C++は何種類もコンストラクタがあって大変だが
Rustはコンストラクタが無いため問題は発生しない
Rustにも自動で呼ばれるデストラクタはあるが
その前に捕獲すべきエラーが発生しうるものを自分で処理しておくので無問題
583デフォルトの名無しさん
2022/01/12(水) 20:35:54.02ID:xJEGl+xo
俺はコンストラクタで例外投げないし投げさせないな
コマンドのような短命プロセスで雑な実装で良いとか、必然性があるなら別だけど
584デフォルトの名無しさん
2022/01/12(水) 21:30:33.58ID:zk3KtN+K
コンストラクタと言ってるからc++だと思うけど事前条件を満たさないでコンストラクタが呼び出されたらどうするの?
585デフォルトの名無しさん
2022/01/12(水) 21:36:50.23ID:MHAI7amN
南無三!と叫びながらreturn
586デフォルトの名無しさん
2022/01/12(水) 22:39:14.21ID:CbaowxsH
>>583
> コマンドのような短命プロセスで雑な実装で良いとか
何その意味不明な必然性w
587デフォルトの名無しさん
2022/01/12(水) 22:42:53.89ID:5pTy1wN9
いやわかるやろ
長期間安定して走らないといけないプログラムとそうでないのとはあるやろ
588デフォルトの名無しさん
2022/01/12(水) 23:16:19.38ID:DMKGOQqO
>>584
ファクトリメソッド経由でしかコンストラクタは呼び出せないようにするんだよ
589デフォルトの名無しさん
2022/01/12(水) 23:43:13.07ID:DMKGOQqO
コンストラクタでエラーが発生しないようにするのはリークの問題じゃなくて使いやすさの問題
new Hoge()を呼べるなら個別にハンドリングが必要なエラーは発生しないと分かるのが重要
デストラクタと違ってコーディング規約的なもの
590デフォルトの名無しさん
2022/01/13(木) 00:32:37.82ID:RultHF/h
>>589
コーディング規約(w

コンストラクタ内で、動的配列のクラスやテンプレートを使ってると、例外が発生する
可能性は常にある。 他の言語は知らんが、C++の場合、コンストラクタ内で例外が
発生すると、デストラクタは呼ばれない。
591デフォルトの名無しさん
2022/01/13(木) 00:41:21.53ID:RultHF/h
例えば、ファイルハンドルをラップしたファイルクラスがあったとして、引数なしの
デフォルトコンストラクタと、引数でオープン済のファイルハンドルを渡すコンスト
ラクタを定義したとして、後者のコンストラクタが無効なファイルハンドルを引数
として呼ばれたら、例外をスローするように実装するだろ?

後者のコンストラクタは、dup()で複製したファイルハンドル等を扱う際に必要。
592デフォルトの名無しさん
2022/01/13(木) 01:53:08.91ID:hGSK4csp
>>591
ファイルハンドルが無効な場合をエラーとして処理すべきならコンストラクタを直接使わせずファクトリー経由にする
panic相当の例外として処理すべきならコンストラクタ使って例外スローでかわまない
593デフォルトの名無しさん
2022/01/13(木) 05:45:30.92ID:aa54J19o
>>587
それとコンストラクタで例外発生させないことは関係なくね?
594デフォルトの名無しさん
2022/01/13(木) 07:16:55.50ID:QuitFgmw
コンストラクタも例外も存在しないRustでは問題自体が生じない
>>591のケースでもRustでは後者のビルダー関数がResultを返すだけで済む
595デフォルトの名無しさん
2022/01/13(木) 08:12:03.99ID:RultHF/h
Rustって、名前の通り錆付いてるようだな。 例外(Exception)がないって、要は
Panicって名前とtry〜catchと互換性のない俺仕様の記述を発明しただけじゃん。

https://news.ycombinator.com/item?id=11370841
https://www.reddit.com/r/rust/comments/bzaxf2/why_rust_doesnt_have_exception_handling/
http://joeduffyblog.com/2016/02/07/the-error-model/

返す型を限定するのは、C++でもコーディング規約で縛れば済むだけの話だし。

結局、Nullポインタ程度で騒いでいるのは、マニュアルフォーカスのカメラでピンボケ
するとか、マニュアルミッションの車でクラッチ繋ぐのミスると、エンストするって
言ってるのと変わらん気がするナァ。
596デフォルトの名無しさん
2022/01/13(木) 08:32:43.99ID:pYL+3tES
>>595
開発人数が増えると規約を守らせるコストが大きくなるからね
597デフォルトの名無しさん
2022/01/13(木) 08:53:54.36ID:QuitFgmw
>>595
panicと例外は全く異なる
議論に立ち入りたいならばせめて最小限の理解をしよう
完成した通常のプログラムにおいてpanicが発生するのはメモリ不足の時のみ

次に、例外はそもそも必要ないことに気付こう
エラーが発生する可能性があるならばエラーを返せばよいだけだ
これでプログラミングにおいて困ることはない
try〜catchの例外機構はそもそも必要のないものだったのだ
598デフォルトの名無しさん
2022/01/13(木) 12:20:53.94ID:VLvCS3li
>>597
panicが発生したときの制御フローは通常のフローと同じなの?

もし違うのなら、通常フローへの復帰はどうやるの?
599デフォルトの名無しさん
2022/01/13(木) 12:34:07.73ID:k/BdCeDW
>>598
unwindingされてキャッチされるまでスタックが巻き戻るよ
例外と同じ
600デフォルトの名無しさん
2022/01/13(木) 13:04:20.54ID:nB26Onrd
その点も含めて、少なくとも >597 の「全く異なる」は嘘だね。
後段の「エラーが発生する可能性があるならばエラーを返せばよいだけだ」についても、
じゃぁ何で panic があるの?ってなるし、どういうわけか例外憎しで適当なこと言いたいだけみたい。
601デフォルトの名無しさん
2022/01/13(木) 13:23:05.77ID:k/BdCeDW
rustのpanicとかエラーハンドリングの考え方はgolangの影響大きい気はする
Result型を使うか多値でエラーを返すかの違いはあるが、panicという名前と動作、戻り値との使い分けは同じ
602デフォルトの名無しさん
2022/01/13(木) 13:24:11.54ID:k/BdCeDW
なので >>595 のrustは俺仕様を発明したという指摘も事実と異なると思う
603デフォルトの名無しさん
2022/01/13(木) 14:47:56.89ID:ToUR5G3E
エラーモデルの理解が浅い人を寄ってたかって叩いたところで得るものはないぞ
604デフォルトの名無しさん
2022/01/13(木) 15:05:09.73ID:2BXAobev
>>598
panicはバグ発生かメモリ不足でのみ起きる。
だから通常フローへの復帰はせずにabortとなる。
abort前に後処理をしたい時やデバッグ情報を出したい時のためにstd::panic::catch_unwindがある。
それらの処理のためにスタックが巻き戻る。

>>600
一方でtry catch例外処理はpanicとは完全に異なるものである。
単なるエラー処理でも使われて通常フローへの復帰をする。
そのためtry catchが言語の構文となっている言語も多い。
GoやRustにはこの例外処理はなくtry catchも無い。

プログラミングにおいて、エラー処理のためのtry catch例外処理は本来不要なものである。
エラーは関数の戻り値で返せばよい。
このように本来のやり方でエラーを返すのがGoやRustであり、これで実際に動いている。
つまり、単なるエラー処理のための例外機構は必要ないものであることがわかる。
605デフォルトの名無しさん
2022/01/13(木) 15:34:59.47ID:oax73caB
>>604
話が微妙に違うなぁ。

「エラー処理としての例外は不要(panicや例外みたいに制御フローが異なる機能は必要)」
という話と
「例外処理そのものが不要」
という話がごっちゃになっていない?
606デフォルトの名無しさん
2022/01/13(木) 15:50:06.61ID:E5YlFTVp
>>604
> プログラミングにおいて、エラー処理のためのtry catch例外処理は本来不要なものである。
> エラーは関数の戻り値で返せばよい。

あらゆる関数/メソッド呼び出しのたびにエラーチェックをするのが煩雑だから、try-catchが生み出されたんだと思う。
例えば、データベースアクセスが発生する三つの関数を呼び出すとき、
try {
  foo();
  bar();
  baz();
  commit();
} catch () {
  rollback();
}
みたいな。
続行不能なエラーが発生したが、本流に戻る必要があるときは便利。
607デフォルトの名無しさん
2022/01/13(木) 15:52:35.91ID:2BXAobev
>>605
話がごっちゃになっているのはtry catchの例外処理。

Rustでpanicが起きるのはバグとメモリ不足であり、絶対に起きてはいけない状況。
だからpanicの標準動作はそのままabortとなっている。
一方でエラー処理は起き得ることだから関数の戻り値で返す。

一方でtry catchの例外処理は、それらをごっちゃにまとめて扱っている。
単なるエラー処理を、なぜ、try catchで扱ってしまうのか?
それは関数の仕様設計ミスである。
ちゃんとエラーを返せば、単なるエラー処理のための例外処理は不要となる。
608デフォルトの名無しさん
2022/01/13(木) 15:56:44.41ID:wvcpI8iw
Rust擁護するあまり無理筋の論理展開だな
プログラミングに必須じゃない機能は不要と言い出したらキリないのでは
609デフォルトの名無しさん
2022/01/13(木) 15:59:01.01ID:k/BdCeDW
>>607
rustのpanicだってabuseできるし
べき論の話で言ったらC++もエラー処理には戻り値を使うべき

現在のベストプラクティスは両者とも大差ないのでは
610デフォルトの名無しさん
2022/01/13(木) 16:20:05.76ID:2BXAobev
>>606
Rustなら色々やり方あろうけど、わかりやすい例にするとこうなる。

fn main() {
match sub() {
Ok(result) => { commit(); println!("OK: {}", result); },
Err(err) => { rollback(); println!("ERROR: {}", err); },
}
}

sub() -> Result<DataType, Error> {
let a = foo()?;
let b = bar()?;
baz(a, b)
}

foo(), bar(), baz()各々はResultでエラー値も同時に返しているが、エラーチェックはまとめて出来る。
ResultはOkとErrの2つを取るenumであり、matchは強力なswitch相当と思っていただければいい。
try catchといった例外処理がなくてもプログラミングで困ることはない。
611デフォルトの名無しさん
2022/01/13(木) 16:27:12.94ID:E5YlFTVp
>>609
> べき論の話で言ったらC++もエラー処理には戻り値を使うべき

>>606 のコードをこんな感じで書くの?

int process()
{
  if (foo() != 0)
    return -1;
  if (bar() != 0)
    return -1;
  if (baz() != 0)
    return -1;
  return 0;
}

int hoge()
{
  if (begin() != 0)
    return -1;
  int ret = porcess();
  if (ret == 0) {
    if (commit() = 0)
      return 0;
  }
  (void)rollback();
  return -1;
}
612デフォルトの名無しさん
2022/01/13(木) 16:28:29.38ID:E5YlFTVp
>>610
> foo(), bar(), baz()各々はResultでエラー値も同時に返しているが、エラーチェックはまとめて出来る。
できないよ。
失敗した段階で処理を中止する必要がある。
613デフォルトの名無しさん
2022/01/13(木) 16:36:22.32ID:E5YlFTVp
あ、ひょっとして「?;」ってエラーが発生したらそこでsub()を抜けるってこと?
まあ、だとしても、C++でもエラーチェックベースで実装しろということにはならないけどね
614デフォルトの名無しさん
2022/01/13(木) 16:42:23.86ID:E5YlFTVp
大抵の言語では、例外が発生したらスタックトレースが取れたり、例外オブジェクトそのものにエラー発生場所・エラーコード・エラーメッセージなんかが入ってたりするから、使わない手はないと思うよ
615デフォルトの名無しさん
2022/01/13(木) 16:57:19.52ID:2BXAobev
>>611
その場合でも、Rustならば戻り値をResultにしてこのように見やすくプログラミングしやすい。

fn process() -> Result<(), Error> {
 foo()?;
 bar()?;
 baz()
}

fn hoge() -> Result<(), Error> {
 begin()?;
 match process() {
  Ok(()) => {
   commit()?;
   Ok(())
  },
  Err(err) => {
   rollback();
   Err(err)
  },
 }
}

>>613
その通り
?オペレータは、ResultがErr(err)の時にreturn Err(err);する。
正確には便利に変換してくれるreturn Err(From::from(err));だが本筋でないので略。
616デフォルトの名無しさん
2022/01/13(木) 17:01:12.46ID:E5YlFTVp
>>615
> ?オペレータは、ResultがErr(err)の時にreturn Err(err);する。

なるほど、勉強になった
ただ、前述したとおり、書き捨てのプログラムでない限りエラーが発生したときには詳細なエラーログを出力する必要もあるし、Rustの常識が多言語でもベストプラクティスとはならないと思うよ
617デフォルトの名無しさん
2022/01/13(木) 17:09:11.61ID:k/BdCeDW
>>611
googleに聞いてくれ
https://ttsuki.github.io/styleguide/cppguide.ja.html#Exceptions
618デフォルトの名無しさん
2022/01/13(木) 17:24:20.34ID:2BXAobev
>>614
スタックトレースまで必要になるならば、それはエラーではなくプログラムのバグだろう。
その区別を付けたほうが好ましい。
そして、エラーではなくバグならば前述したようにpanicの対象なのでpanicさせることもできる。

>>616
Resultの正常値もエラー値も任意の情報を持たせられるので必要な時に必要な処理をすれば困ることはない。

>>617
そのGoogleのC++スタイルガイドに「C++の例外は使いません。」と明記されているのか。
これはGoogleが正しい。
もちろん、Googleが作ったGo言語に例外はない。
プログラミングにおいてtry catchの例外機構は不要である。
619デフォルトの名無しさん
2022/01/13(木) 17:55:38.36ID:QuitFgmw
try/catchよりもRustの方法が良い点としては
let val = foo()?; とした時に
正常値valの時だけに専念できるだけでなく
foo()はエラーを返すこともあってその処理は上位に委譲していますよ!と
?オペレーターの存在で明瞭になる点

これは裏返せばtry/catch例外方式の致命的な欠点
どこで誰が例外を返すのかわからなかったり
多段呼び出しの途中の関数では例外が通過するのかどうか全てを追わないとわからなかったり
プログラミングにおいて例外は悪だと思う
グーグルはちゃんとわかっている
620デフォルトの名無しさん
2022/01/13(木) 18:12:05.30ID:E5YlFTVp
>>618
> スタックトレースまで必要になるならば、それはエラーではなくプログラムのバグだろう。

エラーが発生した場所がどこであるのかが例外オブジェクトに含まれているなら、スタックトレースが不要な場合もあるかもしれませんが、あればどういう呼び出しのときにエラーが発生したのかわかるので便利です

> その区別を付けたほうが好ましい。

大抵の場合は例外の種別や例外オブジェクトの継承ツリーで区別をつけてると思います
LogicExeptionを継承する例外ととRuntimeExceptionを継承する例外とか

> >>617
> そのGoogleのC++スタイルガイドに「C++の例外は使いません。」と明記されているのか。
> これはGoogleが正しい。

Googleがそうやっているだけで、それがベストプラクティスとは限りません
>>611 のコードにエラーログ出力を追加しようとしたらひと苦労です
621デフォルトの名無しさん
2022/01/13(木) 18:20:01.16ID:YmYunxX5
Googleのスタイルガイドでは、C++の例外は雑に扱えないぐらいには面倒だしメリットがそこまで大きくもない、って書いてるぐらいで、例外は不要だとは断じてないよね

面倒だからGoogleの巨大なレガシーコードには今更例外を導入できないし、それが依存する可能性のあるプロジェクトにも例外は使わせたくない、って感じでしょ
622デフォルトの名無しさん
2022/01/13(木) 18:27:00.76ID:2BXAobev
>>620 >>621
だからこそGoogleもMicrosoftもAmazonもFacebookも一緒になって共同でRust Foundationを設立。
それぞれ新規のものや既存のものの改善などを機会に、Rustへの移行を着実に進めている。
既存の枯れたものまで一気に置き換えるという無駄なことはしないが、今後もC++が使われ続けるのはそれだけになる。
623デフォルトの名無しさん
2022/01/13(木) 18:31:49.09ID:E5YlFTVp
>>622
話がずれていってるけど、大本の話題はこれだからね

> プログラミングにおいて、エラー処理のためのtry catch例外処理は本来不要なものである。
> エラーは関数の戻り値で返せばよい。

あと、軽く調べたが、googleはSTLもboostも基本使えないみたいよ
もちろん、例外をthrowするサードパーティ製ライブラリも使えない
修行僧みたいw
624デフォルトの名無しさん
2022/01/13(木) 18:33:20.28ID:E5YlFTVp
あと、Microsoftは違うスタンスみたいだよ

https://docs.microsoft.com/ja-jp/cpp/cpp/errors-and-exception-handling-modern-cpp?view=msvc-170

> 最新の C++ のほとんどのシナリオでは、論理エラーとランタイム エラーの両方を報告および処理する方法として、例外を使用することが推奨されます。 特に、エラーを検出する関数と、エラーを処理するコンテキストを持つ関数の間に複数の関数呼び出しがスタックに含まれている可能性がある場合に当てはまるとします。 例外は、エラーを検出して情報を呼び出し履歴に渡すコードに関する、正しく定義された正式な方法を提供します。
625デフォルトの名無しさん
2022/01/13(木) 18:52:55.65ID:2BXAobev
>>624
なるほど
プログラムのバグとエラー(=入出力や相手次第で発生)の両方を、ごっちゃに同じ例外で扱ってる自覚はあるわけだ。
>>615のRustのように書ければ例外を使わずともエラーを綺麗に明瞭に処理できるのだが、
C++では言語の機能不足のため、修行僧モードになるか例外を使うかの二択なのだろう。
いずれにせよMicrosoftもRustに積極的だから、時間をかけて脱C++へ進んでいることに変わりはない。
626デフォルトの名無しさん
2022/01/13(木) 19:13:49.01ID:E5YlFTVp
>>625
> プログラムのバグとエラー(=入出力や相手次第で発生)の両方を、ごっちゃに同じ例外で扱ってる自覚はあるわけだ。

そもそも、アプリケーションプログラマバグによる例外のthrowはほぼ書かないと思いますけどね
バグ由来の「異常発生」には、ほぼ誰も気にしてないと思うよ(もちろん、最終的な処理が必要なら書くけど)

> いずれにせよMicrosoftもRustに積極的だから、時間をかけて脱C++へ進んでいることに変わりはない。

多分、30年は無理じゃないかな(個人の感想です)
Java, C++がでてきてからもう30年くらい?かな
COBOLやFORTRANの生き残り具合を鑑みるとそう思えます

https://www.tiobe.com/tiobe-index/
Fortran 19位
COBOL 25位
Rust 26位 ← 思ったより検討してた
627デフォルトの名無しさん
2022/01/13(木) 19:25:42.66ID:DCVQhT4S
Rustの利点はわかったけど、?演算子とpanicは例外の発展形にしか見えないなぁ。
(?演算子でエラー移譲を受けた)呼び出し元は、エラーを無視してもpanicしなくて済むのかしらん?
エラーを処理しなきゃいけないんだったら例外と大して変わらん気がする。
628デフォルトの名無しさん
2022/01/13(木) 19:47:20.65ID:sBBuaSsw
例外は危険。
使うべからず。
629デフォルトの名無しさん
2022/01/13(木) 19:47:53.64ID:2BXAobev
>>626
単なる通信エラーにすぎなくてもtry catchの例外で受ける例はあるよね。
>>606のデータベースアクセスの例だと、DBサーバーとの通信時エラーが起きるとfoo()は例外を投げることになる。
しかも例外を投げるのはfoo()自身ではなく、そこから呼ぶDBサーバ通信部分だったり、そこから呼ぶ汎用通信ライブラリだったり、誰が例外を投げるかわからない。

>>627
今書いている関数で例外が発生するのかどうか、奥底まで追わないとはっきりしないデメリットが例外にはある。
?演算子を使えば、下からエラーが来ていて上へエラー処理を移譲していることが明確になる。
あと、質問に対する答えは、main()関数までもがさぼってResultを返せば、自分でエラー処理をせずともエラー表示される。
630デフォルトの名無しさん
2022/01/13(木) 20:16:47.27ID:Pln9PLvq
>>629
実際にはこないのに来るかもしれないと思わせるだけかもしれないだろ
それならtry catchだって来ると思っとけばよい
631デフォルトの名無しさん
2022/01/13(木) 21:01:12.03ID:QuitFgmw
>>627
エラー処理はそんな大変なことではなく例えば
if let Ok(value) = foo() {
 bar(value);
}
と正常値の時だけ処理したりも出来る
正常値を得るにはif letやmatchやその他にResult型のメソッドなどを必ず使わないと正常値を取り出せないので
Rustではエラー値なのにチェック忘れで突き進むバグが生じないのも利点
632デフォルトの名無しさん
2022/01/13(木) 21:59:08.34ID:W/MOMDn7
Rust全くわかってないんだけどOkはマクロ?
633デフォルトの名無しさん
2022/01/13(木) 22:10:33.52ID:7TJ/z3m3
>>632
EnumであるResult型がとりうる値の種類
パターンマッチさせてResultの中身がOkの場合だけ条件が真になる
634デフォルトの名無しさん
2022/01/13(木) 22:14:53.71ID:7TJ/z3m3
>>627
メリットでもデメリットでもあるが例外との一番の違いは
関数の型でどういうエラーが発生するのかしないのか分かるという点
635デフォルトの名無しさん
2022/01/13(木) 22:26:16.24ID:+PFReeTS
>>570
>大半のアプリケーションでは個別にハンドリングせず
>集約エラーハンドラに任せたいとエラーのほうが圧倒的多数だから

どこでなぜ起きたかわからないエラーをキャッチしてもなぁ。
erlangのlet it crashのようにエラーの種類は考慮しないってんならわからんでもないけど。
636デフォルトの名無しさん
2022/01/13(木) 22:36:17.73ID:2BXAobev
>>632
Okはenumの識別子。
Result型はenumでありOk(正常値)とErr(エラー値)のどちらかになる。
enumといってもRustは識別子に付随する値を持つこともできる。
つまりC/C++には無い新たな枠組みで、これがRustを強力にしている一つ。

>>630
try catchは関数呼び出しが多段になった時に、
途中の関数ではtry catchもthrowも出てこないから情報がなく気付けない。
Rustは途中の関数で?オペレータを必ず付けるから、
エラーが起きる可能性があることを必ず認識できる。

>>631
Resultに対して多数のメソッドがあって短くエラー処理できる点もいいね。
例えば以下の2つは同じで、エラー時にDEFAULT_VALUEとなる。
let a = foo().unwrap_or(DEFAULT_VALUE);
let a = if let Ok(value) = foo() { value } else { DEFAULT_VALUE };

以下の2つも同じで、エラー時にクロージャ |err| bar(err) の値となる。
let b = foo().unwrap_or_else(|err| bar(err));
let b = match foo() {
 Ok(value) => value,
 Err(err) => |err| bar(err),
};
637デフォルトの名無しさん
2022/01/13(木) 22:40:25.51ID:t/cn/0uo
>>588
bad_allocは絶対発生しないシステムなの?
638デフォルトの名無しさん
2022/01/13(木) 22:56:39.62ID:FqgOTQou
>>635
集約エラーハンドラは汎用のエラー画面表示やログ出力のためだぞ
例外の中身を見ればどこでなぜ起きたかはわかるがユーザーには対処できないものを扱う
Erlangは軽量プロセス単位のリトライなので全然違う
639デフォルトの名無しさん
2022/01/13(木) 23:29:52.77ID:+PFReeTS
>集約エラーハンドラは汎用のエラー画面表示やログ出力のためだぞ

例外マンセー軍全員こう思ってる?
参ったw
640デフォルトの名無しさん
2022/01/14(金) 00:04:27.93ID:InXswW/0
>>631
戻り値無し(副作用目的)で失敗する可能性のある関数もチェック忘れ防げるようになってたっけ?
641デフォルトの名無しさん
2022/01/14(金) 00:14:04.94ID:0aNzNV+4
例外が嫌いすぎて例外使ったことないエアプだから、頓珍漢なことしか言えない
議論する価値ないわ
642デフォルトの名無しさん
2022/01/14(金) 00:14:49.01ID:Gws88Xz4
>>640
正常系の戻り値がない関数なら戻り値はResult<(),Error>になって、これを無視するとwarningが出るから気付く
643デフォルトの名無しさん
2022/01/14(金) 00:19:25.76ID:fGcmjtxY
>>640
まず関数の戻り型はResult<(), Error>となる
()はRustで戻り値なしを意味しタプル0個と覚えれる
次にその関数を普通にfoo();と呼び出すコードを書く
すると「使われていないResult値がある」とコンパイラに警告される
したがってエラー値チェックを忘れていることに気付ける
644デフォルトの名無しさん
2022/01/14(金) 00:20:04.51ID:InXswW/0
>>642
おー、ほんとだ。いいね。
https://doc.rust-lang.org/src/core/result.rs.html#71-75
> //! A common problem with using return values to indicate errors is
> //! that it is easy to ignore the return value, thus failing to handle
> //! the error. [`Result`] is annotated with the `#[must_use]` attribute,
> //! which will cause the compiler to issue a warning when a Result
> //! value is ignored. ...
645デフォルトの名無しさん
2022/01/14(金) 13:50:52.20ID:CyyU39UP
>>629
> 今書いている関数で例外が発生するのかどうか、奥底まで追わないとはっきりしないデメリットが例外にはある。

今書いている関数では、ハンドリングする例外に着目するだけでいいんだが
(何を言ってるのかわからんかもしれんが)
646デフォルトの名無しさん
2022/01/14(金) 13:52:22.52ID:CyyU39UP
>>639
> 参ったw

何が参ったなのかわからんが、例外オブジェクトがエラーの情報を持っているから汎用処理にできるんだが
647デフォルトの名無しさん
2022/01/14(金) 13:55:14.01ID:CyyU39UP
Googleのコーディング規約が神だと思ってるみたいだが、発表された当時内容があまりにアレだったので界隈がざわついた記憶がある
組み込み関連は知らんが、それ以外でGoogleのコーディング規約を取り入れてるところはないんじゃないか
648デフォルトの名無しさん
2022/01/14(金) 14:37:16.30ID:B7zHdTDq
参考にしてるのは業務でまともにC++を使ったことがない素人ばかりかもね
649デフォルトの名無しさん
2022/01/14(金) 14:45:16.44ID:Ml4XYYXN
>>629
> 今書いている関数で例外が発生するのかどうか、奥底まで追わないとはっきりしないデメリットが例外にはある。
逆にRustだとなんかの理由で奥底の関数がエラーを返すように変更されたらその上の関数全てを変更するってこと?
650デフォルトの名無しさん
2022/01/14(金) 15:08:09.78ID:CyyU39UP
Rust始めたばかりだからまだよくわかってないが、エラー処理周りのこと調べると、まだまだ迷走中な感じだな
少なくとも初手から言語仕様として完璧なエラー処理構造が入ってたわけではないことがわかった

Rust のエラーまわりの変遷
https://qiita.com/legokichi/items/d4819f7d464c0d2ce2b8
651デフォルトの名無しさん
2022/01/14(金) 15:14:13.63ID:fGcmjtxY
>>649
まず一般的にどの言語であっても奥底の関数の仕様が変更されたらそれを吸収できるところは変更となる
次にエラーが起きない関数が突然にエラーが起きるようにはならないのでそんな仕様変更は起きない
入出力相手があるものは初めからエラーが起きうることがわかるしメモリ上の操作だけであってもsearchやmatchなど成否が起きうるものも最初からわかっている
652デフォルトの名無しさん
2022/01/14(金) 15:21:48.16ID:/o+2ilkb
「そんな仕様変更は起きない」ということはなく、普通にAPIの設計ミスっててやっぱりエラーになる可能性あった、というのはありうる
その場合Rustならコンパイルエラーで気付くが、例外だとこれまで例外出さなかった関数が急に出すようになるわけで、なかなか厳しいね
653デフォルトの名無しさん
2022/01/14(金) 15:24:49.44ID:Ml4XYYXN
>>651
> まず一般的にどの言語であっても奥底の関数の仕様が変更されたらそれを吸収できるところは変更となる
例外なら途中の関数の変更は不要だよ

> 次にエラーが起きない関数が突然にエラーが起きるようにはならないのでそんな仕様変更は起きない
お前さんの妄想は要らんよ

> 入出力相手があるものは初めからエラーが起きうることがわかるしメモリ上の操作だけであってもsearchやmatchなど成否が起きうるものも最初からわかっている
計算だけしかしない関数が外部に計算させるように変更されたらどうするの?
654デフォルトの名無しさん
2022/01/14(金) 15:28:08.59ID:Ml4XYYXN
>>652
> 例外だとこれまで例外出さなかった関数が急に出すようになるわけで、なかなか厳しいね
例外出すように変更したら当然それを受けるように変更するでしょ?
例外なら発生と受けるところの変更だけで済むけど、Rustだと間の関数も全て変更が必要じゃね?
655デフォルトの名無しさん
2022/01/14(金) 15:34:01.30ID:B7zHdTDq
try-catchは素人にはうまく使えないよなあ、とは思う
656デフォルトの名無しさん
2022/01/14(金) 15:36:58.27ID:bXd4RL2X
てかエラー処理全般、本気でやるとしたら世の中でできるやつはかなり限られてる。
GAFAとか含めてもそう。
657デフォルトの名無しさん
2022/01/14(金) 15:37:15.18ID:/o+2ilkb
>>654
自分で変更したとしても、それを使っている箇所を漏れなく変更できるか?という問題もあるし
ましてや依存ライブラリの仕様変更だったらどうするの?という話
誰もがCHANGELOGを正しく書いてくれるわけではないし、見落としだってある
658デフォルトの名無しさん
2022/01/14(金) 15:44:57.54ID:fGcmjtxY
>>654
途中で低位層の仕様が変わるとか有り得ない机上の空論に対して
どこまで何を前提にしていいのか何もかも不明だから誰も何も答えられない
659デフォルトの名無しさん
2022/01/14(金) 15:51:24.55ID:Ml4XYYXN
>>657
ああRustだと全部変更必要だけどサボるとコンパイルエラーになるってことか、了解
コールツリー作れれば例外でもチェックできそうな気もする

>>658
>>652 とか俺も例まで書いてあるのに理解できないアリエナイ君は出てこない方が良いかとw

> 計算だけしかしない関数が外部に計算させるように変更されたらどうするの?
660デフォルトの名無しさん
2022/01/14(金) 16:03:30.57ID:/o+2ilkb
>>659
まぁ変更が面倒というのは全くその通り
個人的にはコーナーケースのデバッグコストを事前に払ってるだけだから面倒よりありがたいって思ってるけど、嫌いな人はいるだろうね
661デフォルトの名無しさん
2022/01/14(金) 16:16:10.98ID:Ml4XYYXN
面倒というより本質的に途中の関数には関係ないはずなのに修正が必要になると言うのがちょっと嫌かな
まあ現状ではmore betterなんだろうけどなんとか洗練されないものかと
662デフォルトの名無しさん
2022/01/14(金) 16:27:26.86ID:WRwvxAen
>>659
外部サーバーに計算させるよう変更するには
まずその外部のIPアドレスかホスト名かそれらを含むURIなどが新たなパラメタとして引数に入る
途中の関数があるとすれば全て影響を受けるだろう

さらにそのようなことが必要な規模の計算の場合
外部サーバーを使わずとも自分のところでも並列計算をしていたはずである
また計算以外も含めて今どきはマルチスレッド利用が前提とすると
スレッド間の例外は不可もしくは例外を使わず受け渡しをして投げ直すことになる
結局これは例外を使わない場合と同じことをせざるをえなくなる
663デフォルトの名無しさん
2022/01/14(金) 16:39:58.04ID:Ml4XYYXN
>>662
> まずその外部のIPアドレスかホスト名かそれらを含むURIなどが新たなパラメタとして引数に入る
クラスとか使ったことないのかな?

> 外部サーバーを使わずとも自分のところでも並列計算をしていたはずである
はずはず君w
もう少し考えてからレスしないと恥の上塗りにしかなってないよ
664デフォルトの名無しさん
2022/01/14(金) 16:45:29.34ID:eFXg0S3t
>>662
計算じゃなく、データベースにクエリー投げるとか普通にあるだろ。 そういう場合、
いちいち関数の引数にIPアドレスやホスト名を渡すのではなく、オブジェクトメンバ
として持たせて、計算メソッドを呼ぶって実装にするのでは?

んで、サーバー応答がない場合だけでなく、IPアドレスやホスト名をセットせずに、
計算メソッドを呼んだりしたら、例外を投げるよな?
665デフォルトの名無しさん
2022/01/14(金) 16:46:26.60ID:CyyU39UP
>>658
> 途中で低位層の仕様が変わるとか有り得ない机上の空論に対して
> どこまで何を前提にしていいのか何もかも不明だから誰も何も答えられない

やっぱり例外のことわかってないね
自作関数hoge()がサードパーティ製ライブラリの関数foo()を呼び出しているとき、hoge()ではfoo()が送出する例外をどうするかを実装するだけでいい
その後、foo()が更新されfoo()が依存するライブラリが例えばIoErrorをthrowするようになってfoo()はそれに対して何もしないとしても、hoge()は変更する必要がないし知る必要もない
666デフォルトの名無しさん
2022/01/14(金) 16:48:22.67ID:fGcmjtxY
並行並列処理した時点で例外が破綻するのは事実だな
擬似的に例外を伝播させるにしても途中でエラー値渡しが必要
例外を使えば途中は何も考えなくていいはウソだな
667デフォルトの名無しさん
2022/01/14(金) 16:55:06.25ID:CyyU39UP
そもそも、例えばJavaScriptでnpmパッケージを少しつかうと、数百個のnpmパッケージがインストールされて数千個のthrowが実装されてて、全貌を知るなんて無理んだんだよ
そんなこと知らなくても、JavaScriptでアプリコードは書ける
668デフォルトの名無しさん
2022/01/14(金) 16:56:04.83ID:Ml4XYYXN
>>666
スレッド内では関数を多段に呼び出すことはないという主張なのかな?
669デフォルトの名無しさん
2022/01/14(金) 16:57:10.80ID:CyyU39UP
やっぱこいつ例外のことなんもわかってねーわ
670デフォルトの名無しさん
2022/01/14(金) 16:59:50.72ID:WRwvxAen
>>663 >>664
計算を与えるものと
サーバー情報を与えるものは
明らかに独立して扱うべきもの
内部で計算するなら前者だけで済む
なるべく依存関係を少なくモノリシックにならないように設計するのが常識

>>664
ホスト名がないとかサーバーが応答しないとか
そんな普通に起こりうることはエラーを返す
671デフォルトの名無しさん
2022/01/14(金) 17:02:36.16ID:8BRe3wDd
>>665
知らなくていいメリットか知りようがないデメリットか
672デフォルトの名無しさん
2022/01/14(金) 17:02:40.51ID:fGcmjtxY
>>668
並列計算スレッドの中で多段に呼ぶのはいいが何をしたいんだ?
ちゃんと頭の中が整理できていないだろw
コードを書いたことあるのかね?
673デフォルトの名無しさん
2022/01/14(金) 17:03:04.21ID:CyyU39UP
例外がわかってないっつーか
プログラミングど素人だったわw
674デフォルトの名無しさん
2022/01/14(金) 17:10:08.74ID:aHL9Oj90
>>654
そうだよ
Tで返してたところをOption<T>で返すように変更が入るとかは普通にある

型で表現できることのメリットの裏返しで
型で表現してるからこそそれに依存してるところは全部変更が必要
誰か書いてたけど検査例外と同じデメリットがある
675デフォルトの名無しさん
2022/01/14(金) 17:13:19.40ID:aHL9Oj90
>>665
これはRustでも同じ
hoge()ではfoo()が返すResult<T, E>のErrorだけ気にすればいいように作る
(正確にはfooを含むmod Fooが定義するErrorのうちfooが返すものだけ気にする)
676デフォルトの名無しさん
2022/01/14(金) 17:13:47.97ID:WRwvxAen
>>665
JavaScriptについてちゃんとわかっていないようだな
それらは大量にあっても自分のところに飛んで来ないthrowだ
自分のところに飛んでくるthrowはcatchしないとuncaughtExceptionで怒られる
だから下から例外が来るか否かは把握していないといけない
そもそも途中でライブラリの仕様が変わって例外を投げるようになること自体がナンセンスだが
677デフォルトの名無しさん
2022/01/14(金) 17:26:27.30ID:fGcmjtxY
>>667
まずは例外の基本を理解しなさい
ライブラリ群のソースの中に何千個のthrowがあろうが各々のtry-catchで閉じ込められておりその外に対しては一切無関係
関係があるのは自分に向かって来る分のみ
678デフォルトの名無しさん
2022/01/14(金) 17:43:36.82ID:UhvSPNNm
>>670
> 明らかに独立して扱うべきもの
機能が一緒なのに?
君のべき論ならそうなのかも知れないけど、それが一般的というわけではないよね
679デフォルトの名無しさん
2022/01/14(金) 17:45:12.30ID:UhvSPNNm
>>672
整理できてないのは お・ま・え w
680デフォルトの名無しさん
2022/01/14(金) 17:48:13.03ID:UhvSPNNm
>>674
そこは了解
まあ単純に上位に渡すだけならIDEで自動で修正とかできそう
681デフォルトの名無しさん
2022/01/14(金) 18:00:55.12ID:fGcmjtxY
>>679
じゃあ並列計算スレッドの中で多段に呼ぶ関数があるとして
どういう仕様変更をせざるをえなくなるのか具体的に答えてみよ
無いと思うけどな
682デフォルトの名無しさん
2022/01/14(金) 19:16:22.53ID:kUhlpB/h
そもそもrustで言うと Result<T, E> の E を変更するのは破壊的変更だから普通は依存crateのエラー型をそのまま外部に見せるようなことはしない
683デフォルトの名無しさん
2022/01/14(金) 19:42:59.80ID:7uXlwHnS
>>681
スレッド内ではシングルスレッドと同じだろ
スレ読み直してこい
684デフォルトの名無しさん
2022/01/14(金) 19:49:44.98ID:fGcmjtxY
>>683
で、並列計算スレッドの中で多段に呼ぶ関数があるとして
具体的にどういう仕様変更をせざるをえなくなるのか早く答えて欲しい
無いと思うけどな
685デフォルトの名無しさん
2022/01/14(金) 20:30:51.27ID:TehXI+gA
コードの修正が必要になるって話な

> 逆にRustだとなんかの理由で奥底の関数がエラーを返すように変更されたらその上の関数全てを変更するってこと?
686デフォルトの名無しさん
2022/01/14(金) 20:46:13.89ID:WRwvxAen
>>685
エラーに限らず一般的によくあることだね
返すべき値が増えたり
返すべき型が変わったり
あるいは逆に
引き渡す値が増えたり
引き渡す型が変わったり
それらは機能追加変更でも起きるけど
リファクタリングでも起きたりしてる
Rustでも他の言語でもその状況は変わらない
687デフォルトの名無しさん
2022/01/14(金) 21:26:13.10ID:9EKaNxsm
話の流れ見えてる?

> 例外なら発生と受けるところの変更だけで済むけど、Rustだと間の関数も全て変更が必要じゃね?

> 面倒というより本質的に途中の関数には関係ないはずなのに修正が必要になると言うのがちょっと嫌かな
688デフォルトの名無しさん
2022/01/14(金) 21:29:54.99ID:qeE4Uiz1
>>686
それがコールツリーを遡って何層にも伝播していくのは普通にある事ではない
あるなら設計が悪い
689デフォルトの名無しさん
2022/01/14(金) 21:33:39.15ID:8BRe3wDd
どこでどういう例外が発生するか全部把握している人にとっては造作もないこと
690デフォルトの名無しさん
2022/01/14(金) 21:40:25.58ID:WRwvxAen
>>687
Rustでも下位でエラー(例外)の種類が増えたとしたら
同じように上位の関数でそれらのエラーを処理する場合
?オペレーターで飛ばす途中の関数はそのまま変更ないよ
691デフォルトの名無しさん
2022/01/14(金) 21:52:56.30ID:kQdsKxlC
>>690
少し上のレスくらいは読んでくれ…

> 逆にRustだとなんかの理由で奥底の関数がエラーを返すように変更されたらその上の関数全てを変更するってこと?
692デフォルトの名無しさん
2022/01/14(金) 22:00:42.61ID:0UR5WO3U
>?オペレーターで飛ばす途中の関数はそのまま変更ないよ

?オペレーターかどうかは関係ないやろ
いつもいつもホントいい加減な事言うよなぁ
693デフォルトの名無しさん
2022/01/14(金) 22:16:08.15ID:WRwvxAen
>>691
その関数の元の戻り型と変更後の戻り型次第じゃないかな
元々がそのエラーと別の他のエラーを返しているか何らかの理由でResultならば
既にその関数呼び出しに?オペレーターを付けてあるので変更なし
その関数の元の戻り型が新たにResultになったのならば
その関数呼び出しに?オペレーターを付ける
それに応じて自分自身に対しても以下同様

>>692
間違ったことは言っていないつもりだが
もし何かミスがあれば指摘くれるとうれしい
もうそろそろ寝室へ移動するが
694デフォルトの名無しさん
2022/01/14(金) 22:28:31.33ID:Rec6pgsK
検査例外の不便さを軽減しつつ例外が送出されることのみ型で明記する方式をとったのがSwift
RustのResultを返す方式と基本思想は同じだがエラーの型を明記しなくていいので使いやすい
695デフォルトの名無しさん
2022/01/14(金) 22:32:28.06ID:8BRe3wDd
エラーの種類を型で区別するというのがそもそも無理があったんだろうな。
696デフォルトの名無しさん
2022/01/14(金) 22:35:46.65ID:WRwvxAen
>>694
エラーの型の明記自体は必要なことだから問題ないんじゃないかな
>>695
もちろんRustではdyn Errorで何でも楽する形から個別に用意して堅牢にする方法まで様々な形態を取ることができる
697デフォルトの名無しさん
2022/01/14(金) 22:45:19.38ID:/e6eXz55
>>693
> その関数呼び出しに?オペレーターを付ける
> それに応じて自分自身に対しても以下同様
だからそれが必要だろって話
てか、話がループしてるからはよ寝ろ
698デフォルトの名無しさん
2022/01/14(金) 22:53:53.91ID:WRwvxAen
>>697
型が変わるケースのみ最小限の限定した対応が必要となるのは当たり前
そんな常識を「必要だろ」とわざわざ言われても…
おやすみ
699デフォルトの名無しさん
2022/01/15(土) 00:46:19.46ID:2yxrsW1B
言語が違うんだからやり方や考え方が違うというのはべつにどうでもよくて
どちらの方がバグを生みにくいのかが気になる
エラーハンドリングにまつわるバグもいろいろあるけど、例えばリカバリ可能なエラーを取り逃してプログラムがクラッシュする可能性が低いのはどっちなの?
700デフォルトの名無しさん
2022/01/15(土) 02:37:29.52ID:p6KpEKbL
メモリがないとパニックしてabortってなんなの?
動作変えられないの?
701デフォルトの名無しさん
2022/01/15(土) 02:40:42.88ID:+D8ShBal
>>699
それならばRustが安全
Rustのenum Result型から正常値を取り出すには
matchやif letもしくはResult型のメソッドunwrap_*()などの
エラー値ではない時のみ正常値を取り出し使える手段を必ず経る必要がある
つまり正常値を使って処理していくコードはエラー値ではない時だけしか動作しないことが保証される
702デフォルトの名無しさん
2022/01/15(土) 08:12:31.52ID:f2+KU74o
>>698
常識と言いながら話をループさせるのはもしかして認知症… w
703デフォルトの名無しさん
2022/01/15(土) 08:49:08.65ID:2yxrsW1B
>>701エラーケースのリカバリの話をしているんだが
704デフォルトの名無しさん
2022/01/15(土) 09:29:13.90ID:qyAynvOh
>>701
例外でも保証されるじゃん
何言ってんの
705デフォルトの名無しさん
2022/01/15(土) 09:44:44.45ID:GF5575Ny
ここはrustをよく知らない人に
rust初心者がrustをゴリ押しするスレです。
706デフォルトの名無しさん
2022/01/15(土) 09:46:20.74ID:l/1QpEiq
>>699
強いて言えばRustかな
707デフォルトの名無しさん
2022/01/15(土) 10:05:00.72ID:l/1QpEiq
できるだけコンパイル時にチェックしてくれるほうが良い。
708デフォルトの名無しさん
2022/01/15(土) 10:09:23.43ID:CrZ3UR5p
>>699
JavaやSwiftみたいに検査例外があるやつはRustと大差ないだろうね
非検査例外しかないやつだとcatch忘れるのを防げないが
あとはfinallyやdeferによるエラー時の後始末は忘れる可能性があるが、RustならRAIIに任せられる範囲内でなら忘れない
709デフォルトの名無しさん
2022/01/15(土) 10:10:14.51ID:zYbpVr1V
日本語初心者でもありそう
710デフォルトの名無しさん
2022/01/15(土) 10:12:01.91ID:zYbpVr1V
>>708
C++との比較だとRAIIは同等だが検査例外がない分Rustの方が有利ということか
711デフォルトの名無しさん
2022/01/15(土) 11:12:22.12ID:jGOB5mcp
>>710
そういうことやね
あとはそのメリットと
> その関数呼び出しに?オペレーターを付ける
> それに応じて自分自身に対しても以下同様
をしないといけない面倒さのトレードオフかと
712デフォルトの名無しさん
2022/01/15(土) 11:19:39.12ID:TPVIWwIW
そういや、Rustの?演算子の性能コストはどうなの?

プログラマの負担を増やしても行儀正しいコードを強制しようとするRustが?演算子による明記を選んだのはなんとなくわかるけど、性能コストがどうなるかは気になるところ。
性能調査結果とかある?
713デフォルトの名無しさん
2022/01/15(土) 11:32:51.20ID:Y9H47hY4
>>708
エラーハンドリング方式の違いによる有意な差なんてないよ
それ以外の要因のほうが大きすぎるから
714デフォルトの名無しさん
2022/01/15(土) 11:38:21.03ID:3NVItroQ
>>712
単に戻り値を返すだけだから
戻り値方式と例外方式の性能比較を参考にすればいい
715デフォルトの名無しさん
2022/01/15(土) 12:12:09.32ID:i0u9aJCP
setjmp/longjmp系と違ってSwiftみたいにResultに展開されるのもあるから
コードの見た目と性能は必ずしもリンクしない
716デフォルトの名無しさん
2022/01/15(土) 18:52:31.41ID:Ipn+w0vn
>>712
Rustの?演算子による即returnと
C++の例外によるスタック巻き戻しの性能は同じ
どちらもRAIIだから通過する各関数の各ローカル変数に対するデストラクタが全て呼ばれる

>>715
C++の例外は上述のようにデストラクタ処理があるため単なるlongjmpとは異なる
あとヒープがメモリ解放されるためにはunique_ptrとshared_ptrを用いることが必須
717デフォルトの名無しさん
2022/01/15(土) 20:23:33.12ID:4ScfLEDx
>>716
> あとヒープがメモリ解放されるためにはunique_ptrとshared_ptrを用いることが必須
必須じゃないだろ
デストラクタで解放すればいいだけ
まあちゃんとやるには色々面倒ではあるが
718デフォルトの名無しさん
2022/01/15(土) 20:53:33.23ID:Ipn+w0vn
>>717
もちろん自分で毎回漏れなく面倒を忘れず頑張るならばその通り
そのコストは見合わないから
単なるポインタ使用ではダメという意味でunique_ptrとshared_ptrを用いることが必須と書いた
719デフォルトの名無しさん
2022/01/15(土) 22:12:38.76ID:6Cf3x1KF
>>716
>Rustの?演算子による即returnと
>C++の例外によるスタック巻き戻しの性能は同じ
全然違うよ
コンパイル時の設定にもよるが
一般的には例外が投げられないケースに最適化するから
例外が投げられた時は桁違いに遅い
720デフォルトの名無しさん
2022/01/15(土) 22:14:04.01ID:im+Hgbd+
>>719
桁違いは言い過ぎでは
数割とかじゃないの
721デフォルトの名無しさん
2022/01/15(土) 22:19:26.94ID:dcFP2dQT
>>718
必須の意味わかる?w
722デフォルトの名無しさん
2022/01/15(土) 22:26:24.89ID:Ipn+w0vn
例外が投げられなくても
try/catchの記述をしただけでコストが余分にかかる
723デフォルトの名無しさん
2022/01/15(土) 22:41:23.56ID:xm4DJboQ
>>719
どっちかって言うと例外にならないケースのオーバーヘッドの方が知りたい
724デフォルトの名無しさん
2022/01/15(土) 22:53:35.49ID:Ipn+w0vn
>>723
例外が発生するしないに関わらず
例外が発生した時のために必ず準備をしておくのでその分のオーバーヘッドがある
725デフォルトの名無しさん
2022/01/15(土) 23:42:43.37ID:EjYm1enE
>>724
あるのはわかってるよ
rustとC++のどっちがでかいかって話で
726デフォルトの名無しさん
2022/01/15(土) 23:50:30.00ID:p6KpEKbL
議論を見てるとC++に落ちこぼれたヤツがRust派に立って復讐劇を繰り広げてるかのようだな
727デフォルトの名無しさん
2022/01/16(日) 00:12:49.41ID:96P6/01/
>>722,724
そのタイプの実装は廃れて、今はコンパイル時にテーブル用意して「準備」を済ませる実装が主流だと
思ってるんだけど、その「コスト」「オーバーヘッド」って何見て言ってるの?昔の記憶?
728デフォルトの名無しさん
2022/01/16(日) 00:29:49.74ID:tGF8resU
c++も言語仕様マウント馬鹿でクソ化した言語の一つだが、rustは確実にその跡を継いでる。
729デフォルトの名無しさん
2022/01/16(日) 02:06:36.28ID:/5pAmXxV
まあRustは、ほぼC++の真似で一部を独自仕様にしてるから。
糞な部分を受け継いでる事もあるだろう。
730デフォルトの名無しさん
2022/01/16(日) 07:12:19.25ID:/5pAmXxV
Firefoxの評判を見れば、Rust製アプリがどういうモノかわかる。
Google Playでコメントを見れば良い。
731デフォルトの名無しさん
2022/01/16(日) 14:08:27.44ID:KLhMVNjz
所詮LLVM言語、FirefoxのエンジンがWebkitに勝てない時点でUnixのコマンドでも書いてなさいってこった
732デフォルトの名無しさん
2022/01/16(日) 19:06:11.93ID:/5pAmXxV
バグの多さでは勝っている。
ハイ論破。
733デフォルトの名無しさん
2022/01/16(日) 19:34:05.93ID:/5pAmXxV
コンパイル出来た時点でバグが無いことを保証される。
したがって、落ちるのはバグでなく仕様。
いまどき落ちるブラウザなんてありえないし。
734デフォルトの名無しさん
2022/01/16(日) 21:35:06.24ID:Ww+icYU/
>>725
Rustのエラー返しのコストは
C++のエラー返しのコストと同じ
C++の例外が最もコストが高い
735デフォルトの名無しさん
2022/01/16(日) 21:43:20.67ID:96P6/01/
>>734 正常フローの効率を考えるとそうとも言い切れんだろう。
736デフォルトの名無しさん
2022/01/16(日) 22:21:08.50ID:5EvfPXLa
>>734
だ・か・ら
> どっちかって言うと例外にならないケースのオーバーヘッドの方が知りたい
に答えなよ
737デフォルトの名無しさん
2022/01/16(日) 23:27:18.62ID:1VPU7xju
C++もRustやSwiftを真似する方向性なんじゃないの?

738デフォルトの名無しさん
2022/01/16(日) 23:31:51.57ID:nsZpNQQv
これは例外のほうがコストがかかる。
だからC++においても何でも例外を使うということはなく、
普通にエラーを関数の返り値として返している。
739デフォルトの名無しさん
2022/01/16(日) 23:51:28.74ID:ATzv91LI
そういえばRustってメモリ不足補足出来なかったけど、あの時のFirefoxってメモリ不足したらどうしてたんだろ
740デフォルトの名無しさん
2022/01/17(月) 00:35:40.34ID:Y2e2eRad
>>739
何を言いたいのか意味不明だが
補足が捕捉ならばメモリ確保(reserve)はエラーを返すので捕捉できる
fn main() {
let len = 1_000_000_000_000;
let mut v = Vec::<usize>::new();
if let Err(e) = v.try_reserve(len) {
println!("ERROR: {}", e);
return;
}
(0..len).for_each(|i| v.push(i));
}
741デフォルトの名無しさん
2022/01/17(月) 00:44:45.54ID:cHHOCMrz
linux限定の話かもしれないけど他の言語ってcopy on writeとかoom killerとかあってもメモリ不足捕捉できる?
742デフォルトの名無しさん
2022/01/17(月) 01:06:34.70ID:pDDWG/YH
>>740
これ最近出来た機能じゃない?
これがなかった頃はどうすんだろって
743デフォルトの名無しさん
2022/01/17(月) 01:22:04.37ID:Xrw8ALdy
>>741
oom killerはSIGKILL送られてくるから言語関係なくプロセス側でできることは何もない
744デフォルトの名無しさん
2022/01/17(月) 02:02:32.53ID:r1AaVufT
Firefoxの惨状を見る限り、Rustは危険。
745デフォルトの名無しさん
2022/01/17(月) 02:12:46.28ID:Xrw8ALdy
linuxだとデフォルトでオーバーコミットされるからユーザー空間のプロセスでメモリ不足時になんかするのは難しいんじゃないの
746デフォルトの名無しさん
2022/01/17(月) 07:08:26.02ID:ypEAhTIw
>>744
なにかあったん?
747デフォルトの名無しさん
2022/01/17(月) 07:16:09.48ID:PVU3+zDV
>>744
どうしたん?
話聞くよ?
748デフォルトの名無しさん
2022/01/17(月) 15:45:19.32ID:GEy/Uk6l
バリバリのプログラマーとか元より
マウス操作の超上手い(自称)理系とか別に嫌いじゃないけどね
749デフォルトの名無しさん
2022/01/17(月) 16:14:38.28ID:rdgDbl6j
コンパイルできた時点でバグがないことが保証されるのに、rust 本体がbugfixされるのはなぜでしょう
750デフォルトの名無しさん
2022/01/17(月) 17:55:53.78ID:ELzuAkl4
>>749
キチガイアンチが「コンパイルできた時点でバグがないことが保証される」と誰もがガセとわかることを連呼する理由は
「コンパイルできた時点で様々な安全性が保証される」という現実が羨ましくて逆恨みでその事実から目を背けたいから?
751デフォルトの名無しさん
2022/01/17(月) 18:09:16.17ID:rdgDbl6j
>>749
ちょっといってる意味がわかりませんねぇ
落ち着いて書込みしましょう
752デフォルトの名無しさん
2022/01/17(月) 18:10:18.31ID:rdgDbl6j
>>751
あ、俺もアンカー消す方マチガエテ、意味不明になったわw
753デフォルトの名無しさん
2022/01/17(月) 18:27:39.21ID:Y2e2eRad
>>744
先週ニュースになったFirefoxの件は
QUIC利用のHTTP/3実装の問題がクラウドプロバイダー側での設定変更で発動して接続障害が起きただけ
当然プログラミング言語とは全く関係なく既に修正された
754デフォルトの名無しさん
2022/01/17(月) 19:42:53.02ID:Xrw8ALdy
>>749
なぜ「コンパイルできた時点でバグがないことが保証される」と思ったのですか?
755デフォルトの名無しさん
2022/01/18(火) 00:02:30.21ID:4U9kmoTP
まだまだ枯れてないので致命的バグがあるようですね
仕事じゃ使いたくない
756デフォルトの名無しさん
2022/01/18(火) 00:25:05.38ID:/4x0Ci4W
>>755
致命的バグとは何ですか?
C++にもRustにもそんな話は聞いたことがないのですが
757デフォルトの名無しさん
2022/01/18(火) 00:52:32.38ID:4U9kmoTP
>>756
聞いたことないって、聞こうとしてないの間違いでしょ
1.52.1でも致命的バグがfixされたし
758デフォルトの名無しさん
2022/01/18(火) 01:55:30.01ID:gaAtUhso
C++は今後も仕様拡張を続けるから枯れることはない
GCCも毎回大量のバグリストを抱えている
759デフォルトの名無しさん
2022/01/18(火) 02:54:11.55ID:2IDU/MkV
Firefoxはサイトによって落ちるから見れないサイトがある。
アマゾンもどうしても見れないページがある。
不便。
760デフォルトの名無しさん
2022/01/18(火) 03:07:49.11ID:/4x0Ci4W
C++とRustのプログラミング言語のスレで
なぜブラウザやサイトのページの話をする人がいるんですか?
761デフォルトの名無しさん
2022/01/18(火) 07:20:12.18ID:4U9kmoTP
>>758
君の所では仕事にRust を使えるかもしれないが、うちじゃ使えない、それだけの話
なぜなら枯れてないから
762デフォルトの名無しさん
2022/01/18(火) 07:56:24.51ID:MsojyETm
処理系にバグのない言語って実際あるの?
763デフォルトの名無しさん
2022/01/18(火) 08:20:43.00ID:oJq/xgpq
>>762
brainf*ckとか。
764デフォルトの名無しさん
2022/01/18(火) 08:51:14.65ID:xRQ/46rp
すべてのバグを仕様扱いにすればバグがなくなる
765デフォルトの名無しさん
2022/01/18(火) 11:16:05.86ID:Rc17/4VF
>>761
興味本位の質問だけど、どのC++言語仕様とコンパイラはどのバージョン使ってるの?
どれくらい古ければ枯れてると見なしてるのかが気になる
766デフォルトの名無しさん
2022/01/18(火) 13:40:34.49ID:M8yXIS4d
>>765
> どれくらい古ければ枯れてると見なしてるのかが気になる

枯れてなければ(リリース日が古くなければ)利用しないということではないよ
様々な状況を勘案して利用するものを決定する
ただし、いわゆる「メインストリーム」から外れているものについては、枯れているかどうかはかなり重要

ちなみに、うちではRHEL系のOSを使っていて、基本はそれに付属しているデフォルトバージョンを使う
今だと、gcc 8.5.0
ただし、Linuxだとサードパーティ製ライブラリ等をコードからビルドする必要がある場合があり、そのときは8よりも新しいものも使う
使えるのは、公式がリリースされているバージョン9系のパッケージと10系のパッケージ

また、プロジェクト毎にチームの合意があれば、はじめから9系あるいは10系を使うこともできる
(といっても、プロダクトコードをC++で記述するケースはかなり減ってはいる)
767デフォルトの名無しさん
2022/01/18(火) 13:50:21.68ID:xRQ/46rp
Firefoxはもちろん、LinuxやAndroid OSでもすでに採用されているのに、
いつになったらメインストリームといえるようになるの?

さすがにレガシープロジェクトの言語が置き換わるなんて無理だろうし
768デフォルトの名無しさん
2022/01/18(火) 13:51:23.33ID:xRQ/46rp
Rustのことね
769デフォルトの名無しさん
2022/01/18(火) 13:51:28.49ID:M8yXIS4d
ちなみに、Rustも全く使えないわけではなくて、許可されれば周辺ツール作成レベルなら使える場合もある
なお、RHEL 8系のRustのデフォルトパッケージのバージョンは、1.54.0まで来ている(インクリメンタルコンパイルがデフォルトで有効になったバージョン)
770デフォルトの名無しさん
2022/01/18(火) 13:54:30.02ID:M8yXIS4d
>>767
イメージでしか語れないが、Go言語レベルくらいになれば、メインとして使っても良いというところが増えると思う
771デフォルトの名無しさん
2022/01/18(火) 14:00:29.63ID:xRQ/46rp
なるほど
でも、そもそもこんな低レベル向けな言語は、ウェブ開発用の言語ほど使われないだろなあ
組み込みはそのうち使われるようになるだろうけど、
ゲーム開発とかでも使われるようになるのかな?
772デフォルトの名無しさん
2022/01/18(火) 14:27:44.88ID:M8yXIS4d
>>767
そうそう、
> Firefoxはもちろん、LinuxやAndroid OSでもすでに採用されている
ということができるのは、コンパイラのバグを見つけたら自分で修正してPR投げられるほどの優秀な人材が揃っていて、なおかつ工数を潤沢に取れるから
凡人チームがメインで採用できるようになるには、もう少し時間が必要だと思うよ
773デフォルトの名無しさん
2022/01/18(火) 14:47:32.73ID:5CNF/fSF
>>771
Goがウェブ開発用言語という認識?
774デフォルトの名無しさん
2022/01/18(火) 14:53:49.46ID:DDrab3An
ウェブ用言語とは思わないけど、一時期のRubyのようにウェブの用途でめっちゃ使われてると思ってる
Goが本当に得意なのは、並列処理の実装だろうけど
775デフォルトの名無しさん
2022/01/18(火) 15:11:19.46ID:LYrwkmfN
並列処理が得意なのはRustじゃないの?
776デフォルトの名無しさん
2022/01/18(火) 15:20:06.50ID:pFQ6G5F3
>>774
並列処理が楽に書けるのは書けるんだけど
データ競合バグもカジュアルに入れ込んでしまう…
Rustみたいなコンパイル時のデータ競合検出はGoにこそ欲しかった
777デフォルトの名無しさん
2022/01/18(火) 16:27:48.98ID:iglFlRVe
カジュアルなのは-raceで検知できるでしょ
778デフォルトの名無しさん
2022/01/18(火) 17:36:38.20ID:BpSUiOU+
おやおや?今度は Go vs Rustですか?
779デフォルトの名無しさん
2022/01/18(火) 18:07:04.20ID:Rc17/4VF
Goはコンパイル時にあれこれ頑張る言語ではないからこそ実現できてる使い心地もあるんじゃないかね
780デフォルトの名無しさん
2022/01/18(火) 18:21:20.45ID:FTXPyBz0
goとか例外ないゴミじゃん
781デフォルトの名無しさん
2022/01/18(火) 18:28:12.54ID:2IDU/MkV
総合すると、RustとRubyがお勧めって事かな。
782デフォルトの名無しさん
2022/01/18(火) 18:33:33.11ID:rfyLmrnY
>>780
panic/recoverが例外
783デフォルトの名無しさん
2022/01/18(火) 18:38:34.25ID:fqF8MHNf
C++は20年かかってやっと例外の実装が間違いだと認めて方向転換しようとしてる
784デフォルトの名無しさん
2022/01/18(火) 18:51:46.66ID:M8yXIS4d
>>783
何の話?
https://cpprefjp.github.io/lang/cpp17/remove_deprecated_exception_specifications.html
だとしたら、見当違い
785デフォルトの名無しさん
2022/01/18(火) 18:56:29.95ID:tSEDFRaR
>>767
"MAIN"streamなんだから、近くにデカい言語があるようじゃ無理だろ。
Perlに対してpythonくらいの関係にならないと。
786デフォルトの名無しさん
2022/01/18(火) 20:05:56.87ID:gaAtUhso
>>777
Goの-raceは実行時の競合検出だからオーバーヘッドで重いし余分にメモリも喰うし
実際に競合する実行状況にならないとレアケースはいつまでも検出できない欠陥
つまりGoはC++と同じ状況
787デフォルトの名無しさん
2022/01/18(火) 21:30:18.33ID:LRDfdMqN
>>786
race付きでコンパイルしたものは本番で使わないよ
788デフォルトの名無しさん
2022/01/18(火) 21:45:51.63ID:gaAtUhso
重くて本番で使わない結果
本番環境で運用中に生じる競合を検出できない
789デフォルトの名無しさん
2022/01/18(火) 21:46:20.73ID:Edb5UGZv
>>787
そりゃそうなんだけど実際検出したいバグは本番環境で長時間実行したらたまに出る、みたいなやつなので
手元でrace付けて簡単に再現するやつはそもそもそんなにデバッグにも苦労しないし、いまいち噛み合ってない感はあるなぁ
790デフォルトの名無しさん
2022/01/18(火) 21:56:48.08ID:kepaLF1q
>>783
例外と例外指定の違いもつかないでC++批判か
791デフォルトの名無しさん
2022/01/18(火) 22:02:37.92ID:L9ANQ96E
>>776
自動でのチェックはできないかもしれないけどgoroutine間で変数を共有しないよう
注意するなら目視チェックでも十分だと思うがなぁ。
792デフォルトの名無しさん
2022/01/18(火) 22:07:29.63ID:6oUcJD0w
>>791
横からレスするけど、並列処理をガツガツ書く機会って少ないから
ちゃんとわからずに書く人多すぎんだよ・・・
やっぱRustみたいなコンパイル時に厳しくチェックしてくれる言語って重要だと思う
793デフォルトの名無しさん
2022/01/18(火) 22:14:10.77ID:Edb5UGZv
>>791
目視で99%見つけても1%残ったら落ちるからなぁ
多人数開発してて差分でレビューしてるときに全部発見できるかというと…できるか?
794デフォルトの名無しさん
2022/01/18(火) 23:02:11.65ID:L9ANQ96E
>>776のようにカジュアルに発生するってのは問題だが1%見逃すのは仕方ないんでないの?
並列処理のデータ競合バグを100%排除できる言語なんてある?
795デフォルトの名無しさん
2022/01/18(火) 23:23:43.01ID:3Ht6lHCg
>>794
少なくともRustはコンパイラやunsafe絡みのバグを除けば原理的には100%なんだから、それと同じくらいまでは頑張って欲しい
せっかくgoroutineが使いやすいのに、目視レビュー頑張ってって言われるとちょっと…
796デフォルトの名無しさん
2022/01/18(火) 23:31:50.26ID:VN+VluXj
>>784
これ読んできなよ
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0709r4.pdf
797デフォルトの名無しさん
2022/01/18(火) 23:42:36.64ID:L9ANQ96E
例えばCでグローバル変数絡みのバグを防ぐためにグローバル変数使用禁止という規約はよくあるが
それを守るには目視チェックでも十分。そのくらいの感覚。
798デフォルトの名無しさん
2022/01/18(火) 23:59:32.27ID:gaAtUhso
みんな理解していると思うが念のため
Rustコンパイラが100%保証するのは「データ競合(data races)」が起きないこと
だからその点ではC++やGoよりは遥かに優れている

一方でデータ競合を除く「競合状態(race conditions)」を100%検出する方法は存在しない
だからデッドロックなどはRustコンパイラでも当然ながら検出できない

もちろんデッドロックはロック順序決めで対応できるし
Rustならロック解除し忘れ防止も大丈夫といったように別の解決方法となる
799デフォルトの名無しさん
2022/01/19(水) 00:10:47.44ID:mUI3y0qL
>>796
例外じゃなくてエラーコードにしろよ派の人かと思ったよ
これね
https://cpplover.blogspot.com/2018/07/c.html
800デフォルトの名無しさん
2022/01/19(水) 00:23:42.92ID:7HSVmIfo
>>796
Stroustrup の反論に遭って2年ほど塩漬け状態だねぇ。
https://github.com/cplusplus/papers/issues/310
801デフォルトの名無しさん
2022/01/19(水) 01:17:11.35ID:cSOd3D9g
>>788
テストしないのかな?
それともテストで検知できないような設計しちゃってるのかな?
802デフォルトの名無しさん
2022/01/19(水) 01:48:14.37ID:+cO9q0A4
>>799
C++の従来の例外の諸問題を解決するため
オーバーヘッドが無く決定的な例外(zero-overhead deteministic exceptions)が提案されていてそれを静的例外と呼ぶわけね
その静的例外はexpected<T,E>みたいな感じで関数の返り値として返すわけか
そのexpected<T,E>はRustのResult<T,E>とほぼ同じで別途P0323R10としてstd::expectedへ向けて進行中のようだ
従来の例外メカニズムよりも様々な面で優れているという点は共通認識なのね
803デフォルトの名無しさん
2022/01/19(水) 05:23:35.13ID:mUI3y0qL
>>802
完全移行しましょうという話ではないよ
804デフォルトの名無しさん
2022/01/19(水) 07:39:45.49ID:cFKRo9Uk
>>791
いつもお前がチェックしてるの?
それともお前のチームのあいつもチェックするの?あいつに任せて大丈夫?
805デフォルトの名無しさん
2022/01/19(水) 07:57:00.40ID:1qFppSOF
>>801
テストでカバレッジ100%とか目指しちゃってる?
テスト終わるのかな?
(真面目な話、長期運用中のレアなバグをテストで捕捉できるんなら誰も苦労しない)
806デフォルトの名無しさん
2022/01/19(水) 11:07:19.52ID:eMdpT3GP
>>805
まぁ、C0カバレッジはおろかC1カバレッジ100%にしても、競合のバグは発見できないことが多々あるんだけどね
807デフォルトの名無しさん
2022/01/19(水) 11:48:30.52ID:gQYkvdGO
テストで競合のバグ網羅的に検出する方法教えてほしいわ...
808デフォルトの名無しさん
2022/01/19(水) 12:03:27.07ID:i7kz0e3/
>>805
データ競合確認用のテストを書くんだぞ
カバレッジ上げて検出できるようお祈りしてるだけじゃそりゃ無理よ
809デフォルトの名無しさん
2022/01/19(水) 13:00:05.26ID:Li1rxlZL
競合のバグってどんなバグ?
810デフォルトの名無しさん
2022/01/19(水) 13:29:00.39ID:IYc6/CaJ
>>808
え?データ競合を網羅的にチェックできるテスト手法があるの?
こんなとこに書いてる場合じゃなくて、学会発表とか特許出願したほうがいいんじゃない?
811デフォルトの名無しさん
2022/01/19(水) 13:36:39.59ID:eMdpT3GP
・複数人で開発している
・その中にど素人が紛れている
・誰でもアクセスできる場所にデータが置かれている

というときにど素人がデータ競合をやらかす可能性があるが、それ以外は設計で防げる気がするがどうか
812デフォルトの名無しさん
2022/01/19(水) 14:37:52.59ID:K9rAR3/n
>>810
網羅的なんて書いてないだろ
お前は網羅的にできないから全くやらないのか?
813デフォルトの名無しさん
2022/01/19(水) 14:44:54.08ID:eMdpT3GP
結局の所、高頻度・ロングランテストするくらいしか検出方法ないんですかね
814デフォルトの名無しさん
2022/01/19(水) 14:59:15.19ID:WoOGtWuY
ロングランテストwww
何の関係があるんだよw
いつもの知ったかさんでしょコレ
815デフォルトの名無しさん
2022/01/19(水) 15:00:04.95ID:gQYkvdGO
設計自体のバグもあり得るしねえ
形式手法を使うくらいか?
816デフォルトの名無しさん
2022/01/19(水) 15:26:10.86ID:eMdpT3GP
>>814
通常のテストで検知が難しいバグを見つける手段として、高負荷・高頻度・長時間(の組み合わせ)のテストをするのは常識
もちろん、それで問題が発生しなかったからといって、バグがないことが証明されたわけではないけどね
817デフォルトの名無しさん
2022/01/19(水) 16:14:13.73ID:v8LOrcPB
>>792
意地悪なこと言ってスマンけど
「ガツガツ書く」「少ない」
「ちゃんとわからず」「多すぎ」
夢見がちで可愛い表現だなw
井戸の中のカエルが反り返って演説してる気迫を感じる
818デフォルトの名無しさん
2022/01/19(水) 16:36:54.72ID:gE2NB2l/
哲学知らぬ者、バグを知らず
819デフォルトの名無しさん
2022/01/19(水) 17:49:18.38ID:eMdpT3GP
食事する哲学者問題?
820デフォルトの名無しさん
2022/01/19(水) 17:57:12.48ID:eoe5MjrB
結局のところ未熟者が書いたコードは当てにならないと言うのがすべて
821デフォルトの名無しさん
2022/01/19(水) 17:58:56.29ID:gQYkvdGO
未熟者に限らず自分自身含む人が書いたコードはまず疑った方が良い
822デフォルトの名無しさん
2022/01/19(水) 18:28:03.14ID:bwa81yuy
ロングランテストの所有権を複製して仲介イテレータで処理すれば算数は100点!!
823デフォルトの名無しさん
2022/01/19(水) 18:33:19.44ID:eMdpT3GP
最近Rustが楽しくなってきた
824デフォルトの名無しさん
2022/01/19(水) 18:45:27.74ID:Vf45iCZs
RustはFirefoxがまともに動くようになってからでイイわ。
本家すら使いこなせてないのに俺ら雑魚にはまだ無理だわ。
825デフォルトの名無しさん
2022/01/19(水) 18:54:05.02ID:eMdpT3GP
GoとRustはやっといた方が良い予感がする
826デフォルトの名無しさん
2022/01/19(水) 21:11:11.24ID:+cO9q0A4
>>824
ブラウザがこのスレにどういう関係が??
827デフォルトの名無しさん
2022/01/19(水) 21:51:11.75ID:BS0PFXNl
>>811
並行性テストすら知らないど素人さんが言うと説得力あるね〜
828デフォルトの名無しさん
2022/01/19(水) 22:55:16.29ID:23hBiJnP
今はRustで書けばコンパイラがデータ競合も指摘してくれるので大丈夫
C++は既存システムのメンテ用
829デフォルトの名無しさん
2022/01/19(水) 23:24:32.20ID:mUI3y0qL
データ競合起こすようなコードしか書けない奴はプログラマに向いてないわ
830デフォルトの名無しさん
2022/01/19(水) 23:52:50.70ID:23hBiJnP
ベテランでもデータ競合やメモリ安全のうっかりミスがあることは何度も示されている
それらをコンパイラでチェックできる高機能なプログラミング言語が登場したのだから
高機能な新しいものに付いて来れないプログラマこそ向いていない
831デフォルトの名無しさん
2022/01/20(木) 00:39:05.76ID:Rx+HndAo
必死で宣伝するほどのものでもないのでは?
832デフォルトの名無しさん
2022/01/20(木) 00:48:04.28ID:f9tdz5B4
Cで書かれているLinux OSが
あれほどC++は無意味な言語と採用を拒否し続けてきたにも関わらず
Rustを一部採用し始めたのが典型的ですね
833デフォルトの名無しさん
2022/01/20(木) 00:48:26.56ID:Rx+HndAo
以前のHaskellのような勢いがあるけど、まったく使われないのもHaskellと同じでは?
834デフォルトの名無しさん
2022/01/20(木) 01:09:18.97ID:2FFUKTfw
うっかりミスで競合バグやメモリ破壊が起きるとは思えんな
データ構造やテーブルの設計ができない、メモリ安全な書き方知らないってスキルや知識、経験の問題だろうよ

マルチスレッドの使いどころを知らないやつ、知ったか、コミュ障あたりがプロジェクトに混じると起きる
そういった猿を炙り出せるrustはパラドックスを抱えてる気もするが俺は好意的
835デフォルトの名無しさん
2022/01/20(木) 01:25:44.62ID:Vi2E1kzg
>>830
お前あんの?
俺一回もないけど
どんだけひどいコードかいてんだよw
836デフォルトの名無しさん
2022/01/20(木) 01:26:44.10ID:Vi2E1kzg
あとメモリ安全の話してないしw
837デフォルトの名無しさん
2022/01/20(木) 01:27:16.51ID:u4d94q6b
俺もそうだったが、初めてマルチタスクOSでプログラミングし始めた頃に
興味を持ちやすいのが、マルチスレッドや、メッセージパッシング、
同期、非同期、排他処理など。
そして、実際にプログラム経験を積むにつれ、そういったものは、そんなに
使用しなくてもほとんどのプログラムには関係無いことが分かってくる。
というのは、シングルスレッドでも処理速度が足りる場合が多いからだ。
また、ブラウザ以外では async, awaitなどを使う理由は皆無である
ことも分かってくる。複雑になるだけで速度も上がらないから。
ほぼブラウザ上アプリ専用だと考えて良いだろう。
838デフォルトの名無しさん
2022/01/20(木) 01:29:39.27ID:z2ZQEaJV
>>837
なぜブラウザだけ?
839デフォルトの名無しさん
2022/01/20(木) 01:30:31.76ID:Rx+HndAo
>>837
ウェブ周りは間違った設計が堂々としてて凄い貫禄と思う。
無印ペンティアム辺りの時代を未だに引きずっているのかも。
840デフォルトの名無しさん
2022/01/20(木) 01:31:27.85ID:Rx+HndAo
>>838
貫禄が在りすぎて我々にはどうしようもない。
841デフォルトの名無しさん
2022/01/20(木) 01:52:40.04ID:hnvUf8sg
>>837
色々とおかしいぜ
まずシングルスレッドでも可能な並行処理とマルチスレッドとなる並列処理の違いがわかっていない?
さらに非同期処理と並行並列処理の違いも分かっていない?

まずシングルスレッド内でもマルチタスクで並行処理はするしasync/awaitは用いる
ブラウザ上での各ページのJavaScriptもシングルスレッドで動いていてasync/awaitが使われる
非同期であればasync/awaitは使われるのだからマルチスレッドである必要はない

さらにasync/awaitを使おうと使わまいと非同期処理は必須
ネット通信にしてもI/O読み書きにしても同期かつ並行並列もなく待ちぼうけプログラミングでもしているのかね?
842デフォルトの名無しさん
2022/01/20(木) 02:21:18.74ID:Rx+HndAo
そういうことじゃないんだよな。
843デフォルトの名無しさん
2022/01/20(木) 04:37:02.48ID:Hal1pivO
>>837
マルチスレッドは処理速度だけじゃなく、プログラムをシンプルにする目的でも使うんよ
844デフォルトの名無しさん
2022/01/20(木) 08:33:11.42ID:lGM+CbA+
>>841
"ロングランテスト"でしかテストできないという意味では全部一緒ですねw
845デフォルトの名無しさん
2022/01/20(木) 09:27:27.00ID:Vi2E1kzg
デスクトップアプリでsureddo使わないと、処理中はアプリが固まるんだけどなw
846デフォルトの名無しさん
2022/01/20(木) 09:44:08.26ID:YvBiSXkf
>>835
お前が無くてもチームの誰かがあったらダメじゃねーの?
847デフォルトの名無しさん
2022/01/20(木) 09:47:19.38ID:L6GD7VFA
>>845
シュアード・ドゥ使わなくてもオルニチン使えば大丈夫..
848デフォルトの名無しさん
2022/01/20(木) 10:35:37.00ID:XHUr7069
>>846
データ競合に関しては、ありがたみがわからないんだよね
そもそもそれが発生する設計しないというか...
849デフォルトの名無しさん
2022/01/20(木) 11:56:51.04ID:BSrnUcOL
同感だわ
ポインタほどプログラム全体に散らばるようなものじゃないからな
850デフォルトの名無しさん
2022/01/20(木) 12:08:15.10ID:/QGeeRaj
自分で書くぶんにはデータ競合はほぼ踏まないと思ってるし
実際Rustで書いてもSend/Syncエラーになったりはしないんだが
だからといって社内の謎ライブラリやらマイナーなOSSが
同程度に信頼できるわけではないからな
チェックがあるに越したことはない
851デフォルトの名無しさん
2022/01/20(木) 13:07:09.28ID:r0r0TMJm
Send/Syncはまた別の話
852デフォルトの名無しさん
2022/01/20(木) 13:25:20.64ID:XHUr7069
>>850
あ、そっか
スレッドセーフじゃないAPIを不用意に使って、共有するなにかが壊れる系のバグはあるわな
853デフォルトの名無しさん
2022/01/20(木) 15:08:40.58ID:kNFbPrzb
社内の一番馬鹿に合わせるのって苦痛じゃないの?
854デフォルトの名無しさん
2022/01/20(木) 15:23:18.62ID:YvBiSXkf
>>850
同意
855デフォルトの名無しさん
2022/01/20(木) 16:03:42.89ID:XHUr7069
>>853
嫌ならやめればいいね
856デフォルトの名無しさん
2022/01/20(木) 16:21:18.96ID:hnvUf8sg
データ競合やメモリ安全のコンパイラによる保証よりも
Rustは様々な点でC/C++よりプログラミングしやすいことが一番の大きな点だと思う
挙げだすとキリがないけど値格納付enumや強力なマッチング&デストラクチャリングなど含め基本的なことを始めにね

言語にそんな色んな機能は要らないしコンパイラによる保証も自分でやるから要らないという人にはC言語がある
C++は何もかもが中途半端な存在となってしまっていることに気付いた
857デフォルトの名無しさん
2022/01/20(木) 18:41:53.83ID:kNFbPrzb
>>855
それは苦痛って意味?
858デフォルトの名無しさん
2022/01/20(木) 19:12:10.38ID:XHUr7069
>>857
嫌ならやめればいいねって意味だけど?
859デフォルトの名無しさん
2022/01/20(木) 19:30:40.05ID:kNFbPrzb
>>858
そもそも苦痛かどうか聞いてるんだけど?
860デフォルトの名無しさん
2022/01/20(木) 21:43:31.04ID:f9tdz5B4
プログラミング言語として優劣差が明白にあります
C++とRustの両方を書ける人たちが新たなプロジェクトをする場合
100%Rustが採用されます
861デフォルトの名無しさん
2022/01/20(木) 22:05:27.01ID:WtRmajcd
>>860
ソースは?
862デフォルトの名無しさん
2022/01/20(木) 23:37:03.72ID:7c1Oq9Kl
kerneldeveloperだけど、c使うな言われたらrust使うかな
863デフォルトの名無しさん
2022/01/21(金) 00:37:31.45ID:gQq8dla+
>>859
ケースバイケースでしょ
何アホな質問してんだか
864デフォルトの名無しさん
2022/01/21(金) 01:58:41.80ID:7FRrrgJK
>>863
アホはレスしないで
865デフォルトの名無しさん
2022/01/21(金) 06:29:26.72ID:rZUqxNH8
>>853
苦痛だが、合わせざるを得ないのが現実だろ
866デフォルトの名無しさん
2022/01/21(金) 17:44:48.18ID:GenQVxT3
こういうのが嫌なんだよな

> Rustのデータベース系クレートでは、長らくORMのdieselがデファクトスタンダードとして各入門系テキスト/書籍でも扱われていましたが、ここ最近はdieselの名前を見かけることはあまり多くないように思います。
867デフォルトの名無しさん
2022/01/21(金) 18:42:50.23ID:manmLzTJ
C++の線形代数系ライブラリでは、長らくEigenがデファクトスタンダードとして扱われていましたが、ここ最近はEigenの名前を見かけることはあまり多くないように思います。
868デフォルトの名無しさん
2022/01/21(金) 22:57:18.79ID:7ASANqXl
>>866
標準でないライブラリはどの言語でも一緒やん。
869デフォルトの名無しさん
2022/01/21(金) 23:25:41.90ID:gQq8dla+
仕事には使えんな
870デフォルトの名無しさん
2022/01/22(土) 13:46:13.26ID:o4PPoyn9
毎年決定版のライブラリやフレームワークが
変わるJS/TSで仕事回ってるし
871デフォルトの名無しさん
2022/01/22(土) 14:52:11.36ID:v1aiSn8P
ブラウザは特殊。
デスクトップアプリでasync,awaitは不要。
872デフォルトの名無しさん
2022/01/22(土) 16:21:57.94ID:o4PPoyn9
サーバサイドで使われてるのしらないの?
873デフォルトの名無しさん
2022/01/22(土) 16:26:26.49ID:v1aiSn8P
もともと並列処理は、スーパーコンピューターで、クロック数の増加速度に陰りが
見え始めた時、複数のCPUで処理することで高速処理をするために発明されたもの。
プログラミングがとても難しいことが知られており、速度が十分な場合は不要。
1コア(スレッド)なのに非同期にする理由は無い。
874デフォルトの名無しさん
2022/01/22(土) 16:29:08.60ID:v1aiSn8P
並列処理は、プログラムの難しさと引き換えに、速くなるためだけに発明された
だけの苦肉の策。
技術的な頭打ちをなんとか凌ぐために登場した。
シングルスレッドだと全く速くならないのに、プログラムを難しくするだけで
意味が無い。
875デフォルトの名無しさん
2022/01/22(土) 17:02:58.58ID:UcDtUdFv
>>870
ほー、じゃ直近3年でプロジェクトに採用したFWを時系列に並べてみ?
876デフォルトの名無しさん
2022/01/22(土) 17:06:13.90ID:cP8tdrQi
非同期並列ネタは複製おじさんの釣り仲介イテレータ
877デフォルトの名無しさん
2022/01/22(土) 17:28:20.63ID:vZsc1PCZ
お前はまずマルチスレッドとマルチコア(or プロセッサ)の違いを理解してから書き込め
スパコンの前からマルチタスクは普通に使われてた
878デフォルトの名無しさん
2022/01/22(土) 18:12:53.04ID:CQ3v+kYe
>>877
それはアプリケーションレベルでの話で、マルチプロセス。
複数のCPUや複数のコアが搭載されるようになってからのみ、
マルチスレッドプログラミングの意味が出た。
879デフォルトの名無しさん
2022/01/22(土) 18:14:18.83ID:CQ3v+kYe
>>877
マルチタスク(マルチプロセス)は、OSの利便性のために生まれた。
速度とは関係無いし、アプリのプログラミングにもほぼ関係無い。
880デフォルトの名無しさん
2022/01/22(土) 18:28:41.27ID:+h3Uwt/E
何言ってるんだ?
古くからマルチプロセスで高速化なんていくらでもあるだろ
make -j オプションとか知らんのかよ
881デフォルトの名無しさん
2022/01/22(土) 18:37:28.25ID:CQ3v+kYe
>>880
シングルコア、シングルCPUのPC-9801だと基本的に速くならん。
882デフォルトの名無しさん
2022/01/22(土) 18:48:08.80ID:+h3Uwt/E
>>881
お前CPU Bound / IO Boundって知らんだろ
そんな知識で語るなよw
883デフォルトの名無しさん
2022/01/22(土) 19:05:35.39ID:vfyV6CZn
>>871
最近はブラウザベースのデスクトップアプリ多いよね
884デフォルトの名無しさん
2022/01/22(土) 22:34:52.70ID:hteSw3T0
>>882
プログラマにあなたのような頭が悪い人が増えているから、
async,awaitが有名になっているのかも。
885デフォルトの名無しさん
2022/01/22(土) 22:36:34.19ID:rHbcHXIR
>>884
もうそういうレスしか返せないならやめたら?
痛々しいぞ
886デフォルトの名無しさん
2022/01/22(土) 23:42:41.14ID:hteSw3T0
頭が悪い人は出入り禁止にして欲しい。
馬鹿とカシコがごちゃまぜになって紛糾してしまうのが匿名性掲示板の限界。
887デフォルトの名無しさん
2022/01/22(土) 23:52:32.52ID:VFDCJ7kC
>>882
でもお前もインフライトキュー知らねーじゃん
888デフォルトの名無しさん
2022/01/22(土) 23:56:12.45ID:yljb5PqZ
>>871
デスクトップアプリでasync,awaitは不要、というのは古い環境だな
非同期を使わずに済むように制限があり
自分でI/O通信アクセスなどするのを許さないか
あるいは同期ブロックされて自分のスレッドは止まってしまう
つまりその場合でも意識はせずともその環境はマルチスレッドを使っている

>>873
1コア(スレッド)なのに非同期にする理由は無い、は間違ってるな
むしろ1スレッドで効率よく色んなことをするために非同期がある
JavaScriptがシングルスレッドなのに非同期を活用しまくりなことを知らないのだろうか?
889デフォルトの名無しさん
2022/01/23(日) 00:05:07.66ID:eLwIvGEb
書き込み内容ではなく、 >>884 のように人格攻撃しかしないのはクソオブオソだから、普通に無視しとけ
890デフォルトの名無しさん
2022/01/23(日) 00:18:25.28ID:muCNgjMY
>>884 みたいなの釣りなのかマジモンなのかどっちなんだろ
891デフォルトの名無しさん
2022/01/23(日) 00:42:54.28ID:9yHGnoxe
JSがHTMLを補助するために独特の仕組みを生み出しただけなのに、
それを一般化する人が増えて困る。
892デフォルトの名無しさん
2022/01/23(日) 02:19:46.48ID:c3dt58ZC
このスレによく書き込む奴の中に、アスペが一人か二人いるようだ
893デフォルトの名無しさん
2022/01/23(日) 03:24:03.55ID:9yHGnoxe
JSはプログラミング言語として特殊すぎるから、それを基準にしてはいけない。
特にasync,await,PromiseはHTMLの特殊性からきているものなので、
「新しい概念だから他のプログラミング言語にも広めていくべき」
などという見方は間違っている。
894デフォルトの名無しさん
2022/01/23(日) 03:33:10.01ID:GGOFm3A0
async await最初に導入したのってC#では
895デフォルトの名無しさん
2022/01/23(日) 07:33:46.51ID:L+Dx9AR8
>>887
それ何?
ちょっと説明してみ
896デフォルトの名無しさん
2022/01/23(日) 07:35:24.30ID:L+Dx9AR8
>>890
論破されて引っ込みつかなくなってからの人格攻撃でしょ
無能によくあるパターン
897デフォルトの名無しさん
2022/01/23(日) 09:13:42.66ID:5TQWnu47
そもそもマルチスレッド(タスク)や非同期処理はIO多重化への対処であってコアの数は関係無い。
(マルチコアのほうがより効率に処理できるが)
本質わかってないやつ多すぎ。
898デフォルトの名無しさん
2022/01/23(日) 10:46:09.32ID:ToW82ksW
>>897
> 本質わかってないやつ多すぎ。
お前が一番わかってないだろ…
899デフォルトの名無しさん
2022/01/23(日) 13:55:33.39ID:wM2Xc+Kp
このネタ毎回爆釣だね
900デフォルトの名無しさん
2022/01/23(日) 14:03:32.33ID:imq9jRJ1
あと釣り宣言来ましたので今回はこれでお開きのようです
901デフォルトの名無しさん
2022/01/23(日) 21:34:18.28ID:JoYL6ICj
>>897
それはOSレベルで工夫すればなんとでもなるので、マルチスレッドは必須ではない。
ところが、高速化に関しては、クロック数が頭打ちになってきているので、
マルチコア/マルチCPU化して、マルチスレッド・プログラミングで対処する
しかないことが出てきた。
したがって、あなたの主張は完全なる間違い。
実際は正反対。
902デフォルトの名無しさん
2022/01/23(日) 23:36:55.40ID:2V1gRdrY
>>897の「マルチスレッド(タスク)や非同期処理はIO多重化への対処」のI/O多重化は当然通信も含むんじゃないか
>>901
OSレベルで工夫すればなんとでもなる、なんて無理
通信相手が返事を返すのに数msec、数秒、数分ということは現実に有り得る
シングルスレッドで同期のみならその間は何も出来ない
マルチスレッドであっても通信相手が多数ならば多数のスレッドが必要となりそれらが同期のみなら全て待ちのために停止
マルチプロセスにしても同様でいずれも無駄にOSリソースを使うだけとなる

つまり非同期プログラミングは必須
非同期ならばシングルスレッドでも並行(concurrent)に処理することができる
さらにマルチコアを有効活用するためにマルチスレッドで非同期にすれば並列(pararell)にも処理することが出来る
903デフォルトの名無しさん
2022/01/24(月) 06:27:31.76ID:gNLiogmJ
>>902
> シングルスレッドで同期のみならその間は何も出来ない
Polling って知ってるか?
904デフォルトの名無しさん
2022/01/24(月) 07:44:27.65ID:p86CtUav
>>903
select/kqueue/epollなどでポーリングして切り替えながらノンブロッキングで複数I/Oアクセスをする大昔から行われている方法のことだよな
これを同期プログラミングとは呼ばないな
むしろこのポーリング方式で切り替えながら呼び出すコールバック先を単なる関数だけからコルーチン対応にしたものが非同期プログラミングと呼ばれるくらいだ
そしてポーリング状態およびタイマー状態に応じて呼び出すコルーチンを切り替えていくのがスケジューラ
もちろん通常の非同期プログラミングではその部分はライブラリなどに任せてしまい呼び出されるコルーチン部分をプログラミングすることになる
905デフォルトの名無しさん
2022/01/24(月) 08:06:22.73ID:hXaZrIwh
お前の頓珍漢な非同期の定義を語られてもw
906デフォルトの名無しさん
2022/01/24(月) 08:43:07.50ID:YyWH0a11
ポーリング使うのは非同期処理だろ普通。
907デフォルトの名無しさん
2022/01/24(月) 09:17:56.02ID:KiY6K78/
while(kbhit() == 0){ ... }
みたいなのを非同期処理って言うのか?
908デフォルトの名無しさん
2022/01/24(月) 09:21:18.02ID:zGpECv1N
>>904
もうやめとけ
909デフォルトの名無しさん
2022/01/24(月) 10:28:27.13ID:LHtgCFZv
kbhitの中でキー入力を待ち合わせるわけじゃないから非同期処理でいいんじゃね?
910デフォルトの名無しさん
2022/01/24(月) 13:14:45.02ID:epnuPzmN
>>902
お前は、ゲームのキャラそれぞれが別スレッドで動かされていると
思ってるだろ。
昔からキャラは複数のハードで処理されていると思う人が後を経たなかった。
911デフォルトの名無しさん
2022/01/24(月) 13:19:05.37ID:RtyiqZqM
非同期I/OとノンブロッキングI/Oの違いを述べよ
912デフォルトの名無しさん
2022/01/24(月) 13:58:28.17ID:jdPj866/
Rustのビルドを高速化する方法
https://postd.cc/fast-rust-builds/
913デフォルトの名無しさん
2022/01/24(月) 14:51:22.20ID:nrcwP8hb
相変わらず隔離対象のお二人さんは自分の狭い知識と観点が全てなのな
アプローチは違うが考え方も知識レベルも似たもの同士
だから反発し合う
914デフォルトの名無しさん
2022/01/24(月) 14:59:04.35ID:jdPj866/
もう何を話しているかなんてどうでもよくて、相手が屈服するまで続けるという不毛地帯
915デフォルトの名無しさん
2022/01/24(月) 15:14:06.56ID:7gZW+FH0
>>904
9割方その通りですが
epollやselectなどのポーリング結果で呼び出される対象は単なるコールバック関数でも非同期プログラミングですよ
例えばJavaScriptでは非同期関数のコールバックは単なる関数でよいです
もちろんコルーチンとなるasync関数から使えばawaitできる点でもっと利便性の高い非同期プログラミングになりますね

>>910
非同期プログラミングは必須と主張している相手に対してスレッドの話は噛み合っていないですよ
非同期プログラミングとマルチスレッドプログラミングは別です
同期/非同期とシングルスレッド/マルチスレッドは組み合わせ4通り全てが用途ごとに使われています
916デフォルトの名無しさん
2022/01/24(月) 15:42:51.22ID:BWBJT0bl
9割方その通りですがw
お前が言うなやww
917デフォルトの名無しさん
2022/01/24(月) 16:07:45.87ID:epnuPzmN
>>914
そりゃ、間違ってる相手は野ざらしにしておけないからな。
放置すれば日本が衰退するから。
918デフォルトの名無しさん
2022/01/24(月) 16:17:39.92ID:jdPj866/
>>917
きみら二人以外誰も困らないよ
919デフォルトの名無しさん
2022/01/24(月) 17:40:26.73ID:g6coj3Jd
サーバーサイドはGo使えってのが常識になってきたっぽいぞ
Rustどこで使えばいいんだよ
920デフォルトの名無しさん
2022/01/24(月) 17:51:20.76ID:RtyiqZqM
フットプリントが大きいと困るような低レベルなレイヤーには向いているだろうが、
ウェブアプリケーションは水平分散でなんとかなるからRailsとかも使えてたわけで
921デフォルトの名無しさん
2022/01/24(月) 17:54:55.80ID:RtyiqZqM
ウェブアプリじゃなくて、もっと広くサーバサイドのことを本当に言ってるなら、
主語が大きすぎてよくわからん
922デフォルトの名無しさん
2022/01/24(月) 18:37:54.23ID:5cKH7ieg
>>915
だからお前の頓珍漢な非同期処理を語られても困る
I/Oとプログラムが同時に動作してると言うなら単なる同期Write命令でも実際の書き込み動作はたいてい非同期
そんなこと言い出したら同期処理なんてほとんどないわな
923デフォルトの名無しさん
2022/01/24(月) 18:46:19.25ID:jdPj866/
>>921
サーバで動かすツール・コマンドのことを言ってるんじゃなかろうか
924デフォルトの名無しさん
2022/01/24(月) 19:35:27.58ID:p86CtUav
>>906
同意
ただしポーリングといっても意味合いが何種類かに分かれて
単純だがムダな状態チェックポーリングの定期もしくは常時ループもあれぱ
OSシステムコールselectなどの登録して待つタイプのポーリングもあれば
その上のレイヤで例えばRustがタスクfutureに対して状態を進めるためのポーリングなどがあり
皆の想定が異なるのかもしれない

>>910
その別スレッドを起動せずとも複数のタスクに対応できるのが非同期プログラミング
とはいえゲームのフレーム更新は常に期限が来てくれるので単純なやり方でも何とかなる
通信相手から返事が来る時間が読めないのとは違う意味で

>>915
async/awaitを含む間欠タイプを想定してコルーチンと書いてしまっていた
確かにコールバック渡し非同期関数もあるな
925デフォルトの名無しさん
2022/01/24(月) 20:31:59.50ID:B4IfF+LP
人格複製おじさん定期
926デフォルトの名無しさん
2022/01/24(月) 20:37:10.25ID:BgvoYA7m
言葉の定義の話ずーーっとやってるスレだな
927デフォルトの名無しさん
2022/01/24(月) 20:49:02.48ID:/rel0eRU
それなのに一つも用語の定義ができないのはなぜなんでしょう?
928デフォルトの名無しさん
2022/01/24(月) 22:39:10.70ID:IEcApiVS
>>927
一言で言えば自分自身で思考する能力がないから
929デフォルトの名無しさん
2022/01/24(月) 23:44:28.94ID:Va4ZqunJ
みな生活に余裕がないのかマウンティングしかしない
もっと協力して生産的な話して
930デフォルトの名無しさん
2022/01/24(月) 23:53:51.56ID:j0WdQYoJ
>>929
アホがえらそうにしてるのは看過できないよ。
日本が滅ぶから。
最近、プログラミングの世界で間違ってる主張が集団幻覚のように広まる
ことが多くなったから。それが、async,awaitが重要などと言う主張。
931デフォルトの名無しさん
2022/01/25(火) 01:32:10.55ID:p2EQwX6c
async awaitで日本が滅ぶ説は初めて聞いたな
932デフォルトの名無しさん
2022/01/25(火) 06:26:02.60ID:SxGSiHYf
すげーな。どうやったら滅ぶのか。
より良い代替案あれば教えてよ
933デフォルトの名無しさん
2022/01/25(火) 08:15:47.90ID:vd4sNBPH
また暴れるから構うなよ
934デフォルトの名無しさん
2022/01/25(火) 11:28:39.93ID:bY2fZbZk
>>930
「async,awaitが重要などと言う主張」をしてた人はどういう場面・状況において重要だと主張してたの?

async/awaitが重要な状況もあれば重要じゃない状況もあるだろうから文脈無しでは誰も同意しないよ
935デフォルトの名無しさん
2022/01/25(火) 13:35:10.97ID:A3MKeF5O
>>934
async,awaitをサポートして無い言語はダメと言ったやつが居る。
936デフォルトの名無しさん
2022/01/25(火) 13:58:14.45ID:dpcBILVU
ダメな状況もあればダメじゃない状況もあるでしょ
あらゆる状況でダメなものやあらゆる状況でダメじゃないものはそうないから
文脈を伴わない主張はあんまり意味がないよ
937デフォルトの名無しさん
2022/01/25(火) 15:45:22.18ID:A3MKeF5O
>>936
現実には、駄目な文脈はほとんど無く、皆無に近い。
938デフォルトの名無しさん
2022/01/25(火) 16:09:50.03ID:A8UC5jpN
ハイハイ、世の中にダメなものなんてないよねー
君以外は
939デフォルトの名無しさん
2022/01/25(火) 17:11:59.79ID:UYaUcevz
>>935
>>888のことかーーーっ!!!
940デフォルトの名無しさん
2022/01/25(火) 17:47:59.26ID:uKos3Mim
>>937
>>891 あたりの発言を読む限り、「皆無に近い」の例外=「async awaitがないとダメな言語」が JS 、他の言語には async await 必要ないという主張なのかな
だとしたら async await を導入した JS 以外の言語はなぜ導入したんだろうか
特に async await を発明した C# はわざわざ新たな概念を生み出しすらしたわけだけどそのモチベーションはなんだろう
ヘルスバーグが日本を滅ぼしたかったのかな

あと JS も別に async await ではなく Promise やコールバック、ジェネレーターで同じことはできるんだけど
なぜ JS に限って async await がないとだめなんだろうか
941デフォルトの名無しさん
2022/01/25(火) 18:45:35.37ID:Suh34ira
>>940
新しい文法を追加しただけで
新たな概念は生み出してないよ
942デフォルトの名無しさん
2022/01/25(火) 19:04:47.34ID:dI/lXZJY
非同期プログラミングへの苦手意識は自覚してるにも関わらず
昔の知識で俺は賢いんだと虚勢を張る100点おじ

非同期プログラミングの定義すら分かっていないにも関わらず
聞き齧った知識でとにかくマウントとりたい複製おじ

さて軍配はw
943デフォルトの名無しさん
2022/01/25(火) 19:09:20.65ID:uKos3Mim
>>941
文法でも概念でもどっちでも良いけどわざわざ新たな機能を追加したわけでそれはどういう意図があったんだろうね
944デフォルトの名無しさん
2022/01/25(火) 19:19:28.61ID:3IePzztS
>>930
async-awaitで日本が滅ぶと主張するには根拠が足りん
async-awaitを使った場合と使わなかった場合でプログラミングにどういう問題点やデメリットが発生したのか具体的に述べよ
945デフォルトの名無しさん
2022/01/25(火) 19:43:42.73ID:INf4V5XQ
>>943
書き易くしただけだろ
946デフォルトの名無しさん
2022/01/25(火) 21:38:27.02ID:2yn0ql20
>>945
いや根本的に違ってくる
例えばこの数値を返してくるサイト3つからその和を求める例
let n1p = fetch(url1);
let n2p = fetch(url2);
let n3p = fetch(url3);
let sum = await n1p + await n2p + await n3p;
これをawait使わずに書くと?
947デフォルトの名無しさん
2022/01/25(火) 21:44:45.91ID:z/wYSAJ8
>>944
一人二役やめろってww
948デフォルトの名無しさん
2022/01/25(火) 21:51:37.76ID:5O9CJGEe
>>946
スレッド起こして各スレッドの終了待ち合わせて加算するだけだろ
やってることは変わらんよ
949デフォルトの名無しさん
2022/01/25(火) 22:00:39.47ID:4VdIBcfH
>>946
さすがにそれは草
950デフォルトの名無しさん
2022/01/25(火) 22:01:29.32ID:4VdIBcfH
根本的に間違ってるwwwww
951デフォルトの名無しさん
2022/01/25(火) 22:04:32.52ID:3IePzztS
>>948
そこは並列となるOSスレッドは使わずに
シングルOSスレッド内で非同期に並行に可能だな
952デフォルトの名無しさん
2022/01/26(水) 00:14:44.20ID:2DCGasPY
>>946
そもそもそんな例は、デスクトップアプリでは有り得ない。
953デフォルトの名無しさん
2022/01/26(水) 00:20:09.97ID:2DCGasPY
デスクトップアプリというのは、Word,Excel,PowerPoint,AdobePhotoshop,
Illustrator,ClipStudio,各種CAD,各種3D Modeler/Renderer, 各種Simulator,
PowerDirectorなどの動画編集ソフト, 音楽作成ソフトなどのことなのだから、
3箇所の別のURLからデータをfetchして足す、などというようなソフトは想定外。
ありえたとしても例外中の例外で、そんな特殊ケース、レアケースのためだけに
有用な機能を付けることは重要ではない。
954デフォルトの名無しさん
2022/01/26(水) 01:20:32.34ID:bGJ0opg8
>>953
C#にasync awaitを導入したのは愚かな判断だったということ?

>>945
いやそうなんだけどさ、そんな機能入れるのは愚かだと主張する人がいるので
955デフォルトの名無しさん
2022/01/26(水) 01:36:30.18ID:mcBZ9zB7
asyncウンコード vs 80年代プログラミング
956デフォルトの名無しさん
2022/01/26(水) 01:48:16.50ID:MhOmah5m
>>953
複数の非同期処理を待ち受けて結果を合成するような処理は高機能なデスクトップアプリならいくらでもやってる
957デフォルトの名無しさん
2022/01/26(水) 06:18:43.61ID:BymNOWPj
Excelでも計算式はマルチスレッドでやってるしな
958デフォルトの名無しさん
2022/01/26(水) 06:47:40.74ID:1No2egej
>>919
C/C++が使われてるケース全てだろうな
959デフォルトの名無しさん
2022/01/26(水) 16:43:19.04ID:q/gd6wxB
>>956
高速化のためとAPIがI/O完了の柔軟な待機に対応して無い事が有ることから
マルチスレッドでの処理は行われているが、JSのようなシングルスレッドでの
async,awaitは行われて無いし、行う価値も無い。
960デフォルトの名無しさん
2022/01/26(水) 17:05:33.66ID:nl68eKRB
同期ブロッキングなプログラミングしか出来ない人はマルチスレッドに逃げるしか手がない
961デフォルトの名無しさん
2022/01/26(水) 17:51:33.36ID:q/gd6wxB
>>960
Win32APIの ファイルI/Oは、同期にも非同期にも対応しているが、
非同期だと柔軟性に欠けたことしか出来ず、やりたいことが出来無い事がある。
仕方が無いので、別スレッドを起動して、その中で同期的にWin32 I/Oを
使って待機状態にする。
962デフォルトの名無しさん
2022/01/26(水) 18:04:17.90ID:v6L2EY0F
>>959
今はOfficeをはじめとした各種デスクトップアプリで
async/awaitに相当するやり方が普通に行われてるよ
マルチスレッドだけど各スレッド内でもタスクが切り替わる形
何でかって言うとそのほうが単純なマルチスレッドモデルに比べて少ないリソースで高いパフォーマンスを出せる場合が多いから

この辺から入門してみたら?
https://docs.microsoft.com/en-us/cpp/parallel/concrt/comparing-the-concurrency-runtime-to-other-concurrency-models
963デフォルトの名無しさん
2022/01/26(水) 18:55:15.29ID:YVr9NW6i
マルチスレッドでプログラミングできる奴が非同期プログラミングできないとか意味不明w
964デフォルトの名無しさん
2022/01/26(水) 18:57:20.72ID:iLK8Wqk9
>>959
async/awaitは非同期プログラミングにおける便利な抽象化の一つだが
以下の2つのケースどちらの場合にも用いることができる
(1)並行(concurrent)にシングルOSスレッド内で別タスクを用いる場合
(2)並列(parallel)にマルチOSスレッドにおける別スレッドを用いる場合
どちらもawaitを用いている自分から見て非同期に別タスク/別スレッドが実行されawaitで同期的に待ち合わせとなる
各々の別タスク/別スレッドにおいて使われているのが同期I/Oか非同期I/Oかは関知外なのでどちらでもawait利用可
ただし同期I/Oを用いるとブロックされるのでシングルスレッドなら他を進められなくなりマルチスレッドなら無駄にスレッドが浪費される
965デフォルトの名無しさん
2022/01/26(水) 19:56:03.61ID:5QsdJHww
アスペじゃない人はこういう時はどうすればいいの?
966デフォルトの名無しさん
2022/01/26(水) 21:12:52.93ID:oGR6qD+W
>>963
実際できない人がたくさんいる
自分が賢いと思い込んでるお年寄りや
頭が固くなってるお年寄りに多い

スレッドとクリティカルセクションで考える方が
分かりやすい場合も多々あるからね
967デフォルトの名無しさん
2022/01/26(水) 21:29:54.45ID:Z5eFNXQp
>>966
> スレッドとクリティカルセクションで考える方が
イベントとかセマフォは使わんの?

> 自分が賢いと思い込んでるお年寄りや
> 頭が固くなってるお年寄りに多い
自己紹介やね w
968デフォルトの名無しさん
2022/01/26(水) 22:08:02.72ID:KsJFT5nW
>>967
クリティカルセクションも知らないのか
win32脳恐るべし
969デフォルトの名無しさん
2022/01/26(水) 22:25:33.62ID:drBs6KnV
>>968
> クリティカルセクションも知らないのか
どうやったらそんなアホな結論に至るの?w
970デフォルトの名無しさん
2022/01/26(水) 22:48:23.70ID:uxP3YVvM
>>968
win32api にcriticalsection ありますけど…
https://docs.microsoft.com/en-us/windows/win32/sync/critical-section-objects
971デフォルトの名無しさん
2022/01/26(水) 22:52:37.00ID:aU8JK1oV
レスつけるときは相手の書き込みを3回音読して読み違えてないか確認してからにしなよ
972デフォルトの名無しさん
2022/01/26(水) 23:00:32.17ID:ZuJ8vc16
>>969
クリティカルセクションを知ってれば
「イベントとかセマフォは使わんの?」なんてアホな返しはしないから

>>970
知ってるよ
win32脳と書いてる意味を考えて
973デフォルトの名無しさん
2022/01/26(水) 23:03:27.65ID:uxP3YVvM
>>972
クリティカルセクションだけではどうにもならない場合もありますね
私はシグナルを併用していましたが、なにかうまくないみたいでスタベーションに悩まされたまま放置してしまいました…
974デフォルトの名無しさん
2022/01/26(水) 23:07:58.33ID:2GXIfjxN
>>972
> クリティカルセクションを知ってれば
> 「イベントとかセマフォは使わんの?」なんてアホな返しはしないから
どうやったらそんなアホな結論に至るの?
もしかしてイベントとかを知らんのか?w
975デフォルトの名無しさん
2022/01/26(水) 23:12:17.31ID:aU8JK1oV
c++ vs rust に関連する話題ほとんど出ないまま2スレ目終わりそうだけどスレ名変えた方が良いのでは?
976デフォルトの名無しさん
2022/01/27(木) 00:57:49.26ID:vDXAxF7H
>>975
いや、Rustには、async, await的なものがあるが、C++にはないから
C++が劣ってるなどと言う良くある間違った集団幻覚を唱える人が
後を絶たないから、C++ vs Rustの話題になってる。
977デフォルトの名無しさん
2022/01/27(木) 06:17:23.60ID:Z7vdX18s
>>972
クリティカルセクションが win32api に装備されている以上、クリティカルセクションを知らない者は、もはや win32 脳ですらないのでは?
978デフォルトの名無しさん
2022/01/27(木) 06:52:28.62ID:13QYNkYp
てか、>>961は非同期I/Oの代わりに同期I/O+スレッドって言ってるんだから普通に組むならイベント通知の方が楽だと思うんだが
979デフォルトの名無しさん
2022/01/27(木) 13:07:08.02ID:hWkHkx2k
Rebuildの宮川さんが仕事でCとRustを使ってる模様
980デフォルトの名無しさん
2022/01/27(木) 15:12:30.35ID:LojT3k5n
大雑把にI/O観点で二つに分けると
昔は同期I/Oでブロックされるからマルチスレッド
今は非同期プログラミングでスレッド数はシングルからCPUコア数が上限
RustのFutureタスク、GoのGoルーチン、JavaScriptの非同期Promiseやコールバック
いずれもプロセス内スケジューラがI/O多重化(select/epoll)やタイマーなど管理して非同期プログラミングを支えている
981デフォルトの名無しさん
2022/01/27(木) 16:08:47.86ID:pSZOF2by
タンジェロ...?
982デフォルトの名無しさん
2022/01/27(木) 16:36:31.72ID:hWkHkx2k
>>980
> 今は非同期プログラミングでスレッド数はシングルからCPUコア数が上限
え?
何の言語でどのスレッド機能を使うとそんな制限にあうんだ?
983デフォルトの名無しさん
2022/01/27(木) 16:37:02.13ID:4DQKoSsj
ここまでディスクのコンジェスションについて言及なし
984デフォルトの名無しさん
2022/01/27(木) 16:46:02.85ID:LojT3k5n
>>982
制限ではない
効率を最大限にするために敢えて用いるOSスレッド数の上限をCPUコア数までに抑えて用いるのが現在の主流
その中でタスク数を何万でも好きなだけ動かす
985デフォルトの名無しさん
2022/01/27(木) 16:55:46.74ID:hWkHkx2k
>>984
> 効率を最大限にするために敢えて用いるOSスレッド数の上限をCPUコア数までに抑えて用いるのが現在の主流
へー
でもさ、そのOSで動いてるプロセスは、君が作ったアプリだけじゃないんだけど
上限をCPUコア数までに押さえる理由が何かあるとすれば、他のプロセスも意識する必要あるんじゃないの?
ないの?
986デフォルトの名無しさん
2022/01/27(木) 17:08:59.66ID:LojT3k5n
>>985
もちろんその通り
だから専有機なら上限で用いる
そうでないなら各configなど設定調整
987デフォルトの名無しさん
2022/01/27(木) 17:14:15.89ID:hWkHkx2k
>>986
> だから専有機なら上限で用いる
「現在の主流」というのは、「専有機」での話?
それとも一般的な話?
988デフォルトの名無しさん
2022/01/27(木) 17:35:31.13ID:rqwTLqGq
各ランタイムのデフォルトのスレッド数がどうなってるか調べれば標準的かどうか分かるんでないかね
989デフォルトの名無しさん
2022/01/27(木) 17:36:02.14ID:hWkHkx2k
なんかこの人、俺用語が多くて何言ってるんだかよくわかんないんだよね

「非同期 "プロセス内スケジューラ"」の検索結果
2 件 (0.30 秒)

・・・2件?
990デフォルトの名無しさん
2022/01/27(木) 17:36:38.66ID:cK3g3Gve
>>987
専有機とか関係なく一般的やね
例えばGoでもRustのasync_stdでもtokioでも同じ
非同期ランタイムにより使用されるスレッド数上限のデフォルト値はCPU総コア数
991デフォルトの名無しさん
2022/01/27(木) 17:37:50.01ID:hWkHkx2k
まともな奴いないのかよ

「"ランタイムのデフォルトのスレッド数"」で検索
"ランタイムのデフォルトのスレッド数"との一致はありません。
992デフォルトの名無しさん
2022/01/27(木) 17:40:14.56ID:hWkHkx2k
こいつもか

「"非同期ランタイム" "スレッド数" 上限」
約 6 件 (0.32 秒)
993デフォルトの名無しさん
2022/01/27(木) 17:41:47.24ID:hWkHkx2k
ID変わってるけど、一人なのか?
994デフォルトの名無しさん
2022/01/27(木) 17:52:30.63ID:LojT3k5n
自分が理解できないと相手が敵かつ全て同一人物に見える病気のパターンかねw
皆普通に同じことを指している
何が理解できないのか素直に言ってごらん
995デフォルトの名無しさん
2022/01/27(木) 17:55:13.00ID:hWkHkx2k
>>994
>>987の質問に答えてから続けてね
996デフォルトの名無しさん
2022/01/27(木) 17:55:25.06ID:pSZOF2by
タンジェロ?
997デフォルトの名無しさん
2022/01/27(木) 17:55:44.67ID:pSZOF2by
タンジェロ...?
998デフォルトの名無しさん
2022/01/27(木) 17:55:51.29ID:pSZOF2by
タンジェ
999デフォルトの名無しさん
2022/01/27(木) 17:55:56.90ID:pSZOF2by
ロ?
1000デフォルトの名無しさん
2022/01/27(木) 17:56:18.35ID:pSZOF2by
1000ならスレ民全員来月に失職
-curl
lud20250126144747nca
このスレへの固定リンク: http://5chb.net/r/tech/1639539350/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

TOPへ TOPへ  

このエントリをはてなブックマークに追加現在登録者数177 ブックマークへ


全掲示板一覧 この掲示板へ 人気スレ | Youtube 動画 >50 >100 >200 >300 >500 >1000枚 新着画像

 ↓「C vs C++ vs Rust Part.2 YouTube動画>1本 ->画像>2枚 」を見た人も見ています:
KaZaA・Shareaza・eMule・DC++・etc 【XXXV】
【GTA+MC+Simcity】Voxel Turf 01
【PS+】PS Plus,5月のフリープレイには「STEINS;GATE 0」や「ブレイドストーム 百年戦争&ナイトメア」が登場
ハピネスチャージプリキュア! ++HAPPINESS CHARGE PRECURE!++ 263
■ ひなフェス ■ モーニング娘。'19コンサートツアー春 〜BEST WISHES!〜FINAL他 ■ dTVチャンネル(ひかりTVch+) ■ 07:30〜24:00 ■
那須川天心とは何だったのか?メイウェザーにフルボッコKO負け7
【ライフ】男35歳 “精子”の分かれ道、NHK最新不妊事情 「男性は年をとっても大丈夫という考えは誤り」 ★4
【コロナ】「コロナから復帰しました!ファンの皆さんきょうはよろしく!行きマウス」→ライブを中止に追い込んだ辻山孝太(30)を逮捕
海沿い以外の神奈川県民「町田は最高。町田駅には全てがある」←これマジ???????????? Part2
【パニグレ】パニシング:グレイレイヴン Part.148【Punishing Gray Raven】
立憲・白眞勲「もし韓国側が日本が納得する解決策を示せば関係改善に真剣に取組むか?」 ネット「朝鮮半島のスパイじゃん」「解決済み [Felis silvestris catus★]
【パズサバ】パズル&サバイバル ゾンビの巣窟【Puzzles&Survival】 Part28
ウクライナ軍「ドローンで戦車を20両以上撃破」わずか1週間での目覚ましい戦果! 情報大臣も有効性をアピール [ごまカンパチ★]
【プロ野球】 阪神タイガース、新助っ人緊急補強も メジャー35発のバルガスら有力候補 =ロサリオの不振受け
「10万円給付のツケ」は結局、国民に…!大増税時代がやってくる★4 [みなみ★]
[開発] VC++プログラマー涙目! DarkBASIC Pro Free
【DMM.R18】戦国プロヴィデンス Part158©bbspink.com ©bbspink.com
【STEINS;GATE 0】シュタインズ・ゲート ゼロ Chapter289
トランプ氏、イスラエル支持を明言 TVインタビューで [首都圏の虎★]
【STEINS;GATE 0】シュタインズ・ゲート ゼロ Chapter287
【プロレス】素直な浜口京子が…グレート―O―カーンと異次元コラボ対談 プロレスラーの強さ、優しさ、皆さんに知ってもらえた! [THE FURYφ★]
境界のRINNE 051 「ゴールドライセンス」 再放送 ◇1
【スターウォーズ】STAR WARS CONVERGE 01【コンバージ】
【SOFT】音楽聴くならSACD総合 Vol.56【HARD】
【PS4/PSVITA】プロ野球スピリッツ2019 Part19
【DQMSL】ドラゴンクエストモンスターズスーパーライト無課金スレpart3038【新生コマネチ団VSタカの団】
【STEINS;GATE 0】シュタインズ・ゲート ゼロ Chapter274
【STEINS;GATE 0】シュタインズ・ゲート ゼロ Chapter301
【STEINS;GATE 0】シュタインズ・ゲート ゼロ Chapter302
Steamプロファイルを晒すスレ Part 01
【STEINS;GATE 0】シュタインズ・ゲート ゼロ Chapter258
【STEINS;GATE 0】シュタインズ・ゲート ゼロ Chapter294
【STEINS;GATE 0】シュタインズ・ゲート ゼロ Chapter300
【悲報】コスパ良いはずの「福岡市」、家賃がグングン上昇し完全に終わる…
【STEINS;GATE 0】シュタインズ・ゲート ゼロ Chapter265
【STEINS;GATE 0】シュタインズ・ゲート ゼロ Chapter266
【STEINS;GATE 0】シュタインズ・ゲート ゼロ Chapter264
【STEINS;GATE 0】シュタインズ・ゲート ゼロ Chapter295
【STEINS;GATE 0】シュタインズ・ゲート ゼロ Chapter275
【STEINS;GATE 0】シュタインズ・ゲート ゼロ Chapter314
旧統一教会が5月に合同結婚式予定 宗教2世「早急に解散を」野党へ要望 [Stargazer★]
★120124 複数 通称「K5」によるコピペ荒らし報告スレ13
【核問題】北朝鮮、核開発を非難した仏に猛反論 「まずは核の脅威に全くさらされていないフランスが核兵器を放棄せよ」★3
【日本】安倍首相「鉄道の多言語化などを一気に進めていく」 東京五輪契機に★3
【北海道地震】なぜ北海道全域で停電に? 専門家は「リスクへの備えが足りなかったのでは」 ★3
【大学受験】医学部偏差値ランキング、私大「慶應」国公立「東大」トップ [首都圏の虎★]
【SKE48】厄介スレ146【くまっこ 前を歩く女性のパンティライン見て「誘ってるのかな?」】
HUGっと!プリキュア ++HUGTTO! PRECURE++ 84
【プレステージ】超!透け透けスケベ学園 CLASS 02 美しい裸身が透き通る、透けフェチ特濃SEX! 鈴村あいり【乱交/デカチン・巨根】 [無断転載禁止]©bbspink.com
【現代】「性交経験ゼロ」の若者が増えている…「性の不活発化」とどう向き合うべきか [愛の戦士★]
HUGっと!プリキュア ++HUGTTO! PRECURE++ 76
++クラランス Clarins++ Part11
switch 6000万台 vs PS5 0台
【朝日新聞】「保育園落ちた日本死ね」は不満を抱える市民の表現だ。国会議員の「朝日新聞死ね」は同列に出来ない ★7
不要なサイトをhostsファイルに加えるスレ 0.0.0.2
【2021年】Switch 97.54% PS4 2.35% PS5 0.09%【ソフトシェア】
HTS ハイテクシステム 002
【北海道】「旭川ってどうなってんの?」 女子高生殺人事件、内田容疑者が担当刑事と驚愕の不倫報道…「終わっている」悲憤慷慨の嵐 ★3 [樽悶★]
【アベノミクス/奴隷特区】外国人実習生の残業代などで岐阜の繊維業者28社に法令違反 時給「400円」の業者も[01/26]
【政治】安倍前首相は真っ青…チルドレン90人“造反”で総裁選「高市氏支持」まとまらず [首都圏の虎★]
【DQR】ドラゴンクエストライバルズ LV1334
【悲報】メンタリストDaiGo、「捕まってないだけの詐欺師」という誹謗中傷を訴えて敗訴
【スポーツLIFE】宮澤智 専用 0605(日)【HERO'S】
《Royal Blues》 ◇◇◇ Schalke 04 §001 ◇◇◇
【ヘイトスピーチ】川崎市の審査会がツイート削除要請へ 在日コリアンの女性中傷か 不当な差別に当たると言意見一致 [ばーど★]
【コモド】 COMODO Internet Security 01
00:47:47 up 13 days, 1:51, 1 user, load average: 7.46, 8.80, 9.46

in 2.1907098293304 sec @0.067142963409424@0b7 on 012614