Haxe: il segreto meglio custodito dello sviluppo multipiattaforma
Pubblicato: 2022-03-11Il moderno linguaggio di programmazione Haxe è ben noto in alcuni ambienti, ma molti che lo leggono non ne avranno mai sentito parlare. Non lasciarti ingannare dal suo status di nicchia, però. Da quando è apparso per la prima volta nel 2005, è stato messo alla prova dai suoi seguaci fedeli, anche se piuttosto silenziosi. Vanta una combinazione pragmatica e matura di funzionalità per lo sviluppo in contesti aziendali, di gioco e persino accademici.
Disney, Hasbro e la BBC stanno usando Haxe, quindi perché altri sviluppatori non ne hanno sentito parlare? Forse la sua versatilità significa che non esiste un'unica "app killer" per il linguaggio di programmazione Haxe.
O forse è perché una delle sue prime killer app, un percorso di migrazione lontano dalla piattaforma Flash in via di estinzione, è in qualche modo un po' di nicchia. Il venerabile mercato dei giochi casuali è stato rimescolato negli ultimi anni all'ombra dell'incertezza di Adobe, e ora è finalmente chiaro che qualsiasi cosa basata su Flash dovrà ufficialmente muoversi entro il 2020.
Gli ingegneri del software aziendale e gli sviluppatori Web, in effetti, anche molti sviluppatori di giochi potrebbero sentire "Flash" e interrompersi immediatamente. Da qui la Fondazione Haxe che prende l'IDE FlashDevelop e lo rinomina più come IDE Haxe, HaxeDevelop.
Ma può essere difficile scrollarsi di dosso un'associazione, specialmente quando continua a essere abbastanza rilevante. Ad esempio, FlowPlay, i cui social games hanno 75 milioni di utenti, ha scelto Haxe rispetto a Unity e HTML5 per la recente transizione di due anni di 1,4 milioni di righe di codice da Flash. (Maggiori dettagli sono disponibili nel case study.)
Forse è difficile per la Haxe Foundation essere in grado di evidenziare casi d'uso come questo, pur facendo appello agli sviluppatori di software non di gioco. Ma non lasciare che questo ti scoraggi da una piccola esplorazione.
Qual è il problema con Haxe?
Il progetto Debian descrive Haxe come un "linguaggio di programmazione universale". Ci sono diversi aspetti in questo.
In generale, il linguaggio Haxe significa riutilizzare il codice (buono) . Con questo intendo dire: puoi riutilizzare il codice Haxe su molte piattaforme, puoi integrarlo con codice Haxe e non Haxe esistente e, per fortuna , il linguaggio Haxe rende disponibili molti paradigmi collaudati, come la sicurezza dei tipi.
Continuando sul tema della versatilità, questo si traduce in diverse categorie principali di casi d'uso, a parte la migrazione Flash, ovviamente.
Sviluppare da zero un'app o un gioco multipiattaforma. Haxe può scegliere come target piattaforme desktop, mobili e Web da una base di origine in un'unica lingua. I linguaggi di programmazione multipiattaforma non sono una novità e ci sono soluzioni speciali per applicazioni e giochi desktop e mobili multipiattaforma. Ma Haxe fa qualcosa di un po' più speciale, nel senso che può puntare non solo a piattaforme multiple, ma a più paradigmi, ad esempio HTML5 e binari nativi.
Una lingua "per dominarli tutti". Perdonate il riferimento a Tolkien, ma proprio come Node.js ha salutato un'era di utilizzo dello stesso linguaggio sul front-end e sul back-end di un sito Web, qualsiasi progetto con qualcosa di simile a un'architettura client-server può utilizzare Haxe per entrambe le metà.
Ad esempio, l'app Web FontStruct utilizza Haxe sia per disegnare su una tela HTML5 sul front-end che tramite Java2D sul back-end. (Ma come accennato, questo approccio è facoltativo: Haxe funziona bene anche con il codice non Haxe esistente, perché è progettato per non vincolarti.) Mantenere l'app, il gioco, il business e persino il rendering della logica coerente in tutti i contesti, piattaforme, e le lingue di output sono molto più semplici in questo modo.
Fuggendo da JavaScript per digitare la sicurezza. Aspetta, non è a questo che serve TypeScript? Sì, se vuoi rimanere limitato all'output JavaScript. Il linguaggio Haxe, al contrario, può anche transpilare in Java, C++, C#, Python e Lua, tra gli altri.
Nel frattempo, il linguaggio di programmazione Haxe è abbastanza facile da imparare provenendo da JavaScript: la sua sintassi non significa un enorme cambiamento di paradigma come, ad esempio, quello di Rebol, nonostante i vantaggi di tale cambiamento. Il Dr. Andy Li, sviluppatore principale di Haxe, ha scritto un confronto più approfondito tra TypeScript e Haxe che è ancora rilevante oggi, sebbene entrambi i linguaggi continuino ad evolversi.
Flusso di lavoro abbastanza veloce per un compilatore. Questo è un pezzo aggiunto più di recente (sebbene Neko fosse un'opzione prima): HashLink è una macchina virtuale (VM) multipiattaforma che sembra trovare un equilibrio tra l'essere estremamente veloce da compilare, ma anche abbastanza performante in fase di esecuzione per le cose come i giochi 3D. Ma anche sul lato web, Haxe può superare TypeScript sia in fase di compilazione che in fase di esecuzione.
Una frontiera emozionante. Haxe stesso è open-source e ha una comunità attiva, con nuove funzionalità linguistiche aggiunte continuamente. Il suo sottosegreto meglio custodito potrebbe essere semplicemente il suo sistema di macro in fase di compilazione, che a sua volta ha molti casi d'uso interessanti, che ti consentono di meta-programmare a tuo piacimento. (Cito alcuni esempi di seguito.)
Chi altro sta usando Haxe?
Per cominciare, sviluppatori di giochi, ovviamente: Madden NFL Mobile, Evoland II, Double Kick Heroes... questi e centinaia di altri giochi pubblicati sono stati sviluppati utilizzando Haxe. Ma Haxe sta facendo scalpore anche al di fuori della sfera dei giochi:
- Già nel 2014, TiVo ha utilizzato Haxe per aumentare le prestazioni delle sue scatole TiVo Premiere di oltre il 30%.
- Massive Interactive, i cui clienti includono DAZN e Telecine per i sistemi "smart TV" basati su Haxe (entrambi con un'ampia base di utenti), utilizza Haxe da anni. Il loro architetto dell'interfaccia utente Philippe Elsass mi ha notato che nella sua esperienza di lavoro con grandi progetti web, Haxe tende ad essere più semplice da usare di TypeScript e circa un ordine di grandezza più veloce da compilare.
- Synolia utilizza il linguaggio Haxe per il loro strumento di personalizzazione online Heidi, utilizzato dai principali marchi francesi Carrefour e La Fnac, e anche da Nickelodeon. Secondo Synolia, il toolkit Haxe ha consentito loro di gestire in modo efficiente la transizione da Flash a HTML5, ma anche di cogliere nuove opportunità di sviluppo del business nella sfera mobile. Essendo Heidi un'applicazione SaaS, il toolkit Haxe ha consentito loro di condividere codice sorgente comune tra i diversi livelli e servizi dell'app.
- L'impresa multinazionale Dodler Holding è diventata un partner strategico della Haxe Foundation nel 2017.
Com'è l'ecosistema Haxe?
Quando si tratta di giochi e Haxe, è un mondo ampio e vasto in termini di framework e librerie open source. Dai team indipendenti indipendenti agli studi di successo con clienti internazionali, gli utenti Haxe condividono il codice ovunque:
- Flambe è utilizzato da marchi come Disney, Coca-Cola e Toyota per sviluppare giochi HTML5.
- Heaps è il framework di gioco ad alte prestazioni dietro il recente successo di strategia 3D Northgard.
- Alimentando milioni di giochi mobili, la libreria a sviluppo rapido awe6 è forse una gemma nascosta all'interno di una gemma nascosta.
- Kha, che può prendere di mira XBox One, Nintendo Switch e PlayStation 4 oltre a desktop e dispositivi mobili, ha oltre 20 motori di gioco integrati. Ciò include Armory, che ha la piena integrazione con Blender e recentemente è diventato esso stesso open-source.
- Originariamente modellato sulla vecchia libreria Flixel per Flash, HaxeFlixel è la scelta popolare dietro a giochi come il successo dormiente Defender's Quest .
- Starling di Gamua, il framework utilizzato per il porting di Angry Birds su Facebook alcuni anni fa, ora ha un port Haxe open source.
- OpenFL, basato sull'API Flash, sarà presto anche un modo per prendere di mira più console, in particolare PlayStation 4, PlayStation Vita, XBox One e Nintendo Switch, senza costi di licenza aggiuntivi. HaxeFlixel e Starling sono entrambi basati su OpenFL, ma alcuni giochi sono sviluppati direttamente su OpenFL, come il pluripremiato Papers, Please .
- Anche il Native Media Engine, NME, da cui OpenFL è stato biforcato molti anni fa, sta ancora rilasciando versioni principali.
- Forse hai visto quando HaxePunk (discendente da FlashPunk) è apparso sul blog Release Radar di GitHub.
- Il Nape Physics Engine altamente ottimizzato è ottimo per qualsiasi motore di gioco o simulatore 2D che necessita di una fisica più sofisticata.
Certo, la scena dello sviluppo del gioco è una parte più visibile dell'ecosistema del linguaggio Haxe. (Forse questo è dovuto alla natura di game jam come Ludum Dare?) Ma anche gli affari e persino i lati dell'impresa stanno emergendo. Per esempio:
- Il framework dell'app modulare hexMachina supporta l'utilizzo del linguaggio specifico del dominio (DSL) e l'architettura Model-View-Controller (MVC), tra molte altre funzionalità.
- Il motore di layout dell'interfaccia utente HaxeUI è in continua evoluzione e dispone del supporto aziendale. Prodotti come 3DVista e Kaizen for Pharma hanno fornito app di produzione con esso.
- Non è l'unico, ma la libreria thx.core e i suoi parenti forniscono estensioni per scopi generici a Haxe, proprio come fa Lodash per JavaScript.
- Parlando di JavaScript, i progetti Haxe che lo prendono di mira possono trarre vantaggio dall'utilizzo di Haxe Modular, che ha aiutato sia Telecine che FlowPlay a scalare i loro enormi progetti mantenendoli a caricamento rapido sul lato client.
- Anche l'ecosistema di Haxe continua ad evolversi per interfacciarsi con le tecnologie attuali; ad esempio ora c'è una libreria GraphQL.
- Infine, l'esemplare Campanellino sfrutta il sistema macro di Haxe per tutti i tipi di attività utili. Dispone di framework per l'instradamento web, il test delle unità e l'incorporamento di SQL, oltre a librerie per qualsiasi cosa, dall'analisi del modello e del selettore CSS alla gestione dello stato reattivo asincrono/attendibile e della curva di apprendimento inferiore.
Questi sono solo i punti salienti di alcune delle direzioni che gli utenti del linguaggio Haxe hanno preso finora. Haxe.org mantiene un elenco completo di librerie ordinate per popolarità che puoi anche sfogliare per tag. Ma vale anche la pena evidenziare un paio di progetti che la stessa Haxe Foundation sostiene:
- Per l'angolo DevOps, c'è il repository Haxe Docker ufficiale.
- Per quanto riguarda la stabilità, anche con un aggiornamento della versione principale, Haxe 4 avrà un aiuto per la compatibilità per coloro che hanno progetti dipendenti da Haxe 3.
Sembra tutto carino, ma com'è avere un ambiente di sviluppo sul tuo sistema?

Avvio rapido Haxe
Che si tratti di Win, Mac o Linux, il primo passo è scaricare Haxe. Il programma di installazione fornirà alcune cose diverse:
- Il compilatore Haxe stesso , che dovrebbe consentirti di eseguire
haxe
dal tuo terminale o dal prompt dei comandi. - La libreria standard Haxe , che consente nozioni di base di basso livello, ma anche supporto generico di livello superiore. Ad esempio, XML, elaborazione ZIP e accesso a MySQL sono tutti facilitati qui.
- Il gestore di pacchetti Haxellib , che consente di installare nuovi pacchetti tramite il comando
haxelib
. (Nota: vale anche la pena dare un'occhiata a lix per una gestione dei pacchetti più avanzata rispetto a quella fornita da Haxelib, soprattutto se stai pensando di utilizzare Haxe in un contesto professionale.) - Neko , una macchina virtuale di destinazione che consente una ricompilazione e un debug rapidi ed efficienti.
(Detto questo, c'è più di un modo per eseguire la configurazione. Se hai già installato npm
, ad esempio, le istruzioni di installazione di OpenFL hanno la possibilità di installare Haxe tramite i comandi Yeoman. Anche Homebrew e Chocolatey forniscono percorsi simili.)
Ad ogni modo, una volta che hai Haxe, puoi usarlo dalla riga di comando da solo, ma gli sviluppatori spesso optano per l'utilizzo di un IDE. FlashDevelop/HaxeDevelop è ancora principalmente supportato solo in Windows. La maggior parte delle altre opzioni sono multipiattaforma (Win/Mac/Linux):
- Il plugin Haxe di VSCode è ben supportato.
- IntelliJ IDEA ha anche un plugin Haxe.
- Il framework dei giochi Kha ha il suo IDE chiamato Kode Studio (Win/Mac/Linux).
- Sublime Text e Atom hanno entrambi plug-in Haxe, così come molti altri editor, alcuni dei quali sono specifici della piattaforma.
Ai fini di questa guida rapida, andremo con VSCode. Potrebbe essere più semplice ottenere l'Haxe Extension Pack tramite Ctrl+P e ext install haxe-extension-pack
, ma se sei un minimalista potresti semplicemente voler ext install vshaxe
per il plug-in Haxe di base stesso e scegliere quello che preferisci altre parti del pacchetto che potresti desiderare.
Creazione di un progetto Haxe
Poiché il linguaggio Haxe può essere trasferito a molti target, gestire il modo in cui viene eseguito per ciascuno è semplificato utilizzando un file di build. Tuttavia, per iniziare, tutto ciò di cui abbiamo bisogno è un singolo file di classe Haxe con estensione .hx
.
Per quanto riguarda il codice che ci inseriremo, prendiamo l'esempio di Comprensione dell'array da try.haxe.org e inseriamolo in un file chiamato 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] } }
Ora, dalla posizione di Test.hx
, puoi eseguire Haxe in modalità di interpretazione, cioè senza transpilare, per vedere l'output di queste due chiamate 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]
Ottimo, funziona!
Transpilazione del codice Haxe in JavaScript
Supponiamo di voler condividere questo con il mondo tramite alcuni JavaScript su una tua pagina web. È integrato in Haxe ed è facile come:
$ haxe -main Test -js haxe-test.js
Se hai installato Node.js, puoi controllare l'output dalla riga di comando in questo modo:
$ 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 ]
Altrimenti, il codice in haxe-test.js
è pronto per l'uso: se dovessi includerlo in una pagina Web, vedresti l'output nella console per sviluppatori del tuo browser Web al caricamento.
Transpilazione e compilazione in un binario nativo
Supponiamo che tu voglia anche un binario nativo per il desktop su cui stai sviluppando. Per fare ciò, effettueremo la transpilazione nella destinazione C++, quindi possiamo usare C++ (supponendo che tu lo abbia installato) per compilare l'output .cpp
in un binario nativo. Per questo, avremo bisogno hxcpp
, quindi dovremo installarlo:
$ haxelib install hxcpp
Dopodiché, possiamo eseguire la traspirazione e la compilazione contemporaneamente con questo comando:
$ haxe -main Test -cpp bin
E poi il nostro binario è pronto per essere eseguito:
$ 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]
(Su Windows, questo sarebbe invece bin\Test.exe
.)
Creazione di un file di build Haxe (.hxml)
Nonostante l'estensione suggestiva, i file .hxml
non sono XML, a differenza dei file .hxproj
usati da HaxeDevelop e FlashDevelop, ma non lo tratterò in questo articolo. Ecco come sarebbe un build-all.hxml
per realizzare il transpiling che abbiamo fatto sopra:
-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
Nota la differenza nei prefissi: -main
, -js
e -cpp
sono tutti i parametri che passeresti direttamente a haxe
, mentre --each
e --next
(due trattini) sono su un meta-livello, dicendo al compilatore cosa fare con gli altri parametri.
Ora puoi raggiungere sia i target JavaScript che quelli nativi semplicemente eseguendo haxe build-all.hxml
.
Se si desidera eseguire il transpile in JavaScript e quindi eseguire immediatamente il risultato utilizzando Node, è possibile eseguire haxe run-js.hxml
, dove run-js.hxml
si presenta così:
-main Test -js haxe-test.js -cmd node haxe-test.js
Allo stesso modo, un "build and run" per il binario nativo sarebbe simile a questo (su Linux, cioè, sarebbe necessaria una variazione per Windows):
-main Test -cpp bin -cmd bin/Test
E per VSCode? Quella parte è semplice: l'estensione che hai installato rileverà automaticamente questi file .hxml
, offrendoti attività di build generate automaticamente (senza tasks.json
) in un menu a discesa, permettendoti di scegliere quale file di build utilizzare.
Nota: fai attenzione se hai più finestre VSCode aperte, tuttavia, al momento della stesura di questo articolo, ciò può causare problemi con la creazione tramite Ctrl+B. (Puoi comunque usare la riga di comando, nessun problema.)
Hax 4
Se hai seguito la configurazione di cui sopra, potresti aver notato che la pagina di download includeva collegamenti a entrambi i rami 3.xe 4.x del programma di installazione Haxe.
La versione all'avanguardia 4 del compilatore Haxe porta con sé molte nuove funzionalità. In un caso, questo è anche una testimonianza della potenza del suo sistema di macro: il compilatore Haxe mancava del supporto per le funzioni lambda brevi, quindi la libreria slambda ne implementava il supporto tramite le macro. A partire dalla versione 4, il supporto è integrato nel compilatore e la libreria è deprecata.
Quindi cos'altro sta portando Haxe 4 in tavola?
Non necessariamente troppi che attirano l'attenzione. Invece, Haxe 4 ha molti miglioramenti minori. Dopotutto, Haxe stessa è una tecnologia abbastanza matura, sviluppata da un team più piccolo e più concentrato, forse, rispetto a progetti simili, e forse è un po' esagerato chiamare un progetto simile a Haxe.
Molte delle sue caratteristiche più interessanti sono già presenti da tempo. Ad esempio, ho menzionato sopra che Haxe fornisce un flusso di lavoro veloce tramite Neko o HashLink. Ma dal 2016 ha anche un server di compilazione. Ciò significa che per le destinazioni non VM, la ricompilazione di un progetto che dipende da una libreria di grandi dimensioni sarà molto più veloce grazie alla memorizzazione nella cache in memoria, che può essere sfruttata anche dagli IDE Haxe per il completamento del codice.
Ma Haxe 4, in particolare, vedrà:
- L'esecuzione delle macro è 4 volte più veloce.
- Supporto PHP5 in fase di eliminazione.
- Sono stati effettuati alcuni aggiornamenti sintattici che gli utenti di TypeScript probabilmente apprezzeranno, anche se sono leggermente diversi tra le due lingue. Vale a dire, le funzioni freccia e la nuova sintassi del tipo di funzione.
Tutorial Haxe
Sebbene tu possa sempre immergerti direttamente nell'API standard di Haxe o nella documentazione della sintassi, sono disponibili anche alcuni materiali Haxe più adatti ai principianti.
Se preferisci orientarti con i video, l'Haxe US Summit 2018 a Seattle ha i suoi workshop insieme a quelli degli altri anni, per ottenere una visione più interna.
Ma a volte ciò che potrebbe farti iniziare più facilmente è un tutorial più specifico. Come un tutorial dall'inizio alla fine su come costruire un gioco dungeon crawler in HaxeFlixel. C'è anche una serie di tutorial HaxeFlixel che spiegano di più su ciò che sta accadendo dietro le quinte mentre procedono. Sul lato 3D, c'è un tutorial Haxe su come iniziare con Armory.
O forse vuoi solo un tutorial Haxe sull'elaborazione rapida di XML: questo è uno dei tanti tutorial che ora hanno alcuni anni, ma ancora abbastanza rilevante. Come accennato in precedenza, sebbene ci siano molte frontiere, molte delle basi dello sviluppo in Haxe sono stabili a questo punto, quindi i tutorial non diventano necessariamente obsoleti molto rapidamente. (Dove lo fanno, di solito deriva da una dipendenza da una libreria specifica, non dal core Haxe stesso.)
Come puoi vedere, puoi portare il linguaggio Haxe, o può portarti, in molte direzioni diverse. Spero che questa introduzione al variegato e affascinante mondo di Haxe ti sia piaciuta e non vedo l'ora di sapere cosa finirai per fare con la tecnologia di Haxe!