公式
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/
探検
Rust part11
■ このスレッドは過去ログ倉庫に格納されています
2021/06/17(木) 00:24:12.56ID:NvYoNP9C
59はちみつ餃子 ◆8X2XSCHEME
2021/06/21(月) 17:54:38.56ID:5bV+3LP72021/06/21(月) 18:00:00.24ID:W8eb/Sbg
2021/06/21(月) 18:49:34.95ID:xiUkcw19
2021/06/21(月) 19:12:19.82ID:Qd3Oxzyr
2021/06/21(月) 21:14:54.92ID:MXwcp+e6
winapiクレートを使うことってもうなくね?
Microsoft公式のwindiwsクレートの方がよっぽど使いやすいよ
Microsoft公式のwindiwsクレートの方がよっぽど使いやすいよ
64デフォルトの名無しさん
2021/06/21(月) 21:47:08.31ID:L+7FW+LR >>38
>(1) ptrが0終端文字列を挿している場合:
>while ( *ptr >= 'A' && *ptr <= 'Z' ) ptr++;
その場合でも、まず与えられたデータが0終端しているかどうかを確認する必要がありますよね。
データがどこから来るのかは、
ネット上の通信相手か
ディスク上のファイルか
メモリ上の他言語等APIかになりますが、
いずれも盲目的に信頼せずに処理する必要があります。
そして小さいデータならばどんな処理方法でも誤差になるのでしょうが、
大きなデータの場合は>>28のように元はJSONとかHTMLのように構造をもっており、
その解析結果である各一部分が対象文字列になります。
すると0終端させた方がわずかに速く扱える可能性があるからといって、元の大きなデータから毎回コピーして0終端文字列を作る場合と、
コピーをせずにスライスのまま部分文字列を扱う場合との、比較になるのでははいでしょうか?
>(1) ptrが0終端文字列を挿している場合:
>while ( *ptr >= 'A' && *ptr <= 'Z' ) ptr++;
その場合でも、まず与えられたデータが0終端しているかどうかを確認する必要がありますよね。
データがどこから来るのかは、
ネット上の通信相手か
ディスク上のファイルか
メモリ上の他言語等APIかになりますが、
いずれも盲目的に信頼せずに処理する必要があります。
そして小さいデータならばどんな処理方法でも誤差になるのでしょうが、
大きなデータの場合は>>28のように元はJSONとかHTMLのように構造をもっており、
その解析結果である各一部分が対象文字列になります。
すると0終端させた方がわずかに速く扱える可能性があるからといって、元の大きなデータから毎回コピーして0終端文字列を作る場合と、
コピーをせずにスライスのまま部分文字列を扱う場合との、比較になるのでははいでしょうか?
2021/06/21(月) 22:00:11.19ID:xiUkcw19
2021/06/21(月) 22:22:17.51ID:oYpDc35T
2021/06/21(月) 22:57:58.01ID:xiUkcw19
>>66
なるほど、理解した
なるほど、理解した
2021/06/21(月) 22:58:56.43ID:ILFJsIgR
その比較は部分文字列をコピーするかスライスで表現するかの違いであって
0終端文字列のメリット・デメリットとは少し違うんじゃない?
0終端でも同じようにスライスを(ptr, len)で作ればコピーは不要
0終端文字列のメリット・デメリットとは少し違うんじゃない?
0終端でも同じようにスライスを(ptr, len)で作ればコピーは不要
2021/06/21(月) 23:46:42.70ID:oYpDc35T
>>68
> 0終端でも同じようにスライスを(ptr, len)で作ればコピーは不要
それをやってしまうとその部分文字列に対して0終端のメリットが効かなくなるわけで
コピーしないとメリットを得られないというのがデメリットになってる
> 0終端でも同じようにスライスを(ptr, len)で作ればコピーは不要
それをやってしまうとその部分文字列に対して0終端のメリットが効かなくなるわけで
コピーしないとメリットを得られないというのがデメリットになってる
70デフォルトの名無しさん
2021/06/22(火) 02:10:06.59ID:JEO56Dr7 つまり部分文字列を扱う場合は、コピーが発生する0終端方式が不利になりますね。
具体的にファイルパスからディレクトリ部分を得るとか、URLからホスト名を得るとか、元データを破壊したくない時は0終端方式だとコピーするしかないです。
つまり一貫してRustのように始点&長さ方式の方が、有利かつメモリ安全ではないでしょうか?
さらに文字列比較の場合も長さ方式よりも0終端方式が不利です。
これはCのmemcmpとstrcmpの比較に還元されますが、
memcmpは64bit比較やSIMD利用ができるからです。
具体的にファイルパスからディレクトリ部分を得るとか、URLからホスト名を得るとか、元データを破壊したくない時は0終端方式だとコピーするしかないです。
つまり一貫してRustのように始点&長さ方式の方が、有利かつメモリ安全ではないでしょうか?
さらに文字列比較の場合も長さ方式よりも0終端方式が不利です。
これはCのmemcmpとstrcmpの比較に還元されますが、
memcmpは64bit比較やSIMD利用ができるからです。
71デフォルトの名無しさん
2021/06/22(火) 02:44:25.97ID:fStlaCDg &strって3つの意味があると思うんだよね
1: 文字列リテラル
2: Stringの参照
3: 部分文字列
文字列リテラルとStringは終端にNULLを付けるようにして(今まで通りlenやcapは残す)、部分文字列は部分文字列を意味する別の型を作ればいいと思った
こうすることでRust側ではlenやcapを使い、C側ではNULL終端を利用できるという状態になる(Stringや&strをRustで使ってもCで使ってもゼロコスト)
もしNULL終端ではない部分文字列をCで使いたければStringに変換すれば使えるようになる(これはコストがかかるけどCの文字列も同じ問題を抱えてるので問題なし)
1: 文字列リテラル
2: Stringの参照
3: 部分文字列
文字列リテラルとStringは終端にNULLを付けるようにして(今まで通りlenやcapは残す)、部分文字列は部分文字列を意味する別の型を作ればいいと思った
こうすることでRust側ではlenやcapを使い、C側ではNULL終端を利用できるという状態になる(Stringや&strをRustで使ってもCで使ってもゼロコスト)
もしNULL終端ではない部分文字列をCで使いたければStringに変換すれば使えるようになる(これはコストがかかるけどCの文字列も同じ問題を抱えてるので問題なし)
2021/06/22(火) 08:19:32.37ID:7Ks2gqqv
>>70
それやるには文字列がimmutableでなければならないから、それによって生じるスペースコストとどっちをとるかって話だな。
それにimmutableな文字列って、部分変更に相当する処理をする場合に逆にコピーが必要になるし。
どっちにしても一概に、コピー不要だからこっちが有利、みたいな話にはならんかと。
それやるには文字列がimmutableでなければならないから、それによって生じるスペースコストとどっちをとるかって話だな。
それにimmutableな文字列って、部分変更に相当する処理をする場合に逆にコピーが必要になるし。
どっちにしても一概に、コピー不要だからこっちが有利、みたいな話にはならんかと。
2021/06/22(火) 12:15:08.38ID:UUxAOJV3
rustで初心者がハマるポイントを初心者が紹介します
・所有権の概念が難しい
・何をするにしても外部ライブラリが必要(乱数生成など)
・ポインタが難しい
・所有権の概念が難しい
・何をするにしても外部ライブラリが必要(乱数生成など)
・ポインタが難しい
2021/06/22(火) 12:16:52.83ID:hfO2UPRV
・検索すると同名のゲームの話ばかり出てくる
2021/06/22(火) 12:26:02.44ID:jOUHjhXv
・static変数の扱いが面倒臭い
76デフォルトの名無しさん
2021/06/22(火) 12:52:20.13ID:P9tLBTwV >>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終端されている。
>その場合でも、まず与えられたデータが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終端されている。
2021/06/22(火) 13:23:35.92ID:D73AVe+6
>>76
ファイルから読んだデータをpszHogeに格納するときにゼロ終端の要件満たしてるか確認する必要あるよねって話だぞ
ファイルから読んだデータをpszHogeに格納するときにゼロ終端の要件満たしてるか確認する必要あるよねって話だぞ
2021/06/22(火) 13:25:24.28ID:RVuteXyT
>>74がマジで深刻すぎる
ついでに加藤純一っていうゲーム実況者とかとじゅんっていうRust/Scala使いがいるのも紛らわしい
ついでに加藤純一っていうゲーム実況者とかとじゅんっていうRust/Scala使いがいるのも紛らわしい
2021/06/22(火) 13:35:53.88ID:IhZgQU+B
2021/06/22(火) 14:06:03.07ID:P9tLBTwV
2021/06/22(火) 14:15:33.98ID:3bNpX0tT
そこで確認不要とか言ってるからユーザにヌル文字含んだ文字列渡されて死ぬのでは
2021/06/22(火) 14:51:42.58ID:jOUHjhXv
セキュアプログラムは面倒だからなー
数値のオーバーフローチェックとかみんなやらないでしょ?
アップキャストして値に結果を放り込んでチェックした後、
ダウンキャストするとか面倒すぎる
数値のオーバーフローチェックとかみんなやらないでしょ?
アップキャストして値に結果を放り込んでチェックした後、
ダウンキャストするとか面倒すぎる
83デフォルトの名無しさん
2021/06/22(火) 15:18:09.96ID:YfWe7YWP >>73
Cより面倒臭そうω
Cより面倒臭そうω
84デフォルトの名無しさん
2021/06/22(火) 15:19:46.85ID:YfWe7YWP >>76
そこまで出鱈目な話初めて聴いたわ
そこまで出鱈目な話初めて聴いたわ
2021/06/22(火) 15:22:37.78ID:P9tLBTwV
>>81
そういう外部からの入力に対するエラーチェックはするのは当然だが、
0終端文字列でやる場合には、ファイルのバイト数だけ読み込んで、
一番最後に 0 を書き込んでおくとそれ以上まで進むことはない。
途中の 0 に関しては スライス方式でも同じ問題が残る。
途中に 0 が有っても大丈夫な様に作るだけ。
そういう外部からの入力に対するエラーチェックはするのは当然だが、
0終端文字列でやる場合には、ファイルのバイト数だけ読み込んで、
一番最後に 0 を書き込んでおくとそれ以上まで進むことはない。
途中の 0 に関しては スライス方式でも同じ問題が残る。
途中に 0 が有っても大丈夫な様に作るだけ。
2021/06/22(火) 15:24:47.81ID:P9tLBTwV
>>84
ちなみに、リアルワールドでは俺は名プログラマだと評価されているぞ。
ちなみに、リアルワールドでは俺は名プログラマだと評価されているぞ。
2021/06/22(火) 15:27:25.45ID:P9tLBTwV
良いプログラムを作るための基本ポリシー:
・外部データと内部データは明確に分ける。
・外部データを内部データに入れる場合は、エラーチェックを徹底的にする。
・内部データに関しては、原則的には完全に正しいことを前提にしてプログラム
して良い。ただし、プログラムのミスのための念のためのチェックはしても良い。
・外部データと内部データは明確に分ける。
・外部データを内部データに入れる場合は、エラーチェックを徹底的にする。
・内部データに関しては、原則的には完全に正しいことを前提にしてプログラム
して良い。ただし、プログラムのミスのための念のためのチェックはしても良い。
2021/06/22(火) 15:47:48.20ID:cJZ3y9Eg
>>87
3番目のチェックはアサーション(assert)だと思うけどあれはコードを読む人に背景の条件を明示する意味もあるね
逆にアサーション以外の余計なチェックはコードを読む人を混乱させる可能性がある
3番目のチェックはアサーション(assert)だと思うけどあれはコードを読む人に背景の条件を明示する意味もあるね
逆にアサーション以外の余計なチェックはコードを読む人を混乱させる可能性がある
2021/06/22(火) 16:20:58.03ID:N/B8oZfx
ヌル終端はパンチカードが現役だった時代に数バイトケチった名残
互換性のためにサポートしなきゃいけないのは理解できるが
今の時代にヌル終端が優れてるとかそれをデフォルトにしろってのは控えめに言って頭おかしい
互換性のためにサポートしなきゃいけないのは理解できるが
今の時代にヌル終端が優れてるとかそれをデフォルトにしろってのは控えめに言って頭おかしい
90デフォルトの名無しさん
2021/06/22(火) 16:22:09.51ID:jOUHjhXv >>87
外部と内部の定義プリーズ
外部と内部の定義プリーズ
2021/06/22(火) 16:30:14.48ID:P9tLBTwV
>>90
外部でーたとしては、他にも有ると思うが、一例としては、
1. 他人が自由に書けるファイルから読み取ったばかりのデータ。
(アプリケーション内部にリソースデータとして内蔵し、安全性が
テスト済みであるようなファイルは内部データとみなしても良い場合も有る。)
2. 安全対策を徹底したいライブラリの場合は、ライブラリを使う側が関数に
渡してきたテキストデータや引数の値。
ただし、このようなものまで徹底的にチェックするとなれば遅くなるので、
設計思想によっては、NO-CHECK、または、軽いチェックだけで済ましても良い。
3. OSの場合は、同様なものとして、APIを呼び出した側が渡してきたデータ。
これは、安全性チェックは徹底して行う必要がある。
4. データベースソフトなどの場合も、2や3に準ずる。どこまで安全チェックするかは、
使用目的や用途、設計思想による。
外部でーたとしては、他にも有ると思うが、一例としては、
1. 他人が自由に書けるファイルから読み取ったばかりのデータ。
(アプリケーション内部にリソースデータとして内蔵し、安全性が
テスト済みであるようなファイルは内部データとみなしても良い場合も有る。)
2. 安全対策を徹底したいライブラリの場合は、ライブラリを使う側が関数に
渡してきたテキストデータや引数の値。
ただし、このようなものまで徹底的にチェックするとなれば遅くなるので、
設計思想によっては、NO-CHECK、または、軽いチェックだけで済ましても良い。
3. OSの場合は、同様なものとして、APIを呼び出した側が渡してきたデータ。
これは、安全性チェックは徹底して行う必要がある。
4. データベースソフトなどの場合も、2や3に準ずる。どこまで安全チェックするかは、
使用目的や用途、設計思想による。
92デフォルトの名無しさん
2021/06/22(火) 16:34:27.28ID:jOUHjhXv ちょっと緩くないか?
2021/06/22(火) 16:48:00.98ID:FRtvqWA7
信頼境界線の引き方は諸説あるだろ。
2021/06/22(火) 19:06:39.53ID:R8WO8pxt
一般に、アプリの外に置いてあるファイルはチェックした方が良いが、
その中でも、テキストファイルは、信頼置け無い事が多いのでチェックは必要。
アプリの外に置いてあっても、バイナリデータだと人が手書きすることはないため、
設計思想にもよるが、安全チェックはある程度省略しても良いと考える流儀もありえる。
その中でも、テキストファイルは、信頼置け無い事が多いのでチェックは必要。
アプリの外に置いてあっても、バイナリデータだと人が手書きすることはないため、
設計思想にもよるが、安全チェックはある程度省略しても良いと考える流儀もありえる。
2021/06/22(火) 19:33:50.85ID:D73AVe+6
結局アプリケーションがどう使われるか次第でしょ
アプリケーション作成時の前提が利用シーンの増加により後から覆されるなんてことは良くあることだから
性能要件がない限り最初から安全側に倒しておくのが合理的
アプリケーション作成時の前提が利用シーンの増加により後から覆されるなんてことは良くあることだから
性能要件がない限り最初から安全側に倒しておくのが合理的
2021/06/23(水) 11:02:20.62ID:o/eJBU4s
constデフォルトあたりの話ってgoto禁止論みたいになっている気がする
理由を理解していないがとりあえずそうしておけみたいな人を少なからず見かけるような
>>94
パーサーがガバガバで細工したセーブデータで乗っ取られるゲームのことか
理由を理解していないがとりあえずそうしておけみたいな人を少なからず見かけるような
>>94
パーサーがガバガバで細工したセーブデータで乗っ取られるゲームのことか
97デフォルトの名無しさん
2021/06/23(水) 14:27:15.67ID:LIFxwhU8 >>95
MS製のリンカ(link.exe)の入力するlibraryファイル(*.lib)には、
ヘッダ部分にシンボルがアルファベット順にソートされたシンボルテーブル
が入っている。ソートされていることを前提にバイナリサーチが出来るので
シンボルを検索するのが高速になるとされる。バイナリサーチは、ソート
されているデータに対してのみ正しく検索できて、もしソートされていなければ
間違った結果になる。
しかし、link.exeが*.libを入力する時、ちゃんとシンボルテーブルのシンボル
がソートされたかどうかチェックしているかと言うと、定かではない。
だから、もし、サードパーティー製のツールが*.lib を作成した時、
ソートにミスがあったりすると、link.exeはundefined symbolエラーを出すか、
リンクには成功するが、実行段階でアプリが起動できなかったり途中でダウン
してしまうかも知れない。その様な場合、何が原因かは分からないであろうが、
多分、実際、検査はされてない。
MS製のリンカ(link.exe)の入力するlibraryファイル(*.lib)には、
ヘッダ部分にシンボルがアルファベット順にソートされたシンボルテーブル
が入っている。ソートされていることを前提にバイナリサーチが出来るので
シンボルを検索するのが高速になるとされる。バイナリサーチは、ソート
されているデータに対してのみ正しく検索できて、もしソートされていなければ
間違った結果になる。
しかし、link.exeが*.libを入力する時、ちゃんとシンボルテーブルのシンボル
がソートされたかどうかチェックしているかと言うと、定かではない。
だから、もし、サードパーティー製のツールが*.lib を作成した時、
ソートにミスがあったりすると、link.exeはundefined symbolエラーを出すか、
リンクには成功するが、実行段階でアプリが起動できなかったり途中でダウン
してしまうかも知れない。その様な場合、何が原因かは分からないであろうが、
多分、実際、検査はされてない。
2021/06/23(水) 14:30:46.54ID:LIFxwhU8
>>97
実際は、サードパーティー製ツールも、ちゃんと*.libのヘッダのシンボルテーブルの
シンボルはソートしており、その部分にはバグはないので、それがソートされてない
*.libは基本的には存在しない。
ただし、*.libをバイナリエディタで開いて手作業で間違って変更したりすると
ソートされていないものが出来上がる。
それをlink.exeに入力しても、link.exeは、そのことに関してのエラーは出さない
だろう。
実際は、サードパーティー製ツールも、ちゃんと*.libのヘッダのシンボルテーブルの
シンボルはソートしており、その部分にはバグはないので、それがソートされてない
*.libは基本的には存在しない。
ただし、*.libをバイナリエディタで開いて手作業で間違って変更したりすると
ソートされていないものが出来上がる。
それをlink.exeに入力しても、link.exeは、そのことに関してのエラーは出さない
だろう。
99デフォルトの名無しさん
2021/06/23(水) 16:29:36.30ID:6jEPjWCz Rustのスレだよね?
100デフォルトの名無しさん
2021/06/23(水) 17:44:15.71ID:rKa/khCP 小学生が大人に九九暗唱してみせれば微笑ましいが
大人が大人に九九暗唱してみせるなら不気味で滑稽である
大人が大人に九九暗唱してみせるなら不気味で滑稽である
101デフォルトの名無しさん
2021/06/23(水) 18:25:31.65ID:mfn5LAEG 意図通りに動かないバグにつながるという話と
バッファオーバーフローみたいな脆弱性につながるという話は別だよね
バッファオーバーフローみたいな脆弱性につながるという話は別だよね
102デフォルトの名無しさん
2021/06/23(水) 19:58:13.96ID:smIE1EjE 再帰を使って1x1=1から9x9=81までの答えだけを書く場合
どうやって書けますか?
どうやって書けますか?
103デフォルトの名無しさん
2021/06/23(水) 20:12:50.89ID:1lBkKsRv fixコンビネータを使う
104デフォルトの名無しさん
2021/06/23(水) 22:38:48.46ID:GhG+XcCm >>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),
}
}
題意に沿ってるか分からんけど
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),
}
}
105デフォルトの名無しさん
2021/06/23(水) 23:13:30.14ID:Cy7wfzk/ 実践的な話をするとRustは末尾再帰最適化が出来ないからなるべく再帰は使わないほうがいいと思う
106デフォルトの名無しさん
2021/06/24(木) 01:50:53.81ID:UNoTdpdl 宿題かなんかだろう。
Rustで宿題を課すなんて教官は変態にもほどがある。
Rustで宿題を課すなんて教官は変態にもほどがある。
107デフォルトの名無しさん
2021/06/24(木) 23:17:10.64ID:zHNnGFYG >>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
}
結局のところ関数分割→個別ループ化→関数統合で二重ループ化まで自動でしてくれる言語は無いから
再帰は使わずに自分でループ化すればいいよね、って結論
つまりアルゴリズムでは再帰で考えても実装はループにしてコメント残しておくのが正解
内部で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
}
結局のところ関数分割→個別ループ化→関数統合で二重ループ化まで自動でしてくれる言語は無いから
再帰は使わずに自分でループ化すればいいよね、って結論
つまりアルゴリズムでは再帰で考えても実装はループにしてコメント残しておくのが正解
108はちみつ餃子 ◆8X2XSCHEME
2021/06/25(金) 00:17:11.72ID:/YhIejlL >>107
プログラミング言語 Scheme の仕様だと >>104 のようなパターンは末尾文脈の定義にあてはまるし
末尾呼出し最適化が適用されることが保証されるから、
現代的な言語処理系で最適化できないとは信じられないんだけど、
実際にRust コンパイラに >>104 を与えたときにループに最適化はしないの?
Rust のコンパイラの使い方に不慣れでアセンブリコードの出力のさせかたがよくわからん……。
ほぼそのまま C のコードに書き換えてみたら
GCC ではジャンプに置き換えたコードが生成されるみたいだし……。
(ちなみに GCC では末尾呼出しになっていなくても一部の状況では再帰をループに変形できることがある。)
Clang だとループを全部 unroll しやがった!
プログラミング言語 Scheme の仕様だと >>104 のようなパターンは末尾文脈の定義にあてはまるし
末尾呼出し最適化が適用されることが保証されるから、
現代的な言語処理系で最適化できないとは信じられないんだけど、
実際にRust コンパイラに >>104 を与えたときにループに最適化はしないの?
Rust のコンパイラの使い方に不慣れでアセンブリコードの出力のさせかたがよくわからん……。
ほぼそのまま C のコードに書き換えてみたら
GCC ではジャンプに置き換えたコードが生成されるみたいだし……。
(ちなみに GCC では末尾呼出しになっていなくても一部の状況では再帰をループに変形できることがある。)
Clang だとループを全部 unroll しやがった!
109デフォルトの名無しさん
2021/06/25(金) 11:49:33.37ID:UuPR+dCF c言語だと再帰が末尾呼び出し最適化されるかどうかがオプティマイズレベルで変わるからややこしい。
リリース版だと動くがデバッグ版だとスタックオーバーフローみたいな事になる。
単純な再帰ならループに書き直してもいいけど、相互再帰みたいなのは末尾呼び出し最適化してくれないと困る。
リリース版だと動くがデバッグ版だとスタックオーバーフローみたいな事になる。
単純な再帰ならループに書き直してもいいけど、相互再帰みたいなのは末尾呼び出し最適化してくれないと困る。
110デフォルトの名無しさん
2021/06/25(金) 11:58:36.77ID:CpYoiDkc あの、Rustの勉強のために逆引きサンプルwiki作ろうと思うんですけど
テンプレ殿堂入りを目指して作ってもいいですか?
もちろん広告は入れませんが、レンタルwikiが提供している広告は表示されるかもしれませんが。。。
テンプレ殿堂入りを目指して作ってもいいですか?
もちろん広告は入れませんが、レンタルwikiが提供している広告は表示されるかもしれませんが。。。
112デフォルトの名無しさん
2021/06/25(金) 12:18:21.65ID:CpYoiDkc 先輩ありがとうございます!
受け入れてもらえるようなコンテンツを作ります!
受け入れてもらえるようなコンテンツを作ります!
113デフォルトの名無しさん
2021/06/25(金) 15:26:59.18ID:CCUOu52e 5chに閉じずに本家のコミュニティにも便利と思ってもらえるもの目指した方が良いのでは
114デフォルトの名無しさん
2021/06/26(土) 00:57:24.13ID:QiaGJu0I >>86
ただし石器時代のな
ただし石器時代のな
115デフォルトの名無しさん
2021/06/26(土) 02:18:19.63ID:morUmgAo >>114
ミンチメーカー、ではなくスパゲティメーカーとして恐れられてるかもな
ミンチメーカー、ではなくスパゲティメーカーとして恐れられてるかもな
116デフォルトの名無しさん
2021/06/26(土) 03:08:39.74ID:ljqTs+jf Rustと他の言語との違いについて興味深い観点で盛り上がってるスレ
特に後半
趣味でプログラミングの勉強するとしたら何言語がいい?
https://matsuri.5ch.net/test/read.cgi/morningcoffee/1623527901/
特に後半
趣味でプログラミングの勉強するとしたら何言語がいい?
https://matsuri.5ch.net/test/read.cgi/morningcoffee/1623527901/
117デフォルトの名無しさん
2021/06/26(土) 12:15:14.01ID:jgmCFZtl 斜め読みしかしてないから見逃してるかも知れないけどさんざん言い尽くされた話ばかりだった気が
そもそもRust自体はC++を置き換えることを目的にはしていない
そもそもRust自体はC++を置き換えることを目的にはしていない
118デフォルトの名無しさん
2021/06/26(土) 14:26:52.57ID:UK7NU6RE やたらC++と比較されるのはどっちもbetter Cの側面があるからだろうか
個人的にRustはCとScheme(Lisp)のハーフという印象
SchemeよりMLの方が近いらしいけどMLは使ったことないからよく分からない
手続き型で関数型を疑似表現したり関数型で手続き型を疑似表現する試みがあるけど
Rustはその中間を上手く埋めてる感じ
個人的にRustはCとScheme(Lisp)のハーフという印象
SchemeよりMLの方が近いらしいけどMLは使ったことないからよく分からない
手続き型で関数型を疑似表現したり関数型で手続き型を疑似表現する試みがあるけど
Rustはその中間を上手く埋めてる感じ
119デフォルトの名無しさん
2021/06/26(土) 14:33:02.82ID:S/dGZFG2 > better Cの側面がある
はぁ?
お前がcもc++もrustもニワカなのは分かった
あと五年間は、カキコ無前にROMに徹してみてほしい
はぁ?
お前がcもc++もrustもニワカなのは分かった
あと五年間は、カキコ無前にROMに徹してみてほしい
120デフォルトの名無しさん
2021/06/26(土) 15:07:09.40ID:UK7NU6RE121デフォルトの名無しさん
2021/06/26(土) 15:16:37.21ID:zCIOA2Bt 実際にはRustはbetter D
122デフォルトの名無しさん
2021/06/26(土) 15:47:21.36ID:vR4ZYNRj 急に発狂する奴はどこの掲示板にもいる 気にするな
123デフォルトの名無しさん
2021/06/26(土) 16:24:43.50ID:MKHy+X82 わざわざ自演するようなことかね?
124デフォルトの名無しさん
2021/06/26(土) 16:34:36.83ID:jgmCFZtl mozillaのc++を安全に使う数多の取り組みに疲れ果てた結果出てきた新言語がrustなのでc++と比較されるのは当然
125デフォルトの名無しさん
2021/06/26(土) 18:03:00.84ID:cKS/UcnU この板全域に出没して何でもRubyと比較するガイジみたいなもんだろ
ここにはなぜかいないけど
ここにはなぜかいないけど
126デフォルトの名無しさん
2021/06/26(土) 18:06:17.50ID:uWTCkdSJ127デフォルトの名無しさん
2021/06/26(土) 19:35:22.90ID:pNIxzUaQ 今から新規のプロジェクトをC++かRustで始めるとなったらRustの一択でしょう
つまりRustはbetter C++
つまりRustはbetter C++
128デフォルトの名無しさん
2021/06/26(土) 21:22:24.72ID:yvLLLScj まったく何も資産がない新規であればそうかもしれんが
129デフォルトの名無しさん
2021/06/26(土) 21:36:19.59ID:js6oaYoM130デフォルトの名無しさん
2021/06/26(土) 21:43:00.01ID:pNIxzUaQ つまり過去のしがらみのある案件は時間がかかり遅れるが
いずれも徐々にC++はRustへ置き換えられていく
いずれも徐々にC++はRustへ置き換えられていく
131デフォルトの名無しさん
2021/06/26(土) 21:48:35.28ID:IGj3fs8T 逆に枯れてる分野でしか実装されんわ
132デフォルトの名無しさん
2021/06/26(土) 21:51:34.18ID:uWTCkdSJ emacsとあとなんだっけ? SVGのライブラリ?が
オブジェクトファイル *.o 単位で少しずつCからRustに移植してたな
オブジェクトファイル *.o 単位で少しずつCからRustに移植してたな
133デフォルトの名無しさん
2021/06/26(土) 22:01:32.26ID:WPp8qNv5 librsvgだね
134デフォルトの名無しさん
2021/06/26(土) 23:01:02.22ID:UK7NU6RE135デフォルトの名無しさん
2021/06/27(日) 00:09:44.66ID:hddKqCef それは単に式指向という話なのでは
136デフォルトの名無しさん
2021/06/27(日) 00:12:27.99ID:HvPCU4P8 MLの方が普通に近いな
パターンマッチとか束縛がletとかHMの型システムだとか
パターンマッチとか束縛がletとかHMの型システムだとか
137デフォルトの名無しさん
2021/06/27(日) 01:36:30.56ID:AjjhDlM0 一番近いのは Ocaml。なぜなら、かつてRustはOcamlで組まれていたから。
そして途中でコンパイラをRust自身に直したと聞いた。
そして途中でコンパイラをRust自身に直したと聞いた。
138はちみつ餃子 ◆8X2XSCHEME
2021/06/27(日) 03:28:07.65ID:+5rTVQj/ Rust の Scheme っぽいところを探すとしたらマクロだろ。
伝統的な Lisp 系言語だと実行時の環境とマクロ展開時の環境を分けないが、
Scheme は分ける方針をとってる。
(実際には分けない実装をしている処理系もあるし、次の仕様の更新でどうなるか不透明だけど。)
伝統的な Lisp 系言語だと実行時の環境とマクロ展開時の環境を分けないが、
Scheme は分ける方針をとってる。
(実際には分けない実装をしている処理系もあるし、次の仕様の更新でどうなるか不透明だけど。)
139デフォルトの名無しさん
2021/06/27(日) 12:22:30.08ID:HfXxTqRR 何に近いかでここまで盛り上がれるのだね
何も産まないのに
何も産まないのに
140デフォルトの名無しさん
2021/06/27(日) 12:24:39.60ID:lZYiAKce Parkinson's Law of Triviality
141デフォルトの名無しさん
2021/06/27(日) 13:55:37.78ID:00z9rPIn >>139
比較から何かを見出せる人もいるから何も産まないということはないよ
比較から何かを見出せる人もいるから何も産まないということはないよ
142デフォルトの名無しさん
2021/06/27(日) 14:24:31.82ID:me9wSnu9 そんなセンスのある人がここにいると思うのww?
センスないねw
センスないねw
143デフォルトの名無しさん
2021/06/28(月) 20:31:57.40ID:cQA8O+iD ちょっと見ないうちに色々変わる+自分の理解が浅いせいで追いつけない
144デフォルトの名無しさん
2021/06/29(火) 16:25:09.28ID:W3FYE8ZM RustのIDEでおすすめを教えて
145デフォルトの名無しさん
2021/06/29(火) 19:29:01.37ID:EbM9PL2b VSCode+rust-analyzerが定番
146デフォルトの名無しさん
2021/06/30(水) 01:32:52.11ID:kSD4a98e bindgenって複雑なヘッダーだと全然駄目なんだなあ
殆どそれ目的でRustやってたのに
殆どそれ目的でRustやってたのに
147デフォルトの名無しさん
2021/06/30(水) 09:59:01.57ID:2LaR0NZ5 >>146
実際に使ってみて初めて分かる問題点だね。
実際に使ってみて初めて分かる問題点だね。
148デフォルトの名無しさん
2021/06/30(水) 22:36:50.05ID:Nj/xCjQN >>146
CXXはどうですか?
CXXはどうですか?
149デフォルトの名無しさん
2021/07/03(土) 10:43:55.27ID:6NDcSyYc rust始めました!
ってゲームの方を始めてたネタをやろうと思ったけど
想像以上にクソゲー過ぎてダメだった
やっぱり言語の方がいい
ってゲームの方を始めてたネタをやろうと思ったけど
想像以上にクソゲー過ぎてダメだった
やっぱり言語の方がいい
150デフォルトの名無しさん
2021/07/03(土) 16:18:59.47ID:VnJT/Tz5 検索するとゲームの方と言語の方が出てきてややこしい
Rust(ゲーム)は名前変えてくれ...
Rust(ゲーム)は名前変えてくれ...
151デフォルトの名無しさん
2021/07/03(土) 16:30:28.41ID:lPTKqMkr それな
go(一般動詞)も名前を変えてくれ
go(一般動詞)も名前を変えてくれ
152デフォルトの名無しさん
2021/07/03(土) 16:48:51.41ID:VnJT/Tz5 GoはGolangって別名があるから問題ないけどRustに関してはRustLangとはあまり言わないのがなぁ
153デフォルトの名無しさん
2021/07/03(土) 17:18:42.64ID:HAk/Aizq まあそれはRustの問題ではないですが、クロス環境に問題を感じているなら、Haskellがお勧めですよ。
あわしろ氏がいつも言ってることですがね。
あわしろ氏がいつも言ってることですがね。
154デフォルトの名無しさん
2021/07/03(土) 18:23:28.50ID:yvqGZDdm rustlang言わない?
155デフォルトの名無しさん
2021/07/03(土) 19:07:06.86ID:3WlrzvVf そもそもオフィシャルのレポジトリ名がrust-lang/rustだし普通に言うのでは
156デフォルトの名無しさん
2021/07/03(土) 19:51:08.37ID:VnJT/Tz5 言わなくはないけどRustLangよりはRustと呼ばれることのが多い気がする
GoだったらGo(golang)とかGolangとか言われることが多いけど
GoだったらGo(golang)とかGolangとか言われることが多いけど
157デフォルトの名無しさん
2021/07/03(土) 22:13:02.85ID:yvqGZDdm 単にgoよりgooglabilityが高いことのあらわれじゃね
別にそんなに困ったこと無いけどな
別にそんなに困ったこと無いけどな
158デフォルトの名無しさん
2021/07/03(土) 23:01:24.13ID:5pcVeoYl ていうかGoはもうgolangに改名したほうがいいと思う
Goではとにかく名前がクソすぎる
そもそもなんかダサいし
Goではとにかく名前がクソすぎる
そもそもなんかダサいし
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★3 [BFU★]
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★4 [BFU★]
- 【千葉】コンビニに尿入りペットボトル並べた疑い、26歳男「むしゃくしゃして」…購入した客が飲もうとしたところ臭いに違和感 [ぐれ★]
- 中国官製報道「日本経済はもう持たない」にネット民ツッコミ「ニュースだけ見てたら日本はもう百回くらい爆発してる」 [1ゲットロボ★]
- 【硬貨】500円だと思ったら「500ウォンが入っていた」価値は約10分の1 全国で飲食店などで“500ウォントラブル”相次いで報告 [ぐれ★]
- 【STARTO ENTERTAINMENT】timelesz、メンバーの不適切言動を謝罪「不用意かつモラルに反した発言であった」 全員の署名入りでコメント [Ailuropoda melanoleuca★]
- 【実況】博衣こよりのえちえちホロ分かり手クイズ🧪🏴‍☠🌸 ★3
- 【高市悲報】中国「国連安保理の許可なしに日本を攻撃可能だ」★2 [115996789]
- 【実況】博衣こよりのえちえちホロ分かり手クイズ🧪🏴‍☠🌸 ★4
- 【んな専🏡】華金もんなっしょいとはやれやれなのらね🍬(・o・🍬)🏰
- NHKニュースウオッチ9「日本側は対話にオープンな姿勢で安定した日中関係を築きたい考えなのに中国が意固地で糸口が見いだせない」 [904151406]
- 日中戦争起きたら5日で自衛隊壊滅するらしい。じゃあ徴兵も無いし、俺等が必死になって反対してやる理由なくね? [237216734]
