メインコンテンツへスキップ

Bzip2クレートがCから100% Rustへ切り替え

·3 分
2025/06 Rust C言語 Bzip2 ライブラリ 移行

Bzip2クレートがCから100% Rustへ切り替え

引用元:https://news.ycombinator.com/item?id=44303361

dralley 2025/06/17 21:53:37

Trifecta Techのbzip2って、Linuxで使われてる古い公式版を置き換えられそう?Fedoraがzlibをzlib-ngに変えたみたいに、CのABI互換があればイケるかもね?

rlpb 2025/06/17 22:14:18

C ABI互換って話だけど、動的リンクとはどうなるの?Rustって静的リンクしかできないんじゃないの?

alxhill 2025/06/18 01:07:05

下のコメントで話がごっちゃになってるよ。Rustバイナリは動的リンクできるけど、ABIが安定してないからCみたいにバージョンの壁を越えられないんだ。だから、結局みんな静的リンクしてるってこと。

tiffanyh 2025/06/18 00:10:38

uutilsプロジェクトの目標がこれなんじゃないかな。URLはこれ→https://uutils.github.io/

cocoa19 2025/06/18 02:02:58

Rust版になると、ツールも改善されてほしいな。ripgrepとかtokeiは、grepやclocより断然速くてすごいんだ。

eru 2025/06/18 01:26:32

静的リンクって、バイナリが小さくなるし、LTOもできていいんだよね。

egorfine 2025/06/18 09:54:09

コア標準の一部で、何十年もちゃんと動いてたツールを”代替”って呼ぶのは本当に嫌だね。ripgrepは最高だけど、grepの代わりじゃないし、そうあるべきじゃないんだ。

emidln 2025/06/18 06:12:15

静的リンクはバイナリを小さくしないよ。ライブラリのシンボル全部が実行ファイルに入っちゃうからね。複数のバイナリがあるなら、動的リンクの方が合計サイズが小さい場合が多いんだ。

IshKebab 2025/06/18 06:50:51

静的リンクと依存関係を”バンドル”するのを混同してるよ。静的リンクがバイナリを小さくするのは、依存関係をバンドルする場合の話。静的リンクか動的リンクか、と、バンドルするか共有するかは違う話なんだ。

guappa 2025/06/18 07:40:50

ページキャッシュの仕組み、知ってる?静的リンクだとそれが効かないんだ。libcとかがプロセス間で共有されないから、3000個プロセスがあったら3000回ロードしなきゃいけなくなるよ。

mprovost 2025/06/18 10:06:12

コマンドラインツールの進化の歴史について語ってるね。AT&T→BSD→GNUって進化して、毎回「元のままがいい」って文句言う人がいたんだ。grepもegrepとかfgrepが出て、結局統合されたし。もし標準に固執してたら今だにBourne shell使ってるよ。GNUツールはもう標準みたいになってるけど、Rust以外でもackやagみたいな新しいツールが出てきてて、次の革新期が来てて嬉しいな。

mandarax8 2025/06/18 07:56:10

自分の書いたコードは全部まとめて静的リンクできるけど、libcとかシステムのライブラリは動的リンクにするってやり方もあるよ。

tialaramex 2025/06/18 09:59:00

平気で事実と違うこと言う人ってどういう頭してんだろうね?「僕が正しい、宇宙が間違ってるんだ」とか思ってんのかな?それとも真実の概念をぶっ壊したいの?(君のセリフに混乱してる人のために言うけど、もちろんRustでもそれができるよ)

guappa 2025/06/18 10:34:20

今手元にあるRustで書かれたバイナリでlddコマンドを試してみてくれる?結果を楽しみに待ってるよ!

egorfine 2025/06/18 10:32:43

>君の言う通りだね。僕も同意するよ。「XだけどZで書き直しました」って宣伝文句、すごく嫌なんだよね。ツールも作者もinstantly嫌いになりそうになる。(Rustは好きだよ。この雰囲気〈vibe〉が嫌いなだけ)。

scripturial 2025/06/18 13:17:26

これは、元々CのラッパーだったRustクレートを、Rustネイティブに置き換えるために作られたRustクレートだよ。Rustプロジェクトで使う時に、もっと速くてリンクしやすいんだ。「Rust」って言わないで、どうやってこのRustクレートがより良いRustクレートだって伝えればいいのさ?

whytevuhuni 2025/06/18 11:47:44

本当に気になったんだけどさ、なんで完全に静的リンクされるってそんなに確信してたの?

egorfine 2025/06/18 10:31:13

Bourne shellのことなんだけど、無知でごめんね、bashの何が悪いの?全部のサーバーやワークステーションで使ってるし、複雑なスクリプトも書いてるよ。古いプロジェクトじゃないし、主流のシェルに見えるんだけど、僕が間違ってる?
Update: ああ、オリジナル版のBourne Shellのことだったんだね、bashじゃなくて。

coldpie 2025/06/18 13:48:52

1)このプロジェクトはクールで成功を祈ってるよ。いつかこれがデフォルトのユーティリティになったら最高だね。2)MITライセンスにしたのは間違いだったと思う。GNUユーティリティをクローンしてるんだから、元のGNUソースをRustに移植するのが一番obviousだろう?でもGPLコードをMITプロジェクトに移植するのはダメなんだ。だから、ユーティリティを全部ゼロから書き直さなきゃいけない。これって時間の無駄に見えるね。僕はGNUソースをRustに移植する作業には興味あるけど、全部ゼロから書き直すのには興味ないから、このプロジェクトには貢献してないんだ。

quotemstr 2025/06/18 04:14:18

C++のバイナリも同じようにすべきだね。外部向けにはC ABIで話して、内部的にはRustかC++の標準ライブラリを静的リンクする感じに。

IshKebab 2025/06/18 12:43:46

Rustは静的リンクしかサポートしないってよく言われるから、動的リンクできないって推測しちゃったんだろうね。GoもLinuxで完全静的バイナリを作るし、Rustも同じだと勘違いするのも無理はないかも。でも、そんなに自信満々に言っちゃダメだよ!

tux3 2025/06/18 11:00:53

うん、そうかもね。でもそれが何だって言うの?Rust製のシェルnuを見てごらんよ。
$ ldd ~/.cargo/bin/nu
linux-vdso.so.1 (…)
libssl.so.3 => /lib/x86_64-linux-gnu/libssl.so.3
…(他のライブラリも続く)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
って感じで動的リンクしてるでしょ?C製のシェルashだってそうだし。
$ ldd /bin/sh
linux-vdso.so.1 (…)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
(…)

LinusU 2025/06/18 20:15:21

圧縮が10~15%速く、解凍が5~10%速くなるって、めちゃくちゃ良い「機能」じゃない?
「[…] 完了してるってことなんじゃないの?」
って、必ずしもそうとは限らないと思うよ。例えば、2019年からリリースがないプロジェクト全部が完了してるわけじゃないでしょ?ほとんどは単に放棄されてるんじゃない?
もちろん、完了してるっていうのも理由としてはあり得るけどね。
このbzip2の場合は、課題トラッカーに未解決のバグがいくつかあるんだ。だから、プロジェクトが完了してるってわけではなさそうだよ。
参考:https://sourceware.org/bugzilla/buglist.cgi?product=bzip2

guappa 2025/06/18 07:39:23

静的リンクするとバイナリがすごく大きくなるし、LTOできても使えるメモリの量に制限されるんだよね。あと、静的リンクだとアーカイブ全体を常に再構築する必要があるのも面倒。

pjc50 2025/06/18 08:48:42

C++プロジェクトから別のC++プロジェクトにC APIをエクスポートするのって、本当に大変なんだ。COMみたいになっちゃうし。(COMはC++よりちょっと前にできたと思うけど)

restalis 2025/06/18 23:12:10

「圧縮が10~15%速く、解凍が5~10%速くなるって、すごく良い「機能」じゃん?」
確かにコードを最適化して10~15%速くできる部分は多いけど、もしそれがコードの読みやすさを犠牲にするなら、最近はそういう「機能」は敬遠されるんだよね。既存コードを、「もっと難しく¹」て(そのせいで)そこで開発したいエンジニアが少ない(そしてこれからも少ないだろう)言語に移すのって、すごく読みやすさを損なう最適化に似てるように見えるんだよね。¹…それだけじゃないけど。ソフトウェア開発ツールとしてのRustの問題点については、他のコメントでも説明したことがあるよ。ここ↓見てね。
https://news.ycombinator.com/item?id=31565024
https://news.ycombinator.com/item?id=33390634
https://news.ycombinator.com/item?id=42241516

bluGill 2025/06/18 00:31:51

RustはRustに動的リンクできないんだ。Cとは動的リンクできるし、Cから動的にリンクされることもできる。この二つを組み合わせれば「ごまかせる」けど、それは結局Cを扱ってるだけで、たとえ両側にRustがあってもRustを扱ってることにはならないんだ。

throwawaymaths 2025/06/18 14:33:22

ねえねえ、“rewritten IN rust”じゃなくて“rewritten FOR rust”って言う方が正しいんじゃない?

rwaksmunski 2025/06/17 23:08:35

俺 Common Crawl のデータ処理でこのクレート使ってるんだよね、何百 TB も!速度アップめっちゃ助かるわー

viraptor 2025/06/17 23:33:54

なんでここで bz2 使ってるの?一回 zstd に変換してから処理する方が速くない?俺の知る限り、zstd って高圧縮レベルだと bzip2 より全部の面で優れてるはずだけどなー。

もっとコメントを表示(1)
rwaksmunski 2025/06/18 00:07:49

だって Common Crawl はデータ bz2 で配布してるんだもん。実際、俺も中間データは ZFS で zstd にして保存してるよ。

declan_roberts 2025/06/17 23:56:37

それってデータを何回も処理することを前提にしてる話だよね。

malux85 2025/06/17 23:33:08

そうそう、俺も言いに来たんだけど、圧縮で 14パーセント スピードアップって結構すごいよね!

aidenn0 2025/06/18 04:52:55

bzip2 って(特に並列実装とかだと)圧縮に関しては結構イケてるんだよ。遅れるのは解凍時間の方。lz77 ベースのアルゴリズムは解凍がめちゃくちゃ速いから、そこで差がつくんだよね。

koakuma-chan 2025/06/18 00:24:57

マジで爆速じゃん!

firesteelrain 2025/06/17 22:53:55

これで未解決の CVE 11個はデフォルトで解消されるのかな?ってかさ、皮肉にもこの bzip2 クレートに CVE が1個報告されてるんだってよ[1]
https://app.opencve.io/cve/?product=bzip2&vendor=bzip2_proje

tialaramex 2025/06/17 23:04:31

Rust クレートででかいファイルが実行時エラーになったのと、C で範囲ミスが多発してるのって対照的だよね。C の範囲ミスを突いてコード実行されるか試されたのかな? それは不可能かもしれないし、そうじゃないかもね。

Philpax 2025/06/17 22:57:01

> bzip2 クレート 0.4.4 以前
今日 0.6.0 リリースしてるじゃん :>

jorams 2025/06/18 08:04:26

でも、これはまさに話題になってる bzip2 クレートの話でしょ。その新しい純粋な Rust 実装は libbz2-rs-sys で、bzip2-rs じゃないんだよ。最後の文は関係ないね。

debugnik 2025/06/18 08:11:53

この記事は bzip2 クレートについてなんだよ、bzip2-rs クレートじゃないんだ。リポジトリ名が後者と同じ名前だけどね。

wiz21c 2025/06/18 08:11:46

FTA:
> 今日ほとんど使われない 90 年代のアルゴリズムにわざわざ取り組むのはなぜ?
今は何が使われてるの? zstd とか?
ああ、これ見たよ: https://quixdb.github.io/squash-benchmark/

a-dub 2025/06/18 00:34:56

C と Rust のバージョンで同じ LLVM コード生成(同じ最適化)バックエンドを使ってるか気になるな。もしそうなら、どこで速度アップしてるの?
(つまり、なんか Rust の自動 SIMD なの、それとも他の部分を手で最適化したの、新しい最適化されたライブラリ使ってるの、それとも…他?)

eru 2025/06/18 01:27:54

ただ推測だけど、Rust はコード生成器にもっとヒントを与えられるのかもね。例えば、C のポインタみたいにエイリアシングをそんなに心配しなくていいとか。 https://en.wikipedia.org/wiki/Aliasing_(computing)#Conflicts… 見てみて。

MBCook 2025/06/18 03:33:10

なるほど、すごく納得できるよ。公式の回答は知らないから推測だけどね。記事からリンクされてる c2rust での最初の翻訳についての記事 https://trifectatech.org/blog/translating-bzip2-with-c2rust/ を見ると、C コードは変数の範囲保証がないせいでコードが最適じゃない箇所があるって指摘してるんだ。
たくさんの人が数がそんなに大きくならない時でも ’int’ を使ってるってことも。
でも適切な型を使えば Rust コンパイラはパフォーマンスが良くなるなら別のことをするって決められるんだね。
だから、より多くの知識によってより良い最適化を引き出せるっていう君のアイデアは多分正しいと思うよ。

Too 2025/06/18 06:11:37

適切なデータ構造やアルゴリズムを使う時の使いやすさも、すごく大事な役割を果たすことがあるんだ。C だと、基本的な配列以外はすごく手間がかかりすぎるからね。

littlestymaar 2025/06/18 07:35:22

ああ、それってブライアン・カントリルがdtraceの一部をRustで書き直した時の気づきだよな。学習のためにやったのに、オリジナルのコードより素朴な実装の方が速くてビックリしたんだって。結局、理由はRustの標準ライブラリに入ってる”I used a BTreeMap”を使ったことだって話だったよ。

a-dub 2025/06/18 14:02:45

ふむ.. それってclang+linuxとかclang+stl、hotspot+j2eeと比べたらどうなんだろうね。Perlがよくネイティブc/c++より速かった時代を思い出すな、あれも優秀な文字列処理ライブラリが組み込まれてたからだし。空間効率はどう?Rustのバイナリって大きくなりがちだけど、システム全体に影響しない? RedoxOSと普通のlinuxのベンチマークとか見てみたいね。

bcantrill 2025/06/18 18:37:43

とにかく、俺が見つけた詳細はここにあるよ。[0]
[0] https://bcantrill.dtrace.org/2018/09/28/the-relative-perform

a-dub 2025/06/18 21:21:16

かなりクールだね!単体で見ると最高だ!でも、実行ファイルのイメージサイズが大きくなる影響、特にコンプリートシステムでの影響がまだ少し気になるんだ。もしバイナリが全部大きかったら、キャッシュ領域を圧迫し始めない?スタティックリンキングってフルシステムで理にかなってるのかな?

eru 2025/06/19 23:35:25

カーネルは実際に実行するバイナリの部分だけをロードするし、しばらく実行されてない部分はディスクキャッシュを解放できるんだよ。だから、バイナリの絶対的なサイズよりも、実際に’active set’にどれだけあるかを気にするべきなんだ。

adgjlsfhk1 2025/06/18 05:09:50

Cは正直言って、現代のハイパフォーマンスコードを書くのにはかなりイケてない言語だよ。C99からC21まで20年くらい、新しいインストラクションを(インラインasmなしで)使うためのフィーチャーが追加されなかったんだ。clz/popcnt/clmul/pdepみたいなのための良いアブストラクトマシンインストラクションがあるだけで、こういうコードを書くのにすごく役立つんだ。

zzo38computer 2025/06/18 05:20:35

Popcount, clz, ctzはGCCでノンスタンダードファンクションとして提供されてるよ(clangもGNUモードでサポートしてるかも)。PDEPとPEXTはないみたいだけど、あるべきだと思うな(PEXTはINTERCALにすらあったし)。PDEPとPEXPはx86で-mbmi2付きで使えるけどね。MMIXのMORとMXORもビルトインファンクションで使えるといいな。

WhereIsTheTruth 2025/06/18 04:44:44

どんなXとかYとかZ言語で書き直しても、スピードアップするチャンスは生まれるんだよ。Rustに固有の何かがあるわけじゃない。

xvilka 2025/06/18 03:45:58

彼らかProssimoがBzip2だけじゃなくて、コアインターネットプロトコル、例えばBGP, OSPF, RIP、他のルーティングインプリメンテーション、DNSサーバーなんかも、同じように(Rustで)書き直してくれるといいな。

everfrustrated 2025/06/18 14:45:10

これ見て!
https://nlnet.nl/project/current.html
https://www.sovereign.tech/programs/fund
ここ数年、Rustみたいなより安全な言語で重要なインターネット&OSツールを書き直すのに結構良い支援があるんだ。例えばRustでBGPとかね。https://www.nlnetlabs.nl/projects/routing/rotonda/

xvilka 2025/06/18 15:49:57

ありがとう!まさに探してたやつ!なぜかこのプロジェクト見落としてたわ。HoloっていうRustのルーティングプロジェクトもね [1] https://github.com/holo-routing/holo

dataking 2025/06/18 06:14:33

このページhttps://www.memorysafety.org/initiative/にTLSとDNSのことが書いてあって、あんたの提案にちょっと近いかもね。

throw10920 2025/06/18 14:02:49

そのドメインてメモリ安全性のこと?それともRustのこと?どっちなの?

nickpsecurity 2025/06/18 14:33:57

SPARK Adaでもっと強力な証明付きのIronsides DNS作った人がいるよ。

xvilka 2025/06/18 15:49:03

Ada自体は別に良い言語だし、何も反対しないよ。唯一の問題は、その場合コントリビューターが見つかるかどうかだろうね。

もっとコメントを表示(2)
broken_broken_ 2025/06/18 06:13:31

macOSでperfがない件だけど、dtraceでプロファイリングは結構できるよ。オリジナルのPerlのflame graphスクリプトもこれ使うって言ってたし、Rustで再実装されたflame graphもdtraceを使ってる。キャッシュミスとかマイクロインストラクションみたいな一部のメトリクスは取れないけど、それでもすごく使えるよ。

pdimitar 2025/06/22 10:21:04

じゃあ未来の読者のために、具体的に説明してあげなよ?

Aissen 2025/06/18 09:26:49

これってlbzip2みたいに並列解凍できるのかな?(それか、ブロックマジックを事前スキャンして並列解凍を上に乗せられるようなイテレータがあるのかな)。
追記:多分できないね。

agumonkey 2025/06/18 10:09:20

Rustは置いといて、いろんな実装のベンチマークを見るのってマジ楽しいわ。読んでてすごく満足感ある。

tephra 2025/06/18 08:00:03

Rust好きだし学びたいんだけど(何回か挫折してる…)。ちょっと大げさだけど、見かけるライブラリがだいたい0.x.yなんだよね。このライブラリも2014年に0.1.0が出てからまだ1.0.0が出てないし、Rustコミュニティって1.0.0にしたがらない傾向あるの?

liambigelow 2025/06/18 08:25:22

これ見て→https://0ver.org/#notable-zerover-projects

liambigelow 2025/06/18 08:28:46

真面目な答え:しょっちゅう変わるから安定版を宣言する必要ないと感じてる人もいる。別のケースでは、安定してて広く使われてる0.xパッケージなんだけど、1.0にすると大体なんか破壊的変更があるってことになっちゃう。(そうあるべきかは分かんないけど、依存ライブラリが0.xから1.0になったら、時間できるまでアップデート待つくらい慎重になるね)。
まぁ、大抵の人はそんなに気にしてないよ。

sramsay64 2025/06/18 09:40:21

あのリスト、Zigが入ってるけど、Zigプロジェクトは1.0リリースの明確な計画[0]があるんだよね。それは0verじゃなくて、ただのsemverのベータ段階だよ。
[0] https://github.com/ziglang/zig/milestone/2

scripturial 2025/06/18 16:12:58

そうそう、Rustではパッケージマネージャーがアップデートのルールを組み込んでるんだ。メジャーバージョン(1.0とか)が変わると、なんか壊れる変更があったってことだから自動でアップデートしないの。自動アップデートしても大丈夫なうちは、メジャーバージョンは変えたくないんだよね。

vlovich123 2025/06/17 22:56:19

「uutilsの失敗の後」
どんな失敗?

vlovich123 2025/06/17 23:17:29

なんかさ、uutilsのsortってlocaleによっては速くないんでしょ?それにテストケースでモメるのっていつものことじゃん。この批判、細かいところにこだわりすぎだよ。RustのライセンスはMITとApache2が普通だし、陰謀とか見えないな。てか、あなたが批判してるのってUbuntuなの?

j16sdiz 2025/06/18 04:25:48

>1. The uutils project didn’t also make all locales cases for sort faster even though the majority of people will be using UTF-8, C or POSIX where it is indeed faster
localeとencodingは違うよ!トルコ語(tr_TR.UTF-8)とUS英語(en_US.UTF-8)の電話帳ソートで試してみなよ。

vlovich123 2025/06/18 04:42:47

知ってるよ。UTF-8とかCとかPOSIXって、localeの文字列だよね。

0cf8612b2e1e 2025/06/17 23:06:31

その4chanみたいなサイトから何を知ってほしいわけ?今のところGNUほど速くないってこと?嘘はどこにあるの?

jeffbee 2025/06/17 22:51:57

自分で結果を確かめるのは大事だけど、正直bzip2のパフォーマンスを気にする人なんて今どきいるの?zstdにはどうやったって勝てないよ。同じ時間ならzstdはめっちゃ小さくなるし、解凍も20~50倍速いんだから。bzip2の実装速度なんてどうでもいいんじゃない?

MBCook 2025/06/18 03:40:21

いや、そういうケースもあるよ。誰かからbzip2ファイルをもらったり、その形式で渡す必要があったり。そうなると他に選択肢ないじゃん。使うしかないなら、14%速くなるのはすごく嬉しいことだよ。

solarized 2025/06/17 23:37:30

CからRustへの書き換えに、なんかLLM使ったの?

Twirrim 2025/06/18 00:36:22

もしトランスパイルツール使うなら、適当なこと言わない正確なやつがいいよ。c2rustってのがかなりいいらしい。ImmunantがQuake3をRust化した時のブログ記事もあるよ。https://immunant.com/blog/2020/01/quake3/ 生成されたRustコードは綺麗じゃないけど、そこから直せばいいんだって。

dataking 2025/06/18 01:14:31

記事によると、最初c2rustで書き換えたみたいだよ。ここ見て。https://trifectatech.org/blog/translating-bzip2-with-c2rust/

記事一覧へ

海外テックの反応まとめ
著者
海外テックの反応まとめ
暇つぶしがてらに読むだけで海外のテックニュースに詳しくなれるまとめサイトです。