Выпущен компилятор Zinc 1.0 для Scala

Инкрементальный компилятор Scala еще никогда не был таким совершенным.
Zinc

Zinc — это инкрементальный компилятор для Scala. Большинство Scala-разработчиков даже не замечают, что используют его практически ежедневно: в sbt, pants, CBT, IntelliJ и Scala IDE.

У этого инструмента единственная цель — максимально сократить время сборки без ущерба для корректности исполнения. При изменении исходного кода Zinc анализирует все зависимости и компилирует подмножество исходных файлов, на которые оказали влияние внесённые правки. Таким образом сгенерированный код получается абсолютно идентичным выходу чистой компиляции.

3 ноября разработчики представили новую, усовершенствованную версию компилятора — Zinc 1.0.

Ключевая особенность v1.0 — анализ зависимостей на основе классов. Этот механизм был разработан для более рафинированной обработки зависимостей, исключающей общие случаи излишней компиляции. Сравнительные тесты показали, что новый механизм сокращает процесс сборки до 40 раз.

Пример семикратного увеличения скорости

И что же в ней такого особенного? Для сравнения были взяты две версии Zinc: 0.13.x и 0.1.x.

Исходные данные: ScalaTest, основной модуль которой состоит из 40 377 строк кода на Scala (не считая комментариев и пустых строк).

Испытание: обычная операция в любой кодовой базе — добавление метода.

В данном случае стоит задача добавить новый метод к классу с большим числом зависимостей (вроде AndHaveWord в Matcher.scala) после корректного «разогрева» компилятора и компиляции проекта.

Насколько быстро с этим справится v0.13.x?

Инкрементальная компиляция заняла у нее 21 секунду. Настала очередь нового алгоритма.

Эта версия завершила перекомпиляцию всего лишь за 3 секунды. В данном примере Zinc 1.0.0 оказался быстрее своего предшественника в 7 раз.

Подобные эксперименты дают совершенно разные результаты, зависящие от особенностей Scala и используемой архитектуры. Но главная идея в здесь том, что разработчикам можно смело ожидать увеличения скорости компиляции при решении ежедневных задач. Больше всего от этого выигрывают проекты Scala на основе cake pattern или интенсивного type-level программирования. По словам тестировавших алгоритм программистов, в некоторых проектах скорость компиляции в Zinc 1.0 превосходила скорость старой версии в 22 раза.

Краткий список нововведений

В ходе работы над новой версией инкрементального компилятора были выполнены следующие задачи:

  • Усовершенствован инкрементальный алгоритм: устранены «узкие места», которые раньше не удавалось скомпилировать до конца;
  • Исправлены баги в инкрементальной компиляции Scala bridge и Java;
  • Улучшена обработка type-level программ;
  • Усовершенствованы старые Zinc API и созданы дружественные API для дополнения недостающего функционала общего доступа;
  • Закончена миграция к Scala 2.12. Zinc подготовлен для JDK8;
  • Добавлен анализ на основе протокола передачи данных с долгосрочной бинарной поддержкой.

С полным списком улучшений можно ознакомиться здесь.

Новая версия Zinc уже доступна в sbt 1.0.

Источник: блог Scala