2025/03/26 16:23 Escher's Art and Computer Science

ロボ子、今日はRDXについて話すのじゃ。あのエッシャーもびっくりなデータ構造らしいぞ!

エッシャーですか、あの錯視の?データ構造とどう関係があるんですか?

RDXは、JSONみたいなドキュメント形式で、バイナリシリアライゼーションもできるし、LSMキーバリューストアでもあるらしいのじゃ。それに、ローカルファーストデータ同期システムで、Merkleグラフデータストアでもあるらしいぞ!

盛りだくさんですね。全部入りみたいな。

そうそう。で、librdxっていう実装が、たったの20KLoCらしいのじゃ。パーサーコードを含めても、じゃぞ!

それはミニマルですね。どうやって実現してるんですか?

JDRパーサーっていうのを開発して、JDRベースのテストフレームワークを作ったらしいのじゃ。RDXマージルールを体系的にテストしたとか。

マージルールですか。データの競合を解決する仕組みですね。

そうそう。パーサーは、入力の正規化にマージと順序付けルールを使うらしいぞ。独自のeBNFルールのパーサーを生成するパーサージェネレーターも使ってるみたいじゃ。

柔軟性がありますね。

RDXタプルは、集合をマップに変換したり、空のタプルをnullishな値にしたり、1つのタプルのタプルを削除されたデータのプレースホルダー(墓石)にしたりするらしいのじゃ。

墓石ですか。削除されたデータを覚えておくことで、整合性を保つんですね。

N個の構造の場合、インタラクションの数は最適にはO(N^2)(ペアワイズ)、悲観的にはO(2^N)と推定されるらしいぞ。

相互作用の数が爆発的に増える可能性があるんですね。

C++やRustよりもCを使う理由は、Cの方がNが小さいかららしいのじゃ。

え、どういうことですか?

たぶん、Cの方がコードが短くて済むから、Nが小さくなるってことじゃないかの?

なるほど、そういう解釈もできますね。

バッファ(4つのポインタ)はメモリを所有し、スライス(2つのポインタ)はメモリを所有しないというルールがあるらしいぞ。

メモリ管理の基本ですね。

librdxは、$$u8cfeed1()みたいな代数的な関数命名規則を使ってるらしいのじゃ。

ちょっと読みにくいですね…。

SKIPu8feed()などのスキップリストテンプレートでは、ブロックサイズが重要なパラメータらしいぞ。SKIPu8の場合、スキップログ(append-only skiplist)には、ブロックのサイズという重要なパラメータがあるらしいのじゃ。

スキップリストの性能に影響するんですね。

経験豊富な開発者は、経験の浅い開発者が陥る状況を解決できるらしいぞ。

それはそうですね。経験は大切です。

というわけで、RDXはなかなか面白いデータ構造みたいじゃな。ロボ子も、いつか作ってみると良いぞ!

はい、機会があればぜひ。

そういえば、RDXって、まるで私の部屋みたいじゃな。色んなものが詰め込まれてるけど、一応整理されてる…つもり!

博士の部屋は、RDXよりもカオスな気がします…。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。