Haxe: najlepiej strzeżony sekret wieloplatformowego rozwoju
Opublikowany: 2022-03-11Współczesny język programowania Haxe jest dobrze znany w niektórych kręgach, jednak wielu czytających go nigdy o nim nie słyszało. Nie daj się jednak zwieść jego niszowemu statusowi. Odkąd pojawił się po raz pierwszy w 2005 roku, był testowany w boju przez lojalnych – choć raczej cichy – następujących po nim. Oferuje pragmatyczną i dojrzałą kombinację funkcji do rozwoju w kontekście biznesowym, gamingowym, a nawet akademickim.
Disney, Hasbro i BBC używają Haxe, więc dlaczego nie słyszało o nim więcej programistów? Być może jego wszechstronność oznacza, że nie ma jednej „zabójczej aplikacji” dla języka programowania Haxe.
A może dlatego, że jedna z najwcześniejszych zabójczych aplikacji – ścieżka migracji z dala od umierającej platformy Flash – jest pod pewnymi względami nieco niszowa. Czcigodny rynek gier typu casual miotał się przez ostatnie kilka lat w cieniu niepewności Adobe, a teraz w końcu jest jasne, że wszystko, co oparte na Flashu, będzie musiało oficjalnie ruszyć do 2020 roku.
Inżynierowie oprogramowania biznesowego i twórcy stron internetowych — w rzeczywistości także wielu twórców gier — mogą usłyszeć „Flash” i natychmiast wyłączyć. Stąd Haxe Foundation przyjęła FlashDevelop IDE i zmieniła nazwę na Haxe IDE, HaxeDevelop.
Ale może być trudno otrząsnąć się ze skojarzenia – zwłaszcza, gdy nadal jest on dość istotny. Na przykład firma FlowPlay, której gry społecznościowe ma 75 milionów użytkowników, wybrała Haxe zamiast Unity i HTML5 ze względu na niedawne dwuletnie przeniesienie 1,4 miliona linii kodu z Flasha. (Więcej szczegółów jest dostępnych w studium przypadku.)
Być może Fundacji Haxe trudno jest wskazać takie przypadki użycia, jednocześnie przemawiając do twórców oprogramowania nie związanego z grami. Ale niech to nie zniechęci cię do małej eksploracji.
O co chodzi z Haxe?
Projekt Debian opisuje Haxe jako „uniwersalny język programowania”. Jest na to kilka aspektów.
Ogólnie język Haxe oznacza ponowne użycie (dobrego) kodu . Mam tu na myśli: możesz ponownie wykorzystać kod Haxe na wielu platformach, możesz go zintegrować z istniejącym kodem Haxe i nie-Haxe, a na dobre język Haxe udostępnia wiele sprawdzonych paradygmatów, takich jak bezpieczeństwo typów.
Kontynuując temat wszechstronności, przekłada się to na kilka głównych kategorii przypadków użycia — oczywiście pomijając migrację Flash.
Tworzenie od podstaw wieloplatformowej aplikacji lub gry. Haxe może kierować reklamy na platformy stacjonarne, mobilne i internetowe, wszystkie z jednego języka źródłowego. Wieloplatformowe języki programowania nie są niczym nowym i istnieją specjalistyczne rozwiązania dla wieloplatformowych aplikacji i gier na komputery stacjonarne i mobilne. Ale Haxe robi coś bardziej specjalnego w tym sensie, że może być skierowany nie tylko na wiele platform, ale także na wiele paradygmatów, np. HTML5 i natywne pliki binarne.
Jeden język „żeby wszystkim rządzić”. Przepraszam za odniesienie Tolkiena, ale tak jak Node.js ogłaszał erę używania tego samego języka na przedniej i tylnej stronie strony internetowej, każdy projekt z czymś przypominającym architekturę klient-serwer może używać Haxe w obu połowach.
Na przykład aplikacja internetowa FontStruct używa Haxe zarówno do rysowania na kanwie HTML5 z przodu, jak i za pośrednictwem Java2D na zapleczu. (Ale jak wspomniano, to podejście jest opcjonalne — Haxe dobrze współpracuje również z istniejącym kodem innym niż Haxe, ponieważ nie został zaprojektowany, aby cię nie wiązać). Utrzymywanie spójności aplikacji, gier, biznesu, a nawet renderowania logiki we wszystkich kontekstach, platformach, a języki wyjściowe są w ten sposób znacznie łatwiejsze.
Ucieczka od JavaScriptu do bezpieczeństwa typu. Czekaj, czy nie po to jest TypeScript? Tak, jeśli chcesz ograniczyć się do wyjścia JavaScript. W przeciwieństwie do tego język Haxe może również transpilować się między innymi do Javy, C++, C#, Pythona i Lua.
Tymczasem język programowania Haxe jest dość łatwy do nauczenia się z JavaScript — jego składnia nie oznacza ogromnej zmiany paradygmatu, takiej jak, powiedzmy, Rebol, niezależnie od korzyści takiej zmiany. Główny programista Haxe, dr Andy Li, napisał bardziej dogłębne porównanie między TypeScript i Haxe, które jest nadal aktualne, chociaż oba języki nadal ewoluują.
Dość szybki przepływ pracy dla kompilatora. Jest to ostatnio dodany element (chociaż Neko był wcześniej opcją): HashLink to wieloplatformowa maszyna wirtualna (VM), która wydaje się zapewniać równowagę między bardzo szybką kompilacją, a jednocześnie wystarczającą wydajnością w czasie wykonywania. jak gry 3D. Ale nawet po stronie internetowej Haxe może przewyższać TypeScript zarówno w czasie kompilacji, jak i w czasie wykonywania.
Ekscytująca granica. Sam Haxe jest oprogramowaniem typu open source i ma aktywną społeczność, a nowe funkcje językowe są dodawane przez cały czas. Jego najlepiej strzeżonym sekretem może być po prostu system makr w czasie kompilacji, który sam w sobie ma wiele interesujących przypadków użycia, pozwalając ci na metaprogramowanie według własnych upodobań. (Wspomnę kilka przykładów poniżej.)
Kto jeszcze używa Haxe?
Na początek oczywiście twórcy gier: Madden NFL Mobile, Evoland II, Double Kick Heroes… te i setki innych opublikowanych gier zostały opracowane przy użyciu Haxe. Ale Haxe robi również fale poza sferą gier:
- W 2014 roku TiVo wykorzystało Haxe do zwiększenia wydajności swoich pudełek TiVo Premiere o ponad 30%.
- Massive Interactive, którego klientami są m.in. DAZN i Telecine dla systemów „smart TV” opartych na Haxe (oba z dużymi bazami użytkowników), od lat korzysta z Haxe. Ich architekt interfejsu użytkownika, Philippe Elsass, zauważył, że z doświadczenia w pracy z dużymi projektami internetowymi Haxe jest prostszy w użyciu niż TypeScript, a kompilacja jest o rząd wielkości szybsza.
- Synolia używa języka Haxe w swoim internetowym narzędziu dostosowywania Heidi, z którego korzystają główne francuskie marki Carrefour i La Fnac, a także Nickelodeon. Według firmy Synolia zestaw narzędzi Haxe umożliwił im skuteczne zarządzanie przejściem z Flasha na HTML5, a także umożliwił korzystanie z nowych możliwości rozwoju biznesu w sferze mobilnej. Heidi będąc aplikacją SaaS, zestaw narzędzi Haxe umożliwił im udostępnianie wspólnego kodu źródłowego między różnymi warstwami i usługami aplikacji.
- Wielonarodowe przedsiębiorstwo Docler Holding zostało partnerem strategicznym Fundacji Haxe w 2017 roku.
Jaki jest ekosystem Haxe?
Jeśli chodzi o gry i Haxe, jest to szeroki, szeroki świat pod względem frameworków i bibliotek typu open source. Od niezależnych zespołów niezależnych po odnoszące sukcesy studia z międzynarodowymi klientami, użytkownicy Haxe dzielą się kodem w każdym miejscu:
- Flambe jest używany przez takie marki jak Disney, Coca-Cola i Toyota do tworzenia gier HTML5.
- Heaps to platforma gier o wysokiej wydajności, która stoi za niedawną strategią 3D, przebojem Northgard.
- Obsługująca miliony gier mobilnych biblioteka szybkiego rozwoju awe6 jest prawdopodobnie ukrytym klejnotem w ukrytym klejnocie.
- Kha, który oprócz komputerów stacjonarnych i urządzeń mobilnych może atakować XBox One, Nintendo Switch i PlayStation 4, ma ponad 20 silników gier. Obejmuje to Armory, które ma pełną integrację z Blenderem, a ostatnio samo stało się open-source.
- Pierwotnie wzorowany na starej bibliotece Flixel dla Flasha, HaxeFlixel jest popularnym wyborem w grach, takich jak przebój Defender's Quest .
- Gamua's Starling, platforma używana kilka lat temu do portu Angry Birds na Facebooku, ma teraz port Haxe o otwartym kodzie źródłowym.
- OpenFL, oparty na Flash API, będzie wkrótce także sposobem na celowanie w wiele konsol - mianowicie PlayStation 4, PlayStation Vita, XBox One i Nintendo Switch - bez dodatkowych opłat licencyjnych. HaxeFlixel i Starling są oparte na OpenFL, ale niektóre gry są tworzone bezpośrednio na OpenFL, na przykład nagradzane Papers, Please .
- Native Media Engine, NME, z którego OpenFL powstało wiele lat temu, nadal wydaje również główne wersje.
- Może widzieliście, jak HaxePunk (pochodzący z FlashPunk) pojawił się na blogu GitHub Release Radar.
- Wysoce zoptymalizowany silnik fizyki Nape doskonale nadaje się do każdego silnika gry 2D lub symulatora wymagającego bardziej wyrafinowanej fizyki.
To prawda, że scena tworzenia gier jest bardziej widoczną częścią ekosystemu języka Haxe. (Być może jest to spowodowane naturą gier takich jak Ludum Dare?) Ale biznes, a nawet przedsiębiorstwa również się przebijają. Na przykład:
- Modułowa struktura aplikacji hexMachina obsługuje między innymi użycie języka specyficznego dla domeny (DSL) i architekturę modelu-widoku-kontrolera (MVC).
- Silnik układu interfejsu użytkownika HaxeUI aktywnie ewoluuje i ma wsparcie korporacyjne. Produkty takie jak 3DVista i Kaizen for Pharma dostarczyły wraz z nim aplikacje produkcyjne.
- Nie jest jedynym, ale biblioteka thx.core i jej pokrewni dostarczają rozszerzenia ogólnego przeznaczenia do Haxe, podobnie jak Lodash dla JavaScriptu.
- Mówiąc o JavaScript, projekty Haxe, które są na niego ukierunkowane, mogą skorzystać na wykorzystaniu Haxe Modular, który pomógł zarówno Telecine, jak i FlowPlay w skalowaniu ich ogromnych projektów, jednocześnie utrzymując ich szybkie ładowanie po stronie klienta.
- Ekosystem Haxe również ewoluuje, aby móc współpracować z obecnymi technologiami; np. jest teraz biblioteka GraphQL.
- Wreszcie, przykładowy Tinkerbell wykorzystuje system makr Haxe do wszelkiego rodzaju przydatnych zadań. Zawiera frameworki do routingu internetowego, testowania jednostek i osadzania SQL, a także biblioteki do wszystkiego, od szablonów i analizowania selektorów CSS po asynchroniczną/await i obsługę stanów reaktywnych z niższym uczeniem się.
To tylko niektóre z kierunków, w których użytkownicy języka Haxe poszli do tej pory. Haxe.org utrzymuje pełną listę bibliotek posortowanych według popularności, które można również przeglądać według tagów. Ale warto również podkreślić kilka projektów, które prowadzi sama Fundacja Haxe:
- Jeśli chodzi o DevOps, jest oficjalne repozytorium Haxe Docker.
- Jeśli chodzi o stabilność, nawet po dużej aktualizacji wersji, Haxe 4 będzie miał pewną pomoc w zakresie kompatybilności dla tych, którzy mają projekty zależne od Haxe 3.
To wszystko brzmi nieźle, ale jak to jest uruchomić środowisko programistyczne w swoim systemie?

Szybki start Haxe
Niezależnie od tego, czy chodzi o Win, Maca czy Linuxa, pierwszym krokiem jest pobranie Haxe. Instalator zapewni kilka różnych rzeczy:
- Sam kompilator Haxe , który powinien pozwolić ci uruchomić
haxe
z terminala lub wiersza poleceń. - Standardowa biblioteka Haxe , pozwalająca na podstawy niskiego poziomu, ale także pewne wsparcie wyższego poziomu ogólnego przeznaczenia. Na przykład, przetwarzanie XML, ZIP i dostęp do MySQL są tutaj ułatwione.
- Menedżer pakietów Haxelib , który umożliwia instalowanie nowych pakietów za pomocą polecenia
haxelib
. (Uwaga: Warto również sprawdzić lix w celu bardziej zaawansowanego zarządzania pakietami niż zapewnia Haxelib, zwłaszcza jeśli rozważasz użycie Haxe w kontekście zawodowym.) - Neko , docelowa maszyna wirtualna, która umożliwia szybką i wydajną ponowną kompilację i debugowanie.
(To powiedziawszy, jest więcej niż jeden sposób na skonfigurowanie. Jeśli na przykład masz już zainstalowany npm
, instrukcje instalacji OpenFL mają opcję instalacji Haxe za pomocą poleceń Yeoman. Homebrew i Chocolatey również zapewniają podobne ścieżki.)
W każdym razie, kiedy już masz Haxe, możesz używać go z samego wiersza poleceń, ale programiści często decydują się na używanie IDE. FlashDevelop/HaxeDevelop jest nadal obsługiwany głównie w systemie Windows. Większość innych opcji jest wieloplatformowych (Win/Mac/Linux):
- Wtyczka Haxe VSCode jest dobrze obsługiwana.
- IntelliJ IDEA ma również wtyczkę Haxe.
- Framework gier Kha ma swoje własne IDE o nazwie Kode Studio (Win/Mac/Linux).
- Zarówno Sublime Text, jak i Atom mają wtyczki Haxe, podobnie jak wiele innych edytorów, z których niektóre są specyficzne dla platformy.
Na potrzeby tego przewodnika szybkiego startu użyjemy programu VSCode. Najprostszym rozwiązaniem może być pobranie Haxe Extension Pack przez Ctrl+P i ext install haxe-extension-pack
, ale jeśli jesteś minimalistą, możesz po prostu chcieć ext install vshaxe
dla samej podstawowej wtyczki Haxe i wybrać dowolną inne części opakowania, które możesz chcieć.
Tworzenie projektu Haxe
Ponieważ język Haxe może transpilować do wielu celów, zarządzanie sposobem wykonywania tego dla każdego z nich jest łatwiejsze dzięki plikowi kompilacji. Jednak na początek wystarczy nam jeden plik klasy Haxe z rozszerzeniem .hx
.
Jeśli chodzi o kod, który w nim umieścimy, weźmy przykład Array Comprehension z try.haxe.org i umieść go w pliku o nazwie 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] } }
Teraz, z lokalizacji Test.hx
, możesz uruchomić Haxe w trybie interpretacji, tj. w ogóle bez transpilowania, aby zobaczyć wyniki tych dwóch wywołań funkcji 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]
Świetnie, to działa!
Transpilacja Haxe Code do JavaScript
Załóżmy, że chcesz podzielić się tym ze światem za pomocą kodu JavaScript na Twojej stronie internetowej. Jest to wbudowane w Haxe i tak proste, jak:
$ haxe -main Test -js haxe-test.js
Jeśli masz zainstalowany Node.js, możesz sprawdzić dane wyjściowe z wiersza poleceń w następujący sposób:
$ 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 ]
W przeciwnym razie kod w haxe-test.js
jest gotowy do działania — gdybyś miał go umieścić na stronie internetowej, po załadowaniu zobaczysz dane wyjściowe w konsoli programisty przeglądarki internetowej.
Transpilowanie i kompilacja do macierzystego pliku binarnego
Załóżmy, że chcesz także natywnego pliku binarnego dla pulpitu, na którym pracujesz. Aby to zrobić, dokonamy transpilacji do celu C++, więc możemy następnie użyć C++ (zakładając, że masz go zainstalowany) do skompilowania wyjścia .cpp
do natywnego pliku binarnego. Do tego będziemy potrzebować hxcpp
, więc musimy go zainstalować:
$ haxelib install hxcpp
Następnie możemy wykonać transpilację i kompilację jednocześnie za pomocą tego polecenia:
$ haxe -main Test -cpp bin
A potem nasz plik binarny jest gotowy do uruchomienia:
$ 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]
(W systemie Windows będzie to bin\Test.exe
).
Tworzenie pliku kompilacji Haxe (.hxml)
Pomimo sugestywnego rozszerzenia, pliki .hxml
nie są XML — w przeciwieństwie do plików .hxproj
używanych przez HaxeDevelop i FlashDevelop, ale nie będę tego omawiał w tym artykule. Oto jak wyglądałby build-all.hxml
, aby wykonać transpilację, którą wykonaliśmy powyżej:
-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
Zwróć uwagę na różnicę w prefiksach: -main
, -js
i -cpp
to parametry, które możesz przekazać bezpośrednio do haxe
, podczas gdy --each
i --next
(dwa myślniki) są na wyższym poziomie meta, informując kompilator, co ma robić z innymi parametrami.
Możesz teraz trafić zarówno w JavaScript, jak i na cele natywne, po prostu uruchamiając haxe build-all.hxml
.
Jeśli chcesz transpilować do JavaScript, a następnie natychmiast uruchomić wynik za pomocą Node, możesz uruchomić haxe run-js.hxml
, gdzie run-js.hxml
wygląda tak:
-main Test -js haxe-test.js -cmd node haxe-test.js
Podobnie, „buduj i uruchamiaj” dla natywnego pliku binarnego wyglądałoby tak (w systemie Linux — potrzebna byłaby odmiana dla systemu Windows):
-main Test -cpp bin -cmd bin/Test
A co z VSCode? Ta część jest prosta: zainstalowane rozszerzenie automatycznie pobierze te pliki .hxml
, dając ci automatycznie wygenerowane zadania kompilacji (bez tasks.json
) w menu rozwijanym, umożliwiając wybór pliku kompilacji do użycia.
Uwaga: Zachowaj ostrożność, jeśli masz otwartych wiele okien VSCode — w chwili pisania tego tekstu może to powodować problemy z budowaniem za pomocą Ctrl + B. (Nadal możesz korzystać z wiersza poleceń, nie ma problemu.)
Haxe 4
Jeśli postępowałeś zgodnie z powyższą konfiguracją, być może zauważyłeś, że strona pobierania zawierała łącza do gałęzi 3.xi 4.x instalatora Haxe.
Najnowocześniejsza wersja 4 kompilatora Haxe niesie ze sobą wiele nowych funkcji. W jednym przypadku jest to również świadectwo potęgi systemu makr: kompilator Haxe nie wspierał krótkich funkcji lambda, więc biblioteka slambda zaimplementowała ich obsługę za pomocą makr. Od wersji 4 obsługa jest wbudowana w kompilator, a biblioteka jest przestarzała.
Więc co jeszcze Haxe 4 wnosi do stołu?
Niekoniecznie zbyt wielu przyciągających uwagę. Zamiast tego Haxe 4 ma wiele mniejszych ulepszeń. W końcu sam Haxe jest dość dojrzałą technologią, stworzoną przez mniejszy i bardziej skoncentrowany zespół, być może, niż podobne projekty — i może trochę przesadnie nazywać jeden projekt podobny do Haxe.
Wiele z jego najciekawszych funkcji jest obecnych już od jakiegoś czasu. Na przykład wspomniałem powyżej, że Haxe zapewnia szybki przepływ pracy przez Neko lub HashLink. Ale od 2016 roku zawiera również serwer kompilacji. Oznacza to, że w przypadku celów niebędących maszynami wirtualnymi ponowna kompilacja projektu, który zależy od dużej biblioteki, będzie znacznie szybsza ze względu na buforowanie w pamięci — co może być również wykorzystane przez IDE Haxe do ukończenia kodu.
Ale w szczególności Haxe 4 zobaczy:
- Wykonywanie makr jest 4x szybsze.
- Odrzucono obsługę PHP5.
- Niektóre aktualizacje składni wykonane, które użytkownicy TypeScript prawdopodobnie przyjmą, nawet jeśli różnią się nieco między tymi dwoma językami. Mianowicie funkcje strzałek i nowa składnia typów funkcji.
Poradniki Haxe
Chociaż zawsze możesz zagłębić się w standardowy interfejs API lub dokumentację składni Haxe, dostępnych jest również kilka bardziej przyjaznych dla początkujących materiałów Haxe.
Jeśli wolisz zorientować się w filmach, Haxe US Summit 2018 w Seattle ma swoje warsztaty obok tych z innych lat, aby uzyskać więcej informacji poufnych.
Ale czasami to, co może ułatwić rozpoczęcie pracy, to bardziej szczegółowy samouczek. Jak samouczek od początku do końca, jak zbudować grę typu dungeon crawler w HaxeFlixel. Istnieje również seria samouczków HaxeFlixel, które wyjaśniają więcej tego, co dzieje się za kulisami, gdy przechodzą. Na końcu 3D jest samouczek Haxe dotyczący rozpoczęcia pracy z Armory.
A może po prostu potrzebujesz samouczka Haxe na temat szybkiego przetwarzania XML — jest to jeden z wielu samouczków, które mają już kilka lat, ale nadal są całkiem aktualne. Jak wspomniałem wcześniej, chociaż istnieje wiele granic, wiele podstaw programowania w Haxe jest w tym momencie stabilnych, więc samouczki niekoniecznie szybko się zestarzeją. (Gdzie to robią, zwykle wynika to z zależności od określonej biblioteki, a nie od samego rdzenia Haxe).
Jak widzisz, możesz obrać język Haxe — lub może on cię zaprowadzić — w wielu różnych kierunkach. Mam nadzieję, że podobało Ci się to wprowadzenie do zróżnicowanego i fascynującego świata Haxe i nie mogę się doczekać, aby usłyszeć, co ostatecznie robisz z technologią Haxe!