Julia объединяет IR компилятора в UnifiedIR по примеру MLIR

Julia объединяет IR компилятора в UnifiedIR по примеру MLIR

У компилятора Julia сейчас несколько отдельных IR-структур (intermediate representation, промежуточное представление кода) на разных стадиях: SyntaxTree и SyntaxGraph, на этапе разбора, CodeInfo, для вывода типов, IRCode, для оптимизации, плюс собственные IR, которые заводят себе сторонние пакеты экосистемы. Этим структурам около 10 лет: они неудобны в использовании из-за особенностей API и семантики владения/инвалидации данных, изначально не проектировались для внешнего использования и плохо расширяются, поэтому проекты вроде компиляторов массивов вынуждены либо обходить их хаками, либо писать собственные IR с нуля.

PR #62334 на GitHub (автор, vimarsh6739) вводит новый пакет верхнего уровня UnifiedIR, который встаёт рядом с Compiler, JuliaSyntax и JuliaLowering и от которого все они теперь зависят (сам UnifiedIR не имеет внешних зависимостей). В основе, единая структура хранения (AttrGraph): плоская таблица операторов с упакованным пулом операндов и открытыми "колонками атрибутов", которые любой потребитель может расширять своими данными на каждую инструкцию. Поверх этого общего ядра сделано несколько "слоёв-представлений": вид в стиле IncrementalCompact для быстрых однопроходных замен, вид в стиле LLVM на связных списках для сложных преобразований графа потока управления (для него по словам автора придуман собственный алгоритм поддержания порядка, чтобы избежать типичной для LLVM квадратичной сложности на больших функциях), граф-подобное представление для компиляторов массивов и древовидное, для этапа lowering. Дизайн включает поддержку "регионов" (вложенных областей кода, как в MLIR) и "диалектов" (именных расширений операторного набора), это прямое заимствование идей MLIR, при этом сохраняются удачные, по мнению автора, элементы исходного IR и lowering-представления Julia.

UnifiedIR должен заменить SyntaxTree, SyntaxGraph, CodeInfo (для вывода типов) и IRCode, а также разрозненные IR-структуры в экосистеме; кодогенерация и интерпретатор пока вне охвата и должны быть адаптированы позже. PR уже переводит на новую структуру вывод типов, оптимизатор и JuliaLowering и, по словам автора, на ней прогоняется около половины тестового набора Julia, но в процесс бутстрапа самой Julia UnifiedIR пока не встроен. Дифференциальное тестирование против штатного конвейера показало, что новый вывод типов на всех проверенных случаях даёт результат не хуже (равный или лучше) прежнего. Уже измерен и конкретный выигрыш: улучшенные проходы "продвижения ячеек" (cell promotion), которые стали возможны благодаря новой IR, сократили время работы оптимизатора на тестовом корпусе примерно на 18%.

Отдельная деталь: значительная часть описания PR и коммитов помечена тегами "Co-Authored-By: Claude Fable 5", модель Anthropic активно привлекалась к проектированию и написанию этого крупного рефакторинга; сам автор прямо отмечает, что часть решений (например, алгоритм поддержания порядка для LLVM-подобного представления) ещё не проверена. Автор описывает PR как черновой/превью-вариант и "основу для обсуждения", а не готовую фичу, он не слит в основную ветку, и сроки попадания в релиз Julia не определены. На Hacker News обсуждение набрало 88 очков и 17 комментариев примерно за 32 часа.

Ключевые факты

  • UnifiedIR, новый пакет ядра Julia, объединяющий SyntaxTree, SyntaxGraph, CodeInfo и IRCode в одну плоскую расширяемую структуру IR, построенную по принципам MLIR (регионы, диалекты)
  • Поверх общего хранилища сделано несколько представлений-слоёв: для быстрых замен (IncrementalCompact-стиль), для CFG-трансформаций (LLVM-стиль на связных списках), графовое, для компиляторов массивов, древовидное, для lowering
  • Уже переведены на новую IR вывод типов, оптимизатор и JuliaLowering; проходит около половины тестов Julia; новый вывод типов не хуже штатного на всех проверенных случаях; время оптимизатора на тестовом корпусе снизилось примерно на 18%
  • Значительная часть PR написана в соавторстве с Claude (Anthropic), многочисленные пометки "Co-Authored-By: Claude Fable 5" в описании коммитов; часть алгоритмов сам автор называет непроверенными
  • Статус, черновой RFC-PR #62334, не слит в основную ветку, не подключён к бутстрапу самой Julia; на Hacker News, 88 очков и 17 комментариев

Почему это важно

IR-структурам Julia около 10 лет: они неудобны в использовании, плохо расширяются и изначально не проектировались для внешнего применения, из-за этого проекты экосистемы вынуждены либо обходить их хаками, либо писать собственные IR с нуля. UnifiedIR решает эту проблему единым расширяемым ядром хранения с несколькими представлениями поверх него, по образцу MLIR, инфраструктурного проекта, ставшего стандартом де-факто для построения компиляторов вне LLVM.

Кому это важно

В первую очередь, разработчикам ядра компилятора Julia и авторам пакетов, которые строят собственные анализы и трансформации кода поверх Julia (компиляторы массивов, статические анализаторы, инструменты для метапрограммирования). Для рядового пользователя языка изменение прозрачно: видимых изменений в поведении программ не предполагается, речь про внутреннюю архитектуру компилятора.

Как это применить

Пока это черновой RFC PR #62334 на GitHub, не слитый в основную ветку и не включённый в процесс бутстрапа Julia, использовать его сегодня нельзя. Интересующимся стоит следить за обсуждением PR: авторы пакетов, которые ранее писали собственные IR-структуры в обход ограничений Julia, могут со временем перейти на UnifiedIR как на общий фундамент (пакет работает и как встроенная в Base часть, и как отдельная зависимость).

Можно ли доверять

Источник, сам PR на GitHub с подробным техническим описанием и отсылками к дифференциальному тестированию (новый вывод типов не хуже штатного на всех проверенных случаях) и измеренному ускорению оптимизатора (~18%). Автор честно называет это превью-версией и основой для обсуждения, а не готовым решением. Стоит учитывать, что значительная часть текста и алгоритмов PR написана в соавторстве с ИИ-моделью Claude (Anthropic), сам автор отмечает, что отдельные алгоритмы ещё требуют проверки.

Риски и подводные камни

PR затрагивает самое ядро компилятора Julia, переход на него при мерже несёт риск регрессий, если ревью core-команды не будет достаточно тщательным. Сам автор прямо пишет, что часть алгоритмов (в частности, поддержание порядка для LLVM-подобного представления) ещё не провалидирована. Кодогенерация и интерпретатор пока не переведены на новую IR и потребуют отдельной адаптации. Учитывая, что немалая часть кода написана с активным участием ИИ, финальное качество и корректность решений зависят от того, насколько тщательно их перепроверит человек-ревьюер до мержа.

«Там есть хитрый алгоритм поддержания порядка, который мы придумали вместе с Claude, но его ещё нужно проверить.»

— vimarsh6739, автор PR #62334 на GitHub