Haxe | |
---|---|
Jazyková třída | Multi-paradigma |
Objevil se v | 2005 |
Vývojář | Haxova nadace |
Uvolnění | 4.2.5 ( 6. března 2022 ) |
Typový systém | statické , dynamické prostřednictvím anotací |
Byl ovlivněn | Java , OCaml , ActionScript a MTASC [1] |
Licence | GPL v2, knihovna: MIT |
webová stránka | haxe.org |
Plošina | ARM , IA-32 , x64 |
OS | Android , iOS _ Linux , macOS , Windows |
Haxe je open source , vysokoúrovňový, multiplatformní programovací jazyk a kompilátor , který lze použít k vytváření aplikací a generování zdrojového kódu pro různé platformy při zachování jednotné kódové základny [2] [3] [4] [5] .
Haxe obsahuje funkce podporované na všech platformách , jako jsou číselné datové typy, řetězce , pole a také podpora některých formátů souborů ( xml , zip ) [3] [6] . Haxe také zahrnuje podporu pro konkrétní API pro každou cílovou platformu kompilátoru.
Kód napsaný v jazyce Haxe lze zkompilovat do kódu JavaScript , C++ , Java , JVM , PHP , C# , Python , Lua a Node.js [7] . Haxe kód se také kompiluje do SWF, HashLink a Neko , bytecode a lze jej také spustit v režimu interpretace [7] .
Hlavními uživateli Haxe jsou TiVo , Prezi , Nickelodeon , Disney , Mattel , Hasbro , Coca Cola , Toyota a BBC [8] [9] . OpenFL a Flambe jsou populární frameworky Haxe pro vytváření multiplatformního obsahu a programů z jediné kódové základny [9] . Kromě toho se Snõwkit [10] v současné době aktivně vyvíjí . Vzhledem k rostoucímu vytěsňování technologie Adobe Flash v posledních letech ve prospěch HTML5 věnují Haxe, Unity a další multiplatformní nástroje stále více času tomuto druhému, přičemž si zachovávají zpětnou podporu s Adobe Flash Player [9] [11] .
Nejvýznamnějším aspektem vývoje architektury Haxe bylo rozhodnutí podporovat Adobe Flash, JavaScript a serverové aplikace v jediné kódové základně [12] [13] . V typických webových projektech musí vývojáři používat mnoho různých jazyků, aby vytvořili kompletní webovou aplikaci [12] [13] :
Haxe byl vytvořen s myšlenkou spojit všechny tyto komponenty do jediné kódové základny a také zjednodušit interakci mezi komponentami aplikace [12] [13] [14] .
Kniha, jejímž autorem je Nicholas Kennessy (zakladatel projektu Haxe), uvádí původní cíle vytvoření Haxe [12] :
Kompilátor Haxe je rozdělen na jeden frontend a mnoho backendů. Frontend je zodpovědný za parsování a kontrolu typu, aplikaci maker, obecnou optimalizaci, různé transformace kódu a vytvoření přechodné reprezentace kódu ve formě abstraktního syntaktického stromu (ASD). Každý z backendů je zodpovědný za překlad tohoto AST do zdrojového kódu nebo bajtkódu cílové platformy.
Kompilátor je napsán v OCaml . Může být spuštěn v režimu serveru pro podporu dokončování kódu v IDE a v tomto režimu je také podporována mezipaměť, aby se zkrátila doba kompilace [15] .
Kompilátor Haxe je optimalizační kompilátor , který také používá substituci funkcí , konstantní skládání , odstraňování mrtvého kódu (DCE) k optimalizaci výkonu kompilovaných programů.
Výkon programů napsaných v Haxe závisí na cílové platformě.
Vývoj Haxe začal v říjnu 2005 [20] a první beta verze byla vydána v únoru 2006. Haxe 1.0 byla vydána v dubnu 2006 a podporovala vykreslování do Adobe Flash , Javascript a Neko .
Haxe byl vyvinut Nicolasem Cannassem a dalšími a původně se jmenoval haXe , protože je to krátký, jednoduchý název a „má v názvu X“ atribut nezbytný pro úspěch nové technologie. poznamenal s humorem autor jazyk [21] .
Haxe je open source ActionScript 2 nástupce kompilátoru MTASC , také vytvořený Nicholasem Hennessym [12] [22] a vydaný pod GNU General Public License verze 2 nebo vyšší [23] .
Haxe má s ActionScriptem 3 mnoho společného . Překladač Haxe je vyvinut v jazyce OCaml , ale pro psaní v Haxe není nutná znalost OCaml.
Mezi výhody používání Haxe patří:
Doporučené IDE pro vývoj Haxe je FlashDevelop [12] , které podporuje ActionScript 2, 3 a Haxe jako hlavní jazyky se zvýrazňováním syntaxe , doplňováním kódu a dalšími funkcemi [12] [25] . Toto IDE také podporuje skládání kódu , refaktorování a interaktivní ladění . [26]
Aby bylo možné použít existující kód, komunita open source vytvořila převodníky zdrojového kódu pro:
Jazyk Haxe lze přeložit do bajtkódu různých virtuálních strojů, jako jsou Adobe Flash Player a Neko , a také ActionScript 3 , zdrojový kód JavaScriptu , včetně experimentálně podporovaných C++ a C# . Tato strategie „kompilace“ do různých zdrojů byla vyvinuta pod inspirací paradigmatu „napiš jednou, spusť kdekoli“. Tato strategie také umožňuje programátorovi vybrat nejlepší platformu, na které budou programy běžet.
Generátor kódů | Výsledek | Plošina | Používání | Z jaké verze Haxe |
---|---|---|---|---|
AVM1 [6] | Bytekód | Adobe Flash Player 6+ | Desktop, prohlížeč | 2005 (alfa) |
AVM2 [6] | Bytekód | Adobe Flash Player 9+, Adobe AIR , Tamarin VM | Plocha, Prohlížeč, Server | 2005 (alfa) |
ActionScript 3 [6] | Zdroj | Adobe Flash Player 9+ | Server, Desktop | 2007 (1.12) |
C++ (hxcpp) [6] | Zdroj | Windows, Linux, Mac OS X | Server, Desktop, CLI | 2009 (2.04) |
C++ | Zdroj | Android [29] , Apple iOS [30] , Palm webOS [31] | mobilní, pohybliví | 2009 (2.04) |
C# [6] | Zdroj | .NET Framework | Server, Desktop, Mobil | 2012 (2.10) |
Java [6] | Zdroj | Jáva | Server, Desktop | 2012 (2.10) |
JavaScript [6] | Zdroj | HTML5 , Node.js , PhoneGap | Server, Desktop, Prohlížeč, Mobil | 2006 (beta) |
Neko [6] | Bytekód | NekoVM | Server, Desktop, CLI | 2005 (alfa) |
PHP [6] | Zdroj | PHP | server | 2008 (2.0) |
Python [6] | Zdroj | Krajta | CLI, Web, Desktop | 2014 (3.2) |
Lua [32] | Zdroj | Lua | Web, Desktop, Mobil | 2016 (3.3) |
Haxe je obecný objektově orientovaný jazyk s podporou zpracování výjimek a odvozením typu pro parametry třídy. Obecný programování , reflexe , iterátory a funkcionální programování jsou také podporovány jazykem a knihovnami [33] . Haxe také na rozdíl od mnoha jiných jazyků podporuje statické i dynamické psaní současně. Kompilátor může zkontrolovat odvození typu a vyvolat chyby při kompilaci, ale vývojáři mohou také vypnout kontrolu typu a spolehnout se na dynamickou kontrolu typu cílové platformy.
Jazyk Haxe je podobný ECMAScriptu , i když prakticky žádný kód ECMAScript nelze v Haxe zkompilovat bez úprav. Na rozdíl od ECMAScript je Haxe kompilovaný jazyk . Haxe byl ovlivněn ActionScriptem , Javou a OCaml [13] .
Vzhledem k tomu, že Haxe byl založen na ActionScript 3 , podporuje všechny funkce Flash API, i když vyžaduje lepší kódování a vyšší vývojové standardy než kompilátory Adobe.
Tento program po zkompilování a spuštění napíše „Hello World“:
class Main { statická funkce main () { trace ( "Ahoj světe" ); } }Tento kód můžete otestovat uložením do souboru s názvem Main.hxa spuštěním kompilátoru Haxe s následujícími možnostmi: haxe -main Main --interp. Tento příkaz spustí překladač Haxe v režimu interpretace kódu a zobrazí Main.hx:3: Hello world.
Haxe je staticky typovaný jazyk. Má bohatý typový systém, včetně tříd, rozhraní, funkčních typů, anonymních typů, algebraických datových typů ( ADT , v Haxe nazývaných „enums“) a také abstraktních datových typů. Třídy, algebraické datové typy a funkční typy podporují parametrický polymorfismus založený na vymazání typu , v jiných objektově orientovaných jazycích často označovaný jako „generika“.
Haxe zahrnuje podporu pro omezený polymorfismus a polymorfismus podtypů .
Haxe navíc podporuje strukturální typování a nominální typování . Aby to programátorům usnadnilo a aniž by došlo k ohrožení bezpečnosti typů, podporuje Haxe odvození typu, což v mnoha případech eliminuje potřebu ručního psaní typů.
Třídy (klíčové slovo "class") v Haxe jsou podobné těm v Javě nebo AS3 . Jejich poli mohou být metody, statické proměnné třídy nebo vlastnosti instance třídy. Haxe podporuje „veřejné“ a „soukromé“ přístupové atributy, stejně jako pokročilejší metody řízení přístupu (ACL, odkazy), které jsou popsány pomocí anotací. Metody a statické proměnné s konstantní hodnotou lze vkládat pomocí klíčového slova "inline".
Rozhraní v Haxe jsou podobná rozhraním Java .
interface Icreature { public var narození : Datum ; public var name : String ; veřejná funkce věk (): Int ; } class Fly implements ICreature { public var narození : Datum ; public var name : String ; věk veřejné funkce (): Int return Date . nyní (). getFullYear () - narození . getFullYear (); }Vyjmenované typy jsou klíčovým rysem jazyka. Výčty mohou mít své vlastní parametry a také být rekurzivní [34] . Jsou podobné algebraickým datovým typům , jako jsou jazyky jako ML nebo Haskell . Přesně řečeno, jedná se o správné typy součtů za předpokladu, že v nich zahrnuté typy produktů musí být definovány v rámci těchto typů součtů. To znamená, že výčty nejsou jen pojmenovány jako „magická čísla“ jako ve většině jazyků, ale mohou elegantně řešit složité architektonické problémy:
enum Barva { červená ; zelená ; modrá ; rgb ( r : Int , g : Int , b : Int ); } class Barvy { statická funkce toInt ( c : Barva ) : Int { return switch ( c ) { case red : 0xFF0000 ; pouzdro zelené : 0x00FF00 ; modré pouzdro : 0x0000FF _ případ rgb ( r , g , b ): ( r << 16 ) | ( g << 8 ) | b ; } } statická funkce validCalls () { var redint = toInt ( Color . red ); var rgbint = toInt ( Barva . rgb ( 100 , 100 , 100 )); } }Haxe také podporuje parametrické typy výčtů. Příkladem je implementace typů Option, Buď a ConsList a ConsList je také rekurzivní:
enum Možnost < T > { Some ( v : T ); žádný ; } enum Buď < T , U > { Doleva ( v : T ); Vpravo ( v : U ); } enum ConsList < T > { Nil ; Nevýhody ( hlava : T , konec : Seznam seznamů < T >); }Dokumentace na webu uvádí [35] , že Haxe podporuje také zobecněné algebraické typy (GADT), ale neuvádí příklad, jak je vytvořit.
Anonymní typy jsou definovány explicitním popisem jejich struktury, lze jim také přiřadit alias pomocí definice typu (klíčové slovo "typedef"):
typedef Anon = { a : Int , b : String , c : Float -> Void };Typy funkcí jsou v Haxe objekty první třídy. Jsou popsány pomocí šipek mezi typy argumentů a mezi typy a návratovou hodnotou, jako v mnoha jiných funkčních jazycích. Na rozdíl od Haskellu nebo rodiny ML však nejsou všechny funkce v Haxe unární (funkce s jedním argumentem), nelze je ve výchozím nastavení částečně použít . Typové podpisy v následujících příkladech mají tedy jiný význam než výše uvedené jazyky.
Typ F je funkce, která bere jako argumenty Int a String a jako výsledek vrací Float.
V jazycích, kde existují pouze unární funkce, by tento typ znamenal funkci, která bere Int jako argument a vrací funkci typu String->Float.
Typy F2 a F3 popisují stejný typ. Oba popisují binární funkce, které vracejí binární funkci typu F. Pro F2 je popsán případ použití typu funkce v jiné definici.
typedef F = Int -> String -> Float ; typedef F2 = Int -> Řetězec -> F ; typedef F3 = Int -> String ->( Int -> String -> Float );Koncept, nazývaný abstraktní typy , je nejnovějším přírůstkem do typového systému Haxe. Umožňují opětovné použití stávajících typů pro specifické účely, jako je implementace typů pro měrné jednotky, přičemž výrazně snižují možnost smíchání různých systémů (jako jsou míle a kilometry). Termín „abstraktní typ“ má v kontextu jazyka Haxe jiný význam než běžné abstraktní typy .
Následující příklad předpokládá, že metrický systém se používá ve výchozím nastavení a pro podporu starších dat je vyžadován převod na míle. Haxe je schopen automaticky převádět míle na kilometry, ale ne naopak.
abstract Kilometr ( Float ) { public function new ( v : Float ) this = v ; } abstract Mile ( Float ) { public function new ( v : Float ) this = v ; @:to public inline function toKilometer (): Kilometer return ( new Kilometer ( this / 0,62137 )); } class Test { static var km : Kilometr ; statická funkce main (){ var one100Miles = new Mile ( 100 ); km = 1100 mil ; stopa ( km ); // 160,935 } }km = one100Miles;Příklad ukazuje, že pro použití správných jednotek není nutné provádět explicitní převod .
Strukturální typování hraje důležitou roli v mnoha funkcionálních programovacích jazycích a zároveň docela malou roli v běžných OOP jazycích. Na rozdíl od systému nominálních typů není rovnost dvou typů určena rovností jakýchkoli názvů typů, ale spíše strukturou typu. Typy struktur lze považovat za implicitní rozhraní:
class FooBar { public var foo : Int ; public var bar : String ; public function new (){ foo = 1 ; pruh = "2" ;} function anyFooBar ( v :{ foo : Int , bar : String }) trace ( v . foo ); test statické funkce (){ var fb = new FooBar (); fb _ anyFooBar ( fb ); fb _ anyFooBar ({ foo : 123 , bar : "456" }); } }Také na platformě Haxe:
Další jazyky, které se kompilují do JavaScriptu:
Další multiplatformní jazyky:
Adobe Flash | |
---|---|
Formáty souborů | |
Implementace | flashová hra |
Jiné verze | |
Knihovny |
|
Virtuální stroje | |
viz také |
|