Haxe | ||
Datum první verze | 16. května 2006 | |
---|---|---|
Autor | Nicolas cannasse | |
Poslední verze | 4.2.1 (26. února 2021) | |
Psaní na stroji | Dynamické , statické , jmenované | |
Ovlivněno | Java , OCaml , ActionScript | |
Napsáno | OCaml | |
Operační systém | Android , iOS , Windows , GNU / Linux , Mac OS X | |
Licence | Licence GNU GPL a MIT | |
webová stránka | haxe.org | |
Přípony souborů | .hx | |
Haxe je název programovacího jazyka , více paradigmatu , více platforem , vysoké úrovně a kompilátoru používaného k produkci aplikací pro mnoho platforem odlišných od jednoho zdroje. Je to také název bezplatného a otevřeného softwaru distribuovaného pod licencí GPLv2 . Standardní knihovna je k dispozici pod licencí MIT .
Haxe obsahuje sadu běžných funkcí, které jsou podporovány na všech platformách , jako jsou číselné , textové , tabulkové a binární datové typy a také některé běžné formáty souborů . Haxe také zahrnuje programovací rozhraní (API) specifická pro určité platformy, zejména pro Adobe Flash , C ++ , PHP .
Kód napsaný v jazyce haXe by být sestaven „zdroje ke zdroji“ na skript napsaný v ActionScript3 , JavaScriptu , Javy , C ++ , C # , PHP , Python , Lua nebo Node.js . Mohli bychom také použít Haxe k výrobě toho, co bychom nazvali „ small web format “ ( SWF ) nebo „ Neko bytecode “ nebo „ HashLink “.
Mezi hlavní uživatele Haxe patří vývojáři ve společnostech BBC , Coca-Cola , Disney , Hasbro , Mattel , Nickelodeon , Prezi , TiVo a Zynga . OpenFL (in) a Flambe jsou rámce Haxe populární pro vytváření obsahu napříč platformami z jednoho zdroje.
Nejunikátnějším aspektem architektury Haxe bylo rozhodnutí podporovat Flash , JavaScript a skriptování na straně serveru ve sjednoceném jazyce. V tradičních projektech pro vývoj webových aplikací používají vývojáři k vytvoření integrované webové aplikace různé jazyky.
Haxe musí podporovat všechny své aspekty v jediném jazyce a zjednodušit logiku komunikace mezi nimi. Logika aplikace proto nemusí zpracovávat implementaci komunikace.
Původní cíle Haxe jsou:
Kompilátor je rozdělen na front-end a několik backendů . Front-end vytvoří ze zdrojového kódu strom abstraktní syntaxe (AST) a provede kontrolu typu, rozšíření makra a optimalizaci AST. Různé backendy překládají takto zpracovaný AST do zdrojového kódu nebo bytecode v závislosti na jejich cíli.
Kompilátor je napsán v OCaml . Lze jej použít v režimu serveru k zajištění dokončení kódu pro vývojová prostředí (IDE) a také k udržení mezipaměti pro urychlení kompilace.
V Haxe jsou podporované platformy známé jako „cíle“. Jedná se o Haxe moduly, které poskytují přístup k interním API pro backendové části kompilátoru, které jsou odpovědné za generování odpovídajícího kódu nebo bytecode.
Vývoj Haxe začal v roce 2005. První beta verze byla k dispozici vÚnora 2006. Haxe 1.0 byl vydán dne17. května 2006s podporou cílů Adobe Flash , JavaScript a Neko .
Haxe je nástupcem kompilátoru s otevřeným zdrojovým kódem MTASC (in), který vytvořil také Nicolas Cannasse, a je k dispozici pod licencí GNU General Public License . Znalost OCaml není nutná pro vývoj aplikací pomocí Haxe.
Jazyk Haxe lze zkompilovat do bytecode pro různé virtuální stroje , jako je Adobe Flash Player a NekoVM, a generovat zdrojový kód pro jazyky jako Javascript a Python .
Strategie kompilace do více programovacích jazyků je inspirována paradigmatem „write once, run anywhere“ . To umožňuje programátorovi vybrat nejlepší možnosti pro svůj úkol.
Generátor | Výstup | Plošina | použití | Od té doby |
---|---|---|---|---|
AVM1 | bajtový kód | Adobe Flash Player 6+ | Desktop, Navigator | 2005 (alfa) |
AVM2 | bajtový kód | Adobe Flash Player 9+, Adobe AIR , Tamarin VM | Desktop, prohlížeč, server | 2005 (alfa) |
ActionScript 3 | zdroj | Adobe Flash Player 9+ | Server, kancelář | 2007 (1,12) |
C ++ (hxcpp) | zdroj | Windows , Linux , macOS | Server, kancelář, CLI | 2009 (2,04) |
C ++ | zdroj | Android , Apple iOS , Palm webOS | mobilní, pohybliví | 2009 (2,04) |
VS # | zdroj | .NET Framework | Server, kancelář, mobilní zařízení | 2012 (2,10) |
HashLink | zdroj | HashLink | Server, kancelář | 2016 (3,3) |
Jáva | zdroj | Jáva | Server, kancelář | 2012 (2,10) |
Javascript | zdroj | HTML5 , NodeJS , PhoneGap | Server, počítač, prohlížeč, mobilní zařízení | 2006 (beta) |
Neko | bajtový kód | NekoVM | Server, kancelář, CLI | 2005 (alfa) |
PHP | zdroj | PHP | Server | 2008 (2.0) |
Krajta | zdroj | Krajta | CLI, web, kancelář | 2014 (3,2) |
Lua | zdroj | Lua | CLI, web, počítač, mobilní zařízení | 2016 (3,3) |
Haxe je jazyk, který podporuje objektově orientované programování , obecné programování a různé konstrukce funkčního programování . Funkce, jako jsou iterace , výjimky nebo dokonce reflexe, jsou základní funkce jazyka. Haxe má typový systém silný i dynamický. Kompilátor implicitně zkontroluje typy a poskytne chyby kompilace. Programátorům také dává možnost přeskočit kontrolu typu a použít dynamické psaní pro cílenou platformu.
Haxe má flexibilní a propracovaný systém typů . Dostupné typy jsou třídy , rozhraní, funkce i anonymní typy, algebraické datové typy ( enum) a abstraktní typy ( abstract). Parametrizované polymorfismus je možné tříd, funkcí a algebraické typu, což umožňuje generické programování. Rozptyl v polymorfních funkcích je tedy podporován.
Ve výchozím nastavení je psaní statické, pokud nejsou k dispozici anotace dynamického psaní , které se mají použít s cílem, který jej podporuje. Kontrola typu používá systém nominativních typů s výjimkou anonymních typů, kde se používá systém strukturálních typů . Nakonec je podporována odvození typu , což umožňuje deklaraci proměnné bez anotace typu.
classTřídy Haxe (klíčové slovo ) jsou podobné těm v jazyce Java nebo ActionScript 3 . Jejich pole mohou být metody, proměnné nebo vlastnosti, každé statické nebo specifické pro každou instanci. Haxe podporuje přístupové objekty publica privatetaké pokročilejší metody řízení přístupu určené anotacemi. Proměnné a metody statické konstanty mohou použít vložené rozšíření s klíčovým slovem inline.
Rozhraní v Haxe jsou velmi podobná rozhraním, například v Javě.
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(); }Uvedené typy jsou důležitou součástí jazyka; mohou být parametrizovány a rekurzivní. Poskytují základní podporu pro algebraické datové typy , což umožňuje zahrnutí typů produktů , podobně jako Haskell a ML . Jeden switchmůže použít filtrování vzor na vyjmenovaných hodnot, což umožňuje elegantní řešení složitých problémů.
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)); } }Příklady parametrizovaných výčtových typů jsou k dispozici ve standardní knihovně Haxe, jako jsou typy Option a Either.
enum Option<T> { Some(v:T); None; } enum Either<L, R> { Left(v:L); Right(v:R); }Haxe také podporuje zobecněné algebraické typy .
Anonymní typy jsou definovány výslovným uvedením jejich struktury. Lze je použít k implementaci strukturního psaní argumentů funkcí (viz níže) a lze je aliasovat pomocí klíčového slova typedef.
typedef AliasForAnon = { a:Int, b:String, c:Float->Void };V Haxe jsou funkce prvotřídními objekty . Jejich typ se zaznamenává pomocí šipek mezi typy argumentů a mezi typy argumentů a návratovým typem, jak je tomu v mnoha funkčních programovacích jazycích . Na rozdíl od Haskella a jazyků rodiny ML však nejsou všechny funkce unární (funkce s jediným argumentem). Proto podpisy následujících typů mají jinou sémantiku než v dříve zmíněných jazycích. Typ Fje funkce, která jako argumenty vezme celé číslo ( Int) a řetězec znaků ( String) a vrátí hodnotu typu real ( Float).
Stejná notace v jazyce s pouze unárními funkcemi by odkazovala na funkci, která bere jeden jako parametr, Inta vrátila by funkci typu String->Float.
Typy F2a F3odpovídají stejnému typu. Jedná se o binární funkce, které vracejí binární funkci typu F. Pro F3se používá syntaxe pro definování typu funkce v typu funkce.
typedef F = Int->String->Float; typedef F2 = Int->String->F; typedef F3 = Int->String->(Int->String->Float);Nejnovějším přírůstkem do typového systému Haxe je koncept abstraktních typů . V Haxe se liší od konvenčních abstraktních typů . Používají se k převodu mezi různými typy implicitní, což umožňuje opětovné použití existujících typů pro konkrétní účely, jako jsou typy pro měrné jednotky. To výrazně snižuje míchání hodnot stejných typů, ale s odlišnou sémantikou (například míle a kilometry).
Následující příklad předpokládá, že metrický systém je výchozí systém, který vyžaduje převod kilometrů na kilometry pro existující data ve špatném formátu. Tento příklad proto automaticky převádí míle na kilometry, ale ne naopak.
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 ukazuje příklad, k provedení přiřazení není nutná žádná explicitní konverze km = centMiles.
V mnoha funkcionálních programovacích jazyků , strukturální psaní hraje důležitou roli. Haxe aplikovaný prostřednictvím anonymních typů, nepoužívá registrované typy systémů objektově orientovaného programování, když se používají pojmenované typy. Anonymní typy Haxe jsou analogické s implicitními rozhraními jazyka Go . Na rozdíl od rozhraní Go je možné vytvořit hodnotu z anonymního typu.
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"}); } }Také na platformě Haxe:
Další jazyky pro různé platformy: