• [^] # Re: Perte de temps

    Posté par (site web personnel) . En réponse au journal Tout ce qu’il faut savoir sur le langage PHP. Évalué à 10.

    J'ai lu le code, personnellement, et même joué avec. Il y a une phase de lexing puis de parsing, tu peux le voir notamment grâce aux fichiers de définition de la grammaire:

    Pour le lexer: https://github.com/php/php-src/blob/4887357269107ed669463c4b95bd755fbbb52490/Zend/zend_ini_scanner.l
    Pour le parser: https://github.com/php/php-src/blob/4887357269107ed669463c4b95bd755fbbb52490/Zend/zend_ini_parser.y

    Ensuite cette phase est décorrélée de la Zend engine, qui est devenue une vraie VM à part entière, qui fonctionne avec un bytecode en entrée (les OPCodes, c'est le même mot que pour les autres VM par ailleurs).

    Je pourrais aller plus loin, notamment sur les passes d'optimisation qu'il fait à la compilation, comme le Dead Code Elimination et quelques autres, sur les optimisations basées sur l'utilisation de la stack plutot que la heap faite par la VM etc...

    Pour voir le code du compilateur (partiel) basé sur l'AST produit par la phase de parsing: https://github.com/php/php-src/blob/4887357269107ed669463c4b95bd755fbbb52490/Zend/zend_compile.c

    Après pour voir tout ce qu'elle fait en terme d'optimisation, et bien faut l'analyser ce code, et là ça devient une tâche un peu plus longue que donner quelques liens.

    Toutes ces modifications ont été apportés par PHP 7 à sa sortie, c'est la grosse différence avec PHP 5.x. Pour information l'extension APC qui existe depuis tellement longtemps que j'en oublie mes mots (on l'utilisait depuis PHP 5.3 ici mais ça existe depuis plus longtemps de mémoire) apportait déjà le caching du bytecode au premier hit pour éviter d'avoir justement la phase de parsing à chaque hit. En réalité PHP n'était plus réellement interprété depuis PHP 5 car il passait déjà par la compilation en une suite d'OPCode avant l'exécution (mais à la différence de PHP 7 il n'avait pas de lexer/parser standard, du code custom à la place, pas de REGEX etc..).

    D'ailleurs chose intéressante, elle est très rapide cette VM, j'ai pas de benchmark récents à te montrer, mais bon, vu qu'à chaque version elle gagne 20% de performances brutes sur les benchmarks de Phoronix, et que déjà il y a quelques année elle se montrait plus rapide que la VM de Python (attention, no troll, je suis conscient que les benchmarks se focalisent toujours sur des algorithmes précis, et qui parfois sont mal implémentés dans tel ou tel langage) - ce qui paraît logique sur un certain nombre de cas d'utilisations parce que PHP type statiquement de plus en plus de choses, et là où le dynamisme disparaît, tout devient plus simple à exécuter - Python reste extrêmement dynamique, beaucoup plus que PHP (d'ailleurs il ressemble plus à JavaScript sur ce point).