Haxe:跨平台开发的最佳秘密
已发表: 2022-03-11现代编程语言 Haxe 在某些圈子里是众所周知的,但许多阅读本文的人可能从未听说过它。 不过,不要让它的利基地位愚弄你。 自从它于 2005 年首次亮相以来,它一直受到其忠诚——如果相当安静——的追随者的实战考验。 它拥有实用且成熟的功能组合,可用于商业、游戏甚至学术环境中的开发。
迪士尼、孩之宝和 BBC 都在使用 Haxe,为什么没有更多的开发者听说过呢? 也许它的多功能性意味着 Haxe 编程语言没有一个单一的“杀手级应用程序”。
或者可能是因为它最早的杀手级应用程序之一——远离垂死的 Flash 平台的迁移路径——在某些方面有点小众。 过去几年,在 Adobe 不确定性的阴影下,古老的休闲游戏市场一直在争先恐后,现在终于清楚,任何基于 Flash 的游戏都必须在 2020 年正式推出。
商业软件工程师和 Web 开发人员——事实上,许多游戏开发人员也是如此——可能会听到“Flash”并立即退出。 因此,Haxe 基金会采用了 FlashDevelop IDE,并将其更名为 Haxe IDE,HaxeDevelop。
但很难摆脱一种关联——尤其是当它仍然非常相关时。 例如,拥有 7500 万用户的社交游戏 FlowPlay 选择 Haxe 而不是 Unity 和 HTML5,因为他们最近两年将 140 万行代码从 Flash 转移。 (案例研究中提供了更多详细信息。)
也许 Haxe 基金会很难突出这样的用例,同时仍然吸引非游戏软件的开发人员。 但不要让这阻止你进行一点探索。
Haxe 有什么大不了的?
Debian 项目将 Haxe 描述为“通用编程语言”。 这有几个方面。
一般来说, Haxe 语言意味着重用(好的)代码。 我的意思是:您可以在许多平台上重用 Haxe 代码,您可以将其与现有的 Haxe 和非 Haxe 代码集成,而且对于好的,Haxe 语言提供了许多经过验证的范例,例如类型安全。
继续沿多功能性主题,这转化为几个主要的用例类别——当然,闪存迁移除外。
从头开始开发跨平台应用程序或游戏。 Haxe 可以针对桌面、移动和 Web 平台,所有这些都来自单一语言的源代码库。 跨平台编程语言并不是什么新鲜事,跨平台桌面和移动应用程序和游戏有专门的解决方案。 但是Haxe 做了一些更特别的事情,因为它不仅可以针对多个平台,还可以针对多个范例,例如HTML5 和本机二进制文件。
一种语言“统治一切”。 请原谅托尔金的参考,但就像 Node.js 欢呼在网站的前端和后端使用相同语言的时代一样,任何具有类似于客户端-服务器架构的项目都可以使用 Haxe。
例如,Web 应用程序 FontStruct 使用 Haxe 在前端的 HTML5 画布上绘图和通过 Java2D 在后端进行绘图。 (但如前所述,这种方法是可选的——Haxe 也可以很好地与现有的非 Haxe 代码配合使用,因为它旨在不束缚您。)在所有上下文、平台上保持应用程序、游戏、业务甚至渲染逻辑一致,这样输出语言就容易多了。
逃离 JavaScript 到类型安全。 等等,这不是 TypeScript 的用途吗? 是的,如果你想保持对 JavaScript 输出的限制。 相比之下,Haxe 语言还可以转换为 Java、C++、C#、Python 和 Lua 等。
同时,Haxe 编程语言很容易从 JavaScript 中学习——它的语法并不意味着像 Rebol 这样的巨大范式转变,尽管这种转变的好处是。 Haxe 核心开发人员 Andy Li 博士对 TypeScript 和 Haxe 进行了更深入的比较,尽管这两种语言都在继续发展,但今天仍然适用。
编译器的非常快的工作流程。 这是最近添加的部分(虽然 Neko 之前是一个选项):HashLink 是一个跨平台虚拟机 (VM),它似乎在编译速度极快但在运行时也足够高性能之间取得平衡比如3D游戏。 但即使在 Web 端,Haxe 在编译时和运行时都可以胜过 TypeScript。
令人兴奋的前沿。 Haxe 本身是开源的,并且拥有一个活跃的社区,并且一直在添加新的语言功能。 它自己保存得最好的子秘密可能只是它的编译时宏系统,它本身有许多有趣的用例,让您可以随心所欲地进行元编程。 (我在下面提到了几个例子。)
还有谁在使用 Haxe?
对于初学者来说,当然是游戏开发者:Madden NFL Mobile、Evoland II、Double Kick Heroes……这些以及其他数百款已发布的游戏都是使用 Haxe 开发的。 但 Haxe 也在游戏领域之外掀起了波澜:
- 早在 2014 年, TiVo就使用 Haxe 将其 TiVo Premiere 盒子的性能提高了 30% 以上。
- Massive Interactive 的客户包括基于 Haxe 的“智能电视”系统的DAZN 和 Telecine (两者都拥有大量用户群),多年来一直在使用 Haxe。 他们的 UI 架构师 Philippe Elsass 向我指出,在他处理大型 Web 项目的经验中,Haxe 往往比 TypeScript 更易于使用,并且编译速度快一个数量级。
- Synolia 将 Haxe 语言用于其在线定制工具 Heidi,法国主要品牌 Carrefour 和 La Fnac 以及 Nickelodeon 都使用该工具。 据 Synolia 称,Haxe 工具包使他们能够有效地管理从 Flash 到 HTML5 的过渡,同时还能够在移动领域抓住新的业务发展机会。 Heidi 作为 SaaS 应用程序,Haxe 工具包允许他们在应用程序的不同层和服务之间共享通用源代码。
- 跨国企业Docler Holding于 2017 年成为 Haxe 基金会的战略合作伙伴。
Haxe 生态系统是什么样的?
谈到游戏和 Haxe,就开源框架和库而言,这是一个广阔的世界。 从独立的独立团队到拥有国际客户的成功工作室,Haxe 用户在各地共享代码:
- Flambe 被迪士尼、可口可乐和丰田等品牌用于开发 HTML5 游戏。
- Heaps 是近期热门 3D 战略游戏 Northgard 背后的高性能游戏框架。
- 为数百万移动游戏提供动力,快速开发库 awe6 或许是一颗隐藏的宝石中的一颗隐藏的宝石。
- Kha 可以针对 Xbox One、Nintendo Switch 和 PlayStation 4 以及台式机和移动设备,并在其上构建了 20 多个游戏引擎。 这包括 Armoury,它具有完整的 Blender 集成,并且最近本身成为开源的。
- HaxeFlixel 最初以 Flash 的旧 Flixel 库为蓝本,是热门游戏的热门选择,如卧铺游戏Defender's Quest 。
- Gamua 的 Starling 是几年前用于 Facebook 的《愤怒的小鸟》端口的框架,现在有一个开源的 Haxe 端口。
- 基于 Flash API 的 OpenFL 也将很快成为针对多个游戏机(即 PlayStation 4、PlayStation Vita、XBox One 和 Nintendo Switch)的一种方式,无需额外的许可费用。 HaxeFlixel 和 Starling 都是建立在 OpenFL 之上的,但有些游戏是直接在 OpenFL 上开发的,比如屡获殊荣的Papers, Please 。
- 多年前衍生出 OpenFL 的原生媒体引擎 NME 仍在发布主要版本。
- 也许您在 GitHub 的 Release Radar 博客上看到 HaxePunk(源自 FlashPunk)。
- 高度优化的 Nape 物理引擎非常适合任何需要更复杂物理的 2D 游戏引擎或模拟器。
诚然,游戏开发场景是 Haxe 语言生态系统中更为明显的一部分。 (也许这要归功于 Ludum Dare 这样的游戏堵塞的本质?)但商业甚至企业方面也正在表现出来。 例如:
- 模块化应用程序框架 hexMachina 支持特定领域语言 (DSL) 的使用和模型-视图-控制器 (MVC) 架构,以及许多其他功能。
- UI 布局引擎 HaxeUI 正在积极发展并获得企业支持。 3DVista 和 Kaizen for Pharma 等产品已随附生产应用程序。
- 它不是唯一的,thx.core 库及其相关库为 Haxe 提供了通用扩展,就像 Lodash 为 JavaScript 所做的那样。
- 说到 JavaScript,针对它的 Haxe 项目可能会从利用 Haxe Modular 中受益,这有助于 Telecine 和 FlowPlay 扩展他们庞大的项目,同时保持它们在客户端的快速加载。
- Haxe 的生态系统也在继续发展以与当前技术交互; 例如,现在有一个 GraphQL 库。
- 最后,典型的 Tinkerbell 将 Haxe 的宏系统用于各种有用的任务。 它具有用于 Web 路由、单元测试和嵌入 SQL 的框架,以及用于从模板和 CSS 选择器解析到异步/等待和低学习曲线反应状态处理的所有内容的库。
这些只是迄今为止 Haxe 语言用户所采用的一些方向的亮点。 Haxe.org 维护了按受欢迎程度排序的完整库列表,您也可以按标签浏览。 但同样值得强调的是 Haxe 基金会本身维护的几个项目:
- 对于 DevOps 角度,有官方的 Haxe Docker repo。
- 稳定性方面,即使有主要版本更新,Haxe 4 也会对那些依赖 Haxe 3 的项目提供一些兼容性帮助。
这听起来不错,但是在您的系统上运行开发环境是什么感觉?
Haxe 快速入门
无论是 Win、Mac 还是 Linux,第一步都是下载 Haxe。 那里的安装程序将提供一些不同的东西:
- Haxe 编译器本身,它应该允许您从终端或命令提示符运行
haxe
。 - Haxe 标准库,允许低级基础,但也有一些更高级别的通用支持。 例如,XML、ZIP 处理和 MySQL 访问都在这里得到了促进。
- Haxelib 包管理器,它允许您通过
haxelib
命令安装新包。 (注意:值得一试 lix 以获得比 Haxelib 提供的更高级的包管理,特别是如果您正在考虑在专业环境中使用 Haxe。) - Neko ,一个虚拟机目标,允许快速高效的重新编译和调试。
(也就是说,设置方法不止一种。例如,如果您已经安装了npm
,OpenFL 的安装说明可以选择通过 Yeoman 命令安装 Haxe。Homebrew 和 Chocolatey 也提供了类似的路径。)

无论如何,一旦有了 Haxe,就可以单独从命令行使用它,但开发人员通常会选择使用 IDE。 FlashDevelop/HaxeDevelop 仍然主要仅在 Windows 下得到支持。 大多数其他选项都是跨平台的(Win/Mac/Linux):
- VSCode 的 Haxe 插件得到很好的支持。
- IntelliJ IDEA 还有一个 Haxe 插件。
- 游戏框架 Kha 有自己的 IDE,称为 Kode Studio (Win/Mac/Linux)。
- Sublime Text 和 Atom 都有 Haxe 插件,许多其他编辑器也有,其中一些是特定于平台的。
出于本快速入门指南的目的,我们将使用 VSCode。 通过 Ctrl+P 和ext install haxe-extension-pack
获取 Haxe 扩展包可能是最简单的,但如果你是一个极简主义者,你可能只想为基本的 Haxe 插件本身ext install vshaxe
,然后选择任何一个您可能想要的包装的其他部分。
创建一个 Haxe 项目
由于 Haxe 语言可以转换为许多目标,因此使用构建文件可以更轻松地管理每个目标的完成方式。 但是,要开始使用,我们只需要一个扩展名为.hx
的 Haxe 类文件。
至于我们将放入其中的代码,让我们从 try.haxe.org 中获取 Array Comprehension 示例并将其放入名为Test.hx
的文件中:
class Test { static function main() { var a = [for (i in 0...10) i]; trace(a); // [0,1,2,3,4,5,6,7,8,9] var i = 0; var b = [while(i < 10) i++]; trace(b); // [0,1,2,3,4,5,6,7,8,9] } }
现在,从Test.hx
的位置,您可以在解释模式下运行 Haxe,即根本不进行编译,以查看这两个trace()
调用的输出:
$ haxe -main Test --interp Test.hx:4: [0,1,2,3,4,5,6,7,8,9] Test.hx:8: [0,1,2,3,4,5,6,7,8,9]
太好了,它有效!
将 Haxe 代码转换为 JavaScript
假设您想通过您网页上的一些 JavaScript 与世界分享它。 这是内置在 Haxe 中的,并且很简单:
$ haxe -main Test -js haxe-test.js
如果你安装了 Node.js,你可以像这样检查命令行的输出:
$ node my-cool-test.js [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
否则, haxe-test.js
中的代码就可以运行了——如果您要将它包含在网页中,您将在加载时在 Web 浏览器的开发人员控制台中看到输出。
转译和编译为本机二进制文件
假设您还想要一个用于正在开发的桌面的本机二进制文件。 为此,我们将转换为 C++ 目标,然后我们可以使用 C++(假设您已安装)将.cpp
输出编译为本机二进制文件。 为此,我们需要hxcpp
,所以我们需要安装它:
$ haxelib install hxcpp
之后,我们可以使用以下命令同时进行转译和编译:
$ haxe -main Test -cpp bin
然后我们的二进制文件就可以运行了:
$ bin/Test Test.hx:4: [0,1,2,3,4,5,6,7,8,9] Test.hx:8: [0,1,2,3,4,5,6,7,8,9]
(在 Windows 上,这将是bin\Test.exe
。)
创建 Haxe 构建文件 (.hxml)
尽管有暗示性的扩展名, .hxml
文件不是 XML — 与 HaxeDevelop 和 FlashDevelop 使用的.hxproj
文件不同,但我不会在本文中讨论它。 下面是build-all.hxml
完成我们上面所做的转译的样子:
-main Test # tells Haxe our main class is Test (case-sensitive) --each # all of the above commands will be applied to each target -js haxe-test.js # our first transpilation target --next # no other options, time to move to the next target -cpp bin # our second transpilation (and compilation) target
注意前缀的区别: -js
-main
-cpp
是您将直接传递给haxe
的每个参数,而--each
和--next
(两个连字符)是一个元级别,告诉编译器要做什么与其他参数。
现在,您只需运行haxe build-all.hxml
即可同时访问 JavaScript 和本机目标。
如果您想转译为 JavaScript,然后立即使用 Node 运行结果,您可以运行haxe run-js.hxml
,其中run-js.hxml
如下所示:
-main Test -js haxe-test.js -cmd node haxe-test.js
类似地,本机二进制文件的“构建和运行”看起来像这样(在 Linux 上,也就是说,Windows 需要一个变体):
-main Test -cpp bin -cmd bin/Test
VSCode 呢? 这部分很简单:您安装的扩展程序将自动选择这些.hxml
文件,在下拉列表中为您提供自动生成的构建任务(没有tasks.json
),让您选择要使用的构建文件。
注意:如果您打开了多个 VSCode 窗口,请小心——在撰写本文时,这可能会导致通过 Ctrl+B 构建时出现问题。 (你仍然可以使用命令行,没问题。)
斧头 4
如果您按照上述设置进行操作,您可能已经注意到下载页面包含指向 Haxe 安装程序的 3.x 和 4.x 分支的链接。
Haxe 编译器的最新版本 4 带来了许多新功能。 在一种情况下,这也证明了其宏系统的强大功能:Haxe 编译器过去缺乏对短 lambda 函数的支持,因此 slambda 库通过宏实现了对它们的支持。 从版本 4 开始,编译器内置了支持,并且该库已被弃用。
那么 Haxe 4 还能带来什么?
不一定有太多引人注目的人。 相反,Haxe 4 有许多较小的改进。 毕竟,与类似项目相比,Haxe 本身是相当成熟的技术,由一个更小、更专注的团队开发——而且将任何一个项目称为与 Haxe类似的项目可能有点牵强。
它的许多最有趣的功能已经存在了一段时间。 例如,我在上面提到 Haxe 通过 Neko 或 HashLink 提供了一个快速的工作流程。 但自 2016 年以来,它还配备了编译服务器。 这意味着对于非 VM 目标,由于内存缓存,重新编译依赖于大型库的项目将快得多——Haxe IDE 也可以利用它来完成代码。
但 Haxe 4 尤其会看到:
- 宏执行速度提高了 4 倍。
- PHP5 支持被删除。
- 一些 TypeScript 用户可能会欢迎的语法更新,即使它们在两种语言之间略有不同。 即箭头函数和新的函数类型语法。
Haxe 教程
虽然您可以随时深入了解 Haxe 的标准 API 或语法文档,但也有一些更适合初学者的 Haxe 材料。
如果您更喜欢以视频为导向,2018 年在西雅图举行的 Haxe 美国峰会将与其他年份的研讨会一起举办研讨会,以获得更多业内人士的看法。
但有时可能会让你更容易开始的是更具体的教程。 就像一个关于如何在 HaxeFlixel 中构建地牢爬行游戏的从头到尾的教程。 还有一系列 HaxeFlixel 教程,可以解释更多幕后发生的事情。 在 3D 端,有一个关于军械库入门的 Haxe 教程。
或者,您可能只是想要一个关于 XML 快速处理的 Haxe 教程——这是许多已有几年历史但仍然非常相关的教程之一。 正如我之前提到的,虽然有很多前沿,但在 Haxe 中开发的许多基础知识在这一点上是稳定的,所以教程不一定很快就会过时。 (在他们这样做的地方,它通常来自对特定库的依赖,而不是对 Haxe 核心本身的依赖。)
如您所见,您可以将 Haxe 语言(或者它可以带您)带入许多不同的方向。 我希望您喜欢这次对 Haxe 多样化和迷人世界的介绍,我期待听到您最终使用 Haxe 的技术做了什么!