Rust part9

レス数が1000を超えています。これ以上書き込みはできません。
2020/08/23(日) 01:07:35.52ID:MgEpWwVh
Mozilla発のRust言語のスレ

公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

Web上の実行環境
https://play.rust-lang.org

前スレ
Rust part8
https://mevius.5ch.net/test/read.cgi/tech/1579834072/
2020/08/23(日) 10:31:18.31ID:WHl934bN
Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/
2020/08/23(日) 12:12:13.82ID:vopEnHQM
いちおつ
2020/08/23(日) 13:15:25.53ID:jbA8Vxfm
最近は初学者向けの文書も充実してきてるね

Tour of Rust
https://tourofrust.com

Rust explained using easy English
https://github.com/Dhghomon/easy_rust
2020/08/23(日) 15:24:56.55ID:dfu3xBf1
http://zsiciarz.github.io/24daysofrust/index.html
今これ読んでる
2020/08/24(月) 02:54:03.17ID:ko9AntT7
日本語でおけ
7デフォルトの名無しさん
垢版 |
2020/08/24(月) 03:09:08.38ID:gAClNVkQ
web_sys使って意図的にHTML食わせてDOM操作とかしたいんだけどこれって出来ない?
https://docs.rs/web-sys/0.3.44/web_sys/
2020/08/25(火) 22:04:20.93ID:cBDpP6RF
>>7
rustからDOM叩くのはバインディングさえ用意すれば出来るけど"意図的にHTML食わせて"の意味がわからん。
9デフォルトの名無しさん
垢版 |
2020/08/26(水) 09:25:11.81ID:zXQp5MBn
>>8
HTMLのテキストをDocument::from(&html_text)みたいに読ませて、そこからDOM操作してDOMのvalueとかattrとか読みたい。
他のHTMLパーサーは規格がバラバラだからweb_sys使いたい
2020/08/26(水) 09:37:17.33ID:4U25QJJo
>>9
DOM操作なんかしないで、これ使おうぜ
https://github.com/tanakh/easy-scraper
2020/08/26(水) 10:49:33.15ID:goOahd89
>>10
それkuchikiをそのまま使うのに比べてどういうメリットがあるの?
css selectorで指定できたほうが簡単で柔軟だと思うんだけど

>>9
HTMLパーサーの有名どころは、scraper, select, kuchikiの3つだけど
どれも内部的にservoのhtml5everを使ってるから一緒じゃない?
12デフォルトの名無しさん
垢版 |
2020/08/26(水) 14:28:06.12ID:zXQp5MBn
easy-scraperは個人的に仕様がダサいと思う

>>11
web_sysのドキュメント見たら分かるけど、APIがかなり豊富でMDN遵守してるし、wasmにも移管できる。
その三つは楽だけどそれ以外はweb_sysの方が良いから
2020/08/26(水) 15:34:22.88ID:goOahd89
>>12
wasmにも移管できるって、web-sysはwasm前提だと思うんだけどwasm以外で使えるの?
2020/08/26(水) 17:13:59.22ID:Yn/rXsvn
>>12
ダサいといえばダサいんだが、綺麗さより楽さを取ったデザインって感じの話が作者のブログに書いてあったよ。
2020/08/26(水) 21:28:36.70ID:mE3MiLfN
>>9
whatwg DOMにDOM Level3 Load & Saveがないから今のDOMで外部ファイルのパースはできない。
適当なAPIでファイル読んでwasmにコンパイルした他のDOM Level3実装に食わせればいい。
rustで書かれたDOM Level3実装が見当たらないから他言語になるかな。

whatwgのDOMはesからhtml操作する以外は考えてないから、そういう事したいなら他でやるしかないね。
16デフォルトの名無しさん
垢版 |
2020/08/26(水) 22:06:03.86ID:JjGrRnat
綺麗に作れないから自分が楽な設計をしたというだけ
アラフォープログラマにありがちな言い訳
2020/08/27(木) 02:24:33.81ID:yLQzP5wb
無能の僻みかな
2020/08/27(木) 03:10:08.73ID:MrnqDky1
>>16
「楽な」は「楽に使える」という意味だぞ。
綺麗な設計を捨てる方が作るのは大変に決まっとろうが……。
19デフォルトの名無しさん
垢版 |
2020/08/27(木) 04:23:21.10ID:FQ07KrIG
>>13
ごめん、そこらへん認識甘いかも
wasmのランタイムじゃなくて、普通にrustcでも動くんじゃない?

>>15
そうなんだ、貴重な情報ありがとう。
20デフォルトの名無しさん
垢版 |
2020/08/27(木) 08:43:15.31ID:bHW4ZDaj
>>18
そう主張してるが本人が楽なだけ
2020/08/28(金) 01:00:10.14ID:LEZPXhgF
easy-scraperのブログみて試しにkuchikiでやってみたけどドキュメントがなさすぎてkichikuだった

次はscraperにする
2020/08/28(金) 10:56:42.59ID:kaNWPz+d
今月の新機能 Option::zip の使いどころが分からない
こんなの要らないだろ
https://doc.rust-lang.org/stable/std/option/enum.Option.html#method.zip
23デフォルトの名無しさん
垢版 |
2020/08/28(金) 15:11:57.10ID:AUb/6LnR
使うならOption版の論理演算とかかな
2020/08/28(金) 23:01:39.34ID:LEZPXhgF
the bookの分かりやすい更新履歴みたいのってある?

1度読み終わって以降に新しく追加された章や節がないかを確認したいんだけど
githubのcommitログ眺めていく以外の現実的な方法が見つからなくて困ってる
2020/08/29(土) 00:41:53.30ID:JtEdK3mn
>>22
cons cellにしてからflatするの面倒くさい。
俺はvec::Drainをas_sliceする用途がよくわからん。ただの変換用だろうか。

こっちの互換性残ってよかった。
ttps://github.com/rust-lang/rust/pull/74150/
2020/08/29(土) 17:57:40.88ID:6ekcNRq6
anyhowとthiserror 初めて知ったわ
std::Errorが便利になるまではこれ使っとけばよさそうだね
2020/08/29(土) 22:59:59.85ID:CxDsroMX
とっくにfailureのフィードバック終わってるけど、ver古くない?
2020/08/29(土) 23:02:55.48ID:MYuD75tc
結局今は何使うべきなの?
std::Error? failure? anyhow?
2020/08/30(日) 03:03:14.91ID:A+BfCyCQ
@rustlangって日本語のRTもするのか
機械翻訳で読んだのかな
30デフォルトの名無しさん
垢版 |
2020/08/30(日) 11:07:07.53ID:YXE1VqL6
いつになったらベンチマークStableにすんだよな
2020/08/30(日) 18:03:13.46ID:nkt3Z4R5
ベアメタル用のコードを-C opt-level=0でコンパイルして乗算のオーバーフローチェック等のpanic機構って使用できる?
アセンブラリストを出力すると存在しないラベルの分岐命令が出力されるんだが正常な動作なのか・・・
3231
垢版 |
2020/08/30(日) 18:53:07.92ID:nkt3Z4R5
例えばこんな感じ
ttps://uploader.purinka.work/src/17641.png
callqの行き先が不明
2020/08/30(日) 19:51:29.80ID:03fMpyFE
--emit asmってlibcoreとリンクしたもの吐くの?
リンクされてないだけでここ呼んでるだけな気がする
https://github.com/rust-lang/rust/blob/1.46.0/src/libcore/panicking.rs#L39
2020/08/30(日) 22:35:01.08ID:vWRii7PY
>>28
failureは役目を終えた。std::error::Error,thiserror,anyhowでfailure相当になる。
最近はenumxのcexで静的例外風にかけるけど。

>>31-33
panic_handlerを書いた覚えがないなら自分で書く。stdにはデフォルトの実装が用意されてる。
The Embedded Rust Bookに詳しく書いてあるから、rustupでローカルにダウンロードしてrustup docで開ける。

emitだとコンパイルまでしかしない。依存先すらコンパイルしてなかったと思う。
3531
垢版 |
2020/08/30(日) 23:57:14.44ID:mEmNBl/k
サンキュ

>>33
ビンゴだった。でも欲しいのはアセンブルリストなのでlibcoreを含むリストをどう入手するかが課題です
objdumpだと元のソースコードの行数等のデバッグ情報が失われるみたいだしグローバルの有無等の取得方法も判らないし
そもそもgasフォーマットじゃないから見方が判らないところがあるし

>>34
panic_handlerを自分で書きたいのはヤマヤマですが記述例が見つからず棚上げ状態です
ttps://rust-embedded.github.io/book/start/panicking.html
は見ていますが記述例は見あたりませんし
36デフォルトの名無しさん
垢版 |
2020/08/31(月) 08:19:34.04ID:DTQYV4xt
ターミナル上で色つけるのとテキストポジションを決めたいだけの簡単なTUIアプリ作りたいんだけど、有名なTUIクレートが多くて迷ってます。
適切なクレートが何か分かる方教えてください。
2020/08/31(月) 10:44:07.07ID:8VYSRGWn
複雑なことしないなら termion

なんてどう?
38デフォルトの名無しさん
垢版 |
2020/08/31(月) 20:17:03.77ID:DTQYV4xt
>>37
ありがとうございます。一度見てみます。
2020/08/31(月) 22:50:36.76ID:hNA5PDaQ
>>35
英語読めないって話?
>A behavior can be chosen by declaring a #[panic_handler] function. This function must appear exactly once in the dependency graph of a program, and must have the following signature: fn(&PanicInfo) -> !, where PanicInfo is a struct containing information about the location of the panic.
>Given that embedded systems range from user facing to safety critical (cannot crash) there's no one size fits all panicking behavior but there are plenty of commonly used behaviors. These common behaviors have been packaged into crates that define the #[panic_handler] function. Some examples include:
40デフォルトの名無しさん
垢版 |
2020/09/01(火) 00:12:49.85ID:OUJLkiQD
MirakurunクローンのmirakcってRustでかかれてるのか

ソースちょっとのぞいてみたけどサッパリだった
41デフォルトの名無しさん
垢版 |
2020/09/01(火) 00:14:06.84ID:pQTVtNeX
よく作れるよなあ
2020/09/01(火) 00:23:01.46ID:TpxWZL4k
>>35
記述例が見たいならそこからリンクされてるpanicハンドラクレートのソースを見ればいい。
例えばこれとか。

https://github.com/japaric/panic-abort/blob/master/src/lib.rs
2020/09/02(水) 00:14:27.98ID:I/VQ/2li
>>42
そうじゃなくて
>Given that embedded systems range from user facing to safety critical (cannot crash) there's no one size fits all panicking behavior
の意味がわからないんだろう。ベアメタルで人の書いたpanic handlerの中身なんて読んでも意味ないし。
4431
垢版 |
2020/09/02(水) 08:06:57.73ID:s4/GEX11
>>42
それだと基本的に>>32と大差なく見えるというかリンク後に逆アセンブラリストを追いかけたら
最終的にfn panicへ制御が渡っている事を確認しています
>>34でpanic_handler書いていないみたいな事が書かれていたので別の書き方があるのかと・・
2020/09/03(木) 00:54:39.65ID:d+ZpNCKo
Supporting Linux kernel development in Rust
https://lwn.net/SubscriberLink/829858/281103f9c6fd0dc2/
46デフォルトの名無しさん
垢版 |
2020/09/03(木) 13:59:41.08ID:knKXFRQt
お前らの考えとしてぶっちゃけどうよ?
今後10年でc/c++を凌駕する存在になり得るのかRustは
47デフォルトの名無しさん
垢版 |
2020/09/03(木) 14:09:27.73ID:1kMF5+E3
10年もありゃRustベースのもっといいやつが出てきそう
48デフォルトの名無しさん
垢版 |
2020/09/03(木) 14:28:37.24ID:DK3Ul6vK
Dはもう20年になるのか胸熱
2020/09/03(木) 14:49:09.48ID:p5IeVBH6
C++ 30よりは普及するんじゃないか。
(30とかどんな魔境になってるんだろうか…)
2020/09/03(木) 16:20:07.25ID:Tou2TpEC
Rust++もそこそこの魔境になるから大丈夫
2020/09/03(木) 16:22:17.40ID:Tou2TpEC
折角Edition分けしてんだし、一部後方互換性をバッサリ捨てて冗長な表現を纏めて++回避したら流行りそう
なおロードマップ見渡してもその予定は一切御座いません(笑)
2020/09/03(木) 21:15:25.18ID:303ndmJQ
Rustって未だにセルフホストできていない事に驚いた
標準添付のライブラリのビルドを試みたら
>error[E0554]: `#![feature]` may not be used on the stable release channel
等が大量に吐かれたw 要nightlyかよ
2020/09/03(木) 22:16:06.69ID:ciEvly1U
>>52
それをセルフホストできてないというかどうかは知らんがビルドしたいならx.py使えよ。
bootstrapにはそれ用のオプションがちゃんとある。
2020/09/04(金) 08:11:24.22ID:19D8+X78
rustc: 1.48.0-nightly (130359cb0 2020-09-01)
src: 1.46.0
でもダメだった

>>53
丸ごとビルドしたい訳じゃなくて一部だけビルドしたい
ttps://qiita.com/kotetuco/items/54af67d5663013ad0db7#rust-core-library%E3%82%92%E7%94%A8%E6%84%8F%E3%81%99%E3%82%8B
こんな感じ。実際にはコンパイルオプションを調整したいけど
コンパイルできる組み合わせを探すしかないのか?stableとnightlyじゃコードツリーのディレクトリ構造からして違う有様だしなぁ
2020/09/04(金) 10:04:14.14ID:8dK8t4gI
>>54
coreだけでもビルドできるが…。さすがに開発中に毎回bootstrapするわけない。
https://rustc-dev-guide.rust-lang.org/building/how-to-build-and-run.html#build-specific-components

自己流で試行錯誤するよりまず公式通りにやってからカスタマイズする方がいいのでは。
2020/09/04(金) 15:34:10.06ID:7Uip4zIA
>>55
thx。それを実行するにあたって最低限必要な物ってなんだろ。書いていないような・・・
Pythonとbetaなコンパイラが必要そうっぽい事は判るけど
というかコンパイラも含めたビルドは出来るだけ避けたい
環境(Windows)やマシン(2Core/8GB)のリソース的に成功するか判らないし失敗した場合の
トラブルシュートも難しい

あとそのコマンドはnightly?beta?限定のような。1.46.0 stableのコードツリーだとディレクトリ名が違う
57デフォルトの名無しさん
垢版 |
2020/09/04(金) 18:04:10.13ID:REp3w4XA
>>51
ほんそれ。
ある程度はシュガライズすべき
2020/09/04(金) 18:33:08.78ID:GMhQHpfx
>>56
環境構築はREADMEだな。
https://github.com/rust-lang/rust#building-on-windows

ディレクトリはちょうど運悪く先月くらいに構成変わってて、今betaまで反映されてるから次のリリースでstableも同じになる。
とりあえず今のstableなら以下でcoreだけビルドできるはず。
./x.py build --stage 0 src/libcore
コンパイラはx.pyが適切なバージョンを勝手に取ってくるから任せればよい。
2020/09/05(土) 10:06:13.78ID:TAeq65PR
2Core/8GBでLLVMビルドするのかなりつらそう
60デフォルトの名無しさん
垢版 |
2020/09/05(土) 13:17:51.96ID:c1warezh
forとiterの使い分けってどうしたらいいんだろ
用途?
2020/09/05(土) 15:05:36.16ID:TAeq65PR
コードが読みやすくなる方を使う
62デフォルトの名無しさん
垢版 |
2020/09/05(土) 21:40:57.16ID:I89Y16zH
codewarsをRustで解いてるけどなかなか勉強になる
2020/09/06(日) 00:09:09.42ID:/EPcKLfQ
戦争反対
2020/09/06(日) 00:12:10.28ID:YpEFqLu/
敗戦国に対する差別を助長するとアメリカで主張していこうな!
65デフォルトの名無しさん
垢版 |
2020/09/06(日) 13:05:53.33ID:iYICzO1R
Cargo.tomlにrustのバージョン指定する方法ってどうやるっけ?
どこかで見た気がするんだけどcargo reference探してもないから知ってる人いる?
2020/09/06(日) 13:33:28.17ID:378cUVT9
>>65
Cargoにその機能はないな。rustupの機能として
rust-toolchainファイルにバージョンとかnightlyとか書けるよ。
当然rustupを使っていないと効果はないけど。
2020/09/06(日) 13:50:50.21ID:NTBgE1bF
低レイヤーのアルゴリズム実装てrustは実は向いてないんだよ。
2020/09/06(日) 20:53:31.66ID:q3JWysFz
>>65
MSRVのことかな
https://rust-lang.github.io/rfcs/2495-min-rust-version.html
69デフォルトの名無しさん
垢版 |
2020/09/07(月) 05:35:58.44ID:pQuWqVzw
>>68
おお、そうそう。ありがとう
70デフォルトの名無しさん
垢版 |
2020/09/08(火) 14:08:21.21ID:VQ4SFraN
なんでIteratorの方にはchunksとかwindowsとかないの?
Vecに変換するのめんどくさい
2020/09/08(火) 14:14:25.89ID:D8/F+ExD
stdにない理由はしらんけどItertoolsでできるっしょ
2020/09/08(火) 16:58:13.30ID:Qt4K4jXD
rustのormって何でdieselしかないの?dieselが完成されてるから?それともrustがdb使う用途に使われることが少ないとか?
2020/09/08(火) 18:04:31.50ID:7F3fj5vU
rustに関わらずormって限らられたシーンでしか使えない印象
2020/09/08(火) 20:34:32.20ID:iCuj3PWZ
>>70
任意のimpl Iteratorからスライス作るためにはcollectしてVecを作るなど、比較的重めの処理が必要になる
コストのかかる処理は明示的にやらせるというのがstdのポリシーなので、用意されていないのでは
あと利用者側で .collect::<Vec<_>>() を追加するだけでよくて対処が難しくないのもわざわざstdに追加しようとする人が現れない理由だと思う
75デフォルトの名無しさん
垢版 |
2020/09/09(水) 18:10:37.98ID:8UaafUk3
>>74
コストのかかる処理は ってIteratorにないからコストかかってるのでその理由は成り立たない気がする
個人的にはIteratorとスライスという違う型に同じメソッド名が生えてるのがあれなのかなと思った
76デフォルトの名無しさん
垢版 |
2020/09/09(水) 18:23:13.97ID:8UaafUk3
>>72
Dieselが早いうちに作られて支配的に使われるようになって他の連携クレートもdiesel用を用意してそして誰もいなくなった的な展開
個人的にはdieselは癖強いから完成度高くないと思う、ただ連携はかなり強い
77デフォルトの名無しさん
垢版 |
2020/09/09(水) 18:58:45.43ID:oR4G2d97
sqlxが本名だと思う
2020/09/09(水) 21:48:02.38ID:5DrZyU/S
Sqlx良いね
2020/09/09(水) 22:34:56.87ID:ldUOsxby
>>75
allocation不要なchunks/windowsの実装ってどうやるの?
Iterator ではなくて std::vec::IntoIter などに実装するということ?
2020/09/10(木) 07:20:42.22ID:CtWfYO23
itertoolsの実装どんなんかしらんけど、
itertoolsのchunksは各チャンクがイテレータになってるし、
windowsのほうはtupleで帰ってくるからアロケーションしないんじゃね?
2020/09/10(木) 07:23:35.08ID:CtWfYO23
すまん、チャンク・ウィンドウの個数分のアロケーションはさすがに発生してると思うわ多分
82デフォルトの名無しさん
垢版 |
2020/09/13(日) 20:54:26.61ID:e9EK7dt7
VS2019の拡張機能にRustがあるんだけど、これは本物ですか?
VSCodeのとは違うみたいで情報がない
83デフォルトの名無しさん
垢版 |
2020/09/14(月) 01:42:47.60ID:uF+7D4//
&'static strってデータかテキスト領域どっちに入るの?デバッグ方法分からん
2020/09/16(水) 01:12:00.89ID:fJPIYTy9
Rustってむずくないですか
これ最初にプログラムやる言語じゃないよね…昔にC触ったとかそんなレベルだと全然わからん
85デフォルトの名無しさん
垢版 |
2020/09/16(水) 10:24:27.14ID:l4YX/vwQ
むずくない
めんどくい
86デフォルトの名無しさん
垢版 |
2020/09/16(水) 11:57:04.37ID:Kj2RyNnD
std::collections とかが複数形でstd::markerが単数形な理由ってなに?
2020/09/16(水) 12:36:20.15ID:g8ss57Sd
>>85
この言語は、深いことをやろうとするとメンドクサイだけではなく、
ちゃんと仕様が公開されて無い事が多いから難しくなる。
2020/09/16(水) 13:09:08.47ID:mQPJrXyp
え?仕様公開されてるだろ英語で
89デフォルトの名無しさん
垢版 |
2020/09/16(水) 13:54:55.78ID:GiXJ7CmX
自分の足も撃ち抜けない不自由な言語
2020/09/16(水) 14:23:57.05ID:r03rWfLq
>>87
公開されていないというより確定していないことは結構ある。
細かいところでは処理系の実装の現実に頼らないとしゃーないってのは
C/C++ でもなんでも同じだし、
まあそんなもんです。
2020/09/16(水) 20:12:39.40ID:Gmhk8xHy
具体的な話をしてくれ
2020/09/17(木) 04:57:16.23ID:SW6+Z1Cs
>>88
公開されてない。
2020/09/17(木) 06:48:06.13ID:VCs9Ea+4
何の仕様が知りたくて見つけられなかったのか言ってくれよ
94デフォルトの名無しさん
垢版 |
2020/09/17(木) 09:31:52.63ID:k60QR6Dx
チュートリアル追ってみたらLinkedListの実装に結局
unsafeなことやらなきゃいけないみたいに書いてあって
やる気なくしたアホくさ
2020/09/17(木) 09:38:19.49ID:bFAy1lxI
LinkedListはもうオワコン
あれはCPUが遅くてキャッシュミスとかあまり考えなくても良かった時代のもの
2020/09/17(木) 09:49:42.39ID:CU1OLpA0
初心者が「まずは独自コンテナクラスでも実装してみるか」っていって討ち死にしていくのはしばしば見られるよな。
Rustのコンテナ実装は高難度なので素直に標準ライブラリを使いましょう、ってどこかに書いてあるべきかも。
97デフォルトの名無しさん
垢版 |
2020/09/17(木) 09:53:23.90ID:k60QR6Dx
高難度?ただ面倒なだけじゃなくて?
2020/09/17(木) 10:01:04.46ID:CU1OLpA0
>>97
大抵の人にとってhello worldの次にやる課題としては高難度過ぎると思うけど。
もちろんおまえにとっては簡単で面倒なだけってのは別に否定しないが。
99デフォルトの名無しさん
垢版 |
2020/09/17(木) 10:11:43.63ID:k60QR6Dx
別にRustのチュートリアルはプログラミング初心者のためにあるわけじゃないし
2020/09/17(木) 10:53:28.83ID:SW6+Z1Cs
>>93
一番問題なのは、ヒープに対する参照の詳細が英語でもどこを探してもないこと。
Box<T>, Rc<T>, RefCell<T>
などの詳細と、生存期間、所有、借用、コンストラクト時のMoveの処理の話。
Option<T>はまだ分かるが。
2020/09/17(木) 10:55:15.75ID:SW6+Z1Cs
>>95
それは信頼できる情報か。
キャッシュミスし易いから、LinkedListは、もう動的配列より絶対的に劣る、
などというようなことを書いたまともな論文でもどこかにあるのか。
2020/09/17(木) 11:01:24.99ID:eg0aXI83
Cアルゴリズム入門的な本があるように
Rustアルゴリズム入門的な記事があっていい気がする
103デフォルトの名無しさん
垢版 |
2020/09/17(木) 11:06:01.57ID:k60QR6Dx
任意の場所への挿入・削除とかは動的配列よりLinkedListでやったほうが効率いいし
2020/09/17(木) 11:19:25.01ID:Wtt+0SS3
>>94
unsafe使わなくてもできるよ
stdのLinkedListがunsafe使ってるのはパフォーマンスのため

独自実装のLinkedListなんでプロダクションでは使わないだろう
unsafe使わないやり方で作ってみればいいと思うよ
2020/09/17(木) 11:22:36.45ID:wWB4PA6B
>>101
まともな論文ではないけどC++のハゲがそんなこと言ってなかったっけ
106デフォルトの名無しさん
垢版 |
2020/09/17(木) 11:27:31.41ID:k60QR6Dx
キャッシュミスしやすいのはそうだろう
メモリが連続してないんだから当然だね
ただ時代遅れってのは勝手に付け足したろ
2020/09/17(木) 11:33:13.70ID:Wtt+0SS3
>>100
「ヒープに対する参照の詳細」って何じゃい?

Box<T>, Rc<T>, RefCell<T>は標準ライブラリだからライブラリのリファレンスを見る

>生存期間、所有、借用、コンストラクト時のMoveの処理の話。
こっちは一般原則だから普通に明記されてると思うけど
Language Reference本も完成はしてないから書いてない詳細もあるだろうけど
それで困るのは一般原則的なことじゃないでしょ
2020/09/17(木) 12:26:42.19ID:NHfa1bvj
C++ のコンテナは、デフォルトでベクター

ゲームプログラミングでは、プログラマー自身がまとめてメモリを確保する、
メモリ管理システムの例が、よく載っているけど、

一般用途では、ベクターの速度には勝てないのじゃないか?
2分木とか、特殊用途なら別だが

Elixir でも、リストは先頭・末尾だけが速いだけで、
中間の要素を取得するには、N / 2 要素をたどる必要がある

ただ、Elixirは関数型で、元の要素が変化しないから、
更新時だけ、要素をコピーすればよい
109デフォルトの名無しさん
垢版 |
2020/09/17(木) 13:19:52.64ID:OW2OZx8D
C++のvectorでも深い考え無しに闇雲に使うと
要素コピー発生しまくりなアホなコードになる
2020/09/17(木) 13:41:43.66ID:SW6+Z1Cs
LinkedListと動的配列の違いは速度だけの問題じゃないんだな、これが。
前者はプログラミング上、後者より圧倒的に有利な場面がある。
それは、要素の識別性だ。
111デフォルトの名無しさん
垢版 |
2020/09/17(木) 14:10:37.15ID:k60QR6Dx
C++のRAIIイディオム、SharedPointer、Moveセマンティクス
でRustにメモリ安全でどこまで対抗可能かな
2020/09/17(木) 15:25:52.19ID:wWB4PA6B
とりあえず二重開放でコケますね
2020/09/17(木) 15:58:39.73ID:av+XxBIf
C++は確かに道具は十分揃ってるんだけど、
適切に使えるかどうかはプログラマーの注意力次第なので厳しい…。
2020/09/17(木) 20:47:10.45ID:PWLbdk49
LinkedListが役に立たないと知ったのは結構前だな
Javaのスレで色々議論があったんだけど
LinkedListが優位になるであろう場面でもArrayListのほうが早いと断言するやつが居て
バカじゃねーの?と思いつつも実装してみたら完全にArrayListのほうが早かった
古い知識でイキってた当時の自分が恥ずかしい
115デフォルトの名無しさん
垢版 |
2020/09/17(木) 21:46:41.57ID:QIzByEmL
> C++は確かに道具は十分揃ってるんだけど、
> 適切に使えるかどうかはプログラマーの注意力次第なので厳しい…。
そもそもC++は注意力の前に必要知識が多すぎる

>>114
ベンチのソースとか記事ないの?
116デフォルトの名無しさん
垢版 |
2020/09/17(木) 21:47:07.97ID:k60QR6Dx
その早いって何が?
要素の検索が?挿入・削除が?
117デフォルトの名無しさん
垢版 |
2020/09/17(木) 21:56:39.63ID:k60QR6Dx
適当に検索した記事みてみたら普通に予想通りの内容だったけど
2020/09/17(木) 22:27:03.14ID:eGAt76U1
リンクリストのキャッシュミスが問題になるのであれば
探索時にプリフェッチしておけばよくね?
今時の高性能なプロセッサなら大抵そういう命令を装備しているだろ
遅いのは実装がウンコなだけなんじゃ
2020/09/18(金) 00:33:25.64ID:FytpOkUB
リストの要素がそれぞれ離れたアドレスにあるような実装だったら、クソデカキャッシュ必要になったりしない?
2020/09/18(金) 02:24:56.35ID:2RtYnDyr
最近のDDR4(?)メモリの速度の進化も凄いから、キャッシュミスがあっても、
キャッシュがヒットした場合の3倍位の速度低下で済むんじゃないかと思うし、
少なくとも、キャッシュミスによる速度低下には上限がある。
一方、LinkedList、動的配列の途中への挿入や、途中要素の削除にかかる時間は、
全体の要素数を N とした時、それぞれ、O(1)、O(N)となる。
キャッシュミスによる速度低下が高々3倍程度なのに対し、
動的配列の遅さは、要素数 N に比例してしまうから上限がない。
だから、本質的に要素数が多くなった場合には、
キャッシュミスによる速度低下とは比べ物にならないくらい
速度差は歴然たるものとなる。
121デフォルトの名無しさん
垢版 |
2020/09/18(金) 02:26:46.51ID:2RtYnDyr
>>120
[補足]
動的配列で途中への挿入や途中要素の削除では、平均で、 N/2 要素程度のコピー動作が
入る。これを
2020/09/18(金) 02:33:02.97ID:2RtYnDyr
>>121
これをMoveに置き換えて高速になるのは、要素の中身が、Heap領域など、要素自体
とは別の場所に有る場合である。たとえば、
struct Element {
 const char *m_pszText; // new char[]で確保したHeap領域を指す0終端文字列
};
簡単のためこれの固定長配列を書いてみれば:
Element g_arr[1024];
となる。この要素のデータを読み取る場合は次のようになる、
for ( int i=0; i<1024; i++) {
 printf( "i=%d, text=%s\n", i, g_arr[i].m_pszText );
}
この場合、m_pszTextは、ヒープ領域にとってあるから、結局、配列でも
キャッシュミスは生じ得る。
ということで、動的配列でMove動作が有効である例では、たとえ動的配列で
あっても、結局、キャッシュミスは生じる。
2020/09/18(金) 03:33:15.49ID:/+t0myE3
ここまでベンチなんもないのでとりあえず適当に拾ったやつ
https://dzone.com/articles/performance-of-array-vs-linked-list-on-modern-comp

総データ量がキャッシュをはるかに超えるとかだと多分変わってくるんだとは思う
その場合でもUnrolled linked listとかを使うのがいいってことにはなるのかな?
2020/09/18(金) 03:52:17.29ID:2RtYnDyr
>>123
大体そういう人は、リンクリストの本質を理解できてないので、
「先頭から10番目の場所に挿入する」
などという馬鹿な書き方をしている。
例え博士課程とかの人でもそういう馬鹿な人がいる。
2020/09/18(金) 03:53:47.62ID:M9ZXsRqQ
推測するな、計測せよ
2020/09/18(金) 03:54:10.38ID:2RtYnDyr
>>124
C++のSTLは設計は馬鹿なので、先頭から k 番目に挿入するなど言う
馬鹿な統一関数がある。
それは、リンクリストにとって最悪の挿入法で、O(N)の時間が掛かる。
だから遅い。
数学的なイマジネーションが無いので、その間違いに気づかない。
2020/09/18(金) 03:54:37.58ID:2RtYnDyr
>>125
いくら測定しても、理屈が間違っていれば、間違った実験結果となる。
2020/09/18(金) 03:56:20.84ID:2RtYnDyr
>>125
グラフだけ書いて、ソースがない。
どうせ、k 番目に挿入すると言う馬鹿コードになっている。
いくら言っても、同じ間違いをする人が続出する。
2020/09/18(金) 03:58:23.37ID:2RtYnDyr
数学が出来ない人は、生まれつき脳が馬鹿なので、
この人も、乱数で番号を発生させて、先頭からk番目の位置に挿入する
という馬鹿なベンチマークを作って、リンクリストが遅いなどと言っている
のだろう。
そんなことすれば遅くなるに決まっているが、彼は馬鹿なので分からない。
2020/09/18(金) 04:01:14.05ID:2RtYnDyr
数学脳を持ってない人にヒントをかいておくと、
リンクリストは、途中への挿入は O(1)で可能だが、
先頭から k 番目という番号を指定した位置への挿入は、O(N)の時間が掛かる。
こういうベンチマークを取って論文にしてしまうような人は、
プログラミングもコンピュータサイエンスにも全く向いてない。
2020/09/18(金) 04:04:00.76ID:2RtYnDyr
アメリカの大学生の非常に多くのがポインタやアドレスの概念が理解できないらしい。
この人もそれに近い状態だから、途中への挿入を、先頭からの番号で指定すると言う
発想しか出来ないのだろう。
ポインタが何故頭のいい人に好まれるか、そういう人種の人にはわからない。
そして、間違ったベンチマークを大真面目に論文にしてしまう。
132デフォルトの名無しさん
垢版 |
2020/09/18(金) 06:34:01.52ID:JNeepSOt
>C++のSTLは設計は馬鹿なので、先頭から k 番目に挿入するなど言う
>馬鹿な統一関数がある
え?ここ見る限りそんなのないけど
https://cpprefjp.github.io/reference/list/list/insert.html
2020/09/18(金) 08:12:28.71ID:aEEfDPH5
DDRメモリのセットアップタイムをググったらcrucialが判りやすい資料を公開していた
ttps://www.crucial.jp/articles/about-memory/difference-between-speed-and-latency
これはメモリ単体での値だから実際にはCPU内キャッシュの探索時間、バスの調停時間
メモリコントローラの動作時間が積まれる。L3まで探って未ヒットだった場合CPUが3GHzとしても
30サイクル以上は待たされそう

今時のPCで使用されるプロセッサはL1からのロードですらノーウェイトではないし計画的なロードは超重要
2020/09/18(金) 09:09:51.55ID:FytpOkUB
先頭や末尾への挿入削除だけならVecDequeでよくね
2020/09/18(金) 09:26:18.23ID:/+t0myE3
>>123が参照してる記事でもっと詳細あったわ
https://baptiste-wicht.com/posts/2012/12/cpp-benchmark-vector-list-deque.html

こっちは、挿入が挿入箇所のサーチも加わったことを断った上で比較してますね
サーチを加えてもデータサイズがでかい・コンストラクタのコストが重い場合はlistが有利っすね

挿入位置のサーチの分のコストを含めるかは難しいところだけど、先頭・末尾以外の一定位置にだけ挿入するってシチュエーションはそうそうないだろうし、
この程度の比較でいいんじゃねーのかな
2020/09/18(金) 09:34:00.68ID:/+t0myE3
>>132
イテレータであらかじめ挿入位置を探しておくんすよ
その操作はO(n)かかって、その後insertメンバ関数で挿入する
2020/09/18(金) 09:59:55.15ID:2RtYnDyr
実際には、挿入箇所のサーチなど必要無い事が多いので、リンクリストが速い。
テストする人は馬鹿なので、実際的な「ランダム」の意味が分かってない。
2020/09/18(金) 10:03:14.54ID:2RtYnDyr
>>135
>挿入位置のサーチの分のコストを含めるかは難しいところだけど、先頭・末尾以外の一定位置にだけ挿入するってシチュエーションはそうそうないだろうし、
>この程度の比較でいいんじゃねーのかな
違う。
サーチが必要なく、分かっている途中の場所に挿入するケースが圧倒的に多い。
2020/09/18(金) 10:30:57.15ID:2RtYnDyr
>>133
それはリンクリストだけの問題ではなく、>>122のように、動的配列でも
現実的には事情は変わらない事が多い。
動的配列は、要素のサイズが小さくて、Heap領域へのポインタなどを中に持ってない
場合のみ、リンクリストに勝てる。
たとえば、この条件に当てはまっている典型的な例として、文字列を文字の集合とみなした場合や、
3Dの頂点座標などは、(動的/固定)配列で持っているのは正しい判断で、リンクリストで
持つべきではない。
たとえば、要素がメンバとして、CStringやstd::stringなどの文字列を持つ構造体の場合は、
>>122の状況が生じるので、要素を配列で持ってもキャッシュミスは避けられない。
2020/09/18(金) 10:40:12.02ID:2RtYnDyr
STLの設計も悪いが、リンクリストに対するランダム挿入のテストで、
ランダムな整数kを求めて「k番目の要素」の直前に挿入するような
馬鹿なテストをしている場合、リンクリストは、先頭からk番目までを
丁寧に辿らなければならないので、その時にO(k)の時間がかかる。
全体の要素がN個の場合、このようなランダムの場合、平均でN/2に比例した時間が
掛かるのでO(N)と表現される。
しかもこのとき、要素をk個もたどらなければならないので、キャッシュミスがあったら
かなりの時間が掛かってしまう。
逆に、動的配列の場合は、先頭からkまでをたどったとしても、キャッシュミスは軽微。
しかし、現実の途中の挿入は、このような「辿る操作」が全く必要無い事が多いので、
リンクリストは速い。
要素を識別するために、先頭から「k番」という番号で行うのは、「配列流」で
あって、ポインタが理解できない人には、それしか方法が分からないが、リンクリストは
そのような方法で要素を識別しない。
そして、その識別方法こそが、リンクリストが配列よりも圧倒的に便利であることに繋がる。
ポインタはとても賢い方法なのだが、頭が悪い人には理解できないので、どうしても、
先頭からの番号でしか要素を識別したがらない。
そしてそのことこそが、あらゆることを遅くし、プログラムを見通しの悪いものにしている
ことにも気づかない。
2020/09/18(金) 11:07:59.09ID:0XVxbS2k
リンクリストをサーチする場合
1.次の要素のアドレスを取得
2.次の要素のメタデータを取得
3.データを評価
4.アンマッチだったら1に戻る
を繰り返すので、メモリ配置次第ではランダムアクセスになりやすく
無策だとキャッシュミスを発生させやすいって話じゃないの?
2020/09/18(金) 12:20:02.02ID:2RtYnDyr
>>141
でも、要素の中にstd::stringなどを入れていた場合、そのstringの中味は、
Heap領域を指しているので、どうせ動的配列でもキャッシュミスは生じる。
だから動的配列がサーチで有利になるのは要素がトリビアルな場合のみ。
また、サーチしても、削除などを行うととたんに動的配列は遅くなる。
この場合、O(N)個のCopyまたはMoveが生じる。Moveでも
コピー動作が全く生じないわけではないので(途中の)1個の要素の削除でも、
動的配列はO(N)の時間が掛かる。
一方、リンクリストは、O(1)。

読み取りが中心になる場合は、動的配列はもちろん速い。
2020/09/18(金) 12:35:56.71ID:2RtYnDyr
>>141
リンクリストをサーチするのは pure Cで書けばこんなに簡単で、物凄く効率が良い:
CNode *pNode = pTop;
while (pNode != NULL ) {
 (pNodeを検査);
 pNode = pNode->m_pNext;
}
144デフォルトの名無しさん
垢版 |
2020/09/18(金) 14:22:59.83ID:JNeepSOt
( ´,_ゝ`)プッ
2020/09/18(金) 15:09:39.89ID:lOTfajhS
>>141
同じO(n)でもLocalityの違いでVecとLinkedListじゃ桁違いの差が出るよって話

「無策だと」って言っても現実的にLinkedListをVecと同じようにCache Friendlyにする方法ないよね?
2020/09/18(金) 15:41:38.07ID:2RtYnDyr
実際にテキストエディタでも作ってみれば、LinkedListの優秀さが分かる。
行数が大きくなった場合、動的配列では遅くてどうしようもない。
147デフォルトの名無しさん
垢版 |
2020/09/18(金) 16:53:33.12ID:JNeepSOt
なるほどね
テキストエディタという具体例があったか
2020/09/18(金) 17:30:51.35ID:lOTfajhS
エディタの場合はO(n)の探索じゃ困るからLinkedListで作られてるメジャーなのないでしょ
Piece Table, Gap Buffer, RopeのいずれかでRope以外は基本的に配列を中心に実装されてる

VS Codeの例
https://code.visualstudio.com/blogs/2018/03/23/text-buffer-reimplementation

Heap ManagerとかMemory Allocatorみたいなのは内部的にLinkedList使ってる
2020/09/18(金) 18:36:08.52ID:2RtYnDyr
>>148
>エディタの場合はO(n)の探索じゃ困るからLinkedListで作られてるメジャーなのないでしょ
「探索」とは何のことか知らないが、
「検索」に関しては、ArrayListでもLinkedListでもbig O表記は変わらないが。
2020/09/18(金) 18:40:53.97ID:2RtYnDyr
StackOverflowも、これに関してはデタラメ。
実測してLinkedListの挿入が遅いとした人のコード見てたら、
ノードの個数Nの値が、1から100までしかならないようになっていて、
それを、以下の様に外側から100000回くらいループした、二重ループになっていた。
for(100000回のループ) {
 リストの変数を作成
 for(100回挿入するループ) {
 }
}
これだと、LinkedListのNodeがHeapから作製される遅さばかりを測定しているだけで、
全く、LinkedListの真骨頂であるところのNが大きな時の挿入はテストできていない。
StackOverflowはとても高度なことを答えている人もいるが、この件に関しては、
レベルの低い人の書き込みが目立っている。あれを信じてはいけない。
2020/09/18(金) 18:42:40.33ID:UNsmlUgz
>>141がかなり素朴にキャッシュミスの話をしてくれてるのに
平然と>>143を返すあたりでもうコイツから得られる有益な情報は無いので解散
2020/09/18(金) 18:49:50.54ID:2RtYnDyr
>>151
LinkedListには、メタデータなんて無いから、話がそもそもかみ合わなかったので
初歩的な情報を提供したつもり。
2020/09/18(金) 19:35:36.32ID:nXbcIFBH
Intelの最適化マニュアルを見ると、不規則なメモリアクセスで
ハードウェアプリフェッチが有効に機能しないシチュエーションでは
ソフトウェアプリフェッチが有効であると書いてある。つまり
>>141 2.5 次アクセスするメモリに対しプリフェッチ出来る命令を実行する
みたいにすればメモリのランダムアクセスに起因するレイテンシを短縮できる

あとサーチの場合メモリ配置の局所性以外の要因でも配列とリンクリストの速度差は発生する
リンクリストの場合メモリ帯域の一部をアドレスのロードに取られるのでデータのロードに使える帯域は減少する
配列の場合はレジスタにおいたアドレスを使ってロードできるし
ストリング命令が使えるプロセッサであればサーチ命令を使用する事も出来る
2020/09/18(金) 19:52:23.34ID:qGyW3gPx
Twitterによくいるトンチンカンな知識の割に
謎の上から目線で口上垂れてる同類だな
155108
垢版 |
2020/09/18(金) 21:29:14.35ID:EwCVEpJE
Elixir では、リストへの全走査が主体。
フィルターとか

ランダムアクセスではない。
全探索が基本

全探索はリスト、ランダムアクセスは配列。
リストは、次の要素しか分からないから

「1, 2, 3, 4, 5」という要素があって、奇数だけをフィルタリングしたら、
「1 -> 3 -> 5」みたいに、リンクをつなぎ直す。
2, 4 はGC の対象になる

こういう全走査では、リストが圧倒的!

これが動的配列なら、2の削除で、345 を前に移動して、
4の削除で、5 を前に移動してと、コピーの連続になって大変

だから、Elixir では、リストが主体になっている。
関数型では状態を変えず、パイプラインで、新たな要素を作っていくのが基本

全走査が基本で、ランダムアクセスしないからだろう
2020/09/18(金) 22:34:29.90ID:lOTfajhS
>>153
次の要素のアドレスが把握できたタイミングから
そのアドレスにあるデータを利用するまでにプリフェッチが完了するような場合なら
微妙に速度が向上する可能性がないとは言わないが
それは>>135の記事にあるようなVecとLinkedListの比較で意味のある違いにはならないでしょ
157デフォルトの名無しさん
垢版 |
2020/09/18(金) 23:42:30.07ID:JNeepSOt
>>148
>Piece Table, Gap Buffer, Ropeのいずれか
なにそれ面白そう
158デフォルトの名無しさん
垢版 |
2020/09/18(金) 23:44:17.88ID:JNeepSOt
VS Codeの異常に早い検索はそれで実現されてるのか
159デフォルトの名無しさん
垢版 |
2020/09/19(土) 01:43:40.66ID:nzD54rrP
IteratorでItemがimpl Futureをしてる型を返すっていう実装したいんですが、方法が分かりません。
どのように解決すればよいのでしょうか?
while Some(fut) = fut_iter.next() {
let result = fut.await;
}
2020/09/19(土) 02:11:22.63ID:U+RTm7Td
>>154
数学が分からん人には、LinkedListの優秀性も理解できない。
実験しても実験の仕方が間違っているので間違った結果になっているが、
本人が気づかない。
C++のStrousstrup氏も間違っている。
集団幻想。
それだけ数学的なことは才能が必要だということだ。
多数決では、ArrayListが圧勝と言うことになってしまっているが、それは
本等は間違い。
2020/09/19(土) 02:19:57.57ID:U+RTm7Td
数学的なことは、99%位の人が正しく理解できないので、ベンチマークテスト
のプログラムも1%位の人しか正しくかけない。
だからデタラメな集団幻想が、LinkedListが過小評価に繋がっている。
まだ、雑誌などでは学歴フィルターというか、頭の良さフィルターをかけて入社
させない仕組みがあるので、あまり間違ってはないが、ネットはめちゃくちゃ。
見ていたら、論文にまでしてしまっているひとまでいるようだが、間違っている。
162デフォルトの名無しさん
垢版 |
2020/09/19(土) 02:23:16.42ID:Vwp+/AeQ
>>95
グラフ表現とかでもlinkedlist使わんの?
2020/09/19(土) 03:22:40.39ID:Q84IJBEo
あーあっち側の人すかー
有意義な議論ができるかと思ってた
皆さまご苦労さまです
2020/09/19(土) 11:06:03.78ID:Ltx9b8Lt
とりあえずベンチマーク取ってみたらええやん。。よくいる種類の馬鹿だよね。
こういうタイプはフィボナッチヒープとか大好きなんだよな。
2020/09/19(土) 11:36:48.27ID:iDecIr7K
ArrayListおじさんはArrayDequeをどう評価するの?
2020/09/19(土) 12:38:52.28ID:2HkJedVD
>>162
グラフは何かしらのツリー構造を使うからLinkedListは使わないでしょ
2020/09/19(土) 16:29:00.47ID:4d+Mnie5
https://ideone.com/lH56m8
ArrayListとLinkedListを思いつくままに比較した。
結論は特に無し。
2020/09/19(土) 16:47:45.15ID:4d+Mnie5
https://ideone.com/O4aPii
sumi2 1,222,328 164,294,013 (1.000000:134.410742)
を追加。
2020/09/19(土) 17:53:59.50ID:Qry/LSKT
まだ続くなら、動的配列とリストの具体的なベンチマークのコードを載せてくれ
rustが好ましい
2020/09/19(土) 18:25:43.76ID:nFBIHSQH
>>167
Javaでは、末尾追加の aitと、途中削除の rit、先頭への追加 は、LinkedListの方が
速いという結果だね。
この場合、要素数が2万個だけど、もっと多くなると理論上、その差はいくらでも開いて行く。
また、単純に全要素を足すsumitとsumforでは、0.25%, 1.4% の差しかない。
逆に、末尾追加のalastは、ArrayListの方が4.8倍速い。
これはLinkedListの場合、1要素ずつメモリアロケーターを呼び出しているので遅くなっており、
予想通り。
しかし、先頭追加のa0とalastの時間差が、LinkedListではほとんどない(理論上は全くないのだが)
のに対し、ArrayListでは82倍もあるのも予想通りの結果。
LinkedListは、先頭、末尾、途中のどこを操作しても、理論上、時間差が(ほぼ)ないが、
ArrayListは、大きく違ってくるというのが理論上予想されたことで、このベンチマークは正しく
それを反映している。
2020/09/19(土) 18:27:51.00ID:nFBIHSQH
>>170
なお、末尾追加も、同じサイズのノードに限定したものなら、メモリアロケーターが
劇速のものが作れるので、LinkedListでも、ArrayListに匹敵するくらい速度が
出るように作れる。
2020/09/19(土) 18:28:30.00ID:nFBIHSQH
>>171
間違った。
匹敵どころか、要素数が多くなった場合、LinkedListが追い抜く。
2020/09/19(土) 18:30:31.19ID:nFBIHSQH
この結果は、JavaのLinkedListが、素直にLinkedListを素朴に実装しているから
出てきたもの。
一方、STLは、設計が悪いので初心者が誤解を招く結果が出てしまう。
それは、追加する場所をアドレスではなく、先頭からの通し番号で指定する
ことが標準になっていたりするから。
2020/09/19(土) 18:48:41.03ID:cxOsPIuF
>>173
> 先頭からの通し番号で指定することが標準になっていたりするから。

なんでそんな間違った前提を置いてるんだ?
C++ の std::list にそんな機能はないってことをたびたび指摘されてるが、
あんたは今までリンクリストの優位性がどうこう言ってたのとは別の人なんか?
(いや、そんなはずはないよな、こんな荒らし野郎が何人もいるとは思いたくない。)
2020/09/19(土) 19:00:07.16ID:iDecIr7K
Javaはmalloc/freeが超速いので、他の言語よりはLinkedListに優しい
176デフォルトの名無しさん
垢版 |
2020/09/19(土) 19:14:15.33ID:6s6pvu7S
>>175
どうせ妄想を書いてるだけだろ
2020/09/19(土) 19:22:13.23ID:k5fZduun
GC言語は領域の再利用をgc時に行うからnewの時に空きを探す手間が少ない。
単純に端っこから割り当てていくだけ。
2020/09/19(土) 19:39:34.30ID:nFBIHSQH
>>174
あ、記憶違いだったわ。
STLが汚すぎて。
2020/09/19(土) 19:57:18.05ID:X3OIhUCa
Listスレかな?
2020/09/19(土) 23:26:19.32ID:4d+Mnie5
https://ideone.com/NZEWm8
vectorとlistも比較した。
listのsumiとsumi2が小さすぎるので何か間違ってる予感。
全体的に古臭い書き方ですまそ。
2020/09/19(土) 23:52:44.02ID:61l8trcl
ゲームエンジン・データベースなどの本には、メモリプールを作る方法が、よく載っている

同じサイズの要素を、まとめて確保して、そのプール内で管理する方法
182デフォルトの名無しさん
垢版 |
2020/09/20(日) 00:02:10.17ID:MLu0Cj9r
次はhashmap vs vector
2020/09/20(日) 00:06:23.82ID:hvjw0ZD9
ここで定番のRustハッシュ関数遅い問題で一悶着
2020/09/20(日) 00:17:48.39ID:mlVvoUwY
>>167
実行順やJITの兼ね合いがあるから
ちゃんとやるならJMHで測ったほうがいいよ
185デフォルトの名無しさん
垢版 |
2020/09/20(日) 01:00:22.31ID:zH0CDqJ7
>>181
システムコールの呼び出し回数を押さえるため?
でも通常のmalloc/freeもプロセス再起動されなければ領域再利用されるよね。
なら最初にmallocでガバっと取って、実際に使う時にfreeしてmallocしなおせば良くない?
ゲーム専用機の場合はシステムのAPIもいまいちだったりするから自前でメモリ管理もありだと思うし、DBの場合もキャッシュやら共有メモリやらmmapしてどうたらで自前で管理したいのもわかる。
でもそれ以外で普通のOS上のアプリで自前でメモリプール管理するメリットってどれだけあるの?
2020/09/20(日) 01:12:40.58ID:GOdQy7G8
予め決まったサイズを確保することが多いから、予めまとめて確保しておいて数珠繋ぎにしておけば最速で出し入れできる
2020/09/20(日) 01:16:59.26ID:GOdQy7G8
16msecの間にすべての処理を完了しないといけないからmalloc呼び出しなんてありえないよ
2020/09/20(日) 01:29:40.54ID:mlVvoUwY
>>167
このデータの作り方だとLinkedListでもかなり連続したメモリ領域が使われてる可能性が高いような気がする

Javaの場合はList<int>じゃなくList<Integer>で
値を使うケースだとポインタを辿る必要があるのでそれも結果に影響しそう
189デフォルトの名無しさん
垢版 |
2020/09/20(日) 03:23:18.11ID:7hHTPvJJ
>>159 に答えれる方いませんか?
ここはリスト議論のスレッドですか?
2020/09/20(日) 08:14:35.07ID:nUMPJonN
>>184
情報サンクス。
JMH勉強になりました。存在すら知らなかったです。

>>188
AutoboxingとUnboxingも大事なところで平然とやりまくってるので、
こちらもご指摘のとおり結果をぼやかしちゃってると思います。
LinkedListはなるべく不連続にリンクされたデータを準備してみよう!
という心意気は当初あったのですが、サボりましたw
2020/09/20(日) 09:09:08.11ID:sD69NUu0
挿入が必要なら普通はヒープ組むのになんで誰も突っ込まんの?
2020/09/20(日) 10:27:51.76ID:iRiS7kHZ
テキストエディタのようなものだと、アプリを起動して編集し始めた時から、
新しく追加したデータに関しては、対応するノードは、Heapからアロケートしても、
連続したアドレスに載っている。
ロードした直後、最後の行のノードのアドレスと、編集で追加したノード
のアドレスが近い。
編集で追加した行の直前直後のノードのアドレスと、編集で追加したノードのアドレスは
不連続である。
しかし、キャッシュは、何も、最後の1つのページだけしか覚えておけないわけでなく、
1000種類位は覚えておける。
だから、このくらいだと、どちらもキャッシュに乗ることになる。

なお、ArrayListの場合、途中へ追加すると、半分近くの要素に対してコピー動作が
必要になるが、その際、キャッシュを全て使い切ってしまうことがある。
配列の全データが100MBだとすると、このコピー動作のために100MB分のデータが
いったんキャッシュに読み込まれる必要がある。
キャッシュはL3ですら8MB程度しかないので、これだと全くキャッシュが足りなくなる。
その点、LinkedListは、このようなキャッシュ汚染は生じない。
2020/09/20(日) 10:32:00.78ID:iRiS7kHZ
>>192
さらに、100MBのようなデータだと、ArrayListで全データを巡る際でも、
キャッシュミスもキャッシュ汚染も生じる。
だから、ArrayListがキャッシュで有利と言っても、現実的には2MBくらいまで
がその優位性は維持できない。
そしてLinkedListも実際的な用途では、>>192に述べたような状況になるので、
キャッシュミスは余り生じない。
2020/09/20(日) 10:48:59.50ID:iRiS7kHZ
>>193
テキストエディタの例だと、100万行のファイルを読み込んだとしても、
実際に閲覧したり、書き込んだりしたい場所は、数箇所に集中することが
多い。
LinkedListの場合だと、編集時に行を挿入する場合、全データを移動する
必要が無いので、1行当たり、数10バイトくらいのコピーで済む。
この場合、キャッシュ汚染はほとんど生じない。
一方、ArrayListだと、100万行のコピー動作が必要になり、その際に
キャッシュを浪費してしまう。
2020/09/20(日) 10:55:21.87ID:GOdQy7G8
L1,L2はkbyteオーダーだろ
余裕でキャッシュミスするわ

>>189
一言多いってよく言われないか?
2020/09/20(日) 11:02:59.45ID:iRiS7kHZ
>>195
>L1,L2はkbyteオーダーだろ
>余裕でキャッシュミスするわ
そこは、ArrayListで挿入する時の移動動作でもね。
2020/09/20(日) 14:40:25.89ID:2Z1dYVPL
なんでテキストエディタの例でArratListが出てくるんだ
198デフォルトの名無しさん
垢版 |
2020/09/20(日) 17:50:32.22ID:rmF3ZCsn
スレ間違ってますよ
199デフォルトの名無しさん
垢版 |
2020/09/21(月) 04:23:45.31ID:6Tk/tz3a
>>195
すみません。
スレチ馬鹿が多いので言わないと分からないかと思い書いてしまいました。
2020/09/22(火) 01:30:08.72ID:oMNW4x3G
CSのスレでも立てればいいのにな
無駄なマウントとプライドで議論になってないじゃん
201デフォルトの名無しさん
垢版 |
2020/09/22(火) 02:42:29.78ID:EwzeVKsQ
あっちで相手にされないからこっちに来るんだろう
2020/09/22(火) 02:55:14.94ID:3nDER7vv
あっちってどこ?
203デフォルトの名無しさん
垢版 |
2020/09/22(火) 03:04:18.34ID:EwzeVKsQ
本人にだけ判れば良いんだよ
2020/09/23(水) 23:05:59.13ID:JL46F86k
Rust 初心者ってか始めてもないけど、
fn main() {
  println!("Hello, world!");
}
これってセミコロン要るの?
2020/09/23(水) 23:22:55.07ID:O1ICXtuo
>>204
そのケースはコンパイラー的にはどっちでもいいけど
println!の戻り値をmain関数の戻り値として意識的に扱いたいわけじゃないだろうから
セミコロン書くほうがいいと思う
206デフォルトの名無しさん
垢版 |
2020/09/24(木) 04:24:32.56ID:sKL6gd3p
なんでreturn文省略するん
2020/09/24(木) 08:46:29.52ID:imaK44AN
>>205
なるほど。
たまたまprintlnの戻り値が()だからエラーが出ないんですね。
2020/09/24(木) 19:57:00.21ID:AHitBJm/
関数型のフリがしたいから。
2020/09/24(木) 20:40:06.68ID:aHCv/EIt
return省略は関数型なのか?
関数型をふりをするなら {} を省略して = で書くとかでは
2020/09/24(木) 21:02:07.22ID:anZxJGRt
lispのprognみたいな感じじゃね。
セミコロンを書くとその後に空の式があるようにみなすのはイケてないと思うけど。
2020/09/24(木) 21:34:50.13ID:sW11ypIO
expressionをstatementにするのがセミコロン
statementは`()`として扱われる
セミコロン不要にして必要に応じて`()`を明記するスタイルのほうがイケてたとは思う

returnを省略するのは慣習
関数を含めて式が値に評価されていくというメンタルモデルなので
”return文”という感覚ではないのかもね
2020/09/25(金) 01:43:09.63ID:rqLAnW3Q
C++系言語に見た目を近づけるという設計意図があるから()を明記するという判断にはならなかっただろうとおもう
2020/09/25(金) 06:33:09.44ID:JNOcuagu
戻り値型の宣言にも -> () っていちいち書かなくていいしなあ
そういうもんだとしか
2020/09/25(金) 07:11:20.18ID:LUJK9/4D
なんで戻り値は型推論してくんないんだろう。
2020/09/25(金) 07:33:16.25ID:SbSfhD0k
単純に、セミコロンの有無だけで区別するのが視認性が良くないんだよな。
エディタの方で違いを目立たせられたりしたらいいけど。
2020/09/25(金) 07:58:20.78ID:ZK6gJNpW
>>214
クロージャならやってくれるから技術としては可能だけど、
関数として定義するなら関数仕様としてimpl Traitまでは書こうねということと解釈している
2020/09/25(金) 19:12:30.94ID:yo3ZA1rx
>>215
いまさらどうにもならないが、使いはじめの頃は、もっと視認性のあるフレーズ使ってくれてたらなぁと思ってた。

例えば、F#の
hofe |> ignore
なんかは、冗長ではあるが逆に視認性も良く、捨てる気満々の書き方で気に入ってる。
2020/09/25(金) 23:12:55.80ID:ZK6gJNpW
そういえばelse節の無いif式は()に評価されるんだっけか
2020/09/25(金) 23:17:40.79ID:ZK6gJNpW
https://doc.rust-lang.org/reference/expressions/return-expr.html

ってかそもそもRustのreturnは式だったわ
return bar;はreturn文じゃなくて式文の一種だったわ
2020/09/26(土) 06:07:19.66ID:Jy/kksq4
コンピューターはともかく、人間にはreturnくらいの文字的冗長性があった方が視認性がいい。
2020/09/26(土) 08:31:48.23ID:2tuZfHCi
ifは末尾}に;不要なのにletは末尾}に;必要なのだるい
2020/09/26(土) 09:30:48.93ID:en54jqZM
>>220
returnがあればearly returnだと識別できるのでその意味では視認性は高い
ただセミコロンというC系言語経験者が注視しない記号に新しく重要な意味をもたせたから戸惑う

>>221
ifブロック末尾のセミコロンは常に省略できるわけじゃない
https://doc.rust-lang.org/reference/statements.html#expression-statements


セミコロンがないと意図通りパースできないケースってほとんどないと思うので
そのうちJSのASIのようなものでセミコロン不要になる未来もある気がする
2020/09/26(土) 10:01:37.83ID:GOW7LNc9
個人的にはセミコロンうんぬんよりifの中括弧が苦痛

/* c */
#include <stdio.h>
#define min(a, b) ((a) < (b) ? (a) : (b)) // スッキリ
int min2(int a, int b) {return a < b ? a : b;} // ややスッキリ
int min3(int a, int b) {
if (a < b) return a; else return b; // スッキリ?
}
int main() {
printf("%d ", min(3, 2));
printf("%d ", min2(3, 2));
printf("%d ", min3(3, 2));
return 0;
}

// rust
fn main() {
let min = |a, b| if a < b {a} else {b}; // 中括弧が嫌
//let min = |a, b| if (a < b) a else b; // これならスッキリ
//let min = |a, b| if a < b then a else b; // あるいはこれ
println!("{}", min(3, 2));
}

(* ocaml *)
let min a b = if a < b then a else b (* スッキリ *)
let () = print_int (min 3 2)
2020/09/26(土) 12:46:41.58ID:XnDuVG4Q
はいはいdangling else dangling else
2020/09/26(土) 13:01:32.24ID:nz56jET8
Goもそうだけど、条件式に括弧を使わないのがいまだに慣れない。
2020/09/26(土) 13:49:35.37ID:Rxc/dJS+
BASIC は要らなかったから慣れてる。
3項演算子考えたやつは天才。
2020/09/26(土) 14:34:05.78ID:d+bfMgei
>>225
本文 (?) の波括弧が必須だから
条件式の範囲は自明 (視認性的に) だってことなんだろうな。
2020/09/26(土) 14:40:21.79ID:Lg3GZEAb
>>225
そのへんとモジュールまわりはPythonの影響かなと思った
2020/09/26(土) 16:28:05.98ID:en54jqZM
>>228
PythonというよりRubyだろね
コアチームは過去も含めてRubyコミュニティ出身者が多いから

モジュールはPythonのようにファイルベースじゃなくキーワードで名前空間をきちんと切るし
クロージャの書き方だったりreturnを書かない慣習だったりも他言語に比べて類似性が高い
2020/09/26(土) 16:42:46.56ID:d+bfMgei
型システムは ML 系の言語でよくあるやつだし、
そっち方面の影響もあるんじゃないの?
2020/09/26(土) 17:41:02.34ID:iHt0gIo3
https://doc.rust-lang.org/reference/influences.html
2020/09/26(土) 17:52:07.70ID:YRaYmiXd
>>231
> Ruby: closure syntax

縦棒で引数囲むのはruby由来だったのか
2020/09/26(土) 18:02:33.75ID:2tuZfHCi
if a < b => a else => b っていう変なもんを思いついてしまった
だーめだこりゃ
234デフォルトの名無しさん
垢版 |
2020/09/27(日) 04:32:18.28ID:Wycq4Ck4
セミコロンとかはEdition上げて撤廃してほしいけど、ここまでRustのOSS書かれてたら無理だろなぁ...
2020/09/27(日) 07:58:10.90ID:ePGxxCtX
>>232
それはSmalltalkだろ
2020/09/27(日) 08:00:03.20ID:6sIZ9RBB
Rust, Go, Elixir などの新しい言語は、Ruby の影響が強い。
Ruby で最も良いのは、すべての進数の数値リテラルに、_ を含められること

こういうコメントを書かなくて済む
1000000 // 1_000_000
2020/09/27(日) 09:53:51.56ID:xq8pY9v9
戻り値の有無がセミコロンだけで区別されている現状をどうにかしないとそもそもセミコロン廃止なんて
無理だろうけど、セミコロンレスってそんなにいいかねぇ?

行の折り返しを間違えて別の文になってしまってもスルーされる場合があるのがなんか嫌。
ASIがあるJSでもメジャーどころのスタイルガイドはみんなASIを信用しないでセミコロン使うことに
なっているし。
pythonだとセミコロン使わないスタイルも多いけど、あっちはインデントで判別できるしね。
2020/09/27(日) 10:45:39.75ID:5NvF/cEJ
>>237
>ASIを信用しないでセミコロン使うことに

ASIを信用してないわけじゃないよ
ASIの仕様はJSの仕様で決まってるから例外的に挿入されない場合もはっきり分かってる
セミコロンを使うスタイルが多いのはミニファイとかを考慮してるから

JSの場合は普通に書いてる分にはセミコロンの有無でほぼ違いが無い上に
セミコロンレスで書いてもリンター使って自動挿入できるから実質書き手の自由
1行に複数文書いてるときでもなければセミコロンに特別な意味はないから気にする必要がない
2020/09/27(日) 11:08:19.83ID:OQ0JAVEc
セミコロンは基本的にはあっていいけどたまに}のあとに;必要なやつとかあったりしてこれはイヤ
2020/09/27(日) 11:27:51.54ID:xq8pY9v9
たしかに「ASIを信用しないで」というと疑っているみたいだから「依存しないで」の方が
適切だったかも。
いずれにしても、どのスタイルガイドもプログラマの意図と異なる判断がされる危険を
挙げていて、それを防ぐためには明示的にセミコロンを記述する方が良いと謳っている。
minifyはそれこそminify時にセミコロンを補完すればいいんだから関係ないと思う。
2020/09/27(日) 11:40:37.55ID:NFiicpwR
>>236
Verilog は 1985から出来てたけど?
多分、もっと古い言語からあったんだろう。
2020/09/27(日) 12:00:44.11ID:4LQaG5je
セミコロン撤廃要望多いとは思えないんだけどRFCとか書いてる人いるのか?
2020/09/27(日) 12:27:31.82ID:MoLnvbgN
セミコロン書き忘れる事は多々あるけど、意図しない値が返ってとかならない(はず)なので別に困らない
それより、Docs.rsに見にくいクレートが有る方が困る、AutoとBlanket以外のShow hidden undocumented itemsを
デフォルトで展開するオプションが有れば良いのに、この議題はどっかで見たような気がする。
2020/09/27(日) 12:34:01.78ID:FTgnsV+4
>>241
1967のPL/Iあたりからかな?登場時期からするともっと広まってもおかしくなかった気もするけど、16/32ビットリテラルしかなかった時代には需要なかったんだろうね。verilogは何ビットでもいけるから必要だけど。
最近は128ビット型とかBigIntとかでようやく必要になってきたってことか。
2020/09/27(日) 12:55:24.47ID:ePGxxCtX
rustのAPI documentなんか読みづらい気がする
うまく説明できないけど

型クラスのあたりも見づらい
2020/09/27(日) 13:55:00.63ID:5NvF/cEJ
>>240
きちんとした手順にそったminifyだけを指して言ったわけじゃないんだが
GoogleやAirbnbのstyle guideを見ると確かにそういう意図ではないみたいだね
npmやGithubみたいにセミコロンレスのstandard style使ってるところも多いから
「メジャーどころはみんなセミコロンを明示的に書く」というのはちと言い過ぎかな

いずれにしろJSの場合は1コマンドで一瞬で切り替え可能で書く時はどっちでいいから
Rustとはかなり事情が違うと思う
2020/09/27(日) 14:15:05.14ID:5NvF/cEJ
>>242
探してみたらRFCあったけどCloseされてた
https://github.com/rust-lang/rfcs/issues/2583

C/C++/G#/Javaあたりから来た人はセミコロンあるのが普通だろうけど
Go/Scala/Swift/Kotlin/Ruby/Pythonだとセミコロンないのが普通なので面倒くさく感じるのよ

RFCのやり取りや↓ここの議論を見るとセミコロンが不要になる可能性はもうないね
https://internals.rust-lang.org/t/make-some-separators-optional/4846
2020/09/27(日) 15:12:03.29ID:FTgnsV+4
セミコロンレスってフォーマット的な改行と文末の改行を文脈を見て判断する必要があるから好きじゃないなぁ。
一文が複数行になりやすいビルダーパターンとかイテレータアダプタの類いが特に。
入力する側としてはほとんど無意識に打ってるから特に面倒とも感じないし。
2020/09/27(日) 15:18:06.12ID:ePGxxCtX
IntelliJ使えばセミコロンを殆ど見えないような色に設定できるぞ
2020/09/27(日) 19:00:04.17ID:4LQaG5je
典型的なbikeshed
251デフォルトの名無しさん
垢版 |
2020/09/28(月) 01:45:21.81ID:1Vhx5XJ3
>>223
ocamlってセミコロン必要じゃなかったっけ?
2020/09/28(月) 07:53:40.34ID:cZtg7eSb
>>251
この例では必要になる場所は無い
253デフォルトの名無しさん
垢版 |
2020/09/28(月) 09:58:13.64ID:UVos1NUC
docsのフロント部分は特に強いUXデザイナーがいない感じがすごくする
2020/09/28(月) 18:49:05.66ID:5HiAAmxH
>>251
トップレベルの分を区切るのに;;を使う
ただしletの直前、ファイルの最後、などでは省略できる
https://ocaml.org/learn/tutorials/structure_of_ocaml_programs.ja.html
構文は
https://ocaml.org/releases/4.11/htmlman/language.html

let min a b = if a < b then a else b (* letの直前だから;;省略 *)
let () = print_int (min 3 2) (* ファイルの最後だから;;省略 *)
2020/10/01(木) 14:03:33.62ID:WCPslwmj
slice::windowsのstrバージョンみたいなのってないのでしょうか。
ようするにある文字列に含まれる連続するn文字を頭から順に返すイテレータを作ってくれるようなやつです。
2020/10/01(木) 18:29:40.74ID:HHhjPj0U
>>255
ないのでVec<char>を生成してwindowsを呼ぶとか

let cs: Vec<_> = String::from("あいうえお").chars().collect();
let ws: Vec<_> = cs.windows(2).map(|v| v.iter().collect::<String>()).collect();
2020/10/01(木) 18:54:04.45ID:i8Yvf3kp
文字幅が可変長 (utf-8) であっても windows みたいなことをするのはそんなにコスト大きくないよね?
ふたつのポインタを一文字ずつ進めるだけなんだから O(N) で出来るはず。
2020/10/02(金) 09:46:31.03ID:D4+ZSkLl
アロケートなしだと、
(0..s.len()-n).map(|i| &s[i..i+n])
となるけど自分で-nとか+nとかiとかやるのめっちゃアホくさいしそのうちミスりそう
2020/10/02(金) 14:20:31.00ID:iKrdrFom
>>258
アロケートなしならこれでもいけるはず。utf8を食わせると死ぬけど
.as_bytes().windows(2).map(|v| std::str::from_utf8(v).unwrap())
260デフォルトの名無しさん
垢版 |
2020/10/08(木) 09:18:16.25ID:PyhRFgfx
アロケートなしっていっても結局collect::<Vec<_>>()するんだからなしって表現は違うくないか
2020/10/08(木) 09:56:48.36ID:Ney38h5h
collectするとは限らんやろ
ヒット数だけ必要な場合とか
2020/10/09(金) 10:41:17.11ID:mqWQnM2v
Rust 1.47リリース
2020/10/12(月) 16:21:28.62ID:Z3Kcjb2S
Vec<T>って既に有る要素の中身を修正する方法はありますか。
有れば教えていただければ幸いです。
2020/10/12(月) 16:28:10.38ID:Z3Kcjb2S
自分が見た本ではvec[0]でアクセスする例は出てなかったと思うのですが
今ネットで見たところ
let mut vec = Vec::new();
vec.push(1);
vec.push(2);
vec[0] = 7
という例がありました。
Vec<T>の要素Tが構造体の場合、
vec[0]のアドレスを参照で受け取ってアクセスするには
let &mut a=&v[0];
a.xxx = yyy;
でよいのでしょうか?
(基礎が分かって無いだけかもしれませんが)
265デフォルトの名無しさん
垢版 |
2020/10/12(月) 16:30:35.47ID:ldeP4Qys
.get
.get_mut
2020/10/12(月) 16:48:39.55ID:Z3Kcjb2S
>>265
有難うございます。getは載っていたのですが get_mut は知りませんでした。
さらに質問させてください。
Vecに対する[]演算子のメソッド名(?)は何でしょうか?
2020/10/12(月) 17:02:51.68ID:tosLr/AM
std::ops::Indexとstd::ops::IndexMutをリファレンスで見て
2020/10/12(月) 17:06:26.06ID:tosLr/AM
>>264
>let &mut a=&v[0];

let a = &mut v[0];
2020/10/12(月) 19:19:30.09ID:Z3Kcjb2S
>>267
ありがとうございます。

>>268
なるほど言われてみれば文法的にそうでないと駄目でした。
しまった。
270デフォルトの名無しさん
垢版 |
2020/10/12(月) 19:50:22.11ID:ldeP4Qys
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=a388e403b6cd7afe902a9fd8618b5a65

質問内容とブレてたらごめんなさい
2020/10/12(月) 19:53:01.17ID:P0Nqqpd2
TがCopyだと let &mut a = &mut v[0]; ならコンパイル通っちゃうのは落とし穴かもしれない
2020/10/12(月) 19:54:11.97ID:P0Nqqpd2
>>270
get_mutをunwrapしちゃうなら普通に &mut v[0] で良いと思う
2020/10/20(火) 10:25:29.99ID:ohigEgI0
Rustは2番目にエネルギー効率の良い言語
https://okuranagaimo.blogspot.com/2020/10/blog-post_19.html
2020/10/20(火) 12:34:59.11ID:MZbW1JAa
アセンブラ使えないやつがいるとは。
2020/10/20(火) 19:00:44.91ID:CHq3Beyq
勉強始めたばかりですが変数のシャドーイングって必要ですか?

なんとなくグローバルに置いた変数もシャドーイングできそうなのですが実害は出たことありますか?
多分ないと思いますが…
2020/10/20(火) 19:31:52.86ID:KPdri9BA
Which Programming Languages Use the Least Electricity?
https://thenewstack.io/which-programming-languages-use-the-least-electricity/
> Energy consumed Run-time
> C 57J 2019 ms
> Rust 59J 2103 ms
> C++ 77J 3155 ms
> Ada 98J 3740 ms
> Java 114J 3821 ms
2020/10/20(火) 20:46:27.74ID:7hmMXh1W
デバッグやバグ修正に必要なエネルギーコストを加味したらCより効率よくなりそう
2020/10/21(水) 02:18:21.88ID:Q9+kxPSM
Rustはビルドでめっちゃ電力使うやろ
2020/11/01(日) 07:27:17.14ID:an3UASXf
let mut bt = (0..10).collect::<BTreeSet<_>>();
for e in bt.iter() {

// ここで条件に一致する要素をbtから削除したい

}
こんな感じのものを作りたくなったのですがどうすればいいのでしょうか?

うまい具合にやる方法が思いつかなくて以下のようにやっているのですが、なんというかすごくアホくさいというか・・・

let mut bt = (0..10).collect::<BTreeSet<_>>();
let mut temp = Vec::new()
for e in bt.iter() {
if e == Foo { temp.push(e); } // 削除予定のものをtempに入れる
}
for e in temp {
bt.remove(&e);
}
2020/11/01(日) 11:33:15.11ID:lQA9Y5E+
let bt = (0..10).filter(|e| eが要るなら真).collect::<BtreeSet<_>>();
じゃあかんのか
2020/11/01(日) 13:38:40.42ID:an3UASXf
btがこの例のとおりのものならそれでいいんですけど、
いろんな状況でbtに要素が追加されるっていう感じです

あと、if e == Fooはちょっと雑すぎましたif is_xxx(e)とかのほうがよいです
2020/11/01(日) 17:37:39.36ID:o3MRCmTo
コンテナのイテレーターのループ回してる間にコンテナの要素を追加や削除は出来ない。これは他のコンテナ(Vecなど)でもそう。どうしてもやるなら内部実装を理解した上でunsafeな方法で。
「いろんな状況でbtに要素が追加される」がループ中なのか何なのか分からないのでどうしようもないが、
let bt = bt.into_iter().filter(|&e| e == foo).collect::<std::collections::BTreeSet<_>>();
で新たなbtを作るか、
もとのbtから要素を削除するにしても
for e in bt.iter().filter(|&&e| e == foo).cloned().collect::<Vec<_>>() {
bt.remove(&e);
}
などでもう少し簡潔に書ける。
2020/11/01(日) 18:31:04.97ID:adfXjKjb
BTreeSet::drain_filter が安定化されるのを待とう

std::collections の unatable な機能を含めて切り出した crate とかあれば良いのに
2020/11/01(日) 18:31:59.68ID:adfXjKjb
>>282
Vec::retain がある。
2020/11/01(日) 19:09:00.30ID:o3MRCmTo
retainやdrain_filterについて不勉強だった。ありがとう。
2020/11/06(金) 03:44:45.46ID:S3a0GE/K
Rust book 構造体の章の以下のコード片なんですが
let mut user1 = User {
email: String::from("someone@example.com"),
email: String::from("someusername123"),
active: true,
sign_in_count: 1,
}

user1.email = String::from("another@example.com");
//コード片ここまで

最後の行でどこからも参照されなくなった元の
String::from("someone@example.com")
は、どういう理屈で解放されるんでしょうか?
もしGC言語なら最後の行でGC対象になるとこですけど。
Rust bookのこれ以前の章で、変数がスコープを外れるときdropが呼ばれることの説明はあったのですが、変数の束縛外れちゃったStringはいつ、どこで?
2020/11/06(金) 04:09:10.53ID:2cok4roU
>>286
最後の行でdropされるのは同じ
初期化済みの変数に新しい値を束縛したら古い値はdropされる
2020/11/06(金) 04:35:01.60ID:B4UB4dMh
>>287
ありがとうございます。
変数にバインドされてるヒープ領域がdropされるのはその変数がスコープを抜ける}の時ですよね。
>>286
初期化済みの変数に新しい値を束縛してる
user1.email = String::from("another@example.com");
から、
スコープが閉じる}まで、元の
String::from("someone@example.com")
のヒープ領域は解放されないということでしょうか?
user1.email = String::from("another@example.com");
の直後に解放されるのではなく?
2020/11/06(金) 07:48:41.67ID:aWxirctc
>>288
https://doc.rust-lang.org/reference/destructors.html

> Assignment also runs the destructor of its left-hand operand, if it's initialized.

だそうです
290デフォルトの名無しさん
垢版 |
2020/11/06(金) 08:36:34.29ID:HarnCsHz
考えてみりゃ確かにunstableのcrateってめっちゃいい案だな
use unstable::prelude::*;
で全部取り込める上にバージョンあげたらunstableから無くなってstdの方が挿し代わって使われるし
2020/11/06(金) 08:47:23.44ID:mKCogF8p
明らかに可読性悪い言語なのだがあと5年くらいしたらこの界隈も気づくかもね
292デフォルトの名無しさん
垢版 |
2020/11/06(金) 08:54:20.60ID:wXTP989a
5年先いくパイセン降臨
2020/11/06(金) 09:52:32.90ID:S3a0GE/K
>>289
なるほど!分かりましたありがとう
2020/11/06(金) 11:09:54.01ID:ifaT2orV
可読性が悪い「言語」ってそうそうあるもんかね
2020/11/06(金) 11:22:47.79ID:JyOrEzG9
それ、「俺様には理解できない」にderefされてます
2020/11/06(金) 20:08:48.42ID:g6FZ2Lxp
>>291
esolangはさておきAPLとかは難読言語といっても良いかも
あとは暗黙の○○が多い言語や記号が多い言語は初心者にとっては難読だと思うけど
Rustはこれらには当てはまらないと思うけど、どういう点で難読と思ったのか教えて欲しい
297デフォルトの名無しさん
垢版 |
2020/11/11(水) 20:37:16.07ID:ZuM/CkEs
>>291
お前は5年後もC++使ってろよ
2020/11/12(木) 10:54:00.16ID:uK53dAw4
fn foo(bar: impl Buzz)
というシグネチャは、
fn foo<T: Buzz>(bar: T)
の構文糖なんですよね?

では、
fn foo() -> impl Buzz
を、
fn foo<T: Buzz>() -> T
と書けないのはなぜなんでしょう?
2020/11/12(木) 11:47:01.17ID:tcFc7SO9
>>298
>fn foo<T: Buzz>(bar: T)
>の構文糖なんですよね?

違う
2020/11/12(木) 12:00:24.36ID:tcFc7SO9
とりあえずココを読むといい
https://doc.rust-lang.org/edition-guide/rust-2018/trait-system/impl-trait-for-returning-complex-types-with-ease.html
2020/11/12(木) 13:24:24.86ID:uK53dAw4
>>299
Rust bookにはsyntax sugarと書かれていたのですが…
https://doc.rust-lang.org/book/ch10-02-traits.html#trait-bound-syntax
> The impl Trait syntax works for straightforward cases but is actually syntax sugar for a longer form, which is called a trait bound; it looks like this:

>>300
ありがとうございます。
Rust bookはあんまり信用できないのかな…
2020/11/12(木) 16:23:24.97ID:tcFc7SO9
>>301
マジか
どっちも書いてる人は同じだから
引数ポジションについては細かい違いはあってもシンタックスシュガーなのかも

ただ戻り値ポジションの場合は
ジェネリックでは書き直せないから確実に違う
303デフォルトの名無しさん
垢版 |
2020/11/12(木) 18:49:52.91ID:C+/hhwIt
記号が多い言語は英語の苦手な日本人には有利だ
英文に近づけようとする言語は不利だ
2020/11/13(金) 19:01:00.42ID:nD6TGu67
そんなあなたにPerlがあるよ
2020/11/13(金) 23:39:03.73ID:RhbFV+AU
APLもおるでよ
2020/11/14(土) 06:16:49.16ID:6dxHy4Fn
python最強じゃん
2020/11/14(土) 09:55:40.26ID:B7e1nuZg
LISPかな。まあ記号と言っても括弧ばっかりだが。
2020/11/14(土) 10:07:50.72ID:DnZAmAgg
「Lots of Isolated Silly Parentheses」の略だからな。
2020/11/14(土) 10:52:27.43ID:wQlu6eHI
>>300
読んでて知ったけど::<T>のことturbofishっていうんだ
かわいい
2020/11/14(土) 12:17:47.68ID:dRjRf4O1
わかる https://turbo.fish
2020/11/14(土) 13:14:02.66ID:DnZAmAgg
The name "turbofish" was made up by reddit user deadstone in 2015, and has since caught on in the Rust community, being used even in the official documentation.
「turbofish」という名前は、2015年にredditユーザーのdeadstone氏によって作成され、それ以来Rustコミュニティで定着し、公式ドキュメントでも使用されています。
312デフォルトの名無しさん
垢版 |
2020/11/15(日) 04:06:11.96ID:H90rIdiK
function<>()の方が良かったけどね。パーサーの複雑性があって解決されてなく、もうここまで広まったしいいやってなってるけど
2020/11/15(日) 23:56:20.08ID:HUIHtxgp
>>301,302
型制約と存在型じゃ概念が違うから構文糖は語弊がある。
生成するコードはどちらもモノモーフィックな関数吐くけど存在型は第一引数の違いだけでコンパイル時に
ディスパッチ先が一意に決まらないケースが有るからマルチメソッドを直接サポートしない弊害があるかな。
314デフォルトの名無しさん
垢版 |
2020/11/20(金) 21:14:37.50ID:YhokOqrJ
Rust 1.48リリース
2020/11/20(金) 21:23:36.45ID:g8U1YOSi
Internet Archive、Flashコンテンツをアーカイブ プラグインなしで21年以降も閲覧可能に
https://www.itmedia.co.jp/news/articles/2011/20/news143.html

プログラミング言語Rustで作られたFlashのエミュレータ「Ruffle」を使うことで、Flashプラグインをインストールしなくても、WebAssembyが動作するWebブラウザさえあれば動作するとしている。
2020/11/20(金) 23:10:09.72ID:znicv9zG
すげえなww
でも先人の苦労の作品が残ってよかった
2020/11/22(日) 16:39:30.67ID:ujQ9d+0r
Rust bookのDropトレイト解説のページ ( https://doc.rust-jp.rs/book-ja/ch15-03-drop.html ) で質問です。
以下のようなコードなのですが、

struct CustomSmartPointer {
data: String,
}

impl Drop for CustomSmartPointer {
fn drop(&mut self) {
println!("Dropping CustomSmartPointer with data `{}`!", self.data);
}
}

fn main() {
let c = CustomSmartPointer { data: String::from("my stuff") };
println!("CustomSmartPointers created.");
}

これ、dropの実装部分にprintln!しか書かれてませんが&self.dataの処理は書かなくてよいのでしょうか?
例えば、println!の下に、
drop(&self.data);
のように。
どちらかがコンパイルエラーになるならいいのですが、書いても書かなくてもどちらでも問題なくコンパイルが通ってしまい、困惑しています。
2020/11/22(日) 16:58:52.26ID:JIsF8Dpm
>>317
もう少し細かい話はこの辺に書いてあるよ。
https://doc.rust-lang.org/std/ops/trait.Drop.html

簡単に言えばそのdataは勝手に解放されるからdropは不要。
解放以外で何か処理したいなら書けばいい。
drop(&self.data)としたとしても、それは参照を作ってその参照を即座に破棄してるだけなので特に意味はない。
本当にdataを解放したいならdrop(self.data)になるけどこれはコンパイルエラーになるはず。
2020/11/22(日) 17:05:23.09ID:JIsF8Dpm
あ、最後の行のは多分deref抜けてるな。
いずれにしてもdropするなら所有権を取る必要があるけど、
&mut selfからdataの所有権を取る方法はないので
正しくdropするコードを書けばエラーになるはず。
2020/11/22(日) 17:16:38.55ID:ujQ9d+0r
>>318-319
おお、
drop(self.data);
でも
drop((*self).data);
でも同じ、
cannot move out of `self.data` which is behind a mutable reference
エラーでました!
スッキリしましたありがとうございます。
std::mem::dropの実装って
pub fn drop<T>(_x: T) { }
だったんですねぇ…
2020/11/24(火) 00:31:06.85ID:EBaS3Lgi
Rust bookのRefCell解説のページ ( https://doc.rust-jp.rs/book-ja/ch15-05-interior-mutability.html ) で質問です。
以下のようなコードなのですが、

pub trait Messenger {
fn send(&self, msg: &str);
}

pub struct LimitTracker<'a, T: 'a + Messenger> {
messenger: &'a T,
value: usize,
max: usize,
}

impl<'a, T> LimitTracker<'a, T>
where T: Messenger {
pub fn new(messenger: &T, max: usize) -> LimitTracker<T> {
LimitTracker {
messenger,
value: 0,
max,
}
}
// 以下略

pub struct LimitTracker<'a, T: 'a + Messenger> {
の行でトレイト境界に
'a + Messenger
を指定しているようなのですが、
このような書き方今までに出てこなかったので試しに
pub struct LimitTracker<'a, T: Messenger> {
と書き替えてみたところ、警告もなしにコンパイルできてしまいました…
これ、何の意味があるんでしょう?
2020/11/24(火) 01:32:20.18ID:mGIqKDo2
>>321
とりあえず最新のThe Bookを見たほうがいいんでない?
https://doc.rust-lang.org/book/ch15-05-interior-mutability.html

https://doc.rust-lang.org/edition-guide/rust-2018/ownership-and-lifetimes/inference-in-structs.html
2020/11/24(火) 14:58:09.97ID:p7TzmKlx
>>322
ズバリのページありがとうございます!
324デフォルトの名無しさん
垢版 |
2020/11/24(火) 21:59:32.67ID:wabd38wc
どういたしまして
2020/11/25(水) 14:15:02.94ID:3ZJ1Ge7R
&mut TがCopyとCloneをimplしていないのは理解しているんだけど

let a: &mut i32 = &mut 0;
let b = a;
dbg!(a);

これがaがムーブされてエラーになって

let a: &mut i32 = &mut 0;
let b: &mut i32 = a;
dbg!(a);

これがエラーにならないのはナンデ?
2020/11/25(水) 14:51:10.49ID:wYoO0jiQ
>>325
それが借用でしょ。
2020/11/25(水) 14:59:59.26ID:wYoO0jiQ
>>325
b が使われないことはわかってるので無かったことになる。
b が使われるなら借用中ということでエラーになるよ。

↓ これはエラーになる。

let a: &mut i32 = &mut 0;
let b: &mut i32 = a;
dbg!(a);
dbg!(b);
2020/11/25(水) 15:24:43.58ID:s/U6WABr
これは僕もエラーにしてほしいなあ
何か深い理由があるんだろうけど…
2020/11/25(水) 22:28:12.61ID:70iTIiqa
let a: &mut i32 = &mut 0;
let b: &mut i32 = a;
dbg!(b);
dbg!(a);

これをOKにしたいんだから3行目が無くてもOKなのは必然
2020/11/25(水) 22:32:25.21ID:g8/riQpL
エラーにしたい理由がよく分からんな。
実際bを使ってないんならエラーになる意味がないし、
typoでbを使い損ねてるならbが未使用のwarningは出るから気付けるし。
2020/11/26(木) 02:46:48.20ID:Hqg/GFYt
>>329
えっ? て思ったけど確かに通った……
どっちも同じ&mut i32に見えてライフタイムが違うのか
2020/11/26(木) 10:22:00.12ID:LVnm3iYq
fn noop<T>(t: T) -> T {
t
}

let a: &mut i32 = &mut 0;
let b = noop(a);
dbg!(b);
dbg!(a);

これはエラーになる

let a: &mut i32 = &mut 0;
let b: &mut i32 = noop(a);
dbg!(b);
dbg!(a);

エラーにならない
ナンデ?
2020/11/26(木) 14:53:19.68ID:LVnm3iYq
https://users.rust-lang.org/t/questions-about-mut-t-and-move-semantics-mut-t-is-move-only/37484/13
ナンデかわかりました
implicit reborrowというものらしいです
2020/11/26(木) 16:45:55.16ID:02Rh/1GY
俺も↓これみてやっと分かった
https://github.com/rust-lang/rust/issues/35919#issuecomment-304130115
https://stackoverflow.com/a/58587870

関数のシグニチャの場合を含めて型が明示されてれば
&mut T -> & mut Tの場合でもimplicit reborrowが発生してmoveじゃなくなる
(auto-reborrowやreborrow coercionと呼んでる人も)

今まで気にしたことなかったわ
2020/11/26(木) 17:14:06.85ID:O9/RzT4k
なんでこんなの入れたんだろう…
2020/11/26(木) 18:11:09.60ID:02Rh/1GY
Type Coercionの一貫
ここに少し理由が書いてある
https://doc.rust-lang.org/nightly/nightly-rustc/rustc_typeck/check/coercion/index.html

↓これも同じ理由でエラーにならない
let a: &mut i32 = &mut 0;
let b = a as &mut i32;
dbg!(b);
dbg!(a);
2020/11/26(木) 23:01:58.61ID:SYxS73xz
最後にアクセスしたところで借用が終了すると思えば特に違和感はない
2020/11/26(木) 23:48:56.99ID:O9/RzT4k
変数宣言時に決まらず、今後スコープが終わるまでに使われるか使われないかで変わってしまうのか
2020/12/04(金) 00:56:22.75ID:g/NRvcV0
>>334
>&mut T -> & mut Tの場合でもimplicit reborrowが発生してmoveじゃなくなる
stackoverflowの方でも説明されてるけど、&mut T -> & mut Tじゃなくて&'a mut T -> &'b mut Tだな。
2020/12/04(金) 03:01:18.62ID:2+VKdPy1
implicitにする必要あった?
便利さより明示・明確で行って欲しい
2020/12/04(金) 11:37:04.89ID:OAjYDL2x
>>334のstackoverflowのコメント見れば必要だとしか
間違えたら単にコンパイルエラーになるわけで
342デフォルトの名無しさん
垢版 |
2020/12/06(日) 23:56:40.78ID:0jqklMIU
imple Trait for Something のTraitとSomething、逆の方が良かったなぁ
トレイトはまとめてモジュールにされることあるからimportしてからstructの直下でimplするからimpl struct with traitのほうが可読性高い、git的にも綺麗な差分の表示にもなるし
これなんか明確な理由とかないのかな?
2020/12/07(月) 00:00:26.20ID:owPfoMMb
ないでしょうね
どっちにでも設計できたでしょうし
2020/12/07(月) 00:39:06.96ID:O/wMvD4W
昔は impl Struct :Trait {} だった気がする
: だとどっちがどっちかわかりにくいみたいな議論はあったような
2020/12/07(月) 00:39:59.19ID:O/wMvD4W
あと impl Struct with Trait だと Struct "を" 実装すると読めるのがイマイチな気はする
2020/12/07(月) 01:03:15.94ID:BaEMz00S
impl Struct with Traitだと複数書くと同一Structを何回もimplすることになってちょっと変かも
このあたりはネイティブだと「てにをは」がおかしい感じに見えるのかもね
2020/12/08(火) 21:05:17.59ID:4EYeOh4b
lifetime関係で文句言われまくって暗黙にした部分が多いんだろう。。そんな輩にrust使わせる必要なんてないのに。
2020/12/09(水) 00:30:14.37ID:jODQKuwy
暗黙はイヤだあぁ〜っ!!
2020/12/09(水) 10:40:53.58ID:LSaC/unp
適当なライフタイムパラメータをつけるとコンパイルできることもあると学んだ
2020/12/09(水) 13:24:40.25ID:WuZTb4kZ
qiitaに久々に良記事あったわ
2020/12/09(水) 13:27:46.69ID:jODQKuwy
>>350
ヒントくれ
2020/12/10(木) 11:18:18.25ID:U7s1vwLT
>>296
可読性と言うか記述性が悪いし、そもそも厳密な仕様が公開されていない
部分が多い。例えば後者についてはライフタイムとか。
2020/12/10(木) 11:43:02.02ID:U7s1vwLT
>>294
実際には沢山あって、例えば、makefileやUnixのシェルスクリプト、BATファイル、
Perlの関数呼び出しなんかがある。
2020/12/10(木) 11:57:47.75ID:U7s1vwLT
正規表現やLISPなんかも可読性が低い。
2020/12/10(木) 12:16:53.52ID:hyB2wVsL
LISPが可読性低いはモグリ
2020/12/10(木) 12:25:40.73ID:YXjbRyJb
クポー!
2020/12/10(木) 12:41:56.12ID:oYgS32h8
>>352
具体的な記述例上げてくれないと何の説得力も無いぞ
2020/12/10(木) 15:03:07.81ID:YBB2SlAl
いつものヤバイ人だってすぐわかるだろ
荒らしの相手をするのも荒らしだぞ
2020/12/11(金) 11:56:33.87ID:/1hdqM5e
Cを日常的に使っていた人がRustに移行しようとするとやりたいことが出来なくて
馬鹿馬鹿しくなる。
数学的には完全に安全な書き方なのにRustには怒られる。
2020/12/11(金) 12:12:02.16ID:NpU6prgS
Rust by Example によれば
drop が (自動で) 呼ばれるのは「スコープの終わり」と書いてあるけど、
それは変わってないと考えていいよね?
最終のアクセスがスコープのまんなからへんだったとしても、
drop はスコープの最後ってのは今でも保証されるんだよね?
2020/12/11(金) 12:22:51.07ID:aOnuSvpC
っぱ、D言語よ
2020/12/11(金) 12:39:48.46ID:RI9UvvOD
>>360
>>289
2020/12/11(金) 18:10:27.06ID:7ILiijQb
数学的に完全に安全であるって証明を必要十分な早さで必要十分な量のコードに対して出きる人なら
おとなしくC使ってた方が良いんじゃないですかね
2020/12/11(金) 20:55:17.88ID:FrajMXPf
>>359
自信あるならコード見せてみな?
https://play.rust-lang.org/
2020/12/12(土) 01:56:14.01ID:4q8SABHv
>>364
いやです。
2020/12/12(土) 01:56:52.38ID:4q8SABHv
>>363
少なくともRustは使いません。
2020/12/12(土) 02:31:40.86ID:ub7HMY53
>>366
さようなら
2020/12/12(土) 02:52:34.60ID:4q8SABHv
問題点を指摘されたら排除する風潮。
2020/12/12(土) 02:55:04.93ID:ub7HMY53
だってあなたがここに残っても得られる物何もないでしょ
370デフォルトの名無しさん
垢版 |
2020/12/12(土) 03:02:09.48ID:SyIWV3x/
アメリカでは人気言語なんだろ?
つまり問題なく安全に使えてるってことだよね
2020/12/12(土) 03:03:58.91ID:4q8SABHv
>>370
本当はそんなに人気無い。
372デフォルトの名無しさん
垢版 |
2020/12/12(土) 03:12:39.08ID:SyIWV3x/
全お前の中ではそうだろうね
2020/12/12(土) 03:12:53.23ID:Dxj0vT3B
>>359
なんでunsafe使わなかったの?
2020/12/12(土) 15:08:06.15ID:c8Fd2aiR
>>365
なぜ?
数学的には完全に安全なのに
375デフォルトの名無しさん
垢版 |
2020/12/12(土) 15:30:46.47ID:0QXb5/mT
数学的にもOKでも、書いてるのはコードなんだからプログラミング的にもOKじゃないといけない
っていうマジレスでいい?
言語には仕様があるわけでどの言語でもそうだろ。
そもそもプログラミングしない方がいいよ、数学でもしてりゃいいじゃん
2020/12/12(土) 16:08:31.70ID:Xc3o7Cw9
コンパイラが証明できないけど人間が証明できるときのためにunsafeがあるんだから使えばいいのに
2020/12/12(土) 16:37:40.21ID:M7Hs6d8R
数学的には完全に安全ww
こんな低脳ワード使ってるやつ相手にして君たち頭おかしいんとちゃう?
2020/12/12(土) 17:13:45.58ID:ub7HMY53
完全に安全ってフレーズだけは韻踏んでて好き
2020/12/12(土) 18:01:42.98ID:E+dxDDH/
チューリング安全
2020/12/12(土) 23:00:12.57ID:a3JdWCxW
ヨシ! 今日も一日 ご安全に
2020/12/12(土) 23:31:38.16ID:Updd5mRQ
今日は安全日なの。
2020/12/12(土) 23:32:54.53ID:obc9b6E9
まあrust使ってれば完全に安全とか言い出す馬鹿もいたしどこにでも馬鹿はおるわ。
2020/12/13(日) 02:17:41.84ID:1g8P/X2h
rustでRSSリーダー作れましゅか?
2020/12/14(月) 12:25:27.59ID:6iyAwzKw
色々調べて学んでみたが個人的にはRustは好きな言語ではないし
本の帯に書かれているようなC/C++の代替になるようなものではない。
メモリー安全なのはポインタが理解できない人向け。
Ruby/Puthon/JSのようなスクリプト言語的な使い方ならある程度できそうだが
それらより遙かに難しくなっている側面が有ることも否めない。
C/C++のように自由にデータ構造を作るには向いていない。
C#やJavaは速度は落ちるが、C/C++のコードを容易に移植できたが
Rustは出来ない。
2020/12/14(月) 12:30:01.03ID:6iyAwzKw
>>384
C#やJavaは、データ構造やアルゴリズムを自由に作りやすいC/C++の自由さを
速度やメモリー効率を落とすことで初心者やポインタが理解できない人でも
手に入れることが出来る言語であった。
RustはC/C++と比べて効率は落ちにくいが C/C++の自由さは手に入らない。
ポインタを良く理解している人であってもRustのsafeモードでは独自の
データ構造やアルゴリズムを作るのは非常に難解。
なぜならライフタイムやBox<T>などの仕様が明言されて無く不明確だから。
2020/12/14(月) 13:20:59.79ID:P41Kk9Hq
>>384 6iyAwzKw
>>385 6iyAwzKw
せっかく関心しかけたのに、自演で信頼性を損なうな
2020/12/14(月) 13:30:32.20ID:B3PAtuba
いつもの人だし関心するような内容あったか?
2020/12/14(月) 13:39:47.48ID:P41Kk9Hq
すまんな、rustスレ初めて覗いたんだ
2020/12/14(月) 14:39:07.69ID:GNvWdWeF
>>388
いや、実際に関心する内容があったんならそれはそれでいいんだが
あと別に自演失敗したとかじゃなく、Twitter的な感じでリプライで補足しただけでは
別人を装う気は微塵も感じられない
2020/12/14(月) 14:40:42.59ID:olJ8vT42
この人ほんとゴミやな
Rustは優秀な老害フィルターかもしれん
2020/12/14(月) 15:05:11.25ID:GNvWdWeF
嫌いなものを無理に使う必要ないんだが、それを何度も何度も言いに来られてもな
説明しても聞く気ないし
2020/12/14(月) 15:39:33.85ID:SRefut4W
仕様が公開されていないおじさん
2020/12/14(月) 16:56:39.26ID:XcunzViE
数学的に正しい仕様が公開されてないおじさん
2020/12/15(火) 09:41:38.47ID:uMItmhUb
老害に失礼だろ(笑)
2020/12/15(火) 09:52:45.57ID:ndUamRAR
具体的に何ができないか言ってくれないとただのお気持ち表明でしかない
2020/12/15(火) 16:41:25.69ID:DgOkpJ7c
リングバッファ実装でさえunsafe使わなきゃ無理だろ。
2020/12/15(火) 18:07:45.20ID:08XnxdOZ
リングバッファにunsafe必須とか正気か?
何も分かってないだけじゃん
2020/12/15(火) 18:38:51.06ID:cTRY0FQu
仮に unsafe 必須だとしてそれがどうだっていうんだ?
2020/12/15(火) 19:50:18.09ID:DgOkpJ7c
なるほどunsafeでもかまわんと。。まあそれでいいならそれでいいんじゃないですかね。
rustの旨味半減もいいとこだが。
https://github.com/rust-lang/rust/blob/master/library/core/src/alloc/mod.rs
2020/12/15(火) 20:31:28.92ID:ndUamRAR
Vec使ったsafeな実装もできるだろうし、
パフォーマンスを求めるなら直接allocのAPIを叩くunsafeの実装もできる

dogmaticにならず目的に応じて適切な手段を使い分けられるというRustの良いところの例だと思うが
なんでunsafe使ったら負けみたいな思考になるのかが分からない
2020/12/15(火) 20:32:49.79ID:WLyCzOT+
むしろ libc crateだけで作ればいいんじゃないか
2020/12/15(火) 21:30:40.05ID:+RD1gPFt
unsafe使ったリングバッファで数学的に完全に安全てw
自分の書いたロジックをコンパイラが検証してくれないって話だったのかよ
2020/12/15(火) 21:56:57.57ID:/27NEAtR
safeとunsafeを混ぜられるところはまさにRustの旨味そのものなんだが
2020/12/16(水) 01:59:42.07ID:yml2nxMy
そこまでしてRust使うならC++で十分。
2020/12/16(水) 07:41:21.74ID:L6k9APCP
>>404
unsafeじゃない実装もできるいうてますやん
2020/12/16(水) 11:49:20.44ID:tsGP+5/P
全部unsafeで常に安全性に気を使わなければならないC++
一部のunsafeな箇所の安全性にさえ気をつければ、大部分のsafeな箇所はコンパイラに従うだけで安全になるRust

C++の方が楽と感じるのはなぜ?使い慣れているから?コンパイラに叱られないから?
2020/12/16(水) 12:51:22.00ID:N/7dwjAk
数学的にというがそれはどうせ高校までの数学でしょ?
大学で教わった群論や離散数学を含んでるのか?
2020/12/16(水) 12:57:08.01ID:XkwPQibg
数学的に安全というのはCoq使って検証したとか
言ってもらわないとなあ
2020/12/16(水) 13:02:30.37ID:2c+prgNQ
一気に議論がチープになった
「数学的」でNG推奨
2020/12/16(水) 13:56:32.92ID:zVHRhpaQ
RustBeltやRustHornみたいな取り組みに期待したい
2020/12/16(水) 14:07:09.63ID:tsGP+5/P
miriってどうなの?
2020/12/16(水) 14:47:33.79ID:zVHRhpaQ
miriは普通に使えるんじゃない?
といっても実行パスでUB踏んでないか見るだけだから
RustBeltみたいな証明とは違うけど
2020/12/16(水) 16:16:13.30ID:qBZDuvPr
>>409
お前それ数学的に証明できんの?
2020/12/16(水) 18:05:54.84ID:QJd1nMyw
>>406
はっきりいえば、頭がいいから。
学生時代、ほとんど数学は満点だった。
2020/12/16(水) 18:20:40.19ID:YefQ566E
>>414
私は馬鹿だから、あなたがとってもうらやましいですね…
2020/12/16(水) 18:22:19.17ID:tsGP+5/P
>>414
C++の言語仕様完全に理解してそう。すごい
2020/12/17(木) 00:47:25.43ID:X4tT/GwL
>>406
普通にc++使ってれば安全性に気を使わなきゃならん部分は一部だとわかるし、
それがどういう部分かと言えばrustがunsafeで書かなきゃならん部分だからだよ。
2020/12/17(木) 15:00:55.83ID:dPcuBcMK
>>417
それでもミスるのが人間。そういった経験からシステム的にミスを無くそうと試みているのがrust。
それをわかった上で俺はミスしないって言ってるのはただの経験不足か、プログラムを全然組まないやつだな。
2020/12/17(木) 16:21:39.70ID:lSe9thVt
>>417
(とりあえず unsafe を使う必要がないようなコードで)
Rust を使って最初からエラーなしで通すことが出来るんか?
それでどこかで引っかかるようなら C++ でもたぶん出来てないぞ。
2020/12/17(木) 17:13:31.93ID:lDGBWs83
触れるなよもう……
421デフォルトの名無しさん
垢版 |
2020/12/17(木) 17:54:41.43ID:Lgh9khpQ
cd ~/.cargo/registry/index/github.com-1ecc6299db9ec823
git pull https://github.com/rust-lang/crates.io-index.git
422デフォルトの名無しさん
垢版 |
2020/12/17(木) 19:07:39.53ID:mqVedE2Y
D言語はどうなったんや?
423デフォルトの名無しさん
垢版 |
2020/12/17(木) 19:08:57.68ID:h5oPvIGR
まだ生きてんだw
2020/12/17(木) 19:35:09.90ID:zyd/WMbf
D言語のリファレンスって平易な英語で書かれていて、自分でドキュメントを書く時にすごく参考になる
2020/12/18(金) 03:45:53.54ID:WanfFh5H
>>418
俺は高IQで、数学が得意だったので、C++で何10万行のプログラムを書いても、
経験的にメモリ関連のバグが起きる確率はとても低い。
一般プログラマには当てはまらないかも知れないが。
2020/12/18(金) 04:06:31.91ID:4UaQE5Dn
経験的ねぇw
数学得意な奴が使いそうな言葉だねw
2020/12/18(金) 04:42:51.11ID:vRuKil8l
>>425
メモリ関連のバグは「確率が低い」では全然だめですよ、バグを作ってしまうことは仕方ないにしても、最初から根絶を目指さなくてはいけないかと
私なら、最低限 new/delete はオーバーロードしてラッパを書き 未 delete・重複 delete くらいは確認しておきますね
まあ、最近はお気楽に unique_ptr, shared_ptr で妥協することがほとんどですが、weak_ptr はちょっと怖くて使わないようにしています…
2020/12/18(金) 08:33:16.84ID:8E8ygoYj
>>425
あなたのプログラムでバグが起きる確率が低いことはどのように検証したのですか?
2020/12/18(金) 11:50:56.29ID:2oY35fJZ
経験的に、そうだからです
2020/12/18(金) 12:17:36.04ID:QLPAoxRE
そう、未だ気づかれていない大量のバグが潜んでいるのだった
2020/12/18(金) 15:39:43.38ID:WanfFh5H
みんな同じじゃないぞ。
頭にも才能があるのを忘れるな。
そうでないと高IQ者が活躍できない。
432デフォルトの名無しさん
垢版 |
2020/12/18(金) 15:43:18.03ID:WanfFh5H
>>427
QZは馬鹿。
2020/12/18(金) 15:54:37.91ID:ivKQNPRV
>>432
>>431
たしかに高IQの人の言ってはることがさっぱりわからなくて…
というか、高IQ だと私が思っていても実は、IQ=100 の人だったりして…
ということで、私のIQは80くらいだと思っています
2020/12/18(金) 15:56:33.29ID:WanfFh5H
>>433
普通、高IQといえば、IQ=140以上だろう。
2020/12/18(金) 16:25:31.81ID:D1qPLrji
IQ高いけどとても残念な人なんですね
2020/12/18(金) 16:45:14.29ID:e23FtnoV
>>434
メンサの方ですね、証拠をどうぞ
2020/12/18(金) 16:58:40.57ID:y5AIURZA
>>431
それでメモリ関連のバグの有無はどういう基準で判定してるんですか?
2020/12/18(金) 16:58:41.81ID:WanfFh5H
QZの方が最悪だ。
自分と自分の周りの価値観がすべてだと思っている。
平均の人々と秀才とはどこまで行っても違う。
言語の好みから何から何まで。
必要としていることも何もかも。
2020/12/18(金) 17:20:09.25ID:ivKQNPRV
>>438
>自分と自分の周りの価値観がすべてだと思っている。

私は私の持つ価値観以外にも、別の価値観やセンスオブバリューが存在し、かつ、私の持つ価値観よりも優れた価値観が存在し得ることも想定していますが、
私の発言の中に「自分と自分の周りの価値観がすべてだと思っている」とあなたに感じさせた部分がありましたら、是非ご指摘いただけるととても嬉しいです
2020/12/18(金) 17:46:11.20ID:OB9lVkoO
経験的に数学的に完全に安全
これが高IQ語法か
2020/12/18(金) 17:55:52.91ID:ivKQNPRV
>>440
それって変てこな語法ですよね
数学的に正しいのであれば、それは経験とか履歴とかヒストリーとかにまったく関係なく、
数学的に正しいと証明された時点で、現存宇宙のビッグバン以前、宇宙死以後にも、数学的に正しいのに

ど う し て 「 経 験 的 」 と い う 単 語 を 使 用 し て い る の で し ょ う か ?
442デフォルトの名無しさん
垢版 |
2020/12/18(金) 19:22:04.03ID:ZgVdoEAh
>>425
残念ながらお前の同僚や部下は違うんだ
2020/12/18(金) 19:41:43.87ID:0PDslekh
>>436
年内に会費払わなきゃいけないのを思い出した。ありがとう。
2020/12/18(金) 20:59:10.26ID:ivKQNPRV
>>436
メンサの人ってどんな人なんでしょう?
一度お会いしたいです
お話しするなかで、私のような馬鹿がもう少し生きやすくなるコツみたいなものが私にも感じられたら(多分理解は無理だと思います…)とても嬉しいですね
2020/12/18(金) 22:14:54.92ID:+Wrhvh6s
せっかくのRustスレなのにどうしてこんなカオスなスレになっちまったんだ…
2020/12/18(金) 22:29:37.14ID:y5YMvzUM
キチガイに構っても得るものはない
447デフォルトの名無しさん
垢版 |
2020/12/18(金) 22:30:30.78ID:tYOLON+r
unsafeの必要性がよくわかっていいじゃない
2020/12/18(金) 22:40:26.63ID:CFV0tuU9
専門板名物
2020/12/22(火) 13:40:54.01ID:n+6lDw0n
from_str を実装しようとしています。
入力となる文字列 (の一部) をスライスとして保持するようなデザインにしたいのですが、
ライフタイムの整合性を取れる書き方が出来ません。
FromStr はそういうことが出来ないように制約付けられたトレイトということなのでしょうか?
それとも工夫してどうにか出来るでしょうか?

やりたいことをコードで言えばこんな感じです。

use std::str::FromStr;

struct foo<'a>(&'a str);

impl<'a> FromStr for foo<'a> {
type Err = &'static str;
fn from_str(s: &'a str) -> std::result::Result<Self, Self::Err> {
Ok(foo(s))
}
}
2020/12/22(火) 15:57:10.65ID:RsVnnyiY
>>449
できない
2020/12/22(火) 16:08:49.13ID:I4oG7AXR
>>449
FromStrはライフタイムを持ってないので無理
https://doc.rust-lang.org/std/str/trait.FromStr.html
の2段落目を見るといいよ
2020/12/22(火) 16:33:15.01ID:n+6lDw0n
>>450-451
ありがとうございます。
設計を見直します。
2020/12/24(木) 02:29:50.39ID:MTdaKV6Z
高IQの自分は、Cでメモリーマネジメントに悩まされたことは無かった。
一方、Rustはメモリーマネジメントが言語の中心に有り、プログラムの
アルゴリズムや本質的な処理よりもメモリーマネジメントに意識が集中して
しまう傾向がるため、人によるだろうが自分にとっては効率的な言語ではない。
2020/12/24(木) 02:43:25.72ID:MTdaKV6Z
一般プログラマにとっては層ではないかも知れないが、
高IQのエキスパートにとっては、もっと安全に書ける方法を高頻度で天才的に
思いつくが、それはRustのチェッカと戦いとなる。
455デフォルトの名無しさん
垢版 |
2020/12/24(木) 06:27:27.80ID:NfngU3lj
その話前も聞いた
2020/12/24(木) 07:10:24.63ID:nIBEXBhK
糖質には構わず黙ってNGせよ
2020/12/24(木) 07:21:13.47ID:0tNyylQf
D言語使えよ
2020/12/24(木) 10:57:33.54ID:wstK+Rzy
Rustは、海外では既に大量の問題点が指摘されている:
https://www.reddit.com/r/rust/comments/ggyo51/criticisms_of_rust/
459デフォルトの名無しさん
垢版 |
2020/12/24(木) 12:13:15.97ID:bpYd2wwx
日本語で頼む
460デフォルトの名無しさん
垢版 |
2020/12/24(木) 12:13:28.21ID:bpYd2wwx
ヘタレなもんで
2020/12/24(木) 12:41:29.49ID:5ZTYEX+H
学習曲線、ライブラリが未成熟、コンパイル遅い、っていういつものやつをみんながコメントしてるだけ
まぁ問題には違いないし改善も試みてるわけだけど
2020/12/24(木) 12:46:16.64ID:QpBp7gJf
>>461
それだけではないぞ。
2020/12/24(木) 12:52:51.59ID:5ZTYEX+H
>>462
そりゃ細かいのはまだあるだろうが。HKTとか?
300件全部見る気もないのでやりたいなら自分でリストアップしてくれ
2020/12/24(木) 13:18:18.43ID:QpBp7gJf
>>463
453, 454 もその一部に書いてあったものだ。覚えているものだけでも:
・Rustでは、本質ではなくメモリーマネジメントが前面に出たプログラミングとなってしまう。
・もっと良いモデルで書こうとしてもRustが安全性を理解できずエラーになってしまう。
・unsafeモードは悪者扱いされた結果ドキュメントが乏しく進化も遅いため使いにくい。
・長い歴史で実績の有るクラスの継承や例外機構が使えない言語設計。
・抽象化が深すぎて最適化を前提としているので最適化しないと極端に遅い。
・抽象化が深すぎるしマクロが多用されているためデバッガが使いにくくprintfデバッグ中心で行かざるを得ない。
・正確で詳細な言語仕様に乏しいためシステムプログラミングや組み込みには向いていない。
・コンパイラの多様性に乏しい(今のところrustc一個しかない)。
・ターゲットCPUがLLVMのものに限られるため、組み込みには向いていない。
・グラフィックが弱い。
・OpenGL、DirectXと併用するのが難しい。
・コンパイルが極端に遅い。

まだまだある。
2020/12/24(木) 13:20:42.91ID:QpBp7gJf
>>464
[追加]
・抽象化が深すぎるため最適化無しでは極端に遅くなるため、デバッグ時も
 最適化しなくてはまともに動作確認できない。これもデバッガが使い物に
 ならなくてprintfデバッグ中心になる理由。
2020/12/24(木) 13:35:19.50ID:QpBp7gJf
>>465
[追加2]
・リンカをVC++のlink.exeに頼っている。
・ツール類がVC++に比べてとても貧弱(赤ちゃんのおもちゃ)。
・unsafeを使わないととても面倒なことが多い。
・C++では、newとdelete以外にはコンパイラが独自提供しているもの(Hooks)
 がないが、Rustでは大量に有る。例えば、Box<T>はソースがあるようにみえて
 実質はコンパイラ提供のものなので途中でソースがなくなっている。
・C++を含めた多くの言語では、コードの位置の任意の一部を切り取って関数化する
 ことは平易に機械的に(一般的に)できるが、Rustだと一般的には出来ない。
 なぜならRustのコードは、その文脈においてのみ有効なコードに過ぎないからである。
 文脈に応じて書き換えなければボローチェッカに文句を言われてコンパイルが通らない
 から。
2020/12/24(木) 13:38:01.51ID:QpBp7gJf
>>466
[追加3]
・「Rustは独断的な言語です。それは良いことも悪いこともあります。
 あなたがたまたまその意見に同意するならそれは良いことです、
 さもなければそれは信じられないほど迷惑です。」
2020/12/24(木) 13:48:59.29ID:jsfyfwVN
「システムタイプのプロジェクトでやらなければならないことの多くは、Rustでは実行できず、安全でないコードが必要になります。そしてもちろん、使用する基盤となるモジュールの多くには、安全でないコードが含まれています。したがって、ある意味で、メモリの安全性の約束は実際には真実ではありません。それらのいずれかが、現在または将来、コードの他の場所で量子力学的問題を引き起こす可能性のあるメモリの問題を抱えている可能性があります。もちろん、それを実行する可能性のあるコードの量を大幅に削減しますが、それでもかなりの量があります。」

「RustがC ++の句読点の爆発を起こし、さらに悪化させたように感じます。コードのコンパクトさは、読みやすさに比べてそれほど価値があるとは思いません。Rustはシステムの言語であり、SPAフレームワークではありません。それを速くすることは目標ではありません、それを正しくすることは目標です、そしてそれはそれを何年にもわたって書くよりもそれを読んで編集することに非常に多くの時間を費やすことを含みます。」

「コンパイラには、C ++よりも多くのライブラリへのフックがあります。大規模で完全にコヒーレントなシステムの構築に関心のある私たちの中には、それを困難にしている人もいます。C ++では、基本的に新しく削除され、他のすべては完全に自分で行うことができます。」

「Rustは、例外や継承など、何十年にもわたる成功を無視していると感じています。私は自分が書いているコードを見て、ほとんどすべての呼び出しが?で終わる場所で、手作業で効果的に例外を実行しています。そして、すべてのメソッドは、自動的に伝播される可能性のあるエラーを手動で返す必要があります。」

「Rustの安全規則は、より安全なコードを作成しようとする試みと戦う場合があります。」
2020/12/24(木) 13:57:55.75ID:FVOPSkk3
僕は絶対にミスはしませんって言って全部unsafeで包もうぜ
2020/12/24(木) 14:21:36.07ID:7F4cW8XH
>>464
> ・長い歴史で実績の有るクラスの継承や例外機構が使えない言語設計。

クラスの継承や例外機構は長い社会実験の末クソだったって結論出たろ。
だからGoだってわざわざ外してる。
C++にあるものを「実装できない」訳がないよな。わざわざ外してんだよ。
2020/12/24(木) 14:28:12.73ID:YICz7XpS
読んだのか、凄いなw
しかし、スルー検定3級不合格です
472デフォルトの名無しさん
垢版 |
2020/12/24(木) 14:56:25.90ID:TzdYJrci
スル検は難関だからな。
2020/12/24(木) 20:14:08.88ID:OKXZXV0n
CやC++の批判で同じようにredditでコメント集めたらこんなもんじゃ済まないだろ
2020/12/24(木) 21:01:24.33ID:3B9cL9c2
c++と結局同じ道を辿ってるというところが一番愚かな点。
rust覚える早道が結局c/c++勉強することっていう。
2020/12/24(木) 21:42:23.65ID:OKXZXV0n
>>474
低IQだから最初の文と次の文の間の論理が読みとれないので
申し訳ないですがもう少し丁寧に説明して頂けないでしょうか
2020/12/24(木) 21:44:10.79ID:5ZTYEX+H
FFIのデファクトとしてのC ABIはしょうがないけど
C++とか一切触れる必要ないだろ
477デフォルトの名無しさん
垢版 |
2020/12/24(木) 22:57:56.32ID:NfngU3lj
レディットの負け犬に反論する必要なくない
賢さでいったらポメラニアンと同じくらいの連中なのに
2020/12/25(金) 01:07:22.65ID:8LlCCPCm
所有権の重要さを実感するのは結局c++やってたやつだけだろ。
本当に一切c++触らないでrustだけで覚えたとかいう奴はいないわ。
いてもまともなコードは書けないだろう。
2020/12/25(金) 02:44:51.30ID:M0TXsabA
>>475
俺はそいつじゃないが、二文は繋がってない独立した文。
2020/12/25(金) 02:53:15.82ID:M0TXsabA
>>477
redditみたいなアメリカ最大の一般的な掲示板に書き込む人が皆、負け犬なんて
分けはない。
むしろSourceForgeみたいなところは、プログラミング関連の掲示板だから、
プライドだけが高くて力が無い人が集まることも有り得て、ずっと偏りが
あるため、負け犬率が高い可能性がありそこの好きな言語ランキング
なんて信用なら無い。
2020/12/25(金) 02:56:53.96ID:M0TXsabA
はっきいり言って、2ch/5chでも人が大量に来る一般的な板は平均程度の
知的レベルはあるが、この板みたいな技術系の板は、なぜか平均より低い人が
集まりがち。
なぜならリアルで認めてもらえない人がストレスのはけ口のようにして
書いてくる率が高いから。
その意味でSourceForgeは一般人より馬鹿が集まり易く、redditは一般人と
同程度のレベルがある。
2ch/5chもニュース意が見たいなのは一般人と同じくらいの知的水準だが
プログラム技術板は一般人よりも何故か劣っている。
2020/12/25(金) 02:59:57.47ID:M0TXsabA
githubも負け犬や雑魚が集まり易い。
有名な凄腕シェアウェア作家などはそんなとこに投稿せずに稼いでいる。
自分の腕ひとつでは稼げない人が、最後の手段としてなんとか名声を得てサラリーマン
として雇ってもらうためにgithubに投稿する傾向がある。
SourceForgeも同様。
483デフォルトの名無しさん
垢版 |
2020/12/25(金) 03:33:01.51ID:0bOU3lsT
なんかそういデータあるんですか?
2020/12/25(金) 04:00:24.23ID:wGSzow97
糖質に構ってはいけません
2020/12/25(金) 07:45:07.16ID:0J2Xi2Rb
>>483
サンプル数1(自分自身)で100%という調査結果があるんだろう
2020/12/25(金) 13:26:59.56ID:8LlCCPCm
>>485
なんかそういうデータがあるんですか?
2020/12/25(金) 19:42:11.03ID:mWI3ilc1
>>486
サンプル数1(自分自身)で100%という調査結果があるんだろう
488デフォルトの名無しさん
垢版 |
2020/12/26(土) 02:24:44.32ID:xFdgYNcK
結局C言語最強?
ならZetZも盛り上がる可能性ある?
https://www.infoq.com/jp/news/2020/05/zz-formal-verified-c-dialect/
2020/12/26(土) 09:20:22.55ID:QvgSObSy
>>488
D言語でいう契約を静的に検証できるみたいな感じかな? いいね
2020/12/26(土) 10:09:44.78ID:q2RopqqH
いいね
盛り上がりはしないとは思うけど…
2020/12/26(土) 11:37:01.29ID:Gj+PzIiF
OSS界隈で盛り上がる感じはしないけど
自動車とかはそっちのほうが見込みありそう
2020/12/26(土) 13:21:33.22ID:qrKCtheG
Vecのget()メソッドがi32とかも受け取ってくれればよかったのにとよく思う
結局、負方面については自分でインデックス内か検証しないといけないし
2020/12/26(土) 15:29:03.87ID:PUwCvC/R
extension traitとかnewtypeで拡張すればいいんでは?

https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=1b575c52e97e24c3ae345e945ec7dbbd
2020/12/26(土) 16:18:17.43ID:qrKCtheG
はえ〜ありがとうございます!
これ標準ライブラリに採用してほしい(我儘)
2020/12/26(土) 20:14:31.56ID:q2RopqqH
貴様だってnewtypeだろうに!
2020/12/27(日) 03:56:05.63ID:iVarltSe
小賢しいことを少年が言うのか!
2020/12/27(日) 04:20:16.63ID:a9FVrfkC
ガンダムハラスメントはやめてください
2020/12/27(日) 13:57:50.83ID:gMdNxh6H
たとえばこのように書いたときに

fn zero_bytes<T :Sized>() -> [u8; std::mem::size_of::<T>()] {
[0u8; std::mem::size_of::<T>()]
}

エラーとして

the size for values of type `T` cannot be known at compilation time

となってしまいます。
型の大きさに依存した配列を生成するには (実際にはコンパイル時に確定するはずでも)
Vec などを利用するしか仕方がないのでしょうか?
2020/12/27(日) 16:28:27.67ID:VS6+Jx70
>>498
配列の要素数はconstじゃないとだめだからジェネリックには今のところできないみたい
どこかで型を書かないと

const SIZE: usize = std::mem::size_of::<i32>();
let foo = [0u8; SIZE];

https://github.com/rust-lang/rust/issues/43408
2020/12/27(日) 19:25:21.46ID:UNA5PysG
const fn, lazy_static のあたりは他の言語やってた人にはわかりづらいよな
2020/12/27(日) 20:30:38.54ID:iVarltSe
コンパイル時計算は最近の言語じゃ普通だけどな。
コンパイル時リフレクション使える言語も増えたし。

>>498
ttps://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=e09bdfe4323f597481eae11421777cc3

ttps://rust-lang.github.io/rfcs/2000-const-generics.html
ttps://github.com/rust-lang/rust/issues/44580

一時間前にマージされたばかりで1.51.0のマイルストーン完了したからそのうちnightlyに来る。
ttps://github.com/rust-lang/rust/pull/79135

edition 2021には間に合うんじゃないの?
2020/12/28(月) 02:45:21.79ID:UcUcH/pf
Java では、class Foo{ Bar bar; } で済むところが、Rustでは以下の様な選択肢に悩まされる。

struct Foo { bar: Bar }
struct Foo<'a> { bar: &'a Bar }
struct Foo<'a> { bar: &'a mut Bar }
struct Foo { bar: Box<Bar> }
struct Foo { bar: Rc<Bar> }
struct Foo { bar: Arc<Bar> }

そして特に、'aの部分やBox, Rc, Arcの取り扱いやRcとArcの違いなどに悩まされる
ことになる。
これに加えて実践的にはOption, RefCellなどを何重にも組み合わせて使うことが必要となり
正しく理解するのはC++より遙かに難しい。
2020/12/28(月) 02:52:18.54ID:UcUcH/pf
>>502
ちなみに、plain Cの場合、
struct Foo { struct Bar *bar; }; // (1)
で済む。C++の場合、もちろんこれでもいけるが、
class Foo { Bar *bar; }; // (2)
1つでも特に問題ない。
uniqu_ptr<Bar>やshared_ptr<Bar>
も使えるが (2)で出来ないことは特に無いし、難しくも無く
Javaのclass Foo{ Bar bar; }
と使い勝手も余り変わらない。
違うのはbarが不要になった時に自分で deleteするだけで、
多くの場合、
class Foo {
 Bar *bar;
 Foo() { bar = NULL; }
 ~Foo() { delete bar; }
};
と書けばよいだけで、これはパターンなので丸覚えでも良いし、意味の理解も
難しくも無く、悩むことも無い。
それに比べればRustが如何に複雑なことか。
2020/12/28(月) 02:57:07.20ID:UcUcH/pf
[補足]
C++の場合も、
class Foo { Bar *bar; }; // (1)
class Foo { unique_ptr<Bar> bar; }; // (2)
class Foo { shared_ptr<Bar> bar; }; // (3)
の選択肢は有るには有るが、常に(1)を使ってもコンパイルエラーに悩まされる
事はないし、できないこともなく、特に危険でもない。
ところがRustの場合、状況に応じて>>502のどれか一つしか選択できない
ことが多く、柔軟性に乏しい。
プログラムに僅かな変更があったときに、C++の場合、(1)なら修正が全く
必要がないが、Rustの場合は>>502のうちのどれかからどれかに修正しなくては
ならないことが多い。
2020/12/28(月) 03:21:57.08ID:UcUcH/pf
https://matklad.github.io/2020/09/20/why-not-rust.html
「Rust lacks an official specification. The reference is a work in progress,
and does not yet document all the fine implementation details.」
Rustは公式の使用が欠如している。
リファレンスマニュアルの作成は発展途上中(作成中、作業中、進展中)で、
しっかりした実装の詳細を全てドキュメント化してはいない。

Rustのコンパイル時間がとても長いことを直後に指摘した上で、
「A program written in a slower to run but faster to compile programming
language can be faster to run because the programmer
will have more time to optimize!」
実行速度が遅いがコンパイルが速い言語で書かれたプログラムは、
実際には速く実行できるようになる。
なぜなら、プログラマが最適化する時間をより沢山得ることが出来るためだ。
2020/12/28(月) 03:37:08.29ID:UcUcH/pf
現実のプログラムでは、CやC++とRustのプログラムを連携しなければならない
ということと指摘した上で、Cargoがそれを難しくしているかも知れないことを
指摘している:

「One specific gotcha is that Cargo’s opinionated world view
(which is a blessing for pure Rust projects) might make
it harder to integrate with a bigger build system.」

具体的には、Cargo主張する世界観(これは純粋なRustプロジェクトにとっては
幸いなことです)が、より大きなビルドシステムとの統合を
難しくしているかもしれないということです。
507デフォルトの名無しさん
垢版 |
2020/12/28(月) 03:48:47.51ID:UcUcH/pf
「First, there’s no definition of Rust memory model, so it is impossible to
formally check if a given unsafe block is valid or not. There’s informal
definition of “things rustc does or might rely on” and in in-progress
runtime verifier, but the actual model is in flux. So there might be some
unsafe code somewhere which works OK in practice today, might be
declared invalid tomorrow, and broken by a new compiler optimization
next year.」

第一に、Rustのメモリモデルの定義がないので、与えられた安全でないブロック
が有効かどうかを正式にチェックすることができません。非公式な定義として、
"rustc が行う、または依存しているかもしれないこと "と、進行中のランタイム
ベリファイアがありますが、実際のモデルは流動的です。つまり、どこかに安全
でないコードがあるかもしれませんが、今日は問題なく動作していても、明日
には無効と宣言され、来年の新しいコンパイラの最適化で壊れてしまうかも
しれません。
2020/12/28(月) 03:52:06.86ID:UcUcH/pf
Second, there’s also an observation that unsafe blocks are not, in fact, modular.
Sufficiently powerful unsafe blocks can, in effect, extend the language. Two such
extensions might be fine in isolation, but lead to undefined behavior if used
simultaneously: Observational equivalence and unsafe code.

第二に、安全でないブロックは実際にはモジュール化されていないという観察もあります。
十分に強力な安全でないブロックは、事実上、言語を拡張することができます。
そのような2つの拡張は単独では問題ないかもしれませんが、同時に使用されると定義
されていない動作になります。観測的等価性と安全でないコードです。

Finally, there are outright bugs in the compiler.
最後に、コンパイラには明らかなバグがあります。
https://github.com/rust-lang/rust/issues?q=is%3Aopen+is%3Aissue+label%3A%22I-unsound+%F0%9F%92%A5%22
2020/12/28(月) 08:35:49.12ID:1wnarVmc
まあ大体その通りだわな。matkladはわかりやすい文章書くわ。
2020/12/28(月) 11:36:31.94ID:OYitjU6y
スマートポインタ絶対に使いたくない理由はよくわからんが
rustでも生ポインタ使えばよいのでは

コンパイル時間についてはcraneliftと差分コンパイルの進化に期待かな

その他の議論については影響は限定的だし
影響を受けない領域でrustを使えば良いのでは
議論の俎上には挙がっているし徐々に改善されていくでしょう
2020/12/28(月) 12:53:26.99ID:UcUcH/pf
>>510
>その他の議論については影響は限定的だし
ところがC/C++が担ってきた領域ではそれが大問題になることが多いので
RustはC/C++の代替には成りえない。

>議論の俎上には挙がっているし徐々に改善されていくでしょう
少子化も日本の経済衰退も非常に何十年間も議論の俎上に上がっている
のに改善されていく気配は全く無いことからも分かる様に、
そんなことは一般的には成り立たない。
2020/12/28(月) 12:58:19.94ID:UcUcH/pf
>>510
>rustでも生ポインタ使えばよいのでは
Rustのsafeモードでは生ポインタは使えないんだが。
2020/12/28(月) 13:13:50.09ID:N6A7dpOQ
>>512
実際に安全ではないので unsafe なのはあたりまえだが。
C++ のように常に危険なほうが良いなら C++ を使ってろよ。
2020/12/28(月) 13:15:56.66ID:UcUcH/pf
>>513
Rustはメモリーマネジメントの仕様がちゃんと公開されて無いので
C++よりずっと危険。
2020/12/28(月) 18:08:21.04ID:1npJXF9+
>実行速度が遅いがコンパイルが速い言語で書かれたプログラムは、
>実際には速く実行できるようになる。

最近この苦情よく聞くんだけどどんなもんなの
コンパイル時間のボトルネックなんて
考える時間に比べたらたいしたことなくない
何十分もかからんだろ
2020/12/28(月) 18:22:47.18ID:1wnarVmc
お前が弄る小さいプログラムではそうなんだろうね。
2020/12/28(月) 18:27:17.21ID:1npJXF9+
どんなん
2020/12/28(月) 18:58:25.81ID:9g/X/cXA
CIとかでめちゃくちゃ時間かかるのはRustの醍醐味
2020/12/28(月) 19:03:06.03ID:yEfXJ2Ei
>>515
今のRustコンパイラはコア数で良くスケールするので
開発用の32コアマシンなら快適だけど、古いノートPCだと辛い、みたいなことはあるな
Actixみたいに大量の依存関係を要求するやつ+しょぼいシングルコアなら数十分かかるかもね
2020/12/28(月) 19:27:10.85ID:yEfXJ2Ei
個人的にはクレート単体で遅いと思ったことはなくて、体感では数万行のコードでもgccより速いかな、という感じ
なので遅い要因はほぼ依存関係の多さだと思っている

C++とかだと特定のディストリビューションの特定のバージョンでコンパイルエラー、みたいな地獄のデバッグが待っているので、それを回避するコストとしては十分安いと思うけど
2020/12/28(月) 22:08:45.00ID:mQPXLAV2
今の方法だとまだ依存crateのコンパイル待ちになるのにスケールする?
>>518に尽きる
2020/12/28(月) 22:37:04.04ID:yEfXJ2Ei
>>521
もちろん完全に直列な依存関係はスケールしないよ
もしそういうクレートがあるなら分割すれば改善するかもしれないし
具体的に挙げて欲しい
2020/12/29(火) 01:19:43.87ID:k23+wtCh
>>520
>個人的にはクレート単体で遅いと思ったことはなくて、体感では数万行のコードでもgccより速いかな、という感じ
C言語のコンパイル意が遅くなるのは、Win32のヘッダファイルの巨大さが原因
であることが多い。
それが50MB位有ったりして、ヘッダファイルだけで数万行から数10万行くらいあったりする。
そのパースが遅い。
なので、VC++では precompiled header を使っている。
2020/12/29(火) 08:29:57.63ID:+jeJmMuS
cとc++じゃコンパイル速度は桁違いだけどな。
2020/12/29(火) 10:56:10.54ID:2ROJabla
ライブラリの依存関係を自動で解決するエコシステムがあると
依存関係が巨大になりがちっていうのは
Haskell や JavaScript でもよく聞くけどな。

まあ自分でそのライブラリ群を書く手間、
既存のものを使うにしても導入の仕方を調べる手間に比べたら
多少の時間はかかっても自動でやってくれるほうがマシではあるし、
度を越したときは個別に改善するしか仕方がないんだろう。
2020/12/29(火) 15:03:36.81ID:FJxczyqV
依存関係のコンパイルは初回しかやらないんだから多少遅くても気にはならない
CIの場合はtargetディレクトリキャッシュすれば良いし
rust-analyzerの起動時間がちょっと気になるくらい
2020/12/29(火) 23:35:14.28ID:1sbIl3YX
>>522
昔より増えたapiとimplを分離したクレートは

自分のプロジェクト->api->impl->implが依存するcrate(s)->...

と直列に依存してる。log,slog,serde,thiserror,webrender(etc.)
それに直列に依存するかどうかよりcargoもrustcのフロントエンドもまだ並列化対応が部分的でコンパイル単位の粒度が大きいのが並列ビルドの妨げになるでしょ。

>>526
CIはたしかにキャッシュが効けばいいけど、アナライザの話なら初回しかやらないことはないよ。
アナライザの場合は解析結果が無効になるたびに起きる。
intellij rustはプロジェクト開くたびにやってるし。
JDTみたいにon the fly analyzeするとソースコード変更するたびに解析するから依存グラフは使い回せても他は都度、解析する必要がある。
2020/12/30(水) 00:32:35.13ID:5c2z0B/k
>>527
言葉足らずですまん
(解析結果をメモリ上にしか持たない設計だから起動時に解析を全部やり直す)rust-analyzerの起動時間が気になるくらい(がコンパイル時間に関して気になる点)
と言いたかった
529デフォルトの名無しさん
垢版 |
2021/01/01(金) 09:10:16.97ID:WB+Ueidc
#![feature(min_const_generics)]だけじゃなく#![feature(const_generics)]も2021に入って欲しいな
2021/01/01(金) 12:06:39.72ID:y/yrEKhd
全く話は変わるけど、メモリ不足で Box::new に失敗したら、panicが起きて
プログラムがそこで停止するだけ?
2021/01/01(金) 12:08:13.77ID:y/yrEKhd
>>530
仮にそうだとすると、Cのmalloc()やC++のnew TYPEに比べるとエラー処理は
省ける反面、エラー処理を書きたくてもかけないね。
まあ、滅多に起きないので書いてもしょうがないけれども。
2021/01/01(金) 12:36:28.83ID:y/yrEKhd
*C++
TYPE *ptr = new TYPE; //メモリ不足の場合ptrにはNULLが返される。
*Java
TYPE obj = new TYPE; //メモリ不足の場合例外がthrowされる。
*Rust
Box<T> obj = Box<T>::new(T()); //メモリ不足の場合panicが生じアプリがダウンする。

Rustは、高度な安全性を要する分野や組み込みでは困るかも。
それに記述が長い。
2021/01/01(金) 12:40:33.89ID:mLxH8qq6
C++のnewはメモリ不足のとき通常は例外が送出されるぞ
メモリ不足でnullptrを返すにはnew(nothrow)にしないといけない
2021/01/01(金) 12:54:35.66ID:y/yrEKhd
>>533
昔、
TYPE *ptr;
if ( (ptr = new TYPE) == NULL ) {
 printf( "Memory allocation erro has occured.\n" );
}
みたいに書いていたことがあるけど、これは昔のC++でも間違っていたのだろうか?
2021/01/01(金) 12:57:46.63ID:y/yrEKhd
Javaは、例外をthrowする関数を呼び出した場合、必ずtryブロックで囲むか、
または、呼び出しもとの関数の宣言の最後にthrow/throws属性をつけるかしないと
いけないんだけど、なぜかnew演算子の場合だけはこの規則の例外で、
tryブロックで囲むこともthrow/throws属性を付ける必要も無いらしい。
ただし、tryブロックで囲んでcatch文でOutOfMemoryErrorという例外を
捉えることは出来るらしい。
意外と良く考えられていて、便利そう。
2021/01/01(金) 17:48:44.20ID:tSM4l1tY
検査例外等も知らない人が言語仕様にケチつけるなよ
2021/01/01(金) 18:19:22.53ID:y/yrEKhd
知識が無くてもそれが使いにくいことが分かる人もいれば、
知識があってもそれが使いにくいことが分からない人もいる。
その差はイマジネーションや経験や頭の良さの差。
2021/01/01(金) 19:06:09.23ID:tSM4l1tY
知識も経験もイマジネーションも頭の良さもない
お前さんどうすんの?
2021/01/01(金) 19:06:27.88ID:kK2SMYXF
20年以上前?のC++だとNULLが返ってきてたみたいだな
C++98の頃には例外が投げられてる
540デフォルトの名無しさん
垢版 |
2021/01/01(金) 19:07:24.81ID:Vr3i+dZB
出た、”地頭”信者w
2021/01/01(金) 19:20:38.81ID:roXbFcsK
Rustのpanicはスレッド単位ですよ
2021/01/01(金) 19:55:37.74ID:BepzsDBS
プラットフォームにもよるのでは
panic=abort
しかない環境もある
2021/01/01(金) 22:11:27.78ID:CysAMwpt
かなり初歩的な質問で申し訳ないんだけど、例えばHashMapをイテレータで舐めてるときに内部でそのHashMapを更新したいときはどうするのがベストなの?
例えば次のようなケースではどうすれば……

https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=f6c554ab761450881f28e48faa55bf8c
use std::collections::HashMap;
fn main() {
let mut map: HashMap<_, _> = HashMap::new();
for i in -5..=5 {
map.insert(i, i);
}

for (key, value) in map.iter() {
if *value == 0 {
continue;
}
if let Some(another_value) = map.get_mut(&(-key)) {
// keyの絶対値が同じものを処理して、処理済みにする気持ち
*another_value = 0;
}
}
}
2021/01/02(土) 00:25:45.81ID:z4o0QpSV
>>543
map.iter() を map.iter().cloned().collect::<Vec<_>>() にする
2021/01/02(土) 00:53:14.75ID:aqs6ioY6
keyの絶対値が同じものでgroupingしてからイテレート
546デフォルトの名無しさん
垢版 |
2021/01/02(土) 02:08:00.06ID:S8wF2Q3x
rust的にはそういうことしないのがベストじゃない
俺だったらキーだけ取り出してループさせる
2021/01/02(土) 09:20:56.29ID:ZeOmz+/p
>>544-546
ありがとう!
しかしRust的には褒められたやり方じゃないんだね
LL言語脳から切り替えないといけないなあ
548デフォルトの名無しさん
垢版 |
2021/01/02(土) 14:15:48.62ID:RXFdEIXY
逆に-keyで絶対値にする言語とかあんの?
Rustではkey.abs()だぞ

> keyの絶対値が同じものでgroupingしてからイテレート
ソース見る限り元キーはそのままで{-1: 0, 1: 0}みたいにしたそうだからグルーピングでは絶対値にキー統一されるからダメだね
2021/01/02(土) 15:20:56.88ID:NIm/iweY
>>543
イテレータを回してるときに内部でそのcollectionをいじくる一般的な方法を聞きたかっただけで、そのコードはただ説明のためのモックなのでコードの妥当性とかはどうか気にしないでください……
550デフォルトの名無しさん
垢版 |
2021/01/02(土) 16:10:45.39ID:S8wF2Q3x
これは個人的な解釈だけど、ループ中にコレクションをイジるのを許可すると要素の追加削除も許可されるので、動作が想定しにくいから言語に関わらずやるべきじゃないと思う
2021/01/02(土) 17:40:37.90ID:QD9HT9ch
有名なアルゴリズムでも破壊的に処理を進める物は少なくないから
それらをリソースを押さえたままより安全に実装するかという問題はある
2021/01/02(土) 20:33:28.09ID:1irTnsdt
単純に破壊的操作とイテレータの組み合わせが良くないんだと思うけどね
基本的なアルゴリズムの実装でならC++でも大抵インデックスアクセスするし
2021/01/03(日) 01:40:10.34ID:qKjMqlyr
絶対値で比較されるようなkeyの型を用意してBtreeMapにぶちこんでiter_mut()すれば
絶対値が同じキー同士は連続して現れるからうまいことやればやりたいことはできるのでは
コード複雑になりそうだけど
554デフォルトの名無しさん
垢版 |
2021/01/03(日) 02:42:58.53ID:ez188GTZ
>>550
C++狂い「安全性よりも論理的、数学的に正しいかが重要」
555デフォルトの名無しさん
垢版 |
2021/01/03(日) 15:16:13.09ID:vPi839cG
Rustで大量の敵が同時に出現する2Dゲームを作ろうと考えています。
Amethyst、ggez、Bevyの中で最もおすすめのゲームエンジンはどれでしょうか?
2021/01/03(日) 15:58:43.30ID:NLnLDzaH
イニダン亡き後の移住先か…!
2021/01/03(日) 17:51:55.22ID:CkWAgifP
スライムが5000匹現れた!
2021/01/03(日) 20:23:57.03ID:ixJIhJjK
>>552
まあ通常そういう場合はint値でモロにインデックスアクセスするわな。
これがrustとは全く馴染まない。
2021/01/03(日) 21:45:20.19ID:hFPMmBD/
single writer or multiple readerのモデルに沿うようなロジックに変換するか
interior mutabilityを使うかのどちらか
2021/01/05(火) 22:41:10.79ID:fwCCjwkT
>>555
個人的にはAmethyst。
なぜなら俺が個人的にECSアーキテクチャが大好きだから。
小さなプロジェクトに向かないとか言われるけど知らないそんなの。
2021/01/05(火) 23:32:43.62ID:rno8zcnm
RustでTDみたいなブラウザゲー作った猛者おりゅ?
562デフォルトの名無しさん
垢版 |
2021/01/08(金) 08:35:58.68ID:WNrzsb9T
なんでこんなゴミを100M単位でボコボコダウンロードせなならんのや

ゴミ
2021/01/09(土) 00:36:27.01ID:ntvhJtwv
>>562
それって回線がゴミなだけじゃ...
2021/01/10(日) 12:11:15.45ID:smlN1G6e
評価順序のルールがよくわからないんですが、
タプル生成のときの呼出し順序って保証がありますか?
つまり

(foo(), bar())

みたいに書いたときに foo が常に先に呼ばれることは保証されますか?
2021/01/10(日) 13:02:46.89ID:fqhi9u3I
保証されてるんじゃない?
でも呼び出し順が重要なら行を分けて書いてからtupleに入れたほうがいいような気もする

The meaning of each kind of expression dictates several things:
・Whether or not to evaluate the sub-expressions when evaluating the expression
・The order in which to evaluate the sub-expressions
・How to combine the sub-expressions' values to obtain the value of the expression
https://doc.rust-lang.org/reference/expressions.html
2021/01/10(日) 15:22:53.59ID:fqhi9u3I
評価順序についてはもう少しわかりやすくリファレンスを更新する予定みたい
https://github.com/rust-lang/reference/blob/964dc5bab5f7418aea36233c271ceedaea216598/src/expressions.md#evaluation-order-of-operands
https://github.com/rust-lang/reference/pull/888/
2021/01/10(日) 15:34:43.17ID:smlN1G6e
>>565-566
ありがとうございます。
無学なので少し書き方が分かりやすくなっても英語だとしんどい……。
2021/01/11(月) 14:09:54.51ID:MiJ5pxpq
ファイル (またはネットワーク) から得られる所定の書式のレコードの繰り返しを
イテレータとして抽象化したいと考えました。
(ちなみにレコードの繰り返しの前にレコードの個数を含むヘッダもあります。)

しかし IO はエラーの可能性があります。
書式の仕様に違反する入力になっている可能性もあります。

イテレータが返す型を Option<Result<要素の型,エラーの型>> としてしまうと
エラーの時点で終端という扱いにならないので様々なメソッドと組み合わせ難いですし、
Result を挟まないとエラーの内容を返せないのでハンドリングしづらいです。

何か綺麗にやれるイディオムのようなものがあったりしませんか?
2021/01/11(月) 15:21:23.54ID:8i1ZTkbL
エラーの時点で終端にするかどうかは呼び出し側が決めることじゃない?
Option<Result<T, E>>もResult<Option<T>, E>もイディオムとしてよく使われてる
2021/01/11(月) 15:47:03.74ID:MiJ5pxpq
>>569
出来るか出来ないかで言えば出来るし好きにすれば良い話ではあるんですが、
標準で良いされている様々なメソッド (たとえば map のような基本的なメソッドさえ!)
と「組み合わせ難い」ということが綺麗じゃないなぁという気持ちなんですが、
そこらへんの不格好さは許容するしかない雰囲気ということでしょうか?

(通常の終端に到達するのとは別に) 中断を表現する方法があって
中断の理由を伝播するのに便利な語彙を詰め込んだクレートがあったりすると
助かるんですが。
2021/01/11(月) 16:05:22.66ID:cgTcg0uf
>>570
公式にあるイディオムっぽいのはこれとか。
https://doc.rust-lang.org/rust-by-example/error/iter_result.html

クレートは探すと色々見つかるけど、結局「便利な」ってのが人それぞれだし、あまり流行ってる感じはしないな。
むしろその中断表現をうまくやるアイデアがあるなら自分で作ったほうがいいのでは。
2021/01/11(月) 16:41:17.67ID:8i1ZTkbL
>>570
組み合わせ難いと言ってる内容をコードで示してくれないとなんとも
573デフォルトの名無しさん
垢版 |
2021/01/11(月) 20:34:05.33ID:D6pgjuRM
イテレータとして抽象化したいってどういう意味なの
Iteratorをimplするってことなのかしら
2021/01/11(月) 23:06:51.09ID:MiJ5pxpq
>>573
ここでいう「イテレータとして」というのは std::iter::Iterator に限るわけではなく、
繰り返しを表現する何らかの型定義と思ってください。
適当なクレートがあるならそれでいいですし、考え方だけでもいいです。

欲しい機能をあらためてまとめると

・ 繰り返しに (終端に到達する以外の) 中断の方法が用意されている
・ 中断したときに中断の理由 (エラー型の値) を伝える方法がある

なのですが、
std::iter::Iterator だと next が返す Option<Result<T, E>> でエラーのときに
「中断」しようとすると for 文の中で break する書き方くらいしか思いつかず、
自分で便利なものを作ろうにもどう作れば便利になるのかも
想像がつかないのです。
2021/01/12(火) 02:11:34.65ID:yVKQhIbd
>>574
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=aaf882f54a7b6330ee6ad2106be92717
こんな感じでscan使えばNoneを返したところで
イテレーションを中断できるしErrの値も列挙できる
2021/01/12(火) 02:12:25.76ID:yVKQhIbd
中断するだけなら take_while 使うという手もある
577デフォルトの名無しさん
垢版 |
2021/01/12(火) 08:20:11.60ID:tB/XA0DN
俺もtake_whileを思い浮かべたけど関数を作るわけじゃないんでしょ
ゴールがいまいちみえないからイメージでいいのでコードで用件を示してほしい
2021/01/12(火) 11:44:28.63ID:d2vxqIR1
単にエラー返して中断したいだけならResultにcollectしたりtry_for_eachで消費すればいいよ
イテレータアダプターとしてエラーも含めて列挙しつつ次につなげたいなら>>575が書いてるscanやtake_while系
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=113dcf689b4d941c89e714ebb1414958
579デフォルトの名無しさん
垢版 |
2021/01/12(火) 20:39:12.01ID:jo+wjg9+
AsRefトレイト使ってenumから&str返すのっておかしい?
Display実装で文字返してたらアロケートされるからAsRef使おうと思ってるんだけど
2021/01/12(火) 20:51:33.48ID:yLoNqPBg
Rustの利用状況調査、ビジネス利用が進む一方で習得の難しさなどが依然課題
https://www.atmarkit.co.jp/ait/articles/2101/12/news046.html
2021/01/12(火) 21:41:00.77ID:yVKQhIbd
>>579
AsRef に拘らず独立した as_str 用意した方が良いと思う
582デフォルトの名無しさん
垢版 |
2021/01/12(火) 22:42:54.02ID:jo+wjg9+
AsPath が AsRef<Path> になった過去もあるから汎用性持たしてas_str実装するよりAsRefで実装する方がいいといいと思うけど他の人はどう思う?
2021/01/12(火) 23:59:44.33ID:d2vxqIR1
as_strに一票
2021/01/13(水) 08:49:31.39ID:u6YyMdJS
自分で使う、as_str
ライブラリとして他で使われる、AsRef
585デフォルトの名無しさん
垢版 |
2021/01/13(水) 09:22:05.24ID:C+q6Ee0+
>>580
学習難度はまず低級言語と高級言語両方の利点欠点を理解しないと良さが理解出来ないからねえ…
設計思想からして中上級者向けだから仕方ないかも
2021/01/13(水) 10:55:46.25ID:vprvOgCy
単に学習難易度が高いだけでなく、学習が済んだ後もこの言語はめんどくさいが、
C++よりもむしろ。
2021/01/13(水) 12:45:22.11ID:jEgTYBOk
>>582
AsRefはIntoOwnedと対になっていて str<->String Path<->PathBuf みたいな ref/owned 関係にあるもの同士の変換に使うものだと思う
enum -> &str はそういう関係にはないので微妙に思う
2021/01/13(水) 13:36:01.48ID:h3xJeFVZ
>>586
風俗で事が済んだ後で説教始めるオッサンみたい
2021/01/13(水) 13:53:35.67ID:p3ZUleCk
C++とRustで難しさめんどくささの方向性違うしな
好みの範疇だと思ってる
590デフォルトの名無しさん
垢版 |
2021/01/13(水) 21:18:34.66ID:LRQMEOBI
Rustのめんどくさいところはダントツでクレート関係だよな
標準で入ってないかつ、細かすぎるからコンパイル糞長いし、APIの仕様が統一されてないからドキュメント見ないと話にならんとこ
しかもクレートによっちゃライフタイム絡ませてきてめちゃくちゃになるし
C++はとにかく言語仕様のいらない豊富さが嫌気さす
2021/01/13(水) 21:41:40.93ID:T6eZMBRK
D言語かDelphiやれ
2021/01/13(水) 23:05:33.49ID:q0SQNCdx
もう.net5とC#でいいやん
2021/01/14(木) 01:15:26.66ID:KFRMmKoU
>>590
traitのおかげで他と比べるとAPIの統一性は達成されてるようにおもう
2021/01/14(木) 01:57:39.37ID:vEkmKZjk
クレートいいと思うけどな
標準ライブラリに入れると破壊的変更できなくなるけどクレートなら古いバージョン使うことも出来るから
気兼ねなくライブラリを進化させることが出来る
2021/01/14(木) 08:51:13.78ID:2AI/maqn
pure-Rustのクレートなら今のところ確実にコンパイルは通るしな。
C++だとGitHubから拾ってきたライブラリが手元でコンパイル通るかどうか半々って感じで厳しい。
マイナーなディストリビューションのせいではあるけど、全部Ubuntuに統一というわけにもいかんしなぁ。
596デフォルトの名無しさん
垢版 |
2021/01/15(金) 20:23:33.58ID:nexKBT6E
struct A;
struct A();
これとこれが定義できる理由ってなんかある?

struct A {};
だけで済むし、記述バラバラになるから統一したいんだけど
2021/01/16(土) 00:28:37.68ID:eM3BiVBC
Rustが一番めんどくさいのはメモリ管理だな。
というよりメモリ管理の事ばかり気にしてプログラムしなくてはならない。
plain CやC++ではそこまで気にしなくて良い。
598デフォルトの名無しさん
垢版 |
2021/01/16(土) 01:28:58.93ID:/D0gGWRu
?????????
2021/01/16(土) 11:40:00.74ID:IRkE9de+
いつものやつだ気にするな
2021/01/16(土) 14:07:27.84ID:WupidWsu
結局メモリを気にする言語にへんな暗黙性を入れるのは失敗ってことだな。
2021/01/21(木) 02:51:30.26ID:ooF1treM
Rust で書いたツールにドキュメントを付けようとしています。
ライブラリのドキュメントではなくツールとしての使い方の詳細で、
readme に書くには大きすぎるような文章です。

cargo.toml では package.documentation でドキュメントの場所を URL で
示すことは出来るようですが、パッケージ内にドキュメントを一緒に入れておいて
cargo install で適当なところにインストールするようなことは出来ないのでしょうか?

あるいは cargo の直接の管理下には入れられないにしても
なんらかの習慣があったりしますか?
2021/01/21(木) 07:00:10.04ID:OA0ITDHD
ゴミ言語
2021/01/21(木) 14:31:58.28ID:3s9o6nSW
manみたいにドキュメントインストールする方法は知らないな。
ローカルにインストールしなくてもリポジトリのwikiあたりに使い方書いておいてそれ見てねでいいんじゃないかとおもうけど。
2021/01/21(木) 21:40:35.33ID:e05IQa93
ビルドスクリプト使ってenv::var("OUT_DIR”)で取得できるパスにファイル出力してるのが多いみたい
605601
垢版 |
2021/01/21(木) 22:18:23.22ID:ooF1treM
なるほど。 そういうやり方もあるんですね。
でもドキュメントを各環境で適切な場所に
インストールするのは結局は手作業ということになりそうですね。

そういうことなら無理に自動化するのは諦めて
必要ならこのディレクトリで mdbook コマンドを実行してねみたいな感じにした方がかえって楽かな……
2021/01/21(木) 22:42:45.36ID:RNEMaupk
cargo installでrustバイナリ以外をインストールするオフィシャルの方法は長年用意されてないから別の手段で頑張るしかない
https://github.com/rust-lang/cargo/issues/2729
607デフォルトの名無しさん
垢版 |
2021/01/24(日) 00:35:05.68ID:sFJWsyrt
fn num() -> usize {
10.pow(9)
}
この定数はなぜ推論でusizeにならないんですか?
608デフォルトの名無しさん
垢版 |
2021/01/24(日) 19:33:54.83ID:tQo0lqIt
もういい加減にしてクレート
609デフォルトの名無しさん
垢版 |
2021/02/03(水) 05:50:55.51ID:0f68sTlM
なんでいちいちゴミをワサワサDLしなきゃならねーんだよゴミ言語
2021/02/03(水) 21:58:38.43ID:eBd9v7fI
どしたのわさわさ
2021/02/03(水) 22:30:52.82ID:9t+fhzYK
DustじゃなくRustだからゴミじゃなくてサビ言語だよ
2021/02/04(木) 19:02:46.18ID:kqT/5NjJ
&strってなんで&Stringじゃないの?
2021/02/04(木) 20:19:37.24ID:qhstqCrC
その2つは別のもの
どっちも存在する

&strはstring sliceのborrow
&StringはStringのborrow
2021/02/04(木) 20:39:25.16ID:kqT/5NjJ
>>613
同一だと思ってたけど違うの??


&strを要求する関数とかメソッドに&String渡しても動くもんだからてっきり
615デフォルトの名無しさん
垢版 |
2021/02/04(木) 20:54:06.40ID:/mf7s98M
それはDerefの効能
616デフォルトの名無しさん
垢版 |
2021/02/04(木) 21:06:19.09ID:/mf7s98M
&strはStringの一部か全部へ参照 rust的にはスライスへの参照
&string[1..3] こういうこと

引数を&StringにするのStringの参照しか渡せないが、&strにすればStringの一部や””で囲った&strも渡せる
2021/02/05(金) 01:36:04.17ID:cqRcw5h6
>>614
引数として&strをとるメソッドや関数に&Stringは渡せないんじゃなかったっけ
self の場合の話?
2021/02/05(金) 01:46:13.57ID:ywW/HyXt
>>617
StringはDeref<Target=str>を実装してるから&strをとる関数に&String渡せる
https://doc.rust-lang.org/std/string/struct.String.html#deref
2021/02/05(金) 13:26:40.93ID:ou/gU5gH
こういう暗黙変換て混乱を生むだけだと思う。
2021/02/05(金) 15:35:15.48ID:cqRcw5h6
>>618
二つ目の例だけ記憶してて勘違いしてたみたい。ありがとう

>>619
rustは暗黙変換かなり少ないからマシな方だと思う
メソッドのselfの暗黙変換はないとつらいかと
2021/02/06(土) 16:00:13.52ID:n3CNI52+
Option::filterのResult版って無いのかな?
2021/02/06(土) 20:10:46.18ID:YrYkvgk0
>>621
条件に合致しない場合は何を返して欲しいの?
2021/02/06(土) 21:49:40.07ID:b3bDWNzR
>>621
and_thenでErr返せば?
2021/02/06(土) 21:55:40.99ID:n3CNI52+
>>622
引数で渡したエラー値をErrにくるんで返してほしい
625621
垢版 |
2021/02/07(日) 10:23:42.94ID:ik9tpY93
>>623
うん、それが最適でしたね

もともとTと&T -> boolからOption<T>を構築してたコードがあってSome(t).filter(|t| !t.is_hoge())ってしてたんだけど
それをResultに変えようとしたらif式で数行増えちゃって
ちょうど対応するようなのって無いのかな?って思って質問した次第でした
2021/02/07(日) 11:40:55.51ID:NCHwUWPY
それはok_orかok_or_elseで変換すればいいだけじゃなくて?
2021/02/08(月) 19:14:38.32ID:g+sV++N4
Rustの良さが実感できるのは長大なコードをチーム開発するときなのかな

小さいプロジェクトならRustは
・生ポインタ使わない
・できる限りSTLを使う
・const、moveをデフォルトで使う
ことにしたC++に敵わないような
C++の方が柔軟だしず〜っと短く書けるし
2021/02/08(月) 19:48:24.23ID:g+sV++N4
あ、標準の機能とかイディオムを巧みに使えばC++並みに短く書けるよ、というのがあったら教えてください
2021/02/08(月) 20:52:33.63ID:tj1CufyM
どちらかというとC++の方が長くない?
ヘッダとソースの重複とかイテレータが冗長とかshared_ptrが長いとか。
あと小さいプロジェクトだとビルド環境構築の手間が
相対的に大きくなるからC++はつらいな。
2021/02/08(月) 20:54:12.55ID:tj1CufyM
あとなるべくconstにしたいのに多用すると結構長い
2021/02/08(月) 21:36:53.51ID:UsSsiWeS
RustスレなのでRustの味方をすれば良いと思うが、>>629はあまりにも言いがかりだろう

> ヘッダとソースの重複
重複するコードを書かなければならないことなどない

> イテレータが冗長
今どきautoせずにイテレータを書くことはない

> shared_ptrが長いとか
これは確かに
2021/02/08(月) 22:14:40.49ID:tj1CufyM
>>631
テンプレートでなければ関数プロトタイプと実装で同じこと書くと思うんだけど最近は違うんだっけ?
あとイテレータはbegin/endのこと。これも書かなくて良くなったりしてる?
2021/02/08(月) 22:48:07.53ID:UsSsiWeS
>>632
特殊化が必要なら当然特殊化するし、プロトタイプしか与えられてない関数は当然中身を他の場所で実装しなければならない
が、いずれもヘッダその他で書いてあるのと同じことを繰り返し書くという意味ではない
「引数と返り値をプロトタイプと実装で二度書くじゃないか」と主張してるのか?
だとしたら、「Rustのtraitとimplは同じことの繰り返しだ」と同レベルのデタラメだ


> あとイテレータはbegin/endのこと
範囲for文はあるので、コンテナを走査する時にはbegin()もend()も書く必要はない
が、begin()やend()の指すイテレータが必要なら当然書く必要がある
しかしこれより簡潔な表現方法があるか?
2021/02/08(月) 22:59:07.96ID:tj1CufyM
>>633
いや、Rustのtraitとimplも同じことの繰り返しだと思うが。
もちろんそれぞれに意味があるのは分かるが、今話題になってるのは長いかどうかなので、単に長いのでは?ということ。
begin/endは言われてみれば確かにそんなに長くもないな。
2021/02/08(月) 23:04:02.74ID:tj1CufyM
そういえばRustだとderiveで導出できるようなのを
手で書かないといけないのも面倒だと思ってたけど
それも最近のC++だと便利になってるのかな?
2021/02/08(月) 23:09:22.70ID:UsSsiWeS
>>634
〜〜〜〜〜ッッ!!?!!????
型を示すだけぞ???
どういう理屈で「どちらかというとC++の方が長い」???
「プロトタイプ」なる仕様が冗長だと思ってるということか?
だとしてもどこがどうRustより長い?
traitとimplが同じことの繰り返しに見えるなら尚更
2021/02/08(月) 23:20:22.89ID:34Jom8HU
刃牙みてぇな驚き方
2021/02/09(火) 00:25:25.36ID:HbSSO5iG
>>636
気持ち悪いなお前……
2021/02/09(火) 00:34:18.83ID:wDpL+x9E
ゆうてID:tj1CufyMがもの知らん過ぎるよ
刃牙クンが正しい
2021/02/09(火) 00:49:55.66ID:M+MJQwFs
>>627 がどういうところでrustを冗長に感じたのかが分からないと身のある議論にならないのではないか
2021/02/09(火) 01:06:11.87ID:iu64Jkj8
let v2 = v.iter().take_while(pred).collect::<Vec<_>>();

auto iter_end = std::find_if_not(v.cbegin(), v.cend(), pred);
auto v2 = std::vector<Hoge>(v.cbegin(), iter_end);
2021/02/09(火) 14:34:18.07ID:u94zqiaA
Rust言語を推進する「Rust Foundation」設立。AWS、Google、マイクロソフト、モジラ、ファーウェイらが設立メンバー
https://www.publickey1.jp/blog/21/rustrust_foundationawsgoogle.html
2021/02/09(火) 15:30:38.01ID:kPdoOyk6
>>642
>ファーウェイ
陰謀論者が発狂しそう
2021/02/09(火) 15:37:53.29ID:hLMZgkSi
ファーwww
ウェーイwww
2021/02/09(火) 15:48:29.20ID:Pj9Pa3V5
>>642
GoogleもMSも節操ないな。
2021/02/09(火) 16:43:44.21ID:gWi0ogeT
非同期って結局のところtokio使えばいいの?
2021/02/09(火) 17:12:10.08ID:hLMZgkSi
>>646
無難なのは tokio だが、言語としては非同期ランタイムを固定しないという明確な指針がある以上は
使い分けしなさいということになると思う。
2021/02/09(火) 18:32:36.30ID:nK2/UuNc
traitとimplが同じことの繰り返しは流石にキテレツ過ぎてワロタ
こういう基本的な言語仕様も分かってない人にとってRust使うメリットってあるのかな

「どっちが短く書けるか」については、流石にC++じゃないかな
良くも悪くも自由だし、短さだけを追求したクソコードも作れる

一方でRustも一応エルゴノミクスを掲げてはいるし、冗長さは感じない
C++が短くでき過ぎる、って言い方が正しいとおも
2021/02/09(火) 19:12:15.97ID:tpC3waGh
>>642
林檎やfacebookの参入、ゲームやスマホでの導入例が出てくればこれはかなりの地位を占めるな
2021/02/09(火) 20:13:22.59ID:G8as3nFu
コードを短くできるなんてどうでもいいことに囚われて半端になってる印象。
2021/02/09(火) 21:03:00.62ID:9cByPiIZ
>>650
rustが?
2021/02/09(火) 22:20:32.26ID:tpC3waGh
どうでもいいことか?
2021/02/09(火) 23:19:34.12ID:iu64Jkj8
程度問題
2021/02/10(水) 00:30:31.60ID:KzEq3JVg
具体的なコードの話も出さずに議論されても困る
2021/02/10(水) 02:24:50.74ID:E/DLe6HD
Firefoxでは160,000行のC ++コードを85,000行のRustコードに置き換えたと言ってる
2021/02/10(水) 06:12:58.16ID:IJdnUleO
いやーRust難しくないっすか…
3回くらい入門したけどrustlingsのiterあたりでつらくなってくる
アホは他の優しい最新言語やったほうがいいんですかねぇ
657デフォルトの名無しさん
垢版 |
2021/02/10(水) 08:20:43.62ID:Y3LDlcI4
でもRustのコンパイル基盤のLLVMはいつまで経ってもC++製のまんまだよね
書き直さなきゃC++の牙城は壊せんで
2021/02/10(水) 08:39:46.46ID:KAhsYwl/
それAppleに言えよ…
2021/02/10(水) 09:32:21.19ID:KzEq3JVg
craneliftがあるじゃん
デバッグビルド向けだけど
2021/02/10(水) 09:36:57.75ID:+cBPKBOz
コンパイラはrust自身で作られてるからそのうちそうなるんじゃね?
2021/02/10(水) 23:59:35.72ID:ToMnnTm0
>>658
Appleは重要なパトロンではあるけど関心はApple以外誰も興味無い
キメラ言語のObjective-Cを守る一点だけだろ
2021/02/11(木) 01:31:10.60ID:9tQEVdS2
>>657
というかC++をちゃんと使いこなしている人は、Rustが便利だとは思えない人が多い
のでRust化する動機が無い。
2021/02/11(木) 02:06:38.13ID:Bko8L/Zl
>>662
>>627てこと?

> 小さいプロジェクトならRustは
> ・生ポインタ使わない
> ・できる限りSTLを使う
> ・const、moveをデフォルトで使う
> ことにしたC++に敵わないような
> C++の方が柔軟だしず〜っと短く書けるし
2021/02/11(木) 02:10:08.49ID:9tQEVdS2
>>663
むしろ、STLがクソすぎるのがC++が嫌われる原因。
C++は、STLを使わずに独自templateライブラリを使うのが便利。
2021/02/11(木) 02:23:45.58ID:Bko8L/Zl
>>664
「使いこなす」がレベチ過ぎてワロシ
コンテナとアルゴに関しては俺もSTL使う方が良いと思ってたわ
vector<bool>とか、難のある仕様があるのは理解してたがそういうのに個別に対処すれば十分だろうと

リーナスとかもSTLが大ッ嫌いだという記事をよく見るが、具体的にどこを毛嫌いしてるのか俺は理解していない
2021/02/11(木) 03:22:28.69ID:veopzNW6
いつもの爺だよ
2021/02/11(木) 10:32:11.70ID:uGNpwdY5
そりゃOSレベルで見たらメモリの使い方がラップされるようなライブラリは使わんだろ。
馬鹿でもわかる話だと思ってたがそうでもないのか。
2021/02/11(木) 10:55:34.35ID:681aVeVl
むしろ C++ のつらさを知ってないと Rust の良さは (悪さもだが) わからんだろ。
2021/02/11(木) 12:17:58.13ID:tLNN1WhF
>>667
それ言ったらC++のCじゃない部分は全部ダメじゃね
2021/02/11(木) 12:18:18.96ID:tLNN1WhF
STLに限らず
2021/02/11(木) 12:38:34.69ID:veopzNW6
>>669
そうだよ
「OSを実装するためには」という条件ではね
2021/02/11(木) 15:13:11.82ID:9tQEVdS2
>>669
STLはCの良さを台無しにするような傾向がある。
C++の言語仕様自体は適切に使えばそのようなことはない。
2021/02/11(木) 15:46:32.06ID:LFj6F75s
>>672
> STLはCの良さを台無しにするような傾向がある。
これは観念的な話?
パフォーマンス的には、もちろん不要なコピー等は避けるという前提のもとで、同じなのかなって思ってたんだけど

> C++の言語仕様自体は適切に使えばそのようなことはない。
適切というのは、C with class として使えば、ということ?
2021/02/11(木) 16:26:39.58ID:681aVeVl
>>672
STL というものは C++ の中にはない。
2021/02/11(木) 16:31:10.44ID:681aVeVl
C++ の標準ライブラリは C 的な良さを殺さないように配慮しまくってるから
抽象化層で抽象化しきれずにイビツになってるんで、
出来が良いとは思わんが C の良さを台無しにしてるとは思わんな。
2021/02/11(木) 16:32:15.96ID:9tQEVdS2
>>675
そう思ってるならあなたも設計者の頭の出来も馬鹿。
2021/02/11(木) 17:01:42.79ID:/o5Cctlu
他所でやれ
2021/02/11(木) 17:04:12.74ID:BUYxyJ+C
>>662
MozillaもGoogleもMSもC++を使いこなせないからRustを支援してるって主張か?
2021/02/11(木) 17:27:06.59ID:9tQEVdS2
>>678
Mozillaなんか独占禁止法違反を誤魔化すためのGoogleの下請けに過ぎないので
レベルの高いプログラマはもはやいないし、MSやGoogleは巨大すぎるので
できそこないのプログラマも多い。
680デフォルトの名無しさん
垢版 |
2021/02/11(木) 17:42:02.28ID:7PiE9zQt
おじいちゃんの想像力が凄すぎる
2021/02/11(木) 19:00:14.15ID:yn2eFMfP
トランプ好きそう
2021/02/11(木) 19:04:26.47ID:BUYxyJ+C
>>679
なるほど、Mozillaのプログラマは全員レベル低いしGoogleやMSでrustに関わってる人も全員出来損ないという主張なのね
2021/02/11(木) 19:17:51.67ID:du0efLq8
ダニング=クルーガー効果

ダニング=クルーガー効果とは、能力の低い人物が自らの容姿や発言・行動などについて、
実際よりも高い評価を行ってしまう優越の錯覚(英語版)を生み出す認知バイアス。
この現象は、人間が自分自身の不適格性を認識すること(メタ認知)ができないことによって生じる。
1999年にこの効果を定義したコーネル大学のデイヴィッド・ダニング(英語版)とジャスティン・クルーガー(英語版)は、
「優越の錯覚を生み出す認知バイアスは、能力の高い人物の場合は外部(=他人)に対する過小評価に起因している。
一方で、能力の低い人物の場合は内部(=自身)に対する過大評価に起因している。」と述べている。
2021/02/11(木) 19:50:13.66ID:veopzNW6
いつもの爺だって言ってんのに
2021/02/11(木) 20:05:54.55ID:LFj6F75s
>>675
抽象化しきれてないというのは、実装の話?
それともインターフェースの話?
2021/02/11(木) 20:11:37.99ID:ntK2cQ4K
ここはC++のスレじゃないので他所に行ってね
2021/02/11(木) 20:55:43.37ID:681aVeVl
>>685
インターフェイス (仕様) の話だけど実装の話でもある。

たとえば C++ では vector の大きさが変わったら (それの要素を指す) イテレータは一斉に無効になって
コンパイル時にも実行時にも捕捉されない (捕捉することを保証しない) のは
明らかに vector の実装の都合を想定していて、
仕様を満たす範囲で効率的に実装すれば (vector の) イテレータの実体はポインタ一個になる。

C++ の標準ライブラリは C で出来ること、 C の習慣の見栄えを変えているに過ぎないし、
そうなるようにデザインされている。

実装がどうなっているかが透けて見えるような仕様になっているという意味で抽象化がしきれていないと書いた。
2021/02/11(木) 21:35:06.01ID:qccRsQET
>>676はクソか馬鹿。理由は説明しない。
2021/02/11(木) 23:40:49.80ID:zsmCiXPn
>>687
ありがとうございます
為になります

でもそれは裏を返すと、パフォーマンス的にはCと同等の効率で実装されていると思って良いんですかね?
(ただしラップしていることのオーバーヘッドはある?)
2021/02/12(金) 00:55:03.10ID:rREL60wB
>>668
学術的な言語理解ならその通りだが、言語習得という意味では寧ろ逆ではないかと
C++の瘴気に毒された民は清浄の地には住めない体になってる
2021/02/12(金) 01:08:51.70ID:2OOQ6m86
>>689
完全に成功していると言い切れない部分はあるかもしれないけど、
実行時に処理すべきことが同じならクラスやらテンプレートやらでラップしても
C と C++ でほとんど差は付かないよ。
少なくとも現代的な処理系で最適化を有効にして比較した場合には。
2021/02/12(金) 01:20:11.09ID:2OOQ6m86
>>690
それはどうだろう。
俺はアマチュアだがそれでも C++ を二十年以上触ってきた感覚で言えば
Rust はかなり良いという印象なので、 C++ のグダグダさに
うんざりしてる人は結構いるんじゃないか?

C++ の自由さを楽に感じている部分もあるんだが、結局はツギハギだからなぁ。
理念的な良し悪しを置くとしても長期にわたって機能を増やしていれば
一貫性のないところだっていっぱい出てくるのは仕方がないことで、
どこかで時代をリセットしてやり直す必要はあるんじゃないかと思う。

俺にとってはそれが Rust って感じ。
2021/02/12(金) 07:21:37.77ID:dfrGT/mn
test
2021/02/12(金) 15:00:39.40ID:Icv/F37w
rustももう十分一貫性ないだろ。c++リセットしたい割に同じ道行ってるのがどうしようもねーなという印象。
2021/02/12(金) 15:46:07.19ID:Sqde6WAi
だからお気持ちはいいから具体例を挙げろよ
2021/02/12(金) 16:25:53.42ID:2OOQ6m86
>>694
一貫性が壊れてきてるというのはわかるよ。
でも、それを繰り返すもんだという諦めがあるから、
Rust がグダグダになりきったらまた新しい何かが登場するだろうと期待して今は Rust ってこと。
C++ の状況をなぞるならこれから 15 年か 20 年くらいはなんとかなるだろ。 それで十分だ。

>>695
以前のスレでも書いたような気がするが、
is_alphabetic の引数は self なのに is_ascii_alphabetic は &self だったりするとかみたいな
微妙な歴史的経緯がちょろちょろと見え隠れする。

個別に見れば重要ではないんだけど、
そういうどうでもいいことの積み重ねが全体としてのいびつさになる。
かといってそこらへんを綺麗に整理しつづけるために互換性を失うようでも
受け入れられなかっただろうというのもあるので、
そこらへんは本当にしゃーないんだわ。
2021/02/12(金) 18:51:43.73ID:HD0w64Tf
エディションで定期的にリセットする仕組みが機能するかどうかは興味あるな
Rustで初めて挑戦する感じだから、良い感じに機能するのはさらに次世代の言語になるだろうけど
2021/02/12(金) 23:17:05.75ID:1iMy2d01
>>687
>実装がどうなっているかが透けて見えるような仕様

私はむしろ、実装が透けて見えるのが王道だとおもっていたのですが、あなたのいう「抽象性」というのが私の感覚とは違うのかもしれませんね
抽象性を徹底して理解するためには、どんな勉強をすればいいのでしょうか?
2021/02/12(金) 23:18:50.55ID:1iMy2d01
>>692
>C++ のグダグダさにうんざりしてる人は結構いるんじゃないか?

私はまだ経験が浅いのかもしれませんが、そんなに C++ がグダグダだとは思っていません
どういうところがグダグダなのか例示していただけるとありがたいです‥‥
2021/02/13(土) 11:09:55.70ID:sNJoTpmN
>>698
抽象というのは、要は余計な要素をそぎ落とすという話なので考え方によっては
どこが余計なのかというのは変わりうるけども、仮に vector の本質を
「縮小・伸長可能な配列」であると考えるならば
 ・ 要素が隣り合う
 ・ 要素アクセスのコストのオーダーは O(1) である
といった性質は本質に付随する性質として受け入れられる。 でも、
 ・ 配列を伸ばしたらイテレータが無効になる
という仕様は
 ・ 配列の大きさを変えるのをメモリの確保しなおしで実現する
 ・ イテレータの実体はポインタ一個である
という実装上の理由 (を想定している) なので、抽象化の漏れだと思う。
イテレータをコンテナ (の参照) とインデックスの組で実装すれば回避可能なわけだし。
でも C++ の標準ライブラリでは C の価値観を以て抽象化よりも実行効率を優先するという選択をした。

繰り返すけど、これは何を本質とみなすかという見方によって変わりうるので、
考え方によって詳細は変わるかもしれないということには注意。
 ・ 対象は何である (ように見せている) か?
 ・ 対象がそう見せようとしている通りに使えるか?
 ・ その上で対象がそう見せかけようとする以外の部分 (実装の都合) を「忘れられる」か?
というのがライブラリが持つ抽象性。
カプセル化で大事なのは情報隠蔽だというのをどっかで読んだことくらいあるでしょ。
余計なことは見せないほうがいい。

んで、私 (>>687) にとっては vector のメモリ管理の都合は (少なくとも必要になるまでは)
忘れていたい余計なことだと思えるということ。
2021/02/13(土) 11:21:51.89ID:sNJoTpmN
>>699
特にいびつさを生み出している例はヘッダファイルかな。
ソースファイル (.c) がひとつのモジュールとして機能して
ヘッダファイルがモジュールの外に向けたインターフェイスとして機能する
というのは C の世界ではまあまあ上手くいっているのだけど、
ヘッダファイルに定義を書くようになってから役割の境界が破綻してきた。

従来の C の世界では「定義はどこかのコンパイル単位に属す」という前提があったが、
ヘッダ内での実装 (テンプレートやインライン関数) ははっきりした所属がない。
テンプレートαがテンプレートβを使っていてソースファイルγでαを使いたければ
γ内からβも見えてしまうので隠蔽しきれない。 (カプセル化の破綻)

C++er にとってモジュール機能の導入が悲願のひとつと言われ続けていたのは、
ヘッダファイルという仕組みが理由になっている色々なグダグダの解消につながることが
期待されていたからだよ。
C++20 でとりあえずモジュールが導入されたけど色々な機能をモジュールを前提
にしたものに置き換えて古い仕組みがフェードアウトするまではまだまだグダグダする
だろうけどな。

ところでこれ以上は Rust スレで C++ の話を続けるとうっとうしがられるので、
質問があればこれ以降は C++ スレで。
702デフォルトの名無しさん
垢版 |
2021/02/13(土) 12:33:21.13ID:WXR7/a5A
板違いでしたらすみません。
カスタムSMGでリロードしても
弾が装填されません。
弾はピストル弾であってますよね?
バグですかね
よろしくお願いします
703デフォルトの名無しさん
垢版 |
2021/02/13(土) 12:36:25.47ID:WXR7/a5A
板違いでしたらすみません。
カスタムSMGでリロードしても弾が装填されません。
ちなみにピストル弾です。
バグですかね
よろしくお願いします。
2021/02/13(土) 12:37:34.81ID:36lE3GzA
わかりにくいボケ
2021/02/13(土) 12:45:41.52ID:sNJoTpmN
たぶんこれとひっかけたネタ
https://store.steampowered.com/app/252490/Rust/
706デフォルトの名無しさん
垢版 |
2021/02/13(土) 13:05:51.12ID:w+5Lz0+D
鉄道やデジカメ、プログラム、ゲームの板のスレって
いつも無関係な話題で罵りあってるよね
これらの板って何か変な物を吸引するのだろうか
707デフォルトの名無しさん
垢版 |
2021/02/13(土) 13:33:02.22ID:WXR7/a5A
→704
ボケ言うなカス
2021/02/13(土) 14:06:11.02ID:jbR8Qrt4
▷707
なんじゃワレやるんかコラ
2021/02/13(土) 14:49:42.47ID:pbGXUc6m
pythonのモジュール作成者にもっとrustの利用が促進されればいい感じになりそうな気がする
2021/02/13(土) 19:30:22.42ID:cu3O8Dcb
はっきり言って邪魔でしかない
2021/02/13(土) 19:58:39.56ID:3pvm/7w/
>>709
Rust 使えるなら Python 要らないだろ。
2021/02/13(土) 20:30:02.97ID:iTD0ef09
プラグインとしてのwasmは流行りますか?
2021/02/13(土) 21:46:14.79ID:sNJoTpmN
>>712
可能性は十分にあると思う。
2021/02/13(土) 23:21:08.34ID:ahglb0ed
wasmはWebブラウザだけでなく、令和のJavaアプレットのように Write once, run anywhere を標語に
あらゆる目的で使われるようになるよ
2021/02/13(土) 23:57:58.78ID:qgbbzUT6
ちょっとしたやつでもファイル容量大きくなるからまだ無理
さらにいえばjsでもgpu使えるから並列計算ならそれ使えばいいし、wasmの用途は限られる
将来的に5gとかで通信速度上がったら使われるようになると思う
2021/02/14(日) 00:05:54.10ID:FhxBluZZ
今、5GのEdge Computingがwasmの適用範囲として最も注目されている領域
2021/02/14(日) 10:45:44.60ID:ICgnupj6
wasmバブルってのはちょっと考えにくい
2021/02/14(日) 11:17:05.02ID:fVniJNpS
泡沫の夢という意味かもw
2021/02/15(月) 00:18:35.54ID:M7Hs01/T
>>700
>・ 配列を伸ばしたらイテレータが無効になる
>という仕様は
> ・ 配列の大きさを変えるのをメモリの確保しなおしで実現する
> ・ イテレータの実体はポインタ一個である
>という実装上の理由 (を想定している) なので、抽象化の漏れだと思う。

ふむふむ‥‥抽象化といってもいろいろあるんですね‥‥

>イテレータをコンテナ (の参照) とインデックスの組で実装すれば回避可能なわけだし。

私はイテレータはポインタの読み替えだと決め付けていたので、こういうイテレータの実装はちょっと抵抗がありますね
コンテナへの参照とインデックスを組みするとなると、これはスレッドセーフのことを考えないといけないな、と、どうしても思ってしまいます
そういうこと、すなわち必要に応じて重たいけれどもスレッドセーフにするか、それとも単一スレッド内の話だから軽く書きとばすか、というのはアプリケーション側の裁量だと思っています
言語標準で最初から「スレッドセーフにしました!」というのは、C/C++ 的にはイマイチではないかな、と
2021/02/15(月) 01:57:36.14ID:GNSRFiac
>>719
> C/C++ 的にはイマイチではないかな、と

そうだよ。
C++ が C 的な考え方から離れなかった (他の方針も取れたのに) という話をしてる。
C/C++ 的にイマイチになる例を出したんだからイマイチだよ。
721デフォルトの名無しさん
垢版 |
2021/02/15(月) 02:16:06.50ID:dmuMtjqZ
WebAssemblyで書かれたアプリはあるんですか?
722デフォルトの名無しさん
垢版 |
2021/02/15(月) 03:28:26.27ID:QPKY0Zj9
喧嘩売りたいわけじゃないんですけど、Rustって明示性を重視してますよね、mutとか、所有権とか
でもそのくせ式としてreturnを省略できたり、でも例外はないからOptionやResultが普通でunwrap
しなくちゃならなかったり、でも>>505-508のようにメモリモデルの(まだ)定義がなく?、>>333
みたいな暗黙の再借用が出来たり色々ちぐはぐな気がするんですが、1.5、2.0辺りになったら大幅に
変わったりしますか?足を撃ち抜かないCPPとしては「良い」出来だと思うんですが、、正直、ほんの
ちょっと触ってみてCargoコンパイルが重くて、特徴の明示的など非常にめんどくさいんですがそういうもの?
C++20やC++23なんてありますが正直、もう時代の役目を終えたと感じます。いくら色々な機能を追加しても
能力次第で足を撃ち抜く事には変わりなく、そのような用途であるカーネルさえ古典的な安定したC、C++を
使いますよね。RustがWebkitを倒せたらほとんど使いどころがないような?

それと恐らく借用があるのでGCは搭載・あるいはON/OFFされないとほぼ確実に思いますが、async
awaitな非同期ではくGoのようなライトウェイトなGoroutineみたいなのが搭載される計画はありますか?
余談ですがLinux-kernelやドライバに使われると聞いているので、(標準的・言語的にはランタイムに入る事は)
無いんだと思ってますが、Goも例外は無いけど、なんであの界隈はブロック例外がアンナにも、お嫌い
なんでしょうかね?ちなみに最近、Nimというのを触ってとても感銘を受けました。
2021/02/15(月) 04:42:37.54ID:GNSRFiac
>>722
これはきちんと議論を追っているわけではなく私なりの理解だということを事前に断っておくけど、
(unsafe を除いて) メモリ管理のチェックが自動化できることが最重要の指針だと思う。

チェックするにあたって必要な情報が多いから結果的にたくさんのことを明示する必要があるけど、
曖昧さがないなら明示する必要はないし、
実際の利用でほとんど常に同じような指定をしているならそれをデフォルトにして違うときだけ指定するのでも問題にならない。
2021/02/15(月) 09:10:14.02ID:Rhj6q0xj
>>722
単に明示性を重視してるというよりは、分かりにくいとか非推奨とか高コストなとこは明示して
そうでないとこは省略させたいように見えるな。
例えば関数の型なんかは技術的には省略して推論できるけど
分かりにくくなるからあえて書かせるとか。
なのでreturnは自明だけどResultはちゃんと処理させたい、
という考え方かと。

goroutineみたいなのはまず入らないだろうね。
そもそもなるべく標準ライブラリは小さくする方針だし、
現状でもrayonみたいな並列処理ライブラリ使えばいいし。
725デフォルトの名無しさん
垢版 |
2021/02/15(月) 14:18:13.02ID:QPKY0Zj9
>>723 >>724
なるほど、スペシャルサンクスです!メモリ管理のチェックを”最”重要視してるわけで、あまり煩雑な明示
及び、高コストな明示はしない方針だろうという事ですね。ドライバーやカーネル、OSコマンドに使われて
セキュリティホールが一掃される日が早く来てほしい。
並列処理でrayonというのがあるんですか!教えてくれてありがとうございます。確かにライブラリというか
C++のようなRTLは小さくしてほしいですね。Goのようにデカすぎるのは組み込み用途に向かないので。
2021/02/15(月) 18:15:16.43ID:Y11JAZ1I
goroutineの代替ならtokioとかasync-stdみたいな非同期IO系のランタイムも外せないのでは
goroutineの並列と並行のどっちの側面について言ってるのか次第ではあるけど
2021/02/15(月) 18:57:38.65ID:Rhj6q0xj
asyncではなく、って言ってるのでrayonとかの方が近いかな、と。
まぁどっちにしてもgoroutineそのものなモデルを提供するライブラリは多分ないので
各自必要な並列並行性に応じたライブラリを選ぶ必要はある。
728デフォルトの名無しさん
垢版 |
2021/02/15(月) 22:30:19.90ID:LbvG7Uo/
RustにあってC++にない機能はありますか?
2021/02/15(月) 23:16:52.31ID:Yv9X0Du7
>>728
memory safety
2021/02/15(月) 23:34:00.74ID:FO8OS1Ro
リージョン推論とアフィン型
2021/02/15(月) 23:35:54.84ID:jLBVKIGa
勢い
2021/02/16(火) 00:39:31.16ID:uH9KCelr
若者
2021/02/16(火) 01:35:01.04ID:birNKbej
hygenicなマクロやproc macro
734デフォルトの名無しさん
垢版 |
2021/02/16(火) 14:47:28.42ID:0SiibFTk
初心者
735デフォルトの名無しさん
垢版 |
2021/02/16(火) 19:09:01.10ID:zfzmKwUo
LinuxカーネルをRustで書こうとかいう話が去年出てたけど、
社会のインフラにもなってるようなカーネルの開発者が考えてることと
プログラミング言語で遊びたい人の考えてることが違いすぎて萎えた

しょせん、プログラミング言語なんてアセンブラとC以外は全部遊びだよね
安かろう悪かろうの遊びレベルの仕事に金払う会社があるから勘違いされやすいけど
2021/02/16(火) 19:18:56.90ID:ckHFYEhB
JAVAも遊びってマジ!?
2021/02/16(火) 19:36:38.83ID:KZAm4Q8q
COBOLも遊びだそうです
2021/02/16(火) 19:47:40.11ID:6a7fxa+u
遊びで生まれた子供がなんか言ってらw
2021/02/16(火) 20:07:29.86ID:6oy5nTaC
今はカーネルモジュールを対象にRustをサポートする予定みたい
ABIとかメモリ管理まわりの差異の吸収をどうするか一番熱いところをやってるね
https://lwn.net/Articles/829858/
2021/02/16(火) 20:25:37.08ID:F9q4wvox
C/Ruby 併用のmruby の本が出た。
文字列処理などは、GC のあるRuby側で書く

Webで使えるmrubyシステムプログラミング入門、近藤宇智朗、2020/11

宇宙開発などの組み込み用、MicroPython, Lua, Squirrel の代替になる。
Ubuntu 18.04, C99 対応

人工衛星イザナギ・イザナミでも、使っている
2021/02/16(火) 21:11:02.07ID:mcPcmZQC
なぜここで宣伝?
2021/02/16(火) 22:20:14.90ID:VGyCnBhh
そいつただのキチガイだから聞いても無駄だぞ
2021/02/16(火) 22:40:03.47ID:/P278iHx
>>735
LinuxもC言語ももとはと言えばスペーストラベルってゲームで遊びたくてLinuxの前身のUNIXが作られたし、そのゲームを移植するためにB言語がつくられて、
さらにそれを改良したのがC言語だ。
744デフォルトの名無しさん
垢版 |
2021/02/17(水) 00:07:57.00ID:NXsZKPRa
ここにも出没するのか…
2021/02/17(水) 00:30:02.75ID:5fjXtzC9
なるほど。いろんなスレで同じこと書きまくってんのな
2021/02/17(水) 02:18:16.85ID:JbW6f0lc
>>743
Cが遊びにも使えることを主張しても反論になってないぞ
2021/02/17(水) 03:00:38.28ID:0wQZl1Sa
推奨NGワード: ruby
2021/02/17(水) 11:52:49.70ID:SnS/pdJc
RUSTはウェブとかAI分野でのバブルは考えにくい

あるとすればIOTやら組み込み向けだろう
2021/02/17(水) 13:28:23.14ID:JbW6f0lc
金融でHaskell流行ったみたいな感じでrust流行ったりしないかね
2021/02/17(水) 13:40:51.06ID:9AH/BrCU
そもそもそんなに流行ってほしいか?
インフラとかライブラリとか地味なところで
ひっそりと使われるのが適してると思うけど。
2021/02/17(水) 18:07:12.21ID:JbW6f0lc
利用者増えた方が投資も増えて進歩が速くなるから
2021/02/17(水) 20:57:43.14ID:JskNfOx3
今の様子じゃ10年経ってもなんも変わらんだろ。先のある言語じゃない。
2021/02/17(水) 21:22:18.90ID:CcjHMdPi
システムプログラミング分野ではC++からRustに変わっていくんじゃないの?
754デフォルトの名無しさん
垢版 |
2021/02/17(水) 21:34:22.05ID:HqSggkAC
GAHUMが採用し出して団体まで作ったのに先がないなんてどんな世界観なんじゃ
2021/02/17(水) 22:03:18.40ID:Pg4t51og
Rustが流行らなくてもRustの考え方を取り入れた言語が広まってくれればいいな
2021/02/17(水) 23:46:21.75ID:bnMjXKAr
やりたいことが出来るライブラリ (クレート) があるなら
言語の詳細がどうでもよくなりがちってのはあると思う。
2021/02/18(木) 00:18:21.59ID:ldFX1qZV
コンストラクタ、構造体のめんどくささ考えても絶対流行らんわ。
根本的におかしい言語機能なんだよ。
2021/02/18(木) 01:33:00.72ID:3wQQElw6
プログラマーって人と違った事が好きな尖った奴のイメージがあるけど、実際は
寄らば大樹の陰で巨人が採用したプログラミング言語に従うのが吉なのだ。
2021/02/18(木) 02:01:34.78ID:n4kSgdMy
rustにはコンストラクタなんていうげんごきのうはないが
2021/02/18(木) 02:22:20.29ID:17ht1voR
型コンストラクタはあるのでは
2021/02/18(木) 02:35:11.90ID:aOnYkWOR
ボカァ、今後はC++がRustのパラダイムを吸収して (saferな書き方を提供して) Rustの役割は終わると思うね
2021/02/18(木) 05:45:24.92ID:rijSrz3Z
それならそれでもいいけどそうなるためにはある程度Rustの取り組みが成果を上げる必要があるわけで

C++の建て増し感も気になる
2021/02/18(木) 05:57:46.70ID:g5HFTB9g
C++の建て増し感はもはや長所と思うしかない
仮に今後「Rustのパラダイムを吸収する」方向に進むとしたらそれはまさに建て増しだ

個人的にはマルチパラダイムを体現してるようで結構だと思うが、建て増し感が受け入れられない人にとってはやはりクソ言語なのだろうね。C++は
2021/02/18(木) 07:19:44.62ID:hiVMRxyD
>>758
それ日本というかプログラマを使い捨てられる文化圏だけじゃね
2021/02/18(木) 14:50:08.00ID:rijSrz3Z
リナスやストールマンやヘルスバーグが興味持てばまた違って来るだろう
766デフォルトの名無しさん
垢版 |
2021/02/18(木) 19:42:22.85ID:1bJLI/ST
どこかでRocketで非同期処理できるようになるって見た気がするんだけど、
ググってもそれらしき情報が見つからない。
俺の勘違い?
2021/02/18(木) 20:20:01.72ID:SByJzFqI
>>766
たしか次の0.5でできるようになるはず。
gitのmasterなら試せるんじゃないかな。
768デフォルトの名無しさん
垢版 |
2021/02/19(金) 01:45:21.75ID:C4/TpWTT
>>761
それを何年も何十年も待ってる人が沢山いるけど、やらないでしょ
2021/02/19(金) 06:37:54.65ID:ytqZaYub
コンパイラスイッチなりプラグマなり必要になるからそれなら新言語で、ってなっちゃうわな
2021/02/19(金) 08:59:27.98ID:2/3+b4qC
>>768
やらないやつはrustで書くのも無理だよ
2021/02/19(金) 12:37:09.63ID:EWSghxXn
>>761
Rust が依存関係をチェックする仕組みはそういう機能があるというだけではなくて、
それで全体が統一されていることが大事でしょ。 (一部には unsafe もあるけど。)

C++ の上に Rust 的なパラダイムを建て増しして便利になることもあるかもしれないけど、
統率されていることの有用さとは別物だよ。
2021/02/19(金) 12:59:22.09ID:5rOBR4Oa
原理的には従来のunsafe C++にsafe C++を建て増して
既存のコードを徐々にsafeにうつしていくというのは出来そうかな。
しかし実際やるとなるとRustへの移行と同じくらい手間がかかりそう。
safe/unsafe間がFFIでなくなるのは多少楽かもだけど、
境界でsafeなことを保証するのは人間が考えないといけないし。
2021/02/19(金) 13:00:29.26ID:HAYVHwal
基本的saferで特例でunsafeとその逆じゃ全然違うからなあ
2021/02/19(金) 13:44:19.68ID:h/t0+GoU
ぼく丘safer
2021/02/19(金) 13:54:40.33ID:jb9MooDY
実際の機能がCのライブラリにリンクしてるだけとか、丘saferだな
2021/02/19(金) 15:45:22.92ID:ytqZaYub
上手いことsafetyにラップしてくれてればそれでいいよ
2021/02/19(金) 20:14:37.43ID:2/3+b4qC
safetyだと思い込めればええんやろ。単純な連中だわ。
778デフォルトの名無しさん
垢版 |
2021/02/20(土) 01:02:31.59ID:MdDLRkGY
こいつめっちゃウザい
2021/02/20(土) 12:53:25.44ID:TL3BSHJV
誰だよ
2021/02/28(日) 14:52:22.32ID:JEl8UZRv
アクセスを強要する言語はダメだよ
2021/03/05(金) 19:00:28.35ID:aSqkecBn
Iterator周りのconst fn化って目処立ってたりするのかな
2021/03/09(火) 11:54:18.25ID:e2HkPLHr
Rustで作られた有名なものを教えてください

Rubyだったらrails、homebrewとか
2021/03/09(火) 12:47:03.15ID:R5GGXoEM
https://qiita.com/hadashiA/items/3dec1713bd999b38e848

あとdenoもC++からrustで書き換えられたらしいし今後増えてくると思う
2021/03/09(火) 13:27:01.38ID:uSJY4o8s
>>782
Servo(Firefoxのレンダリングエンジン)
2021/03/09(火) 13:44:11.22ID:R5GGXoEM
tauriが伸びて来るかはまだ未知数
2021/03/09(火) 19:29:25.88ID:wHDXlDgC
Haskellで言うxmonadみたいな?
787デフォルトの名無しさん
垢版 |
2021/03/09(火) 19:53:58.75ID:eVxnhZwi
>>782
dropbox
2021/03/09(火) 20:01:24.82ID:zonUHFVg
firecrackerもRust製だっけか

https://github.com/firecracker-microvm/firecracker
2021/03/09(火) 20:04:31.04ID:zonUHFVg
firecracker >>783 のところに書かれてたか・・・。
2021/03/09(火) 20:10:47.51ID:xbBrvliS
Tock/OpenTitan/OpenSKみたいなセキュリティ系のファームウェアとか
こういうのは特にアナウンスもなく採用されていくから
気づいたらみんな使ってたということになるかも。
2021/03/09(火) 23:06:36.57ID:E3PmhGqz
rustで書かれた有名なもの…rustかな?
792デフォルトの名無しさん
垢版 |
2021/03/11(木) 12:01:52.44ID:Y/wb0v0V
Rustが使ってるLLVMってC++製なんだ
2021/03/11(木) 12:11:40.89ID:88YcySCa
ダメじゃん
根幹がC++
C++にタマタマ握られてる
2021/03/11(木) 14:41:42.94ID:L0vKEaLv
C++ の資産を (ほぼ) 一方的に利用しているのもそれはそれで気分いいじゃん?
2021/03/11(木) 14:49:39.38ID:wgd6SgIa
同じ目的のために作られた道具として既存のものに取って替われないのは不名誉しかない
2021/03/11(木) 15:10:09.87ID:UCScJ1K4
>>782
ripgrep
2021/03/11(木) 15:32:57.89ID:dn2xUnIJ
アホな人相手にしてると自分もだんだんアホになるよ
2021/03/11(木) 16:11:55.93ID:ndX1jvez
新紙幣発行したその日にすべての旧紙幣を使えなくすべきって主張する人?
2021/03/11(木) 16:44:26.00ID:uvX65qSE
LLVMをrustで書き換えた日こそ天下か?いやいやOSのカーネルこそ
800デフォルトの名無しさん
垢版 |
2021/03/11(木) 19:03:39.84ID:21294wFC
Runuxはよ
2021/03/11(木) 19:19:34.73ID:aZ7HXs2o
相変わらずしょーもない妄想にふけるやつしかおらんな
2021/03/11(木) 23:57:00.49ID:ZRdHs705
Rustにいわゆるクラス変数みたいなものってないんですか?
2021/03/12(金) 00:04:34.96ID:0cefU6Fx
リーナス「オブジェクト指向のたわごとを持ち込むならRustの評価見直すぞ」
2021/03/12(金) 01:07:04.26ID:1OUd5zSC
>>802
ありますけど、mutable static変数なんて扱いづらいだけですよ?
2021/03/12(金) 01:23:52.52ID:U+iRPjP4
staticはクラス変数とは違うような
2021/03/12(金) 03:18:16.54ID:ByeOJ4Y7
Rust は色んなものをモジュール単位にしているような印象がある。
構造体のフィールドへのアクセスもモジュール内では制限がなくて、
モジュールの外に対して可視性を制御する仕組みになってるわけだし。
型の単位ではプライベートとパブリックを分ける気がない。

考え方次第ではあるけどスコープ管理の「雰囲気」からすると
C++ のクラスが Rust で言うところのモジュールに近いと言えなくもないんじゃね?
まあ前提が違うものについて無理やり共通点を見つけることにどれほど意味があるかわからんけど。
2021/03/12(金) 10:21:25.50ID:3fdjVE8p
>>802
定数でよければ associated constant が使える
変数にしたいなら >>804 の言うように static 使うしかなさそう
2021/03/12(金) 12:26:55.76ID:J+ar7EHR
Dropboxは何のGUIライブラリで作られているのかわかりますか?
2021/03/12(金) 16:33:37.37ID:qQge26zC
>>808
rustで書き直したのはサービス側と同期エンジンじゃないかな?
810デフォルトの名無しさん
垢版 |
2021/03/12(金) 18:45:06.86ID:kTC1PKHO
Rustって何で構造体のメモリーレイアウトをデフォルトでは勝手に並び替えるんだ?まじやめて欲しい
サイズを小さくする為?それとの他の理由があんのか?明示的だと言いながら余計な事ばかりすんなや
2021/03/12(金) 20:33:09.00ID:jgkfYeWQ
老害乙
2021/03/12(金) 20:59:59.44ID:Y+hYjm0T
構造体の並び順はメモリーアライメントで苦労したこと無い人の意見だな。
2021/03/12(金) 21:41:21.91ID:1OUd5zSC
>>810
#[repr(C)]付けないで文句言ってるならお前のせいやで?
2021/03/12(金) 22:08:58.65ID:TCjnSuLT
>>807
>>804

サンクス
あんまり使わない方が良さげだなあ
設計変えた方が良さそうだ
815デフォルトの名無しさん
垢版 |
2021/03/12(金) 23:34:08.62ID:9XEGWpCC
今時プラットフォームに依存する構造体のメモリーレイアウトを前提としたコードは書いちゃダメよ
2021/03/13(土) 00:40:30.95ID:PGOVIZdP
>>814
クラス変数って要はグローバル変数だから濫用すべきではないよ
2021/03/13(土) 15:49:02.94ID:GoEo1qHE
>>815
アセンブラと連携したい時には問題となりそう。
また、順序が書いたとおりの方が、色々と効率よいコードが書ける場合がある。
2021/03/13(土) 16:03:49.74ID:DC1SOqVQ
>>817
>>813
2021/03/13(土) 17:29:01.78ID:eNr110Cx
>>817
具体例は?
Ord::cmpがmemcmpだけでできるとか?
2021/03/13(土) 18:01:56.32ID:JM8M9JoF
選択可能なんだからどうでもいい
https://doc.rust-lang.org/nomicon/repr-rust.html
2021/03/13(土) 20:55:02.47ID:yJisos8z
>>817
コンパイラが十分賢くなったときに様々な最適化を自動で出来るようにする余地を残すため
デフォルトでメモリレイアウトを保証しないって設計になってるんだけど
自分で最適化する場合はコンパイラの最適化を抑止するってのはrustに限らずよくある話だしなにが不満なのかよくわからない
2021/03/13(土) 22:01:36.30ID:aUdFS8U8
>>810
明示的じゃん。
明示的に並べ替えを禁止する指定があるじゃん。
ほとんどの場合に順序はどうでもいいんだから、
どちらがデフォルトであるべきなのかなんて自明だろ。

条件付きだが C++ もデータメンバの順序を並び替えることは (言語仕様上は) 有りうるし、
並べ替えて良いと規定されているときに並べ替えを抑止するような指定方法はない。
(処理系の拡張としては有ったりするかもしれんが。)

Rust のほうがマシ。

現在の Rust は言語仕様と処理系の仕様の区別が曖昧なので repr が
(今後現れるかもしれない) 他の処理系でも使えるポータブルな機能なのかわからんけど。
2021/03/13(土) 23:34:45.90ID:+sWre9Lj
フランスのデータセンターの火災で『Rust』はデータの大規模なロストが発生
2021/03/13(土) 23:53:02.21ID:+sWre9Lj
なんか
struct Foo {
  int m_a;
  bool m_b;
  int m_c;
  bool m_d;
};
とかあったら
struct Foo {
  int m_a;
  int m_c;
  bool m_b;
  bool m_d;
};
にしたい衝動に駆られてストレスmaxなのでどうでもいい話ではない
2021/03/14(日) 00:49:22.71ID:Atf6A86o
>>824
LP64ならどっちもサイズ同じじゃん
2021/03/14(日) 04:01:46.70ID:n3ZlR2nQ
構造体定義するときc++だとアライメントずれないように手作業でダミーのデーター詰めたりしてたけど、途中で型変えると並び替えメンドクサイ。自動で最適化してくれる方がいいし、どっちも選択出来るのだからRustの方が正しいわ。
2021/03/14(日) 05:38:07.85ID:oMOPVtdk
>>825
https://ideone.com/7DbqpX
2021/03/14(日) 08:27:15.60ID:8bm6cw7M
>>826
ビット単位で詰めるからな。
2021/03/14(日) 09:39:13.15ID:fDAcQow7
>>823
rustはrustで書かれたの?
2021/03/14(日) 13:13:21.06ID:5DzsH1LF
ポケモンGOはGoで書かれた
2021/03/14(日) 13:44:08.22ID:flEVf/TW
マジかよ…

rustで書かれたゲームエンジンってのもちらほらあるんだな
2021/03/14(日) 14:08:02.49ID:eta5h4cX
アライメント合わせとかコンパイラに任せたら良いし
最悪でもunionを使って型を並べたら最もアライメント条件が強い方の型に合うから
アライメント合わせの目的で手作業でダミーのデーター詰めを行うというのは都市伝説、
コンパイラがアライメントを合わせた結果としてできたPADDING部分のデータを
どうしても不定値にしたくないがmemset()で構造体全体をゼロクリアするわけにもいかないという
きわめてレアなケースでしか行わない
833デフォルトの名無しさん
垢版 |
2021/03/14(日) 18:04:27.92ID:pLOBnReb
非同期のランタイムはtokioとasync-stdどどっちが標準になりそう?
2021/03/14(日) 19:05:56.64ID:8bm6cw7M
>>830
ポケモンRustじゃカッコ悪いしな。
835デフォルトの名無しさん
垢版 |
2021/03/14(日) 21:20:59.71ID:T+7gBLoD
Rustの悪口言いたい訳じゃないけど、デフォルトで並び替えるのは正しく思えないわ
#[repr(C)]つけろってのはその通りだけど、組み込み用途でつけ忘れてリリースして
しまったら考えるだけで恐ろしい
2021/03/14(日) 22:04:54.76ID:JBU2DMkD
>>835
その程度も出来ない馬鹿だとCでやったら大惨事じゃね?
2021/03/14(日) 22:31:41.33ID:pQGk05s+
デフォルトで余計なことやる設計が好きな人にはいいんじゃないの?
結局どっちに寄せるかだし。
2021/03/14(日) 23:37:14.51ID:n3ZlR2nQ
>>835
自動ったって最適化の挙動はごく単純なルールだし、結果も解る範囲なのだからやはり問題ないとおもうけど。
2021/03/14(日) 23:48:28.09ID:n3ZlR2nQ
メモリレイアウトのパターンを何種類か決められて、それぞれの最適化パターンに名前が付けられていくと考えれば、概念的な意思の統一がしやすくなるわけでしよ。今まで皆がバラバラにやってた方がおかしいわけで。構造体の隙間にあちこちゴミ入ってるのどれほど見たことか。
2021/03/15(月) 01:33:05.21ID:c4Lf5m0s
>>835
clippy の improper-ctypes-definition とかで検出できるのでは
841デフォルトの名無しさん
垢版 |
2021/03/15(月) 01:42:14.94ID:Nwz504CC
Cはコンパイラによりけりで最適化の度合いによるけど、無茶な事をしなければ基本は
書いた通りにしか動かないよ。C++のクラスは継承を使うとよう分からんレイアウトを
しくさるけど。Rustのやり方でも問題は確かにないし、結局どっちに寄せるかと言うのも
その通り。むしろゴミと言うか他人がレイアウトを整理しようとして事故るパターンの方が
多いが、まあ確かに些細な事だろう
2021/03/15(月) 01:45:53.32ID:uFpZBB9k
C言語でも非標準とはいえ呼び出し規約の指定とかあったなあ
2021/03/15(月) 02:24:54.25ID:8Jf2QlAa
付け忘れでリリースってテストもせずにリリースってこと?
確かにデフォルトで安全側に振るのはRustの基本方針だとは思うけど
全ての型をFFIする前提というのはやりすぎだと思うが。
2021/03/15(月) 02:38:04.29ID:c4Lf5m0s
Cは書いたとおりにしか動かないってのは単にCに対する理解度が高いだけでは
例えばアセンブリしか知らない人から見たら自動変数の振る舞いなんかは暗黙的な動作ばかりだと思うが
2021/03/15(月) 13:54:57.20ID:faH0kxEk
まったくその通り
Cでは書いたとおりにしか動かない、と思うのはCにあまりにペッタリ入り込みすぎて
もはやC脳になってしまっている(なので考えずに自動でなされる変換が頭のなかでできてしまう)か
またはじつは思いこみで理解が足りてないかのどっちか
2021/03/15(月) 14:00:05.56ID:GOWRyYdB
更に言えば最適化を有効にしたらかなりアクロバティックなコードを生成してくることもあるので人間には予測不能。
2021/03/15(月) 19:06:12.98ID:tiOBROfx
たいしてメモリ削減できない言語のくせに変な最適化かけんなよって話だわ
2021/03/15(月) 19:34:49.20ID:13DwLIrw
Rustではunsafe使わない限りは構造体のフィールドレイアウトを変更しても問題無いので、最適化の余地を残す仕様になってるのは良い事なんでは
2021/03/15(月) 19:54:56.71ID:nJdAJo9y
>>845
書いた通りに動かないのはバグでは?
2021/03/15(月) 20:16:17.39ID:c4Lf5m0s
Cが書いたとおりにしか動かないのと同様にRustも書いたとおりにしか動かないということ

構造体メンバの順序の話はrepr(C)つけたりclippy使えというのが結論で
デフォルトの挙動に違和感を覚えるか否かという話はbikeshed
2021/03/15(月) 23:27:42.36ID:HGmaHoUI
メンバの配置が固定だと移植性も下がるよね
パフォーマンスの低下くらいだったらかわいいけど
下手すればバスエラーで落ちる
2021/03/16(火) 00:53:01.99ID:GTaecVmm
勝手に最適化する方が移植性落ちるわ。
2021/03/16(火) 00:56:51.74ID:5nPZFfnW
Cの常識がどこでも通用すると思ってると別の言語でも怪我しそう
2021/03/16(火) 00:59:01.44ID:GTaecVmm
コンパイラに全て任せればいいって考えのやつのが実際は事故ってるがな。
2021/03/16(火) 01:07:50.71ID:5nPZFfnW
何に怒ってるのかよく分からないけどコンパイラによる構造体レイアウトの最適化がデフォルトオンになってるのがそんなに気に入らないの?
2021/03/16(火) 05:37:04.29ID:0EC0D1BB
>>854
それは言語の問題なのか、コンパイラの問題なのか、何が事故ってるの?
2021/03/16(火) 07:17:52.07ID:oighJobp
ていうかCコンパイラのアラインメントだって最適化の一種じゃ?
2021/03/16(火) 08:01:04.42ID:pXLX1cSG
そんなに気になるなら、フォークして、
デフォルトの挙動が違うrustを作れば済む話じゃないの?
2021/03/16(火) 08:39:27.88ID:SlLiGo1E
最適化でunalignedになって落ちるならコンパイラのバグなんだから直せばいいし、
手動であらゆるアーキ向けにパディングを調整するよりよっぽどいいと思うけどな。
2021/03/17(水) 04:59:36.34ID:F/MTmTZA
メモリレイアウトの話まだ続いてるの?
C++でダメなところ潰して制約強めでバグ出にくくしようって言語で、コンパイラが信じられないと言われてもコンセプトが違うとしか
2021/03/17(水) 20:44:00.69ID:hH82Uf3P
C++でダメなところ潰して制約強めでバグ出にくくしようってのと、
コンパイラが信じられないからコンパイラ設計を楽にしようってのは別に矛盾しないがな。
頭悪すぎ。
2021/03/17(水) 22:43:22.09ID:8cWw5z32
コンパイラ設計を楽にするって、例えばどういうこと?
2021/03/18(木) 03:06:39.25ID:YG5QY/Fi
ここまでの流れでコンパイラがバグるほど難しい事してないと思うけど。何を心配してるの?
2021/03/18(木) 06:33:11.45ID:teFQO94z
何が問題なのかiefoneか何かで実例出して欲しいな
2021/03/18(木) 06:33:40.91ID:teFQO94z
ideoneでした
2021/03/18(木) 08:04:15.94ID:VY1V7baX
問題になるのは外部リンゲージな関数で構造体を渡すときだと思うが
コンパイルした後リンクするみたいな本番行為ってiefoneできるんでしたっけ
2021/03/18(木) 08:37:15.10ID:teFQO94z
テストの段階でわかるじゃないか
2021/03/18(木) 09:11:26.74ID:7Uj1c/fU
本番行為大好きです
2021/03/18(木) 22:11:22.58ID:j2TrRshi
イデオンの本番?
2021/03/18(木) 22:46:55.62ID:4SeQ/rCs
iefone って中華スマホっぽいな。
2021/03/19(金) 01:15:52.96ID:jSzcAIKb
ウィンドーズのAPIの構造体みたいにメンバの数が異なる構造体のシリーズで
先頭部分は同じレイアウトであって欲しい、みたいな要請がある場合は
いかに自動レイアウトの規則が厳格に決まっていても問題を生じるし、
テストで見つけろといっても限界がある
メンバ数3、4、5はOKだった!→56億年後に弥勒菩薩が6番目のメンバをboolにしたらすべて崩れ去った、みたいな
2021/03/19(金) 01:18:45.07ID:jSzcAIKb
それとも何かねここで言うテストというのはコンパイラの
自動レイアウトするロジックを見通したホワイトボックステストで
カバレッジ100%を目指せというのかね?
2021/03/19(金) 01:32:38.19ID:ZwQV5hpU
で、どれだけメモリ量減らせてるの?
2021/03/19(金) 01:46:10.43ID:jSzcAIKb
かなり減る64 bit整数m個とbool m+1個の構造体で#pragma pack(〜)とかしない場合
順序依存で8*m + 8*(m+1)バイトになるか8*m + ceil((m+1)/8)バイトで済むかの違いがある
引いたらどれだけ減ったかワカル
2021/03/19(金) 01:48:07.52ID:QYoHC3cJ
この人何と戦ってるの
2021/03/19(金) 02:08:13.91ID:qP05xHwq
日本語不自由なの多すぎか
2021/03/19(金) 08:05:42.69ID:elmSSYEz
C++だって処理系によってABI違って互換性無いのになに寝ぼけた事言ってんだ状態
2021/03/19(金) 08:22:46.12ID:jSzcAIKb
ヒエッ…日本語でどづぞ

>>877
処理系がABIを決めるケースはまれ
宇宙誕生以来一桁あるかどうか
2021/03/19(金) 08:52:24.84ID:6TNOQqr9
メーリングリストでそれらを主張してみてはどうか?ここで言ってもrust下げとしか見られない
2021/03/19(金) 10:06:03.26ID:S4bW7+Mw
さっぱりわかんねえんだが、
>先頭部分は同じレイアウトであって欲しい、みたいな要請がある場合は
こんなクソみたいな要請がある案件の場合はrepr(c)でいいんちゃうん?
2021/03/19(金) 10:57:59.03ID:jSzcAIKb
スマン>>878はstdcallを念頭に言ったがcdeclはC言語処理系によって決まったと言ってよいかもしれませんねーorz
stdcallの発祥がWindowsとPascalのどちらが先なのかは知りま栓、

>880
>こんなクソみたいな要請がある案件の場合はrepr(c)でいいんちゃうん?
禿げしく同意
2021/03/19(金) 11:33:49.63ID:qP05xHwq
なにこいつ……
2021/03/19(金) 14:44:53.99ID:ZYq4u5st
>>871
言われてみれば確かに。
alignmentはCPUのBIT数が同じであれば大体同じなので、自動でやってくれもよい
場合も有るが、順序まで変えたのでは困るな。
2021/03/19(金) 15:07:57.84ID:x8qTxIkr
repr(C)をつけるのでは駄目な理由は誰も言えないのか
2021/03/19(金) 15:11:24.58ID:gR5Gr2WA
おじいちゃんが今際の際に「repr(C)は使うな…ガクッ」って言ってたんよ…
2021/03/19(金) 17:24:40.30ID:t8rUWn4Q
不満があっても使い続ける必要があるなら、
フォークしちゃえばいいじゃん。
もやもやしつつ使い続けるのは、良くないよ。
2021/03/19(金) 17:49:26.38ID:6tRZIbsl
C/C++をいまさらフォークしたところで誰も見向きもせず
個人で使うだけで消えていくだけだろうが
rustなら「おっ、おれもこういうのが欲しかった!」
ってやつがむらがってきてワンチャン有名なれる・・かも?
2021/03/19(金) 18:09:28.62ID:UA/QoJ1s
ナイナイ(ヾノ・∀・`)
2021/03/19(金) 18:46:02.05ID:3FXWvrKo
>>887
一貫性のあるc--ができたら可能性あるよ。
890デフォルトの名無しさん
垢版 |
2021/03/19(金) 19:57:51.38ID:gCuAqma+
>>885
同じおじいちゃんが原理主義者になるなってのも言ってただろうに。
2021/03/19(金) 22:01:04.37ID:CjYMRRBz
Cargo.tomlかなんかでデフォルトのreprを設定できればいいんすか?
俺は要らんけど
2021/03/19(金) 23:27:54.25ID:u/twtFDQ
repr(C)がついてないデータ型に警告出すようなlint書いてclippyにpullreq出せば良いのでは
2021/03/20(土) 05:48:46.20ID:7iIk7Cl9
別に
構造体XのメモリレイアウトをRustのデフォルトとすべきなのかrepr(C)で扱ってほしいのか(あるいはその他か)は
構造体Xを定義したときに定義した人の意向で決まるから何の問題も無い
別の人が構造体Xを間違ったメモリレイアウトで解釈するプログラムを書く危険性は
(わざとそうするのでもない限り)無い
2021/03/20(土) 05:53:57.90ID:7iIk7Cl9
、と思うんだけどrepr指定が異なる構造体はちゃんと別の型とみなされるの?
つまりrepr(C)のメモリレイアウトな構造体を、(例えば)repr(PACKED)なメモリレイアウトな構造体を引数にとる関数に
渡せてしまうとかあると悲劇なわけだが

Rust使ったことないからよくわからないので教えてくだちい、
2021/03/20(土) 11:19:17.36ID:ZBpm47pR
>>894
一つの型には一つしかrepr指定できないから指定を変えたければ別の型にするしかないよ
unsafeなtransmuteで強引に変換することは可能だけど、それは当然変換した人の責任
2021/03/20(土) 11:59:39.96ID:ARQDcx4T
>>874
組み込みの場合、rustのランタイムの大きさ考えたらその程度じゃ全然埋まらないんだが。。
結局まともなユースケースを考えてないんだろうね。
2021/03/20(土) 12:09:06.74ID:JFutrdJQ
Rustにランタイムなどないが
2021/03/20(土) 12:20:42.44ID:Yqrg6wwp
実行ファイルの大きさの事かな?
2021/03/20(土) 12:34:10.54ID:N5mfveDq
stdがでかいって話かな?
なんかそれも問題になって対応策はあった気がするけど
2021/03/20(土) 12:46:24.31ID:ZBpm47pR
デフォルトでは利便性やリンクの高速化のために大きくなってるけど
組み込み用途ならちゃんと最小化する方法はあるし
Cと同程度まで縮むよ
2021/03/20(土) 13:08:56.08ID:OmO/62/g
>>896
下記の記事の Executable sizes の節で実行ファイルのサイズについてCとの比較を考察してた
サイズ削減する方法も書いてあったよ

https://kornel.ski/rust-c-speed
2021/03/20(土) 13:44:30.39ID:0Kyl0nNZ
ちょびっとだけどついにlinux-nextにrustで書かれたコードが入ったか
2021/03/20(土) 15:24:30.80ID:mHStnoHo
>>896
組み込みデバイスでrustを使いやすくしようとしてるワーキンググループあるから
どういうところで不便に思っているのかコメント寄せてあげたら良いのでは
https://github.com/rust-embedded/wg
issueでコメント募集してるよ
904デフォルトの名無しさん
垢版 |
2021/03/21(日) 22:19:00.80ID:k7ifup1R
依存しているクレートが多いとビルドが長い、いい加減にしろ。なんじゃこりゃ
2021/03/21(日) 22:47:11.34ID:ut0JDDIv
>>901
だから考えてるスケールが全然違うっつーの
2021/03/22(月) 01:13:43.80ID:04BxTma4
具体的な話を出さないでキレられても困るよ
2021/03/22(月) 01:39:21.20ID:g4YfSh3E
Rust の実行ファイルが大きくなりがちなのは何でもかんでもスタティックリンクする文化であって、
そうしてでもうんざりするような (実行時の) 依存関係に悩まされたくないという話なので、
不要なもので肥大化しているわけじゃないよ。 本来必要なものがあるだけ。

もちろん制約の大きい組み込み環境でごく基本的なライブラリすら制約してまで
大きさを削ったら使い勝手は悪いだろうけど、
それは Rust に限った話でもない当たり前のことだし。

メモリが数キロバイトとかいうレベルだったら (少なくとも現時点では) Rust が不向きというのはそうかもしれない。
そんで特に Rust を使いたいというケースでもない。
2021/03/22(月) 02:21:57.65ID:gSVpx604
>>906
具体的に言語化できる能力あったらこんなとこで愚痴垂れてないでしょう
2021/03/22(月) 03:18:48.61ID:4PFilboR
Linuxのディストロだとなるべくダイナミックリンクにするようにしてると思うんだけど
Rust製ツールとその方針の相性悪い気がする
2021/03/22(月) 13:19:06.90ID:TItJ887g
Q. Rustの倒し方を教えて下さい

A. まずデータセンターを燃やします

フランスのデータセンターで火災…『Rust』に復元不可能なデータロストが発生するなど大規模被害に発展 | エンタメウィーク
https://ent.smt.docomo.ne.jp/article/8989583
2021/03/22(月) 14:05:31.64ID:b6jSgIhJ
Rustってなんか日本人的にわびさびっぽい名前でいいよな
2021/03/22(月) 14:14:36.76ID:TQ1DOP8h
ググラビリティがGoより低いと思ってる元凶な
2021/03/22(月) 14:52:55.38ID:g4YfSh3E
そこんところは golang とか rustlang とか書く風習が出来てるから
たいした問題ではないんだが、 C のことを clang とか書き始めるやつが出てきてクソッタレという感じ。
よそでどんな習慣が出来てもいいけど変な汚染するなよな〜〜という。
2021/03/22(月) 16:00:21.60ID:g8se3Ggw
LLVM ClangはふつうClangて書かない?
2021/03/22(月) 16:55:21.38ID:Y0cj97US
Clang は Clang のことなので
C のことを Clang っていわれると困るって話
2021/03/22(月) 17:14:35.17ID:g8se3Ggw
あ,なる.
2021/03/22(月) 18:00:28.80ID:RaSrXyKY
>>909
というよりその方針だとsoのバージョン非互換で問題が起きて大変なので
GoやRustなど最近の言語はダイナミックリンクを避けている。
2021/03/22(月) 18:02:24.77ID:PWQX5uRW
GCCもClangだし
2021/03/22(月) 20:15:31.61ID:gSVpx604
>>917
ディストロがビルドして配るバイナリの話だからバージョン非互換は関係ないのでは
非互換が問題になるならソースにパッチ当てられる訳だし
goも同じ問題があるというのはそうだけど
2021/03/22(月) 21:30:42.61ID:G3nK37aG
>>919
そもそも最近はディストロのパッケージ管理システムに乗りたくなくなっているのでは?いろいろなディストロのいろいろなバージョンに対してバイナリを提供すること自体が大変で。
Gentooやってると依存関係ミスっててコンパイルこけるとかよくある。
(そういう意味でもGoやRustはかなりコンパイルに失敗しづらくて安心感はある)
退化している感もあるけど、GitHubで全ディストロ対応のシングルバイナリ配るのが結局楽だった、という感じなのかも。
2021/03/22(月) 22:38:58.65ID:0BePobhO
>>918
え?
2021/03/22(月) 22:40:19.34ID:qQVVw1tm
場合によっては違うバージョンのライブラリが共存することもあるし
ファイル名のルールでどうにかしたりはすごく面倒

近頃はコンテナにまるごと突っ込むとか言った解決法も取れるが、
それなら全部スタティックリンクしたらええやんというのは
順当な方針だよな
2021/03/22(月) 22:41:18.91ID:iFQHROzx
パッケージのバージョン管理とかRustは最近のnpmばりによくできてるんじゃないの
知らんけど
2021/03/22(月) 22:42:28.95ID:qQVVw1tm
>>921
gcc コマンドの実態が clang の環境が
存在するのでそれを茶化したジョークだと思う
2021/03/22(月) 23:22:40.71ID:4PFilboR
Ruby, Python, Rとか言語独自のパッケージ管理システムもありつつ
同時にディストロのパッケージ管理システムにも有名ライブラリだけは乗ってたりして
なんか二重管理みたいな変な事になってる
2021/03/23(火) 01:05:05.52ID:G0iN/IIq
開発環境が用意するパッケージ管理は開発環境の管理だし
ディストリビューションの管理は実行環境の管理なんだけど、
ライブラリが実行環境なのか開発環境なのかは不可分な部分もあって単純に二分できんのよ。

C/C++ のライブラリのパッケージ管理が発展してないのは伝統的に
ディストリビューションのパッケージ管理に全力で乗っかる文化があったからで、
モダンな開発環境は分けようとしてかえってややこしくしているような気もする。
元々あった問題があぶりだされただけかもしれんけど。
2021/03/23(火) 01:20:30.89ID:27d1w4K5
まあlibcのバージョン違いで困った経験あると、スタティックリンクはやむ無しって思うけど。
2021/03/23(火) 02:36:10.01ID:yC2dAiwP
>>913
コンパイラをclangという名前にしてしまったAppleが馬鹿なだけ。
ライバルにMSのcl.exeというものが30年ほど前からあるだけでも
ややこしいのに。
2021/03/23(火) 09:53:23.27ID:KOWk2YN0
>>926
C/C++全盛の頃はコードを書く人と使う人が一致してることが多かったから問題なかった気がする。
自分の環境さえ正しくセットアップすればそれで問題ないという。
今みたいにGitHubでコード共有するのが当然って世界だと違う環境でビルドするのが困難ってのはきつい。
OSSのC++ライブラリを使おうとしたときに、作者と違うディストリビューション使ってる場合、ほぼ確実になんらかのトラブルにはまる印象だなぁ。
2021/03/23(火) 12:53:42.65ID:71b8io/J
てか低レイヤー依存のパッケージは言語パッケージ管理じゃ扱いづらいだろ。
2021/03/23(火) 15:23:13.29ID:G0iN/IIq
>>928
自分の開発環境に cl.exe があるのを見つけて
「あれ? Common Lisp なんか入れたっけ?」って思ったことがある。
2021/03/23(火) 16:03:34.41ID:p4kRzxCA
Rustと関係ない雑談はそろそろよそでやって下さいね
2021/03/23(火) 16:25:13.28ID:rdqm0ni7
次世代言語21 Go Nim Rust Swift Kotlin TypeScript
https://mevius.5ch.net/test/read.cgi/tech/1587276362/

あっちのスレの流れの中に投下するものがこっちに誤爆して話題が続いてるだけだぞ
2021/03/23(火) 20:22:26.82ID:1Ac3Y1Uh
>>918
???
2021/03/23(火) 22:26:53.30ID:97s02znq
>>934
>>924
2021/03/26(金) 17:08:58.51ID:JtXGrnUt
Rust 1.51 replaced
https://mag.osdn.jp/21/03/27/103000
2021/03/26(金) 17:18:42.33ID:JtXGrnUt
X replaced
O released
938デフォルトの名無しさん
垢版 |
2021/03/26(金) 17:25:28.62ID:4e/BtnZ7
親善試合のプレー中でもないのにパンチを繰り出し、歯を折る韓国人の本質
939デフォルトの名無しさん
垢版 |
2021/03/28(日) 01:28:47.05ID:JTpxnMQC
>>905
こういうのはどう?
https://www.infoq.com/jp/news/2020/05/zz-formal-verified-c-dialect/
2021/03/28(日) 01:44:52.75ID:AdvYUXyR
>>939
証明論関係はプロトコル検証なんかには使えるかもね。
2021/03/28(日) 12:03:39.58ID:d7aJoNDz
PDA以上の機械はどうやって機械的に証明したらいいんじゃ……
2021/03/30(火) 10:38:53.80ID:D/DvGGEJ
>>2
日本語版ねーの?
2021/03/30(火) 12:16:47.56ID:+ozT2766
>>942
https://doc.rust-jp.rs/
2021/03/31(水) 07:40:52.59ID:7yIFZkAA
なんなのこのゴミ言語

早く消えろよゴミ
2021/03/31(水) 07:59:36.54ID:/8+Nd/ls
使わなきゃいいだけだろ?
2021/03/31(水) 15:12:27.84ID:xy2Yhoz1
やってることはアフィカスと同じクズ言語
2021/03/31(水) 15:45:22.05ID:/8+Nd/ls
ZDNet Japan: トーバルズ氏が考える、LinuxにおけるRustの居場所とは.
https://japan.zdnet.com/article/35168533/
2021/03/31(水) 17:49:52.55ID:xl4s4pnz
git も浪費が激しいゴミ
2021/03/31(水) 22:41:28.27ID:HIJdwtTD
>要するに、Linuxの記述言語がCからRustへと変わる日は当面の間やってこないだろう。その一方で、Rustベースのプログラムやドライバーをユーザー空間で実行するということに対する関心は高く、それに向けた動きは数多くあるため、いつの日にかLinuxというOSでRustベースのカーネルが採用されるだろう。
まあ当たり前の結論だわな。
2021/04/01(木) 09:50:04.35ID:Vom62NTk
Javaやpythonのようなバブルは無いだろうが一定の需要はあるだろう
2021/04/01(木) 10:21:51.12ID:+GSHkYwn
競技プログラミング分野で謎の注目を集めてるよRust
短時間とか早解きが重要なコンテストでは雑に書けないので使いづらいが、長期間のコンテストでは重宝されてる
強い人たちが使ってるのもあって
2021/04/01(木) 10:53:00.87ID:DPgukaDD
AndroidのBluetoothスタックがRustで書き直されたっぽい
https://android.googlesource.com/platform/system/bt/+/master/gd/rust/

Hacker NewsでAndroidのBluetoothの接続性やバグの多さが叩かれまくってて笑った
https://news.ycombinator.com/item?id=26647981
2021/04/01(木) 11:55:32.05ID:/m7p4qXu
まあ9割は単なるファッションだろ。
実際使ってみるとc++で気をつけるのとほぼ変わらんしそれができる輩しかまともに使いこなせん。
2021/04/01(木) 12:46:37.61ID:RDEfu8S8
そもそもデバドラならC++でもいいんちゃうん?
Linusが問答無用で許さない感じ?
2021/04/01(木) 13:00:07.82ID:Gl2KF2SW
>>954
昔LinusはC++をボロクソに言ってた。特に例外周りがカーネルとは合わないとかだったかな。
今の改心したLinusなら違うかもしれないが。
2021/04/01(木) 13:04:33.77ID:4931ON8O
C++は罵詈雑言で二度とそんなこと言うな
ぐらいで叩いてた
2021/04/01(木) 13:36:29.59ID:3AhSZiXW
思いっきり皮肉だけど「C++独自の機能を使わないならC++でも構わない」みたいなこと言ってなかったっけ
2021/04/01(木) 13:53:28.54ID:Gl2KF2SW
オブジェクト指向はクソみたいなのも言ってた気がするし、
当時Linusが文句言ってたポイントをRustはうまく回避してるかも。
2021/04/01(木) 14:57:07.23ID:/m7p4qXu
linusはオブジェクト指向はファイルシステム周りでは有効って昔から言ってる。
流石にこの辺りの感覚は鋭いわ。
2021/04/01(木) 15:03:37.19ID:Gl2KF2SW
あぁ確かにオブジェクト指向というよりC++のそれにまつわる機能がクソって話だったね。
2021/04/01(木) 15:42:58.54ID:Vom62NTk
そうは言ってもリナス自身が言語処理系に手を出す事は無いんだろうな
2021/04/01(木) 15:48:42.19ID:/m7p4qXu
>https://japan.zdnet.com/article/35168533/
これも年取ったからだいぶ穏やかに答えてるけど内心は
「とりあえずデバイスドライバーで実装してみろやwやれるもんならなw」って感じだと思うぞ。
2021/04/01(木) 16:12:38.28ID:4931ON8O
>>962
さすかに読み方ひねくれすぎ
2021/04/01(木) 19:45:16.51ID:0NPo8NNW
>>955
https://tabesugi.net/memo/2009/1a.html
Date: Thu, 6 Sep 2007 18:50:28 +0100 (BST)
Message-ID: <alpine.LFD.0.999.0709061839510.5626@evo.linux-foundation.org>

C++ はひどい言語だ。これは、多くの平均以下のプログラマーが使ってるために
さらに輪をかけてゲロゲロになっていて、どうしようもないゴミが
簡単に生産されるようになってる。正直いって、C を選ぶ理由が C++ プログラマーを
追っぱらうため *だけ* だったとしても、それ自体、C を使う強力な理由になりうる。

C++ はトンでもなく悪い設計の元になりうる。どうせこの言語ではいつも STL やら
Boost やら、その他ゲロゲロベロベロの「素敵な」ライブラリの機能を使って、
それがあんたのプログラムに「役立つ」んだろうが、以下のことが起きる:

- うまく動かないときにもたらされる際限のない苦痛 (あと STL とか、特に Boost が
安定してるとか移植性があるとかいう奴は、どいつもこいつも大ウソつきで、
もはや笑えるレベルを超えている)

- 非効率な抽象プログラミングモデルで、2年たった後にこれらが実はそんなに
効率的じゃなかったことに気づくケース。でもそのときにはすでに全部の
コードがその素晴らしいオブジェクトモデルに依存していて、直すためには
アプリ全体を書き直さなきゃなんない。

言いかえれば、唯一まともで、効率がよくて、システムレベルで使えて、移植性がある
C++ ってのは、基本的に C で使える機能だけに限ったときなんだ。そして C だけに
限定するってことは、他の人がそれをめちゃくちゃにしないってことで、
ついでに沢山のプログラマが実際に低水準の問題を理解することができて、アホらしい
「オブジェクト・モデル」のたわごとを持ちこまないってことだ。
2021/04/01(木) 19:48:28.85ID:0NPo8NNW
>>956
>C++は罵詈雑言で二度とそんなこと言うな
>ぐらいで叩いてた

>>964
>正直いって、C を選ぶ理由が C++ プログラマーを追っぱらうため *だけ* だったとしても、それ自体、C を使う強力な理由になりうる。
2021/04/01(木) 19:49:27.24ID:0NPo8NNW
>>957
>思いっきり皮肉だけど「C++独自の機能を使わないならC++でも構わない」みたいなこと言ってなかったっけ

>>964
>唯一まともで、効率がよくて、システムレベルで使えて、移植性があるC++ ってのは、基本的に C で使える機能だけに限ったときなんだ。
2021/04/01(木) 19:50:55.20ID:0NPo8NNW
>>958
>オブジェクト指向はクソみたいなのも言ってた気がするし、

>>964
>C だけに限定するってことは、他の人がそれをめちゃくちゃにしないってことで、
>ついでに沢山のプログラマが実際に低水準の問題を理解することができて、
>アホらしい「オブジェクト・モデル」のたわごとを持ちこまないってことだ。

>アホらしい「オブジェクト・モデル」のたわごとを持ちこまないってことだ。
>アホらしい「オブジェクト・モデル」のたわごとを持ちこまないってことだ。
>アホらしい「オブジェクト・モデル」のたわごとを持ちこまないってことだ。
>アホらしい「オブジェクト・モデル」のたわごとを持ちこまないってことだ。
>アホらしい「オブジェクト・モデル」のたわごとを持ちこまないってことだ。
2021/04/01(木) 20:34:15.03ID:Kccm814S
しかしこの話ももう15年近く前だし、C++20についてどう思ってるのかは気になるな。
相変わらずボロクソなのか、もう少し丸くなってるのか。
2021/04/01(木) 20:47:29.36ID:/m7p4qXu
>>963
残念ながらlinusは俺の10倍はひねくれてるよ
2021/04/01(木) 20:49:11.47ID:uABybhUU
色々な言語を扱ってみればどんな言語でも"トンでもなく悪い設計の元になりうる"のは
Linusも気がついてるんだろうが、こういう手合いは
単に自分の好みで気にいらない事を否定するのに「一般的に良くないものだ」という
主張を持ちだすから始末がわるい
またこの手の攻撃的な人物は自分の周囲の人間が一般的であると思い込む傾向もあり
たしかにLinuxとオープンソース界隈の人間がC++を使いまくると"トンでもなく悪い設計"に
なりやすいだろうなというのもわかる(そういう界隈の人間は基本的に自由であり
自由にできる幅があるときは自分の思いついた"カッコイイやりかた"をすぐ人におしつけたがる)
2021/04/01(木) 21:18:43.80ID:gCHls20K
C++ネタになると書き込みするやつが急に増えるんだからwww
いい加減C++スレでやってね
2021/04/02(金) 02:22:20.02ID:6+Rf0OKV
C++に勝てるっていう宣伝文句に惹かれて興味を持った人が多いのだから、本当にC++より良いのかっていうところに焦点が当たるのは宿命
2021/04/02(金) 02:45:25.02ID:kyD8ajyX
>>953
C++ の仕様に違反せずに書くために「気を付ける」程度で本当に足りるのか?
足りないからそこそこの規模のプロジェクトになったら valgrind とかのツールを導入するはめになるんだろ。
十分に知識を持っていても隅から隅まで 100% に配慮するのは無理ってのがわかってるから、
C++ で気を付けるのとほぼ変わらんなら Rust を導入する意義はある。
2021/04/02(金) 07:23:26.60ID:fjFXuKAx
規模が大きくなって関わる人数も増えれば気を付けるのもかなりのストレスだしなあ
2021/04/02(金) 07:39:02.80ID:YWxTGAu5
C++より安全という声は多いが誰がC++に勝てるなんて言っているんだ?
2021/04/02(金) 08:29:19.74ID:2Zgm1hES
c++でもuniqueptrなりconstなりmoveなりはあるわけで、かける人は同じように書けるだろ。
結局かける奴は書けるしかけない奴は書けないってのはどっち使っても一緒だわ
2021/04/02(金) 08:54:38.43ID:WBadj+NS
昔は隅々まで配慮できる集中力があった気がするけど
歳とともに無理になってくるからコンパイラに指摘してもらったほうが楽。
いつまでも完璧なC++が書けるならそれはそれで羨ましい。
2021/04/02(金) 11:07:52.95ID:cCsMiK9D
C++はおもんない、Rustはおもろい
2021/04/02(金) 11:21:45.65ID:QB4/beuH
高度な技術と集中力でミスなく実行すれば
バグは発生しないという妄想に付き合うほど
みんな暇じゃないんだなあ
2021/04/02(金) 11:43:52.67ID:2Zgm1hES
だから問題あれば自然にコンパイラで引っ掛かるような書き方してるって話なのに全く通じてねーなこのバカ。
2021/04/02(金) 12:20:01.78ID:kyD8ajyX
>>980
できない。
982デフォルトの名無しさん
垢版 |
2021/04/02(金) 12:21:03.20ID:OROAZ6WR
気をつければ大丈夫の域出てなくて笑う
コンピュータの仕事してるとは思えない、
2021/04/02(金) 12:28:25.47ID:G+2KJI7R
>>980
C++ってmoveされた後のオブジェクトに触って警告とか出ましたっけ??
2021/04/02(金) 15:25:20.76ID:2Zgm1hES
そんなところでミスしてなぜかテストも書かない輩みたいな馬鹿を想定する意味がわからん。。
とことん自分の都合のいい馬鹿ユーザーしか想定してないってのが丸わかりだわ。
2021/04/02(金) 15:53:38.70ID:fjFXuKAx
そうだぞC++が使いこなせないのはお前らがバカだからだ
根性で頑張れや
2021/04/02(金) 17:30:11.49ID:6+Rf0OKV
C++はやっぱ雑に書けるのが良いとこでしょう
2021/04/02(金) 17:59:10.30ID:OPUpoa1U
C++で問題起こすような間抜けはrust使ってろ
2021/04/02(金) 18:03:13.36ID:fjFXuKAx
そうだぞC++で出るバグや脆弱性はテストで全て回避出来るからな
死ぬ気でテスト書かないと駄目だぞ

コンパイラの警告なんかに頼るのは負けだと思え
2021/04/02(金) 19:47:58.19ID:8x9LcGAm
この話何度目だよ
2021/04/02(金) 20:46:37.44ID:maklZ3nY
C++はメモリへのアクセスの回数やパターンが見た目からはわかりにくいコード
(コードからメモリが透けて見えないコード)にすぐなるから
カーネル製作者としては許容し難い、というのが主要な反対理由のはず
2021/04/02(金) 20:48:00.19ID:maklZ3nY
言語がRustであってもC++的な書き方をしているのを見たら怒り狂うことは必定
2021/04/02(金) 20:53:37.95ID:fsPcAc13
指差し確認しながらコード書くべしとか言ってる馬鹿と変わらんな
2021/04/02(金) 21:02:46.07ID:fsPcAc13
c++でまともに書けない奴がなぜかrustを使うと書けるようになるとかいうファンタジーを信じるバカの多さよ。。
2021/04/02(金) 21:16:34.19ID:OG1TUjqd
「気をつければ大丈夫」みたいな根拠無き精神論って日本の生産性が低い一因だよな
2021/04/02(金) 21:21:46.71ID:fsPcAc13
関数粒度を揃えるとかも根性論だとか思っちゃうバカなんだろうな。。
2021/04/02(金) 21:24:42.69ID:ksvJAd1N
>>989
いつでも何度でも
https://www.youtube.com/watch?v=3BfOmIPTnuI
「繰り返す過ちのそのたび、人はただ青い空の青さを知る」
2021/04/02(金) 21:28:46.33ID:QB4/beuH
せやせやまずc++でテスト100万行書いてから文句言え
2021/04/02(金) 21:31:30.66ID:G+2KJI7R
C++のテストフレームワークって基本的にクソマクロ触らされるからやだ
999sage
垢版 |
2021/04/02(金) 21:35:18.69ID:fsPcAc13
はいはい、まともにrustでc++並の開発速度で製品作ってから言えや。
2021/04/02(金) 21:41:08.41ID:L7IeSfpL
Rust part10
https://mevius.5ch.net/test/read.cgi/tech/1617367084/
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 222日 20時間 33分 33秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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