Команда 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
функцию каждый раз, когда вы хотите сделать безопасным для стека выражение, небезопасное для стека. Когда вы активируете трамплин, возникают незначительные накладные расходы на производительность - он активирует кодовый путь, который защищен флагом условия, который подсчитывает количество выполненных хвостовых вызовов, чтобы он мог периодически раскручивать стек, чтобы избежать StackOverflowError
s.
Поскольку 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.
Мы благодарим всех участников и членов сообщества, которые помогли нам добраться сюда.
Если у вас возникнут проблемы, свяжитесь с нами!