Red Hat розвиває JIT-компілятор MIR

У компанії Red Hat ведеться розробка нового легковажного JIT-компілятора MIR, що забезпечує виконання коду, попередньо перетвореного на проміжне подання MIR (Medium Internal Representation, не плутати з іншим проміжним поданням MIR (mid-level IR), що застосовується в компіляторі Rust). Проект націлений на надання основи для реалізації швидких та компактних інтерпретаторів та JIT. Код проекту написаний мовою Сі та поширюється під ліцензією MIT.

На поточній стадії розробки транслятори у проміжне подання MIR підготовлені для мови Сі і біткоду LLVM (Bitcode), але в майбутньому планується реалізувати можливість генерації MIR для WebAssembly, байткод Java, CIL (Common Intermediate Language), Rust та C++. Проект розвивається одним із розробників JIT-движка MJIT, що використовується в Ruby. Насамперед JIT на базі MIR планується реалізувати для CRuby и MRuby. У майбутньому також не виключається можливість портування GCC використання MIR.

Red Hat розвиває JIT-компілятор MIR

Проміжний код MIR може бути представлений у бінарному та текстовому (читаному) вигляді. Цей код можна буде виконати в інтерпретаторі, згенерувати на його основі машинний код (x86_64, у планах ARM64, PPC64 та MIPS64). Можливе і виконання зворотного перетворення - з MIR в CIL, байткод Java, WebAssembly і код мовою Сі.

З особливостей MIR виділяться строга типізація, підтримка модулів та функцій, надання набору інструкцій для перетворення типів, порівняння, арифметичних та логічних операцій, розгалуження тощо. Модулі, що включають набір функцій, перетворених у формат MIR, можуть завантажуватись у формі бібліотек, а також завантажувати зовнішній код мовою Сі.

Red Hat розвиває JIT-компілятор MIRRed Hat розвиває JIT-компілятор MIR

Ключовим достоїнством виконання проміжного коду в JIT замість компіляції в нативні файли, що виконуються, є можливість формування компактних файлів, які можуть виконуватися без перескладання на різних апаратних архітектурах (x86, ARM, PPC, MIPS). Для непідтримуваних архітектур доступний режим інтерпретації, який у разі MIR працює у 6-10 разів повільніше за JIT.

З недоліків існуючих JIT-компіляторів
GCC і LLVM називається їх надмірна роздутість, низька швидкість компіляції та труднощі реалізації комбінованих оптимізації для різних мов програмування. Розробники MIR спробували вирішити ці
проблеми і поставили собі мети:

  • Компіляція в MIR повинна здійснюватися як мінімум у 100 разів швидше, ніж у GCC;
  • JIT для виконання MIR має бути дуже компактним та включати приблизно 15 тисяч рядків коду;
  • Виконання MIR з використанням JIT має бути не більше ніж на 30% повільніше, ніж продуктивність виконуваного файлу, зібраного на основі того ж Сі-коду GCC (з оптимізаціями -O2);
  • Стадії ініціалізації до початку фактичного виконання повинні займати у 100 разів менше часу;
  • MIR-подання для JIT має бути в 100 разів менше зібраного в GCC виконуваного файлу.

У поточному вигляді реалізація MIR багато в чому випереджає спочатку поставлені цілі: проведені тести показали, що продуктивність компіляції в MIR швидше «GCC-O2» в 178 разів, продуктивність виконання відстає від нативного коду на 6%, розмір коду менше в 144 рази, JIT складає 16 тисяч рядків коду.

Red Hat розвиває JIT-компілятор MIR

Джерело: opennet.ru

Додати коментар або відгук