スレタイ以外の言語もok
前スレ
https://mevius.5ch.net/test/read.cgi/tech/1655771266/
次世代言語27 TypeScript Swift Go Kotlin Rust Nim
■ このスレッドは過去ログ倉庫に格納されています
2022/08/05(金) 08:26:38.87ID:TpiqaUBm
702デフォルトの名無しさん
2022/08/20(土) 04:00:19.70ID:fWT+hW9e >>700
コンパイル時にIOエラーに対処せよなんて話はしてないよ
そもそもコンパイル時にwrite(2)が呼び出されないんだからそのエラーに対処できるはずもない
drop内でエラーが発生しても検知できないから、dropの前にflushなどの呼び出しを強制できないの?という話
コンパイル時にIOエラーに対処せよなんて話はしてないよ
そもそもコンパイル時にwrite(2)が呼び出されないんだからそのエラーに対処できるはずもない
drop内でエラーが発生しても検知できないから、dropの前にflushなどの呼び出しを強制できないの?という話
703デフォルトの名無しさん
2022/08/20(土) 05:07:56.91ID:O8Vd08Ya704デフォルトの名無しさん
2022/08/20(土) 07:41:29.18ID:Z3gHF10K 論理的にモノを考えられるヤツは4回も打たない
705デフォルトの名無しさん
2022/08/20(土) 09:18:15.53ID:LHlXjeki 医療従事者とか高齢者施設従業員とか正規の4回目来てるんですよ
706デフォルトの名無しさん
2022/08/20(土) 10:31:20.74ID:s9pWuoyY >>701
>そういうことではなくて、drop内でエラーが起きた場合の話を気にしている
わかってるよ
drop前に確実にflushが呼ばれるようにしてflushした場合のエラーをハンドリングしたいなら
context managerを自作するのがいいって話
buffer.len()をチェックしてcompile_error!でエラーにするようなAPIも作れなくは無いかもしれないけど
それをやる場合にもBufWriterへの一連操作をラップしたcontext manager的なのを作ることになるので
エラーにするんじゃなくてflushしてあげたほうが親切
>そういうことではなくて、drop内でエラーが起きた場合の話を気にしている
わかってるよ
drop前に確実にflushが呼ばれるようにしてflushした場合のエラーをハンドリングしたいなら
context managerを自作するのがいいって話
buffer.len()をチェックしてcompile_error!でエラーにするようなAPIも作れなくは無いかもしれないけど
それをやる場合にもBufWriterへの一連操作をラップしたcontext manager的なのを作ることになるので
エラーにするんじゃなくてflushしてあげたほうが親切
707デフォルトの名無しさん
2022/08/20(土) 11:15:29.57ID:U3OCGo2f なにこれ
ワクチン接種証明書の例え話が役に立つという寓話なのか
fn hoge(&mut self) -> flush証明書 {
flush証明書::new(self.file)
}
ワクチン接種証明書の例え話が役に立つという寓話なのか
fn hoge(&mut self) -> flush証明書 {
flush証明書::new(self.file)
}
708デフォルトの名無しさん
2022/08/20(土) 14:05:39.10ID:icDL1eXq709デフォルトの名無しさん
2022/08/20(土) 14:47:10.43ID:fWT+hW9e >>706
context managerを知らないんだけど、pythonの用語で合っているかな?
スコープの入り口と出口に処理を差し込むようなものに見えたけど、こんな関数を用意するようなイメージ?
fn with_file(f: impl FnOnce(&mut File) -> io::Result<T>) -> io::Result<T> {
let file = File::create(...)?;
let res = f(&mut file)?;
file.flush()?
Ok(res)
}
確かにこれで解決するケースも多いね
context managerを知らないんだけど、pythonの用語で合っているかな?
スコープの入り口と出口に処理を差し込むようなものに見えたけど、こんな関数を用意するようなイメージ?
fn with_file(f: impl FnOnce(&mut File) -> io::Result<T>) -> io::Result<T> {
let file = File::create(...)?;
let res = f(&mut file)?;
file.flush()?
Ok(res)
}
確かにこれで解決するケースも多いね
710デフォルトの名無しさん
2022/08/20(土) 15:11:47.48ID:icDL1eXq >>709
そういう単純な対応は他言語含めてよくあるパターンだが狭い範囲しかカバーできない欠点がある
例えば複数のファイルなどを順序前後して扱うと破綻
その観点の専用クロージャとなっているためそれ以外からの処理を巻き込みたい時にも破綻
ファイルディスクリプタを保持して戻りいつ解放かすぐ決定しない場合も破綻
並行並列化する時も破綻
そういう単純な対応は他言語含めてよくあるパターンだが狭い範囲しかカバーできない欠点がある
例えば複数のファイルなどを順序前後して扱うと破綻
その観点の専用クロージャとなっているためそれ以外からの処理を巻き込みたい時にも破綻
ファイルディスクリプタを保持して戻りいつ解放かすぐ決定しない場合も破綻
並行並列化する時も破綻
711デフォルトの名無しさん
2022/08/20(土) 15:25:13.28ID:45hIb17g >>709
こういっては失礼かもしれないけど、なんて汚い実装だ....
こういっては失礼かもしれないけど、なんて汚い実装だ....
712デフォルトの名無しさん
2022/08/20(土) 15:32:14.61ID:fWT+hW9e713デフォルトの名無しさん
2022/08/20(土) 16:19:57.30ID:v+6xr1g0 >>712
Rustスレで半年前に出ている以下のアプローチはどう?
他の言語では無理だけどRustならば所有権の行方を静的に解析してコンパイラが持っているため
https://mevius.5ch.net/test/read.cgi/tech/1636247099/700
> コンパイラは解析してdropさせるべき位置を把握しているから
> そこへ至る全ての経路上で例えばFinalize trait実装型はそのメソッドfinalize()を呼んでいないとコンパイルエラーとなる
> というような制約をするFinalize trait
Rustスレで半年前に出ている以下のアプローチはどう?
他の言語では無理だけどRustならば所有権の行方を静的に解析してコンパイラが持っているため
https://mevius.5ch.net/test/read.cgi/tech/1636247099/700
> コンパイラは解析してdropさせるべき位置を把握しているから
> そこへ至る全ての経路上で例えばFinalize trait実装型はそのメソッドfinalize()を呼んでいないとコンパイルエラーとなる
> というような制約をするFinalize trait
714デフォルトの名無しさん
2022/08/20(土) 16:55:09.50ID:fWT+hW9e715デフォルトの名無しさん
2022/08/20(土) 18:48:46.98ID:s9pWuoyY >>709
そう、そういうイメージ
FileManager的なstructを定義してnewするときに内部でFile::createして持っておいて
withでクロージャを受け取るようにするとネストしたりしやすい気がする
buffer.len()とcompile_error!マクロでどうにかする方法は無理そうだった
あとは明示的flush未実行の型と実行済みの型とをそれぞれ作って
一連のI/O処理の戻り値をflush実行済みの型にしておくことで
flush忘れたらコンパイルエラーにするという方法ならできそう
面倒くさいけど
そう、そういうイメージ
FileManager的なstructを定義してnewするときに内部でFile::createして持っておいて
withでクロージャを受け取るようにするとネストしたりしやすい気がする
buffer.len()とcompile_error!マクロでどうにかする方法は無理そうだった
あとは明示的flush未実行の型と実行済みの型とをそれぞれ作って
一連のI/O処理の戻り値をflush実行済みの型にしておくことで
flush忘れたらコンパイルエラーにするという方法ならできそう
面倒くさいけど
716デフォルトの名無しさん
2022/08/20(土) 19:18:04.66ID:fWT+hW9e >>715
後半のアイディアについてはコンパイルエラーにするのは難しそうだね
dropの呼び出しを禁止したりコンパイルエラーにしたりする方法は多分ないと思う
リンク時エラーにするアイデアはあるみたいだけど、ちとやり過ぎな感がある
https://mevius.5ch.net/test/read.cgi/tech/1636247099/695
後半のアイディアについてはコンパイルエラーにするのは難しそうだね
dropの呼び出しを禁止したりコンパイルエラーにしたりする方法は多分ないと思う
リンク時エラーにするアイデアはあるみたいだけど、ちとやり過ぎな感がある
https://mevius.5ch.net/test/read.cgi/tech/1636247099/695
717デフォルトの名無しさん
2022/08/20(土) 21:47:48.47ID:Nnwhfgo3 リソース確保、開放といった共通化できる操作はテンプレート化したいが、そのために真にやりたい操作をクロージャや関数にして一段ネストを深くしてしまうのがなんか違う気がするんだよなぁ。
718デフォルトの名無しさん
2022/08/20(土) 21:56:02.14ID:L2ho5Ecd システムプログラミングじゃそれが本質的に指摘すべきことなんだから仕方ないだろ。
719デフォルトの名無しさん
2022/08/20(土) 22:17:19.61ID:INTsXp8j >>713のやり方ならば
そのような対応も不要でプログラムの構造も変えずに済むし
関数から返したり長生きしてもよいし
デストラクタでエラーが起きうる型に適用しておくだけでよく
利用側プログラムに他の付加コードは不要だから理想的にみえる
そのような対応も不要でプログラムの構造も変えずに済むし
関数から返したり長生きしてもよいし
デストラクタでエラーが起きうる型に適用しておくだけでよく
利用側プログラムに他の付加コードは不要だから理想的にみえる
720デフォルトの名無しさん
2022/08/20(土) 22:34:29.93ID:Nnwhfgo3 >>719
特定条件のときだけ開放処理が行われるみたいな分岐があるケースとか考え出すと難しくないかな。
まだ finalize してなければ finalize するみたいな処理を Rust が決定したdrop位置の直前に書かせるという制約を課すだけでいいのか?
特定条件のときだけ開放処理が行われるみたいな分岐があるケースとか考え出すと難しくないかな。
まだ finalize してなければ finalize するみたいな処理を Rust が決定したdrop位置の直前に書かせるという制約を課すだけでいいのか?
721デフォルトの名無しさん
2022/08/20(土) 23:34:50.48ID:INTsXp8j722デフォルトの名無しさん
2022/08/21(日) 00:02:05.58ID:nsTQcirJ >>713は実現不可能だよ
723デフォルトの名無しさん
2022/08/21(日) 00:50:42.36ID:lVDdCtQC724デフォルトの名無しさん
2022/08/21(日) 01:16:56.45ID:WZRwYPWF こういう時は自前主義の方が冷静
自前でできないことを期待するのは虫が良過ぎる
自前でできないことを期待するのは虫が良過ぎる
725デフォルトの名無しさん
2022/08/21(日) 02:47:44.56ID:3Twjt0yr 絵に描いた餅はおいしいですか?
726デフォルトの名無しさん
2022/08/21(日) 05:02:05.10ID:3JIuIXQv727デフォルトの名無しさん
2022/08/21(日) 05:25:55.50ID:s4gkGr9U Rustならば現状のコンパイラで実現できる
finalize()を呼び忘れていたらコンパイルエラーとすることが可能
finalize()を呼び忘れていたらコンパイルエラーとすることが可能
728デフォルトの名無しさん
2022/08/21(日) 09:26:43.80ID:WZRwYPWF 他人の現状よりも
自前でできそうな願望がいい
自前でできそうな願望がいい
729デフォルトの名無しさん
2022/08/21(日) 10:53:20.77ID:sMoAQNMJ >>721,723
「つまり」の前後の論理が全くつながってない
「つまり」の前後の論理が全くつながってない
730デフォルトの名無しさん
2022/08/21(日) 11:04:13.82ID:E81JiIrb つまり
絵にすらなってない餅
絵にすらなってない餅
731デフォルトの名無しさん
2022/08/21(日) 11:37:20.10ID:smg3n+sN つまり霊感商法
732デフォルトの名無しさん
2022/08/21(日) 12:28:30.42ID:U3pRzeag 容易と言い切るなら実装見せて欲しいな
733デフォルトの名無しさん
2022/08/21(日) 13:05:23.69ID:cZmfpBgr つまり複製おじさん論法
734デフォルトの名無しさん
2022/08/21(日) 15:07:41.13ID:ryFNR8Ig つまり「募ってはいるが募集はしていない」的な話?
735デフォルトの名無しさん
2022/08/21(日) 16:22:57.49ID:DLZoHpre つまり
現状のコンパイラで容易に実現できるが
コンパイラに手を加えずに実現できるわけではない
ということでしょw
現状のコンパイラで容易に実現できるが
コンパイラに手を加えずに実現できるわけではない
ということでしょw
736デフォルトの名無しさん
2022/08/21(日) 17:39:47.32ID:3JIuIXQv737デフォルトの名無しさん
2022/08/21(日) 18:17:26.66ID:TCpdMLkc >>735
「現状のコンパイラで実現できる」
というのは
「現状のコンパイラ(の機能を活用してfinalize()内以外でdrop()呼び出すコードを必要としたらコンパイルエラーとする新機能をコンパイラに加えるだけ)で実現できる」
という意味なんでしょw
「現状のコンパイラで実現できる」
というのは
「現状のコンパイラ(の機能を活用してfinalize()内以外でdrop()呼び出すコードを必要としたらコンパイルエラーとする新機能をコンパイラに加えるだけ)で実現できる」
という意味なんでしょw
738デフォルトの名無しさん
2022/08/21(日) 19:08:55.38ID:FqN0DP7E 次世代言語の話だから、現行言語をもとに「原理的には可能」で議論も悪かないと思うけどね。
739デフォルトの名無しさん
2022/08/21(日) 19:35:37.95ID:lf3rkmkM 悪くはないがコンパイラに手を加える必要があるならそう言わんといかんわな。
しょーもないわかりやすいプライド見せられてもなって気分になるわけで。
しょーもないわかりやすいプライド見せられてもなって気分になるわけで。
740デフォルトの名無しさん
2022/08/21(日) 21:17:28.45ID:WZRwYPWF 行動経済学あるある
実験前の説明では「原理的にはどっちを選んでもOK」と言う
実験後「経済的にはこっちを選ぶのはバカ」と言い出す
実験前の説明では「原理的にはどっちを選んでもOK」と言う
実験後「経済的にはこっちを選ぶのはバカ」と言い出す
741デフォルトの名無しさん
2022/08/21(日) 21:53:47.95ID:CnjAlksW 話題の要件は「finalize()等の関数を呼び忘れていたらコンパイルエラーにすることができるかどうか」でいいんだよな
そして他の言語ではそれを実現できなくて「Rustで実現できるか否か」という話でいいんだよな
それならば現行のRustで実現可能 実行確認可能なソースコード
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=7086ce3b73ad74a5375e970c7dfc5951
fn main() -> std::io::Result<()> {
let foo = Foo::new("Hello, World!");
foo.finalize()?; // この行をコメントにするとコンパイルエラー
Ok(())
}
struct Foo { s: String, }
impl Foo {
fn new(s: impl Into<String>) -> Self {
Foo { s: s.into() }
}
fn finalize(self) -> std::io::Result<()> {
let mut me = std::mem::ManuallyDrop::new(self);
println!("Finalizing... {}", me.s);
drop(&mut me.s);
Ok(())
}
}
impl Drop for Foo { ...
そして他の言語ではそれを実現できなくて「Rustで実現できるか否か」という話でいいんだよな
それならば現行のRustで実現可能 実行確認可能なソースコード
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=7086ce3b73ad74a5375e970c7dfc5951
fn main() -> std::io::Result<()> {
let foo = Foo::new("Hello, World!");
foo.finalize()?; // この行をコメントにするとコンパイルエラー
Ok(())
}
struct Foo { s: String, }
impl Foo {
fn new(s: impl Into<String>) -> Self {
Foo { s: s.into() }
}
fn finalize(self) -> std::io::Result<()> {
let mut me = std::mem::ManuallyDrop::new(self);
println!("Finalizing... {}", me.s);
drop(&mut me.s);
Ok(())
}
}
impl Drop for Foo { ...
742デフォルトの名無しさん
2022/08/21(日) 22:38:05.89ID:5Mzum6WR743デフォルトの名無しさん
2022/08/21(日) 22:51:41.20ID:CnjAlksW 使い勝手を含めて改善すべき点はあるから
それらはRustコンパイラが直接サポートすることで解決すればよい
例えば>>741でも用いているManuallyDropはコンパイラサポートによりその機能を実現している
それらはRustコンパイラが直接サポートすることで解決すればよい
例えば>>741でも用いているManuallyDropはコンパイラサポートによりその機能を実現している
744デフォルトの名無しさん
2022/08/21(日) 22:54:16.54ID:3Twjt0yr リンクエラーってコンパイルエラーではなくない?
745デフォルトの名無しさん
2022/08/21(日) 22:56:51.95ID:3Twjt0yr この人これで日曜日丸1日潰したのかな
746デフォルトの名無しさん
2022/08/21(日) 23:03:08.26ID:U3pRzeag proc-macro作るとかclippyのlint追加するとかそういう方向性ならやりようはあるんでないの
747デフォルトの名無しさん
2022/08/21(日) 23:05:54.42ID:U3pRzeag 型情報必要だからproc-macroは無理そう
compiler-pluginでなんとかしてくれ
compiler-pluginでなんとかしてくれ
748デフォルトの名無しさん
2022/08/21(日) 23:07:11.79ID:NvOkjJCY コンパイラがサポートすればリンク使わずに済むから真のコンパイルエラーとなるのでプロトタイプとしてはいいんじゃない
749デフォルトの名無しさん
2022/08/21(日) 23:13:22.78ID:U3pRzeag 実用上は実行前に検出できれば良いのでリンク時エラーでも問題ないとは思うけど
リンクまでしないcargo checkやrust-analyzerやclippy等で検出できないという違いはあるから
コンパイルエラーとリンク時エラーは区別はした方が良いだろうね
リンクまでしないcargo checkやrust-analyzerやclippy等で検出できないという違いはあるから
コンパイルエラーとリンク時エラーは区別はした方が良いだろうね
750デフォルトの名無しさん
2022/08/21(日) 23:26:12.30ID:G9OTg+LF Rustではコンパイラ対応で完全版も実現できる見込みが立ったようだけど
他の言語ではどうなの?
他の言語ではどうなの?
751デフォルトの名無しさん
2022/08/21(日) 23:31:54.00ID:3Twjt0yr752デフォルトの名無しさん
2022/08/21(日) 23:38:38.83ID:t5TpzXQK753デフォルトの名無しさん
2022/08/21(日) 23:43:44.98ID:sqA1fyA2754デフォルトの名無しさん
2022/08/21(日) 23:46:14.60ID:G9OTg+LF >>751
関数型言語らしい観点からの拡張だね
Haskell側でもRustのborrow checkerについて言及してる点も興味深い
でもそのHaskellの拡張で今回のfinalize未呼び出し検知を静的に実現できるの?
関数型言語らしい観点からの拡張だね
Haskell側でもRustのborrow checkerについて言及してる点も興味深い
でもそのHaskellの拡張で今回のfinalize未呼び出し検知を静的に実現できるの?
755デフォルトの名無しさん
2022/08/21(日) 23:54:38.26ID:HHEr7LbV そもそものアプローチが間違ってるから
他の言語でどうこう言っても意味がない
他の言語でどうこう言っても意味がない
756デフォルトの名無しさん
2022/08/21(日) 23:59:27.31ID:NvOkjJCY >>753
そこで関数呼び出しなどがあると
panicなどで巻き戻される時にfooを解放する必要があるためdropを必要とするからかな
コンパイラが直接サポートすればそこは区別できるしリンク方式を取らなくてもよいから大丈夫じゃないかな
そこで関数呼び出しなどがあると
panicなどで巻き戻される時にfooを解放する必要があるためdropを必要とするからかな
コンパイラが直接サポートすればそこは区別できるしリンク方式を取らなくてもよいから大丈夫じゃないかな
757デフォルトの名無しさん
2022/08/22(月) 00:06:59.32ID:f/cMaiDM でもコンパイラはお前のこと嫌いって言ってたしサポートしないんじゃない?
758デフォルトの名無しさん
2022/08/22(月) 00:20:24.88ID:ckyr84/m そもそものアプローチというか
エラーが起きない時か気にしなくてよい時 → デストラクタによる自動処理任せでOK
エラーやその有無を必ず欲しい時 → flushやcloseなど自分で呼べばエラー取得できる
とはいえそれさえ書くのを忘れた時に
Rustコンパイラがコンパイルエラーとする機能も持てそうだとわかったから
さらなる機能向上に期待
GC言語はデストラクタによる自動処理すらないからそれ以前の問題だし
後始末の処理や指示を忘れてもエラーとならないし
忘れてクローズされていないファイルディスクリプタが多数溜まっていくこともよくあるw
エラーが起きない時か気にしなくてよい時 → デストラクタによる自動処理任せでOK
エラーやその有無を必ず欲しい時 → flushやcloseなど自分で呼べばエラー取得できる
とはいえそれさえ書くのを忘れた時に
Rustコンパイラがコンパイルエラーとする機能も持てそうだとわかったから
さらなる機能向上に期待
GC言語はデストラクタによる自動処理すらないからそれ以前の問題だし
後始末の処理や指示を忘れてもエラーとならないし
忘れてクローズされていないファイルディスクリプタが多数溜まっていくこともよくあるw
759デフォルトの名無しさん
2022/08/22(月) 01:49:28.39ID:8Vh1g9M5 >>758
>Rustコンパイラがコンパイルエラーとする機能も持てそうだとわかったから
持てそうじゃないって
Drop Obligationとは全く異なるフロー解析が必要になるからゼロから作る新機能だよ
>Rustコンパイラがコンパイルエラーとする機能も持てそうだとわかったから
持てそうじゃないって
Drop Obligationとは全く異なるフロー解析が必要になるからゼロから作る新機能だよ
760デフォルトの名無しさん
2022/08/22(月) 07:51:24.23ID:qagbwcru >>756
その仮説で正しそうだが念のため確認してみた
まず>>741の通りだとdrop()を呼び出さずに当然コンパイルが通るので
何でもいいから関数呼び出し(演算含む)するものを間に挟んでみた
let foo = Foo::new("Hello, World!");
println!("test"); // ←ここに挿入
foo.finalize()?;
するとこの形はdrop()を呼び出ように変化するようでリンクエラーとなる
この関数呼び出しはfooの参照を使うか否かに関係なく同じ結果
ところがfoo生成前に置くとコンパイルが通る
println!("test");
let foo = Foo::new("Hello, World!");
foo.finalize()?;
さらにfoo消滅後に置いてもコンパイルが通る
let foo = Foo::new("Hello, World!");
foo.finalize()?;
println!("test");
したがってfooが有効な期間に何か関数呼び出しがそこで起きる時のみ
drop()が呼ばれるコードが用意されてリンクエラーとなっている
これはRustがpanic時もメモリ解放をきちんと扱う話とも合致する
つまりpanic時の巻き戻し時のfoo解放をコンパイラが用意している仮説で正しいようだ
その仮説で正しそうだが念のため確認してみた
まず>>741の通りだとdrop()を呼び出さずに当然コンパイルが通るので
何でもいいから関数呼び出し(演算含む)するものを間に挟んでみた
let foo = Foo::new("Hello, World!");
println!("test"); // ←ここに挿入
foo.finalize()?;
するとこの形はdrop()を呼び出ように変化するようでリンクエラーとなる
この関数呼び出しはfooの参照を使うか否かに関係なく同じ結果
ところがfoo生成前に置くとコンパイルが通る
println!("test");
let foo = Foo::new("Hello, World!");
foo.finalize()?;
さらにfoo消滅後に置いてもコンパイルが通る
let foo = Foo::new("Hello, World!");
foo.finalize()?;
println!("test");
したがってfooが有効な期間に何か関数呼び出しがそこで起きる時のみ
drop()が呼ばれるコードが用意されてリンクエラーとなっている
これはRustがpanic時もメモリ解放をきちんと扱う話とも合致する
つまりpanic時の巻き戻し時のfoo解放をコンパイラが用意している仮説で正しいようだ
761デフォルトの名無しさん
2022/08/22(月) 08:10:55.66ID:qagbwcru >>759
そのような別のフロー解析は不要
Rustコンパイラは常に正しくメモリ解放を行うために所有権が尽きてdropを呼び出すべきところを全て把握している
それとは区別する形で>>760のようにpanic時の巻き戻し時のdrop呼び出しも正解に把握している
したがって以下のように検出できる
・finalize()をどのパスでも常に忘れずに呼び出しているコード
→ 非panic時のdropは必ずfinalize()内のみで起こる
・finalize()を呼び忘れているパスが存在するコード
→ 非panic時のdropがfinalize()以外で起こる →検出
よってRustコンパイラは新たな仕組みを必要とせずに
現在把握している情報のみでfinalize()呼び忘れを検出可能
容易に対応できることが確認された
そのような別のフロー解析は不要
Rustコンパイラは常に正しくメモリ解放を行うために所有権が尽きてdropを呼び出すべきところを全て把握している
それとは区別する形で>>760のようにpanic時の巻き戻し時のdrop呼び出しも正解に把握している
したがって以下のように検出できる
・finalize()をどのパスでも常に忘れずに呼び出しているコード
→ 非panic時のdropは必ずfinalize()内のみで起こる
・finalize()を呼び忘れているパスが存在するコード
→ 非panic時のdropがfinalize()以外で起こる →検出
よってRustコンパイラは新たな仕組みを必要とせずに
現在把握している情報のみでfinalize()呼び忘れを検出可能
容易に対応できることが確認された
762デフォルトの名無しさん
2022/08/22(月) 10:01:20.83ID:r+XKv1YE つまり現状はできないってことw
763デフォルトの名無しさん
2022/08/22(月) 17:26:44.21ID:5n0Fj/6k >>760
これってつまりリソース確保してから通常想定されるdropの位置までの間にある
すべての関数呼び出しの panic の可能性を考慮しないといけないから実用不可って事にならんか。
まだ try ... finally ... の方が実用的やないか。
これってつまりリソース確保してから通常想定されるdropの位置までの間にある
すべての関数呼び出しの panic の可能性を考慮しないといけないから実用不可って事にならんか。
まだ try ... finally ... の方が実用的やないか。
764デフォルトの名無しさん
2022/08/22(月) 19:22:34.50ID:f/cMaiDM 正解
765デフォルトの名無しさん
2022/08/22(月) 20:08:33.05ID:IT4AaIoU >>763
大きな誤解をしているようだが
C++やRustなどは関数(正解にはブロックスコープ)を抜ける時に常にデストラクタ(dropなど)を呼んでいる
これが即座のメモリ解放でありC++やRustが高速に動作するな理由
ただしC++でもRustでも所有権が移動したときにはそのデストラクタを呼ばず移動先に委ねられる
以上の基本事項の上でC++の例外やRustのpanicなどが起きたときには
関数呼び出しを自動的に多段に巻き戻して各々のメモリ解放つまりデストラクタ呼び出しをする
これは所有権が移動する場合でも移動する前に例外やpanicが起きればデストラクタが呼び出される
それが>>760のfooの生成と移動の間に挟まれたときのみデストラクタ(drop)が呼び出される仕組み
これらは全てコンパイル時点で静的に簡単に確定するため複雑さはなく実行時の余分なコストも発生しない
ここまでの話は現状のC++/Rustコンパイラがやっている普通のことである
>>761のfinalize記述忘れをコンパイルエラーとする新機能の話は
上述した現状の仕組みをそのまま活用できるため
その新機能を付加することがたやすいというだけの話だろう
大きな誤解をしているようだが
C++やRustなどは関数(正解にはブロックスコープ)を抜ける時に常にデストラクタ(dropなど)を呼んでいる
これが即座のメモリ解放でありC++やRustが高速に動作するな理由
ただしC++でもRustでも所有権が移動したときにはそのデストラクタを呼ばず移動先に委ねられる
以上の基本事項の上でC++の例外やRustのpanicなどが起きたときには
関数呼び出しを自動的に多段に巻き戻して各々のメモリ解放つまりデストラクタ呼び出しをする
これは所有権が移動する場合でも移動する前に例外やpanicが起きればデストラクタが呼び出される
それが>>760のfooの生成と移動の間に挟まれたときのみデストラクタ(drop)が呼び出される仕組み
これらは全てコンパイル時点で静的に簡単に確定するため複雑さはなく実行時の余分なコストも発生しない
ここまでの話は現状のC++/Rustコンパイラがやっている普通のことである
>>761のfinalize記述忘れをコンパイルエラーとする新機能の話は
上述した現状の仕組みをそのまま活用できるため
その新機能を付加することがたやすいというだけの話だろう
766デフォルトの名無しさん
2022/08/22(月) 21:09:18.36ID:Imj2WwGw 複製おじさんがまーた嘘ついてる
Rustが所有権(=dropする義務)をどう管理してるか知りたければ
“Drop Obligations”でググるといいよ
Rustが所有権(=dropする義務)をどう管理してるか知りたければ
“Drop Obligations”でググるといいよ
767デフォルトの名無しさん
2022/08/22(月) 21:19:17.98ID:GgQXua2G >>763
try ... finally ... を書かなきゃいけない時点で大きく負けてるやん
RAII言語は何も書かずともデストラクタで自動処理される
そのデストラクタでエラーが発生する可能性がある時にfinalize呼び出しを強制させる選択肢も用意する話が今のテーマ
try ... finally ... を書かなきゃいけない時点で大きく負けてるやん
RAII言語は何も書かずともデストラクタで自動処理される
そのデストラクタでエラーが発生する可能性がある時にfinalize呼び出しを強制させる選択肢も用意する話が今のテーマ
768デフォルトの名無しさん
2022/08/22(月) 21:21:32.89ID:PwgKhJsq769デフォルトの名無しさん
2022/08/22(月) 21:33:37.66ID:GgQXua2G >>766
Drop obligationsはその話と関係ないじゃない?
RustコンパイラDevelopment Guideを見ても "Drop obligations" は変数の構造つまりenumやstructの中身とそのフィールド連鎖などについての話
Drop obligationsはその話と関係ないじゃない?
RustコンパイラDevelopment Guideを見ても "Drop obligations" は変数の構造つまりenumやstructの中身とそのフィールド連鎖などについての話
770デフォルトの名無しさん
2022/08/22(月) 21:47:48.22ID:5n0Fj/6k >>765
いや、その付加した機能が実用にならないねという話をしたんだが。
いや、その付加した機能が実用にならないねという話をしたんだが。
771デフォルトの名無しさん
2022/08/22(月) 21:49:45.94ID:IT4AaIoU772デフォルトの名無しさん
2022/08/22(月) 21:56:10.02ID:IT4AaIoU >>770
実用的じゃないとはどういう意味だ?
現行でも実用的になっているコード(明示的に書けばエラーを捕捉できて、書き忘れてもデストラクタで自動実行される)に対して
書き忘れを防止できる選択機能を新たに用意しよう、という話だろ
実用的じゃないとはどういう意味だ?
現行でも実用的になっているコード(明示的に書けばエラーを捕捉できて、書き忘れてもデストラクタで自動実行される)に対して
書き忘れを防止できる選択機能を新たに用意しよう、という話だろ
773デフォルトの名無しさん
2022/08/22(月) 21:57:46.65ID:Wff0V8uB >>769
関係ないわけないやん複オジw
関係ないわけないやん複オジw
774デフォルトの名無しさん
2022/08/22(月) 22:01:34.61ID:GgQXua2G >>773
複オジって何
複オジって何
775デフォルトの名無しさん
2022/08/22(月) 22:32:14.28ID:kPK6Bkqr finalize強制の話は7年前から線形型として提案はされてる
具体的なユースケースとしてFinalizeトレイトなんかも出てるし
https://github.com/rust-lang/rfcs/issues/814
ただまぁ大改造だし他にやることもたくさんあるから当分検討されることはないだろうな
具体的なユースケースとしてFinalizeトレイトなんかも出てるし
https://github.com/rust-lang/rfcs/issues/814
ただまぁ大改造だし他にやることもたくさんあるから当分検討されることはないだろうな
776デフォルトの名無しさん
2022/08/22(月) 23:20:29.01ID:9Y+0qHT9 zenは急げ
777デフォルトの名無しさん
2022/08/22(月) 23:32:48.78ID:f/cMaiDM >>772
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=f27f2dc5668cded5f61f8f23e030df61
本当はこういうことがやりたかったんだろ?
newとfinalizeの間に一切コードが書けないんじゃ使い道が皆無
もともと「スコープ終端でのdropまでに特定の関数を呼び出していない場合コンパイルエラー」にしたいだけだったのが
「newした直後に特定の関数を呼び出していない場合コンパイルエラー」という厳しすぎる条件になってるのが問題
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=f27f2dc5668cded5f61f8f23e030df61
本当はこういうことがやりたかったんだろ?
newとfinalizeの間に一切コードが書けないんじゃ使い道が皆無
もともと「スコープ終端でのdropまでに特定の関数を呼び出していない場合コンパイルエラー」にしたいだけだったのが
「newした直後に特定の関数を呼び出していない場合コンパイルエラー」という厳しすぎる条件になってるのが問題
778デフォルトの名無しさん
2022/08/22(月) 23:35:51.97ID:hmZ4rA6/779デフォルトの名無しさん
2022/08/22(月) 23:43:22.53ID:Y3KYPZ9p >>777
間に別の処理を入れてもエラーが起きないようにしたコードかと思って試しちゃったじゃないかw
間に別の処理を入れてもエラーが起きないようにしたコードかと思って試しちゃったじゃないかw
780デフォルトの名無しさん
2022/08/22(月) 23:47:06.94ID:IdBsr831 費用の問題というのも間違い
安くすれば需要がどんどん増えると思ったら大間違いだよ
安くすれば需要がどんどん増えると思ったら大間違いだよ
781デフォルトの名無しさん
2022/08/23(火) 00:19:09.94ID:VIf97uqR782デフォルトの名無しさん
2022/08/23(火) 00:38:06.00ID:7xrG+Q0V そういえばHaskellのLinearTypesのやつ自分で試してから貼ろうと思ってたけど
実際hCloseを消したり2回呼んだりして出てきたエラーメッセージで検索したら
同じことやってた記事があったんでもうこれ貼ればいいやってなった
https://scrapbox.io/mrsekut-p/%E7%B7%9A%E5%BD%A2%E5%9E%8B%E3%81%A7%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E7%AE%A1%E7%90%86%E3%82%92%E3%81%99%E3%82%8B%E4%BE%8B
実際hCloseを消したり2回呼んだりして出てきたエラーメッセージで検索したら
同じことやってた記事があったんでもうこれ貼ればいいやってなった
https://scrapbox.io/mrsekut-p/%E7%B7%9A%E5%BD%A2%E5%9E%8B%E3%81%A7%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E7%AE%A1%E7%90%86%E3%82%92%E3%81%99%E3%82%8B%E4%BE%8B
783デフォルトの名無しさん
2022/08/23(火) 00:51:58.53ID:7xrG+Q0V784デフォルトの名無しさん
2022/08/23(火) 01:09:26.07ID:VIf97uqR785デフォルトの名無しさん
2022/08/23(火) 01:19:05.91ID:7xrG+Q0V786デフォルトの名無しさん
2022/08/23(火) 01:31:34.47ID:c+AZPHFJ >>783
ヒント: 781 == 741
ヒント: 781 == 741
787デフォルトの名無しさん
2022/08/23(火) 02:13:39.19ID:fCFqRRwJ 現状ではどの言語でも実現できていない話と、
新たに新機能追加/拡張を考えようという話の、
区別がついていないというよりも、
現状では出来ていないと叩いたり制限があると叩いたり、
ものごとの理解ができないキチガイか文句をつけて叩ければいいアンチのどちらか
新たに新機能追加/拡張を考えようという話の、
区別がついていないというよりも、
現状では出来ていないと叩いたり制限があると叩いたり、
ものごとの理解ができないキチガイか文句をつけて叩ければいいアンチのどちらか
788デフォルトの名無しさん
2022/08/23(火) 02:47:14.79ID:J1WyjKaU SFCエミュを2ヶ月くらいで組んでるから
Rustの生産性が低いって事はなさそうね
https://zenn.dev/tanakh/articles/nes-and-snes-emulator-in-rust
Rustの生産性が低いって事はなさそうね
https://zenn.dev/tanakh/articles/nes-and-snes-emulator-in-rust
789デフォルトの名無しさん
2022/08/23(火) 02:49:40.76ID:J1WyjKaU いや1ヶ月か
790デフォルトの名無しさん
2022/08/23(火) 07:50:29.67ID:42j/MXVV やっと出てきたのがファミコンのエミュかあ
791デフォルトの名無しさん
2022/08/23(火) 08:28:00.41ID:JlLC2CR4 つまり複オジは反省しない嘘つき常習犯
792デフォルトの名無しさん
2022/08/23(火) 11:42:15.69ID:bRky1rDt >>782
さすがHaskellさん
さすがHaskellさん
793デフォルトの名無しさん
2022/08/23(火) 12:20:50.32ID:dq4kOwAu この人何回もゲーム機エミュ書いてるからこの人の事例で言語の生産性は測れないよ。
絵師()みたいな人がよく言う
「これまでの人生+10分なんです」
と同じ。
絵師()みたいな人がよく言う
「これまでの人生+10分なんです」
と同じ。
794デフォルトの名無しさん
2022/08/23(火) 12:30:30.94ID:YWYNH3Bb795デフォルトの名無しさん
2022/08/23(火) 12:39:54.59ID:nhRs6AvL796デフォルトの名無しさん
2022/08/23(火) 12:40:44.01ID:Dkez1B4S Rustの生産性が高い原因はプログラミングの書きやすさとコンパイル時点で確定保証されることの多さ
797デフォルトの名無しさん
2022/08/23(火) 12:43:43.35ID:3UvdpEti ISUCONでGoに匹敵するぐらい入賞チーム増えてきたらどんな用途でも生産性が高いと証明されるな
798デフォルトの名無しさん
2022/08/23(火) 12:57:16.80ID:AllLmU9s >>797
限られた時間内で場当たり的な対応をどれだけこなすかを競うISUCONは現実と離れすぎていてあまり意味がない
もちろん欠陥だらけのシステムの数々の問題点を見抜いて各々に対応する能力は非常に重要
現実にはその能力は安全かつ高速なシステム設計開発に使うものであり短時間での場当たり的な対応に競うものではない
限られた時間内で場当たり的な対応をどれだけこなすかを競うISUCONは現実と離れすぎていてあまり意味がない
もちろん欠陥だらけのシステムの数々の問題点を見抜いて各々に対応する能力は非常に重要
現実にはその能力は安全かつ高速なシステム設計開発に使うものであり短時間での場当たり的な対応に競うものではない
799デフォルトの名無しさん
2022/08/23(火) 13:33:30.00ID:1ViQo793 時間は正しく計測できるという仮定の下で
「時間が短過ぎる」等の判断をすることもまた現実から乖離していることがよくある
数年前の過去問と同じ問題がテストに出れば、時間は数年間あってもそれを計測する時計はない
「時間が短過ぎる」等の判断をすることもまた現実から乖離していることがよくある
数年前の過去問と同じ問題がテストに出れば、時間は数年間あってもそれを計測する時計はない
800デフォルトの名無しさん
2022/08/23(火) 13:45:48.88ID:Ke3Ccl3f 知識を問うテストじゃないはずなのに、ある特定の知識を知ってる人だけがサクッと解けるようなテストだったら、それは問題が悪問なだけ
出題者が悪い
出題者が悪い
801デフォルトの名無しさん
2022/08/23(火) 13:55:00.75ID:1ViQo793 良問を出すべきというのは道徳か?
富裕層は貧困層に寄付するべきと言ってるのと同じ?
富裕層は貧困層に寄付するべきと言ってるのと同じ?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国・ロシア両軍の爆撃機が東京方面へ向かう「異例のルート」を共同飛行…核も搭載可能、連携して威嚇か [ぐれ★]
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★8 [蚤の市★]
- 「中国人の訪日熱は冷めた」 人気旅行先から日本外れる 14日で自粛呼びかけ1カ月 ★3 [蚤の市★]
- 京都のホテル大幅値下げ 訪日中国人客、年1000万人目前で急ブレーキ [蚤の市★]
- 「1800万円の売り上げゼロに…」中国インバウンドに特化の宿の今 ★3 [蚤の市★]
- 【福岡】「50歳くらいの男性が倒れている」血を吐いた状態で歩道に倒れている女性見つかる 女性はその後死亡 事件と事故の両面で捜査 [ぐれ★]
- 議員定数削減法案、廃案へwmwmwmmwmwmwmw [834922174]
- 【悲報】高市首相「閣僚時代は怖くて政治資金パーティーを企画できなかった」⇒やってました [115996789]
- 【悲報】高市早苗、天皇末裔説wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww [904880432]
- 日本人、株高により消費マインドが旺盛になる!今日の買い物は明日の株高で実質ゼロ円! [782460143]
- 保育士、勤務する保育園のお着替えタイムを撮影し逮捕。レッサーパンダ並みの知能しかなさそう [389326466]
- 【悲報】高齢者、マルチコピー機で自分の逮捕状を印刷してしまう [394133584]
