21/09/11 01:40:01.24 PRM8i6LA.net
>>80
C言語でも他の言語でもそのようなことは実現不可能です
いくらRustを叩きたいとはいえ主張が滅茶苦茶になっていますよ
113:デフォルトの名無しさん
21/09/11 10:36:57.99 kQXQH3+b.net
馬鹿ばっか。
114:デフォルトの名無しさん
21/09/11 11:20:17.45 PFLibieQ.net
実際連結リストのノードに対する参照を保持しておくってどういうユースケースで現れるんだろうか
115:デフォルトの名無しさん
21/09/11 11:40:09.41 tSun79KI.net
掲示板で算数自慢するときに使う
116:デフォルトの名無しさん
21/09/11 11:42:49.15 kQXQH3+b.net
>>113
例:
1. テキストエディタで、10万行のファイルを読み込み、その先頭に
1000行のテキストを挿入するときの速度向上。
2. 言語を自作する時、マクロ展開の時のトークン列へのトークンの挿入
117:デフォルトの名無しさん
21/09/11 16:43:18.56 zUj2TAiQ.net
>>115
それはどちらの使用例なのかハッキリしてほしいです。
配列にN番目への参照を格納する例として挙げているのか、
そうではなくリンクリストを用いる例として挙げているのか、
どちらですか?
118:デフォルトの名無しさん
21/09/11 23:33:36.29 EO9owr6G.net
>>112
119:デフォルトの名無しさん
21/09/12 00:21:25.00 CFIv5O+a.net
相手をバカと貶めることで何もしなくても自分わ相対的に高めることができるという高等な議論テクだ
さすが高学歴
120:デフォルトの名無しさん
21/09/12 02:54:54.78 x/1IPUIX.net
>>115
1.ってバッファを1個のLinkedListとして持っておいて、カーソルの位置をノードへの&mutで持っておきたいって発想だよね
それよか2個のLinkedListに「カーソル以前の内容」「カーソル以降の内容」を最初から分けて持っておいて、
必要に応じて前者の末尾または後者の先頭を操作するという風にすれば、常に&mut LinkedListつかまれることもなくて都合良いのでは?
workaroundでしかないという批判は認めよう
121:デフォルトの名無しさん
21/09/17 13:36:25.88 9sB/yeOV.net
任意のM番目に要素を挿入する時間計算量がO(1)の線形リストができないと入院中の妹が苦しむんだわ…
122:デフォルトの名無しさん
21/09/18 16:11:40.95 bNqoSBDr.net
どーでも良いですよ
byだいたひかる
123:デフォルトの名無しさん
21/10/05 15:44:11.57 +1Hntkr6.net
素人だからよく分からんけど、実務やってる人からCppだとvoid**とか出てきて難しすぎて狂うって話は聞いたことあるけどラッパークラスを作って分かりやすいメソッドつくればいいんじゃないの
124:デフォルトの名無しさん
21/10/05 18:47:14.74 JbR3YU6O.net
void**のどこが難しいのかさっぱり
125:デフォルトの名無しさん
21/10/17 09:40:31.27 6Bvliwnf.net
void**は許さない派
126:デフォルトの名無しさん
21/10/24 13:55:43.29 eQqSgpa/.net
任意の言語ができる操作が任意の言語ではできないとほざくやつが数学ができるとかネタか糖質だろう...
チューニングマシンの存在を真っ向から否定したいならここではなく学会で論文を出そうね
127:デフォルトの名無しさん
21/10/24 14:24:43.42 eQqSgpa/.net
プロレスごっこを期待して覗いたら、キチガイが占拠していたのは笑う
128:デフォルトの名無しさん
21/10/24 14:57:26.55 dxF2sYGf.net
ここ隔離スレなので
129:デフォルトの名無しさん
21/10/24 18:05:52.35 NLtlOSxj.net
チューニングマシンて
130:デフォルトの名無しさん
21/10/24 20:19:43.90 IF6Ria+p.net
c++とrustってチューニング完全なんですよね。意外にこれ知られてない
131:デフォルトの名無しさん
21/10/24 20:55:50.68 IF6Ria+p.net
rustの所有権は所謂、線形型
普通に理論として確立している
数学できるくんの主張は線形型によってチューニングマシンの計算複雑性が変化するってことだろう
証明できたらチューニング賞ものだろう
何十年ぶりじゃないか?記述計算量に新しい概念が導入されるのは
132:デフォルトの名無しさん
21/10/24 22:07:03.33 +peTc5KU.net
rustの所有権や借用や、コンパイルが通らずにいらいらきますが、慣れればスラスラというか、ストレスなく書けるようになるのかな
133:デフォルトの名無しさん
21/10/24 22:10:42.59 +peTc5KU.net
日本語がおかしいですが、
所有権や借用が、やりたいことをストレスなく書けるようになる気がしなくて…
134:デフォルトの名無しさん
21/10/24 22:29:10.11 HVo+cqVA.net
慣れみたいなものはあると思う
コンパイル通るようコード直すことを繰り返す内に最初からコンパイル通すことができるようになるかと
135:デフォルトの名無しさん
21/10/24 22:41:32.45 +peTc5KU.net
>>133
ありがとうございます
やはり繰り返しと慣れですね…
もう少し分かるまで粘ってみます
取り急ぎお礼まで
136:デフォルトの名無しさん
21/10/25 17:58:05.73 a6PpXdhO.net
>>131
細かいことにいちいち煩い姑のようだからね。
別に大したご利益
137:もないし。
138:デフォルトの名無しさん
21/10/25 20:25:16.68 cubP7NbG.net
>>135
ご利益の大小はソフトウェアの種類によって変わるだろうね
OSやブラウザのようなメモリアクセス違反が即致命的な脆弱性に繋がり得る、かつ、巨大でバグを取り除ききるのが難しいソフトではご利益大きい
逆に多少バギーでも困らないソフトならただ煩わしいだけというのは正しいかも
とはいえ慣れればコンパイルが通るようにコードを書くのは多くの場合難しくないので、個人的にはカジュアルユースでもコストよりメリットが多いように感じる
139:デフォルトの名無しさん
21/10/26 18:03:05.91 KgmW7hJW.net
>>136
め早口
140:デフォルトの名無しさん
21/10/26 20:06:45.12 OracOvFU.net
>>131
「最後に消費するのは誰か?」を明確にするだけでよくて
その人以外に渡す時は借用してもらうだけだよね
あとはmut借用だけ一時的独占でルールおしまい
141:デフォルトの名無しさん
21/10/26 22:54:07.10 XkR6Nv6d.net
>>138
コメントありがとうございます
いまはまだおっしゃることにピンとこないのですが、「最終消費者は誰か」は常にこころに留めて進めてみます
まだサンプルコードを写経している段階なので、具体的なテーマを見つけて苦労してみます
>>135 さんもありがとうございます
ホント、小煩い姑状態です
親父の小言は後に効く、といいますが…
haskellでいう型クラスや、代数データ型、パターンマッチなど魅力的な機能があり、はやく馴染みたいです…
142:デフォルトの名無しさん
21/10/26 23:17:46.13 zVG+0sad.net
>>29
まさに半年経ってようやくカーネルにアロケーター導入されたわけだが
完璧に君の負けだよね
お疲れ様です
143:デフォルトの名無しさん
21/10/27 08:20:39.13 qg2SY4Q5.net
こんな実装するならrust使う意味ないけどねw
URLリンク(doc.rust-lang.org)
頭悪いからさらに時間使っちゃいそうでかわいそう。
144:デフォルトの名無しさん
21/10/27 09:20:32.30 2iZWGrmg.net
ゴールをずらせば負けたことにならないまで読んだ
145:デフォルトの名無しさん
21/10/27 09:23:36.95 q+lzbSiO.net
あちゃちゃwそれ別のapiじゃんw
お馬鹿さんだからメーリス追えないんだねww
146:デフォルトの名無しさん
21/10/27 09:29:13.91 zfYVqfDQ.net
話追えるようになってから来てくださいね🤗
147:デフォルトの名無しさん
21/10/27 09:30:10.86 zfYVqfDQ.net
頭悪いのどっちかな
148:デフォルトの名無しさん
21/10/27 14:57:34.79 qg2SY4Q5.net
は?linuxの方ならここから話全く進んでないんだが。。誤魔化せると思ったのかな。。
URLリンク(lkml.org)
149:デフォルトの名無しさん
21/10/27 15:49:20.46 G9Y5/nKM.net
だからそれだけ貼られても経緯とかなんもわからんし読む気もおきんって
150:デフォルトの名無しさん
21/10/27 16:58:29.94 Ru0zcXw7.net
顔真っ赤っかで草w
悔しいねえw
151:デフォルトの名無しさん
21/10/27 16:59:43.91 3BkIbLo2.net
>>146
頭悪いの君だよね?
152:デフォルトの名無しさん
21/10/27 18:36:52.66 zwnES/cK.net
あわしろ氏がLinuxをRustで書き直すプロジェクト始めなかったっけ。
153:デフォルトの名無しさん
21/11/21 11:28:03.98 aXP4f2By.net
どんなに簡単でも、できることに制限がある言語は流行らない、という経験法則がある。
Rustも使えるアルゴリズムに制限があるのだが。
例えば、C言語で使えていたアルゴリズムは、C++/Java/C#ではそのまま使える。
特に
154:C++とC#には、Cから移行するときの制限が少ない。 ところがRustでは、これらのコードからはシンプルには移植できないものが存在 してしまう。 C#やJavaは速度を遅くする代わりに安全性と自由性の両方を確保できているが、 Rustは、速度は余り遅くならないが、自由性を犠牲にしている。 これは大問題となるだろう。
155:デフォルトの名無しさん
21/11/21 11:54:39.30 7O4ablWw.net
C++に勝てるワケねぇだろ
156:デフォルトの名無しさん
21/11/21 13:31:58.91 kZvTUakz.net
unsafeあるくせにできないことあるのか
157:デフォルトの名無しさん
21/11/21 13:33:18.01 vno614JY.net
いつもの奴だ
158:デフォルトの名無しさん
21/11/21 14:23:27.74 qwOTZsAN.net
>>153
unsafeの中だけに閉じ込めきれないのが問題。
例えば、C言語の場合、アセンブラにしか掛けないことは、アセンブラでコードを書いた
ものをCの関数にして、Cから呼び出すことが出来たので問題なかった。
ところがRustの場合、リンクリストをポインタや参照を使って高速に扱うことが
unsafeの中だけでは完結できないので無理。
結論的には、リンクリストをO(1)でアクセスすることがRustのsafeモードでは
完全に不可能といえる。たとえ unsafe モードを使っても、safeモードに
「しみ出してきて」駄目になる。
159:デフォルトの名無しさん
21/11/21 14:25:17.13 qwOTZsAN.net
Rustを使うなら、次のデータ構造をCのように「効率よく扱う」のは諦めるしかない:
・リンクリスト
・ツリー構造(バイナリツリーなども含む)
なんどもいうが、unsafeモードをいくら使っても言語の構造上、
無理なものは無理。
俺は数学の天才。最初から結論が分かる。
160:デフォルトの名無しさん
21/11/21 14:27:35.80 qwOTZsAN.net
何度も言おう。
Rustでリンクリストやツリー構造をO(1)でsafeモードからランダムアクセス
できないことは数学的に完全に証明できる。
そしてそれは、unsafeモードをいかに工夫して使っても無理。
無理なものは無理。これは絶対。
俺は数学の天才。
161:デフォルトの名無しさん
21/11/21 14:30:47.72 qwOTZsAN.net
[補足]
それが出来るんだったらもっと普及してるし、もっと真似されてる。
Rustのやり方では不可能だから普及できない。
162:デフォルトの名無しさん
21/11/21 14:37:38.26 ekMm5ue5.net
>>155
つまりunsafe使えばできるのね
163:デフォルトの名無しさん
21/11/21 14:54:12.46 uAxr+NUo.net
>>159
アプリのあらゆる場所を unsafe にすれば出来る。
unsafeの閉じ込めが出来ない。
164:デフォルトの名無しさん
21/11/21 19:24:03.14 a8amZ/lG.net
>>157
また嘘つきがRust叩きをしているのか
>リンクリストやツリー構造をO(1)でランダムアクセスできない
これは全てのプログラミング言語で不可能
もちろんC言語でも不可能
以前も皆に論破されて逃走したのにまた戻ってきたのか
165:デフォルトの名無しさん
21/11/21 19:46:49.29 /ddxrWFf.net
>>161
馬鹿は黙っとれ。
お前は全くリンクリストを理解できてない。
166:デフォルトの名無しさん
21/11/21 19:47:48.85 /ddxrWFf.net
ここはレベルが低すぎる。
丁寧に説明したのに全く理解を示さないやつばかり。
167:デフォルトの名無しさん
21/11/21 19:49:09.49 /ddxrWFf.net
C/C++が速いのは、リンクリストのおかげだ。
Stroustrapも馬鹿だからリンクリストを理解できてない。
vectorだけでは人気アプリの速度は達成できてない。
168:デフォルトの名無しさん
21/11/21 20:11:47.26 ru7ojY1Q.net
よく知らんけど、ツリーとかリンクリストうまく扱えないの?
169:デフォルトの名無しさん
21/11/21 20:18:26.10 ekMm5ue5.net
>>163
コード例頂けないでしょうか
Cでうまく書けるものがRustでうまく書けない例
170:デフォルトの名無しさん
21/11/21 20:23:22.75 a8amZ/lG.net
std::collections::LinkedList
URLリンク(doc.rust-lang.org)
std::collections::BTreeMap
URLリンク(doc.rust-lang.org)
171:デフォルトの名無しさん
21/11/21 20:53:48.92 ZPin+mWW.net
算数得意おじちゃんが生えてきたな
172:デフォルトの名無しさん
21/11/22 00:48:17.10 saDsX792.net
>>165
本来の速度性能が出ない。
CではO(1)で済むところが、O(N)必要になってしまう。
173:デフォルトの名無しさん
21/11/22 00:50:22.67 saDsX792.net
>>168
余りにも馬鹿すぎるから、発言者の背景を示すしかなかった。
IQの違いが大きすぎると話が通じないと言われるが、まさに
このスレがそうで、ちゃんと言わないと、正しいことを言ってる
人が馬鹿にされるから。
174:デフォルトの名無しさん
21/11/22 01:02:53.27 saDsX792.net
>>166
・Cだとリンクリストやツリーの中のノードを識別するのに、通し番号ではなく
ポインタが使われる。そのポインタは、関数内部にとどまらず、
アプリ全体で大規模に保持され続け、ノードが必要になった場合、それを
介してノードにアクセスする。だから、読み込みも書き込みも自由自在に
行える。一つのツリーの中の有るノードを削除し、あるノードに子ノード
を追加し、あるノードの直後に弟ノードを追加し、あるノードを読み取り、
あるノードに書き込む、などを全く任意のタイミングで行える。
繰り返しになるが、これらのポインタはある関数の内部だけで完結
せずに、関数の外のグローバル変数にアプリの起動時から終了時まで
恒久的に保持され、必要なタイミングで使用される。
・Rustではこのようなことが不可能。ツリーのノードを指す参照を、
グローバル変数に複数保持して、書き込みと読み込みを自由自在に
行うことが不可能だかっら。
175:デフォルトの名無しさん
21/11/22 01:07:59.95 saDsX792.net
>>171
[補足]
Cの方で説明したやり方は、C++/C/Javaでも可能。
JSやRuby、Pythonでも可能。
Rustだけが不可能。
つまり、多くの言語が出来る中でRustだけが出来ない。
その結果、数学的な意味での「一般的」には、TreeやLinkedListでまともな性能が出ない。
もちろん、特定のケースでは同等性能が出ることはあるが。
176:デフォルトの名無しさん
21/11/22 01:08:41.45 saDsX792.net
なお、今言ったことは、未踏や研究テーマで扱うことは禁止する。
177:デフォルトの名無しさん
21/11/22 01:32:04.72 saDsX792.net
>>172
[補足2]
通し番号ではなく、ポインタでノードを識別することで、末尾以外のノードを
削除した時でも、識別番号の書き換えが不要であるメリットもある。
ポインタとはアドレスを保持する変数のことであるが、リンクリストや
ツリー構造の場合、途中のノードを削除しても、別のノードのアドレス
は全く変化しないので、削除したノード以外のポインタ値は全く変更されないので
書き換えも必要ないからである。
一方、初心者がやりがちなのは、リンクリストでも先頭のノードを0番にして、
それ以後のノードを1、2、3 という通し番号で識別しようとする方法。
これだと、5番のノードを削除した時、6番以後のノードは番号の付け替えが
必要になるのでものすごく効率が下がる。
また、k 番のノードをアクセスする際には、O(k)の時間が掛かってしまう。
本来、Cではノードを識別するのは、このような通し番号ではなく、
ポインタ(アドレス)で行うのが伝統であって、アルゴリズムの教科書でも
それが前提になっている。
それがいつからか、リンクリストでも通し番号で識別する流儀を誰かが持ち込み
初めて混乱が生じるようになった。
178:デフォルトの名無しさん
21/11/22 01:46:12.87 4Q+A1yLL.net
>>171
日本語読めます?
ソースコードをくれって言っている
179:165
21/11/22 02:04:09.01 43z4eYfr.net
>>169,172
なるほど、そうなんだ
でも正直、なにを言ってるのかまだよくわからんから、ちょっとベンチマークを投稿して遅さを示してみてくれん?
Linked Listの実装なんてその投稿よりも圧倒的に短く書けるとおもうし、ちょっとやってみせておくれ
180:デフォルトの名無しさん
21/11/22 10:14:51.86 ejqG4gpN.net
pub fn cursor_front_mut(&mut self) -> CursorMut<'_, T>
This is a nightly-only experimental API. (linked_list_cursors #58533)
CursorMutのStabilisedがまだ来てないことへの批判ってこと?
181:デフォルトの名無しさん
21/11/22 10:24:02.08 EEj8G+es.net
>>157
> Rustでリンクリストやツリー構造をO(1)でsafeモードからランダムアクセスできない
どんな言語で書いてもO(1)でランダムアクセスできないのでRustでも同様にO(1)でできないのは当たり前
一般的にランダムでkが与えられた時にリンクリストでk番目を得るにはO(n)かかる
C言語でもO(n)でありO(1)では不可能
182:デフォルトの名無しさん
21/11/22 11:08:38.58 0RwULqeG.net
>>178
リンクリストとポインタを学び直してから出直せ。
183:デフォルトの名無しさん
21/11/22 11:37:54.58 0LbM6y2O.net
あと何回Cursorって言えばいいんですか?
184:デフォルトの名無しさん
21/11/22 11:50:19.99 EEj8G+es.net
>>179
君はプログラムを書いたことがないのかね?
どんな言語でもランダムでkが与えられた時にリンクリストでk番目を得るにはO(n)かかる
O(1)でできると主張するならば実行可能なソースコードを出しなさい
185:デフォルトの名無しさん
21/11/22 12:28:55.95 8vjqlXjx.net
説明足りてないな。
「過去に一度対象となるコンテンツのポインタを確認&記録している場合」じゃなきゃO(1)は無理だろ。
186:デフォルトの名無しさん
21/11/22 13:01:13.80 ejqG4gpN.net
あ、CursorMutの指摘は既にされてんのねw
187:デフォルトの名無しさん
21/11/22 13:15:10.95 EEj8G+es.net
>>182
ランダムでkが与えられた時にリンクリストのk番目を常にO(1)で得るためには
全てのk番目の位置を別途ベクターで保持管理しないといけなくなる
そしてリンクリストで挿入削除が行われるたびにk番目がズレるから保持管理ベクターで毎回O(n)の移動が発生する
つまりどんな言語でもO(1)は絶対に不可能
188:デフォルトの名無しさん
21/11/22 17:14:17.10 HWCOZSD4.net
>>181
そう思うのは、ランダムアクセスの定義をあなたが誤解してるからだ。
確かに、リンクリストに置いて、何の情報も無く「k番目」のノードに
アクセスするにはO(k)の時間が掛かる。
しかし、そのアクセス方法は、ランダムアクセスする場合に必須ではない。
p1, p2, ..., p_a
というa個のポインタがあって、それをランダムに選び取ってアクセスする場合の
1つあたりに掛かる時間が、O(1)であれば、ランダムアクセスの時間はO(1)
だと言えるから。
連続アクセス以外は、全てランダムアクセスなんだ。
具体的には、最初から100個のノードのアドレスを、100個のポインタに記録していたとしよう。
そのポインタは、リンクリストの中の位置で見ると、連続して並んでいるわけではないとする。
そのポインタを順番に参照してリンクリストのノードをアクセスすれば、連続アクセスでは無いから、
ランダムアクセスに分類される。
もう一度言おう、連続的な位置では無いノードを複数個アクセスすればランダムアクセスだ。
IQが低い人は、こういうトンチのようなものに弱い。
だから、IQの高い人とIQの低い人では誤解が生じ、大変な結果となる。
189:デフォルトの名無しさん
21/11/22 17:17:59.19 HWCOZSD4.net
>>184
どうしてあなたは、2つの概念を切り分けられないんだ。
kを任意に与えられてk番目のノードをアクセスするには、確かにO(k)の
時間が掛かるが、ランダムアクセスは、最初からアドレスが分かっている
ノードをa個アクセスした場合の1つ当りのアクセスに掛かる時間でも
いいんだから、必ずしもO(k)ではなく、O(1)になる場合がある。
数学は精密な学問だから、場所をランダムにアクセスすることと、
毎回kという通し番号が与えられて毎回前から順番に辿ることとは
全く別の事象である。
ちなみに俺は、数学は毎回100点とっていたような数学マンだ。
190:デフォルトの名無しさん
21/11/22 17:18:11.48 EEj8G+es.net
>>185
ランダムでkが与えられた時にリンクリストのk番目を常にO(1)で得るためには
全てのk番目の位置を別途ベクターで保持管理しないといけなくなる
そしてリンクリストで挿入削除が行われるたびにk番目がズレるから保持管理ベクターで毎回O(n)を必要とする移動が発生する
つまりどんな言語でどんな手法でもO(1)は絶対に不可能
191:デフォルトの名無しさん
21/11/22 17:26:17.83 HWCOZSD4.net
IQが低い人向けに書いておこう。どうせ書いても理解できないかも知れないが。
リンクリストの中にx0~x_{N-1}のN個のノードがあったとしよう。
ランダムアクセスの定義は、「連続アクセス以外の全てのアクセス方法」であるので、
以下のようになっている:
[連続アクセス]
x0,x1,x2,x3,x4,...
[ランダムクセス]
x10,x1,x8,x5,x3,x7,x100,x6,x200,...
ここで、馬鹿をさらしている人達は、ランダムアクセスは、毎回
通し番号kを乱数で発生させてからアクセスするものだと誤解している。
それは数学的には0点である。
ランダムアクセスとはそのような定義ではないからだ。
とにかく、「連続アクセスでなければなんでもいい」というのが正しい定義。
だから、キメウチで最初から、
&x10,&x1,&x8,&x5,&x3,&x7,&x100,&x6,&x200,...
というアドレスの列が分かっていて、それを順番にアクセスすれば、
ランダムアクセスの定義にあてはまる。
そしてそのようにしたとき、1回当たりに掛かる時間がO(1)である、
というのが、数学的に正しい見方。
何度も言うが、俺は、数学はほとんど満点だった。
繰り返し言うが、リンクリストに置いて、ノードへのランダムアクセスに
必要な時間は、O(1)が正しい。O(N)と思ってるのは、ランダムアクセスの定義
を誤解している。
O(N)かかるのは、リンクリストに置いて「通し番号からノードのアドレスを求めるのに掛かる時間」
である。リンクリストに置いて、通し番号からノードのアドレスを求めることは、
ランダムアクセスには一般的には不要である。だから、O(1)で正しい。
192:デフォルトの名無しさん
21/11/22 17:29:51.54 HWCOZSD4.net
>>187
だから、それはランダムアクセスの定義では無いんだと何度入ったら分かるんだよ。
どうして、k番目を乱数で与えると思ってるんだ。
ランダムアクセス度は、「ランダム数で与えられたノードでアクセスする」
ことではなく「ランダムな位置のノードをアクセスするためこと」だぞ。
数学的には全く別概念だ。
何でも言うが俺は、数学はほぼ満点だった。
193:デフォルトの名無しさん
21/11/22 17:33:29.42 ejqG4gpN.net
URLリンク(play.rust-lang.org)
#![feature(linked_list_cursors)]
fn main() {
use std::collections::LinkedList;
let mut list = LinkedList::from([1, 2, 3]);
let mut cursor = list.cursor_front_mut();
cursor.move_next();
println!("{:?}", cursor.current()); // Some(2)
cursor.insert_after(20); // O(1) insertion
println!("{:?}", list); // [1, 2, 20, 3]
}
194:デフォルトの名無しさん
21/11/22 17:33:38.88 HWCOZSD4.net
例えば、位置が最初から分かっていても、どうやってもランダムアクセスが
遅くなる例としては、テープレコーダーがあげられる。
これは、どう頑張っても、長さNに対して、O(N)の時間がかかってしまう。
繰り返しになるのが、リンクリストの場合は、O(1)だ。
ただし、先頭からの通し番号 k を与えられた時に、データが有るアドレスを計算するのに
掛かる時間は、O(k)だ。
しかし、ランダムアクセスに掛かる時間はO(1)だ。
この違いが分からない人は数学が出来なかったことであろう。
195:165
21/11/22 17:35:33.12 43z4eYfr.net
理屈はもういいので、プログラミングできるならベンチマークを出して、他の言語より遅いことを示してくれませんか?
196:デフォルトの名無しさん
21/11/22 17:38:53.52 43z4eYfr.net
ってあれ、 ID:saDsX792 と別人かな
197:デフォルトの名無しさん
21/11/22 17:38:58.35 HWCOZSD4.net
何故これが重要となるかといえば、実際にこの性質を利用して、
C言語では古くから、リンクリストをO(1)の時間でランダムアクセスして
きたからだ。O(k)ではなく、O(1)だ。
この例としては、リンククリストの中の不連続な100個のノードのアドレスを
どこかの配列にいてれておいて順番にアクセスする例がある。
この場合、一個当りの平均アクセス時間はO(1)、全体に掛かる時間はその100倍で済む。
しかし、アドレスではなく、ノードを通し番号で識別した場合、
一個当りの平均アクセス時間は、O(N)、全体に掛かる時間はその100倍になってしまう。
この意味に置いて、アドレス(ポインタ)でノードを識別することに徹すれば、
リンクリストにランダムアクセスする時間は、O(1)である。
しかし、このようなアクセス法は、Rustは一般的には無理。
198:デフォルトの名無しさん
21/11/22 17:39:58.88 HWCOZSD4.net
>>192
プログラミングは理屈が重要。
O(1)の記法も実験せずに思考実験で結論を得るためにある。
199:デフォルトの名無しさん
21/11/22 17:41:09.75 43z4eYfr.net
ああ、 ID:HWCOZSD4 が書いてるのは当然のことだ
200:デフォルトの名無しさん
21/11/22 17:48:40.73 43z4eYfr.net
「Rustだとできない」っていうのはよくわからないし、そこだけ気になってるんだけど、
Rustって参照を持ち回すことがそんなにできないんだ
201:デフォルトの名無しさん
21/11/22 17:49:16.27 EEj8G+es.net
C言語であろうがなかろうが言語に関係なくO(1)は無理
わからない人はコーディングすればすぐわかる
ランダムでkが与えられた時にリンクリストのk番目を常にO(1)で得るためには
全てのk番目の位置を別の配列で保持管理しないといけない
そしてリンクリストで挿入削除が行われるたびにk番目がズレるから保持管理する配列で毎回O(n)を必要とする移動が発生
どんな言語でどんな手法を用いてもO(1)は絶対に不可能
202:デフォルトの名無しさん
21/11/22 17:53:40.47 ejqG4gpN.net
>>198
俺もそう思う
彼の主張にはポインタの配列をケアする時間を含んで無さそうに聞こえたけどw
せっかくのリクリストとは別にアクセス用のポインタ配列をケアするってことも
ふしぎなコーディングだけど
そこまでするなら最初から配列だけでやれって思うけどw
203:デフォルトの名無しさん
21/11/22 17:55:47.65 HWCOZSD4.net
>>198
その別の配列に用意したアドレスに基いてアクセスすれば、立派なランダム
アクセスなんだ。
ランダムアクセスとは、毎回デタラメにアクセスすることでは無いぞ。
テープレコーダーの場合、キメウチで、100, 1, 200, 10, 30, 2, 1000
の位置の7個のデータを取得するには、シーク時間が必要だから、
100+99+199+190+20+28+998 の時間が掛かる。
そしてこの読み取りを2回行ってもまた同じだけの時間が掛かる。
その意味で、ランダムアクセス時間は、テープの長さがNの時、O(N)とされている。
ところが、リンクリストの場合、アドレスが毎回決まっている 7 個のデータ
をアクセスするには、一個当りのノードに掛かる平均時間は O(1)だ。
これを2回行っても同じ。
あなたがおもっているような、シーク時間はリンクリストの場合には不要だから。
204:デフォルトの名無しさん
21/11/22 17:56:50.13 HWCOZSD4.net
>>199
そうでなくて、その配列が既に決まっている場合もあるんだということだ。
それを上手く用意することが出来るケースが現実にかなり有る。
205:デフォルトの名無しさん
21/11/22 17:57:28.92 ejqG4gpN.net
いや配列ケアのほうは時間はそれほどでもないか
挿入削除場所以降のコピーする必要が出るだけで
206:デフォルトの名無しさん
21/11/22 17:59:39.65 ejqG4gpN.net
>>201
へー
207:デフォルトの名無しさん
21/11/22 17:59:44.70 HWCOZSD4.net
なぜかというと、アドレスは、ノードを追加した時に分かるから、それをどこかに
記録しておけば「シーク時間」が不要だから。
例えば、100個のノードを任意の位置に追加したとしよう。そのアドレスは、
100個分は既知である。そのアドレスをまたどこかのリンクリストの末尾に
でも順番に追加して全て記録しておいたとしよう。
そうすると、元のリンクリストは、立派にO(1)でランダムアクセスできるんだ。
208:デフォルトの名無しさん
21/11/22 18:00:15.83 43z4eYfr.net
> リンクリストの場合、アドレスが毎回決まっている 7 個のデータをアクセスするには、
> シーク時間はリンクリストの場合には不要だから。
そら、あらかじめアドレスがわかってればできるだけで、別にLinked Listの性質ではないよね
209:デフォルトの名無しさん
21/11/22 18:01:09.38 EEj8G+es.net
>>200
そこでO(1)とは配列のアクセスのみ
つまりリンクリストは全く関係なく配列のアクセスがO(1)だと主張していることに気付こう
そしてリンクリストで削除や挿入が行われるたびにその配列でO(n)の大移動が行われる
結論: O(1)ではどんな言語でもプログラミングできない
210:デフォルトの名無しさん
21/11/22 18:02:14.47 HWCOZSD4.net
>>206
そんなことない。
あなたは、ポインタを使ったプログラミング経験が浅い。
211:デフォルトの名無しさん
21/11/22 18:04:00.68 HWCOZSD4.net
>>205
そうでない。
テープレコーダーとリンクリストでは、明らかにランダムアクセスに掛かる時間の
性質が違う。
「アドレスが既知」であるのは、ポインタを全面的に使ったプログラミング法
では当たり前の事だから、リンクリストに置いてシーク時間は不要。
212:デフォルトの名無しさん
21/11/22 18:05:44.36 HWCOZSD4.net
>>206
違う。
ツリーの場合でも、番号ではなく、ノードをポインタで識別することで、
0の時間でシークできる。
リンクリストでも同じ。
通し番号を使おうとするから遅くなってるだけ。
ノードの識別をポインタで統一してしまうと、本当に O(1)でいける。
213:デフォルトの名無しさん
21/11/22 18:07:52.10 EEj8G+es.net
>>204
あなたの主張を整理すると
「k番目をO(1)でアクセスできる配列」は「k番目をO(n)でアクセスできるリンクリスト」よりも優れている、となる
O(1)の部分はリンクリストと全く無関係であることに気付かないとね
ここまで壮大な勘違いをしてるのはおそらくプログラミングをしたことがないのだろうけど
214:デフォルトの名無しさん
21/11/22 18:09:34.28 43z4eYfr.net
アドレスへのランダムアクセスは定数オーダー。そりゃメモリはそういう設計で作られてるんだから当然
テープレコーダーはランダムアクセスできない。これも当然
なんでテープレコーダーと、メモリ上に実装したLinked Listを比較しているのか意味がわからない
何を説明しようとしてるんだろう
215:デフォルトの名無しさん
21/11/22 18:10:17.50 ejqG4gpN.net
>>206
なんか話途中から首突っ込んだけど
結局はそういうしょうもないオチっぽいなこれw
ポインタの指す先のデータ構造に一切関わらず
アクセス用のポインタを回収して配列にするんならそりゃO(1)だもんな
そしてわざわざそれをしたいという動機もよーわからんかった
216:デフォルトの名無しさん
21/11/22 18:12:45.44 HWCOZSD4.net
例えば、データベースの様なものが有ったとしよう。
個人情報がリンクリストに入っているが、ID番号と個人情報は別に配列の中に
入っていて、ID番号の構造体には、リンクリストのノードのアドレスも
入っているとする。
これだと、ID番号を全て巡って、それぞれの個人情報を巡る時、
個人情報の1個当りのアクセスに掛かる平均時間はO(1)だ。
しかし、ノードのアドレスの変わりに、ノードの通し番号を入れてしまって
いたとすると、ノードをシークするためにO(N)の時間が掛かってしまう。
なので、ノードの識別をポインタにしてしまえば、O(1)で、通し番号に
してしまえばO(N)の時間が掛かる。
だから、リンクリストを使う場合には、通し番号ではなく、ポインタを
使うことが推奨されている。ところが、Rustではそれがほぼ不可能。
217:デフォルトの名無しさん
21/11/22 18:14:22.43 43z4eYfr.net
へー、Rustってそんなこともできないんだ
218:デフォルトの名無しさん
21/11/22 18:15:23.83 HWCOZSD4.net
>>210
いや、ノードの識別をアドレスで行いさいすれば、
リンクリストと配列のランダムアクセスに掛かる時間はどちらもO(1)だから
リンクリストが劣っていることは無い。
なぜなら、乱数で与えられた位置のノードをアクセスする必要は無いから。
ランダムアクセスする場合でも、アクセスすべき位置は、アドレスで決まっている。
シークの時間は不要。
219:デフォルトの名無しさん
21/11/22 18:16:52.13 HWCOZSD4.net
>>214
次の借用規則に引っかかる。
・1個でも書き込みの参照が有る場合、読み込み参照は1つも持てない。
書き込み参照も1個しか持てない。
220:デフォルトの名無しさん
21/11/22 18:26:59.33 5egSOJea.net
>>214
Rustが次々とC/C++の領域を置き換えていってるように
両者で実現できることは同じ
彼はアルゴリズムとオーダーについてもよく理解できていないだけでなく
Rustについても全く理解していない
221:デフォルトの名無しさん
21/11/22 18:28:27.85 43z4eYfr.net
なるほど。もうちょっとRust覚えたらそういうデータ構造も自分で実装して試してみるよ
222:デフォルトの名無しさん
21/11/22 18:31:34.64 HWCOZSD4.net
>>217
計算時間のオーダーが全く違ってくる。
データベースなどは速度やメモリー効率を高めるために、さまざまな構造を
駆使して作られていることが有り、Rustでは自由に作ることが難しいことが
有り得る。
100万行のテキストエディタの先頭に1000行のデータをペーストするような
時にもリンクリストが大活躍する。単純な配列では遅すぎて駄目。
223:デフォルトの名無しさん
21/11/22 18:34:23.79 HWCOZSD4.net
>>217
あなたは、データ構造やポインタを深く理解して無いか、
高度な実践的プログラミング経験が浅いかのどちらか。
224:デフォルトの名無しさん
21/11/22 18:41:12.00 EEj8G+es.net
>>219
やはりプログラミングしたことがないようだな
そこで50万行目に行く場合に配列併用なし実装だとリンクを50万回たどるO(n)
配列併用あり実装だと50万行目へ一気に行けるO(1)が挿入削除時のたびに配列内で大移動O(n)
つまりO(1)になっているのは配列アクセスのみ
225:デフォルトの名無しさん
21/11/22 18:45:29.95 HWCOZSD4.net
>>221
リンクリストAの中のランダムな位置のノードのアドレスを、
別のリンクリストBに入れておいて、Bの先頭から順番にループすれば、
リンクリストAのノードをランダムアクセスできるが、その時の
一個のノードあたりの平均アクセス時間はO(1)だ。
ここに配列は一個も出てこない。
226:デフォルトの名無しさん
21/11/22 18:51:10.61 5egSOJea.net
>>222
それ、あるkが与えられたときにk番目のアクセスがO(n)になってる
それがリンクリストの性質
ランダムアクセスすなわちk番目のアクセスはO(1)の配列が圧倒的に有利
227:デフォルトの名無しさん
21/11/22 18:54:15.44 HWCOZSD4.net
>>221
それはテキストエディタでは結構問題になる部分だが、
実際的には、ページ単位の大きな移動は文字挿入や文字削除などの編集操作に比べて時々しか
行わないことと、現在位置から相対的な移動距離は大きくないことが多いことから、
行の記憶は配列ではなくリンクリストにしておく手法を取ると良い。
実際に行の記憶を何も配慮せずに配列でやると、ペーストした時にとても遅くなる。
一方、行の記憶をリンクリストにすると、実際問題はかなり快適になる。
スクロールなども速い。
一気に決め打ちの行番号に移動するのはO(N)の時間が掛かることはかかるが、
決め打ちの番号に移動することは、たまにしか行わないので遅くは感じない。
228:デフォルトの名無しさん
21/11/22 18:55:48.2
229:9 ID:HWCOZSD4.net
230:デフォルトの名無しさん
21/11/22 18:59:38.49 HWCOZSD4.net
>>223
ランダムアクセスとランダムに生成した通し番号 k のノードにアクセスする
ことは別の概念だぞ。
231:デフォルトの名無しさん
21/11/22 19:03:37.90 kGsgeZzB.net
結局Rustで実装できないテキストエディタ向けのデータ構造って具体的にはなんなんだ…
ropeもgap bufferもpiece tableも普通にRust実装あるが
232:デフォルトの名無しさん
21/11/22 19:07:47.11 HWCOZSD4.net
>>227
それは、人の知らないものを出してきて、根本問題から目を背けさせる手法。
どんなcrateがあろうと、根本的に出来無い事がRustには有るという話をしてる。
233:デフォルトの名無しさん
21/11/22 19:18:39.97 4Q+A1yLL.net
>>228
だからそのデータ構造をCでもC++でもなんでみいからはよソースコードで示せ
234:デフォルトの名無しさん
21/11/22 19:19:12.02 5egSOJea.net
>>225
まずCプログラマーには常識だけど
インデックスの番号を持つこととポインタを持つことでオーダーOが変わることはない
次に各々への複数のポインタを持つには配列やリンクリストなどの構造が必ず必要となる
いずれにせよポインタを使うことでオーダーOが変わることはない
>>228
そんなウソをついて何がしたいのかさっぱりわからない
235:デフォルトの名無しさん
21/11/22 19:21:02.53 HWCOZSD4.net
>>230
>インデックスの番号を持つこととポインタを持つことでオーダーOが変わることはない
>次に各々への複数のポインタを持つには配列やリンクリストなどの構造が必ず必要となる
>いずれにせよポインタを使うことでオーダーOが変わることはない
なんで、このスレはこんなにレベルが低いの。
236:デフォルトの名無しさん
21/11/22 19:21:28.08 HWCOZSD4.net
>>230
>そんなウソをついて何がしたいのかさっぱりわからない
真実だから。
237:デフォルトの名無しさん
21/11/22 19:27:10.84 DZQ1+JmR.net
>>232
数学の専門家であってプログラミング経験がないからソースコード出せとの指摘には一切答えられないということかな
238:デフォルトの名無しさん
21/11/22 19:32:17.29 fRCpO7Rh.net
>>194
ここであなたがおっしゃっているのは、以下のような実装のことでしょうか?
Element *array[] = {l0, l1, l2, l3, ...};
lnはリストのn番目の要素
239:デフォルトの名無しさん
21/11/22 19:43:59.25 HWCOZSD4.net
>>234
近いが、初期値が、{ &l5, &l1, &l123, &l25, ... };
のようになっているイメージ。
ただし、実際には、
・初期化子リストには書かず、プログラムの途中でリンクリストに挿入した直後に記録するような
ことが多い。
・ノードの識別を常にポインタで扱うので、& で書くことは無い。
・固定配列ではなく、それもまたリンクリストにすることが多い。
なぜなら、リンクリストは効率が良いことが多いから。
240:デフォルトの名無しさん
21/11/22 19:46:52.11 HWCOZSD4.net
>>233
そうではなく、
・大規模すぎて、こういうところには抽出して書ききれない。
・言葉で書いたほうが理解し易いはずだと思った。
抽象概念を理解しにくい人がこんなに多いスレだとは思わなかったから。
・しかし、これだけ書いても理解できないと言うことは、具体的に書いても
ますますそのコードの本質的な意味が理解できないと思われる。
241:デフォルトの名無しさん
21/11/22 19:57:10.45 43z4eYfr.net
中国共産党のお偉いさんって本当に偉いんですね
242:デフォルトの名無しさん
21/11/22 19:57:37.97 43z4eYfr.net
スレ間違えた まいいか
243:デフォルトの名無しさん
21/11/22 20:02:20.61 fRCpO7Rh.net
>>235
ある要素が複数のリストに所属するイメージでしょうか
例えば全要素が連なっているリストのn番目、特定の要素だけが抽出された別のリストのm番目に属すといったような
要素の削除に当たっては属するすべてのリストについて前後の要素からの参照を外す
244:デフォルトの名無しさん
21/11/22 20:03:50.15 5egSOJea.net
配列でもリンクリストでも他のコレクションでも全てに言えること
「格納要素が『データ本体でも、ポインタでも、何らかのid番号でも、他のインデックス番号でも、』そこは一切関係なく、様々な操作のオーダーOが変わることはない」
まずこの大原則をID:HWCOZSD4は理解できていないのたろう
だからポインタを使うと魔法のようにオーダーがO(1)になる
245:と勘違いしている
246:デフォルトの名無しさん
21/11/22 20:04:15.63 HWCOZSD4.net
>>239
今回例としてあげたのはそういうケース。
ただそれは一例であってさまざまなケースがある。
247:デフォルトの名無しさん
21/11/22 20:04:48.66 HWCOZSD4.net
>>240
アホか。
俺は現実世界では天才と言われてるのに。
248:デフォルトの名無しさん
21/11/22 20:05:43.93 fRCpO7Rh.net
>>241
この一例もやはりRustでは実装できないのでしょうか
249:デフォルトの名無しさん
21/11/22 20:07:17.81 HWCOZSD4.net
>>243
読み込みオンリーに限定して、一切削除もしないという条件なら可能。
ノードの中に書き込んだり、ノードを削除するなら、不可能。
250:デフォルトの名無しさん
21/11/22 20:08:42.39 HWCOZSD4.net
>>244
[補足]
C/C++/Java/C#/JS/Ruby/Python など多くの言語では可能だが、Rust
だけが不可能。
なので、Rustだけが仲間はずれであり、他の言語でできる事ができない。
251:デフォルトの名無しさん
21/11/22 20:10:06.74 5egSOJea.net
>>243
C言語で可能なことはRustでも可能
>>244
嘘つき
252:デフォルトの名無しさん
21/11/22 20:11:54.24 4Q+A1yLL.net
>>236
gistでもどこでもいいからコード貼り付けてリンクここに貼ってください
日本語でうだうだ話すより議論が早く終わるでしょうあなたの言うことが正しければ
253:デフォルトの名無しさん
21/11/22 20:14:36.47 EEj8G+es.net
>>245
Rustでプログラミングをしたこともない人がデタラメな妄想を撒き散らしてるなw
254:デフォルトの名無しさん
21/11/22 20:14:53.48 HWCOZSD4.net
>>246
デタラメ一言ってんじゃないぞ!!
>>247
具体例を書いても、それはレアケースだの、本質的にはリンクリストの速度では
間違った評価が下るだけ。
そもそも、極簡単な話を書いてるのに理解できないのにコードを書いても理解できる
とは思えない。
そもそも、ランダムアクセスの意味すら理解出来て無い、ここの人達は。
255:デフォルトの名無しさん
21/11/22 20:15:30.95 HWCOZSD4.net
>>248
うそつきは黙れ。
256:デフォルトの名無しさん
21/11/22 20:18:44.14 HWCOZSD4.net
>>246
>>244 は、Rustの借用規則からそうなってる。
257:デフォルトの名無しさん
21/11/22 20:21:30.15 4Q+A1yLL.net
そもそもRustだって最悪UnsafeCell使えば1変数への多数読み書き参照は保持できるのだが
258:デフォルトの名無しさん
21/11/22 20:27:13.86 4Q+A1yLL.net
>>249
僕はリンクリストの速度がどうこう評価するつもりはあんまりなくて、
他言語で書かれたソースコードが本当にRustでは無理なのかを確認したいだけ
だから、その「Rustでは無理なコード」を見てみたい、と言っている
最悪ソースコードの中身は理解不能なものでもよい
259:デフォルトの名無しさん
21/11/22 20:27:43.67 43z4eYfr.net
>>249
説明するつもりもないのに、お前らはどうせ理解もできないバカだ、俺はいつも数学100点の天才だ、俺を信じろ
とか言ってても狂人扱いされるだけに決まってるじゃん・・・
260:デフォルトの名無しさん
21/11/22 20:29:18.57 0LbM6y2O.net
Cursorを使えと何回言っても聞かない
テキストエディタの例では>>119のアイデアを完全無視
261:デフォルトの名無しさん
21/11/22 20:50:09.64 MtEs+7mt.net
おれも興味があるな
C++では書けてRustでは書けないコード
リソースを無視すればチューリング完全だろうから
書けないなんて事はないはずで
何かしら制限を付けた上での「書けない」なんだろうけど
262:デフォルトの名無しさん
21/11/22 20:55:11.07 fRCpO7Rh.net
>>245
Rust でも書けるように思えてしまったのですが、以下のコードはどこが間違っているのでしょうか
URLリンク(play.rust-lang.org)
263:デフォルトの名無しさん
21/11/22 21:10:18.70 ejqG4gpN.net
>>216
プログラマを守るためそれをさせないのがRustっていう言語ではw
Rc<RefCell>ではいかんの?
URLリンク(play.rust-lang.org)
fn main() {
use std::collections::LinkedList;
use std::rc::Rc;
use std::cell::RefCell;
let mut list: LinkedList<Rc<RefCell<i32>>> = LinkedList::new();
list.push_back(Rc::new(RefCell::new(1)));
list.push_back(Rc::new(RefCell::new(2)));
list.push_back(Rc::new(RefCell::new(3)));
println!("{:?}", list); // [RefCell { value: 1 }, RefCell { value: 2 }, RefCell { value: 3 }]
let mut vec: Vec<Rc<RefCell<i32>>> = Vec::new();
let mut it = list.iter();
vec.push(Rc::clone(it.next().unwrap()));
vec.push(Rc::clone(it.next().unwrap()));
vec.push(Rc::clone(it.next().unwrap()));
println!("{:?}", vec); // [RefCell { value: 1 }, RefCell { value: 2 }, RefCell { value: 3 }]
println!("{:?}", vec[1]); // RefCell { value: 2 }
*vec[1].borrow_mut() = 22;
println!("{:?}", vec[1]); // RefCell { value: 22 }
println!("{:?}", list); // [RefCell { value: 1 }, RefCell { value: 2 }, RefCell { value: 3 }]
println!("{:?}", vec); // [RefCell { value: 1 }, RefCell { value: 2 }, RefCell { value: 3 }]
}
264:デフォルトの名無しさん
21/11/22 21:13:26.74 7gi7NmEv.net
>>255
Cursorでも無理だ。
265:デフォルトの名無しさん
21/11/22 21:14:06.15 ejqG4gpN.net
あっコメントはミスってる
実行結果はこちら
[RefCell { value: 1 }, RefCell { value: 2 }, RefCell { value: 3 }]
[RefCell { value: 1 }, RefCell { value: 2 }, RefCell { value: 3 }]
RefCell { value: 2 }
RefCell { value: 22 }
[RefCell { value: 1 }, RefCell { value: 22 }, RefCell { value: 3 }]
[RefCell { value: 1 }, RefCell { value: 22 }, RefCell { value: 3 }]
266:デフォルトの名無しさん
21/11/22 21:17:24.64 DZQ1+JmR.net
Rustの実装 (>>257) はポインタでの直接アクセスではなく配列への添え字アクセスだからオーバーヘッドが大きいとか言い出したらみんなで笑ってあげましょう
267:デフォルトの名無しさん
21/11/22 21:26:20.75 7gi7NmEv.net
>>257
独自のLinkedListで、実装としては配列を持っていて、
ノード間が参照でリンクされておらず、添え字番号でリンクしており、
get(), set()が添え字番号を返して配列要素を返しているので
ゼロコストではないね。
struct LinkedList<T> {
first_idx_a: Option<usize>,
first_idx_b: Option<usize>,
elems: Vec<Elem<T>>,
}
struct Cursor {
a_idx: usize,
}
fn get(&self, elem: Cursor) -> &T {
&self.elems[elem.a_idx].data
}
fn set(&mut self, elem: Cursor, data: T) {
self.elems[elem.a_idx].data = data;
}
268:デフォルトの名無しさん
21/11/22 21:27:13.68 7gi7NmEv.net
>>261
ゼロコストが謳いなのに、ゼロコストで無い。
269:デフォルトの名無しさん
21/11/22 21:27:14.40 5egSOJea.net
>>257
それで実装も動作も良いけど
_bはどちらも不要
_a.0と_a.1はそれぞれprevとnextと書いたほうが読みやすい
270:デフォルトの名無しさん
21/11/22 21:33:11.94 fRCpO7Rh.net
>>264
_b は単一の要素が複数のリストに属するという要件に対する実装ですね
面倒だったのでメンバーだけ用意して実装はしてないですが
タプル使ってるのも構造体定義が面倒だったため
というかできるできないを実証するための例なので細かいところは適当です
お好きなように修正してください
>>263
>>245 の
> C/C++/Java/C#/JS/Ruby/Python など多くの言語では可能だが、Rust
だけが不可能
> なので、Rustだけが仲間はずれであり、他の言語でできる事ができない。
というのはほかの言語ではゼロコストで実装できることを意味していますか?
それともRustでも実装できることを認めた上でのただの負け惜しみですか?
はたまたこれを書いたのは自分とは別の人と主張されるのでしょうか
271:デフォルトの名無しさん
21/11/22 21:34:40.04 fRCpO7Rh.net
>>262
ゼロコストを定義してください
272:デフォルトの名無しさん
21/11/22 21:37:06.49 7gi7NmEv.net
>>265
後半のあなたの主張、おかしくないか。
Rustの参照では無い独自の参照風の様な構造を添え字番号で実装してしまって、
C言語より速度を落としているのだから、ゼロコスト性に反してる。
273:デフォルトの名無しさん
21/11/22 21:38:01.88 7gi7NmEv.net
>>266
参照に関しては、参照がC言語の生ポインタと同じ速度で扱えること。
274:デフォルトの名無しさん
21/11/22 21:38:56.97 fRCpO7Rh.net
>>267
あらゆる言語の中でRustだけが実装できないという主張は撤回されて
CにRustは劣るという主張へと変更されるのですね?
275:デフォルトの名無しさん
21/11/22 21:49:14.11 EEj8G+es.net
>>257
elements_aはinto_iterにしたらあかんの?と思ったけど
2つ持った時の前半用として用意した意味なのかw
276:デフォルトの名無しさん
21/11/22 21:56:48.89 7gi7NmEv.net
>>269
1. データを格納している場所が配列になっているが、動的に長さを長くしようとすれば
動的配列と同様のコピー動作が生じてしまうから、その実装は、本来のLinkedListの
性質とはかなり異なる。リンクリストは速度的に安定である事が重要なのに、
この性質により、動的配列と同様に、時々大規模コピーが生じて、スパイク的に
速度が遅くなる減少を伴うことになってしまう。このようなスパイク的な
速度低下は、twitterかFacebook のどちらか忘れたが、どっかのSNSでも問題
になっていた。
2. アクセスするときに、番号を配列のアドレスに変換する動作を毎回行っている。
277:デフォルトの名無しさん
21/11/22 22:00:19.83 7gi7NmEv.net
>>271
[補足]
誤解を招いて議論に混乱を来たしそうなので捕捉しておくと、
271の2で書いた「番号」は、リンクリストの先頭からの通し番号の事ではなく、
今回示されたリンクリスト風のコードで、内部で用いられている配列の添え字番号
のことで、リンクリストの先頭からは、辿っていっても、連続した番号には成ってないもの。
278:デフォルトの名無しさん
21/11/22 22:05:48.24 fRCpO7Rh.net
>>271
あらゆる言語で実装できないがRustでは実装できない
他の言語だと O(1) だが Rustだと O(N) になる
という主張を撤回されたと理解しました
そういうことでしたら私の方から言うことはなにもありません
またアロケーションについてはVecを実装が工夫されたコンテナ型に変えることで対応できそうですね
実装詳細のないまま議論してもしょうがないトピックなのでこれ以上こちらからレスを重ねることはやめます
ありがとうございました
279:デフォルトの名無しさん
21/11/22 22:10:00.62 7gi7NmEv.net
>>271
[追加]
3. そこにさらに削除メソッドを実装したとしよう。
削除したノードに対する番号が、どこかのCursorの中にまだ生きた状態に
なっている場合、ダングリング参照と似た現象が起きる。
削除したノードの中を参照できてしまうのだ。
280:デフォルトの名無しさん
21/11/22 22:15:27.68 7gi7NmEv.net
>>273
その主張、Rustの中に超軽量のインタプリタの様なものを載せておいて、
そのインタプリタの中ではランダムアクセスがO(1)のリンクリストが
完全に実装できることを示しただけだね。
しかも、追加すると、時々、大規模なメモリーコピーが生じるし。
newやmallocではそのようなメモリーコピーは生じない。
ノードを追加しても、リンクリスト中の他のノードの本当のマシン語レベルでの
線形アドレスが固定で変化し無いし。
あなたの実装では、それが変化してしまう。相対アドレスは変化しないが。
ベースアドレスが変化している。
281:デフォルトの名無しさん
21/11/22 22:19:00.36 fRCpO7Rh.net
>>274
generational arenaという手法を利用することでダングリングポインタ的アクセスを検知してハンドリング可能になります
282:デフォルトの名無しさん
21/11/22 22:19:03.44 7gi7NmEv.net
>>274
[補足]
実質的なダングリング参照が起きるということは、Rustのもう一つの柱である
ところのメモリー安全性が部分的に壊れてしまってるということだ。
283:デフォルトの名無しさん
21/11/22 22:23:12.75 7gi7NmEv.net
>>276
動的コストを掛けていいなら、C++でも安全性の高いものは作れるぞ。
ポインタも正しいメモリーブロックを指していることを動的に確認した後で
実際に参照するようなことは、C++でも出来るから。
Rustも配列の範囲チェックはやっているが、配列以外のアドレスでも、動的に
チェックしようと思えばいろいろなチェック法はある。
その一つの方法が、アドレスではなく、あなたが書いたような配列の中の
番号方式にしてしまうこと。
番号に対する配列要素がNULLになっていれば、動的にエラーを出力して
アプリを停止させる、などの方法が有る。
284:デフォルトの名無しさん
21/11/22 22:25:32.33 fRCpO7Rh.net
>>278
Rustの zero-cost abstraction はあなたの期待するような物ではありませんでした
残念でしたね
285:デフォルトの名無しさん
21/11/22 22:36:23.68 7gi7NmEv.net
>>265
>>
286:C/C++/Java/C#/JS/Ruby/Python など多くの言語では可能だが、Rust だけが不可能 >> なので、Rustだけが仲間はずれであり、他の言語でできる事ができない。 >というのはほかの言語ではゼロコストで実装できることを意味していますか? >それともRustでも実装できることを認めた上でのただの負け惜しみですか? 分かった。ゼロコストで無くて良いなら Rustでも実装できるということだね。 なるほど、今回の実装法のような裏技の発想は無かったよ。それは認める。 でも、ゼロコストでなくなるということは、RustがC/C++の代替になるという 説には反することになるね。 それと、C++, Java, C# では最初から標準ライブラリ的なもので最初から実装済み なのに対して、あなたのやり方は、少なくとも標準のLinkedListではないね。 Cursorも標準のものとは別。
287:デフォルトの名無しさん
21/11/22 22:37:35.24 0LbM6y2O.net
結局何がしたいのよ
ノードへの参照を持ったままリストを変更したいの?
288:デフォルトの名無しさん
21/11/22 22:44:50.09 7gi7NmEv.net
>>281
何がしたいって、C/C++/C#/Javaでは、LinkedListへのアクセスがO(1)で
自由自在に出来るのに、標準のRust実装では出来ないことが問題なんだ。
それに、今回示された実装法では、内部では配列で実装されているから、
ノードを追加してい言って、配列の要素数を超える時には、新しい配列を
コピーして内部でコピー動作が生じる。これは、C++のnewよりも遥かに
遅い動作になってしまうし、スパイク的に時々生じるから速度的な安定性
が求められるソフトでは好ましくない現象。
また、実質的なダングリング参照的が生じることも指摘した。
結論は、このやり方で、C/C++などと同じO(1)にはなったものの、安全性も失われ、
ゼロコスト性も失われ、C/C++の実装に比べて速度的に不安定でありスパイク的に
遅くなるということだ。
289:デフォルトの名無しさん
21/11/22 22:51:04.06 0LbM6y2O.net
>>282
「LinkedListへのアクセスがO(1)で自由自在に出来る」
が正確にはどういう意味かと聞いているんだ
>>257の実装は忘れなさい
290:デフォルトの名無しさん
21/11/22 22:52:27.47 7gi7NmEv.net
>>281
>ノードへの参照を持ったままリストを変更したいの?
もちろん、それもある。
291:デフォルトの名無しさん
21/11/22 22:56:03.63 qBbb57Hy.net
デマを流すのはゼロコストなんだから相手にした時点で負け
292:デフォルトの名無しさん
21/11/22 22:57:09.11 7gi7NmEv.net
>>283
>「LinkedListへのアクセスがO(1)で自由自在に出来る」
>が正確にはどういう意味かと聞いているんだ
Cの場合、ポインタでアクセスすれば、O(1)でリンクリストの
ノードを参照できるし、削除も出来る。
削除しても、他のノードのアドレスは変化しないから、ポインタも
書き換える必要も無い。
配列だったら、削除するとそれより後ろのノードの番号が全て
変化してしまうので、書き直さなくてはならない。
リンクリストでも、先頭からの通し番号を識別番号に
している場合には、同様にそれ以後のノードの全ての番号を書き換えないといけない。
リンクリストのノードにO(1)でアクセスするというのは、ポインタでアクセスすれば
当たり前の事で、どう説明していいのか分からない。マシン語では、間接参照の
[アドレス]
だけの話だから。
コンピュータの基礎から学び直してもらわないと理解してもらえないかも知れない。
マシン語を学んで欲しい。
293:デフォルトの名無しさん
21/11/22 22:57:21.67 0LbM6y2O.net
コンテナと各要素の&mutと&が同時に取れない件はsplitして借用の単位を分けるべし
Vec::split_at_mutと同様の発想
294:デフォルトの名無しさん
21/11/22 22:59:22.03 0LbM6y2O.net
>>286
だからそれだけならCursorMutでできるんだって
でもダメなんだろ?
それはなぜ?
295:デフォルトの名無しさん
21/11/22 23:01:06.85 7gi7NmEv.net
>>285
どっちがデマだと思ってるのか知らんが、俺のはデマじゃないぞ。
実際に、今回の実装を示した彼は、俺の言ってることはある程度正しく理解していた。
つまり、基本的にデマじゃないということを理解した人がいるということだ。
ただし、彼は、ゼロコスト安全性である、ということを無視して独自実装したり、
参照を独自に修正したものを勝手に導入した誤魔化しがあったのが残念であった
だけだ。
つまり、俺の主張自体は、彼は本当は理解している。
理解しているが、悔し紛れに詐欺めいた独自実装をしたことだけが残念なだけだ。
296:デフォルトの名無しさん
21/11/22 23:01:57.98 7gi7NmEv.net
>>288
1つのリンクリストに対して、書き込み参照や読み込み参照を同時に複数持てない。
297:デフォルトの名無しさん
21/11/22 23:13:17.79 5egSOJea.net
>>290
デマを流すのはそろそろやめとけよ
RustはRefCellもあるし複数からポインタで指しつつ書き換えもできるぞ
298:デフォルトの名無しさん
21/11/22 23:14:41.21 7gi7NmEv.net
>>291
そもそも、RefCellは、動的チェックが入るからゼロコストではない。
C には存在しないコストが新たに導入される。
299:デフォルトの名無しさん
21/11/22 23:15:37.93 WXoW4mOX.net
unsafe で生ポインタ使えばCと同じ実装は確実にできるが
300:デフォルトの名無しさん
21/11/22 23:15:41.59 NDd1353W.net
リンクトリストな?
301:デフォルトの名無しさん
21/11/22 23:16:05.08 5egSOJea.net
>>292
何を言ってるんだ?
そういうコストかけずにどうやって排他制御するんだよ?
302:デフォルトの名無しさん
21/11/22 23:18:27.46 WXoW4mOX.net
>>295
そこはCだとプログラマが気をつけることで排他制御してるんだと思うよ
unsafe Rustでも同じだけど
303:デフォルトの名無しさん
21/11/22 23:18:40.37 7gi7NmEv.net
>>295
C++と同じ事が出来るのに「ゼロコスト」で「安全」、と謳ってるのが間違いだと
言ってる。
間違いというより、デマや誇大宣伝。
304:デフォルトの名無しさん
21/11/22 23:21:22.25 0LbM6y2O.net
>>290
そうだ、最初からそう言えばよかったんだ
蓋を開けてみればO(1)なんかまるで関係無いじゃないか
でそれに対して>>287という策があるわけだがどう思う?
305:デフォルトの名無しさん
21/11/22 23:22:12.49 7gi7NmEv.net
>>295
「排他制御」とは、マルチスレッドプログラミングで使う用語なのだが、
本当にその意味で使ってるか?
306:デフォルトの名無しさん
21/11/22 23:22:18.49 EEj8G+es.net
>>292
ゼロコストって他のことでもそうだけど全くコストがかからないってことではない
必要最低限のことのみでそれ以外はゼロコストってこと
今回のRefCellならば並行プログラミングの時の書き換え競合が起きないことを保証する
RefCellはゼロコスト
ゼロコストでないと主張するならば他の対処方法を述べよ
307:デフォルトの名無しさん
21/11/22 23:24:19.66 7gi7NmEv.net
>>298
「策」があるっていうが、どんどん複雑化し、コストも増えているだろ。
308:デフォルトの名無しさん
21/11/22 23:28:31.00 7gi7NmEv.net
>>300
俺も正直言うとRefCellとか出てくると複雑すぎてよくわからなくなってくるが、
RefCellは内部可変性に対するものだから、並行プログラミングを使わない時
にも使うことがあるはずだが。
309:デフォルトの名無しさん
21/11/22 23:28:31.66 NDd1353W.net
Rustは安全性を追求した言語でC++と比較する物ではない。
比較するならRubyが妥当。
310:デフォルトの名無しさん
21/11/22 23:30:51.55 7gi7NmEv.net
>>303
つまり、CやC++の代替には成りえない。
アプリレベルであってもC/C++の全てをカバーすることは出来ない。
311:デフォルトの名無しさん
21/11/22 23:33:19.88 WXoW4mOX.net
コンパイラに安全性を保証してほしければ実行時のコストを払ってRefCellを使えばいいし、
そのコストを払いたくなければunsafe 使って自分で安全性を保証すればいいって話なんだが
312:デフォルトの名無しさん
21/11/22 23:35:15.39 4Q+A1yLL.net
必要最低限のunsafeを使うのは大前提で、
それでもリンクリストがどうたらって話じゃなかったっけ・・・??
313:デフォルトの名無しさん
21/11/22 23:36:31.09 NDd1353W.net
だからリンクトリストな?
314:デフォルトの名無しさん
21/11/22 23:38:22.71 5egSOJea.net
>>299
シングルスレッドマルチタスクでも競合は起き得る
そのため書き込み権限がある者がある瞬間に複数存在しないことを保証する(排他制御)ためにRefCellがある
マルチスレッドの場合は並列に起き得るからもっと厳しくてRefCellではダメでMutexやRwLockを使う
315:デフォルトの名無しさん
21/11/22 23:39:08.56 NDd1353W.net
Rustは安全性を追求した言語でC++と比較する物ではない。
比較するならVBAが妥当。
316:デフォルトの名無しさん
21/11/22 23:40:06.95 NDd1353W.net
RustがC++をライバル視してきて非常にウットオシイ。
貴様のライバルはJavascriptだろ。
317:デフォルトの名無しさん
21/11/22 23:41:22.24 7gi7NmEv.net
>>291
LinkedListの中のノードへの参照を10個持っている状態で、
その参照を使って1個のノードを削除しようとしてコンパイルは通るか?
318:デフォルトの名無しさん
21/11/22 23:42:38.96 0LbM6y2O.net
>>301
safeであるためには必要なコストだと思うけどね
mutabilityが前後のノードに影響するデータ構造だから仕方がない
319:デフォルトの名無しさん
21/11/22 23:44:32.43 5egSOJea.net
>>311
それCでもC++でもダングリングポインタ発生の駄目プログラマーパターン
320:デフォルトの名無しさん
21/11/22 23:49:43.35 7gi7NmEv.net
>>313
そんなことないぞ。
vectorと勘違いして無いか。
321:デフォルトの名無しさん
21/11/22 23:55:11.62 4Q+A1yLL.net
>>311
参照先自体を削除するんじゃなくて、参照先からさらにnextとかprevたどってどっかのノードを削除するってこと?
参照先自体を削除するのはRustに限らず問題でるよね
322:デフォルトの名無しさん
21/11/22 23:58:04.28 7gi7NmEv.net
>>315
参照先を削除するのは普通なことで、安全に行えるぞ。
参照とは、つまり、識別番号の代わりに使うものだからな。
参照はオブジェクトに付けられた名前みたいなもんだから、
逆に言えば、参照先を削除できないなら、削除する方法がほぼ無い。
323:デフォルトの名無しさん
21/11/23 00:00:50.13 1c3aeddQ.net
何の話についてもまずは具体的なC言語のコードを示すべきじゃないかな
そうすればRustのコードを2種類みんなが出してくれるよ
・1つは元のC言語と同じ安全度で場合によってはunsafeを用いて実装
・もう1つはメモリ安全性を保証してunsafeを使わずに実装
つまり「C言語で出来ることはRustで必ず出来る」+「Rustではメモリ安全性を保証した実装も可能」
明らかにC言語よりもRustの方が能力も高く優れている
324:デフォルトの名無しさん
21/11/23 00:00:51.12 16zHq7La.net
>>314
残り9個の参照はそのノードが削除されたことを知る術がないからダングリングポインタになるってことだろ
325:デフォルトの名無しさん
21/11/23 00:08:02.67 xJBrssBV.net
>>318
本来は、明らかに別のノードであれば問題ない。
C++では普通に安全にそれが行える。
リンクリストの中に、A, B, C という名前の人のデータが入っていて、
それぞれに対して1つずつそれぞれ、ポインタ pA, pB, pC が存在している時に
ポインタ pA を介してAを削除しても、B, C へのポインタ pB, pC は残っていて、
値も変更されることも絶対に無いから完全に安全。
Aさんのデータを削除する場合にはこのようなことが起きるが、その時には、
delete pA の後、pAを捨ててしまうだけで全く安全。
pB, pC は何事も無くまったく安全に残せるし、何のバグも入らない。
こんな単純なロジック、何の問題も無い。
326:デフォルトの名無しさん
21/11/23 00:15:34.94 8Ju98kPx.net
同一のノードに10個の参照って意味ちゃうん?
327:デフォルトの名無しさん
21/11/23 00:16:47.17 1c3aeddQ.net
>>319
それだと>>311の条件を満たしていないのでやり直し
・いずれにせよC/C++で書けるコードはそのままの形でそのままの安全度で必ずRustでもunsafeを用いて書ける
・更にRustでは安全性を保証する形でunsafeを用いずに実装することもできる
C/C++よりもRustのほうが明白に能力が高い
328:デフォルトの名無しさん
21/11/23 00:20:07.35 xJBrssBV.net
>>320
1つのリンクリストの異なる10個のノードに対する10個の参照。
329:デフォルトの名無しさん
21/11/23 00:21:41.44 /rTkTwIT.net
>>319
C++でノードへのポインタは実装依存な方法でしか取れないよ
pAその他は本当にポインタ?イテレータではなく?
330:デフォルトの名無しさん
21/11/23 00:21:54.64 xJBrssBV.net
>>321
何度もしているが、それはフェイク。
Cできることのうち、Rustでは追加コストを掛けずにはsafeモードで出来ないことはたくさん有る。
unsafeモードを使いまくれば別。
しかしそれではRustを使う意味が無い。
331:デフォルトの名無しさん
21/11/23 00:22:40.62 xJBrssBV.net
>>323
C++ではなく、Cのリンクリストで考えよう。C++は別の複雑さを入れ込んだから。
332:デフォルトの名無しさん
21/11/23 00:22:46.42 s6k3uLQ1.net
>>324
なぜRustを使う意味がないのですか
333:デフォルトの名無しさん
21/11/23 00:25:21.42 xJBrssBV.net
>>326
Rustの売りはゼロコスト+安全性にあるからだよ。
どちらが掛けても意味が無い。
ゼロコストで無いなら既にC#やJavaがある。
安全で無いなら既にC++がある。
334:デフォルトの名無しさん
21/11/23 00:26:18.34 6/+wazXE.net
ああ、なるほど
安全性を考慮していないCのLinked Listと、安全性が保証されたRustのLinked Listを比較して、
Rustは遅い、できることが少なくて不便だ、みたいなことを述べてたわけか
Cでもメモリリークしないようにして、スレッドセーフにするとかしたら、途端に大変になりそう
335:デフォルトの名無しさん
21/11/23 00:26:36.02 s6k3uLQ1.net
>>327
違いますよ
336:デフォルトの名無しさん
21/11/23 00:27:06.93 8Ju98kPx.net
>>324
リンクトリスト内のメソッドでunsafeを閉じ込めることできると思うんだけどそれではだめなのか
337:デフォルトの名無しさん
21/11/23 00:28:01.20 8Ju98kPx.net
なんなら>>330は「基本的な操作のメソッドは」ってしてもいいけど
338:デフォルトの名無しさん
21/11/23 00:31:19.33 xJBrssBV.net
>>330
複数のノードへの読み書き自由なアクセスの速度をO(1)を保ったままで、
RustではunsafeをLinkedListのメソッド内には閉じ込めることが基本的に
出来ない。基本的に、と言ったのは、先ほど彼が示したリンク先の独自
実装の様に、ゼロコストであることを諦めてコストを掛ければできる
ようになるから。ただし、その場合、スパイク的にO(N)の時間でコピー
動作が発生してしまう。
339:デフォルトの名無しさん
21/11/23 00:32:59.52 xJBrssBV.net
>>332
[補足]
スパイク的なコピーの発生だけでなく、普段からコスト増加もある。
ベースアドレス + 相対アドレスでアクセスするから。
340:デフォルトの名無しさん
21/11/23 00:38:03.01 1c3aeddQ.net
>>262
その人が作ったLinkedList実装がポインタではなく格納配列のインデックスを使っているだけだよ
Rustの標準ライブラリのLinkedList実装ではポインタを使っています
std::collections::LinkedList
URLリンク(doc.rust-lang.org)
341:デフォルトの名無しさん
21/11/23 00:39:30.31 xJBrssBV.net
>>334
それは分かってる。
で、標準の方は、ノードのアクセス速度に問題がある。
342:デフォルトの名無しさん
21/11/23 00:43:10.08 qrGqDm2c.net
>>335
RustはLinkedListでも問題を感じたことがないですが何を根拠に?
343:デフォルトの名無しさん
21/11/23 00:49:14.22 xJBrssBV.net
>>336
1つのリンクリストの異なる10個のノードに対する10個のmut参照を同時
に持ち事は出来ないので、O(1)でアクセスできないからだ。
344:デフォルトの名無しさん
21/11/23 01:04:38.76 qrGqDm2c.net
>>337
意味がわからないので具体的に意味のあるCコードを書いて
345:デフォルトの名無しさん
21/11/23 01:08:49.01 8Ju98kPx.net
Rustだと確かに複数個所のノードへの可変参照を得るのはunsafeメソッドになるだろうね
そのノードが全部別々であることが保証できないから
でもそれは他の言語でも同じで、例えば1のノードに複数の可変参照があって、
1の参照がノード消したらまずことになる
そしてunsafeを許すのなら、内部実装でUnsafe Cell使えばコンパイラからの見た目は不変参照になるから、
オーバーヘッドなしでそういうのは実装可能(ただしstdのLinkedListはそのようにはなっていない)
んで、複数個所のノードへの可変参照を得るというのは相当レアな操作なはずなので、
それはunsafeにしてもAPIの使い勝手としては全然問題はない
346:デフォルトの名無しさん
21/11/23 01:37:22.61 1c3aeddQ.net
あるC/C++コードがあった時
(A) 常にRustではC/C++コードと同じ安全度で(必要時はunsafeを用いて)実装できる
(B) ほとんどのケースでRustでは安全なコードを(unsafeを用いずに)実装できる
つまりRustの能力はC/C++を上回っている
言い換えると
C/C++を捨ててRustを使えば
(B) ほとんどのケースで安全性を保証する形で実装できる
(A) 残りのレアケースでもC/C++と同じ安全度で実装できる
したがってC/C++を用いずにRustを用いたほうがよい
347:デフォルトの名無しさん
21/11/23 05:32:01.67 RKGfozTd.net
安全性よりも、
とにかくパフォーマンスや使用リソースが最重要な用途がある
そういう所でC/C++が使われる
C/C++は少なくとも今後20年は使われ続ける
348:デフォルトの名無しさん
21/11/23 05:47:19.80 qrGqDm2c.net
>>341
RustはC/C++と同じパフォーマンスを出せます
>>340を読みましょ
C/C++からRustへ移ったほうが誰の目にも得です
349:デフォルトの名無しさん
21/11/23 07:27:06.42 RKGfozTd.net
本当に良いことばかりなら
ここで宣伝しなくても自然に広まるはず
350:デフォルトの名無しさん
21/11/23 13:48:55.03 VKZug2mU.net
いや、あわしろ氏もC++は窓から投げ捨てろと言ってる。
351:ハノン
21/11/23 14:00:24.39 A++o7U7T.net
>>344
その、あわしろ氏とやらは、では、なにを推薦しているのでしょうか?
352:デフォルトの名無しさん
21/11/23 14:20:23.73 BTZW3nye.net
ほんとRust気持ち悪いなw
リンクリストのような単純な構造でSTLでもboostでもそれ自体が「安全でない」ことはめったにない。
バグや脆弱性を作りこんでしまうのは多くは固定長のバッファに対するパース処理などで、確かに各種の
*nixコマンドなんかはRustで書いて貰ったほうが良い場合があるが、C/C++の数msが致命となる世界で
Rustが一般的となることはない。そんな布教をやってるから嫌われるんだよw
悔しかったらOpenSSLとか書き直して”安全なコード”で出してみろよ?WebkitにC/C++を排除させて
Rustだけにさせてみろw
353:デフォルトの名無しさん
21/11/23 14:29:53.22 VKZug2mU.net
いまさらC++やってるようでは時代についていけない老害という評価しかない。
354:デフォルトの名無しさん
21/11/23 14:45:56.12 CrSl9z1L.net
Linusも老害だしChromeコミッターも全部老害、気持ち悪さNo1のRustたちが敵を作りまくる自己評価で
あらゆるスレで暴れてる
355:ハノン
21/11/23 14:49:30.08 A++o7U7T.net
>>348
linus を老害呼ばわりするとは…
356:デフォルトの名無しさん
21/11/23 14:56:32.81 s6k3uLQ1.net
>>346
usじゃなくてmsなのか...
357:デフォルトの名無しさん
21/11/23 14:57:43.30 2khltGI7.net
twitterでも、RustはHaskell程度にしか発言されて無い。
一方、C 言語 で検索すると一日分でも見ることが不可能なくらい大量に
発言されてることが分かる。
twitterでは「C++」というキーワードでは検索できないので推定するしかないが、
C 言語以上であろう。
358:デフォルトの名無しさん
21/11/23 15:54:02.42 hMtNqdGd.net
>>340
>つまりRustの能力はC/C++を上回っている
ダウト。
安全面に置いては上回っているが、効率面では下がるケースがかなりある。
359:デフォルトの名無しさん
21/11/23 16:13:02.54 hMtNqdGd.net
・速度を落として安全性を高めたものは、既にJavaやC#がある。
・Rustが仮に速度面ではCに比べて余り遅くならないケースが多いと
仮定しても(この仮定には嘘があるのだが)、使いこなすのがJavaやC#
に比べると難しい。
特に参照関連だけでも、Option, Box, Rc, Arc, Cell, RefCell, Cursor, ref, &
の理解が必要な他、mut &'a などの表記、
let mut a : mut &:T = mut& b
や
Option<Rc<RefCell<T>>> a;
new Box<T>( T {・・・} );
のような解読が難しいシンタックスも多い。
このような複雑な表記は、JavaやC#には存在しない。
また、& と * の違いもあれば、& と ref の違いも有る。
let文ですらパターンマッチング方式になっているので Cのポインタの 10倍理解が難しい。
つまり、普通IQ者には理解が難しい。
逆に高IQ者は、C++でも安全に使えるし、C++を安全面では余り問題を感じて無い人が多い。
360:デフォルトの名無しさん
21/11/23 16:19:09.75 hMtNqdGd.net
>>353
さらに言えば、
・「自動参照外し」は便利だとされるが、逆に勝手に参照が外れることで、
他人の書いたコードの理解が難しいことがある。明記してるコードと
省略してるコードが同じことを意味してるのが理解しにくいので。
・&の意味が、let文の左辺ではパターンマッチング、右辺では参照、
の意味になっているので混乱しやすい。左辺では参照をはずす意味
になってしまう。
・&は、reference(参照)演算子と呼ばれるのに、ref という演算子もあるが、
これは、意味がかなり違うため、混乱し易い。
・nullポインタを代入するポインタは、Option<Box<T>> のように長くなる。
・ライフタイム注釈が発展途上中なのか、特に構造体に関するライフタイム注釈
のドキュメントが少なく、例で説明されるだけで、根本的な意味を書いた
ドキュメントが存在して無い。
361:ハノン
21/11/23 16:26:18.07 A++o7U7T.net
>>353
IQの定義は?
362:デフォルトの名無しさん
21/11/23 18:18:27.96 VKZug2mU.net
LinuxはRustを第二言語と位置づけ、カーネル開発に積極利用する計画です。
363:デフォルトの名無しさん
21/11/23 18:21:55.09 1c3aeddQ.net
C/C++/Rustをやってきた人ならRustが圧倒的にプログラミングしやすいことで一致している
調査結果でもRustが連続1位を続けていることからも客観的に明白
364:デフォルトの名無しさん
21/11/23 18:23:28.79 VKZug2mU.net
あわしろ氏もC++は終了する言語と言っています。
365:デフォルトの名無しさん
21/11/23 19:08:31.54 s6k3uLQ1.net
>>353
例示してるシンタックス全部間違ってるし釣りだろこれ
366:デフォルトの名無しさん
21/11/23 19:22:32.43 4h9SSBVx.net
>Rustが圧倒的にプログラミングしやすい
うんこ嘘つき野郎
367:デフォルトの名無しさん
21/11/23 19:25:27.46 1ymEsXZx.net
>>359
let mut a : mut &T = mut& b
Box<T>::new( T {・・・} );
だったかも知れんな。
複雑すぎるし、C++との違いが大きすぎて覚えてない。
C++ だと、new クラス名で、Rubyだと確か、クラス名.new。
Rustは、後者に近い書き方だから、書き方だけを見てもRustはC++とはやはり遠い。
368:デフォルトの名無しさん
21/11/23 19:43:48.41 VKZug2mU.net
RustはRubyの影響を受けた言語。
大変使いやすい。
369:デフォルトの名無しさん
21/11/23 19:51:13.12 1ymEsXZx.net
>>362
いくつか本を読んだが、スクリプト言語的な範囲で使うならばそうかも知れん。
しかし、C++やCのようにポインタを駆使したリンクリストやツリー構造の様な
ものを効率よく高速に、メモリーも節約しながら扱うには、Rustはとても
複雑になる。訳の分からんCell,RefCellなどと組み合わせる必要があることも多い。