Rust Part7
レス数が1000を超えています。これ以上書き込みはできません。
ビルドエラーが出るのですが、なにか解決策はありますか?
Compiling backtrace-sys v0.1.30
error: failed to run custom build command for `backtrace-sys v0.1.30`
process didn't exit successfully: `C:\Programming\Rust_project\socket_programming\target\debug\build\backtrace-sys-159a954e4a82ac78\build-script-build` (exit code: 1)
--- stdout
cargo:rustc-cfg=rbt
TARGET = Some("x86_64-pc-windows-gnu")
OPT_LEVEL = Some("0")
HOST = Some("x86_64-pc-windows-gnu")
CC_x86_64-pc-windows-gnu = None
CC_x86_64_pc_windows_gnu = None
HOST_CC = None
CC = None
CFLAGS_x86_64-pc-windows-gnu = None
CFLAGS_x86_64_pc_windows_gnu = None
HOST_CFLAGS = None
CFLAGS = None
CRATE_CC_NO_DEFAULTS = None
CARGO_CFG_TARGET_FEATURE = Some("fxsr,sse,sse2")
running: "gcc.exe" "-O0" "-ffunction-sections" "-fdata-sections" "-m64" "-I" "src/libbacktrace" "-I"
"C:\\Programming\\Rust_project\\socket_programming\\target\\debug\\build\\backtrace-sys-361946668d7e8f79\\out"
cargo:warning=cc1.exe: sorry, unimplemented: 64-bit mode not compiled in
exit code: 1
--- stderr
error occurred: Command "gcc.exe" "-O0" "-ffunction-sections" "-fdata-sections" "-m64" "-I" "src/libbacktrace" "-I"
"C:\\Programming\\Rust_project\\socket_programming\\target\\debug\\build\\backtrace-sys-361946668d7e8f79\\out" with args "gcc.exe" did not execute successfully (status code exit code: 1). >cargo:warning=cc1.exe: sorry, unimplemented: 64-bit mode not compiled in
「rust unimplemented: 64-bit mode」で検索すれば? 32bit mingwで64bitのコンパイルしようとした時のエラーの話だからrust付けると出てこないだろうな。
*-pc-windows-gnuはツールチェーン含んでるから余計な環境でビルドせずに含んでるもの使えばいいんだよ。 Rustで
port0.od = 0; // 0b00000000
port0.od.b0 = 1; // 0b00000001
port0.od.b5 = 1; // 0b00100001
port0.od.b0 = 0; // 0b00100000
みたいな実装って出来るんだっけ?
port0.od = 0; // 0b00000000
port0.od.b1(1); // 0b00000010
とか
port0.od = 0; // 0b00000000
port0.od.bitset(6); // 0b01000000
みたいに関数を介せば出来ると思うけど >6 標準では用意されてないけど、名前の通りbitfieldってcrateがあるから試してみて
https://github.com/dzamlo/rust-bitfield サンキュ。やっぱ無理か
こういう記法が出来る処理系って少ないですよね。言語レベルで対応しているか=の上書きと括弧無し関数呼び出しが出来るとかじゃないと難しい
どうやって実装しよう
1.読み出し:b0()、書き込み:b0set([0|1])
2.読み出し:bit(n)、書き込み:bitset(n)、bitclear(n)
どちらもスマートじゃないな。Rustだと引数の初期値を取れないから一つの関数で読み書き兼用というのも出来ないし
>>7
機能上はマスクで足りるのですが名前でビットを指定できた方が読みやすいので
>>9
読み出し:bit、書き込み:set_bitと実装されているみたいですね。こんな書き方しかないのかな bitmapで良くない?外部クレートなかったっけ? マクロ使えば見た目は似せられるかも?
bit! {
od = 0;
od.b0 = 1;
}
みたいにしてASTいじって関数呼び出し形式に変換する感じの。 初心者です。苦戦してます。お知恵を貸してください。
仮想端末を含んだ GTK+3 アプリを C++ で作りたいです。
gtkmm だと vte が使えない(?)ので、gtk-3.0 を使って試してます。
サンプルを下のリンクに置きました。
make すると main 最後の return app->run(window); の所で、
[no member named 'run' in '_GtkApplication']とエラーになってしまいます。
この部分は gtkmm の例から持って来たもなので、変える必要があるのですが、
gtk+3 ではどう書くのが正解でしょうか?よろしくお願いします。
あるいは、gtkmm でも vte を使う簡単な方法がもしあれば、教えてください。
Makefile
http://codepad.org/wldK76KY
main_test_3.cc
http://codepad.org/NopgbNXP
sample_3.h
http://codepad.org/BiQt354F
sample_3.cc
http://codepad.org/I1B7AyJL すみません。誤爆しました。14は無視してください。 Rustって、なんでRustっていう名前なんですか >>5
>>4
>>3
64bit のほうでやったらいけました >>12
一応no_std予定なので・・・
>>13
スマン。マクロ書いたことないんで理解できないです
>>16
あ、そうか。Index、IndexMutを書けば[]と[]=で読み書きできるようになりそう。やってみよう Cみたいに
port0 = BIT5
port0 = BIT2 | BIT4
val = port0 & BIT4
じゃあかんの? >>19
enum Bit { On, Off }
let byte = [Bit::Off; 8]
こんなんじゃダメけ? 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 レスdクス、実はcargo cleanして残ったやつ全部コミットにしといた…
それはそうとして分割コンパイル&リンクまでするには一体どうすれば…orz
実はmake不要でcargoが面倒を見てくれる…?
いやしかし次のサイトでは(VSCode環境ではないが)めっちゃmakefile書いてるし…
ttps://yoshitsugu.net/posts/2019-06-04-haribote-os-in-rust-day3.html >>25
普通はmake不要でcargoのみ。そのサイトはどこかから持ってきたアセンブラをnasmするのにmakeつかってるだけっぽいのでrust関係ない。 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が行ってきた取り組みを今後も紹介していくという。 ああついにMicrosoftまでMozillaのステマの犠牲に… 参照しか返せない状態で計算結果を返すって方法ってあるんだっけ。通常なら値を返すように宣言すればすむ話ですが
Indexは参照しか返せないようです。たとえば*addr >> idx & 1の結果を返したいです
>>21
それだとセットとクリアでAND or ORと値の両方を変更せねばならずどちらかを忘れてバグを産む可能性があります
>>22
ググるとそのような例が出てきますね。Rust的に正論だと思いますが元となるハードウェアのマニュアルでは
0:○○になる
1:××になる
みたいな表記が主流に見えます。ここから外れた表現の強制は言語の安全性とは別なところでリスクを抱えるように思います >>29
ほんなら0と1でプログラム書けやタコスケ
プログラミング言語ってのはハードウェアを抽象化するためにあるんだぞ >>29
and or orと値の両方を変更せねばならずってどういうこと? >>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やアセンブラで低レベルの処理をする場合は多用される書き方だと思いますが結構危なっかしいと思います https://www.rust-lang.org/
Chromeの自動翻訳でサイトを見たら吹いてしまった。
「なぜ錆びるの?」って・・・。 義務教育受けてたらwhy rustの訳だろうなってすぐ分かるよなたとえ翻訳かけてたとしても Index、IndexMutが何でこんな仕様なのかと思ったらC++の[]に合わせたのか
C++ぽく使えるがそれ以外の使い方は想定されていないと
結局普通の関数で妥協するしかないのかな。抽象度はCに毛が生えた程度、C++未満?か
どのみち組み込み用に拡張された処理系相当には出来そうにないっぽい >>37
Rustは構文的な自由度あんまりないからね。Scalaが自由度ありすぎて混乱してた反省を踏まえてるのかな、って思ってる。どうしてもやりたいならマクロがあるし、妥当な落とし所では。 groovyと同じast変換するマクロもあるしcompiler pluginもあるし拡張は簡単。 rayonでzipイテレータを並列処理できますか? rust未経験者がwebプログラミングをrustで始めるのってどう思う?
俺の背景としてはocamlを1年ぐらいやってて「Real World OCaml」みたいな定番書を読んで簡単なコンパイラとかVMを作ったっていうレベル
rustでやるモチベーションとしては
・OCaml誰もやってなくて未来が見えない
・最低でもバリアントとパターンマッチが欲しい
・ネイティブが良いからscala/F#は嫌だ
こういう理由
web自体が初心者だからrailsとかのチュートリアルぐらいは先にやっておくつもり どうも何もWebアプリは言語の選定は大した問題じゃなくて、Webアプリの基礎がわかってるかどうかだぞ
セッション管理、Rest、クライアントスクリプト、見た目とロジックの分離等々 そうは言っても情報量の多さとかで挫折しにくい言語ってのはあるでしょ
Rustは明らかにきついほうだろうけど... >ocamlを1年ぐらいやってて
>コンパイラとかVMを作った
能力的にはRustでWebするのも余裕なんじゃね;
もっとも、SQLインジェクションみたいな文字列解釈やセッション絡みの脆弱性を
思わず作りこんでしまうことはRustでも避けられないから>>42のは真実だと思うが 最低でもヴァリアントとレコードとパターンマッチがあって全体的に式指向な言語が良い
ocamlがマルチスレッドに対応しててもっと流行ってれば...
scala/f#がネイティブであれば...
haskellが正格評価でもっとパフォーマンスが良ければ...
皆さんc/c++の置き換えとしてrustやってるの?
自分は関数型言語由来の機能が多くてネイティブで動く言語が欲しい
そういう理由でrustに手を出す人って少ないのかな
rust製のcliツールとかめっちゃ多いし、低レイヤのためだけにrustやってる人のほうが少ないんじゃないかな 難しいからなんなんだよってかんじ
勉強すればそのうち使えるようになるんだからどうでもいいことじゃん
俺はPHPの置き換えで使ってるけど rust, c++より少しはマシくらいの言語だわな。
実装系含めたらまだc++のがマシになるが。 C++がましってどのへん?学習コストはどうしようもないとして、学習してしまった今となってはC++に戻る気とか一切しないんだけど。 >>46
pony。cliツールっていうかcoreutilsとbusyboxの代替実装とかならあるけど。 >>52
cとかより低いレイヤーの言語をバインドしようとした時、より素直。 お前らが本当に必要としてるのはRustじゃなくて
ziglangなのでは? 流行ってる言語じゃないとしんどいってocamlで学んだ rustがリアルタイムで使われてるの聞いたこと無いんだけど
どうせgcあるから駄目とか言ってるやつはメモリの開放タイミングが
予測不能でも致命的にならない事しかしてないんだろ? Option<char>とStringを結合させたいんですけど、どうすればいいんですか? >>63
Option<char>はList<char>の特殊な例と考えて良い
これ、関数型言語の常識 let x: String = "Hello World!".toString();
s += Some(x)?;
いや知らんけど リアルタイムでってなに?
目の前でrust書いてくれるってこと? >>63
>>64
unwrapしてformat!で結合できましたm(_ _)m GCは結局メモリ以外のリソースはまともに管理できなくて、自分でデストラクタ呼ぶはめになるのがつらい rustでc++のtemplate<class T, size_t N>struct array{T elm[N];}みたいな事可能なの? 抜け道はあるかも知れんがジェネリクスでは型しか取れない まだ実装終わってないけどnightlyなら一応使えるっぽいよ
#![feature(const_generics)] 高機能なマクロもクロージャも使えるのだから値パラメータなジェネリクスは冗長
なキモス C++から機能取り入れるとクソ言語化するからやめてほしい んまー値パラメータなクラステンプレートを実現しようとしたらマクロでは済まないのか
そうか >>70
GCは全く関係ないがな。
try使うとかwith使うとかgoならdefer使うとかそういう話だろ。
オーバーヘッドガー言い出すやつって
ただまともにメトリックとるスキルがないってだけだろ。 >>78
RustやC++のスマートポインタならスコープ抜けたときのデストラクタできれいにリソース解放できるけどGCだとできないね、って話なんだが。
それを部分的に解決する方法としてC#のusingとかがあるけど、関数を跨ぐような寿命の長いリソースには使えない。
try-finallyやGoのdeferなんて、絶対書き忘れてリソースリークするパターンだろ。 現状静的配列が使い物にならないから const generics は必要だと思う ゼロコスト抽象化を標榜してる以上は行列計算をVecでやれとは言えんだろ >try-finallyやGoのdeferなんて、絶対書き忘れてリソースリークするパターンだろ。
一理あるが、資源を正しく管理するデストラクタ書くのそんなに楽じゃねーぞ。
舐めすぎだわ。 >>86
他言語でもさんざん書いたからデストラクタの難しさは知ってるつもりだけど、
ライブラリ作成者が注意深く書いたデストラクタをみんなで使うのと、各自finallyやdeferを正しく実装しましょう、なら前者がましでは? ちょっデストラクタで開放処理を書けない資源とかもはやプロセスをkillするしか、 Vecはただのfat pointerのnewtype patternだからアラインが合えば自動ベクトル化できるんじゃないの?
>>80
gcあるならref objectあるだろ。今どき。 ていうかデストラクタ自体は問答無用に資源を開放するように作ればよいのであって
そうならないのは上位の設計がおかしい
例外のスローが許されないなどただでさえ制約が厳しいところに小難しいロジックを押し込んでどうするんじゃ…
資源の開放に一定の手順が必要ならそれはデストラクタの中ではなくデストラクタが呼ばれる前にすませるべきだし、
必要な手順が抜かされたみたいなバグのケースの救済までデストラクタの任に負わせるのはおかしい
資源の開放自体にエラーの危険性があるならインスタンスの製造元(ファクトリ)にエラー通知してから死ぬ等の
パターンに従うべき >>89
ref objectがなんなのかよく分からないが、GCにリソース解放させる場合の問題はタイミングを制御できないことだと思ってる。
スコープを抜けて回収可能になったからといってすぐ回収されるわけではないから次の確保が早すぎると死ぬ。
まぁたいていの場合問題ないってのはあるけど、本質的にはGCに合ってないと思う。 すぐに開放されないだけの問題なら開放されるまで待てば良いではありませんか、
さすがに今日日のGCは開放可能な資源の発生と資源の獲得要求がmeetした場合に何もしないほど馬鹿ではないと思われ
(meetのトリガタイミングがなんと2回もある
致命的に問題なのはGCには資源に空きがあるように見えるが、GCが知りようがない上位のロジックで循環依存が生じる場合
ファイルをN個まで同時に複数開けるシステムで、a、bの2個しかファイルが開かれていないんだけど
スレッドAがファイルaを出力し終えた後ファイルbのクローズを待っており、スレッドBはファイルaのクローズを待ってからbを出力せんとしている場合等、 >>87
俺は後者のがマシだと思うけどね。
資源解放のパターンをオブジェクトで判断するとか自然な設計だと思えんよ。
解放ルーチンなりをシチュエーションごとに用意する方が明らかに自然だわ。 >>92
実際問題例えばC#のGCはそれくらい馬鹿ではある。
というかファイルハンドルの中身と次のリソース要求を見て、適切に回収してくれるGCってあるの?
メモリ解放のタイミングでたまたまその他のリソースも解放されてるだけでは? 効率的なTreeの書き方どこかに書いてあったはずなんだけど忘れてしまった
どこにかいてあるかわかるひといますか? enumをつかっていたような気がするんですが・・・ 効率的なTreeってなに?
代数的データ型なら普通はsum type(rustのenum)で書くけど。 ???@???
Rustとの戦いにつかれたのでDを触った次第
↑RustでコンパイラとかVM作ってる人のツイート
Rustってそんなに難しい? 配列で親ノードIDや子ノードのID持たせるとかじゃなかったか。
所有権引っかからんようにするとそんな感じになる。 他言語でもGUIのグラフとかは結局そうなるんだけどな。 今日知って驚愕したのだがJavaは構造体の参照を返すということができず、
どうしても参照返ししたいときは構造体のメンバを書き換えて返すという歪な手段を使う
↓こんなやつ
class CWDPath {
String mPath = "";
}
boolean getCWD(CWDPath result) {
result.mPath = "SomeDir";
return true; // 性交ステータス
}
これはresultの寿命がmPathに代入するデータの寿命を下回らないケースでしかRustでは書けないハズ
つまりJavaはRustのアンチパターンで大々的に書くことを余儀なくされる危険な言語 Javaすら理解できてないのにRustを使おうとするとは勇ましい javaに構造体はないってことくらい突っ込んでやれ。
value typeは当分先だ。 いや正しいていうかこの話にvalue typeは関係無い(返そうとしているStringは参照型
間違っているというならreturn mPath以外の方法でgetCWD()からStringを返してみると良い んまー不用意に構造体と書いてしまったのは陳謝するのですよ 組み込みの値型以外は全て参照型で管理されてる事が理解できてないって事? Javaにおける参照はオブジェクトへのポインタのことで、RustやC++の参照とは違う概念なのだよ だから参照を返すという言葉の意味も Java と Rust では違う 何言いたいのかさっぱりわからん
コンパイルエラーになるがやりたいことを書いてくれ 皮肉や冗句を言うにも一定のセンスと知能が必要と言う証左 >>115
C#の例(これは動く
void Main() { string str = new string(); bool bResult = getCWD(ref str); Console.WriteLn(str); // "some_dir"が表示される }
bool getCWD(ref string str) { str = "some_dir"; return true; // 性交ステータスとしてのtrue }
Javaで同じ事をしようとすると>>105になって、Stringを返すためだけのためにCWDPathみたいなクラスを作らねばならない
>>117
藻前は顔だけは賢そうだな 脳がC言語で止まってると色々気苦労が多くて大変だな で、Javaでは何で>>105みたいな変なことになるかというと、参照の参照をとることができないため
ここで参照とは何かというと>>113の前半部で良い
参照自体はレジスタに代入したりスタックに1語で積める値型の一種とみなせる
C#ではrefキーワードにより、参照の参照をgetCWD()に渡すことができる
Javaは参照しかgetCWD()に渡せない。よって、CWDPathみたいなクラスの参照を渡してやって、
そのクラスがメンバとして所有する参照を上書きするという手段で返さざるおえない >>119
参照型を引数として関数に渡すしくみはCで完成しているのだから>>119の言い様では批判になんね
Cではポインタやんけというのは本質ではない
参照自体はレジスタに代入したりスタックに1語で積める値型の一種とみなせる(>>120)
なのであって機械語レベルでみたらオブジェクトを指すポインタに他ならない
で、Java、C#、C++、Go、Rustいずれも参照型の関数渡しは参照をスタックに積んで渡すモデルであることは変わりない 調べてなお問題があると言うなら>>122の理解にこそ問題がある >>118
最初説明したこととまるで違うじゃないか。用語は正しく使えよ。
結論は、戻り値で成功不成功を返そうとしたお前が全部悪い。>>119が正しい ・カレントディレクトリを取得する
・取得の失敗を検出したい
というのが要求だとして
Javaでそんな変なことせずに
もっとまともな書き方あるから批判する前に
勉強しろや >>118
Javaの場合は普通 >>105 みたいなことをせずに、getCWD() の返り値を CWDPath にして、失敗の場合には null を返す
CWDPathみたいなものを二つ返したいなら Pair を使うし、たくさん返したい場合に初めてクラスを作る
Java の進化系である Kotlin はこの辺を確実簡易に行うために nullable とか data class とかがある optional型とかnullable型みたいなヤツは色んな言語であるわな CWDてなんなんそもそもw
pwdコマンドにあるようにワーキングディレクトリってことでいいの?
それが失敗する時があるってのが想像できない 想像力が足りない
Unix だと実行中のプロセスのカレントディレクトリを消すことができるので、
そこでそのプロセスが getcwd すると No such file or directory のエラーになる Cの知識しか無いけどJava語っちゃう痛い人が、参照渡しだの値渡しだのを問題にしたがる
Cを使えるからってプログラミングの技術全てが語れるわけじゃないのにね go9nzBX4が最初から間違ってるのは置いといてFTUf1Nuqは結局なんだったの? >>124
一連のレスの中で漏れが一度も「参照渡し」という用語を使っていない件について:
参照型の参照渡しする、という状況は比較的新しい話で、
Javaはあえてかなんだか知らんが古来からある値型の参照渡しに類似の動作に対応していない
つまり呼び出し先で引数として渡された参照型自体を交換したり出力したりできない
JavaScriptやC#は対応している(呼び出し先で参照型自体を交換できいる。C#の例は>>118。refよりoutキーワードを使ったほうが良かったかもしれん…)
>>126
それで十分使いやすいと思われたのならそれで良いが、後発言語が参照型の参照渡しに対応しているという事実、
>>133
C++脳に汚染されていたのでclassとstructの区別がなかったんじゃ すまんまつがえたorz
JavaScriptの参照の渡し方はJavaと同じやった、 なんか今ググると参照渡しの説明に真っ先にJavaScriptが出てくるが
世の中では参照型については参照型が保持するデータを呼び出し先が書き換えられることをもって参照渡しと言っているのかそうか、
しかしそれでは渡された参照型を呼び出し先が交換したり出力したりできず、
そうしたい場合に>>105や>>126(Pairの使用、ただし2個まで)みたいな技巧を要する 書き込むスレをいつまで経っても間違ったまま
そのことにすら無自覚で気付けないやつは
何してもだめ Cのときからある混乱だよな
単にポインタ渡してるだけなのに
ポインタを値渡してるだけなのに
「ポインタ渡し」だとか「参照渡し」だとか言っちゃう
そーいうブログや個人サイトが今もいっぱいある
そもそもこんな状況だから
これについての議論はスタート地点からもうやる気ほぼ出ない >ポインタを値渡してるだけ
フォートランスレにでもしてほしいのけ? >>141
> 単にポインタ渡してるだけなのに
> ポインタを値渡してるだけなのに
> 「ポインタ渡し」だとか「参照渡し」だとか言っちゃう
お前がまず混乱してね? ×単にポインタ渡してるだけなのに
○単にポインタを渡してるだけなのに
失礼、こう書いたほうが良かったねこの場合 ×ポインタを値渡してるだけなのに
○ポインタを値渡ししてるだけなのに
こっちは完全なるタイプミス 佐渡さんと書いて、サドさんと読む人と、サワタリさんと読む人がいるから、紛らわしい! 結局、JITがあるからRustよりJavaの方が速いんじゃないんの? RustとかC/C++は機械語までコンパイルするから速いんじゃなくて無駄なことをしないから速いのでJITとかそういう問題ではない JITコンパイルで性的コンパイル結果より速くなるというのは都市伝説
JITのしくみを考えたらワカル
理論上は分岐の実行時統計をとって最適化することによりローカルループがありえないぐらい爆速になって
JITコンパイラ大勝利!と言うことも考えられないではないが統計をとるオーバーヘッドが生じるし
そこまでやっているJITコンパイラは商用のにはないはず Rust学び始めたけど難しすぎる...
慣れるのにどれくらいかかるだろうか
ちなc/c++経験ほとんどなし
関数型言語は少しだけ分かるっていう程度
手を出すのは無謀? なにを作ろうとしてるのかによるよ
わたしは二ヶ月くらいかかったかな async/await、勉強するのに良いものある? まだstableじゃないからなんとも
tokio::netとかはasync/awaitでサンプル出してたりするけどどうかな >>159
substructural type systemとregionの前提知識がないならコンパイラに怒られるだけ時間の無駄。
先に必要な知識つけてから。
>>161
stable待つよろし。 cくらいはやっとらんとなんでこんな事してるんだって思うだけだろ。
メモリイメージがないならrustなんか使う意味がない。 そんなに大仰なことかなあ?
書いてればそのうち分かるっしょ >>159
C/C++やってからでも遅くない
っていうかC/C++を先にやった方が近道かも知れん 寧ろ関数型プログラミングに慣れ親しんだ人ならimmutableなオブジェクトだけでプログラミングしてしまい、
Rustが何も言わなかったりして… >>160
2ヶ月ですかー
用途としてはとりあえず簡単なCLIツールを考えています
>>168
c++はともかくcはちゃんとやっておいたほうがいいですかね
「低レイヤを知りたい人のためのCコンパイラ作成入門」を読んだのでメモリイメージ的なことは最低限は分かるかも
rubyとかpythonとかからrust始めた人もいるみたいだし気合入れて頑張ってみますか なんでこんなめんどくさいことやってんだ
というのを理解するにはC/C++の知識があると早い 苦しめられたほうがラクなんよね
一見苦しい縛りの結果、整理された構造という一粒の宝石を残してくれる お邪魔します
エディタを紹介してもらえませんか?
The Rust Programming Language を読みながら自習しています
第12章 Refactoring to Improve Modularity and Error Handling の最後の節
Splitting Code into a Library Crate まできたのですが
( https://doc.rust-lang.org/book/ch12-03-improving-error-handling-and-modularity.html#splitting-code-into-a-library-crate )
Listing 12-14 のように src/main.rs を変更すると
エディタが minigrep なんて知らんと文句を言いはじめました
これでは Config や run を補完で出してくれません
mod lib;
use lib as minigrep
を入れれば補完してくれますが、cargo build が通りません
この状況に対応しているエディタを紹介してくださると大変助かります -use lib as minigrep
+use lib::Config; ごめんなんか勘違いしてた
vscodeで普通に通るよ トレイト境界をトレイト拘束に置換する拡張機能を書いた RustのArcとかBoxとか複数組み合わせてちゃんと動くってイメージが湧かないんだけどそんなもん? バグを見たことがあるからちゃんと動くというイメージが沸かないのか? https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=8c44bed658726ada0deff031799664b7
1. std::env::current_exe()で実行ファイルのフルパスを得る
2. file_name()でファイル名だけにする
3. to_str()で&strにする
4. 途中でErrやNoneが返ってきた場合はデフォルトの値"foo"を使う
ということをやりたいのですが、エラーでビルドできません。
どのように書けばいいでしょうか? std::env::current_exe() は PathBuf の"値"を返す
PathBuf::file_name() は PathBuf の中身の部分的な参照を返す
PathBuf::file_name() で生成される &OsStr を参照から値に変換するか、
std::env::current_exe() で生成されるPathBufを変数に束縛して所有権取らせてから、改めて参照を取得するかしないとダメ >>188
ありがとうございます、所有権を意識してto_ownedを使ったらいけました。 >>27の元ネタだが
We need a safer systems programming language
ttps://msrc-blog.microsoft.com/2019/07/18/we-need-a-safer-systems-programming-language/
Why Rust for safe systems programming
ttps://msrc-blog.microsoft.com/2019/07/22/why-rust-for-safe-systems-programming/
あたりを読むとあっちの会社はホント合理的だなと痛感する。C/C++を用いた安全な大規模システムの開発はムリゲーとし
同業他社の方針やツールを認め導入してしまう。日本の大手システム屋にこういう事を出来るところってあるんだろうか 合理的ね。。
「戦うプログラマー」読む限りはそうは思えんが。
都合のいいとこだけ切り取ってるな。
むしろ無理やり言語使わせるとかもろSIerのやり口だろ。ばかすぎる。 闘うプログラマーと言えば当時からC++は魔境過ぎてヤベェみたいな記載があって笑った記憶ある。 無理矢理使わせてるということは今後出てくるMSプロダクトは全部Rust製になるのか? >>193
C++で作るようなものを全部Rustにする
ってなったらすごいことになるな JavaScript → TypeScript(型チェック) とか C++ → Rust(借用チェック) みたいな
用途・特性が似通った言語でより安全な方を使わせるってのは、単なるリスクマネジメントであって
SIerのナンデモJava事案とは違うと思う ポストC/C++の座にRustを据えるかどうかはともかくC/C+お払い箱は確定事項じゃね
つーかMSRCの記事の何処にも無理矢理使わせているなんて書いていないぞ? Rust学び始めたけど噂通りむずい...
やりたいのはcli/tuiとかwebなので習得が無理そうだったら大人しくGoを使うことにする...(´・ω・`) >>199
CでOS書いた事あんの?
C意外でOS書いたことあんの?
それとも想像だけ? >>200
OS書かなくても自家製メモリ管理作ってみれば想像できるだろ。 ちゃんとしたmallocを作ること自体が難しいのであってCかRustかは難しさへは影響しない GCはクソ!だからRust最高!
とイキがってた奴がボローチェッカにボコボコにされてGCの良さを体感するまでが通過儀礼
どっかにドリルないですかね。>187みたいな問題がサラッと解けるようになりたい GCがクソだと思ったからRust使うという意識なかったな >>187 みたいな感じのはリファレンス読んで関数やメソッドが参照返すのか値返すのか調べるだけ Rustはボローチェッカーのご機嫌取りが必要だが
GCある言語で性能が欲しいとか言い出すとGCのご機嫌取りが始まる 所有権という概念をつかむのに苦労はしたけど、結果的にはプログラミングを簡単にしてくれていると思う ライブラリの開発者以外に所有権意識させたのは良いと思う GCが糞っていうより
糞実装のGCが多過ぎて
大抵の人はGCで糞な思いをするから
GCが糞だと言う誤解というか評判になってるだけ
実際糞だが ガベッジだって言う人もいるけど
俺は宝物って呼んでる クロージャの中で?が使えない…
パトラッシュ、僕はもう疲れたよ(´・ω・`) 同じ処理するにしてもRustだと複雑で冗長になるんだよな
もしかして糞言語なんじゃね? >>218
できるよ
Resultを返すクロージャなら メモリ壊して苦労するか
パフォーマンスで苦労するか
コーディングで苦労するか
お好きな物をどうぞ Bookを6章まで読んだ俺が >>187 を書いたらこうなった
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=dc60559b7af47298d305be80b340ee98
&strじゃなくてStringだけど 俺はこう
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=aa72b77d2eebc44833b647e46b13e020
Stringは必然と思う そういや、String(のclone)を一生懸命に避けてほんとに意味があるのか
コードを無駄に複雑化させただけなんじゃないかと悩む事が多い >>225 だとOsStringですけど、Stringにするにはどうすれば・・・? こうかな
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=91e57950a6bf6c922ff4f3d0b7531a0b なるほど
Derefが必要ない場合は直接書いちゃえばいけるのか
ありがとうございます なんでもかんでもメソッドチェーンにしないで適当なところで束縛した方がRustのコードは読みやすくなる それはあるな。シャドーイングできるから変数名に悩まないし、
単に長くなったところで再束縛すればいい。 界隈の潮流では「部分的なc++化」というものがあり、Javaですらジェネリクス/テンプレートを取り入れた
rustもそうなる 関数型言語で優雅にやってたことを
マクロの延長みたいな形で泥臭く実装するのがC++化 そもそもC++化の潮流なんてあるか?
各言語それぞれ取り入れあってるとは思うが。 仕様がごちゃごちゃすることをC++化と呼んでるだけでしょ ランタイム速度は落ちない?じゃいれるべ。
がc++の潮流 いや、javaのジェネリックスとC++のテンプレートの区別が付かないやつの言うことがそもそもおかしい。
パラメタ多相とメタプログラミングは別もんだぞ。むしろ最近のテンプレートがパラメタ多相に寄ってきたんだろ。 なんだか難しい言葉がいっぱいあるんだね
rustのが簡単でいいや Rustは難しくないよ
ただコンパイラがいけずなだけ >>242
こういう輩が一番何もわかってないタイプ。
そりゃとりあえず違う言う解けば違うところは一つくらいは見つかるだろうよ。
どこが違ってどこが同じか話さずに用語を使ってけんかにしかならん。
少なくともこれくらいの説明は必要。
https://qiita.com/matarillo/items/4870bb974f7a1900ef7c 俺は一流のエンジニアだぞ
なんてったって毎日Qiitaを見てるし足りてない知識はQiitaで検索して補ってる こないだ秋葉原で「まれいたそーまれいたそー」ってうつむきながら呟いてた黒髪ロン毛のデブがいたんだけど、
この「マレイ多相」とは何ですか? m array 多相といってモナディックな扱いの配列における多相性である(民明書房「世界の多相」より) パラメタ多相とテンプレートを並べるのはおかしい
多相は性質 じゃあ >>242 に言及するけどC++のテンプレートも本来はパラメトリック多相としての役割を元々は期待して導入された
パラメトリック多相は >>246 のリンクでもあるように元々の型記述に追加パラメータとなるトークンを渡す事で多相性、誤解を恐れずに言えば型の制約を緩くして記述量を減らすものである
よって多相性によって単一の記述から複数の型に対する実装の様に見えるものを生成できる
この単一の記述から複数の実装を生成できるというのが本質的にメタプログラミング的で、C++のテンプレートはそのレイヤーがハードウェアに近いが故にコンパイル時に展開される事
また再帰が可能である事と幽霊型のような型を作れる事とSFINAEに加えて非型テンプレートパラメタにより複数の実装を生成するメタプログラミング的な運用が特別目立った
これのコンパイルエラーの煩雑さや理解の難しさからC++以降のパラメトリック多相用言語機能は敢えてメタプログラミングがしにくいようにRustでは非型パラメタは与えられなかったり(そうする提案も現在あるが)
多相性の側面を強調して利便性を上げるために部分型や構造的部分型(これまた >>246 のサブタイピング多相の一種で、同等のメソッド(関数)やフィールドがある場合にそれらを派生型と見做す)の記述構文を導入したりしている
最後の型パラメタに対する部分型記述に関してはC++もConceptとして導入するとのことだがそれはまた別の話だろう
長文失礼 https://doc.rust-lang.org/std/pin/index.html
このページのExample: self-referential structの構造体Unmovableのフィールドslice: NonNull<String>を、
Stringの実装してるトレイトのトレイトオブジェクト(slice: NoneNull<Box<Display>> みたいに)とすることって出来ないでしょうか >>260
Rust の const generics はすでに提案段階を過ぎてて短期的目標に入ってるゾ >>262
これは失礼、間違った情報を語ってしまった
指摘ありがとう Python歴半年(=プログラミング歴)とかの人がいきなりRustに手を出すのって無謀でしょうか? いいんじゃないの
ただなんでわざわざこんな事すんだよやりずれぇわ死ね
と思う回数が経験積んだ人より増えそうだけど いろんな言語やったあげくC++に不満がある人にとっての解がRust
この両方を満たしていない人にとってはピンとこねえのがRust 謎のメモリリークで徹夜するハメになった人向け
俺か Rust使うよりメモリモジュール買い換えた方が良くない? rustは安全に開発できるというのは本当か??何故バッファエラーは起きた?
https://jvndb.jvn.jp/ja/contents/2019/JVNDB-2019-008825.html
JVNDB-2019-008825
Rust 用 slice-deque crate におけるバッファエラーの脆弱性 crates.ioでunsafe何ヶ所使ってるか表示して欲しいわ スライスみたいなことをしようとしたら本質的にはどうにもならんだろ。
安全性か効率化か結局選ぶことになる。 モナドって、、もすかすてRustってHaskell並に面倒なん? 21世紀の現代では何を作っても一週間程度で複雑さはMAXに達する
プログラミング言語のRustでもそれは同じ let mut v = vec!["zero".to_string(), "one".to_string()];
v[0] = v[1];
これがダメなのも対処も、まあわかるようになったのですが
error[E0507]: cannot move out of index of `std::vec::Vec<std::string::String>`
というエラーメッセージがわかりません
どういう流れでこのメッセージが出るのでしょうか >>279
StringがCopy traitを実装してないからコピーできない いやそれはわかる
エラーメッセージの意味がわからない
どこがどうだからこのメッセージになるのか具体的に理解したい なんというかメッセージのindexがよくわからない感じ
メッセージを日本語にするとどうなるんでしょう >>281
逆に考えて v[1] をまんまとムーブ出来たら、その跡地はどうなるの? out of indexっていうけど、index内なんじゃないの?って疑問じゃないの?
俺はわからない out of indexではなくてmove out ofで出ていくって意味。
move out of borrowed contentとかと同じ。 なんか move out of 〜で引っ越すとか出ていくという意味があるらしいんだけど
それでも index がよくわからなくて悩んでます indexは[]演算子を提供してるIndexトレイトのindexメソッドかな。 v[0]使うからindexの意味がややこしいんでは
let x = v[1]; でも同じエラーになるのを見たら、indexアクセス経由で値をmoveする(=引き剥がす)のはまかりならんと分かる
でコピーできるなら値が残るので問題にならない Vec<String>のindex (メソッドの戻り値) はmoveできない
と言ってるわけね。理解した。ありがとう。 ん? こっちかも。
Vec<String>のindex (メソッドの) 戻り値はmoveできない ……エラーメッセージの検討と解釈が必要なところまで真似なくてもいいのに Trait std::ops::Index
container[index] is actually syntactic sugar for *container.index(index), but only when used as an immutable value. If a mutable value is requested, IndexMut is used instead.
This allows nice things such as let value = v[index] if the type of value implements Copy. まず move out of を一塊にして、index は添え字と考えてわけがわからなく・・・。
out of index を indexの戻り値 とはまったく思いつきませんでした。
わかってしまうともう他の読み方はできません。
最初から日本語に訳して欲しいとお願いすべきだったかも。
お騒がせしました。 rustの日本語ブック、ドキュメントはかなり前からプルリクがマージされてないから期待薄いかも 思い付きなんだけど
Box を &!、 Rc を &# で書けるシンタックスシュガーがあったらどうだろう
Box<T>を&!Tと書いたり、Rc::new(data)を&#dataと書けたりしたら? プログラマがコストを払うことに罪悪感を抱くようにあえて冗長にしてるんじゃなかったかな そういう記法実装するような思想の言語なら真っ先に mut が簡略化されてると思う 環境毎のクレートのバージョン違いでコンパイル通らないようなことがないようにバージョン指定させるくせにコンパイラのバージョン違いのせいでコンパイル通らないとかクソ過ぎひん? 無知な煽りカスにまで親切に教えてくれてありがとうおかげで無事通った(`;ω;´) オレオレ糖衣構文が欲しければ一対一変換するトランスパイラでも書けばいいだろ 俺は逆にlifetimeパラメータ省略をやめるべきだと思ってる。 ちゃんと勉強しようと思ったらオライリー本を読むべき? 日本の場合オライリー本買ったら原著はマニングだった、なんてことも。 test.rs:
fn main() {
println!("{}", "hoge");
}
でコンパイル出来るのに、rust/src/libcore/num/dec2flt/algorithm.rsの関数内にprintln!を書いても
error: cannot find macro `println!` in this scope
となるのは何でなん?
コンパイル出来る用に教えてください
ちなみに、rustc自体はちゃんとコンパイル出来てtest.rsのビルドと実行は出来てます use std;
use std::io;
と先頭に追加しても
error[E0432]: unresolved import `std`
と言われる…
stdすら簡単に使わせてくれないとか恐ろしく敷居が高い言語なのは分かったけど、>>311のprintln!だけは何とか動かしたいので、
よろしくお願いしますm(_ _)m >>313
何が?
完全にRust初心者なんだからしょうがない
多分外部ファイルに依存してるだろう事は何となく分かってきたけど、まだ解決には至らず 正直釣りにしか見えないが…。
なぜ初心者がいきなりcoreライブラリいじろうとしてるの?
あとcoreはmallocとかもない環境で動く必要があるから
とてもprintlnなんて無理だと思うけど。 (V) (V)
ヽ∧∧∧ 丿
┌<┌ ゚ ∀ ゚>┐ ラスタシアーン!! ヌルポチェック境界チェックしてたら遅くなるに決まってるやん
Cはそんなことしなくて済むから爆速な訳で 絶対にめくれないからパンツいらないスカートで
アスレチックでもスカイダイビングだもなんでもするのがCだわな 風呂でもセックスでもパンツ脱がないのがRustだわな Rust勉強し始めたんだけど、公式ドキュメント読み終わったら何しよう 何をするにも貞操帯外したり付けたりガチャガチャして複雑になるんだよなあ そんなふうに考えていた時期が俺にもありました
でも今はderef coercionでハッピーな毎日です Tのままでチェックするからこうなるんでu32にしてチェックしていいならそうする
TもCopy + Into<u32>でトレイト拘束するだけですむ 単にv1.0相当のコードをマクロで生成するのでいい気がするが。 数年後、Rustの世間的な評価はマクロが濫用されてるからクソ
になってる気がする そりゃ言語拡張性からいったらマクロは最強だよ。
そんなことは30前にlispが示してる。 ✗ Rustのマクロが汎用されているからクソ
○ プリプロセッサで単純に置換する不健全なマクロを汎用するからクソ
Rustはまだましなほう ライブラリで定義するのはいいがプロジェクト内ではレビューの時に面倒だからなるべく書きたくないな 頻出パターンならマクロになってる方がレビューしやすい Cのマクロと違って見た目からマクロであることが明らかだし害は少ない 直接依存するクレートのfeatureはdependenciesに記述できますが、依存するクレートが更に依存するクレートのfeatureをセットしたいときはどうすれば良いんでしょうか エアプだからよく知らんけど依存クレートが依存x2クレートのfeature使うなら依存クレートのtomlにfeature書いてあるし、
依存クレート経由しないで依存x2クレート使うなら自クレートが直接依存してるわけだから自クレートのtomlにfeature書くだけじゃないの? アホに良いコードは書けないのだ
アホでも書けるとかいう奴は、アホかアホな組織に属してるかその両方かだ
その両方かだ、って一度言ってみたかったんだ 世の中アホが書いたコンパイラの教科書が広く出回っているから紛らわしいな ローカル変数を意図的に snake_case じゃなく書きたいんだが、警告を出さない方法ある?
例えば win32 API 関連を扱う時にやはり camelCase がスマートに思えるシーンがあるんだ allow(non_snake_case)
を使いたまへ >>357
怒られなくなりました
ありがとうございます
```
#[allow(non_snake_case)]
pub fn dummy() {
let hWnd = 0;
}
``` ノンスネークケースを表す識別子がスネークケースとはいかがなものか。
allow(non_snake_case)
これ自身を
allow(nonSnakeCase)
と書きたいものである ErrorやWarningを出力するときにHelpやNoteで解説も出力してくれてすごく助かる ジェネリクスとPhantomData使って特定の関数呼んだかとかの条件付けるんならせめてエラーメッセージもちゃんとして欲しい(´・ω・`) 要らない何も捨ててしまおう君を探し彷徨うマイソウッ! 関数呼んだかチェックを実行時でなくてコンパイル時にできるってこと? RustとRの違い
R
データサイエンティストが仕事で使う
言語として結果を出している
速度は残念ながら遅い
Rust
陰キャが気持ちよくなるために使う
実績ナシ
速度は速いらしい(ソース無し) RustとRubyの違い
とか書くとスレが荒れる時代はもう過去なのかな RubyとRustの違い
Ruby
陽キャのおもちゃ
負債作成の実績がある
遅い
Rust
陰キャのおもちゃ
なにも作られてないので負債も作られていない
さすがにRubyよりは速い FirefoxのCSSエンジンとかFirecrackerとかDropboxとかnpmとかあるけど見たくないヤツには見えないからなあ 自分では書きたくない言語
確定申告のようなコーディングスタイル dieselなんかこれじゃない感あるなと思ったらアクティブRecord作った人が作ってるのか
代替ないのかね >>376
プログラマーな時点で陽キャはない
ウェイかつオタクという最悪な種族 RustネイティブでQtやGtkレベルのツールキットがほすぃ(´・ω・`) どれもやる気なくてダメポ
ttps://gitlab.com/bloom42/research/rust_gui_ecosystem 人それぞれだと思うんであくまで参考に聞かせて欲しいんだけど
どれくらいのサイズまで#[derive(Copy)]つけます? Copyって所有権の話であってサイズとは関係なくない? 所有権の観点からCopy実装してはならないケースはあるだろうけど、
してもしなくてもいい場合に考慮するのはサイズと意味だろ。
サイズに関して言えば、自分はu64の10倍くらいまでって感じ。 Rust Language Cheat Sheet
15.09.2019
https://cheats.rs/ いろいろ感謝
よく例題にありそうな
struct Point { x: i32, y: i32 }
みたいなのなら#[derive(Copy)]しても害はないかなと思って聞いてみた
速度を考えてサイズがusizeの3〜4倍ぐらいまでが相場かなと思ったんだけどね 俺が間違ってんのかな、どうもCopyとMoveの意味を勘違いしてるような…
https://doc.rust-lang.org/std/marker/trait.Copy.html
こことかにも書いてあるけどMoveでもCopyでも構造体の値自体は(所有権の意味ではなくmemcpyとしての意味での)コピーされるんだから一緒じゃないの? 例えば
let x = y;
と
let x = y.clone();
があったときに前者はノーコストで後者は結構重いかもしれないって感覚があると思うけど、
大きなstructにCopyを実装すると前者で大きなmemcpyが発生してびっくりする、という話。 イメージした状況は違うけどそんな感じ
参照経由で扱いたい大きなデータなのに
うっかりコピーされる状況にしちゃって勝手にコピーされるのはちょっと
でも小さいデータならコピーされてもいい MicrosoftのC#のドキュメントに何バイトまでstruct (C#における#[derive(Copy)])使う方がいいか
書いてあるのを見た気がする
値は忘れた Sizedなのは当然としてクリッピーなりラストシーが怒ってくれれば気軽に使えるだけどな 使用頻度にも依るんだから計測しろよ
別に難しいことじゃ無いし >>392>>393
Copyを実装してようがいまいが(=Move)
let x = y;
したのならどちらも同様にその構造体自体のmemcpyによる複製は行われてるよ?
(もちろんフィールド内の参照が指す先の話じゃなく) それはわかってるつもり
関数定義で引数を参照にしそこねた場合とかをイメージしてた
Copyつきだとmoveされずに残るから気づきにくい それで問題なく動いてるならどうでもいいだろ
遅かったら直せば?
どれだけ速かろうが、なんら価値を産まないプログラムの価値はゼロだよ 動くのは前提で最初( >>385 )から速度の話をしてるんですよ
流れで所有権の有効性の一面がでてきたわけですがね
他の人はどれくらいの速度低下を許容しているのか知りたいってのが発端 呼び出し規約でレジスタに乗る範囲は意識するかな
大きいのは論外だとして、小さいのは
プロファイルとっても表面化しないまま積み重なっていくだけだから
遅かったらあとで直すってのはまず実施されないよね 価値を生まないプログラムの価値はゼロ
とかいうひどい重言 >>399
しつこくてごめんね、でも分かってるようには思えないなぁ
CopyだろうがMoveだろうがメモリの使用量も速度も何も変わらないよ?
>>391に書いてあるけど複製前の値が使えるか使えないかっていう、所有権の違いだけ
It's important to note that in these two examples, the only difference is whether you are allowed to access x after the assignment.
Under the hood, both a copy and a move can result in bits being copied in memory, although this is sometimes optimized away.
CopyとMoveの違いはassign後のxにアクセスできるか出来ないかの違いしかない
内部的にはどちらもビット単位のコピーが行われる
When should my type be Copy?
Generally speaking, if your type can implement Copy, it should.
Keep in mind, though, that implementing Copy is part of the public API of your type.
If the type might become non-Copy in the future, it could be prudent to omit the Copy implementation now, to avoid a breaking API change.
一般的にCopyが実装可能ならするべき
将来的に非Copyになる予定ならAPIが変わることになるので実装しないべき moveのmemcpy()って最適化でだいたい消えるんじゃないの? >>405
だからcopyもmoveもしたくないんですよ
勝手にcopyを渡されるのでなく参照を渡してアクセスすべきstructのサイズがありますよね
copy vs move でなく copy/move vs 参照 ということ
勝手にcopyされないようにCopyを実装しないサイズについて
他の人の考えを聞きたかったんです
たぶん >>393 にそんな感じって書いたのが良くなかったんだろうな
>>392 の問題点を指摘するべきでした >>382
X.orgとWin32はいいとしてCocoaが厄介だな 128bitくらいまでならコピーでいいんじゃね
ttps://www.forrestthewoods.com/blog/should-small-rust-structs-be-passed-by-copy-or-by-borrow/ although this is sometimes optimized away.
の部分も訳してよ じょぶじょぶ〜
とりま、場合によっては最適化されるっしょ moveでも何かコピーされるの知らんかった。どうしてなの? このレベルの高速化が必要な処理なら #[inline] つけたら >>412
大抵は最適化でコピー省略だろうけど
寿命の短い変数から長い変数へmoveする場合は面倒な予感 め、memmove()はmemcpy()、、
moveが真にmoveになるのはハンドルや参照やFATで指し示されたブツだけなのではないか
bittableなオブジェクトでcopyメソッドの付加をケチっても仕方が無い
bittableなコピーは所有権フリーでふつくしい >>413
今や言語を超えてもLTO出来るので#[inline]を付ける意味ないんじゃないかな その境界は当然越えられないよ
静的なリンクのものだけ Result<(),Box<dyn Error>>を返す関数の中で、Errorトレイトを実装していない外部のクレートのエラーFooErrorを返す関数
fn f() -> Result<(),FooError>{}
に対して f()? のように?演算子を使いたい場合どうすれば良いんでしょうか? Errorトレイトが自分で作ったものならFooErrorにimplする
そうでないならenun MyErrorを作ってErrorをimplし、From<FooError> for MyErrorを実装する
規模が大きいなら後者のパターンで全てのエラーを包んでResult<(), MyError>を返すようにした方がよいっぽい https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=7e31f88718f5c8a1e9a11cdda48e91e4
>>421
ありがとうございます
Foo::f()?の部分はどうやって書けば良いんでしょうか… すまん不完全な解答だった
外出ちゃったからコードいじれないんだすまん
はintoを自動的に発行するので対応するFromを書けばいけるはず
ただBoxだとどうかな、やってみて >>423
いえ、ありがとうございます
もうちょっと試行錯誤してみます https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=54aff502bb9829108b97270581494855
帰ってきたよ
これでいけたよ LTOって何ですか?
long transfer object? great teacher Onizuka? DebugとDisplayってどう使い分けたり実装すれば良いんでしょうか
ドキュメントには前者はプログラマ向け、後者ははユーザー向けの出力とかって書いてあるので例えば数値なんかは
前者は「99u8」、後者はただ「99」みたいに表示されるのかと思ったんですが実際はどっちも同様にただ「99」としか表示されないですよね? Debug は
ID: 530, name: "ほのおのつるぎ(売却可)", attack: 63, equippable: "戦士、勇者"
みたいにユーザーに見せるもんじゃない詳細とかを適当なフォーマットで含むじゃろ。
Display は
ほのおのつるぎ
みたいにエンドユーザーにフォーマルにみせる情報を、変にフォーマットせずに含むのが普通じゃろ RustでVulkanを使いたいのですが、現状非公式のバインディングを使うしか無いのでしょうか…? デバッグビルドの時に、リリースビルドした依存クレートを使う簡単な方法はありますか?
target/release/depsをtarget/debug/depsに名前を調整して移すとできてる感じですが
もっと簡単にできないでしょうか。 なるほど
当面自作のスクリプトでdebug/depsいじります Rustに限った話じゃないんだがGUIツールキットもゲームエンジンもC++が主流
でもC/C++以外でC++の呼び出しが出来る処理系はほとんどない。うぼあー スマホゲームとか一時はUnityだらけだと思ったけど今は違うの? CどころかC++同士の異コンパイラ間ですら呼べなかったと思うけど。 ウィンドーズホンだとC#からC++/CXを経由してネイティブなC++が呼べたお なるほど。開発環境が決まっててABI決めうちできるならいけるのか。 Cは社交界のオキテを知らない村娘だから
不用意に呼ぶとズッキュウウウンしちゃったりするのよ
だから簡単に呼べなかったりするけど呼べるときはシャワーも浴びずにすっ飛んでくる、そんな子 C++のライブラリへのバインディングでほとんどのAPIがunsafe&unsafeって書いて無い奴もunsafeかもしれんから自分で気をつけてね☆
みたいのがあるんやが
これってRustで書く意味無くね…? 貴方がRustで書き直せば喜ぶ人もいるんじゃない? >>448
C++のライブラリ使うからだろ。
Rustで書かれたもの使うか、Rustで書き直せ。 Box<T>のTを初期化せずに返すunsafe fn box_t() -> Box<T> があったとして
let mut t;
unsafe {
t = box_t();
// Tの初期化
}
にするのと
let mut t = unsafe { box_t() };
// Tの初期化
ですますのとどっちが良いRust? >>452
unsafeで囲む範囲はどの言語でも最小限にしろよ
初期化にunsafe要らんのなら囲むな >>448
unsafeなAPIに対してrustで安全なラッパーを被せてやれれば意味がある unsafe fn vec_t_n(n: usize) -> Vec<T> {
let mut v: Vec<T> = Vec::with_capacity(n);
v.set_len(n);
v
}
fn vec_t_n(n: usize) -> Vec<T> {
let mut v: Vec<T> = Vec::with_capacity(n);
unsafe { v.set_len(n); }
v
}
unsafe fnにするかfnにするか
例えばutf-8を保証するStringのようにTがなにかを保証する型だとして
Vec<T>の中身がTでないかもしれないからunsafe fnが良いRustでOK? >>455
1文字ずつ文字間開いてるとucs2で書かれてるように見える >>458
そのコードだけで言えばset_len()を使うことで保証されなくなるlengthの正しさを
呼び出し側が保証する必要があるのかどうか
from_utf8_uncheckedみたいな別のunsafe fn使ってればそれによって壊される安全性があるなら
その安全性を呼び出し側が保証する必要があるのかどうか https://keens.github.io/blog/2015/09/23/rustwokakutokinochiken/
move semanticsのお陰でGCがないので本当に小さい。hello, worldが277KBだった。
Javaででかいのが当たり前で大昔の感覚を忘れてしまったんだが
ちいさい? たった13バイトの文字列をコンソールに出力するだけで283648バイトを浪費wwwww minimal runtimeってタイトルなんだからランタイムが小さいって話だろ。比較対象はGoとかHaskellとかであって、Cが小さいなんてのは当たり前。 ファミコン版のスターフォースのROMは16KBやったんやで 一方ルーストはhello, worldとコンソールに表示させるだけで277KBwww エミュROMでぐぐったら出てきた
ドラクエ3が256KByte
ドラクエ3が128KByte
ドラクエ1が64KByte
どれもKbitではない N88-BASICとかディスク拡張命令とか考えなければ32 KBに収まってた
数十KBというのは広大な情報量
人間の遺伝子もジャンクDNAを除けば10 KB強ぐらいなのではないか go だと Hello, work! だけで 2MB でした本当にありがとうございました 日本は欧米と比べてココがダメ!
↓
韓国のほうがもっとダメなのでセーフ! https://www.atmarkit.co.jp/ait/articles/1910/17/news088.html
「Rust」言語を採用したAWS、Rustプロジェクト支援を開始
Amazon Web Services(AWS)は2019年10月14日(米国時間)、オープンソースのシステムプログラミング言語「Rust」について、開発プロジェクトをスポンサーとして支援することを発表した。
Rustは、高速で信頼性が高く、効率的なコードを作成、保守できるように設計されている。2015年に最初の安定版がリリースされて以来、実システムへの導入が大きく進んでおり、GoogleやMicrosoft、Mozillaのような企業がいずれもRustを使用している。
例えばMicrosoftは自社製品の脆弱(ぜいじゃく)性の約7割を占めるメモリ安全性の問題を解決するためにRustが役立つと指摘している(関連記事)。
AWSでもRustの利用は大幅に拡大しており、「Lambda」「EC2」「S3」のようなサービスにおいて、パフォーマンスに敏感なコンポーネント用の言語として採用している。
AWSは先ごろ、軽量のマイクロ仮想マシン(microVM)を数秒で起動できる安全な仮想化技術「Firecracker」をオープンソースとして公開したが、ここでもRustが採用されている(関連記事)。 それでも数秒かかるんか…
コールドスタートの悪夢未だ醒めず >例えばMicrosoftは自社製品の脆弱(ぜいじゃく)性の約7割を占めるメモリ安全性の問題を解決するためにRustが役立つと指摘している(関連記事)。
これWindowsの脆弱性の話だろうけど、
静的解析ツールでは解決しないってことなのか? >>480
その関連記事は>>27。そのソースは>>190
静的解析ツール等を併用してもC/C++では無理があると指摘している mut を マットって読んでる人いる?
コアチーム含めミュート派が大勢なのは知ってるけど
eがないとミュートって読むのは不自然だし、時々eをタイプしそうになるから
マット派になろうかと思ってるんだが >>482
マット派
レットマットって発音が気持ちいい 結構いろんな読み方してんのね
マット派いたから安心して転向するわ
ちなみにドイツ語ではムートって読んで勇気って意味らしい わかる
fnとかpubとかunwrapとか普通にわかりにくい pubはまあわかるけど
fnとunwrapは他言語でもあるし普通にわかりやすいと思ってたわ
IntoIteratorとかは素直にIterableでいいのにとは思う しかしRustでOS作ったらCより性能悪かったという記事があったはず
新しくOS用のプログラミング言語を作った方が良いのでは
RustはOS開発を主眼にしてるわけじゃないだろう Rustは配列の境界値チェックがあるから普通に使うとCよりちょっと遅いよ OS組もうとするとRustの言語概念を無視するような書き方をしなきゃいけない
みたいに書いてあったんだけど 「Rust」言語はCよりも遅いのか、研究者がベンチマーク結果を解説
ttps://www.atmarkit.co.jp/ait/articles/1909/13/news133.html
このソースは
A high-speed network driver written in C, Rust, Go, C#, Java, OCaml, Haskell, Swift, Javascript, and Python
ttps://github.com/ixy-languages/ixy-languages
これかな >>497
ケースバイケースだろ。
なんでも杓子定規にとらえるなって言ってやれ。 いや普通にOSソース見ればそらrust向いてねーわってなるよ。
杓子定規にrust使おうってほうが気が狂ってるわ。 Rustを使わないからそうなっているのかもしれんぞ
どこでRustだと不利なのか説明してくれ ストレージからプロセスを読んで起動する、とか
そもそもコンテキストスイッチングの処理とかは所有権の概念(データの寿命が入れ子)から外れてくる
気がするが、別にunsafeにせねばならないほどでもないキモス
他に何かある? その昔はlispやforthでもos書いたりしたんだからrustで書けないことないだろう。 バグ発生率ってどうやってカウントするのが一般的なんやろか?
完全にただの思いつきで無意味な比較だけどgithubのgoとrustで総issue数/contributor数だと1人あたり2倍ぐらいgoのが多いね issueってバグじゃないだろ。
機能要望とか議論とかあるじゃん。 小さめのサイズの本で、初心者向けの本が出た!
Rustプログラミング入門、酒井 和哉、2019/10/13 >>506
バグ発生率は、バスタブ曲線だろ。
初期によくバグる
土方をやってると、バグを多く出さないと、客に提出できないw
漏れは、平均的なIQ レベルより、間違いが少ないから、
いつも、アホみたいなバグを、わざと自分で作って、バグ発生数を増やしていたw
あらかじめ勉強している人は、滅多に間違わないから、バグ発生数基準だと困るw
一方、全く勉強していない香具師は、バグが多い 仕様書にバグが多いのはあれわざと仕込んでるのかなるほど ネストした構造体のコンストラクトパターンみたいなやつはもっとチュートリアルで
説明した方がいいんでないのとは思う。
多分めんどくさい書き方にしかならんからやらんのだろうけれど。 三項演算子は便利だったなぁ、と他言語を思い出して感動してるってことかな 組み込みもネットワークツールもほとんどc以上の生産性を出すことないしな。。
一番有効な領域ってデバッガーじゃねーの?とは思う。 Bookを6章まで読んだ俺が >>224 で書いたのが
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=dc60559b7af47298d305be80b340ee98
?の便利さに気づいた俺が書いたのが
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=308e7fe634f1e539c1f936c3989022f0 .file_name()?.to_str()?.to_string()
Rustだっさ 公式に呼びやすい名前をつけないのがよくない
question mark operatorじゃわかりにくいから
error propagating operatorかerror handling operatorで ダサいかどうかとかどうでもよすぎる
性能、書きやすさ、読みやすさ、安全性がすべて 性能 境界チェックのせいでだいぶおそい
書きやすさ 地獄
読みやすさ 悪夢
安全性 噂ではあるらしい
?まみれになるぐらいだったらヌルポで落ちても変わらんやん
どうせ無理に回復とかしないほうがいい類のだろ ぬるぽで落ちるのは運が良かっただけで何でも起きうるし最悪スーパーハカーの餌食になる
?はちゃんとエラーで終了してくれる
って理解でおk? ヌルポって、javaのあれのこと?
シンタックスだけ比較して意味あんのかな >>523
ちがう
ぬるぽだとまず間違いなくぬるぽエラーで落ちる
NullSafeのありがたさはnullにならないこと
場合分けを考えずに常に変数を確実なひとつの値として扱える モナドだろうがなんだろうがNullはNullだ
へたに回復してしまうとほかに影響が波及して大惨事につながりやすい
むしろ最初からNullにならないことを保証してくれる方がうれしい
なのになんでOKで帰ってきた結果からfileNaeme取るのまで?つけさせられとんじゃ まあNULLで潔く死んでくれた方がってのは確かにあるわな。 エラーかどうかのチェックは、NULLかどうかのチェックとは違う
ここ大事なところなので間違えちゃダメ 潔く死んで欲しいなら明示的にunwrapなりexceptなりすればよい
バグなのか想定されたエラーなのかを区別して明示的にコーディングできるのがrustの利点では OptionとかResultにケチつけてるのは加齢臭キツすぎる 下手に回復して大惨事になるのは、下手だからでしょ
file_nameに?付けてるのはディレクトリの場合無いからでしょ
なんでそんなことが疑問になるのか分からない Optionとか中途半端でたちわりーわ。
てかrustみたいにライフタイム意識する言語の場合、あんまり役割ない気がするけどね。 メソッドチェーンの中で「owned -> borrowed -> owned」するのはアンチパターンだと思うんだよね
不必要な処理が入るし可読性も下がるのでいいことない
fn main() -> Result<(), std::io::Error> {
let path = std::env::current_exe()?;
let file = path.file_name().unwrap();
println!("{:?}", file);
Ok(())
} そもそものお題がこちら
>187 デフォルトの名無しさん2019/08/26(月) 20:55:57.18 ID:hNXwMePN >>206>>214>>224
>https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=8c44bed658726ada0deff031799664b7
>1. std::env::current_exe()で実行ファイルのフルパスを得る
>2. file_name()でファイル名だけにする
>3. to_str()で&strにする
>4. 途中でErrやNoneが返ってきた場合はデフォルトの値"foo"を使う
>
>ということをやりたいのですが、エラーでビルドできません。
>どのように書けばいいでしょうか? >>534
お題があったのね
referenceを受け取ってreferenceを返す関数に抽出すればto_ownedやto_stringは不要
use std::path::PathBuf;
fn main() {
let path = std::env::current_exe().ok();
let file = file_name(path.as_ref()).unwrap_or("foo");
println!("{}", file);
}
fn file_name(path: Option<&PathBuf>) -> Option<&str> {
path?.file_name()?.to_str()
} 勉強になりました
let file = {|| Some(path.as_ref()?.file_name()?.to_str()?)}()
.unwrap_or("foo");
でも動くようですけど関数に抽出した方が良いですか? それ関数作って呼んでるのとほぼ同じだし名前がついてるかどうかの違いだから好きにせえ Someで囲ったOptionalチェーンを返すクロージャってのが
Rustのイディオムとして認知されて来ればそういうやり方も有りかもだけど
俺は関数に抽出したほうが型が見えて読みやすいので良いんじゃないかと思う これまではto_string()がチェーン末尾だったからSomeに入れてたけど
末尾がto_str()になってOption返すから必要なかった
let file = {|| path.as_ref()?.file_name()?.to_str()}().unwrap_or("foo");
なぜ昨日は気が付かなかったんだろう…… try block
ずっと待ってるあなたのことを
意味もなくクロージャで囲む日々 モナドられると、ややこしい人が顔出してくるんでノーセンキュー モナド(高階型)来てもいいんじゃない?OptionとResultで同じようなことやってるし オプショナルチェーンを矛盾なく繋げるモナドが入れば覇権だと思う
正直それだけできれば小難しい理論はいらないし チェーンってひとくくりにするなよ。メソッドチェーンは糞だが。 >>547
矛盾ってのがよくわからないんだけど
今のオプショナルチェーンだと何が問題なの? この板で否定的な言い分を魔に受けないほうがいい
冗談で言ってるか、冗談みたいな馬鹿の言い分だから たかが乳ですら意見割れてるのに関数型の話がまとまるわけないな うまいことドメイン駆動設計をオブジェクト指向から切り離せないかな?
Javaでアーキテクチャを考えると、「このコードはどこに書くべきか」がずっと分からなくなる
関数のシグネチャ読めばそれがMなのかCなのか業務ロジックなのか入出力なのか、全部分かるように書けないものか スレチ? それどもRustで考えてるのかな
JavaでもC#でもシグニチャ読めばMなのかCなのかくらいはわかるように書けると思うが
それはいいとしてDDDの本質はOOとは関係ないよ
Functional DDDの本がScalaとF#を例にしたのがそれぞれ出てるから読んでみるといいかも
F#のほうの著者のサイトみればRustのEnumでも同じような事できるのがわかるはず
https://fsharpforfunandprofit.com/ddd/ Vulkanが公式でRustをサポートしてくれればRust製のゲームとかもっと出てくるのかなぁ enumの配列はメモリやばい?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0eeab60af9f7385db00275b2d168ac2c >>564
enum MyEnum {
Foo,
Bar(i32),
Baz(i32, i32, i32, i32, i32),
}
今のRustはEnumの一番大きいvariantに合わせてメモリを確保する
Baz(i32, i32, i32, i32, i32)が、4バイト x 5 = 20バイト
どのvariantかを示すTagバイトで+1バイトと パディングで+3バイト=24バイト
配列の要素数が3なら24 x 3 = 72バイト 現職エントリ()のドワンゴや
タイ全裸Wantedlyの推してる言語って時点で使う気起きなくなるよね >>567
タイ全裸Wantedlyでググろう
Wantedlyがタイで全裸になったわけではないが
企業としては全く信用できん どんなに「こんなに素晴らしい機能がある言語!」とか言われても
「でもあの個人情報お漏らし泥箱や現職エントリ()ドワンゴとかDMCA乱用のWantedlyとかが推してる時点で……」ってなるのが
正しい社会人としてのあり方 >>565
つまりどんなenum作るでもたくさん値を持たせないほうが余計なメモリ使わずベストってことか アンチドワンゴがみんなC言語使ってると思うと抜ける まあ正直、いまだにえんじにゃーのファッションって部分がでかいわな。 他人がなに使ってのかチラチラ伺いながら自分の使うもの決めるのか
小物すぎるだろ >>574
つっても現職エントリ様やタイ全裸と一緒にされたくはねえしなあ それらの企業はRustなんか採用する前からボロボロだっただろ。 んでもって一発逆転をねらって水物のに飛びつくっていうアンチパターンね。 https://github.com/woboq/qmetaobject-rs
このcrateの中で"rust!"というマクロが使われてるんですがクレート内や依存するクレートの中を探してみても定義してる箇所が見つかりません
どこで定義してるのかわかる方いませんか? >>581
なるほど、マクロの中で独自の擬似的なマクロを定義してるって事でしたか
そんな使い方があるなんて思いもしなかった
ありがとうございました! マクロの中で独自マクロ定義とか、、、
そんなことされたら俺の脳はメタメタにされてしまう。 C++テンプレートの悪夢を再現しようとしてる人たち C++を理解したプログラマーはRustを使う必要がなく、C++が理解できないプログラマ―にはRustも同様に理解できない。
https://developers.srad.jp/story/15/02/20/2132207/ traitでコピーかムーブかの判断をするようにしたのはrustの最大の失敗だな。 >>586
5年前から何一つRustは進歩してないってことだよ
一方Nimは1.0迎えてどんどん進歩している
RustからNimへの流出もどんどん進んでる >>589
少なくとも = をオーバーロードもしくはオーバーライドするようなやり方は
すべきでなかった。 生産的というが、Rustが言語として生産的なことは過去にあったか?
それよりはNimへの乗り換えという前向きな選択肢を出すことの方が生産的だと思うが >>593
そうでないならどうする?
pros/consは何? 個人的にはC/Zig/C2・C++/D/Rust・Go/Nimという棲み分けだと思っているので別にという感じだ
まぁそもそも論としてNimの話したいなら次世代言語スレかNimスレでやれよという気持ち
せっかく専用スレあるのにメインユーザーにすら使われないとか可哀想すぎるでしょう? NimはPythonでパフォーマンスに困ってる人にはいい言語じゃないかと思う。Pythonスレで宣伝してくればいいのに。
Rust使ってる人が移行したくなる要素はあまりない気がするけどな。 >>596
んな簡単に示せたらおれが言語作ってるわ。
とりあえず言えることとしてはこの辺の明示性に関しては明らかに c に劣るってことくらい。 「すべきでなかった〜」とか断言したわりにしょぼい回答でがっかりだよ Rustの良さはCと同レベルの速さをキープしつつ
Cよりは安全にかけるところが良いのだから
言語についてごちゃごちゃ言うのは筋違い
多少面倒でも安全に倒した方が良いって人が使うもの インデックス1始まりの地獄はVBAでさんざん味わった
一貫してるとまた違うのか? RustはCより身持ちが堅いけどお作法と親戚づきあいが滅茶苦茶面倒な嫁って感じ
NimとPythonは巨乳姉妹で姉は大学生、妹はフリーター
Perlはヤンデレ妹 まあ確かにC++のauto_ptrと同じミスをしてるとは言えるよねCopyトレイトに関しては
こっちはCopyトレイトになれるものが相当限られてるのと
コンパイラがC++よりわかりやすいエラーを吐くことでギリギリ妥協の範囲を攻めてる感じ?
まあ全体的にはauto_ptrよりはマシだと思うよ
許容できるかは人次第だけど >>601
いや全く逆のことを指摘してるんだが。
もっと面倒でもコピーと参照については明示性のある記述方法にするべきだったのでは
ということを言っている。 >>605
横レスだけど >>601 はRustとNimについての文脈であってCopyトレイトについての文脈じゃないと思うよ 自転車置き場の屋根の色は何色にするべきか?と同レベルの議題にしか見えない
せめてどんなコードを読んでor書いてそう思ったのかを言えよ。主観の元になった客観をよ アワビやウニを獲りに行くのに
アクアラング使うか素潜りかの違いでしかない それなら「アクアラングより素潜りのほうがよい」ということになるが…
自転車置き場の例えはそういうことじゃないが。 async来たけど、普通のプログラムには必要ないよね? 平均以上の学歴で
平均以上の収入で
平均以上のルックスの人が書いた、
平均以上に速く
平均以上に小さく
平均以上に美しいプログラムのことだろ お前らってRust使って何作ってんの?それともただの言語マニア? jsで15分でできるようなものを3時間かけて作るバカ >>625
三時間ならマシ
コンパイラと格闘して一日つぶれるとかザラ 開発サイクルが遅くなってデメリットが上回る
仕事で使うアホはいないと思う wasmて
ウェブブラウザアプリでRust的な安全性ガッツリ必要なことあるの? てかメモリ安全なスクリプト言語さえまともに使えないやつに限ってrustとか騒いでんだよね。。
バカバカしい。。 コンパイラより自分の腕を信じるって…
やっぱりジャップにはかなわねえや てか で始める
限って によるガバガバなレッテル貼り
クソバカ Cなら3で済みことを馬鹿に合わせてRustで20かけて作ることの意味があるのかどうかが問題だ イニシャルコストだけ論じても意味ないしょ
作って終わりの製品もあるのは確かだだけど >>641
ランニングコストも同じだよ
何をするにもコンパイラの機嫌伺いから入る必要があるんだから そんなこと言うなよ
コンパイラちゃんはどこが悪いかいつも教えてくれてるんだぞ
コンパイラちゃんの気持ちも考えろよ Item1とItem2で同じ構造しててそれぞれに似たような処理をしているのにItem2にだけCloneつけろとエラー出るんですが
理由がわかりません
エラーが出るコード
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=39e9b4899374d1aca90c64836d71c161
Item2にだけCloneつけて動くコード
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=568c3f827c59a417f8d1c0f91b6bc9e4 >>645
vec!マクロで要素数指定する形はその型がClone実装してないとだめ
Item1も要素数指定すればCloneを要求される
let mut vs = vec![Item1 {a: 0, b: 0};10]; >>646
説明ありがとうございます
理解しました! >>643
そんな短絡的なことを言っているんじゃないよ コンパイラがやかましければプログラムの質が上がるっていう
短絡的なこと言ってるのはどっちだか 安全な言語を開発するようメーカーの方に心がけていただき、
kidsが安心してプログラムできるような、コンパイルできるような世の中になってほしい。 「Rust言語」をWindowsプロジェクトに適用してみた、Microsoftの事例
https://www.atmarkit.co.jp/ait/articles/1911/12/news050.html
欲しい機能がまだまだある、Rustコミュニティーとも協調
Rustは比較的歴史が浅いため、Microsoft社内の開発に使うことを考えると、よく使う言語機能であっても欠けているものがあるという。
その最たるものは、安全な変換(“プレーンな古いデータ”型をrawバイトと間で相互に安全にキャストする)やCスタイルの共用体の安全なサポート、誤りを許容する割り当て(割り当ての失敗でパニックに陥らず、所定の手順で停止する)だ。
Cargoには優れた単体テスト機能が組み込まれているため、開発者が本番コードと同じファイルにユニットテストを記述して、開発中に簡単に実行することができる。だが、Microsoft社内の大規模で複雑なビルドシステムでは、Cargoをビルドツールとして利用できない。
そこでCargoチームとの間で、複雑なビルドシステムを持つ大企業がCargoを利用できるようにするための話し合いを開始している。 「誤りを許容する割り当て」ってなんだ?
malloc失敗した時になんか処理したいって話? >>652
fallible allocation (fail gracefully from allocation failure, rather than panic).
https://msrc-blog.microsoft.com/2019/11/07/using-rust-in-windows/ >>649
そんな短絡的なことを言っているんじゃないよ 口で説明できないことは
大体は説明するとすごくろくでもないことだ おまえが理解してると信じ込んでるものが真実だという保証は一切ない 欠点を論うだけの雑魚に対し、フィードバックして改善しようとするMS様は立派だな
現場でも文句ばかり垂れてるお爺さんいるよな 何にも言わないで偉そうにしてるだけのやつが言うセリフじゃねえええええええ > 何にも言わないで偉そうにしてるだけ
なぜバレた!? MSはCargoでどういう場合困るんだろ
小さいものしか作ったことないし技術力も低いからわからない… GoogleのBazelみたいな分散環境でスケールする独自のビルドシステムを持ってるから
cargo testとかやった時にcargoのインクリメンタルビルドの仕組みじゃなく
自分たちの仕組みと連携させたいってことなんじゃないかと >>651
「使ってみたけどやっぱダメだったわ」をオブラート10枚くらいに包んだ
奥ゆかしい日本語の記事って感じだな Copyトレイトはプリミティブ型のように値としてコピーされるのが自然な型に付ける
コピーされるのは自然でない型でコピーをしたい場合にCloneトレイトでコピーを行なってると明示できるclone()メソッドを使ってコピーする あっちの企業って大企業でもOSSプロジェクトが使えると判断されたら支援もするけど日本じゃさっぱりだよな >>665
ほとんど英語記事の翻訳なんだが日本語訳された結果も
配慮してくれるなんてすごいな〜 近いうちにマイクロソフトはMustを発表するんだろ >>666
せめてCopyトレイトのドキュメントぐらい嫁や 確かにマイクロソフトならこのくらいの言語なら勝手に作りそうではあるな。
そもそもの実装系がカスだし。 MSがネイティブでゼロオーバーヘッドのF#を出したら用済みだね D言語のdebugブロックみたいなデバッグビルド時のみ有効になるコードブロックってRustにあります? &strに含まれる各文字のUTF-8のバイナリ表現を
文字単位でprintしたいんだけどもう少し簡単な方法ない?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=95162e453b679ff50c779695e9b545bf
&strをchars()でイテレートすると
char.encode_utf8でUTF8に戻するのがなんとも気持ち悪い >>681
char_indicesでイテレートすればposと(char.len_utf8で)lenが取れるから、それで元のスライスにアクセスする、とかかな。
そんなに短くはならないけど、bufferはいらなくなるはず。 >>682
なるほど
このやり方のほうが素直な気がするね
とりあえずありがとう
let baz = "aあ🦀";
for (pos, char) in baz.char_indices(){
println!("¥n{}:", char);
for byte in baz[pos..pos + char.len_utf8()].bytes() {
println!("{:b}", byte);
}
} rustも32bitのwindows向けのメンテやサポートは終了が確定してるよね… 2次元配列から最大値を有するデータ(with index)を取り出したいとき
イテレータのmax_by等を二段がけにするのと
従来プログラミング言語のように二重のforループで取り出すのと
どっちがおすすめ? forでやるとmutな変数の更新を自分でやることになるから安全性が落ちる
更新ミスによるデバッグコストのリスクがある 変なやり方するより自然なfor使った方が
結局は可読性によって安全性やデバッグコスト低下になる。 こういうお爺ちゃんはほんと迷惑
長いというだけで関数に切り出したりするし テストが書きやすい単位で分ければそう長くもならんだろ テストが書きやすい単位で分ければそう長くもならんだろ 組み込みのCだとアセンブラを意識して減算カウンタでdo...while使ったりするけど
PCでそれはないな。イテレータが使える状況なら使ったほうが安全だし >>689
いや長いならキリ出せよバカ。
こういうバカが一番迷惑。 関数切り出しがダメなのかRustでは
おじいちゃん驚きだわ
理由を何なの?
シャドウイングあるからとか? 競プロで見かける色んな人のコードでは
forループのほうが自然なとこを無理矢理イテレータのメソッドチェーンにしてたり、その逆があったり 読みやすさが犠牲にならない範囲で短く書けるってことはよいことだけど
高階関数とかクロージャがまざるとトレースがめんどいのは確かだよね
デバッグ時にいらいらする >>685
1. 2重forループ
2. forループ + max系
3. fold + max系
の3択になると思うんだけど並列化も考えるような処理なら3がいい
そこまでの処理じゃないならメソッド抽出してテストを書いとけば中身はどれでもいいと思う >>696
長いだけで切り出すメリットがない
>>697
スコープが広くなるからだよ 関数切り出しでスコープが広くなるとか、プログラミング言語として致命的な欠陥だろ 切り出すと特定の関数から一度しか呼ばれない関数がででるから、
それが無意味というか、むしろ関数のシンボルが増えるし
上から下に連続的にソースコード読めなくなるしでダメだと言っているのだろう
でもそれってRust以外の言語でも同様の話であって、なぜそれでもなぜ切り出すべきかは語りつくされてる
それでもRust固有の事情で反論があるなら書いてくれ scanとかinspect使う処理はforの方が読みやすいこと多いように思う >>705
全くあなたの言う通り、そしてRust固有の話ではない >>705
関数切るとその分だけ借用とか生存期間とかの問題が増えるんよ
関数跨いだ変数の扱いが非直感的すぎる
関数に分けるとコンパイル通らなくなる事例が多すぎるから
関数分けないモチベに繋がる 行儀の良くないプログラミングスタイルが
コンパイラに怒られてるだけに聞こえるなあ
例出してよ >>707
長い関数書いてるかうちは半人前
うちのプロジェクトなら即リジェクト
深いネストもリジェクト まあバカにrust使わせるとどうなるかってことがよくわかる事例だな。 グローバルな型推論が無いのと型シグネチャが人に全然優しくないことに起因する、関数大きくなりがち問題はRust特有ですよ
最初から完成形があるわけでもないのに試行錯誤のコストを無視しちゃ駄目だ >>708と>>712でピンと来ないならRustエアプ 確かにimpl traitなかった頃のクロージャ返しとか、asyncなかった頃のFuture返しとかは煩雑だったけど
現時点でそんな大変な型シグネチャってあるか? >>708
> 関数に分けるとコンパイル通らなくなる事例が多すぎるから
悲しいけどわかるw impl trait がない時代しか知らんのだろう バージョンアップごとにリリースノート確認するくらいの手間をかけろ んな手間かけるくらいならまともなテストコード書くほうが
よっぽど安全性上がるわ。
バランスがおかしい。 >>708
C/C++では関数分離は大事なこと考えずにやってたのかな?バグバグバグ リリースノート一回読む程度もやらない人が
Rustコンパイラと同等な網羅テストを毎回書けるとは思えんけどな。 関数に抽出するからというよりも
関数に抽出してジェネリックにしようとすると簡単にコンパイル通らないことが多々ある
例えば少し前に出てた2次元配列からmaxとindexを取得する例だけど
main関数から、配列やVecを受け取って結果だけをprintする関数を抽出したり
foldに渡すクロージャを関数として抽出したりするのに一苦労
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=160e0290cba2c67d8090326a54c7ab62 >>726
デバッグしてあげました
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=31427b62cf0ac30ea340084d6b7e515e filter_mapしゃんを使って書き換えるのは諸君らへの宿題とする >>727
ま、ありがとう
超バグってたね
ちょっと手直し
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=be7300d6fb44b350f1b190fa79e88d6a filter_mapしゃんをご存知ないのでしゅか
バグを出しにくい安全設計とはこうしゅるものでしゅ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=5c184061ecdc7537d8eb8ccc1c146238 真の安全性はunwrap_or(init)なんて与えないことなんでしゅがね
取得したインデックスを使うことがある場合は空の2次元配列で死にましゅよ インデックスとして使わなくても嘘の結果が表示されちゃうからOptionのままにして適切に表示を分けないといかんでしょな Rust用にソース書くときに結局Cでどうなってるか意識しないといけないのなら
最初からCで書いた方が良くね?ってなるよね そういう世界もあるかもしれないけど意識しないでしょ
Cで書いてたって、Cでどうなってるか意識してないじゃん そんなら最初からアセンブリで書いた方が良くね?
ってなるじゃん
アホくさ うちは新しいコンパイラ出たらチームで逆アセ眺めて品評会してる コンパイラだって人間が作った物だ。希に間違える事はある 朝起きたら一杯のアセンブリ茶。
毎日欠かしたことはありません。 Clangで組み込みをする場合はアセンブリを見るがRustでWEBやCLIを作るときはあまりIRは気にしないな
Rust書いていてClangを意識したことは一度もない。普通LLVM IRだろ 低レイヤー向け言語だけど低レイヤーは触りたくないという
よくわからんユーザー向け言語 出来て当たり前の事をやって「やったぜ!」→「いいね!」になるのが今の日本
他の人がやらない事をやる人は「奴は特別だ(俺は出来なくてもしょうがない)」とレッテルが貼られる
アセンブラを馬鹿にする奴をしばしば見かけるがマイコンとかだとアセンブラが使えると可能になる処理ってまだあるしな Rustグラマの平均年収3000万くらいいってそう
マイクロソフト、「Rust」試用は概ね順調--不足する機能にも言及 - ZDNet Japan
https://japan.zdnet.com/article/35145098/ 小学校高学年から中学二年くらいまでのアセンブリをペロペロしたいです >>746
巨乳がそんなにいいとは思いませんね、貧乳こそ正義 >>747
これちょっと使いづらいよね
移植ものだからかな
ラッパーが欲しくなる rustの親切コンパイラに慣れちゃった人は
他言語でもrustの親切コンパイラ感覚で雑なコーティングで不親切コンパイラを使ってバグを生み出すマシーンと化す
rust以外使えない体に… アホな書き方するとすぐ怒られるから
むしろまともになるのでは これ前のニュースと同じじゃね?
windowsの開発に利用するのに必要なカスタムしてるだけだろ。いち利用者として。 RustってDCTのイメージ
ポルシェとかフェラーリが使ってるあれ ライフタイムパラメータの省略だったり、
derefやcopyをtraitで暗黙的な動作にしてたり
そういうのがバグを生みやすいってことわからんのかね。 >>765
前のニュースとは違うね
https://vimeo.com/376180843
- 現状はProductionレベルのruntimeが出来たところ
- プロトタイプレベルのインタプリタとタイプチェッカーもある
- コンパイラはまだ開発を始めてない
- 数週間以内にGithubに公開
前のやつも動画公開されてたけどあんまり中身なかった
https://youtu.be/o01QmYVluSw?t=1228 要約すると
M$「Rustゴミだけどコンセプトはいいからコンセプト部分パクるはwww
OSSなんやし文句は言わさんwww
あ、俺はライセンスで売るけどなwww」
か やってるのはMSの研究部門
この部門は幾多の研究をしているが直接製品になるものはとても少ない、研究部門だから
たんにRustにダイブして良し悪しを知ろうとしているだけ 昔MS Researchがハードウェア記述言語向けの開発ツールを本格的に作るって言ったことがあってすごく期待したんだけど、
結局大した成果もなく立ち消えになったのを思い出した…。 昔二羽ンゴが動画配信向けのFPGAを本格的に作るって言ったことがあってすごく期待したんだけど、
結局大した成果もなく立ち消えになったのを思い出した…。 たくさん失敗しないと成功できないしどんどん失敗して欲しい MS Researchって「Winodwsを置き換える新OS作るぜ」とか言ってた事もあるんだぞ
現状はご存じの通りWindowsはいまだ健在
MSのポストWindows「Midori」の構想が明らかに
https://www.itmedia.co.jp/anchordesk/articles/0807/30/news076.html OCaml.NETことF#さんは一定の評価を得ているイメージ 現在開催中のAI Cup 2019というプログラミングコンテストにRust使って参加してRustの強さを知らしめようぜ!
https://russianaicup.ru >>781
だって結局Rustじゃ何も作れないんだもん とりあえずGUIフレームワークとゲームエンジンを・・・ Rustみたいに開発効率良くてデバッグもし易い言語ωなら
GUIフレームワークもゲームエンジンも爆高速で開発出来るよね ゲームエンジンはAmethystとかggezが頑張ってるのかな
GUIは作りかけができては放置されるの繰り返しであまり進まないね
moxie-native 試そうとしたけどビルド通らんかった ライフタイム見直したら結局structから設計し直しとかそんな感じになる。
それが開発効率を下げてる。 Azulつかっていたがクロスプラットフォーム対応が辛くてやめたわ
今はデカイ変更を加えているようだが頑張ってREADMEの内容ぐらいは完璧にして欲しい このコンテストにRustで参加して優勝してRustのすごさを世間に知らしめようぜ!
第5回 Asprova プログラミングコンテスト
https://atcoder.jp/contests/asprocon5 もう少しコネクション保持したサーバープログラムをどうすんのとかサンプルほしいわ。 それはそうだが、オブジェクトの寿命を意識したプログラム例として参考にしたい。 サンキュー。これでよさげ。listener周りが参考になりそう。 Rustはまず名前変えないと無理だろ
Rustってググってもゲェムしか出てこねぇよ Rustでググってもほぼほぼ言語のことしか出てこない
グーグル先生のカスタマイズ次第やろ MSみたいな大企業的にRust(錆)ってネーミングは敬遠するんじゃね そんなの気にしないって
しょうもないゲン担ぎを気にする日本企業じゃあるまいし メソッドとかに副作用を明示出来る構文あったりする?(引数のmut明示以外の副作用で) orbtkが0.3.1alpha1になっていた。native, elctron,browserに対応していて、どれも一発で動いた。windows, Linuxで検証。 >>808
winでサンプルさくっと動いていい感じだけど、もうちょっとネイティブな外観が欲しいんだよな
今はC#かPowerShellで書いちゃうけど DCESみたいなオリジナルのecsと違う技術的に説明すらされてないオレオレecsが増えてゆくな。 Rustいまいち盛り上がらんなあ
どこもGoばっか使いやがってコノヤロー >>814
リアルタイム性が重要でなくて、
そこそこの実行速度でよければGoでいいじゃん
競合しないと思うが >>815
そもそもプラットフォームにWebを選んだ時点でリアルタイム性や実行速度はそこそこで十分だからなあ
それらが重要になるのはもっと保守的な領域なので、Rustとかいうポッと出の言語は知られてすらいない 【急募】Rustでwebサーバー建てるお仕事〔ゲーム会社除く) 世界が必要としてるのは新言語ではない
Innullable Javaだ >>817
url貼らないけど自転車本の著者の一人がそれやってる会社にいる Webって技術的には正直面白くないからなあ
だからリビドーを持て余した連中は変な言語に走る じゃ、orbtkがWindowsでうごくとこ動画で見せて 取ってきて cargo run --example ... するだけなのになんで動画? example動かしてみたけど
これはゲームUI専用のやつなんだな
OSのウィジェット使ってないからクリップボード使えないし
日本語入力も出来ない C ABIから使えるネイティブウィジェットのGUIツールキットTcl/Tkが候補に挙がるくらい少ない そこまでメモリ管理にシビアなプログラムの需要が日本にはもうない。 Iced も example tour 見てみた感じよさそうに思った
ただご多分に漏れず日本語は入力できない(□になった)
難しいんかね ttps://github.com/hecrj/iced/issues/103 >>833
あんまり詳しく見てないけど、Elmと同じモデルを採用してるというのがセンスいいね JavaScript 今から覚えるくらいなら Elm やれ もじらが作ってmsがおうえんしてくれてふだろ。
で?elmは?w erlang見て小ルーチンええな〜言ってるレベルだがな。 TEAベースのKaguraもよろしくお願いしますね プロセスはスレッドが別のこともあるけど、別スレッドで動作するものをふつうコルーチンとは呼ばないね。 ほなコルーチンと違うかぁ
もうちょっと詳しく教えてくれる? >>832
兵器産業ではあるあるかもしれん
現行F-2のFBWのコードは小さいROMによく収まったなあという意味で芸術品との噂 Rustクソむかつく
訳わからんとこでエラー吐いて遅々として進まない >>852
今はどういう段階なの?
ブートするだけ? >>849
Rust難しいけど相応の対価はあると思うぜ なんか,外部クレートを取ってこれなくなってない?
サーバ側がバグってる? C系のワンラインifや?演算子は悪しき文化だと思うこの頃
最近書かれたOSSのコードにも多用されていたりするから笑えない
もちろんRustでそんな邪悪な書き方は許されていないけど ?演算子が無いとこれができん↓↓↓
const int y = (x > 0) ? 1 : -1;
if文を使うと
int y;
if (x > 0) {
y = 1;
} else {
y = -1;
}
となってyがmutableにせざるおえない >>859
Rustは糞だな
それが好きならお前が整形ツール使えばいいだけの話
>>860
> let y = if x == 5 { 10 } else { 15 }; // y: i32
https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/if.html すまん、言い忘れたが、俺は出来るだけ ? を使う派だ そんなカスな書き方にこだわるくらいならconstでなくても困らんくらいに関数きれや。 C
x = y == a ? A : B
x = y == a ? A : y == b ? B : C
Python
x = A if y == a else B
x = A if y == a else B if y == b else C
優先順が判りにくい >>863
俺は切ってるけどな。
が、こんなところで言い争いをする意味もないので、Rustはどうかと思ってFireFox見てみたが、
SpiderMonkeyは思いっきりC++じゃねえかよ。Rustってどこに使われてるんだ?
https://hg.mozilla.org/mozilla-central/file/d5843cae64d30255b242d051888e99bef3de5c05 まあ実践的なコードになればなるほど、
mut, unsafe, refcell使いまくりだからな。。 >>866
とりあえずservoディレクトリの下はRustだと思うけど。 >>849 俺も、昔C言語で苦しんだな。誰にも教えてもらえないし、しかしその分人より詳しくなったよ。
C言語に詳しくなるって事は、弱点も知ることになる、そしてその弱点からどう逃げるか?そういうことも考えるようになる。
Rustの逆引き辞典みたいなハンドブックがインターネットに転がってないかなぁ moveのコストってみんな気にしてる?
Cだったらポインタ渡すだけだったり
ポインタを返すだけだったりで最小限な感あるけど
rustじゃポインタ中心でやりくりしないよね コンパイラの最適化で消えるんじゃないの?知らんけど
moveコストが気になるってどんなプログラムか想像付かないけどゲームとか? 普通moveコストが気になるほど巨大なものをスタックに置かないのでは。
あとCでポインタ渡すケースなら普通は参照渡しだろうし。 そやったね失礼
参照があったわw
初心者まるだしですまそ >>867
つまりRustは実践的でなく、FireFoxが沈みつつあるのはそのせいだと。
>>868
servoって何ぞ?と思ったらGeckoと交換か。
見た目if文多用の旧式コードに見える。
それだけで駄目なわけではないけど、CのOSSと粒度は同じだと思う。 どちらかというとCと同じ抽象度で書いても安全性が担保されることがRustのメリットでは。
より高い抽象度の操作しか許さないから安全、ってのなら他にいくらでも選択肢はあるわけで。 >>876
ご意見ごもっとも。
ただ、例外的とされている仕様を日常的に使用せざるを得ないのは、
言語の仕様(思想)または適用範囲(用途)を間違えているからだ。
「安全なC」を目指すのも一見良さそうにも見えるが、実際のところ、
Cが問題になるのは馬鹿が書くからであって、いわゆる「駄目なコード」はOSSには存在しない。
(正確には「駄目なコード」があるとメンテ不能となって淘汰されるから、
生き残っているOSSはメンテ可能状態=駄目なコードがない状態に保たれている)
この意味では、Cを馬鹿よけとして使っているLinusのやり方が正しい。
「非安全」だから使うなとされている機能を常用するのならRustを使う意味がまるでないし、
コーディングがしにくいだけの単なる「意識高い系ドM」でしかない。
当然、プロジェクトは沈没していく。
一方、ロシアは鉛筆を使った、に近い。 >>871
C++の話で申し訳ないけど
std::vectorとかは実装によっては
(利用者側の実装もvectorの実装も)
めっちゃ効率悪くなる罠を孕んでる >>877
どこの世界の話?
Cで書かれて開発体制もしっかりしてても
頻繁にセキュリティホールが報告されてる
OSSは結構あると思うなあ >>880
Rustはどんな馬鹿が書いてもセキュリティホールが存在し得ないとでも?
多分お前はセキュリティホールが何か、すら分かってないと思うが。
むしろお前みたいな馬鹿がRust使う意味なんて全くないはず。
俺やRustの言う「駄目なコード」はそこではないし。
お前みたいな馬鹿でも分かる話をするなら、
現実として、もっと上位の記述しか出来ないPHPでもセキュリティの問題はやらかしまくってるだろ。
あれは『ホール』と呼ぶべきかどうか、という話はあるにしても、
低位の『ホール』だけ塞いだところでその上位でいくらでもやらかせるのでそれ自体に大した意味はないんだよ。
それ以前に、Rustが低位の『ホール』を全部塞いでいるかどうかなんて俺は知らんが。
あれはPHPerの頭が悪いせいにされているが、お前らがWebやったらもっと酷いことをやらかすのは確実だ。 あんたのいう駄目なコードの定義なんて誰も知らないだろ まあ静的チェックで仕事終わりにできると思ってるバカは多いな。
そういう馬鹿が一番厄介。あの手この手でテストしない理由をこねくり回してくる。 >>881
一行目から自分が暗黙にも書いてない内容ですね
残りはゴミ >>884
ではどうだと?はっきり言ってみろ。
俺の意見としては、RustとCでセキュリティガー、ってことにはならんよ。
あれは書く側の問題で、言語の問題ではない。 >>885
はっきり書いてあることと関係ないこと喚いてるだけじゃん >>886
日本語が不自由なら半島に帰れ
日本語が出来るつもりなら正しく伝わるように言え
Rustで書かれて開発体制がしっかりしているはずのFireFoxでも、
糞遅くてシェア落としまくりで最早ゴミになりつつあり、
セキュリティホールが存在しないって事もあり得ないと思うけど。
CとRustの対比で「セキュリティホール」を持ち出している時点で意味不明だが、
お前が言っていることに直接言及するならこうなる。
これには反論出来るのか? >>887
また関係ないことばかり書いて…
どっちが日本語不自由なんだか >>888
一応聞いておくが、>>880はお前だよな? 問題を起こさない人が書いたコードには問題がない
という主張になんの意味があるんだ
そりゃそうだろとしか言いようがない
そんな人間はいないという前提にいないならばプログラマー同士の議論にはならないだろ >>877
お前のレスの C の部分をを他の言語にしても内容変わらないね。
つまり意味の無いレスだ。 自動車で考えると、自動運転が進むと自動車が優秀だから馬鹿が運転しても事故が起きない。
「馬鹿」は運転するなと?
「馬鹿」と言い切ってしまうから、問題がややこしくなる。感情的になるような気がする。
馬鹿除けとは、微妙な表現だ。 微妙だが実際linuxはそれで成功してるしな。。
馬鹿よけがびっくりするほど効果的だったという事実。 >>892
> 「馬鹿」は運転するなと?
yes。DSL(例:Excelのマクロ)やアプリケーションレベルはやればいいが、システムレベルは止めた方がいい。
(一般的に滅茶苦茶切れると聞く)料理人用の包丁を素人が使ったら当然怪我するし、
子供に包丁を練習させるときには主婦レベルからしても切れなすぎて使えない果物ナイフ等から始めるだろ。
技量に応じた適切な道具はある。
システムレベルなんてプロの領域だから、Cすら適切に扱えない奴がやろうとするのが間違ってる。
愚直にこれ、つまり駄目なコードを目で見てrejectすることにより上手く行っているのがLinux。
RustはCすら満足に扱えない馬鹿の為にありとあらゆる補助輪を付けて
馬鹿な素人でもシステムレベルのプログラミングが出来るようになっている、
と考えるのは日本人の勘違いでしかない。
というか、どんな馬鹿でもどうにかして使って人件費を下げよう、という日本流思想が根本的に間違い。
年収を比べれば分かるはずだが、海外はざっくり2倍、つまり2倍の生産性であることを意味する。
https://qiita.com/jabba/items/72c7f9202a1a0a5616fc
といっても、ここにいるような奴は、「隣の奴より俺の方が倍働いている」「俺は平均よりは上だ」と思っているだろうし、
実際そうだとも思うが。
が、まあ、それはさておき、結果的に海外のプログラマは日本で言う「平均以上」の奴らのみで構成されているはずで、
俺らが日常的に目にしている「馬鹿」レベルはかなり少ないはずだし、結果、逆の方向、つまり、
・Cを適切に扱える奴が、もっと生産性の高い言語を使ったらどうなる?
を目指しているはずだ。だから必要であればunsafeを躊躇なく使うし、それでも問題ないわけで。 そもそも何でもかんでも馬鹿中心に考えるのは馬鹿の思い上がりであって、
例えばGCにしても、「GCが無いとリークしまくる馬鹿の為の補助輪」ではなく、
「メモリ管理の煩わしさからプログラマを解放する」為の物であり、当然暗に「その先」を目指している。
だからそもそもCすらまともに使えない奴がRustを使うのが間違いで、
(実際どうかはさておき、目指しているところは)Rustはより生産性が高いというわけだから、
基本ラインとしては,、「Cだとメンドクセエ」「Cだと俺の理想のコードにならねえ」と思う奴が使う言語だろ。
つまり、本来は、問題を起こさないようになってから使う言語だよ、Rustは。 そのキータには、日本人は同じレベルでも給料が安いと書いてあるようだが enumがヴァリアントの最大幅とるってどういう原理?
structはCより最適化されてるよね 馬鹿を自覚できてる人なら
必死の長文を連投したりはしないんだろうな 最近このスレを見始めて、過去ログから見てたんだけど、Cargoで不満言ってる人いるけど、理由って何?
単純に気になるんだけど、クソしか言ってないから分からん ファ!?マジでお亡くなりになってるやんけ
一体何があった? ざっと見たところ、クソコメがひどいからactixのメンテやめるわって事かな
ベンチマーク詐欺師、バグだらけ、俺のパッチを受け入れろ
と言われて炎上したのが原因か? なんで関係ない第三者が辞める宣言しとるんやと思ったら「辞めろ」のtypoか
ま、いうてすぐ別のフォークが誕生するやろ ハナホジー cargoは何でもやろうとし過ぎなのが一番のクソポイントだと思ってるけど、個人的には
・他のビルドツールと一緒に使うのが面倒
・パッケージマネージャとビルドツールが同じツールであることが非合理的
・昔は「crateはrustのコンパイル単位です」なんて戯言を抜かしていた
・rustcを改善するモチベーションが下がる
全部個人の感想だし、マンパワーが足りないならひと括りにするメリットはあったと思うけど、イケてないと常々思ってる 以前はcargoからリンカを制御方法とか全く判らなかったけど最近出来るようになったのかな Clangだから成功したと言えるのか?
Rustなどのモダンなシステムプログラミング言語があの時代にあればどうなったかは誰にも分からんだろ
リーナスがRustキチであっても他のプログラマとしての素質が変わらなければ成功したと俺は思うが
なんにせよ巨人の肩に乗ってマウントした気になっても万人がそれで納得するとは限らないし逆効果もあるぞ なんか以前書き込んだはずのレスができてなくてロードしたら送信されたっぽい
>>893辺りへのレスだが恥ずかしいからROMるわ、すまんな >>907
cargoの欠点答えてくれてありがとう
正しいcargoの立ち位置としてパッケージマネジャーの仕事だけして、今cargoがしてるビルドツールのラッパー要素を別にして、その別のでcargoとructcを単純に抽象化したら結構解決するってことかな? >>909
なにからなにまでずれすぎててどっからつっこだらいいのやら。。
clangとlinuxは全く関係ないし、
リーナスがrust推しだったらとかプログラムの好みからしてそれだったらlinux作っとらんしとか
どこからどこまでも間違ってるとしか言いようがない。
仮定としてできることとしたらc++テンプレートの信頼性が当時高かったらとかその程度だろう。
それでもc++を使うことはなかっただろうと思うが。 LinusにRustを教えたのがアワシロイクヤ氏だったのも良かったんじゃないか。
人柄だな。 >>909
お前は問題の本質が分かってない。
言語の問題ではなく、マネジメントの問題だ。
巨人の肩に乗ってマウントガーなんてのは、お前がコンプレックス持ちの馬鹿だからそう勘違いするだけ。
誰もそんなことしようともしていない。
駄目なコード片が混入した場合、何も保護機構がないCではプロジェクト全体が死んでしまう。
よって、どうやってそれを防ぐか、という話であって、Linusはアナログ的に「目で見てreject」をやってる。
それでLinuxは最も成功しているOSSの一つなのだから、これは結果的には正しい、とは言える。
が、当然これはデジタル的には格好悪すぎる。
よって各種言語は何とかして静的に検査をしようと、文法を拡充させてきた。
C++文法がゴテゴテになってるのも、Rustがやたらコンパイルが厳しいのもこれだ。
これで短/長期的な生産性を競おう、ということになっている。
さて、Linusの「馬鹿が書いたコードなんてイラネ」は「それ言っちゃおしめえよ」ではあるから、当然反発はされる。>>892もこれだ。
とはいえ、結果的にこれは単純には、
1. Cで問題ない奴はCで書く
2. Cでも問題ないレベル(安全装置がなくても問題ない人達)だが、Linusのやり方が気に入らないからコミットしない
3. Cでは駄目なレベル(安全装置があるから何とかなっている人達)だが、Rustならいけるかも?
で、Linuxは結果的に1だけでプロジェクトを動かしている。
その分、commit出来る人が減り、追従は遅くなるが、今のところ他よりまし、ということになっている。
一方、Rustで何かプロジェクトを起こした場合、2だけで構成するならLinuxを倒せるはずだが、3の人達の混入を防げない。
駄目なコード片の混入を防ぐのは、プルリク段階で弾くのがもっとも効率がよく、
一旦受け入れて問題が発生してデバッグだと1000倍以上の手間がかかってしまう。
よってこれはプロジェクトにとっては大問題で、絶対にやってはいけないのだが、これを防ぐことは今現在出来ない。
というか、今の言語はまだここまで進化出来ていない。 だからこれは、長期的には「どのレベルの人まで受け入れるか」「それで十分な人数が確保出来るか」であり、
C++を丸ごと切り捨てているLinuxは相当思い切った判断だが、それでも何とかなっているし、
結果的には、全く保護機構のないCだとこれが正解だ、ということでしかない。
対してRustみたいに安全機構が付いている言語だと、そのレベルを下げられ、結果的にコミッタも増え、早く進化していけるはずで、
だからこそ進化速度が重要なブラウザをターゲットに選んだのは正しいのだが、
結果的に死につつあるのだから、確実に何かが間違っていたはずであり、
それは既に言われているが「学習曲線」、つまりそもそもチャキチャキ書けないことだろう。
1,2の人達にとっては厳しい検査なんて足枷でしかない。3を救済する為に1,2に足枷をはめていて、
結果的に総合的な生産性が落ち、プロジェクトが死につつある、というだけの話だ。
だから、個人的には、正解は「C+外部検査(リンター)」だと思っている。
今で言うとTypeScriptみたいな、チェック機構外付けの言語とかだ。
静的検査が出来る=静的検査をリンターとして外部に切り出せる、でしかないから、
静的検査メインで言語を拡張するのはナンセンスだ。
(Rustはそうではないが) アワシロさんはそうは言ってなかったな。
むしろRustは普遍的にどこでも使えると説いてた。 Rustは銀の弾丸足りえると世界の重鎮が口をそろえるし、俺はお前よりアワシロイクヤ氏を信じるね。 ・論拠と解釈がオレオレ過ぎ
・安全性に対する理解が浅すぎ
・プロジェクトの成功/失敗に対する見識が甘すぎ
・面白くないくせにレス長過ぎ そもそもFirefoxのほとんどはC++なんだから、言語のせいにしたいならC++のせいってことでは。 まあlinusが良く言ってるようにじゃあそれで作ってみれば?って話なんだわな。
そして誰も作らないというのが答え。 >>919
成功したら俺の手柄、失敗したら相手のせいか。
さすがバヨク御用達言語だな。
Rustコミュニティの問題は>>905に典型的に現れているが、(なお俺はGitHubのactixのreadmeも読んだ)
> 「つまらないPRだな」と
> 上から目線のコメントを書き、
> 関係のない(?)人から「そんな態度でお前にRustを書く権利はない、辞めろ」と怒られて
他でも言われてるとおりSJWの巣窟になってる。
これは明らかに防げた問題でしかないだろ。
これから売りになる(はずの)モジュールを別言語で、というのはもっと慎重に行うべき判断で、
比較するとしたら、
・servoをRustで書いた今のFireFox
・servoをこれまでの言語(多分C++)で書いたFireFox
なんだよ。単純には人数的に多いC++を切ってRustを入れたのだから、これだけで被害が出る。
そしてそれを上回る物をRustが持っているか、といえば、ない。結果、沈没してるだけ。
Rust自体に意味がないか、時期が早すぎたかのどちらかで、どちらかは今後確定する。
それとは別に、コミュニティがおかしな方向に腐っている、というのは既に発生しているようだが。 servoって失敗してるの?
根拠かソース欲しいな >>925
servoの現状知らないから聞きたかっただけなんだけどなぁ・・・
他人を勝手に敵と思って攻撃するような人間で君(QWtapXFZ)を信頼できると思うのかな、他の人は。
長文先輩は興味なかったけどキモいな servoのコード見る限りはrustで書く意味なくね?って感じだがな。。
ほとんどunsafeコードだし。 Rustはコンパイルを通ればバグが無いことがある程度保障される。
それがC++やJavaに対するアドバンテージ。 >>928
それHaskellも言ってたけどな。
まあ静的検査で出来るところは静的検査でやるべきなのは事実。
C++もそれを目指してはいるが、結果的にグチャグチャになっている。
そしてRustもそれを目指してはいるが、
結果的に「Cだと全く問題なく動く、バグのないコード」でもコンパイルが通らずに苦労してるわけだろ。
それじゃそもそも話にならんだろ。
C++なら「やらない」という選択肢はあるが、コンパイルが通らないようでは回避しようがない。
そして全員に「Rust流」を強制することになり、これがSJWが蔓延る遠因なのかな、とも思うが。
Javaが良いとは言わんが、最も成功している言語であるのも事実だよ。
そこはわきまえた方がいい。今のRustなんてJavaからするとゴミ以下だ。
いずれにしても、俺は静的検査はリンターとして分離出来ると思っているから、
そこに差別化要因を求めるのは間違いだと思ってる。
コミュニティが機能していれば、本当にRustの静的検査能力が素晴らしいとなれば、
リンターとしてC++やJavaやPythonにポーティングしようとする奴は必ず出てくるし、技術的にも大して問題ない。
その後で何も残らんだろ、Rustには。 RustだJavaだとか比較する以前に
ちゃんとプログラ厶書いたか怪しいレベルなのがわかる 長文先輩がコーディングするわけないじゃん、机上の空論が大好きだから Cを問題なく書く人がRustのコンパイル通らないから足枷になっているという議論破綻しているような
潜在的の問題になりうるコード書いているからコンパイル通らないわけで
プログラムは動けば良いわけじゃないよね で、そういうコンパイルエラーが生じた際の処置の仕方に問題が起きやすいわけだよ。
バカだととくにね。
資源の解放タイミングなんかはだいぶグローバルな構造によってるわけで
コンパイルエラーのときに気づくようなバカがどういう修正を行うかだいたい予想はつくわな。 >>932
C書ける奴がRustを手こずる理由は、寿命管理の戦略が根本的に違うからだよ。
正確に言えば、Cの場合は
A. ブロックスコープと連動
B. 投げ捨て
のどちらかが大枠の戦略だけど、ちゃんとCやる人ほど殆どAでやっている筈。
Rustはブロックスコープです、と言っておきながら実はBを要求するから戸惑っているように見える。
ただ、なら最初からBで組め、というのは全くその通りで、
だから俺は「Rustなんて簡単さ」という奴が出てこないのも若干不思議に思っている。
とはいえJavaScriptも「プロトタイプが分からんからクラス入れろ」
「非同期では組めないからコールバック地獄ガー」となる奴等ばかりだから、
「人間は一度成功したらそのやり方にこだわってしまう」とは聞くが、俺の想像以上にそうなのだろう。
ただまあ、実際のところ、Cの場合は
> 資源の解放タイミングなんかはだいぶグローバルな構造によってるわけで (>>933)
の通り、その上位でそもそも「資源管理が難しくない構造」にしてしまうから、リークに困るって事はない。
実際、素人が作ったアプリでも、リークして困るって物は存在しないでしょ。
とはいえ、この「下部構造の為に上部構造をいじる」ってのはプログラミング理論としては最悪で、
これを何とかして回避しようとC++含めていろいろ努力してきているけど、
俺が見る限り今のところGCが一番ましな戦略だと思うけど。
ま、いずれにしても、C書ける奴もRustに手こずっているのは事実だよ。
それはググれば分かるはずだし、理由は上記の通りで、言い換えると、
C流でやろうとしてもRustは通さないから。
ただ、資源戦略はBよりもAの方が適切な場合が多く、デフォでB強制なのは根本的に間違っている気はするが。 LinuxがRustで書き直される時代に何言ってんだか。 redoxをlinuxの書き直しと言うのはさすがに無理がある ドライバーをRustで書くという話にLinusが
切れてないという程度 いずれにしろC/C++のような不安全な言語は極力避けようと言うのが世界的な流れ 別に切れちゃいないが「まあ無理だろw」みたいな感じだろね。
https://www.youtube.com/watch?v=CYvJPra7Ebk
こういう言語でなんとかしようって馬鹿な話はSIerがさんざんダメだってことを証明してるのに
バカはまだこだわってるんだな。 でも使う言語にこだわらないでいると、化石みたいな生産性で競合と戦うハメになるよ SIerなんてそもそもJava, PHP(笑)でゴミみたいな質のソースと、ゴミみたいなレガシー設計を量産するのが関の山だろww 日本なんて情弱経営者ばかりだから数字さえ良ければ許されるだろ
実際はゴミクソの低能率作業が横行していようがどこ吹く風だ ゴミを作れば片付ける必要があるし、作り直しもあるから金になる actix-webの件はどうなるんかな
Rustが原因なわけじゃないけど、コミュニティの問題として見られるだろうし、使ってる側としては気が重い >>959
メンテナがMS社員で
MS内部でもactix-webをproductionで使うプロジェクトが進んでた
そういう状況でunsafe叩きに嫌気が指してメンテナが降りたのに対して
MSはサポートに乗り出さないのだろうか?
と書けば理解できるかな? MS社員はろくなのいないよな
メンタル弱かったらOSSすんなよ 一人がそうだからって全てそうと言える頭どうなってんだろうな 天文学者と物理学者と数学者がスコットランドで休暇を過ごしていた。列車の窓から眺めていると、平原の真ん中に黒い羊がいるのが見えた。
天文学者:なんてこった!スコットランドの羊はみんな真っ黒なんだね。
物理学者:違う違う。せいぜい何匹かが黒いだけさ。
数学者:(天を仰ぎながらやれやれという調子で、抑揚を付けて)スコットランドには、少なくとも1つの平原が存在し、そこに1匹の羊が居て、さらにこっち側の片面が黒いということが分かるだけさ。 >>963
いいえ
Cの真髄はメモリ破壊のデバッグにあります >>965
メモリセーフなRustでは不可能な(あるいは可能だが困難な)ことがCなら出来るって意味? Cを完全に理解していてCで完全なコードが描けるならRust要らん
逆は無理 何万行書いても一切ケアレスミスしない人とかもはや人間ではないのでは… 人の命がかかってる以上、高々数万行でミスを犯すわけにはいかないだろ。 そんなクリティカルなところにCなんて不安全な言語は使われない 完全な仕様が書けるなら
その仕様を完全にテストすることも可能だろうし
その範囲内で完全だと言えるコードは書けるだろう
それは仕様で定義されてないからUBですねー、バグじゃないっすよー
あの時はそれで完全だと思ってたんすよねー(๑´ڡ`๑)w 「人間の能力は有限であるし、ミスもする」と言う認識がない奴ほど危険
このタイプ日本人に結構居るんだよな >>975
じゃ試しに君が考える「完全な仕様」の仕様を定義してみて 「俺は気を付けて書いてるから絶対ミスしない」なんて認識の人が書いたコードに命預けたくないなぁ。 そこまで安全性気にするならGC使えや。
バカがrust使うよりもよっぽど安全だぞ。 >>978
でも「俺は神様じゃないからミスはあるかも」なんて認識の人が書いたコードにも命預けたくはないな。 >>979
一応突っ込んでおくけど
「完全な仕様とは何か」ってことを
仕様として定義してみてって話だぞ >>981
そんな認識の医者に命預けてるだろ
私失敗しないので、なんて無責任なこと言う医者はいない 「ミスしてるかも」と思うからテストするんじゃないの?
絶対ミスしないなら、書いた瞬間にテストなしでリリースできるはずなわけで。 そんな心の弱い人に任せられないわ。
まず精神科受診してきて。 「私は強い、必ず成功する。バグについて心配するのは誤りである」
「日本人はもともと繊細なのである。これだけ注意深さを持ちながら、バグに困るなどというのは、ありえないことだ」 http://plv.mpi-sws.org/rustbelt/
みたいに、rustその物と標準ライブラリを論理的な正当性を確認しようとしているプロジェクトもあるよ。
また、coqで書いたものをrustに変換する
https://github.com/pirapira/coq2rust
というのももあった。 じゃあ「俺は気を付けてテストしたからミスは残ってない」ならどうだろう >>978
>>981
アポロが50年間月へ行くのを諦めてる(躊躇してる)のもそれが原因らしいな 失敗しないと言い張る糞医者だったらセカンドオピニオンを薦める医者のが信用できるわ。 このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 194日 9時間 52分 43秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。