个性化阅读
专注于IT技术分析

Haxe评论:Haxe 4的功能和优点

本文概述

我们之前的Haxe审查以对即将到来的Haxe 4的考察结束。随着Haxe 4的正式发布(此后不久, 发布了两个bug补丁版本-版本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的Transpiler的Java源代码没有第二个步骤。

为Java目标开发时,将新的直接JVM目标与原始工作流进行比较。原始文件带有一些.hx源代码,产生了.java源代码,而后者又需要用Java编译器(取决于JDK)进行编译,然后才最终生成可运行的.jar文件。新的目标允许开发人员直接从.hx源转到可运行的.jar文件。

使用Haxe 4进行编译的这种方法也完全消除了对Java开发人员工具包(JDK)的依赖。更好的是, 它消除了Haxe与Java类型参数之间不兼容的问题, 并为将来实现交互式调试打开了大门。

在hxjava的主流版本兼容Haxe 4之前, 基本设置包括安装Haxe和Haxelib, 然后运行haxelib安装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规范。由于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具有内置的编译时null安全宏, 可以通过在给定定义之前包含@:nullSafety行来启用它。它具有@:nullSafety(Loose)(默认)和@:nullSafety(Strict)模式, 可以根据需要使用@:nullSafety(Off)禁用它。严格模式将遍历函数调用, 寻找可能会分配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的语法改进将是可喜的消息。

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

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

某些依赖于宏的功能仍然依赖于宏, 但是仍然有所改进。运算符重载已升级为包括字段设置器, 并且现在可以使用来命名元数据。分隔符如@:prefix.subprefix.name中的一样。

称上述变化为语法糖实在是太简单了, 但欢迎读者深入研究Haxe 4发行说明中的​​原始建议, 以了解更多细节。

更多Haxe 4 DX Boost

虽然Haxe中已经可以对各种编译目标进行交互式调试, 但新的eval目标使对解释代码进行交互式调试成为可能。举一个简单的例子, 你可以访问任何Haxe” Hello, World”教程的项目目录, 添加一个名为what-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更改日志中出色的可视化演示, 可以更轻松地看到这些功能的价值。带有VSCode的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外部代码, 这意味着Haxe的js.html标准API已随着MDN定义了更广泛的Web API的更新, 并修复了错误并添加了缺少的API。 (例如, Haxe 4现在包括Push API。)

在Juraj Kirchheim的演讲”用Haxe编织更好的网络”中, 他指出了基于Haxe的Web解决方案在企业环境中效率提高了几个数量级, 但同时也更加强大的示例。

他还反对使用Rails的体系结构方法(就文件夹层次结构而言), 但是支持Rails的完整Web框架的开发人员仍然可以找到。在其他时候, 它可能使开发人员可以查看完整的Web项目的来源, 在这种情况下, 值得一看的是Giffon的公共仓库, Giffon是支持Haxe 4的支持人群的平台。同样, 以Web为中心的开放式原始的Haxe库(例如, 可拆分JavaScript的Haxe Modular, 通用的thx.core及其姐妹库以及古老的Haxe Web工具包Tinkerbell)都已支持Haxe4。跨平台UI解决方案HaxeUI也已支持Haxe。目标范围更广泛, 包括业务和桌面应用程序开发;特别是在推出新的Haxe语言之前, 它一直稳步成熟。

Web, 游戏, 企业……无论开发平台(甚至是一个团队)都针对哪个平台和应用程序, Haxe开发人员最终都将不得不应对依赖关系的管理。为此, Haxe开发人员可以查看的有用资源是Adam Breece演讲中的幻灯片, 该幻灯片与其他人的比例很好。

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现在是关键字(因此不能用作变量名)之外, operator和重载也是新保留的关键字。

还进行了一些重大更改, 但数量很少, 以至于许多主动维护的库甚至没有费心去明确宣布Haxe 4的兼容性—一般来说, 从Haxe 3进行移植是相当简单的。毕竟, Haxe的目标之一是在为大量目标平台提供杂耍支持的过程中保持稳定性, 而Haxe 4对此并不令人失望。

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

进一步阅读:刚接触Haxe的开发人员可能会对John Gabriele撰写的相当新的Haxe教程感兴趣。

赞(0)
未经允许不得转载:srcmini » Haxe评论:Haxe 4的功能和优点

评论 抢沙发

评论前必须登录!