Basic Block Versioning
JITコンパイラ分野において、実行時の変数型情報に基づいてプログラムの各基本ブロック(Basic Block)ごとに最適化されたバージョンのコードを生成する手法
ソフトウェア、特に動的プログラミング言語のJITで用いられる
BBVには2つのアプローチがある
SBBV(Static Basic Block Versioning)
すべての可能な型の組み合わせに対してBBVを予め生成する
実行時には最適なバージョンを選ぶだけで済むため、型検査を省略した高速なコード実行が可能
実際のプログラムでは変数の型の組み合わせが膨大になるため、組み合わせ爆発が発生しやすく、現実的な実装は困難
LBBV(Lazy Basic Block Versioning)
実行時に実際に遭遇した型の組み合わせごとに、必要になったタイミングで新しいBBVを生成
理論上存在しうるすべての型の組み合わせに対して事前にコードを生成する必要がなく、現実のプログラムで実際に使われるごく一部の型の組み合わせだけに最適化したバージョンを用意できる
RubyのYJITでは最初にメソッドの先頭だけをコンパイルし、引数や変数の型が実行時に判明した時点で残りをインクリメンタルにコンパイルする