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 的技術做了什麼!