# Haxe

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$^,$.
* 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$^,$$^,$. 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 :
* 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

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.
* 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 que le compilateur Haxe puisse utiliser la vérification de type statique.

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

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

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

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