Обзор Haxe: особенности и сильные стороны Haxe 4

Опубликовано: 2022-03-11

Наш предыдущий обзор Haxe закончился рассмотрением предстоящего Haxe 4. С официальным выпуском Haxe 4 (и вскоре после этого двумя выпусками исправлений ошибок — версии 4.0.1 и 4.0.2) пришло время для нового обзора Haxe. . Каковы последние дополнения к этому растущему языку программирования? Куда движется сообщество языков программирования Haxe? Являются ли игровые движки Haxe по-прежнему его опорой?

Обзор Haxe: новые возможности Haxe 4

Благодаря более чем трехлетней разработке с момента последнего основного выпуска, версия 4 языка программирования Haxe улучшает производительность макросов, удобство разработчиков и синтаксис. Три его усовершенствования по-прежнему считаются экспериментальными, но заслуживают внимания: новая цель байт-кода JVM, поддержка встроенной разметки и нулевые проверки безопасности.

Экспериментальная цель компиляции байт-кода JVM в Haxe 4

Новая цель Haxe 4 для байт-кода JVM делает разработку Java с помощью Haxe немного более эффективной за счет исключения основного шага компиляции: нет второго шага, когда собственный компилятор Java ( javac ) компилирует исходный код Java, выводимый транспилером Haxe.

Сравнение новой прямой цели JVM с исходным рабочим процессом при разработке для цели Java. Оригинал берет некоторый исходный файл .hx, создает исходный код .java, который, в свою очередь, необходимо скомпилировать с помощью компилятора Java (который зависит от JDK), прежде чем окончательно будет создан исполняемый файл .jar. Новая цель позволяет разработчикам напрямую переходить от исходного кода .hx к исполняемому файлу .jar.

Этот метод компиляции с помощью Haxe 4 также полностью устраняет зависимость от комплекта разработчика Java (JDK) и открывает двери для интерактивной отладки, которая будет реализована в будущем.

Пока основная версия hxjava не будет совместима с Haxe 4, базовая установка включает установку Haxe и Haxelib, а затем запуск haxelib install hxjava 4.0.0-alpha . После этого процесс разработки прост:

 # transpile directly to JVM bytecode with Haxe (-D jvm would also work): haxe --main HelloWorld --java jar_output --define jvm # run JVM bytecode with Java: java -jar jar_output/HelloWorld.jar

Учитывая, что прямая компиляция JVM по-прежнему имеет экспериментальный статус в Haxe 4, она имеет пару предостережений:

  • Есть некоторые проблемы, специфичные для Android.
  • Производительность во время выполнения не так хороша, даже если в конечном итоге она будет быстрее, чем косвенный метод.

Тем не менее, это заметный шаг в правильном направлении для всех, кто использует технологии на основе Java.

Экспериментальная поддержка встроенной разметки в Haxe 4

JSX, кто-нибудь? Haxe 4 поддерживает встроенную разметку, позволяя разработчикам писать, например, HTML непосредственно в исходном коде Haxe:

 var dom = jsx( <div> <h1>Hello!</h1> <p>This is a paragraph.</p> </div> );

Поскольку здесь jsx() может быть статической функцией макроса, это позволяет проекту во время компиляции проверять, соответствует ли разметка какой-либо XML-спецификации, которую разработчик хочет реализовать. Поскольку поддержка XML сама по себе встроена в Haxe API, проверка может использовать Xml.parse() , но для базовой «XML-подобной» разборчивости даже это не требуется:

 static macro function jsx(expr) { return switch expr.expr { case EMeta({name: ":markup"}, {expr: EConst(CString(s))}): macro $v{"XML MARKUP: " + s}; case _: throw new haxe.macro.Expr.Error("not an xml literal", expr.pos); } }

Эта функция предназначена для того, чтобы помочь вытолкнуть Haxe из пузыря разработки игр (хотя и там она, безусловно, найдет применение). Он достаточно общий, поскольку реализуется на уровне компилятора — следовательно, в приведенном выше макросе нет необходимости в Haxe API, — но проверка конкретных DSL — это следующий вопрос, который должны решить команда компилятора и сообщество.

Экспериментальная нулевая безопасность в Haxe 4

С момента изобретения нулевой ссылки в 1965 году проблема нулевой безопасности часто становилась бичом разработчиков в средах с нулевым типизированием, таких как язык программирования Haxe. По оценке Александра Кузьменко, GitHub исправит более 10 миллионов ошибок ссылок на нулевые указатели.

Haxe 4 имеет встроенные макросы безопасности null во время компиляции, которые можно включить, включив строку @:nullSafety непосредственно перед данным определением. Он поставляется в @:nullSafety(Loose) (по умолчанию) и @:nullSafety(Strict) и при необходимости может быть отключен с помощью @:nullSafety(Off) . Strict режим будет просматривать вызовы функций на наличие мутаций полей, которые могут присвоить значение null, даже в контексте нулевого значения с отключенной безопасностью.

Разработчики Ruby могут задаться вопросом, находится ли на радаре удобный оператор безопасной навигации ( ?. в Ruby). Пока нет, но, как и во многих аспектах программирования в Haxe, для этого есть макрос (обратите внимание, что вместо него используется !. ).

Опыт разработчиков (DX) с Haxe 4: синтаксические дополнения, синтаксический сахар и многое другое

Связанные с DX дополнения к языку программирования Haxe и поддержка Haxe IDE позволяют использовать Haxe 4 как минимум на одном уровне с другими языками программирования на различных фронтах. В некотором смысле Haxe стремится быть всем для всех, но команда компилятора тщательно подходит к интеграции наиболее полезных функций и соглашений из других языков.

В результате язык программирования Haxe и стандартный API развиваются без ущерба для их стабильности, чувствительности и согласованности. Не все в этом обзоре Haxe покажется достойным хайпа, и именно в этом суть: DX совершенствуется, и это в пользу простой погони за кричащими «features du jour ».

Тем не менее, необходимо соблюдать баланс: изменения Haxe вносятся с учетом моделей, которым следуют другие языки, и Haxe 4, безусловно, старается привлечь новичков из более популярных языков.

Новый синтаксис «Тип функции»

Кстати, Haxe теперь поддерживает два основных способа представления типов функций. Старый синтаксис «предполагает, что автоматическое каррирование и частичное применение поддерживаются, но это не так», в соответствии с исходным предложением функции:

 Int -> String -> Void

Новый синтаксис позволяет использовать именованные аргументы, что улучшает DX:

 (id:Int, name:String) -> Void

Но помимо DX, использование нового синтаксиса Haxe 4 для типов функций является хорошей привычкой, так как старый, устаревший синтаксис может быть удален в будущей основной версии.

Синтаксический сахар… вроде как

Возможно, это не новаторство, но синтаксические улучшения Haxe 4 будут приятной новостью как для существующих разработчиков Haxe с определенным опытом разработки (например, ES6), так и для тех, кто может перейти от них к Haxe впервые.

Теперь поддерживается синтаксис стрелочной функции («короткая лямбда»), что в случае Haxe является более или менее простым сокращением для ввода function и return . Также теперь поддерживаются синтаксисы итераций ключ-значение и индекс-значение (для карт и массивов соответственно). Объявления типов, использующие статические расширения, могут просто использовать один оператор using глобально вместо того, чтобы нуждаться в них везде, где используются соответствующие статические методы расширения.

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

Некоторые функции, основанные на макросах, остались зависимыми от макросов, но, тем не менее, улучшились. Перегрузка операторов была улучшена, чтобы включить установщики полей, а метаданные теперь могут быть объединены в пространство имен с помощью . разделители, как в @:prefix.subprefix.name .

Называть приведенные выше изменения синтаксическим сахаром , по общему признанию, является чрезмерным упрощением, но читатели могут покопаться в исходных предложениях, на которые есть ссылки в примечаниях к выпуску Haxe 4, где им нужно больше деталей.

Больше Haxe 4 DX Boosts

В то время как интерактивная отладка уже была возможна в Haxe для различных скомпилированных целей, новая цель eval делает возможной интерактивную отладку для интерпретируемого кода. В качестве простого примера вы можете взять любой каталог проекта учебника Haxe «Hello, World» и добавить файл с именем whatever-you-want.hxml выглядит следующим образом:

 --main HelloWorld --interp

… и получить интерактивную отладку в VSCode IDE, просто:

  1. Открытие каталога проекта в VSCode;
  2. Добавление точки останова где-нибудь; а также
  3. Нажмите F5 и выберите «Haxe Interpreter» в раскрывающемся списке.

Эта функция также позволяет вам интерактивно отлаживать код макроса таким же образом, даже если вы на самом деле компилируете для конкретной цели, такой как java (вместо использования --interp ). Единственным требованием для установки, помимо самих Haxe и VSCode, является расширение Haxe VSCode.

Службы IDE

Говоря об IDE, Haxe 4 представляет новый протокол сервисов IDE, который уже используется в последнем расширении VSCode Haxe, vshaxe. Помимо значительного повышения производительности, это позволяет vshaxe предоставлять некоторые чрезвычайно полезные улучшения DX, в том числе:

  • (Долгожданный) автоматический импорт
  • Подсказки автозаполнения, показывающие более подробную информацию, например, ответ на вопрос «Откуда это поле?»
  • Очень тщательное автозаполнение несколькими удобными новыми способами, такими как завершение ожидаемого типа, завершение постфикса и завершение переопределения.
  • Оптимизация нажатия клавиш при вводе кода

Гораздо легче увидеть их ценность с помощью отличных визуальных демонстраций из соответствующего журнала изменений vshaxe. vshaxe с VSCode — не единственная Haxe IDE — HaxeDevelop и Kode Studio специфичны для Haxe, и есть плагины Haxe IDE для IntelliJ IDEA, Sublime Text, Atom и т. д. — но, похоже, она опережает конкурентов с точки зрения использования нового протокола сервисов IDE Haxe 4, за которым следует IntelliJ-Haxe.

Литералы Юникода

Разработчики, желающие использовать настоящие строковые литералы Unicode, найдут поддержку для этого в Haxe 4, но есть некоторые нюансы, о которых следует знать.

Массивы только для чтения

Стандартный Haxe API теперь имеет массивы только для чтения. Их так же просто использовать, как объявить переменную типа, например, haxe.ds.ReadOnlyArray<Int> , после чего попытка установить, отправить или извлечь значения приводит к различным ошибкам компилятора. Добавьте ключевое слово final в объявление, и переназначение самого массива также будет запрещено.

Call-сайт

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


Это достойные дополнения к уже превосходному языку программирования Haxe. Что создают разработчики в сообществе Haxe после выхода Haxe 4?

Помимо игровых движков Haxe: веб-разработка с Haxe 4

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

С этой целью Haxe 4 предоставляет регенерированные HTML-экстерны, что означает, что стандартный API Haxe js.html был обновлен с более широким веб-API, как его определяет MDN, а также исправлены ошибки и добавлены отсутствующие API. (Например, Haxe 4 теперь включает Push API.)

В докладе Юрая Кирххейма «Создание лучшей сети с помощью Haxe» он указывает на примеры веб-решений на основе Haxe, которые на несколько порядков более эффективны, но при этом более надежны в условиях предприятия.

Он также выступает против архитектурного подхода Rails (с точки зрения иерархии папок), но разработчики, предпочитающие полноценный веб-фреймворк в стиле Rails, все же могут его найти. В других случаях разработчикам может быть полезно просмотреть исходный код полного веб-проекта, и в этом случае стоит взглянуть на общедоступный репозиторий для Giffon, платформы для краудфандинга, которая поддерживает Haxe 4. Аналогично, веб-ориентированный, открытый- исходные библиотеки Haxe, такие как Haxe Modular, разделяющий JavaScript, универсальные библиотеки thx.core и родственные библиотеки, а также почтенный веб-инструментарий Haxe Tinkerbell — все они уже поддерживают Haxe 4. Так же, как и кроссплатформенное решение пользовательского интерфейса HaxeUI, которое поддерживает веб-контекст, но нацелен на гораздо более широкую сферу, включая разработку бизнес-приложений и настольных приложений; в частности, он неуклонно продолжал совершенствоваться вплоть до выпуска новой версии языка Haxe.

Интернет, игры, предприятие… независимо от платформы и типа приложения, на которые нацелена команда разработчиков — даже команда из одного человека, — разработчикам Haxe в конечном итоге придется столкнуться с управлением зависимостями. Для этого полезным ресурсом для разработчиков Haxe являются слайды из выступления Адама Бриса «Хорошее масштабирование с другими».

Haxe — лучший язык программирования для игр

Существует ли вообще один единственный «лучший» язык для разработки игр? Это субъективный вопрос, и по нему легко найти горячие споры. Успех Haxe в сфере разработки игр больше, чем можно было бы ожидать, исходя только из размера его сообщества, и это, безусловно, не случайно. Джо Уильямсон дает некоторое представление о том, почему это могло быть в интервью о победе в игровом джеме Ludum Dare 45 в 2019 году, и, похоже, это продолжится с Haxe 4.

Первоначальный создатель Haxe, Николя Каннасс, уже использует Haxe 4 в производстве с Northgard от Shiro Games. Motion Twin также использует Haxe 4 в производстве Dead Cells. Обе игры получили десятки тысяч положительных отзывов в Steam и доступны как для ПК (Win, Mac и Linux), так и для консолей — поистине впечатляющий результат, учитывая, что в обеих играх небольшие команды разработчиков, а пользовательская база исчисляется миллионами. У Dead Cells есть даже версия для iOS, а также версия для Android.

С точки зрения библиотеки, несколько основных игровых движков Haxe определенно идут в ногу с изменениями Haxe 4. Совместимые с Haxe 4 движки включают Kha (и часть множества движков, построенных на его основе — например, Armory), HaxeFlixel и его основную зависимость OpenFL, NME и Heaps — естественно, поскольку именно их используют Northgard и Dead Cells. HaxePunk также работает над совместимостью с Haxe 4; в одном случае библиотека Nape была разветвлена ​​для работы с Haxe 4.

Некоторые разработчики также создают свои собственные движки вместо того, чтобы использовать один из множества уже существующих. Например, Кирилл Полетаев, подробно рассказывающий, как и зачем он написал собственный игровой 3D-движок Haxe. Поскольку указанный движок является внутренним, имеет смысл, что это один из примеров проекта, который еще не перешел на Haxe 4.

Haxe 4: Продолжаем плавное развитие отличной цепочки инструментов

Поскольку Haxe обладает такой широкой полезностью, наиболее важные функции Haxe 4 будут различаться в зависимости от разработчика, поэтому этот обзор Haxe ни в коем случае не является исчерпывающим. Некоторые из изменений Haxe 4 отсутствуют выше, в том числе:

  • Добавление вывода ES6 для цели JavaScript
  • Удаление функций (некоторые из которых все еще доступны через библиотеку hx3compat ) и целей (PHP5 и вскоре AS3)
  • Флаги CLI становятся более совместимыми с обычными инструментами ( -lib , -lib .hxml файлы .hxml нужно изменить на -L или --library ).
  • Помимо того, что final теперь является ключевым словом (которое поэтому нельзя использовать в качестве имени переменной), operator и overload также являются новыми зарезервированными ключевыми словами.

Были также некоторые критические изменения, но их так мало, что многие активно поддерживаемые библиотеки даже не удосужились явно объявить о совместимости с Haxe 4 — в целом миграция с Haxe 3 считается довольно простой. В конце концов, одной из целей Haxe является стабильность среди поддержки большого количества целевых платформ, и Haxe 4 здесь не разочаровывает.

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

Дополнительная литература: Разработчики, плохо знакомые с Haxe, могут быть заинтересованы в довольно новом руководстве по Haxe от Джона Габриэле, а также примечания к выпуску Haxe 4.1.0 и Haxe 4.1.1.