Recenzja Haxe: cechy i mocne strony Haxe 4

Opublikowany: 2022-03-11

Nasza poprzednia recenzja Haxe zakończyła się spojrzeniem na nadchodzącego Haxe 4. Wraz z oficjalnym wydaniem Haxe 4 (a wkrótce potem dwiema poprawkami błędów — wersjami 4.0.1 i 4.0.2), nadszedł czas na nową recenzję Haxe . Jakie są najnowsze dodatki do tego rozwijającego się języka programowania? Dokąd zmierza społeczność języków programowania Haxe? Czy silniki gier Haxe nadal są podstawą?

Recenzja Haxe: Nowe funkcje Haxe 4

Po ponad trzech latach rozwoju od ostatniego wydania głównego wersja 4 języka programowania Haxe poprawia wydajność makr, doświadczenie programistów i składnię. Trzy z jego ulepszeń są nadal uważane za eksperymentalne, ale warte podkreślenia: nowy cel kodu bajtowego JVM, obsługa znaczników wbudowanych i kontrole bezpieczeństwa zerowego.

Eksperymentalny cel kompilacji kodu bajtowego JVM w Haxe 4

Nowy cel kodu bajtowego JVM w Haxe 4 sprawia, że ​​programowanie Java za pomocą Haxe jest nieco bardziej wydajne, ponieważ eliminuje główny etap kompilacji: nie ma drugiego etapu posiadania własnego kompilatora Javy ( javac ) kompilującego kod źródłowy Javy transpilera Haxe.

Porównanie nowego bezpośredniego celu JVM z oryginalnym przepływem pracy podczas programowania dla celu Java. Oryginał pobiera trochę źródeł .hx, tworzy źródło .java, które z kolei musi zostać skompilowane za pomocą kompilatora Java (który zależy od JDK), zanim zostanie ostatecznie utworzony plik .jar, który można uruchomić. Nowy cel pozwala programistom przejść bezpośrednio ze źródła .hx do uruchamialnego pliku .jar.

Ta metoda kompilacji z Haxe 4 również całkowicie usuwa zależność od Java Developer Kit (JDK) i otwiera drzwi do interaktywnego debugowania, które zostanie zaimplementowane w przyszłości.

Dopóki główna wersja hxjava nie będzie zgodna z Haxe 4, podstawowa konfiguracja obejmuje instalację Haxe i Haxelib, a następnie uruchomienie haxelib install hxjava 4.0.0-alpha . Po wykonaniu tych czynności proces tworzenia jest prosty:

 # 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

Biorąc pod uwagę, że bezpośrednia kompilacja JVM nadal ma status eksperymentalny w Haxe 4, wiąże się z kilkoma zastrzeżeniami:

  • Istnieje kilka problemów specyficznych dla Androida.
  • Wydajność środowiska wykonawczego nie jest tak dobra, nawet jeśli w końcu będzie szybsza niż metoda pośrednia.

Niemniej jest to znaczący krok we właściwym kierunku dla każdego, kto korzysta z technologii opartych na Javie.

Eksperymentalna obsługa znaczników wbudowanych w Haxe 4

JSX, ktoś? Haxe 4 umożliwia wbudowane znaczniki, umożliwiając programistom pisanie na przykład kodu HTML bezpośrednio w kodzie źródłowym Haxe:

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

Ponieważ jsx() może być tutaj statyczną funkcją makr, pozwala to projektowi na sprawdzanie w czasie kompilacji, czy znacznik jest zgodny ze specyfikacją XML, którą programista chce zaimplementować. Ponieważ obsługa XML jest wbudowana w Haxe API, kontrola może wykorzystywać Xml.parse() , ale dla podstawowej parsowalności „XML-owej” nawet to nie jest potrzebne:

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

Intencją tej funkcji jest pomoc w wypchnięciu Haxe z bańki rozwoju gry (chociaż z pewnością ma tam również zastosowania). Jest na tyle ogólne, że jest zaimplementowane na poziomie kompilatora — stąd nie wymaga Haxe API w powyższym makrze — ale sprawdzenie konkretnych DSL jest kolejnym pytaniem, które zespół kompilatorów i społeczność musi rozwiązać.

Eksperymentalne bezpieczeństwo zerowe w Haxe 4

Od czasu wynalezienia odwołania do wartości null w 1965 r. kwestia bezpieczeństwa wartości null była często zmorą programistów w środowiskach z typami dopuszczającymi wartości null, takich jak język programowania Haxe. Aleksandr Kuzmenko szacuje, że GitHub popełnia naprawianie błędów odniesienia zerowego wskaźnika na ponad 10 milionów.

Haxe 4 ma wbudowane makra bezpieczeństwa null w czasie kompilacji, które można włączyć, dołączając linię @:nullSafety tuż przed daną definicją. Jest dostępny w @:nullSafety(Loose) (domyślny) i @:nullSafety(Strict) i można go wyłączyć w razie potrzeby za pomocą @:nullSafety(Off) . Strict będzie przeglądać wywołania funkcji dla mutacji pól, które mogą przypisać wartość null, nawet w kontekście z wyłączonym bezpieczeństwem null.

Deweloperzy Ruby mogą się zastanawiać, czy poręczny bezpieczny operator nawigacji ( ?. w Ruby) jest na radarze. Jeszcze nie, ale tak jak w przypadku wielu aspektów programowania w Haxe, jest do tego makro (zwróć uwagę, że zamiast tego używa !. .)

Doświadczenie programisty (DX) z Haxe 4: Dodatki składni, cukier składniowy i nie tylko

Związane z DX dodatki do języka programowania Haxe i wsparcie Haxe IDE sprawiają, że Haxe 4 jest przynajmniej na poziomie innych języków programowania na różnych frontach. W pewnym sensie Haxe stara się być wszystkim dla wszystkich, ale zespół kompilatorów stosuje przemyślane podejście do integracji najbardziej przydatnych funkcji i konwencji z innych języków.

W rezultacie język programowania Haxe i standardowe API ewoluują bez uszczerbku dla ich stabilności, wrażliwości i spójności. Nie wszystko w tej recenzji Haxe będzie wydawać się godne uwagi i właśnie o to chodzi: DX się poprawia, a to na korzyść po prostu ścigania krzykliwych „features du jour ”.

Należy jednak zachować równowagę: zmiany Haxe są dokonywane ze świadomością wzorców, którymi podążają inne języki, a Haxe 4 z pewnością stara się przyciągnąć nowicjuszy z bardziej popularnych języków.

Nowa składnia „typu funkcji”

W tej notatce Haxe obsługuje teraz dwa główne sposoby reprezentowania typów funkcji. Zgodnie z pierwotną propozycją funkcji, stara składnia „sugeruje, że automatyczne wyrównywanie i częściowe aplikacje są obsługiwane, ale nie są”:

 Int -> String -> Void

Nowa składnia pozwala na użycie nazwanych argumentów, co poprawia DX:

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

Ale na bok, DX, używanie nowej składni Haxe 4 dla typów funkcji jest dobrym nawykiem, ponieważ stara, gorsza składnia może zostać usunięta w przyszłej głównej wersji.

Cukier syntaktyczny… W pewnym sensie

Być może nie jest to przełomowe, ale ulepszenia składniowe Haxe 4 będą dobrą wiadomością zarówno dla istniejących deweloperów Haxe z pewnym doświadczeniem (na przykład ES6), jak i dla tych, którzy mogą przychodzić od nich do Haxe po raz pierwszy.

Obsługiwana jest teraz składnia funkcji strzałek („krótka lambda”), która w przypadku Haxe jest mniej więcej tylko skrótem do wpisywania function i return . Obecnie obsługiwane są również składnie iteracji typu klucz-wartość i indeks-wartość (odpowiednio dla map i tablic). Deklaracje typu używające rozszerzeń statycznych mogą po prostu używać jednej instrukcji using globalnie, zamiast potrzebować ich wszędzie, gdzie są używane odpowiednie metody rozszerzeń statycznych.

Wyliczenia i streszczenia wyliczeniowe mają kilka innych ulepszeń, z których jednym jest to, że te ostatnie przeszły z zakresu makr do bezpośredniej obsługi kompilatora. Inne funkcje przeniesione w podobny sposób obejmują końcowe klasy, końcowe interfejsy i pola zewnętrzne.

Niektóre funkcje oparte na makrach pozostały zależne od makr, ale mimo to zostały ulepszone. Przeciążenie operatorów zostało wyrównane, aby uwzględnić ustawiacze pól, a metadane można teraz umieszczać w przestrzeni nazw za pomocą . separatory jak w @:prefix.subprefix.name .

Nazywanie powyższych zmian cukrem składniowym jest wprawdzie nadmiernym uproszczeniem, ale czytelnicy mogą zagłębić się w oryginalne propozycje powiązane z notatkami wydania Haxe 4, w których potrzebują więcej szczegółów.

Więcej dopalaczy Haxe 4 DX

Podczas gdy interaktywne debugowanie było już możliwe w Haxe dla różnych skompilowanych celów, nowy cel eval umożliwia interaktywne debugowanie interpretowanego kodu. Dla prostego przykładu możesz wziąć dowolny katalog projektu samouczka Haxe „Hello, World”, dodać plik o nazwie whatever-you-want.hxml wygląda tak:

 --main HelloWorld --interp

…i uzyskaj interaktywne debugowanie w VSCode IDE po prostu przez:

  1. Otwarcie katalogu projektu w VSCode;
  2. Dodanie gdzieś punktu przerwania; oraz
  3. Wciśnięcie F5 i wybranie „Haxe Interpreter” z menu.

Ta funkcja umożliwia również interaktywne debugowanie kodu makr w ten sam sposób, nawet jeśli faktycznie kompilujesz dla konkretnego celu, takiego jak java (zamiast używać --interp ). Jedynym wymogiem instalacyjnym oprócz samych Haxe i VSCode jest rozszerzenie Haxe VSCode.

Usługi IDE

Mówiąc o IDE, Haxe 4 wprowadza nowy protokół usług IDE, który jest już wykorzystany w najnowszym rozszerzeniu VSCode Haxe, vshaxe. Oprócz znacznego wzrostu wydajności, pozwala to vshaxe zapewnić kilka niezwykle przydatnych ulepszeń DX, w tym:

  • (Długo oczekiwany) automatyczny import
  • Podpowiedzi dotyczące autouzupełniania pokazujące więcej szczegółów, na przykład odpowiedź na pytanie „Skąd pochodzi to pole?”
  • Bardzo dokładne autouzupełnianie na kilka nowych, zgrabnych sposobów, takich jak uzupełnianie oczekiwanego typu, uzupełnianie postfiksowe i uzupełnianie zastępcze
  • Precyzyjne optymalizacje podczas wpisywania kodu

O wiele łatwiej jest zobaczyć ich wartość dzięki doskonałym wizualnym demom z odpowiedniego dziennika zmian vshaxe. vshaxe z VSCode nie jest jedynym środowiskiem IDE Haxe — HaxeDevelop i Kode Studio są specyficzne dla Haxe i są też wtyczki Haxe IDE dla IntelliJ IDEA, Sublime Text, Atom itp. — ale wydaje się, że wyprzedza konkurencję pod względem wykorzystania nowego protokołu usług IDE Haxe 4, a tuż za nim IntelliJ-Haxe.

Literały Unicode

Deweloperzy, którzy chcą używać prawdziwych literałów ciągów Unicode, znajdą wsparcie dla tego w Haxe 4, ale są pewne niuanse, o których należy pamiętać.

Tablice tylko do odczytu

Standardowy interfejs API Haxe ma teraz tablice tylko do odczytu. Są one tak łatwe w użyciu, jak zadeklarowanie zmiennej typu, na przykład haxe.ds.ReadOnlyArray<Int> , po czym próba ustawienia, wypchnięcia lub pop wartości powoduje różne błędy kompilatora. Dodaj słowo kluczowe final do deklaracji, a ponowne przypisanie samej tablicy również będzie niedozwolone.

Inlining strony wywołania

Wstawianie witryny wywołania to nowa funkcja języka Haxe, która umożliwia programistom dokładną kontrolę nad tym, gdzie funkcje są wbudowane, co jest przydatne podczas optymalizacji często wywoływanych funkcji, gdzie ogólny kompromis między rozmiarem a wydajnością mógłby być decyzją przegraną.


Są to wartościowe dodatki do już doskonałego języka programowania Haxe. Kim są programiści tworzący społeczność Haxe teraz, gdy Haxe 4 wyszedł?

Silniki gier Beyond Haxe: tworzenie stron internetowych za pomocą Haxe 4

Baza użytkowników Haxe była historycznie zdominowana przez programistów gier. Istnieje jednak wiele przykładów wykorzystania Haxe – na dużą skalę – w innych segmentach, takich jak stosy biznesowe, aplikacje mobilne i Internet, zarówno do programowania front-end, jak i back-end.

W tym celu Haxe 4 dostarcza zregenerowane zewnętrzne elementy HTML, co oznacza, że ​​standardowy interfejs API js.html Haxe został zaktualizowany z szerszym internetowym interfejsem API zdefiniowanym przez MDN, a także naprawianiem błędów i dodawaniem brakujących interfejsów API. (Na przykład Haxe 4 zawiera teraz API Push).

W przemówieniu Juraj Kirchheim, Weaving a Better Web with Haxe, wskazuje przykłady rozwiązań internetowych opartych na Haxe, które są o rząd wielkości wydajniejsze, a jednocześnie bardziej niezawodne w środowisku korporacyjnym.

Argumentuje również przeciwko podejściu architektonicznemu Rails (w kategoriach hierarchii folderów), ale programiści, którzy preferują kompletny framework webowy a la Rails, wciąż mogą go znaleźć. Innym razem programiści mogą skorzystać na przejrzeniu źródła kompletnego projektu internetowego, w którym to przypadku warto przyjrzeć się publicznemu repozytorium Giffon, platformy społecznościowej obsługującej Haxe 4. Podobnie, zorientowana na sieć, otwarta- Biblioteki źródłowe Haxe, takie jak Haxe Modular z podziałem na JavaScript, ogólne thx.core i jego siostrzane biblioteki oraz czcigodny zestaw narzędzi internetowych Haxe Tinkerbell, wszystkie już obsługują Haxe 4. Podobnie jak wieloplatformowe rozwiązanie interfejsu użytkownika HaxeUI, które obsługuje kontekst sieciowy, ale ma o wiele szerszy zakres, w tym tworzenie aplikacji biznesowych i desktopowych; w szczególności stale dojrzewała, prowadząc do nowej wersji językowej Haxe.

Sieć, gry, przedsiębiorstwa… bez względu na platformę i smak aplikacji, na którą kieruje się zespół programistów — nawet jeden zespół — programiści Haxe w końcu będą musieli zmagać się z zarządzaniem zależnościami. W tym celu pomocnym źródłem dla programistów Haxe do przejrzenia są slajdy z przemówienia Adama Breece'a „Scaling well with other”.

Haxe najlepszym językiem programowania gier

Czy w ogóle istnieje jeden „najlepszy” język do tworzenia gier? To subiektywne pytanie, na które łatwo znaleźć gorące debaty. Większy niż można by się spodziewać po samej wielkości społeczności, sukces Haxe w sferze tworzenia gier z pewnością nie jest przypadkowy. Joe Williamson wyjaśnia, dlaczego może to być w wywiadzie na temat wygranej w grze Ludum Dare 45 w 2019 roku i wydaje się, że będzie to kontynuowane w Haxe 4.

Oryginalny twórca Haxe, Nicolas Cannasse, już używa Haxe 4 w produkcji z Northgard z Shiro Games. Motion Twin również używa Haxe 4 w produkcji Dead Cells. Obie gry mają dziesiątki tysięcy pozytywnych recenzji na Steam i są dostępne zarówno na komputery PC (Win, Mac i Linux), jak i na konsole – naprawdę niesamowity wynik, biorąc pod uwagę, że obie gry mają mniejsze zespoły programistów, ale bazy użytkowników w milionach. Dead Cells ma nawet wersję na iOS, a także na Androida.

Jeśli chodzi o bibliotekę, kilka głównych silników gier Haxe zdecydowanie podąża za zmianami Haxe 4. Silniki kompatybilne z Haxe 4 obejmują Kha (i część wielu zbudowanych na nim silników – np. Armoury), HaxeFlixel i jego główną zależność OpenFL, NME i Heaps – oczywiście, ponieważ to jest to, czego używają Northgard i Dead Cells. HaxePunk pracuje również nad kompatybilnością z Haxe 4; w jednym przypadku biblioteka Nape została rozwidlona do pracy z Haxe 4.

Niektórzy programiści tworzą również własne silniki zamiast używać jednego z wielu już dostępnych. Na przykład Kirill Poletaev, który szczegółowo opisuje, jak i dlaczego napisał własny silnik gry 3D Haxe. Ponieważ wspomniany silnik jest w domu, ma sens, że jest to jeden z przykładów projektu, który nie został jeszcze zmigrowany do Haxe 4.

Haxe 4: Kontynuacja płynnego rozwoju doskonałego łańcucha narzędzi

Ponieważ Haxe ma tak szerokie zastosowanie, najważniejsze funkcje Haxe 4 będą się różnić w zależności od dewelopera, więc ta recenzja Haxe nie jest w żaden sposób wyczerpująca. Powyżej brakuje niektórych zmian Haxe 4, w tym:

  • Dodanie wyjścia ES6 dla celu JavaScript
  • Usunięcie funkcji (niektóre z nich są nadal dostępne za pośrednictwem biblioteki hx3compat ) i celów (PHP5 i wkrótce AS3)
  • Flagi CLI są bardziej spójne z popularnymi narzędziami (na -lib .hxml plików .hxml będzie wymagało zmiany na -L lub --library ).
  • Oprócz tego, że final jest teraz słowem kluczowym (którego nie można używać jako nazwy zmiennej), operator i overload są również nowo zarezerwowanymi słowami kluczowymi.

Było też kilka przełomowych zmian, ale jest ich tak mało, że wiele aktywnie utrzymywanych bibliotek nawet nie zadaje sobie trudu, aby jawnie ogłosić kompatybilność z Haxe 4 — ogólnie rzecz biorąc, migracja z Haxe 3 jest uważana za dość prostą. W końcu jednym z celów Haxe jest stabilność pośród żonglującego wsparcia dla dużej liczby platform docelowych, a Haxe 4 nie zawodzi tutaj.

A co z nowymi użytkownikami? Ostatecznie to od czytelnika zależy, czy Haxe jest najlepszym językiem do kodowania gier, czy ekosystem Haxe oferuje najsolidniejsze biblioteki do tworzenia stron internetowych, czy też narzędzia specyficzne dla Haxe zapewniają najbardziej sensowny DX dla określonego przepływu pracy. Przynajmniej Haxe nadal jest realnym rywalem w wielu dziedzinach, oferując coś z tajnej przewagi dla prawie każdego dewelopera.

Czytaj dalej: Deweloperzy nowi w Haxe mogą być zainteresowani całkiem nowym samouczkiem Haxe autorstwa Johna Gabriele, a także informacjami o wydaniu Haxe 4.1.0 i Haxe 4.1.1.