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

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

Язык является expression-ориентированным со строгой типизацией. Синтаксис Haxe основывается на ECMAScript и расширяет его такими возможностями, как статическая типизация, автовывод типов, сопоставление шаблонов, дженерики, основанный на итераторах цикл «for», AST-макросы, GADT, абстрактные типы и многое другое.

Основные нововведения версии 4.0:

  • Новый синтаксис для указания типа функций «(name:String, age:Int)->Bool» или «(String, Int)->Bool» вместо «String->Int->Bool».
  • Синтаксис стрелочных функций «(a, b) -> a + b» вместо «function(a, b) return a + b».
  • Защита от проблем, связанных с использованием значений Null (экспериментальная функция, включается при желании для определённых полей, классов или пакетов).
  • Ключевое слово «final» для полей классов и локальных переменных, которые являются иммутабельными. Также можно использовать для определения функций чтобы запретить их переопределение при наследовании и для классов/интерфейсов, которые не могут быть наследованы.
  • Поддержка стандарта Unicode для базового типа «String» на всех целевых системах за исключением Neko.
  • Встроенный интерпретатор был переписан с нуля и теперь известен как Eval, благодаря чему скрипты и макросы выполняются намного быстрее, также имеет поддержку интерактивной отладки.
  • Новый таргет Hashlink — высокопроизводительный runtime, разработанный специально для Haxe, поддерживающий компиляцию в bytecode + JIT или C, имеет простую интеграцию с C, а также доступ к низкоуровневым числовым типам и указателям.
  • Новый таргет JVM — позволяет генерировать jvm байт-код пропуская этап компиляции Java-кода через добавление флага «-D jvm» при таргетировании в Java.
  • Возможность inline-развёртывания на месте вызова функций или конструкторов, даже если они не объявлены таковыми.
  • Возможность включения статических расширений при объявлении типа (например «enum») с помощью «@:using(path.ToExtension)».
  • Абстрактные типы теперь поддерживают «set»-версию оператора «@:op(a.b)» для перезагрузки выражений «obj.foo = bar».
  • Синтаксис цикла «for» теперь поддерживает итерацию «ключ-значение»: «for (key => value in collection) {}»
  • Поддержка использования xml-like разметки в выражениях: «var a = ‹hi/›;». Пока эта возможность доступна только для парсинга макросами и находится на этапе дизайна.
  • Синтаксис для опциональных полей в «полной» нотации типов анонимных структур: «{ var ?f:Int; }» (альтернатива «краткой» «{ ?f:Int }»).
  • Значения перечислений теперь могут быть значениями по умолчанию для аргументов функции: «function foo‹T›(option:Option‹T› = None)».
  • Синтаксис «enum abstract Name(BasicType) {}» больше не требует префикса «@:» в «enum».
  • Авто-нумерация для абстрактных перечислений:
         enum abstract Foo(Int) {       var A; // 0       var B; // 1     }     enum abstract Bar(String) {       var A; // "A"       var B; // "B"     }  
  • Ключевое слово «extern» больше не требует использование префикса «@:».
  • Удалена возможность «implements Dynamic» для доступа к полям класса через строки. Доступно для extern-классов или через реализацию абстрактным типом.
  • Добавлен синтаксис «A & B» для пересечения типов. На данный момент только для анонимных структур и ограничений параметров типа. Старый синтаксис ограничений удалён.
  • Создание пустых экземпляров «Map» доступно теперь через синтаксис «var map:Map‹Int, String› = [];» по аналогии с массивом.
  • Добавлена структура данных «haxe.ds.ReadOnlyArray».
  • Метаданные теперь могут иметь пространства имен («@:prefix.name function() {…}»). Аналогично с определениями: «#if (some.flag … #end».
  • Новый протокол сервисов для IDE, используемых в плагине к VSCode.
  • Обновлены внешние определения (extern) для Web APIs и добавлены отсутствующие.

Источник: http://www.opennet.ru/opennews/art.shtml?num=51763