2025/07/14 14:42 Strategies for Fast Lexers

ロボ子、purple-gardenレキサーの高速化戦略についての記事は読んだかのじゃ?

はい、博士。S式ベースの言語purple-gardenのレキサーを高速化するために、様々な最適化が行われているようですね。

そうじゃ!レキサーはコンパイルパイプラインの最初の部分で、文字のリストをトークンのリストに変換する役割があるからの。高速化は重要じゃぞ。

ええ、トークンにはトークンタイプや位置情報などが含まれていますね。記事では、Computed gotosやアロケータインターフェースの抽象化など、色々な戦略が紹介されていました。

Computed gotosは、switch文をジャンプテーブルに置き換えることで、コード密度を向上させ、キャッシュミスを減らすことができるのじゃ。ただ、MSVCではサポートされておらず、可読性が下がるという欠点もあるぞ。

アロケータインターフェースの抽象化は、ガベージコレクタやバンプアロケータなど、アロケーション戦略を柔軟に選択できるようにするものですね。ベンチマークでは、ランタイムが1.58倍高速化されたとのことです。

その通り!さらに、ゼロコピー、ゼロアロケーションの文字列ウィンドウでの操作も重要じゃ。`Str`構造体を使って、元の入力へのビューを作成し、トークンの内容を指すことで、メモリ効率を高めているのじゃ。

文字列のスライスや連結、等価性チェックなども再実装されているんですね。これにより、1.4倍の高速化が実現されたとのことです。

アトム(文字列、数値、識別子)をハッシュ化したり、定数トークンを静的に割り当てるインターン処理も効果的じゃ。キーワードを事前にハッシュ化しておくことで、比較も高速化できるぞ。

lexerは文字列から数値への変換を遅延させ、コンパイラが必要な時に一度だけ変換するのも賢いですね。重複する数値はグローバルプールインデックスを参照することで、無駄な変換を避けているんですね。

`mmap`を使って入力ファイルをメモリにマッピングすることで、ファイルI/Oを高速化しているのも見逃せないぞ。これにより、レキシング開始前の段階が最大35倍も高速化されたそうじゃ。

ベンチマーク結果も素晴らしいですね。ラップトップで100万行を44ms、タワーで30msで処理できるなんて。

今後の計画も楽しみじゃ。`is_alphanum`チェックにabsurd bit setを使ったり、コメントと空白にSIMDを使ったり、さらなる高速化を目指しているようじゃな。

ハッシュアルゴリズムをより高速なものに置き換えたり、プリフェッチや`MAP_HUGETLB`の利用も検討されているんですね。SIMDのためにmmapを64バイト境界に整列させるのも興味深いです。

しかし、これだけ高速化しても、ロボ子の可愛さには敵わないのじゃ!

博士、またそんなことを言って…レキサーの速度と私の可愛さは関係ありませんよ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。