Haxe Review: Caracteristici și puncte forte Haxe 4

Publicat: 2022-03-11

Revizuirea noastră anterioară Haxe s-a încheiat cu o privire asupra viitorului Haxe 4. Odată cu lansarea oficială a lui Haxe 4 (și, la scurt timp după aceea, două lansări de corecție a erorilor — versiunea 4.0.1 și 4.0.2), este timpul pentru o nouă revizuire Haxe. . Care sunt cele mai recente completări la acest limbaj de programare în plină dezvoltare? Încotro se îndreaptă comunitatea limbajului de programare Haxe? Motoarele de joc Haxe sunt în continuare pilonul său principal?

Haxe Review: Noile caracteristici ale lui Haxe 4

Cu mai mult de trei ani de dezvoltare de la ultima versiune majoră, versiunea 4 a limbajului de programare Haxe îmbunătățește performanța macro, experiența dezvoltatorului și sintaxa. Trei dintre îmbunătățirile sale sunt încă considerate experimentale, dar merită evidențiate: noua țintă de cod de octet JVM, suport pentru marcaj inline și verificări de siguranță nule.

Ținta de compilare a codului octet JVM experimental în Haxe 4

Noua țintă de cod de octet JVM a lui Haxe 4 face dezvoltarea Java prin Haxe destul de mult mai eficientă prin eliminarea unui pas major de compilare: nu există un al doilea pas de a avea propriul compilator Java ( javac ) să compileze codul sursă Java a transpilerului Haxe.

O comparație între noua țintă JVM directă cu fluxul de lucru original atunci când se dezvoltă pentru o țintă Java. Originalul ia o sursă .hx, produce sursă .java, care, la rândul său, trebuie să fie compilată cu un compilator Java (care depinde de JDK) înainte ca un fișier .jar rulabil să fie în sfârșit produs. Noua țintă permite dezvoltatorilor să treacă direct de la sursa .hx la un fișier .jar rulabil.

Această metodă de compilare cu Haxe 4 elimină, de asemenea, complet dependența de kitul de dezvoltator Java (JDK) și deschide ușa pentru implementarea depanării interactive în viitor.

Până când versiunea principală a hxjava este compatibilă cu Haxe 4, configurarea de bază implică instalarea Haxe și Haxelib, apoi rularea haxelib install hxjava 4.0.0-alpha . După aceasta, fluxul de dezvoltare este simplu:

 # 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

Având în vedere că compilarea JVM directă are încă un statut experimental în Haxe 4, vine cu câteva avertismente:

  • Există unele probleme specifice Android.
  • Performanța de rulare nu este la fel de bună, chiar dacă în cele din urmă va fi mai rapidă decât metoda indirectă.

Cu toate acestea, este un pas notabil în direcția corectă pentru oricine folosește tehnologiile bazate pe Java.

Suport de markup inline experimental în Haxe 4

JSX, cineva? Haxe 4 permite marcarea inline, permițând dezvoltatorilor să scrie, de exemplu, HTML direct în codul sursă Haxe:

 var dom = jsx( <div> <h1>Hello!</h1> <p>This is a paragraph.</p> </div> );

Deoarece jsx() aici poate fi o funcție macro statică, acest lucru permite unui proiect să aibă verificări în timp de compilare pentru a stabili dacă marcajul este conform cu orice specificație XML pe care dezvoltatorul dorește să o implementeze. Deoarece suportul XML în sine este încorporat în API-ul Haxe, verificarea poate folosi Xml.parse() , dar pentru analizarea de bază „XML-ish”, nici măcar asta nu este necesară:

 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); } }

Intenția acestei funcții este de a ajuta Haxe să iasă din balonul de dezvoltare a jocului (deși cu siguranță are utilizări și acolo). Este destul de general că este implementat la nivel de compilator – deci nu este nevoie de API-ul Haxe în macrocomanda de mai sus – dar verificarea anumitor DSL-uri este următoarea întrebare pe care echipa compilatorului și comunitatea trebuie să o descopere.

Siguranța nulă experimentală în Haxe 4

De la inventarea referinței nul în 1965, problema siguranței nul a fost adesea nenorocirea dezvoltatorilor în medii tip nullable, cum ar fi limbajul de programare Haxe. Aleksandr Kuzmenko estimează că GitHub remediază erorile de referință ale indicatorului nul de peste 10 milioane.

Haxe 4 are încorporate macrocomenzi de siguranță nulă în timp de compilare, care pot fi activate prin includerea unei linii @:nullSafety chiar înainte de o anumită definiție. Vine în @:nullSafety(Loose) (implicit) și @:nullSafety(Strict) și poate fi dezactivat după cum este necesar cu @:nullSafety(Off) . Modul Strict va analiza apelurile de funcție pentru mutații de câmp care ar putea atribui nul, chiar și într-un context nul cu siguranță dezactivată.

Dezvoltatorii Ruby s-ar putea întreba dacă operatorul de navigație sigur la îndemână ( ?. în Ruby) este pe radar. Nu încă, dar ca și în cazul multor aspecte ale programării în Haxe, există o macrocomandă pentru asta (rețineți că folosește !. în schimb.)

Experiență de dezvoltator (DX) cu Haxe 4: adăugiri de sintaxă, zahăr sintactic și multe altele

Adăugările legate de DX la limbajul de programare Haxe și suportul Haxe IDE aduc experiența Haxe 4 cel puțin la nivelul altor limbaje de programare pe diverse fronturi. Într-un fel, Haxe încearcă să fie totul pentru toată lumea, dar echipa de compilare adoptă o abordare atentă pentru integrarea celor mai utile caracteristici și convenții din alte limbi.

Rezultatul este că limbajul de programare Haxe și API-ul standard evoluează fără a le compromite stabilitatea, sensibilitatea și coeziunea. Nu totul în această recenzie Haxe va părea demn de hype și tocmai acesta este ideea: DX se îmbunătățește, iar acest lucru este în favoarea pur și simplu urmăririi „trăsăturilor spectaculoase du jour ”.

Există totuși un echilibru: schimbările lui Haxe sunt realizate cu conștientizarea tiparelor pe care le urmăresc alte limbi, iar Haxe 4 face cu siguranță un efort pentru a atrage noii veniți din limbi mai populare.

Sintaxă nouă „Tip de funcție”.

În această notă, Haxe acceptă acum două moduri majore de reprezentare a tipurilor de funcții. Vechea sintaxă „sugerează că auto-curry și aplicația parțială sunt acceptate, dar nu sunt”, conform propunerii inițiale de caracteristică:

 Int -> String -> Void

Noua sintaxă permite argumente numite, ceea ce îmbunătățește DX:

 (id:Int, name:String) -> Void

Dar, pe lângă DX, folosirea noii sintaxe a lui Haxe 4 pentru tipurile de funcții este un obicei bun, deoarece sintaxa veche, inferioară, poate fi eliminată într-o versiune majoră viitoare.

Zahăr Sintactic... Un fel de

Poate că nu este inovator, dar îmbunătățirile sintactice ale Haxe 4 vor fi o veste binevenită atât pentru dezvoltatorii existenți Haxe cu anumite medii de dezvoltare (ES6, de exemplu), cât și pentru cei care ar putea veni de la ei la Haxe pentru prima dată.

Sintaxa funcției săgeată („lambda scurtă”) este acum acceptată, care în cazul lui Haxe este mai mult sau mai puțin o comandă rapidă pentru tastarea function și return . Sintaxele de iterație cheie-valoare și index-valoare (pentru hărți și, respectiv, matrice) sunt acum acceptate. Declarațiile de tip care utilizează extensii statice pot folosi doar o declarație using la nivel global, în loc să aibă nevoie de ele oriunde sunt utilizate metodele de extensie statică corespunzătoare.

Enumerările și rezumatele enumerate au și alte îmbunătățiri, una dintre acestea fiind că acestea din urmă au trecut de la domeniul macrocomenzilor la suport direct pentru compilator. Alte caracteristici mutate în mod similar includ clasele finale, interfețele finale și câmpurile externe.

Unele funcții care se bazează pe macrocomenzi au rămas dependente de macrocomenzi, dar s-au îmbunătățit totuși. Supraîncărcarea operatorului a fost mărită pentru a include setatori de câmpuri, iar metadatele pot fi acum spațiate de nume cu . separatori ca în @:prefix.subprefix.name .

Numele de zahăr sintactic la modificările de mai sus este, desigur, o simplificare excesivă, dar cititorii sunt bineveniți să cerceteze propunerile originale legate de notele de lansare ale lui Haxe 4 acolo unde au nevoie de mai multe detalii.

Mai multe îmbunătățiri Haxe 4 DX

În timp ce depanarea interactivă era deja posibilă în Haxe pentru diverse ținte compilate, noua țintă de eval face posibilă depanarea interactivă pentru codul interpretat. Pentru un exemplu simplu, puteți lua orice director de proiect al tutorialului Haxe „Hello, World” și puteți adăuga un fișier numit whatever-you-want.hxml arătând astfel:

 --main HelloWorld --interp

… și obțineți depanare interactivă în IDE-ul VSCode pur și simplu prin:

  1. Deschiderea directorului de proiect în VSCode;
  2. Adăugarea unui punct de întrerupere undeva; și
  3. Atingeți F5 și alegeți „Interpretul Haxe” din meniul drop-down.

Această caracteristică vă permite, de asemenea, să depanați codul macro interactiv în același mod, chiar dacă de fapt compilați pentru o anumită țintă, cum ar fi java (în loc să utilizați --interp ). Singura cerință de instalare în afară de Haxe și VSCode în sine este extensia Haxe VSCode.

Servicii IDE

Vorbind despre IDE-uri, Haxe 4 introduce un nou protocol de servicii IDE, care este deja folosit în cea mai recentă extensie VSCode Haxe, vshaxe. Pe lângă o creștere semnificativă a performanței, acest lucru permite vshaxe să ofere câteva îmbunătățiri DX extrem de utile, inclusiv:

  • importuri automate (mult așteptate).
  • Sugestii pentru completarea automată care arată mai multe detalii, cum ar fi răspunsul la întrebarea „De unde este acest câmp?”
  • Completare automată foarte amănunțită în mai multe moduri noi, cum ar fi completarea tipului așteptat, finalizarea postfixului și completarea suprascrierii
  • Optimizări până la apăsarea tastei în timp ce introduceți codul

Este mult mai ușor să vedeți valoarea acestora prin intermediul demo-urilor vizuale excelente din jurnalul de modificări vshaxe relevant. vshaxe cu VSCode nu este singurul IDE Haxe din jur — HaxeDevelop și Kode Studio sunt specifice pentru Haxe și există pluginuri Haxe IDE pentru IntelliJ IDEA, Sublime Text, Atom etc. — dar pare să fie înaintea pachetului în termeni de a utiliza noul protocol de servicii IDE al Haxe 4, urmat îndeaproape de IntelliJ-Haxe.

Literale Unicode

Dezvoltatorii care doresc să folosească șiruri literale Unicode reale vor găsi suport pentru asta în Haxe 4, dar există câteva nuanțe de care trebuie să fie conștienți.

Matrice numai pentru citire

API-ul Haxe standard are acum matrice numai pentru citire. Acestea sunt la fel de ușor de utilizat ca și declararea unei variabile ca fiind de tipul, de exemplu, haxe.ds.ReadOnlyArray<Int> , după care încercarea de a seta, împinge sau pop valori duce la diverse erori de compilator. Adăugați cuvântul cheie final la declarație și reatribuirea matricei în sine va fi de asemenea interzisă.

Call-site Inlining

Call-site inlineing este o nouă caracteristică a limbajului Haxe, care le permite dezvoltatorilor un control fin asupra locului în care sunt integrate funcțiile, utilă atunci când optimizează funcțiile apelate frecvent, în care compromisul general între dimensiunea și performanța ar putea fi altfel o decizie de pierdere-pierdere.


Acestea sunt completări utile la limbajul de programare Haxe deja excelent. Ce sunt dezvoltatorii din clădirea comunității Haxe acum că Haxe 4 a ieșit?

Dincolo de motoarele de joc Haxe: dezvoltare web cu Haxe 4

Baza de utilizatori a lui Haxe a fost istoric dominată de programatori de jocuri. Dar există o mulțime de exemple de utilizare Haxe – la scară – în alte segmente, cum ar fi stivele de afaceri, aplicațiile mobile și web, atât pentru dezvoltarea front-end, cât și pentru back-end.

În acest scop, Haxe 4 furnizează extern HTML regenerat, ceea ce înseamnă că API-ul standard js.html de la Haxe a fost actualizat cu API-ul web mai larg, așa cum îl definește MDN, precum și remedierea erorilor și adăugarea API-urilor lipsă. (De exemplu, Haxe 4 include acum API-ul Push.)

În discursul lui Juraj Kirchheim, Weaving a Better Web with Haxe, el indică exemple de soluții web bazate pe Haxe care sunt ordine de mărime mai eficiente – dar și mai robuste – într-un cadru de întreprindere.

El argumentează, de asemenea, împotriva abordării arhitecturale Rails (în ceea ce privește ierarhia folderelor), dar dezvoltatorii care favorizează un cadru web complet la Rails încă pot găsi unul. Alteori, poate fi de folos dezvoltatorilor să revizuiască sursa unui proiect web complet, caz în care merită să aruncați o privire la repo-ul public pentru Giffon, o platformă de cadouri pentru mulțimi care acceptă Haxe 4. La fel, centrată pe web, deschisă. bibliotecile sursă Haxe, cum ar fi Haxe Modular, care divizează JavaScript, genericul thx.core și bibliotecile surori, și veneratul set de instrumente web Haxe Tinkerbell, toate acceptă deja Haxe 4. La fel și soluția de interfață de utilizare multiplatformă HaxeUI, care acceptă un context web, dar vizează un domeniu mult mai larg, inclusiv dezvoltarea de aplicații pentru afaceri și desktop; în special, a continuat să se maturizeze până la lansarea noii limbi Haxe.

Web, jocuri, întreprindere... indiferent de platforma și aromă de aplicație pe care o vizează o echipă de dezvoltare – chiar și o echipă de câte unul –, dezvoltatorii Haxe vor trebui în cele din urmă să se confrunte cu gestionarea dependențelor. Pentru aceasta, o resursă utilă pentru ca dezvoltatorii Haxe să o revizuiască sunt diapozitivele din discursul lui Adam Breece, Scaling well with others.

Haxe ca cel mai bun limbaj de programare pentru jocuri

Există măcar un singur „cel mai bun” limbaj pentru dezvoltarea jocurilor? Este o întrebare subiectivă și ușor de găsit dezbateri aprinse. Mai mare decât ne-am putea aștepta doar din dimensiunea comunității sale, succesul lui Haxe în sfera dezvoltării jocurilor nu este cu siguranță o coincidență. Joe Williamson oferă o perspectivă asupra motivului pentru care ar putea fi acest lucru într-un interviu despre câștigarea jocului Ludum Dare 45 în 2019, iar acest lucru pare să continue și cu Haxe 4.

Creatorul original al lui Haxe, Nicolas Cannasse, folosește deja Haxe 4 în producție cu Northgard de la Shiro Games. Motion Twin folosește și Haxe 4 în producție pentru Dead Cells. Ambele jocuri au zeci de mii de recenzii pozitive pe Steam și sunt disponibile atât pentru PC-uri (Win, Mac și Linux) cât și pentru console - un rezultat cu adevărat formidabil, având în vedere că ambele jocuri au echipe de dezvoltare mai mici, dar baze de milioane de utilizatori. Dead Cells are chiar și o versiune iOS, cu o versiune Android și pe radar.

Din punct de vedere al bibliotecii, câteva motoare importante de joc Haxe sunt cu siguranță în pas cu modificările Haxe 4. Motoarele compatibile Haxe 4 includ Kha (și o parte din numeroasele motoare construite pe deasupra - de exemplu, Armory), HaxeFlixel și principala sa dependență OpenFL, NME și Heaps - desigur, deoarece asta este ceea ce Northgard și Dead Cells folosesc. HaxePunk lucrează și la compatibilitatea Haxe 4; într-un caz, o bibliotecă, Nape, a fost forțată să lucreze cu Haxe 4.

Unii dezvoltatori își fac și propriile motoare în loc să folosească unul dintre multele deja disponibile. De exemplu, Kirill Poletaev, care detaliază cum și de ce și-a scris propriul motor de joc 3D Haxe. Deoarece motorul menționat este intern, este logic să fie un exemplu de proiect care nu a migrat încă la Haxe 4.

Haxe 4: Continuarea progresului lină al unui lanț de instrumente excelent

Cu Haxe având o utilitate atât de largă, cele mai importante funcții Haxe 4 vor varia în funcție de dezvoltator, așa că această recenzie Haxe nu este deloc exhaustivă. Unele dintre modificările Haxe 4 lipsesc mai sus, inclusiv:

  • Adăugarea ieșirii ES6 pentru ținta JavaScript
  • Eliminarea caracteristicilor (dintre care unele sunt încă disponibile prin biblioteca hx3compat ) și a țintelor (PHP5 și în curând AS3)
  • Indicatoarele CLI sunt făcute mai consistente cu instrumentele obișnuite ( -lib -utilizarea fișierelor .hxml va trebui schimbată în -L sau --library , de exemplu).
  • Pe lângă faptul că final este acum un cuvânt cheie (care, prin urmare, nu poate fi folosit ca nume de variabilă), operator și overload sunt, de asemenea, cuvinte cheie recent rezervate.

Au existat, de asemenea, unele modificări de ultimă oră, dar sunt atât de puține încât multe biblioteci întreținute în mod activ nici măcar nu se deranjează să anunțe în mod explicit compatibilitatea Haxe 4 – în general, migrarea de la Haxe 3 se spune că este destul de simplă. La urma urmei, unul dintre obiectivele lui Haxe este stabilitatea în mijlocul jonglerii cu suportul pentru un număr mare de platforme țintă, iar Haxe 4 nu dezamăgește aici.

Dar utilizatorii noi? În cele din urmă, rămâne la latitudinea cititorului să decidă dacă Haxe este cel mai bun limbaj de codare pentru jocuri, dacă ecosistemul Haxe oferă cele mai solide biblioteci pentru dezvoltarea web sau dacă instrumentele specifice Haxe oferă cel mai sensibil DX pentru un anumit flux de lucru. Cel puțin, Haxe continuă să fie un candidat viabil în multe spații, oferind un avantaj secret pentru aproape orice dezvoltator.

Lectură suplimentară: Dezvoltatorii nou la Haxe ar putea fi interesați de un tutorial Haxe destul de nou de John Gabriele, precum și de notele de lansare ale Haxe 4.1.0 și Haxe 4.1.1.