Haxe:跨平台开发的最佳秘密

已发表: 2022-03-11

现代编程语言 Haxe 在某些圈子里是众所周知的,但许多阅读本文的人可能从未听说过它。 不过,不要让它的利基地位愚弄你。 自从它于 2005 年首次亮相以来,它一直受到其忠诚——如果相当安静——的追随者的实战考验。 它拥有实用且成熟的功能组合,可用于商业、游戏甚至学术环境中的开发。

迪士尼、孩之宝和 BBC 都在使用 Haxe,为什么没有更多的开发者听说过呢? 也许它的多功能性意味着 Haxe 编程语言没有一个单一的“杀手级应用程序”。

或者可能是因为它最早的杀手级应用程序之一——远离垂死的 Flash 平台的迁移路径——在某些方面有点小众。 过去几年,在 Adob​​e 不确定性的阴影下,古老的休闲游戏市场一直在争先恐后,现在终于清楚,任何基于 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。 那里的安装程序将提供一些不同的东西:

  1. Haxe 编译器本身,它应该允许您从终端或命令提示符运行haxe
  2. Haxe 标准库,允许低级基础,但也有一些更高级别的通用支持。 例如,XML、ZIP 处理和 MySQL 访问都在这里得到了促进。
  3. Haxelib 包管理器,它允许您通过haxelib命令安装新包。 (注意:值得一试 lix 以获得比 Haxelib 提供的更高级的包管理,特别是如果您正在考虑在专业环境中使用 Haxe。)
  4. 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 的技术做了什么!

相关: Haxe 评论:Haxe 4 功能和优势