23/09/21 13:31:34.10 cACw6b27.net
>>351
MySQLやPostgreSQLみたいな普通のDBMSでは
単一プロセスがデーモンとして常駐してファイル更新
を一元管理するのが前提となっているが、
SQLiteでは、そのような常駐プロセスが
存在しなくて、各アプリがSQLiteのライブラリ
プログラムを呼び出して、ライブラリの関数が
排他制御を行なって単一ファイルを壊さないように
ロックしながら互いに強調しつつ、部分書き換えや
部分読み込みを行っている。
つまり、SQLiteは管理を担う単一の常駐プログラム
がなくて、個々のアプリ(の中のライブラリ)が
協調動作するようになっている。
だから、プロセス間で同期を取る仕組みが必要となる。
しかし、CreateMutexでは、ユニークな名前が必要
となってしまい、その名前を決めるのがメンドクサイ。
一方、LockFile だとファイルのパス名で自動的に
ユニークの名前に出来てしまうから、非常に簡単に
安全に正しくロックできる。
363:デフォルトの名無しさん
23/09/21 16:18:11.92 B1OFnXUk.net
3文字で言うと
364:デフォルトの名無しさん
23/09/21 16:54:51.87 2fMT8T96.net
SQLite便利だよ
365:デフォルトの名無しさん
23/09/21 17:25:46.98 WBcwDy8I.net
sqliteは便利だけどテーブルロックなところがうんこなんだよな
begin conccurentとか予定あるらしいが
366:デフォルトの名無しさん
23/09/21 20:32:07.68 2tR0WsIS.net
複数のプロセスからアクセスしないのを前提条件に出来る場合もそれなりにあるもんな。
ちょっとしたツールでデータベースのプロセスをいちいち起動するのはわずらわしいし、 sqlite くらいの気軽さはありがたいのは確か。
sqlite みたいな方針のデータベースが他に台頭してないのが不思議なくらいだ。
367:デフォルトの名無しさん
23/09/21 20:41:30.87 PYjX2iWU.net
>>359
テーブルロックじゃなくデータベースロック
multiple reader xor single writerはデータベース単位
368:デフォルトの名無しさん
23/09/21 20:59:40.19 WBcwDy8I.net
もっとひどいデータベース単位か
URLリンク(www.sqlite.org)
これでページ単位が導入されても、select for updateみたいに明示的にロック
がほしいな
リトライとかだるい
369:デフォルトの名無しさん
23/09/21 20:59:47.82 WBcwDy8I.net
もっとひどいデータベース単位か
URLリンク(www.sqlite.org)
これでページ単位が導入されても、select for updateみたいに明示的にロック
がほしいな
リトライとかだるい
370:デフォルトの名無しさん
23/09/21 23:58:45.91 +/xN81gC.net
以下のような関数(実際のものとは少し違いますが)を実装してみたのですがイテレータのメソッドチェーンの箇所で型が合っていないとコンパイルエラーが発生します
アルゴリズム自体を変更することで目的としていた処理はできましたが結局このエラーの直し方がわかりません
ライフタイム周りが原因だとは考えていますがどのように修正すればよいしょうか
fn hoge(
func: &impl Fn((&i64, i64)) -> i64,
arr: &[i64],
ret: &mut Vec<impl Iterator<Item = i64>>
) {
ret.push(arr.iter().zip(std::iter::repeat(arr[0])).map(func));
for i in 1..arr.len() {
hoge(func, &arr[i..], ret);
}
}
371:デフォルトの名無しさん
23/09/22 09:19:17.11 dkRHHNCe.net
fn hoge(
func: &impl Fn((&i64, i64)) -> i64,
arr: &[i64],
ret: &mut Vec<impl Iterator<Item = i64>>
) {
ret.push(arr.iter().zip(std::iter::repeat(arr[0])).map(func).collect()[0]);
for i in 1..arr.len() {
hoge(func, &arr[i..], ret);
}
}
372:デフォルトの名無しさん
23/09/22 12:36:56.71 E1X0qleO.net
lifetimeの問題もあるかもしれないがimpl Iteratorの型をとるところに関数内で生成したイテレータを渡しているのがそもそもおかしい
373:デフォルトの名無しさん
23/09/22 13:53:26.70 dkRHHNCe.net
>>360
mdb
374:デフォルトの名無しさん
23/09/22 16:15:11.47 v8mgsVW8.net
>>366
mapにはhogeの外から引数として関数を渡しているので再帰呼出しごとにイテレータの型は変わらないですし
```
let mut v = Vec::new();
hoge(|(&a, b)| a + b, &[1, 3, 5], &mut v);
```
という形でhogeを呼び出せばイテレータの型は自動的に推論されると思うんですが...
375:デフォルトの名無しさん
23/09/22 18:07:36.44 KH67E8jw.net
impl TraitはTraitを実装した型のいずれか一つを受け入れるだけで、Traitを実装した型全てを受け入れるわけではない
376:デフォルトの名無しさん
23/09/22 18:31:55.39 v8mgsVW8.net
>>369
mapの中に直接クロージャを渡せば確かにその制限に引っかかりますが、今回は再帰の中で一つの関数を使いまわしているのでimpl Iteratorの型は一つに固定されませんか?
377:デフォルトの名無しさん
23/09/22 18:41:57.56 v8mgsVW8.net
>>365
イテレータのまま保持して遅延評価させたいんです
378:デフォルトの名無しさん
23/09/22 18:43:25.81 8SLDLfd5.net
関数定義から一意な具体型に推論されるのは戻り値型に書いた impl の話ですね
引数型に書いた impl は単にジェネリック引数を匿名化したものという扱いなので
hoge は I: Iterator<Item=i64> なる任意の I で単一化できるような定義が求められます
URLリンク(doc.rust-lang.org)
なので引数で&mut引き回してdynも使いたくないということであれば↓になりますかね
URLリンク(play.rust-lang.org)
379:デフォルトの名無しさん
23/09/22 19:29:43.87 v8mgsVW8.net
>>372
コンパイル通りました!ありがとうございます!
ただもう少しわがままを言うと、実際の実装で
380:はメソッドチェーンの箇所がこれの2倍ぐらいの長さなので具体的なイテレータの型を書かずにコンパイラ任せにしたかったんですが、話を見る限りどうも無理そうですね...
381:デフォルトの名無しさん
23/09/23 08:15:26.34 piK9W+al.net
>>373
>>372も書いてるけどimpl IteratorをBox<dyn Iterator>にする手もあるよ
382:デフォルトの名無しさん
23/09/23 09:19:17.35 lKOAbDFW.net
可能なら dyn は避けるに越したことは無い。
dyn はトレイトオブジェクトを扱うための仕組みであって
推論を補助する仕組みではないから。
383:デフォルトの名無しさん
23/09/23 09:55:40.35 piK9W+al.net
>>375
実装の隠蔽目的でdyn使うのはそんなに変な使い方ではないと思うが
384:デフォルトの名無しさん
23/09/23 09:59:36.45 i9fpyxKg.net
Box<dyn Trait>で解決しました本当にありがとうございました
385:デフォルトの名無しさん
23/09/23 16:36:06.31 WPP4nTE5.net
>>364です
補足すると今回自分がわかっていなかったのは以下のような関数がコンパイルを通らないということですね
```
fn hoge<T>(a: i64, b: &mut T) {
*b = a;
}
```
impl Traitが単にジェネリクスの糖衣構文であるということと、
トレイト境界を満たす型をジェネリクス引数に渡した場合は合法に"ならなければならない"、トレイト境界は十分条件も満たさなくてはならないという点
386:を解っていなかったのがポイントでした...
387:デフォルトの名無しさん
23/09/23 21:17:07.32 piK9W+al.net
戻り値のimpl Traitと引数のimpl Traitで振る舞い違うのは当たり前ではあるんだけど混乱しやすいポイントではあるかもね
388:デフォルトの名無しさん
23/09/24 12:22:42.57 2YTVyUlC.net
0788デフォルトの名無しさん
2022/06/21(火) 08:59:28.38ID:vO+TReRM
俺はフロントエンドやらないからこのスレでTauriの話をしないでくれ
389:デフォルトの名無しさん
23/09/24 12:36:49.28 2YTVyUlC.net
こいつはどうかな
URLリンク(zenn.dev)
390:デフォルトの名無しさん
23/09/25 23:08:53.71 OcxuhTB3.net
rustでdx12ってまともに使えますか?
そろそろc++は卒業したい
391:デフォルトの名無しさん
23/09/26 10:01:41.63 q653RLNX.net
>>382
使えないということだな。
392:デフォルトの名無しさん
23/09/26 17:46:11.75 WrG1pnap.net
一応d3d12があるけど、これを直接使うよりwgpu経由のほうがいいんじゃないか?
393:デフォルトの名無しさん
23/09/26 18:52:01.41 liEPyEVD.net
rustとgoとc#でjsonのシリアライズ、デシリアライズ実験したんだけど
rust 1ms cargo run --release
go 10ms
c# 40ms dotnet build -c Release
こんなに違うもんなの?
リリースモードでビルドしたつもりだけど
WebAPIのバックエンドどれにするか悩んでたけどもうrust1択でいいやん
394:デフォルトの名無しさん
23/09/26 21:18:52.63 rDjR9GdF.net
最適化で計測対象の処理が丸ごと消えてないかな
どこかでデータのサイズとか集計とか出力してればいいけど
395:デフォルトの名無しさん
23/09/26 21:22:16.85 sfzsNV4F.net
さすがそこまで速くないよね
C#ももっと速いような気がする
396:デフォルトの名無しさん
23/09/26 21:40:15.73 aJs6t/KK.net
コードの問題かベンチマークの問題だね
397:デフォルトの名無しさん
23/09/26 21:41:15.28 K0prie5d.net
>>385
goこのライブラリ使うとどうなる?
URLリンク(github.com)
398:デフォルトの名無しさん
23/09/26 21:41:38.03 aJs6t/KK.net
>>378
>fn hoge<T>(a: i64, b: &mut T)
fn hoge<T>(a: T, b: &mut T)にすればいいと思うけど
同じような解決策が>>364にあるということなの?
399:デフォルトの名無しさん
23/09/26 21:56:19.26 liEPyEVD.net
>>385
それやってる
まず、デシリアライズ1000回して
シリアライズ1000回でシリアライズでバイト配列になるからそのサイズのトータル
を求めてる
さっきのは1回あたりの平均
>>389
それやったら7.5ms
experimentalなJSON v2は13ms
400:デフォルトの名無しさん
23/09/26 21:59:59.97 liEPyEVD.net
つか、goってリリースビルドないやろ?
コンパイルも一瞬でへ?ってなるわ
それぞれ30行未満のコードだけど..
401:デフォルトの名無しさん
23/09/26 22:29:35.41 liEPyEVD.net
URLリンク(controlc.com)
goだとこんな感じ
402:デフォルトの名無しさん
23/09/26 22:43:29.67 liEPyEVD.net
ああ、ごめんC#は嘘でしたすみません
3msになりました
403:デフォルトの名無しさん
23/09/26 22:55:30.68 liEPyEVD.net
Rustは最強で
C#はメモリ使用量多いがMSが最適化ガンバッテル
Goはメモリ使用量少なくて言語仕様がシンプルだがC#に負けたり...
404:デフォルトの名無しさん
23/09/26 23:05:14.16 EQtG/kil.net
意味のないベンチマークだね
ちなみにこういうのはNimが速いと思うよ
結局こういうのってコンパイラの最適化の勝負をしているだけだから
Rustが速いというよりはLLVMが速いだけ
Zigとかでも同じスピードが出るはず
その代わりにコンパイル速度が遅いというデメリットがあるからこれは単なるトレードオフで、用途に応じて適した言語を選択するのが重要ってだけだね
WebAPI作るならIOが結局ボトルネックになるからパフォーマンス気にするにしても別にスクリプト言語じゃないならなんでもいいのよね
好きな言語にすればいいと思う
405:デフォルトの名無しさん
23/09/26 23:08:16.82 kLEETtIu.net
それはともかく
NimはRustに対して意味のあるアドバンテージ皆無でNimだけは要らん
406:デフォルトの名無しさん
23/09/26 23:14:09.15 liEPyEVD.net
まぁ、データベースはおもいっきし叩くね
最初は最強言語じゃなくてわかりやすい2番あたりの言語でいこうと思ってるんだけたんだけど
で、1番ははっきりRustっぽいからわかりやすいからいんだけど、
2番(C#,Go?)がはっきりしないから1番の言語でいいのかなと
最大の目的はサーバー費用を押さえられるように
407:デフォルトの名無しさん
23/09/26 23:14:24.83 gNMcg380.net
Nimはオフサイドルールってだけで試す気にもならないんだよな…
408:デフォルトの名無しさん
23/09/26 23:52:14.82 lFc5NXyg.net
>>396
多数の非同期タスクを偏らずスレッド間でスチールしてスケジューリングできるのは現状GoとRustしかない
小規模ならGoでもよいがそれ以上だと言語機能が貧弱なGoは辛くなってきてRustの独壇場
409:デフォルトの名無しさん
23/09/27 00:09:38.71 8IPpP98U.net
>>400
妄想乙
URLリンク(ufcpp.net)
410:デフォルトの名無しさん
23/09/27 00:11:19.90 8IPpP98U.net
この妄想も延々言ってたけどやっと黙るのかな?
470: デフォルトの名無しさん sage 2023/09/26(火) 09:57:28.51 ID:ycG3j/g+
>>469
IaaSの一部にそういうケースがありうるだけだぞ
PaaS (FaaS)は基本的にメモリ使用量✕実行時間で料金が決まる
メモリ使用量は少なければ少ないほどコストに優れている
411:デフォルトの名無しさん
23/09/27 00:29:08.13 MfhnDtnO.net
複オジは相変わらず嘘ばっかり
成長しないね
412:デフォルトの名無しさん
23/09/27 00:38:28.22 +nRBKi9H.net
AIにRust生成させてGoと比較してみたけどmarshal以外は変わらないな (goccy/json使用)
x86でやってる?ARMだと違うのかも
(俺はUbuntu x86/64)
URLリンク(pastebin.com)
$ go run ./main.go
1187 [μs]
268419000 [bytes] 467 [μs]
$ cargo run --release
1347 [μs]
263672000 [bytes] 255 [μs]
413:デフォルトの名無しさん
23/09/27 00:56:55.88 +nRBKi9H.net
俺の環境だとgoccy/jsonにすることで4倍速くなったけど何が違うんだろうね
goccy/json
1129 [μs]
268419000 [bytes] 446 [μs]
標準json
4125 [μs]
268419000 [bytes] 533 [μs]
go-json-experiment/json
3446 [μs]
263609000 [bytes] 745 [μs]
414:デフォルトの名無しさん
23/09/27 01:02:33.77 +nRBKi9H.net
これにしたらRustより早くなったわ
結局これっていかに最適化しているかってだけだと思う
URLリンク(github.com)
[Go sonic json]
914 [μs]
263609000 [bytes] 209 [μs]
415:デフォルトの名無しさん
23/09/27 01:06:34.20 8IPpP98U.net
気づくのが遅い
416:デフォルトの名無しさん
23/09/27 01:44:16.58 jtGLjNq+.net
>>405
お手数かけて本当にごめんなさい
自分の実行方法が問題でした
>>385でgoの部分が空欄のように実行方法がわかってなく、
デバッグモードで動いていました
すみません
go runで動かしたら>>405のような速度になりました
417:デフォルトの名無しさん
23/09/27 01:51:26.25 jtGLjNq+.net
WebAPIでgoで行く決意ができました
本当にお騒がせしました
418:デフォルトの名無しさん
23/09/27 04:55:49.67 UdUnwuun.net
YouTube で有名な雑食系エンジニア・KENTA が、既に言ってる。
キャリアパスは、Ruby on Rails → Go のみ
Ruby/Goの神・HashiCorp のMitchell Hashimoto がそう。
Ruby製のVagran
419:t → Go製のTerraform。 今は、Goプログラマーしか求めていない Rust/Elixir は普及のキャズムを超えなかった。 超えたのは、Goだけ
420:デフォルトの名無しさん
23/09/27 17:50:20.18 wGZOY1wb.net
まあビルド時間の重要性はちょこちょこ一人で作ってるやつは理解できんわな。
421:デフォルトの名無しさん
23/09/27 18:56:48.41 CCaLLXi3.net
仕事なら相応に強力なマシンかレンダリングサーバがあるだろ
422:デフォルトの名無しさん
23/09/27 21:44:37.94 fWGZRw8C.net
レンダリングサーバーは関係なさすぎ
423:デフォルトの名無しさん
23/09/27 22:03:34.78 vmit0gpI.net
ビルドサーバーと間違えたのかもね
424:デフォルトの名無しさん
23/09/28 18:29:13.32 gS/5M63X.net
MARCHを受けるために東大の過去問を練習するような意識高い系バカ
425:デフォルトの名無しさん
23/10/06 11:57:36.28 Zl0hPCVy.net
一体誰がRustを推しているのか?
中國?
426:デフォルトの名無しさん
23/10/06 13:12:35.08 2p+njRVB.net
関数型と手続き型のいいとこ取りしたいプログラマだろ
情報科学の先進国なら中国に限らず一定数いるはず
427:デフォルトの名無しさん
23/10/06 16:38:53.65 AJI+rgso.net
ネットインフラが次々とRust製になっていってる
>【CDN世界トップシェアCloudflare】
>URLリンク(www.publickey1.jp)
>CDNプロバイダのCloudflareは、同社のグローバルなCDNの基盤として長らく利用してきたNGINXに代えて、
>同社自身がRust製のHTTPプロキシである「Pingora」を開発し利用していることを明らかにしました。
>【クラウド世界トップシェアAWS】
>URLリンク(japan.zdnet.com)
>Rustで構築されたAWSサービスの例としては、
>コンテナーアプリ用のサーバーレスプラットフォーム「Lamba」を支える「Firecracker」、
>「Amazon Simple Storage Service(S3)」、
>「Amazon Elastic Compute Cloud(EC2)」、
>コンテンツ配信ネットワーク「Amazon CloudFront」、
>LinuxベースのコンテナーOS「Bottlerocket」などがある。
428:デフォルトの名無しさん
23/10/06 20:34:57.35 hdhWn3/E.net
関数型の良いとことるの諦めた言語って感じだけどw
初期の頃はocamlでコンパイラ作られてたらしいのに
MLの匂いさえ残ってない単なる手続き化型言語だわ
429:デフォルトの名無しさん
23/10/06 20:35:16.84 hdhWn3/E.net
関数型の良いとことるの諦めた言語って感じだけどw
初期の頃はocamlでコンパイラ作られてたらしいのに
MLの匂いさえ残ってない単なる手続き化型言語だわ
430:デフォルトの名無しさん
23/10/06 21:14:33.58 b1wSOXuc.net
スタックフレームに着目したのはプラスだけど、下手にスタックフレームを隠そうとしているのはマイナス。
計算モデルをスタックフレームにするぐらい割り切れば良かったのに。
431:デフォルトの名無しさん
23/10/06 21:15:11.56 b1wSOXuc.net
スタックフレームに着目したのはプラスだけど、下手にスタックフレームを隠そうとしているのはマイナス。
計算モデルをスタックフレームにするぐらい割り切れば良かったのに。
432:デフォルトの名無しさん
23/10/06 23:16:24.42 tE7CLicd.net
mut 入れたのが間違いなんだろ
433:デフォルトの名無しさん
23/10/06 23:30:10.29 hdhWn3/E.net
関数型に関してはscalaのほうがよっぽど意欲的だよ
def qsort(list: List[Int]): List[Int] = list match
case Nil => Nil
case pivot :: tail =>
val (smaller, rest) = tail.partition(_ < pivot)
qsort(smaller) ::: pivot :: qsort(rest)
たとえば↑こういうのとか
434:デフォルトの名無しさん
23/10/07 00:34:46.36 Hyqci1qG.net
関数型というよりはリスト型言語だな
435:デフォルトの名無しさん
23/10/07 01:56:24.14 a3LzK6ia.net
システムプログラ�
436:~ングのための言語なので純粋に関数型な要素だけを求めるなら別の言語を当たった方が良い
437:デフォルトの名無しさん
23/10/07 02:12:44.80 QajUcOD9.net
リスト型つまりLinkedListをメインにすると利便さと引き換えに遅い問題とガベージが出まくる問題がある
Rustはリスト型メインにしなくて正解
438:デフォルトの名無しさん
23/10/07 04:42:48.81 +bTugVnw.net
GCを前提にしない仕様の上に積み上げなくてはならないという側面から見ると、わりかしよくやっている方なんじゃなかろうか……知らんけど
439:デフォルトの名無しさん
23/10/07 06:29:51.58 GJ9LXcgc.net
自称情強底辺者「Rustでhello worldかける俺カコイイ」
真の成功者「スイカゲームでボロ儲けしました」
440:デフォルトの名無しさん
23/10/07 06:46:44.80 bWLG2vp7.net
mut無しとはこういうことか
URLリンク(play.rust-lang.org)
fn qsort<T: Copy+Ord>(list: &[T]) -> Vec<T> {
match list {
[pivot, ..] => {
let (smaller, rest): (Vec<T>, Vec<T>) =
list[1..].iter().partition(|&i| i < pivot);
[qsort(&smaller), vec![*pivot], qsort(&rest)].concat()
},
_ => vec![]
}
}
fn main() {
let list = [9, 0, 7, 3, 6, 1, 2, 4, 8, 5];
println!("{:?}", list);
println!("{:?}", qsort(&list));
}
441:デフォルトの名無しさん
23/10/07 09:44:47.17 WqNjBTZw.net
まあ今時ランタイム速度でそこまで差がつくことはないわな。
ガベコレの実行タイミングが問題になることは結構あると思うけど。
442:デフォルトの名無しさん
23/10/07 11:17:12.27 fuWtUzBR.net
アロケートしまくリングやな
443:デフォルトの名無しさん
23/10/07 12:06:59.60 pov02R//.net
ランタイムサポートが極まってきたからこそ
極めきれない部分の差が目立ってきたんだよ。
444:デフォルトの名無しさん
23/10/07 14:19:35.27 koj+veBs.net
XYZ座標みたいな単純だけどプリミティブでない大量のデータの配列を作りたいときに
1つ1つをオブジェクトにしないといけないGC言語は放り投げたくなる
座標なら最悪プリミティブに分解して自分で並べれば済むけど型が混ざると詰む
445:デフォルトの名無しさん
23/10/07 15:18:57.75 AO4ZOvxF.net
>>424
>>430
なるほど
美しいコードはスッキリうんこみたいに気持ち良い
まるで脳が洗われるようだ
普段いかに毒に浸かってるかが判るな
446:デフォルトの名無しさん
23/10/07 15:43:47.56 Ozx346pn.net
Rustのはmutなしにした場合の問題提起のための悪い例だろ
447:デフォルトの名無しさん
23/10/07 15:51:39.94 O3XDw4H3.net
>>434
Rustでも1つ1つオブジェクトにする
何の問題もないどころかむしろ好ましいやり方
448:デフォルトの名無しさん
23/10/07 16:42:12.14 2ow1Jojj.net
ocamlだとこんな感じかな?
let rec qsort = function
| [] -> []
| pivot :: tail ->
let smaller, rest = List.partition ((>) pivot) tail in
qsort smaller @ pivot :: qsort rest
>>424 scala比較のためそのままコピペ
def qsort(list: List[Int]): List[Int] = list match
case Nil => Nil
case pivot :: tail =>
val (smaller, rest) = tail.partition(_ < pivot)
qsort(smaller) ::: pivot :: qsort(rest)
scalaすごい頑張ってると思うわ
449:デフォルトの名無しさん
23/10/07 23:59:36.96 QajUcOD9.net
>>430
RustはそのようにOCamlやScalaと同等に書くことも容易な点がいいな
同時にその方法によりRustで記述すると大量にVec(またはリストを実現する何か)を使い捨てていることが見える
つまりGC言語ではガベージが大量に出る
450:デフォルトの名無しさん
23/10/08 02:42:17.66 9NUoKPD/.net
くすくす
451:デフォルトの名無しさん
23/10/08 08:07:41.64 WAd1DVRF.net
同等に書けてないでしょw
452:デフォルトの名無しさん
23/10/08 09:57:45.64 ShBUnVvx.net
同等というより>>438と>>430は全く同じだな
空でなければpartitionでsmallerとrestに分けて
それぞれを再帰でqsortしてconcatenate
453:デフォルトの名無しさん
23/10/08 10:16:57.79 CrdCteTP.net
次はHaskellまたはErlangでおながいしまつ
454:デフォルトの名無しさん
23/10/08 10:38:24.03 lCt9aeoq.net
in-placeなqsort書いてよ
455:デフォルトの名無しさん
23/10/08 10:39:23.48 WAd1DVRF.net
>>443
Haskell
qsort [] = []
qsort (x:xs) = qsort [y | y <- xs, y < x] ++ [x] ++ qsort [y | y <- xs, y >= x]
Erlang
qsort([]) -> [];
qsort([X|Xs]) ->
qsort([ Y || Y <- Xs, Y < X]) ++ [X] ++ qsort([ Y || Y <- Xs, Y >= X]).
456:デフォルトの名無しさん
23/10/08 12:06:58.68 3KZ70qk+.net
複オジは常にヒープアロケートするGC言語しか知らないのかな?
特定の言語の機能不足をGC言語の制約のように語るのはやめような
457:デフォルトの名無しさん
23/10/08 14:27:21.60 1klr8jB1.net
rustより高度なライフタイム管理する言語ってないの?
458:デフォルトの名無しさん
23/10/08 14:53:30.59 33/5YUgE.net
高度なライフタイム管理のベクトルがわからん
全データに参照カウンタをもたせて参照→存在を保証してるGC言語ならたくさんあるし
処理過程を生成する(書かせない)ことでライフタイムを意識させない関数型言語もある
459:デフォルトの名無しさん
23/10/08 14:57:14.95 lcllyLaE.net
>>442
ScalaのListもOCamlの[]も単方向リストであってべクタではないのに唯一気付いていないおじさん
460:デフォルトの名無しさん
23/10/08 15:04:22.44 KeQMELAC.net
それはそれとしてScalaのcase classはRustにも欲しいと思うことあり
461:デフォルトの名無しさん
23/10/08 15:32:16.97 1klr8jB1.net
>>448
rustを置き換え可能な言語で
つまりゼロコスト抽象
大学の研究レベルのものとかでないのかな
462:デフォルトの名無しさん
23/10/08 16:37:56.79 lCt9aeoq.net
ランタイムコストなしのライフタイムチェックはシステムプログラミング言語だから必要な話で、そうでない言語ならGCで良い
shared xor mutableの静的な保証はGC言語でも嬉しい性質だと思うが、他の言語で採用例はあるのかね?
463:デフォルトの名無しさん
23/10/08 18:19:11.05 WAd1DVRF.net
enumのリストで書いてみたわ
rust不慣れだから所々おかしいかも
URLリンク(ideone.com)
enum List<T> {
Cons(T, Box<List<T>>),
Nil,
}
impl<T: Copy + PartialOrd> List<T> {
// 略
fn qsort(&self) -> Self {
match self {
List::Nil => List::Nil,
List::Cons(pivot, tail) => {
let (smaller, rest) = tail.partition(|x| *x < *pivot);
smaller.qsort().concat(&rest.qsort().prepend(*pivot))
}
}
}
}
fn main() {
let list = List::<i32>::nil().prepend(4).prepend(8).prepend(8).prepend(3).rev();
list.each(|n| print!("{}", n));println!("");
list.qsort().each(|n| print!("{}", n));println!("");
}
464:デフォルトの名無しさん
23/10/08 19:36:48.46 e3limdE9.net
>>449
目的はソートなので、
単方向リストを用いるかベクタを用いるかは実装方法の問題だから些細な話かな。
実用上もベクタで十分だから単方向リストの出番は滅多にないよね。
465:デフォルトの名無しさん
23/10/08 20:05:18.10 lCt9aeoq.net
で、みなさんは単方向リストを使う綺麗だけどクソ遅いコードを並べて何がしたいんですか?
466:デフォルトの名無しさん
23/10/08 20:14:55.63 BgGDjECm.net
そんなの用途次第だろ
ど素人かよ
467:デフォルトの名無しさん
23/10/08 20:19:50.77 QzGY7mJQ.net
>>454
>>439がガベージがどうこう言ってるのについてはどう思う?
468:デフォルトの名無しさん
23/10/08 20:59:00.53 e3limdE9.net
>>457
リストはガベージと裏表一体ですが何を問題にしていますか?
リスト化する時にconsセルの割り当てが発生します。
そしてリストから取り出す時に空のconsセルがガベージとして発生します。
469:デフォルトの名無しさん
23/10/08 22:12:35.86 nH9KI4I/.net
赤っ恥オジの言い訳草
470:デフォルトの名無しさん
23/10/08 22:57:55.16 1kYUOs3M.net
入れもの(メモリ)はどのデータ構造でも不可欠だからいずれもゴミが発生するのは仕方ない
ただしリスト(各セル|ノード)に比べてベクタは以下の点で有利
・まとめて確保解放ができる
・next pointer(の容量と処理)が不要
・リニアスキャンが速い
・ランダムインデックスアクセスも速い
そのためRustでもほとんどの用途でベクタが使われリストは少ない
471:デフォルトの名無しさん
23/10/08 23:00:08.12 Li9tDqQF.net
今どきはCPUキャッシュが効くかどうかが問題だから
472:デフォルトの名無しさん
23/10/08 23:38:45.90 F0i6/5MC.net
三連休使ってrustの勉強してるけど、ようやく慣れてきた
某openGLの本をMacでやっててDSL2のインストールに四苦八苦、、、
なんかこいつだけCargo.tomlの書き方が、、、
急ぎ足せずrustのとこにある蟹表示するやつ写経してクレートの追加覚えた
先は長いね、、、
頑張る
473:453
23/10/09 01:16:03.20 VBg3Yonc.net
>>444
>>455
URLリンク(ideone.com)
これでクイックソートになってるはず?
なってなくても笑って許してほしい
474:デフォルトの名無しさん
23/10/09 01:21:45.86 L6ciWwId.net
>>456
ソート済み配列のソートの計算量が最悪になるqsort実装の活用方法わかんないです
どういうときに有効なんですか?
標準ライブラリのソートアルゴリズム使った方が良いのでは
475:デフォルトの名無しさん
23/10/09 01:24:15.18 TA+AoWAa.net
リストと配列比較してるやつ全員馬鹿です
476:デフォルトの名無しさん
23/10/09 13:24:27.74 gMk1hFfQ.net
そんな香具師いたか?
477:デフォルトの名無しさん
23/10/09 18:01:30.12 416rm9Ab.net
appendできないListってダサい
478:デフォルトの名無しさん
23/10/09 18:16:49.87 TA+AoWAa.net
おるやん!
479:デフォルトの名無しさん
23/10/11 15:06:20.59 UxaO0GW9.net
Rust検索したらゲームの方が出てきてお前じゃないってなって情報収集が捗らない
480:デフォルトの名無しさん
23/10/11 15:25:39.99 kTxLNWR8.net
それで困ったこと今まで一度もないんだがどういう検索でそうなるの?
普段からゲーム関係の検索したりサイト閲覧してたりする?
481:デフォルトの名無しさん
23/10/11 16:05:36.62 jfZ9hs4j.net
ゲームの方もやってますね
Rust初心者が簡単なゲーム作ろうとしてまして
(Pythonのpygameでブロック崩し作れる程度)
検索方法がまずいのかもしれませんね
描画したり、画像をはったり、それを縦横動かしたいだけなのですが
icedか?eguiか?みたいなとこまで来てるけど、まだ使い方がよくわからんですね
どこの関数が初期設定の一発実行で、どこの関数が60fpsの毎回実行なのかとか
プロではなく趣味なので言葉選びが毎回曖昧です
482:デフォルトの名無しさん
23/10/11 17:42:19.71 Pu4uPjjn.net
なるほどそういう感じなのか
検索ワードに”game”とかも含んでるなら
月並みだけどprogrammingを足してみたりゲームの方にだけ特徴的なワード(surviveやsurvivalとか)を除外してみたりするといいんじゃないかな
483:デフォルトの名無しさん
23/10/11 20:52:08.31 OZznE1k0.net
>>471
URLリンク(arewegameyet.rs)
とりあえずこの辺のチュートリアルから選んでやってみては?
484:デフォルトの名無しさん
23/10/11 23:18:11.74 vJm7EO/F.net
>>441
>>430がVec使用だから同等でないという話ならばRustにもリンクリストがあるよ
リンクリストに特化したパターンマッチング構文や結合構文はないけれど
例えばTをCopyせずそのまま使うならば
use std::collections::LinkedList;
fn qsort<T: PartialOrd>(mut list: LinkedList<T>) -> LinkedList<T> {
if let Some(pivot) = list.pop_front() {
let (smaller, rest): (LinkedList<T>, LinkedList<T>) =
list.into_iter().partition(|x| x < &pivot);
// concat
list = qsort(smaller);
list.extend([pivot]);
list.extend(qsort(rest));
}
list
}
fn main() {
let list = LinkedList::from([9, 0, 7, 3, 6, 1, 2, 4, 8, 5]);
println!("{:?}", list);
println!("{:?}", qsort(list));
}
485:デフォルトの名無しさん
23/10/11 23:57:55.35 2xINBvCy.net
はあ
馬鹿なんですね
486:デフォルトの名無しさん
23/10/12 11:14:39.52 u59ybXeV.net
たしかに Rust ゲーム 造り方 で検索するとゲームの方ばっかり出る罠
487:デフォルトの名無しさん
23/10/12 11:17:21.26 u59ybXeV.net
>>474
mut 使ったら負け
488:デフォルトの名無しさん
23/10/12 12:51:53.05 5Y8Kw2UP.net
>>477
そんな表層的なことを問題にするのは愚か
例えばmutを表層的に使っていない>>430はそこで呼び出しているpartitionとconcatそれぞれのなかでmutを使っている
当たり前だがデータを組み立てたり書き換える処理は全てmutにたどりつく
>>474でも表層的にmutを無くしたいだけならば同様にconcat関数を作りその中でmutを使えばいい
489:デフォルトの名無しさん
23/10/12 12:52:32.93 5Y8Kw2UP.net
>>477
そんな表層的なことを問題にするのは愚か
例えばmutを表層的に使っていない>>430はそこで呼び出しているpartitionとconcatそれぞれのなかでmutを使っている
当たり前だがデータを組み立てたり書き換える処理は全てmutにたどりつく
>>474でも表層的にmutを無くしたいだけならば同様にconcat関数を作りその中でmutを使えばいい
490:デフォルトの名無しさん
23/10/12 13:19:12.59 SguY35qe.net
mut使ったら負けとは俺は思わないが断じて表層的なことではない
本質的に重要な違いだからこそRustでは明確に区別してるわけなので
それにconcatもpartitionもmut使ってない
491:デフォルトの名無しさん
23/10/12 13:31:42.25 IQy1JHL6.net
単方向リストと両方向リストの区別もついていない馬鹿だからしょうがないね
492:デフォルトの名無しさん
23/10/12 14:04:37.89 29Fh0rnH.net
標準ライブラリのソース見たら
concatもpartitionもmut使ってるな
最終的にあらゆるmutになるのか
493:デフォルトの名無しさん
23/10/12 14:35:37.70 +nxBPiMF.net
すべてがmutになる 森鴎外
494:デフォルトの名無しさん
23/10/12 14:56:18.33 oQimRC1z.net
「ボクの考えた最強の汚コードを批判するな!」
495:デフォルトの名無しさん
23/10/12 14:58:53.27 X9LcShxS.net
>>482
ネタじゃなくマジで言ってるならRustは辞めとけ
絶望的に向いてない
496:デフォルトの名無しさん
23/10/12 15:06:20.95 pri3rXDa.net
複オジが劣化したのだろうか
それとも複オジ劣化版が新たに出現したのだろうか
497:デフォルトの名無しさん
23/10/12 15:24:09.95 VkfPx0C5.net
mutを使わずにできることは読み出しとムーブとコピーだけ
498:453
23/10/12 19:51:44.10 viHBcoi7.net
今度はDartで書いてみた
3.0でパターンマッチがちょっと強化されたらしい?
3.0新登場のスイッチ式の=>の右側には式だけしか書けない?
dartにはそもそもpartitionはない?
というわけで>>445のHaskell方式で書いてみた(程遠いけど)
List qsort(List list) {
return switch (list) {
[] => [],
[var pivot, ...var rest] => qsort(rest.where((x) => x < pivot).toList()) + [pivot] + qsort(rest.where((x) => pivot <= x).toList())
};
}
499:453
23/10/12 23:01:31.11 viHBcoi7.net
こういう書き方もできた
こっちのほうが雰囲気出てるかな?
List qsort(List list) {
return switch (list) {
[] => [],
[var x, ...var xs] => qsort([for (var y in xs) if (y < x) y]) + [x] + qsort([for (var y in xs) if (x <= y) y])
};
}
500:デフォルトの名無しさん
23/10/13 08:06:18.09 q0Ayf65Z.net
>>482
RustはCと同じ高速で動作する手続き型言語だから少なくとも最下層はmutが基本になる
たとえばイテレータからVecへcollectする場合
特殊ケースはunsafe最適化
一般ケースはlet mut vec = Vec::new();してextend
その一方でプログラミングする時はその最下層を意識しなくても知らなくてもいい
mutを必要としないiter.collect()と抽象的に書ける
501:デフォルトの名無しさん
23/10/13 08:24:52.90 NdZOKZ+T.net
最強Rust始めたわい
mutの話が出てるから質問
シャドーイングっていう性質使えばmutなくても書けそうな気がしてる(まだ書けてない)んだけど
シャドーイングしたときと、mutではメモリの動き何か変わるのかな?と
シャドーイング
let z = x + y;
その後z使って処理
let z = x - y; // z宣言して前回のz上書き
その後z使って処理
502:デフォルトの名無しさん
23/10/13 12:19:34.60 tPfYbY0d.net
>>491
それを1億行書いたとする。たぶんスタック溢れるんじゃね?
503:デフォルトの名無しさん
23/10/13 12:43:08.68 zQ1dnjfM.net
1億行書く意味が分からんが
そんな問題ではないだろw
504:デフォルトの名無しさん
23/10/13 18:31:34.80 Q91zX7Uf.net
ドロップしないの?
505:デフォルトの名無しさん
23/10/13 19:31:02.96 /Zwm785x.net
ちょっと前にJSONシリアライズでの最適化の話出たけど
goは空気感が不安になるよな
rust->システムプログラミングよりの言語で、速度やらいろいろうるさそうなやつが
集まってて、そんなやつらの作るライブラリだからパフォーマンスとか心配しなくてよさそう
C#->.NET開発チームが毎年長文ブログでがんばってるアピール
go->言語機能とかほぼ完成しちゃってるんだろうが
アピールもない、この空気感
506:デフォルトの名無しさん
23/10/13 19:35:26.71 /Zwm785x.net
URLリンク(devblogs.microsoft.com)
今年の.netのパフォーマンス改善はこれ
goはシンプル言語で標準ライブラリも最小限だから
もうあまりやることないのか?
507:デフォルトの名無しさん
23/10/14 14:19:51.05 MfcWhKX5.net
>>491
不使用領域は再利用されるから単純な順次処理ならシャドーイングで十分
mutが欲しくなる理由の1つは繰り返し処理だな(長さ不定のリストの集計とか)
関数型言語みたいに再帰使えばmutなしでも何とかなるけど慣れないとややこしい
あとは全部作り直すのが不合理なデータの部分的な書き換えでもmut使いたい
508:デフォルトの名無しさん
23/10/14 19:31:37.47 FeWBHDoO.net
for文で値を変えるカウンタとかフラグとかもmutじゃないと書けないな。
まぁ for 文より iter で書けという一派も多いかもしれんけど。
509:デフォルトの名無しさん
23/10/14 19:57:12.00 jlnlui4T.net
モジュールの内部では (性能上の理由で) mut を使っても、
外側に見せるインターフェイスは
(不自然ではない範囲で) mut を避けるのは自然な方針だと思う。
510:デフォルトの名無しさん
23/10/15 09:39:38.68 M8zy/AR3.net
Cで書いたプログラムを Rustで書いたらこうなります
っていうのをひたすら集めた本がほしい
511:デフォルトの名無しさん
23/10/15 10:09:58.67 Xnkvwbkm.net
全銀システムでJavaの
512:信頼が失墜した今こそrustのチャンスだな
513:デフォルトの名無しさん
23/10/15 11:00:17.07 2BZrn9hr.net
全銀はまだCOBOLだろ
ほんといつもいつも嘘ばっかりだな
514:デフォルトの名無しさん
23/10/16 10:19:13.28 kgcCjrnK.net
>>500
似たような動機で描かれた本とかブログは観たことあるけど
Rustっぽくないコードばっかりでうんざりする面もある
515:デフォルトの名無しさん
23/10/16 10:21:08.50 kgcCjrnK.net
全銀協のフォーマットって今も変わってないんだろうけど
半角カタカナだらけでRustで扱うのは大変かも知れないね
516:デフォルトの名無しさん
23/10/16 10:35:49.58 enUIFRpv.net
扱う文字については適当なライブラリを整備すればそんなに問題にならなさそうに思うが
517:デフォルトの名無しさん
23/10/16 11:26:02.88 SeIR9j3q.net
>>505
>扱う文字については適当なライブラリを整備すれば
外字ばかりとかでそれが大変なんじゃないの?知らんけど
518:デフォルトの名無しさん
23/10/16 12:22:46.59 SkmcjqYw.net
半角しかないのに外字とは
519:デフォルトの名無しさん
23/10/16 13:30:20.84 kgcCjrnK.net
今のうちに Rust でハンカクカタカナ自由自在な crate 造っておけば
将来ライセンス料でシッポリ儲かりますか?
520:デフォルトの名無しさん
23/10/17 11:40:48.89 xDsy3kB7.net
Rustに慣れるとCのifで()付け忘れたわ
521:デフォルトの名無しさん
23/10/19 14:52:32.31 rcYEOPS6.net
Vec の iter() と into_iter() の違いは?
522:デフォルトの名無しさん
23/10/19 14:53:04.92 rcYEOPS6.net
Vec の iter() と into_iter() の違いは?
523:デフォルトの名無しさん
23/10/19 15:12:31.11 V7scna43.net
>>510
引数に着目するといい。
into_iter はムーブするが iter は借用する。
524:デフォルトの名無しさん
23/10/20 01:20:11.96 /f3Rr7gK.net
>>500
その発想がすでに間違ってる
根本が違うから同じようには書けない
525:デフォルトの名無しさん
23/10/20 06:13:09.90 3+q+Er7L.net
Cで安全に書いたときと同じ生成コードにはなるけどRustでは抽象度の高い表現をするからなあ
例えばメモリのある範囲の領域を順に読み取る(書き込む)というC言語だとポインタをインクリメントしていくだけの場合でも
Rustだとまずメモリの領域をスライスという安全な抽象表現で扱い可変性もライフタイムも付随してスライスが指す元の安全に確保されている領域(配列やベクタなど)も必須というところからスタート
そのうえでスライスのイテレータにより必ずその範囲内のみを順に安全に指し示す参照(または可変参照)が次々と得られて順に読み取る(書き込む)ことが達成される
さらにRustではこれをfor文ではなく抽象度の高いイテレータメソッドチェーンで書くことも多いからCコードとの対応はますます難しくなるね
526:デフォルトの名無しさん
23/10/20 06:56:18.50 /M3RKJCH.net
unsafe {
Rust で C ポインタやりたいなら
let p = *mut hoge;
p+=1;
std::slice::from_raw_part(p. 1)[0] = hage;
}
527:デフォルトの名無しさん
23/10/20 09:04:11.56 6mF1sPPt.net
>>513
同じように書けないからこそ対比したものが欲しいと言う話だろうに
528:デフォルトの名無しさん
23/10/20 09:27:32.12 /M3RKJCH.net
>>516
クソでたらめだが真面目に実装するとマジ面倒
>>515 方式だと
#[derive(Debug)]
struct Hoge {a: u8, b: u8, c: u8}
impl Hoge {
pub fn new(a: u8, b: u8, c: u8) -> Self {Hoge{a, b, c}}
}
fn main() {
let hoge: Vec<Hoge> = vec![Hoge::new(1, 2, 3), Hoge::new(4, 5, 6), Hoge::new(7, 8, 9)];
println!("{:?}", hoge);
let mut p = &hoge[0] as *const Hoge as usize;
p += 2 * std::mem::size_of::<Hoge>();
unsafe { std::slice::from_raw_parts_mut(p as *mut Hoge, 1)[0] = Hoge::new(8, 3, 1); }
println!("{:?}", hoge);
}
>>514 方式だと
let p = &hoge[0] as *const Hoge as *mut Hoge;
unsafe { std::slice::from_raw_parts_mut(p, 3)[2] = Hoge::new(8, 3, 1); }
でちょっとマシになるくらい
529:デフォルトの名無しさん
23/10/20 09:40:03.83 2W9ATkqE.net
マクロでウヒヒ
530:デフォルトの名無しさん
23/10/20 11:03:08.72 +Ixb2Hv2.net
近代的な言語の仕組みってのは大規模なプログラムをどうやってまとめるかという方向で進歩してるから
小さなサンプルで比較しても設計理念は身につかんのだ。
531:デフォルトの名無しさん
23/10/20 13:13:02.21 iA9G36tB.net
設計理念を身につける話なんて誰もしとらんだろw
532:デフォルトの名無しさん
23/10/20 15:12:25.73 +Ixb2Hv2.net
してないから問題だと述べてるんだが。
俺が学生のときに英語の長文の全ての単語の横に(単語ごとに!)日本語の単語を書いてたやつがいたことを思い出したわ。
本に載る程度の規模(ひとつあたり数ページくらい?)のプログラムを対比するってのはそういうことだよ。
言語の設計理念に基づいた構造こそが重要で、構造を論じるほどの規模にならないならたいした違いは見えてこない。
533:デフォルトの名無しさん
23/10/20 16:07:06.67 /M3RKJCH.net
CでもPythonでもRustでも全部の行にあほみたいなコメント描く香具師はうざいけど
Rustのcrateでdocsにcomment100%達成するためにはアホなコメント描かされてダサい設計思想だと思う
534:デフォルトの名無しさん
23/10/20 16:34:14.75 HySp0Cr6.net
>>521
日本語の設計理念wが身についてないみたいだなw
535:デフォルトの名無しさん
23/10/20 17:24:55.57 /f3Rr7gK.net
unsafe使うならCでいいんだよなw
536:デフォルトの名無しさん
23/10/20 19:40:13.76 3+q+Er7L.net
>>524
それは違う
unsafeを使ってsafeなインターフェースを提供する部分だけ人間が安全性を保証すれば
それ以外の部分はすべてRustが安全性を保証してくれる
その方針でRustの標準ライブラリやunsafeを用いる一部クレートが作られている
537:デフォルトの名無しさん
23/10/20 20:06:04.22 9sHhryb+.net
>>525
もちろん品質が保証されてるライブラリは使うよ
現時点でここまでライブラリが揃ってるから自前でunsafeを書く必要は感じない
538:デフォルトの名無しさん
23/10/21 12:29:35.28 sf7W/HH9.net
関数型最強(キリω
ですねわかります
539:デフォルトの名無しさん
23/10/21 21:43:10.75 sGOhbjn7.net
Linuxでも、結局のところ「C言語でいいじゃん」という結論になりそうよね
リーヌスもなんかやっぱRustはなぁ・・・ってトーンダウンしてきてるし
540:デフォルトの名無しさん
23/10/22 00:35:28.61 GiKl9Asx.net
>>528
カーネルなんて低レイヤーのポインタ操作とかビット演算しかしないからな
541:デフォルトの名無しさん
23/10/22 00:50:06.85 n0l+NFKj.net
Linux カーネルの中にだって Rust が適している場所も
あるといえば有るだろうけど現時点でそれなりに検証が済んで
安定して動いているものを「置き換え」するほどではないだろうな。
適しているからといって各部を別の言語で書いたりすると
接続箇所で面倒になったりもするし。
542:デフォルトの名無しさん
23/10/22 11:49:16.17 IKvVj0uW.net
カーネルで流行らないならもう流行るところないんじゃ…
543:デフォルトの名無しさん
23/10/22 19:50:36.55 NN1UsPSx.net
どの言語からどの言語への場合でも既に動いているものを別の言語に移植するだけだとコストがかかる
それでもスクリプト言語からRustへ置き換えるなら実行速度と省メモリの効果がコストを上回りやすいためよく行われている
一方でC/C++
544:からRustへ換えても実行速度と省メモリの効果はない だからシステム設計を変えるなど大きな更改タイミングでRust化することが多い 特にマイクロサービス化されているものは個別に更改できるためシステム全体の一部Rust化に向いている 最も向いておらずハードル高いのがモノリシックになっているOSカーネル その場合でも分離されているデバイスドライバは最近のデバイス複雑化と更新対応の多さからもRust化が向いているため進んでいる
545:デフォルトの名無しさん
23/10/22 19:58:13.61 fijCTFBo.net
>>531
もうちょっと上位のレイヤーなら良いと思うけどね
Cでバッファオーバーランするようなプログラムって
結局Rustでもunsafe使わざる終えないような処理なので
546:デフォルトの名無しさん
23/10/22 21:57:00.47 xV2fKCwr.net
構造体をキャストするものでも、hoge_storage_t みたいに最大サイズを規定するパターンと
char foo[0]; を積極的に利用するパターンと 真っ二つにわかれるしねぇ
後者はRustでどうすんだろ
547:デフォルトの名無しさん
23/10/22 22:15:56.13 fijCTFBo.net
結局構造体もパケットのバイト列にパックするからね
その時unsafeを使うことになる
548:デフォルトの名無しさん
23/10/22 22:45:30.49 EpprGwAf.net
構造体はunsafeいらん
タグ無し共用体はunsafe
549:デフォルトの名無しさん
23/10/22 23:15:20.26 HWj9itUZ.net
流行るから価値ある、流行らないから価値なしって評価基準はジャパニーズカルチャーのガラパゴス
550:デフォルトの名無しさん
23/10/22 23:23:05.72 /1lQw0Ls.net
>>534
後者も普通に表現できるしCとのFFIも可能
551:デフォルトの名無しさん
23/10/22 23:28:57.61 zUgjdRO9.net
Redox(URLリンク(www.redox-os.org))みたいなRust製のUnix系OSプロジェクトならもうあるし
無理してLinuxに食い込む必要はないと思うんだけどLinux開発者でもRust使いたい人はいるんでしょ
Linuxは一部のモジュールがRust製になる程度で中核は最後までCで通すと思う
というかRustで置き換えるなら名前変えてほしい
552:デフォルトの名無しさん
23/10/23 00:13:38.68 tCssLiBK.net
>>539
まあカーネルで使ってる基本的なデータ構造(赤黒木、ハッシュテーブル、双方向リスト)
kref(リファレンスカウント)などは外せないからね
無理に組み合わせるとかえってキツい気がする
553:デフォルトの名無しさん
23/10/23 05:58:05.37 3382hDjx.net
>>533
実際にはCでもバッファオーバーランしないからRustでは、unsafe必要ないでしょ
554:デフォルトの名無しさん
23/10/23 06:59:33.53 8gpCEC0e.net
>>533
>使わざる終えない
昔こんな誤字よく観たな
555:453
23/10/24 00:55:17.36 Ei0IGfb9.net
>>500
今度は逆にrustで書いたもの>>453をcで書いてみた
URLリンク(ideone.com)
・参照透過性は考慮していない
・型のパラメータ化?には挑戦してない
・パターンマッチ再現?にも挑戦してない
・クロージャが欲しいところには呼び出し元の文脈を手渡して誤魔化す
・グローバル変数一個使ってノードの再利用を試みてる
・とにかくlist_qsort内部がそれっぽい感じの手順になってたらヨシ
struct node {
int value;
struct node *next;
};
struct node *list_qsort(const struct node *list) {
int pivot;
struct node *sorted = 0, *tail, *smaller, *rest, *a, *b;
if (list) {
pivot = list->value, tail = list->next;
list_partition(&pivot, less_than_context, tail, &smaller, &rest);
sorted = list_append(a = list_qsort(smaller), b = list_cons(pivot, list_qsort(rest)));
list_available_push_all4(smaller, rest, a, b);
}
return sorted;
}
556:デフォルトの名無しさん
23/10/24 13:32:38.68 oyxcPsiu.net
スレチ
557:デフォルトの名無しさん
23/10/24 16:02:23.69 ju9L4gE1.net
cargo 経由で rustc にコンパイルオプションを渡したいとき
RUSTFLAG=hogehoge
で成功はしたのですがパッケージ全体が再コンパイルされて遅いです
特定のファイルだけにコンパイルオプションを適用したいのですが
cargo にはそういうオプションはありませんか?
558:デフォルトの名無しさん
23/10/24 18:21:38.30 u/7eM1yW.net
>>545
ありません
559:デフォルトの名無しさん
23/10/24 20:07:58.68 dncTx+4h.net
大文字小文字が混在する言語って気持ち悪い
560:453
23/10/24 22:19:05.86 yQ/jFyOv.net
>>543 c
URLリンク(ideone.com)
・ノード再利用やめた
・若干の整理
561:デフォルトの名無しさん
23/10/25 09:06:18.67 9oOV85NF.net
>>545
試してないけど
やるとしたら
cmdとかterminal(shell)を2つ以上別ウィンドウで開いておいて
それぞれ別のRUSTFLAG=を設定しておく(環境毎に独立なはず)
片方でbuildしたあと適用したいファイルだけ修正してもう片方でbuildするとうまくいかんかな
562:デフォルトの名無しさん
23/10/25 10:10:31.38 p3+NCv68.net
特定のファイルにだけ適用したいコンパイルオプションて何なの?
563:デフォルトの名無しさん
23/10/25 10:43:36.55 dKf07X6i.net
crateで分割したらいけるんじゃね
564:デフォルトの名無しさん
23/10/25 11:35:23.44 CN7zqSRs.net
そらそうやろと言いたいところだが
今はcrate単位の指定はできなくてパッケージ単位のみ
565:デフォルトの名無しさん
23/10/25 13:57:15.42 0w7kqvd/.net
crate で別れてる前提で
その crate を使う2つの bin (まあまあそっくりな main) を造って
それぞれをそれぞれの RUSTFLAGS= で build したら
うまく使い別けられました
とりあえず速度は気にならないからしばらくこれで逝く
アイディア呉れた人thx
566:デフォルトの名無しさん
23/10/26 14:45:03.06 6bJ9rmmH.net
しつもんです
cargo publish のときに
warning: package `hoge vN.N.N` in Cargo.lock is yanked in registry `crates-io`, consider updating to a version that is not yanked
って警告が出てて意味は判るんだが
cargo clean してやり直しても package 'hoge vN.N.N' が最新のものに切り替わらない
自分自身の Cargo.toml の dependencies には hoge は描かれていない
どの crate が原因で hoge を要求してるのか知るにはどうすれば良い?
その crate を最新のものにすれば hoge の yank されてないものを取って来てくれるとも限らない訳だが
567:デフォルトの名無しさん
23/10/26 15:53:54.89 wO29ziTZ.net
cargo treeを使うといいよ
568:デフォルトの名無しさん
23/10/26 21:41:03.08 pAbfpEYj.net
Rust で書かれた WebAssembly/Canvas 上の
FlashPlayer のエミュレータ Ruffle の実装が
凄い勢いで進んでるけど
世界の凄腕プログラマも参戦してるみたい。
このスレで貢献してる人ひょっとしている?
エミュレータ実装て武者修行になるのかな。
569:デフォルトの名無しさん
23/10/26 23:18:45.93 oN20rU1J.net
エミュレーターを作り始めるスタートは完全な仕様の資料を手にいれることで、それがないことも良くあることだから調査がしんどいんだよ。
そんで実装は仕様通りにやるだけのひたすらに地道な作業だからあまり面白味はない。
動くだけじゃなくて性能を出そうと思ったら色々と工夫の余地はあるんだけど……
570:デフォルトの名無しさん
23/10/27 10:08:58.42 d8VwEqUV.net
古いゲーム機のエミュレータを書いたことがあるが結構面白いぞ
昔のソフトはクロックタイミングに依存することも珍しくないから、性能だけでなく再現精度にも気を配らなくちゃいけない
腕試しとしてはちょうどいいと思うよ
571:デフォルトの名無しさん
23/10/27 12:30:38.77 xuiID3+p.net
もっと良いサイトあったんだけど消滅してる?
URLリンク(sunlight.cocolog-nifty.com)
URLリンク(www.sm.rim.or.jp)
572:デフォルトの名無しさん
23/10/27 22:25:37.09 2hH60kIl.net
>>557 >>558
そうですね、面白さと言う点では
当時は無かった WebGPU等の現代的な技術を
積極的に取り入れて
本家 FlashPlayer の単なるエミュレータに留まらず
ブラウザWASM上の本格ゲーム・アニメプレーヤーに
なりそうな所が興味を引きます。
取り敢えずは日本人として
縦書きCJK 2バイト文字列の動的表示等の
検証報告で協力できたらと考えております。
(和風ゲームのイベント表示など)
573:デフォルトの名無しさん
23/10/27 22:44:06.00 nnq2nBUF.net
web上で再発明するの好きなやつ多いよね
でも失敗率高めじゃないか?
574:デフォルトの名無しさん
23/10/28 14:23:38.78 AMpKEF3U.net
自己鍛錬で再発明するのは好きにすればいいがそれでサーチエンジンの上位を占拠するのはマジ迷惑だ
575:453
23/10/28 18:50:08.51 U0JINWpQ.net
>>548 c
URLリンク(ideone.com)
・ノードへのポインタとしてリストを表現していた(>>548)のを廃止
・共用体でリストを表現したことによりBoxの位置?がRust版(>>453)と同じに
・特に意味もなくループ文を再帰に置き換え
576:デフォルトの名無しさん
23/10/29 12:47:29.07 IsQ6p7Vf.net
uBlacklist が猿人検出阻止してくれるそうだ
sejuku とか techacademy とか KENTA とか入れると良い
577:デフォルトの名無しさん
23/11/03 14:51:57.32 fSSaeY5g.net
=== 複製おじさん(通称複おじ)について ===
Rustスレを中心に活動し、2023年4月現在で1年以上ム板に住み着くRustacean。無自覚な荒らし。
Rustスレでは、基本的に他住民の意見を聞いて糧とすることなく、自らのコードが最善であると、ID変更自演を交えいつまでも主張し続ける。
同スレで「所有権が複製される」という違和感のある表現を、「違和感がある」とする他住民の意見をすべて否定してしつこく擁護し続けたことから、「複製おじさん」というあだ名が付けられた。
それ以外のム板スレでは、基本的に他住民の意見を聞いて糧とすることなく、Rustこそが最善であると、ID変更自演を交えいつまでも主張し続ける。
その基本戦術は、「GC言語は遅い」の一声でC/C++/Rust以外の言語を否定し、残ったC/C++は安全ではないので、Rustが最善であるとするもの。
しかしながら、Rust以外の言語に関しては、正当な批判を展開するのに十分な知識を持っているとは言いがたい。
本スレPart1では、C++の問題点を指摘しようとして多数の誤り・知識不足を露呈することとなった。特にしつこく食い下がったのが「動的ディスパッチ」に関する誤解である。
スレリンク(tech板:786番)-799(ID:Evbafc70とID:RiLc+pIfが複製おじさんであると考えられている)
要約すると、通常「条件分岐」と呼ばれるものを「動的ディスパッチ」と呼ぶのが正しいと主張し続けたのである。
常識的にはあり得ない誤解だが、提示されたC++のコードが自らの主張(C++にはパターンマッチが無い)に不都合であると感じたためか、C++のコードを正しく読み解くことができないにもかかわらず脊髄反射的に否定してしまい、その根拠として誤った論理をこじつけてしまったものと思われる。
ちなみにこの後、同種の誤解を持って書き込むID:wHEiYRW7(これはID使用歴的に複製おじさんとは考えにくい)に対して、正しい理解に基づく指摘を行う単発IDが複数出現するが、この中にも複製おじさんが多数含まれていると考えられている。
このように自分の誤りを認識した場合、それを認める書き込みは決して行わず、別人の振りをして最初から正しく理解していた体を装うのも複製おじさんの特徴である。
578:デフォルトの名無しさん
23/11/03 20:56:04.34 uUmiO3VU.net
Generatorはコードがごちゃっとしてたからgen fn/blockはありがたいな
579:デフォルトの名無しさん
23/11/03 22:49:04.51 Q6dMbwrG.net
2024 editionから?
580:デフォルトの名無しさん
23/11/04 04:29:37.91 xhYE5yZM.net
Rustの学習を始めたが、所有権面倒くさい。まあでも安全性は高められそうな感じはする。
581:デフォルトの名無しさん
23/11/04 12:29:53.92 eFHrirh7.net
Better C的なRustが欲しい
C++と張り合って仕様が複雑になってる
582:デフォルトの名無しさん
23/11/04 12:45:03.68 whQSHNtc.net
>>569
それはZigじゃない?
とはいえ、所有権いい感じに見てくれない言語を今更betterと言えるかというと微妙か。
583:デフォルトの名無しさん
23/11/04 13:26:02.22 ocaBqo/v.net
Rust は別に C++ と張り合ってなんかいないよ。
現実に使うものはどうやったってどこかで汚くなるってだけ。
綺麗なものは使われてないものだ。
584:デフォルトの名無しさん
23/11/04 14:22:45.66 nDDUhOSB.net
>>569
Odinはいかが?
URLリンク(odin-lang.org)
585:デフォルトの名無しさん
23/11/05 00:55:20.60 Frni44mO.net
>>569
Carbon
586:デフォルトの名無しさん
23/11/05 13:27:00.92 bq/z7Mod.net
>>567
「gen」予約keyword化はそうだね
587:デフォルトの名無しさん
23/11/09 15:19:57.39 j64EPVX0.net
すまんが、VSCode上から/examples下にあるものをデバッグしたい場合ってどうやんの?
他人の作ったクレートのコードを読む上で、これを楽にできると個人的にはありがたいんだけど・・・・
588:デフォルトの名無しさん
23/11/09 22:37:41.41 vNSbYVSe.net
バージョンと拡張機能によりそうだけど自分の環境(Windows)だと
examples内でもfn main()の上に
|> Run | Debug
みたいなinlayが表示されてとりあえずそこからデバッグ実行できた
設定作ればほかの起動方法もあるはず
たぶんrust-analyserの機能だけどデバッガは環境依存だからわからん
589:デフォルトの名無しさん
23/11/12 02:38:23.29 O0gb6uIB.net
gen はいわゆる協調スレッドなのか。
言語機能として取り込むにはちょっと豪華すぎる気もするな。
590:デフォルトの名無しさん
23/11/12 04:55:58.85 2kP6dQwH.net
genはasyncと同じでコルーチンだよね?
そしてasyncと同じく単純な状態マシンで実装だよね?
591:デフォルトの名無しさん
23/11/12 07:45:09.87 sBWcqg0h.net
>>576
ありがとう!バッチリできたぜ!!!
592:デフォルトの名無しさん
23/11/12 09:05:18.31 7FyJ/l9p.net
TikTok LiteでPayPayやAmazonギフトなどに変換可能な4000円分のポイントをプレゼント中!
※既存TikTokユーザーの方はTikTokアプリからログアウトしてアンインストールすればできる可能性があります
1.SIMの入ったスマホ・タブレットを用意する
2.以下のTikTok Litのサイトからアプリをダウンロード(ダウンロードだけでまだ起動しない)
URLリンク(lite.tiktok.com)
3.ダウンロード完了後、もう一度上記アドレスのリンクからアプリを起動
4.アプリ内でTikTok未使用の電話番号かメールアドレスを使用して登禄
5.10日間連続のチェックインで合計で4000円分のポイントゲット
ポイントはPayPayやAmazonギフト券に変換可能です!
家族・友人に紹介したり通常タスクをこなせば更にポイントを追加でゲットできます。
593:デフォルトの名無しさん
23/11/12 11:30:27.32 cviedAAA.net
>>580
既にやってるよ
594:デフォルトの名無しさん
23/11/14 12:58:29.06 SRCspH78.net
URLリンク(crates.io)
0なんだが
595:デフォルトの名無しさん
23/11/19 15:31:52.34 J3g/JpQ/.net
rust初心者です。
cだとポインタに対してキャストすることで完全にプログラマ任せのキャストが出来ます。
例えば文字列を参照するポインタを強引に数値として解釈させるなど、好きなように出来ます。
rustでは簡単に調べたところparse().unwrap()などが必要だそうです。
rustはcのようにバイナリフォーマットをプログラマ任せにして自由にキャストさせる習慣はないということでしょうか?
596:デフォルトの名無しさん
23/11/19 16:23:14.27 /G2k3fWt.net
あるよ
597:デフォルトの名無しさん
23/11/19 16:29:48.57 eJPqaRZx.net
#[repr(C)]
as *const T
as *mut T
as usize
bytemuck
slice::from_raw_parts
598:デフォルトの名無しさん
23/11/19 16:46:38.60 ib2hIQe1.net
バイナリや文字列と内部表現・の相互変換(シリアライズとデシリアライズ)ならば
Rustではdeser crateファミリーを使って専業分離することが多いね
599:デフォルトの名無しさん
23/11/19 18:17:50.06 b3b61WiC.net
シリアライズ関連のクレートを使った方が楽だし、もうちょっと簡易的にやる場合でも from_le_bytes などの組み合わせで安全にやれるから不必要にプログラマの責任で管理するべきではないよ。
C でもいまどきは高レイヤのプログラムならそんなに気軽に未定義の型変換はしない。(もっとも、高レイヤではあまり C を使わないけど)
600:デフォルトの名無しさん
23/11/19 18:43:57.48 ib2hIQe1.net
ごめん、アホなスペルミスしてる
deserでなくてserde
あとserde_bytesやbincodeを併用
601:デフォルトの名無しさん
23/11/19 23:58:07.78 J3g/JpQ/.net
少し調べてより明確に言語化出来ました。
Rustはゼロコストのserderができますか?
Cだとしばしばそれができます。構造体の要素次第ですが。
で、調べてみるとrkyvというフレームワークが近いことを可能にしているようです。
ゼロコピーと謳っていますが、何らかの演算コストが生じているのかどうか。
Cなら構造体を注意深く設計すればキャスト一発で実行時コストゼロでserderが完了するのです。
602:デフォルトの名無しさん
23/11/20 02:05:15.84 ilBq5gGe.net
>>589
>Cなら構造体を注意深く設計すれば
なんでそのコストを無視するんだい?
603:デフォルトの名無しさん
23/11/20 02:16:16.40 UjbzCz3W.net
>>590
実行時コストじゃないからです。
例えばRustのゼロコスト抽象化という概念もあくまで実行時コストがゼロであることを意味しているはずです。
604:デフォルトの名無しさん
23/11/20 02:16:45.62 K0+PyRHv.net
#[repr(C)]付けてstruct/enum/unionをCと同じ使い方すればC互換のレイアウトになるはず
605:デフォルトの名無しさん
23/11/20 06:49:29.19 dNsGQu4G.net
>>589
Cと同じことがしたいだけならrepr(C)で構造体定義して
std::mem::transmuteでキャストすればいい
rkyvみたいなフレームワークはもっと高度なデータ型(ハッシュマップとか)で同じことをやるためのもの
606:デフォルトの名無しさん
23/11/20 08:53:23.51 LwcosZwN.net
抽象度の高いレイヤを挟んでもかなり最適化で消えるよ。
逆に自由なキャストのコストはゼロではない。
ハードウェアの癖、処理系の癖を理解している人がうまくチューニングすれば性能はあがることも多いけどキャストして直接に読み替えたら実行時コストが低くなるとは限らない。
607:デフォルトの名無しさん
23/11/20 13:51:58.80 MS7hPbOQ.net
>抽象度の高いレイヤを挟んでもかなり最適化で消えるよ。
それはもちろん判ってて
その上で厳密にゼロじゃないから問題視してんじゃん
608:デフォルトの名無しさん
23/11/20 15:34:39.51 JXHwx0JF.net
具体的にRustを使うメリットよりデメリットが上回る例があるならそれを出さないと話がわからない
色んなバイナリプロトコルもRustで実装されて問題になっていない
609:デフォルトの名無しさん
23/11/20 17:27:20.27 cTETCu/a.net
transmuteだとalign合わせるためにコピーする場合がありそうだから
本気でCと同じゼロコストで読み替えするならポインタ(参照じゃない)をとって
as *const T(as *mut T)で目的の型にキャストして参照(&T, &mut T)に戻す感じかな
どうせunsafeだからunion使う方がいいかもしれないけど
610:デフォルトの名無しさん
23/11/20 17:54:17.33 PG0EBfXZ.net
Cから移植する場合でtagged unionをうまく移植する方法はないだろうか
unsafe使わずに
struct tagged_value {
enum tag t;
union {
hoge h;
fuga f;
} u;
};
みたいなの
611:デフォルトの名無しさん
23/11/20 18:11:32.44 NaWZknyA.net
>>598
enumで
612:デフォルトの名無しさん
23/11/20 18:17:00.50 ieYqPgSw.net
>>595
最適化の話は「どちらにしてもゼロとは限らない」という話のための前ふり。
仮にその場所に限ってはゼロになったとしても周囲の最適化の足を引っ張ることもある。
総合的な速さを出すには諸々を加味したチューニングが必要なので単純にキャストしたほうが速いとは考えるなというのが主旨。
もちろん諸々を考慮して検証した上で実際に速くなることが確かめられるならそれを否定したりはしないよ。割に合うことは少ないとも思うけど。
613:デフォルトの名無しさん
23/11/20 21:13:04.59 ojqzhkRS.net
ちゃんと考えるよ。
角度とか
614:デフォルトの名無しさん
23/11/20 23:02:22.90 QHUUbGYT.net
重要なのは、Rustで書くと遅くなる(コストがかかる)パターンを、実際に発見できたのかどうか?
もしそのようなパターンを発見できて、(Cによる)速い方法でも安全性に問題がないのならば、
Rustの歴史ではそれを(必要なら)unsafeで記述してライブラリの中に安全に閉じ込めてきた
そのためRustで一般プログラマーがunsafeを使わずに記述しても、ほとんどのケースでCと同等の速さが出る
615:デフォルトの名無しさん
23/11/21 04:05:24.41 60zWiP9n.net
個人的な懸念点は処理のゼロコピー化においてCに劣るのか?という点
Rust界隈でゼロコピーフレームワークが色々あるがどういう工夫が行われているのか
調査は時間がかかりすぎるからやらないw
616:デフォルトの名無しさん
23/11/21 04:13:54.83 60zWiP9n.net
データ転送はCPU上の演算と比較してかなり遅い処理なので
ゼロコピーで劣ると一部の処理でかなり遅くなる
そしてベンチマーク系のプログラムではゼロコピーはあまり問題にならない。
617:デフォルトの名無しさん
23/11/21 04:16:28.76 60zWiP9n.net
ゼロコピーが問題になるのはserder、通信
あとたぶんOSの実装でも問題になるはず
だから数学的計算というよりはシステム間の垣根を超えるようなところで問題になる
RustがベンチマークでC並といっても、あくまで数値計算系の話
618:デフォルトの名無しさん
23/11/21 08:42:33.89 UPhRR3yr.net
ゼロコピーってのはオリジナルのバッファ以外には追加でヒープアロケーションをせずに処理をするという意味
619:デフォルトの名無しさん
23/11/21 10:07:46.27 ZzleWc4x.net
ウザイからttf_parserのコードでも読んでくれば
620:デフォルトの名無しさん
23/11/21 11:00:12.68 HSO31doi.net
unsafe という名前が誤解の元になってる
unsafe に描く内容って結局安全な内容しか描いてはいけない訳だ
そして unsafe は使ってはいけない機能ではなくむしろ積極的に使って良い機能
621:デフォルトの名無しさん
23/11/21 11:55:27.06 pNsPVZam.net
こういうやつがいるからこそunsafeという名前に価値があるんだよな
622:デフォルトの名無しさん
23/11/21 12:57:54.74 4vFkathr.net
>>605
それらRustで書くことで遅くなった事例がない
むしろ例えばCDN世界トップのCloudflareは
Cで書かれたnginxを全面的にRustで作り直すことで
CPUリソースとメモリリソースを1/3に削減することに成功している
623:デフォルトの名無しさん
23/11/21 15:25:53.24 OibZ9mzY.net
Cloudflareのやつはnginxがスレッドベースで処理をブロッキングしてしまう(CPU時間とメモリを占有してしまう)から
マイクロスレッドで作り直した=基本設計を大きく変更したというだけで、Rustだからパフォーマンスが向上したというわけではない
624:デフォルトの名無しさん
23/11/21 16:18:31.31 Pb5WKpvw.net
stdをunsafeで検索するとUnsafeCellしか出てこなくて
unsafeな関数の名前がほとんどuncheckedなのは
let x = unsafe { do_something_unsafe() };
だとアホっぽいからかな
625:デフォルトの名無しさん
23/11/21 18:24:54.78 Fzh9NpIU.net
検索方法が間違ってる
そしてuncheckedはunsafeとは意味が違う
626:デフォルトの名無しさん
23/11/21 23:10:58.28 lumDzvUR.net
>>611
そこではなく
杞憂の>>603が言うところのゼロコピーやゼロコストはCとRustで同様に実現できているから
新たなシステムはCを使わずにRustで書いたという話ではないか
627:デフォルトの名無しさん
23/11/21 23:28:16.17 u3FDf3nL.net
外部入力をtransmuteとか地雷臭がハンパない
どうぞご安全に~
628:デフォルトの名無しさん
23/11/21 23:39:45.33 lumDzvUR.net
transmute使わなくてすむsafeなライブラリ関数が揃ってるからね
629:デフォルトの名無しさん
23/11/25 09:15:59.95 rKTwm3uz.net
Rust って同じ変数名なのに違う型に出来るよね?
同じスコープで再定義出来ると言うか上書き出来る
名前が変わらないから便利って思うかも知れないが
気を付けてソース観ていないと途中で型が変わってるやん!ってなる
なかなか嫌な構文だね
可読性低下しない?勘違いしそう
630:デフォルトの名無しさん
23/11/25 09:18:00.86 rKTwm3uz.net
あと上書きされたとき前のリソースは上書きされたタイミングで消えてない
明示的に drop していれば消えるがしなかったら実は生きたまま
迷惑仕様じゃないかな
631:デフォルトの名無しさん
23/11/25 10:20:51.65 ytuM+CNS.net
>>618
同じスコープ内でシャドウィングする時は意味的に同じものを入れるようにする
前のリソースがすぐにドロップされないのはシャドウィング時にそのリソースへの参照を使う事で不要なアロケーションを避けられるから
632:デフォルトの名無しさん
23/11/25 12:38:39.68 EEEndPKs.net
シャドウイングされた時に勝手に消える方が迷惑仕様だな
その時点で他から参照されてるかもしれないし
633:デフォルトの名無しさん
23/11/25 13:46:10.54 V6cVkJ+M.net
>>617
Rustはプログラマーに優しい強い静的型付けの言語だから型が違えばエラーになるため混乱もなく大丈夫
また、型変換するたびに別の変数名にしなければいけなかった言語よりも便利でプログラミングも快適だよ
634:デフォルトの名無しさん
23/11/25 16:27:51.72 81rqCYd0.net
Rustの欠点は誰も使ってない所だけ
635:デフォルトの名無しさん
23/11/25 17:24:40.07 4EAT4Ovg.net
>>622
どうしてそんな悲しいこと言うの!
636:デフォルトの名無しさん
23/11/25 18:44:41.46 vlc4nTzz.net
誰も使ってないのってカッコいいな
637:デフォルトの名無しさん
23/11/25 23:55:37.33 B979bnCG.net
俺だけが知っている
638:デフォルトの名無しさん
23/11/26 09:12:21.52 k38CbPq9.net
ユーザーが少ないのはアドバンテージだってポール・グレアムも言ってる。
639:デフォルトの名無しさん
23/11/26 09:20:04.49 OE1+8Rl8.net
GAFAMで使われるようになった時点で言語として消え去る可能性は十分下がったし
別にこれ以上使う人増えなくてもいいんじゃないかな
日本のSIerにまで広まるなんてまずないだろうし
640:デフォルトの名無しさん
23/11/26 10:05:44.56 Deg4O8Si.net
言語じゃないけどBlenderみたいにいつの間にか覇権を取ってたりすることもあり得る
641:デフォルトの名無しさん
23/11/26 11:39:45.82 d/KzVdDP.net
おまえが使ってるのに誰も使ってないって可笑しなことを言うのな
もしかしておまえも使ってないだろ?正直に言え
642:デフォルトの名無しさん
23/11/26 11:42:35.06 Deg4O8Si.net
「俺の周りじゃ」
643:デフォルトの名無しさん
23/11/26 12:18:50.10 d/KzVdDP.net
ぼっちってこと?
644:デフォルトの名無しさん
23/11/26 12:23:12.23 oOwLuMql.net
Rust「きゃー、私のために争わないで
645:デフォルトの名無しさん
23/11/26 12:32:50.97 iMOX0Yuj.net
クズがこっちに移動してきたか
まかせろ
646:デフォルトの名無しさん
23/11/26 13:04:33.25 oOwLuMql.net
crateのバージョンが1.0になってないのが多いから、まだまだだなーって思う
647:デフォルトの名無しさん
23/11/27 02:23:02.91 hnitA9Px.net
ぼっちざRust
648:デフォルトの名無しさん
23/11/27 03:19:17.53 shAL5QFI.net
>>635
ちょっとかっこいいじゃん
649:デフォルトの名無しさん
23/11/27 10:05:45.61 7/k6/GSg.net
草
URLリンク(www.youtube.com)
URLリンク(www.youtube.com)
URLリンク(www.youtube.com)
URLリンク(www.youtube.com)
650:デフォルトの名無しさん
23/11/28 08:31:02.24 t7+ip2Xg.net
Rustって名前が良くない
651:デフォルトの名無しさん
23/11/28 08:45:48.68 ruCnqVCc.net
Cナントカじゃそれこそカビが生えてる
652:デフォルトの名無しさん
23/12/03 08:34:26.30 JMjzgwiz.net
>>638
go-langよりはマシ
653:デフォルトの名無しさん
23/12/03 18:40:27.28 kcDV2U5x.net
go は何が駄目といってネーミングがクソすぎるからな
あとマスコットがキモすぎる
654:デフォルトの名無しさん
23/12/03 20:05:06.19 KItL/kTG.net
ogleとセットで売り出せていれば多少は救われたかもしれない
文字型runeの中二感は好きなんだけど
655:デフォルトの名無しさん
23/12/08 13:43:21.24 QsZXn/jV.net
VSCodeのrust_analyzerが、全く関係のないC#のプロジェクトでも勝手に動き始めるようになっちゃった
みんなのところどう?他の言語とか使ってたら起動しちゃったりしてる???
656:デフォルトの名無しさん
23/12/08 15:21:20.43 FH+GH+Zi.net
>>641
ネーミングが死ぬほどクソなのは同意だけど
マスコットはかわいいじゃん!
657:デフォルトの名無しさん
23/12/10 04:46:02.96 RGphax9G.net
ʕ◔ϖ◔ʔ < お呼びですか?
658:デフォルトの名無しさん
23/12/10 11:57:04.81 1MxEINjf.net
つべでrust検索するとゲームばっかり出る
659:デフォルトの名無しさん
23/12/21 16:58:33.82 HvDn5p2W.net
GAFAMで使われてるから廃れることないし、
コミュニティに変な人が入って来ない方が居心地が良いまである
660:デフォルトの名無しさん
23/12/21 17:12:16.21 JI0UYSEL.net
gopher はちいかわと同じヤバみを感じる
661:デフォルトの名無しさん
23/12/21 17:13:31.75 HvDn5p2W.net
言語のマスコットネタは寒いよなあ
662:デフォルトの名無しさん
23/12/22 13:35:06.75 lJtOGqn+.net
カニのフェリスも割りと一般的な名前
663:デフォルトの名無しさん
23/12/25 09:35:30.12 734EcmtL.net
「Rust」言語向けの“ビジュアルタイムトラベルデバッガー”「FireDBG」が公開
URLリンク(forest.watch.impress.co.jp)
664:デフォルトの名無しさん
23/12/25 10:28:47.95 7mXOqNeO.net
タイムトラベル?使い物になるのか?
665:デフォルトの名無しさん
23/12/25 12:40:39.37 Sk+Bp6T/.net
タイムトラベル知らんのか
666:デフォルトの名無しさん
23/12/26 01:14:24.20 79CvGGY2.net
>>652
CやC++やJavaでも昔からコールスタックは遡れたけど、あれのビジュアル良くしたやつとは違うのかね?
667:デフォルトの名無しさん
23/12/26 01:58:52.00 DHuhCQvi.net
>>654
違う
状態の変遷を戻ったり進めたりできる
つかググればすぐ出てくるやろ
668:デフォルトの名無しさん
23/12/26 04:22:44.20 hadQuCYF.net
>>634
コミュニティに入るPGのレベルが全体的に高すぎて
俺の実装でversionを1.0にするのはおこがましい的な萎縮が働いてそう
669:デフォルトの名無しさん
23/12/26 04:22:50.25 hadQuCYF.net
>>634
コミュニティに入るPGのレベルが全体的に高すぎて
俺の実装でvers
670:ionを1.0にするのはおこがましい的な萎縮が働いてそう
671:デフォルトの名無しさん
23/12/26 08:35:59.69 P1ddGMJS.net
>>656
セマンティックバージョニングのせいだよ。
バージョンナンバーの付け方は基準があって互換性が維持されるときとされないときで数値の上げかたが違う。
しかしメジャーバージョンがゼロのときは基準の適用外で勝手にしていいことになってる。
初期は試行錯誤があって当然だからね。
キッチリした管理なんかしたくないからまだまだ初期だという体裁でゼロのままにしたほうが楽なんだよ。
672:デフォルトの名無しさん
23/12/26 08:50:16.75 RJv1OlmX.net
>>658
これやな
オレオレライブラリ作る時とか
絶対に1系まで上げない
673:デフォルトの名無しさん
23/12/26 09:58:50.36 4qW9SvtE.net
Rustの要であるfutures futures-coreなども0.3のままだな
hyperは先月ようやく正式1.0になり先週1.1になった
h2が0.3から0.4に上がった
674:デフォルトの名無しさん
23/12/26 10:02:59.91 QVgSLMrU.net
どうでもいいな
675:デフォルトの名無しさん
23/12/26 11:10:33.20 rdxjbOn3.net
メジャーバージョンが0のライブラリなんて怖くてよう使わん
Julia並みの破壊的変更が来ても文句言えんからな
676:デフォルトの名無しさん
23/12/26 11:17:02.90 RJv1OlmX.net
そういう日が来たら全部壊して書き直した方が早いよ
自分の書いてる所の効率も洗練されて良くなるし
677:デフォルトの名無しさん
23/12/26 11:53:58.51 druMhfTB.net
まあこういう感じの真面目にサポートとかする気のない人しか使ってない言語なんだろうな
678:デフォルトの名無しさん
23/12/26 12:09:12.16 aCwAChA1.net
>>656
それ他の言語でも散見されるぞ
1.0は枯れ切った後に出て実質でかい機能追加は行わなくなったところでつけることが多い
大抵凄腕の人のライブラリに多いような気がする
SemVerが浸透する前からこの状態だったし
679:デフォルトの名無しさん
23/12/26 15:06:21.44 iSUEMnuj.net
Inkscapeは一生1.0に上がらないと思ってた
680:デフォルトの名無しさん
23/12/26 16:49:51.67 KvBUmVJg.net
GitHub Issueが2627件あるZigはどうするつもりなんだろう
681:デフォルトの名無しさん
23/12/26 17:19:43.95 Y/g/LC26.net
どうでもいいな
ライブラリの質はSemverで測るものじゃないから
682:デフォルトの名無しさん
23/12/26 17:33:22.23 E/z8PERd.net
ライブラリの質にsemver考慮しない人間、仕事にRust使う気がなさそう
趣味プログラムで一年も生かす気がないコードならまあわかる
仕事で限られた工数で長期サポートするならsemver気にしないはありえん
まあRustなんて所詮趣味プログラミング向けなのかもな
まともな仕事には使えん
683:デフォルトの名無しさん
23/12/26 17:36:00.58 APrQ9KVs.net
個々のバージョンにおいて出来が良いかどうかはともかくとして、
長期的な互換性に対する姿勢を測る指針のひとつにはなる。
684:デフォルトの名無しさん
23/12/26 17:43:23.74 AKSTTleD.net
帰れゴミカスども
スレリンク(tech板)
685:デフォルトの名無しさん
23/12/26 18:34:35.78 6dPf9R/w.net
ライブラリを選ぶときや使うときには当然Semverは気にする
でもそれは質を測るものではない
その違いが分からないとか理解に苦しむ
ま、どうでもいいけど
686:デフォルトの名無しさん
23/12/26 18:42:19.39 krXurI2c.net
rustを使う人は、みんな凄腕で無ければ自分で実装するイメージ。
687:デフォルトの名無しさん
23/12/26 20:02:46.87 E/z8PERd.net
>>672
質って品質って意味だろ?
品質にはサポート品質は当然含まれるだろ
688:デフォルトの名無しさん
23/12/26 20:12:35.91 RJv1OlmX.net
出来たばっかりの言語にやってきて
1系になってるライブラリまるでない使えねー!
お前はJavaに帰れ
689:デフォルトの名無しさん
23/12/26 20:20:41.08 E/z8PERd.net
>>675
古いって言ってももう開発開始から17年なんだよな
Javaリリースから27年であり、正直そこまで差はないだろ
正式リリースからは8年だけど、リリースが遅かったことを評価することは出来んし、正直そこまで差はないと思わざるを得ない
正直、いつまで新しい言語みたいな顔してるんだよって気持ちだ
まるで自分を若いと勘違いしているおっさんみたいだ
690:デフォルトの名無しさん
23/12/26 20:30:47.94 rdxjbOn3.net
しかしJavaに帰れってのも悲しい発言だな
結局仕事ならJavaって>>675も思ってるってことなんだもんな
691:デフォルトの名無しさん
23/12/26 20:34:34.53 4qW9SvtE.net
他の言語と比較したい人は言語比較スレへ
アンチ活動したい人はアンチスレへ
692:デフォルトの名無しさん
23/12/26 22:38:40.65 ewLNJPek.net
>>674
メジャーバージョンが1.0以上かどうかはサポート品質を測る指標にならないんだよ
実際にいろんなライブラリをきちんと調べて使った経験があれば誰にでもわかる常識的なこと
エアプで批判だけしたかったのだとしたらもう少し別の観点から攻めた方がいい
693:デフォルトの名無しさん
23/12/26 23:11:29.12 exfh4uMB.net
>>679
いや仕様が安定しているというのはオープンなライブラリが提供可能な最大のサポートだが
まあでもそう思わない分野があるのは理解できるよ
多分君の業界では一度書いたコードが1年以上使われることはないのだろう
そういう業界ではライブラリが変わりまくって新機能が追加されることをサポートと呼ぶだろうし、それはまあわからんではない
でも0.9で止めるみたいな、特に新機能付けるわけでもないけどfixする気もありません。好きな時に変えたいですみたいなのはサポートとは程遠いよね?
694:デフォルトの名無しさん
23/12/26 23:13:25.69 exfh4uMB.net
0.9は関係なかったな
695:デフォルトの名無しさん
23/12/27 00:41:46.65 3CBetLUr.net
>>680
まとめると
仕様の安定度を知りたいんたけど
よくわかんないから1.0未満は不安定
1.0以上なら安定だと判断してるってことだね
君の業界では
ご愁傷様です
696:デフォルトの名無しさん
23/12/27 00:49:37.20 JhhYq7wG.net
>>682
書いてないことを読み込んで妄想で勝手にまとめる読解力すごいな
697:デフォルトの名無しさん
23/12/27 00:53:03.07 6D5uPlZV.net
>>682
まぁワッチョイスレから逃げ回ってるような荒らしなんだから構うのはやめとこうぜ
698:デフォルトの名無しさん
23/12/27 05:17:40.43 /OnGyPrY.net
そこまでNGされるのが嫌なのか
699:デフォルトの名無しさん
23/12/27 21:49:50.71 feQ9KdG1.net
自然淘汰とかいうけど
それを人為的にやったらただの私刑じゃないかね
700:デフォルトの名無しさん
23/12/27 22:20:54.47 /OnGyPrY.net
改行NGにすれば全部消えるよ
俺は一時期それにしてたけどおもちゃが見えなくなるのは寂しいからやめた
どうしても消したい場合はそれ推奨
701:デフォルトの名無しさん
23/12/27 22:55:48.52 +Ixmj89w.net
Polonius期待
702:デフォルトの名無しさん
23/12/28 08:10:24.28 7EmcMJDG.net
1.0 出てても信頼できるかどうかは結局のところ内情ちゃんと見ないとわからないからなぁ。
パッチバージョンで破壊的な事するOSSはとても多い。
703:デフォルトの名無しさん
23/12/28 08:35:00.47 uitX+xsl.net
>>689
Rustならば
①バージョン上がろうがバージョン指定のまま使い続けられる
➁ソース内のテスト及びカバレッジの仕組により意図しない破壊的ミスを防げる
➂意図した破壊的変更は1.xから2.0へ上げるルールが守られているため①により1.*指定で安心して使える
704:デフォルトの名無しさん
23/12/28 09:01:37.54 JG4/aLYi.net
そのルールが厳格に守られてなんかいないって話なんやが。
705:デフォルトの名無しさん
23/12/28 09:05:11.24 tRLYlD1D.net
1.0を超えたら信頼出来るなんて言ってる奴は居ないんだよな
1.0を超えてないのは問題外だが
706:デフォルトの名無しさん
23/12/28 11:02:26.82 TCyyQhqN.net
>>692
1.0を超えてなくてもAPI仕様が安定していて信頼できるのも普通にある
1.0を目安にしちゃうのは中身を判断する術を持たないマヌケだけ
707:デフォルトの名無しさん
23/12/28 11:34:37.14 PHYdezLP.net
>>693
仕様が安定しているなら1.0にすれば良い
それをしないのは使用を固定したくないという甘えの意思表示
実態として変わらないとしても、人に使ってもらうことについて真面目に考えていない心の現れ
708:デフォルトの名無しさん
23/12/28 11:35:52.30 PHYdezLP.net
お前が勝手に信頼しているだけで、開発者も想定していない信頼を受けて困っているだろう
709:デフォルトの名無しさん
23/12/28 11:47:36.08 PHYdezLP.net
普通に考えて欲しいんだが、自分がライブラリ開発者の立場だったとして、1.0に上げていないライブラリを安定してて信頼できるものとして使うユーザーがいたら「ちょっと待って」って思うだろ
710:デフォルトの名無しさん
23/12/28 11:54:18.66 jeZ/sYb6.net
使わせてもらってる立場から、使ってやってるに増長するキッズ
文句言うならサポート契約でも結んでからにしろクズ
711:デフォルトの名無しさん
23/12/28 11:58:34.84 uitX+xsl.net
Rustと関係ない話なら他のスレでやれ
ここで話すなら具体的にRustのどのクレートの話か示せ
712:デフォルトの名無しさん
23/12/28 11:59:02.76 N5v1piyg.net
バージョン関係なくTHIS SOFTWARE IS PROVIDED "AS IS"なライセンスのライブラリでなに勘違いしてんだろこいつとは思う
713:デフォルトの名無しさん
23/12/28 12:00:19.07 N5v1piyg.net
>>698
ここを新しい雑談スレにするか
今決めた
714:デフォルトの名無しさん
23/12/28 12:00:19.20 PHYdezLP.net
開発者の意思表示を正しく読めよ
1.0になってないものを勝手に信頼するな
それはユーザーの心構えが出来ていない
715:デフォルトの名無しさん
23/12/28 12:02:39.92 jJTXzrLr.net
>>699
それは法の話だろ
法とは別に、法的な責任を取らないとしてもどの程度信頼して欲しいかがあるだろ
716:デフォルトの名無しさん
23/12/28 12:07:24.88 N5v1piyg.net
>>702
特定の機能のサポートは不十分ですとかそういうのならREADMEに書くけど
漠然と程度とだけ言われてもなんのことだろう……
717:デフォルトの名無しさん
23/12/28 12:09:48.59 x4URU/48.net
>>693
>>695
718:デフォルトの名無しさん
23/12/28 12:15:29.31 PHYdezLP.net
>>703
不十分なのが特定の機能だけなら全体を1.0に上げてからその機能をexperimentalとして提供して良いだろ
だから特定の機能が不安定とかはバージョンニングと独立では?
俺なんか勘違いしてるか?
719:デフォルトの名無しさん
23/12/28 12:19:43.58 uitX+xsl.net
具体的にどのクレートの話か出せない時点で机上の空論
720:デフォルトの名無しさん
23/12/28 12:25:11.39 N5v1piyg.net
>>705
具体的な領域
721:の限定や条件の明示なく絶対的な「信頼」が存在すると思っている それがv1リリースで示されると思っている、ってあたりを勘違いしてるんじゃないかな…… セキュリティを語るときに「この前提が崩れない限り」安全としか語れないのと似ている
722:デフォルトの名無しさん
23/12/28 12:30:33.09 PHYdezLP.net
>>707
それはお前の勘違いだな
俺はv1になっていないと信頼出来ないとは書いたが、
v1リリースで示されるとは一言も書いていない。
対偶は成立するが、裏は成立しない。高校で習っただろ
723:デフォルトの名無しさん
23/12/28 12:35:25.46 N5v1piyg.net
>>708
なるほどな、「『俺は』信頼できない」か
「信頼できる」と呼ぶに値する主観的絶対的基準があるんだな
それが何かは明文化できる?
724:デフォルトの名無しさん
23/12/28 12:35:38.49 ySYWG+kx.net
お前まともにRust使ったことないだろう
なんでこのスレにいるの?
725:デフォルトの名無しさん
23/12/28 12:39:55.64 9fQ265/7.net
仕様の安定度を知りたいなら1.0未満かどうかなんてゴミのような基準使わなくても他にいくらでもマシな方法があるだろうに
726:デフォルトの名無しさん
23/12/28 12:43:17.71 PHYdezLP.net
>>709
「俺は」は「書いた」にかかっている
複数通りの解釈が可能な文書を書いたことを謹んでお詫び申し上げる
727:デフォルトの名無しさん
23/12/28 12:46:56.09 N5v1piyg.net
>>712
なら要旨は変わらないよ
絶対的信頼などない
せいぜいcargo-crevでも参考にするがいい
URLリンク(web.crev.dev)
728:デフォルトの名無しさん
23/12/28 12:49:05.73 PHYdezLP.net
>>713
絶対的な信頼が可能なものなど存在しないのが当たり前なので俺はこれまで話題にも上げなかったが、どうしてもその話をしたいようなので、そんなものはないという点については当たり前のこととして同意することをここに記す