Haxe | |
---|---|
Nyelvóra | Több paradigma |
Megjelent | 2005 |
Fejlesztő | Hax Alapítvány |
Kiadás | 4.2.5 ( 2022. március 6. ) |
Típusrendszer | statikus , dinamikus megjegyzésekkel |
Befolyásolva | Java , OCaml , ActionScript és MTASC [1] |
Engedély | GPL v2, könyvtár: MIT |
Weboldal | haxe.org |
Felület | ARM , IA-32 , x64 |
OS | Android , iOS _ Linux , macOS , Windows |
A Haxe egy nyílt forráskódú , magas szintű, többplatformos programozási nyelv és fordító , amellyel alkalmazások építhetők és forráskódok generálhatók különböző platformokra, miközben egyetlen kódbázist tartanak fenn [2] [3] [4] [5] .
A Haxe minden platformon támogatott funkciókat tartalmaz , például numerikus adattípusokat, karakterláncokat , tömböket , valamint egyes fájlformátumok ( xml , zip ) támogatását [3] [6] . A Haxe minden egyes cél fordítóplatformhoz támogatja az egyes API-kat is.
A Haxe nyelven írt kódok JavaScript , C++ , Java , JVM , PHP , C# , Python , Lua és Node.js [7] kódokká fordíthatók . A Haxe kód SWF-re, HashLink-re és Neko-ra is fordít, bájtkódra , és értelmezési módban is végrehajtható [7] .
A Haxe fő felhasználói a TiVo , a Prezi , a Nickelodeon , a Disney , a Mattel , a Hasbro , a Coca Cola , a Toyota és a BBC [8] [9] . Az OpenFL és a Flambe népszerű Haxe keretrendszerek többplatformos tartalom és programok létrehozására egyetlen kódbázisból [9] . Emellett a Snõwkit [10] jelenleg is aktívan fejlődik . Mivel az Adobe Flash technológia az utóbbi években egyre inkább a HTML5 javára vált , a Haxe, a Unity és más, több platformon átívelő eszközök egyre több időt fordítanak az utóbbira, miközben fenntartják az Adobe Flash Player visszamenőleges támogatását [9] [11] .
A Haxe architektúra fejlesztésének legjelentősebb szempontja az volt, hogy az Adobe Flash, JavaScript és szerveralkalmazásokat egyetlen kódbázisban támogatják [12] [13] . A tipikus webes projektekben a fejlesztőknek sok különböző nyelvet kell használniuk egy komplett webalkalmazás elkészítéséhez [12] [13] :
A Haxe-t azzal az ötlettel hozták létre, hogy ezeket a komponenseket egyetlen kódbázisban egyesítsék, valamint leegyszerűsítsék az alkalmazáskomponensek közötti interakciót [12] [13] [14] .
A könyv, amelyet Nicholas Kennessy (a Haxe projekt alapítója) írt, kifejti a Haxe létrehozásának eredeti céljait [12] :
A Haxe fordító egy frontendre és több háttérrendszerre van felosztva. A frontend feladata az elemzés és a típusellenőrzés, a makrók alkalmazása, az általános optimalizálás, a különféle kódtranszformációk, valamint a kód közbenső reprezentációjának létrehozása absztrakt szintaxisfa (ASD) formájában. Mindegyik háttérprogram felelős ennek az AST-nek a célplatform forráskódjává vagy bájtkódjává történő lefordításáért .
A fordító OCaml nyelven íródott . Szerver módban futtatható, hogy támogassa a kódkiegészítést az IDE-ben, és ebben a módban a gyorsítótár is támogatott a fordítási idő csökkentése érdekében [15] .
A Haxe fordító egy optimalizáló fordító , amely függvényhelyettesítést , állandó összehajtást , holt kód eltávolítást (DCE) is használ a lefordított programok teljesítményének optimalizálására.
A Haxe-ban írt programok teljesítménye a célplatformtól függ.
A Haxe fejlesztése 2005 októberében kezdődött [20] , az első béta verzió pedig 2006 februárjában jelent meg. A Haxe 1.0 2006 áprilisában jelent meg, és támogatta a renderelést Adobe Flash , Javascript és Neko számára .
A Haxe-t Nicolas Cannasse és mások fejlesztették ki, és eredetileg haXe -nek hívták , mert ez egy rövid, egyszerű név, és „X van a nevében”, ami egy új technológia sikeréhez szükséges tulajdonság. nyelv [21] .
A Haxe az MTASC fordító nyílt forráskódú ActionScript 2 utódja, amelyet szintén Nicholas Hennessy készített [12] [22] , és a GNU General Public License 2 vagy újabb verziója alatt [ 23 ] adták ki .
A Haxe sok hasonlóságot mutat az ActionScript 3 -mal . A Haxe fordítót OCaml nyelven fejlesztették ki , de a Haxe nyelvű íráshoz nincs szükség OCaml ismeretekre.
A Haxe használatának előnyei a következők:
A Haxe fejlesztéséhez ajánlott IDE a FlashDevelop [12] , amely támogatja az ActionScript 2, 3 és Haxe fő nyelveket szintaktikai kiemeléssel , kódkiegészítéssel és egyéb szolgáltatásokkal [12] [25] . Ez az IDE támogatja a kódhajtogatást , az újrafeldolgozást és az interaktív hibakeresést is . [26]
A meglévő kód használatához a nyílt forráskódú közösség forráskód-konvertálókat hozott létre:
A Haxe nyelv lefordítható különféle virtuális gépek, például Adobe Flash Player és Neko bájtkódjára, valamint az ActionScript 3 -ra , a JavaScript - forráskódra , beleértve a kísérletileg támogatott C++- t és C# -t is . A különféle forrásokba való „összeállítás” stratégiáját az „egyszer írd, bárhol futtatd” paradigma inspirációja alapján fejlesztették ki. Ez a stratégia azt is lehetővé teszi a programozó számára, hogy a legjobb platformot válassza ki a programok futtatásához.
Kódgenerátor | Eredmény | Felület | Használat | A Haxe melyik verziójából |
---|---|---|---|---|
AVM1 [6] | Bájtkód | Adobe Flash Player 6+ | Asztali, böngésző | 2005 (alfa) |
AVM2 [6] | Bájtkód | Adobe Flash Player 9+, Adobe AIR , Tamarin VM | Asztali, böngésző, szerver | 2005 (alfa) |
ActionScript 3 [6] | Forrás | Adobe Flash Player 9+ | Szerver, Asztali | 2007 (1,12) |
C++ (hxcpp) [6] | Forrás | Windows, Linux, Mac OS X | Szerver, asztali számítógép, CLI | 2009 (2.04) |
C++ | Forrás | Android [29] , Apple iOS [30] , Palm webOS [31] | Mobil | 2009 (2.04) |
C# [6] | Forrás | .NET Framework | Szerver, asztali számítógép, mobil | 2012 (2,10) |
Java [6] | Forrás | Jáva | Szerver, Asztali | 2012 (2,10) |
JavaScript [6] | Forrás | HTML5 , Node.js , PhoneGap | Szerver, asztali számítógép, böngésző, mobil | 2006 (béta) |
Neko [6] | Bájtkód | NekoVM | Szerver, asztali számítógép, CLI | 2005 (alfa) |
PHP [6] | Forrás | PHP | szerver | 2008 (2,0) |
Python [6] | Forrás | Piton | CLI, web, asztali számítógép | 2014 (3,2) |
Lua [32] | Forrás | Lua | Web, asztali számítógép, mobil | 2016 (3,3) |
A Haxe egy általános célú objektum-orientált nyelv, amely támogatja a kivételkezelést és az osztályparaméterek típuskövetkeztetését . Az általános programozást , a tükrözést , az iterátorokat és a funkcionális programozást is támogatja a nyelv és a könyvtárak [33] . A Haxe emellett – sok más nyelvtől eltérően – egyszerre támogatja a statikus és a dinamikus gépelést is. A fordító ellenőrizheti a típuskövetkeztetést és fordítási időbeli hibákat vethet fel, de a fejlesztők kikapcsolhatják a típusellenőrzést is, és támaszkodhatnak a célplatform dinamikus típusellenőrzésére.
A Haxe nyelv hasonló az ECMAScript -hez , bár gyakorlatilag egyetlen ECMAScript-kód sem fordítható le Haxe-ben módosítás nélkül. Az ECMAScript-től eltérően a Haxe egy fordított nyelv . A Haxe-t az ActionScript , a Java és az OCaml befolyásolta [13] .
Mivel a Haxe az ActionScript 3 - on alapult , támogatja a Flash API összes funkcióját, bár jobb kódolást és magasabb fejlesztési szabványokat igényel, mint az Adobe fordítói.
Ez a program a "Hello World" szót írja a fordítás és futtatás után:
class Main { static function main () { trace ( "Hello World" ); } }Ezt a kódot úgy tesztelheti, hogy elmenti egy fájlba egy névvel Main.hx, és futtatja a Haxe fordítót a következő opciókkal: haxe -main Main --interp. Ez a parancs elindítja a Haxe Compiler-t kódértelmezési módban és megjeleníti Main.hx:3: Hello world.
A Haxe egy statikusan tipizált nyelv. Gazdag típusú rendszerrel rendelkezik, beleértve az osztályokat, interfészek, funkcionális típusokat, névtelen típusokat, algebrai adattípusokat ( ADT -ket, a Haxe-ban "enumoknak" neveznek), valamint absztrakt adattípusokat. Az osztályok, az algebrai adattípusok és a függvénytípusok támogatják a típustörlés alapú parametrikus polimorfizmust , amelyet más objektumorientált nyelveken gyakran "általánosnak" neveznek.
A Haxe támogatja a korlátozott polimorfizmust és az altípus polimorfizmust .
Ezenkívül a Haxe támogatja a strukturális és névleges tipizálást . A programozók dolgának megkönnyítése és a típusbiztonság veszélyeztetése érdekében a Haxe támogatja a típuskövetkeztetést, ami sok esetben szükségtelenné teszi a típusok kézi írását.
A Haxe osztályai (kulcsszó "class") hasonlóak a Java vagy az AS3 osztályaihoz . Mezőik lehetnek metódusok, statikus osztályváltozók vagy osztálypéldány tulajdonságai. A Haxe támogatja a "nyilvános" és "privát" hozzáférési attribútumokat, valamint a fejlettebb hozzáférés-vezérlési módszereket (ACL-ek, hivatkozások), amelyeket megjegyzések írnak le. A konstans értékű metódusok és statikus változók a "inline" kulcsszóval beilleszthetők.
A Haxe interfészei hasonlóak a Java interfészekhez .
interface ICreature { public var birth : Date ; public var name : String ; közfunkció kor ( ) : Int ; } class Fly implementálja az ICreature { public var birth : Date ; public var name : String ; nyilvános funkció életkora (): Int return Date . most (). getFullYear () - születés . getFullYear (); }A felsorolt típusok a nyelv kulcsfontosságú jellemzői. Az enumoknak lehetnek saját paramétereik, és lehetnek rekurzívak [34] . Hasonlóak az algebrai adattípusokhoz , mivel olyan nyelvekben vannak, mint az ML vagy a Haskell . Szigorúan véve ezek helyes összegtípusok , feltéve, hogy a bennük szereplő terméktípusokat ezeken az összegtípusokon belül kell meghatározni. Ez azt jelenti, hogy az enumokat nem csak "varázsszámoknak" nevezik, mint a legtöbb nyelvben, hanem elegánsan megoldják az összetett építészeti problémákat:
enum Szín { piros ; zöld ; kék ; rgb ( r : Int , g : Int , b : Int ); } class Colors { static function toInt ( c : Color ) : Int { return switch ( c ) { case red : 0xFF0000 ; tok zöld : 0x00FF00 ; kék tok : 0x0000FF_ _ eset rgb ( r , g , b ): ( r << 16 ) | ( g << 8 ) | b ; } } static function validCalls () { var redint = toInt ( Szín . piros ); var rgbint = toInt ( Color . rgb ( 100 , 100 , 100 )); } }A Haxe támogatja a parametrikus enum típusokat is. Példa erre az Option, az Ether és a ConsList típusok megvalósítása, valamint a ConsList is rekurzív:
enum Opció < T > { Néhány ( v : T ); nincs ; } enum Vagy < T , U > { Balra ( v : T ); Jobb ( v : U ); } enum ConsList < T > { Nil ; Cons ( fej : T , farok : ConsList < T >); }Az oldalon található dokumentáció azt jelzi [35] , hogy a Haxe támogatja az általánosított algebrai típusokat (GADT) is, de nem ad példát egy ilyen létrehozására.
Az anonim típusokat szerkezetük explicit leírása határozza meg, típusdefinícióval ("typedef" kulcsszó) álnevet is hozzá lehet rendelni:
typedef Anon = { a : Int , b : String , c : Float -> Void };A függvénytípusok a Haxe első osztályú objektumai. Ezeket az argumentumtípusok, valamint a típusok és a visszatérési érték közötti nyilak segítségével írják le, mint sok más funkcionális nyelvben. A Haskell -lel vagy az ML családdal ellentétben azonban a Haxe nem minden függvénye unáris (egy argumentummal rendelkező függvények), alapértelmezés szerint nem alkalmazhatók részben . Így a következő példákban szereplő típusaláírások más jelentéssel bírnak, mint a fenti nyelvek.
Az F típusú függvény egy Int-et és egy String-et vesz argumentumként, és egy Float-ot ad vissza eredményként.
Azokon a nyelveken, ahol csak unáris függvények léteznek, ez a típus olyan függvényt jelent, amely egy Int-t vesz argumentumként, és egy String->Float típusú függvényt ad vissza.
Az F2 és F3 típusok ugyanazt a típust írják le. Mindkettő olyan bináris függvényeket ír le, amelyek egy F típusú bináris függvényt adnak vissza. Az F2 esetében egy másik definíción belüli függvénytípus használatának esetét írjuk le.
typedef F = Int -> String -> Float ; typedef F2 = Int -> String -> F ; typedef F3 = Int -> String ->( Int -> String -> Float );Az absztrakt típusoknak nevezett koncepció a Haxe típusrendszer legújabb kiegészítése. Lehetővé teszik a meglévő típusok újbóli felhasználását meghatározott célokra, például típusok megvalósítását mértékegységekhez, miközben nagymértékben csökkentik a különböző rendszerek (például mérföld és kilométer) keveredésének lehetőségét. Az "absztrakt típus" kifejezés a Haxe nyelv kontextusában más jelentéssel bír, mint a szokásos absztrakt típusok .
A következő példa azt feltételezi, hogy alapértelmezés szerint a metrikus rendszert használják, és mérföldekre konvertálásra van szükség a régi adatok támogatásához. A Haxe képes a mérföldeket automatikusan kilométerekre konvertálni, de fordítva nem.
abstract Kilometer ( 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 )); } osztály Teszt { statikus var km : Kilométer ; static function main (){ var one100Miles = new Mérföld ( 100 ); km = egy100 mérföld ; nyom ( km ); // 160.935 } }A példa azt mutatja, hogy nem szükséges explicit konverziót végezni km = one100Miles;a megfelelő mértékegységek használatához.
A strukturális gépelés számos funkcionális programozási nyelvben fontos szerepet játszik, ugyanakkor a gyakori OOP nyelvekben meglehetősen kicsi. A nominális típusrendszertől eltérően a két típus egyenlőségét nem a típusnevek egyenlősége, hanem a típus szerkezete határozza meg. A struktúratípusok implicit interfészeknek tekinthetők:
class FooBar { public var foo : Int ; public var bar : String ; public function new (){ foo = 1 ; bár = "2" ;} function anyFooBar ( v :{ foo : Int , bar : String }) trace ( v . foo ); statikus függvényteszt (){ var fb = new FooBar ( ); fb . anyFooBar ( fb ); fb . anyFooBar ({ foo : 123 , bar : "456" }); } }Továbbá a Haxe platformon:
Más nyelvek, amelyek JavaScriptre fordítanak:
Egyéb többplatformos nyelvek:
Adobe Flash | |
---|---|
Fájlformátumok | |
Megvalósítások | flash játék |
Egyéb verziók | |
Könyvtárak |
|
Virtuális gépek | |
Lásd még |
|