Haxe

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 8. oktober 2017; checks kræver 29 redigeringer .
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] .

Arkitektur

Enkeltsprog

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] :

Compiler

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] .

Ydeevne

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.

Udvikling

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:

Kildekode

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:

Platform support

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)

Sprog

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.

hej verden

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.

Typesystemet

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

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 (); }

Optællinger

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

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

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 );

Abstrakte typer

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

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" }); } }

Se også

Også på Haxe-platformen:

  • Neko
  • OpenFL

Andre sprog, der kompilerer til JavaScript:

Andre multiplatformsprog:

Noter

  1. https://haxe.org/manual/introduction-haxe-history.html
  2. Nicolas' meddelelse om staveændring på Haxes officielle postliste .
  3. 1 2 Ponticelli, Franco. Professionel haXe og Neko  (neopr.) . - Wiley, 2008. - ISBN 0470122137 . Arkiveret 28. november 2015 på Wayback Machine
  4. Ivanov, Michael. Away3D 3.6 Kogebog  (udefineret) . — Packt Publishing Ltd, 2011. - ISBN 1849512817 . Arkiveret 2. november 2015 på Wayback Machine
  5. Doucet, Lars Haxe/OpenFL til hjemmespilskonsoller . Gamasutra (3. juni 2015). Hentet 9. oktober 2015. Arkiveret fra originalen 8. september 2015.
  6. 1 2 3 4 5 6 7 8 9 10 11 Introduktion til Haxe Standard Library Arkiveret 14. august 2015 på Wayback Machine , Haxe Docs
  7. 12 Kompilatormål . _ Haxe - The Cross-platform Toolkit . Hentet 23. februar 2021. Arkiveret fra originalen 2. marts 2021.
  8. Virksomheder, der bruger Haxe Arkiveret 7. september 2015 på Wayback Machine , Haxe Docs
  9. 1 2 3 Doucet, Lars Kære Adobe: Støt Haxe, gem dine værktøjer . Gamasutra (24. juni 2014). Hentet 9. oktober 2015. Arkiveret fra originalen 24. september 2015.
  10. om snõwkit . snõwkit (20. september 2014). Hentet 9. august 2016. Arkiveret fra originalen 9. august 2016.
  11. Doucet, Lars Flash er død, længe leve OpenFL! . Gamasutra (18. marts 2014). Hentet 9. oktober 2015. Arkiveret fra originalen 30. august 2015.
  12. 1 2 3 4 5 6 7 Grden, John; Mineault, Patrick; Balkan, Aral; Hughes, Marc; Arnold, Wade. Den essentielle guide til Open Source Flash-udvikling  . - Apress , 2008. - P. Kapitel 9 (Brug af Haxe). — ISBN 1430209941 . Arkiveret 8. februar 2016 på Wayback Machine
  13. 1 2 3 4 Haxe Interview  (ubestemt) . - Io Programmo, 2009. - 1. april. - S. 1-6 . Arkiveret fra originalen den 8. december 2015.
  14. Fisher, Matt. HTML5 til Flash-udviklere  (ubestemt) . — Packt Publishing Ltd, 2013. - ISBN 1849693331 . Arkiveret 24. november 2015 på Wayback Machine
  15. Servertilstand kommandolinje:haxe --wait [host:]port
  16. AS3 vs haXe performance Arkiveret 5. januar 2013 på Wayback Machine , SplashDusts hjemmeside
  17. AS3 Performance Optimization Arkiveret 6. oktober 2015 på Wayback Machine , Starling Wiki
  18. 1 2 Vadim Dyachenko. På "Du kan ikke lave gode HTML5-spil i Haxe" (downlink) . Gul efter livet (5. december 2013). Hentet 9. oktober 2015. Arkiveret fra originalen 30. september 2015. 
  19. Kaya, Talha OpenFL & Haxe, A Bumpy Start . Gamasutra (4. juli 2014). Hentet 9. oktober 2015. Arkiveret fra originalen 24. september 2015.
  20. Haxe 3.2 Release . Github. Hentet 9. oktober 2015. Arkiveret fra originalen 21. februar 2016.
  21. Haxe postlisteindlæg om navngivning . Arkiveret fra originalen den 28. marts 2007.
  22. MTASC Compiler Arkiveret 20. oktober 2020 på Wayback Machine , MTASCs hjemmeside
  23. Hax-licensside . Arkiveret fra originalen den 12. maj 2012.
  24. Hax introduktionsside . Arkiveret fra originalen den 4. maj 2012.
  25. Hovedside, FlashDevelop Wiki Arkiveret 10. oktober 2015 på Wayback Machine , "førsteklasses support til Flash ActionScript (AS2 og AS3) og Haxe-udvikling"
  26. Haxe Support Arkiveret 6. juli 2015 på Wayback Machine , FlashDevelop Wiki
  27. as3hx Arkiveret 14. maj 2015 på Wayback Machine , AS3 til Haxe konverter, Haxe kildekodelager
  28. CS2HX - C# til haXe konverter Arkiveret 4. marts 2010 på Wayback Machine , CodePlex projekthosting
  29. Blogindlæg, der omtaler Android-portens fremskridt . Hentet 9. oktober 2015. Arkiveret fra originalen 28. december 2015.
  30. Haxe, iPhone & C++ Endelig arkiveret 15. april 2012 på Wayback Machine , GameHaxe- webstedet
  31. Sådan kommer du i gang med Haxe 2.06 og webOS PDK [arkiveret på WayBackMachine ] . Arkiveret fra originalen den 22. oktober 2014.
  32. Hej Lua! - Haxe - The Cross-platform Toolkit . Hentet 9. august 2016. Arkiveret fra originalen 6. august 2016.
  33. Haxe sprogreference . Arkiveret fra originalen den 2. maj 2012.
  34. Haxe-reference, der beskriver brugen af ​​enum . Arkiveret fra originalen den 11. maj 2012.
  35. Sprogfunktioner . Haxe - The Cross-platform Toolkit . Hax Foundation. Hentet 30. april 2015. Arkiveret fra originalen 16. maj 2015.
  36. En Scala til JavaScript-kompiler . Hentet 9. oktober 2015. Arkiveret fra originalen 10. august 2015.

Links