Haxe | ||
Data della prima versione | 16 maggio 2006 | |
---|---|---|
Autore | Nicolas cannasse | |
Ultima versione | 4.2.1 (26 febbraio 2021) | |
Digitando | Dinamico , statico , nominativo | |
Influenzato da | Java , OCaml , ActionScript | |
Scritto in | OCaml | |
Sistema operativo | Android , iOS , Windows , GNU / Linux , Mac OS X | |
Licenza | Licenza GNU GPL e MIT | |
Sito web | haxe.org | |
Estensioni di file | .hx | |
Haxe è il nome di un linguaggio di programmazione , multi paradigma , multipiattaforma , di alto livello e quello di un compilatore utilizzato per produrre applicazioni per molte piattaforme differenti da un'unica fonte. È anche il nome di un software gratuito e open source distribuito con licenza GPLv2 . La libreria standard è disponibile con la licenza MIT .
Haxe include una serie di funzioni comuni supportate su tutte le piattaforme , come tipi di dati numerici , di testo , tabulari e binari , nonché alcuni formati di file comuni . Haxe include anche interfacce di programmazione (API) specifiche per determinate piattaforme, in particolare per Adobe Flash , C ++ , PHP .
Il codice scritto in linguaggio Haxe sarebbe essere compilato "fonte a fonte" a uno script scritto in ActionScript3 , JavaScript , Java , C ++ , C # , PHP , Python , Lua o Node.js . Potremmo anche usare Haxe per produrre quello che chiameremmo " piccolo formato web " ( SWF ) o " Neko bytecode " o " HashLink ".
Gli utenti principali di Haxe includono sviluppatori di BBC , Coca-Cola , Disney , Hasbro , Mattel , Nickelodeon , Prezi , TiVo e Zynga . OpenFL (in) e Flambe sono framework Haxe popolari per la creazione di contenuti multipiattaforma da un'unica fonte.
L'aspetto più singolare dell'architettura di Haxe è stata la decisione di supportare Flash , JavaScript e script lato server con un linguaggio unificato. Nei progetti di sviluppo web tradizionali, gli sviluppatori utilizzano linguaggi diversi per creare un'applicazione web integrata.
Haxe deve supportare tutti i suoi aspetti in un'unica lingua e semplificare la logica di comunicazione tra di loro. Pertanto, la logica dell'applicazione non ha bisogno di gestire l'implementazione delle comunicazioni.
Gli obiettivi originali di Haxe sono:
Il compilatore è diviso in un front-end e diversi backend . Il front-end crea un AST ( Abstract Syntax Tree ) dal codice sorgente ed esegue il controllo del tipo, l'espansione delle macro e l'ottimizzazione AST. I diversi backend traducono l'AST così elaborato in codice sorgente o bytecode a seconda della destinazione.
Il compilatore è scritto in OCaml . Può essere utilizzato in modalità server per fornire il completamento del codice per ambienti di sviluppo (IDE) e per mantenere una cache per velocizzare la compilazione.
In Haxe, le piattaforme supportate sono note come "target". Si tratta di moduli Haxe che forniscono accesso API interno per le parti backend del compilatore responsabili della generazione del codice o del bytecode corrispondente.
Lo sviluppo di Haxe è iniziato nel 2005. La prima versione beta era disponibile inFebbraio 2006. Haxe 1.0 è stato rilasciato il17 maggio 2006con supporto per target Adobe Flash , JavaScript e Neko .
Haxe è il successore del compilatore open source MTASC (en), anch'esso creato da Nicolas Cannasse, ed è disponibile sotto la GNU General Public License . La conoscenza di OCaml non è richiesta per sviluppare applicazioni utilizzando Haxe.
Il linguaggio Haxe può essere compilato in bytecode per varie macchine virtuali , come Adobe Flash Player e NekoVM, e generare codice sorgente per linguaggi come Javascript e Python .
La strategia di compilazione in più linguaggi di programmazione è ispirata al paradigma "scrivi una volta, corri ovunque" . Ciò consente al programmatore di scegliere le migliori opzioni per il suo compito.
Generatore | Uscita | piattaforma | uso | Da |
---|---|---|---|---|
AVM1 | codice byte | Adobe Flash Player 6+ | Desktop, Navigatore | 2005 (alfa) |
AVM2 | codice byte | Adobe Flash Player 9+, Adobe AIR , Tamarin VM | Desktop, browser, server | 2005 (alfa) |
ActionScript 3 | fonte | Adobe Flash Player 9+ | Server, ufficio | 2007 (1.12) |
C ++ (hxcpp) | fonte | Windows , Linux , macOS | Server, ufficio, CLI | 2009 (2.04) |
C ++ | fonte | Android , Apple iOS , Palm webOS | Mobile | 2009 (2.04) |
VS # | fonte | .NET Framework | Server, ufficio, cellulare | 2012 (2.10) |
HashLink | fonte | HashLink | Server, ufficio | 2016 (3.3) |
Giava | fonte | Giava | Server, ufficio | 2012 (2.10) |
Javascript | fonte | HTML5 , NodeJS , PhoneGap | Server, desktop, browser, dispositivi mobili | 2006 (beta) |
Neko | codice byte | NekoVM | Server, ufficio, CLI | 2005 (alfa) |
PHP | fonte | PHP | Cameriere | 2008 (2.0) |
Pitone | fonte | Pitone | CLI, web, ufficio | 2014 (3.2) |
Lua | fonte | Lua | CLI, web, desktop, dispositivi mobili | 2016 (3.3) |
Haxe è un linguaggio che supporta la programmazione orientata agli oggetti , la programmazione generica e varie costruzioni di programmazione funzionale . Caratteristiche come iterazioni , eccezioni o anche riflessioni sono caratteristiche di base del linguaggio. Haxe ha un sistema di tipi forte e dinamico. Il compilatore verificherà implicitamente i tipi e fornirà errori di compilazione. Offre inoltre ai programmatori la possibilità di saltare il controllo del tipo e utilizzare la digitazione dinamica per la piattaforma di destinazione.
Haxe ha un flessibile e sofisticato tipo di sistema. I tipi disponibili sono classi , interfacce, funzioni e tipi anonimi , tipi di dati algebrici ( enum) e tipi astratti ( abstract). Il polimorfismo parametrizzato è possibile per classi, funzioni e tipo algebrico, consentendo una programmazione generica. La varianza nelle funzioni polimorfiche è quindi supportata.
Per impostazione predefinita, la digitazione è statica a meno che non siano presenti annotazioni di digitazione dinamica , da utilizzare con un obiettivo che la supporta. Il controllo del tipo utilizza il sistema dei tipi nominativi con l'eccezione dei tipi anonimi, dove viene utilizzato il sistema dei tipi strutturali . Infine, è supportata l' inferenza del tipo , che consente di dichiarare una variabile senza annotazione del tipo.
classLe classi Haxe (parola chiave ) sono simili a quelle in Java o ActionScript 3 . I loro campi possono essere metodi, variabili o proprietà, ciascuno statico o specifico per ciascuna istanza. Haxe supporta le funzioni di accesso publice private, oltre a metodi più avanzati di controllo dell'accesso specificati dalle annotazioni. I metodi e le variabili costanti statiche possono utilizzare l' estensione inline con la parola chiave inline.
Le interfacce in Haxe sono molto simili a quelle, ad esempio in Java.
interface ICreature { public var dateDeNaissance:Date; public var nom:String; public function age():Int; } class Mouche implements ICreature { public var dateDeNaissance:Date; public var nom:String; public function age():Int return Date.now().getFullYear() - dateDeNaissance.getFullYear(); }I tipi elencati sono una parte importante della lingua; possono essere parametrizzati ed essere ricorsivi. Forniscono supporto di base per i tipi di dati algebrici , consentendo l'inclusione di tipi di prodotto , simili a Haskell e ML . È switchpossibile applicare filtri a pattern a valori enumerati, consentendo soluzioni eleganti a problemi complessi.
enum Couleur { Rouge; Vert; Bleu; RGB( r : Int, g : Int, b : Int ); } class Couleurs { static function versInt ( c : Couleur ) : Int { return switch ( c ) { case Rouge: 0xFF0000; case Vert: 0x00FF00; case Bleu: 0x0000FF; case RGB(r, g, b): (r << 16) | (g << 8) | b; } } static function appelsPermis() { var rouge = versInt(Couleur.Rouge); var rgbint = versInt(Couleur.RGB(100, 100, 100)); } }Esempi di tipi enumerati con parametri sono disponibili nella libreria standard Haxe, come Option e Either types.
enum Option<T> { Some(v:T); None; } enum Either<L, R> { Left(v:L); Right(v:R); }Haxe supporta anche i tipi algebrici generalizzati .
I tipi anonimi vengono definiti indicando esplicitamente la loro struttura. Possono essere utilizzati per implementare la tipizzazione strutturale degli argomenti della funzione (vedere di seguito) ed essere alias con la parola chiave typedef.
typedef AliasForAnon = { a:Int, b:String, c:Float->Void };In Haxe, le funzioni sono oggetti di prima classe . Il loro tipo viene annotato utilizzando le frecce tra i tipi di argomento e tra i tipi di argomento e il tipo restituito, come presenti in molti linguaggi di programmazione funzionale . Tuttavia, a differenza di Haskell e dei linguaggi della famiglia ML , non tutte le funzioni sono unarie (funzione con un solo argomento). Pertanto, le firme dei seguenti tipi hanno una semantica diversa rispetto alle lingue menzionate in precedenza. Il tipo Fè una funzione che accetta un intero ( Int) e una stringa di caratteri ( String) come argomenti e restituisce un valore di tipo real ( Float).
La stessa notazione in un linguaggio con solo funzioni unarie farebbe riferimento a una funzione che ne prende una come parametro Inte restituirebbe una funzione di tipo String->Float.
I tipi F2e F3corrispondono allo stesso tipo. Queste sono funzioni binarie che restituiscono una funzione binaria di tipo F. Per F3, viene utilizzata la sintassi per definire un tipo di funzione in un tipo di funzione.
typedef F = Int->String->Float; typedef F2 = Int->String->F; typedef F3 = Int->String->(Int->String->Float);L'ultima aggiunta al sistema di tipi di Haxe è il concetto di tipi astratti . In Haxe, differiscono dai tipi astratti convenzionali . Vengono utilizzati per rendere implicite le conversioni tra diversi tipi, consentendo il riutilizzo dei tipi esistenti per scopi specifici, come i tipi per le unità di misura. Ciò riduce notevolmente la miscelazione di valori dello stesso tipo ma con semantica diversa (ad esempio miglia e chilometri).
Il seguente esempio presuppone che il sistema metrico sia il sistema predefinito, che richiede una conversione da miglio a chilometro per i dati esistenti nel formato sbagliato. Questo esempio converte quindi automaticamente le miglia in chilometri, ma non il contrario.
abstract Kilometre(Float) { public function new(v:Float) this = v; } abstract Mile(Float) { public function new(v:Float) this = v; @:to public inline function toKilometre():Kilometre return (new Kilometre(this / 0.62137)); } class Test { static var km:Kilometre; static function main(){ var centMiles = new Mile(100); km = centMiles; trace(km); // 160.935 } }Come mostra l'esempio, non è richiesta alcuna conversione esplicita per eseguire l'assegnazione km = centMiles.
In molti linguaggi di programmazione funzionale , la tipizzazione strutturale gioca un ruolo importante. Haxe applicato tramite tipi anonimi, non utilizzando i tipi di sistema registrati della programmazione orientata agli oggetti quando vengono utilizzati i tipi denominati. I tipi anonimi di Haxe sono analoghi alle interfacce implicite del linguaggio Go . A differenza delle interfacce Go , è possibile costruire un valore da un tipo anonimo.
class FooBar { public var foo:Int; public var bar:String; public function new(){ foo=1; bar="2";} function anyFooBar(v:{foo:Int,bar:String}) trace(v.foo); static function test(){ var fb = new FooBar(); fb.anyFooBar(fb); fb.anyFooBar({foo:123,bar:"456"}); } }Anche sulla piattaforma Haxe:
Altri linguaggi multipiattaforma: