PHP est un langage de programmation qui offre de nombreux avantages : une syntaxe souple, facile à apprendre et comprendre, une grande variété d’outils simplifiant le développement, une bibliothèque de fonction couvrant la plupart des besoins des développeurs d’applications web et c’est un produit libre. Ces avantages se traduisent facilement en excellents rapports coûts/temps de développement, ce qui rend le choix de PHP dans un processus de développement agile encore plus pertinent.

D’un autre côté, PHP est un langage interprété : le fichier source sera de nouveau lu et traduit en langage machine avant chaque exécution. Des outils permettent de mettre en cache une partie de ce traitement (les optimiseurs d’opcode) améliorent sensiblement les performances d’une exécution.

Pour les équipes d’ingénieurs de Facebook, ce n’était probablement pas suffisant, car ils ont développé en interne HipHop for PHP, afin de permettre à un script PHP d’approcher les performances d’un programme compilé en C++.

Des compilateurs PHP existent déjà, quelle est donc la valeur ajoutée de HipHop ?

Contrairement à Roadsend ou phpcompiler, HipHop n’est pas à proprement parler un compilateur. L’outil est en fait une chaine de traitement qui mènent à une version compilée, mais passant par une phase de traduction du langage en C++ optimisé pour les besoins. On supposera déjà qu’il est pratiquement inutile d’essayer d’analyser et modifier directement ce code C++ généré. Ce dernier sera compilé par le compilateur Gnu, g++.

La traduction s’effectue en trois étapes majeures :

  1. Une analyse statique permet de collecter les informations sur les déclarations et les dépendances entre les fichiers composant le script : à priori, une table des symboles (classes/méthodes/fonctions) est dressée.
  2. Une seconde analyse permet de choisir le type C++ optimal utilisé pour les symboles et variables (j’en reparle un peu plus bas).
  3. Enfin, les instructions en PHP sont traduites en C++. Cette opération est essentiellement une conversion syntaxique (les deux langages sont assez proches du point de vue de la syntaxe).

Quelles sont les limites ?

A priori, la quasi-totalité de la grammaire du langage a été retranscrite, il est même probable que la plupart des librairies soient utilisables, dans la mesure où celles-ci, tout comme le moteur Zend de PHP, sont écrites en C.

La plupart des gains réalisés proviennent de l’optimisation de la “magie” de PHP, c’est à dire, l’ensemble des instructions qui nécessitent une évaluation dynamique. L’exemple le plus évident est probablement le transtypage à la volée. En effet, dans la mesure où PHP est un langage faiblement typé, il est possible de manipuler une variable sans restreindre son type : on peut facilement passer d’un entier à une chaine de caractères, par exemple. Cette souplesse à un coût, puisque le moteur PHP doit évaluer et déterminer le type de l’information manipulée (coût CPU), et en stocker une copie dans les principaux types (coût mémoire).

HipHop ne remplacera naturellement pas le travail d’optimisation du développeur, il est même possible de s’imposer quelques nouvelles contraintes, comme limiter les transtypages implicites.

Par ailleurs quelques fonctionnalités propres à un langage interprétés n’ont pas été portées en raison de la complexité de l’opération et du faible gain, comme la fonction eval(). On peut tout de même supposer que les noms de symbôles obtenus dynamiquement (voir ci-dessous) fonctionneront, puisque je suppose qu’on peut relativement facilement remplacer le mécanisme par des pointeurs sur fonctions en C++.

  1. <?php
  2. // Manipulation dynamique de symbole : on instancie une
  3. // classe dont le nom est stocjé dans une variable
  4. $classe = 'PDO';
  5. $monObjet = new $classe(); // on vient d'appeler le constructeur de la classe PDO

En savoir plus

Pour ce soir (heure française), on doit se contenter de cette annonce : on ne sait pas encore exactement quelle licence sera choisie (on sait néanmoins que l’outil sera opensource), le code n’est pas encore disponible et le wiki mis en place n’est pas encore public. J’espère donc avoir rapidement l’occasion et le temps de faire des tests et des comparatifs de performance (avec un framework comme symfony par exemple).

Mise à jour : La licence retenue est la licence de PHP, le projet sera bientôt disponible publiquement sur le github de facebook.

HipHop for PHP serait déjà utilisé en production sur Facebook, on peut donc supposer que la première version mis à disposition sera déjà stable et bien avancée.

Annonce officielle sur le blog des développeurs de Facebook