公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust
公式ドキュメント
https://www.rust-lang.org/learn
Web上の実行環境
https://play.rust-lang.org
※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/
(コミュニティによる日本語翻訳版もあります: https://doc.rust-jp.rs/book-ja/)
※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust
※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/
※次スレは原則>>980が立てること
前スレ
Rust part37
https://mevius.5ch.io/test/read.cgi/tech/1784283151/
ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.io/test/read.cgi/tech/1514107621/
Rust part38
レス数が950を超えています。1000を超えると書き込みができなくなります。
1デフォルトの名無しさん
2026/07/24(金) 20:04:25.76ID:24e2kQId893デフォルトの名無しさん
2026/09/22(火) 22:53:59.02ID:nl5zGx1z >>892
それだと非同期機構が関与してない
それだと非同期機構が関与してない
894デフォルトの名無しさん
2026/09/22(火) 23:07:56.50ID:DaZhbE7H https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=c97f4c4b1a3a952e5ac727c78bf8ffa3
なんかStreamってあったよなってヒントを与えつつローカルのQwen3.8に書かせてみたけどこんな感じでよか?
なんかStreamってあったよなってヒントを与えつつローカルのQwen3.8に書かせてみたけどこんな感じでよか?
895デフォルトの名無しさん
2026/09/22(火) 23:11:57.34ID:Sxew/Luk C++のそのco_yieldもそれだけでは非同期スケジューリングされる非同期タスクは生成されないぞ
896デフォルトの名無しさん
2026/09/22(火) 23:19:14.78ID:nl5zGx1z897デフォルトの名無しさん
2026/09/22(火) 23:19:55.91ID:LbBY0mHk898デフォルトの名無しさん
2026/09/22(火) 23:23:17.72ID:nl5zGx1z899デフォルトの名無しさん
2026/09/22(火) 23:25:09.94ID:LbBY0mHk >>893でRustのコードに対して非同期機構が関与してないと指摘してるようだが
C++のそのコードも同期のみで同じ
C++のそのコードも同期のみで同じ
900デフォルトの名無しさん
2026/09/22(火) 23:27:07.78ID:nl5zGx1z >>899
もう面倒なので自分で勉強してね
もう面倒なので自分で勉強してね
901デフォルトの名無しさん
2026/09/22(火) 23:35:38.48ID:/rwn5ZOW C++は非同期ランタイムの標準化に失敗して先送りになったままだったと思う
std::executionが決まらないとC++では無理かと
std::executionが決まらないとC++では無理かと
902デフォルトの名無しさん
2026/09/22(火) 23:38:37.68ID:nl5zGx1z903デフォルトの名無しさん
2026/09/22(火) 23:43:05.13ID:HA//Kc90 >>902
その非同期スケジューラーを使って非同期に書くといいんじゃね
その非同期スケジューラーを使って非同期に書くといいんじゃね
904デフォルトの名無しさん
2026/09/22(火) 23:43:06.40ID:dZHoI6bq コルーチンの比較ベンチで非同期かどうかは関係ないような
グリーンスレッドが標準化されてない環境だと重たくなるのはしかたない
RustはTokioがデファクトだからまああり
グリーンスレッドが標準化されてない環境だと重たくなるのはしかたない
RustはTokioがデファクトだからまああり
905デフォルトの名無しさん
2026/09/22(火) 23:48:37.89ID:nXou4Xqi ID:nl5zGx1zの書き込みを見てると非同期に書いたつもりになってるようだけど非同期になってないですよね
906デフォルトの名無しさん
2026/09/22(火) 23:49:47.31ID:nl5zGx1z >>905
だから勉強しなさいって
だから勉強しなさいって
907デフォルトの名無しさん
2026/09/22(火) 23:52:49.12ID:DaZhbE7H https://play.rust-lang.org/?version=nightly&mode=debug&edition=2024&gist=9a70f86f7c3c8f25cf743142489b882f
yieldで書きたければ今のnightlyだとこれくらいまではできるみたいね
gen {}はなんかCoroutine実装してないとか言われてだめだった…
yieldで書きたければ今のnightlyだとこれくらいまではできるみたいね
gen {}はなんかCoroutine実装してないとか言われてだめだった…
908デフォルトの名無しさん
2026/09/22(火) 23:54:46.40ID:i4Iz/fDI 単なるコルーチンだな
構成要素の一部にはなり得るけど非同期とは別
構成要素の一部にはなり得るけど非同期とは別
909デフォルトの名無しさん
2026/09/22(火) 23:55:00.59ID:nl5zGx1z910デフォルトの名無しさん
2026/09/22(火) 23:57:44.60ID:DaZhbE7H coro-prime-sieveって名前のベンチにコルーチンで実装するなとか言うバカ
911デフォルトの名無しさん
2026/09/23(水) 00:02:30.45ID:GBFdVMdM そうだよ
課題はコルーチン
ID:nl5zGx1z氏が非同期とコルーチンの区別をできなくて何度も非同期がー!と喚いているから話がややこしくなってる
課題はコルーチン
ID:nl5zGx1z氏が非同期とコルーチンの区別をできなくて何度も非同期がー!と喚いているから話がややこしくなってる
912デフォルトの名無しさん
2026/09/23(水) 00:10:01.34ID:pT5ttz8Y913デフォルトの名無しさん
2026/09/23(水) 00:23:03.04ID:+EITSibh コルーチンは非同期機構ではない
非同期機構の実装の一つとしてコルーチンが使われることもある
という程度の関係しかない
同様の関係として
イテレータの実装の一つとしてコルーチンが使われることもあるが
イテレータとコルーチンは別ものである
そして互いに相手を必須とするものではない
非同期機構とコルーチンも別ものである
そして互いに相手を必須とするものではない
非同期機構の実装の一つとしてコルーチンが使われることもある
という程度の関係しかない
同様の関係として
イテレータの実装の一つとしてコルーチンが使われることもあるが
イテレータとコルーチンは別ものである
そして互いに相手を必須とするものではない
非同期機構とコルーチンも別ものである
そして互いに相手を必須とするものではない
914デフォルトの名無しさん
2026/09/23(水) 00:32:06.17ID:tVLjKwnY915デフォルトの名無しさん
2026/09/23(水) 00:47:12.45ID:Usd75HQH Rustのジェネレータが安定化されていたらもう少しくらい話が通じたのかもしれない
916デフォルトの名無しさん
2026/09/23(水) 01:07:02.34ID:yygRtVGa >>915
Rustでyieldを使うジェネレータfeatureは状況が変わって再構築と名前が変更されてコルーチンfeatureになったよ
いずれにせよ非同期は直接関係なくてRustでもコルーチンはasyncではない普通の関数
Rustでyieldを使うジェネレータfeatureは状況が変わって再構築と名前が変更されてコルーチンfeatureになったよ
いずれにせよ非同期は直接関係なくてRustでもコルーチンはasyncではない普通の関数
917デフォルトの名無しさん
2026/09/23(水) 10:30:26.23ID:gAiAo47r RustよりもC++よりテクニカルライティングよりも会話を勉強したほうがいい
918デフォルトの名無しさん
2026/09/23(水) 11:13:32.24ID:j0wiXFqS >>869>>870
草w草wおじ草w
Rustでグローバル変数と言えばstatic変数のこと
現代の言語はCのようにグローバルスコープの変数を直接定義できないから
Rustに限らず多くの言語でモジュール/ファイル/パッケージレベルでグローバルな変数を
単にグローバル変数と呼ぶようになってきてる
C言語時代の古臭い脳にそろそろパッチあてたほうがいいんじゃないかな
草w草wおじ草w
Rustでグローバル変数と言えばstatic変数のこと
現代の言語はCのようにグローバルスコープの変数を直接定義できないから
Rustに限らず多くの言語でモジュール/ファイル/パッケージレベルでグローバルな変数を
単にグローバル変数と呼ぶようになってきてる
C言語時代の古臭い脳にそろそろパッチあてたほうがいいんじゃないかな
919デフォルトの名無しさん
2026/09/23(水) 11:57:30.22ID:O23FWCkR >>918
いやRustでもグローバルな可視性を持つ変数とプログラム全体にわたるライフタイムを持つ変数は区別するよ
最近の言語でグローバル変数というとそのどちらも十分条件ではなくて、
pub staticやシングルトンのように実質的にグローバル変数のように使用できるもの全般を指すケースが多いと思う
特定の概念を指すというよりユースケースを指す言葉だね
いやRustでもグローバルな可視性を持つ変数とプログラム全体にわたるライフタイムを持つ変数は区別するよ
最近の言語でグローバル変数というとそのどちらも十分条件ではなくて、
pub staticやシングルトンのように実質的にグローバル変数のように使用できるもの全般を指すケースが多いと思う
特定の概念を指すというよりユースケースを指す言葉だね
920デフォルトの名無しさん
2026/09/23(水) 12:20:09.97ID:laP2ONXr >>919
In Rust, global variables are called static variables.
https://doc.rust-lang.org/book/ch20-01-unsafe-rust.html
static: Global variable or lifetime lasting the entire program execution.
https://doc.rust-lang.org/book/appendix-01-keywords.html
2つ目の説明の前者はstatic変数(=グローバル変数)のこと
後者は'staticライフタイムのこと
In Rust, global variables are called static variables.
https://doc.rust-lang.org/book/ch20-01-unsafe-rust.html
static: Global variable or lifetime lasting the entire program execution.
https://doc.rust-lang.org/book/appendix-01-keywords.html
2つ目の説明の前者はstatic変数(=グローバル変数)のこと
後者は'staticライフタイムのこと
921デフォルトの名無しさん
2026/09/23(水) 12:39:07.94ID:Usd75HQH ほな「static変数はグローバル変数ではありません」やないやないか
922デフォルトの名無しさん
2026/09/23(水) 12:54:47.65ID:olFgQEki > Rust considers mutable static variables to be unsafe.
> Where possible, it’s preferable to use the concurrency techniques and thread-safe smart pointers
世間的なグローバル変数はつかうなとあるのに話するのも無駄
記憶から消してほかのことに頭をつかおう
> Where possible, it’s preferable to use the concurrency techniques and thread-safe smart pointers
世間的なグローバル変数はつかうなとあるのに話するのも無駄
記憶から消してほかのことに頭をつかおう
923デフォルトの名無しさん
2026/09/23(水) 13:04:29.88ID:3nmH0iW1 >>920
英語が読めないの?
グローバル変数はRustではstatic変数と呼ばれるだけだよ
static変数全てがグローバル変数というわけではない
明確にするために集合で表すと「static変数⊃グローバル変数」
例えば関数内のstatic変数をグローバル変数と呼びません
static変数 ≠ グローバル変数 です
英語が読めないの?
グローバル変数はRustではstatic変数と呼ばれるだけだよ
static変数全てがグローバル変数というわけではない
明確にするために集合で表すと「static変数⊃グローバル変数」
例えば関数内のstatic変数をグローバル変数と呼びません
static変数 ≠ グローバル変数 です
924デフォルトの名無しさん
2026/09/23(水) 13:23:31.19ID:Usd75HQH bookの作者の人そこまで考えてないと思うよ
925デフォルトの名無しさん
2026/09/23(水) 13:24:51.22ID:9dxFRbkH static変数のうちpubが付いてるものはパスさえ分かればアクセスできるからグローバル変数と呼んでもいいけど
static変数の多くは関数内やモジュール内に閉じてる用法
static変数とグローバル変数は別物ですね
static変数の多くは関数内やモジュール内に閉じてる用法
static変数とグローバル変数は別物ですね
926デフォルトの名無しさん
2026/09/23(水) 14:08:18.38ID:ojUAHerQ927デフォルトの名無しさん
2026/09/23(水) 14:43:26.21ID:v9gmYAQz お爺ちゃんたち必死過ぎて草w
現実を直視する脳細胞が死んでるww
現実を直視する脳細胞が死んでるww
928デフォルトの名無しさん
2026/09/23(水) 15:42:14.17ID:zelG5bBH 同じ構造体の自己参照で'static偽装したことはあるな
struct Foo {
full: String,
part: &'static str // -> &self.full[range]
}
外に見せる時に&'a selfの'aで抑えれば問題ないけど
誰か(AI)が間違って&'staticで公開するリスクがあるから
今だとアンチパターンか
struct Foo {
full: String,
part: &'static str // -> &self.full[range]
}
外に見せる時に&'a selfの'aで抑えれば問題ないけど
誰か(AI)が間違って&'staticで公開するリスクがあるから
今だとアンチパターンか
929デフォルトの名無しさん
2026/09/23(水) 16:06:11.14ID:p1eWgEr/ >>907
そのresume()周りのごちゃごちゃしてる部分
既存のメソッド二つnext(), into_iter()定義したらシンプルになったよ
既存の関数名変数名などはそのまま
type Gen<T> = Pin<Box<dyn Coroutine<(), Yield = T, Return = ()>>>;
fn prime_generator() -> Gen<usize> {
Box::pin(#[coroutine] || {
let mut g = generate();
while let Some(prime) = g.next() {
yield prime;
g = filter(g, prime);
}
})
}
fn generate() -> Gen<usize> {
Box::pin(#[coroutine] || {
for i in 2.. {
yield i;
}
})
}
fn filter(g: Gen<usize>, prime: usize) -> Gen<usize> {
Box::pin(#[coroutine] move || {
for i in g.into_iter() {
if i % prime != 0 { yield i; }
}
})
}
そのresume()周りのごちゃごちゃしてる部分
既存のメソッド二つnext(), into_iter()定義したらシンプルになったよ
既存の関数名変数名などはそのまま
type Gen<T> = Pin<Box<dyn Coroutine<(), Yield = T, Return = ()>>>;
fn prime_generator() -> Gen<usize> {
Box::pin(#[coroutine] || {
let mut g = generate();
while let Some(prime) = g.next() {
yield prime;
g = filter(g, prime);
}
})
}
fn generate() -> Gen<usize> {
Box::pin(#[coroutine] || {
for i in 2.. {
yield i;
}
})
}
fn filter(g: Gen<usize>, prime: usize) -> Gen<usize> {
Box::pin(#[coroutine] move || {
for i in g.into_iter() {
if i % prime != 0 { yield i; }
}
})
}
930デフォルトの名無しさん
2026/09/23(水) 16:45:30.26ID:Usd75HQH >>928
うっかりムーブしちゃうと壊れるというのもあるのでpinを使うのじゃ
https://doc.rust-lang.org/std/pin/index.html
https://tech-blog.optim.co.jp/entry/2020/03/05/160000
うっかりムーブしちゃうと壊れるというのもあるのでpinを使うのじゃ
https://doc.rust-lang.org/std/pin/index.html
https://tech-blog.optim.co.jp/entry/2020/03/05/160000
931デフォルトの名無しさん
2026/09/23(水) 16:59:35.09ID:p1eWgEr/ >>929 メソッド定義と残り
#![feature(coroutines, coroutine_trait, yield_expr)]
use std::ops::{Coroutine, CoroutineState};
use std::pin::Pin;
// due to orphan rule
trait CoroutineExt: Coroutine<(), Return = ()> + Unpin + Sized {
fn into_iter(mut self) -> impl Iterator<Item = Self::Yield> {
std::iter::from_fn(move || self.next())
}
fn next(&mut self) -> Option<Self::Yield> {
match Pin::new(self).resume(()) {
CoroutineState::Yielded(n) => Some(n),
_ => None,
}
}
}
impl<C: Coroutine<(), Return = ()> + Unpin + Sized> CoroutineExt for C {}
fn main() {
let n = std::env::args_os()
.nth(1)
.and_then(|s| s.into_string().ok())
.and_then(|s| s.parse().ok())
.unwrap_or(100);
for prime in prime_generator().into_iter().take(n) {
print!("{prime} ");
}
println!();
}
#![feature(coroutines, coroutine_trait, yield_expr)]
use std::ops::{Coroutine, CoroutineState};
use std::pin::Pin;
// due to orphan rule
trait CoroutineExt: Coroutine<(), Return = ()> + Unpin + Sized {
fn into_iter(mut self) -> impl Iterator<Item = Self::Yield> {
std::iter::from_fn(move || self.next())
}
fn next(&mut self) -> Option<Self::Yield> {
match Pin::new(self).resume(()) {
CoroutineState::Yielded(n) => Some(n),
_ => None,
}
}
}
impl<C: Coroutine<(), Return = ()> + Unpin + Sized> CoroutineExt for C {}
fn main() {
let n = std::env::args_os()
.nth(1)
.and_then(|s| s.into_string().ok())
.and_then(|s| s.parse().ok())
.unwrap_or(100);
for prime in prime_generator().into_iter().take(n) {
print!("{prime} ");
}
println!();
}
932デフォルトの名無しさん
2026/09/23(水) 21:30:11.15ID:p1eWgEr/ このアルゴリズムだとn個の素数を求めるためにそれ以前のn-1個の素数で割っていくコルーチンが同期的に次々と並行に走るから
そのためのBoxもn-1個確保されてそのメモリ上で各コルーチンが動くことになるね
そのためのBoxもn-1個確保されてそのメモリ上で各コルーチンが動くことになるね
933デフォルトの名無しさん
2026/09/23(水) 22:01:17.21ID:YqaKhsFb Rustってクソめんどくさいんだね
934デフォルトの名無しさん
2026/09/23(水) 22:02:29.76ID:tU27HCH7 どこが面倒くさい?
935デフォルトの名無しさん
2026/09/23(水) 22:25:00.98ID:p1eWgEr/ このアルゴリズムは2で割るコルーチン、3で割るコルーチン、5で割るコルーチン、…とマトリョーシカのように入れ子状にコルーチンが増えていく
どの言語でも陽に暗に次々と各コルーチンのためのメモリを確保していきながら動作する点は同じではないかと思われる
どの言語でも陽に暗に次々と各コルーチンのためのメモリを確保していきながら動作する点は同じではないかと思われる
936デフォルトの名無しさん
2026/09/23(水) 22:32:59.48ID:p1eWgEr/ Rustはスタック以外にメモリを確保するなら明示的に書くことでコードを明瞭化させる方針の言語
プログラム>>929でRust固有な部分はBox::pinでメモリを確保するところ
その内側のコルーチン記述は他の言語と同じ
プログラム>>929でRust固有な部分はBox::pinでメモリを確保するところ
その内側のコルーチン記述は他の言語と同じ
937デフォルトの名無しさん
2026/09/23(水) 23:05:16.58ID:h0nxR6zJ 素数10000個求めたいなら9999個のコルーチンが入れ子になって動くんだろ
遊びや実験ならともかく現実問題としては悪手なコード
遊びや実験ならともかく現実問題としては悪手なコード
938デフォルトの名無しさん
2026/09/23(水) 23:14:28.87ID:JQawscX8939デフォルトの名無しさん
2026/09/23(水) 23:19:23.52ID:Usd75HQH Rustで書き直されてやっと理解できたからって1日遅れで急に仕切り出したぞ
940デフォルトの名無しさん
2026/09/23(水) 23:20:11.22ID:eCJ10viG トイプログラム好きだな
941デフォルトの名無しさん
2026/09/23(水) 23:22:32.17ID:SKOtO2VA 面倒ってBoxでくるむだけだろ
942デフォルトの名無しさん
2026/09/23(水) 23:46:57.88ID:p1eWgEr/ Boxが必要になるのは入れ子になる時や異なる型を同じ扱いにするためdynを使う時のみだよ
そうでない普通のコルーチン返すならこれだけ
fn count_up() -> impl Coroutine<Yield = usize> {
let mut counter = 0;
#[coroutine] move || {
loop {
yield counter;
counter += 1;
}
}
}
そうでない普通のコルーチン返すならこれだけ
fn count_up() -> impl Coroutine<Yield = usize> {
let mut counter = 0;
#[coroutine] move || {
loop {
yield counter;
counter += 1;
}
}
}
943デフォルトの名無しさん
2026/09/23(水) 23:58:53.86ID:p1eWgEr/ 中身はコルーチンそのままでコルーチンであることを露出させずにイテレータとして見せる時はこう書けば動くね
#![feature(gen_blocks)]
fn count_up() -> impl Iterator<Item = usize> {
let mut counter = 0;
gen move {
loop {
yield counter;
counter += 1;
}
}
}
#![feature(gen_blocks)]
fn count_up() -> impl Iterator<Item = usize> {
let mut counter = 0;
gen move {
loop {
yield counter;
counter += 1;
}
}
}
944デフォルトの名無しさん
2026/09/24(木) 01:23:44.57ID:LHcl3oiz 中でローカル変数の参照が保持されるならアドレス固定(pin)必須では
実行時のスタック位置が不定になるのは非同期と一緒でしょ
実行時のスタック位置が不定になるのは非同期と一緒でしょ
945デフォルトの名無しさん
2026/09/24(木) 02:54:57.22ID:R69CFsX0946デフォルトの名無しさん
2026/09/24(木) 03:22:52.92ID:t+PtJvb3 んわけあるかw
947デフォルトの名無しさん
2026/09/24(木) 06:12:19.77ID:LNll9yPz coroutineをstaticにすることで解決できる
困ったときはstatic
困ったときはstatic
948デフォルトの名無しさん
2026/09/24(木) 12:23:37.08ID:W+Ki5+Za &'static str なんて定数なんだからグローバル変数などと呼ぶな
949デフォルトの名無しさん
2026/09/24(木) 12:31:00.85ID:LqB172fI 定数ではなく実行時に決まる値をstatic変数に格納すると&'static参照を得られるというRustの基本の話だろ
950デフォルトの名無しさん
2026/09/24(木) 12:35:53.06ID:g4g++t5G staticおじさんとバカにされるから &'static は使わない方がいい
951デフォルトの名無しさん
2026/09/24(木) 12:45:17.36ID:0FopOT7u プログラム終了まで変化しない値はstatic変数に入れるのが最善策
ファイルから読み出すデータであっても通信で得られる値であっても計算で算出される値であっても同じ
ファイルから読み出すデータであっても通信で得られる値であっても計算で算出される値であっても同じ
952デフォルトの名無しさん
2026/09/24(木) 12:53:47.13ID:UBCFj8UU953デフォルトの名無しさん
2026/09/24(木) 15:07:51.81ID:F20bNgyq >>928
struct Foo<'a> {
full: &'a String,
part: &'a str // &self.full[..]
}
これでも面倒じゃないし大して違わんと思う
なぜ敢えて &'static str 使いたがるのか
struct Foo<'a> {
full: &'a String,
part: &'a str // &self.full[..]
}
これでも面倒じゃないし大して違わんと思う
なぜ敢えて &'static str 使いたがるのか
954デフォルトの名無しさん
2026/09/24(木) 15:44:26.32ID:hOmIiEqo そもそもasyncやコルーチンってまだ必要なのかねえ
今はまだAIのRLHFの過程で人間にとって分かりやすいコードを書くように教育されてるけど、その重要性は人間がコードを見なくなるにつれて確実に下がっていくわけで、
いずれそういう頭悪い人間のための補助器具的な機能は全く使われなくなりそうだ
今はまだAIのRLHFの過程で人間にとって分かりやすいコードを書くように教育されてるけど、その重要性は人間がコードを見なくなるにつれて確実に下がっていくわけで、
いずれそういう頭悪い人間のための補助器具的な機能は全く使われなくなりそうだ
955デフォルトの名無しさん
2026/09/24(木) 16:32:23.32ID:kE4lFg9x 分かり易さというのは主に複雑さを抑えることだ。
それは AI にとっても有利な条件になりうる。
(変数名の付け方なんかは人間固有の性質かもしれんが。)
複雑さを抑える方法論を全く無視したら必要な計算量が一気に爆発して手に負えないよ。
計算量の爆発ってのは百倍とか万倍とかいうレベルじゃなくて無量大数倍とかそれよりもっとのレベルで差が出たりする。
(だから巨大なシステムを AI ならたとえばアセンブラで余裕で作れるってわけではない。)
もちろん人間向けが AI 向けに常に有用なわけじゃないだろうけど分かり易くするという指針は AI 向けにも意味がある。
それは AI にとっても有利な条件になりうる。
(変数名の付け方なんかは人間固有の性質かもしれんが。)
複雑さを抑える方法論を全く無視したら必要な計算量が一気に爆発して手に負えないよ。
計算量の爆発ってのは百倍とか万倍とかいうレベルじゃなくて無量大数倍とかそれよりもっとのレベルで差が出たりする。
(だから巨大なシステムを AI ならたとえばアセンブラで余裕で作れるってわけではない。)
もちろん人間向けが AI 向けに常に有用なわけじゃないだろうけど分かり易くするという指針は AI 向けにも意味がある。
956デフォルトの名無しさん
2026/09/24(木) 17:48:38.53ID:WPDA7dcV >>954
直バイナリ論者ですか?
直バイナリ論者ですか?
957デフォルトの名無しさん
2026/09/24(木) 18:10:22.84ID:cfDvkPR6 railsの偉い人が、もうAIにRust書かせればええやんと発言したらしいな
958デフォルトの名無しさん
2026/09/24(木) 19:24:10.63ID:XT9+idok Rustで修行した結果一周回って安全にCもC++もunsafe Rustも書けるようになった
そう言える境地を目指したい
そう言える境地を目指したい
959デフォルトの名無しさん
2026/09/24(木) 19:30:30.09ID:CIaIJhOO 割と好き、遠回りする人
近くに環境設定職人とかがいると助かるし
近くに環境設定職人とかがいると助かるし
960デフォルトの名無しさん
2026/09/24(木) 19:59:22.66ID:kE4lFg9x 人はわかってても間違うものなので理解できたら安全に書けるというものではない。
もちろん目指す自由はあるし目指す過程で身に付くことは無駄ではないだろうけどさ。
もちろん目指す自由はあるし目指す過程で身に付くことは無駄ではないだろうけどさ。
961デフォルトの名無しさん
2026/09/24(木) 21:31:56.17ID:1vuznb8V >>954
asyncが何かもわかっていなさそうだな
asyncが何かもわかっていなさそうだな
962デフォルトの名無しさん
2026/09/24(木) 21:43:58.61ID:DmkfGnEv963デフォルトの名無しさん
2026/09/24(木) 22:01:14.20ID:bOwxTNbA 下のcoro_fibが実行時にシングルスレッド非同期スケーリングやマルチスレッドスケーリングが発動するかは
Task<T>の実装しだいなのであって、コルーチンと言う機構を用いて「非同期」を抽象化しているのよ
Task<size_t> coro_fib(size_t n) {
if (n < 2) co_return 1;
co_return co_await coro_fib(n - 2) + co_await coro_fib(n - 1);
}
こう書いたら実行も再帰コールになるけど
size_t fib(size_t n) {
if (n < 2) return 1;
return fib(n - 2) + fib(n - 1);
}
coro_fibの方はTaskの実装次第でシングルループ化させることが出来るわけよ
Task<T>の実装しだいなのであって、コルーチンと言う機構を用いて「非同期」を抽象化しているのよ
Task<size_t> coro_fib(size_t n) {
if (n < 2) co_return 1;
co_return co_await coro_fib(n - 2) + co_await coro_fib(n - 1);
}
こう書いたら実行も再帰コールになるけど
size_t fib(size_t n) {
if (n < 2) return 1;
return fib(n - 2) + fib(n - 1);
}
coro_fibの方はTaskの実装次第でシングルループ化させることが出来るわけよ
964デフォルトの名無しさん
2026/09/24(木) 22:04:06.10ID:ZSFNfhd0965デフォルトの名無しさん
2026/09/24(木) 22:08:06.04ID:GuSMxCg9966デフォルトの名無しさん
2026/09/24(木) 22:17:25.97ID:Mi6Yp/2I コルーチンはサブルーチンと対になる位置づけ
サブルーチンが毎回最初から実行するのに対して
コルーチンは前回戻った地点から実行するそれだけの違い
どちらも普通のものは同期的に実行される
サブルーチンが毎回最初から実行するのに対して
コルーチンは前回戻った地点から実行するそれだけの違い
どちらも普通のものは同期的に実行される
967デフォルトの名無しさん
2026/09/24(木) 22:22:14.12ID:bOwxTNbA 昔話をされても困るな
少なくともC++20以降の視点が無いとね
co_await resume_background();
(ここはスレッドプールで実行)
co_await resume_foreground(..);
(ここはメインスレッドで実行)
少なくともC++20以降の視点が無いとね
co_await resume_background();
(ここはスレッドプールで実行)
co_await resume_foreground(..);
(ここはメインスレッドで実行)
968デフォルトの名無しさん
2026/09/24(木) 22:30:50.25ID:tuxkN518 それはC++という変わった変な言語の混乱
一般的なコルーチンの話がなされている場で邪道なものを持ち出すのは愚かとしか言いようがない
一般的なコルーチンの話がなされている場で邪道なものを持ち出すのは愚かとしか言いようがない
969デフォルトの名無しさん
2026/09/24(木) 22:35:34.58ID:bOwxTNbA 言語毎の違い包括して元素還元したのがC++20
970デフォルトの名無しさん
2026/09/24(木) 22:36:25.48ID:sZV5pNkP971デフォルトの名無しさん
2026/09/24(木) 22:41:14.95ID:bOwxTNbA こう言う>>966 表素的な把握だとyieldとawaitが不可分だとは想像できないかも
972デフォルトの名無しさん
2026/09/24(木) 22:48:25.18ID:8PK738S5 >>971
それはレイヤーが全く異なる
Rustでは非同期関数の内部実装としてスタックレス・コルーチンが使われているが
階層が異なるため内部実装にすぎないコルーチンが直接露出することはない
きちんと区別されている
それはレイヤーが全く異なる
Rustでは非同期関数の内部実装としてスタックレス・コルーチンが使われているが
階層が異なるため内部実装にすぎないコルーチンが直接露出することはない
きちんと区別されている
973デフォルトの名無しさん
2026/09/24(木) 22:57:16.07ID:bOwxTNbA どの言語でも、とは...
974デフォルトの名無しさん
2026/09/24(木) 23:06:36.40ID:bOwxTNbA 少なくとも現状の主要言語で
suspend可能ポイントでsuspendするかしないか
suspendしたらなにをするか
resumeしたらなにをするか
yieldで戻り値を受け取る仕組み( new_input_from_caller = co_yield value )
これらを制御出来るのはC++しかないわけで良い学習になると思うよ
suspend可能ポイントでsuspendするかしないか
suspendしたらなにをするか
resumeしたらなにをするか
yieldで戻り値を受け取る仕組み( new_input_from_caller = co_yield value )
これらを制御出来るのはC++しかないわけで良い学習になると思うよ
975デフォルトの名無しさん
2026/09/24(木) 23:16:49.81ID:pH7KZ+VO >>929とかのコードは途中でsuspendする必要全然ないから同じアルゴリズムでもコルーチン使わないイテレータ版で十分
976デフォルトの名無しさん
2026/09/24(木) 23:27:27.51ID:8iK3IjqY977デフォルトの名無しさん
2026/09/24(木) 23:48:40.03ID:YddBzynh >>975
イテレータとの折衷案はいかが
一応coro-prime-sieveと書かれているから
yieldを使うコルーチンを使って
篩法で実装されていればいいと解釈すると
これがシンプルでよいかと
fn prime_generator() -> impl Iterator<Item = usize> {
gen {
let mut primes = Vec::new();
for i in 2.. {
if primes.iter().all(|&prime| i % prime != 0) {
primes.push(i);
yield i;
}
}
}
}
イテレータとの折衷案はいかが
一応coro-prime-sieveと書かれているから
yieldを使うコルーチンを使って
篩法で実装されていればいいと解釈すると
これがシンプルでよいかと
fn prime_generator() -> impl Iterator<Item = usize> {
gen {
let mut primes = Vec::new();
for i in 2.. {
if primes.iter().all(|&prime| i % prime != 0) {
primes.push(i);
yield i;
}
}
}
}
978デフォルトの名無しさん
2026/09/24(木) 23:52:54.34ID:bOwxTNbA979デフォルトの名無しさん
2026/09/25(金) 00:00:41.38ID:XiQqzC/u >>978
Goってこれかい?
https://github.com/hanabi1224/Programming-Language-Benchmarks/blob/main/bench/algorithm/coro-prime-sieve/1.go
チャネル通信を使っていて本来のコルーチンから大きく逸脱しているような
Goってこれかい?
https://github.com/hanabi1224/Programming-Language-Benchmarks/blob/main/bench/algorithm/coro-prime-sieve/1.go
チャネル通信を使っていて本来のコルーチンから大きく逸脱しているような
980デフォルトの名無しさん
2026/09/25(金) 00:03:44.75ID:6QEnbgiE チャネル使わないと却下だったら最初の書き味がどうとかいう問題提起は何だったんだんだよw
981デフォルトの名無しさん
2026/09/25(金) 00:13:33.47ID:XiQqzC/u982デフォルトの名無しさん
2026/09/25(金) 00:14:29.90ID:HYpG20BO 書き方間違えた
原型のGoが各素数に付き一つのゴールーチンを割り当てているから却下かと
原型のGoが各素数に付き一つのゴールーチンを割り当てているから却下かと
983デフォルトの名無しさん
2026/09/25(金) 00:19:36.77ID:6QEnbgiE それならまあはい
984デフォルトの名無しさん
2026/09/25(金) 00:21:53.77ID:9fX7qPMO 性能面が悪化しても読みやすくなるとかアルゴリズムがシンプルになるとか何かメリットがあるならまだいいがデメリットしかないやり方をあーだこーだいっても時間の無駄じゃね?
何がそんなにうれしいの?
何がそんなにうれしいの?
985デフォルトの名無しさん
2026/09/25(金) 00:29:25.84ID:6QEnbgiE 引くに引けなくなっちゃったんでしょ
986デフォルトの名無しさん
2026/09/25(金) 00:34:27.08ID:HYpG20BO このベンチはコルーチンを使う事での性能劣化やそれを緩和する最適化を見る為かと
劣化がゼロなんてことは無いよ
.net10のruntime asyncもその辺の最適化かと
劣化がゼロなんてことは無いよ
.net10のruntime asyncもその辺の最適化かと
987デフォルトの名無しさん
2026/09/25(金) 00:36:42.45ID:a68xiBXa このスレ、こんなのばっかだな
988デフォルトの名無しさん
2026/09/25(金) 00:37:52.42ID:TSMdoI71 >>947
それマジでコンパイル通らないコルーチンにstatic指定したらコンパイル通るようになった
参照&aがyieldまたぎして使われてるこれ
static指定なしだとコンパイルエラー
static指定ありだとコンパイル通る
fn foo() -> impl Coroutine<Yield = ()> {
#[coroutine] static || {
let a = 123;
let pa = &a;
yield ();
if *pa == 123 {
yield ();
}
}
}
それマジでコンパイル通らないコルーチンにstatic指定したらコンパイル通るようになった
参照&aがyieldまたぎして使われてるこれ
static指定なしだとコンパイルエラー
static指定ありだとコンパイル通る
fn foo() -> impl Coroutine<Yield = ()> {
#[coroutine] static || {
let a = 123;
let pa = &a;
yield ();
if *pa == 123 {
yield ();
}
}
}
989sage
2026/09/25(金) 01:39:36.08ID:HWQunSxT990980
2026/09/25(金) 01:43:53.65ID:6QEnbgiE 何勝手に立ててんの? なんでID全部違うの?
991デフォルトの名無しさん
2026/09/25(金) 02:03:58.64ID:IvpgLRRa >>988
全ての正解はstaticに通じる
全ての正解はstaticに通じる
992デフォルトの名無しさん
2026/09/25(金) 02:38:46.72ID:9+eTuYed >>1
>(コミュニティによる日本語翻訳版もあります: https://doc.rust-jp.rs/book-ja/)
(コミュニティによる日本語翻訳版もありますがもう更新されていませんので日本語が必要なら公式版をAI翻訳して読むことをお勧めします: https://doc.rust-jp.rs/book-ja/)
次スレから↑これな
>(コミュニティによる日本語翻訳版もあります: https://doc.rust-jp.rs/book-ja/)
(コミュニティによる日本語翻訳版もありますがもう更新されていませんので日本語が必要なら公式版をAI翻訳して読むことをお勧めします: https://doc.rust-jp.rs/book-ja/)
次スレから↑これな
レス数が950を超えています。1000を超えると書き込みができなくなります。
ニュース
- ロシア外相 「日本とドイツは軍国主義」 国連で声明 ★2 [お断り★]
- 【自動車】なんて恐ろしい契約を…「残クレ」で念願のアルファードを手に入れた年収600万円・45歳サラリーマンの末路 ★2 [ぐれ★]
- 女優が「ネトウヨ」について私見「『淋しい方』なのだと理解いたしました」 (沢海陽子) ★2 [少考さん★]
- 【サッカー】森保一監督が堂安律と塩貝健人の確執を否定「選手自身が傷つくことになっている」 報道陣に異例の要望 [ニーニーφ★]
- 高市早苗首相「…私のリーダーシップのおかげ」日米首脳会談での“自画自賛”発言に「傲慢な台詞」国民ドン引き ★2 [少考さん★]
- 相次ぐ代替コーヒー飲料 コーヒーのような味わい楽しめる商品で“需要喚起” 背景に世界の「コーヒー2050年問題」 [煮卵★]
- 【実況】博衣こよりのえちえちねぽっくす-Day5-🧪
- 亜月ねね先生、ガチでピンチwwwwwwwwwwwwwwwwwwwwwww [398059782]
- ツイッター「目の前でjkがガム吐き捨てたんだけど、しかも青リンゴ味」 [114588277]
- トランプさん「2ヶ月連続で利上げしろ、円安は許されない」日米首脳会談で高市に命令してた [709039863]
- 恋愛のプロ「女性に“トイレ大丈夫?”って聞かれた時の答えで、三流の男かどうか分かります。」 [592058334]
- 『サクラ大戦』30周年。 『サクラ大戦』の思い出 [303493227]