プログラミング言語 Rust 4
■ このスレッドは過去ログ倉庫に格納されています
rustって難しいの?
使いにくい言語って結局クソじゃね?
有難がってるのって信者だけ? >>3
厳しい先生だと思う。
でもそれは俺らのためでもあって、rust先生の審査を通ったプログラムは安全と言える。
ただ先生も普段が厳しすぎるとは思ってるので、わかってる奴ら用にunsafeって抜け道も用意してくれてる、、、
そんな感じ。 >>3
そう。信者と本山(モジラ)だけ
試しにAPIサーバでも書いてみりゃ即この言語使えねえってわかるぞ あと何度もいうけど「Rustのコンパイル通らないプログラムは危険」とかいうデマゴーグが嫌い
きちんと状態管理すりゃいくらでも正しく動くのに
やれstatic領域は排他制御しろだのやれこの変数はスコープ明示的に切れだのいらんことばっかいうのがRustコンパイラな 書きやすさは一旦置いといたとしても
保守のしやすさってどうなんだろうか
この言語は、保守しやすいコードへ導く言語なんだろうか >>10
一度書いたものを書き換える度にコンパイラが奇声をあげるので変更もままならないという意味では保守性()は高いかもな
メンテナンス性がまったくないともいう >>11
メンテナンス性はまったくない、でFA?
言語とのしてのメンテナンス性の傾向ってのは
さほど語られてるのを目にしないけど個人的には
Java
10年後数万行のコード見てもわりと整然としてる
あとから何度も手を入れて運用していける
Ruby
最初書きやすい、表現力が高い?と感じながらスイスイ書いていける
半年後、雑然としていてまったく読めない
クソみたいなコード書いた自分が悪いとはいえ
↑こういう感想を抱いている そもそもRustはプログラミング言語として破綻してるので、
モジラ信者でもない限り使わん触らんが一番幸せだ
悪いことは言わんからRustのことは忘れろ >>13
ほんと定期的に沸くなこのアンチ
>>12
メンテナンス性でいうなら、最初に型さえうまく設計してれば結構拡張性あるから、
その辺はどっちかというとHaskellに近いかな
クセはあるけど型をきちんと理解して最初の設計に組み込んでおけばかなり自由が効く
最初の型合わせゲームは辛いけどな ID:OLs+Obq4 くらいの基地外になれば100年だって粘着する。 firefoxをRustで書けるわけないと言ってたのがMozilla以外使わないに後退したのか >>16<br>
そりゃまぁ、事実としてmozillaがRustでfirefoxを書いちゃったからな
firefox Quantum beta 試してみたけど確かにchrome並みに速くなったな
そしてchromeよりメモリは食わないのが良い
でも正直、俺はメモリ不足を感じたことがないからChromeベースのVivaldiを使い続けるが
無事にfirefoxも出たことだしRustもう少し普及してくれないかなぁ quantam はcssしかrustになってないからまだ速くなるらしいぞ >>18
ブラウザのレンダリング速度ってcssをどれくらい速く捌けるかが大部分なんじゃないの?
それ以外がRustになったところで速くなるといっても微々たるものなのでは...
Servoって確かJSエンジンは従来のSpiderMonkeyをそのまま使ってるんだよね
JSはGCあるし、DOM管理(Rust側のDOMオブジェクトとの連携)とかどうやってるのかよく分からんけど
DOM管理の部分とかがRustになったらさらに速くなるのかな?
今のQuantumってGecko全体の何%くらいがRustになってるんだろう? firefoxはまだまだchromeに負けてる
https://www.phoronix.com/scan.php?page=article&item=firefox-quantum-bench&num=1
rustの力ではよどうにしかして😣 というか Servo はいつになったらまともに動くようになるんだろう。
精力的に開発が行われているのに、数クリックでフリーズする状況が年単位で続いているのが謎すぎる。 >>21
数クリックでフリーズってどういう事?
普通に動くぞ >>22
定期的にバイナリ落としてきて Windows/Linux で試しているけれど、リンクを数回辿る
くらいの操作で入力を受けつけなくなる。 Windows と Linux は物理的にも違うマシン
だし、おま環じゃないと思うんだけどなあ。 >>23
下のサイトでnightlyビルドで公開されてるやつ試したが日本語サイトは全滅だった。
英語サイトならWikipedia, Github, Rustの公式サイトあたりは見れたぞ。
Amazon, youtube, google mapは動かなかったが。。。
ちなWin10ね
https://servo.org >>24
起動直後にそれらのサイトにアクセスすると普通に動くけれど、
そのままリンクを辿ったりするとフリーズしない?
こちらもそこで落とした Nightly on Win10. rocketというwebフレームワーク気になる
そもそもrustってwebサーバーに向いてる?🤔 trait Foo: Sized {
const BAR: Self;
const BAZ: Self = Self::BAR;
}
beta や nightly では通るのに、stable ではエラー出して通らないのな。 >>29
あ、アは、日本語の音節の1つであり、仮名の1つである。1モーラを形成する。
五十音図において第1行第1段(あ行あ段)に位置する。
by wikipedia
https://ja.wikipedia.org/wiki/あ >>26
向いてはないな
web系は処理速度や信頼性、保守性よりも生産性が重要視される。
生産性ではRustはphpやruby on rails には劣る。
かといって向かないとも思わない。
現にRustのweb系のフレームワークは複数存在してるし、
どれも今のところ結構精力的に開発、更新されてる。
Rustはc++と比べて抽象化と並行性という意味では優れているから、
特にRocketは他言語のwebフレームワークにも負けないレベルの短いコード量で
Webサーバー作れる(あくまで個人的な感想。異論は認める)し、
将来的には並行性を活かしてパフォーマンスも改善されると思われる。
Rustが好きなら十分アリだと思う。
逆に目的のWebサーバーさえ作れれば言語なんかどれでも良い
って感じならRustはないな。
Rustは慣れるのにとにかく時間がかかるけど、慣れちゃえば
それほど生産性の低い言語だとは思わないし(高いとも思わないが)。。。
結局は学習コストがRustの一番の問題なんだよなぁ。。。
思ったより長文になった。すまぬ web系で一括りは雑でしよ
シングルスレッドでうぇいうぇいやってるアプリ層と下位の屋台骨支えてるところでは世界が違う
シンプルにまずはc++の代替を狙う言語でいい
仕事で使うレベルを考えるとc++の教育コストにうんざりしてるからrustには期待してる そーいえばいつの間にかrustfmtのフォーマットが変わって
くそめんどいことになってるけど、
どうしてこうなったの C/C++を覚えなきゃだめです
Rustを使うにしろGo言語を使うにしろです何の新しい言語を使うにしてもです
世のライブラリの大半はC/C++用に作られているわけです
Rustでラップされたライブラリ、代替できるRustで書かれたライブラリ、そんな便利なものがたくさんあればいいのですが typedef struct Foo {
int x;
int * x_ref;
} Foo;
Foo foo;
foo.x = 11;
foo.x_ref = &foo.x;
C で書くとこんな感じになる、自分の要素への参照を要素として持つ構造体って、Rust じゃもしかして書けない?
苦心してこんなん書いてもやっぱ無理だし。
use std::mem;
struct Foo<'a> {
x: i32,
x_ref: &'a i32,
}
impl<'a> Foo<'a> {
fn new() -> Self {
let mut foo = Foo {
x: 32,
x_ref: unsafe { mem::uninitialized() },
};
foo.x_ref = &foo.x;
foo
}
} 前もこのスレで同じようなこと聞いてダメだったはず
一つの構造体の中に、配列とその中のどれかを指す参照が入ってる構造
解決策は、参照をやめてインデックスを持つ let mut foo = vec![false; 20];
// fooの2番目と3番目をtrueにするには
foo[1] = true;
foo[2] = true;
// しかないでしょうか? 2番目と3番目以外がどうなってもいいなら
let mut foo = vec![true; 20]; 実際のところ生産性ってどうなん?
GUIプログラムとかにも向いてる?
いい感じのGUIフレームワークがあったとして。 >>43
pythonでいえば
foo[1:2] = [True] * 2
みたいなことです
(1..3).for_each(|x| foo[x] = true);
といちいち書くのが面倒(な上処理が重そう)だったので伺いました
実装したいのはアトキンの篩です >>44
効率が悪いってのはindexアクセスを二回やるとこのこと?
ここは過疎ってるからまじめに聞きたければSlack行くとよいよ let mut foo = vec![false; 20];
println!("{:?}", foo);
foo.get_mut(1..3).unwrap().iter_mut().for_each(|v| *v = true);
println!("{:?}", foo); コスト気にしてるみたいだけど、release でコンパイルすれば、結局
foo[1] = true;
foo[2] = true;
したのと変わらん結果になるんちゃうか? >>45,47
そうなんでしょうか(LLVM IRも読めない)
それで進めようと思います
ありがとうございました
アトキンの篩は他の言語だとどれもヒープ
確保してforループでヒープ操作という感じですが
横着して同じような実装をRustで書くとas usizeばっかだしで一目でダメとわかるコードに… Kotlinのスコープ関数みたいなことができるcrateってありますか? 'a type と 'a + type の違いが分からん. obj.method(args) って形はマクロを使っても崩せないんじゃないかなあ
動作的にwithみたいなのは一関数でできるんじゃない?
無理すればメソッドとして実装することもできるかと
https://play.rust-lang.org/?gist=2133c56a393f15a3ff5d059016ed3b11&version=undefined
便利か?と言われたらそうでもないかも >>51 'a + typeじゃなくて'a + Traitじゃない? >>52
なるほど!
最近Kotlin書くことが多くてスコープ関数使ってみたら、いちいち変数に入れなくてよかったり(変数名を考えなくていい)レシーバを指定しなくてよかったりして楽に感じたので、Rustでも同じようなことできるcrate公開されてないかなと思っていたところです! >>53
おお、その通りだ。分かってなさすぎるな…。
fn hoge<'a, T: 'a + Trait>( x: &'a T );
&'a T が参照先オブジェクトの寿命を表しているのはいいとして、
'a + Trait の 'a の意味がよく分からない。 >>55 自分もよく分かってないし、見覚えの無い使われ方があったときにそれを指す言葉を知らなくて時間がかかるんだけど、
https://doc.rust-lang.org/book/second-edition/ch19-02-advanced-lifetimes.html
↑にあるように、<>の中ではlifetimeや総称型を使うよ、と宣言するのと、T: Traitとやって型の境界(bound)を指定するのの2つの意味があって、
T: 'a + Traitってのは型TがTraitをimplしていることと、もし参照型だったりlifetimeを持つ型だったりしたときは'aより長生きなものに限りますって意味になる、らしい
意味は分かる。けど、hoge(v)としたとき、lifetime関連のエラーを吐く具体的な値vの例が思いつかない >>35
まず、そのままのコードでは new() の返り値が move されるときに
&x のアドレスが変わってしまう(実際には最適化で move されない
だろうけど言語仕様的には)ので、そのコードがエラーになるのは正当。
なので x か Foo 全体を box 化する必要がある。ただ box 化すれば
コンパイルが通るかというと、 box を deref して得られる参照は box
の中身の寿命ではなく box 自身の寿命になるので、 transmute で
チートする必要がある。
fn new() -> Self {
let mut foo = Box:new(Foo {
x: 32,
x_ref: unsafe { mem::uninitialized() },
});
foo.x_ref = unsafe{ mem::transmute::<_, &'static _>(&foo.x) };
foo
} 失礼。コンパイル通らないコードを貼り付けてしまった。
fn new() -> Box<Self> {
let mut foo = Box::new(Foo {
x: 32,
x_ref: unsafe { mem::uninitialized() },
});
foo.x_ref = unsafe { mem::transmute(&foo.x) };
foo
} ありがとう。
move するとアドレスが変わるというのは無理矢理実験したときに気付いたけれど、
実際はこんな感じで Box 化された構造体の特定の変数への参照が欲しかったので、
>>38が言った前スレの>>507-514辺りを見て、こんな感じで解決してました。
use std::mem;
struct Bar(i32);
struct Foo {
x: Box<Bar>,
x_ref: &'static i32,
}
impl Foo {
fn new() -> Self {
let mut foo = Foo {
x: Box::new(Bar(10)),
x_ref: unsafe { mem::uninitialized() },
};
let dummy = mem::replace(&mut foo.x_ref, unsafe { mem::transmute(&foo.x.0) } );
mem::forget(dummy);
foo
}
} >>60
ああ、確かにリファレンスとはいえ forget() しとくべきだね。
このコードについては↓でも問題ないけど、まあ実際の初期化はもっと他にも
処理があるだろうから、一般にはこううまくは行かなかいか。
struct Foo<'a> {
x: Box<Bar>,
x_ref: &'a i32,
}
impl<'a> Foo<'a> {
fn new() -> Self {
let x = Box::new(Bar(10));
Foo {
x_ref: unsafe { mem::transmute(&x.0) },
x: x,
}
}
} Rcって何のためにあるんですか? 所有権? 借用じゃダメなん?
所有権持ってる変数のライフタイムを超えて借用できないからRc?
色んなコンテナや、色んなデータ構造に渡って持たせたいときはRc?
https://ideone.com/IP9Jk4
書いてみたらなんとなく納得行ったような気がする 標準に整数型のトレイトがないの意味わかんねぇ
std::net以上に需要あるでしょ Haskellで言うNun型クラスみたいな奴ってことか?
トレイトでやろうとすると要定義メソッド多すぎたり、
累乗みたいな計算の実装が遠回りになったりしそうできつそうに見えるな Haskellは数値も抽象化してるせいでパフォーマンスにかなり影響与えてるしね… s/Nun/Num/
Scalaはその辺を、暗黙の型変換でシームレスに扱おうとして闇を量産してるんだよな
Rustは今んとこ特になんもしてない感じか numクレートが標準にないのが嫌なんだろうけど、std::timeみたいに標準サポートやーめたってなりそう
Into/From使えば別に困らんしと需要は少ないのではなかろうか https://ideone.com/XBh9VX
・AA treeを実装
・1.8.0で主に確認(ideoneは1.14.0)
・Rc<RefCell<Option<Node<T>>>>を中心に実装
・ふんだんにRc::clone()を乱発
・Tも<T: Copy>でコピーしちゃう
・肝心の木の操作部分は、wikipediaでの表現に近くなるように表現
・基本的によく分かってないので色々奇妙な事をしているかもしれない
昔からチラホラ「Rustで木構造は苦しい」と耳にしてて興味があったのと
最近ほかのスレで実装してた人がいたのをみて触発されたので書いた
最初はOption<Rc<Node<T>>>で書いてたけど
RcとRefCellの組み合わせを試してみたくなって方向転換
けっきょくどっちが正解だったのかは不明 ただのAA木に Rc なんて要らんだろ。Option<Box<Node<T>>> で済むだろ。 AA木の削除操作はwikipediaのやつだとpred(自分より小さい値のうち一番大きいもの)とsucc(自分より大きい値のうち一番小さいもの)を
子ノードから取ってきた後に子ツリーに対して再帰的にdeleteをしてくってなってるけど、ノードの値がNoCopyだとRc使うかunsafe使うかしないと無駄なコピーが発生しない? >>70
「他スレで実装してた人」って俺のことだな。
↓のスレのことだろ?
次世代言語Part7[Go Rust Swift Kotlin TypeScript]
https://mevius.5ch.net/test/read.cgi/tech/1508403098/
木構造は持ち主(親)が1つに限定されるはずのでRcもRefCellもいらないと思うよ。
実際 、自分はOption<Box<_>>という形で実装してるし。
RcとRefCellの練習するんならグラフ構造とかがいいじゃないかな。
グラフ構造ならRcとRefCellはほぼ必須になるんじゃないかな。
グラフ構造はRustどころかC, C++でも実装したことないから詳しくは分からんけども。
>>72
俺の実装では、Option型のtakeメソッドを使ってるぞ。
そしてtakeメソッドの中ではunsafeが使われてる。だからコピーもないはず。
そのことじゃないのか?俺のほうが何か勘違いしてる?? https://ideone.com/4BnXSI
・AA treeを実装
・1.8.0で主に確認(ideoneは1.14.0)
・今回はOption<Box<Node<T>>>中心に実装
・Tも<T: Copy>でコピーしちゃう
・肝心の木の操作部分は、wikipediaでの表現に近くなるように表現
・前の奴>>70のコピペから開始してるから妙なとこ残ってるかも
>>72
wikipedia見ただけでそのへんに着目できたのってすごい
前回は実はそこで一旦あきらめてコピーとOption<T>の導入に踏み切った
今回もTのコピーうんぬんについては挑戦せずそのまんまコピーしてる >>73 Option::takeを使って子ノードのsuccかpredの値を取ってくるとすると、その子ノードの値はNothingになるよね?
wikipediaの例だとその後にdeleteを再帰的に行うことで(delete内で適宜skew&splitを呼んでる)バランスを保つよう処理してるけど、Nothingが入ってる時点でうまく動く保証が無い
そのスレで書いてくれたものは要素としてCopyであるi32を使ってるから問題が見えないんじゃないかと思う
>>74 自分も>>73の例を見る前に多相型でちょっと書いてみて、どうすんだこれって気付いたんで偉そうなこと言えないっす
Rust固有の問題じゃないような気がしてるよ。C++とかで多相型にしてみたとしても、「子ノードの値を自身の値にする」って部分でコピーが行われる気がしてならない
一瞬だけどAA木の中に同じ値を持つノードが発生しているから、AA木の実装を綺麗に書こうとしたらT:Copy or T:Cloneって制約は必須なんじゃないかと >>75
ああ、なるほどね。
確かにi32の部分をTに置き換えると T: Copy か T: Clone が必須になるね。
これは確かに無駄なコピーが発生してるわ。
まぁ、この実装だとおそらく元になったwikipediaのコードの時点で
無駄なコピーが発生してることになるよね。
wikipediaの場合はi32(4byte)くらいならコピーしてもいいやってスタンスなのかな?
Tの場合は何byteになるか分からないからそういうわけにもいかないということかな?
これ以上は考えるのが面倒になってしまった。。。orz https://ideone.com/dFoFa9
・>>70の<T: Copy>を<T: Clone>に変更
・ついでにRc付きで運用してみて様子を観察
でっかい構造体の場合はこういうふうなのがマシなのかな
Clone運用してるとこに、さらにRcもってくると気持ちよすぎ
おかげで内部の操作に由来した余計な割り当ては無くなった
CloneトレイトとRcには敬意を表したい
>>75
そこんとこの苦悩はもうしゃあないのかな
それについてはもう思考停止します ×・>>70の<T: Copy>を<T: Clone>に変更
○・>>74の<T: Copy>を<T: Clone>に変更 rustのことはわからんけどコピーしないAA木は実装したことがあるので口を出させろください
「succかpredの値をnodeにコピーしてからsuccかpredを削除」しているわけなので
リンクを繋ぎ変えてsuccかpredとnodeをまるごと入れ替えるようにすれば、コピーは要らなくなりませんか コピーしない実装も不可能じゃないと思うけど、削除時の再平衡をちゃんと理解してないから分からん
ちょっと勉強してみるわ num crateって昔標準じゃなかったっけ?rustc_privateだけだっけ? 言語は割といい感じなのに何でcargoはこんなにウンコなん(´・ω・`) ビルドとパッケージマネージャを一緒にしてcrates.io必須にして、他のビルドツールとの連携がつらいんでNIH症候群になりがちで、あんま好きになれないのがcargo
環境変数でビルド先のディレクトリが変わるけど、そこらへんのドキュメントも乏しいのが難点 戻り値の型をflow sensitiveに推論してくれなくて、rustcが推論間違えてそれに気付くのに一日潰れてしまった。
>>86,88
わかる。囲い込んでるのにcargo自身が大したこと出来なくて色々困るんだよね。
色々方針が変わるし。mvnと同じ問題起こしたnpmと同じことしてるし。
言語は良いんだよ。 >>90
hyperかな Webフレームワークのironやnickelがhyperに依存してる ウェブサーバーって書き方が悪かった
RocketやIronを使って実際に運営されてるウェブアプリはある?
小規模なTwitterクローンとかでいいんだけど server書いてます。フレームワーク書いてますは沢山あるけど運用例聞かないね、そう言えば。 だってどこも使ってないもの
泥箱みたいなところはモジラから金もらって「使ってます」って提灯持ちしてるだけ
事例やソースが一切出てきてないのが証拠
いい加減Rustそのものがモジラのステマの産物だと認めろ。これはプログラミング言語ではない ディスりにモジラ絡める時点で長いこと荒らしてるいつもの暇人だってすぐ分かるんだよなあ
自分から具体的な話ができないししてもすぐ反論されて終わるもんだから他人の愚痴に便乗するしかできなくなってる
ボローチェッカに自分のコード全否定されて頭がおかしくなった可哀想な子を生み出したRustの業は深い ボローチェッカにボローボローに否定されたんやなぁってやかましいわwww ■ このスレッドは過去ログ倉庫に格納されています