V Red Hat nový lehký JIT kompilátor , který zajišťuje spuštění kódu dříve převedeného do mezilehlé reprezentace MIR (Medium Internal Representation, nezaměňovat s jinou mezilehlou reprezentací) (střední úroveň IR) používaná v kompilátoru Rust). Cílem projektu je poskytnout rámec pro implementaci rychlých a kompaktních interpretů a JITů. Kód projektu je napsán v jazyce C a pod licencí MIT.
V současné fázi vývoje jsou překladače do mezilehlé reprezentace MIR připraveny na a bitový kód (Bitcode), ale v budoucnu se plánuje implementace možnosti generování MIR pro WebAssembly, Java bytecode, (Common Intermediate Language), Rust a C++. Projekt vyvíjí jeden z vývojářů JIT enginu. , používaný v Ruby. JIT založený na MIR je plánován k implementaci primárně pro и V budoucnu se také nevylučuje možnost portování GCC pro použití MIR.
Mezikód MIR lze reprezentovat v binární a textové (čitelné) podobě. Tento kód lze spustit v interpretu a generovat z něj strojový kód (x86_64, s plány pro ARM64, PPC64 a MIPS64). Je také možná zpětná konverze – z MIR do CIL, bajtkódu Java, WebAssembly a kódu C.
Mezi klíčové vlastnosti MIR patří silné typování, podpora modulů a funkcí a sada instrukcí pro konverzi typů, porovnávání, aritmetické a logické operace, větvení a další. Moduly, které zahrnují sadu funkcí převedených do formátu MIR, lze načíst jako knihovny a také načíst externí kód v jazyce C.
Klíčovou výhodou spouštění mezikódu v JIT namísto jeho kompilace do nativních spustitelných souborů je schopnost generovat kompaktní soubory, které lze spustit bez rekompilace na různých hardwarových architekturách (x86, ARM, PPC, MIPS). Pro nepodporované architektury je k dispozici interpretovaný režim, který je v případě MIR 6–10krát pomalejší než JIT.
Mezi nedostatky stávajících JIT kompilátorů
GCC a LLVM jsou kritizovány za svou nadměrnou rozložitost, pomalou kompilaci a obtížnost implementace kombinovaných optimalizací napříč různými programovacími jazyky. Vývojáři MIR se pokusili tyto problémy řešit.
problémy a stanovené cíle:
- Kompilace v MIR by měla být alespoň 100krát rychlejší než v GCC;
- JIT pro spuštění MIR musí být velmi kompaktní a musí obsahovat přibližně 15 tisíc řádků kódu;
- Spuštění MIR pomocí JIT by nemělo být o více než 30 % pomalejší než výkon spustitelného souboru kompilovaného ze stejného kódu C v GCC (s optimalizací "-O2");
- Inicializační fáze před zahájením skutečného provádění by měly trvat 100krát kratší dobu;
- Reprezentace MIR pro JIT musí být 100krát menší než spustitelný soubor zkompilovaný v GCC.
Ve své současné podobě implementace MIR daleko předčí své původní cíle: testy ukázaly, že kompilační výkon MIR je 178krát rychlejší než GCC-O2, výkon provádění je o 6 % pomalejší než u nativního kódu, velikost kódu je 144krát menší a implementace MIR JIT má 16 000 řádků kódu.
Zdroj: opennet.ru
