Hack (langage)
Hack est un langage de programmation impératif créé par Facebook et proche du langage PHP dont il se distingue par un typage statique ainsi que d'autres éléments empruntés à divers langages.
Hack | ||
Date de première version | 2014 | |
---|---|---|
Paradigmes | Impératif, objet, fonctionnel, procédural, réflexif. Langage interprété |
|
Auteur | ||
Développeurs | ||
Dernière version | 3.15.0 ()[1] | |
Typage | Statique, Fort | |
Influencé par | PHP | |
Écrit en | OCaml | |
Système d'exploitation | Multiplate-forme | |
Licence | Licence BSD | |
Site web | hacklang.org | |
Un programme écrit en Hack s'éxécute au sein d'une machine virtuelle HHVM, ce qui permet de le faire cohabiter de façon transparente avec des programmes en PHP.
Présenté officiellement le [2], Hack est utilisé sur la quasi-totalité du site de Facebook. À cette date, les principales différences à noter avec la version 5.5 de PHP sont :
- l'utilisation du tag « hh » pour indiquer le début d'une portion de code écrite en Hack :
<?hh echo "Hello world"; ?>
- un typage statique, aussi bien pour les variables que pour les arguments et valeurs de retour des fonctions :
int $x = 1;
function f (int $x) : string {
if ($x == 1) {return "Hello world";}
else {return "x est différent de 1";}
}
- la possibilité de définir des classes template :
class Liste<T> {
public function insert (T $data) : void {
/* insère dans la liste la donnée de type T */
}
public function count() : int {
/* retourne le nombre d'éléments de la liste */
}
}
- un opérateur « ? » de nullification permettant d'autoriser (ou d'interdire, en son absence) l'utilisation de valeurs « NULL » pour un type donné :
function estNul (?int $x) : bool {
if ($x == null) {return true;}
else {return false;}
}
- une collection de types standards prédéfinis : Vector, Map, Set, Pair :
$chiffres_impairs = Vector {1,3,5,7,9};
foreach ($chiffres_impairs as $chiffre) {
echo $chiffre." est un chiffre impair.\n";
}
- l'implémentation d'expressions lambda sur le modèle des fermetures de PHP mais avec une syntaxe plus concise :
function ajouteExtensionHack() : (function(string): string) {
$extension = '.hh';
return $y ==> $x.$extension;
}
function test(): void {
$fonction = ajouteExtensionHack();
echo $fonction ('index'); // affiche "index.hh"
}
- la possibilité de définir un nouveau type basé sur des types existants :
type Point = (int,int);
type VecteurEntiers = vector<int>;
- la possibilité de définir un nouveau type « opaque » dont le type d'origine n'est accessible que depuis la portion de code dans laquelle il est défini :
// (fichier 1)
newtype Ordonnee = int;
newtype Abscisse = int;
Abscisse $x = 1; // OK
int $y = $x; // OK
Abscisse $z = $x; // OK
// (fichier 2)
Abscisse $x = 1; // OK
int $y = $x; // erreur : types incompatibles
Abscisse $z = $x; // OK
- les « Shapes », des structures avec un typage statique :
type Voiture = shape { 'modele' => string, 'couleur' => string, 'decapotable' => bool };
Voiture $v;
$v['modele'] = 'Ferrari';
$v['couleur'] = 'rouge';
$v['decapotable'] = true;
Références
- « Release 3.15.0 », (consulté le )
- Julien Verlaguet présente Hack. - Interview dans Infoworld.
Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.