Do kódovej základne implementácie referenčného jazyka Ruby bol pridaný nový JIT kompilátor ZJIT, ktorý je umiestnený ako ďalšia generácia Ruby JIT. ZJIT bude zahrnutý v ďalšej hlavnej verzii Ruby 3.5, kde bude dostupný ako voliteľná možnosť spolu s JIT kompilátorom YJIT a môže ho nahradiť v Ruby 3.6. Rovnako ako YJIT, aj nový kompilátor JIT je napísaný v jazyku Rust. Oba JIT kompilátory vytvoril tím vývojárov v Shopify ako súčasť iniciatívy na zlepšenie výkonu programov Ruby, ktoré používajú framework Rails a volajú veľa metód.
Na rozdiel od YJIT, nový JIT kompilátor neprekladá bajtkód virtuálneho stroja YARV do nízkoúrovňovej medzireprezentácie (v podstate takmer priamo do strojového kódu), ale transformuje bajtkód do vysokoúrovňovej medzireprezentácie SSA (Static Single Assignment), nad ktorou je možné implementovať ďalšie optimalizačné fázy a optimalizáciu vykonávať s ohľadom na veľké bloky kódu, a nie spoliehať sa len na aktuálne operácie.
ZJIT vykonáva kompiláciu celej metódy naraz, zatiaľ čo YJIT dokáže spracovať iba kompiláciu základných blokov. Pre profilovanie typov implementuje ZJIT klasickú architektúru JIT, ktorá používa nahromadené historické dáta typov interpreta namiesto techniky Lazy Basic Block Versioning (LBBV) používanej v YJIT.
Použitie vysokoúrovňového IR vyrieši problémy so škálovateľnosťou, ktoré má YJIT, položí základy pre budúcu implementáciu viacúrovňovej JIT kompilácie, umožní pokročilé optimalizácie (ako napríklad agresívnejšie inline nasadenie) a uľahčí prispôsobenie JIT rôznym platformám. Návrat k tradičnému modelu profilovania typov odstráni zložitosť kódu a umožní zapojiť sa novým prispievateľom (použitie LBBV v YJIT malo za následok, že projekt bol pre ostatných prispievateľov nejasný a vyvíjali ho iba zamestnanci Shopify).
Zdroj: opennet.ru
