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] .
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] :
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] .
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ă.
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:
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:
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) |
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.
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.
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 (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 (); }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.
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 };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 );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.
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" }); } }De asemenea, pe platforma Haxe:
Alte limbi care se compilează în JavaScript:
Alte limbi multiplatforme:
Adobe Flash | |
---|---|
Formate de fișiere | |
Implementări | joc flash |
Alte versiuni | |
Biblioteci |
|
Mașini virtuale | |
Vezi si |
|