スレタイ以外の言語も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
621デフォルトの名無しさん
2022/08/18(木) 12:42:07.20ID:mMaPRsFU >>608
ツリーウォーク型のインタプリタなら楽だろうけど、速度出すにはJITとか考えないと行けないし、コンパイラ書くのと大差ない気がする
ツリーウォーク型のインタプリタなら楽だろうけど、速度出すにはJITとか考えないと行けないし、コンパイラ書くのと大差ない気がする
622デフォルトの名無しさん
2022/08/18(木) 12:57:08.67ID:ywzuYu7m >>620
具体的な実装をギリギリまで遅らせることができる&設計が間違っていても無理やり嵌め込むことができる。
プロトタイピングとかライブラリ開発とかで楽できるし、リファクタリングで段階的に仕様を固めることができる。
最終的には静的型付けの方が堅牢になるけど、最初からミス無く設計するのは無理だから、開発初期は動的型付けの方が有利。
具体的な実装をギリギリまで遅らせることができる&設計が間違っていても無理やり嵌め込むことができる。
プロトタイピングとかライブラリ開発とかで楽できるし、リファクタリングで段階的に仕様を固めることができる。
最終的には静的型付けの方が堅牢になるけど、最初からミス無く設計するのは無理だから、開発初期は動的型付けの方が有利。
623デフォルトの名無しさん
2022/08/18(木) 13:30:03.60ID:wupTTNap >>620
言語でも仕事でも持続可能性のためには作る側が儲かるぐらいがちょうどいい
言語でも仕事でも持続可能性のためには作る側が儲かるぐらいがちょうどいい
624デフォルトの名無しさん
2022/08/18(木) 13:42:10.72ID:u9P7LJR3625デフォルトの名無しさん
2022/08/18(木) 14:00:24.69ID:gIZ4t15q Juliaはここに入らんの?
626デフォルトの名無しさん
2022/08/18(木) 14:19:26.19ID:yhLXdudb ぬるぽ
627デフォルトの名無しさん
2022/08/18(木) 14:28:23.47ID:PTM9RcdX もちろんプログラマーや生成物実行者やサービス利用者にとっては静的型付け言語の方が大きく有利
プログラミングも静的型付け言語は支援が大きく楽だし実行時デバッグも減らせる
そして実行速度も静的型付け言語の方が速くできるため実行者やサービス利用者も時間の節約や応答性の良さを得られる
プログラミングも静的型付け言語は支援が大きく楽だし実行時デバッグも減らせる
そして実行速度も静的型付け言語の方が速くできるため実行者やサービス利用者も時間の節約や応答性の良さを得られる
628デフォルトの名無しさん
2022/08/18(木) 14:31:48.41ID:NacqCDdf629デフォルトの名無しさん
2022/08/18(木) 14:33:36.79ID:iuGFLMr5 >>627
使い分けができない人の典型的な言い訳ですね
使い分けができない人の典型的な言い訳ですね
630デフォルトの名無しさん
2022/08/18(木) 14:36:30.08ID:X/mZUHYK >>628
だからダメダメって言ってるのに横からアホみたいに絡んでくるなよ
だからダメダメって言ってるのに横からアホみたいに絡んでくるなよ
631デフォルトの名無しさん
2022/08/18(木) 15:54:24.58ID:bwUj40G0632デフォルトの名無しさん
2022/08/18(木) 16:45:13.83ID:X/mZUHYK はいはいw
633デフォルトの名無しさん
2022/08/18(木) 16:58:47.72ID:EY8RcqaI 小規模なプログラムを早く作りたいというときに
動的型付け言語は向いている
動的型付け言語は向いている
634デフォルトの名無しさん
2022/08/18(木) 17:26:35.30ID:wupTTNap main関数の型がいつも同じなのはシェルが静的型付けではないからだ
設定より規約
独自のユーザー定義型を設定しなくても使える
設定より規約
独自のユーザー定義型を設定しなくても使える
635デフォルトの名無しさん
2022/08/18(木) 18:13:32.09ID:BsTRP920 >>622
あえて突っ込んでみるが
>具体的な実装をギリギリまで遅らせることができる
to_foo()できるFooableなインスタンスを受け取る前提でBarを作るみたいなのは動的型付けでも静的型付けでも同じじゃない?
>設計が間違っていても無理やり嵌め込むことができる。
これも動的型付けでも静的方付けでも同じじゃない?
渡す型が間違ってるみたいなのは設計間違いというよりコーディングミスでしょ
あえて突っ込んでみるが
>具体的な実装をギリギリまで遅らせることができる
to_foo()できるFooableなインスタンスを受け取る前提でBarを作るみたいなのは動的型付けでも静的型付けでも同じじゃない?
>設計が間違っていても無理やり嵌め込むことができる。
これも動的型付けでも静的方付けでも同じじゃない?
渡す型が間違ってるみたいなのは設計間違いというよりコーディングミスでしょ
636デフォルトの名無しさん
2022/08/18(木) 18:32:21.72ID:yLDzsouG637デフォルトの名無しさん
2022/08/18(木) 19:10:46.93ID:74ku3J2B >>635
>なインスタンスを受け取る前提
そういう前提を開発当初に決められなかったり、そもそも問題領域に対する知見が足りなくて手探りで開発を進めるたり。当然「前提」が間違っていることもある。
間違うことを前提に「とりあえず動くものを用意して情報収集しながら開発する」というプロトタイプ開発だと、静的型付けは設計が重すぎて使いづらい。そういうケースだと柔軟性の高い動的型付けの方が便利。
>なインスタンスを受け取る前提
そういう前提を開発当初に決められなかったり、そもそも問題領域に対する知見が足りなくて手探りで開発を進めるたり。当然「前提」が間違っていることもある。
間違うことを前提に「とりあえず動くものを用意して情報収集しながら開発する」というプロトタイプ開発だと、静的型付けは設計が重すぎて使いづらい。そういうケースだと柔軟性の高い動的型付けの方が便利。
638デフォルトの名無しさん
2022/08/18(木) 20:34:52.46ID:kuToBQFh テスト書かないで書き散らすなら静的型はミスが生じにくい分本来的には有利だと思うけどね
ただ、静的型ってモデルとビューモデルみたいな似た型を複数作って左から右に渡すような設計をしがちだからコード量が増えやすいんだよね
静的型でも共通の型を使い回して重複を発生させないことはできるだろうけど、動的型と違って型が目に見えてしまうもんだから、
オプショナルな属性だらけの汚い型が目についてしまって、心理的に適切に型を使い分ける設計になりがち
ただ、静的型ってモデルとビューモデルみたいな似た型を複数作って左から右に渡すような設計をしがちだからコード量が増えやすいんだよね
静的型でも共通の型を使い回して重複を発生させないことはできるだろうけど、動的型と違って型が目に見えてしまうもんだから、
オプショナルな属性だらけの汚い型が目についてしまって、心理的に適切に型を使い分ける設計になりがち
639デフォルトの名無しさん
2022/08/18(木) 20:43:30.66ID:uPozsGij そもそもメンテをするつもりもテストをするつもりもない程度の用途なら、短いコードで完結に書けることが多い動的型言語は比較的有利そうだね
まあそういうときはなんでもいいから一番慣れてる言語を使えばええやんって感じだが
まあそういうときはなんでもいいから一番慣れてる言語を使えばええやんって感じだが
640デフォルトの名無しさん
2022/08/18(木) 20:59:53.63ID:VW7TsRc4 >>637
いや、それは型推論の無かった静的型言語を使ってた時代の話だよ。
今時の言語は型推論あるからコード書く分には動的型言語と遜色ない。
いくら動的型言語が柔軟だと言ったって想定と異なる型のデータで関数なりメソッドなり呼ばれれば、その部分は動かない。下手したらデータ破壊しながら処理進めてしまいかねん。
いや、それは型推論の無かった静的型言語を使ってた時代の話だよ。
今時の言語は型推論あるからコード書く分には動的型言語と遜色ない。
いくら動的型言語が柔軟だと言ったって想定と異なる型のデータで関数なりメソッドなり呼ばれれば、その部分は動かない。下手したらデータ破壊しながら処理進めてしまいかねん。
641デフォルトの名無しさん
2022/08/18(木) 21:02:31.69ID:4Dlj1ckV >>638
そのあたりの問題は最近の静的型付け言語は既に解決済みではないかな
そういう様々な異なる型に対して、横断的な共通の扱いをしたいならば、
例えばRustでは用途ごとに3通りの対応方法を提供しているよね
(1) ボディ付きenumによる複数の異種型の横断的な収容
(2) impl Traitによる複数の異種型の横断的な共通振る舞いとその静的モノモーフィゼーション
(3) dyn Traitによる複数の異種型の横断的な共通振る舞いとその動的ディスパッチ
そのあたりの問題は最近の静的型付け言語は既に解決済みではないかな
そういう様々な異なる型に対して、横断的な共通の扱いをしたいならば、
例えばRustでは用途ごとに3通りの対応方法を提供しているよね
(1) ボディ付きenumによる複数の異種型の横断的な収容
(2) impl Traitによる複数の異種型の横断的な共通振る舞いとその静的モノモーフィゼーション
(3) dyn Traitによる複数の異種型の横断的な共通振る舞いとその動的ディスパッチ
642デフォルトの名無しさん
2022/08/18(木) 21:10:33.58ID:ame2S//5 プロトタイプには動的型って一見もっともなんだけど
じゃあいつ本番開発に移行すんの?ってのは気になるな
結局ある程度動き始めたらそのままズルズル行っちゃうのでは?
それとも「今日から静的型で書き直すので一ヶ月開発止まります」とかやるの?
じゃあいつ本番開発に移行すんの?ってのは気になるな
結局ある程度動き始めたらそのままズルズル行っちゃうのでは?
それとも「今日から静的型で書き直すので一ヶ月開発止まります」とかやるの?
643デフォルトの名無しさん
2022/08/18(木) 21:10:45.17ID:kuToBQFh >>641
そんな小難しいことを最初から真面目に考えて設計しなければならない時点で遅いんだよ
そんな小難しいことを最初から真面目に考えて設計しなければならない時点で遅いんだよ
644デフォルトの名無しさん
2022/08/18(木) 21:13:42.36ID:pjyB7/7f 動的型だと素早く開発できるという話は品質を犠牲にすれば素早く開発できるという話と同じ匂いを感じる
645デフォルトの名無しさん
2022/08/18(木) 21:17:56.92ID:4Dlj1ckV646デフォルトの名無しさん
2022/08/18(木) 21:18:41.05ID:FZFlEvPV かといってサーバーサイドに静的なJavaを導入して安全か?と言われてもなぁw
PHPだから危険なのか?という話だし
そもそも関数で引数に型の指定があるない関わらず期待した型じゃないと普通動かないし
静的だから安全というのは何か間違ってる気がするわ
PHPだから危険なのか?という話だし
そもそも関数で引数に型の指定があるない関わらず期待した型じゃないと普通動かないし
静的だから安全というのは何か間違ってる気がするわ
647デフォルトの名無しさん
2022/08/18(木) 21:24:02.04ID:zSwNEg3i >>637
前提が間違ってた場合の修正範囲に
動的型付けと静的型付けで顕著な違いが出る?
出るならそれを具体的に説明してよ
できれば簡単な擬似コードとかで
柔軟性が高いとか設計が重いとか言うだけだと説得力が乏しい
前提が間違ってた場合の修正範囲に
動的型付けと静的型付けで顕著な違いが出る?
出るならそれを具体的に説明してよ
できれば簡単な擬似コードとかで
柔軟性が高いとか設計が重いとか言うだけだと説得力が乏しい
648デフォルトの名無しさん
2022/08/18(木) 21:25:00.81ID:yMU9W3g1649デフォルトの名無しさん
2022/08/18(木) 21:25:37.80ID:kuToBQFh650デフォルトの名無しさん
2022/08/18(木) 21:26:20.58ID:4Dlj1ckV >>646
そのあたりも最近の静的型付け言語が対応しているでしょう
例えばRustならば引数に対して型指定ではなくtrait指定にできるし
その具体化解決は静的にも動的にも可能だし
もちろんいずれも安全に適用できることをRustでは保証される
そのあたりも最近の静的型付け言語が対応しているでしょう
例えばRustならば引数に対して型指定ではなくtrait指定にできるし
その具体化解決は静的にも動的にも可能だし
もちろんいずれも安全に適用できることをRustでは保証される
651デフォルトの名無しさん
2022/08/18(木) 21:43:21.22ID:mZ+fH4d1652デフォルトの名無しさん
2022/08/18(木) 21:43:46.51ID:vUREPivo653デフォルトの名無しさん
2022/08/18(木) 21:48:40.33ID:rKyKXmu0654デフォルトの名無しさん
2022/08/18(木) 21:57:29.78ID:3gZlWdNz655デフォルトの名無しさん
2022/08/18(木) 22:02:54.58ID:UNnRVh9z >>648
ぶっちゃけないな
型の想定が違ってるのにそれらしく動いて
かつテストでも発見できないバグで
かつ調査が難解となると相当にレアでしょ
それに定義してる型とあっているからと言って
ドメインエラーを常に拾えるわけじゃない
ぶっちゃけないな
型の想定が違ってるのにそれらしく動いて
かつテストでも発見できないバグで
かつ調査が難解となると相当にレアでしょ
それに定義してる型とあっているからと言って
ドメインエラーを常に拾えるわけじゃない
656デフォルトの名無しさん
2022/08/18(木) 22:08:16.63ID:sNPBcISa >>654
猫を電子レンジに入れて本番で実行するような開発者のいるプロジェクトなら
動的型付け言語に比べたら静的型付け言語のほうがリスクは低いだろうね
ただそういう開発者を排除するほうが遥かに安全性が高いと思うよ
猫を電子レンジに入れて本番で実行するような開発者のいるプロジェクトなら
動的型付け言語に比べたら静的型付け言語のほうがリスクは低いだろうね
ただそういう開発者を排除するほうが遥かに安全性が高いと思うよ
657デフォルトの名無しさん
2022/08/18(木) 22:11:31.85ID:i8FqLiOp 静的型付け不要って主張してるのはPHPおじさんしかいないようだけど
何でこのスレにいるのかわからん
何でこのスレにいるのかわからん
658デフォルトの名無しさん
2022/08/18(木) 22:13:54.84ID:FZFlEvPV659デフォルトの名無しさん
2022/08/18(木) 22:14:06.50ID:rKyKXmu0 類は友を呼ぶ
660デフォルトの名無しさん
2022/08/18(木) 22:19:32.70ID:yMU9W3g1 >>655
テストで担保というのが手間でしょ
カバーできてなくて本番のランタイムで
エラーを経験してことないのはよっぽど
丁寧に書いているか大してもの作ってないかの
どっちかだね
あと関係ないドメインエラーとか待ちだすのは
詭弁論破の練習?
テストで担保というのが手間でしょ
カバーできてなくて本番のランタイムで
エラーを経験してことないのはよっぽど
丁寧に書いているか大してもの作ってないかの
どっちかだね
あと関係ないドメインエラーとか待ちだすのは
詭弁論破の練習?
661デフォルトの名無しさん
2022/08/18(木) 22:45:49.60ID:VW7TsRc4 >>656
で、そういう人を排除できてんの?
で、そういう人を排除できてんの?
662デフォルトの名無しさん
2022/08/18(木) 22:48:29.89ID:VW7TsRc4 >>655
>それに定義してる型とあっているからと言って
>ドメインエラーを常に拾えるわけじゃない
0か100の世界線の人ですか?
エラーは早い段階でわかったほうがいいというのは世界の常識だけど、お前の世界線では違うみたいだな。
>それに定義してる型とあっているからと言って
>ドメインエラーを常に拾えるわけじゃない
0か100の世界線の人ですか?
エラーは早い段階でわかったほうがいいというのは世界の常識だけど、お前の世界線では違うみたいだな。
663デフォルトの名無しさん
2022/08/18(木) 22:56:27.19ID:4eWuEs9Z 猫とか車とか飯とか脳みそOOPかよ
お前らのしょうもない例え話は実害があるから本当迷惑なんだよ
お前らのしょうもない例え話は実害があるから本当迷惑なんだよ
664デフォルトの名無しさん
2022/08/18(木) 23:30:39.35ID:eFgxNJYT >>660
「あーそれなら確かに静的型付けにしてたら有利だね」
って言う現実的なコード例出してみてよ
ドメインエラーってのは
文字列を期待してるところに数値を渡したり
注文番号を期待してるところに配送番号を渡したり
First Nameを期待してるところにLast Nameを渡したりした状況のこと
「あーそれなら確かに静的型付けにしてたら有利だね」
って言う現実的なコード例出してみてよ
ドメインエラーってのは
文字列を期待してるところに数値を渡したり
注文番号を期待してるところに配送番号を渡したり
First Nameを期待してるところにLast Nameを渡したりした状況のこと
665デフォルトの名無しさん
2022/08/18(木) 23:36:33.83ID:RTRtwr2z666デフォルトの名無しさん
2022/08/18(木) 23:40:19.24ID:XhNJQXKP667デフォルトの名無しさん
2022/08/18(木) 23:42:51.05ID:yMU9W3g1668デフォルトの名無しさん
2022/08/18(木) 23:52:50.33ID:R+uszVYm669デフォルトの名無しさん
2022/08/19(金) 00:09:50.57ID:aSCRajpd >>666
FirstNameとLastNameを間違えるのはプログラミング言語やその型付け方法と関係ない話
そして静的型付け言語が不利になる話でもない
それにより何を主張したいのか?
もし本当に厳格に区別する必要があるならば各々を扱う専用型を設ければよい
そうせずに両方を文字列型で扱っても、変数名、フィールド/メンバー名、関数/メソッド名などの名付けを分ければ互いに入れ違いを避けられる
FirstNameとLastNameを間違えるのはプログラミング言語やその型付け方法と関係ない話
そして静的型付け言語が不利になる話でもない
それにより何を主張したいのか?
もし本当に厳格に区別する必要があるならば各々を扱う専用型を設ければよい
そうせずに両方を文字列型で扱っても、変数名、フィールド/メンバー名、関数/メソッド名などの名付けを分ければ互いに入れ違いを避けられる
670デフォルトの名無しさん
2022/08/19(金) 00:12:18.59ID:0E/6U7Rf671デフォルトの名無しさん
2022/08/19(金) 00:32:53.46ID:QXliTxmo ドメインエラーとか型付けと関係ない話持ち出してきてるのは何なん?
型が何なのかわからん奴なんだろうな。そりゃ型付きが面倒・邪魔に感じるだろうよ。
型が何なのかわからん奴なんだろうな。そりゃ型付きが面倒・邪魔に感じるだろうよ。
672デフォルトの名無しさん
2022/08/19(金) 00:40:23.18ID:Djh9jYCC KEИTAωωω
673デフォルトの名無しさん
2022/08/19(金) 00:45:33.75ID:I3mMZROB 変数に型がないRubyとかでも、ドメインモデリングするならバリューオブジェクトのクラスも作るし、
変数に型がある言語でもメンテの必要があるアプリケーションならテストコードは必須だろ
どっちがどういいかはトレードオフがあるだけ
変数に型がある言語でもメンテの必要があるアプリケーションならテストコードは必須だろ
どっちがどういいかはトレードオフがあるだけ
674デフォルトの名無しさん
2022/08/19(金) 07:54:59.22ID:Ue9BSEu6 静的型であっても型推論なら姓と名の型をそれぞれa, bとして
どっちもstringと確定するまではaとbは区別される
aとbが入れかわるコードが紛れ込んでいたらstring確定しなくてもa=bは確定
どっちもstringと確定するまではaとbは区別される
aとbが入れかわるコードが紛れ込んでいたらstring確定しなくてもa=bは確定
675デフォルトの名無しさん
2022/08/19(金) 08:02:21.75ID:QtzKKzJh そもそも、ここに書き込んでるような人は、意識高い人だから、自分を基準に考えてはダメでは?
676デフォルトの名無しさん
2022/08/19(金) 08:09:54.91ID:slQGFe9J スレタイにある次世代言語は全て静的型付け言語
静的型付け言語が圧倒的に優れているため全てがそうなっている
動的型付け言語には次世代言語が存在しない
静的型付け言語が圧倒的に優れているため全てがそうなっている
動的型付け言語には次世代言語が存在しない
677デフォルトの名無しさん
2022/08/19(金) 08:39:00.86ID:xzucV8hS >>647
Visitorパターンみたいな処理をする時かね。静的型付けだと型を識別するためにacceptが必要だけど、動的型付けなら動的に型を判定することで手を抜ける。
まぁ、そもそも静的型付け言語も動的な型判定をある程度取り込んでいるからなぁ。パターンマッチとか。
型判別可能な共用体を使える静的型付け言語なら、上手いこと動的に判定する範囲を制限できる。
けど、そういう言語てあったっけ?
Visitorパターンみたいな処理をする時かね。静的型付けだと型を識別するためにacceptが必要だけど、動的型付けなら動的に型を判定することで手を抜ける。
まぁ、そもそも静的型付け言語も動的な型判定をある程度取り込んでいるからなぁ。パターンマッチとか。
型判別可能な共用体を使える静的型付け言語なら、上手いこと動的に判定する範囲を制限できる。
けど、そういう言語てあったっけ?
678デフォルトの名無しさん
2022/08/19(金) 08:54:53.36ID:51hioa9S679デフォルトの名無しさん
2022/08/19(金) 09:24:26.81ID:9PLRQWOj 今回セレクトされてないけどElixirとJuliaは動的型付けだね
Elixirはerlangの系譜だから特にこだわりがないかもしれないがJuliaが動的型付けなのは示唆的に思える
Elixirはerlangの系譜だから特にこだわりがないかもしれないがJuliaが動的型付けなのは示唆的に思える
680デフォルトの名無しさん
2022/08/19(金) 10:07:48.19ID:Qq/sBFnc juliaが目指したのがpythonの置き換えだからでしょ。
681デフォルトの名無しさん
2022/08/19(金) 10:24:36.76ID:2gSW30An Juliaは少量のコードで大量の計算をする言語だからJITに無茶苦茶時間かけても大して問題にならないし、
そもそも数値計算で扱う型って整数と浮動小数点数とその配列が殆どで、型を厳密に扱う必要性が薄い
同様にFORTRANなんかも型は緩めだよ
そもそも数値計算で扱う型って整数と浮動小数点数とその配列が殆どで、型を厳密に扱う必要性が薄い
同様にFORTRANなんかも型は緩めだよ
682デフォルトの名無しさん
2022/08/19(金) 11:40:00.25ID:Qq/sBFnc 型というかテンソルのshapeとかは気にするけどね。
ただ型というよりもうちょっと具体的というかレイヤーが低いとこでの合わせって感じではある。
ただ型というよりもうちょっと具体的というかレイヤーが低いとこでの合わせって感じではある。
683デフォルトの名無しさん
2022/08/19(金) 11:47:47.45ID:iXvbHE7r 行列の大きさとかを型で指定したいと思うことはあるけどIdrisにあるような依存型が必要になるのかな
ちゃんと勉強してないからわからんw
ちゃんと勉強してないからわからんw
684デフォルトの名無しさん
2022/08/19(金) 12:07:38.97ID:xzucV8hS >>678
ボディ付きenumというのはF#の判別共用体のことかしらん。Haskellだと直和型かね。
ボディ付きenumというのはF#の判別共用体のことかしらん。Haskellだと直和型かね。
685デフォルトの名無しさん
2022/08/19(金) 14:15:06.23ID:F2zWUaSx686デフォルトの名無しさん
2022/08/19(金) 18:07:04.50ID:jOBplE6P Rustはデストラクタ内のエラーは無視される実装が多いので、
IO絡みのデータ構造はdropされる前にflushなりsync_allなり呼び出さないけないが、忘れられがちで誤ってプログラムが世に溢れている
このあたり良い感じに処理してくれる安心なシステムプログラミング向け言語ってありますか?
IO絡みのデータ構造はdropされる前にflushなりsync_allなり呼び出さないけないが、忘れられがちで誤ってプログラムが世に溢れている
このあたり良い感じに処理してくれる安心なシステムプログラミング向け言語ってありますか?
687デフォルトの名無しさん
2022/08/19(金) 18:15:52.02ID:J75ESMlr いい感じってなに
688デフォルトの名無しさん
2022/08/19(金) 18:39:22.66ID:EVfb4y4d RustはC++の3倍速い。
689デフォルトの名無しさん
2022/08/19(金) 19:04:29.00ID:jOBplE6P >>687
Rustベースで考えるならスコープ終端でのdropまでに特定の関数を呼び出していない場合コンパイルエラーにしてくれるようなものを想像している
標準ライブラリやサードパーティーライブラリもこのルールに従って作られていてほしい
?で関数の途中で抜けた場合はエラーにしない
Rustベースで考えるならスコープ終端でのdropまでに特定の関数を呼び出していない場合コンパイルエラーにしてくれるようなものを想像している
標準ライブラリやサードパーティーライブラリもこのルールに従って作られていてほしい
?で関数の途中で抜けた場合はエラーにしない
690デフォルトの名無しさん
2022/08/19(金) 19:10:51.99ID:J75ESMlr691デフォルトの名無しさん
2022/08/19(金) 19:20:17.50ID:jOBplE6P >>690
それはFile等従来の構造体でもやっている
dropの中でエラーが発生した場合にpanicくらいしか呼び出し元に伝える手段がないのが問題
標準ライブラリでは単にエラーを無視する実装になっていて、他のライブラリも多くは同じだと思う
それはFile等従来の構造体でもやっている
dropの中でエラーが発生した場合にpanicくらいしか呼び出し元に伝える手段がないのが問題
標準ライブラリでは単にエラーを無視する実装になっていて、他のライブラリも多くは同じだと思う
692デフォルトの名無しさん
2022/08/19(金) 19:34:55.23ID:J75ESMlr > dropの中でエラーが発生した場合にpanic
そっか
つらいね
そっか
つらいね
693デフォルトの名無しさん
2022/08/19(金) 19:37:53.86ID:CKALhjuS Rustプログラマはすぐにpanicに頼る
アホなんだろうなと
アホなんだろうなと
694デフォルトの名無しさん
2022/08/19(金) 19:39:05.15ID:VXXXJYAW695デフォルトの名無しさん
2022/08/19(金) 20:02:15.51ID:/KG0lVfm696デフォルトの名無しさん
2022/08/19(金) 20:23:10.52ID:F2zWUaSx697デフォルトの名無しさん
2022/08/19(金) 20:55:29.37ID:v6FNs4oE コンパイルエラーにするためにはどの経路を通っても終了処理を経由すると解釈できなくてはならないけどそれってあまり簡単ではなくないか
698デフォルトの名無しさん
2022/08/19(金) 22:59:39.17ID:Ue9BSEu6 dropの呼び出し元ではなく
JoinHandle::joinの呼び出し元に結果を伝えればいいんでしょ
実際、panicの引数はjoinの戻り値になる
JoinHandle::joinの呼び出し元に結果を伝えればいいんでしょ
実際、panicの引数はjoinの戻り値になる
699デフォルトの名無しさん
2022/08/19(金) 23:12:28.82ID:4ESWFAwS >>689
自分でcontext manager的なものを作るのがいいと思う
flush以前にエラーが発生してる場合にflushすべきかどうかは
アプリロジックなのでコンパイルエラーにするのは何か違う気がする
自分でcontext manager的なものを作るのがいいと思う
flush以前にエラーが発生してる場合にflushすべきかどうかは
アプリロジックなのでコンパイルエラーにするのは何か違う気がする
700デフォルトの名無しさん
2022/08/20(土) 01:26:15.59ID:O8Vd08Ya701デフォルトの名無しさん
2022/08/20(土) 03:52:49.34ID:fWT+hW9e >>695
その通りで原則drop内でエラーが発生しうる処理はやらせるべきではないよね
だからエラー発生しうる処理がdropに至るまでに呼び出されているかコンパイル時に検知できると良い
>>697
プログラムの実行パス内で値がmoveされたか否かの解析が現状できているので、それと同じ仕組みでできるのではないかな
>>698
マルチスレッドならそれでも良いけど、単なるIOで必ずスレッドなりタスクなり生成させるのはよろしくない
catch_unwindでも良いがあらゆるpanicをせき止めてしまうのはオーバーキルすぎる
>>699
そういうことではなくて、drop内でエラーが起きた場合の話を気にしている
flushを呼び忘れてスコープ終端に到達してしまった場合ね
BufWriterなんかだと書き込みデータ量が少ない場合にwrite(2)が一度も呼び出されないままdropが呼び出されて、
そこで初めてwriteしようとしてエラー検出されることがある
BufWriterのドキュメントにはdrop前にflush呼ぶようにとは書いてあるが、プログラマが気をつけるのではなくできる限り機械的に検知できるようにしたいよね
その通りで原則drop内でエラーが発生しうる処理はやらせるべきではないよね
だからエラー発生しうる処理がdropに至るまでに呼び出されているかコンパイル時に検知できると良い
>>697
プログラムの実行パス内で値がmoveされたか否かの解析が現状できているので、それと同じ仕組みでできるのではないかな
>>698
マルチスレッドならそれでも良いけど、単なるIOで必ずスレッドなりタスクなり生成させるのはよろしくない
catch_unwindでも良いがあらゆるpanicをせき止めてしまうのはオーバーキルすぎる
>>699
そういうことではなくて、drop内でエラーが起きた場合の話を気にしている
flushを呼び忘れてスコープ終端に到達してしまった場合ね
BufWriterなんかだと書き込みデータ量が少ない場合にwrite(2)が一度も呼び出されないままdropが呼び出されて、
そこで初めてwriteしようとしてエラー検出されることがある
BufWriterのドキュメントにはdrop前にflush呼ぶようにとは書いてあるが、プログラマが気をつけるのではなくできる限り機械的に検知できるようにしたいよね
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位置の直前に書かせるという制約を課すだけでいいのか?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「中国人の訪日熱は冷めた」 人気旅行先から日本外れる 14日で自粛呼びかけ1カ月 ★3 [蚤の市★]
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★8 [蚤の市★]
- 中国・ロシア両軍の爆撃機が東京方面へ向かう「異例のルート」を共同飛行…核も搭載可能、連携して威嚇か [ぐれ★]
- 「1800万円の売り上げゼロに…」中国インバウンドに特化の宿の今 ★3 [蚤の市★]
- たけし、ダウンタウン、明石家さんまを超えた! 全世代を超えて愛されるお笑い芸人ランキング! 1位決まる [牛丼★]
- 【訃報】映画監督の原田眞人さん死去、76歳 「クライマーズ・ハイ」 [征夷大将軍★]
- 太ももの痩せ方教えて下さい
- 【高市悲報】大多数の日本人「宗教ってなんか気持ち悪いし、はまってる人とは距離を置きたい」👈これ何でなの? [762037879]
- バイクのエンジンがかからないの…
- 【悲報】30代独身女性「結婚や成功してる友達との差は開く一方、このまま1人で生きて淘汰される人生だと気づいて絶望してる…406万いいね [483447288]
- ドラえもんのいなかったのび太。それが俺とこのスレ見てるお前だよ [769050516]
- オッサンにも勧めやすいVtuber
