Rust Part7

■ このスレッドは過去ログ倉庫に格納されています
2019/07/14(日) 23:31:47.54ID:PySyhRf9
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 Part6
http://mevius.5ch.net/test/read.cgi/tech/1532714678/
2019/07/17(水) 06:40:54.65ID:miXA5FV0
Rustって、なんでRustっていう名前なんですか
2019/07/17(水) 14:51:22.82ID:HPA9WgE0
>>5
>>4
>>3
64bit のほうでやったらいけました
196
垢版 |
2019/07/17(水) 17:35:45.39ID:rYwqYjNV
>>12
一応no_std予定なので・・・

>>13
スマン。マクロ書いたことないんで理解できないです

>>16
あ、そうか。Index、IndexMutを書けば[]と[]=で読み書きできるようになりそう。やってみよう
2019/07/17(水) 17:43:48.56ID:qxRR1SXW
そういや、マクロって保守性悪くなるんじゃない?
2019/07/17(水) 18:02:15.81ID:v7+Dn7CU
Cみたいに
port0 = BIT5
port0 = BIT2 | BIT4
val = port0 & BIT4
じゃあかんの?
22デフォルトの名無しさん
垢版 |
2019/07/17(水) 21:24:51.41ID:0r3gt+vm
>>19
enum Bit { On, Off }
let byte = [Bit::Off; 8]
こんなんじゃダメけ?
2019/07/17(水) 23:44:22.07ID:7KdSCzvc
VSCodeにrustupとrlsとC++のツールチェーンを入れてcargo new hello --bin
をShift+Ctrl+Bでビルドしてデバッグ実行もできるようにしたのですが、
できたファイルのうちのどれとどれをGitにコミットすれば一番幸せになれるの?
(1) .gitignore
(2) Cargo.toml
(3) Cargo.lock
(4) main.rs
(5) main.exe
(6) main.pdb
(7) ./vscode/task.json
24デフォルトの名無しさん
垢版 |
2019/07/18(木) 05:56:44.97ID:5vDlE6vb
(1) .gitignore

に書かれてないやつ
2019/07/18(木) 22:17:54.85ID:tHz4DA4Z
レスdクス、実はcargo cleanして残ったやつ全部コミットにしといた…

それはそうとして分割コンパイル&リンクまでするには一体どうすれば…orz
実はmake不要でcargoが面倒を見てくれる…?
いやしかし次のサイトでは(VSCode環境ではないが)めっちゃmakefile書いてるし…
ttps://yoshitsugu.net/posts/2019-06-04-haribote-os-in-rust-day3.html
2019/07/18(木) 22:23:30.40ID:cexb+rGl
>>25
普通はmake不要でcargoのみ。そのサイトはどこかから持ってきたアセンブラをnasmするのにmakeつかってるだけっぽいのでrust関係ない。
2019/07/18(木) 23:36:01.21ID:JZFbYeti
Microsoft、安全で高効率のプログラミング言語として「Rust」を高く評価:メモリ破壊
バグを避けるには 2019年07月18日 19時00分 公開
https://www.atmarkit.co.jp/ait/articles/1907/18/news122.html

 Microsoft Security Response Center(MSRC)は2019年7月16日(米国時間)、ソフト
ウェアのセキュリティを確保しつつ、効率性も保ちたい場合、利用可能なシステムプロ
グラミング言語として、「Rust」を高く評価した。

 MSRCによれば、Microsoftが「CVE(共通脆弱性識別子)」を割り当て、修正してきた同社
ソフトウェアのセキュリティ脆弱(ぜいじゃく)性の大部分は1つの要因から起こっている。
開発者がC/C++コードにうっかりメモリ破壊バグを作り込んでしまったことだ。(中略)

C#とC++のメリットを兼ね備えるのは
 C#のような言語が提供するメモリ関連のセキュリティと、C++の効率性を兼ね備えた言語
があれば、開発者にとって理想的だ。MSRCは、両方の要件を満たす最も有望なシステムプロ
グラミング言語として、Mozillaの公式プロジェクトとして進化してきた「Rust」を挙げて
いる。

 さらにMSRCは、業界として真のセキュリティ対策を進めるには、脆弱性に対処するための
ツールやガイダンスを提供するよりもむしろ、「開発者にそもそも脆弱性を発生させない
ための取り組みを行わなければならない」との見解を示した。

 MSRCは、安全性の低いレガシー言語から、モダンで安全なシステムプログラミング言語
への移行を促進するという観点から、Rustをはじめとする安全なシステムプログラミング
言語の活用に向けて、Microsoftが行ってきた取り組みを今後も紹介していくという。
2019/07/19(金) 01:03:06.37ID:GCRlNtpT
ああついにMicrosoftまでMozillaのステマの犠牲に…
296
垢版 |
2019/07/19(金) 03:55:32.80ID:vDoYj/5c
参照しか返せない状態で計算結果を返すって方法ってあるんだっけ。通常なら値を返すように宣言すればすむ話ですが
Indexは参照しか返せないようです。たとえば*addr >> idx & 1の結果を返したいです

>>21
それだとセットとクリアでAND or ORと値の両方を変更せねばならずどちらかを忘れてバグを産む可能性があります

>>22
ググるとそのような例が出てきますね。Rust的に正論だと思いますが元となるハードウェアのマニュアルでは
0:○○になる
1:××になる
みたいな表記が主流に見えます。ここから外れた表現の強制は言語の安全性とは別なところでリスクを抱えるように思います
30デフォルトの名無しさん
垢版 |
2019/07/19(金) 06:34:47.15ID:hHIdkAH0
>>29
ほんなら0と1でプログラム書けやタコスケ
プログラミング言語ってのはハードウェアを抽象化するためにあるんだぞ
2019/07/19(金) 08:09:28.17ID:1jAR2vN7
>>29
and or orと値の両方を変更せねばならずってどういうこと?
326
垢版 |
2019/07/19(金) 11:55:39.50ID:vDoYj/5c
>>31
port0.od = 0b00000000 // 右端を0ビット目とする
port0.od |= 0b00000100 // 2ビット目を1に → 0b00000100
port0.od |= 0b00100000 // 5ビット目を1に → 0b00100100
port0.od &= 0b11111011 // 2ビット目を0に → 0b00100000
ビット列は抽象化できるけどANDとORは一連の処理をラップできない限り手動で変更する必要があります
Cやアセンブラで低レベルの処理をする場合は多用される書き方だと思いますが結構危なっかしいと思います
2019/07/19(金) 12:19:48.14ID:4A+dpHhz
ビット反転するという脳味噌がないって話?
2019/07/19(金) 17:33:35.07ID:ARm0Ww4L
https://www.rust-lang.org/
Chromeの自動翻訳でサイトを見たら吹いてしまった。
「なぜ錆びるの?」って・・・。
2019/07/19(金) 21:01:17.76ID:wRHB2w4J
翻訳しないと読めないやつ
36デフォルトの名無しさん
垢版 |
2019/07/19(金) 21:05:45.56ID:g6GhiJm/
義務教育受けてたらwhy rustの訳だろうなってすぐ分かるよなたとえ翻訳かけてたとしても
376
垢版 |
2019/07/19(金) 21:40:27.14ID:EuFVnXjl
Index、IndexMutが何でこんな仕様なのかと思ったらC++の[]に合わせたのか
C++ぽく使えるがそれ以外の使い方は想定されていないと

結局普通の関数で妥協するしかないのかな。抽象度はCに毛が生えた程度、C++未満?か
どのみち組み込み用に拡張された処理系相当には出来そうにないっぽい
2019/07/19(金) 22:09:36.92ID:0WNLW8m0
>>37
Rustは構文的な自由度あんまりないからね。Scalaが自由度ありすぎて混乱してた反省を踏まえてるのかな、って思ってる。どうしてもやりたいならマクロがあるし、妥当な落とし所では。
2019/07/19(金) 23:31:27.88ID:ysC8gi5X
groovyと同じast変換するマクロもあるしcompiler pluginもあるし拡張は簡単。
2019/07/20(土) 12:57:28.24ID:rHpvZKFq
rayonでzipイテレータを並列処理できますか?
2019/07/20(土) 22:15:20.44ID:AjHY8stg
rust未経験者がwebプログラミングをrustで始めるのってどう思う?
俺の背景としてはocamlを1年ぐらいやってて「Real World OCaml」みたいな定番書を読んで簡単なコンパイラとかVMを作ったっていうレベル

rustでやるモチベーションとしては
・OCaml誰もやってなくて未来が見えない
・最低でもバリアントとパターンマッチが欲しい
・ネイティブが良いからscala/F#は嫌だ

こういう理由

web自体が初心者だからrailsとかのチュートリアルぐらいは先にやっておくつもり
2019/07/20(土) 22:46:21.59ID:wwp1044b
どうも何もWebアプリは言語の選定は大した問題じゃなくて、Webアプリの基礎がわかってるかどうかだぞ
セッション管理、Rest、クライアントスクリプト、見た目とロジックの分離等々
2019/07/21(日) 00:44:57.93ID:Ct/mrgVP
そうは言っても情報量の多さとかで挫折しにくい言語ってのはあるでしょ
Rustは明らかにきついほうだろうけど...
2019/07/21(日) 01:53:54.94ID:iF1O4o5j
>ocamlを1年ぐらいやってて
>コンパイラとかVMを作った
能力的にはRustでWebするのも余裕なんじゃね;
もっとも、SQLインジェクションみたいな文字列解釈やセッション絡みの脆弱性を
思わず作りこんでしまうことはRustでも避けられないから>>42のは真実だと思うが
2019/07/21(日) 22:07:53.58ID:SjT3tKFm
ocaml辺りやる人間にはつまらんぞwebは。
2019/07/25(木) 18:18:35.03ID:lKY1yvEr
rustむずい
gcのついたrustが欲しい
2019/07/25(木) 19:38:42.91ID:5L4KGe8+
存在意義を否定してどうするよ
go使えば
2019/07/25(木) 20:37:16.64ID:lKY1yvEr
最低でもヴァリアントとレコードとパターンマッチがあって全体的に式指向な言語が良い

ocamlがマルチスレッドに対応しててもっと流行ってれば...
scala/f#がネイティブであれば...
haskellが正格評価でもっとパフォーマンスが良ければ...

皆さんc/c++の置き換えとしてrustやってるの?
自分は関数型言語由来の機能が多くてネイティブで動く言語が欲しい
そういう理由でrustに手を出す人って少ないのかな
rust製のcliツールとかめっちゃ多いし、低レイヤのためだけにrustやってる人のほうが少ないんじゃないかな
2019/07/25(木) 21:49:12.38ID:E2feltVj
多いか少ないかが気になる年頃
50デフォルトの名無しさん
垢版 |
2019/07/25(木) 21:54:26.88ID:6TAkPITO
難しいからなんなんだよってかんじ
勉強すればそのうち使えるようになるんだからどうでもいいことじゃん
俺はPHPの置き換えで使ってるけど
2019/07/25(木) 22:40:39.89ID:PNoIdPh5
rust, c++より少しはマシくらいの言語だわな。
実装系含めたらまだc++のがマシになるが。
2019/07/25(木) 22:50:06.02ID:w/leXg8D
C++がましってどのへん?学習コストはどうしようもないとして、学習してしまった今となってはC++に戻る気とか一切しないんだけど。
2019/07/26(金) 15:42:10.78ID:I3xx9WAP
本当にGCが必要か?
https://boats.gitlab.io/blog/post/notes-on-a-smaller-rust/
54デフォルトの名無しさん
垢版 |
2019/07/26(金) 18:13:40.72ID:a+EwZNsG
ながいから要約たのむ
2019/07/26(金) 18:54:02.12ID:EH3/YLuD
初代wiiもいらんだろ
2019/07/26(金) 22:09:00.78ID:6wMSM/4s
>>46
pony。cliツールっていうかcoreutilsとbusyboxの代替実装とかならあるけど。
2019/07/27(土) 01:35:00.73ID:KwccJBez
>>52
cとかより低いレイヤーの言語をバインドしようとした時、より素直。
2019/07/27(土) 10:26:09.62ID:T7BomvTp
お前らが本当に必要としてるのはRustじゃなくて
ziglangなのでは?
2019/07/27(土) 10:58:34.72ID:S2cl2wQi
流行ってる言語じゃないとしんどいってocamlで学んだ
2019/07/27(土) 12:01:40.60ID:4xSO5KPL
デストラクタ的なのがあればなんでも良い
61デフォルトの名無しさん
垢版 |
2019/07/27(土) 17:07:58.74ID:lIukHdgf
>>58
zigはGCあるからダメ
2019/07/27(土) 23:21:52.36ID:YuLtVEnV
rustがリアルタイムで使われてるの聞いたこと無いんだけど
どうせgcあるから駄目とか言ってるやつはメモリの開放タイミングが
予測不能でも致命的にならない事しかしてないんだろ?
2019/07/27(土) 23:56:46.19ID:90NMqXYM
Option<char>とStringを結合させたいんですけど、どうすればいいんですか?
2019/07/28(日) 00:12:52.45ID:BWTSPDmr
>>63
Option<char>はList<char>の特殊な例と考えて良い
これ、関数型言語の常識
2019/07/28(日) 02:05:17.30ID:5UHV96py
let x: String = "Hello World!".toString();
s += Some(x)?;
いや知らんけど
2019/07/28(日) 02:07:09.62ID:5UHV96py
xはcharやったorz,
67デフォルトの名無しさん
垢版 |
2019/07/28(日) 09:18:55.32ID:t62k8itt
リアルタイムでってなに?
目の前でrust書いてくれるってこと?
2019/07/28(日) 09:43:05.38ID:2BtEWPhc
致命的(画面が時々固まる)
2019/07/28(日) 11:22:38.76ID:pMfSdwXX
>>63
>>64
unwrapしてformat!で結合できましたm(_ _)m
2019/07/28(日) 12:16:23.87ID:G72VT/2G
GCは結局メモリ以外のリソースはまともに管理できなくて、自分でデストラクタ呼ぶはめになるのがつらい
2019/07/28(日) 12:24:41.52ID:p9n7KwZ9
rustでc++のtemplate<class T, size_t N>struct array{T elm[N];}みたいな事可能なの?
2019/07/28(日) 13:40:28.12ID:GSiaruU8
抜け道はあるかも知れんがジェネリクスでは型しか取れない
2019/07/28(日) 14:40:16.56ID:+9hlsOXW
https://github.com/rust-lang/rfcs/blob/master/text/2000-const-generics.md
https://github.com/rust-lang/rust/issues/44580

できるようにする構想はあるっぽい
2019/07/28(日) 15:01:36.78ID:+9hlsOXW
まだ実装終わってないけどnightlyなら一応使えるっぽいよ

#![feature(const_generics)]
75デフォルトの名無しさん
垢版 |
2019/07/28(日) 19:04:25.79ID:5UHV96py
高機能なマクロもクロージャも使えるのだから値パラメータなジェネリクスは冗長
なキモス
2019/07/28(日) 19:07:52.98ID:XzK5p4st
C++から機能取り入れるとクソ言語化するからやめてほしい
77デフォルトの名無しさん
垢版 |
2019/07/28(日) 19:22:39.84ID:5UHV96py
んまー値パラメータなクラステンプレートを実現しようとしたらマクロでは済まないのか
そうか
2019/07/28(日) 19:31:07.73ID:jklii+Ft
>>70
GCは全く関係ないがな。
try使うとかwith使うとかgoならdefer使うとかそういう話だろ。
オーバーヘッドガー言い出すやつって
ただまともにメトリックとるスキルがないってだけだろ。
2019/07/28(日) 19:45:22.37ID:B+3CJM6Y
この国語力はやばい
2019/07/28(日) 20:15:28.70ID:60uqYffv
>>78
RustやC++のスマートポインタならスコープ抜けたときのデストラクタできれいにリソース解放できるけどGCだとできないね、って話なんだが。
それを部分的に解決する方法としてC#のusingとかがあるけど、関数を跨ぐような寿命の長いリソースには使えない。
try-finallyやGoのdeferなんて、絶対書き忘れてリソースリークするパターンだろ。
2019/07/28(日) 21:21:52.37ID:GSiaruU8
現状静的配列が使い物にならないから const generics は必要だと思う
2019/07/28(日) 21:26:23.70ID:B+3CJM6Y
いらねーだろ
それでどんだけ速くなんだよ
2019/07/28(日) 21:30:14.25ID:GSiaruU8
ゼロコスト抽象化を標榜してる以上は行列計算をVecでやれとは言えんだろ
2019/07/28(日) 21:36:32.69ID:B+3CJM6Y
それはzero costの履き違え
2019/07/28(日) 21:37:48.82ID:GSiaruU8
お前にとってはそうなんだろう
2019/07/28(日) 23:01:30.64ID:jklii+Ft
>try-finallyやGoのdeferなんて、絶対書き忘れてリソースリークするパターンだろ。
一理あるが、資源を正しく管理するデストラクタ書くのそんなに楽じゃねーぞ。
舐めすぎだわ。
2019/07/28(日) 23:39:20.86ID:G08azDw2
>>86
他言語でもさんざん書いたからデストラクタの難しさは知ってるつもりだけど、
ライブラリ作成者が注意深く書いたデストラクタをみんなで使うのと、各自finallyやdeferを正しく実装しましょう、なら前者がましでは?
88デフォルトの名無しさん
垢版 |
2019/07/28(日) 23:58:54.12ID:5UHV96py
ちょっデストラクタで開放処理を書けない資源とかもはやプロセスをkillするしか、
2019/07/29(月) 00:07:34.10ID:9xGY09/M
Vecはただのfat pointerのnewtype patternだからアラインが合えば自動ベクトル化できるんじゃないの?

>>80
gcあるならref objectあるだろ。今どき。
90sage
垢版 |
2019/07/29(月) 00:09:11.34ID:bStHYZl0
ていうかデストラクタ自体は問答無用に資源を開放するように作ればよいのであって
そうならないのは上位の設計がおかしい
例外のスローが許されないなどただでさえ制約が厳しいところに小難しいロジックを押し込んでどうするんじゃ…

資源の開放に一定の手順が必要ならそれはデストラクタの中ではなくデストラクタが呼ばれる前にすませるべきだし、
必要な手順が抜かされたみたいなバグのケースの救済までデストラクタの任に負わせるのはおかしい
資源の開放自体にエラーの危険性があるならインスタンスの製造元(ファクトリ)にエラー通知してから死ぬ等の
パターンに従うべき
2019/07/29(月) 00:23:30.71ID:ovYGqPmP
>>89
ref objectがなんなのかよく分からないが、GCにリソース解放させる場合の問題はタイミングを制御できないことだと思ってる。
スコープを抜けて回収可能になったからといってすぐ回収されるわけではないから次の確保が早すぎると死ぬ。
まぁたいていの場合問題ないってのはあるけど、本質的にはGCに合ってないと思う。
2019/07/29(月) 00:34:54.17ID:bStHYZl0
すぐに開放されないだけの問題なら開放されるまで待てば良いではありませんか、
さすがに今日日のGCは開放可能な資源の発生と資源の獲得要求がmeetした場合に何もしないほど馬鹿ではないと思われ
(meetのトリガタイミングがなんと2回もある

致命的に問題なのはGCには資源に空きがあるように見えるが、GCが知りようがない上位のロジックで循環依存が生じる場合
ファイルをN個まで同時に複数開けるシステムで、a、bの2個しかファイルが開かれていないんだけど
スレッドAがファイルaを出力し終えた後ファイルbのクローズを待っており、スレッドBはファイルaのクローズを待ってからbを出力せんとしている場合等、
2019/07/29(月) 01:10:00.62ID:X0vpIRmF
>>87
俺は後者のがマシだと思うけどね。
資源解放のパターンをオブジェクトで判断するとか自然な設計だと思えんよ。
解放ルーチンなりをシチュエーションごとに用意する方が明らかに自然だわ。
2019/07/29(月) 01:17:46.83ID:ovYGqPmP
>>92
実際問題例えばC#のGCはそれくらい馬鹿ではある。
というかファイルハンドルの中身と次のリソース要求を見て、適切に回収してくれるGCってあるの?
メモリ解放のタイミングでたまたまその他のリソースも解放されてるだけでは?
2019/07/29(月) 21:42:08.32ID:CSar0obt
https://i.imgur.com/l91swsP.jpg
96デフォルトの名無しさん
垢版 |
2019/07/30(火) 00:57:12.66ID:ZDjzCSg/
>>95
グロ
2019/07/31(水) 21:59:30.06ID:BBGtrgFp
効率的なTreeの書き方どこかに書いてあったはずなんだけど忘れてしまった

どこにかいてあるかわかるひといますか?
2019/07/31(水) 22:04:33.03ID:BBGtrgFp
enumをつかっていたような気がするんですが・・・
2019/08/01(木) 00:10:45.06ID:zC1laZAw
効率的なTreeってなに?
代数的データ型なら普通はsum type(rustのenum)で書くけど。
2019/08/03(土) 11:04:41.72ID:RLY9hdXo
???@???
Rustとの戦いにつかれたのでDを触った次第

↑RustでコンパイラとかVM作ってる人のツイート
Rustってそんなに難しい?
2019/08/03(土) 13:51:49.63ID:aqiFUikh
配列で親ノードIDや子ノードのID持たせるとかじゃなかったか。
所有権引っかからんようにするとそんな感じになる。
2019/08/03(土) 22:29:28.05ID:Pq9Lnt2C
他言語でもGUIのグラフとかは結局そうなるんだけどな。
103デフォルトの名無しさん
垢版 |
2019/08/05(月) 09:41:10.02ID:VmFTmeN2
>>100
面倒くさい
2019/08/06(火) 13:13:46.53ID:trr4oLNQ
Javaとの違いは何
2019/08/07(水) 01:19:35.26ID:go9nzBX4
今日知って驚愕したのだがJavaは構造体の参照を返すということができず、
どうしても参照返ししたいときは構造体のメンバを書き換えて返すという歪な手段を使う
↓こんなやつ
 class CWDPath {
  String mPath = "";
 }  
 boolean getCWD(CWDPath result) {
  result.mPath = "SomeDir";
  return true;  // 性交ステータス
 }

これはresultの寿命がmPathに代入するデータの寿命を下回らないケースでしかRustでは書けないハズ
つまりJavaはRustのアンチパターンで大々的に書くことを余儀なくされる危険な言語
2019/08/07(水) 01:49:51.15ID:KVZqz5pU
性交ステータス
2019/08/07(水) 08:31:50.75ID:eqkXQjzY
Javaすら理解できてないのにRustを使おうとするとは勇ましい
2019/08/07(水) 12:04:18.71ID:Fq68/ECQ
何もかも間違っていて突っ込む気も起こらん
2019/08/07(水) 21:02:26.47ID:bj+hpOaY
javaに構造体はないってことくらい突っ込んでやれ。
value typeは当分先だ。
2019/08/08(木) 05:27:28.23ID:FTUf1Nuq
いや正しいていうかこの話にvalue typeは関係無い(返そうとしているStringは参照型
間違っているというならreturn mPath以外の方法でgetCWD()からStringを返してみると良い
2019/08/08(木) 05:51:36.26ID:FTUf1Nuq
んまー不用意に構造体と書いてしまったのは陳謝するのですよ
2019/08/08(木) 07:38:49.45ID:097LZjtE
組み込みの値型以外は全て参照型で管理されてる事が理解できてないって事?
2019/08/08(木) 13:27:41.32ID:+iXEwaHu
Javaにおける参照はオブジェクトへのポインタのことで、RustやC++の参照とは違う概念なのだよ
2019/08/08(木) 13:30:51.54ID:+iXEwaHu
だから参照を返すという言葉の意味も Java と Rust では違う
2019/08/08(木) 14:49:51.48ID:bpfrenBa
何言いたいのかさっぱりわからん
コンパイルエラーになるがやりたいことを書いてくれ
2019/08/08(木) 15:16:04.89ID:6plAwatI
JVM上で動くJRustはまだか?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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