[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 11/01 06:23 / Filesize : 300 KB / Number-of Response : 1022
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Rust part11



1 名前:デフォルトの名無しさん mailto:sage [2021/06/17(木) 00:24:12.56 ID:NvYoNP9C.net]
公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

Web上の実行環境
https://play.rust-lang.org

日本語の情報
https://rust-jp.rs/

※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/

※C++との比較は専用スレへ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/

前スレ
Rust part10
https://mevius.5ch.net/test/read.cgi/tech/1617367084/

29 名前:デフォルトの名無しさん [2021/06/21(月) 07:39:35.72 ID:3uERIKtL.net]
>>13
様々な文字列処理をしたことがある人になら自明ですが
文字列を扱う場合は¥0終端よりもスライスのほうが圧倒的に有利です
例えば何段か深いディレクトリの絶対パスが与えられた時に各ディレクトリのリストを返す(つまりsprit)時
¥0終端方式だと元の文字列を書き換え破壊しない限りコピーが発生してしまいます
スライス方式だと書き換えもコピーも発生しません

これは正規表現によるパターンマッチングでも同じで¥0終端方式だと結果である部分文字列をコピーしなければ返せません
またHTMLやJSONなどの様々な構造データの解析結果でもそうです
JSON文字列を解析して内部構造化表現にする時もスライス方式ならば文字列のコピーが発生せずに済むわけです

30 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 08:53:58.31 ID:xiUkcw19.net]
>>28
>文字列を扱う場合は¥0終端よりもスライスのほうが圧倒的に有利です

有利だろうが何だろうが、APIや過去の資産を活用するのに面倒という事実は何も変わらないが

31 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 09:07:04.10 ID:WbPJLyAM.net]
そういやRustの std::ffi::OsString って¥0終端なんだっけ?

32 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 09:43:03.40 ID:ILFJsIgR.net]
>>30
違う
null terminatedはCString

33 名前:デフォルトの名無しさん [2021/06/21(月) 11:29:12.30 ID:+vRECSeH.net]
>>29 FFIのことを考えつつスライスの恩恵(境界チェックなど)も受けるなら今のRustの文字列に最後に\0を入れるようにしたらいいと思ったけどなんでしないんやろ
\0分の1バイトぐらい今のPCじゃ問題にならないはず

34 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 11:49:33.30 ID:hH2X9nxJ.net]
>>32
従来の &str (部分文字列) とnul終端文字列を区別しないといけないけど
型で区別しようとすると結局今のCStr/CStringと同じになるのでは
文字列は部分文字列含め全部Stringみたいにヒープアロケーションするなら良いけどさすがに効率が悪すぎる

35 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 12:03:56.90 ID:vy1X2bYf.net]
これps5は60fpsでます??

36 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 12:11:12.63 ID:743v8uRC.net]
Rust違いです
ってかゲームのほうのRustって個別スレ無いんだね

37 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 12:12:05.66 ID:oYpDc35T.net]
FFIが必要な箇所で
let cstr = std::ffi::CString::new(str);
すれば済む話だからね

Win32APIだと\0終端の2バイト文字も渡したりするからCStringでも使い勝手悪そう
let wcstr: Vec<u16> = std::ffi::CString::new(str).to_str().unwrap().encode_utf16().collect();
で動くかな(試してない)
こっちは自分で'\0'足す方が簡単かもしれない



38 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 12:43:27.64 ID:UE5kS0Iw.net]
>>28
気持ちは分かるし、実際、その例に挙がっているケースではそうなんだけど、
字句解析は、コンパイラ理論の状態遷移図に基いて行うと効率が良いが、
それは 0 終端文字列の方が効率が良い。

39 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 12:53:52.20 ID:UE5kS0Iw.net]
何度も言うが、全面的にスライスが良いならC言語でも0終端文字列をやめに
してしまえばいいのだが、そういう訳ではない。
>>28 に挙がっているようなケースで、自分も同じような気持ちになったことは有るが、
一方で 0終端文字列の方が効率が良い例も少なからず存在しているので全面的に
スライス方式に変えてしまうのは難しい。
一番単純な例を書けば、英大文字の部分だけを読み飛ばす場合、

(1) ptrが0終端文字列を挿している場合:
while ( *ptr >= 'A' && *ptr <= 'Z' ) ptr++;

(2) (ptr, len)でスライス文字列を表現している場合 :
int cnt = 0;
while ( cnt < len && *ptr >= 'A' && *ptr <= 'Z' ) {ptr++; cnt++;}

後者だと、cnt < len と cnt++; の部分が追加されて効率が落ちる。

40 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 13:02:34.21 ID:WbPJLyAM.net]
Linuxカーネル開発における「Rust」採用の動き、グーグルとISRGがさらなる後押し
https://japan.zdnet.com/article/35172646/

> Googleは、ウェブサーバーソフトウェアの「Apache HTTP Server」向けのモジュールをRustによるモジュールで置き換えるというISRGのプロジェクトも支援している。

41 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 13:11:18.52 ID:+4cAknZI.net]
windows apiを使ってメッセージダイアログボックスを表示するサンプルが載ってるサイト教えてください

42 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 13:25:05.28 ID:hH2X9nxJ.net]
>>38
今のcpuとコンパイラの最適化で両者にどれくらいの性能差があるか示したベンチマークなどある?

rustでも文字列末尾に0を差し込めば同じことはできるので、本当に速くなるなら最適化の手法として採用しても良いかもしれない

43 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 13:41:31.99 ID:G7rEBmCP.net]
>>41
試しに手元の環境で1GB分やってみたが1割くらい差があるね
コンパイラはgcc9
でもRustの文字列ってnull文字含むことができるんじゃなかったっけ?試したことないけど

44 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 13:52:57.02 ID:xiUkcw19.net]
>>40

use winapi::um::winuser::*;

fn main() {
let str: Vec<u16> = "Hello, world!".encode_utf16().chain(Some(0)).collect();
unsafe{
MessageBoxW(std::ptr::null_mut(), str.as_ptr() , str.as_ptr(), MB_OK);
}
}

45 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 14:00:39.66 ID:yyeRDQfZ.net]
設計判断ってのは常にトードオフの選択だからな
ヌル終端にすることで得られるものと失うものを天秤にかける必要がある

得られるものしか見ないやつは設計からは手を引け

46 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 14:01:15.31 ID:yyeRDQfZ.net]
トレードオフね
あー恥ずかし

47 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 14:13:19.21 ID:t12YpwM9.net]
ああトードオフは重要だよな



48 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 14:31:05.42 ID:ILFJsIgR.net]
>>38
ptrとlenが分かってるなら別途カウントアップしていかなくても
どの位置のptrまで読めばいいか最初に分かるんじゃない?

49 名前:デフォルトの名無しさん [2021/06/21(月) 14:45:15.77 ID:6c6Y8dXA.net]
Rustってなんでprintlnの後にビックリマークあるの?

50 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 14:51:45.48 ID:G7rEBmCP.net]
>>47
確かに。end_ptrとの比較で終了判定した場合は(1)と差はなかった
比較一個分くらいなら今どきのプロセッサの並列実行で
十分吸収できるということかな

51 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 14:58:01.41 ID:oYpDc35T.net]
>>48
printlnは関数じゃなくマクロだから
ちなみにマクロにしてる理由は引数の型と個数が不定だから

52 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 15:29:27.47 ID:+4cAknZI.net]
>>43
先輩ありがとうございます!

53 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 15:40:08.22 ID:WbPJLyAM.net]
そういや、可変長引数を直接書けないからRustはクソって言う人はまだ見た事ないな
あんまり使わないからかな?

54 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 16:23:01.35 ID:hH2X9nxJ.net]
>>42
文字列中にNULが含まれないことを前提とした最適化だから
NUL含む場合は使えないという制約はあるね
Cの文字列と同じ制約だから実用上あまり困らないんじゃないのかな知らんけど

55 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 16:29:47.09 ID:hH2X9nxJ.net]
>>52
Cで可変長引数使いたくなるのってprintf系関数以外なんかある?

56 名前:デフォルトの名無しさん [2021/06/21(月) 16:52:01.19 ID:xiUkcw19.net]
>>54
ない
標準関数ではprintfとscanfだけ

57 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 17:01:59.90 ID:UE5kS0Iw.net]
>>47
なるほど、こういうことかな:
(2)' (ptr, len)でスライス文字列を表現している場合 :
int btm = ptr + len;
while ( ptr < btm && *ptr >= 'A' && *ptr <= 'Z' ) {ptr++;}

>>49
差は少なくはなるが、無くなるわけではない。
ptr < btm という部分が残るから。整数比較命令と 条件jmp命令の
合計2命令はまだ(1)より多い。



58 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 17:23:50.71 ID:a6mPBEl9.net]
>>56
そりゃ命令数に差があるのは当然だけど
現代的なプロセッサの並列発行や分岐予測を考慮して
なおパフォーマンス差があるかを見たかっただけなので
そちらは実際測定して差を確認できた?

59 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 17:32:00.25 ID:xiUkcw19.net]
議論するのそこ?
むしろセキュリティ(バッファオーバーランの危険性)とパフォーマンスを秤にかけて
rustはセキュリティの方を採用したってだけじゃない?

パスカル文字列なんて昔からあったわけだし

60 名前:はちみつ餃子 mailto:sage [2021/06/21(月) 17:54:38.56 ID:5bV+3LP7.net]
>>52
どうしてもやりたければビルダーパターンでまとめてから渡すイディオムが確立してるから
そんなに不満にもならないんじゃない?

61 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 18:00:00.24 ID:W8eb/Sbg.net]
>>58
いや安全な方を選んだってのはそのとおりだと思うけど
理論上遅いはずってのを実際測るとそうでもなかったってのはよくある話で
そこが気になっただけ

62 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 18:49:34.95 ID:xiUkcw19.net]
>>60
rustが組み込みも視野に入れている以上、現代的なプロセッサは当てにできないと思う
8bitマイコンとかでrustが動くのかどうかはわからないけど

63 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 19:12:19.82 ID:Qd3Oxzyr.net]
>>61
別にRustはあらゆるアーキテクチャでのパフォーマンスを保証するつもりはないと思うけどね
実際測定してるのはTier1環境だけだろうし

64 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 21:14:54.92 ID:MXwcp+e6.net]
winapiクレートを使うことってもうなくね?
Microsoft公式のwindiwsクレートの方がよっぽど使いやすいよ

65 名前:デフォルトの名無しさん [2021/06/21(月) 21:47:08.31 ID:L+7FW+LR.net]
>>38
>(1) ptrが0終端文字列を挿している場合:
>while ( *ptr >= 'A' && *ptr <= 'Z' ) ptr++;

その場合でも、まず与えられたデータが0終端しているかどうかを確認する必要がありますよね。
データがどこから来るのかは、
ネット上の通信相手か
ディスク上のファイルか
メモリ上の他言語等APIかになりますが、
いずれも盲目的に信頼せずに処理する必要があります。

そして小さいデータならばどんな処理方法でも誤差になるのでしょうが、
大きなデータの場合は>>28のように元はJSONとかHTMLのように構造をもっており、
その解析結果である各一部分が対象文字列になります。
すると0終端させた方がわずかに速く扱える可能性があるからといって、元の大きなデータから毎回コピーして0終端文字列を作る場合と、
コピーをせずにスライスのまま部分文字列を扱う場合との、比較になるのでははいでしょうか?

66 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 22:00:11.19 ID:xiUkcw19.net]
>>64
>元の大きなデータから毎回コピーして0終端文字列を作る場合

どこからコピーの話が出た?

67 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 22:22:17.51 ID:oYpDc35T.net]
>>65
変更したくない文字列"あいうえおかきくけこ"から部分文字列"かき"を取り出す場合、
スライス式だと元の文字列の[5:7]の範囲という形で表現できるからコピー不要だけど
ナル終端式だと"く"が邪魔で"かき\0"にできないからどこかに"かき"のコピーが必要になる

って話が>>28に出てる



68 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 22:57:58.01 ID:xiUkcw19.net]
>>66
なるほど、理解した

69 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 22:58:56.43 ID:ILFJsIgR.net]
その比較は部分文字列をコピーするかスライスで表現するかの違いであって
0終端文字列のメリット・デメリットとは少し違うんじゃない?
0終端でも同じようにスライスを(ptr, len)で作ればコピーは不要

70 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 23:46:42.70 ID:oYpDc35T.net]
>>68
> 0終端でも同じようにスライスを(ptr, len)で作ればコピーは不要

それをやってしまうとその部分文字列に対して0終端のメリットが効かなくなるわけで
コピーしないとメリットを得られないというのがデメリットになってる

71 名前:デフォルトの名無しさん [2021/06/22(火) 02:10:06.59 ID:JEO56Dr7.net]
つまり部分文字列を扱う場合は、コピーが発生する0終端方式が不利になりますね。
具体的にファイルパスからディレクトリ部分を得るとか、URLからホスト名を得るとか、元データを破壊したくない時は0終端方式だとコピーするしかないです。
つまり一貫してRustのように始点&長さ方式の方が、有利かつメモリ安全ではないでしょうか?

さらに文字列比較の場合も長さ方式よりも0終端方式が不利です。
これはCのmemcmpとstrcmpの比較に還元されますが、
memcmpは64bit比較やSIMD利用ができるからです。

72 名前:デフォルトの名無しさん [2021/06/22(火) 02:44:25.97 ID:fStlaCDg.net]
&strって3つの意味があると思うんだよね
1: 文字列リテラル
2: Stringの参照
3: 部分文字列
文字列リテラルとStringは終端にNULLを付けるようにして(今まで通りlenやcapは残す)、部分文字列は部分文字列を意味する別の型を作ればいいと思った
こうすることでRust側ではlenやcapを使い、C側ではNULL終端を利用できるという状態になる(Stringや&strをRustで使ってもCで使ってもゼロコスト)
もしNULL終端ではない部分文字列をCで使いたければStringに変換すれば使えるようになる(これはコストがかかるけどCの文字列も同じ問題を抱えてるので問題なし)

73 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 08:19:32.37 ID:7Ks2gqqv.net]
>>70
それやるには文字列がimmutableでなければならないから、それによって生じるスペースコストとどっちをとるかって話だな。
それにimmutableな文字列って、部分変更に相当する処理をする場合に逆にコピーが必要になるし。
どっちにしても一概に、コピー不要だからこっちが有利、みたいな話にはならんかと。

74 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 12:15:08.38 ID:UUxAOJV3.net]
rustで初心者がハマるポイントを初心者が紹介します

・所有権の概念が難しい
・何をするにしても外部ライブラリが必要(乱数生成など)
・ポインタが難しい

75 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 12:16:52.83 ID:hfO2UPRV.net]
・検索すると同名のゲームの話ばかり出てくる

76 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 12:26:02.44 ID:jOUHjhXv.net]
・static変数の扱いが面倒臭い

77 名前:デフォルトの名無しさん [2021/06/22(火) 12:52:20.13 ID:P9tLBTwV.net]
>>64
>その場合でも、まず与えられたデータが0終端しているかどうかを確認する必要がありますよね。
「0終端文字列」
というのは、必ず0終端されている文字列の事なので確認は不要。
それを明確にするために、C言語では、const char *pszText; のように、
psz という接頭辞をつける流儀がある。
psz = pointer to string ending with zero.
   「0で終端している文字列へのポインタ」
という意味。これは、単なる const char *ptr; とは意味が異なる。
char c = 'A';
const char *ptr = &c;  // 単なる文字へのポインタ。0終端されていない。
char szText[] = "Hello"; // 0終端文字列。0終端されている。
const char *pszText = szText; // 0終端文字列へのポインタ。0終端されている。



78 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 13:23:35.92 ID:D73AVe+6.net]
>>76
ファイルから読んだデータをpszHogeに格納するときにゼロ終端の要件満たしてるか確認する必要あるよねって話だぞ

79 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 13:25:24.28 ID:RVuteXyT.net]
>>74がマジで深刻すぎる
ついでに加藤純一っていうゲーム実況者とかとじゅんっていうRust/Scala使いがいるのも紛らわしい

80 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 13:35:53.88 ID:IhZgQU+B.net]
>>76
>というのは、必ず0終端されている文字列の事なので確認は不要。

という考えで脆弱性を量産してきたC言語の負の歴史を顧みて
Rustを始めとした新しい言語は異なる文字列表現を採用してるわけだ

81 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 14:06:03.07 ID:P9tLBTwV.net]
>>77
コンピュータの世界で「確認」とは、データの中を検査するという意味で
使われるが、そういうことは不要。
自分で末尾に 0 を書き込む必要があるだけ。

82 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 14:15:33.98 ID:3bNpX0tT.net]
そこで確認不要とか言ってるからユーザにヌル文字含んだ文字列渡されて死ぬのでは

83 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 14:51:42.58 ID:jOUHjhXv.net]
セキュアプログラムは面倒だからなー
数値のオーバーフローチェックとかみんなやらないでしょ?
アップキャストして値に結果を放り込んでチェックした後、
ダウンキャストするとか面倒すぎる

84 名前:デフォルトの名無しさん [2021/06/22(火) 15:18:09.96 ID:YfWe7YWP.net]
>>73
Cより面倒臭そうω

85 名前:デフォルトの名無しさん [2021/06/22(火) 15:19:46.85 ID:YfWe7YWP.net]
>>76
そこまで出鱈目な話初めて聴いたわ

86 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 15:22:37.78 ID:P9tLBTwV.net]
>>81
そういう外部からの入力に対するエラーチェックはするのは当然だが、
0終端文字列でやる場合には、ファイルのバイト数だけ読み込んで、
一番最後に 0 を書き込んでおくとそれ以上まで進むことはない。
途中の 0 に関しては スライス方式でも同じ問題が残る。
途中に 0 が有っても大丈夫な様に作るだけ。

87 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 15:24:47.81 ID:P9tLBTwV.net]
>>84
ちなみに、リアルワールドでは俺は名プログラマだと評価されているぞ。



88 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 15:27:25.45 ID:P9tLBTwV.net]
良いプログラムを作るための基本ポリシー:
・外部データと内部データは明確に分ける。
・外部データを内部データに入れる場合は、エラーチェックを徹底的にする。
・内部データに関しては、原則的には完全に正しいことを前提にしてプログラム
 して良い。ただし、プログラムのミスのための念のためのチェックはしても良い。

89 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 15:47:48.20 ID:cJZ3y9Eg.net]
>>87
3番目のチェックはアサーション(assert)だと思うけどあれはコードを読む人に背景の条件を明示する意味もあるね
逆にアサーション以外の余計なチェックはコードを読む人を混乱させる可能性がある

90 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 16:20:58.03 ID:N/B8oZfx.net]
ヌル終端はパンチカードが現役だった時代に数バイトケチった名残

互換性のためにサポートしなきゃいけないのは理解できるが
今の時代にヌル終端が優れてるとかそれをデフォルトにしろってのは控えめに言って頭おかしい

91 名前:デフォルトの名無しさん [2021/06/22(火) 16:22:09.51 ID:jOUHjhXv.net]
>>87
外部と内部の定義プリーズ

92 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 16:30:14.48 ID:P9tLBTwV.net]
>>90
外部でーたとしては、他にも有ると思うが、一例としては、

1. 他人が自由に書けるファイルから読み取ったばかりのデータ。
 (アプリケーション内部にリソースデータとして内蔵し、安全性が
 テスト済みであるようなファイルは内部データとみなしても良い場合も有る。)

2. 安全対策を徹底したいライブラリの場合は、ライブラリを使う側が関数に
 渡してきたテキストデータや引数の値。
 ただし、このようなものまで徹底的にチェックするとなれば遅くなるので、
 設計思想によっては、NO-CHECK、または、軽いチェックだけで済ましても良い。

3. OSの場合は、同様なものとして、APIを呼び出した側が渡してきたデータ。
 これは、安全性チェックは徹底して行う必要がある。

4. データベースソフトなどの場合も、2や3に準ずる。どこまで安全チェックするかは、
 使用目的や用途、設計思想による。

93 名前:デフォルトの名無しさん [2021/06/22(火) 16:34:27.28 ID:jOUHjhXv.net]
ちょっと緩くないか?

94 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 16:48:00.98 ID:FRtvqWA7.net]
信頼境界線の引き方は諸説あるだろ。

95 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 19:06:39.53 ID:R8WO8pxt.net]
一般に、アプリの外に置いてあるファイルはチェックした方が良いが、
その中でも、テキストファイルは、信頼置け無い事が多いのでチェックは必要。
アプリの外に置いてあっても、バイナリデータだと人が手書きすることはないため、
設計思想にもよるが、安全チェックはある程度省略しても良いと考える流儀もありえる。

96 名前:デフォルトの名無しさん mailto:sage [2021/06/22(火) 19:33:50.85 ID:D73AVe+6.net]
結局アプリケーションがどう使われるか次第でしょ
アプリケーション作成時の前提が利用シーンの増加により後から覆されるなんてことは良くあることだから
性能要件がない限り最初から安全側に倒しておくのが合理的

97 名前:デフォルトの名無しさん mailto:sage [2021/06/23(水) 11:02:20.62 ID:o/eJBU4s.net]
constデフォルトあたりの話ってgoto禁止論みたいになっている気がする
理由を理解していないがとりあえずそうしておけみたいな人を少なからず見かけるような

>>94
パーサーがガバガバで細工したセーブデータで乗っ取られるゲームのことか



98 名前:デフォルトの名無しさん [2021/06/23(水) 14:27:15.67 ID:LIFxwhU8.net]
>>95
MS製のリンカ(link.exe)の入力するlibraryファイル(*.lib)には、
ヘッダ部分にシンボルがアルファベット順にソートされたシンボルテーブル
が入っている。ソートされていることを前提にバイナリサーチが出来るので
シンボルを検索するのが高速になるとされる。バイナリサーチは、ソート
されているデータに対してのみ正しく検索できて、もしソートされていなければ
間違った結果になる。
しかし、link.exeが*.libを入力する時、ちゃんとシンボルテーブルのシンボル
がソートされたかどうかチェックしているかと言うと、定かではない。
だから、もし、サードパーティー製のツールが*.lib を作成した時、
ソートにミスがあったりすると、link.exeはundefined s

99 名前:ymbolエラーを出すか、
リンクには成功するが、実行段階でアプリが起動できなかったり途中でダウン
してしまうかも知れない。その様な場合、何が原因かは分からないであろうが、
多分、実際、検査はされてない。
[]
[ここ壊れてます]

100 名前:デフォルトの名無しさん mailto:sage [2021/06/23(水) 14:30:46.54 ID:LIFxwhU8.net]
>>97
実際は、サードパーティー製ツールも、ちゃんと*.libのヘッダのシンボルテーブルの
シンボルはソートしており、その部分にはバグはないので、それがソートされてない
*.libは基本的には存在しない。
ただし、*.libをバイナリエディタで開いて手作業で間違って変更したりすると
ソートされていないものが出来上がる。
それをlink.exeに入力しても、link.exeは、そのことに関してのエラーは出さない
だろう。

101 名前:デフォルトの名無しさん [2021/06/23(水) 16:29:36.30 ID:6jEPjWCz.net]
Rustのスレだよね?

102 名前:デフォルトの名無しさん mailto:sage [2021/06/23(水) 17:44:15.71 ID:rKa/khCP.net]
小学生が大人に九九暗唱してみせれば微笑ましいが
大人が大人に九九暗唱してみせるなら不気味で滑稽である

103 名前:デフォルトの名無しさん mailto:sage [2021/06/23(水) 18:25:31.65 ID:mfn5LAEG.net]
意図通りに動かないバグにつながるという話と
バッファオーバーフローみたいな脆弱性につながるという話は別だよね

104 名前:デフォルトの名無しさん mailto:sage [2021/06/23(水) 19:58:13.96 ID:smIE1EjE.net]
再帰を使って1x1=1から9x9=81までの答えだけを書く場合
どうやって書けますか?

105 名前:デフォルトの名無しさん mailto:sage [2021/06/23(水) 20:12:50.89 ID:1lBkKsRv.net]
fixコンビネータを使う

106 名前:デフォルトの名無しさん mailto:sage [2021/06/23(水) 22:38:48.46 ID:GhG+XcCm.net]
>>102
題意に沿ってるか分からんけど

fn main() {
f(1, 1);
}

fn f(a: u32, b: u32) {
//println!("{}x{}={}", a, b, a * b);
println!("{}", a * b);
match (a, b) {
(9, 9) => return,
(_, 9) => f(a+1, 1),
(_, _) => f(a, b+1),
}
}

107 名前:デフォルトの名無しさん [2021/06/23(水) 23:13:30.14 ID:Cy7wfzk/.net]
実践的な話をするとRustは末尾再帰最適化が出来ないからなるべく再帰は使わないほうがいいと思う



108 名前:デフォルトの名無しさん mailto:sage [2021/06/24(木) 01:50:53.81 ID:UNoTdpdl.net]
宿題かなんかだろう。
Rustで宿題を課すなんて教官は変態にもほどがある。

109 名前:デフォルトの名無しさん [2021/06/24(木) 23:17:10.64 ID:zHNnGFYG.net]
>>104の例だとtail recursionになっていないから
内部でloop化できる仮言語で書いてもこのように分解するしかなくて
f(1)
fn f(a) {
  f2(a, 1)
  f(a+1) if a != 9
}
fn f2(a, b) {
  print `${a}x${b}=${a*b}`
  f2(a, b + 1) if b != 9
}
結局のところ関数分割→個別ループ化→関数統合で二重ループ化まで自動でしてくれる言語は無いから
再帰は使わずに自分でループ化すればいいよね、って結論
つまりアルゴリズムでは再帰で考えても実装はループにしてコメント残しておくのが正解

110 名前:はちみつ餃子 mailto:sage [2021/06/25(金) 00:17:11.72 ID:/YhIejlL.net]
>>107
プログラミング言語 Scheme の仕様だと >>104 のようなパターンは末尾文脈の定義にあてはまるし
末尾呼出し最適化が適用されることが保証されるから、
現代的な言語処理系で最適化できないとは信じられないんだけど、
実際にRust コンパイラに >>104 を与えたときにループに最適化はしないの?
Rust のコンパイラの使い方に不慣れでアセンブリコードの出力のさせかたがよくわからん……。

ほぼそのまま C のコードに書き換えてみたら
GCC ではジャンプに置き換えたコードが生成されるみたいだし……。
(ちなみに GCC では末尾呼出しになっていなくても一部の状況では再帰をループに変形できることがある。)

Clang だとループを全部 unroll しやがった!

111 名前:デフォルトの名無しさん mailto:sage [2021/06/25(金) 11:49:33.37 ID:UuPR+dCF.net]
c言語だと再帰が末尾呼び出し最適化されるかどうかがオプティマイズレベルで変わるからややこしい。
リリース版だと動くがデバッグ版だとスタックオーバーフローみたいな事になる。
単純な再帰ならループに書き直してもいいけど、相互再帰みたいなのは末尾呼び出し最適化してくれないと困る。

112 名前:デフォルトの名無しさん mailto:sage [2021/06/25(金) 11:58:36.77 ID:CpYoiDkc.net]
あの、Rustの勉強のために逆引きサンプルwiki作ろうと思うんですけど
テンプレ殿堂入りを目指して作ってもいいですか?
もちろん

113 名前:広告は入れませんが、レンタルwikiが提供している広告は表示されるかもしれませんが。。。 []
[ここ壊れてます]

114 名前:はちみつ餃子 mailto:sage [2021/06/25(金) 12:05:43.49 ID:/YhIejlL.net]
>>110
目指すことは自由じゃないの。
皆がどう判断するかも自由だけど。

115 名前:デフォルトの名無しさん mailto:sage [2021/06/25(金) 12:18:21.65 ID:CpYoiDkc.net]
先輩ありがとうございます!
受け入れてもらえるようなコンテンツを作ります!

116 名前:デフォルトの名無しさん mailto:sage [2021/06/25(金) 15:26:59.18 ID:CCUOu52e.net]
5chに閉じずに本家のコミュニティにも便利と思ってもらえるもの目指した方が良いのでは

117 名前:デフォルトの名無しさん mailto:sage [2021/06/26(土) 00:57:24.13 ID:QiaGJu0I.net]
>>86
ただし石器時代のな



118 名前:デフォルトの名無しさん mailto:sage [2021/06/26(土) 02:18:19.63 ID:morUmgAo.net]
>>114
ミンチメーカー、ではなくスパゲティメーカーとして恐れられてるかもな

119 名前:デフォルトの名無しさん [2021/06/26(土) 03:08:39.74 ID:ljqTs+jf.net]
Rustと他の言語との違いについて興味深い観点で盛り上がってるスレ
特に後半

趣味でプログラミングの勉強するとしたら何言語がいい?
https://matsuri.5ch.net/test/read.cgi/morningcoffee/1623527901/

120 名前:デフォルトの名無しさん mailto:sage [2021/06/26(土) 12:15:14.01 ID:jgmCFZtl.net]
斜め読みしかしてないから見逃してるかも知れないけどさんざん言い尽くされた話ばかりだった気が
そもそもRust自体はC++を置き換えることを目的にはしていない

121 名前:デフォルトの名無しさん mailto:sage [2021/06/26(土) 14:26:52.57 ID:UK7NU6RE.net]
やたらC++と比較されるのはどっちもbetter Cの側面があるからだろうか
個人的にRustはCとScheme(Lisp)のハーフという印象
SchemeよりMLの方が近いらしいけどMLは使ったことないからよく分からない

手続き型で関数型を疑似表現したり関数型で手続き型を疑似表現する試みがあるけど
Rustはその中間を上手く埋めてる感じ

122 名前:デフォルトの名無しさん mailto:sage [2021/06/26(土) 14:33:02.82 ID:S/dGZFG2.net]
> better Cの側面がある

はぁ?
お前がcもc++もrustもニワカなのは分かった
あと五年間は、カキコ無前にROMに徹してみてほしい

123 名前:デフォルトの名無しさん mailto:sage [2021/06/26(土) 15:07:09.40 ID:UK7NU6RE.net]
>>119
急にどうしたんだ
better Cの意味が分からなかった感じ?

124 名前:デフォルトの名無しさん mailto:sage [2021/06/26(土) 15:16:37.21 ID:zCIOA2Bt.net]
実際にはRustはbetter D

125 名前:デフォルトの名無しさん mailto:sage [2021/06/26(土) 15:47:21.36 ID:vR4ZYNRj.net]
急に発狂する奴はどこの掲示板にもいる 気にするな

126 名前:デフォルトの名無しさん mailto:sage [2021/06/26(土) 16:24:43.50 ID:MKHy+X82.net]
わざわざ自演するようなことかね?

127 名前:デフォルトの名無しさん mailto:sage [2021/06/26(土) 16:34:36.83 ID:jgmCFZtl.net]
mozillaのc++を安全に使う数多の取り組みに疲れ果てた結果出てきた新言語がrustなのでc++と比較されるのは当然



128 名前:デフォルトの名無しさん mailto:sage [2021/06/26(土) 18:03:00.84 ID:cKS/UcnU.net]
この板全域に出没して何でもRubyと比較するガイジみたいなもんだろ
ここにはなぜかいないけど

129 名前:デフォルトの名無しさん mailto:sage [2021/06/26(土) 18:06:17.50 ID:uWTCkdSJ.net]
>>116
Rust布教スレになってんじゃん
不健全






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<300KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef