rilascio del toolkit , che include un linguaggio di programmazione multi-paradigma di alto livello con tipizzazione rigorosa, un cross-compiler e una libreria standard di funzioni. Il progetto supporta la traslitterazione in C++, HashLink/C, JavaScript, C#, Java, PHP, Python e Lua, oltre alla compilazione in bytecode JVM, HashLink/JIT, Flash e Neko, con accesso alle funzionalità native di ciascuna piattaforma target. Il codice del compilatore è rilasciato sotto licenza GPLv2, mentre la libreria standard e la macchina virtuale per Haxe sono in fase di sviluppo sotto licenza MIT.
Il linguaggio è con tipizzazione rigorosa. Supporta paradigmi di programmazione orientata agli oggetti, generica e funzionale.
La sintassi Haxe è simile a ECMAScript e con funzionalità come la tipizzazione statica, l'inferenza dei tipi, il pattern matching, i generics, il ciclo «for» basato su iteratori, le macro AST, i GADT (Generalized Algebraic Data Types), i tipi astratti, le strutture anonime, le definizioni semplificate degli array, le espressioni per la compilazione condizionale, l'assegnazione di metadati a campi, classi ed espressioni, l'interpolazione delle stringhe (‘Il mio nome è $name’), i parametri di tipo («new Main‹String›(‘foo’)») e .
class Test {
static function main() {
var people = [
«Elizabeth» => «Programmazione»,
«Joel» => «Design»
];
for (name in people.keys()) {
var job = people[name];
trace(‘$name lavora come $job!’);
}
}
}
Principali versione 4.0:
- Una nuova sintassi per specificare il tipo delle funzioni «(name:String, age:Int)->Bool» o «(String, Int)->Bool» invece di «String->Int->Bool».
- La sintassi delle funzioni arrow «(a, b) -> a + b» invece di «function(a, b) return a + b».
- Protezione da problemi legati all'uso di valori Null (funzione sperimentale, attivabile se desiderato per determinati campi, classi o pacchetti).
- La parola chiave «final» per i campi delle classi e delle variabili locali, che sono immutabili. «final» può essere utilizzata anche per definire funzioni per vietarne la ridefinizione durante l'ereditarietà e per classi/interfacce che non possono essere ereditate.
- standard Unicode per il tipo base «String» in tutti gli obiettivi di compilazione tranne Neko.
- Un interprete integrato completamente riscritto, ora fornito con il nome . Grazie al nuovo interprete, gli script e le macro vengono eseguiti molto più rapidamente. È supportata la modalità di debug interattivo.
- Nuovo sistema di destinazione per la compilazione (target) — un runtime ad alte prestazioni, progettato specificamente per Haxe, che supporta la compilazione in bytecode per JIT o C, ha una facile integrazione con C e consente l'accesso a tipi numerici a basso livello e puntatori.
- Nuovo sistema di destinazione JVM — consente di generare bytecode jvm saltando la fase di compilazione del codice Java aggiungendo il flag «-D jvm» durante la compilazione in Java.
- Possibilità di espansione inline sul posto per chiamate a funzioni o costruttori, anche se non sono dichiarati come tali.
- Possibilità di attivazione alla dichiarazione del tipo (ad esempio «enum») tramite «@:using(path.ToExtension)».
- I tipi astratti ora supportano la versione «set» dell'operatore «@:op(a.b)» per il sovraccarico delle espressioni «obj.foo = bar».
- La sintassi del ciclo «for» supporta ora l'iterazione «chiave-valore»: «for (key => value in collection) {}».
- Supporto per l'uso di marcature simili a XML nelle espressioni: «var a = ‹hi/›;». Al momento, questa funzionalità è disponibile solo per l'analisi tramite macro ed è in fase di progettazione.
- Sintassi per campi opzionali nella notazione «completa» dei tipi di strutture anonime: «{ var ?f:Int; }» (alternativa alla versione «breve» «{ ?f:Int }»).
- I valori dell'enumerazione possono ora essere valori predefiniti per gli argomenti delle funzioni: «function foo‹T›(option:Option‹T› = None)».
- La sintassi «enum abstract Name(BasicType) {}» non richiede più il prefisso «@:» in «enum».
- Auto-numerazione per enumerazioni astratte:
enum abstract Foo(Int) {
var A; // 0
var B; // 1
}
enum abstract Bar(String) {
var A; // «A»
var B; // «B»
} - La parola chiave «extern» non richiede più l'uso del prefisso «@:».
- Rimossa la possibilità «implements Dynamic» per accedere ai campi della classe tramite le stringhe. Disponibile per le classi extern o tramite implementazione di un tipo astratto.
- Aggiunta la sintassi «A & B» per l'intersezione dei tipi, attualmente applicata solo a strutture anonime e limitazioni dei parametri di tipo. La vecchia sintassi delle limitazioni è stata rimossa.
- La creazione di istanze vuote di «Map» è ora disponibile tramite la sintassi «var map:Map‹Int, String› = [];» analogamente a un array.
- Aggiunta la struttura dati «haxe.ds.ReadOnlyArray».
- I metadati possono ora avere spazi dei nomi («@:prefix.name function() {…}»). Analogamente alle definizioni: «#if (some.flag … #end».
- Nuovo protocollo dei servizi per IDE, utilizzati in .
- Aggiornate le definizioni esterne (extern) per le API Web e aggiunti quelli mancanti.
Fonte: opennet.ru
