25.02.2021

Релиз языка программирования Haxe 4.2

Доступен релиз тулкита Haxe 4.2, включающего одноимённый мультипарадигменный высокоуровневый язык программирования со строгой типизацией, кросс-компилятор и стандартную библиотеку функций. Проектом поддерживается трансляция в С++, HashLink/C, JavaScript, C#, Java, PHP, Python и Lua, а также компиляция в байт-код JVM, HashLink/JIT, Flash и Neko, с доступом к родным возможностям каждой целевой платформы. Код компилятора распространяется под лицензией GPLv2, а стандартной библиотеки и развиваемых для Haxe виртуальных машин HashLink и Neko под лицензией MIT.

Язык является expression-ориентированным со строгой типизацией. Поддерживаются приёмы объектно-ориентированного, обобщённого и функционального программирования. Синтаксис Haxe близок к ECMAScript и расширяет его такими возможностями как статическая типизация, автовывод типов, сопоставление шаблонов, дженерики, основанный на итераторах цикл «for», AST-макросы, GADT (Generalized Algebraic Data Types), абстрактные типы, анонимные структуры, упрощённые определения массивов, выражения для условной компиляции, прикрепление метаданных к полям, классам и выражениям, интерполяция строк (‘My name is $name’), параметры типов (‘new Main<String>(«foo»)’) и многим другим.


class Test { static function main() { final people = [ "Elizabeth" => "Programming", "Joel" => "Design" ]; for (name => job in people) { trace('$name does $job for a living!'); } }
}

Новые возможности версии 4.2:

  • Объявление статичных переменных и функций на уровне модуля, без необходимости оборачивания в класс.
  • Поддержка «классических» абстрактных классов и функций.
  • Нативная реализация вариативных функций для всех целевых платформ (haxe.Rest) и добавление оператора развертывания аргументов «f(…array)».
  • Реализация цикла событий (event loop) для отдельных потоков («sys.thread.Thread.events»).
  • Метаданные «@:inheritDoc» для наследования документации типов/полей.
  • Поддержка перегрузки методов для внешних методов на всех целевых платформах.
  • Пересылка в абстракт конструктора, лежащего в основе его типа с помощью метаданных «@:forward.new».
  • В «haxe.macro.Expr» добавлен конструктор «EIs» .
  • Возможность сделать абстрактный тип вариантным с «@:forward.variance».
  • Представление типа «Any» как «Dynamic» при унификации вариантности.
  • В пакет «haxe.exceptions» добавлены некоторые базовые типы исключений.
  • Поддержка прикрепления метаданных при объявлении переменных.
  • Функция «StringTools.unsafeCharAt», используемая при строковой итерации.
  • eval (интерпретатор): в пакете «eval.luv» добавлены привязки к «libuv».
  • eval: привязки к родным реализациям «Int64» и «UInt64» через пакет «eval.integers».
  • cs: реализация UDP сокета.
  • cs: модуль «cs.Syntax» для inline-вставок C#-кода.
  • jvm: Добавлен флаг «-D jvm.dynamic-level=x» для контроля количества генерируемых оптимизаций у динамического кода. 0 = отсутствуют, 1 = оптимизация чтения/записи полей, 2 = замыкания методов на этапе компиляции.
  • java, jvm: Поддержка флага «—java-lib <директория>».
  • python: реализация threading API.

Общие улучшения:

  • «expr is SomeType» не требует оборачивания в скобки.
  • Увеличен приоритет у расширений типов «@:using» .
  • Разрешено использование статических расширений типа через «super».
  • Возможность задавать метаданные полям «@:noDoc».
  • Абстрактный тип «Map» сделан транзитивным.
  • Поддержка «@:native» на конструкторах перечислений.
  • Поддержка «@:using» на объявлениях типа («typedefs»).
  • Мультистроковые ошибки используют «…» как префикс для последующих строк.
  • Переработан вывод типов, анонимные структуры лучше преобразуются в явные типы и «закрываются» по завершению функции.
  • Вывод типа функций без аргументов как «()->…» вместо «Void->…».
  • Ключевое слово «function» разрешено в качестве имени пакета.
  • Улучшено встраивание (inlining) объектов.
  • cs: Добавлена поддержка .NET 5.0.
  • cpp: Поддержка нативных конструкторов у внешних классов.
  • php: Добавлен «php.Syntax.customArrayDecl» для объявления нативного массива.
  • php: Обновлены внешние методы (externs) для различных функций и классов.
  • php: Оптимизирована реализация анонимных структур.
  • hl: Пропуск компиляции при отсутствии изменений в модулях.
  • lua: Использование «hx-lua-simdjson» для парсинга json.
  • jvm: Снижена нагрузка на CPU в реализации «sys.thread.Lock».
  • js: Улучшена совместимость с Google Closure Compiler.
  • Null Safety: Учёт «@:nullSafety(Off)» при объявлении переменных: «var @:nullSafety(Off) v».

Также до новой версий компилятора обновлено дополнение к редактору VSCode, в котором появились подсказки с генерацией недостающих полей интерфейсов, простых и абстрактных классов, а также методов свойств.

Источник.