Haxe

Un article de Wikipédia, l'encyclopédie libre.
(Redirigé depuis HaXe)
Aller à : navigation, rechercher
Haxe
Logo.
Image illustrative de l'article Haxe

Date de première version
Auteur Nicolas Cannasse
Dernière version 3.4.2 ()
Typage Dynamique, statique, nominatif
Influencé par Java, OCaml, ActionScript
Écrit en OCamlVoir et modifier les données sur Wikidata
Système d'exploitation Android, iOS, Windows, GNU/Linux, Mac OS X
Licence GNU GPL et licence MIT
Site web haxe.org
Extensions de fichiers .hx

Haxe est un langage de programmation, multi-paradigme, multiplate-forme, haut niveau et un compilateur pouvant produire des applications et du code source pour de nombreuses plate-formes différentes à partir d'un seul code source[1],[2],[3],[4],[5]. Il s'agit d'un logiciel gratuit et open source distribué sous la licence GPLv2. La bibliothèque standard est disponible sous la licence MIT.

Haxe inclut un ensemble de fonctions communes qui sont supportées sur toutes les plate-formes, tels que les types de données numériques, textuelles, tabulaires et binaires ainsi que certains formats de fichier communs[5],[6]. Haxe inclut aussi des interfaces de programmation (API) spécifique à certaines plate-formes notamment pour Adobe Flash, C++, PHP[2],[7].

Le code écrit dans le langage Haxe peut être compilé source à source vers l'ActionScript3, JavaScript, Java, C++, C#, PHP, Python, Lua[8] et Node.js[9],[2],[6]. Haxe peut aussi produire du small web format (SWF) et du bytecode Neko ou HashLink[10].

Les principaux utilisateurs d'Haxe incluent BBC, Coca-Cola, Disney, Hasbro, Mattel, Nickelodeon, Prezi, TiVo et Zynga[11],[12]. OpenFL (en) et Flambe sont des frameworks Haxe populaire permettant de créer du contenu multiplate-forme à partir d'un seul code source[12],[13].

Architecture[modifier | modifier le code]

Langage unifié[modifier | modifier le code]

L'aspect le plus unique de l'architecture d'Haxe fut la décision du support de Flash, de JavaScript ainsi que des scripts côté serveur avec un langage unifié[14],[15]. Dans des projets de développement web traditionnels, les développeurs utilisent différent langages pour construire une application web intégré[14],[15].

  • PHP ou un autre langage côté serveur pour générer l'HTML
  • JavaScript pour manipuler l'HTML côté client
  • ActionScript pour des sections graphiques construites avec Flash

Haxe a pour origine de supporter tous ses aspects en un seul langage, et de simplifier la logique de communication entre eux[14],[15],[16]. De ce fait, la logique de l'application n'a pas besoin de gérer l'implémentation de communications.

Les buts originaux de Haxe sont[14] :

  • Construire un langage plus puissant qu'ActionScript 2 et 3
  • Être capable de facilement traduire une application d'ActionScript en Haxe
  • Être capable d'utiliser ce langage pour Flash 6, 7, 8, et 9
  • Être capable d'utiliser ce langage pour du JavaScript-Ajax
  • Être capable d'utiliser ce langage pour de la programmation côté serveur à la place de PHP ou Java

Compilateur[modifier | modifier le code]

Le compilateur est divisé en un frontal et en plusieurs backends. Le frontal crée un arbre syntaxique abstrait (AST) à partir du code source et effectue la vérification des types, l’expansion des macros et l'optimisation de l'AST. Les différents backends traduisent l'AST ainsi traité en code source ou bytecode selon leur cible.

Le compilateur est écrit en OCaml. Il peut être utilisé en mode serveur pour fournir la complétion du code pour les environnements de développement (IDE) ainsi que pour maintenir une mémoire cache afin d’accélérer la compilation[17].

Cible[modifier | modifier le code]

En Haxe, les plate-formes supportées sont connus sous le nom de "cibles"[18]. Il s'agit de modules Haxe qui fournissent un accès aux API internes pour les parties backend du compilateur qui sont responsables de la génération du code ou bytecode correspondant.

  • Les cibles bytecode produisent du bytecode exécutable (Neko, SWF, SWF8), pouvant être exécuté par un environnement d'exécution (Neko VM, Adobe Flash Player, Adobe AIR). L'API Haxe et les API spécifique à la plate-forme sont disponibles.
  • Les cibles langages produisent du code source (AS3, C++, C#, Java). La plupart des codes sources doivent être compilés grâce à des compilateurs externes pour produire des fichiers exécutables (Flex SDK, GNU Compiler Collection (GCC), Microsoft Visual C++, Framework .NET, compilateur Java ). Le code JavaScript et PHP peuvent être exécutés directement, puisque leur environnement d'exécution utilisent la compilation à la volée. Le code inline écrit dans le langage cible peut être inséré à tout moment dans l'application, impliquant le support de l'intégralité de l'API de la plate-forme; incluant des fonctionnalités manquantes de l'API Haxe.
  • Les modules externes sont des définitions de type (extern class Haxe) décrivant les types d'une API ou bibliothèque native, de façon à ce que le compilateur Haxe puisse utiliser la vérification de type statique.

Développement[modifier | modifier le code]

Le développement d'Haxe a commencé en 2005[19]. La première version béta fut disponible en . Haxe 1.0 est sortie le avec le support des cibles Adobe Flash, JavaScript et Neko.

Haxe est le successeur du compilateur open-source MTASC (en) aussi créé par Nicolas Cannasse[20], et est disponible sous la licence GNU General Public Licence. La connaissance de l'OCaml n'est pas requise pour développer des applications grâce à Haxe.

Plate-formes supportées[modifier | modifier le code]

La langage Haxe peut être compilé en du bytecode pour différentes machines virtuelles, telles que l'Adobe Flash Player et la NekoVM et générer du code source pour des langages tels que Javascript et Python.

La stratégie de compiler vers de multiples langages de programmation est inspirée du paradigme « écrire une seule fois, exécuter partout ». Cela permet au programmeur de choisir les meilleurs options pour sa tache.

Générateur Sortie Plate-forme Utilisation Depuis
AVM1[21] byte code Adobe Flash Player 6+ Bureau, navigateur 2005 (alpha)
AVM2[21] byte code Adobe Flash Player 9+, Adobe AIR, Tamarin VM Bureau, navigateur, serveur 2005 (alpha)
ActionScript 3[21] source Adobe Flash Player 9+ Serveur, bureau 2007 (1.12)
C++ (hxcpp)[21] source Windows, Linux, macOS Serveur, bureau, CLI 2009 (2.04)
C++[21] source Android, Apple iOS, Palm webOS Mobile 2009 (2.04)
C#[21] source .NET Framework Serveur, bureau, mobile 2012 (2.10)
HashLink[21] source HashLink Serveur, bureau 2016 (3.3)
Java[21] source Java Serveur, bureau 2012 (2.10)
JavaScript[21] source HTML5, NodeJS, PhoneGap Serveur, bureau, navigateur, mobile 2006 (beta)
Neko[21] byte code NekoVM Serveur, bureau, CLI 2005 (alpha)
PHP[21] source PHP Serveur 2008 (2.0)
Python[21] source Python CLI, web, bureau 2014 (3.2)
Lua[21] source Lua CLI, web, bureau, mobile 2016 (3.3)

Langage[modifier | modifier le code]

Haxe est un langage supportant la programmation orientée objet, la programmation générique et diverses constructions de programmation fonctionnelle. Des fonctionnalités telles que les itérations, les exceptions ou encore la réflexion sont des fonctionnalités de bases du langage. Haxe possède un système de types à la fois fort et dynamique. Le compilateur vérifiera implicitement les types et donnera des erreurs de compilations. Cela donne aussi la possibilité aux programmeurs d'ignorer la vérification des types et d'utiliser le typage dynamique de la plate-forme ciblée.

Typage[modifier | modifier le code]

Haxe possède un système de types flexible et sophistiqué. Les types disponibles sont les classes, les interfaces, les fonctions ainsi que des types anonymes, des types algébrique de données (enum) et des types abstraits (abstract). Le polymorphisme paramétrée est possible pour les classes, les fonctions et les types algébriques, permettant ainsi la programmation générique. La variance dans les fonctions polymorphiques est ainsi supportée.

Par défaut, le typage est statique sauf si des annotations de typage dynamique sont présentes, pour être utilisées avec une cible le supportant. La vérification des types utilise le système nominatif des types à l'exception des types anonymes, où le système structurel des types est utilisé. Enfin, l'inférence des types est supportée, permettant de déclarer une variable sans annotation de type.

Classes[modifier | modifier le code]

Les classes (mot-clef class) Haxe sont similaires à celle de Java ou d'ActionScript 3. Leurs champs peuvent être des méthodes, des variables ou des propriétés, chacun soit statique soit propre à chaque instance. Haxe supporte les accesseurs public et private, ainsi que des méthodes plus avancées pour le contrôle d'accès spécifiées par des annotations. Les méthodes et les variables constantes statiques peuvent utiliser l'extension inline grâce au mot-clef inline.

Les interfaces en Haxe sont très similaire à celle, par exemple de 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() - birth.getFullYear();
}

Types énumérés[modifier | modifier le code]

Les types énumérés sont une part importante du langage; ils peuvent être paramétrés et être récursifs. Ils fournissent un support de base pour les types algébrique de données, permettant d'inclure des types produit, similairement à Haskell et ML. Un switch peut appliquer un filtrage par motif aux valeurs énumérées, permettant des solutions élégantes à des problèmes complexes.

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(Color.Rouge);
        var rgbint = versInt(Color.RGB(100, 100, 100));
    }
}

Des exemples de types énumérés paramétrés sont disponibles dans la bibliothèque standard Haxe, tel que les types Option[22] et Either[23].

enum Option<T> {
    Some(v:T);
    None;
}

enum Either<L, R> {
    Left(v:L);
    Right(v:R);
}

Haxe supporte aussi les types algébrique généralisé[24].

Types anonymes[modifier | modifier le code]

Les types anonymes sont définis en indiquant explicitement leur structure. Ils peuvent être utiliser pour implémenter un typage structurel des arguments des fonctions (voir plus bas) et recevoir un alias avec le mot-clef typedef.

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

Types fonctions[modifier | modifier le code]

En Haxe, les fonctions sont des objets de première classe. Leur type est noté en utilisant des flèches entre les types des arguments et entre le(s) type(s) argument et le type de retour, comme présent de nombreux langages de programmation fonctionnelle. Cependant, contrairement à Haskell et aux langages de la famille ML, toutes les fonctions ne sont pas unaires (fonction avec un unique argument). Donc, les signatures des types suivants possèdent des sémantiques différentes que dans les langages précédemment mentionnés. Le type F est une fonction qui prend en argument un entier (Int) et une chaîne de caractère (String) et retourne une valeur de type réel (Float).

La même notation dans un langage avec uniquement des fonctions unaires ferait référence à une fonction prenant en paramètre un Int et retournerait une fonction de type String->Float.

Les types F2 et F3 correspondent au même type. Ce sont des fonctions binaires qui retournent une fonction binaire de type F. Pour F3, la syntaxe pour définir une type fonction dans un type fonction est utilisé.

typedef F = Int->String->Float;

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

Types abstraits[modifier | modifier le code]

Le dernier ajout au système de types d'Haxe est le concept des types abstraits. En Haxe, ils diffèrent des types abstraits conventionnels. Ils servent à rendre implicite les conversions entre différent types, permettant de réutiliser des types existants dans des buts spécifiques, tels que des types pour les unités de mesures. Cela permet de réduire fortement le mélange des valeurs de même types mais avec des sémantiques différentes (par exemple, miles et kilomètre).

L'exemple suivant suppose que le système métrique est le système par défaut, nécessitant une conversion de miles vers kilomètre pour les données existantes du mauvais format. Cet exemple permet donc de convertir automatiquement des miles en kilomètres mais pas l'inverse.

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
  }
}

Comme l'exemple le montre, aucune conversion explicite n'est requise pour effectuer l'assignation km = centMiles.

Typage structurel[modifier | modifier le code]

Dans de nombreux langages de programmation fonctionnelle, le typage structurel joue un rôle important. Haxe l'applique via les types anonymes, n'utilisant le système nominatif de types de la programmation orientée objet que lorsque les types nommés sont utilisés. Les types anonymes d'Haxe sont analogues aux interfaces implicites du langage Go. Contrairement aux interfaces du Go, il est possible de construire une valeur à partir d'un type anonyme.

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

Voir aussi[modifier | modifier le code]

Aussi sur la plate-forme Haxe :

Autres langages multiplate-forme :

Références[modifier | modifier le code]

  1. (en) « Nicolas' annoucement of spelling change on Haxe official mail list », sur groups.google.com, (consulté le 30 mars 2017)
  2. a, b et c Ponticelli, Franco et McColl-Sylvester, Lee, Professional haXe and Neko, Wiley Technology Pub, (ISBN 0470122137, OCLC 896076519, lire en ligne)
  3. Ivanov, Michael., Away3D 3.6 Cookbook., Packt Pub, (ISBN 1849512817, OCLC 797916638, lire en ligne)
  4. (en) Lars Doucet, « Haxe/OpenFL for home game consoles », Gamasutra,‎ (lire en ligne)
  5. a et b David Mouton, « Sortie de Haxe 3.2.0 », LinuxFr,‎ (lire en ligne)
  6. a et b (en) « Introduction to the Haxe Standard Library », sur haxe.org
  7. (en) « Target Specific APIs, Introduction to the Haxe Standard Library », sur haxe.org
  8. (en) Justin Donaldson, « Hello Lua », sur haxe.org,
  9. (en) « hxnodejs », sur lib.haxe.org,
  10. (en) « The New Haxe Target: HashLink In Depth », sur haxe.org,
  11. (en) « Who uses Haxe », sur haxe.org (consulté le 30 mars 2017)
  12. a et b (en) Lars Doucet, « Dear Adbode: Support Haxe, save your Tools », Gamasutra,‎ (lire en ligne)
  13. (en) « All haxelib (by popularity) », sur lib.haxe.org (consulté le 30 mars 2017)
  14. a, b, c et d Arnold, Wade., Balkan, Aral., Cannasse, Nicolas. et Grden, John., The Essential Guide to Open Source Flash Development, Chris Allen, Wade Arnold, Aral Balkan, Nicolas Cannasse, John Grden, Moses Gunesch, Marc Hughes, R. Jon MacDonald, Andy Zupko, (ISBN 1430209941, OCLC 929006012, lire en ligne)
  15. a, b et c (en) Nicolas Canasse, « Haxe interview », Io Programmo,‎ , p. 1-6 (lire en ligne)
  16. Fisher, Matt,, HTML5 for flash developers, Packt Pub, (ISBN 1849693331, OCLC 871666029, lire en ligne)
  17. (en) « Completion server », sur haxe.org (consulté le 30 mars 2017)
  18. « Compilateur Haxe », sur old.haxe.org (consulté le 30 mars 2017)
  19. (en) « Haxe 3.4.2 », sur github.com (consulté le 31 mars 2017)
  20. (en) John Grden, Patrick Mineault, Aral Balkan, Marc Hughes et Wade Arnold, The Essential Guide to Open Source Flash Development, Apress, (ISBN 1430209941, lire en ligne), p. Chapter 9 (Using Haxe)
  21. a, b, c, d, e, f, g, h, i, j, k, l et m (en) « Compiler targets », sur haxe.org (consulté le 31 mars 2017)
  22. (en) « HaxeFoundation/haxe », sur GitHub (consulté le 18 avril 2017)
  23. (en) « HaxeFoundation/haxe », sur GitHub (consulté le 18 avril 2017)
  24. (en) « Language Features », sur haxe.org (consulté le 18 avril 2017)