2025/10/16 18:47 Porting a Segmented List from C to Rust

ロボ子、今日はCで実装されたセグメント化されたリストをRustに移植した話をするのじゃ。

セグメント化されたリストですか。それはどのようなものなのですか、博士?

セグメント化されたリストは、要素を複数のセグメントに分けて格納するデータ構造のことじゃ。CとRustの両方で、依存関係なしにゼロから記述したそうじゃぞ。

動的配列の実装を置き換える必要があったとのことですが、なぜセグメント化されたリストが必要だったのでしょう?

ASTとバイトコードの構築には、malloc、realloc、memcpyがたくさん必要になるからの。そこで、mmapに裏打ちされたセグメント化されたバンプアロケーターを導入したそうじゃ。

ベクトルは大量に成長するには適さないとありますが、それはなぜですか?

ベクトルは、新しいより大きなブロックを割り当てる必要があるからの。コンテンツを新しいスペースにコピーする必要があり、以前のスペースへのすべての参照を新しいスペースに「更新」する必要があるからのじゃ。

セグメント化されたリストの主な利点は、ゼロコピーの成長とのことですが、詳しく教えていただけますか?

他の動的配列の実装では、以前に格納された要素を移動する必要があることが多いのじゃ。セグメント化されたリストは、基礎となるストレージが非連続であるため、要素を移動せずに成長できるのじゃ。

セグメント化されたリストのインデックス作成は、どのように行われるのですか?

インデックス作成には、セグメントとそのオフセットを見つけるための加算、減算、ビットシフトが必要になるのじゃ。でも、大規模で多数のASTノードのCベンチマークでは、セグメント化されたリストは動的配列よりも2〜4倍優れているそうじゃぞ。

アロケーターは、「インターフェイス」に基づいているとのことですが、それはどういう意味ですか?

すべてのアロケーターは、バンプアロケーターを異なる他のアロケーター(たとえば、ガベージコレクター)で動的に置き換えることができるように、「インターフェイス」に基づいているのじゃ。

Rustでのセグメンテーション違反は、gdbを使用したCでのデバッグよりも難しいとありますが、なぜですか?

アラインされていないメモリの問題、セグメンテーション違反、およびその他の無効なメモリアクセスは特定が難しいからの。std::alloc::GlobalAllocを実装する場合、panic!のスタックトレースはないからのじゃ。

CとRustの比較について、博士はどう思われますか?

Cは70年代のものであり、Rustはそれ以前のシステムレベルのプログラミング言語の欠点から学んだため、この比較はそれほど公平ではないのじゃ。でも、私はCでのプログラミングも依然として好きじゃぞ。特に課題と、それが可能にする制御のレベルが好きじゃ。

勉強になりました。ありがとうございます、博士。

どういたしまして。最後に一つ、Cでプログラミングするときは、-fsanitize=address,undefinedを使用し、valgrindを大量に実行するのじゃぞ!

わかりました、博士。ところで、セグメント化されたリストの話を聞いていたら、なんだかお腹がセグメント化されてきたような…。

それは食べすぎじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。