競え
※前スレ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
C vs C++ vs Rust Part.2
レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん
2021/12/15(水) 12:35:50.91ID:biBE4xC02デフォルトの名無しさん
2021/12/15(水) 12:36:12.51ID:biBE4xC0 たったぞ
3デフォルトの名無しさん
2021/12/15(水) 12:36:52.73ID:z10T13Tn C vs は余計だった
2021/12/15(水) 13:56:40.08ID:e2FwtkWT
Cに原点回帰しようよ
2021/12/15(水) 13:57:35.77ID:Z/edc862
GoはC++というよりCっぽいよな
2021/12/15(水) 14:37:20.55ID:30tmY3QB
Goはモダン言語にアレルギー反応が出てしまうC老人のための言語
2021/12/15(水) 16:01:42.93ID:pLz5Pfsh
顔真っ赤な怒り心頭Rustオジサンがなぜかスレタイに無いGoを粘着でディスり続ける
2021/12/15(水) 16:09:17.23ID:IT6MYik3
言語仕様が優れてるとかなんとかはあるだろうけど
結局使いものになる言語は何かと言われればC/C++なんだよ
結局使いものになる言語は何かと言われればC/C++なんだよ
2021/12/15(水) 16:23:40.38ID:Il5L6NWm
Rustは流行りもの
C、C++は基本
C、C++は基本
2021/12/15(水) 17:32:42.49ID:sKDBKV7A
RustとC++が互いに馬鹿にし合うのをCが高みの見物するスレですか?
2021/12/15(水) 18:10:14.36ID:t4BO72er
CやC++なんて、UNIXかWindowsが成功してなきゃ流行ってたわけない
(そもそもUNIXがないなら、C言語も生まれてないけど)
結局は勝ち組プラットフォームにおんぶにだっこされてるだけよ
Rustも巨大企業に推されて採用されてるから、優れてる言語かどうかに関係なく流行る
流行は巨人が決めてる
(そもそもUNIXがないなら、C言語も生まれてないけど)
結局は勝ち組プラットフォームにおんぶにだっこされてるだけよ
Rustも巨大企業に推されて採用されてるから、優れてる言語かどうかに関係なく流行る
流行は巨人が決めてる
2021/12/15(水) 18:23:30.40ID:EKKmEU1R
Rustンサーガ
パンツ一丁でオッサンが闘うヤツ
パンツ一丁でオッサンが闘うヤツ
2021/12/15(水) 18:49:53.25ID:8Epoo61s
本当のプログラマはPascalを使う
2021/12/15(水) 19:02:30.51ID:mn4aHBsE
May the FORTH be with you.
2021/12/15(水) 19:10:44.73ID:WtUWAuhG
いまだに組み込みはCオンリーですが、「UNIXがないなら、C言語も生まれてない」は間違いに近い
https://ja.wikipedia.org/wiki/C言語#歴史
https://ja.wikipedia.org/wiki/C言語#歴史
16デフォルトの名無しさん
2021/12/15(水) 19:15:49.17ID:A/sMbUcd >>8
でもチーム開発するならRustの安全性は100%じゃないとしても十分魅力的だなぁと思う。
でもチーム開発するならRustの安全性は100%じゃないとしても十分魅力的だなぁと思う。
17デフォルトの名無しさん
2021/12/15(水) 19:21:40.26ID:A/sMbUcd18デフォルトの名無しさん
2021/12/15(水) 19:59:26.95ID:pgpgQ+mf19デフォルトの名無しさん
2021/12/15(水) 20:02:20.26ID:pgpgQ+mf RustやRubyは、まず伝道師から始まるからな。
どういうわけか伝道師が大量発生する。
どういうわけか伝道師が大量発生する。
20デフォルトの名無しさん
2021/12/15(水) 20:03:30.36ID:pgpgQ+mf C++使いがコード書いてる間、彼らは伝道する。
神の使いなのかもしれんな。
啓示があったんだろう。
神の使いなのかもしれんな。
啓示があったんだろう。
2021/12/15(水) 20:08:47.10ID:KpHwa+U5
Rustは実用に主眼を置いた泥臭い言語なので
伝道師の言う美辞麗句は無視してよい
伝道師の言う美辞麗句は無視してよい
22デフォルトの名無しさん
2021/12/15(水) 21:48:54.34ID:A/sMbUcd っつか、いくら伝道師わいたってRust自身がその敷居の高さで安易に手を出すやつを排除するからRubyみたいには使われないんじゃねーの?
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)なので上手く動作してるようです
コードが少し長くなってしまったので冗長なところや改善点など教えていただけると幸いです
今回トレイト境界は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)なので上手く動作してるようです
コードが少し長くなってしまったので冗長なところや改善点など教えていただけると幸いです
2021/12/16(木) 14:51:19.13ID:fwM+9qOy
クソコード過ぎでこんなの誰も見ないよ
2021/12/16(木) 15:20:11.27ID:iS9fah9V
>>24
良いコードをご教授していただけませんか?
普通にループは使わずに足し算と比較のみで素数をその型の上限まで返すイテレータ関数です
言語はCでもC++でもRustでも構いませんのでよろしくお願いします
良いコードをご教授していただけませんか?
普通にループは使わずに足し算と比較のみで素数をその型の上限まで返すイテレータ関数です
言語はCでもC++でもRustでも構いませんのでよろしくお願いします
2021/12/16(木) 15:29:32.29ID:Hlz92r+j
Playgroundでu16に変えたらTLEした
2021/12/16(木) 15:38:05.88ID:iS9fah9V
2021/12/16(木) 15:59:44.48ID:V9bBAe8M
Rustのコードはなに見てもきたねぇな
2021/12/16(木) 16:08:39.90ID:iS9fah9V
>>29
それは私がプログラミング勉強中だからだと思います
あるいはCやC++ならば「ループを使わずに足し算と比較のみで素数をその型の上限まで返すイテレータ関数」を
綺麗にプログラミングできますか?
綺麗なコードをご教示していただけるとうれしいです
それは私がプログラミング勉強中だからだと思います
あるいはCやC++ならば「ループを使わずに足し算と比較のみで素数をその型の上限まで返すイテレータ関数」を
綺麗にプログラミングできますか?
綺麗なコードをご教示していただけるとうれしいです
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?; .. とした方がネストが浅くなる
類似の処理は名前をつけて関数に括りだした方がわかりやすい
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?; .. とした方がネストが浅くなる
類似の処理は名前をつけて関数に括りだした方がわかりやすい
2021/12/16(木) 17:33:56.80ID:3qs6QL/g
>>23
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=6d5f63ffe7c46236a0957017db33a0b9
もう少し改善できた
スレ汚しすまん
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=6d5f63ffe7c46236a0957017db33a0b9
もう少し改善できた
スレ汚しすまん
2021/12/16(木) 17:35:37.19ID:M/ZR00Mb
34デフォルトの名無しさん
2021/12/16(木) 18:18:18.75ID:OBc86cw835デフォルトの名無しさん
2021/12/16(木) 18:19:05.42ID:OBc86cw8 rustのコードはc/c++以上に見苦しい
こんな言語を業界全体でプッシュしてるのは異常だよ
こんな言語を業界全体でプッシュしてるのは異常だよ
2021/12/16(木) 18:37:24.71ID:3qs6QL/g
>>35
どの業界の話だよ
どの業界の話だよ
2021/12/16(木) 18:55:01.30ID:7LXHVZ3Z
日本のC++業界だよ
2021/12/16(木) 19:06:28.01ID:0UZhzBxa
なんでこいつRustの本スレでやらないんだろ、ほんまキモイ
2021/12/16(木) 19:15:09.93ID:bRADTu+t
本スレで自己満足やられて本気でウザかったからここでいいよ
40デフォルトの名無しさん
2021/12/16(木) 19:40:56.05ID:OBc86cw8 だからここはガイジ隔離用のスレなんやで
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
どうもありがとうございます
調べて勉強します
色々とありがとうございます
返り型が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
どうもありがとうございます
調べて勉強します
2021/12/16(木) 20:07:32.48ID:22XvzF/H
字面だけみるとPerlとどっこいの汚さだな
2021/12/16(木) 20:20:38.68ID:aj4Oe3UU
2021/12/16(木) 20:25:07.71ID:IyRKg3i2
unfold使ったこと無いから間違ってたら教えてほしいんだけど
これO(n^4)?
これO(n^4)?
2021/12/16(木) 20:34:01.51ID:V9bBAe8M
ゲロのようだ
46デフォルトの名無しさん
2021/12/16(木) 20:37:46.92ID:Y2CVy/MB さわやかな新宿の朝って感じですね。
ゲロの臭いでもらいゲロしそう。
ゲロの臭いでもらいゲロしそう。
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でも構いません
違うと思います
まず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 そもそも
「ループを使わずに足し算と比較のみで素数をその型の上限まで返すイテレータ関数」
というのはどこからでてきたもんなんだ?
この条件になにか意味があるの?
「ループを使わずに足し算と比較のみで素数をその型の上限まで返すイテレータ関数」
というのはどこからでてきたもんなんだ?
この条件になにか意味があるの?
2021/12/16(木) 23:05:37.82ID:iS9fah9V
>>48
まず素数なら列になるのでイテレータにするのはいいですよね
用いる型によって上限値が異なるから上限まで返すのも自然ですよね
足し算と比較は必要最低限として不可欠だと思います
どうしてもならばループは使ってもいいですよ
だから今回は可能ならばループを直接使わずに高階関数イテレータ使用でという話だけです
つまりそんな難しい話をしているわけではないと思います
他の言語のコードが出てこないのは難しいからなのでしょうか?
まず素数なら列になるのでイテレータにするのはいいですよね
用いる型によって上限値が異なるから上限まで返すのも自然ですよね
足し算と比較は必要最低限として不可欠だと思います
どうしてもならばループは使ってもいいですよ
だから今回は可能ならばループを直接使わずに高階関数イテレータ使用でという話だけです
つまりそんな難しい話をしているわけではないと思います
他の言語のコードが出てこないのは難しいからなのでしょうか?
2021/12/16(木) 23:20:42.17ID:22XvzF/H
Rustのことは知らんのだけどsome, any, map, findって実質ループじゃないの?
Rubyっぽい構文も見られるけどブロックを毎度呼び出してもらってるだけだからループじゃないとかいうわけ?
Rubyっぽい構文も見られるけどブロックを毎度呼び出してもらってるだけだからループじゃないとかいうわけ?
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) })
}
登場していた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) })
}
2021/12/17(金) 00:00:59.02ID:vT0QTAiv
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)))})
めっちゃ理解しやすくなったな
まるで宣言型論理プログラミングっぽい雰囲気だ
説明の日本語はこう書くとよい
//素数とは自分未満で次を満たす約数を見つけること
.find(|b| inc(T::one(), T::one(), |x| x < *b)
// 条件は約数の倍数すべて(自分以下)が
.all(|c| inc(T::zero(), c, |x| x <= *b)
// 自分と一致しないこと
.all(|d| d != *b)))})
2021/12/17(金) 00:54:27.00ID:BYm5EDTZ
恥ずかしい自演
2021/12/17(金) 01:40:56.99ID:IfdsKAW/
ん?
あと変数名をわかりやすく変えたほうがいいぞ
あと変数名をわかりやすく変えたほうがいいぞ
2021/12/17(金) 02:46:20.43ID:/GCsHBLw
本スレでクソコード連投してた奴だな
素数列挙をジェネリックにしてうれしがるセンスが厨二病っぽい
素数列挙をジェネリックにしてうれしがるセンスが厨二病っぽい
2021/12/17(金) 05:16:05.83ID:Ph9FgRES
計算量悪くね?
58デフォルトの名無しさん
2021/12/17(金) 07:30:23.20ID:1kSORKuu2021/12/17(金) 07:58:24.35ID:iDAFjWCW
アセンブリ言語
2021/12/17(金) 08:05:48.36ID:Fp+PkeDU
>>58
Wikipediaにすら「当初はアセンブリ言語のみで開発されたが、1973年にほぼ全体をC言語で書き直した。」と書かれているんだけど。
Wikipediaにすら「当初はアセンブリ言語のみで開発されたが、1973年にほぼ全体をC言語で書き直した。」と書かれているんだけど。
2021/12/17(金) 12:07:05.98ID:XK6UjWpG
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));
}
コードが汚いとご批判くださっていた皆さま方
これでいかがでしょうか?
ご指摘ありがとうございます
変数名を英語やローマ字にしてもわかりにくかったため日本語にしました
あとは無駄な部分を整理した結果シンプルになりました
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));
}
コードが汚いとご批判くださっていた皆さま方
これでいかがでしょうか?
2021/12/17(金) 14:02:48.80ID:1gPCJ7Gb
マジで何がしたいんだろこいつ
使えなさ加減は似たようなものだが
計算量を重視するだけ競プロ信者のほうがまだマシ
使えなさ加減は似たようなものだが
計算量を重視するだけ競プロ信者のほうがまだマシ
2021/12/17(金) 15:05:48.68ID:jilrKB7M
コードゴルフみたいなパズル感覚なんじゃね
知らんけど
知らんけど
65デフォルトの名無しさん
2021/12/17(金) 15:26:17.81ID:FYxSWdGJ rustの構文が本当に受け付けない
2021/12/17(金) 15:43:15.77ID:jilrKB7M
2021/12/17(金) 19:26:50.90ID:dBwqVSxt
rustが流行って、こういう素数なんて書く意識高い初心者が量産されて、汚ねぇコードを治すのかと思うと
今から頭痛がしてくる
今から頭痛がしてくる
68デフォルトの名無しさん
2021/12/17(金) 19:33:47.63ID:qRSiIGna2021/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))))
今どきは他のプログラミング言語も似たようなものだぜ
例えば配列 [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))))
2021/12/17(金) 19:52:32.78ID:e4M9F+jO
>>69
FORTHの時代が来たな。
FORTHの時代が来たな。
71デフォルトの名無しさん
2021/12/17(金) 20:12:51.70ID:4mtvzkHU 【Rust】
a.iter().sorted().rev().map(|n| n.to_string()).join("-")
これはどんなアセンブリコード吐くの?
a.iter().sorted().rev().map(|n| n.to_string()).join("-")
これはどんなアセンブリコード吐くの?
2021/12/17(金) 20:32:50.39ID:jilrKB7M
2021/12/17(金) 20:41:41.40ID:IfdsKAW/
2021/12/17(金) 21:36:06.81ID:jaIRX2N3
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』は符号なし整数です
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』は符号なし整数です
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 を返しています
まず以下の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 を返しています
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();
}
ここではメソッドチェーンになっているので後続のイテレータが呼びます
具体的には>>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();
}
2021/12/17(金) 23:54:35.76ID:M1BnXuWN
今回>>77のmy_print()はメソッドチェーンの最後なので構造体を返していません
だから正確にはmy_print()はイテレータではなくイテレータに実装されたメソッド(の一つ)という立場だけです
逆に言えばメソッドチェーンの途中の全てのイテレータメソッドは各々の固有の構造体を返します
そして後続のイテレータ(など)からnext()の値を要求されたらそれを返す動作のみするのがイテレータです
長いメソッドチェーンで一番最後がnext()を要求して連鎖的に最初のnext()が呼ばれるパターンもよく有ります
なぜなら多くのケースで途中のイテレータは自分のnext()実装で先行するイテレータのnext()を呼び出すからです
そして連鎖的にnext()呼び出しが生じても動作原理は多段の関数呼び出しと同じです
したがって元の質問>>71「どんなアセンブリコード吐くの?」も
「イテレータとして機能するメソッド呼び出しは単なる関数であって構造体を返すだけ」と
「あとで後続からその構造体に実装されてるnext()関数が呼ばれる」だけなのです
特別な仕組みとか裏でインタプリタやランタイムや魔法が密かに動いている、ってことはないです
だから正確にはmy_print()はイテレータではなくイテレータに実装されたメソッド(の一つ)という立場だけです
逆に言えばメソッドチェーンの途中の全てのイテレータメソッドは各々の固有の構造体を返します
そして後続のイテレータ(など)からnext()の値を要求されたらそれを返す動作のみするのがイテレータです
長いメソッドチェーンで一番最後がnext()を要求して連鎖的に最初のnext()が呼ばれるパターンもよく有ります
なぜなら多くのケースで途中のイテレータは自分のnext()実装で先行するイテレータのnext()を呼び出すからです
そして連鎖的にnext()呼び出しが生じても動作原理は多段の関数呼び出しと同じです
したがって元の質問>>71「どんなアセンブリコード吐くの?」も
「イテレータとして機能するメソッド呼び出しは単なる関数であって構造体を返すだけ」と
「あとで後続からその構造体に実装されてるnext()関数が呼ばれる」だけなのです
特別な仕組みとか裏でインタプリタやランタイムや魔法が密かに動いている、ってことはないです
2021/12/17(金) 23:54:47.66ID:9qxPUMA0
文章を構造化できない人はコードを構造化することもできない
ひとりよがりが過ぎる
ひとりよがりが過ぎる
2021/12/17(金) 23:59:22.81ID:M1BnXuWN
>>79
では修正点や改善点などをお待ちしておりますw
では修正点や改善点などをお待ちしておりますw
81デフォルトの名無しさん
2021/12/18(土) 01:55:26.24ID:S/VVluSn ヒトに頼るな。
82デフォルトの名無しさん
2021/12/18(土) 02:17:36.05ID:Km8Qla7W ワロタ
2021/12/18(土) 02:17:43.63ID:793c4/xS
どんなアセンブリコード返すのという質問なんだから >>72 みたいにアセンブリ示せばよかろうに
2021/12/18(土) 02:43:52.24ID:8AnTZJX+
イテレータの作りを説明してくれた人ありがとう
それ自体は他の言語でもよくあるパターンだね
ただ聞きたかったのは効率を重視するはずの(と思っている)言語が
この書き方で効率のよいコードを吐けるかどうかってこと
>a.iter().sorted().rev().map(|n| n.to_string()).join("-")
Rustはimmutableが基本と言う話を聞いてるからもしかしたら
新しいオブジェクトを生成しまくってるんじゃないかと思ったんだよ
この書き方をしてC/C++と同レベルの効率のコードが吐けるのかなって
それ自体は他の言語でもよくあるパターンだね
ただ聞きたかったのは効率を重視するはずの(と思っている)言語が
この書き方で効率のよいコードを吐けるかどうかってこと
>a.iter().sorted().rev().map(|n| n.to_string()).join("-")
Rustはimmutableが基本と言う話を聞いてるからもしかしたら
新しいオブジェクトを生成しまくってるんじゃないかと思ったんだよ
この書き方をしてC/C++と同レベルの効率のコードが吐けるのかなって
2021/12/18(土) 02:56:00.48ID:793c4/xS
>>84
そのコードは to_string() を要素数だけ呼んで最後に join してるからヒープアロケーションの回数が気になる場合は使うべきでないコードだね
だだrustのイテレーターのメソッドチェーン自体は不要なヒープアロケーション行わないしメソッドはインライン展開できるので
ある程度複雑なメソッドチェーンでもfor文と同じようなアセンブリになると言われているよ
そのコードは to_string() を要素数だけ呼んで最後に join してるからヒープアロケーションの回数が気になる場合は使うべきでないコードだね
だだrustのイテレーターのメソッドチェーン自体は不要なヒープアロケーション行わないしメソッドはインライン展開できるので
ある程度複雑なメソッドチェーンでもfor文と同じようなアセンブリになると言われているよ
2021/12/18(土) 03:05:51.15ID:DtboORpD
>>84
例えばCのfor文などと比較すると、
その変化していく変数は構造体の中だが大元の関数のスタック上すなわちローカル変数と同じだからCと変わらん
あとinline展開指定されてるものなどで関数呼び出しオーバーヘッドも消えて前後のコードが繋がって最適化されるパターンもある
だから気にせずに使っても誤差範囲
例えばCのfor文などと比較すると、
その変化していく変数は構造体の中だが大元の関数のスタック上すなわちローカル変数と同じだからCと変わらん
あとinline展開指定されてるものなどで関数呼び出しオーバーヘッドも消えて前後のコードが繋がって最適化されるパターンもある
だから気にせずに使っても誤差範囲
2021/12/18(土) 03:17:03.48ID:NcZGWI1L
RustってC++に似てるな
ゲロみたいな構文だ
ゲロみたいな構文だ
2021/12/18(土) 03:38:45.07ID:DtboORpD
>>85
結局メソッドチェーンとは別問題として
一般的にVecやStringなどのヒープ使うものがループ内にあると注意やな
あとcollectでスタック使うArrayVecやArrayStringを指定する手もあるな
結局メソッドチェーンとは別問題として
一般的にVecやStringなどのヒープ使うものがループ内にあると注意やな
あとcollectでスタック使うArrayVecやArrayStringを指定する手もあるな
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実装があるからコストかからない
現実にはこのコードが核心部分でなければそこまで気にしなくていいけどな
> 配列 [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 一つだけアドバイスしとくけど、ジェームス・ボンドが日本人だったら、大木・凡人だからね。
2021/12/18(土) 08:35:30.45ID:7eXg1jWI
>>74
Rustを使ってればカッコイイという錯覚で、何も分かってないのに汚物のようなコードと意味不明な長文をまき散らす…
あんなに単純な初期のJavaやC#でさえスパゲッティコードだらけなのに、日本語の説明さえも気持ち悪い
Rustを使ってればカッコイイという錯覚で、何も分かってないのに汚物のようなコードと意味不明な長文をまき散らす…
あんなに単純な初期のJavaやC#でさえスパゲッティコードだらけなのに、日本語の説明さえも気持ち悪い
2021/12/18(土) 10:28:10.29ID:ThzZjx8/
2021/12/18(土) 11:41:10.36ID:mvmw4Z8Y
長文二人は属性が似過ぎだろ
こんなのが二人もいればRustスレが気持ち悪くなるわな
こんなのが二人もいればRustスレが気持ち悪くなるわな
2021/12/18(土) 16:44:21.13ID:QlLdBEfz
顔真っ赤で根拠も反論もない「こじらせてんな」マンが永遠と長文や短文を書き、本Rustすれに代わりキチガイを集めるスレ
95デフォルトの名無しさん
2021/12/18(土) 17:42:36.78ID:SCKEmW4H 延々とな
ガイジそう
ガイジそう
2021/12/18(土) 18:08:14.57ID:BJvml2Bt
元々rustスレの隔離スレなんだから大成功でしょ
2021/12/18(土) 20:19:16.51ID:Yd1FvpqW
98デフォルトの名無しさん
2021/12/18(土) 21:02:25.05ID:S/VVluSn > この難しさを取り除くために、Rustは、C/C++の落とし穴を排除し、その過程で使いやすく役に立つ
> 洗練された一連のツールを提供します。 低レベルな制御に「下がる」必要があるプログラマは、
> C/C++のクラッシュやセキュリティホールのリスクを負わず、 気まぐれなツールチェーンのデリケートな
> 部分を学ぶ必要なくRustで同じことができます。さらにいいことに、 Rustは、スピードとメモリ使用の観点で
> 効率的な信頼性の高いコードへと自然に導くよう設計されています。
> 洗練された一連のツールを提供します。 低レベルな制御に「下がる」必要があるプログラマは、
> C/C++のクラッシュやセキュリティホールのリスクを負わず、 気まぐれなツールチェーンのデリケートな
> 部分を学ぶ必要なくRustで同じことができます。さらにいいことに、 Rustは、スピードとメモリ使用の観点で
> 効率的な信頼性の高いコードへと自然に導くよう設計されています。
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などを新たに生成する場合
いずれもそれらの関数やクロージャをプログラムで使用した時のみ、動的にヒープが使われます
その、新しいオブジェクトを生成しまくってるんじゃないか、の意味が曖昧なので
自動的にヒープ領域から動的に新たなメモリ確保をすると解釈すると、それはないです
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からはじめるのはカッコつけたいだけの単なる無知
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からだとあかんの?
なんで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からつくってた
昔はアルゴリズムの教本を参考にして全部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を今から車輪の再発明すらできないしプログラミングにおいて新たな枠組みを作れないだろう
例えばそのザッカーバーグの例ならば
Facebook社はプログラミングにおいて新たな枠組みとして世間にも広まるほどのReactを作った
一方でザッカーバーグ自体はReactを今から車輪の再発明すらできないしプログラミングにおいて新たな枠組みを作れないだろう
134デフォルトの名無しさん
2021/12/21(火) 14:51:21.09ID:SKVIwMRv 枠組みに限らず何か新しいもの自力で作るには
その対象レイヤーのものを作れる能力は必要
それは当たり前
ザッカーバーグだって掲示板システムを実装する能力があったからFacebookを作れたわけだが
それを「車輪の再発明する能力」と呼ぶのかどうか
「新しい枠組み」と「車輪の再発明をする能力」の定義が曖昧すぎて中身がない
その対象レイヤーのものを作れる能力は必要
それは当たり前
ザッカーバーグだって掲示板システムを実装する能力があったからFacebookを作れたわけだが
それを「車輪の再発明する能力」と呼ぶのかどうか
「新しい枠組み」と「車輪の再発明をする能力」の定義が曖昧すぎて中身がない
135デフォルトの名無しさん
2021/12/21(火) 14:53:33.71ID:SKVIwMRv 結局のところ
「低レイヤーの開発をするには低レイヤーの実装能力が必要」という主張でしかない
「低レイヤーの開発をするには低レイヤーの実装能力が必要」という主張でしかない
136デフォルトの名無しさん
2021/12/21(火) 15:02:25.60ID:91RXJaij そこは定義でもめるから深入りしない
例えば例に挙げたReactは自分の観点からは低レイヤーではなく高レイヤー
結局これでいいかね?
各分野のプログラミングにおいて車輪の再発明すら出来ない人が
その分野のプログラミングにおいて新たな枠組みを作るのは無理
例えば例に挙げたReactは自分の観点からは低レイヤーではなく高レイヤー
結局これでいいかね?
各分野のプログラミングにおいて車輪の再発明すら出来ない人が
その分野のプログラミングにおいて新たな枠組みを作るのは無理
137デフォルトの名無しさん
2021/12/21(火) 16:17:27.88ID:ukVjEMSL 車輪の再発明って何
自身で模倣できる程度には理解しているということ?
自身で模倣できる程度には理解しているということ?
138デフォルトの名無しさん
2021/12/21(火) 17:55:52.77ID:dNZ8oAHl レイヤーは相対的なものだよ
低レイヤーで通じないなら下位レイヤーとでも言おうか
Reactのユーザーから見ればReactそのものの開発は下位レイヤー
Reactを作るために下位レイヤーのJavaScriptエンジンやレンダリングエンジンを再発明できる能力が必要か?
低レイヤーで通じないなら下位レイヤーとでも言おうか
Reactのユーザーから見ればReactそのものの開発は下位レイヤー
Reactを作るために下位レイヤーのJavaScriptエンジンやレンダリングエンジンを再発明できる能力が必要か?
139デフォルトの名無しさん
2021/12/21(火) 19:16:57.14ID:91RXJaij 話はシンプル
それぞれの分野で見ればよい
Reactの分野だったら
『自分でウェブフロントフレームワークを簡易なものでよいから作ったことあるか?あるいは作れるか?』
これだけの話
つまりReactの開発者たちと同じような立ち位置に立てるプログラマーなのか、
それともReactの消費者としてユーザーの立場のプログラマーなのか、の違い
それぞれの分野で見ればよい
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
ああいうのが"新しい枠組みを作ることも可能な生産者"だったのか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:+56mJT2x155デフォルトの名無しさん
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/p3165デフォルトの名無しさん
2021/12/23(木) 08:21:29.85ID:zbE03cOE166デフォルトの名無しさん
2021/12/23(木) 10:21:26.98ID:jJ3uH/7E 無限大を数値計算で扱うために優秀なソフトエンジニア達の手によって、例えば離散フーリエ変換や離散ウェーブレット変換などのアルゴリズムが工夫され考え出された
これが新しい枠組みを作り出すということ
これが新しい枠組みを作り出すということ
167デフォルトの名無しさん
2021/12/23(木) 10:33:51.13ID:uWdVPWrO168デフォルトの名無しさん
2021/12/23(木) 11:37:52.36ID:Gjq2t2pD >>167
FTは無限大集合を扱っている訳では無いだろ。実数とか扱えないし。
FTは無限大集合を扱っている訳では無いだろ。実数とか扱えないし。
169デフォルトの名無しさん
2021/12/23(木) 12:01:15.99ID:l46o0/Jm 周期信号のフーリエ級数展開なら有限だけど連続信号を扱うなら無限積分の計算が必要
FTは無限積分を数値計算するため分割統治のバタフライ演算に落とし込んで更に演算量を抑えるため各種のアルゴリズムが考案されてる
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億までの全ての素数を順に出力できるようになりました
このスレは数学が得意な方々が多いようなのでご検証よろしくお願いします
『足し算のみで素数列を生成するジェネリックなイテレータの実装』
を当時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.新素数)
}
}
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
}
「子」と「孫」を再帰的に利用しているためです
「自分」だけで必要なメモリを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(子)),
}
}
}
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使用
これらを足し算のみで実現できています
どうぞご検証よろしくお願いします
今回は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が入ってるのはおかしくない?
アルゴリズムはエラトステネスの篩だよね?
そう言ってくれたほうが理解しやすいよ
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億必要だよな?
メモリもエラトステネスだと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億など決まって開始する古典的エラトステネスのふるいでは上手くいかないのです
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言語で書いてみてよ
ちょっと普通のループでいいからC言語で書いてみてよ
187デフォルトの名無しさん
2021/12/24(金) 00:19:39.24ID:HWkip0+R188デフォルトの名無しさん
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
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の一例としての高階関数のことを言いたいんじゃないかな?
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は「未来に先送り」ではなく「未来を先取り」と捉えたほうがよくないでしょうか
そして遅延評価というよりも並行並列評価する形になりますね
したがって今回の話には適さないかなと思います
ある意味その考え方も正しいかもしれませんが
イテレータは例えば大ざっぱに分けても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)
})
}
> わざわざ決まってる数列を順番に出力するイテレータ書くのにそんな記述が必要になるのか
決まってる数列ではなく毎回算出するんですよ
記述については各々のイテレータはそれぞれ何らかの構造体にすぎないので >>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:UVQKl71H198デフォルトの名無しさん
2021/12/24(金) 23:17:20.90ID:759ZBatD より良い方法に興味があるんなら、普通に既存実装を研究してみたらいいんじゃない?
例えばRubyの標準添付ライブラリにも Prime.each があるよ
ソースはここ https://github.com/ruby/prime
おれはそこまで素数のアルゴリズム自体には興味ないから考えないけど
例えばRubyの標準添付ライブラリにも Prime.each があるよ
ソースはここ https://github.com/ruby/prime
おれはそこまで素数のアルゴリズム自体には興味ないから考えないけど
199デフォルトの名無しさん
2021/12/25(土) 01:08:34.65ID:0QMGJaE9 >>197
CかC++で書いて
CかC++で書いて
200デフォルトの名無しさん
2021/12/25(土) 04:20:39.50ID:9OzOPrjS C/C++/Rustならどの言語も理解できないほどの特異な書き方や奇妙な省略もなくどれも似たようなもんだ
どれか一つで書かれていれば普通のプログラマーなら読めるだろう
それでもわからない部分があれば質問したら皆が教えてくれるぞ
どれか一つで書かれていれば普通のプログラマーなら読めるだろう
それでもわからない部分があれば質問したら皆が教えてくれるぞ
201デフォルトの名無しさん
2021/12/25(土) 06:09:26.55ID:sZ4+jXNJ202デフォルトの名無しさん
2021/12/25(土) 09:05:26.62ID:0QMGJaE9 >>200
普通のプログラマじゃなくて雑魚なんで
Rustで書かれたコードはわからないしRustの説明が欲しいわけじゃない
C/C++で書かれてれば説明無用だから全部わかるならC/C++で書いてくれない?
普通のプログラマじゃなくて雑魚なんで
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で割り切れる
普通に、メソッドチェーンを左から処理していくと、
無限に処理できないので、右から処理していく
素数は、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は素数?
}
//25は素数?
}
206デフォルトの名無しさん
2021/12/25(土) 14:02:33.11ID:+KvRe5Is >>205
さすがに必要条件と十分条件がわからないのはどうかと思う
さすがに必要条件と十分条件がわからないのはどうかと思う
207デフォルトの名無しさん
2021/12/25(土) 14:14:33.50ID:0QMGJaE9208デフォルトの名無しさん
2021/12/25(土) 14:21:15.89ID:6Qf096MJ >>194
その考え方がまさに木を見て森を見ず
その考え方がまさに木を見て森を見ず
209デフォルトの名無しさん
2021/12/25(土) 14:40:34.51ID:E7PEPPKI210デフォルトの名無しさん
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は合成数
}
改めて素数かどうかを判定する関数に通すってことか?
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オジサンは気持ち悪い基地外だと思います
発信、受信、仲介、合成、創造?
コンピューターサイエンス分野を見ても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()を提供せず
以前に議論されていた消費者プログラマー(?)だと区別を一生気付かないままかもしれぬ
命名はともかくイテレーターがそのように分類されることは俺でもわかるぜ
>(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:+KvRe5Is222デフォルトの名無しさん
2021/12/25(土) 20:41:43.56ID:qfkDfu3c >>219
自演バレバレやぞw
自演バレバレやぞw
223デフォルトの名無しさん
2021/12/25(土) 21:08:04.90ID:9OzOPrjS224デフォルトの名無しさん
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:nV1lOrYt229デフォルトの名無しさん
2021/12/25(土) 23:46:56.47ID:cn6bnobm 試し割り法で検索しろ
230デフォルトの名無しさん
2021/12/26(日) 00:33:01.70ID:kT157QEc >>228
素数が足し算平均2.5回程度で求まるアルゴリズムを説明してくれないか?
素数が足し算平均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に切り替えた
日本国内でも、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オジサンです
仲介手数料、信用創造、お前が同じ穴の狢、アホの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億の足し算で原理的には済むはず
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/M237デフォルトの名無しさん
2021/12/26(日) 21:25:21.15ID:XOSaINd5 エラトステネスの篩、のことなのでは?
でも1億分のバッファとか、勿体ない気がしますね…
でも1億分のバッファとか、勿体ない気がしますね…
238デフォルトの名無しさん
2021/12/26(日) 22:30:41.92ID:RjefXsAR そこで区間篩ですよ
239デフォルトの名無しさん
2021/12/26(日) 22:31:44.15ID:kT157QEc 発見済みの素数を使ってループして数Xが素数かどうかを調べてるだけだろ?
足し算平均2.5回って意味不明なんだが?
足し算平均2.5回って意味不明なんだが?
240デフォルトの名無しさん
2021/12/26(日) 22:57:15.49ID:Tvo9Wvhs241デフォルトの名無しさん
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)なのか
>>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:L9HJqboW243デフォルトの名無しさん
2021/12/27(月) 00:18:24.10ID:OK/wNcge >>242
C言語でいいから加算で素数を求めるアルゴリズム書いてくれない?
C言語でいいから加算で素数を求めるアルゴリズム書いてくれない?
244デフォルトの名無しさん
2021/12/27(月) 08:37:12.33ID:vZ39sN8j このスレで出てきているテレーターがよくわからんのだけど、wikipediaの定義と違うんかいな?
ttps://ja.m.wikipedia.org/wiki/%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF
ttps://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を見るといい
その日本語wikiは怪しいので英語のwikiを見るといい
246デフォルトの名無しさん
2021/12/27(月) 13:29:55.23ID:ZyPtB7dw 100回繰り返すのと1億回繰り返すのとどっちがマヌケに見えるか、億という言葉を使えば賢く見えるのか?
億回繰り返さないと理解できないのか、汚コードRust相談室と化したC vs C++ vs Rustスレに未来はあるのか
億回繰り返さないと理解できないのか、汚コード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を「全て足して」目的を達成
このように個々の単機能イテレータを複数組み合わせて連鎖させることでプログラミングできる
実際のコード例で体験していくと理解が早い
例えばこの計算をしたいとする
>>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を使ったほうが便利
しかしC++のイテレータは低レベルでポインタを抽象化したものと考えたほうがいいので注意
C++にもようやくmap()に相当するものが入ったが他言語とは異なりtransform()という名前など使いにくい
今どきのプログラミングしたいなら素直にRustを使ったほうが便利
252デフォルトの名無しさん
2021/12/27(月) 23:38:31.34ID:0wmEJTQl253デフォルトの名無しさん
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やこのスレの素数生成はイテレータとして機能しているから明白にイテレータ
それは観点が違うな
値を生成するものであってもイテレータとして機能するものと機能しないものがある
つまり重要な点はイテレータとして機能するか否かのみ
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で(暗黙)変換されるだけ。
こいつ、あちこちで暴れてる
単に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 秒)
すげー、全世界で、このスレにしかその言葉は存在しない
約 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) = イテレータメソッドだが イテレータ(狭義)ではない
広義のイテレータは狭義のイテレータとイテレータメソッドを合わせたものである
(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:UIm7WL46269デフォルトの名無しさん
2021/12/28(火) 18:00:29.58ID:p0MyQfYl 素数生成君と仲介イテレータ君は同一人物だったのか
どおりで
どおりで
270デフォルトの名無しさん
2021/12/28(火) 22:24:23.54ID:ndrZKvgW271デフォルトの名無しさん
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してるのがイテレータなのは間違いない
詫びがてら説明しておくがイテレータは数えあげる人のこと
「次くれ」→ 「はい、どうぞ」
「次くれ」→ 「はい、どうぞ」
「次くれ」→ 「もうありません」
数えあげる対象物を数えあげる人自身が持ってる場合もあれば持ってない場合もある
impl Iteratorしてるのがイテレータなのは間違いない
274デフォルトの名無しさん
2021/12/28(火) 22:49:58.47ID:a2iPSFXu275デフォルトの名無しさん
2021/12/28(火) 23:41:11.95ID:c9bIiubz 出典もなしに能書き垂れるのやめろ
276デフォルトの名無しさん
2021/12/28(火) 23:52:38.14ID:a2iPSFXu デザインパターンの一つであるイテレータパターンの説明図 (wikipediaより)
https://upload.wikimedia.org/wikipedia/commons/c/c5/W3sDesign_Iterator_Design_Pattern_UML.jpg
next()を持つものがイテレータ
つまり>>267の定義で合っている
https://upload.wikimedia.org/wikipedia/commons/c/c5/W3sDesign_Iterator_Design_Pattern_UML.jpg
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メソッドを呼び出すこともできます。
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:R7H13gAM280デフォルトの名無しさん
2021/12/29(水) 02:02:16.54ID:8RYkbehC281デフォルトの名無しさん
2021/12/29(水) 03:47:51.11ID:L3UdfSEZ イテレーターの定義はIteratorを実装してる型で良いと思うがそれがどう C vs C++ vs Rust に繋がるのか
282デフォルトの名無しさん
2021/12/29(水) 09:34:00.36ID:/J/UmHDr283デフォルトの名無しさん
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()を除いて聞いたことがないので
広義のイテレータを定義してるソースがあるなら提示してもらいたい
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と読んでる人居るね
まあ単にイテレータのメソッドってことなんだけど
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:mnKs3jeD289デフォルトの名無しさん
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()を利用する側となる
「の」を入れて「イテレータのメソッド」とした方がいいだろう
(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);
}
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ばかりになっている
プログラミング言語としての優劣の違い
Rustだと楽に書けるからこのスレに書かれているコードがRustばかりになっている
プログラミング言語としての優劣の違い
297デフォルトの名無しさん
2021/12/31(金) 07:44:51.93ID:M33hR7ol Rustだと楽にかける分野ってメモリ安全性関連以外ない気がする
298デフォルトの名無しさん
2021/12/31(金) 07:51:10.24ID:FgwbS9xc Rustはイテレータ作れる文法用意されててスゴイ言語ってことか
まあトイプログラム作るのに秀でた言語いじって喜んでるレベルじゃ
あらゆる分野のアプリケーションが書かれてきたC++の実績は理解できないだろうな
せいぜい不得意なことと言えばスクリプト言語で代用される分野くらいだろ
まあトイプログラム作るのに秀でた言語いじって喜んでるレベルじゃ
あらゆる分野のアプリケーションが書かれてきたC++の実績は理解できないだろうな
せいぜい不得意なことと言えばスクリプト言語で代用される分野くらいだろ
299デフォルトの名無しさん
2021/12/31(金) 08:08:48.60ID:tc6fCfYn300デフォルトの名無しさん
2021/12/31(金) 08:23:51.96ID:M33hR7ol301デフォルトの名無しさん
2021/12/31(金) 08:33:21.86ID:BI8sFyN6302デフォルトの名無しさん
2021/12/31(金) 09:32:24.05ID:Lhm1MIug303デフォルトの名無しさん
2021/12/31(金) 10:43:31.43ID:faZP1uCu C++20 からコルーチンが入ってジェネレータは割と書きやすくなったよ
とはいえイテレータのほうが従来通りのポインタ的用法に引きずられてるからなんともだけど
https://cpprefjp.github.io/lang/cpp20/coroutines.html
とはいえイテレータのほうが従来通りのポインタ的用法に引きずられてるからなんともだけど
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のスケルトンを作ってくれるから
穴埋めしていくだけで処理が書けて楽
c++でもできるけどenumの値とunionのvariantの組み合わせはプラグラマが意識しないといけない
rustだとmatch式のcond部分に値を書けばrust-analyzerがすべてのarmのスケルトンを作ってくれるから
穴埋めしていくだけで処理が書けて楽
305デフォルトの名無しさん
2021/12/31(金) 12:10:32.68ID:M33hR7ol >>304
まあrustの方がc++よりパターンマッチング楽なのは認めるよ間違いない
まあrustの方がc++よりパターンマッチング楽なのは認めるよ間違いない
306デフォルトの名無しさん
2021/12/31(金) 21:01:38.85ID:7OQCq2Au C++と比べてRustだとメモリ安全にできるから、スレッドセーフなコードも誰でも書けるよ
そういったメモリ安全関連の利点がなきゃ存在意義のない言語だよね
書いたコードが高速に動作するかどうか、とかはまた別の話だけど
そういったメモリ安全関連の利点がなきゃ存在意義のない言語だよね
書いたコードが高速に動作するかどうか、とかはまた別の話だけど
307デフォルトの名無しさん
2021/12/31(金) 21:30:26.51ID:Cc3nB8ek308デフォルトの名無しさん
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にあるという認識は正しい
かゆいところにも手が届くスクリプト言語という側面もある
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が採用されることもあると思うよ
CやC++と同等の性能特性を持つ言語の選択肢は限られてるから安全性以外の理由でRustが採用されることもあると思うよ
312デフォルトの名無しさん
2021/12/31(金) 22:03:31.93ID:XhcmshbG Rustって循環参照安全に書けないんじゃなかったけ?
313デフォルトの名無しさん
2021/12/31(金) 22:11:10.66ID:Cc3nB8ek314デフォルトの名無しさん
2021/12/31(金) 22:18:59.59ID:tc6fCfYn315デフォルトの名無しさん
2021/12/31(金) 22:24:28.60ID:tc6fCfYn316デフォルトの名無しさん
2022/01/01(土) 00:53:57.74ID:xczakg94 Rustのmatch式はScalaの後追いパクリw
317デフォルトの名無しさん
2022/01/01(土) 01:00:44.48ID:193tzZ58318デフォルトの名無しさん
2022/01/01(土) 01:12:03.78ID:jvk1ETyF プログラミング言語としての比較結果は明瞭
適用可能な範囲は同じかつ最速
いずれもGCがなく低レベル操作も可能
Rust = C++ = C
したがって勝負は他の点
コード記述が楽に簡潔に書けるか
Rust > C++ > C
安全なコードを書けるか保証できるか
Rust > C++ > C
適用可能な範囲は同じかつ最速
いずれも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も日々提案されてるし現状で十分とあぐらをかくべきではないと思う
> いずれも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++の方が近い
> 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と酷似している。
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:jvk1ETyF325デフォルトの名無しさん
2022/01/01(土) 01:50:45.71ID:KzNGE8bI Javaは組み込みにも使われ、それどころかpico javaというJavaを効率よく実行できる組み込み用プロセッサのアーキテクチャ迄あるんですよ。
完全にRustと一致するじゃないですか。
実績を考えたらRustを完全に包含しています。
なぜ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は実際にはそんなに爆速じゃないだろうし、データ競合の対策がしやすい言語とも思えんけど
Javaは実際にはそんなに爆速じゃないだろうし、データ競合の対策がしやすい言語とも思えんけど
328デフォルトの名無しさん
2022/01/01(土) 02:05:29.52ID:KzNGE8bI 活気があったころは、C++と比較して20倍速いと主張するサイトもありましたよ。
まさに爆速です。
Rustと似ています。
まさに爆速です。
Rustと似ています。
329デフォルトの名無しさん
2022/01/01(土) 02:07:14.76ID:KzNGE8bI 安全性という観点では、RustはHaskellと似ているように思います。
熱心なHaskellユーザーはコンパイルが終わればバグが無いことを保証されると主張します。
Rustと全く同じです。
熱心なHaskellユーザーはコンパイルが終わればバグが無いことを保証されると主張します。
Rustと全く同じです。
330デフォルトの名無しさん
2022/01/01(土) 02:10:16.54ID:jvk1ETyF Javaを含めるとこうなる
安全なコードを書けるか保証できるか
Rust > Java > C++ > C
Javaはヌルポインタによる参照でエラー例外が実行時に起き得る
Rustはそれさえも起きない
したがって速さだけでなくメモリ安全の点でも Rust > Java が確定済
Javaが勝てる点がない
そのためJavaを捨ててRustへ移行するプロジェクトもある
安全なコードを書けるか保証できるか
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では、どれが最も優れているのでしょう?
しかし、JavaやRustと比較されることは一切在りません。
Java、Rust、Haskellでは、どれが最も優れているのでしょう?
332デフォルトの名無しさん
2022/01/01(土) 02:13:26.08ID:KzNGE8bI でもRustはJavaより遅いですよね?
Javaは実行時最適化によりC++より20倍速いことがbenchmarkで判明していますよ。
10年以上も前に。
Javaは実行時最適化によりC++より20倍速いことがbenchmarkで判明していますよ。
10年以上も前に。
333デフォルトの名無しさん
2022/01/01(土) 02:15:29.86ID:KzNGE8bI C++を改良したD言語もあります。
DとRustならどちらが優れているのでしょう?
DとRustならどちらが優れているのでしょう?
334デフォルトの名無しさん
2022/01/01(土) 02:16:49.60ID:KzNGE8bI 出自からして、D言語もまたC++と比較して優位性が述べられる言語のひとつです。
しかし、RustやHaskellと比較されることは在りませんね。
どちらが優れているのでしょう?
しかし、RustやHaskellと比較されることは在りませんね。
どちらが優れているのでしょう?
335デフォルトの名無しさん
2022/01/01(土) 02:25:43.18ID:jvk1ETyF まずは決定的な違いを勉強しなさい
GCのない言語 Rust C++ C
GCのある言語 Java D C# Go Haskell Python Ruby JavaScript ...
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が在ろうとなかろうと。
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
他の言語との比較もありますよ
大体代替手段があるのはそうだと思います
例えば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に採用されないのか、って考えると差が明瞭になってきそうだ
なぜ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:jvk1ETyF342デフォルトの名無しさん
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/
>>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採用は効果有りと判断しているみたいです
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++を上回っています。
では、それらの言語を比較した場合、どれが最も優れているのでしょう?
速く容易で安全なのです。
全ての点でC++を上回っています。
では、それらの言語を比較した場合、どれが最も優れているのでしょう?
345デフォルトの名無しさん
2022/01/01(土) 04:11:14.25ID:KzNGE8bI ほとんどすべての言語がC++より優れていると主張します。
という事は、C++はもっとも劣った言語のひとつなのです。
Rustはもっとも劣った言語より優れていると主張しますが、優れた言語、例えばJavaやHaskellと比較したら、かなり劣っているのでは?
という事は、C++はもっとも劣った言語のひとつなのです。
Rustはもっとも劣った言語より優れていると主張しますが、優れた言語、例えばJavaやHaskellと比較したら、かなり劣っているのでは?
346デフォルトの名無しさん
2022/01/01(土) 07:34:43.36ID:JYrmLBPV 多くの人がRustとC++と比較している
比較するなら優れたもの同士を突き合わせるはずだ
なのにJavaやHaskellは影も形もないつまり論外ってことだ
全ての言語がC++に対して優位性を主張するのも
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++がこれらの言語より優れているかというとそうではありません
言語にはそれぞれ得手不得手があります
唯一絶対の尺度で優劣を決めようとするのではなく、ある特定の用途に対してどの言語が適しているかという観点で議論した方が生産的かと思います
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 対応
人工衛星イザナギ・イザナミで、使っている
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はコストをかけずに無駄なく安全性の保証を実現しているところに感動した
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とか
例えば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の型の核としているところにも感動した
HaskellのMaybeモナドやEitherモナドを採り入れてRustの型の核としているところにも感動した
357デフォルトの名無しさん
2022/01/01(土) 23:02:32.16ID:15i3uJ8f システムプログラミングでCに代替となれるほどRustがイケてるのは、
null安全やメモリ安全はモダンな言語だから当然として、データ競合が起きないことも保証しつつ、実行速度もCに劣らなくて、
それでいてRustと多少のアセンブラだけ使えば、OSや組み込みソフトウェアも普通に記述できるほどフットプリントの小さい低レベルな言語だから
null安全やメモリ安全はモダンな言語だから当然として、データ競合が起きないことも保証しつつ、実行速度もCに劣らなくて、
それでいてRustと多少のアセンブラだけ使えば、OSや組み込みソフトウェアも普通に記述できるほどフットプリントの小さい低レベルな言語だから
358デフォルトの名無しさん
2022/01/01(土) 23:08:54.95ID:KzNGE8bI システムプログラミングにはJavaのほうが向いています。
単純に速いからです。
Javaは宇宙でさえ使われる安全で実績のある言語です。
しかも速い。
実行時最適化を行わない言語では無理な速さです。
単純に速いからです。
Javaは宇宙でさえ使われる安全で実績のある言語です。
しかも速い。
実行時最適化を行わない言語では無理な速さです。
359デフォルトの名無しさん
2022/01/01(土) 23:23:23.09ID:KzNGE8bI 結局RustはHaskellの真似をするだけの偽物言語にすぎません。
Haskellの並列性、安全保証を移植するには、結局Haskellになるしかないのです。
RustはいずれHaskellになるでしょう。
その時もまだRustと呼び続けるのでしょうか。
Haskellの並列性、安全保証を移植するには、結局Haskellになるしかないのです。
RustはいずれHaskellになるでしょう。
その時もまだRustと呼び続けるのでしょうか。
360デフォルトの名無しさん
2022/01/01(土) 23:45:51.79ID:L78WNXLf361デフォルトの名無しさん
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礼賛が多くて参考にならんな
まあ優れた言語だから主流になるとも限らんけど
ここは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:yz2mFgPr371デフォルトの名無しさん
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安全を保証できる点で異なる
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は検出して例外を発生させるから安全なのです。
キチガイに騙されるな。
これはウソ。
ないほうが良いなら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は実行時にヌルポ発生しないことが保証されているから安全
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で書かれている割にはメモリリークで落ちたりするらしんだけどなんで?
このOS Rustで書かれている割にはメモリリークで落ちたりするらしんだけどなんで?
387デフォルトの名無しさん
2022/01/03(月) 17:50:43.83ID:gvPAh7hb 必須じゃないけど他の言語も知らないRust初心者が異常に増えてきているからトンチンカンな推しをするだけで
コミュニティの増加は良いことだが、初心者が書いた意味不明なコードを直すのはあんたら
Null安全系の推しをしてるのはド素人
コミュニティの増加は良いことだが、初心者が書いた意味不明なコードを直すのはあんたら
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だからバグなく作るのは難しいというのはあるかと思う
そもそも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++と同じで習熟甘いやつが作れば問題起きまくりなの?
結局C++と同じで習熟甘いやつが作れば問題起きまくりなの?
392デフォルトの名無しさん
2022/01/03(月) 21:51:41.06ID:WCyHxUxt >>387
Rustを含めていまどきの言語がnull安全なのは常識
むしろC++やJavaが古すぎて様々な点で時代遅れにすぎない
もちろんRustはもっとその先へダングリングポインタ排除とGC排除を両立した点にある
Rustを含めていまどきの言語がnull安全なのは常識
むしろC++やJavaが古すぎて様々な点で時代遅れにすぎない
もちろんRustはもっとその先へダングリングポインタ排除とGC排除を両立した点にある
393デフォルトの名無しさん
2022/01/03(月) 22:09:21.15ID:DUDgVZbY このように攻撃性と倒錯を丸出しを両立してしまうと初心者っぽさが出てとても引っ掛かりやすい
どこで覚えたのかNull安全からダングリングポインタという関連性がない事を言い出す。
ゴミくずが降り積もっていく・・・
どこで覚えたのかNull安全からダングリングポインタという関連性がない事を言い出す。
ゴミくずが降り積もっていく・・・
394デフォルトの名無しさん
2022/01/03(月) 22:13:14.24ID:WCyHxUxt >>391
一般的にメモリ関係諸問題のうちメモリリークのみはGC利用でしか解消と判明している
しかし一方でRustではメモリリークを起こすのも意図的にしか起こせない
Rustには所有権の概念があるため特別に複数の所有権を認める特別な参照を
自分で明示的に使用した上でさらに循環参照を生じさせた時のみメモリリークが生じうる
もちろんそのような場面でも通常は弱参照を併用するためメモリリークは起きない
一般的にメモリ関係諸問題のうちメモリリークのみはGC利用でしか解消と判明している
しかし一方でRustではメモリリークを起こすのも意図的にしか起こせない
Rustには所有権の概念があるため特別に複数の所有権を認める特別な参照を
自分で明示的に使用した上でさらに循環参照を生じさせた時のみメモリリークが生じうる
もちろんそのような場面でも通常は弱参照を併用するためメモリリークは起きない
395デフォルトの名無しさん
2022/01/03(月) 22:14:15.40ID:/9oDM4ll396デフォルトの名無しさん
2022/01/03(月) 22:17:11.19ID:nLr3i6Wg nullで落としてるようなバカがnull安全な言語使っても同じく死亡するコード作るだけにしか思えんがな。
あれで救えるコードなんてほとんどないと思うが。
あれで救えるコードなんてほとんどないと思うが。
397デフォルトの名無しさん
2022/01/03(月) 22:35:34.97ID:pC8I0HuA もっとその先へ!草
上のOS記事の作者はリークというかフラグメンテーションの発生だと推測してるが絶対読んでないね。
「意図的にしか起こせない」はい嘘
上の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安全なる言葉の存在意義がある
そうでない普通の言語にとってnull安全は当たり前でありそれを意識することすらない
欠陥言語の存在に対してのみnull安全なる言葉の存在意義がある
400デフォルトの名無しさん
2022/01/03(月) 22:56:23.92ID:pwAwOJBp401デフォルトの名無しさん
2022/01/03(月) 23:21:21.46ID:T+WwhkSI null安全はマジで当たり前すぎてメリットでもなんでもないから
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のうれしいポイントかと
加えて引数や戻り値の所有権が分かるのもRustのうれしいポイントかと
404デフォルトの名無しさん
2022/01/03(月) 23:28:42.03ID:r29FUtSQ fool proofの話をすると Option<T> でも闇雲に unwrap はできるので考えなしのプログラムだとクラッシュする点は変わらない
SEGVじゃなくpanicになるとか、落ちる可能性のある箇所が明示される点でnullよりはマシだが
SEGVじゃなくpanicになるとか、落ちる可能性のある箇所が明示される点でnullよりはマシだが
405デフォルトの名無しさん
2022/01/03(月) 23:34:21.19ID:T+WwhkSI ほんま、そういうことやな
null安全で助かるケースなんてそもそもわずかしかないんだ
unwrapだとかゼロ除算だとかいろんなロジックミスで結局は落ちる
borrow checkerのおかげでデータ競合が起きない、とからへんが重要なメリットと思う
null安全で助かるケースなんてそもそもわずかしかないんだ
unwrapだとかゼロ除算だとかいろんなロジックミスで結局は落ちる
borrow checkerのおかげでデータ競合が起きない、とからへんが重要なメリットと思う
406デフォルトの名無しさん
2022/01/03(月) 23:35:17.83ID:QWHqEk/O いやいやww
407デフォルトの名無しさん
2022/01/04(火) 00:27:33.52ID:bkmFGqSu408デフォルトの名無しさん
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の攻撃性は以上ですので近づかないでください
本協会では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:gSVIkeEa415デフォルトの名無しさん
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を使ってもバグはなくならない
でもコンパイラのチェックでなくせる類のバグならなくしたいよね
たとえ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などで即問題箇所が分かるようになっているのはかなり嬉しい
あらゆる問題が起きないかというとそうではない(というかそんなプログラミング言語存在しないと思う)けど
大部分のコードのメモリ安全性がコンパイル時に保証されるのはかなり大きなメリットだと思う
例えば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/bub5S426デフォルトの名無しさん
2022/01/04(火) 20:06:56.90ID:KYGdyDbS427デフォルトの名無しさん
2022/01/04(火) 20:50:34.04ID:/2oFrrnl428デフォルトの名無しさん
2022/01/04(火) 20:53:09.33ID:hAXWFplk Google&MS「バグの70%はC/C++。Rustにする」
https://medaka.5ch.net/test/read.cgi/prog/1619943288/
https://medaka.5ch.net/test/read.cgi/prog/1619943288/
429デフォルトの名無しさん
2022/01/04(火) 21:18:13.95ID:eYWJvdmr C++でうまくかけないヤツとか構造化の仕方がヘタクソなだけだろ
430デフォルトの名無しさん
2022/01/04(火) 21:26:13.33ID:XgtuTErn431デフォルトの名無しさん
2022/01/04(火) 22:20:27.31ID:3laoj6Oq432デフォルトの名無しさん
2022/01/04(火) 22:35:39.57ID:e2VKtfmk >>428
で、バグが減ったか?まるで変わらんやろ。馬鹿馬鹿しい。
で、バグが減ったか?まるで変わらんやろ。馬鹿馬鹿しい。
433デフォルトの名無しさん
2022/01/04(火) 22:39:34.49ID:NZNEJALT C++の存在意義がゼロになったわけではない
C++で作られた過去の莫大なライブラリは今後も併用される
C++しか使えない過去のプログラマーの活用のために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に対応し始めた
国産RTOSだとKMCのToppersベースのOS、SOLIDが最近Rustに対応し始めた
436デフォルトの名無しさん
2022/01/04(火) 23:30:25.45ID:C7kM4kmV437デフォルトの名無しさん
2022/01/05(水) 00:36:25.86ID:PXsSrjEd >>436
そんなには起きないけど1,2機種に1個ぐらいは難問と言われるような不具合があるかな?
共通してるのは再現性がとても低いかつランダムな領域のメモリを破壊する
でもいざ何週間もかけて仕込み入れて再現されて原因特定するとしょーもない不具合だったりする
それこそRustじゃコンパイル通らないような初歩的な原因だったこともある
静的解析ツールは回してるけどどうしても漏れることはある
そんなには起きないけど1,2機種に1個ぐらいは難問と言われるような不具合があるかな?
共通してるのは再現性がとても低いかつランダムな領域のメモリを破壊する
でもいざ何週間もかけて仕込み入れて再現されて原因特定するとしょーもない不具合だったりする
それこそRustじゃコンパイル通らないような初歩的な原因だったこともある
静的解析ツールは回してるけどどうしても漏れることはある
438デフォルトの名無しさん
2022/01/05(水) 07:47:37.79ID:IIKhgKt4 嘘くせえwメモリ破壊を理由にRustに期待とか意味わからん
MMUがちゃんと設定できてないか、スタック不足でリークしてるだけとか、あるいはスレッド競合に見えるし
比べてる対象がOS前提のRustと、そんなもの無い開発を比べてないか
MMUがちゃんと設定できてないか、スタック不足でリークしてるだけとか、あるいはスレッド競合に見えるし
比べてる対象がOS前提のRustと、そんなもの無い開発を比べてないか
439デフォルトの名無しさん
2022/01/05(水) 07:48:29.43ID:jCayWhDI >>436
同意だな
Cなんて学習の過程でなんぼでもメモリ壊すもんだから
逆説的だけどメモリなんて壊し慣れてるんだよ
どうやって壊してるのかどうやったから壊れたのか
だからだんだん目新しい壊し方が無くなってきてスリルは無くなる
同意だな
Cなんて学習の過程でなんぼでもメモリ壊すもんだから
逆説的だけどメモリなんて壊し慣れてるんだよ
どうやって壊してるのかどうやったから壊れたのか
だからだんだん目新しい壊し方が無くなってきてスリルは無くなる
440デフォルトの名無しさん
2022/01/05(水) 10:11:35.03ID:RHFS+zMh バカだろおまえ
441デフォルトの名無しさん
2022/01/05(水) 12:14:32.80ID:R1aBhW/Q このスレがム板内で一番勢いあるのが笑える
C++やRustの本スレより勢いあるやん
C++やRustの本スレより勢いあるやん
442デフォルトの名無しさん
2022/01/05(水) 17:00:20.32ID:D7gzVahT443デフォルトの名無しさん
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のコンパイラって不等号の向き間違ってますよとか教えてくれるの?
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使った方が幸せになりそうです
逆に必要な人は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使ってなくても普通に起こるので、
プログラマがちゃんと理解して考えて制御しなければいけない
ダングリングポインタ、データ競合、未初期化の変数を読んでしまう、とかみたいなのは起きない
こういうのはC/C++だと巨大プロジェクトではどうしても抜け漏れが出るし、よく脆弱性になるからこれが保証されるだけでもめちゃくちゃ心強い
そんで例外っていう危うい仕組みはなくても、他にも気をつけなきゃいけない事はいくらでもある
例えば内部部割り込み、デッドロック、競合状態、メモリリークとかはunsafe使ってなくても普通に起こるので、
プログラマがちゃんと理解して考えて制御しなければいけない
462デフォルトの名無しさん
2022/01/07(金) 08:07:46.87ID:qbYUQ+0I463デフォルトの名無しさん
2022/01/07(金) 11:19:37.80ID:OPgAeAPs >>462
445 = 447だし、何いってるかわかんない
445 = 447だし、何いってるかわかんない
464デフォルトの名無しさん
2022/01/07(金) 11:31:20.72ID:HBPsUOSr465デフォルトの名無しさん
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:syLxl2NY469デフォルトの名無しさん
2022/01/07(金) 13:12:58.77ID:qCXwEiOj >>467
「一般的な例外処理」の定義をしないで語られても
「一般的な例外処理」の定義をしないで語られても
470デフォルトの名無しさん
2022/01/07(金) 13:46:09.88ID:OPgAeAPs471デフォルトの名無しさん
2022/01/07(金) 13:54:43.45ID:pFd15XiZ 再帰から一気にジャンプ出来る例外案件
472デフォルトの名無しさん
2022/01/07(金) 14:57:02.30ID:0CT3Il9G Rustの勉強も始めたが
驚き感動することが多くてはまりそうだ
try/throw/catchがないのに同じことが出来てる仕組みに感動した
?一文字でエラーを上位へ委ねることができたり
単なるenumに過ぎないはずのResult型が巧妙に使えるヤツだったり
驚き感動することが多くてはまりそうだ
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:oWk93qwk476デフォルトの名無しさん
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
この意味での例外
確かに言語でサポートするなら大域脱出になるか
>>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の定義はめちゃくちゃ曖昧だな
回復不能なエラーのことだったり、業務エラーに対するシステムエラーのことだったり
さらには設計で想定されてない問題と言いつつ
ユーザーの入力間違いや他システムと疎通が取れない場合が含まれてたり
そのwikiの定義はめちゃくちゃ曖昧だな
回復不能なエラーのことだったり、業務エラーに対するシステムエラーのことだったり
さらには設計で想定されてない問題と言いつつ
ユーザーの入力間違いや他システムと疎通が取れない場合が含まれてたり
478デフォルトの名無しさん
2022/01/07(金) 17:20:41.93ID:TtYC21gO >>477
なら例外(処理)の明確な定義ってなんだ?
なら例外(処理)の明確な定義ってなんだ?
479デフォルトの名無しさん
2022/01/07(金) 17:49:08.57ID:CgdU4kfS480デフォルトの名無しさん
2022/01/07(金) 17:57:58.23ID:htF+iGlC >>478
まぁ、ここはプログラミング言語を取り扱っているので、各言語ごとの例外機構のことなんじゃないかな
まぁ、ここはプログラミング言語を取り扱っているので、各言語ごとの例外機構のことなんじゃないかな
481デフォルトの名無しさん
2022/01/07(金) 17:58:11.94ID:0CT3Il9G GoやRustなどの言語には例外処理がないと一般的に言われているけど
これはtry/throw/catchといった特別な枠組みが存在しないことを意味してる
これはtry/throw/catchといった特別な枠組みが存在しないことを意味してる
482デフォルトの名無しさん
2022/01/07(金) 18:14:31.53ID:BlSvqzvB483デフォルトの名無しさん
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:rW64eTg1486デフォルトの名無しさん
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するような言語は論外。
例外すら出さずにpanicするような言語は論外。
491デフォルトの名無しさん
2022/01/07(金) 19:44:23.16ID:9qeGIYdY492デフォルトの名無しさん
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はよく使うがな
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のように無くしてしまえばいいのかもしれない
各関数呼び出し毎にRAIIによるデストラクタ処理が入る
だから例外で一気にスタックを巻き上げるだけにはならない
結局try-catch / throwという特殊な枠組みはRustのように無くしてしまえばいいのかもしれない
501デフォルトの名無しさん
2022/01/08(土) 15:35:19.92ID:tKnKvPsu502デフォルトの名無しさん
2022/01/08(土) 16:01:51.30ID:L9/OhHd6503デフォルトの名無しさん
2022/01/08(土) 17:09:19.03ID:MlahXNcM 従来の例外は皆がwikipediaの定義を批判しているように何でもかんでも曖昧に整理されずに詰め込みすぎている
そして各言語でのtry/catchの使われ方も同様
だからRustでは分離したのではないか?
例えば相手の状態や相手からのデータや入出力次第で起こりうる各種エラーは
こちらのプログラムに関係なく起き得ることだから普通に関数の返り値によるエラー処理でよい
一方でそれらとは全く別にプログラムが原因で起きるあってはならない論理的な間違いや
もしくはリソース不足などでの続行不可能などの事象はエラー処理ではないためパニック処理として分離した
したがって曖昧な存在である例外というものは消え去った
そして各言語でのtry/catchの使われ方も同様
だからRustでは分離したのではないか?
例えば相手の状態や相手からのデータや入出力次第で起こりうる各種エラーは
こちらのプログラムに関係なく起き得ることだから普通に関数の返り値によるエラー処理でよい
一方でそれらとは全く別にプログラムが原因で起きるあってはならない論理的な間違いや
もしくはリソース不足などでの続行不可能などの事象はエラー処理ではないためパニック処理として分離した
したがって曖昧な存在である例外というものは消え去った
504デフォルトの名無しさん
2022/01/08(土) 18:42:49.44ID:Q0+pmoTx なるほど
Goのpanic/recoverは例外機構なのか、っていうとそうじゃない感じするしややこしいなあ
Goのpanic/recoverは例外機構なのか、っていうとそうじゃない感じするしややこしいなあ
505デフォルトの名無しさん
2022/01/08(土) 18:50:40.59ID:Q9qOpCpC 461 == 467 == 503
506デフォルトの名無しさん
2022/01/08(土) 18:52:09.09ID:iq37Yx1h507デフォルトの名無しさん
2022/01/08(土) 19:06:30.46ID:uo/Nlf0C >>503
カーネルコードではallocできなくても継続不可能とはみなさないように
何を続行不可能な事象とするかはアプリケーションによって変わる
つまりその分け方は業務エラー/システムエラーや回復可能エラー/回復不能エラーなど従来の分け方と同じ
カーネルコードではallocできなくても継続不可能とはみなさないように
何を続行不可能な事象とするかはアプリケーションによって変わる
つまりその分け方は業務エラー/システムエラーや回復可能エラー/回復不能エラーなど従来の分け方と同じ
508デフォルトの名無しさん
2022/01/08(土) 19:52:28.22ID:1etCU7+u >>505
ちがうよ
ちがうよ
509デフォルトの名無しさん
2022/01/08(土) 21:04:20.72ID:MlahXNcM510デフォルトの名無しさん
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+b5K514デフォルトの名無しさん
2022/01/09(日) 00:21:57.46ID:fLRbfEkO Rust坊の植民地になった。ここまでC/C++に対する優位性の証明ゼロ、分裂したRust坊を収容するスレ
あんたらが本当に必要なのはRust初心者スレだ。親の仇のようにC/C++に攻撃性を向けるのはもうやめたら?
あんたらが本当に必要なのは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:E6fr7wut519デフォルトの名無しさん
2022/01/09(日) 10:02:26.10ID:QVmVQA75 >>518
> 日本がIT後進国なのを痛感する
例外の話だけじゃなくてこれはいろんなとこににじみ出てるよな
いろんなwikipediaの記事も日本語版って何かあいまいだったり
説明が簡潔じゃなかったりして驚く
まぁこれに関しては国のIT進歩度というよりは
あっちの人のほうが単に理論的で
理論的に書くのが好きで
理論的に書いてないのを許さない文化がるんだと思う
> 日本がIT後進国なのを痛感する
例外の話だけじゃなくてこれはいろんなとこににじみ出てるよな
いろんなwikipediaの記事も日本語版って何かあいまいだったり
説明が簡潔じゃなかったりして驚く
まぁこれに関しては国のIT進歩度というよりは
あっちの人のほうが単に理論的で
理論的に書くのが好きで
理論的に書いてないのを許さない文化がるんだと思う
520デフォルトの名無しさん
2022/01/09(日) 10:37:31.41ID:oMGs2plE >>518-519
そういう具体性の欠片もないレスでドヤ顔されても… w
そういう具体性の欠片もないレスでドヤ顔されても… w
521デフォルトの名無しさん
2022/01/09(日) 10:38:49.37ID:0wOzwgXF >>519
それが逆に数学分野や工業化学分野だと、日本の方がはるかに端正で正確な記述だと思っているのです…
それが逆に数学分野や工業化学分野だと、日本の方がはるかに端正で正確な記述だと思っているのです…
522デフォルトの名無しさん
2022/01/09(日) 11:07:34.53ID:QVmVQA75523デフォルトの名無しさん
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.
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の二種類に分けて扱っている
(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:uOSYnK8a537デフォルトの名無しさん
2022/01/10(月) 00:23:41.85ID:KrhDNAF9538デフォルトの名無しさん
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となる
プログラム自体に論理的な間違いがあるわけではない
ただ数値の溢れというリソース不足を起こしただけにすぎない
例えば以下のフィボナッチ数列を表示するプログラム
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超初心者たち…
「論理的間違い」とか何を言ってるのかサッパリ分からんな、こんすれの隔離Rust超初心者たち…
540デフォルトの名無しさん
2022/01/10(月) 01:19:02.91ID:yjEJqFVX541デフォルトの名無しさん
2022/01/10(月) 01:56:06.89ID:jIBPGNfV 数値型の範囲も論理的に考慮してくださいよ
542デフォルトの名無しさん
2022/01/10(月) 02:26:23.03ID:yjEJqFVX543デフォルトの名無しさん
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だのの枯渇、いわゆる通常の「リソース不足」と違って、事前に発生が完全に予見できるのに?
メモリだのファイルディスクリプタだの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;
}
}
例えば以下のフィボナッチ数列を表示するプログラム
論理的な誤りがあると主張するならば具体的にどこをどう直しますか?
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:gmQTKrMe548デフォルトの名無しさん
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
しれっと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:pS98ddBp550デフォルトの名無しさん
2022/01/10(月) 08:57:32.63ID:pS98ddBp551デフォルトの名無しさん
2022/01/10(月) 09:03:32.42ID:yjEJqFVX552デフォルトの名無しさん
2022/01/10(月) 09:03:49.79ID:cQg1KnlR >>549
> 範囲を規定できる用途ばかりではないだろう
規定できる用途の方がはるかに多い
て言うかまともなプログラムなら規定してないなんてことはまずない
テストできないし
> そのケースは出来る限り多くのフィボナッチ数を出力したいのだから範囲を規定することがナンセンス
そんなケース滅多にないだろw
> 範囲を規定できる用途ばかりではないだろう
規定できる用途の方がはるかに多い
て言うかまともなプログラムなら規定してないなんてことはまずない
テストできないし
> そのケースは出来る限り多くのフィボナッチ数を出力したいのだから範囲を規定することがナンセンス
そんなケース滅多にないだろw
553デフォルトの名無しさん
2022/01/10(月) 09:07:37.24ID:G9ZH73mK >>551
「チェック付き演算に置き換えて回避可能」は「本質的にリカバリできない」に含まれるのか?
ていうかそもそもその区分は何のために存在するんだ?
Rustが例外を採用しない理由として言語開発者たちがそのように主張しているのか?
それとも君の感想?
「チェック付き演算に置き換えて回避可能」は「本質的にリカバリできない」に含まれるのか?
ていうかそもそもその区分は何のために存在するんだ?
Rustが例外を採用しない理由として言語開発者たちがそのように主張しているのか?
それとも君の感想?
554デフォルトの名無しさん
2022/01/10(月) 09:20:25.60ID:yjEJqFVX >>553
前者はpanicを回避可能
それでも計算続行不可能という点では後者の本質的にリカバリできないに該当なのかな
だからそれらは両立していると思うのだがどうだろうか?
あと「例外を採用しない理由」をなぜここで突然言及するのか疑問だが
もし以下の話について言っているのならば
>>532
>> Rustがtry-catchの例外機構を持たない理由は非常に単純で
>> (A) 本質的にリカバリできることは通常のエラー処理だけで十分に対処可
>> (B) 本質的にリカバリできないことはpanic
チェック付き演算を使用した場合は前者になるし
使用せずにオーバーフローすれば後者になるのだから
そこに何か明白でない論点はないと思うのだがどうだろうか?
前者は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:pS98ddBp557デフォルトの名無しさん
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
リカバリできないかどうかは状況に応じて開発者が主観的に判断するものなので
「本質的にリカバリできない」かどうかを考えるのは無意味
エラーハンドリングの基本
もちろん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:EipmFK9a561デフォルトの名無しさん
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にはそのような無駄なものがないわけだ
だから最近の言語RustやGoにはそのような無駄なものがないわけだ
565デフォルトの名無しさん
2022/01/11(火) 15:51:54.57ID:t1MM9BO+ Rustが例外機構を無くとも同等のことを快適に記述できる要因は二つ
HaskellのEitherモナドを値付きenumとして表現したResult<T,E>を関数の戻り型としたこと
そしてResultがErrの時に?オペレーターにより見えない即時returnをするショートカットを用意したこと
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の場合は例外クラスの階層の問題とかその他の要素も相まって糞味噌扱い
集約エラーハンドラに任せたいとエラーのほうが圧倒的多数だから
呼び出し階層全てにどの例外が発生しうるかを書いていかないといけない検査例外が嫌われるのは自然なこと
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終了はスレッド単位やタスク単位も可能なのでサボりサーバー等も実装可
こういう理解であってますか?
「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>>にしちゃうと何のエラーが発生するのか分からなくなってしまう
面倒臭さと堅牢さのトレードオフ
面倒臭いからといって全部Result<T, Box<dyn Error>>にしちゃうと何のエラーが発生するのか分からなくなってしまう
面倒臭さと堅牢さのトレードオフ
573デフォルトの名無しさん
2022/01/11(火) 23:58:57.17ID:2061HgWk574デフォルトの名無しさん
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で発生するエラーは無視される)
エラーが発生しうる処理はデストラクタが呼ばれる前にやるべきかな
RustでもBufWriterなんかがスコープアウトでdrop呼び出される前に明示的にflush必要だったりする (drop内のcloseで発生するエラーは無視される)
576デフォルトの名無しさん
2022/01/12(水) 02:19:37.87ID:Fd1MyF0L577デフォルトの名無しさん
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/
デストラクタでエラーはまずいけどコンストラクタで避ける理由は無かろう。
[迷信] コンストラクタから例外を送出してはならない
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だと特に何も考えなくても良い?
safeだと特に何も考えなくても良い?
582デフォルトの名無しさん
2022/01/12(水) 14:16:26.71ID:gLPtO7rz C++は何種類もコンストラクタがあって大変だが
Rustはコンストラクタが無いため問題は発生しない
Rustにも自動で呼ばれるデストラクタはあるが
その前に捕獲すべきエラーが発生しうるものを自分で処理しておくので無問題
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:CbaowxsH587デフォルトの名無しさん
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()を呼べるなら個別にハンドリングが必要なエラーは発生しないと分かるのが重要
デストラクタと違ってコーディング規約的なもの
new Hoge()を呼べるなら個別にハンドリングが必要なエラーは発生しないと分かるのが重要
デストラクタと違ってコーディング規約的なもの
590デフォルトの名無しさん
2022/01/13(木) 00:32:37.82ID:RultHF/h >>589
コーディング規約(w
コンストラクタ内で、動的配列のクラスやテンプレートを使ってると、例外が発生する
可能性は常にある。 他の言語は知らんが、C++の場合、コンストラクタ内で例外が
発生すると、デストラクタは呼ばれない。
コーディング規約(w
コンストラクタ内で、動的配列のクラスやテンプレートを使ってると、例外が発生する
可能性は常にある。 他の言語は知らんが、C++の場合、コンストラクタ内で例外が
発生すると、デストラクタは呼ばれない。
591デフォルトの名無しさん
2022/01/13(木) 00:41:21.53ID:RultHF/h 例えば、ファイルハンドルをラップしたファイルクラスがあったとして、引数なしの
デフォルトコンストラクタと、引数でオープン済のファイルハンドルを渡すコンスト
ラクタを定義したとして、後者のコンストラクタが無効なファイルハンドルを引数
として呼ばれたら、例外をスローするように実装するだろ?
後者のコンストラクタは、dup()で複製したファイルハンドル等を扱う際に必要。
デフォルトコンストラクタと、引数でオープン済のファイルハンドルを渡すコンスト
ラクタを定義したとして、後者のコンストラクタが無効なファイルハンドルを引数
として呼ばれたら、例外をスローするように実装するだろ?
後者のコンストラクタは、dup()で複製したファイルハンドル等を扱う際に必要。
592デフォルトの名無しさん
2022/01/13(木) 01:53:08.91ID:hGSK4csp >>591
ファイルハンドルが無効な場合をエラーとして処理すべきならコンストラクタを直接使わせずファクトリー経由にする
panic相当の例外として処理すべきならコンストラクタ使って例外スローでかわまない
ファイルハンドルが無効な場合をエラーとして処理すべきならコンストラクタを直接使わせずファクトリー経由にする
panic相当の例外として処理すべきならコンストラクタ使って例外スローでかわまない
593デフォルトの名無しさん
2022/01/13(木) 05:45:30.92ID:aa54J19o >>587
それとコンストラクタで例外発生させないことは関係なくね?
それとコンストラクタで例外発生させないことは関係なくね?
594デフォルトの名無しさん
2022/01/13(木) 07:16:55.50ID:QuitFgmw コンストラクタも例外も存在しないRustでは問題自体が生じない
>>591のケースでもRustでは後者のビルダー関数がResultを返すだけで済む
>>591のケースでもRustでは後者のビルダー関数がResultを返すだけで済む
595デフォルトの名無しさん
2022/01/13(木) 08:12:03.99ID:RultHF/h Rustって、名前の通り錆付いてるようだな。 例外(Exception)がないって、要は
Panicって名前とtry〜catchと互換性のない俺仕様の記述を発明しただけじゃん。
ttps://news.ycombinator.com/item?id=11370841
ttps://www.reddit.com/r/rust/comments/bzaxf2/why_rust_doesnt_have_exception_handling/
ttp://joeduffyblog.com/2016/02/07/the-error-model/
返す型を限定するのは、C++でもコーディング規約で縛れば済むだけの話だし。
結局、Nullポインタ程度で騒いでいるのは、マニュアルフォーカスのカメラでピンボケ
するとか、マニュアルミッションの車でクラッチ繋ぐのミスると、エンストするって
言ってるのと変わらん気がするナァ。
Panicって名前とtry〜catchと互換性のない俺仕様の記述を発明しただけじゃん。
ttps://news.ycombinator.com/item?id=11370841
ttps://www.reddit.com/r/rust/comments/bzaxf2/why_rust_doesnt_have_exception_handling/
ttp://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の例外機構はそもそも必要のないものだったのだ
panicと例外は全く異なる
議論に立ち入りたいならばせめて最小限の理解をしよう
完成した通常のプログラムにおいてpanicが発生するのはメモリ不足の時のみ
次に、例外はそもそも必要ないことに気付こう
エラーが発生する可能性があるならばエラーを返せばよいだけだ
これでプログラミングにおいて困ることはない
try〜catchの例外機構はそもそも必要のないものだったのだ
598デフォルトの名無しさん
2022/01/13(木) 12:20:53.94ID:VLvCS3li599デフォルトの名無しさん
2022/01/13(木) 12:34:07.73ID:k/BdCeDW600デフォルトの名無しさん
2022/01/13(木) 13:04:20.54ID:nB26Onrd その点も含めて、少なくとも >597 の「全く異なる」は嘘だね。
後段の「エラーが発生する可能性があるならばエラーを返せばよいだけだ」についても、
じゃぁ何で panic があるの?ってなるし、どういうわけか例外憎しで適当なこと言いたいだけみたい。
後段の「エラーが発生する可能性があるならばエラーを返せばよいだけだ」についても、
じゃぁ何で panic があるの?ってなるし、どういうわけか例外憎しで適当なこと言いたいだけみたい。
601デフォルトの名無しさん
2022/01/13(木) 13:23:05.77ID:k/BdCeDW rustのpanicとかエラーハンドリングの考え方はgolangの影響大きい気はする
Result型を使うか多値でエラーを返すかの違いはあるが、panicという名前と動作、戻り値との使い分けは同じ
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であり、これで実際に動いている。
つまり、単なるエラー処理のための例外機構は必要ないものであることがわかる。
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:oax73caB606デフォルトの名無しさん
2022/01/13(木) 15:50:06.61ID:E5YlFTVp >>604
> プログラミングにおいて、エラー処理のためのtry catch例外処理は本来不要なものである。
> エラーは関数の戻り値で返せばよい。
あらゆる関数/メソッド呼び出しのたびにエラーチェックをするのが煩雑だから、try-catchが生み出されたんだと思う。
例えば、データベースアクセスが発生する三つの関数を呼び出すとき、
try {
foo();
bar();
baz();
commit();
} catch () {
rollback();
}
みたいな。
続行不能なエラーが発生したが、本流に戻る必要があるときは便利。
> プログラミングにおいて、エラー処理のための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で扱ってしまうのか?
それは関数の仕様設計ミスである。
ちゃんとエラーを返せば、単なるエラー処理のための例外処理は不要となる。
話がごっちゃになっているのは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/BdCeDW610デフォルトの名無しさん
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といった例外処理がなくてもプログラミングで困ることはない。
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;
}
> べき論の話で言ったら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:E5YlFTVp613デフォルトの名無しさん
2022/01/13(木) 16:36:22.32ID:E5YlFTVp あ、ひょっとして「?;」ってエラーが発生したらそこでsub()を抜けるってこと?
まあ、だとしても、C++でもエラーチェックベースで実装しろということにはならないけどね
まあ、だとしても、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));だが本筋でないので略。
その場合でも、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の常識が多言語でもベストプラクティスとはならないと思うよ
> ?オペレータは、ResultがErr(err)の時にreturn Err(err);する。
なるほど、勉強になった
ただ、前述したとおり、書き捨てのプログラムでない限りエラーが発生したときには詳細なエラーログを出力する必要もあるし、Rustの常識が多言語でもベストプラクティスとはならないと思うよ
617デフォルトの名無しさん
2022/01/13(木) 17:09:11.61ID:k/BdCeDW618デフォルトの名無しさん
2022/01/13(木) 17:24:20.34ID:2BXAobev >>614
スタックトレースまで必要になるならば、それはエラーではなくプログラムのバグだろう。
その区別を付けたほうが好ましい。
そして、エラーではなくバグならば前述したようにpanicの対象なのでpanicさせることもできる。
>>616
Resultの正常値もエラー値も任意の情報を持たせられるので必要な時に必要な処理をすれば困ることはない。
>>617
そのGoogleのC++スタイルガイドに「C++の例外は使いません。」と明記されているのか。
これはGoogleが正しい。
もちろん、Googleが作ったGo言語に例外はない。
プログラミングにおいてtry catchの例外機構は不要である。
スタックトレースまで必要になるならば、それはエラーではなくプログラムのバグだろう。
その区別を付けたほうが好ましい。
そして、エラーではなくバグならば前述したように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例外方式の致命的な欠点
どこで誰が例外を返すのかわからなかったり
多段呼び出しの途中の関数では例外が通過するのかどうか全てを追わないとわからなかったり
プログラミングにおいて例外は悪だと思う
グーグルはちゃんとわかっている
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 のコードにエラーログ出力を追加しようとしたらひと苦労です
> スタックトレースまで必要になるならば、それはエラーではなくプログラムのバグだろう。
エラーが発生した場所がどこであるのかが例外オブジェクトに含まれているなら、スタックトレースが不要な場合もあるかもしれませんが、あればどういう呼び出しのときにエラーが発生したのかわかるので便利です
> その区別を付けたほうが好ましい。
大抵の場合は例外の種別や例外オブジェクトの継承ツリーで区別をつけてると思います
LogicExeptionを継承する例外ととRuntimeExceptionを継承する例外とか
> >>617
> そのGoogleのC++スタイルガイドに「C++の例外は使いません。」と明記されているのか。
> これはGoogleが正しい。
Googleがそうやっているだけで、それがベストプラクティスとは限りません
>>611 のコードにエラーログ出力を追加しようとしたらひと苦労です
621デフォルトの名無しさん
2022/01/13(木) 18:20:01.16ID:YmYunxX5 Googleのスタイルガイドでは、C++の例外は雑に扱えないぐらいには面倒だしメリットがそこまで大きくもない、って書いてるぐらいで、例外は不要だとは断じてないよね
面倒だからGoogleの巨大なレガシーコードには今更例外を導入できないし、それが依存する可能性のあるプロジェクトにも例外は使わせたくない、って感じでしょ
面倒だからGoogleの巨大なレガシーコードには今更例外を導入できないし、それが依存する可能性のあるプロジェクトにも例外は使わせたくない、って感じでしょ
622デフォルトの名無しさん
2022/01/13(木) 18:27:00.76ID:2BXAobev623デフォルトの名無しさん
2022/01/13(木) 18:31:49.09ID:E5YlFTVp >>622
話がずれていってるけど、大本の話題はこれだからね
> プログラミングにおいて、エラー処理のためのtry catch例外処理は本来不要なものである。
> エラーは関数の戻り値で返せばよい。
あと、軽く調べたが、googleはSTLもboostも基本使えないみたいよ
もちろん、例外をthrowするサードパーティ製ライブラリも使えない
修行僧みたいw
話がずれていってるけど、大本の話題はこれだからね
> プログラミングにおいて、エラー処理のための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++ のほとんどのシナリオでは、論理エラーとランタイム エラーの両方を報告および処理する方法として、例外を使用することが推奨されます。 特に、エラーを検出する関数と、エラーを処理するコンテキストを持つ関数の間に複数の関数呼び出しがスタックに含まれている可能性がある場合に当てはまるとします。 例外は、エラーを検出して情報を呼び出し履歴に渡すコードに関する、正しく定義された正式な方法を提供します。
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:2BXAobev626デフォルトの名無しさん
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位 ← 思ったより検討してた
> プログラムのバグとエラー(=入出力や相手次第で発生)の両方を、ごっちゃに同じ例外で扱ってる自覚はあるわけだ。
そもそも、アプリケーションプログラマバグによる例外の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しなくて済むのかしらん?
エラーを処理しなきゃいけないんだったら例外と大して変わらん気がする。
(?演算子でエラー移譲を受けた)呼び出し元は、エラーを無視しても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を返せば、自分でエラー処理をせずともエラー表示される。
単なる通信エラーにすぎなくてもtry catchの例外で受ける例はあるよね。
>>606のデータベースアクセスの例だと、DBサーバーとの通信時エラーが起きるとfoo()は例外を投げることになる。
しかも例外を投げるのはfoo()自身ではなく、そこから呼ぶDBサーバ通信部分だったり、そこから呼ぶ汎用通信ライブラリだったり、誰が例外を投げるかわからない。
>>627
今書いている関数で例外が発生するのかどうか、奥底まで追わないとはっきりしないデメリットが例外にはある。
?演算子を使えば、下からエラーが来ていて上へエラー処理を移譲していることが明確になる。
あと、質問に対する答えは、main()関数までもがさぼってResultを返せば、自分でエラー処理をせずともエラー表示される。
630デフォルトの名無しさん
2022/01/13(木) 20:16:47.27ID:Pln9PLvq631デフォルトの名無しさん
2022/01/13(木) 21:01:12.03ID:QuitFgmw >>627
エラー処理はそんな大変なことではなく例えば
if let Ok(value) = foo() {
bar(value);
}
と正常値の時だけ処理したりも出来る
正常値を得るにはif letやmatchやその他にResult型のメソッドなどを必ず使わないと正常値を取り出せないので
Rustではエラー値なのにチェック忘れで突き進むバグが生じないのも利点
エラー処理はそんな大変なことではなく例えば
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/z3m3634デフォルトの名無しさん
2022/01/13(木) 22:14:53.71ID:7TJ/z3m3635デフォルトの名無しさん
2022/01/13(木) 22:26:16.24ID:+PFReeTS >>570
>大半のアプリケーションでは個別にハンドリングせず
>集約エラーハンドラに任せたいとエラーのほうが圧倒的多数だから
どこでなぜ起きたかわからないエラーをキャッチしてもなぁ。
erlangのlet it crashのようにエラーの種類は考慮しないってんならわからんでもないけど。
>大半のアプリケーションでは個別にハンドリングせず
>集約エラーハンドラに任せたいとエラーのほうが圧倒的多数だから
どこでなぜ起きたかわからないエラーをキャッチしてもなぁ。
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),
};
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は絶対発生しないシステムなの?
bad_allocは絶対発生しないシステムなの?
638デフォルトの名無しさん
2022/01/13(木) 22:56:39.62ID:FqgOTQou >>635
集約エラーハンドラは汎用のエラー画面表示やログ出力のためだぞ
例外の中身を見ればどこでなぜ起きたかはわかるがユーザーには対処できないものを扱う
Erlangは軽量プロセス単位のリトライなので全然違う
集約エラーハンドラは汎用のエラー画面表示やログ出力のためだぞ
例外の中身を見ればどこでなぜ起きたかはわかるがユーザーには対処できないものを扱う
Erlangは軽量プロセス単位のリトライなので全然違う
639デフォルトの名無しさん
2022/01/13(木) 23:29:52.77ID:+PFReeTS >集約エラーハンドラは汎用のエラー画面表示やログ出力のためだぞ
例外マンセー軍全員こう思ってる?
参ったw
例外マンセー軍全員こう思ってる?
参った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が出るから気付く
正常系の戻り値がない関数なら戻り値はResult<(),Error>になって、これを無視するとwarningが出るから気付く
643デフォルトの名無しさん
2022/01/14(金) 00:19:25.76ID:fGcmjtxY >>640
まず関数の戻り型はResult<(), Error>となる
()はRustで戻り値なしを意味しタプル0個と覚えれる
次にその関数を普通にfoo();と呼び出すコードを書く
すると「使われていないResult値がある」とコンパイラに警告される
したがってエラー値チェックを忘れていることに気付ける
まず関数の戻り型は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. ...
おー、ほんとだ。いいね。
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:CyyU39UP647デフォルトの名無しさん
2022/01/14(金) 13:55:14.01ID:CyyU39UP Googleのコーディング規約が神だと思ってるみたいだが、発表された当時内容があまりにアレだったので界隈がざわついた記憶がある
組み込み関連は知らんが、それ以外でGoogleのコーディング規約を取り入れてるところはないんじゃないか
組み込み関連は知らんが、それ以外でGoogleのコーディング規約を取り入れてるところはないんじゃないか
648デフォルトの名無しさん
2022/01/14(金) 14:37:16.30ID:B7zHdTDq 参考にしてるのは業務でまともにC++を使ったことがない素人ばかりかもね
649デフォルトの名無しさん
2022/01/14(金) 14:45:16.44ID:Ml4XYYXN >>629
> 今書いている関数で例外が発生するのかどうか、奥底まで追わないとはっきりしないデメリットが例外にはある。
逆にRustだとなんかの理由で奥底の関数がエラーを返すように変更されたらその上の関数全てを変更するってこと?
> 今書いている関数で例外が発生するのかどうか、奥底まで追わないとはっきりしないデメリットが例外にはある。
逆にRustだとなんかの理由で奥底の関数がエラーを返すように変更されたらその上の関数全てを変更するってこと?
650デフォルトの名無しさん
2022/01/14(金) 15:08:09.78ID:CyyU39UP Rust始めたばかりだからまだよくわかってないが、エラー処理周りのこと調べると、まだまだ迷走中な感じだな
少なくとも初手から言語仕様として完璧なエラー処理構造が入ってたわけではないことがわかった
Rust のエラーまわりの変遷
https://qiita.com/legokichi/items/d4819f7d464c0d2ce2b8
少なくとも初手から言語仕様として完璧なエラー処理構造が入ってたわけではないことがわかった
Rust のエラーまわりの変遷
https://qiita.com/legokichi/items/d4819f7d464c0d2ce2b8
651デフォルトの名無しさん
2022/01/14(金) 15:14:13.63ID:fGcmjtxY >>649
まず一般的にどの言語であっても奥底の関数の仕様が変更されたらそれを吸収できるところは変更となる
次にエラーが起きない関数が突然にエラーが起きるようにはならないのでそんな仕様変更は起きない
入出力相手があるものは初めからエラーが起きうることがわかるしメモリ上の操作だけであってもsearchやmatchなど成否が起きうるものも最初からわかっている
まず一般的にどの言語であっても奥底の関数の仕様が変更されたらそれを吸収できるところは変更となる
次にエラーが起きない関数が突然にエラーが起きるようにはならないのでそんな仕様変更は起きない
入出力相手があるものは初めからエラーが起きうることがわかるしメモリ上の操作だけであってもsearchやmatchなど成否が起きうるものも最初からわかっている
652デフォルトの名無しさん
2022/01/14(金) 15:21:48.16ID:/o+2ilkb 「そんな仕様変更は起きない」ということはなく、普通にAPIの設計ミスっててやっぱりエラーになる可能性あった、というのはありうる
その場合Rustならコンパイルエラーで気付くが、例外だとこれまで例外出さなかった関数が急に出すようになるわけで、なかなか厳しいね
その場合Rustならコンパイルエラーで気付くが、例外だとこれまで例外出さなかった関数が急に出すようになるわけで、なかなか厳しいね
653デフォルトの名無しさん
2022/01/14(金) 15:24:49.44ID:Ml4XYYXN >>651
> まず一般的にどの言語であっても奥底の関数の仕様が変更されたらそれを吸収できるところは変更となる
例外なら途中の関数の変更は不要だよ
> 次にエラーが起きない関数が突然にエラーが起きるようにはならないのでそんな仕様変更は起きない
お前さんの妄想は要らんよ
> 入出力相手があるものは初めからエラーが起きうることがわかるしメモリ上の操作だけであってもsearchやmatchなど成否が起きうるものも最初からわかっている
計算だけしかしない関数が外部に計算させるように変更されたらどうするの?
> まず一般的にどの言語であっても奥底の関数の仕様が変更されたらそれを吸収できるところは変更となる
例外なら途中の関数の変更は不要だよ
> 次にエラーが起きない関数が突然にエラーが起きるようにはならないのでそんな仕様変更は起きない
お前さんの妄想は要らんよ
> 入出力相手があるものは初めからエラーが起きうることがわかるしメモリ上の操作だけであってもsearchやmatchなど成否が起きうるものも最初からわかっている
計算だけしかしない関数が外部に計算させるように変更されたらどうするの?
654デフォルトの名無しさん
2022/01/14(金) 15:28:08.59ID:Ml4XYYXN >>652
> 例外だとこれまで例外出さなかった関数が急に出すようになるわけで、なかなか厳しいね
例外出すように変更したら当然それを受けるように変更するでしょ?
例外なら発生と受けるところの変更だけで済むけど、Rustだと間の関数も全て変更が必要じゃね?
> 例外だとこれまで例外出さなかった関数が急に出すようになるわけで、なかなか厳しいね
例外出すように変更したら当然それを受けるように変更するでしょ?
例外なら発生と受けるところの変更だけで済むけど、Rustだと間の関数も全て変更が必要じゃね?
655デフォルトの名無しさん
2022/01/14(金) 15:34:01.30ID:B7zHdTDq try-catchは素人にはうまく使えないよなあ、とは思う
656デフォルトの名無しさん
2022/01/14(金) 15:36:58.27ID:bXd4RL2X てかエラー処理全般、本気でやるとしたら世の中でできるやつはかなり限られてる。
GAFAとか含めてもそう。
GAFAとか含めてもそう。
657デフォルトの名無しさん
2022/01/14(金) 15:37:15.18ID:/o+2ilkb >>654
自分で変更したとしても、それを使っている箇所を漏れなく変更できるか?という問題もあるし
ましてや依存ライブラリの仕様変更だったらどうするの?という話
誰もがCHANGELOGを正しく書いてくれるわけではないし、見落としだってある
自分で変更したとしても、それを使っている箇所を漏れなく変更できるか?という問題もあるし
ましてや依存ライブラリの仕様変更だったらどうするの?という話
誰もがCHANGELOGを正しく書いてくれるわけではないし、見落としだってある
658デフォルトの名無しさん
2022/01/14(金) 15:44:57.54ID:fGcmjtxY659デフォルトの名無しさん
2022/01/14(金) 15:51:24.55ID:Ml4XYYXN660デフォルトの名無しさん
2022/01/14(金) 16:03:30.57ID:/o+2ilkb661デフォルトの名無しさん
2022/01/14(金) 16:16:10.98ID:Ml4XYYXN 面倒というより本質的に途中の関数には関係ないはずなのに修正が必要になると言うのがちょっと嫌かな
まあ現状ではmore betterなんだろうけどなんとか洗練されないものかと
まあ現状ではmore betterなんだろうけどなんとか洗練されないものかと
662デフォルトの名無しさん
2022/01/14(金) 16:27:26.86ID:WRwvxAen >>659
外部サーバーに計算させるよう変更するには
まずその外部のIPアドレスかホスト名かそれらを含むURIなどが新たなパラメタとして引数に入る
途中の関数があるとすれば全て影響を受けるだろう
さらにそのようなことが必要な規模の計算の場合
外部サーバーを使わずとも自分のところでも並列計算をしていたはずである
また計算以外も含めて今どきはマルチスレッド利用が前提とすると
スレッド間の例外は不可もしくは例外を使わず受け渡しをして投げ直すことになる
結局これは例外を使わない場合と同じことをせざるをえなくなる
外部サーバーに計算させるよう変更するには
まずその外部のIPアドレスかホスト名かそれらを含むURIなどが新たなパラメタとして引数に入る
途中の関数があるとすれば全て影響を受けるだろう
さらにそのようなことが必要な規模の計算の場合
外部サーバーを使わずとも自分のところでも並列計算をしていたはずである
また計算以外も含めて今どきはマルチスレッド利用が前提とすると
スレッド間の例外は不可もしくは例外を使わず受け渡しをして投げ直すことになる
結局これは例外を使わない場合と同じことをせざるをえなくなる
663デフォルトの名無しさん
2022/01/14(金) 16:39:58.04ID:Ml4XYYXN >>662
> まずその外部のIPアドレスかホスト名かそれらを含むURIなどが新たなパラメタとして引数に入る
クラスとか使ったことないのかな?
> 外部サーバーを使わずとも自分のところでも並列計算をしていたはずである
はずはず君w
もう少し考えてからレスしないと恥の上塗りにしかなってないよ
> まずその外部のIPアドレスかホスト名かそれらを含むURIなどが新たなパラメタとして引数に入る
クラスとか使ったことないのかな?
> 外部サーバーを使わずとも自分のところでも並列計算をしていたはずである
はずはず君w
もう少し考えてからレスしないと恥の上塗りにしかなってないよ
664デフォルトの名無しさん
2022/01/14(金) 16:45:29.34ID:eFXg0S3t >>662
計算じゃなく、データベースにクエリー投げるとか普通にあるだろ。 そういう場合、
いちいち関数の引数にIPアドレスやホスト名を渡すのではなく、オブジェクトメンバ
として持たせて、計算メソッドを呼ぶって実装にするのでは?
んで、サーバー応答がない場合だけでなく、IPアドレスやホスト名をセットせずに、
計算メソッドを呼んだりしたら、例外を投げるよな?
計算じゃなく、データベースにクエリー投げるとか普通にあるだろ。 そういう場合、
いちいち関数の引数にIPアドレスやホスト名を渡すのではなく、オブジェクトメンバ
として持たせて、計算メソッドを呼ぶって実装にするのでは?
んで、サーバー応答がない場合だけでなく、IPアドレスやホスト名をセットせずに、
計算メソッドを呼んだりしたら、例外を投げるよな?
665デフォルトの名無しさん
2022/01/14(金) 16:46:26.60ID:CyyU39UP >>658
> 途中で低位層の仕様が変わるとか有り得ない机上の空論に対して
> どこまで何を前提にしていいのか何もかも不明だから誰も何も答えられない
やっぱり例外のことわかってないね
自作関数hoge()がサードパーティ製ライブラリの関数foo()を呼び出しているとき、hoge()ではfoo()が送出する例外をどうするかを実装するだけでいい
その後、foo()が更新されfoo()が依存するライブラリが例えばIoErrorをthrowするようになってfoo()はそれに対して何もしないとしても、hoge()は変更する必要がないし知る必要もない
> 途中で低位層の仕様が変わるとか有り得ない机上の空論に対して
> どこまで何を前提にしていいのか何もかも不明だから誰も何も答えられない
やっぱり例外のことわかってないね
自作関数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でアプリコードは書ける
そんなこと知らなくても、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:WRwvxAen671デフォルトの名無しさん
2022/01/14(金) 17:02:36.16ID:8BRe3wDd >>665
知らなくていいメリットか知りようがないデメリットか
知らなくていいメリットか知りようがないデメリットか
672デフォルトの名無しさん
2022/01/14(金) 17:02:40.51ID:fGcmjtxY673デフォルトの名無しさん
2022/01/14(金) 17:03:04.21ID:CyyU39UP 例外がわかってないっつーか
プログラミングど素人だったわw
プログラミングど素人だったわw
674デフォルトの名無しさん
2022/01/14(金) 17:10:08.74ID:aHL9Oj90 >>654
そうだよ
Tで返してたところをOption<T>で返すように変更が入るとかは普通にある
型で表現できることのメリットの裏返しで
型で表現してるからこそそれに依存してるところは全部変更が必要
誰か書いてたけど検査例外と同じデメリットがある
そうだよ
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が返すものだけ気にする)
これは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で怒られる
だから下から例外が来るか否かは把握していないといけない
そもそも途中でライブラリの仕様が変わって例外を投げるようになること自体がナンセンスだが
JavaScriptについてちゃんとわかっていないようだな
それらは大量にあっても自分のところに飛んで来ないthrowだ
自分のところに飛んでくるthrowはcatchしないとuncaughtExceptionで怒られる
だから下から例外が来るか否かは把握していないといけない
そもそも途中でライブラリの仕様が変わって例外を投げるようになること自体がナンセンスだが
677デフォルトの名無しさん
2022/01/14(金) 17:26:27.30ID:fGcmjtxY >>667
まずは例外の基本を理解しなさい
ライブラリ群のソースの中に何千個のthrowがあろうが各々のtry-catchで閉じ込められておりその外に対しては一切無関係
関係があるのは自分に向かって来る分のみ
まずは例外の基本を理解しなさい
ライブラリ群のソースの中に何千個のthrowがあろうが各々のtry-catchで閉じ込められておりその外に対しては一切無関係
関係があるのは自分に向かって来る分のみ
678デフォルトの名無しさん
2022/01/14(金) 17:43:36.82ID:UhvSPNNm679デフォルトの名無しさん
2022/01/14(金) 17:45:12.30ID:UhvSPNNm >>672
整理できてないのは お・ま・え w
整理できてないのは お・ま・え w
680デフォルトの名無しさん
2022/01/14(金) 17:48:13.03ID:UhvSPNNm681デフォルトの名無しさん
2022/01/14(金) 18:00:55.12ID:fGcmjtxY682デフォルトの名無しさん
2022/01/14(金) 19:16:22.53ID:kUhlpB/h そもそもrustで言うと Result<T, E> の E を変更するのは破壊的変更だから普通は依存crateのエラー型をそのまま外部に見せるようなことはしない
683デフォルトの名無しさん
2022/01/14(金) 19:42:59.80ID:7uXlwHnS684デフォルトの名無しさん
2022/01/14(金) 19:49:44.98ID:fGcmjtxY685デフォルトの名無しさん
2022/01/14(金) 20:30:51.27ID:TehXI+gA コードの修正が必要になるって話な
> 逆にRustだとなんかの理由で奥底の関数がエラーを返すように変更されたらその上の関数全てを変更するってこと?
> 逆にRustだとなんかの理由で奥底の関数がエラーを返すように変更されたらその上の関数全てを変更するってこと?
686デフォルトの名無しさん
2022/01/14(金) 20:46:13.89ID:WRwvxAen >>685
エラーに限らず一般的によくあることだね
返すべき値が増えたり
返すべき型が変わったり
あるいは逆に
引き渡す値が増えたり
引き渡す型が変わったり
それらは機能追加変更でも起きるけど
リファクタリングでも起きたりしてる
Rustでも他の言語でもその状況は変わらない
エラーに限らず一般的によくあることだね
返すべき値が増えたり
返すべき型が変わったり
あるいは逆に
引き渡す値が増えたり
引き渡す型が変わったり
それらは機能追加変更でも起きるけど
リファクタリングでも起きたりしてる
Rustでも他の言語でもその状況は変わらない
687デフォルトの名無しさん
2022/01/14(金) 21:26:13.10ID:9EKaNxsm 話の流れ見えてる?
> 例外なら発生と受けるところの変更だけで済むけど、Rustだと間の関数も全て変更が必要じゃね?
> 面倒というより本質的に途中の関数には関係ないはずなのに修正が必要になると言うのがちょっと嫌かな
> 例外なら発生と受けるところの変更だけで済むけど、Rustだと間の関数も全て変更が必要じゃね?
> 面倒というより本質的に途中の関数には関係ないはずなのに修正が必要になると言うのがちょっと嫌かな
688デフォルトの名無しさん
2022/01/14(金) 21:29:54.99ID:qeE4Uiz1689デフォルトの名無しさん
2022/01/14(金) 21:33:39.15ID:8BRe3wDd どこでどういう例外が発生するか全部把握している人にとっては造作もないこと
690デフォルトの名無しさん
2022/01/14(金) 21:40:25.58ID:WRwvxAen691デフォルトの名無しさん
2022/01/14(金) 21:52:56.30ID:kQdsKxlC692デフォルトの名無しさん
2022/01/14(金) 22:00:42.61ID:0UR5WO3U >?オペレーターで飛ばす途中の関数はそのまま変更ないよ
?オペレーターかどうかは関係ないやろ
いつもいつもホントいい加減な事言うよなぁ
?オペレーターかどうかは関係ないやろ
いつもいつもホントいい加減な事言うよなぁ
693デフォルトの名無しさん
2022/01/14(金) 22:16:08.15ID:WRwvxAen694デフォルトの名無しさん
2022/01/14(金) 22:28:31.33ID:Rec6pgsK 検査例外の不便さを軽減しつつ例外が送出されることのみ型で明記する方式をとったのがSwift
RustのResultを返す方式と基本思想は同じだがエラーの型を明記しなくていいので使いやすい
RustのResultを返す方式と基本思想は同じだがエラーの型を明記しなくていいので使いやすい
695デフォルトの名無しさん
2022/01/14(金) 22:32:28.06ID:8BRe3wDd エラーの種類を型で区別するというのがそもそも無理があったんだろうな。
696デフォルトの名無しさん
2022/01/14(金) 22:35:46.65ID:WRwvxAen697デフォルトの名無しさん
2022/01/14(金) 22:45:19.38ID:/e6eXz55698デフォルトの名無しさん
2022/01/14(金) 22:53:53.91ID:WRwvxAen699デフォルトの名無しさん
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_*()などの
エラー値ではない時のみ正常値を取り出し使える手段を必ず経る必要がある
つまり正常値を使って処理していくコードはエラー値ではない時だけしか動作しないことが保証される
それならばRustが安全
Rustのenum Result型から正常値を取り出すには
matchやif letもしくはResult型のメソッドunwrap_*()などの
エラー値ではない時のみ正常値を取り出し使える手段を必ず経る必要がある
つまり正常値を使って処理していくコードはエラー値ではない時だけしか動作しないことが保証される
702デフォルトの名無しさん
2022/01/15(土) 08:12:31.52ID:f2+KU74o >>698
常識と言いながら話をループさせるのはもしかして認知症… w
常識と言いながら話をループさせるのはもしかして認知症… w
703デフォルトの名無しさん
2022/01/15(土) 08:49:08.65ID:2yxrsW1B >>701エラーケースのリカバリの話をしているんだが
704デフォルトの名無しさん
2022/01/15(土) 09:29:13.90ID:qyAynvOh705デフォルトの名無しさん
2022/01/15(土) 09:44:44.45ID:GF5575Ny ここはrustをよく知らない人に
rust初心者がrustをゴリ押しするスレです。
rust初心者がrustをゴリ押しするスレです。
706デフォルトの名無しさん
2022/01/15(土) 09:46:20.74ID:l/1QpEiq >>699
強いて言えばRustかな
強いて言えば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に任せられる範囲内でなら忘れない
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の方が有利ということか
C++との比較だとRAIIは同等だが検査例外がない分Rustの方が有利ということか
711デフォルトの名無しさん
2022/01/15(土) 11:12:22.12ID:jGOB5mcp712デフォルトの名無しさん
2022/01/15(土) 11:19:39.12ID:TPVIWwIW そういや、Rustの?演算子の性能コストはどうなの?
プログラマの負担を増やしても行儀正しいコードを強制しようとするRustが?演算子による明記を選んだのはなんとなくわかるけど、性能コストがどうなるかは気になるところ。
性能調査結果とかある?
プログラマの負担を増やしても行儀正しいコードを強制しようとするRustが?演算子による明記を選んだのはなんとなくわかるけど、性能コストがどうなるかは気になるところ。
性能調査結果とかある?
713デフォルトの名無しさん
2022/01/15(土) 11:32:51.20ID:Y9H47hY4714デフォルトの名無しさん
2022/01/15(土) 11:38:21.03ID:3NVItroQ715デフォルトの名無しさん
2022/01/15(土) 12:12:09.32ID:i0u9aJCP setjmp/longjmp系と違ってSwiftみたいにResultに展開されるのもあるから
コードの見た目と性能は必ずしもリンクしない
コードの見た目と性能は必ずしもリンクしない
716デフォルトの名無しさん
2022/01/15(土) 18:52:31.41ID:Ipn+w0vn717デフォルトの名無しさん
2022/01/15(土) 20:23:33.12ID:4ScfLEDx >>716
> あとヒープがメモリ解放されるためにはunique_ptrとshared_ptrを用いることが必須
必須じゃないだろ
デストラクタで解放すればいいだけ
まあちゃんとやるには色々面倒ではあるが
> あとヒープがメモリ解放されるためにはunique_ptrとshared_ptrを用いることが必須
必須じゃないだろ
デストラクタで解放すればいいだけ
まあちゃんとやるには色々面倒ではあるが
718デフォルトの名無しさん
2022/01/15(土) 20:53:33.23ID:Ipn+w0vn >>717
もちろん自分で毎回漏れなく面倒を忘れず頑張るならばその通り
そのコストは見合わないから
単なるポインタ使用ではダメという意味でunique_ptrとshared_ptrを用いることが必須と書いた
もちろん自分で毎回漏れなく面倒を忘れず頑張るならばその通り
そのコストは見合わないから
単なるポインタ使用ではダメという意味でunique_ptrとshared_ptrを用いることが必須と書いた
719デフォルトの名無しさん
2022/01/15(土) 22:12:38.76ID:6Cf3x1KF >>716
>Rustの?演算子による即returnと
>C++の例外によるスタック巻き戻しの性能は同じ
全然違うよ
コンパイル時の設定にもよるが
一般的には例外が投げられないケースに最適化するから
例外が投げられた時は桁違いに遅い
>Rustの?演算子による即returnと
>C++の例外によるスタック巻き戻しの性能は同じ
全然違うよ
コンパイル時の設定にもよるが
一般的には例外が投げられないケースに最適化するから
例外が投げられた時は桁違いに遅い
720デフォルトの名無しさん
2022/01/15(土) 22:14:04.01ID:im+Hgbd+721デフォルトの名無しさん
2022/01/15(土) 22:19:26.94ID:dcFP2dQT >>718
必須の意味わかる?w
必須の意味わかる?w
722デフォルトの名無しさん
2022/01/15(土) 22:26:24.89ID:Ipn+w0vn 例外が投げられなくても
try/catchの記述をしただけでコストが余分にかかる
try/catchの記述をしただけでコストが余分にかかる
723デフォルトの名無しさん
2022/01/15(土) 22:41:23.56ID:xm4DJboQ >>719
どっちかって言うと例外にならないケースのオーバーヘッドの方が知りたい
どっちかって言うと例外にならないケースのオーバーヘッドの方が知りたい
724デフォルトの名無しさん
2022/01/15(土) 22:53:35.49ID:Ipn+w0vn725デフォルトの名無しさん
2022/01/15(土) 23:42:43.37ID:EjYm1enE726デフォルトの名無しさん
2022/01/15(土) 23:50:30.00ID:p6KpEKbL 議論を見てるとC++に落ちこぼれたヤツがRust派に立って復讐劇を繰り広げてるかのようだな
727デフォルトの名無しさん
2022/01/16(日) 00:12:49.41ID:96P6/01/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でコメントを見れば良い。
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/735デフォルトの名無しさん
2022/01/16(日) 21:43:20.67ID:96P6/01/ >>734 正常フローの効率を考えるとそうとも言い切れんだろう。
736デフォルトの名無しさん
2022/01/16(日) 22:21:08.50ID:5EvfPXLa737デフォルトの名無しさん
2022/01/16(日) 23:27:18.62ID:1VPU7xju C++もRustやSwiftを真似する方向性なんじゃないの?
https://youtu.be/ARYP83yNAWk?t=1870
https://youtu.be/ARYP83yNAWk?t=1870
738デフォルトの名無しさん
2022/01/16(日) 23:31:51.57ID:nsZpNQQv これは例外のほうがコストがかかる。
だからC++においても何でも例外を使うということはなく、
普通にエラーを関数の返り値として返している。
だから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));
}
何を言いたいのか意味不明だが
補足が捕捉ならばメモリ確保(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/YH743デフォルトの名無しさん
2022/01/17(月) 01:22:04.37ID:Xrw8ALdy >>741
oom killerはSIGKILL送られてくるから言語関係なくプロセス側でできることは何もない
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+zDV748デフォルトの名無しさん
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:rdgDbl6j752デフォルトの名無しさん
2022/01/17(月) 18:10:18.31ID:rdgDbl6j >>751
あ、俺もアンカー消す方マチガエテ、意味不明になったわw
あ、俺もアンカー消す方マチガエテ、意味不明になったわw
753デフォルトの名無しさん
2022/01/17(月) 18:27:39.21ID:Y2e2eRad >>744
先週ニュースになったFirefoxの件は
QUIC利用のHTTP/3実装の問題がクラウドプロバイダー側での設定変更で発動して接続障害が起きただけ
当然プログラミング言語とは全く関係なく既に修正された
先週ニュースになった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:/4x0Ci4W757デフォルトの名無しさん
2022/01/18(火) 00:52:32.38ID:4U9kmoTP758デフォルトの名無しさん
2022/01/18(火) 01:55:30.01ID:gaAtUhso C++は今後も仕様拡張を続けるから枯れることはない
GCCも毎回大量のバグリストを抱えている
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:4U9kmoTP762デフォルトの名無しさん
2022/01/18(火) 07:56:24.51ID:MsojyETm 処理系にバグのない言語って実際あるの?
763デフォルトの名無しさん
2022/01/18(火) 08:20:43.00ID:oJq/xgpq >>762
brainf*ckとか。
brainf*ckとか。
764デフォルトの名無しさん
2022/01/18(火) 08:51:14.65ID:xRQ/46rp すべてのバグを仕様扱いにすればバグがなくなる
765デフォルトの名無しさん
2022/01/18(火) 11:16:05.86ID:Rc17/4VF766デフォルトの名無しさん
2022/01/18(火) 13:40:34.49ID:M8yXIS4d >>765
> どれくらい古ければ枯れてると見なしてるのかが気になる
枯れてなければ(リリース日が古くなければ)利用しないということではないよ
様々な状況を勘案して利用するものを決定する
ただし、いわゆる「メインストリーム」から外れているものについては、枯れているかどうかはかなり重要
ちなみに、うちではRHEL系のOSを使っていて、基本はそれに付属しているデフォルトバージョンを使う
今だと、gcc 8.5.0
ただし、Linuxだとサードパーティ製ライブラリ等をコードからビルドする必要がある場合があり、そのときは8よりも新しいものも使う
使えるのは、公式がリリースされているバージョン9系のパッケージと10系のパッケージ
また、プロジェクト毎にチームの合意があれば、はじめから9系あるいは10系を使うこともできる
(といっても、プロダクトコードをC++で記述するケースはかなり減ってはいる)
> どれくらい古ければ枯れてると見なしてるのかが気になる
枯れてなければ(リリース日が古くなければ)利用しないということではないよ
様々な状況を勘案して利用するものを決定する
ただし、いわゆる「メインストリーム」から外れているものについては、枯れているかどうかはかなり重要
ちなみに、うちでは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まで来ている(インクリメンタルコンパイルがデフォルトで有効になったバージョン)
なお、RHEL 8系のRustのデフォルトパッケージのバージョンは、1.54.0まで来ている(インクリメンタルコンパイルがデフォルトで有効になったバージョン)
770デフォルトの名無しさん
2022/01/18(火) 13:54:30.02ID:M8yXIS4d >>767
イメージでしか語れないが、Go言語レベルくらいになれば、メインとして使っても良いというところが増えると思う
イメージでしか語れないが、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投げられるほどの優秀な人材が揃っていて、なおかつ工数を潤沢に取れるから
凡人チームがメインで採用できるようになるには、もう少し時間が必要だと思うよ
そうそう、
> Firefoxはもちろん、LinuxやAndroid OSでもすでに採用されている
ということができるのは、コンパイラのバグを見つけたら自分で修正してPR投げられるほどの優秀な人材が揃っていて、なおかつ工数を潤沢に取れるから
凡人チームがメインで採用できるようになるには、もう少し時間が必要だと思うよ
773デフォルトの名無しさん
2022/01/18(火) 14:47:32.73ID:5CNF/fSF >>771
Goがウェブ開発用言語という認識?
Goがウェブ開発用言語という認識?
774デフォルトの名無しさん
2022/01/18(火) 14:53:49.46ID:DDrab3An ウェブ用言語とは思わないけど、一時期のRubyのようにウェブの用途でめっちゃ使われてると思ってる
Goが本当に得意なのは、並列処理の実装だろうけど
Goが本当に得意なのは、並列処理の実装だろうけど
775デフォルトの名無しさん
2022/01/18(火) 15:11:19.46ID:LYrwkmfN 並列処理が得意なのはRustじゃないの?
776デフォルトの名無しさん
2022/01/18(火) 15:20:06.50ID:pFQ6G5F3777デフォルトの名無しさん
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が例外
panic/recoverが例外
783デフォルトの名無しさん
2022/01/18(火) 18:38:34.25ID:fqF8MHNf C++は20年かかってやっと例外の実装が間違いだと認めて方向転換しようとしてる
784デフォルトの名無しさん
2022/01/18(火) 18:51:46.66ID:M8yXIS4d785デフォルトの名無しさん
2022/01/18(火) 18:56:29.95ID:tSEDFRaR786デフォルトの名無しさん
2022/01/18(火) 20:05:56.87ID:gaAtUhso787デフォルトの名無しさん
2022/01/18(火) 21:30:18.33ID:LRDfdMqN >>786
race付きでコンパイルしたものは本番で使わないよ
race付きでコンパイルしたものは本番で使わないよ
788デフォルトの名無しさん
2022/01/18(火) 21:45:51.63ID:gaAtUhso 重くて本番で使わない結果
本番環境で運用中に生じる競合を検出できない
本番環境で運用中に生じる競合を検出できない
789デフォルトの名無しさん
2022/01/18(火) 21:46:20.73ID:Edb5UGZv >>787
そりゃそうなんだけど実際検出したいバグは本番環境で長時間実行したらたまに出る、みたいなやつなので
手元でrace付けて簡単に再現するやつはそもそもそんなにデバッグにも苦労しないし、いまいち噛み合ってない感はあるなぁ
そりゃそうなんだけど実際検出したいバグは本番環境で長時間実行したらたまに出る、みたいなやつなので
手元でrace付けて簡単に再現するやつはそもそもそんなにデバッグにも苦労しないし、いまいち噛み合ってない感はあるなぁ
790デフォルトの名無しさん
2022/01/18(火) 21:56:48.08ID:kepaLF1q >>783
例外と例外指定の違いもつかないでC++批判か
例外と例外指定の違いもつかないでC++批判か
791デフォルトの名無しさん
2022/01/18(火) 22:02:37.92ID:L9ANQ96E792デフォルトの名無しさん
2022/01/18(火) 22:07:29.63ID:6oUcJD0w793デフォルトの名無しさん
2022/01/18(火) 22:14:10.77ID:Edb5UGZv794デフォルトの名無しさん
2022/01/18(火) 23:02:11.65ID:L9ANQ96E >>776のようにカジュアルに発生するってのは問題だが1%見逃すのは仕方ないんでないの?
並列処理のデータ競合バグを100%排除できる言語なんてある?
並列処理のデータ競合バグを100%排除できる言語なんてある?
795デフォルトの名無しさん
2022/01/18(火) 23:23:43.01ID:3Ht6lHCg >>794
少なくともRustはコンパイラやunsafe絡みのバグを除けば原理的には100%なんだから、それと同じくらいまでは頑張って欲しい
せっかくgoroutineが使いやすいのに、目視レビュー頑張ってって言われるとちょっと…
少なくともRustはコンパイラやunsafe絡みのバグを除けば原理的には100%なんだから、それと同じくらいまでは頑張って欲しい
せっかくgoroutineが使いやすいのに、目視レビュー頑張ってって言われるとちょっと…
796デフォルトの名無しさん
2022/01/18(火) 23:31:50.26ID:VN+VluXj797デフォルトの名無しさん
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ならロック解除し忘れ防止も大丈夫といったように別の解決方法となる
Rustコンパイラが100%保証するのは「データ競合(data races)」が起きないこと
だからその点ではC++やGoよりは遥かに優れている
一方でデータ競合を除く「競合状態(race conditions)」を100%検出する方法は存在しない
だからデッドロックなどはRustコンパイラでも当然ながら検出できない
もちろんデッドロックはロック順序決めで対応できるし
Rustならロック解除し忘れ防止も大丈夫といったように別の解決方法となる
799デフォルトの名無しさん
2022/01/19(水) 00:10:47.44ID:mUI3y0qL800デフォルトの名無しさん
2022/01/19(水) 00:23:42.92ID:7HSVmIfo801デフォルトの名無しさん
2022/01/19(水) 01:17:11.35ID:cSOd3D9g802デフォルトの名無しさん
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へ向けて進行中のようだ
従来の例外メカニズムよりも様々な面で優れているという点は共通認識なのね
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:cFKRo9Uk805デフォルトの名無しさん
2022/01/19(水) 07:57:00.40ID:1qFppSOF806デフォルトの名無しさん
2022/01/19(水) 11:07:19.52ID:eMdpT3GP >>805
まぁ、C0カバレッジはおろかC1カバレッジ100%にしても、競合のバグは発見できないことが多々あるんだけどね
まぁ、C0カバレッジはおろかC1カバレッジ100%にしても、競合のバグは発見できないことが多々あるんだけどね
807デフォルトの名無しさん
2022/01/19(水) 11:48:30.52ID:gQYkvdGO テストで競合のバグ網羅的に検出する方法教えてほしいわ...
808デフォルトの名無しさん
2022/01/19(水) 12:03:27.07ID:i7kz0e3/809デフォルトの名無しさん
2022/01/19(水) 13:00:05.26ID:Li1rxlZL 競合のバグってどんなバグ?
810デフォルトの名無しさん
2022/01/19(水) 13:29:00.39ID:IYc6/CaJ811デフォルトの名無しさん
2022/01/19(水) 13:36:39.59ID:eMdpT3GP ・複数人で開発している
・その中にど素人が紛れている
・誰でもアクセスできる場所にデータが置かれている
というときにど素人がデータ競合をやらかす可能性があるが、それ以外は設計で防げる気がするがどうか
・その中にど素人が紛れている
・誰でもアクセスできる場所にデータが置かれている
というときにど素人がデータ競合をやらかす可能性があるが、それ以外は設計で防げる気がするがどうか
812デフォルトの名無しさん
2022/01/19(水) 14:37:52.59ID:K9rAR3/n813デフォルトの名無しさん
2022/01/19(水) 14:44:54.08ID:eMdpT3GP 結局の所、高頻度・ロングランテストするくらいしか検出方法ないんですかね
814デフォルトの名無しさん
2022/01/19(水) 14:59:15.19ID:WoOGtWuY ロングランテストwww
何の関係があるんだよw
いつもの知ったかさんでしょコレ
何の関係があるんだよ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:v8LOrcPB818デフォルトの名無しさん
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++は既存システムのメンテ用
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を一部採用し始めたのが典型的ですね
あれほどC++は無意味な言語と採用を拒否し続けてきたにも関わらず
Rustを一部採用し始めたのが典型的ですね
833デフォルトの名無しさん
2022/01/20(木) 00:48:26.56ID:Rx+HndAo 以前のHaskellのような勢いがあるけど、まったく使われないのもHaskellと同じでは?
834デフォルトの名無しさん
2022/01/20(木) 01:09:18.97ID:2FFUKTfw うっかりミスで競合バグやメモリ破壊が起きるとは思えんな
データ構造やテーブルの設計ができない、メモリ安全な書き方知らないってスキルや知識、経験の問題だろうよ
マルチスレッドの使いどころを知らないやつ、知ったか、コミュ障あたりがプロジェクトに混じると起きる
そういった猿を炙り出せるrustはパラドックスを抱えてる気もするが俺は好意的
データ構造やテーブルの設計ができない、メモリ安全な書き方知らないってスキルや知識、経験の問題だろうよ
マルチスレッドの使いどころを知らないやつ、知ったか、コミュ障あたりがプロジェクトに混じると起きる
そういった猿を炙り出せるrustはパラドックスを抱えてる気もするが俺は好意的
835デフォルトの名無しさん
2022/01/20(木) 01:25:44.62ID:Vi2E1kzg836デフォルトの名無しさん
2022/01/20(木) 01:26:44.10ID:Vi2E1kzg あとメモリ安全の話してないしw
837デフォルトの名無しさん
2022/01/20(木) 01:27:16.51ID:u4d94q6b 俺もそうだったが、初めてマルチタスクOSでプログラミングし始めた頃に
興味を持ちやすいのが、マルチスレッドや、メッセージパッシング、
同期、非同期、排他処理など。
そして、実際にプログラム経験を積むにつれ、そういったものは、そんなに
使用しなくてもほとんどのプログラムには関係無いことが分かってくる。
というのは、シングルスレッドでも処理速度が足りる場合が多いからだ。
また、ブラウザ以外では async, awaitなどを使う理由は皆無である
ことも分かってくる。複雑になるだけで速度も上がらないから。
ほぼブラウザ上アプリ専用だと考えて良いだろう。
興味を持ちやすいのが、マルチスレッドや、メッセージパッシング、
同期、非同期、排他処理など。
そして、実際にプログラム経験を積むにつれ、そういったものは、そんなに
使用しなくてもほとんどのプログラムには関係無いことが分かってくる。
というのは、シングルスレッドでも処理速度が足りる場合が多いからだ。
また、ブラウザ以外では async, awaitなどを使う理由は皆無である
ことも分かってくる。複雑になるだけで速度も上がらないから。
ほぼブラウザ上アプリ専用だと考えて良いだろう。
838デフォルトの名無しさん
2022/01/20(木) 01:29:39.27ID:z2ZQEaJV >>837
なぜブラウザだけ?
なぜブラウザだけ?
839デフォルトの名無しさん
2022/01/20(木) 01:30:31.76ID:Rx+HndAo840デフォルトの名無しさん
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読み書きにしても同期かつ並行並列もなく待ちぼうけプログラミングでもしているのかね?
色々とおかしいぜ
まずシングルスレッドでも可能な並行処理とマルチスレッドとなる並列処理の違いがわかっていない?
さらに非同期処理と並行並列処理の違いも分かっていない?
まずシングルスレッド内でもマルチタスクで並行処理はするし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
"ロングランテスト"でしかテストできないという意味では全部一緒ですね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:XHUr7069849デフォルトの名無しさん
2022/01/20(木) 11:56:51.04ID:BSrnUcOL 同感だわ
ポインタほどプログラム全体に散らばるようなものじゃないからな
ポインタほどプログラム全体に散らばるようなものじゃないからな
850デフォルトの名無しさん
2022/01/20(木) 12:08:15.10ID:/QGeeRaj 自分で書くぶんにはデータ競合はほぼ踏まないと思ってるし
実際Rustで書いてもSend/Syncエラーになったりはしないんだが
だからといって社内の謎ライブラリやらマイナーなOSSが
同程度に信頼できるわけではないからな
チェックがあるに越したことはない
実際Rustで書いてもSend/Syncエラーになったりはしないんだが
だからといって社内の謎ライブラリやらマイナーなOSSが
同程度に信頼できるわけではないからな
チェックがあるに越したことはない
851デフォルトの名無しさん
2022/01/20(木) 13:07:09.28ID:r0r0TMJm Send/Syncはまた別の話
852デフォルトの名無しさん
2022/01/20(木) 13:25:20.64ID:XHUr7069853デフォルトの名無しさん
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++は何もかもが中途半端な存在となってしまっていることに気付いた
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が採用されます
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+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の名前を見かけることはあまり多くないように思います。
> 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で仕事回ってるし
変わるJS/TSで仕事回ってるし
871デフォルトの名無しさん
2022/01/22(土) 14:52:11.36ID:v1aiSn8P ブラウザは特殊。
デスクトップアプリでasync,awaitは不要。
デスクトップアプリでasync,awaitは不要。
872デフォルトの名無しさん
2022/01/22(土) 16:21:57.94ID:o4PPoyn9 サーバサイドで使われてるのしらないの?
873デフォルトの名無しさん
2022/01/22(土) 16:26:26.49ID:v1aiSn8P もともと並列処理は、スーパーコンピューターで、クロック数の増加速度に陰りが
見え始めた時、複数のCPUで処理することで高速処理をするために発明されたもの。
プログラミングがとても難しいことが知られており、速度が十分な場合は不要。
1コア(スレッド)なのに非同期にする理由は無い。
見え始めた時、複数のCPUで処理することで高速処理をするために発明されたもの。
プログラミングがとても難しいことが知られており、速度が十分な場合は不要。
1コア(スレッド)なのに非同期にする理由は無い。
874デフォルトの名無しさん
2022/01/22(土) 16:29:08.60ID:v1aiSn8P 並列処理は、プログラムの難しさと引き換えに、速くなるためだけに発明された
だけの苦肉の策。
技術的な頭打ちをなんとか凌ぐために登場した。
シングルスレッドだと全く速くならないのに、プログラムを難しくするだけで
意味が無い。
だけの苦肉の策。
技術的な頭打ちをなんとか凌ぐために登場した。
シングルスレッドだと全く速くならないのに、プログラムを難しくするだけで
意味が無い。
875デフォルトの名無しさん
2022/01/22(土) 17:02:58.58ID:UcDtUdFv >>870
ほー、じゃ直近3年でプロジェクトに採用したFWを時系列に並べてみ?
ほー、じゃ直近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+kYe879デフォルトの名無しさん
2022/01/22(土) 18:14:18.83ID:CQ3v+kYe880デフォルトの名無しさん
2022/01/22(土) 18:28:41.27ID:+h3Uwt/E 何言ってるんだ?
古くからマルチプロセスで高速化なんていくらでもあるだろ
make -j オプションとか知らんのかよ
古くからマルチプロセスで高速化なんていくらでもあるだろ
make -j オプションとか知らんのかよ
881デフォルトの名無しさん
2022/01/22(土) 18:37:28.25ID:CQ3v+kYe >>880
シングルコア、シングルCPUのPC-9801だと基本的に速くならん。
シングルコア、シングルCPUのPC-9801だと基本的に速くならん。
882デフォルトの名無しさん
2022/01/22(土) 18:48:08.80ID:+h3Uwt/E883デフォルトの名無しさん
2022/01/22(土) 19:05:35.39ID:vfyV6CZn >>871
最近はブラウザベースのデスクトップアプリ多いよね
最近はブラウザベースのデスクトップアプリ多いよね
884デフォルトの名無しさん
2022/01/22(土) 22:34:52.70ID:hteSw3T0885デフォルトの名無しさん
2022/01/22(土) 22:36:34.19ID:rHbcHXIR886デフォルトの名無しさん
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:yljb5PqZ889デフォルトの名無しさん
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の特殊性からきているものなので、
「新しい概念だから他のプログラミング言語にも広めていくべき」
などという見方は間違っている。
特に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+Dx9AR8896デフォルトの名無しさん
2022/01/23(日) 07:35:24.30ID:L+Dx9AR8897デフォルトの名無しさん
2022/01/23(日) 09:13:42.66ID:5TQWnu47 そもそもマルチスレッド(タスク)や非同期処理はIO多重化への対処であってコアの数は関係無い。
(マルチコアのほうがより効率に処理できるが)
本質わかってないやつ多すぎ。
(マルチコアのほうがより効率に処理できるが)
本質わかってないやつ多すぎ。
898デフォルトの名無しさん
2022/01/23(日) 10:46:09.32ID:ToW82ksW899デフォルトの名無しさん
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化して、マルチスレッド・プログラミングで対処する
しかないことが出てきた。
したがって、あなたの主張は完全なる間違い。
実際は正反対。
それはOSレベルで工夫すればなんとでもなるので、マルチスレッドは必須ではない。
ところが、高速化に関しては、クロック数が頭打ちになってきているので、
マルチコア/マルチCPU化して、マルチスレッド・プログラミングで対処する
しかないことが出てきた。
したがって、あなたの主張は完全なる間違い。
実際は正反対。
902デフォルトの名無しさん
2022/01/23(日) 23:36:55.40ID:2V1gRdrY >>897の「マルチスレッド(タスク)や非同期処理はIO多重化への対処」のI/O多重化は当然通信も含むんじゃないか
>>901
OSレベルで工夫すればなんとでもなる、なんて無理
通信相手が返事を返すのに数msec、数秒、数分ということは現実に有り得る
シングルスレッドで同期のみならその間は何も出来ない
マルチスレッドであっても通信相手が多数ならば多数のスレッドが必要となりそれらが同期のみなら全て待ちのために停止
マルチプロセスにしても同様でいずれも無駄にOSリソースを使うだけとなる
つまり非同期プログラミングは必須
非同期ならばシングルスレッドでも並行(concurrent)に処理することができる
さらにマルチコアを有効活用するためにマルチスレッドで非同期にすれば並列(pararell)にも処理することが出来る
>>901
OSレベルで工夫すればなんとでもなる、なんて無理
通信相手が返事を返すのに数msec、数秒、数分ということは現実に有り得る
シングルスレッドで同期のみならその間は何も出来ない
マルチスレッドであっても通信相手が多数ならば多数のスレッドが必要となりそれらが同期のみなら全て待ちのために停止
マルチプロセスにしても同様でいずれも無駄にOSリソースを使うだけとなる
つまり非同期プログラミングは必須
非同期ならばシングルスレッドでも並行(concurrent)に処理することができる
さらにマルチコアを有効活用するためにマルチスレッドで非同期にすれば並列(pararell)にも処理することが出来る
903デフォルトの名無しさん
2022/01/24(月) 06:27:31.76ID:gNLiogmJ904デフォルトの名無しさん
2022/01/24(月) 07:44:27.65ID:p86CtUav >>903
select/kqueue/epollなどでポーリングして切り替えながらノンブロッキングで複数I/Oアクセスをする大昔から行われている方法のことだよな
これを同期プログラミングとは呼ばないな
むしろこのポーリング方式で切り替えながら呼び出すコールバック先を単なる関数だけからコルーチン対応にしたものが非同期プログラミングと呼ばれるくらいだ
そしてポーリング状態およびタイマー状態に応じて呼び出すコルーチンを切り替えていくのがスケジューラ
もちろん通常の非同期プログラミングではその部分はライブラリなどに任せてしまい呼び出されるコルーチン部分をプログラミングすることになる
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:epnuPzmN911デフォルトの名無しさん
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/
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通り全てが用途ごとに使われています
9割方その通りですが
epollやselectなどのポーリング結果で呼び出される対象は単なるコールバック関数でも非同期プログラミングですよ
例えばJavaScriptでは非同期関数のコールバックは単なる関数でよいです
もちろんコルーチンとなるasync関数から使えばawaitできる点でもっと利便性の高い非同期プログラミングになりますね
>>910
非同期プログラミングは必須と主張している相手に対してスレッドの話は噛み合っていないですよ
非同期プログラミングとマルチスレッドプログラミングは別です
同期/非同期とシングルスレッド/マルチスレッドは組み合わせ4通り全てが用途ごとに使われています
916デフォルトの名無しさん
2022/01/24(月) 15:42:51.22ID:BWBJT0bl 9割方その通りですがw
お前が言うなやww
お前が言うなやww
917デフォルトの名無しさん
2022/01/24(月) 16:07:45.87ID:epnuPzmN918デフォルトの名無しさん
2022/01/24(月) 16:17:39.92ID:jdPj866/ >>917
きみら二人以外誰も困らないよ
きみら二人以外誰も困らないよ
919デフォルトの名無しさん
2022/01/24(月) 17:40:26.73ID:g6coj3Jd サーバーサイドはGo使えってのが常識になってきたっぽいぞ
Rustどこで使えばいいんだよ
Rustどこで使えばいいんだよ
920デフォルトの名無しさん
2022/01/24(月) 17:51:20.76ID:RtyiqZqM フットプリントが大きいと困るような低レベルなレイヤーには向いているだろうが、
ウェブアプリケーションは水平分散でなんとかなるからRailsとかも使えてたわけで
ウェブアプリケーションは水平分散でなんとかなるからRailsとかも使えてたわけで
921デフォルトの名無しさん
2022/01/24(月) 17:54:55.80ID:RtyiqZqM ウェブアプリじゃなくて、もっと広くサーバサイドのことを本当に言ってるなら、
主語が大きすぎてよくわからん
主語が大きすぎてよくわからん
922デフォルトの名無しさん
2022/01/24(月) 18:37:54.23ID:5cKH7ieg >>915
だからお前の頓珍漢な非同期処理を語られても困る
I/Oとプログラムが同時に動作してると言うなら単なる同期Write命令でも実際の書き込み動作はたいてい非同期
そんなこと言い出したら同期処理なんてほとんどないわな
だからお前の頓珍漢な非同期処理を語られても困る
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を含む間欠タイプを想定してコルーチンと書いてしまっていた
確かにコールバック渡し非同期関数もあるな
同意
ただしポーリングといっても意味合いが何種類かに分かれて
単純だがムダな状態チェックポーリングの定期もしくは常時ループもあれぱ
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が重要などと言う主張。
アホがえらそうにしてるのは看過できないよ。
日本が滅ぶから。
最近、プログラミングの世界で間違ってる主張が集団幻覚のように広まる
ことが多くなったから。それが、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が重要な状況もあれば重要じゃない状況もあるだろうから文脈無しでは誰も同意しないよ
「async,awaitが重要などと言う主張」をしてた人はどういう場面・状況において重要だと主張してたの?
async/awaitが重要な状況もあれば重要じゃない状況もあるだろうから文脈無しでは誰も同意しないよ
935デフォルトの名無しさん
2022/01/25(火) 13:35:10.97ID:A3MKeF5O >>934
async,awaitをサポートして無い言語はダメと言ったやつが居る。
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:UYaUcevz940デフォルトの名無しさん
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 がないとだめなんだろうか
>>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:Suh34ira942デフォルトの名無しさん
2022/01/25(火) 19:04:47.34ID:dI/lXZJY 非同期プログラミングへの苦手意識は自覚してるにも関わらず
昔の知識で俺は賢いんだと虚勢を張る100点おじ
非同期プログラミングの定義すら分かっていないにも関わらず
聞き齧った知識でとにかくマウントとりたい複製おじ
さて軍配はw
昔の知識で俺は賢いんだと虚勢を張る100点おじ
非同期プログラミングの定義すら分かっていないにも関わらず
聞き齧った知識でとにかくマウントとりたい複製おじ
さて軍配はw
943デフォルトの名無しさん
2022/01/25(火) 19:09:20.65ID:uKos3Mim >>941
文法でも概念でもどっちでも良いけどわざわざ新たな機能を追加したわけでそれはどういう意図があったんだろうね
文法でも概念でもどっちでも良いけどわざわざ新たな機能を追加したわけでそれはどういう意図があったんだろうね
944デフォルトの名無しさん
2022/01/25(火) 19:19:28.61ID:3IePzztS945デフォルトの名無しさん
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使わずに書くと?
いや根本的に違ってくる
例えばこの数値を返してくるサイト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
一人二役やめろってww
948デフォルトの名無しさん
2022/01/25(火) 21:51:37.76ID:5O9CJGEe949デフォルトの名無しさん
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:3IePzztS952デフォルトの名無しさん
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して足す、などというようなソフトは想定外。
ありえたとしても例外中の例外で、そんな特殊ケース、レアケースのためだけに
有用な機能を付けることは重要ではない。
Illustrator,ClipStudio,各種CAD,各種3D Modeler/Renderer, 各種Simulator,
PowerDirectorなどの動画編集ソフト, 音楽作成ソフトなどのことなのだから、
3箇所の別のURLからデータをfetchして足す、などというようなソフトは想定外。
ありえたとしても例外中の例外で、そんな特殊ケース、レアケースのためだけに
有用な機能を付けることは重要ではない。
954デフォルトの名無しさん
2022/01/26(水) 01:20:32.34ID:bGJ0opg8955デフォルトの名無しさん
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++が使われてるケース全てだろうな
C/C++が使われてるケース全てだろうな
959デフォルトの名無しさん
2022/01/26(水) 16:43:19.04ID:q/gd6wxB >>956
高速化のためとAPIがI/O完了の柔軟な待機に対応して無い事が有ることから
マルチスレッドでの処理は行われているが、JSのようなシングルスレッドでの
async,awaitは行われて無いし、行う価値も無い。
高速化のためと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を
使って待機状態にする。
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
今は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を用いるとブロックされるのでシングルスレッドなら他を進められなくなりマルチスレッドなら無駄にスレッドが浪費される
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+W967デフォルトの名無しさん
2022/01/26(水) 21:29:54.45ID:Z5eFNXQp968デフォルトの名無しさん
2022/01/26(水) 22:08:02.72ID:KsJFT5nW969デフォルトの名無しさん
2022/01/26(水) 22:25:33.62ID:drBs6KnV970デフォルトの名無しさん
2022/01/26(水) 22:48:23.70ID:uxP3YVvM >>968
win32api にcriticalsection ありますけど…
https://docs.microsoft.com/en-us/windows/win32/sync/critical-section-objects
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:ZuJ8vc16973デフォルトの名無しさん
2022/01/26(水) 23:03:27.65ID:uxP3YVvM974デフォルトの名無しさん
2022/01/26(水) 23:07:58.33ID:2GXIfjxN >>972
> クリティカルセクションを知ってれば
> 「イベントとかセマフォは使わんの?」なんてアホな返しはしないから
どうやったらそんなアホな結論に至るの?
もしかしてイベントとかを知らんのか?w
> クリティカルセクションを知ってれば
> 「イベントとかセマフォは使わんの?」なんてアホな返しはしないから
どうやったらそんなアホな結論に至るの?
もしかしてイベントとかを知らんのか?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の話題になってる。
いや、Rustには、async, await的なものがあるが、C++にはないから
C++が劣ってるなどと言う良くある間違った集団幻覚を唱える人が
後を絶たないから、C++ vs Rustの話題になってる。
977デフォルトの名無しさん
2022/01/27(木) 06:17:23.60ID:Z7vdX18s >>972
クリティカルセクションが win32api に装備されている以上、クリティカルセクションを知らない者は、もはや win32 脳ですらないのでは?
クリティカルセクションが 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)やタイマーなど管理して非同期プログラミングを支えている
昔は同期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:hWkHkx2k983デフォルトの名無しさん
2022/01/27(木) 16:37:02.13ID:4DQKoSsj ここまでディスクのコンジェスションについて言及なし
984デフォルトの名無しさん
2022/01/27(木) 16:46:02.85ID:LojT3k5n985デフォルトの名無しさん
2022/01/27(木) 16:55:46.74ID:hWkHkx2k >>984
> 効率を最大限にするために敢えて用いるOSスレッド数の上限をCPUコア数までに抑えて用いるのが現在の主流
へー
でもさ、そのOSで動いてるプロセスは、君が作ったアプリだけじゃないんだけど
上限をCPUコア数までに押さえる理由が何かあるとすれば、他のプロセスも意識する必要あるんじゃないの?
ないの?
> 効率を最大限にするために敢えて用いるOSスレッド数の上限をCPUコア数までに抑えて用いるのが現在の主流
へー
でもさ、そのOSで動いてるプロセスは、君が作ったアプリだけじゃないんだけど
上限をCPUコア数までに押さえる理由が何かあるとすれば、他のプロセスも意識する必要あるんじゃないの?
ないの?
986デフォルトの名無しさん
2022/01/27(木) 17:08:59.66ID:LojT3k5n987デフォルトの名無しさん
2022/01/27(木) 17:14:15.89ID:hWkHkx2k988デフォルトの名無しさん
2022/01/27(木) 17:35:31.13ID:rqwTLqGq 各ランタイムのデフォルトのスレッド数がどうなってるか調べれば標準的かどうか分かるんでないかね
989デフォルトの名無しさん
2022/01/27(木) 17:36:02.14ID:hWkHkx2k なんかこの人、俺用語が多くて何言ってるんだかよくわかんないんだよね
「非同期 "プロセス内スケジューラ"」の検索結果
2 件 (0.30 秒)
・・・2件?
「非同期 "プロセス内スケジューラ"」の検索結果
2 件 (0.30 秒)
・・・2件?
990デフォルトの名無しさん
2022/01/27(木) 17:36:38.66ID:cK3g3Gve991デフォルトの名無しさん
2022/01/27(木) 17:37:50.01ID:hWkHkx2k まともな奴いないのかよ
「"ランタイムのデフォルトのスレッド数"」で検索
"ランタイムのデフォルトのスレッド数"との一致はありません。
「"ランタイムのデフォルトのスレッド数"」で検索
"ランタイムのデフォルトのスレッド数"との一致はありません。
992デフォルトの名無しさん
2022/01/27(木) 17:40:14.56ID:hWkHkx2k こいつもか
「"非同期ランタイム" "スレッド数" 上限」
約 6 件 (0.32 秒)
「"非同期ランタイム" "スレッド数" 上限」
約 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:hWkHkx2k996デフォルトの名無しさん
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ならスレ民全員来月に失職
10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 43日 5時間 20分 28秒
新しいスレッドを立ててください。
life time: 43日 5時間 20分 28秒
10021002
Over 1000Thread 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
ニュース
- 中国軍機レーダー照射、トランプ氏沈黙突く 試される日本外交 ★3 [蚤の市★]
- JAが"政府の備蓄米買い上げ"見越して価格下げず!?「古いコメは食用向きでないなどと理由をつけ...」専門家解説 [煮卵★]
- トランプ大統領 エヌビディア製AI半導体の中国輸出許可 安全保障重視の方針転換 [蚤の市★]
- 【結婚の壁】結婚どころか今まで恋愛経験は一切ない人も…「年収500万の壁」を突破できない中間層の苦しい現実 [ぐれ★]
- 【広島】「万引きした人を追跡」コンビニ店員の男性(46)を果物ナイフで刺したか 中国籍の少年(17)を殺人未遂容疑で現行犯逮捕 [ぐれ★]
- 【地震】青森県で震度6強 長周期地震動も 津波注意報すべて解除 ★7 [ぐれ★] [ぐれ★]
- 【高市悲報】レーダー照射で日本が喧嘩売ってる中、アメリカ軍「我々はパールハーバーを忘れない」と日本に向けてポストへ [709039863]
- 本当の問題は高市がバカなことじゃなくて高市みたいなバカを支持するバカが大量にいることだよな [314039747]
- 高市首相「自らの命は自らが守るという原則で、行動とっていただきたい」 [256556981]
- 【悲報】おこめ券効果アンケート、全年代で「効果なし」と回答されてしまう [733893279]
- こんぺこ!こんぺこ!こんぺこ!🐰🏡
- 【悲報】超人気アイドルさん、メンエス嬢だったことがバレてクビにwwwwwwwwwwwwwwwwwwww [802034645]
