Haxe | ||
Data pierwszej wersji | 16 maja 2006 | |
---|---|---|
Autor | Nicolas cannasse | |
Ostatnia wersja | 4.2.1 (26 lutego 2021 r) | |
Pisanie na maszynie | Dynamiczny , statyczny , mianownik | |
Wpływem | Java , OCaml , ActionScript | |
Napisane w | OCaml | |
System operacyjny | Android , iOS , Windows , GNU / Linux , Mac OS X | |
Licencja | Licencja GNU GPL i MIT | |
Stronie internetowej | haxe.org | |
Rozszerzenia plików | .hx | |
Haxe to nazwa języka programowania , wieloparadygmatowego , wieloplatformowego , wysokiego poziomu oraz kompilatora używanego do tworzenia aplikacji na wiele platform różniących się od jednego źródła. Jest to również nazwa wolnego i otwartego oprogramowania rozpowszechnianego na licencji GPLv2 . Standardowa biblioteka jest dostępna w ramach licencji MIT .
Haxe zawiera zestaw typowych funkcji, które są obsługiwane na wszystkich platformach , takich jak numeryczne , tekstowe , tabelaryczne i binarne typy danych, a także niektóre popularne formaty plików . Haxe zawiera również interfejsy programistyczne (API) specyficzne dla niektórych platform, w szczególności dla Adobe Flash , C ++ , PHP .
Kod napisany w języku haXe by zostać skompilowany "źródła do źródła" do skryptu napisanego w ActionScript3 , JavaScript , Java , C ++ , C # , PHP , Python , Lua lub node.js . Moglibyśmy również użyć Haxe do stworzenia czegoś, co nazwalibyśmy „ małym formatem sieciowym ” ( SWF ) lub „ kodem bajtowym Neko ” lub „ HashLink ”.
Głównymi użytkownikami Haxe są programiści z BBC , Coca-Cola , Disney , Hasbro , Mattel , Nickelodeon , Prezi , TiVo i Zynga . OpenFL (in) i Flambe to frameworki Haxe popularne do tworzenia treści międzyplatformowych z jednego źródła.
Najbardziej wyjątkowym aspektem architektury Haxe była decyzja o wsparciu Flash , JavaScript i skryptów po stronie serwera w ujednoliconym języku. W tradycyjnych projektach tworzenia stron internetowych programiści używają różnych języków do tworzenia zintegrowanych aplikacji internetowych.
Haxe ma na początku wspierać wszystkie swoje aspekty w jednym języku i uprościć logikę komunikacji między nimi. Dlatego logika aplikacji nie musi obsługiwać realizacji komunikacji.
Oryginalne cele Haxe to:
Kompilator jest podzielony na front-end i kilka backendów . Front-end tworzy abstrakcyjne drzewo składni (AST) z kodu źródłowego i wykonuje sprawdzanie typu, rozszerzanie makr i optymalizację AST. Różne backendy tłumaczą tak przetworzone AST na kod źródłowy lub kod bajtowy, w zależności od celu.
Kompilator jest napisany w OCaml . Może być używany w trybie serwera do zapewniania uzupełniania kodu dla środowisk programistycznych (IDE), a także do utrzymywania pamięci podręcznej w celu przyspieszenia kompilacji.
W Haxe obsługiwane platformy są nazywane „obiektami docelowymi”. Są to moduły Haxe, które zapewniają dostęp do wewnętrznych interfejsów API dla części zaplecza kompilatora, które są odpowiedzialne za generowanie odpowiedniego kodu lub kodu bajtowego.
Rozwój Haxe rozpoczął się w 2005 roku. Pierwsza wersja beta była dostępna wLuty 2006. Haxe 1.0 został wydany17 maja 2006ze wsparciem dla celów Adobe Flash , JavaScript i Neko .
Haxe jest następcą kompilatora open source MTASC (in) również stworzonego przez Nicolasa Cannasse i jest dostępny na licencji GNU General Public License . Znajomość OCaml nie jest wymagana do tworzenia aplikacji przy użyciu Haxe.
Język Haxe można skompilować do kodu bajtowego dla różnych maszyn wirtualnych , takich jak Adobe Flash Player i NekoVM, i wygenerować kod źródłowy dla języków, takich jak Javascript i Python .
Strategia kompilacji do wielu języków programowania jest inspirowana paradygmatem „napisz raz, uruchom wszędzie” . Pozwala to programiście wybrać najlepsze opcje dla swojego zadania.
Generator | Wyjście | Platforma | posługiwać się | Od |
---|---|---|---|---|
AVM1 | kod bajtowy | Adobe Flash Player 6+ | Pulpit, nawigator | 2005 (alfa) |
AVM2 | kod bajtowy | Adobe Flash Player 9+, Adobe AIR , Tamarin VM | Pulpit, przeglądarka, serwer | 2005 (alfa) |
ActionScript 3 | źródło | Adobe Flash Player 9+ | Serwer, biuro | 2007 (1, 12) |
C ++ (hxcpp) | źródło | Windows , Linux , macOS | Serwer, biuro, CLI | 2009 (2,04) |
C ++ | źródło | Android , Apple iOS , Palm webOS | mobilny | 2009 (2,04) |
VS# | źródło | .NET Framework | Serwer, biuro, telefon komórkowy | 2012 (2,10) |
HashLink | źródło | HashLink | Serwer, biuro | 2016 (3,3) |
Jawa | źródło | Jawa | Serwer, biuro | 2012 (2,10) |
JavaScript | źródło | HTML5 , NodeJS , PhoneGap | Serwer, komputer stacjonarny, przeglądarka, telefon komórkowy | 2006 (beta) |
Neko | kod bajtowy | NekoVM | Serwer, biuro, CLI | 2005 (alfa) |
PHP | źródło | PHP | serwer | 2008 (2,0) |
Pyton | źródło | Pyton | CLI, sieć, biuro | 2014 (3,2) |
Lua | źródło | Lua | CLI, internet, komputer stacjonarny, telefon komórkowy | 2016 (3,3) |
Haxe jest językiem, który obsługuje programowania obiektowego , na programowanie ogólne i różne konstrukcje programowania funkcyjnego . Cechy takie jak iteracje , wyjątki, a nawet refleksja są podstawowymi cechami języka. Haxe ma system krojów zarówno mocny, jak i dynamiczny. Kompilator niejawnie sprawdzi typy i poda błędy kompilacji. Daje także programistom możliwość pominięcia sprawdzania typów i używania dynamicznego pisania na docelowej platformie.
Haxe posiada elastyczny i wyrafinowany rodzaj systemu. Dostępne typy to klasy , interfejsy, funkcje, a także typy anonimowe , algebraiczne typy danych ( enum) i typy abstrakcyjne ( abstract). Polimorfizm parametryzowane jest możliwe dla klas, funkcji i algebraicznych rodzaju, umożliwiających programowanie rodzajowe. W ten sposób obsługiwana jest wariancja funkcji polimorficznych .
Domyślnie wpisywanie jest statyczne, chyba że istnieją dynamiczne adnotacje do pisania , które mają być używane z obsługującym go celem. Podczas sprawdzania typów używany jest system typów nominatywnych, z wyjątkiem typów anonimowych, w których używany jest system typów strukturalnych . Na koniec obsługiwane jest wnioskowanie o typie , co umożliwia zadeklarowanie zmiennej bez adnotacji typu.
Klasy classHaxe (słowo kluczowe ) są podobne do tych w Javie lub ActionScript 3 . Ich pola mogą być metodami, zmiennymi lub właściwościami, z których każda może być statyczna lub specyficzna dla każdej instancji. HaXe podpory akcesorów publici private, jak również bardziej zaawansowane metody kontroli dostępu określone przez adnotacji. Statyczne stałe zmienne i metody mogą używać rozszerzenia wbudowanego ze słowem kluczowym inline.
Interfejsy w Haxe są bardzo podobne do tych, na przykład w Javie.
interface ICreature { public var dateDeNaissance:Date; public var nom:String; public function age():Int; } class Mouche implements ICreature { public var dateDeNaissance:Date; public var nom:String; public function age():Int return Date.now().getFullYear() - dateDeNaissance.getFullYear(); }Te wymienione typy są ważną częścią języka; mogą być parametryzowane i rekurencyjne. Zapewniają podstawowe wsparcie dla algebraicznych typów danych , umożliwiając włączanie typów produktów , podobnie jak Haskell i ML . Jedno switchmożna zastosować filtrowanie wzór do wymienionych wartości, umożliwiając eleganckie rozwiązania złożonych problemów.
enum Couleur { Rouge; Vert; Bleu; RGB( r : Int, g : Int, b : Int ); } class Couleurs { static function versInt ( c : Couleur ) : Int { return switch ( c ) { case Rouge: 0xFF0000; case Vert: 0x00FF00; case Bleu: 0x0000FF; case RGB(r, g, b): (r << 16) | (g << 8) | b; } } static function appelsPermis() { var rouge = versInt(Couleur.Rouge); var rgbint = versInt(Couleur.RGB(100, 100, 100)); } }Przykłady sparametryzowanych typów wyliczeniowych są dostępne w standardowej bibliotece Haxe, takiej jak typy Option i Either.
enum Option<T> { Some(v:T); None; } enum Either<L, R> { Left(v:L); Right(v:R); }Haxe obsługuje również uogólnione typy algebraiczne .
Typy anonimowe są definiowane przez jawne wskazanie ich struktury. Mogą być używane do implementacji strukturalnego typowania argumentów funkcji (patrz poniżej) i być aliasowane za pomocą słowa kluczowego typedef.
typedef AliasForAnon = { a:Int, b:String, c:Float->Void };W Haxe funkcje są obiektami pierwszej klasy . Ich typ jest oznaczany za pomocą strzałek między typami argumentów i między typami argumentów a typem zwracanym, tak jak ma to miejsce w wielu funkcyjnych językach programowania . Jednak w przeciwieństwie do Haskella i języków z rodziny ML , nie wszystkie funkcje są jednoargumentowe (funkcje z jednym argumentem). Dlatego sygnatury następujących typów mają inną semantykę niż we wcześniej wymienionych językach. Typ Fjest funkcją, która przyjmuje jako argumenty liczbę całkowitą ( Int) i ciąg znaków ( String) i zwraca wartość typu real ( Float).
Ta sama notacja w języku z tylko jednoargumentowymi funkcjami odnosiłaby się do funkcji przyjmującej je jako parametr Inti zwróciłaby funkcję typu String->Float.
Typy F2i F3odpowiadają temu samemu typowi. Są to funkcje binarne, które zwracają funkcję binarną typu F. W przypadku F3używana jest składnia do definiowania typu funkcji w typie funkcji.
typedef F = Int->String->Float; typedef F2 = Int->String->F; typedef F3 = Int->String->(Int->String->Float);Najnowszym dodatkiem do systemu typów Haxe jest koncepcja typów abstrakcyjnych . W Haxe różnią się od konwencjonalnych typów abstrakcyjnych . Służą do niejawnych konwersji między różnymi typami, umożliwiając ponowne wykorzystanie istniejących typów do określonych celów, takich jak typy jednostek miary. To znacznie ogranicza mieszanie wartości tego samego typu, ale o różnej semantyce (na przykład mil i kilometrów).
W poniższym przykładzie założono, że system metryczny jest systemem domyślnym, wymagającym konwersji z mil na kilometr dla istniejących danych w niewłaściwym formacie. Dlatego ten przykład automatycznie konwertuje mile na kilometry, ale nie odwrotnie.
abstract Kilometre(Float) { public function new(v:Float) this = v; } abstract Mile(Float) { public function new(v:Float) this = v; @:to public inline function toKilometre():Kilometre return (new Kilometre(this / 0.62137)); } class Test { static var km:Kilometre; static function main(){ var centMiles = new Mile(100); km = centMiles; trace(km); // 160.935 } }Jak pokazuje przykład, do wykonania przypisania nie jest wymagana żadna jawna konwersja km = centMiles.
W wielu programowania funkcjonalnych języków , wpisując strukturalna odgrywa ważną rolę. Haxe stosowane przez anonimowych typów, nie używając zarejestrowanych typów systemowych z programowania obiektowego , gdy stosowane są wymienione typy. Anonimowe typy Haxe są analogiczne do niejawnych interfejsów języka Go . W przeciwieństwie do interfejsów Go istnieje możliwość skonstruowania wartości z typu anonimowego.
class FooBar { public var foo:Int; public var bar:String; public function new(){ foo=1; bar="2";} function anyFooBar(v:{foo:Int,bar:String}) trace(v.foo); static function test(){ var fb = new FooBar(); fb.anyFooBar(fb); fb.anyFooBar({foo:123,bar:"456"}); } }Również na platformie Haxe:
Inne języki międzyplatformowe: