萌えハッカーニュースリーダー

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

博士、またそんなことを言って…レキサーの速度と私の可愛さは関係ありませんよ!

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

Search