Recensione Haxe: caratteristiche e punti di forza di Haxe 4
Pubblicato: 2022-03-11La nostra precedente recensione di Haxe si è conclusa con uno sguardo all'allora imminente Haxe 4. Con il rilascio ufficiale di Haxe 4 (e poco dopo, due versioni di patch di bug, la versione 4.0.1 e 4.0.2), è tempo di una nuova recensione di Haxe . Quali sono le ultime aggiunte a questo fiorente linguaggio di programmazione? Dove sta andando la comunità del linguaggio di programmazione Haxe? I motori di gioco Haxe sono ancora il suo pilastro?
Recensione Haxe: Nuove funzionalità di Haxe 4
Con oltre tre anni di sviluppo dall'ultima major release, la versione 4 del linguaggio di programmazione Haxe migliora le prestazioni delle macro, l'esperienza degli sviluppatori e la sintassi. Tre dei suoi miglioramenti sono ancora considerati sperimentali ma vale la pena evidenziare: la nuova destinazione del bytecode JVM, il supporto per il markup in linea e i controlli di sicurezza nulli.
L'obiettivo di compilazione del bytecode JVM sperimentale in Haxe 4
Il nuovo target bytecode JVM di Haxe 4 rende lo sviluppo Java tramite Haxe un po' più efficiente eliminando un passaggio importante di compilazione: non esiste un secondo passaggio per avere il compilatore Java ( javac
) che compili l'output del codice sorgente Java del transpiler di Haxe.
Questo metodo di compilazione con Haxe 4 rimuove anche completamente la dipendenza dal Java Developer Kit (JDK) e apre le porte per il debug interattivo da implementare in futuro.
Fino a quando la versione mainstream di hxjava
non sarà compatibile con Haxe 4, la configurazione di base prevede l'installazione di Haxe e Haxelib, quindi l'esecuzione di haxelib install hxjava 4.0.0-alpha
. Fatto ciò, il flusso di sviluppo è semplice:
# transpile directly to JVM bytecode with Haxe (-D jvm would also work): haxe --main HelloWorld --java jar_output --define jvm # run JVM bytecode with Java: java -jar jar_output/HelloWorld.jar
Dato che la compilazione diretta di JVM ha ancora uno stato sperimentale in Haxe 4, viene fornita con un paio di avvertimenti:
- Ci sono alcuni problemi specifici di Android.
- Le prestazioni di runtime non sono altrettanto buone, anche se alla fine saranno più veloci del metodo indiretto.
Tuttavia, è un notevole passo nella giusta direzione per chiunque utilizzi tecnologie basate su Java.
Supporto sperimentale del markup in linea in Haxe 4
JSX, chiunque? Haxe 4 abilita il markup in linea, consentendo agli sviluppatori di scrivere, ad esempio, HTML direttamente all'interno del codice sorgente Haxe:
var dom = jsx( <div> <h1>Hello!</h1> <p>This is a paragraph.</p> </div> );
Poiché jsx()
qui può essere una funzione macro statica, ciò consente a un progetto di avere controlli in fase di compilazione per verificare se il markup è conforme a qualsiasi specifica XML che lo sviluppatore si preoccupi di implementare. Poiché il supporto XML stesso è integrato nell'API Haxe, il controllo può sfruttare Xml.parse()
, ma per un'analisi "XML-ish" di base, non è nemmeno necessario:
static macro function jsx(expr) { return switch expr.expr { case EMeta({name: ":markup"}, {expr: EConst(CString(s))}): macro $v{"XML MARKUP: " + s}; case _: throw new haxe.macro.Expr.Error("not an xml literal", expr.pos); } }
L'intenzione con questa funzione è di aiutare a spingere Haxe fuori dalla bolla di sviluppo del gioco (sebbene abbia sicuramente degli usi anche lì). È abbastanza generale che sia implementato a livello di compilatore, quindi non necessita dell'API Haxe nella macro sopra, ma il controllo di DSL specifici è la prossima domanda che il team del compilatore e la comunità devono capire.
Sicurezza sperimentale nulla in Haxe 4
Dall'invenzione del riferimento nullo nel 1965, la questione della sicurezza nulla è stata spesso la rovina degli sviluppatori in ambienti tipizzati nullable come quello del linguaggio di programmazione Haxe. Aleksandr Kuzmenko stima che GitHub si impegna a correggere il numero di errori di riferimento del puntatore nullo superiore a 10 milioni.
Haxe 4 dispone di macro di sicurezza null in fase di compilazione integrate, che possono essere abilitate includendo una riga @:nullSafety
appena prima di una determinata definizione. È disponibile nelle @:nullSafety(Loose)
(impostazione predefinita) e @:nullSafety(Strict)
e può essere disabilitato secondo necessità con @:nullSafety(Off)
. La modalità Strict
esaminerà le chiamate di funzione per le mutazioni di campo che potrebbero assegnare null, anche in un contesto con disabilità di sicurezza nulla.
Gli sviluppatori di Ruby potrebbero chiedersi se il pratico operatore di navigazione sicura ( ?.
in Ruby) è sul radar. Non ancora, ma come per molti aspetti della programmazione in Haxe, c'è una macro per questo (nota che usa !.
invece.)
Developer Experience (DX) con Haxe 4: aggiunte di sintassi, zucchero sintattico e altro
Le aggiunte relative al DX al linguaggio di programmazione Haxe e al supporto Haxe IDE portano l'esperienza di Haxe 4 almeno al livello di altri linguaggi di programmazione su vari fronti. In un certo senso, Haxe cerca di essere tutto per tutti, ma il team del compilatore adotta un approccio ponderato verso l'integrazione delle funzionalità e delle convenzioni più utili di altri linguaggi.
Il risultato è che il linguaggio di programmazione Haxe e l'API standard si evolvono senza comprometterne la stabilità, la sensibilità e la coesione. Non tutto in questa recensione di Haxe sembrerà degno di clamore, ed è proprio questo il punto: il DX sta migliorando, e questo è a favore del semplice inseguimento di appariscenti "features du jour ".
C'è un equilibrio da trovare, però: i cambiamenti di Haxe sono fatti con la consapevolezza dei modelli che altre lingue stanno seguendo, e Haxe 4 fa sicuramente uno sforzo per attirare i nuovi arrivati da lingue più popolari.
Nuova sintassi "Tipo di funzione".
In questa nota, Haxe ora supporta due modi principali per rappresentare i tipi di funzione. La vecchia sintassi "suggerisce che il currying automatico e l'applicazione parziale sono supportati, ma non lo sono", secondo la proposta di funzionalità originale:
Int -> String -> Void
La nuova sintassi consente argomenti denominati, il che migliora DX:
(id:Int, name:String) -> Void
Ma DX a parte, usare la nuova sintassi di Haxe 4 per i tipi di funzione è una buona abitudine in cui entrare, poiché la vecchia sintassi inferiore potrebbe essere rimossa in una futura versione principale.
Zucchero sintattico... Più o meno
Forse non è rivoluzionario, ma i miglioramenti sintattici di Haxe 4 saranno una buona notizia sia per gli sviluppatori Haxe esistenti con determinati background di sviluppo (ES6, ad esempio) sia per coloro che potrebbero arrivare da loro su Haxe per la prima volta.
La sintassi della funzione freccia ("short lambda") è ora supportata, che nel caso di Haxe è più o meno semplicemente una scorciatoia per la digitazione della function
e return
. Sono ora supportate anche le sintassi di iterazione valore-chiave e valore-indice (rispettivamente per mappe e array). Le dichiarazioni di tipo che utilizzano estensioni statiche possono semplicemente usarne una using
a livello globale invece di averne bisogno ovunque vengano utilizzati i metodi di estensione statica corrispondenti.
Enum e enum abstract hanno altri miglioramenti, uno dei quali è che questi ultimi sono passati dall'ambito delle macro al supporto diretto del compilatore. Altre funzionalità spostate in modo simile includono classi finali, interfacce finali e campi esterni.
Alcune funzionalità basate sulle macro sono rimaste dipendenti dalle macro, ma sono comunque migliorate. L'overloading degli operatori è stato aumentato di livello per includere i field setter e ora è possibile assegnare ai metadati lo spazio dei nomi con .
separatori come in @:prefix.subprefix.name
.
Chiamare le modifiche di cui sopra zucchero sintattico è certamente una semplificazione eccessiva, ma i lettori sono invitati a scavare nelle proposte originali collegate alle note di rilascio di Haxe 4 dove hanno bisogno di maggiori dettagli.
Più potenziamenti di Haxe 4 DX
Mentre il debug interattivo era già possibile in Haxe per vari target compilati, il nuovo target eval
rende possibile il debug interattivo per il codice interpretato. Per un semplice esempio, puoi prendere qualsiasi directory di progetto del tutorial Haxe "Hello, World", aggiungere un file chiamato whatever-you-want.hxml
simile a questo:

--main HelloWorld --interp
... e ottieni il debug interattivo nell'IDE VSCode semplicemente:
- Apertura della directory del progetto in VSCode;
- Aggiunta di un punto di interruzione da qualche parte; e
- Premi F5 e scegli "Haxe Interpreter" dal menu a discesa.
Questa funzione ti consente anche di eseguire il debug interattivo del codice macro allo stesso modo, anche se stai effettivamente compilando per un target particolare come java
(piuttosto che usare --interp
). L'unico requisito di installazione oltre a Haxe e VSCode è l'estensione Haxe VSCode.
Servizi IDE
Parlando di IDE, Haxe 4 introduce un nuovo protocollo di servizi IDE, che è già sfruttato nell'ultima estensione VSCode Haxe, vshaxe. Oltre a un significativo aumento delle prestazioni, ciò consente a vshaxe di fornire alcuni miglioramenti DX estremamente utili, tra cui:
- Importazioni automatiche (tanto attese).
- Suggerimenti al passaggio del mouse per il completamento automatico che mostrano più dettagli, come la risposta alla domanda "Da dove viene questo campo?"
- Completamento automatico molto completo in diversi modi nuovi, come il completamento del tipo previsto, il completamento del postfisso e il completamento dell'override
- Ottimizzazioni dettagliate durante la digitazione del codice
È molto più facile vedere il valore di questi tramite le eccellenti demo visive dal registro delle modifiche di vshaxe pertinente. vshaxe
con VSCode non è l'unico IDE Haxe in circolazione: HaxeDevelop e Kode Studio sono specifici di Haxe e ci sono plug-in IDE Haxe per IntelliJ IDEA, Sublime Text, Atom, ecc., ma sembra essere all'avanguardia in termini di di utilizzare il nuovo protocollo di servizi IDE di Haxe 4, seguito da vicino da IntelliJ-Haxe.
Letterali Unicode
Gli sviluppatori che desiderano utilizzare stringhe letterali Unicode reali troveranno supporto per questo in Haxe 4, ma ci sono alcune sfumature di cui essere consapevoli.
Array di sola lettura
L'API Haxe standard ora ha array di sola lettura. Questi sono facili da usare come dichiarare una variabile come del tipo, ad esempio, haxe.ds.ReadOnlyArray<Int>
, dopodiché il tentativo di impostare, inviare o visualizzare valori genera vari errori del compilatore. Aggiungi la parola chiave final
alla dichiarazione e anche la riassegnazione dell'array stesso non sarà consentita.
Inline del sito di chiamata
L'integrazione del sito di chiamata è una nuova funzionalità del linguaggio Haxe che consente agli sviluppatori un controllo dettagliato su dove sono integrate le funzioni, utile quando si ottimizzano le funzioni chiamate di frequente in cui il compromesso complessivo tra dimensioni e prestazioni potrebbe altrimenti essere una decisione persa.
Queste sono utili aggiunte al già eccellente linguaggio di programmazione Haxe. Cosa stanno creando gli sviluppatori nella community di Haxe ora che Haxe 4 è uscito?
Oltre i motori di gioco Haxe: sviluppo Web con Haxe 4
La base di utenti di Haxe è stata storicamente dominata dai programmatori di giochi. Ma ci sono molti esempi di Haxe utilizzato, su larga scala, in altri segmenti, come gli stack aziendali, le app mobili e il Web, sia per lo sviluppo front-end che per il back-end.
A tal fine, Haxe 4 fornisce extern HTML rigenerati, il che significa che l'API standard js.html
di Haxe è stata aggiornata con l'API Web più ampia come la definisce MDN, oltre a correggere bug e aggiungere API mancanti. (Ad esempio, Haxe 4 ora include l'API Push.)
Nel discorso di Juraj Kirchheim, Weaving a Better Web with Haxe, indica esempi di soluzioni Web basate su Haxe che sono ordini di grandezza più efficienti, ma anche più robuste, in un ambiente aziendale.
Si oppone anche all'approccio architettonico di Rails (in termini di gerarchia di cartelle), ma gli sviluppatori che preferiscono un framework web completo alla Rails possono ancora trovarne uno. Altre volte, può essere utile agli sviluppatori rivedere la fonte di un progetto web completo, nel qual caso vale la pena dare un'occhiata al repository pubblico di Giffon, una piattaforma di crowd-gifting che supporta Haxe 4. Allo stesso modo, web-centrico, open- le librerie Haxe di origine come Haxe Modular che divide JavaScript, il generico thx.core e le sue librerie sorelle e il venerabile kit di strumenti Web Haxe Tinkerbell supportano già Haxe 4. Così fa la soluzione dell'interfaccia utente multipiattaforma HaxeUI, che supporta un contesto Web ma si rivolge a un ambito molto più ampio, compreso lo sviluppo di app aziendali e desktop; in particolare ha costantemente continuato a maturare fino al nuovo rilascio del linguaggio Haxe.
Web, giochi, impresa... indipendentemente dalla piattaforma e dal tipo di app che un team di sviluppo, anche composto da uno, si rivolge, gli sviluppatori Haxe alla fine dovranno affrontare la gestione delle dipendenze. Per questo, una risorsa utile per gli sviluppatori Haxe da rivedere sono le diapositive del discorso di Adam Breece, Scalare bene con gli altri.
Haxe come miglior linguaggio di programmazione per i giochi
Esiste anche un unico linguaggio "migliore" per lo sviluppo di giochi? È una domanda soggettiva e facile da trovare in accesi dibattiti. Più grande di quanto ci si potrebbe aspettare dalla sola dimensione della sua comunità, il successo di Haxe nella sfera dello sviluppo del gioco non è certamente casuale. Joe Williamson fornisce alcune informazioni sul motivo per cui questo potrebbe essere in un'intervista sulla vittoria del Ludum Dare 45 game jam nel 2019, e sembra probabile che questo continui con Haxe 4.
Il creatore originale di Haxe, Nicolas Cannasse, sta già utilizzando Haxe 4 in produzione con Northgard di Shiro Games. Motion Twin utilizza anche Haxe 4 nella produzione di Dead Cells. Entrambi i giochi hanno decine di migliaia di recensioni positive su Steam e sono disponibili sia per PC (Win, Mac e Linux) che per console, un risultato davvero formidabile considerando che entrambi i giochi hanno team di sviluppo più piccoli ma basi di utenti nell'ordine di milioni. Dead Cells ha anche una versione iOS, con anche una versione Android sul loro radar.
Dal punto di vista della libreria, molti dei principali motori di gioco Haxe stanno decisamente al passo con le modifiche di Haxe 4. I motori compatibili con Haxe 4 includono Kha (e una parte dei molti motori costruiti su di esso, ad esempio Armory), HaxeFlixel e le sue principali dipendenze OpenFL, NME e Heaps, naturalmente, poiché è quello che usano Northgard e Dead Cells. HaxePunk sta anche lavorando alla compatibilità con Haxe 4; in un caso, una libreria, Nape, è stata biforcuta per funzionare con Haxe 4.
Alcuni sviluppatori creano anche i propri motori invece di utilizzare uno dei tanti già disponibili. Ad esempio, Kirill Poletaev, che spiega come e perché ha scritto il suo motore di gioco 3D Haxe. Poiché detto motore è interno, ha senso che sia un esempio di un progetto che non è ancora migrato a Haxe 4.
Haxe 4: Continuare la regolare progressione di un'eccellente toolchain
Con Haxe che ha un'utilità così ampia, le funzionalità più importanti di Haxe 4 varieranno a seconda dello sviluppatore, quindi questa recensione di Haxe non è affatto esaustiva. Alcune delle modifiche di Haxe 4 mancano sopra, tra cui:
- L'aggiunta dell'output ES6 per la destinazione JavaScript
- La rimozione delle funzionalità (alcune delle quali sono ancora disponibili tramite la libreria
hx3compat
) e dei target (PHP5 e presto AS3) - I flag della CLI vengono resi più coerenti con gli strumenti comuni (i file
-lib
.hxml
dovranno essere modificati in-L
o--library
, per esempio). - Oltre ad essere
final
now una parola chiave (che quindi non può essere utilizzata come nome di variabile),operator
eoverload
sono anche parole chiave riservate.
Ci sono state anche alcune modifiche sostanziali, ma sono così poche che molte librerie mantenute attivamente non si preoccupano nemmeno di annunciare esplicitamente la compatibilità di Haxe 4: in generale, si dice che la migrazione da Haxe 3 sia abbastanza semplice. Dopotutto, uno degli obiettivi di Haxe è la stabilità nel mezzo del supporto di giocoleria per un numero elevato di piattaforme target, e Haxe 4 non delude qui.
E i nuovi utenti? Alla fine, sta al lettore decidere se Haxe è il miglior linguaggio di codifica per i giochi, se l'ecosistema Haxe offre le librerie più solide per lo sviluppo web o se gli strumenti specifici di Haxe offrono la DX più ragionevole per un particolare flusso di lavoro. Per lo meno, Haxe continua a essere un valido contendente in molti spazi, offrendo qualcosa di un vantaggio segreto per quasi tutti gli sviluppatori.
Ulteriori letture: gli sviluppatori che non conoscono Haxe potrebbero essere interessati a un tutorial su Haxe abbastanza nuovo di John Gabriele e anche alle note di rilascio di Haxe 4.1.0 e Haxe 4.1.1.