Haxe

Haxe
Logo.
Date de première version 16 mai 2006
Auteur Nicolas Cannasse
Dernière version 4.3.4 (4 mars 2024)
Typage Dynamique, statique, nominatif
Influencé par Java, OCaml, ActionScript
Écrit en OCaml
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 le nom d'un langage de programmation, multi-paradigme, multiplate-forme, haut niveau et celui d'un compilateur utilisé pour produire des applications pour de nombreuses plates-formes différentes à partir d'un seul code source,,,,. C'est aussi le nom 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 plates-formes, tels que les types de données numériques, textuelles, tabulaires et binaires ainsi que certains formats de fichier communs,. Haxe inclut aussi des interfaces de programmation (API) spécifiques à certaines plates-formes notamment pour Adobe Flash, C++, PHP,.

Le code écrit dans le langage Haxe serait compilable "source à source" vers un script écrit en ActionScript3, JavaScript, Java, C++, C#, PHP, Python, Lua ou Node.js,,. On pourrait aussi utiliser Haxe pour produire ce qu'on appellerait du "small web format" (SWF) ou du "bytecode Neko" ou du "HashLink".

Les principaux utilisateurs d'Haxe incluent des développeurs chez les sociétés BBC, Coca-Cola, Disney, Hasbro, Mattel, Nickelodeon, Prezi, TiVo et Zynga,. OpenFL (en) et Flambe sont des frameworks Haxe populaires permettant de créer du contenu multiplate-forme à partir d'un seul code source,.

Architecture

Langage unifié

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é,. Dans des projets de développement web traditionnels, les développeurs utilisent différents langages pour construire une application web intégrée,.

Haxe a pour origine de supporter tous ses aspects en un seul langage, et de simplifier la logique de communication entre eux,,. 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 :

Compilateur

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.

Cible

En Haxe, les plates-formes supportées sont connus sous le nom de "cibles". 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.

Développement

Le développement d'Haxe a commencé en 2005. La première version béta fut disponible en février 2006. Haxe 1.0 est sortie le 17 mai 2006 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, 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.

Plates-formes supportées

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 byte code Adobe Flash Player 6+ Bureau, navigateur 2005 (alpha)
AVM2 byte code Adobe Flash Player 9+, Adobe AIR, Tamarin VM Bureau, navigateur, serveur 2005 (alpha)
ActionScript 3 source Adobe Flash Player 9+ Serveur, bureau 2007 (1.12)
C++ (hxcpp) source Windows, Linux, macOS Serveur, bureau, CLI 2009 (2.04)
C++ source Android, Apple iOS, Palm webOS Mobile 2009 (2.04)
C# source .NET Framework Serveur, bureau, mobile 2012 (2.10)
HashLink source HashLink Serveur, bureau 2016 (3.3)
Java source Java Serveur, bureau 2012 (2.10)
JavaScript source HTML5, NodeJS, PhoneGap Serveur, bureau, navigateur, mobile 2006 (beta)
Neko byte code NekoVM Serveur, bureau, CLI 2005 (alpha)
PHP source PHP Serveur 2008 (2.0)
Python source Python CLI, web, bureau 2014 (3.2)
Lua source Lua CLI, web, bureau, mobile 2016 (3.3)

Langage

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

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

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 similaires à celles, 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() - dateDeNaissance.getFullYear(); }

Types énumérés

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(Couleur.Rouge); var rgbint = versInt(Couleur.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 et Either.

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é.

Types anonymes

Les types anonymes sont définis en indiquant explicitement leur structure. Ils peuvent être utilisés 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

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ères (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

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 implicites 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 mesure. Cela permet de réduire fortement le mélange des valeurs de même type mais avec des sémantiques différentes (par exemple, miles et kilomètres).

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ètres 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

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

Aussi sur la plate-forme Haxe :

Autres langages multiplate-forme :

Références

  1. « Release 4.3.4 », 4 mars 2024 (consulté le 16 mars 2024)
  2. (en) « Nicolas' annoucement of spelling change on Haxe official mail list », sur groups.google.com, 18 avril 2012 (consulté le 30 mars 2017)
  3. Ponticelli, Franco et McColl-Sylvester, Lee, Professional haXe and Neko, Wiley Technology Pub, 1er janvier 2008, 619 p. (ISBN 978-0-470-12213-6 et 0-470-12213-7, OCLC 896076519, lire en ligne)
  4. Ivanov, Michael., Away3D 3.6 Cookbook., Packt Pub, 1er janvier 2011, 480 p. (ISBN 978-1-84951-281-7 et 1-84951-281-7, OCLC 797916638, lire en ligne)
  5. (en) Lars Doucet, « Haxe/OpenFL for home game consoles », Gamasutra,‎ 3 juin 2015 (lire en ligne)
  6. David Mouton, « Sortie de Haxe 3.2.0 », LinuxFr,‎ 17 juin 15 (lire en ligne)
  7. (en) « Introduction to the Haxe Standard Library », sur haxe.org
  8. (en) « Target Specific APIs, Introduction to the Haxe Standard Library », sur haxe.org
  9. (en) Justin Donaldson, « Hello Lua », sur haxe.org, 28 avril 2016
  10. (en) « hxnodejs », sur lib.haxe.org, 9 novembre 2015
  11. (en) « The New Haxe Target: HashLink In Depth », sur haxe.org, 22 novembre 2016
  12. (en) « Who uses Haxe », sur haxe.org (consulté le 30 mars 2017)
  13. (en) Lars Doucet, « Dear Adbode: Support Haxe, save your Tools », Gamasutra,‎ 24 juin 2017 (lire en ligne)
  14. (en) « All haxelib (by popularity) », sur lib.haxe.org (consulté le 30 mars 2017)
  15. 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, 1er janvier 2008, 350 p. (ISBN 978-1-4302-0994-2 et 1-4302-0994-1, OCLC 929006012, lire en ligne)
  16. (en) Nicolas Canasse, « Haxe interview », Io Programmo,‎ 1er avril 2009, p. 1-6 (lire en ligne)
  17. Fisher, Matt,, HTML5 for flash developers, Packt Pub, 1er janvier 2013, 322 p. (ISBN 978-1-84969-333-2 et 1-84969-333-1, OCLC 871666029, lire en ligne)
  18. (en) « Completion server », sur haxe.org (consulté le 30 mars 2017)
  19. « Compilateur Haxe », sur old.haxe.org (consulté le 30 mars 2017)
  20. (en) « Haxe 3.4.2 », sur github.com (consulté le 31 mars 2017)
  21. (en) John Grden, Patrick Mineault, Aral Balkan, Marc Hughes et Wade Arnold, The Essential Guide to Open Source Flash Development, Apress, 16 juillet 2008, 350 p. (ISBN 978-1-4302-0994-2 et 1-4302-0994-1, lire en ligne), Chapter 9 (Using Haxe)
  22. (en) « Compiler targets », sur haxe.org (consulté le 31 mars 2017)
  23. (en) « HaxeFoundation/haxe », sur GitHub (consulté le 18 avril 2017)
  24. (en) « HaxeFoundation/haxe », sur GitHub (consulté le 18 avril 2017)
  25. (en) « Language Features », sur haxe.org (consulté le 18 avril 2017)