スレタイ以外の言語もok
前スレ
次世代言語21 Go Nim Rust Swift Kotlin TypeScript
https://mevius.5ch.net/test/read.cgi/tech/1587276362/
次世代言語22 Go Nim Rust Swift Kotlin TypeScript
■ このスレッドは過去ログ倉庫に格納されています
2021/08/22(日) 08:59:03.31ID:QorwbXcj
535デフォルトの名無しさん
2021/11/08(月) 23:49:59.34ID:jye9PFXO 分煙と言えば
ミドリ安全です
ミドリ安全です
536デフォルトの名無しさん
2021/11/09(火) 00:03:37.26ID:/IIRMA31 プログラマーってメモリが安全かどうかでずーーーーっと同じような話しててキモいわ
安全日とか危険日とかどうでもいいだろ消えろ
安全日とか危険日とかどうでもいいだろ消えろ
537デフォルトの名無しさん
2021/11/09(火) 01:09:11.48ID:Ziut+B8+ >>521
そのバグ問題やってみたが興味深い問題だな。
func main() {
var out []*int
for i := 0; i < 3; i++ {
out = append(out, &i)
}
fmt.Println("Values:", *out[0], *out[1], *out[2])
}
上記のバギーなGoコードをそのまま普通に以下のRustコードにすると、
fn main() {
let mut out = vec![];
for i in 0..3 {
out.push(&i);
}
println!("Values: {} {} {}", *out[0], *out[1], *out[2]);
}
コンパイルエラーとなり「変数iの借用(参照)がforループの外で使われてる!」とライフタイムの問題。
そこで変数iを強引にループの外へ追い出して、この問題が起きないように以下のコードにすると、
fn main() {
let mut out = vec![];
let mut i = 0;
loop {
if i < 3 {
out.push(&i);
i += 1;
} else {
break;
}
}
コンパイルエラーとなり「変数iが借用(参照)されたままで変数iを書き換えてる!」と書き換え競合の問題。
つまりRustは少なくとも2種類の方法でこの種のバグが生じないように防いでいるということか。
そのバグ問題やってみたが興味深い問題だな。
func main() {
var out []*int
for i := 0; i < 3; i++ {
out = append(out, &i)
}
fmt.Println("Values:", *out[0], *out[1], *out[2])
}
上記のバギーなGoコードをそのまま普通に以下のRustコードにすると、
fn main() {
let mut out = vec![];
for i in 0..3 {
out.push(&i);
}
println!("Values: {} {} {}", *out[0], *out[1], *out[2]);
}
コンパイルエラーとなり「変数iの借用(参照)がforループの外で使われてる!」とライフタイムの問題。
そこで変数iを強引にループの外へ追い出して、この問題が起きないように以下のコードにすると、
fn main() {
let mut out = vec![];
let mut i = 0;
loop {
if i < 3 {
out.push(&i);
i += 1;
} else {
break;
}
}
コンパイルエラーとなり「変数iが借用(参照)されたままで変数iを書き換えてる!」と書き換え競合の問題。
つまりRustは少なくとも2種類の方法でこの種のバグが生じないように防いでいるということか。
538デフォルトの名無しさん
2021/11/09(火) 03:57:16.61ID:d6arxLIn どこかで拾ったGoの変な挙動を示すコード
slice1 := make([]int, 0, 5)
slice2 := slice1
for i := 0; i < 10; i++ {
slice1 = append(slice1, i)
slice2 = append(slice2, i + 100)
}
fmt.Println("slice1 =", slice1) // => [100 101 102 103 104 5 6 7 8 9]
fmt.Println("slice2 =", slice2) // => [100 101 102 103 104 105 106 107 108 109]
これはなかなか常人には理解しがたい
slice1 := make([]int, 0, 5)
slice2 := slice1
for i := 0; i < 10; i++ {
slice1 = append(slice1, i)
slice2 = append(slice2, i + 100)
}
fmt.Println("slice1 =", slice1) // => [100 101 102 103 104 5 6 7 8 9]
fmt.Println("slice2 =", slice2) // => [100 101 102 103 104 105 106 107 108 109]
これはなかなか常人には理解しがたい
539デフォルトの名無しさん
2021/11/09(火) 04:12:13.75ID:2q5nPARu 実行してみると確かにそうなるな。なんじゃこりゃ
540デフォルトの名無しさん
2021/11/09(火) 05:02:02.91ID:mTU/Ys0g >>538
常人には、というかsliceの仕様を知らないと全くわからんよ。理解してみればシンプル。
sliceはコピーするとバッファも共有されてしまう。
バッファのキャパシティを超えるまでは、同じバッファに書き込まれることになる。
下のページの Slice internals らへんをちゃんと読めばよくわかるよ。
https://go.dev/blog/slices-intro
そのコードの場合は、slice1とslice2はバッファが共有されていて、そのキャパシティは5なので、5番目の要素までは同じバッファに書き込まれてしまう。
そのあとキャパシティを超えるので、slice1とslice2でそれぞれ別々の新しいバッファがallocateされて、元の共有バッファの要素がコピーされる。
なので、6番目からは別々に書き込まれる。
> slice2 := slice1
ここのコードは slice2 := append([]int{}, slice1...) とかに変更すればバッファが共有されないので、違和感のない動作になるぞ。
https://play.golang.org/p/3fCafqo9L5v
このへんか、deferが実行されるタイミングとか、 >>521 らへんは初心者がハマる罠だな。
次にハマるのは goroutine とか channel 使ったときの race condition らへんだな。
常人には、というかsliceの仕様を知らないと全くわからんよ。理解してみればシンプル。
sliceはコピーするとバッファも共有されてしまう。
バッファのキャパシティを超えるまでは、同じバッファに書き込まれることになる。
下のページの Slice internals らへんをちゃんと読めばよくわかるよ。
https://go.dev/blog/slices-intro
そのコードの場合は、slice1とslice2はバッファが共有されていて、そのキャパシティは5なので、5番目の要素までは同じバッファに書き込まれてしまう。
そのあとキャパシティを超えるので、slice1とslice2でそれぞれ別々の新しいバッファがallocateされて、元の共有バッファの要素がコピーされる。
なので、6番目からは別々に書き込まれる。
> slice2 := slice1
ここのコードは slice2 := append([]int{}, slice1...) とかに変更すればバッファが共有されないので、違和感のない動作になるぞ。
https://play.golang.org/p/3fCafqo9L5v
このへんか、deferが実行されるタイミングとか、 >>521 らへんは初心者がハマる罠だな。
次にハマるのは goroutine とか channel 使ったときの race condition らへんだな。
541デフォルトの名無しさん
2021/11/09(火) 08:45:42.78ID:dNM7/Umh >>536
変数の型も書かないPythonが人気ナンバー1だからキモいのは少数派
変数の型も書かないPythonが人気ナンバー1だからキモいのは少数派
542デフォルトの名無しさん
2021/11/09(火) 09:26:15.28ID:Ziut+B8+ >>540
Goのスライスの諸問題は親スライス(=元)と子スライス(=バッファ部分がキャパシティを超えるまでは共有される)が同じスライスとして扱われるところにあるよな
一方でRustはそれをVec(=親=実体)とスライス(=子=部分参照)の2種類へ明確に分離して諸問題を防いでいる
さらにRustのスライスは親がVec(=伸長可)でも配列(=固定長)でも区別なく統一して使える
そしてスライスも参照の一種であるため「読み取り専用共有スライス」と「書き換え可能専有スライス」に分けることで並行&並列処理での競合問題にも対処して安全な効率化を実現している
Goのスライスの諸問題は親スライス(=元)と子スライス(=バッファ部分がキャパシティを超えるまでは共有される)が同じスライスとして扱われるところにあるよな
一方でRustはそれをVec(=親=実体)とスライス(=子=部分参照)の2種類へ明確に分離して諸問題を防いでいる
さらにRustのスライスは親がVec(=伸長可)でも配列(=固定長)でも区別なく統一して使える
そしてスライスも参照の一種であるため「読み取り専用共有スライス」と「書き換え可能専有スライス」に分けることで並行&並列処理での競合問題にも対処して安全な効率化を実現している
543デフォルトの名無しさん
2021/11/09(火) 09:57:47.67ID:cs0y0gBS わざわざmakeでキャパ5作ってるのに、その後に10未満までappendするなんて
バカゴミクズしかこんな事しない。
ほんとRustのせいじゃないのに、このバカゴミクズは何もわかってないので
早く市んでほしい。イメージ最悪
構造をもったコレクション構造と連続領域確保のアロケーションを比べるなんて
頭がどこまでもおかしくなればこんないい加減なことを言えるのか
バカゴミクズしかこんな事しない。
ほんとRustのせいじゃないのに、このバカゴミクズは何もわかってないので
早く市んでほしい。イメージ最悪
構造をもったコレクション構造と連続領域確保のアロケーションを比べるなんて
頭がどこまでもおかしくなればこんないい加減なことを言えるのか
544デフォルトの名無しさん
2021/11/09(火) 10:05:19.89ID:t/ZCl1K7 めっちゃ分かりやすくありがたい挙動w
545デフォルトの名無しさん
2021/11/09(火) 10:06:48.86ID:cs0y0gBS 比べるなら、配列やVecじゃなく、heap::allocate(size, align);なのに
長々と無駄な事を書いて、Vec::with_capacity(len);と比べているという
スパナと釘を比べて、どっちが安全と説いているバカゴミクズ勘違い野郎
長々と無駄な事を書いて、Vec::with_capacity(len);と比べているという
スパナと釘を比べて、どっちが安全と説いているバカゴミクズ勘違い野郎
546デフォルトの名無しさん
2021/11/09(火) 10:16:31.45ID:p+4WEtUZ547デフォルトの名無しさん
2021/11/09(火) 10:21:06.21ID:cs0y0gBS また顔真っ赤の何も言わない援護射撃が現れる
548デフォルトの名無しさん
2021/11/09(火) 10:23:15.72ID:t/ZCl1K7 C++なんてこれ1だからなw
#include <iostream>
struct s{};
int main() {
std::cout<<sizeof(s)<<std::endl; // 1
return 0;
}
理由は同じポインタ値を同じオブジェクトにしたいからだとw
言語仕様なんて実用本位でそんなもんw
ちなみにCは0w
#include <stdio.h>
struct s{};
int main() {
printf("%ld\n",sizeof(struct s)); // 0
return 0;
}
#include <iostream>
struct s{};
int main() {
std::cout<<sizeof(s)<<std::endl; // 1
return 0;
}
理由は同じポインタ値を同じオブジェクトにしたいからだとw
言語仕様なんて実用本位でそんなもんw
ちなみにCは0w
#include <stdio.h>
struct s{};
int main() {
printf("%ld\n",sizeof(struct s)); // 0
return 0;
}
549デフォルトの名無しさん
2021/11/09(火) 10:33:38.60ID:E/uEHC7F >>545
GoのスライスはRustのVecで合っている
どちらも以下の点で同じ
・3つ組で構成される(領域へのポインタ、確保されている長さキャパシティ、そのうち使用中の長さ)
・append/pushなどで長さは伸長することが出来る
・長さが伸長してキャパシティを超えると自動的にヒープ領域の再割り当てを行ないデータは移動する
・その時に3つ組のポインタ部分は当然変化する
>>545
>> heap::allocate(size, align);なのに
そのようなヒープ領域割り当てはとは異なる
GoのスライスとRustのVecはどちらも伸長して足りなくなるたびにヒープ領域の再割り当てを何度でも自動的に行なう
もちろん再割り当てが頻繁に起きないように大きく確保してそれがキャパシティ
GoのスライスはRustのVecで合っている
どちらも以下の点で同じ
・3つ組で構成される(領域へのポインタ、確保されている長さキャパシティ、そのうち使用中の長さ)
・append/pushなどで長さは伸長することが出来る
・長さが伸長してキャパシティを超えると自動的にヒープ領域の再割り当てを行ないデータは移動する
・その時に3つ組のポインタ部分は当然変化する
>>545
>> heap::allocate(size, align);なのに
そのようなヒープ領域割り当てはとは異なる
GoのスライスとRustのVecはどちらも伸長して足りなくなるたびにヒープ領域の再割り当てを何度でも自動的に行なう
もちろん再割り当てが頻繁に起きないように大きく確保してそれがキャパシティ
550デフォルトの名無しさん
2021/11/09(火) 10:37:04.74ID:cs0y0gBS 調べてきた
Cでは、構造体が名前付きメンバーなしで定義されている場合、プログラムの動作は"未定義"です。
ですから、処理系によっては0ではない違う値ということもあり得ます、なので0だ、というのは
少々違います。C++の場合、 標準ではサイズ0 のオブジェクトは許可されないため値1を返します。
clangに-std=c++17でCのソースをコンパイルすれば1になります。
未定義動作が多い言語は確かによろしくないですが、それだけ多くの処理系がある事の裏返しです
Cでは、構造体が名前付きメンバーなしで定義されている場合、プログラムの動作は"未定義"です。
ですから、処理系によっては0ではない違う値ということもあり得ます、なので0だ、というのは
少々違います。C++の場合、 標準ではサイズ0 のオブジェクトは許可されないため値1を返します。
clangに-std=c++17でCのソースをコンパイルすれば1になります。
未定義動作が多い言語は確かによろしくないですが、それだけ多くの処理系がある事の裏返しです
551デフォルトの名無しさん
2021/11/09(火) 10:39:15.18ID:cs0y0gBS 必死に顔真っ赤になってレス付けてくるけど相手にしません、読むのも嫌
552デフォルトの名無しさん
2021/11/09(火) 11:07:58.08ID:t/ZCl1K7 CとC++は実際違う言語だから、CのソースをC++の処理系にかけてもC++として処理されるだけw
gccでもclangでも言語オプションは-xなので、-x cでC言語、-x c++でC++になるw
Cなら-std=c++17ではなく-std=c17かなw
Cの場合古い分事実上の標準に合わせて標準化されてる感じが強いから未定義という扱いになるのは仕方ないw
実際gccでも警告すら出ず--pedantic-errors付けてようやく怒られる程度の話w
gccでもclangでも言語オプションは-xなので、-x cでC言語、-x c++でC++になるw
Cなら-std=c++17ではなく-std=c17かなw
Cの場合古い分事実上の標準に合わせて標準化されてる感じが強いから未定義という扱いになるのは仕方ないw
実際gccでも警告すら出ず--pedantic-errors付けてようやく怒られる程度の話w
553デフォルトの名無しさん
2021/11/09(火) 11:20:15.97ID:Ziut+B8+ >>549
単体で使う限りGoのスライスとRustのVecは同じ構造も持ち同じ挙動だが
共有されると両者の挙動が異なってくる
Goのスライスは>>538のようにバッファ部分が共有されていると
別スライスでもキャパシティ限度内ならば書き換えや伸長があっても変化が共有される
そしてキャパシティを超えてバッファ部分再割り当ての時に二つに分岐してそれぞれが最終的にGCで回収される
Rustは競合回避のためsingle writer xor multi readersの原則があるので
RustのVecに書き換えや伸長が起きるときは共有されていない
だからキャパシティを超えてバッファ部分再割り当ての時は移動のみで旧バッファ部分は即座に解放回収
単体で使う限りGoのスライスとRustのVecは同じ構造も持ち同じ挙動だが
共有されると両者の挙動が異なってくる
Goのスライスは>>538のようにバッファ部分が共有されていると
別スライスでもキャパシティ限度内ならば書き換えや伸長があっても変化が共有される
そしてキャパシティを超えてバッファ部分再割り当ての時に二つに分岐してそれぞれが最終的にGCで回収される
Rustは競合回避のためsingle writer xor multi readersの原則があるので
RustのVecに書き換えや伸長が起きるときは共有されていない
だからキャパシティを超えてバッファ部分再割り当ての時は移動のみで旧バッファ部分は即座に解放回収
554デフォルトの名無しさん
2021/11/09(火) 12:35:36.43ID:UAERt8tt goは比較的新しい言語とは思えないほど危険がいっぱいなんだな。rustどころかnimや crystalにも大きく劣る言語仕様なのに、信者が無理矢理な理屈で自分を騙してる印象
555デフォルトの名無しさん
2021/11/09(火) 12:36:57.75ID:6MNHnF6e556デフォルトの名無しさん
2021/11/09(火) 12:47:14.84ID:Smk+8XDy スケープゴートを用意し比較的人口の多いGoを攻撃する、Rustは悪くないのに"危険がいっぱいなこいつ"の悪辣性
557デフォルトの名無しさん
2021/11/09(火) 12:56:13.87ID:t/ZCl1K7 go最強!!!!
558デフォルトの名無しさん
2021/11/09(火) 13:08:33.41ID:0dhxEnJG559デフォルトの名無しさん
2021/11/09(火) 17:57:07.15ID:m+qVFCof capacity は、単なるデフォルト値だろ
別に、それを超えても良いのだろ?
別に、それを超えても良いのだろ?
560デフォルトの名無しさん
2021/11/09(火) 18:50:44.35ID:sYcGGX0V RustはD言語の再来と言われるほど期待されてる。
561デフォルトの名無しさん
2021/11/09(火) 19:55:55.57ID:qOqV7S2Y 倒してしまっても構わんのだろ?
562デフォルトの名無しさん
2021/11/09(火) 20:01:35.84ID:NdU8gMYv うんこ野郎の独演会
563デフォルトの名無しさん
2021/11/09(火) 20:12:33.83ID:mTU/Ys0g >>559
超えていいよ。超えたときには別のバッファが作成されて、元のバッファの要素がコピーされる、ってだけだから。
キャパシティを意識するとしたら、このようなバッファ作成回数を減らしたいっていうような、パフォーマンスを意識するときが多いんじゃないかな。
普通は明示的にキャパシティを設定せずとも、デフォルトの2のべき乗サイズのキャパシティがいい感じのパフォーマンスになるけどね。
超えていいよ。超えたときには別のバッファが作成されて、元のバッファの要素がコピーされる、ってだけだから。
キャパシティを意識するとしたら、このようなバッファ作成回数を減らしたいっていうような、パフォーマンスを意識するときが多いんじゃないかな。
普通は明示的にキャパシティを設定せずとも、デフォルトの2のべき乗サイズのキャパシティがいい感じのパフォーマンスになるけどね。
564デフォルトの名無しさん
2021/11/09(火) 20:57:16.81ID:dNM7/Umh スライス<T>型がユーザー定義型だったら
それは言語の欠陥ではなくユーザーのミスでしかなかったのに
スライス<T>型をユーザーが再発明できない原因をよく考えるべき
それは言語の欠陥ではなくユーザーのミスでしかなかったのに
スライス<T>型をユーザーが再発明できない原因をよく考えるべき
565デフォルトの名無しさん
2021/11/09(火) 23:26:26.60ID:8kpY2GOq >RustはD言語の再来と言われるほど
言われたくないだろうな
言われたくないだろうな
566デフォルトの名無しさん
2021/11/09(火) 23:33:50.69ID:t/ZCl1K7 注目度がだいぶ劣るけど後継は多分nimだから・・・
567デフォルトの名無しさん
2021/11/10(水) 01:07:58.28ID:trxD4DJA C++の再来はありますか?
568デフォルトの名無しさん
2021/11/11(木) 10:10:47.29ID:SpIFedoW 去ってないから
569デフォルトの名無しさん
2021/11/11(木) 14:23:06.64ID:Cobl5Yvk C/C++は簡単にやばいコードを書けてそれを発見するコストが高いという問題がある
特にC++は使いこなすための練度のハードルが高いせいか凶悪と言ってもいいw
特にC++は使いこなすための練度のハードルが高いせいか凶悪と言ってもいいw
570デフォルトの名無しさん
2021/11/11(木) 14:56:27.50ID:JCk4+0H4 C++がよくあそこまで流行ったもんだよね
こうなる前に他の言語を作る動きはなかったのかしら。まあそれが1995年のJavaだったのかなあ。昔すぎて自分にはよくわからんけど
こうなる前に他の言語を作る動きはなかったのかしら。まあそれが1995年のJavaだったのかなあ。昔すぎて自分にはよくわからんけど
571デフォルトの名無しさん
2021/11/11(木) 15:12:54.92ID:Cobl5Yvk むしろそれまではCしかなかった
Windowsが出てきて、その開発の主要言語でVisual C++が出てきたのでC++が流行った
と思ってる
インターネットが急速に発展したのはWindows 95以降だったので、それまでの流行りは処理系の人気に依存してた
と思う
その頃のUnix系や汎用機の世界までは俺も知らんw
勝手にUnix系はCで汎用機はCOBOLだったんじゃないかと思ってるw
Windowsが出てきて、その開発の主要言語でVisual C++が出てきたのでC++が流行った
と思ってる
インターネットが急速に発展したのはWindows 95以降だったので、それまでの流行りは処理系の人気に依存してた
と思う
その頃のUnix系や汎用機の世界までは俺も知らんw
勝手にUnix系はCで汎用機はCOBOLだったんじゃないかと思ってるw
572デフォルトの名無しさん
2021/11/11(木) 15:29:17.41ID:jwvU2w1D 要は、スマホのように説明書不要と称する物を特許とか著作権とかの規制で縛って課金する方法と
本体を無料であげる代わりに分厚い説明書を買わせる方法がある
本体を無料であげる代わりに分厚い説明書を買わせる方法がある
573デフォルトの名無しさん
2021/11/11(木) 17:04:48.90ID:JCk4+0H4 >>571
なるほど。たしかにWindowsとVisual Studioがキラーアプリケーションだったんだ
MicrosoftがObjective-Cを採用してたら、Objective-Cがめちゃ流行ったんだろうし、やはりプラットフォーマーは強いな
MicrosoftかAppleのいずれかがLispを採用してたら、Lispの存在感も桁違いだったんだろうなあ。そういう世界線を見てみたい
なるほど。たしかにWindowsとVisual Studioがキラーアプリケーションだったんだ
MicrosoftがObjective-Cを採用してたら、Objective-Cがめちゃ流行ったんだろうし、やはりプラットフォーマーは強いな
MicrosoftかAppleのいずれかがLispを採用してたら、Lispの存在感も桁違いだったんだろうなあ。そういう世界線を見てみたい
574デフォルトの名無しさん
2021/11/11(木) 17:23:23.65ID:jwvU2w1D ネットの怪文書を処理する難度がC++よりも凶悪なのでC++が良心的に思える
575デフォルトの名無しさん
2021/11/11(木) 18:27:16.30ID:2aD4x3mr C++は諦めが肝心の言語
機能を全部使うと死ぬ
機能を全部使うと死ぬ
576デフォルトの名無しさん
2021/11/11(木) 19:54:16.99ID:Cobl5Yvk 関数型の言語は当時Unix系の開発者(学術系多め)がemacs lispを中心に好んで使ってたよ(開発ツールとして)
ただWindowsとPCの普及にともなってunixやemacs自体が段々下火になっていった
処理系とはIDEのことなので、IDEの開発効率とその付属ライブラリが言語選択の決め手ということ
当時はC++以外だとpascal(delphiなど)を使う人やVBを使う人がいた
appleは丁度ジョブスいなかったので低迷中だったかな
当時強かったのはMS/IBM/Sunあたりかなぁ
※個人の感想/主観であることに注意
ただWindowsとPCの普及にともなってunixやemacs自体が段々下火になっていった
処理系とはIDEのことなので、IDEの開発効率とその付属ライブラリが言語選択の決め手ということ
当時はC++以外だとpascal(delphiなど)を使う人やVBを使う人がいた
appleは丁度ジョブスいなかったので低迷中だったかな
当時強かったのはMS/IBM/Sunあたりかなぁ
※個人の感想/主観であることに注意
577デフォルトの名無しさん
2021/11/11(木) 23:33:58.00ID:jahl/MWB どうしてprologのことを無視するかなあ
80年代後半から90年代初頭にかけては
unixではprologの天下
Cよりも早くコーディングできた
80年代後半から90年代初頭にかけては
unixではprologの天下
Cよりも早くコーディングできた
578デフォルトの名無しさん
2021/11/11(木) 23:45:48.82ID:JCk4+0H4 それ天下とはいっても流行してた、って意味じゃないよね?
GNUのソフトウェアもほとんどC言語だろうし・・・。
GNUのソフトウェアもほとんどC言語だろうし・・・。
579デフォルトの名無しさん
2021/11/11(木) 23:50:14.50ID:PBlMMjPy prologはいいんだけどrust製prologのscryerとか見てるとISO準拠にこだわるのやめてくれと思う
文法とか組み込みオペレータ、組み込みプレディケートとかライブラリも新時代に合わせて工夫してほしい
昔ながらのコードをそのまま動かせる…
それは昔ながらのPrologで動かしてもろて…
じゃあprologじゃなくていいじゃんって?
そうだよ!基礎コンセプトそのままでガワを新しく整えたのがほしいんだよ!
文法とか組み込みオペレータ、組み込みプレディケートとかライブラリも新時代に合わせて工夫してほしい
昔ながらのコードをそのまま動かせる…
それは昔ながらのPrologで動かしてもろて…
じゃあprologじゃなくていいじゃんって?
そうだよ!基礎コンセプトそのままでガワを新しく整えたのがほしいんだよ!
580デフォルトの名無しさん
2021/11/12(金) 00:06:01.94ID:Zs9GMSbc Prologが分かる奴はErlangもRustも分かるから早急に次世代に行けた
581デフォルトの名無しさん
2021/11/12(金) 02:10:18.26ID:MFojYN0L prologなんて誰も使ってなかったよw
582デフォルトの名無しさん
2021/11/12(金) 14:30:35.33ID:MwEAyDic583デフォルトの名無しさん
2021/11/12(金) 14:41:26.85ID:MFojYN0L swi-prologなら若干拡張されてるけど、prolog自体が昔からほぼ使われておらず
存在自体あまり知られてないし、結局手続き的思考が必要だし、用途が限定される使いにくい言語だと俺は思ってるw
存在自体あまり知られてないし、結局手続き的思考が必要だし、用途が限定される使いにくい言語だと俺は思ってるw
584デフォルトの名無しさん
2021/11/12(金) 14:59:17.99ID:CoiyKYqf 調べてみるとICOTとかいう、Prologをメインに使って、500億円も予算をかけたプロジェクトがあったらしいけど、なんだったんだろうな
585デフォルトの名無しさん
2021/11/12(金) 21:33:34.72ID:x+I3WYUz 第五世代コンピューターと論理プログラミングを基にした現代の深層学習とは違う人工知能・・・ウッ頭が
つまりはアランケイのSmalltalkが最強ってことだろ?
つまりはアランケイのSmalltalkが最強ってことだろ?
586デフォルトの名無しさん
2021/11/13(土) 11:37:24.38ID:gACfz8Jy コストが高いか安いかでくるくる掌返すのはポジショントークだよな
しかもサンクコスト
しかもサンクコスト
587デフォルトの名無しさん
2021/11/13(土) 12:37:16.91ID:LtGGXPX8 Prologは夢を見すぎたな
結局バグは仕様そのものとかいろんな理由で起きるというのに
結局バグは仕様そのものとかいろんな理由で起きるというのに
588デフォルトの名無しさん
2021/11/13(土) 13:27:58.51ID:gACfz8Jy メモリ安全みたいなテーマに限定すれば夢が無限に大きくはならんだろ
夢を見たことではなくテーマを表す言葉を使わなかったことを反省しよう
夢を見たことではなくテーマを表す言葉を使わなかったことを反省しよう
589デフォルトの名無しさん
2021/11/13(土) 13:40:18.34ID:pG0a2gxf ループをすべて再帰で書くというのがちょっと難しいが
デバグが楽だし、保守もしやすい
ライブラリをどさっと作れば流行ったかもしれないな
のちのperl,javaのように
デバグが楽だし、保守もしやすい
ライブラリをどさっと作れば流行ったかもしれないな
のちのperl,javaのように
590デフォルトの名無しさん
2021/11/13(土) 15:45:12.67ID:m5D80op7591デフォルトの名無しさん
2021/11/13(土) 16:19:14.47ID:1+Mic26n また過大評価してGC無しなんて言うけど理論上は参照カウントはGCアルゴリズムだし、そんなのは原始的で
最も基本のGCに分類される。仮にこれから今のRc系のGCに参照カウントGCの非同期が搭載されたりすれば
その動作はスイープマーク系や世代別GCに近くなる。(その可能性は少ないが)現在なぜ良い結果が出るかと
いえば構造上、連鎖的な多量GCが少なくなるために、スループットが高くなる事だけ。
レテンシーで見ればJavaやC#のGoなどの処理は毎回GCするとは限らないので、その分だけ処理が速い
最も基本のGCに分類される。仮にこれから今のRc系のGCに参照カウントGCの非同期が搭載されたりすれば
その動作はスイープマーク系や世代別GCに近くなる。(その可能性は少ないが)現在なぜ良い結果が出るかと
いえば構造上、連鎖的な多量GCが少なくなるために、スループットが高くなる事だけ。
レテンシーで見ればJavaやC#のGoなどの処理は毎回GCするとは限らないので、その分だけ処理が速い
592デフォルトの名無しさん
2021/11/13(土) 16:22:04.94ID:0J1co5Uq 君、頭悪いでしょ
593デフォルトの名無しさん
2021/11/13(土) 17:00:56.00ID:hvma83bs 末尾呼び出し最適化が保証されてる言語でのみ
枕を高くして再帰で書きまくれるというもの
ocamlはいいぞ
枕を高くして再帰で書きまくれるというもの
ocamlはいいぞ
594デフォルトの名無しさん
2021/11/13(土) 17:01:06.08ID:m5D80op7 >>591
まずほとんどのデータは参照カウントで管理しないから極一部のケース対象にしか論じていないね
次に参照カウントゼロ時に即座に解放する場合はガベージが一度も発生しないためガベージコレクションとは通常言わないです
最後に列挙しているGC言語はC/C++/Rustよりもベンチマークでも遅いですね
まずほとんどのデータは参照カウントで管理しないから極一部のケース対象にしか論じていないね
次に参照カウントゼロ時に即座に解放する場合はガベージが一度も発生しないためガベージコレクションとは通常言わないです
最後に列挙しているGC言語はC/C++/Rustよりもベンチマークでも遅いですね
595デフォルトの名無しさん
2021/11/13(土) 17:14:56.21ID:o5Yybg23 末尾再帰はプログラミングテクニックではなく、コンパイラ等におけるコード最適化の技術です。
(多くは手続き言語における自己呼び出しをTailに変形してスタック消費をゼロにしたりする)
「ループを再帰で書く」まったく意味ないどころか、言語問わず末尾再帰最適化が未実装のコンパイラ等では
弊害しかありません。「イテレータ連鎖?で書く」は普通のループ大きく変わりませんが、言語によりけりで
手続き言語では非同期処理やサイドエフェクトのある処理では上手く書けません。
そもそもPrologの一階述語論理における再帰処理というのは再帰定義自体が、関数型プログラミングの元と
なる論理型プログラミングで、多くの普及している手続き言語のような弊害がないために成り立つだけです。
(多くは手続き言語における自己呼び出しをTailに変形してスタック消費をゼロにしたりする)
「ループを再帰で書く」まったく意味ないどころか、言語問わず末尾再帰最適化が未実装のコンパイラ等では
弊害しかありません。「イテレータ連鎖?で書く」は普通のループ大きく変わりませんが、言語によりけりで
手続き言語では非同期処理やサイドエフェクトのある処理では上手く書けません。
そもそもPrologの一階述語論理における再帰処理というのは再帰定義自体が、関数型プログラミングの元と
なる論理型プログラミングで、多くの普及している手続き言語のような弊害がないために成り立つだけです。
596デフォルトの名無しさん
2021/11/13(土) 17:29:13.45ID:o5Yybg23 >>594
(1)多くの言語のデータ管理はヒープとスタックです。スタックには(よほど特殊なOSでない限り)違いがありません。
(2)「参照カウントゼロ時に即座に解放する場合」意味のある日本語で書きましょう、開放すると言っておきながら
ガベージが無いといったり、RustであればRc<T>やArc<T>で参照カウントゼロ時は確保してないということです。
(3)「ベンチマークでも遅い」例えばCPUのベンチマークだって幾つも項目がありますが、その中のスループットは
高い(near =早い)と言っているのです。一方で レテンシーは遅いのです。
なぜそんなに強引に推し通したいのか、理解不能です。
(1)多くの言語のデータ管理はヒープとスタックです。スタックには(よほど特殊なOSでない限り)違いがありません。
(2)「参照カウントゼロ時に即座に解放する場合」意味のある日本語で書きましょう、開放すると言っておきながら
ガベージが無いといったり、RustであればRc<T>やArc<T>で参照カウントゼロ時は確保してないということです。
(3)「ベンチマークでも遅い」例えばCPUのベンチマークだって幾つも項目がありますが、その中のスループットは
高い(near =早い)と言っているのです。一方で レテンシーは遅いのです。
なぜそんなに強引に推し通したいのか、理解不能です。
597デフォルトの名無しさん
2021/11/13(土) 18:05:59.35ID:gACfz8Jy ベンチマークの数値ってもうRustのコンパイルエラーと同じぐらい意味不明と思われてるね
Prologさんを500億の言語にしても誰もほめてくれないし
Prologさんを500億の言語にしても誰もほめてくれないし
598デフォルトの名無しさん
2021/11/13(土) 18:55:57.32ID:kpA91CRo GCなければキャッシュの効果は高くなりそうだけどねw
599デフォルトの名無しさん
2021/11/13(土) 19:58:21.21ID:H/IZ/H8E >>596
おそらくC++やRustを使ったことがないのだろうけどC++のshared_ptrやRustのRc Arcを使うのは所有者が複数になる特殊ケースのみ
それらのみが参照カウンタを用いるけど所有者がいなくなった時点で自動的にリソース解放される
これをGCと呼ぶ人はいない
もちろんそれ以外のケースは参照カウンタも使わずに解放される
そのためGC言語は原理的にどうやってもCやC++やRustに勝つことはできない
おそらくC++やRustを使ったことがないのだろうけどC++のshared_ptrやRustのRc Arcを使うのは所有者が複数になる特殊ケースのみ
それらのみが参照カウンタを用いるけど所有者がいなくなった時点で自動的にリソース解放される
これをGCと呼ぶ人はいない
もちろんそれ以外のケースは参照カウンタも使わずに解放される
そのためGC言語は原理的にどうやってもCやC++やRustに勝つことはできない
600デフォルトの名無しさん
2021/11/13(土) 20:16:30.44ID:blWxI0OX 特殊な界隈でそういう習慣があるのか知らんが
参照カウンタは普通にGCの実装方式の一つと
言われてるだろ
参照カウンタは普通にGCの実装方式の一つと
言われてるだろ
601デフォルトの名無しさん
2021/11/13(土) 20:50:12.12ID:pG0a2gxf 末尾再帰ができないのをループで書いても
スタックがあふれるけど
スタックがあふれるけど
602デフォルトの名無しさん
2021/11/13(土) 20:53:18.97ID:qcFvcADm 例えば、ベンチマーク時間が30秒だとして、どれだけ回数を多く実行できるかがスループットであり
gcのあると言われる言語の中でgcの時間/頻度を調整できるものは30秒gcをしなければ、余計な処理が
走らないために数値が当然高くなる。もちろん処理中に使用メモリが常に増大して終了時のみに解放を
するため整合性のある説得力のあるベンチマークとは言いませんが、特定の処理に限ってメモリーが
溢れないのであれば、十分に取りうる選択肢です。
そして1msが致命的となるような処理では重要ですが特定桁までPIを求めたりフィボナッチ数列の処理
時間を計測したり、あんまり意味がないですね
多くは最適化がどこまでなされているか、配列などの範囲チェックなどのランタイムチェックが足枷に
なっているか、などが違うだけで言語的な特性だとは言いません。
上のほうでshared_ptrなんて持ち出してバカ言ってる人がいるけど言語は適用範囲が違えば有利な分野が
違います。「勝つ」なんて、Cなんて基本は配列などの範囲チェックなんかはやってないわけで原理的な
説明に1つもなってません。CとRustを同列に並べることがどうかしてる、Rustは範囲チェックなどは
安全な言語として当然やってるわけでRustだってアロケーションは他のgcの言語と同じく従来はjemallocで
今は違いますが確保と解放がセットになっている事が、今は有利に働いているが、将来的にはそうだという
確信はありません。そうでなければgcの研究なんて見捨てられるでしょう
gcのあると言われる言語の中でgcの時間/頻度を調整できるものは30秒gcをしなければ、余計な処理が
走らないために数値が当然高くなる。もちろん処理中に使用メモリが常に増大して終了時のみに解放を
するため整合性のある説得力のあるベンチマークとは言いませんが、特定の処理に限ってメモリーが
溢れないのであれば、十分に取りうる選択肢です。
そして1msが致命的となるような処理では重要ですが特定桁までPIを求めたりフィボナッチ数列の処理
時間を計測したり、あんまり意味がないですね
多くは最適化がどこまでなされているか、配列などの範囲チェックなどのランタイムチェックが足枷に
なっているか、などが違うだけで言語的な特性だとは言いません。
上のほうでshared_ptrなんて持ち出してバカ言ってる人がいるけど言語は適用範囲が違えば有利な分野が
違います。「勝つ」なんて、Cなんて基本は配列などの範囲チェックなんかはやってないわけで原理的な
説明に1つもなってません。CとRustを同列に並べることがどうかしてる、Rustは範囲チェックなどは
安全な言語として当然やってるわけでRustだってアロケーションは他のgcの言語と同じく従来はjemallocで
今は違いますが確保と解放がセットになっている事が、今は有利に働いているが、将来的にはそうだという
確信はありません。そうでなければgcの研究なんて見捨てられるでしょう
603デフォルトの名無しさん
2021/11/13(土) 21:00:37.35ID:YXy1PChK またGCの定義をmalloc/freeとreference countとtracing GCの3つの間でお手玉して好き放題言う流れか
604デフォルトの名無しさん
2021/11/13(土) 21:05:09.14ID:qcFvcADm 更に言えば多くの独立したgcのある言語は、gcにおけるメモリー断片化を防ぐコンパクション処理を独自にやっている訳でOSに任せているRustが有利なのはその通りですが、だからと言ってその処理を行って無い事を不正という話には全くなりませんし、原理的にどうやっても等という結論出すことは全く意味がありませんね
605デフォルトの名無しさん
2021/11/13(土) 21:14:45.54ID:H/IZ/H8E >>600
参照カウンタはオペレーティングシステム内でもファイルシステムでも用いられている普遍的なデータ管理方式
参照カウンタを用いていることをガベージコレクションだと主張する人はいない
C++もRustも所有者が複数とせざるを得ない特殊ケースにおいて最適最速な方式として参照カウンタを用いている
>>602
やはりCもC++使ってことがない初心者だったのか
shared_ptrはCではなくC++です
そしてC++のshared_ptrはRustのArcと同じもので参照カウンタを用いている
あなたの無茶苦茶な主張では「C++とRustはGC言語」となるが世間では当然そんな主張は存在しない
もう一つのあなたのデタラメな主張「GC言語は速い」というデータも世間には見当たらない
参照カウンタはオペレーティングシステム内でもファイルシステムでも用いられている普遍的なデータ管理方式
参照カウンタを用いていることをガベージコレクションだと主張する人はいない
C++もRustも所有者が複数とせざるを得ない特殊ケースにおいて最適最速な方式として参照カウンタを用いている
>>602
やはりCもC++使ってことがない初心者だったのか
shared_ptrはCではなくC++です
そしてC++のshared_ptrはRustのArcと同じもので参照カウンタを用いている
あなたの無茶苦茶な主張では「C++とRustはGC言語」となるが世間では当然そんな主張は存在しない
もう一つのあなたのデタラメな主張「GC言語は速い」というデータも世間には見当たらない
606デフォルトの名無しさん
2021/11/13(土) 21:24:08.80ID:qcFvcADm ガベージコレクション
https://ja.wikipedia.org/wiki/ガベージコレクション
じゃあページの記述を削除して直して来いよ。顔真っ赤にしなくても良い話だぜ?書き間違いぐらい読もうよ?
「GC言語は速い」などという主張はしていないのも読めないから呆れるんだよ、妄信するあんたらを
https://ja.wikipedia.org/wiki/ガベージコレクション
じゃあページの記述を削除して直して来いよ。顔真っ赤にしなくても良い話だぜ?書き間違いぐらい読もうよ?
「GC言語は速い」などという主張はしていないのも読めないから呆れるんだよ、妄信するあんたらを
607デフォルトの名無しさん
2021/11/13(土) 21:51:51.77ID:m5D80op7 もっと詳しく書かれている英語版に明確に書かれていますね
https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
Many programming languages require garbage collection, ...
these are said to be garbage collected languages.
Other languages were designed for use with manual memory management,
but have garbage-collected implementations available (for example, C and C++).
「多くのプログラミング言語はGCを必要としていてそれらはGC言語と言われる」
「その他の言語は手動メモリ管理で設計されたがGC実装も利用可能(例としてCとC++)」
つまりCとC++および状況が全く同じRustはGC言語ではないです
https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
Many programming languages require garbage collection, ...
these are said to be garbage collected languages.
Other languages were designed for use with manual memory management,
but have garbage-collected implementations available (for example, C and C++).
「多くのプログラミング言語はGCを必要としていてそれらはGC言語と言われる」
「その他の言語は手動メモリ管理で設計されたがGC実装も利用可能(例としてCとC++)」
つまりCとC++および状況が全く同じRustはGC言語ではないです
608デフォルトの名無しさん
2021/11/13(土) 22:03:01.49ID:qcFvcADm はあ。。馬鹿馬鹿しい
609デフォルトの名無しさん
2021/11/13(土) 22:10:48.49ID:gACfz8Jy お前らの判断が遅いのは「審判は第三者でなければならない」という習慣のせいかな
自分が審判になって自分で好き放題に判断すれば早いんだが
自分が審判になって自分で好き放題に判断すれば早いんだが
610デフォルトの名無しさん
2021/11/13(土) 22:13:59.53ID:npSc0+BO tracing GC の方が有利なアプリケーションって具体的に何?
611デフォルトの名無しさん
2021/11/13(土) 22:29:17.51ID:riokxr1E いろいろなプロセスが動かないバッチ処理なんかは逐一確保と解放を繰り返さない分だけ、調整すれば早いでしょ
612デフォルトの名無しさん
2021/11/13(土) 23:05:29.89ID:H/IZ/H8E >>611がここでプロセスとか言い出してるのを見てもわかるように
GC言語が有利というトンデモ主張している人は基本的な常識知識がないようだ
GC言語が有利というトンデモ主張している人は基本的な常識知識がないようだ
613デフォルトの名無しさん
2021/11/13(土) 23:09:26.37ID:PG5C5bM3 自分の間違いを認める人が全くいなくてこのスレはわけわからん
614デフォルトの名無しさん
2021/11/13(土) 23:10:29.14ID:5/jXyZUV 馬鹿はほっとけ
615デフォルトの名無しさん
2021/11/13(土) 23:31:48.59ID:kpA91CRo 前提の違う話が交錯してるだけw 言いたいやつに言わせとけばいいw
616デフォルトの名無しさん
2021/11/13(土) 23:42:47.00ID:m5D80op7 >>611さんの解読
(1)バッチ処理だといろいろなプロセスが動かなくて
(2)つまりバッチ処理でなければいろいろなプロセスが動いて
(3)そしてバッチ処理でいろんなプロセスが動かなければ逐一確保と解放を繰り返さなくて
(4)逐一確保と解放を繰り返さない分だけ調整すれば早い
とおっしゃってるようだけど
(1)バッチ処理でもよくあるパイプライン式ならいろんなプロセスは動くし
(2)バッチ処理でなくてリアルタイムにストリーム処理でもプロセス一つだけもあってそもそもバッチ処理とプロセス数は関係ないし
(3)プロセス数が増えてメモリを使うことで起きうる確保と解放ならばOSによるメモリ管理とスワップの話になるし
(4)OSによるスワッピングが起きなければ起きた時より確かに実行速いのはその通りだけど
プログラミング言語によるメモリ管理やGCの話とは関係ないですね
(1)バッチ処理だといろいろなプロセスが動かなくて
(2)つまりバッチ処理でなければいろいろなプロセスが動いて
(3)そしてバッチ処理でいろんなプロセスが動かなければ逐一確保と解放を繰り返さなくて
(4)逐一確保と解放を繰り返さない分だけ調整すれば早い
とおっしゃってるようだけど
(1)バッチ処理でもよくあるパイプライン式ならいろんなプロセスは動くし
(2)バッチ処理でなくてリアルタイムにストリーム処理でもプロセス一つだけもあってそもそもバッチ処理とプロセス数は関係ないし
(3)プロセス数が増えてメモリを使うことで起きうる確保と解放ならばOSによるメモリ管理とスワップの話になるし
(4)OSによるスワッピングが起きなければ起きた時より確かに実行速いのはその通りだけど
プログラミング言語によるメモリ管理やGCの話とは関係ないですね
617デフォルトの名無しさん
2021/11/13(土) 23:55:33.15ID:gACfz8Jy 言いたいことを自由に言うのは良いことだよ
ただ、言われたことを全部聞く義務があると思うのは悪い
ただ、言われたことを全部聞く義務があると思うのは悪い
618デフォルトの名無しさん
2021/11/14(日) 00:37:07.99ID:TIZIlibM GCの方式の一つとして参照カウント方式があるが増減のオーバヘッドや不完全性からGCとしては少数派で主流はトレーシング方式
一方でC++/shared_ptrやRust/Rcは参照カウント方式をとっているがガベージをコレクションする形ではなく停止もなく全体が対象でもないため少なくとも通常のGCとは呼ばないかな
そのためC/C++/RustはGCのない言語と一般的に言われている
このあたりは共通認識でよいのではなかろうか
一方でC++/shared_ptrやRust/Rcは参照カウント方式をとっているがガベージをコレクションする形ではなく停止もなく全体が対象でもないため少なくとも通常のGCとは呼ばないかな
そのためC/C++/RustはGCのない言語と一般的に言われている
このあたりは共通認識でよいのではなかろうか
619デフォルトの名無しさん
2021/11/14(日) 00:48:00.30ID:FBepD5Vv 書き込みが多すぎてなんの前提で話をしてるのかよくわからんが、通常のGCじゃないならなんなんだ。PerlはGCじゃないのか
620デフォルトの名無しさん
2021/11/14(日) 00:54:15.03ID:TIZIlibM621デフォルトの名無しさん
2021/11/14(日) 00:55:47.54ID:FBepD5Vv ごめん。それでもわからんけど、Perlは参照カウント方式を使ってるんだけど、通常のGC言語ではない、ってこと?
622デフォルトの名無しさん
2021/11/14(日) 01:02:54.74ID:TIZIlibM623デフォルトの名無しさん
2021/11/14(日) 01:04:14.81ID:FBepD5Vv つまり、君は何が言いたいの?
624デフォルトの名無しさん
2021/11/14(日) 01:17:50.43ID:TIZIlibM 意図的に歪曲して言いがかりを付けたいだけなようなのでやめときます
一般的な共通認識を>>618に書いただけです
一般的な共通認識を>>618に書いただけです
625デフォルトの名無しさん
2021/11/14(日) 01:42:47.96ID:H2p4AXVo ビジー状態とアイドル状態を繰り返すようなアプリはアイドル時にGCできるから有利な場合もあるのかな
shared_ptrでも実装工夫すれば同じことはできはするだろうけどめんどくさそう
shared_ptrでも実装工夫すれば同じことはできはするだろうけどめんどくさそう
626デフォルトの名無しさん
2021/11/14(日) 07:13:40.75ID:RmFILMax C#も、ついに10.0まできた。
貪欲に機能を追加し、着実に進化(複雑化)しているし、最先端とは言わないけど先端を走っていると思うんだ。
もう少し評価してあげてもいいと思うんだけど、みんな興味ないの?正直Goより・・・・
貪欲に機能を追加し、着実に進化(複雑化)しているし、最先端とは言わないけど先端を走っていると思うんだ。
もう少し評価してあげてもいいと思うんだけど、みんな興味ないの?正直Goより・・・・
627デフォルトの名無しさん
2021/11/14(日) 08:17:41.01ID:VI/aOYOP C#はjavaと比べられる位置なので・・・興味ないというか既にみんな知ってるよね
628デフォルトの名無しさん
2021/11/14(日) 11:00:50.01ID:fX3uqiQX まだやってたのかww
GC言語であるない論破wwwもとを見ればGCアルゴリズムだって言ってるけど、途中で
絶対Rustに勝てないマンがGC言語ではない言い出してるが、マジどうでもいいなwww
絶対勝てないならここを見る必要もないだろ、Rustすれでワッショイワッショイやってろ
GC言語であるない論破wwwもとを見ればGCアルゴリズムだって言ってるけど、途中で
絶対Rustに勝てないマンがGC言語ではない言い出してるが、マジどうでもいいなwww
絶対勝てないならここを見る必要もないだろ、Rustすれでワッショイワッショイやってろ
629デフォルトの名無しさん
2021/11/14(日) 13:01:51.01ID:K/AOP3t+ C#は開発者文化を含めJava以上に単一言語で全部済ませる志向が強い言語なんだよね
実際俺も信者だったし信者ばかりの環境で仕事してたこともあって、いかにC#が優れているかはよく分かってるつもり
チームにC#を導入したら最後、他に手を出す理由を正当化することができなくなってしまい、結局つまんない職場になっちゃうんだよ
だから俺は一切C#使わないことにしてる
実際俺も信者だったし信者ばかりの環境で仕事してたこともあって、いかにC#が優れているかはよく分かってるつもり
チームにC#を導入したら最後、他に手を出す理由を正当化することができなくなってしまい、結局つまんない職場になっちゃうんだよ
だから俺は一切C#使わないことにしてる
630デフォルトの名無しさん
2021/11/14(日) 13:56:35.32ID:E00roTgy Good は Great の敵
631デフォルトの名無しさん
2021/11/14(日) 15:27:05.72ID:TIZIlibM632デフォルトの名無しさん
2021/11/14(日) 16:22:12.42ID:H2p4AXVo >>631
shared_ptrなりRcなりは普通にコーディングするとスコープ抜けたり所有権失ったり獲得した領域が不要になったタイミングで即時freeされるけど
ビジー状態終了後にまとめてfreeしたいならそれまで参照を生かしておくなどの工夫が必要だよね
いわゆるGCならGCを一時的に止めるだけで比較的簡単に実現できる
ただ、C++やRustでこういう状況に対応しようとしたら arena 使うのが定石な気もするのであまり意味のない比較だったかも
そもそもこういうワークロードが現実的にどの程度存在するかもよくわからないし
freeのオーバーヘッドがどの程度大きいかにも依るので
実際のアプリケーションのベンチマークとかとらないとちゃんとした議論はできない気がしてきた
shared_ptrなりRcなりは普通にコーディングするとスコープ抜けたり所有権失ったり獲得した領域が不要になったタイミングで即時freeされるけど
ビジー状態終了後にまとめてfreeしたいならそれまで参照を生かしておくなどの工夫が必要だよね
いわゆるGCならGCを一時的に止めるだけで比較的簡単に実現できる
ただ、C++やRustでこういう状況に対応しようとしたら arena 使うのが定石な気もするのであまり意味のない比較だったかも
そもそもこういうワークロードが現実的にどの程度存在するかもよくわからないし
freeのオーバーヘッドがどの程度大きいかにも依るので
実際のアプリケーションのベンチマークとかとらないとちゃんとした議論はできない気がしてきた
633デフォルトの名無しさん
2021/11/14(日) 17:11:54.46ID:1fsz29jn shared_ptrやRcは参照カウント方式のGC機能を提供するライブラリ
これらをGCとは呼ばないというのは無理がありすぎる
「GC言語」はGCの利用を基本的前提として設計されてる言語という意味なので
non-GC言語にGC機能が用意されてるからといってGC言語に分類されるわけではない
これらをGCとは呼ばないというのは無理がありすぎる
「GC言語」はGCの利用を基本的前提として設計されてる言語という意味なので
non-GC言語にGC機能が用意されてるからといってGC言語に分類されるわけではない
634デフォルトの名無しさん
2021/11/14(日) 17:18:41.30ID:jU07kwMv >>626
C#はこの前メソッドチェーンでとやかく言ってた人たちには、LINQ表現などはさらに一歩進んだ考えだが、彼らが
このような記述表現が、仮にお気に入りの言語に入っても大喜びするとはとても思えない。
GCの観点でいえば、JavaやC#などのclassで参照を多用して並列GCでストップのあるものと、Goのようにstruct値
だけだが、軽量スレッドがあるために並列GCにしなければならなかったものとは同じ土俵で比べるべきではない
これは同じく、並列GCを用いないDIO様がいない世界の言語とも比べらずらい。
C#はこの前メソッドチェーンでとやかく言ってた人たちには、LINQ表現などはさらに一歩進んだ考えだが、彼らが
このような記述表現が、仮にお気に入りの言語に入っても大喜びするとはとても思えない。
GCの観点でいえば、JavaやC#などのclassで参照を多用して並列GCでストップのあるものと、Goのようにstruct値
だけだが、軽量スレッドがあるために並列GCにしなければならなかったものとは同じ土俵で比べるべきではない
これは同じく、並列GCを用いないDIO様がいない世界の言語とも比べらずらい。
635デフォルトの名無しさん
2021/11/14(日) 17:26:09.38ID:a1LUiRLL >>633
shared_ptrやRcはライブラリではありません
単なるスマートポインタです
ポインタを使い終えると対象を自動的に解放します
例えばC++では同じスマートポインタとしてunique_ptrもあって使い終わると自動的にdeleteが呼ばれて解放されます
同様にshared_ptrもあって使い方終わると自動的にdeleteが呼ばれて解放されます
これらのどこにガベージコレクションの要素がありますか?
shared_ptrをGCだと主張するならばunique_ptrについてはどうですか?
もし仮にdeleteが呼ばれて解放することをGCだと主張するならばC++では常にGCが行われていることになってしまいますが??
shared_ptrやRcはライブラリではありません
単なるスマートポインタです
ポインタを使い終えると対象を自動的に解放します
例えばC++では同じスマートポインタとしてunique_ptrもあって使い終わると自動的にdeleteが呼ばれて解放されます
同様にshared_ptrもあって使い方終わると自動的にdeleteが呼ばれて解放されます
これらのどこにガベージコレクションの要素がありますか?
shared_ptrをGCだと主張するならばunique_ptrについてはどうですか?
もし仮にdeleteが呼ばれて解放することをGCだと主張するならばC++では常にGCが行われていることになってしまいますが??
■ このスレッドは過去ログ倉庫に格納されています
