Les avantages et les inconvénients d'un langage de programmation dynamique

Comme nous le savons tous, PHP est un langage dynamique. La plupart des développeurs PHP profitent de cette caractéristique, car elle rend la programmation plus souple et flexible.

Cela signifie que dans la pratique vous n'avez pas besoin de déclarer dans les ressources de nombreux avance que vous avez besoin d'utiliser, par exemple, les noms et les types de variables, comme vous avez dans des langages statiques.

Bien sûr, la programmation dynamique est à un prix. Si l'ont ne sait pas à l'avance les types de variables, il n'est pas possible de faire toutes sortes d'optimisations que l'on pourrait si les types de variables étaient fixés et connus.

Variables de classe dynamique

En PHP, les classes peuvent avoir un nombre variable de variables. Malgré que vous pouvez déclarer les variables que vous connaissez sera nécessaire, vous pouvez également attribuer dynamiquement des valeurs aux variables nouvelles qui n'ont pas été déclarés.

Cela implique que le moteur PHP exécution runtime doit prendre en compte cette possibilité de gérer l'accès aux valeurs de la classe variables. En pratique, cela signifie qu'en interne, propriétés de la classe variables doivent être stockés dans une structure de données dynamique qui peut être étendu si nécessaire.

L'optimisation PHP 5.4 d'accès de classe variable

Rasmus Schulz (à ne pas confondre avec PHP Rasmus Lerdorf créateur) est un développeur danois qui n'est pas un il ya très longtemps exprimé la crainte que PHP pourrait fonctionner plus rapidement si elle a été exécutée en haut d'un moteur de compilateur JIT.

Plus récemment, il a soulevé une autre préoccupation dans la liste de diffusion internes PHP ce qui concerne la quantité excessive de mémoire utilisée lors de la création de nombreux objets de la même classe. Son affirmation était que cela était dû au fait que pour chaque objet PHP a été la création d'une structure de données dynamique (table de hachage) pour stocker les propriétés de chaque variable de classe.

Cela est utile si PHP s'attend à ce que la liste des changements des variables de classe au cours de la durée de vie de chaque objet. Mais si la liste des variables ne change jamais, c'est une perte de mémoire parce que les objets différents de la même catégorie ont la même liste de variables, de sorte que la classe pourrait utiliser la même liste de propriétés si elle a été stockée dans une structure plus efficace des données partagée par tous les objets de la même classe.

C'est à ce moment que le développeur principal portugais Lopes Gustavo a expliqué que, à partir de PHP 5.4 les propriétés dynamiques table de hachage est créé uniquement si les variables sont ajoutées dynamiquement à des objets lors de l'exécution.

En complément, Tom Boutell conclu dans le fil de discussion même après l'exécution d'un script de test mis à jour sur la base de celui prévu à l'origine par Rasmus Schulz, en utilisant seulement les pré-déclarés des variables de classe le script utilise non seulement beaucoup moins de mémoire, mais il s’exécute également 20% plus rapidement.

Maintenant, il devrait être facile pour vous de comprendre que vous devriez éviter d'utiliser des variables de classe qui n'ont pas été déclarées explicitement dans la déclaration de classe. Cela signifie que vous devez déclarer toutes les variables de classe, même si elles n'ont pas de valeur initiale définie.

Malgré déclarer explicitement toutes les variables de classes est une pratique courante, certains développeurs ne sont pas déclarer toutes les variables de classe qu'ils vont utiliser, surtout si elles sont privées et n'ont pas besoin d'avoir une valeur initiale.

Les gains de cette optimisation ne sont visible si vous avez besoin pour créer de nombreux objets de la même classe dans un script PHP. Si vous ne créez seulement quelques objets d'une classe, vous pouvez ne pas remarquer une grande différence.

Future PHP 6 optimisations de type variables

Cette optimisation PHP 5.4 fonctionne en rendant plus efficace la recherche de variables de classe par son nom lors de l'exécution parce que quand une classe est chargée, nous savons déjà ce que sont toutes ses variables, en supposant qu'aucun des variables dynamiques sont ajoutés plus tard.

Plus d'optimisations qui pourrait être fait si le moteur PHP savait aussi le type des variables et des valeurs de retour des fonctions d'avance. Cela est particulièrement vrai, pas dans la version du moteur Zend actuel, car il fonctionne par l'interprétation des opcodes compilées Zend , mais plutôt lorsque vous utilisez un JIT (Just In Time) PHP moteur de compilation.

D'après ce que sais Manuel Lemos, il y a au moins 3 PHP compilateurs JIT : le Facebook HipHop PHP, Phalanger et Quercus, qui utiliserait le NET et Java JIT moteurs du compilateur.. Il peut y avoir d'autres que je ne suis pas au courant, mais je suppose qu'ils tournent tous autour des mêmes concepts.

Compilateurs JIT sont au moins une génération d'avance sur le Zend Engine 2 utilisé dans PHP 5.x série depuis 2004. Compilateurs JIT peut faire courir plus vite en PHP générer et exécuter du code machine natif optimisé pour le processeur actuel.

Actuellement JIT moteurs compilateur essayer de deviner variable et les types de fonctions de retour de valeur à partir du contexte du code PHP pour rendre le code machine généré plus efficace. Par exemple, considérons le code suivant:

$length = strlen($string);

strlen est une fonction qui retourne toujours un entier. Par conséquent, le compilateur JIT peut déclarer une variable de type integer, car il est certain qu'il est toujours un entier. Ce genre de deviner le type de valeur est appelée l'inférence de type.

Lorsque le type d'une variable ne peut être deviné avec certitude, compilateurs JIT utiliser des variables d'un type appelé variante.

L'utilisation de variables variantes est beaucoup moins efficace parce que les opérations avec ces variables peuvent exiger de nombreuses conversions de type, car nous ne pouvons pas présumer de ce type est la valeur actuelle stockée dans cette variable. Cela signifie que le code JIT compilé utilisera le code machine natif plus, plus de mémoire, plus de cycles CPU, les performances donc moins.

Dans les cas que le compilateur JIT est incapable de deviner les types de variables à partir du contexte, il serait utile si le programmeur dit explicitement quel type de la variable est. Ce n'est pas seulement rendrait le code généré plus efficace, mais finirait par faire la compilation JIT rapide, comme le compilateur JIT ne pas avoir à faire des suppositions de type variable.

Déclarations typés de variables de classe pourrait ressembler à ceci:

public integer $l = 0;

Traditionnellement les développeurs du noyau PHP ont été réticents à accepter toute initiative en vue d'un typage variable plus stricte du langage PHP.

Mais l'idée que je propose ici n'est pas de faire PHP un langage strict typé. L'idée est de permettre aux développeurs PHP éventuellement déclarer explicitement le type au moins de certaines variables, de sorte compilateurs JIT peut faire un meilleur travail générant plus efficace du code machine natif en moins de temps.

Pour le moteur PHP5.x/Zend 2 Déclaration de la variable et la fonction des valeurs de type ne peut guère être utile en raison de la nature dynamique de Zend Engine 2.

Cependant, pour une éventuelle PHP 6 basé sur le Zend Engine 3 avec support pour la compilation JIT, toutes les allusions de type que le code PHP peut passer au moteur JIT aider à rendre le code PHP compilé beaucoup plus efficace.

Pour autant que je sais, les plans de PHP 6 et Zend Engine 3 ne sont pas publiques, s'ils existent. Mais il n'est ni tôt ni tard pour discuter de ce qu'ils seront. Ils peuvent ainsi répondre à cette question de l'efficacité ayant en vue les avantages de compilateurs JIT. Je soupçonne que de plus en plus la communauté PHP seront parler de ces questions, car il semble être la prochaine étape logique. Nous verrons.

Conclusions

Pour être précis, l'optimisation de PHP 5.4 n'était pas vraiment secret. Le fait est qu'il n'a pas été commenté parmi les développeurs en dehors du cœur de PHP.

Comme pour PHP 6 et Zend Engine 3 spéculations mentionné ci-dessus, si elles ont été déjà discuté entre les développeurs du noyau PHP, au moins pour moi, ils sont vraiment secret, de sorte que mes spéculations ne sont que des suppositions de ce qu'elle peut être et à mon avis probablement pas si humble de ce qu'elle devrait être.

Quoi qu'il en soit, depuis l'optimisation a été introduit en PHP 5.4, c'est encore une autre raison qui pourrait vous convaincre de mettre à niveau au cas où vous poseriez la question si c'était vraiment la peine. Dans tous les cas, vous devriez toujours évaluer soigneusement les avantages et les inconvénients de mise à niveau vers PHP 5.4 avant que vous décidé de le faire.

Alors, que pensez-vous ? Êtes-vous prêt à passer à PHP 5.4 avantage de cette situation et d'autres optimisations ou avez-vous encore des inquiétudes qui vous empêchent de mise à niveau ?

Quoi à propos des spéculations PHP 6 et Zend Engine 3 ? Pensez-vous que la déclaration de type proposée en option pour les variables et fonctions serait quelque chose que vous utiliser pour faire fonctionner PHP plus rapidement ?

On vous laisse répondre en anglais, sur la source anglaise originale de cet article : The Secret PHP Optimization of version 5.4