Haxe 评论:Haxe 4 功能和优势

已发表: 2022-03-11

我们之前的 Haxe 评测以当时即将推出的 Haxe 4 结束。随着 Haxe 4 的正式发布(以及此后不久的两个错误补丁版本 - 版本 4.0.1 和 4.0.2),是时候进行新的 Haxe 评测了. 这种新兴的编程语言的最新添加是什么? Haxe 编程语言社区将走向何方? Haxe 游戏引擎仍然是它的支柱吗?

Haxe 评测:Haxe 4 的新功能

自上一个主要版本以来,经过三年多的开发,Haxe 编程语言版本 4 改进了宏性能、开发人员体验和语法。 它的三个增强功能仍被认为是实验性的,但值得强调:新的 JVM 字节码目标、对内联标记的支持和空安全检查。

Haxe 4 中的实验性 JVM 字节码编译目标

Haxe 4 的新 JVM 字节码目标通过减少主要编译步骤使通过 Haxe 进行 Java 开发更加高效:没有第二步让 Java 自己的编译器 ( javac ) 编译 Haxe 转译器的 Java 源代码输出。

为 Java 目标开发时,新的直接 JVM 目标与原始工作流的比较。原始文件需要一些 .hx 源,生成 .java 源,而在最终生成可运行的 .jar 文件之前,需要使用 Java 编译器(取决于 JDK)对其进行编译。新目标允许开发人员直接从 .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 支持内联标记,允许开发人员直接在 Haxe 源代码中编写 HTML:

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

由于此处的jsx()可以是静态宏函数,这允许项目在编译时检查标记是否符合开发人员希望实现的任何 XML-ish 规范。 由于 XML 支持本身内置在 Haxe API 中,因此检查可以利用Xml.parse() ,但对于基本的“XML-ish”可解析性,甚至不需要:

 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 编程语言)中的祸根。 Aleksandr Kuzmenko 估计 GitHub 承诺修复的空指针引用错误数量超过 1000 万。

Haxe 4 具有内置的编译时空安全宏,可以通过在给定定义之前包含@:nullSafety行来启用它。 它有@:nullSafety(Loose) (默认)和@:nullSafety(Strict)模式,可以根据需要使用@:nullSafety(Off)Strict模式将通过函数调用查看可能分配 null 的字段突变,即使在 null 安全禁用上下文中也是如此。

Ruby 开发人员可能想知道方便的安全导航操作符(Ruby 中的?. )是否受到关注。 还没有,但与 Haxe 编程的许多方面一样,有一个宏(请注意,它使用!.代替。)

Haxe 4 的开发人员体验 (DX):语法添加、语法糖等

Haxe 编程语言和 Haxe IDE 支持中与 DX 相关的附加功能使 Haxe 4 的体验至少在各个方面与其他编程语言相当。 在某些方面,Haxe 力求成为所有人的一切,但编译器团队采取了一种深思熟虑的方法来集成来自其他语言的最有用的特性和约定。

结果是 Haxe 编程语言和标准 API 在不损害其稳定性、敏感性和凝聚力的情况下不断发展。 并非本次 Haxe 评论中的所有内容都值得大肆宣传,而这正是重点:DX 正在改进,这有利于简单地追逐浮华的“日常功能”。

不过,有一个平衡点:Haxe 的变化是在意识到其他语言遵循的模式的情况下完成的,而 Haxe 4 肯定会努力吸引来自更流行语言的新手。

新的“函数类型”语法

关于这一点,Haxe 现在支持两种主要的表示函数类型的方式。 根据原始功能提案,旧语法“建议支持自动柯里化和部分应用程序,但实际上不支持”:

 Int -> String -> Void

新语法允许命名参数,这改进了 DX:

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

但抛开 DX 不谈,使用 Haxe 4 的新函数类型语法是一个很好的习惯,因为旧的、劣质的语法可能会在未来的主要版本中被删除。

语法糖……有点

也许这不是开创性的,但是对于具有特定开发背景(例如 ES6)的现有 Haxe 开发人员以及可能第一次从他们那里转向 Haxe 的人来说,Haxe 4 的语法改进将是一个受欢迎的消息。

现在支持箭头函数(“short lambda”)语法,在 Haxe 的情况下,这或多或少只是键入functionreturn的快捷方式。 现在也支持键值和索引值迭代语法(分别用于映射和数组)。 使用静态扩展的类型声明可以只使用一个全局using语句,而不是在使用相应静态扩展方法的任何地方都需要它们。

枚举和枚举摘要还有其他一些改进,其中之一是后者已经从宏的范围转移到具有直接编译器支持。 其他类似移动的特性包括最终类、最终接口和外部字段。

一些依赖宏的功能仍然依赖于宏,但仍然得到了改进。 运算符重载已升级为包含字段设置器,元数据现在可以使用. @:prefix.subprefix.name中的分隔符。

诚然,将上述更改称为语法糖过于简单,但欢迎读者深入了解与 Haxe 4 发行说明相关的原始提案,他们需要更多细节。

更多 Haxe 4 DX 提升

虽然在 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的 vshaxe 并不是唯一的 Haxe IDE——HaxeDevelop 和 Kode Studio 是 Haxe 特有的,还有适用于 IntelliJ IDEA、Sublime Text、Atom 等的 Haxe IDE 插件——但它似乎在这些方面领先利用 Haxe 4 的新 IDE 服务协议,紧随其后的是 IntelliJ-Haxe。

Unicode 文字

想要使用真正的 Unicode 字符串文字的开发人员会在 Haxe 4 中找到对它的支持,但需要注意一些细微差别。

只读数组

标准 Haxe API 现在具有只读数组。 这些与将变量声明为类型一样易于使用,例如haxe.ds.ReadOnlyArray<Int> ,之后尝试设置、推送或弹出值会导致各种编译器错误。 将final关键字添加到声明中,并且重新分配数组本身也将被禁止。

调用点内联

调用点内联是一项新的 Haxe 语言功能,允许开发人员对函数内联的位置进行细粒度控制,这在优化经常调用的函数时很有用,否则整体大小-性能权衡可能是一个双输的决定。


这些是对已经非常出色的 Haxe 编程语言的有价值的补充。 Haxe 4 发布后,Haxe 社区建设中的开发人员有哪些?

超越 Haxe 游戏引擎:使用 Haxe 4 进行 Web 开发

Haxe 的用户群历来由游戏程序员主导。 但是,在其他领域(如业务堆栈、移动应用程序和 Web)中,有很多大规模使用 Haxe 的例子,用于前端和后端开发。

为此,Haxe 4 提供了重新生成的 HTML extern,这意味着 Haxe 的js.html标准 API 已与 MDN 定义的更广泛的 Web API 保持同步,并修复了错误并添加了缺失的 API。 (例如,Haxe 4 现在包含 Push API。)

在 Juraj Kirchheim 的演讲“用 Haxe 编织一个更好的 Web”中,他指出了基于 Haxe 的 Web 解决方案在企业环境中的效率要高出几个数量级,同时也更加健壮的例子。

他还反对 Rails 架构方法(在文件夹层次结构方面),但喜欢完整的 Web 框架(如 Rails)的开发人员仍然可以找到一个。 其他时候,查看完整 Web 项目的源代码可能会使开发人员受益,在这种情况下,值得查看 Giffon 的公共存储库,这是一个支持 Haxe 4 的众筹平台。同样,以 Web 为中心的开放式源 Haxe 库,如 JavaScript 拆分 Haxe Modular、通用 thx.core 及其姊妹库,以及古老的 Haxe web 工具包 Tinkerbell 都已经支持 Haxe 4。跨平台 UI 解决方案 HaxeUI 也是如此,它支持 web 上下文但针对更广泛的范围,包括业务和桌面应用程序开发; 尤其是在新的 Haxe 语言发布之前,它一直在稳步持续成熟。

Web、游戏、企业……无论开发团队(甚至是一个团队)所针对的平台和应用程序风格如何,Haxe 开发人员最终都将不得不努力管理依赖关系。 为此,Haxe 开发人员查看的一个有用资源是 Adam Breece 演讲中的幻灯片,即 Scaling well with others。

Haxe 是最好的游戏编程语言

是否存在一种用于游戏开发的单一“最佳”语言? 这是一个主观问题,很容易引起激烈的争论。 Haxe 在游戏开发领域的成功远远超出了人们对其社区规模的预期,这当然不是巧合。 乔·威廉姆森 (Joe Williamson) 在一次关于赢得 2019 年 Ludum Dare 45 比赛果酱的采访中提供了一些见解,解释了为什么这可能会在 Haxe 4 中继续下去。

Haxe 的原创者 Nicolas Cannasse 已经在 Shiro Games 的 Northgard 中使用 Haxe 4。 Motion Twin 还在《死亡细胞》的制作中使用 Haxe 4。 这两款游戏在 Steam 上都获得了数以万计的正面评价,并且可用于 PC(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 一起工作。

一些开发人员还制作自己的引擎,而不是使用现有的众多引擎之一。 例如,Kirill Poletaev,他详细介绍了他如何以及为何编写自己的 3D Haxe 游戏引擎。 由于所述引擎是内部的,因此它是一个尚未迁移到 Haxe 4 的项目示例是有道理的。

Haxe 4:继续优秀工具链的平稳发展

由于 Haxe 具有如此广泛的实用性,最重要的 Haxe 4 功能将因开发人员而异,因此此 Haxe 评论绝不是详尽无遗的。 上面缺少 Haxe 4 的一些更改,包括:

  • 为 JavaScript 目标添加 ES6 输出
  • 删除功能(其中一些仍可通过hx3compat库获得)和目标(PHP5 和即将推出的 AS3)
  • CLI 标志与常用工具更加一致(例如-lib .hxml文件需要更改为-L--library )。
  • 除了final now 是关键字(因此不能用作变量名)之外, operatoroverload也是新保留的关键字。

也有一些重大更改,但它们太少了,以至于许多积极维护的库甚至都懒得明确宣布 Haxe 4 的兼容性——总的来说,据说从 Haxe 3 迁移相当简单。 毕竟,Haxe 的目标之一是在同时支持大量目标平台的过程中保持稳定,而 Haxe 4 在这方面并没有让人失望。

新用户呢? 最后,由读者决定 Haxe 是否是最好的游戏编码语言,Haxe 生态系统是否为 Web 开发提供最强大的库,或者 Haxe 特定工具是否为特定工作流程提供最明智的 DX。 至少,Haxe 在许多领域仍然是一个可行的竞争者,为几乎所有开发人员提供了某种秘密优势。

进一步阅读:刚接触 Haxe 的开发人员可能会对 John Gabriele 的相当新的 Haxe 教程以及 Haxe 4.1.0 和 Haxe 4.1.1 的发行说明感兴趣。