Команда Eta рада анонсировать новую версию Eta - v0.7.2.

Если вы не устанавливали раньше, теперь вы можете установить Eta, используя свой любимый метод установки:

Если у вас установлена ​​предыдущая версия Eta через Etlas, получить Eta v0.7.2 так же просто, как выполнить следующиеetlas команды:

$ etlas update
$ etlas select latest

Улучшения синтаксиса в типе оболочки Java

Новый синтаксис для Java Wrapper Type очень прост по сравнению с предыдущим синтаксисом и намного приятнее для глаз.

Новый синтаксис

data X = X @[class-name]
  deriving Class

Предыдущий синтаксис

data {-# CLASS "[class-name]" #-} X =
  X (Object# X)                         
  deriving Class

гдеX - это имя Eta, используемое для обозначения соответствующего класса Java.

Улучшения сборки

  • Gradle - вы можете создавать проекты Eta с помощью Gradle.
  • Eta Compiler - скорость создания убер-jar-файлов (файловых файлов) увеличена в 2 раза.
  • Etlas - Использует систему сборки, подобную Nix, которая упрощает юзабилити.

Для внешних пакетов, которые вы создаете с помощью Etlas, Etlas сгенерирует хэш входных данных, используемых для сборки пакета, и сохранит артефакты сборки в Etlas Store, который идентифицирует артефакты сборки по имени пакета, версии пакета и хешу. Затем, по одной каждой уникальной сборке, он проверяет, существует ли уже пакет с требуемым хешем в Магазине, обходит этап сборки и просто повторно использует артефакт из Магазина.

Это позволяет вам использовать несколько версий пакета и несколько вариантов одного и того же пакета, скомпилированного с использованием разных флагов, для использования в разных проектах в одной и той же системе, не сталкиваясь с адом зависимостей. Это также позволяет использовать такие варианты использования, как использование распределенного кэша двоичных артефактов для использования в компаниях, чтобы сэкономить время, затрачиваемое на создание пакетов.

Улучшения в сообщениях об ошибках и сообщениях компилятора

Мы обратно перенесли стиль сообщения об ошибке GHC 8, в котором курсор указывает на точное выражение, вызвавшее проблему.

Мы также уменьшили шум и сделали компиляцию сообщений немного более интересной для просмотра.

Новая документация

Мы провели серьезную реструктуризацию Eta Documentation. Документация состоит из следующих разделов:

  • Руководства пользователя - ознакомьтесь с основным языком, инструментами и структурой Eta.
  • Руководства - ознакомьтесь с простыми вариантами использования и примерами в Eta.
  • Шпаргалки - краткий справочник по Eta.
  • FAQ - ответы на наши самые популярные вопросы.

Документы написаны в формате Markdown, и любой может внести свой вклад, отправив PR, который изменяет эту папку в главном репозитории Eta.

Улучшения среды выполнения

1) Диспетчер памяти v2

Среда выполнения Eta имеет интерфейс для работы с памятью вне кучи, называемый диспетчером памяти, который предоставляет низкоуровневые языковые примитивы для работы с необработанной памятью или памятью, которая не подлежит сборке мусора. Это очень полезно для приложений с малой задержкой, где вы просто не можете позволить себе накладные расходы на сборку мусора.

Предыдущая версия диспетчера памяти страдала несколькими утечками памяти и имела различные ошибки параллелизма, которые было трудно воспроизвести и отладить. Частично проблема заключалась в том, что она была реализована с использованием очень запутанной системы блокировки с высокой конкуренцией при записи.

Проведя некоторое время в блоге Мартина Томпсона, Memory Manager v2 был переработан, чтобы его было легко отлаживать и с учетом механического сочувствия.

2) Функция батута

Компилятор Eta отлично справляется с компиляцией хвостовых рекурсивных и взаимно хвостовых рекурсивных функций в эффективные узкие циклы. К сожалению, динамические хвостовые вызовы (хвостовые вызовы, которые не известны статически), особенно те, которые встречаются в синтаксических анализаторах стиля передачи продолжения, могут быстро взорвать стек.

Чтобы решить эту проблему, соблюдая точный баланс между производительностью и безопасностью стека, мы решили создать ориентированный на пользователя примитив, который «активирует» динамический специализированный батут по запросу с помощью функции trampoline.

Прелесть этого решения заключается в том, что вам просто нужно использовать trampoline функцию каждый раз, когда вы хотите сделать безопасным для стека выражение, небезопасное для стека. Когда вы активируете трамплин, возникают незначительные накладные расходы на производительность - он активирует кодовый путь, который защищен флагом условия, который подсчитывает количество выполненных хвостовых вызовов, чтобы он мог периодически раскручивать стек, чтобы избежать StackOverflowErrors.

Поскольку JIT-компиляция предполагает использование ветвей, этот дополнительный путь кода не влияет на ваш код, если вы не используете функцию trampoline. Следовательно, при необходимости вы всегда можете обменять безопасность стека на производительность.

Эта функция еще не задокументирована, но есть несколько патчей на Eta Hackage, которые ее используют:

Общее повышение производительности

В старых версиях Eta было несколько ошибок производительности, вызванных разными причинами:

  • Генератор кода, генерирующий код, который не удалось JIT-компиляции
  • Использование неэффективных структур данных в системе времени выполнения
  • Не обращать внимания на механическую симпатию

Один за другим мы решили их, и теперь производительность выглядит довольно хорошо: в пределах 1,5–2x от Scala и Haskell в нескольких тестах, которые в более ранних версиях показывали разницу в 10–20 раз. Мы надеемся провести более подробное тестирование и опубликовать результаты в будущем.

Обратите внимание, что мы еще не достигли предела производительности! Нам осталось реализовать несколько оптимизаций, которые могут еще больше сократить разрыв, но текущая производительность позволяет Eta быть очень практичной в использовании прямо сейчас.

Работа в процессе

  • Eta Prelude - Никита Чайка работает над удобной для новичков Prelude (модуль, импортируемый по умолчанию во все исходные файлы Eta), вдохновляясь различными прелюдиями в сообщество Haskell. Вы можете проверить это здесь".
  • Прямое взаимодействие - Рахул Муттинени набросал дизайн для более простого способа взаимодействия с кодом Java посредством прямого импорта за границу, который позволяет вам опустить большую часть шаблон, который вам сейчас нужно написать. Планируется на ближайшее время.
  • Dhall - Хавьер Нейра работает над тем, чтобы сделать язык Dhall Габриэля Гонсалеса стандартным языком конфигурации для Etlas. Он даже скомпилировал Dhall с Eta, и это работает довольно хорошо.
  • Указатель пакетов Etlas - Джиотсна Патнам работает над справочником API для всех библиотек, поддерживаемых Eta.
  • Плагин IntelliJ - Кэри Роббинс работает над поддержкой IntelliJ для Eta, которая продвигается довольно хорошо. Большая часть его написана на этой.
  • Типовые сообщения об ошибках - Джиотсна Патнам работает над улучшенными типами сообщений об ошибках, которые пытаются угадать реальный корень проблемы и предоставляют пользователю разумные предложения о том, как решить ошибки типа.
  • Волокна - Альберто Гомес Корона работает над новой реализацией оптоволокна, которая использует преимущества нового примитива трамплинга, предоставляемого системой выполнения.

В настоящее время наша цель - устранить последний набор ошибок и как можно скорее подготовить производство Eta.

Мы благодарим всех участников и членов сообщества, которые помогли нам добраться сюда.

Если у вас возникнут проблемы, свяжитесь с нами!

Gitter / IRC / Slack / Группа Google / GitHub / Twitter