作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
凯文·布洛赫的头像

Kevin Bloch

Kevin拥有超过25年的全栈、桌面和独立游戏开发经验. 他最近专门研究PostgreSQL、JavaScript、Perl和Haxe.

工作经验

25

Share

我们之前的Haxe回顾 最后我们来看看即将到来的Haxe 4. 随着Haxe 4的正式发布(以及此后不久的两个bug补丁发布),版本4.0.1 and 4.0.是时候进行一次新的Haxe审查了. 这门新兴的编程语言的最新特性是什么? Haxe编程语言社区的发展方向是什么? Haxe游戏引擎仍然是它的支柱吗?

Haxe评论:Haxe 4的新功能

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

hax4中实验性JVM字节码编译目标

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

针对Java目标进行开发时,将新的直接JVM目标与原始工作流进行比较. 原始的需要一些 .Hx源,产生 .java source, 这反过来又需要与Java编译器(这取决于JDK)在可运行的 .Jar文件最终生成. 新的目标允许开发者直接从 .Hx源到一个可运行的 .jar file.

这种使用Haxe 4编译的方法也完全消除了对Java开发工具包(JDK)的依赖。, 并为将来实现交互式调试打开了大门.

Until hxjava的主流版本是Haxe 4兼容的, 基本设置包括安装Haxe和Haxelib, then running 安装hxjava 4.0.0-alpha. 完成这些后,开发流程就很简单了:

#用Haxe直接编译成JVM字节码(-D JVM也可以):
java jav_output——定义jvm

#用Java运行JVM字节码
java -jar jar_output/HelloWorld.jar

考虑到直接JVM编译在Haxe 4中仍处于实验状态, 它有几个警告:

Nonetheless, 对于任何利用基于java的技术的人来说,这是朝着正确方向迈出的重要一步.

hax4中的实验性内联标记支持

JSX, anyone? hax4支持内联标记, 允许开发人员编写, for example, HTML直接在Haxe源代码:

    var dom = jsx(
      

Hello!

This is a paragraph.

);

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

  静态宏函数jsx(expr) {
    返回开关expr.expr {
      case EMeta({name: ":markup"}, {expr: EConst(CString(s))}):
      	宏$v{"XML标记:" + s};
      case _:
        throw new haxe.macro.Expr.错误("不是xml文本",expr.pos);
    }
  }

这个功能的目的是帮助Haxe走出游戏开发泡沫(尽管它确实也有用途)。. 它足够通用,在编译器级别实现-因此不需要在上述宏中使用Haxe API -但检查特定的dsl是编译器团队和社区的下一个问题 figure out.

Haxe的实验零安全性

自1965年零引用发明以来, 空安全问题经常是可空类型环境(如Haxe编程语言)中开发人员的祸根. Aleksandr Kuzmenko估计 GitHub提交修复空指针引用错误数量超过1000万.

Haxe 4具有内置的编译时空安全宏,可以通过包含一个 @:nullSafety 在给定定义前面的行. It comes in @: nullSafety(松散) (默认)和 @: nullSafety(严格的) 模式,并且可以根据需要禁用 @: nullSafety(下). Strict Mode将通过函数调用查找可能赋值为null的字段变化, 即使在禁用null安全的上下文中也是如此.

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

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

对Haxe编程语言和Haxe IDE支持的dx相关的添加使Haxe 4在各个方面的体验至少达到了与其他编程语言相同的水平. In some ways, Haxe试图成为所有人的一切, 但是编译器团队采用了一种深思熟虑的方法来集成来自其他语言的最有用的特性和约定.

其结果是Haxe编程语言和标准API的发展不会影响其稳定性, sensibility, and cohesiveness. 并非Haxe评论中的所有内容都值得大肆宣传, 而这正是关键所在:DX正在进步, 这有利于简单地追求华丽的“功能” du jour.”

要找到一个平衡点, 虽然:Haxe的改变是在意识到其他语言正在遵循的模式的情况下完成的, Haxe 4当然会努力吸引来自更流行语言的新来者.

新的“函数类型”语法

在这一点上,Haxe现在支持两种主要的表示函数类型的方式. 旧语法“建议支持自动套用和部分应用程序”, but they aren’t,” according to 最初的特性提案:

Int -> String -> Void

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

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

But DX aside, 在函数类型中使用Haxe 4的新语法是一个好习惯, as the old, 低级语法可能会在将来的主要版本中删除.

语法糖…有点

也许这不是突破性的, 但是Haxe 4的语法改进对于具有一定开发背景的现有Haxe开发人员(ES6和ES6)来说都是好消息, 例如)以及那些可能从他们那里第一次来到Haxe的人.

现在支持箭头函数(" short lambda ")语法, 在Haxe的例子中,这或多或少只是一种打字的快捷方式 function and return. 键值和索引值迭代语法(用于映射和数组), (分别)现在也支持. 使用静态扩展的类型声明只能使用一个 using 语句,而不是到处都需要它们,使用相应的静态扩展方法.

枚举和枚举抽象还有其他一些改进, 其中之一是后者已经从宏的范围转移到具有直接编译器支持. 其他类似移动的特性包括final类、final接口和 extern fields.

一些依赖于宏的特性仍然依赖于宏,但是有所改进. 运算符重载被升级为包括字段设置器, and metadata 现在可以命名空间了吗 with . separators as in @:prefix.subprefix.name.

调用上述更改 syntactic sugar 无可否认是过于简单化了, 但欢迎读者深入研究链接到的原始提案 Haxe 4的发布说明 哪里需要更多细节.

更多Haxe 4 DX增益

而交互式调试 已经可以在Haxe中用于各种编译目标, the new eval 目标使得交互式调试解释代码成为可能. 举个简单的例子, 你可以拿任何的Haxe“你好, 教程的项目目录, 添加一个名为 任何你想要的.hxml 看起来像这样:

——主要HelloWorld
--interp

并在VSCode IDE中进行交互式调试,只需:

  1. 打开项目 directory in VSCode;
  2. Adding a breakpoint somewhere; and
  3. 按F5并从下拉菜单中选择“Haxe Interpreter”.

此特性还允许您以相同的方式交互式地调试宏代码, 即使你是在编译一个特定的目标,比如 java (而不是使用 --interp). 除了Haxe和VSCode本身之外,唯一的安装要求是 有VSCode扩展.

IDE Services

Speaking of IDEs, Haxe 4引入了一个新的IDE服务协议, 这已经在最新的VSCode Haxe扩展杠杆, vshaxe. 除了显著的性能提升, 这允许vshaxe提供一些非常有用的DX改进, including:

  • (期待已久的)自动进口
  • 自动完成悬停提示显示更多细节, 比如回答这个问题, “这块地是从哪里来的??”
  • 非常彻底的自动完成在几个光滑的新方式, 就像预期的类型完成一样, 后缀完成, 重写完成
  • 在输入代码时进行按键优化

看这些的值要容易得多 来自相关vshaxe变更日志的优秀可视化演示. vshaxe with VSCode并不是唯一的Haxe IDE, haxedevelop和Kode Studio都是Haxe专用的, IntelliJ IDEA有Haxe IDE插件, Sublime Text, Atom, etc.但在使用Haxe 4的新IDE服务协议方面,它似乎走在了前面, 紧随其后的是 IntelliJ-Haxe.

Unicode Literals

想要使用真正的Unicode字符串文字的开发人员将在Haxe 4中找到对它的支持, but there are some nuances to be aware of.

只读数组

标准Haxe API现在具有只读数组. 这与将变量声明为类型一样容易使用,例如: haxe.ds.ReadOnlyArray,之后尝试设置、推送或弹出值会导致各种编译器错误. Add the final 关键字的声明,也不允许对数组本身重新赋值.

调用内联

调用站点内联是Haxe语言的一个新特性,允许开发人员对函数的内联位置进行细粒度控制, 在优化经常调用的函数时非常有用,因为在这种情况下,整体大小和性能的权衡可能是一个双输的决定.


这些都是对已经非常优秀的Haxe编程语言的有价值的补充. Haxe 4发布后,Haxe社区的开发者们都在做些什么?

超越Haxe游戏引擎:Web开发与Haxe 4

Haxe的用户主要是游戏程序员. But there are 有很多例子 Haxe在其他领域的大规模应用, 比如商业堆栈, mobile apps, and the web, 用于前端和后端开发.

为此,Haxe 4提供了重新生成的HTML extern,这意味着Haxe的 js.html 标准API已经与MDN定义的更广泛的web API同步, 以及修复bug和添加缺失的api. (例如,hax4现在包含 the Push API.)

在Juraj Kirchheim的演讲中, 用Haxe编织一张更好的网, 他指出,在企业环境中,基于hadoop的web解决方案的效率要高几个数量级,同时也更健壮.

他还反对Rails的架构方法(在文件夹层次结构方面)。, 但是喜欢Rails的完整web框架的开发人员仍然可以 find one. Other times, 检查完整web项目的源代码可能对开发人员有好处, 在这种情况下,值得一看 Giffon的公共回购这是一个支持Haxe 4的众包平台. 同样,以web为中心的开源Haxe库,比如JavaScript-splitting Haxe Modular, the generic thx.core and 它的姊妹图书馆,以及古老的Haxe网络工具包 Tinkerbell 它们都已经支持Haxe 4了. 跨平台UI解决方案也是如此 HaxeUI, which supports a web context but targets a much wider scope including business and desktop app development; it in particular has steadily continued to mature leading up to the new Haxe language release.

Web, games, 不管平台和应用风格如何,一个开发团队——甚至一个人的团队——都是面向企业的, Haxe开发人员最终将不得不努力管理依赖关系. 为此,Haxe开发人员可以参考Adam Breece演讲中的幻灯片, 与他人合作良好.

Haxe是游戏的最佳编程语言

是否存在一种“最佳”游戏开发语言? 这是一个主观的问题,也是一个容易引发激烈争论的问题. 比人们从它的社区规模上想象的要大, Haxe在游戏开发领域的成功当然不是巧合. 乔·威廉姆森(Joe Williamson)提供了一些见解,解释了为什么会出现这种情况 关于赢得2019年Ludum Dare 45游戏jam的采访这种情况似乎可能会在Haxe 4中继续下去.

Haxe的最初创造者Nicolas Cannasse已经在Shiro Games的制作中使用了Haxe 4。 Northgard. Motion Twin也在生产中使用Haxe 4 Dead Cells. 这两款游戏在Steam上都有成千上万的好评, 并可用于两台pc (Win, Mac, 考虑到这两款游戏的开发团队都较小,但用户基础却高达数百万,这确实是一个令人生畏的结果. 《欧博体育app下载》甚至有了iOS版本,他们也在考虑推出Android版本.

库方面,几个主要的Haxe游戏引擎肯定与Haxe 4的变化保持同步. hax4兼容的引擎包括 Kha (以及建立在它之上的许多引擎的一部分).g., Armory), HaxeFlixel 以及它的主要依赖性 OpenFL, NME, and Heaps——当然,因为《欧博体育app下载》和《欧博体育app下载》就是这么用的. HaxePunk is also working on Haxe 4 compatibility; in one case, a library, Nape, was forked 和Haxe一起工作.

有些开发者还制作了自己的引擎,而不是使用已有的引擎. 例如,Kirill Poletaev详细介绍了 how and why 他编写了自己的3D Haxe游戏引擎. 因为引擎是内部的, 它是一个还没有迁移到Haxe 4的项目的例子,这是有道理的.

第4点:继续一个优秀的工具链的顺利进展

With Haxe 具有如此广泛的用途, Haxe 4最重要的特性因开发人员而异, 所以Haxe的评论并不详尽. Haxe 4的一些变化在上面遗漏了,包括:

  • 为JavaScript目标添加ES6输出
  • 删除的功能(其中一些仍然可以通过 hx3compat 库)和目标(PHP5等) AS3)
  • CLI标志与常用工具(-lib-using .hxml 文件将需要更改为 -L or --library, for example).
  • Besides final 现在作为一个关键字(因此不能用作变量名), operator and overload 是否也是新保留的关键字.

还有一些突破性的变化, 但是它们太少了,以至于许多积极维护的库甚至懒得明确地宣布hax4的兼容性, 从Haxe 3迁移据说是相当简单的. After all, Haxe的目标之一是在支持大量目标平台的同时保持稳定性, Haxe 4也没有让人失望.

新用户呢?? In the end, Haxe是否是最好的游戏编程语言取决于读者, Haxe生态系统是否为web开发提供了最强大的库, 或者特定于hax的工具是否为特定的工作流提供了最合理的DX. 至少, Haxe在许多领域仍然是一个可行的竞争者, 为几乎所有开发人员提供了一些秘密优势.

进一步阅读:刚接触Haxe的开发人员可能会对Haxe教程感兴趣 John Gabriele的发布说明 Haxe 4.1.0 and later versions.

了解基本知识

  • 哪个框架可以用于开发跨平台应用程序?

    有几个跨平台框架,如React Native和Xamarin, 但是Haxe可以用于从单个代码库开发多个平台的应用程序,无论是否使用框架. React Native特别提供了Haxe extern, 这意味着可以使用Haxe进行开发.

  • 哪种编程语言最适合跨平台开发?

    而Java通常是跨平台上下文中首先讨论的语言, Haxe的目标范围更广:它能够编译成Java, but also C#, C++, JavaScript, PHP, 还有其他几个. 由于Haxe在完善其可用性的同时成功地保留了如此多的目标, 这是一个明确的竞争者.

  • 哪种编程语言最适合做游戏?

    游戏开发的范围很广, 所以游戏的最佳编程语言取决于程序员和项目. Haxe的情况是,它提供了一种独特的精炼语言,同时能够同时针对Win/Mac/Linux, iOS/Android, HTML5, 和控制台系统从一个单一的代码库.

  • 什么是游戏开发引擎?

    游戏开发引擎是提供通用(有时是完整)游戏引擎功能的软件库. 游戏引擎由处理资产、用户插件等所需的核心代码组成. 提供游戏体验. 游戏开发引擎可能包含自己的IDE和其他特定工具.

聘请Toptal这方面的专家.
Hire Now
凯文·布洛赫的头像
Kevin Bloch

Located in Bergerac, France

Member since 2017年1月31日

作者简介

Kevin拥有超过25年的全栈、桌面和独立游戏开发经验. 他最近专门研究PostgreSQL、JavaScript、Perl和Haxe.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

工作经验

25

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

Toptal开发者

Join the Toptal® community.