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

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

Мова є expression-орієнтованим зі строгою типізацією. Підтримуються порієми об'єктно-орієнтованого, узагальненого та функціонального програмування.
Синтаксис Haxe близький до ECMAScript та розширює його такими можливостями, як статична типізація, автовиведення типів, зіставлення шаблонів, дженерики, заснований на ітераторах цикл «for», AST-макроси, GADT (Generalized Algebraic Data Types), абстрактні типи, анонімні структури, спрощені визначення масивів, вирази для умовної компі , прикріплення метаданих до полів, класів та виразів, інтерполяція рядків ('My name is $name'), параметри типів («new Main‹String›('foo')») і багато іншого.

клас Тест {
static function main() {
var people = [
"Elizabeth" => "Programming",
"Joel" => "Design"
];

for (name in people.keys()) {
var job = people[name];
trace('$name does $job for a living!');
}
}
}

Основні нововведення версії 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" для полів класів та локальних змінних, які є іммутабельними. Final також можна використовувати для визначення функцій, щоб заборонити їх перевизначення при успадкування і для класів/інтерфейсів, які не можуть бути успадковані.
  • Підтримка стандарту Unicode для базового типу «String» на всі цілі компіляції за винятком Neko.
  • Переписаний з нуля вбудований інтерпретатор, який тепер постачається під ім'ям Евал. Завдяки новому інтерпретатору скрипти та макроси виконуються набагато швидше. Підтримується режим інтерактивного налагодження.
  • Нова цільова система для компіляції (target) Hashlink - Високопродуктивний runtime, розроблений спеціально для Haxe, що підтримує компіляцію в байткод для JIT або C, має просту інтеграцію з C, а також доступ до низькорівневих числових типів та покажчиків.
  • Нова цільова система JVM дозволяє генерувати байткод jvm, пропускаючи етап компіляції Java-коду через додавання прапора «-D jvm» при таргетуванні в Java.
  • Можливість inline-розгортання на місці виклику функцій чи конструкторів, навіть якщо вони не оголошені такими.
  • Можливість включення статичних розширень при оголошенні типу (наприклад, «enum») за допомогою «@:using(path.ToExtension)».
  • Абстрактні типи тепер підтримують "set"-версію оператора @:op(ab) для перезавантаження виразів "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 та додано відсутні.

Джерело: opennet.ru

Додати коментар або відгук