Rust part9

■ このスレッドは過去ログ倉庫に格納されています
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/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
知識も経験もイマジネーションも頭の良さもない
お前さんどうすんの?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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