En tant que langage de script largement utilisé dans le développement Web, PHP a réalisé des améliorations de performances significatives dans la version PHP7, grâce à la gestion optimisée de la mémoire, au mécanisme de gestion des erreurs et à la technologie de compilation JIT. Comprendre le mécanisme de fonctionnement sous-jacent de PHP7 est un fondement important pour développer des applications PHP à haute performance. Cet article commencera à partir du niveau du code source et analysera son processus de base de la compilation à l'exécution.
Le processus de compilation de PHP est principalement divisé en trois étapes: analyse lexicale, analyse grammaticale et génération de code intermédiaire. Ce qui suit sera démonté un par un.
Au cours de la phase d'analyse lexicale, le code source PHP sera divisé en les plus petites unités de langage appelées "jetons", tels que les variables, les nombres, les chaînes et les opérateurs. Chaque balise comprend un nom de type et une valeur correspondante.
$var1 = 10;
$var2 = "hello world";
Les marques correspondantes sont:
T_VARIABLE $var1
T_WHITESPACE
T_EQUAL =
T_WHITESPACE
T_LNUMBER 10
T_SEMICOLON ;
T_WHITESPACE
T_VARIABLE $var2
T_WHITESPACE
T_EQUAL =
T_WHITESPACE
T_STRING "hello world"
T_SEMICOLON ;
L'analyse de syntaxe construit une séquence de balises dans une arborescence de syntaxe, dont les nœuds représentent une structure de syntaxe, comme une instruction conditionnelle ou un appel de fonction. L'arbre de syntaxe aide l'interprète à comprendre la logique de code.
if ($a > $b) {
$max = $a;
} else {
$max = $b;
}
La structure de l'arbre de syntaxe correspondant est:
if
├─ >
│ ├─ $a
│ └─ $b
├─ =
│ ├─ $max
│ └─ $a
└─ =
├─ $max
└─ $b
À ce stade, l'arbre de syntaxe est converti en un code intermédiaire abstrait pour l'exécution par la machine virtuelle. Ce langage intermédiaire ne s'appuie pas sur des plates-formes spécifiques et aide à l'exécution et à l'optimisation des performances multiplateformes.
function get_user_name($userid) {
$users = array(
1 => "John",
2 => "Mary",
3 => "Bob"
);
if (isset($users[$userid])) {
return $users[$userid];
} else {
return "Unknown";
}
}
Le code intermédiaire généré est le suivant:
FUNCTION get_user_name
PARAM $userid
ADD_ARRAY $users,1,"John",2,"Mary",3,"Bob"
IF isset,$users,$userid
GET_ARRAY $users,$userid
RETURN
ELSE
STRING "Unknown"
RETURN
ENDIF
END_FUNCTION
Une fois PHP terminé la génération de code intermédiaire, il entrera dans l'étape d'exécution et la machine virtuelle termine l'opération de code.
L'exécution de PHP repose sur son interprète, composé de noyaux linguistiques et de modules extensibles. La partie centrale est responsable de la syntaxe de base et du contrôle du processus, et le module d'extension peut être chargé librement en fonction des exigences fonctionnelles.
La technologie de compilation JIT introduite puisque PHP7 peut compiler dynamiquement les chemins de code chauds vers le code machine local pour améliorer l'efficacité opérationnelle, en particulier dans les scénarios répétés à forte intensité de l'opération.
La machine virtuelle PHP est responsable de l'exécution du code intermédiaire et de la réalisation de tâches sous-jacentes telles que l'allocation de mémoire, les appels de fonction et la gestion des exceptions. Sa conception fait référence à l'architecture matérielle réelle et réalise les capacités d'exécution multiplateforme.
PHP7 a fait de nombreuses optimisations sur l'architecture sous-jacente, et ses mécanismes de compilation et d'exécution sont divisés en plusieurs liens: analyse lexicale et syntaxe, génération de code intermédiaire, exécution de la machine virtuelle et compilation JIT. Pour les développeurs, la compréhension de ces mécanismes aide non seulement à déboguer et à optimiser les performances des applications, mais leur permet également de mieux comprendre l'essence du langage PHP.