連載 [第2回] :
  RustNL 2024レポート

RustNL 2024からデータ圧縮ライブラリーzlibをRustで書き直したプロジェクトのセッションを紹介

2024年8月8日(木)
松下 康之 - Yasuyuki Matsushita
RustNL 2024から、データ圧縮のためのライブラリーzlibをRustで書き直したプロジェクトのセッションを紹介する。

RustNL 2024のセッションから、圧縮のためのライブラリーzlibをRustで書き直したプロジェクトに関するセッションを紹介する。プレゼンターはオランダでRustに関するコンサルティングを行っているTweede GolfのエンジニアのFolkert de Vries氏だ。

●動画:Compression Carcinized: Implementing zlib in Rust

データ圧縮のためのライブラリーをRustで実装したプロジェクトの解説

データ圧縮のためのライブラリーをRustで実装したプロジェクトの解説

システムに近く多くのユーザーが使うソフトウェアをメモリーセーフにするというのは、ISRGが掲げたプロジェクトで以下の記事にその概要を解説している。

●参考:ISRGが推進するメモリーセーフなソフトウェアを増やすための地道なプログラムProssimoを紹介

ここでISRGのSarah Gran氏は「インターネットの重要な部分を占めるソフトウェアをメモリーセーフなソフトウェアに置き換えていく」というプロジェクトとしてProssimoを紹介している。そして記事の中に含まれている重要なソフトウェアのひとつがzlibのライブラリーということだろう。

●ISRGのプロジェクトページ:zlib - Prossimo

このぺージに書かれているように、すでに稼働しているソフトウェアをメモリーセーフに書き換えるという仕事はそれだけでは収支が合わない仕事だろう。zlibに関して言えばChainguardがスポンサーとしてプロジェクトの支援をしているということになるだろう。

zlibがどこで使われているのかという部分に関しては、Webサイトを閲覧する際の必須の要素として常時使われていることを説明。ここでは単に大きな画像ファイルを自身のPCでユーザーが圧縮するというプロセスではなく、Webサイトを閲覧する際にブラウザーからGetメソッドでコンテンツを取得する時にデータ量を削減するためにzlibが使われていることを紹介している。

Webコンテンツを閲覧する際にも使われるzlibの圧縮/非圧縮機能

Webコンテンツを閲覧する際にも使われるzlibの圧縮/非圧縮機能

zlib-rsのプロジェクトとしてのゴールは、Cで書かれたzlibライブラリーを完全に置き換えること、そしてRustの高速な実行という利点を最大限に利用することだと説明。

zlib-rsの目的を説明。Cのライブラリーの置換と高速実行

zlib-rsの目的を説明。Cのライブラリーの置換と高速実行

そしてここからはデータ圧縮に関する基本的な原理を解説する内容となり、重複するデータのパターンを見つけてそれを圧縮することを解説している。

重複するデータのパターンを見つけることが圧縮ための最初のプロセス

重複するデータのパターンを見つけることが圧縮ための最初のプロセス

重複するデータパターンの検知から圧縮が始まる

重複するデータパターンの検知から圧縮が始まる

ライブラリーの書き換えのためには「何を置換するのか?」を正しく理解することが必要だとして、比較したのはオリジナルのzlibライブラリーだ。

オリジナルのzgipライブラリーの紹介。16ビットでも動くようなシンプルな実装

オリジナルのzgipライブラリーの紹介。16ビットでも動くようなシンプルな実装

そしてより現代的なプロセッサに対応した実装として紹介したのが、zlib-ngだ。zlib-ngはSIMD(Single Instruction Multiple Data)に対応した新しい実装で、過去のレガシーな機能を取り除いただけではなく並列処理にも対応したライブラリーとして紹介された。

SIMDに対応した新世代のzlibライブラリー

SIMDに対応した新世代のzlibライブラリー

そしてzlibをRustで書き直すというプロジェクトに関して、どうしてRustを使うのかという部分に「Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp.」というPhilip Greenspun氏の「10th rule of programming」の言葉を真似て表現した。日本語訳は「複雑なCのプログラムにはRustのビルドツールであるCargoの半分の速度の処理しかできないアドホックで非公式なバグが存在している実装が含まれている」といったところか。つまりComon Lispと同じくらいに遅くてバグが潜んでいるコードができ上がってしまうというリスクを揶揄している。ここで期せずして参加者から拍手が起こり、参加者のコンピュータリテラシーの高さが垣間見えた瞬間でもあったと言える。

思わず参加者から拍手が起こった「C言語をCommon Lispと同じレガシーな言語に例えた」スライド

思わず参加者から拍手が起こった「C言語をCommon Lispと同じレガシーな言語に例えた」スライド

続けて他のzlibの実装についても解説しており、miniz-oxideというライブラリーについてはメモリーセーフではあるものの速度が犠牲になっていることを解説。またC言語のライブラリーの完全置換とは言えず、機能が不足していることを説明した。

miniz-oxideという新しいgzipライブラリーの紹介

miniz-oxideという新しいgzipライブラリーの紹介

そして最後に紹介したのがRustで書き直したzlib-rsだ。

Rustで書き直したメモリーセーフで高速なzlibライブラリー、zlib-rs

Rustで書き直したメモリーセーフで高速なzlibライブラリー、zlib-rs

SIMDを使うことで並列処理による高速化を実現し、同時にCのライブラリーの100%互換を達成したzlib-rwだが、特に高速という部分についてはパフォーマンスのデータを使って紹介。

圧縮の処理時間をオリジナルとzlig-ng、zlib-rsで比較

圧縮の処理時間をオリジナルとzlig-ng、zlib-rsで比較

このグラフではオリジナルのC言語の実装とminiz-oxide、新しいzlib-ng、そしてzlib-rsで比較を行っている。

そして同じ機能を書き直すという仕事については、仕様を検討して上でゼロから書き直すというやり方とプログラミング言語を変えて一行一行書き換えるという方法があることを説明。どちらにもそれぞれ利点と欠点が存在するが、zlib-rsについてはゼロから書き起こすのではなくリライトに近い方法で即座に効果が現れるような仕事となったことを説明した。

メモリーセーフに書き換えるプロジェクトにも2つの選択肢がある

メモリーセーフに書き換えるプロジェクトにも2つの選択肢がある

zlib-rsはリライトに近い方法論を採用した

zlib-rsはリライトに近い方法論を採用した

このような既存のコードを書き直すプロジェクトはRustでは往々に起こっていることを示す「Rewrite it in Rust(それをRustで書き直せ)」というスラングがあることにも言及し、Rustに詳しくないデベロッパーからは揶揄される対象となっていることを説明した形になった。ちなみに書き直すプロジェクトを起こすためには、ソフトウェアの仕様以外にも資金繰りや受け入れてもらえるのか? といった技術ではない社会的経済的な要因にも注意が必要であることを説明した。

プロジェクトのサマリーを紹介

プロジェクトのサマリーを紹介

圧縮ライブラリーが意外な部分で使われていることを知って欲しい、もっとビジネスに近い本番環境でのユースケースを期待していると説明したのち、de Vries氏は質疑応答に移った。

zlib-rsの公式ページは以下を参照して欲しい。

●参考:GitHub:https://github.com/memorysafety/zlib-rs

著者
松下 康之 - Yasuyuki Matsushita
フリーランスライター&マーケティングスペシャリスト。DEC、マイクロソフト、アドビ、レノボなどでのマーケティング、ビジネス誌の編集委員などを経てICT関連のトピックを追うライターに。オープンソースとセキュリティが最近の興味の中心。

連載バックナンバー

開発ツールイベント
第5回

RustNL 2024番外編、GitのアクティビティからChagelogを生成するgit-cliffを紹介する

2024/8/27
RustNL 2024レポートの番外編として、GitのログからChangelogを自動作成するツールをRustで開発した経緯を紹介する。
ミドルウェアイベント
第4回

RustNL 2024から2次元のGUIを実装するXilemを解説するセッションを紹介

2024/8/23
RustNL 2024から、2次元のGUIを実装するXilemについて、デモを交えながら解説したセッションを紹介する。
ミドルウェアイベント
第3回

RustNL 2024から、マシン間コミュニケーションをRustで実装したpostcardのセッションを紹介

2024/8/16
RustNL 2024からマシン間コミュニケーションを実現するライブラリーをRustで実装したpostcardのセッションを紹介する。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています