Haxe

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 8 octombrie 2017; verificările necesită 29 de modificări .
Haxe
Clasa de limba Multi-paradigma
Aparut in 2005
Dezvoltator Fundația Hax
Eliberare 4.2.5 ( 6 martie 2022 )
Tip sistem static , dinamic prin adnotări
A fost influențat Java , OCaml , ActionScript și MTASC [1]
Licență GPL v2, bibliotecă: MIT
Site-ul web haxe.org
Platformă ARM , IA-32 , x64
OS Android , iOS _ Linux , macOS , Windows

Haxe este un limbaj de programare și compilator multiplatformă, de nivel înalt, open source , care poate fi folosit pentru a construi aplicații și a genera cod sursă pentru diferite platforme, menținând în același timp o singură bază de cod [2] [3] [4] [5] .

Haxe include funcționalități acceptate pe toate platformele , cum ar fi tipuri de date numerice, șiruri de caractere , matrice , precum și suport pentru unele formate de fișiere ( xml , zip ) [3] [6] . Haxe include, de asemenea, suport pentru API-uri specifice pentru fiecare platformă de compilare țintă.

Codul scris în limbajul Haxe poate fi compilat în cod JavaScript , C++ , Java , JVM , PHP , C# , Python , Lua și Node.js [7] . Codul Haxe se compilează și în SWF, HashLink și Neko , bytecode și poate fi executat și în modul de interpretare [7] .

Principalii utilizatori ai Haxe sunt TiVo , Prezi , Nickelodeon , Disney , Mattel , Hasbro , Coca Cola , Toyota și BBC [8] [9] . OpenFL și Flambe  sunt cadre Haxe populare pentru crearea de conținut și programe multi-platformă dintr-o singură bază de cod [9] . În plus, Snõwkit [10] se dezvoltă în prezent în mod activ . Datorită deplasării tot mai mari a tehnologiei Adobe Flash în ultimii ani în favoarea HTML5 , Haxe, Unity și alte instrumente multiplatformă dedică din ce în ce mai mult timp acestora din urmă, menținând în același timp suportul înapoi cu Adobe Flash Player [9] [11] .

Arhitectură

O singură limbă

Cel mai semnificativ aspect al dezvoltării arhitecturii Haxe a fost decizia de a sprijini aplicațiile Adobe Flash, JavaScript și server într-o singură bază de cod [12] [13] . În proiectele web tipice, dezvoltatorii trebuie să folosească multe limbi diferite pentru a construi o aplicație web completă [12] [13] :

Haxe a fost creat cu ideea de a reuni toate aceste componente într-o singură bază de cod, precum și de a simplifica interacțiunea dintre componentele aplicației [12] [13] [14] .

Cartea, scrisă de Nicholas Kennessy (fondatorul proiectului Haxe), afirmă obiectivele inițiale ale creării Haxe [12] :

Compilator

Compilatorul Haxe este împărțit într-un singur frontend și mai multe backend-uri. Interfața este responsabilă pentru analizarea și verificarea tipului, aplicarea macrocomenzilor, optimizarea generală, diverse transformări de cod și crearea unei reprezentări intermediare a codului sub forma unui arbore de sintaxă abstractă (ASD). Fiecare dintre backend-uri este responsabil pentru traducerea acestui AST în codul sursă sau bytecode al platformei țintă.

Compilatorul este scris în OCaml . Poate fi rulat în modul server pentru a sprijini completarea codului în IDE, iar un cache este, de asemenea, suportat în acest mod pentru a reduce timpul de compilare [15] .

Performanță

Compilatorul Haxe este un compilator de optimizare care utilizează, de asemenea , înlocuirea funcțiilor , plierea constantă , eliminarea codului mort (DCE) pentru a optimiza performanța programelor compilate.

Performanța programelor scrise în Haxe depinde de platforma țintă.

Dezvoltare

Dezvoltarea Haxe a început în octombrie 2005 [20] și prima versiune beta a fost lansată în februarie 2006. Haxe 1.0 a fost lansat în aprilie 2006 și a suportat randarea la Adobe Flash , Javascript și Neko .

Haxe a fost dezvoltat de Nicolas Cannasse și alții și a fost numit inițial haXe pentru că este un nume scurt, simplu, iar „are un X în nume” un atribut necesar pentru ca o nouă tehnologie să aibă succes. a remarcat cu umor autorul cărții. limba [21] .

Haxe este un succesor open source ActionScript 2 al compilatorului MTASC , realizat tot de Nicholas Hennessy [12] [22] și lansat sub Licența Publică Generală GNU versiunea 2 sau mai mare [23] .

Haxe are multe în comun cu ActionScript 3 . Compilatorul Haxe este dezvoltat în limbajul OCaml , dar pentru a scrie în Haxe, nu este necesară cunoașterea OCaml.

Beneficiile utilizării Haxe includ:

Cod sursă

IDE-ul recomandat pentru dezvoltarea Haxe este FlashDevelop [12] care acceptă ActionScript 2, 3 și Haxe ca limbi principale cu evidențierea sintaxelor , completarea codului și alte caracteristici [12] [25] . Acest IDE acceptă, de asemenea, plierea codului , refactorizarea și depanarea interactivă . [26]

Pentru a utiliza codul existent, comunitatea open source a creat convertoare de cod sursă pentru:

Suport platformă

Limbajul Haxe poate fi tradus în bytecode al diferitelor mașini virtuale, cum ar fi Adobe Flash Player și Neko , precum și ActionScript 3 , cod sursă JavaScript , inclusiv C++ și C# acceptate experimental . Această strategie de „compilare” în diverse surse a fost dezvoltată sub inspirația paradigmei „scrie o dată, alergă oriunde”. Această strategie permite, de asemenea, programatorului să aleagă cea mai bună platformă pe care să ruleze programele.

Generator de cod Rezultat Platformă Utilizare Din ce versiune de Haxe
AVM1 [6] Cod octet Adobe Flash Player 6+ Desktop, Browser 2005 (alfa)
AVM2 [6] Cod octet Adobe Flash Player 9+, Adobe AIR , Tamarin VM Desktop, Browser, Server 2005 (alfa)
ActionScript 3 [6] Sursă Adobe Flash Player 9+ Server, Desktop 2007 (1,12)
C++ (hxcpp) [6] Sursă Windows, Linux, Mac OS X Server, Desktop, CLI 2009 (2,04)
C++ Sursă Android [29] , Apple iOS [30] , Palm webOS [31] Mobil 2009 (2,04)
C# [6] Sursă .Cadru net Server, desktop, mobil 2012 (2,10)
Java [6] Sursă Java Server, Desktop 2012 (2,10)
JavaScript [6] Sursă HTML5 , Node.js , PhoneGap Server, desktop, browser, mobil 2006 (beta)
Neko [6] Cod octet NekoVM Server, Desktop, CLI 2005 (alfa)
PHP [6] Sursă PHP Server 2008 (2,0)
Python [6] Sursă Piton CLI, Web, Desktop 2014 (3,2)
Lua [32] Sursă Lua Web, desktop, mobil 2016 (3,3)

Limba

Haxe este un limbaj de uz general orientat pe obiecte , cu suport pentru gestionarea excepțiilor și inferența de tip pentru parametrii clasei. Programarea generică , reflecția , iteratoarele și programarea funcțională sunt , de asemenea, suportate de limbaj și biblioteci [33] . De asemenea, Haxe, spre deosebire de multe alte limbi, acceptă atât tastarea statică , cât și cea dinamică în același timp. Compilatorul poate verifica inferența de tip și poate arunca erori de compilare, dar dezvoltatorii pot dezactiva și verificarea tipului și se pot baza pe verificarea dinamică a tipului a platformei țintă.

Limbajul Haxe este similar cu ECMAScript , deși practic orice cod ECMAScript nu poate fi compilat în Haxe fără modificare. Spre deosebire de ECMAScript, Haxe este un limbaj compilat . Haxe a fost influențat de ActionScript , Java și OCaml [13] .

Deoarece Haxe a fost bazat pe ActionScript 3 , acceptă toate caracteristicile API-ului Flash, deși necesită o codare mai bună și standarde de dezvoltare mai înalte decât compilatoarele Adobe.

salut lumea

Acest program va scrie „Hello World” după compilare și rulare:

class Main { static function main () { trace ( "Bună ziua" ); } }

Puteți testa acest cod salvându-l într-un fișier cu un nume Main.hxși rulând compilatorul Haxe cu următoarele opțiuni: haxe -main Main --interp. Această comandă va porni Haxe Compiler în modul de interpretare a codului și va afișa Main.hx:3: Hello world.

Sistemul de tipuri

Haxe este un limbaj tipizat static. Are un sistem de tip bogat, care include clase, interfețe, tipuri funcționale, tipuri anonime, tipuri de date algebrice ( ADT -uri , numite „enumări” în Haxe), precum și tipuri de date abstracte. Clasele, tipurile de date algebrice și tipurile de funcții acceptă polimorfismul parametric bazat pe ștergerea tipului , adesea denumit „Generic” în alte limbaje orientate pe obiect.

Haxe include suport pentru polimorfism constrâns și polimorfism subtip .

În plus, Haxe acceptă tastarea structurală și tastarea nominală . Pentru a face lucrurile mai ușoare pentru programatori și fără a compromite siguranța tipului, Haxe acceptă inferența de tip, ceea ce în multe cazuri elimină necesitatea scrierii manuală a tipurilor.

Clasele

Clasele (cuvânt cheie „clasă”) în Haxe sunt similare cu cele din Java sau AS3 . Câmpurile lor pot fi metode, variabile statice de clasă sau proprietăți ale instanței de clasă. Haxe acceptă atributele de acces „publice” și „private”, precum și metode mai avansate de control al accesului (ACL-uri, linkuri) care sunt descrise prin adnotări. Metodele și variabilele statice cu o valoare constantă pot fi introduse folosind cuvântul cheie „inline”.

Interfețele din Haxe sunt similare cu interfețele Java .

interfață ICreature { public var birth : Data ; public var name : String ; vârsta funcției publice (): Int ; } class Fly implements ICreature { public var birth : Data ; public var name : String ; public function age (): Int return Data . acum (). getFullYear () - naștere . getFullYear (); }

Enumerări

Tipurile enumerate  sunt o caracteristică cheie a limbii. Enumerările pot avea proprii lor parametri, precum și pot fi recursive [34] . Sunt similare cu tipurile de date algebrice , deoarece sunt în limbi precum ML sau Haskell . Strict vorbind, acestea sunt tipuri de sume corecte , cu condiția ca tipurile de produse incluse în acestea să fie definite în cadrul acestor tipuri de sume. Aceasta înseamnă că enumerarile nu sunt denumite doar „numere magice”, ca în majoritatea limbilor, ci pot rezolva în mod elegant probleme arhitecturale complexe:

enum Color { roșu ; verde ; albastru ; rgb ( r : Int , g : Int , b : Int ); } clasa Culori { funcția statică toInt ( c : Culoare ) : Int { comutator de întoarcere ( c ) { case roșu : 0xFF0000 ; carcasa verde : 0x00FF00 ; carcasă albastră : 0x0000FF _ caz rgb ( r , g , b ): ( r << 16 ) | ( g << 8 ) | b ; } } funcția statică validCalls () { var redint = toInt ( Color . red ); var rgbint = toInt ( Color . rgb ( 100 , 100 , 100 )); } }

Haxe acceptă și tipurile de enumerare parametrice. Un exemplu este implementarea tipurilor Option, Either și ConsList, iar ConsList este, de asemenea, recursiv:

enum Opțiunea < T > { Unele ( v : T ); niciunul ; } enum Fie < T , U > { Stânga ( v : T ); Dreapta ( v : U ); } enumerare ConsList < T > { Nil ; Contra ( cap : T , coada : ConsList < T >); }

Documentația de pe site indică [35] că Haxe acceptă și tipurile algebrice generalizate (GADT), dar nu oferă un exemplu de creare a unuia.

Tipuri anonime

Tipurile anonime sunt definite printr-o descriere explicită a structurii lor, li se poate atribui și un alias folosind o definiție de tip (cuvânt cheie „typedef”):

typedef Anon = { a : Int , b : String , c : Float -> Void };

Tipuri de funcții

Tipurile de funcții sunt obiecte de primă clasă în Haxe. Ele sunt descrise folosind săgeți între tipurile de argument și între tipuri și valoarea returnată, ca în multe alte limbaje funcționale. Cu toate acestea, spre deosebire de Haskell sau familia ML , nu toate funcțiile din Haxe sunt unare (funcții cu un singur argument), nu pot fi aplicate parțial în mod implicit . Astfel, semnăturile de tip din exemplele următoare au un înțeles diferit față de limbile de mai sus.

Tipul F este o funcție care ia un Int și un String ca argumente și returnează un Float ca rezultat.

În limbile în care există doar funcții unare, acest tip ar însemna o funcție care ia un Int ca argument și returnează o funcție de tip String->Float.

Tipurile F2 și F3 descriu același tip. Ambele descriu funcții binare care returnează o funcție binară de tip F. Pentru F2 este descris cazul utilizării unui tip de funcție în interiorul unei alte definiții.

typedef F = Int -> String -> Float ; typedef F2 = Int -> String -> F ; typedef F3 = Int -> String ->( Int -> String -> Float );

Tipuri abstracte

Conceptul, numit tipuri abstracte , este cea mai recentă adăugare la sistemul de tip Haxe. Acestea permit reutilizarea tipurilor existente în scopuri specifice, cum ar fi implementarea tipurilor pentru unități de măsură, reducând în același timp foarte mult posibilitatea de a amesteca diferite sisteme (cum ar fi mile și kilometri). Termenul „tip abstract” în contextul limbajului Haxe are un înțeles diferit față de tipurile abstracte obișnuite .

Următorul exemplu presupune că sistemul de metrice este utilizat în mod implicit, iar conversia în mile este necesară pentru a accepta datele vechi. Haxe este capabil să convertească automat mile în kilometri, dar nu invers.

abstract Kilometru ( Float ) { public function new ( v : Float ) this = v ; } abstract Mile ( Float ) { public function new ( v : Float ) this = v ; @:to public inline function toKilometer (): Retur kilometric ( nou Kilometru ( acest / 0,62137 )); } class Test { static var km : Kilometru ; static function main (){ var one100Miles = new Mile ( 100 ); km = one100Miles ; urmă ( km ); // 160.935 } }

Exemplul arată că nu este necesar să faceți o conversie explicită km = one100Miles;pentru a utiliza unitățile corecte.

Tastare structurală

Tastarea structurală joacă un rol important în multe limbaje de programare funcționale și, în același timp, destul de mic în limbajele OOP comune. Spre deosebire de sistemul de tip nominal, egalitatea a două tipuri este determinată nu de egalitatea oricăror nume de tip, ci mai degrabă de structura tipului. Tipurile de structuri pot fi considerate ca interfețe implicite:

clasa FooBar { public var foo : Int ; public var bar : String ; public function new (){ foo = 1 ; bara = "2" ;} function anyFooBar ( v :{ foo : Int , bar : String }) trace ( v . foo ); testul funcției statice (){ var fb = new FooBar (); fb . anyFooBar ( fb ); fb . anyFooBar ({ foo : 123 , bar : "456" }); } }

Vezi și

De asemenea, pe platforma Haxe:

  • Neko
  • OpenFL

Alte limbi care se compilează în JavaScript:

Alte limbi multiplatforme:

Note

  1. https://haxe.org/manual/introduction-haxe-history.html
  2. Anunțul lui Nicolas privind schimbarea ortografiei pe lista oficială de corespondență Haxe .
  3. 1 2 Ponticelli, Franco. Professional haXe și Neko  (neopr.) . - Wiley, 2008. - ISBN 0470122137 . Arhivat pe 28 noiembrie 2015 la Wayback Machine
  4. Ivanov, Michael. Away3D 3.6 Carte de bucate  (nedefinit) . — Packt Publishing Ltd, 2011. - ISBN 1849512817 . Arhivat pe 2 noiembrie 2015 la Wayback Machine
  5. Doucet, Lars Haxe/OpenFL pentru console de jocuri de acasă . Gamasutra (3 iunie 2015). Preluat la 9 octombrie 2015. Arhivat din original la 8 septembrie 2015.
  6. 1 2 3 4 5 6 7 8 9 10 11 Introducere în biblioteca standard Haxe Arhivată la 14 august 2015 la Wayback Machine , Haxe Docs
  7. 12 Țintele compilatorului . Haxe - Setul de instrumente multiplatformă . Preluat la 23 februarie 2021. Arhivat din original la 2 martie 2021.
  8. Companii care folosesc Haxe Arhivat 7 septembrie 2015 la Wayback Machine , Haxe Docs
  9. 1 2 3 Doucet, Lars Dragă Adobe: Susține Haxe, salvează-ți instrumentele . Gamasutra (24 iunie 2014). Consultat la 9 octombrie 2015. Arhivat din original la 24 septembrie 2015.
  10. despre snõwkit . snõwkit (20 septembrie 2014). Preluat la 9 august 2016. Arhivat din original la 9 august 2016.
  11. Doucet, Lars Flash a murit, trăiește OpenFL! . Gamasutra (18 martie 2014). Preluat la 9 octombrie 2015. Arhivat din original la 30 august 2015.
  12. 1 2 3 4 5 6 7 Grden, Ioan; Mineault, Patrick; Balcani, Aral; Hughes, Marc; Arnold, Wade. Ghidul esențial pentru dezvoltarea Flash sursă deschisă  . - Apress , 2008. - P. Capitolul 9 (Utilizarea Haxe). — ISBN 1430209941 . Arhivat pe 8 februarie 2016 la Wayback Machine
  13. 1 2 3 4 Interviu Haxe  (nedeterminat) . - Io Programo, 2009. - 1 aprilie. - S. 1-6 . Arhivat din original pe 8 decembrie 2015.
  14. Fisher, Matt. HTML5 pentru dezvoltatori Flash  (nedeterminat) . — Packt Publishing Ltd, 2013. - ISBN 1849693331 . Arhivat pe 24 noiembrie 2015 la Wayback Machine
  15. Linia de comandă pentru modul server:haxe --wait [host:]port
  16. AS3 vs haXe performance Arhivat 5 ianuarie 2013 pe Wayback Machine , site-ul SplashDust
  17. AS3 Performance Optimization Arhivat 6 octombrie 2015 la Wayback Machine , Starling Wiki
  18. 1 2 Vadim Dyachenko. Pe „Nu poți face jocuri HTML5 bune în Haxe” (downlink) . Yellow After Life (5 decembrie 2013). Consultat la 9 octombrie 2015. Arhivat din original la 30 septembrie 2015. 
  19. Kaya, Talha OpenFL și Haxe, A Bumpy Start . Gamasutra (4 iulie 2014). Consultat la 9 octombrie 2015. Arhivat din original la 24 septembrie 2015.
  20. Versiunea Haxe 3.2 . Github. Consultat la 9 octombrie 2015. Arhivat din original pe 21 februarie 2016.
  21. Postare pe lista de corespondență Haxe despre denumire . Arhivat din original pe 28 martie 2007.
  22. MTASC Compiler Arhivat 20 octombrie 2020 pe Wayback Machine , site-ul web MTASC
  23. Pagina de licență Hax . Arhivat din original pe 12 mai 2012.
  24. Pagina de introducere Hax . Arhivat din original pe 4 mai 2012.
  25. Pagina principală, FlashDevelop Wiki Arhivat 10 octombrie 2015 la Wayback Machine , „suport de primă clasă pentru Flash ActionScript (AS2 și AS3) și dezvoltare Haxe”
  26. Haxe Support Arhivat pe 6 iulie 2015 la Wayback Machine , FlashDevelop Wiki
  27. as3hx Arhivat 14 mai 2015 la Wayback Machine , Convertor AS3 în Haxe, depozitul de cod sursă Haxe
  28. CS2HX - Convertor C# în haXe Arhivat 4 martie 2010 la Wayback Machine , găzduirea proiectului CodePlex
  29. Postare pe blog care menționează progresul portului Android . Consultat la 9 octombrie 2015. Arhivat din original la 28 decembrie 2015.
  30. Haxe, iPhone & C++ Arhivat ultima dată pe 15 aprilie 2012 pe Wayback Machine , site- ul GameHaxe
  31. Cum să începeți cu Haxe 2.06 și webOS PDK [arhivat pe WayBackMachine ] . Arhivat din original pe 22 octombrie 2014.
  32. Bună Lua! - Haxe - Setul de instrumente multiplatformă . Preluat la 9 august 2016. Arhivat din original la 6 august 2016.
  33. Referință la limbajul Haxe . Arhivat din original pe 2 mai 2012.
  34. Referință Haxe care detaliază utilizarea enum . Arhivat din original pe 11 mai 2012.
  35. Caracteristici ale limbii . Haxe - Setul de instrumente multiplatformă . Fundația Hax. Consultat la 30 aprilie 2015. Arhivat din original pe 16 mai 2015.
  36. Un compilator Scala to JavaScript . Consultat la 9 octombrie 2015. Arhivat din original la 10 august 2015.

Link -uri