À l'échelle de Facebook, les limites de PHP se faisaient durement sentir : des milliers d'ingénieurs livraient du nouveau code deux fois par jour, mais appeler une méthode sur un objet nul ou deviner le nom de méthode d'une API complexe ne produisait des erreurs qu'à l'exécution, et le langage offrait peu de structure aux outils pour l'introspection. Le langage dynamique préservait la rapidité de la boucle modifier-rafraîchir mais n'offrait aucun filet de sécurité précoce, tandis qu'un langage à typage statique conventionnel aurait apporté des vérifications au prix de la vitesse d'itération — et une réécriture aurait sacrifié l'investissement de Facebook dans PHP et ses bibliothèques.
Hack, annoncé le 20 mars 2014 dans le cadre du runtime HHVM, a résolu cette quadrature en restant un sur-ensemble de PHP. La plupart des fichiers PHP sont déjà du Hack valide, si bien qu'un ingénieur pouvait ajouter des annotations de type à une fonction et laisser la suivante dynamique, le code typé statiquement et le code typé dynamiquement interopérant de façon transparente, même au sein d'un seul fichier. Hack ajoutait les génériques, les types nullables, les alias de type, les collections et les expressions lambda, et HHVM appliquait à l'exécution les types de retour et de paramètres annotés, ce qui permettait aussi à son JIT de faire confiance aux annotations pour optimiser en toute sécurité.
Pour préserver le flux de travail rapide de PHP, l'équipe a architecturé le vérificateur de types comme un serveur local qui surveille le système de fichiers et garde tout le graphe de code en mémoire ; les vérifications typiques s'exécutaient en moins de 200 millisecondes et dépassaient rarement une seconde. La conversion étant granulaire et facultative, les ingénieurs ont converti volontairement la majorité de leur propre code, des outils maison de modification de code ont automatisé le reste, et au cours de l'année précédente, presque toute la base de code PHP de Facebook avait migré vers Hack.
La même annonce a publié en open source Hack et les outils de conversion sous l'égide de HHVM, qui continuerait d'exécuter du PHP non modifié aux côtés de Hack, et a invité les développeurs à une Hack Developer Day sur le campus de Menlo Park le mois suivant. La publication a recueilli 576 points et 415 commentaires sur Hacker News le jour de sa parution.
Greffer un typage statique graduel sur PHP lui-même afin que la sécurité se propage fonction par fonction, jamais d'un seul coup
La compatibilité en tant que sur-ensemble signifiait ni réécriture ni migration big-bang : les fichiers PHP existants continuaient de fonctionner, HHVM restait un runtime PHP, et les bibliothèques PHP tierces restaient utilisables tout du long.
La granularité par fonction permettait à la sécurité de se propager au rythme de chaque équipe, car le code non annoté restait dynamique au lieu d'empêcher la conversion d'un fichier ou d'un module entier.
Un serveur de vérification surveillant le système de fichiers maintenait le retour d'information sous 200 millisecondes, si bien que le typage statique ne taxait pas la boucle modifier-rafraîchir qui rendait l'itération en PHP rapide.
Les ingénieurs choisissaient d'annoter leur propre code et des codemods traitaient le reste répétitif, si bien qu'une base de code de plusieurs millions de lignes a été convertie en un an plutôt qu'en attendant une équipe de migration dédiée.
Ne réécrivez pas pour gagner en sécurité : faites accepter l'ancien code par le langage, laissez la nouvelle discipline se propager une fonction à la fois, et gardez la vérification assez rapide pour qu'elle n'interrompe jamais le flux de travail.
Suites
Hack et ses outils de modification de code ont été publiés en open source sur hacklang.org dans le cadre de HHVM, et Facebook a déclaré que HHVM resterait un runtime PHP œuvrant à la parité avec PHP 5 afin que le code PHP tiers continue de fonctionner aux côtés de Hack. L'annonce a recueilli 576 points et 415 commentaires sur Hacker News le 20 mars 2014, et Facebook prévoyait une Hack Developer Day sur son campus de Menlo Park pour le mois suivant. En interne, chez Facebook, la migration était déjà de fait achevée : presque toute la base de code PHP exécutait du Hack après environ un an d'adoption organique plus des outils automatisés de refactorisation.
VÉRIFIEZ LES SOURCES
Les sources
- Hack: a new programming language for HHVM Engineering at Meta · engineering.fb.com ·
- Hacker News discussion: Hack: a new programming language for HHVM Hacker News · news.ycombinator.com ·