Haxe | |
---|---|
Sprog klasse | Multi-paradigme |
Dukkede op i | 2005 |
Udvikler | Hax Foundation |
Frigøre | 4.2.5 ( 6. marts 2022 ) |
Type system | statisk , dynamisk via annoteringer |
Blev påvirket | Java , Ocaml , ActionScript og MTASC [1] |
Licens | GPL v2, bibliotek: MIT |
Internet side | haxe.org |
Platform | ARM , IA-32 , x64 |
OS | Android , iOS _ Linux , macOS , Windows |
Haxe er et open source , højt niveau, cross-platform programmeringssprog og compiler , der kan bruges til at bygge applikationer og generere kildekode til forskellige platforme, mens man opretholder en enkelt kodebase [2] [3] [4] [5] .
Haxe inkluderer funktionalitet understøttet på alle platforme , såsom numeriske datatyper, strenge , arrays , samt understøttelse af nogle filformater ( xml , zip ) [3] [6] . Haxe inkluderer også understøttelse af specifikke API'er for hver target compiler platform.
Kode skrevet på Haxe-sproget kan kompileres til JavaScript , C++ , Java , JVM , PHP , C# , Python , Lua og Node.js [7] kode . Haxe-kode kompilerer også til SWF, HashLink og Neko , bytecode , og kan også udføres i fortolkningstilstand [7] .
Haxes hovedbrugere er TiVo , Prezi , Nickelodeon , Disney , Mattel , Hasbro , Coca Cola , Toyota og BBC [8] [9] . OpenFL og Flambe er populære Haxe-frameworks til at skabe multi-platform indhold og programmer fra en enkelt kodebase [9] . Derudover er Snõwkit [10] i øjeblikket aktivt ved at udvikle . På grund af den stigende forskydning af Adobe Flash-teknologien i de senere år til fordel for HTML5 , bruger Haxe, Unity og andre værktøjer på tværs af platforme mere og mere tid til sidstnævnte, mens de bibeholder bagudstøtte med Adobe Flash Player [9] [11] .
Det vigtigste aspekt ved udviklingen af Haxe-arkitekturen var beslutningen om at understøtte Adobe Flash, JavaScript og serverapplikationer i en enkelt kodebase [12] [13] . I typiske webprojekter skal udviklere bruge mange forskellige sprog for at bygge en komplet webapplikation [12] [13] :
Haxe blev skabt med ideen om at samle alle disse komponenter i en enkelt kodebase, samt at forenkle interaktionen mellem applikationskomponenter [12] [13] [14] .
Bogen, forfattet af Nicholas Kennessy (grundlægger af Haxe-projektet), angiver de oprindelige mål med at skabe Haxe [12] :
Haxe-kompileren er opdelt i én frontend og mange backends. Frontenden er ansvarlig for parsing og typekontrol, anvendelse af makroer, generel optimering, forskellige kodetransformationer og skabelse af en mellemrepræsentation af koden i form af et abstrakt syntakstræ (ASD). Hver af backends er ansvarlige for at oversætte denne AST til kildekoden eller bytekoden for målplatformen.
Compileren er skrevet i OCaml . Det kan køres i servertilstand for at understøtte kodefuldførelse i IDE, og en cache understøttes også i denne tilstand for at reducere kompileringstiden [15] .
Haxe-kompileren er en optimerende compiler , der også bruger funktionssubstitution , konstant foldning , fjernelse af død kode (DCE) for at optimere ydeevnen af kompilerede programmer.
Ydeevnen af programmer skrevet i Haxe afhænger af målplatformen.
Udviklingen af Haxe begyndte i oktober 2005 [20] og den første betaversion blev udgivet i februar 2006. Haxe 1.0 blev udgivet i april 2006 og understøttede gengivelse til Adobe Flash , Javascript og Neko .
Haxe blev udviklet af Nicolas Cannasse og andre, og blev oprindeligt kaldt haXe , fordi det er et kort, simpelt navn, og "det har et X i navnet", en egenskab, der er nødvendig for, at en ny teknologi kan få succes. bemærkede med humor forfatteren til sprog [21] .
Haxe er en open source ActionScript 2 -efterfølger til MTASC- kompileren, også lavet af Nicholas Hennessy [12] [22] og udgivet under GNU General Public License version 2 eller nyere [23] .
Haxe har meget til fælles med ActionScript 3 . Haxe-kompileren er udviklet i OCaml -sproget , men for at kunne skrive i Haxe kræves der ikke kendskab til OCaml.
Fordelene ved at bruge Haxe inkluderer:
Den anbefalede IDE til Haxe-udvikling er FlashDevelop [12] som understøtter ActionScript 2, 3 og Haxe som hovedsprog med syntaksfremhævning , kodefuldførelse og andre funktioner [12] [25] . Denne IDE understøtter også kodefoldning , refactoring og interaktiv debugging . [26]
For at bruge eksisterende kode har open source-fællesskabet oprettet kildekodekonvertere til:
Haxe-sproget kan oversættes til bytekoden på forskellige virtuelle maskiner såsom Adobe Flash Player og Neko , såvel som ActionScript 3 , JavaScript -kildekode , inklusive eksperimentelt understøttet C++ og C# . Denne strategi med at "kompilere" til forskellige kilder blev udviklet under inspiration af "skriv én gang, løb hvor som helst"-paradigmet. Denne strategi giver også programmøren mulighed for at vælge den bedste platform for programmerne at køre på.
Kode generator | Resultat | Platform | Brug | Fra hvilken version af Haxe |
---|---|---|---|---|
AVM1 [6] | Bytekode | Adobe Flash Player 6+ | Desktop, browser | 2005 (alfa) |
AVM2 [6] | Bytekode | Adobe Flash Player 9+, Adobe AIR , Tamarin VM | Desktop, browser, server | 2005 (alfa) |
ActionScript 3 [6] | Kilde | Adobe Flash Player 9+ | Server, Desktop | 2007 (1,12) |
C++ (hxcpp) [6] | Kilde | Windows, Linux, Mac OS X | Server, Desktop, CLI | 2009 (2,04) |
C++ | Kilde | Android [29] , Apple iOS [30] , Palm webOS [31] | Mobil | 2009 (2,04) |
C# [6] | Kilde | .NET Framework | Server, desktop, mobil | 2012 (2.10) |
Java [6] | Kilde | Java | Server, Desktop | 2012 (2.10) |
JavaScript [6] | Kilde | HTML5 , Node.js , PhoneGap | Server, Desktop, Browser, Mobil | 2006 (beta) |
Neko [6] | Bytekode | NekoVM | Server, Desktop, CLI | 2005 (alfa) |
PHP [6] | Kilde | PHP | server | 2008 (2,0) |
Python [6] | Kilde | Python | CLI, Web, Desktop | 2014 (3,2) |
Lua [32] | Kilde | Lua | Web, desktop, mobil | 2016 (3,3) |
Haxe er et objektorienteret sprog til generelle formål med understøttelse af undtagelseshåndtering og typeslutning for klasseparametre. Generisk programmering , refleksion , iteratorer og funktionel programmering understøttes også af sproget og bibliotekerne [33] . Haxe understøtter også, i modsætning til mange andre sprog, både statisk og dynamisk skrivning på samme tid. Compileren kan kontrollere typeinferens og smide kompileringstidsfejl, men udviklere kan også slå typekontrol fra og stole på målplatformens dynamiske typekontrol.
Haxe-sproget ligner ECMAScript , selvom stort set enhver ECMAScript-kode ikke kan kompileres i Haxe uden ændringer. I modsætning til ECMAScript er Haxe et kompileret sprog . Haxe var påvirket af ActionScript , Java og OCaml [13] .
Da Haxe var baseret på ActionScript 3 , understøtter det alle funktionerne i Flash API, selvom det kræver bedre kodning og højere udviklingsstandarder end Adobes compilere.
Dette program vil skrive "Hello World" efter kompilering og kørsel:
class Main { static function main () { trace ( "Hello World" ); } }Du kan teste denne kode ved at gemme den i en fil med et navn Main.hxog køre Haxe-kompileren med følgende muligheder: haxe -main Main --interp. Denne kommando starter Haxe Compiler i kodefortolkningstilstand og vises Main.hx:3: Hello world.
Haxe er et statisk skrevet sprog. Det har et rigt typesystem, herunder klasser, grænseflader, funktionelle typer, anonyme typer, algebraiske datatyper ( ADT'er , kaldet "enums" i Haxe), såvel som abstrakte datatyper. Klasser, algebraiske datatyper og funktionstyper understøtter typesletningsbaseret parametrisk polymorfi , ofte omtalt som "Generics" på andre objektorienterede sprog.
Haxe inkluderer støtte til begrænset polymorfi og subtype polymorfi .
Derudover understøtter Haxe strukturel typning og nominel typning . For at gøre tingene lettere for programmører og uden at gå på kompromis med typesikkerheden, understøtter Haxe typeinferens, hvilket i mange tilfælde eliminerer behovet for at skrive typer manuelt.
Klasser (søgeord "klasse") i Haxe ligner dem i Java eller AS3 . Deres felter kan være metoder, statiske klassevariabler eller klasseinstansegenskaber. Haxe understøtter "offentlige" og "private" adgangsattributter, såvel som mere avancerede adgangskontrolmetoder (ACL'er, links), der er beskrevet med annoteringer. Metoder og statiske variable med en konstant værdi kan indlejres ved hjælp af nøgleordet "inline".
Grænseflader i Haxe ligner Java -grænseflader .
interface ICreature { public var birth : Date ; public var name : String ; public function age (): Int ; } klasse Fly implementerer ICreature { public var birth : Date ; public var name : String ; public function age (): Int return Date . nu (). getFullYear () - fødsel . getFullYear (); }Opregnede typer er et nøgletræk ved sproget. Enums kan have deres egne parametre, samt være rekursive [34] . De ligner algebraiske datatyper , da de er på sprog som ML eller Haskell . Strengt taget er der tale om korrekte sumtyper , forudsat at de produkttyper der indgår i dem skal defineres indenfor disse sumtyper. Dette betyder, at enums ikke bare kaldes "magiske tal", som på de fleste sprog, de kan elegant løse komplekse arkitektoniske problemer:
enum Farve { rød ; grøn ; blå ; rgb ( r : Int , g : Int , b : Int ); } klasse Farver { statisk funktion toInt ( c : Farve ) : Int { return switch ( c ) { case red : 0xFF0000 ; kasse grøn : 0x00FF00 ; etui blåt : 0x0000FF _ kasus rgb ( r , g , b ): ( r << 16 ) | ( g << 8 ) | b ; } } statisk funktion validCalls () { var redint = toInt ( Color . red ); var rgbint = toInt ( Farve . rgb ( 100 , 100 , 100 )); } }Haxe understøtter også parametriske enum-typer. Et eksempel er implementeringen af typerne Option, Enten og ConsList, og ConsList er også rekursiv:
enum Option < T > { Some ( v : T ); ingen ; } enum Enten < T , U > { Venstre ( v : T ); Højre ( v : U ); } enum ConsList < T > { Nul ; Cons ( hoved : T , hale : ConsList < T >); }Dokumentationen på webstedet indikerer [35] , at Haxe også understøtter generaliserede algebraiske typer (GADT), men giver ikke et eksempel på, hvordan man opretter en.
Anonyme typer er defineret ved en eksplicit beskrivelse af deres struktur, de kan også tildeles et alias ved hjælp af en typedefinition (søgeord "typedef"):
typedef Anon = { a : Int , b : String , c : Float -> Void };Funktionstyper er førsteklasses objekter i Haxe. De er beskrevet ved hjælp af pile mellem argumenttyper og mellem typer og returværdi, som i mange andre funktionelle sprog. Men i modsætning til Haskell eller ML- familien er ikke alle funktioner i Haxe unære (funktioner med ét argument), de kan ikke anvendes delvist som standard . Typesignaturerne i de følgende eksempler har således en anden betydning end ovenstående sprog.
Type F er en funktion, der tager en Int og en String som argumenter og returnerer en Float som resultat.
På sprog, hvor der kun findes unære funktioner, vil denne type betyde en funktion, der tager en Int som argument og returnerer en funktion af typen String->Float.
Typerne F2 og F3 beskriver samme type. De beskriver begge binære funktioner, der returnerer en binær funktion af typen F. For F2 beskrives tilfældet med at bruge en funktionstype i en anden definition.
typedef F = Int -> String -> Float ; typedef F2 = Int -> String -> F ; typedef F3 = Int -> String ->( Int -> String -> Float );Konceptet, kaldet abstrakte typer , er den seneste tilføjelse til Haxe-typesystemet. De gør det muligt at genbruge eksisterende typer til specifikke formål, såsom implementering af typer for måleenheder, mens de i høj grad reducerer muligheden for at blande forskellige systemer (såsom miles og kilometer). Udtrykket "abstrakt type" i forbindelse med Haxe-sproget har en anden betydning end almindelige abstrakte typer .
Det følgende eksempel antager, at det metriske system bruges som standard, og konvertering til miles er påkrævet for at understøtte ældre data. Haxe er i stand til automatisk at konvertere miles til kilometer, men ikke omvendt.
abstrakt Kilometer ( Flåd ) { public function new ( v : Float ) this = v ; } abstrakt Mile ( Flåd ) { offentlig funktion ny ( v : Float ) dette = v ; @:til offentlig inline funktion toKilometer (): Kilometer tilbage ( ny Kilometer ( dette / 0,62137 )); } klasse Test { static var km : Kilometer ; statisk funktion main (){ var one100Miles = new Mile ( 100 ); km = one100Miles ; spore ( km ); // 160.935 } }Eksemplet viser, at det ikke er nødvendigt at foretage en eksplicit konvertering km = one100Miles;for at bruge de korrekte enheder.
Strukturel indtastning spiller en vigtig rolle i mange funktionelle programmeringssprog og på samme tid ret lille i almindelige OOP-sprog. I modsætning til det nominelle typesystem bestemmes ligheden af to typer ikke af ligheden af nogen typenavne, men snarere af typens struktur. Strukturtyper kan opfattes som implicitte grænseflader:
klasse FooBar { public var foo : Int ; public var bar : String ; offentlig funktion ny (){ foo = 1 ; bar = "2" ;} function anyFooBar ( v :{ foo : Int , bar : String }) trace ( v . foo ); statisk funktionstest ( ) { var fb = new FooBar (); fb . anyFooBar ( fb ); fb . anyFooBar ({ foo : 123 , bar : "456" }); } }Også på Haxe-platformen:
Andre sprog, der kompilerer til JavaScript:
Andre multiplatformsprog:
Adobe Flash | |
---|---|
Filformater | |
Implementeringer | flash spil |
Andre versioner | |
Biblioteker |
|
Virtuelle maskiner | |
se også |
|