次世代言語29 TypeScript Swift Go Kotlin Rust Nim
■ このスレッドは過去ログ倉庫に格納されています
スレタイ以外の言語もok
前スレ
次世代言語28 TypeScript Swift Go Kotlin Rust Nim
https://mevius.5ch.net/test/read.cgi/tech/1661739736/ >>556
Cellや動かせないOptionの中身に対してはreplaceだな
生成コストかかるものならtakeで一時的に借りるしな
moveはいつでもコスト安い >>543
いるに決まってんだろ。
お前意味なくいつもnull許容ばかり使ってるのか?ありえねーわ。 >>557
それは>>515も書いているように
どんな言語でもまともなプログラマーならば内心で意識してプログラミングするっしょ
そしてその意識の差で速度が大きく変わって来るから言語に関係なく重要な moveは速い
cloneも速くするためにはRcに入れて循環参照とかいうリスクを取る
逆に言えば、最適化の意識が低いスタイルを確立すれば循環参照問題が無くなるのでは? >>561
聞きかじりだけでRustを使ったことがないからそんな間違えをする
Rcのcloneと中身のcloneは全く別物かつ独立
例えば中身がclone実装なく不可でもRcはcloneできる
循環参照は意図的に作らない限りRustでは自然に生じることはない
そして作らないことが正解 >>560
GC言語では全く意識する必要ないよ
性能にも関係ない話 >>563
GC言語でも意識しないと性能に直結するぞ
>>515が言うループの内外どちらかで速度差を測ればすぐ分かる >>562
聞きかじりがどうのと、そんなメンドクサイ言語はダメだわ。
バグのもとだわ。 >>560 >>562
そんな前提が無いと使えないんじゃ、やっぱりRustは絶壁の学習コストだな。
コミニティも初心者に配慮する気配無いし、>>544が正解か。 >>566
>>567
じゃあC++についても知らないのね
C++のshared_ptrもRustのRc/Arcもどちらも機能もその件も同じで
そのスマートポインタのコピー(clone)をしても中身はコピーされないんだよ
中身はそのままで共有する仕組みであって基本知識の入門レベル
GCのある言語でもオブジェクトの参照のコピーとオブジェクト自体のコピーの違いがありますね
それと同じことだからこの2種類のコピーの違いを理解できていないのはマズいですよー ホントRustをわざと嫌われるように仕向けてるように見えるよなあ Rustはなぜ開発者に愛されているのか、そして「人を選ぶ」理由とは? 実案件でRustを採用するゆめみに聞く
https://codezine.jp/article/detail/16416 まずは既存言語の延長として借用ベースでコードを書いてから
適切にムーブもするというスタイルをお勧めしたいね
本来のRustのスタイルとしてはムーブベースで考えるべきなのだけど
ハードルがかなり高いと思う
(C++のムーブコンストラクタやムーブ代入演算子を使いまくってた俺クラスの人間じゃないと無理)
借用の乱用でライフタイムの指定が嫌になったころにムーブを覚える
これこそアハ体験 >>568
2種類のコピーが同じではない証拠があればそうなる
証拠を得ることができない仕組みをわざと作れば、両者は速度以外同じになるので最適化に利用される 自分の名刺に知らない会社の名前が書いてある理由は? Rust初心者なのになぜ強がって墓穴を掘りたがるのか
複オジ病の心理が理解できん >>575
承認欲求だろ
他で承認されることがないから
匿名掲示板で嘘ついても虚勢を張ってでも
承認してもらいたくてしょうがない心理状態
子供が親に褒めてもらおうと嘘をつくのと同じ
大人でそれが常態化してれば病気だよね >>571
消費する時はムーブ
消費しない時は借用 >>572
参照のコピーと実体のコピーは異なる
後者はそれ以後二つの実体へ分岐となる ファミコンで動作するGUI付きOS「NESOS」が爆誕
2022年09月30日 11時06分
ファミリーコンピュータ上で動作するGUI付きのOS「NESOS」が開発されました。
NESOSではタスクバー付きのデスクトップ画面を表示したり、デスクトップ上のアイコンを自由に並び替えたり、テキストの編集を実行したりできます。
デスクトップ上のアイコンは自由に並び替え可能で、タスクバーにファイルやアプリを配置することもできます。
テキストエディタでは、ファミリーベーシック用のキーボードを使ってアルファベットと各種記号を入力可能。
NESOSは無料配布されており、公式ページのダウンロードリンクからダウンロード可能です。
https://gigazine.net/news/20220930-family-computer-nesos/ 最近の流行りが静的型付けと型付きラムダ系FPからの便利機能輸入だから逆風だけど、雑に書くのに向いてる言語ってなんだろうね
Nimはかなり書き味意識してるって話だし、ベタッと実装するならGolangは向いてると思ってる 開発環境も含めてならC#は雑に書くのに向いてると感じたな
最近のバージョンだとクラスやmainメソッドを省いてスクリプト言語みたいに書けるし、IDEの補助が神がかってるから迷わずに書けてミスしにくい
まあ書き味も大事だが、雑に書く場合は極力テストの手間も抑えたいから、ミスしないことは超重要 C#はF#みたいにネイティブでスクリプト実行できるようになった? nodeとgoとrustで/helloを受け取ったら、hello worldと返すだけのAPIを立ててベンチマークしたんだけど何でここまで差が出るかわかる人いる?30倍も違うんだけど
12スレッドのwsl linuxだけどtaskset -c 1で1コアに制限しても
Goでは 36345.50rps avg102.03ms, Rustでは 82382.92rps avg43.57ms と依然として差があるんだが
シンプルなAPIでもここまで差が出るんだから、Nodeは論外ってことなのかな
コード: https://pastebin.com/cWdaC2rZ
wrkを使用
$ wrk -c 4000 -d 5 http://localhost:3000/hello
node (express)
Thread Stats Avg Stdev Max +/- Stdev
Latency 466.94ms 73.50ms 669.37ms 81.57%
Req/Sec 4.09k 678.72 4.82k 82.98%
38284 requests in 5.07s, 8.73MB read
Requests/sec: 7547.73
Transfer/sec: 1.72MB
go (net/http)
Latency 8.72ms 5.33ms 102.98ms 96.17%
Req/Sec 122.50k 6.37k 135.10k 69.57%
1163747 requests in 5.10s, 144.28MB read
Requests/sec: 228242.97
Transfer/sec: 28.30MB
rust (active-web)
Latency 8.77ms 3.15ms 31.07ms 76.16%
Req/Sec 115.76k 18.13k 156.46k 62.22%
1085310 requests in 5.08s, 133.52MB read
Requests/sec: 213464.53
Transfer/sec: 26.26MB ひょっとすると JavaScript だから遅いんじゃなかろうか IO処理が主体ならそんなに変わらない認識だったけど10行程度のWebAPIでここまで変わると思ってなかった Goは1コアに制限したらGCのペナルティが大きいんじゃね。今は複数コアある前提でコンカレントマークでしょ? >>584
起動時にモジュールを大量に読み込んでるしJITもしてるからそんなベンチじゃ遅いのは当たり前 スクリプト言語とコンパイル言語を比較する場合はランタイムのオーバーヘッドに差がありすぎるのだから
そこで差が出るようなベンチは無意味
実際のアプリケーション相当の処理を想定しないと >>590
はあ?
1分やっても2分やっても全く同じだけど?
もしかして平均の意味すら知らないのかな? >>593
いやだから10秒だろうが1分だろうが5分だろうが変わらないって
偉そうなこと言ってるのはお前だろ
あらゆるノイズを排除してここまで差が出るんだから起動時のコストなんて関係ないだろ
適当なこと言ってマウント取ってんじゃねーよゴミ >>594
ゴミはお前
論点ずらしするな
ただのストローマンだぞ
俺の言ったことをまずやれ
そしてそれでも差があるなら反論しろ
それが正当なやり方だろ
お前は手を動かさずに自分の意見が正しいと言ってるだけ
もしかして数分実行しただけでキャッシュができると思ってる?
しかもそんなよくわからんサンプルで?
そもそもキャッシュができる条件など仕様にはない
できない可能性もある
そういうことを含めてのベンチなんだよ 「俺の意見が間違ってる」ことをコードで証明しろ
ストローマンの口八百で語ってもなんの意味もない
それこそただのマウント野郎だろ いくらなんでもNode遅すぎで気になるね
レスポンスしてるヘッダの内容とかも比べてみなよ
HTTP/1.1が使われてるのか、cookieセットされてるかとか、keep-aliveはどうかとか 俺の意見を無視するならここに書く意味はないし
はろーわーるどのベンチでnodeは遅いね、で終わる話
ここに書かずに1人で納得しとけ
ここに書く以上何か意見を求めてるんだろ?
その意見を言ってやってるのに無視する
正しい人間の態度とは思えんな
あまりの自分勝手さに怒りさえ覚える とりあえず家帰ったら動かしてみる
俺のローカル環境だが >>597
試したけどcurl -vで複数回投げた時にconnection left intactとRe-using出るからコネクション使いまわせてるね
HTTP1.1だからデフォルトでkeepaliveになってる
wrkはHTTP1.1対応
Nodeは日付とか色々ヘッダに入ってみたいだから公平な比較にはなってないけどそれにしても差があるすぎると感じるね >>584
Q:なぜ何でここまで差が出るのか?
A:この場合、rust (active-web) は、asyncなどでI/O待ちを切り替え起点とした非同期処理を行うが
goは1リクエストに対してgoroutineが1つ付く。細かく言うとRustはソケットI/Oへ受・送信が終わらないと
次のリクエストは処理待ちになる。
結果はReq/Secに出て高速で(効率的な)スイッチングを行えるgo (net/http)のほうが最終的に処理できる
リクエスト数は高いが、平均処理時間avgはRustのほうがほんの少し速くなる。
goでavgが遅くなるのは、処理中にI/Oを起点としない時分割で別リクエスト処理へ切り替えるために
切り替えコスト+処理コストの合計で1つのリクエストを完了する時間は長くなる
余談だが、wrkは5秒だと並列テストなどをするには短い。より厳密な計測ができるwrk2とかあるが
この場合は並列での負荷テストではないのでそんなに変わらない。ただ最初の1秒が参考にならない
上の例はあくまで1コアだが、多コア高負荷環境(1000同時スレッド・3万リクエスト・30秒ぐらい)だと
50%はgoのほうが速くなり、Req/SecはRustのほうが多くなる
node(express)は、express自体の重厚さJS/TS自体の重さがかなり効いていると思う ただWSLであってもLinuxのbacklog当たりのカーネルパラメータを弄れば結果は変わるかもしれない。
並列・高負荷ではなくても4000コネクションだと標準の状態だと足りない気がする
$ sudo sysctl -a 2>&1 | grep -E 'somaxconn|tcp_max_syn_backlog'
net.core.somaxconn = 128
net.ipv4.tcp_max_syn_backlog = 512 WSLでやってんのか、WSLってパフォーマンス的にはなんか特徴あるのか?
このあと気が向いたらおれもちょっと気になるとこのベンチ比較してみる とりあえずNodeは遅いゴミってのが証明されてるな もう1つ言うと高負荷で比べるならrust (active-web) なら、go側はSO_REUSEPORT/SO_REUSEADDRを
効くようにするか、fasthttp系(fiber)などを使用すべきで、net/httpを普通に使っただけだと極限の性能では
無いので注意が必要です、今回は高負荷でないので関係ありませんが 利用者数が全然違うので、今はGo言語を使うほうが良いのでは?
もしもRustが使われるようになったなら、その時使えば良い。
今はまだHaskell候補の状態。
そのうちHaskellのように誰も見向きもしなくなるんだろうなあと。 殊更に型の重要性を連呼する人間は、本人が有能か無能かはともかく、自分含めて人間の技能と精度を信用していないというのは確かだと思うよ >>611
では質問するがなぜMicrosoftはJavascriptは不十分だと認識してTypescriptを開発したの?そして普及したの?
なぜPythonなどのスクリプト言語はしきりに型ヒント機能を追加してるの?
無能は型の重要性を理解できないお前、エンタープライズでは必須 >>611
みんな無能だよ。
たまに型無しで完璧にやれるやつはいるけど、そういう奴は他の人と一緒に仕事しても自分の高い能力を盾にルールに従ってもらえないから面倒だわ。
一人でR&Dとか調査主体の部署でやってもらうのが無難。 無能向けのルールに従っていたらせっかくの高い能力を発揮できないじゃん
妥当じゃないの >>616
ところが >>611 みたいのは能力が高いわけで無いという。 >>594
>あらゆるノイズを排除してここまで差が出る
全然ノイズ排除できてないじゃんww
意味のないベンチだよ >>613
型パズルで開発者にできた感を与えられるから
で実際、型を合わせるだけで正常系は大体うまく動くからね >>611
100%同意
適材適所で選ぶ能力が無いだけ >実際、型を合わせるだけで正常系は大体うまく動くからね
ほら無能じゃんw まあ実際動的型付け言語でやるプロジェクトは
少数精鋭のチーム編成ができないと厳しいわな
メンバーが多くてコミュニケーションコストが高かったり入れ替わりが頻繁だったり下請け孫請けから最低ラインを下回るメンツが入ってくるようなら静的型付け言語のほうが楽 >>618
どこができてない?ヘッダに多少差があるとはいえ明確な差が出てるよね
Nodeはhttpモジュール使っても遅いし言語自体がゴミとしか言いようがない APIに存在しうるCPU処理、IO処理を排除してミニマムな状態でもGoやRustと比べるとここまで差が出る
だからISUCONで誰もNodeなんか使わないんだよ
Goは手軽でスピードが出るから人気なのは自明だな >>622
このスレに居てその質問は流石に不勉強じゃないかな……
静的型付け言語での実装においてもテストはもちろん書かれるよ
当然テストに網羅性は無いわけだけど、型はそれを補ってくれて、テストで調べるべき範囲を絞ってくれる訳だ
スイスチーズモデルにしても型は理論的に一定の範囲に穴がないことを保証してくれるのでテストの良き友だよ
ランタイムやコンパイラの型の実装が間違ってるかもしれないとかいう意見は、構文解析が間違ってるとか最適化が間違ってる並の、有り得はするけど議論するレイヤーが異なる難癖なので無視するよ >>626
バカにされてることがわからず斜め上のレスをしちゃう無能w アンカーを付けるときはまず無知無能異常者認定する複おじしぐさ Rustなら安心安全だからテストは必要ない
コンパイラーが全部教えてくれる >>630
Rustはプログラムを書き始めるためのcargo new --lib した時にテスト用mod testsの雛形が自動的に生成用意されるくらいテスト重視主義の言語
もちろん強力な型システムによりRustコンパイラがコンパイル時点でデータ競合を含む多くのバグを実行する前に指摘してくれるのも事実
その分だけテスト記述は本来のロジックに関するテストに対して専念できる >>630
それって
コンパイラが教えないバグが一部存在してもコンパイラにペナルティがないこと
を問題視しているんだよね
全部教えると断言すればきっと罰を受けるのになあってことだよね >>627
バカにされてる、というか煽られている部分を感じなかった訳じゃないけど、そうだとしても煽ってくる人間は、型とテストが複合的にエラーを減らす手段であって排他なものではないということを、理解していないか少なくとも認識していないので、レスの内容は変わらないよ
大体実装が早くできて楽だよね、っていう動的型付け言語の特性を私は否定するつもりはないし
技術というのはメリット・デメリットを認識した上で選定するものであって、単に煽るだけとか無能呼ばわりするような人間がそれらを認識できてるとは思わないし、もし不勉強と言われたくないならテストを書くという単一の手段がエラーを防ぐという点でどういう十分さがあるのか説明しなきゃ
あと
>>630
Rustだって基本のツールチェーンでテストが実行できるように作られてるんだからテストが必要ないなんで事は少なくとも言語開発チームは思っちゃいないよ
テキトー言わんでくれるかな >>633
かつての静的型付け言語は型宣言が面倒だったため動的型付け言語は型宣言が必要ない僅かな分だけ有利だった
今の静的型付け言語は自動的に型推論が行われるため動的型付け言語が有利なことはない
実行時デバッグの手間が増える動的型付け言語は劣ったプログラミング言語 現実は違う
まるで不殺主人公みたいに動的型を殺さないし、コンパイルが通らなかった人を殺さない
検査しかしないくせに結構役に立つのが現実 FacebookがRust使ってると自慢レスがあったけど。
それでFacebookは使いにくいのかと納得してしまった。 >>636
クラウド世界トップのAWSも
CDN世界トップのCloudflareも
Rust製です Rust Foundationを共同設立したGoogle, Microsoft, Amazonなど各社は負け組になる可能性ありうる 型の話はRDBとNoSQLの比較で
schema on writeがいいかschema on readがいいかという話と同じ
どちらか一方がが常に言い訳ではなくそれぞれ良し悪しがある >>642
NoSQLデータベースの多くはschema on readではなく、単に入れたものをそのまま出すだけだ
多くのNoSQLはオンライン性能が重要なため、Elasticsearchのようにschema on writeを使用するものもある
schema on readはむしろデータ分析用途でリレーショナルモデルとSQLで使用される場合が多い OLTP用かつschema on readなNoSQL DBってあるっけ?
MongoやDynamoDBみたいなKVS+α系はキースキーマとインデックスの併用だから典型的なschema on writeだよな
インデックスなしのスキャン操作はschema on readと言えなくもないけどオンラインでは普通使わないよね >>643
原始的なアセンブラはアドレスに型が無く、アドレスに何が入っているかによって人間が命令を使い分ける。
その状態より型があるほうが便利なのでC言語は支持された。 a[i]の順序を逆にi[a]と書くのが何故マナー違反かって質問が存在することは誰も否定しなかったので
質問が存在するゆえに型が存在する >>646
アドレッシング用レジスタとデータ用レジスタの区別も無い罠
プログラムカウンタでさえただのレジスタと区別しないの好き >>637
OSが存在しないファイルシステムも存在しない環境でどうやって拡張子を定義するんだって話 >>633
>型とテストが複合的にエラーを減らす手段であって排他なものではないということを、理解していないか少なくとも認識していない
めっちゃ判ります
っていうか煽るためにわざと知らない気付かないフリしてるのかと思える ・動的型付け言語 ←動的動作のためメモリ上に型情報が必要となる
・GCあり言語 ←GCのためにメモリ上に一部型情報が必要となる
・GCなし言語 ←基本的にはメモリ上に型情報は必要ない
(ただし敢えて動的に型を扱いたい時は型情報をメモリ上に持たせる) >>644
>NoSQLデータベースの多くはschema on readではなく、単に入れたものをそのまま出すだけだ
schema on readの意味くらいは理解してからレスしろ >>645
おまえもschema on readの意味くらいは調べろよ 恥ずかしいから>>654こそ調べたほうがいいぞ
schema on readというのはデータ分析や大規模バッチ処理の文脈で出てくる言葉で、Hadoopのように検索時に生に近い形式のデータを力業でフルスキャンする方式だ
データ分析においてはデータの取り込みは柔軟にしつつ読むときに工夫しろというベストプラクティスがあって、それを端的に表している
対してschema on writeってのは普通のRDBやMongoDB、Elasticsearchのような、書き込み時にスキーマ情報を使ってインデックスを作る方式を指す >>650
それは実行環境であって、開発ビルド環境のソースファイルは関係ねーだろ?
それともお前はOSも無いファイルシステムもない環境で開発ビルドしたことあんのかよ?あ? >>656
そもそもソースがファイルかどうかもわからんのにお前は何を言ってるんだ?w >>657
ム板で、ソースがファイルじゃないなら何? ■ このスレッドは過去ログ倉庫に格納されています