次世代言語28 TypeScript Swift Go Kotlin Rust Nim

■ このスレッドは過去ログ倉庫に格納されています
2022/08/29(月) 11:22:16.48ID:5dAad4gs
スレタイ以外の言語もok

前スレ
次世代言語27 TypeScript Swift Go Kotlin Rust Nim
https://mevius.5ch.net/test/read.cgi/tech/1659655598/
2022/09/03(土) 10:06:50.84ID:RRdFGJ7i
>>142
プログラマが完璧なら危険ではないので上司のしりぬぐいをしないというのがCのスタンス
Rustはチェックするので正しいが遅い

あのー、わざとやってるのかバカなのかどっちなの?
2022/09/03(土) 10:11:51.77ID:774mvNvo
>>141
Rustではもっと抽象的に捉えてプログラミングするからそこに無駄と考える発想は出てこないし
同じだから無駄だといっても生成コードは最適化で無駄は消えるからCと同じ速さが出るでしょう
2022/09/03(土) 10:14:07.95ID:Rys3iPM9
実例と計測結果出さないと空論でしか無いわな
まあ速度差が無くて出せないんだろうけど
2022/09/03(土) 10:17:36.98ID:RSYLNmWc
チェックが入ると遅くなるから最適化でチェック省くことがあるんだろうに何で実測しなきゃわかんないんだよ
特定のスニペットじゃなく境界チェックが入る現実のコードの話をしてるのに実測なんてできるわけないだろ
境界チェックが原因で遅くなるコード作れと言うなら作るが、それ作ったら間違いを認めるんだろうな?
2022/09/03(土) 10:20:44.15ID:qprMzk1R
>>144
ホントに常に消えるの?
ダメなケースは存在しないの?
2022/09/03(土) 10:20:52.59ID:0TSBfRU/
>>143
それは君が誤解してるようにみえるなあ
Rustでは安全に範囲内のアクセスとRustコンパイラが分析できれば境界チェックをしないためCと同じ速さが出る
そうでなく危険な範囲外のアクセスになりうるとRustコンパイラが判断すれば正しく境界チェックを行なう
C言語で書いても危険な範囲外のアクセスになりうる場合は手動で境界チェックをせざるを得ないから速さは同じ
2022/09/03(土) 10:22:44.18ID:RSYLNmWc
>>148
同じじゃなく遅くなると認めろよ
2022/09/03(土) 10:28:32.67ID:ypKv7OZi
>>149
遅くなる具体例ありそう?それ知りたい
RustとCのアセンブリ生成コードが同等になり速さが同じとなるケースは>>92で示されてるから
同じようにして遅くなるケースを示せばよいと思う
もちろん範囲外アクセスとならない例でw
2022/09/03(土) 10:32:05.60ID:iVxWWKBi
いつもの嘘つき複オジに必死に突っかかるアホ
どっちもどっち
2022/09/03(土) 10:49:11.71ID:qprMzk1R
>>148
> そうでなく危険な範囲外のアクセスになりうるとRustコンパイラが判断すれば正しく境界チェックを行なう
C言語では外部からもらったデータは仕様で配列範囲に入るのが確実だからチェックをしないとかあるんだけど、Rustコンパイラとやらは仕様書まで読み込んでくれるのかなw
2022/09/03(土) 10:52:15.27ID:BHvUMyM5
境界チェックによるペナルティが気になる箇所なら境界チェックのないget_unchecked使えば良いのでは
デフォルトは安全側に倒されてるけどプログラマの裁量で速度を優先することもできるので、適材適所でどちらを使うか選べば良い
C++でも境界チェックありのat()があるから、デフォルトが逆なだけでできることは同じだよね
154デフォルトの名無しさん
垢版 |
2022/09/03(土) 11:03:40.39ID:7pWn865H
結局プログラマーの手に委ねていると必ずミスが起きうるから
境界チェック省略の件も含めて全てについて
コンパイラが分析して安全かどうか判定できた時にはチェックを省略し
そうでない場合は安全のために自動的にチェックをするのがベスト
という方向へ向かっているんじゃないかな

GoogleやMicrosoftがRust言語でOS開発
https://xtech.nikkei.com/atcl/nxt/column/18/00692/042700054/
【脆弱性の70%がメモリー管理バグに起因】
GoogleによればAndroidに存在した深刻なセキュリティー脆弱性の70%近くがメモリー安全に関するバグに起因するという。
同様にマMicrosoftも、同社製品に存在したセキュリティー脆弱性の70%がメモリー安全に関するバグに起因すると述べている。
C/C++を使う限りセキュリティー脆弱性を根絶するのは不可能と考えて、Rustを採用するに至ったというわけだ。
2022/09/03(土) 11:21:29.31ID:Vwpr/aZb
マジキチだった
2022/09/03(土) 11:53:26.95ID:MAChL+qh
>>150
じゃあCよりRustが遅くなるコードを示せばごめんなさいすんのか?しないだろ?
ここまでの説明でわからないバカがいるはずないからレスバしたいだけだよな?
2022/09/03(土) 11:55:04.03ID:OwwDkoRs
この話題、ここ数年で最もレベル低いんじゃないか?大丈夫か?
2022/09/03(土) 12:31:15.03ID:ytBZTWHu
Rustは安心安全でC言語と同等の速度ってことでFAだな
2022/09/03(土) 12:34:45.63ID:wLxz63Y2
体言止めおじさん
160デフォルトの名無しさん
垢版 |
2022/09/03(土) 12:53:59.17ID:91ZlUxrs
最近のレベル低下には目を見張るものがあるな
161デフォルトの名無しさん
垢版 |
2022/09/03(土) 12:58:26.77ID:91ZlUxrs
>>142
>array[i*2]の例は危険な範囲外アクセスとなるコードだから境界チェックをするRustに軍配が上がるね

array[i*2]の例は危険な範囲外アクセスとなるコードだから境界チェックをしないCに軍配が上がる
が正しい
162デフォルトの名無しさん
垢版 |
2022/09/03(土) 13:35:09.09ID:EiHHJiSw
いやはや、時代についていけないCオジが暴れてるようだなw
Cオジもさぁ、自分の世界に引きこもってないでもっと外の世界見ないとねw
163デフォルトの名無しさん
垢版 |
2022/09/03(土) 13:37:41.33ID:EiHHJiSw
Cこそ最強!
1個でもCより遅いケースあったらダメね!
2022/09/03(土) 13:38:08.80ID:mKqqa6mD
次世代言語スレなんだから変数の境界越えたアクセスは落とす一択だろ。

もうちょっと別の話したいわ。
165デフォルトの名無しさん
垢版 |
2022/09/03(土) 13:38:32.50ID:EiHHJiSw
1個でもCより遅い場合あったら、他にメリットあっても意味ないから!
2022/09/03(土) 13:50:50.43ID:uXzSzfSl
誰も>>91の突っ込み無いんかよ。
Rustが速いのは非常にキツイxor条件を満たす範囲だけで、そこを超えるのはとても面倒。そこを無視して「Rustは安全で高速」とか言うのは詐欺じゃね?

あと、次世代スレなのに何でRustとcだけの比較なんだよ。rangeの最適化なんてイマドキc++ですらやるんじゃないの?
2022/09/03(土) 14:31:36.61ID:RWiDbqEQ
このスレは何もかもをRustと比較したがる信者とそれに反応してしまうバカに乗っ取られた隔離スレです
次世代言語スレではありません
次世代言語の話がしたいかたはこちらへ↓

次世代言語27 Nim Zig Pony Carbon Gleam
https://mevius.5ch.net/test/read.cgi/tech/1659660050/
2022/09/03(土) 14:36:16.07ID:peyYEDe5
ていうかこいつほんとにRust使ってプログラミングできるの?って思ったんだけど
あまりにも頭が残念すぎて論理的思考の必要なプログラミングができるとは思えない
2022/09/03(土) 14:49:28.41ID:BHvUMyM5
>>165
Cで書いた方が良い箇所はCで書けば良いのでは
アプリケーション全体を単一言語で書かなければならない理由もなかろう
2022/09/03(土) 17:15:49.49ID:jD7rh1Hd
>>167
最終レスが8月18日とか終わってんじゃねえか
2022/09/03(土) 17:17:49.88ID:jD7rh1Hd
TypeScriptは次世代なのか?
そろそろ枯れてきてるし何ならバニラが復権しかけてんだが
2022/09/03(土) 17:37:42.10ID:ytBZTWHu
>>169
そんなこと言ったらRsutを使う場面が無くなっちゃうだろ
2022/09/03(土) 18:07:45.82ID:k38NcUnV
Rustはスライスに対して境界チェックをしないでアクセスする方法もunsafeで用意されている
つまり最適なプログラミング方法はC/C++を絶対に使わずに全てをRustで記述し
「コンパイラによる安全保証で最適化により安全に境界チェックを省略してくれる部分以外」かつ「人間による安全保証で境界チェックを不要としたい部分」のところのみunsafeで人間が安全保証し
その部分以外は全てコンパイラにより自動的にあらゆるメモリ安全保証させるのが最適な方法となる
2022/09/03(土) 18:32:15.93ID:5Mn7+zh6
>>137
>>109は RustがC言語より圧倒的に遅いコードです

>>166 172
>Rustが速いのは非常にキツイxor条件を満たす範囲だけ
>「Rustは安全で高速」とか言うのは詐欺
>そんなこと言ったらRsutを使う場面が無くなっちゃうだろ

完全同意
Rustの最適化度合いは一貫性がなくて信頼できない
「Rustで高速化」が少しでも視野に入っている人は
Cコードも書いて常にasmとBenchmarkで比較確認するしかない

>173
109はRust版が10倍くらい遅いんだけどunsafe使ったら早くなるの?
2022/09/03(土) 18:40:11.28ID:ytBZTWHu
え?↓これってデマなんだよね?

https://qiita.com/shadowTanaka/items/5fb99819629dcaab3e05
2022/09/03(土) 19:00:48.70ID:2joIss6C
>>174
わざわざ w = v;  してそんな無意味なプログラムを書く人いないよ
>>92のような実際に使われているパターンの意味のあるプログラム例が欲しいな
2022/09/03(土) 19:10:31.55ID:UqPpASXs
>>109
これって偶然とか意図に関係なく引数が手に負えなくなると
Rustが全く最適化をしない、というPOCじゃね?

>>92
はhello worldレベル過ぎて逆に意味なくない?
2022/09/03(土) 19:29:43.18ID:MArlT4a7
>>174
Cのコードを書く必要はない
Rustには一部エリアのみプログラマーに安全性の保証の義務を負わせるunsafeブロックがありCと同じことができる
ベンチも#[bench]等ですぐ比較できるから速さにシビアな場合は本件に限らずアルゴリズムの差異も含めてコストをかけるだろう
その点はどんな言語でも同じ
2022/09/03(土) 19:37:31.78ID:+aRAkEDC
>>178
>Cのコードを書く必要はない
>ベンチも#[bench]等ですぐ比較できる
いやいやCコードなしにhello sliceどうしでいくら比較しても意味ない。>>174は信頼性の話でしょ
2022/09/03(土) 20:06:47.23ID:BHvUMyM5
>>174
最適化度合いに一貫性のある言語って何?
Cだろうがasm確認しないといけないのは同じだと思うが
2022/09/03(土) 20:09:49.33ID:amOq/bcL
>>109のコードを見てみたが書き方が酷いな
とりあえずそれと全く同じ関数仕様に合わせるとして
Rustならもっと簡潔にこのように書く

fn max_value_slice_vw(v: &[u32], w: &[u32]) -> u32 {
 std::iter::zip(v, w)
  .map(|(m, n)| m + n)
  .max()
  .unwrap_or_default()
}

C言語バージョンより遥かに分かりやすいし
通常Rustでは返り値をu32でなくOption<u32>とするから最後のunwrap_or_default()も不要となる

これでC言語バージョンと全く同じ結果を得られるし
境界チェックも行われないし
そのC言語バージョンと全く同等のアセンブリコードが生成されることも確認できる
つまり今回の>>109の件もRustとCは同じ速さで動作する
2022/09/03(土) 20:17:46.35ID:yFkzTBSQ
>>180
現行C/C++だけがダントツトップレベル
Rustは裏でLLVM使ってるのに何で >>177 で信頼性がないと証明されたんだ...

>>181
あちゃちゃhello sliceと違う書き方をしないといけないなんて、これも無信頼性のPOCだ
2022/09/03(土) 20:34:30.71ID:0512mxP9
「最適化度合い」ってあれだな
「クイックソートは最悪のケースの計算量が多過ぎる」みたいな
ヒープソート最強伝説に似ている
2022/09/03(土) 20:45:21.45ID:GmjcSeRW
>>183
ほんとだね。アルゴリズム系は数学的に最悪ケースを予期回避できるのに、Rustの一貫性の無さは最悪
>>181で突然「このように書く」って言われてもPOCの積み増し
185デフォルトの名無しさん
垢版 |
2022/09/03(土) 20:48:32.94ID:nzn5OhxI
>>181
RustはわかりやすくシンプルにプログラミングできてCと同じ速度なのが素晴らしいね
2022/09/03(土) 20:51:48.37ID:bnXlFS4K
>>185もはや自虐ネタ。嫌味ですか?
2022/09/03(土) 20:52:15.80ID:jD7rh1Hd
Rustをむやみに褒めてるやつがアホすぎてRustのネガティブキャンペーンにしか見えない件
2022/09/03(土) 21:07:27.69ID:ze3FTyL9
こういう争いは同じレベルのやつ同士でしか起きない
お互いに相手がアホだと思ってるけど両方同レベルのアホ
2022/09/03(土) 21:10:15.24ID:amOq/bcL
for文を使わずにメソッドチェーンで書いたことが気に入らないのならば
>>181はfor文を使って以下のように書ける

fn max_value_slice_vw2(v: &[u32], w: &[u32]) -> u32 {
 let mut max = 0;
 for (m, n) in std::iter::zip(v, w) {
  if max < n + m {
   max = n + m;
  }
 }
 max
}

これもC言語バージョンと同じ動作をし
同等のアセンブリコードが生成されることも確認できる
2022/09/03(土) 21:13:41.03ID:sVwwSPBV
せめてID変えずにやってくれればいいのにな
何回NGさせるんだか
2022/09/03(土) 21:15:53.68ID:jlSkT3Xm
>>189
確認乙
POC(>>177,182)積み増し乙
2022/09/03(土) 21:25:28.83ID:jfkeSYrB
Cだと速いけどRustだと遅くなるケースって存在しないの?
誰かそういう例を作ってほしい
ここまでRustがCと同じ速さで書ける例ばかりだから
2022/09/03(土) 21:30:23.63ID:fcrVCCYN
本人はバレてないと思ってるらしいw
2022/09/03(土) 21:34:03.97ID:hQBDJOi4
>>192
はい。Rustは一貫性がない(>>177,>>182)ので個別にCコードと比べて
書き方を変えることにより同程度にもって行ける
ケースが稀にあることが証明されました
多大な努力の結果です。感謝
2022/09/03(土) 21:55:58.00ID:wxRR+ldD
Rustはfor文自体がイテレータを使うから、
for i in 0..s.len() {
  println!("{}", s[i]);
}
とインデックスを使う書き方をするのは非常に稀で、
これはインデックスを使わず、
for n in s {
  println!("{}", n);
}
と書くのがRustでは普通だから、
インデックス議論自体があまり意味のないものに思える。
そしてどちらの書き方をしてもCコードと同速度。
2022/09/03(土) 22:05:33.75ID:lGqTIi1A
Rustがそんなに速いならなんで競プロはC++一択なの
2022/09/03(土) 22:19:33.41ID:V+KjjP+f
>>196
それは単なる人口差・マニュアルやサンプル数差
C++に次いで多いのが言語としてはかなり遅いPythonなのを見ても分かる通り
2022/09/03(土) 22:30:44.07ID:0512mxP9
まあ、型を正確に宣言しても速くならないし遅くなるというのがもし本当なら
バニラJSが復権するのもPythonが支持されるのも当然といえば当然
199デフォルトの名無しさん
垢版 |
2022/09/03(土) 22:31:15.35ID:pNlcpp9D
>>196
解説本がc++が多いからかな
2022/09/03(土) 22:34:08.49ID:zAI/jpLH
例えば競プロAtCoderでABC182-E問題 i行目j列目のマス(i,j)を扱う問題
提出された各プログラミング言語別の実行時間分布
https://pbs.twimg.com/media/EmYvG8aVkAMdfFG.jpg
201デフォルトの名無しさん
垢版 |
2022/09/03(土) 22:38:11.41ID:DRQBO0l9
Rustはコーディングに時間がかかるから競プロでは使えない。
競プロにC++とPythonは良い選択。
202デフォルトの名無しさん
垢版 |
2022/09/03(土) 22:41:39.07ID:nzn5OhxI
>>200
競プロでもRustが速いね
2022/09/03(土) 23:18:47.73ID:mp8eZIVB
>>196
そもそもC++もちゃんと書けるとは言えないでしょ
mainとグローバル変数しか使わないし
204デフォルトの名無しさん
垢版 |
2022/09/03(土) 23:28:32.01ID:DRQBO0l9
他言語を貶しても、Rustが使える言語にはならない。
2022/09/03(土) 23:28:44.38ID:Ej5h9pmc
>>200
Pythonを選んだ時点でPyPy3にしたとしても負け戦が確定かよ
Rustは競プロでも強いのか
2022/09/03(土) 23:33:58.57ID:SEYCHGY8
>>200 懐かしいなあ
ttps://ビット.ly/3CS8AuV
トップのuzzyさん始めC++勢がじわじわ最適化を進めているのがカッコイイ
ちらほらいるRust勢は一発屋だけでインクリメンタルな最適化が出来ていないね。
Rustは一貫性がない(>>177,>>182)から下手に弄れなかったのかな?
2022/09/03(土) 23:43:22.86ID:0512mxP9
>>204
その定型文のどこが「使える」と思ったのかがさっぱり分からないよ
2022/09/03(土) 23:47:27.33ID:YC+HIv6p
>>207 Rustって一発作ったらそれ以上で弄れないって開発現場では使えない言語だね(>>206)
2022/09/04(日) 00:08:42.58ID:yt7jdRkq
>>206
インクリメンタルに最適化したと本気で思い込んでる?
uzzyの上位4つとも全てソース同じまま変化していない
つまり何度も同じのを提出してトライしただけ
210デフォルトの名無しさん
垢版 |
2022/09/04(日) 00:27:20.06ID:ULs4IOBU
で、その競プロでのc言語での参加率はどれくらい?> cオジ
2022/09/04(日) 00:31:23.21ID:ygllKmJ5
4回ともC++コード同じだな
ただしその一つ前だけコードが違っていて二次元配列を一次元へと書き換えて改善してる
一方でRustの人は最初から一次元にしてるからその改善が必要なかった
つまり>>208はRustを叩きたいだけの完全に的外れ
2022/09/04(日) 02:03:59.28ID:1GJgU4m+
たぶん必要なのは
葡萄を食べるべきでない理由ではなく
食べない自由なんだな
2022/09/04(日) 08:04:17.58ID:IySRHUNr
>>200
プログラミング言語間の速度差が激しくて勝負にならないな
競プロで勝つためにはRustかC++を選ばざるを得ないのか
2022/09/04(日) 08:07:09.64ID:gz8Ny9ff
>>213
いいや
Pythonは論外だけど他の言語で十分戦える
2022/09/04(日) 08:19:18.55ID:ftO7cI3V
>>200
Rust最速レベルやん
てかC++の分布笑えるな
ギリ合格からトップクラスまでみっちり
216デフォルトの名無しさん
垢版 |
2022/09/04(日) 10:34:00.57ID:RQxkFcRF
本日のRustあげ会場はこちらですか?
2022/09/04(日) 11:16:04.09ID:ubNPliW5
貶めれば誹謗中傷かも知れんけど、ほめれば気持ち悪いだけ
こんなの消去法でほめるに決まってんだろ
218デフォルトの名無しさん
垢版 |
2022/09/04(日) 11:23:49.03ID:YUzYugU5
参加者自体はRustも多い。
C++と同じくらい居る。
時間内に提出できる人が少ないだけ。
2022/09/04(日) 11:27:19.04ID:eUUNIT4U
つまりRustは生産性が低いor利用者の能力が低いってこと?
2022/09/04(日) 11:52:32.99ID:r6qlMaZb
普通にガチ勢は昔からC++を使ってて今さら他の言語にしないというだけだろうな
221デフォルトの名無しさん
垢版 |
2022/09/04(日) 12:28:01.29ID:1n1CTU4P
CオジはCとC++比べてもやっぱCの方が早いからC++はダメとか言うのかな?
222デフォルトの名無しさん
垢版 |
2022/09/04(日) 12:29:11.61ID:RQxkFcRF
ダメな香具師が描いたダメなC++コードは本当に糞
Cのがマシ
2022/09/04(日) 12:57:20.84ID:r6qlMaZb
>>201
Pythonはよほどうまくチューニングしないとすぐ時間制限越えるんで競プロだと使い物にならないんですわ
>>200のグラフから実行時間でのランキングができそうだけどぶっちゃけ時間内に結果が出れば速かろうが遅かろうが大差無いのでPython以外なら何使ってもいい
言語よりプログラマーの能力が大事だし、それよりむしろ暇の方が大事
とにかく参加し続けてなるべく正解を出してれば上位に行ける
2022/09/04(日) 13:11:43.10ID:MfsHP/8v
pythonでアルゴリズム性能出ると思ってるのお前だけだよ。。
2022/09/04(日) 13:31:05.58ID:r6qlMaZb
お前がアルゴリズムという言葉を知らないと言うことがわかった
2022/09/04(日) 14:04:04.57ID:ubNPliW5
行列の和と積を英単語ではなく記号で書けるだけでC++と互角みたいになったのがPython

argv + 1000000 がnullを返したり計算中に例外を投げる実装が可能なだけでRustと互角になれる
227デフォルトの名無しさん
垢版 |
2022/09/04(日) 14:42:33.66ID:RQxkFcRF
何と戦ってるのか知らんがイミフな基準
2022/09/04(日) 14:46:33.79ID:Pinnb9nG
>>223
うーん、いろんな言語で競プロやってる青色だからついコメントしたくなってしまう

CPythonは知らんけど、pypyは実行速度速いからマラソンでもなければ困ることないよ
再帰がしんどいと言われる問題も、コドフォではよく使われてるbootstrapデコレータを使えば簡単に解決する
Rustはusizeの扱いのために余分なコードが必要になることが多かったし、クロージャ使おうとすると引数の型とかめんどいしで、最近は専らPythonを使ってる
Pythonはクロージャを短めに書けることも競プロ的には気が楽だな
229デフォルトの名無しさん
垢版 |
2022/09/04(日) 15:31:08.56ID:YUzYugU5
Rustは競プロに向いて居ないからな。
避けるのが賢明。
2022/09/04(日) 15:33:36.35ID:+XXjYupQ
複オジと
複オジにマジレスしちゃう人と
その両方を焚き付けて喜んでる人の三人でお送りしています
231デフォルトの名無しさん
垢版 |
2022/09/04(日) 16:44:07.43ID:nQgfFYZJ
Cが普通はintインデクスなのになんで、配列というかスライスをusizeにしたか何回も疑問に上がるよね....
まあインデックスループじゃなく、イテレート操作するからとか、std::ops::Index<T>でusizeだからとか
色々な回答があるけど、どうにもスッキリしない
usize以外の型(より小さい型やsigned)を使えるようにすることは将来ありうるかという開発者への質問も
ライブラリの互換性上ではすぐに実現できないみたいだし、ま、使う人の利便性・プログラマーへの負担軽減を
優先的に考えて作られた言語じゃないからだけど、let mutと書いてる時点でそうだが、せめてこれだけでも
1キーワードに出来なかったんだろうかな
それとCだとint a = 0, b = 1, c = 2;と宣言できるけど、let (mut a, mut b, mut c) = (0, 1, 2);
文末セミコロンで複数行に分けても、理解しやすいという話はどこに行った?使いやすさを求めては
イケないんだろうけど、どうもね....
2022/09/04(日) 16:46:11.53ID:/0DHyjSi
ミュータブルを極力使うなということだろ
233デフォルトの名無しさん
垢版 |
2022/09/04(日) 17:40:27.34ID:YUzYugU5
韓国で最も愛される言語と銘打てば流行るのでは?
2022/09/04(日) 17:47:06.26ID:rbLH55CO
>>231
わざと面倒臭くさせてることに意味がある
その辺りの思想は今までの言語とは違うかもしれん
235デフォルトの名無しさん
垢版 |
2022/09/04(日) 17:48:26.12ID:qbvnu5SJ
>>231
>Cが普通はintインデクスなのに
そんなルール無いよね?
仕事で他社さん作ライブラリがuint使ってたことある。
2022/09/04(日) 18:06:41.17ID:mP7WKJy6
普通にprintln!使うと遅いんだけど教プロ上位なんだな
2022/09/04(日) 18:17:28.78ID:6TwASNhD
競プロではRustは間違いなく最速レベルだし、proconioみたいなマクロを使えば入出力もめちゃくちゃ扱いやすい
でもまあそれ以外のとこでかなり慣れがいる
2022/09/04(日) 18:21:48.03ID:oPTKOfK9
安心安全最速、Rust最高じゃん
2022/09/04(日) 19:10:58.79ID:brj4MXrP
>>231
インデックスやその長さはusize型で絶対に正しい
まずインデックスは負の数になってはいけないからunsigned型
サイズとしてはポインタなどと同じそのCPUで使われるサイズでなければならないからusizeとなる
そして実際のほとんどの様々なプログラミングにおいてインデックスはusize型で上手く動く

ところが例外が二つある
例外の一つは自分たちで決められない外部指定APIなど規定においてインデックスや長さがusize型でない場合でas usizeにより解決

例外のもう一つは一部の数値アルゴリズムでプログラミングする上で一時的もしくは最初あるいは終端で負の数になると便利なことがある
もちろんその一時的な負の数である時ははインデックスとして使われないようにプログラマーの責任でプログラミングしてインデックスとして使う時はas usize
2022/09/04(日) 19:29:23.15ID:OkswyjL5
浮動小数点数から符号無し整数へキャストする命令なくね?
最近の処理系は直接キャスト出来るようなったん?
2022/09/04(日) 19:44:58.67ID:brj4MXrP
>>231
その3-tupleはデータ型の一つでもありまとめて変数に格納できるし関数の引数や戻り値に3-tupleは使える
let foo = (1, 2, 3);

letはパターンマッチ文なので分解にも使う
let (a, mut b, c) = foo;
b += 100;
println!("{a} {b} {c}')
ここでbしかmutableを必要としていないのだから個別mut指定が自然
どの言語でも同様だがmutableをできる限り少なくするのがプログラミングのコツ
2022/09/04(日) 20:00:50.97ID:wyRxABNd
>>231
Cも配列のインデックス関連は(s)size_tが基本では
strlenやmemcpyの引数や返値はsize_tだし
単にintから暗黙的にキャストできるというだけで

暗黙の数値キャストがないのは確かにめんどくさい

asでのキャストはリリースビルドだと範囲外の値になったときにエラーにならないし、
絶対成功するキャストと失敗する可能性のあるキャストが見た目からぱっと区別がつかないのもよろしくない
かといってn.try_into().unwrap()を書くのもだるい

せめてn.into()で済ませたいが16bitアーキもサポート対象だからusizeに From<u32> が実装されていない

ターゲットを32bit以上のアーキテクチャに限定するした場合はinto()使えるようにするとか、もう少し楽にできないだろうか
2022/09/04(日) 22:29:03.84ID:rWQ8XHaT
>>242
Rustは基本としては正しい一貫した方針をとっていて
型変換が必ず成功するものはinto()つまりfrom()が定義されていて
型変換が成功しない可能性のあるものはtry_into()つまりtry_from()が定義されている
したがって基本的にはどちらかを用いればよい
新たな型に対しても同じ方針で実装していくしライブラリもそうなっている
usizeについても同様だが16bit環境もあるためbool, u8, u16からのみinto()となり一貫している
唯一の例外は浮動小数点で成功が定義されないためにinto()もtry_into()もない

上述のコンパイラが型変換を常に保証する方式に対して
プログラマーが型変換を保証する方式に利便性を兼ね備えたのがasによるキャスト
これは例えばu32を自動的に上位を切り捨ててu8に入れるといったことも含めた広義の型変換も含まれる
いずれのケースもキャストはプログラマーの責任で行なうという一貫した方針がある
わざわざ『as xxx』と記述させるのはそのためで意図的に目立つようにしている
プログラムをチェック、デバッグ、メンテする時にunsafeに準じてas xxxは注視すべきポイントとなる
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況