Maison  >  Article  >  développement back-end  >  Comprendre les principes sous-jacents du développement de PHP7 : le processus de conversion du bytecode en code machine

Comprendre les principes sous-jacents du développement de PHP7 : le processus de conversion du bytecode en code machine

王林
王林original
2023-09-08 16:13:52727parcourir

Comprendre les principes sous-jacents du développement de PHP7 : le processus de conversion du bytecode en code machine

Comprendre les principes sous-jacents du développement de PHP7 : le processus de conversion du bytecode en code machine

Avec le développement rapide d'Internet, PHP, en tant que langage de développement efficace et évolutif, a été favorisé par la majorité des développeurs. La mise à niveau et la mise à jour du langage PHP ont toujours été au centre des préoccupations des développeurs. En tant que dernière version, PHP7 présente non seulement une amélioration significative des performances, mais introduit également des changements dans les principes de développement sous-jacents. Cet article commencera par le processus de conversion du bytecode en code machine pour acquérir une compréhension approfondie des principes de développement sous-jacents de PHP7.

Dans les versions antérieures à PHP7, PHP était un langage interprété, et le code serait directement interprété et exécuté par l'analyseur. Dans PHP7, un tout nouveau moteur est introduit, à savoir Zend Engine 3.0, qui compile le code PHP en bytecode, puis convertit le bytecode en code machine via la technologie de compilation JIT (Just-In-Time) pour obtenir une exécution plus efficace. Ce processus de conversion sera décrit en détail ci-dessous.

Tout d’abord, voyons comment compiler du code PHP en bytecode. Le code PHP sera d'abord découpé en unités via un analyseur lexical, comme des identifiants, des mots-clés, des opérateurs, etc. Ensuite, la relation et la structure entre ces unités sont analysées via un analyseur syntaxique et un arbre syntaxique abstrait (AST) est généré. AST est une structure de données arborescente qui reflète la structure du code PHP. Elle se compose d'une série de nœuds, chaque nœud représente une unité de structure syntaxique.

Une fois l'AST généré, l'étape suivante est le processus de conversion de l'AST en bytecode. Le bytecode est une forme intermédiaire de code Contrairement au code machine, il ne s'agit pas d'un code binaire composé de 0 et de 1, mais d'un format de sérialisation spécifique qui peut être facilement analysé et exécuté par le moteur Zend. Le bytecode est le support réel que le moteur Zend lit et exécute.

L'exemple de code est le suivant :

<?php
   function sum($a, $b) {
      return $a + $b;
   }

   $result = sum(3, 4);
   echo "结果:{$result}
";
?>

Dans le code ci-dessus, nous définissons une fonction simple sum pour calculer la somme de deux nombres, et appelons cette fonction pour calculer la somme de 3 et 4 . Voici le processus de conversion de ce code en bytecode : sum 来计算两个数字的和,并调用该函数来计算3和4的和。下面是将这段代码转换成字节码的过程:

  1. 解析器将源代码转化为一个由一系列抽象语法树节点组成的抽象语法树。
  2. 编译器根据抽象语法树生成相应的opcode,然后生成字节码。

具体的字节码如下所示:

number 3
number 4
add
return

上面的字节码由一系列的指令构成,每个指令都是一个操作码(opcode)和一个或多个操作数(operand)。例如,number 3 表示将3压入运行时栈中,add 表示从栈中弹出两个数相加,并将结果压回栈中。return

    L'analyseur convertit le code source en un arbre de syntaxe abstraite composé d'une série de nœuds d'arbre de syntaxe abstraite.

    Le compilateur génère l'opcode correspondant basé sur l'arbre de syntaxe abstraite, puis génère le bytecode.

Le bytecode spécifique est le suivant :

rrreee

Le bytecode ci-dessus se compose d'une série d'instructions, chaque instruction est un code d'opération (opcode) et un ou plusieurs opérandes (opérande). Par exemple, number 3 signifie placer 3 sur la pile d'exécution, et add signifie extraire deux nombres de la pile, les ajouter et repousser le résultat sur la pile. return signifie renvoyer le résultat en haut de la pile.

Ensuite, nous explorerons comment le bytecode est converti en code machine par le compilateur JIT. Un compilateur JIT est un compilateur spécial qui convertit dynamiquement le bytecode en code machine au moment de l'exécution. En PHP7, le moteur Zend implémente la compilation JIT en appelant la bibliothèque LLVM (Low-Level Virtual Machine).

La bibliothèque LLVM est une infrastructure de compilateur open source qui fournit un cadre de compilation flexible et modulaire capable de convertir le bytecode en code machine. Il utilise une forme de représentation intermédiaire (IR) pour traduire le bytecode de la langue source vers cette représentation intermédiaire, puis le convertit en code machine.

Pendant le processus de compilation JIT, LLVM convertira d'abord le bytecode en IR, puis effectuera une série d'optimisations, telles que la propagation constante, l'expansion de boucle, etc., pour enfin générer un code machine efficace. De cette façon, l’efficacité d’exécution des programmes PHP a été grandement améliorée.
  • Pour résumer, PHP7 permet une exécution plus efficace en compilant le code PHP en bytecode, puis en convertissant le bytecode en code machine via le compilateur JIT. Dans ce processus, les analyseurs lexicaux, les analyseurs syntaxiques et les compilateurs jouent un rôle important dans la conversion du code source en bytecode. Le compilateur JIT convertit le bytecode en code machine en appelant la bibliothèque LLVM.
  • Comprendre les principes de développement sous-jacents de PHP7 est très important. Cela peut nous aider à mieux optimiser le code et à améliorer les performances du programme. Avec le développement continu de la technologie, comprendre et maîtriser les principes sous-jacents deviendra une compétence indispensable pour les développeurs.
Références : 🎜🎜🎜PHP Internals Book (s.d.). Récupéré de https://www.phpinternalsbook.com/🎜🎜PHP et JIT - Nikita Popov (juin 2015). github.io/2015/06/19/PHP-7-0-JIT-FAQ.html🎜🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn