« Haxe » : différence entre les versions

Un article de Wikipédia, l'encyclopédie libre.
Contenu supprimé Contenu ajouté
Zsxolb (discuter | contributions)
Ajout de la cible HashLink
Elnabo (discuter | contributions)
Mise à jour du contenu, en s'inspirant de la version anglaise
Ligne 1 : Ligne 1 :
{{Ébauche|informatique}}
{{à sourcer|date=juin 2012}}

{{Infobox Langage de programmation
{{Infobox Langage de programmation
| nom = Haxe
| couleur boîte =
| logo = Haxe logo.svg
| nom = Haxe
| logo = Haxe_logo.svg
| date de première version = 2005
| site web = [http://haxe.org/ Site officiel]
| image =
| auteur = [[Nicolas Cannasse]]
| légende =
| influencé par = [[Java (langage)|Java]], [[ActionScript]]
| paradigme =
| auteur = Nicolas Cannasse
| développeur =
| date de première version = {{Date|16|mai|2006|en informatique}}
| dernière version = 3.4.2
| date de dernière version = {{Date|20|mars|2017|en informatique}}
| version avancée =
| date de version avancée =
| typage = [[Typage dynamique|Dynamique]], [[Typage statique|statique]], [[Typage nominatif|nominatif]]
| implémentations =
| normes =
| dialectes =
| influencé par = [[Java (langage)|Java]], [[OCaml]], [[ActionScript]]
| a influencé =
| système d'exploitation = [[Android]], [[Apple_iOS|iOS]], [[Microsoft Windows|Windows]], [[GNU]]/[[Linux]], [[Mac OS X]]
| licence = [[Licence publique générale GNU|GNU GPL]] et [[licence MIT]]
| site web = [http://haxe.org/ haxe.org]
| extensions = .hx
}}
}}
'''Haxe''' est un [[langage de programmation]], [[Paradigme (programmation)|multi-paradigme]], [[Multiplate-Forme|multiplate-forme]], haut niveau et un compilateur pouvant produire des applications et du code source pour de nombreuses [[Plate-forme (informatique)|plate-formes]] différentes à partir d'un seul code source<ref>{{Lien web|langue=Anglais|titre=Nicolas' annoucement of spelling change on Haxe official mail list|url=https://groups.google.com/d/topic/haxelang/O7PB-ZrX4i4/discussion|site=groups.google.com|date=18/04/2012|consulté le=30/03/2017}}</ref>{{,}}<ref name=":0">{{Ouvrage|prénom1=Ponticelli,|nom1=Franco|prénom2=McColl-Sylvester,|nom2=Lee|titre=Professional haXe and Neko|éditeur=Wiley Technology Pub|date=2008-01-01|isbn=0470122137|oclc=896076519|lire en ligne=https://www.worldcat.org/oclc/896076519}}</ref>{{,}}<ref>{{Ouvrage|prénom1=Ivanov,|nom1=Michael.|titre=Away3D 3.6 Cookbook.|éditeur=Packt Pub|date=2011-01-01|isbn=1849512817|oclc=797916638|lire en ligne=https://www.worldcat.org/oclc/797916638}}</ref>{{,}}<ref>{{Article|langue=Anglais|auteur1=Lars Doucet|titre=Haxe/OpenFL for home game consoles|périodique=Gamasutra|date=03 06 2015|issn=|lire en ligne=http://gamasutra.com/blogs/LarsDoucet/20150603/245099/HaxeOpenFL_for_home_game_consoles.php|pages=}}</ref>{{,}}<ref name=":1">{{Article|langue=francais|auteur1=David Mouton|titre=Sortie de Haxe 3.2.0|périodique=LinuxFr|date=17/06/15|issn=|lire en ligne=http://linuxfr.org/news/sortie-de-haxe-3-2-0|pages=}}</ref>. 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 [[Multiplate-Forme|sur toutes les plate-formes]], tels que les [[Entier (informatique)|types de données numériques]], [[Chaîne de caractères|textuelles]], [[Tableau (informatique)|tabulaires]] et [[Fichier binaire|binaires]] ainsi que certains [[formats de fichier]] communs<ref name=":1" />{{,}}<ref name=":2">{{Lien web|langue=Anglais|titre=Introduction to the Haxe Standard Library|url=http://haxe.org/documentation/introduction/stdlib-introduction.html#general-purpose-api|site=haxe.org|date=|consulté le=}}</ref>. Haxe inclut aussi des [[Interface de programmation|interfaces de programmation]] (API) spécifique à certaines plate-formes notamment pour [[Adobe Flash]], [[C++]], [[PHP]]<ref name=":0" />{{,}}<ref>{{Lien web|langue=Anglais|titre=Target Specific APIs, Introduction to the Haxe Standard Library|url=http://haxe.org/documentation/introduction/stdlib-introduction.html#target-apis|site=haxe.org|date=|consulté le=}}</ref>.
'''Haxe''' est un [[langage de programmation]] et un [[compilateur]] [[open source]] [[multiplate-forme|multiplateforme]] qui permet de produire des applications et du code source pour de nombreuses plateformes différentes à partir d'un seul code source. Développé par Nicolas Cannasse et d'autres contributeurs, Haxe permet d’écrire la partie serveur et la partie client dans un même langage.


Le code écrit dans le langage Haxe peut être [[Compilateur source à source|compilé source à source]] vers l'[[ActionScript|ActionScript3]], [[JavaScript]], [[Java (langage)|Java]], [[C++]], [[C sharp|C#]], [[PHP]], [[Python (langage)|Python]], [[Lua]]<ref>{{Lien web|langue=Anglais|auteur1=Justin Donaldson|titre=Hello Lua|url=http://haxe.org/blog/hello-lua/|site=haxe.org|date=28/04/2016|consulté le=}}</ref> et [[Node.js]]<ref>{{Lien web|langue=Anglais|titre=hxnodejs|url=http://lib.haxe.org/p/hxnodejs|site=lib.haxe.org|date=09 11 2015|consulté le=}}</ref>{{,}}<ref name=":0" />{{,}}<ref name=":2" />. Haxe peut aussi produire du ''small web format'' ([[Small Web Format|SWF]]) et du [[bytecode]] [[Neko (langage)|Neko]] ou [[HashLink]]<ref>{{Lien web|langue=Anglais|titre=The New Haxe Target: HashLink In Depth|url=https://haxe.org/blog/hashlink-indepth/|site=haxe.org|date=22 11 2016|consulté le=}}</ref>.
À cette fin, Haxe permet de :
* créer des fichiers [[Adobe Flash|SWF]] qui utilisent les [[Interface de programmation|APIs]] pour les lecteurs [[Adobe Flash Player|Flash Player]] 6 à 14 ;
* créer du code [[JavaScript]] utilisant les API DHTML des navigateurs, ainsi que des applications AJAX. Il est aussi possible d'utiliser des bibliothèques extérieures, tels que jQuery qui est directement inclus au téléchargement de Haxe ;
* créer du [[bytecode]] pour la [[Neko (langage)|NekoVM]] qui peut être employé côté serveur (grâce à un plug-in [[Apache HTTP Server|Apache]]) ou empaqueté dans un exécutable autonome ;
* créer du code [[PHP]] qui peut être déployé sur n’importe quel serveur supportant le langage PHP ;
* créer du code et des applications [[C++]] ;
* créer du code et des applications [[Java (langage)|Java]] ;
* créer du code [[C sharp|C#]] ;
* créer du code [[Python (langage)|Python]].


Les principaux utilisateurs d'Haxe incluent [[British Broadcasting Corporation|BBC]], [[The Coca-Cola Company|Coca-Cola]], [[The Walt Disney Company|Disney]], [[Hasbro|Hashbro]], [[Mattel]], [[Nickelodeon (chaîne de télévision)|Nickelodeon]], [[Prezi]], [[TiVo]] et [[Zynga]]<ref>{{Lien web|langue=Anglais|titre=Who uses Haxe|url=http://haxe.org/use-cases/who-uses-haxe.html|site=haxe.org|date=|consulté le=30 03 2017}}</ref>{{,}}<ref name=":3">{{Article|langue=anglais|auteur1=Lars Doucet|titre=Dear Adbode: Support Haxe, save your Tools|périodique=Gamasutra|date=24 06 2017|issn=|lire en ligne=http://www.gamasutra.com/blogs/LarsDoucet/20140624/219674/Dear_Adobe_Support_Haxe_save_your_Tools.php|pages=}}</ref>. {{Lien|langue=en|trad=OpenFL|fr=OpenFL}} et [https://github.com/aduros/flambe Flambe] sont des [[Framework (logiciel)|frameworks]] Haxe populaire permettant de créer du contenu [[Logiciel multiplate-forme|multiplate-forme]] à partir d'un seul code source<ref name=":3" />{{,}}<ref>{{Lien web|langue=Anglais|titre=All haxelib (by popularity)|url=https://lib.haxe.org/all/|site=lib.haxe.org|date=|consulté le=30 03 2017}}</ref>.
Haxe permet donc d'assurer l’interopérabilité entre ces différentes plateformes en fournissant des bibliothèques communes.


== Compilateur ==
== Architecture ==
=== Langage unifié ===
Le compilateur est écrit en [[OCaml]]. Il peut s'exécuter en mode serveur pour fournir la complétion de code sur les [[Environnement de développement intégré|IDE]] et maintenir un cache pour accélérer la compilation.
L'aspect le plus unique de l'architecture d'Haxe fut la décision du support de [[Adobe Flash|Flash]], de [[JavaScript]] ainsi que des [[Langage de script|scripts]] côté serveur avec un langage unifié<ref name=":4">{{Ouvrage|prénom1=Arnold,|nom1=Wade.|prénom2=Balkan,|nom2=Aral.|prénom3=Cannasse,|nom3=Nicolas.|prénom4=Grden,|nom4=John.|titre=The Essential Guide to Open Source Flash Development|éditeur=Chris Allen, Wade Arnold, Aral Balkan, Nicolas Cannasse, John Grden, Moses Gunesch, Marc Hughes, R. Jon MacDonald, Andy Zupko|date=2008-01-01|isbn=1430209941|oclc=929006012|lire en ligne=https://www.worldcat.org/oclc/929006012}}</ref>{{,}}<ref name=":5">{{Article|langue=Anglais|auteur1=Nicolas Canasse|titre=Haxe interview|périodique=Io Programmo|date=01 04 2009|issn=|lire en ligne=http://ncannasse.fr/blog/haxe_interview|pages=1-6}}</ref>. Dans des projets de développement web traditionnels, les développeurs utilisent différent langages pour construire une application web intégré<ref name=":4" />{{,}}<ref name=":5" />.
* [[PHP]] ou un autre langage côté serveur pour générer l'[[Hypertext Markup Language|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<ref name=":4" />{{,}}<ref name=":5" />{{,}}<ref>{{Ouvrage|prénom1=Fisher,|nom1=Matt,|titre=HTML5 for flash developers|éditeur=Packt Pub|date=2013-01-01|isbn=1849693331|oclc=871666029|lire en ligne=https://www.worldcat.org/oclc/871666029}}</ref>. 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<ref name=":4" /> :
Le compilateur Haxe effectue une optimisation du code. En voici quelques-unes :
* Construire un langage plus puissant qu'[[ActionScript]] 2 et 3
* Fonction « inline » ;
* Être capable de facilement traduire une application d'[[ActionScript]] en Haxe
* Élimination du [[Réusinage de code#Suppression du code mort|code mort]].
* Être capable d'utiliser ce langage pour [[Adobe Flash|Flash]] 6, 7, 8, et 9
Les performances d'une application développée en Haxe dépendent de la plateforme cible.
* Être capable d'utiliser ce langage pour du [[JavaScript]]-[[Ajax (informatique)|Ajax]]
* Être capable d'utiliser ce langage pour de la programmation côté serveur à la place de [[PHP]] ou [[Java (langage)|Java]]


== Exemple de code ==
=== Compilateur ===
Le compilateur est divisé en un [[Frontal (compilateur)|frontal]] et en plusieurs [[Backend|backends]]. Le frontal crée un [[arbre syntaxique abstrait]] (AST) à partir du code source et effectue la vérification des types, l’[[Macro-définition|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.
<syntaxhighlight lang="haxe">
class Test {
static function main() {
var people = [
"Elizabeth" => "Programming",
"Joel" => "Design"
];


Le compilateur est écrit en [[OCaml]]. Il peut être utilisé en mode serveur pour fournir la complétion du code pour les [[Environnement de développement|environnements de développement]] (IDE) ainsi que pour maintenir une [[mémoire cache]] afin d’accélérer la compilation<ref>{{Lien web|langue=Anglais|titre=Completion server|url=https://haxe.org/manual/cr-completion-server.html|site=haxe.org|date=|consulté le=30 03 2017}}</ref>.
for (name in people.keys()) {
var job = people[name];
trace('$name does $job for a living!');
}
}
}
</syntaxhighlight>


=== Cible ===
== Support des plateformes<ref>{{Lien web|titre=Compiler Targets - Haxe - The Cross-platform Toolkit|url=http://haxe.org/documentation/introduction/compiler-targets.html|site=Haxe - The Cross-platform Toolkit|consulté le=2016-03-12}}</ref> ==
En Haxe, les plate-formes supportées sont connus sous le nom de "cibles"<ref>{{Lien web|langue=francais|titre=Compilateur Haxe|url=http://old.haxe.org/doc/compiler?lang=fr|site=old.haxe.org|date=|consulté le=30 03 2017}}</ref>. 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 compiler grâce à des compilateurs externes pour produire des fichiers exécutables ([[Adobe Flex|Flex SDK]], [[GNU Compiler Collection]] (GCC), [[Microsoft Visual C++]], [[Framework .NET]], [[compilateur Java]] ). Le code JavaScript et PHP peuvent être exécuter directement, puisque leur environnement d'exécution utilisent la [[compilation à la volée]]. Le code [[Extension inline|inline]] écrit dans le langage cible peut être insérer à 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 (<code>extern class</code> 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 ===
Le développement d'Haxe a commencé en 2005<ref>{{Lien web|langue=anglais|titre=Haxe 3.4.2|url=https://github.com/HaxeFoundation/haxe/blob/3.4.2/extra/CHANGES.txt|site=github.com|date=|consulté le=31 mars 2017}}</ref>. La première [[version béta]] fut disponible en {{Date||février|2006}}. Haxe 1.0 est sortie le {{Date|17|mai|2006}} avec le support des cibles [[Adobe Flash]], [[JavaScript]] et [[Neko (langage)|Neko]].

Haxe est le successeur du compilateur [[Open source|open-source]] {{Lien|langue=en|trad=MTASC|fr=MTASC}} aussi créé par Nicolas Cannasse<ref name="b1">{{cite book|first1=John|last1=Grden|first2=Patrick|last2=Mineault|first3=Aral|last3=Balkan|first4=Marc|last4=Hughes|first5=Wade|last5=Arnold|date=2008-07-16|title=The Essential Guide to Open Source Flash Development|url=https://books.google.com/books?id=MNo27PxpM_AC&pg=PA231&dq=haxe+flash&hl=en&sa=X#v=onepage&q=haxe%20flash&f=false|location=|publisher=Apress|isbn=1430209941|access-date=|page=Chapter 9 (Using Haxe)}}</ref>, et est disponible sous la licence [[Licence publique générale GNU|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 ==
La langage Haxe peut être compilé en du bytecode pour différentes [[Machine virtuelle|machines virtuelles]], telles que l'[[Adobe Flash Player]] et la NekoVM et généré du code source pour des langages tels que [[JavaScript|Javascript]] et [[Python (langage)|Python]].

La stratégie de compiler vers de multiples langages de programmation est inspirée du paradigme {{Citation|écrire une seule fois, exécuter partout}}. Cela permet au programmeur de choisir les meilleurs options pour sa tache.
{| class="wikitable sortable"
{| class="wikitable sortable"
! scope="col" |Générateur
!
!Sortie
! scope="col" |Sortie
! scope="col" |Plate-forme
!Plateforme
!Utilisation
! scope="col" |Utilisation
!Depuis
! scope="col" |Depuis
|-
|-
! scope="row" |AVM1<ref name=":6">{{Lien web|langue=anglais|titre=Compiler targets|url=http://haxe.org/documentation/introduction/compiler-targets.html|site=haxe.org|date=|consulté le=31 03 2017}}</ref>
|[[Adobe Flash Player|Flash]]
|byte code
|bytecode
|Adobe Flash Player 9+, [[Adobe Air]], [[Tamarin VM]]
|[[Adobe Flash Player]] 6+
|Bureau, navigateur, serveur
|Bureau, navigateur
|2005 (alpha)
|2005 (alpha)
|-
|-
! scope="row" |AVM2<ref name=":6" />
|[[Neko (langage)|Neko]]
|byte code
|bytecode
|[[Adobe Flash Player]] 9+, [[Adobe AIR]], [[Tamarin (machine virtuelle)|Tamarin VM]]
|NekoVM
|Bureau, navigateur, serveur
|Serveur, bureau, CLI
|2005 (alpha)
|2005 (alpha)
|-
|-
! scope="row" |[[ActionScript|ActionScript 3]]<ref name=":6" />
|[[JavaScript]]
|code source
|source
|[[HTML 5]], [[Node.js|NodeJS]], [[PhoneGap]]
|Serveur, bureau, navigateur, mobile
|2006 (beta)
|-
|[[ActionScript|ActionScript 3]]
|code source
|Adobe Flash Player 9+
|Adobe Flash Player 9+
|Serveur, bureau
|Bureau, navigateur
|2007 (1.12)
|2007 (1.12)
|-
|-
! scope="row" |[[C++]] (hxcpp)<ref name=":6" />
|[[PHP (langage)|PHP]]
|code source
|source
|[[Windows]], [[Linux]], [[macOS]]
|PHP
|Serveur
|Serveur, bureau, CLI
|2008 (2.0)
|2009 (2.04)
|-
|-
|[[C++]]
! scope="row" |[[C++]]<ref name=":6" />
|code source
|source
|[[Android]], [[Apple iOS]], [[Palm webOS]]
|[[Android]], Apple [[Apple iOS|iOS]], Palm [[webOS]]
|Mobile
|Mobile
|2009 (2.04)
|2009 (2.04)
|-
|-
! scope="row" |[[C sharp|C#]]<ref name=":6" />
|[[Java (langage)|Java]]
|code source
|source
|[[Framework .NET|.NET Framework]]
|Serveur, bureau, mobile
|2012 (2.10)
|-
! scope="row" |[[HashLink|HashLink]]<ref name=":6" />
|source
|HashLink
|Serveur, bureau
|2016 (3.3)
|-
! scope="row" |[[Java (langage)|Java]]<ref name=":6" />
|source
|Java
|Java
|Serveur, bureau
|Serveur, bureau
|2012 (2.10)
|2012 (2.10)
|-
|-
! scope="row" |[[JavaScript]]<ref name=":6" />
|[[C sharp|C#]]
|code source
|source
|[[HTML5]], [[Node.js|NodeJS]], [[Phonegap|PhoneGap]]
|[[Framework .NET]]
|Serveur, bureau, navigateur, mobile
|Bureau, mobile, serveur
|2012 (2.10)
|2006 (beta)
|-
|-
|[[Python (langage)|Python]]
! scope="row" |[[Neko (langage)|Neko]]<ref name=":6" />
|byte code
|code source
|NekoVM
|Serveur, bureau, CLI
|2005 (alpha)
|-
! scope="row" |[[PHP]]<ref name=":6" />
|source
|PHP
|Serveur
|2008 (2.0)
|-
! scope="row" |[[Python (langage)|Python]]<ref name=":6" />
|source
|Python
|Python
|Bureau, web, CLI
|CLI, web, bureau
|2015 (3.2)
|2014 (3.2)
|-
|-
! scope="row" |[[Lua]]<ref name=":6" />
|[[Lua]]<ref>{{Lien web|titre=Hello Lua! - Haxe - The Cross-platform Toolkit|url=http://haxe.org/blog/hello-lua|site=Haxe - The Cross-platform Toolkit|consulté le=2016-04-28}}</ref>
|code source
|source
|Lua
|Lua
|Jeux, CLI, web, bureau
|CLI, web, bureau, mobile
|2016 (3.3)
|2016 (3.3)
|-
|-
|[[HashLink]]<ref>{{Article|titre=Haxe 3.3.0-rc.1 - Haxe - The Cross-platform Toolkit|périodique=Haxe - The Cross-platform Toolkit|lire en ligne=http://haxe.org/download/version/3.3.0-rc.1/|consulté le=2017-01-01}}</ref>
|code source
|HashLink
|Jeux, serveur
|2016 (3.3)
|}
|}


== Voir aussi ==
== 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ération|itérations]], les [[Exception (informatique)|exceptions]] ou encore la [[Réflexion (informatique)|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 [[Inférence de types|implicitement]] les types et donnera des erreurs de compilations. Cela donne aussi la possible aux programmeurs d'ignorer la vérification des types et d'utiliser le typage dynamique de la plate-forme ciblée.


=== Liens internes ===
=== Typage ===
Haxe possède un [[système de types]] flexible et sophistiqué. Les types disponibles sont les [[Classe (informatique)|classes]], les interfaces, les fonctions ainsi que des types anonymes, des [[Type algébrique de données|types algébrique de données]] (<code>enum</code>) et des types abstraits (<code>abstract</code>). Le [[Polymorphisme paramétré|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 [[Polymorphisme (informatique)|fonctions polymorphiques]] est ainsi supportée.
* [[Neko (langage)]]


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 de types|système nominatif des types]] à l'exception des types anonymes, où le [[Système structurel de types|système structurel des types]] est utilisé. Enfin, l'[[Inférence de types|inférence des types]] est supportée, permettant de déclarer une variable sans annotation de type.
=== Bibliographie ===

* {{Ouvrage
=== Classes ===
| langue = en
Les classes (mot-clef <code>class</code>) Haxe sont similaires à celle de [[Java (langage)|Java]] ou d'[[ActionScript|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 <code>public</code> et <code>private</code>, 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 <code>inline</code>.
| prénom1 = Franco

| nom1 = Ponticelli
Les interfaces en Haxe sont très similaire à celle, par exemple de Java.<syntaxhighlight lang="haxe">
| prénom2 = Lee
interface ICreature {
| nom2 = McColl Sylvester
public var dateDeNaissance:Date;
| titre = Professional Haxe and Neko Book
public var nom:String;
| éditeur = Wrox

| mois = février
public function age():Int;
| année = 2008
}
| pages = 619

| isbn = 978-0-470-12213-6
class Mouche implements ICreature {
}}
public var dateDeNaissance:Date;
* {{Ouvrage
public var nom:String;
| langue = en

| prénom1 = Benjamin
public function age():Int return Date.now().getFullYear() - birth.getFullYear();
| nom1 = Danois
}
| titre = haXe 2 Beginner's Guide
</syntaxhighlight>
| éditeur = PacktPublishing

| mois = juillet
=== Types énumérés ===
| année = 2011
Les [[Type énuméré|types énumérés]] sont une part importante du langage; ils peuvent être [[Polymorphisme (informatique)|paramétrés]] et être récursifs. Ils fournissent un support de base pour les [[Type algébrique de données|types algébrique de données]], permettant d'inclure des [[Type produit|types produit]], similairement à [[Haskell]] et [[ML (langage)|ML]]. Un <code>switch</code> peut appliquer un [[filtrage par motif]] aux valeurs énumérées, permettant des solutions élégantes à des problèmes complexes.<syntaxhighlight lang="haxe">
| pages = 246
enum Couleur {
| isbn = 978-1-849512-56-5
Rouge;
}}
Vert;
=== Liens externes ===
Bleu;
* {{en}} [http://www.haxe.org/ Haxe]
RGB( r : Int, g : Int, b : Int );
* {{en}} [http://www.openfl.org OpenFL], outil open source basé sur le langage Haxe
}

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));
}
}</syntaxhighlight>Des exemples de types énumérés paramétrés sont disponibles dans la [[bibliothèque standard]] Haxe, tel que les types Option<ref>{{Lien web|langue=en|titre=HaxeFoundation/haxe|url=https://github.com/HaxeFoundation/haxe/blob/development/std/haxe/ds/Option.hx|site=GitHub|consulté le=2017-04-18}}</ref> et Either<ref>{{Lien web|langue=en|titre=HaxeFoundation/haxe|url=https://github.com/HaxeFoundation/haxe/blob/development/std/haxe/ds/Either.hx|site=GitHub|consulté le=2017-04-18}}</ref>.<syntaxhighlight lang="haxe">
enum Option<T> {
Some(v:T);
None;
}

enum Either<L, R> {
Left(v:L);
Right(v:R);
}
</syntaxhighlight>Haxe supporte aussi les [[Type algébrique généralisé|types algébrique généralisé]]<ref>{{Lien web|langue=anglais|titre=Language Features|url=http://haxe.org/documentation/introduction/language-features.html|site=haxe.org|date=|consulté le=18 avril 2017}}</ref>.

=== Types anonymes ===
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 <code>typedef</code>.<syntaxhighlight lang="haxe">
typedef AliasForAnon = { a:Int, b:String, c:Float->Void };
</syntaxhighlight>

=== Types fonctions ===
En Haxe, les fonctions sont des [[Objet de première classe|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 [[Programmation fonctionnelle|langages de programmation fonctionnelle]]. Cependant, contrairement à [[Haskell]] et aux langages de la famille [[ML (langage)|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 <code>F</code> est une fonction qui prend en argument un entier (<code>Int</code>) et une chaîne de caractère (<code>String</code>) et retourne une valeur de type réel (<code>Float</code>).

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

Les types <code>F2</code> et <code>F3</code> correspondent au même type. Ce sont des fonctions binaires qui retournent une fonction binaire de type <code>F</code>. Pour <code>F3</code>, la syntaxe pour définir une type fonction dans un type fonction est utilisé.<syntaxhighlight lang="haxe">
typedef F = Int->String->Float;

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

=== Types abstraits ===
Le dernier ajout au système de types d'Haxe est le concept des ''types abstraits''. En Haxe, ils diffèrent des [[Classe abstraite|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.<syntaxhighlight lang="haxe">
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
}
}
</syntaxhighlight>Comme l'exemple le montre, aucune conversion explicite n'est requise pour effectuer l'assignation <code>km = centMiles</code>.

=== 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 (langage)|Go]]. Contrairement aux interfaces du [[Go (langage)|Go]], il est possible de construire une valeur à partir d'un type anonyme.<syntaxhighlight lang="haxe">

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

== Voir aussi ==
Aussi sur la plate-forme Haxe :
* [[Neko (langage)|Neko]]
* {{Lien|langue=en|trad=OpenFL|fr=OpenFL}}
* {{Lien|langue=en|trad=Comparison of IDE choices for Haxe programmers|fr=Comparaison des environnements de développements Haxe}}
Autres langages multiplate-forme :
* [[Emscripten]]
* {{Lien|langue=en|trad=Monkey (programming language)|fr=Monkey (langage)}}
* [[Vala (langage)|Vala]]


=== Références ===
== Références ==
<references />
<references />



Version du 14 mai 2017 à 15:23

Haxe
Logo.

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[2],[3],[4],[5],[6]. 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[6],[7]. Haxe inclut aussi des interfaces de programmation (API) spécifique à certaines plate-formes notamment pour Adobe Flash, C++, PHP[3],[8].

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

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

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

  • 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[15],[16],[17]. 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[15] :

  • 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[18].

Cible

En Haxe, les plate-formes supportées sont connus sous le nom de "cibles"[19]. 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 compiler 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écuter directement, puisque leur environnement d'exécution utilisent la compilation à la volée. Le code inline écrit dans le langage cible peut être insérer à 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

Le développement d'Haxe a commencé en 2005[20]. 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[21], 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

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

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[23] et Either[24].

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é[25].

Types anonymes

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

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

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

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 », (consulté le )
  2. (en) « Nicolas' annoucement of spelling change on Haxe official mail list », sur groups.google.com, (consulté le )
  3. a b et c Ponticelli, Franco et McColl-Sylvester, Lee, Professional haXe and Neko, Wiley Technology Pub, (ISBN 0470122137, OCLC 896076519, lire en ligne)
  4. Ivanov, Michael., Away3D 3.6 Cookbook., Packt Pub, (ISBN 1849512817, OCLC 797916638, lire en ligne)
  5. (en) Lars Doucet, « Haxe/OpenFL for home game consoles », Gamasutra,‎ (lire en ligne)
  6. a et b David Mouton, « Sortie de Haxe 3.2.0 », LinuxFr,‎ (lire en ligne)
  7. a et b (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,
  10. (en) « hxnodejs », sur lib.haxe.org,
  11. (en) « The New Haxe Target: HashLink In Depth », sur haxe.org,
  12. (en) « Who uses Haxe », sur haxe.org (consulté le )
  13. a et b (en) Lars Doucet, « Dear Adbode: Support Haxe, save your Tools », Gamasutra,‎ (lire en ligne)
  14. (en) « All haxelib (by popularity) », sur lib.haxe.org (consulté le )
  15. 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)
  16. a b et c (en) Nicolas Canasse, « Haxe interview », Io Programmo,‎ , p. 1-6 (lire en ligne)
  17. Fisher, Matt,, HTML5 for flash developers, Packt Pub, (ISBN 1849693331, OCLC 871666029, lire en ligne)
  18. (en) « Completion server », sur haxe.org (consulté le )
  19. « Compilateur Haxe », sur old.haxe.org (consulté le )
  20. (en) « Haxe 3.4.2 », sur github.com (consulté le )
  21. (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), Chapter 9 (Using Haxe)
  22. a b c d e f g h i j k l et m (en) « Compiler targets », sur haxe.org (consulté le )
  23. (en) « HaxeFoundation/haxe », sur GitHub (consulté le )
  24. (en) « HaxeFoundation/haxe », sur GitHub (consulté le )
  25. (en) « Language Features », sur haxe.org (consulté le )