Slide 1

Slide 1 text

Zend Engine: Entendendo o Motor que impulsiona o PHP Jessica Felix ( Jessilyneh)

Slide 2

Slide 2 text

Eu sou a Jess ● Sou desenvolvedora de Software há 8 anos. ● Trabalho na área faz 6 anos. ● I .T. Architect II na F1rst (Grupo Santander) ● Tech Lead na ONG Lacrei Saúde ● Instrutora na Linux Tips ● Organizadora na comunidade Nerdzão Redes sociais: https://www.linkedin.com/in/jessilyneh/ https://twitter.com/jessilyneh

Slide 3

Slide 3 text

A origem do Zend Engine Zend Engine é o motor que alimenta o PHP. É um interpretador de código aberto e runtime, escrito em linguagem C que executa os scripts PHP. Consiste na Zend Virtual Machine, que é composta pelo Zend Compiler e pelo Zend Executor, que compila e executa o código PHP. Desenvolvido por Zeev Suraski e Andi Gutmans, o Zend Engine é um abreviação de seus nomes: Zeev + Andi = Zend https://en.wikipedia.org/wiki/Zend_Engine

Slide 4

Slide 4 text

Interpretador e Compilador O trabalho do compilador PHP é analisar o código PHP e compilá-lo em um bytecode intermediário que pode ser executado pelo Zend Engine, que é ao mesmo tempo o runtime e o coração da linguagem PHP. O código PHP é interpretado linha por linha, mas o código é compilado primeiro para gerar um bytecode intermediário, que é então interpretado pelo mecanismo do Zend. https://stackoverflow.com/questions/1514676/is-php-compiled-or-inter preted

Slide 5

Slide 5 text

E como funcionava antes do Zend? Antes da introdução do Zend Engine no PHP, as versões mais antigas da linguagem PHP (como o PHP/FI e o PHP 3) não eram compiladas da mesma maneira que as versões posteriores. O PHP/FI (Personal Home Page/Forms Interpreter), que foi a primeira versão da linguagem, lançada em 1994, era uma linguagem interpretada de script simples que processava os scripts linha por linha. https://www.zend.com/resources/php-versions https://pt.quora.com/O-que-%C3%A9-o-PHP-moderno

Slide 6

Slide 6 text

O Compilador do PHP3 O PHP 3 introduziu um compilador que traduzia scripts PHP em um código intermediário (chamado de bytecode) antes da execução. MAS, essa compilação não era tão sofisticada quanto a implementada no Zend Engine. O compilador PHP 3 não era um compilador just-in-time (JIT), o que significa que ele não compilava o código em tempo de execução Em vez disso, ele compilava o código antecipadamente e o armazenava em um cache para uma execução mais rápida https://blog.ircmaxell.com/2019/04/compilers-ffi.html https://github.com/ircmaxell/php-compiler

Slide 7

Slide 7 text

Zend Engine e PHP4 A primeira versão do Zend Engine (Zend Engine 1) foi lançada em 1999 junto com o PHP 4. Essa versão introduziu recursos como um interpretador mais eficiente e uma API de extensão modular. Zend Engine 1

Slide 8

Slide 8 text

Zend Engine e PHP4 1 - Interpretador mais eficiente: Traduzia o código PHP em bytecode, o que permitia uma execução mais rápida em comparação com a interpretação direta do código-fonte PHP. 2 - API de Extensão Modular: Permitiu que os desenvolvedores criassem extensões para o PHP de forma mais organizada e modular. Essas extensões poderiam ser compiladas separadamente e carregadas dinamicamente no PHP conforme necessário. Isso levou a uma maior flexibilidade e capacidade de estender as funcionalidades do PHP. Outras melhorias: ● Suporte a Orientação a Objetos ● Melhorias na Manipulação de Strings ● Melhorias na Manipulação de Erros http://php.adamharvey.name/manual/en/internal s2.ze1.php

Slide 9

Slide 9 text

Qual o ganho de compilação JIT? O compilador JIT é um híbrido dos interpretadores tradicionais e dos compiladores Ahead-Of-Time (AOT). O modelo híbrido traz os prós e os contras de ambas as abordagens, e uma aplicação bem ajustada pode superar os contras do JIT O código-fonte ainda não precisa ser pré-compilado, mas com um cache compartilhado de código de máquina compilado, o código compilado pode ser reutilizado entre solicitações, o que pode melhorar o desempenho e o uso de memória https://blog.ircmaxell.com/2019/04/compilers-ffi.html https://github.com/ircmaxell/php-compiler

Slide 10

Slide 10 text

Arquitetura com o Zend Engine Zend Engine 1 e PHP4 Script PHP moderno

Slide 11

Slide 11 text

Arquitetura com o Zend Engine antiga O script PHP foi carregado pelo Zend Engine e compilado no Zend Opcodes, abreviações de códigos de operação, que são binários de baixo nível de instruções. Em seguida o opcode foi executado e o HTML gerado enviado para o client. O opcode foi liberado da memória após a execução.

Slide 12

Slide 12 text

Arquitetura com o Zend Engine moderna Os scripts PHP são carregados na memória e compilados em opcodes Zend. Vamos vê-las com detalhes!

Slide 13

Slide 13 text

Just In Compiler (JIT) e o PHP8 https://codamos.com.br/php-8-jit/

Slide 14

Slide 14 text

Lexing ou Tokenizing O código PHP é lido e transformado em uma série de palavras chave conhecidas como Tokens. Este processo permite que o interpretador entenda que parte do código está escrita em qual parte do programa. Este é o primeiro passo. https://codamos.com.br/php-8-jit/

Slide 15

Slide 15 text

Análise (Parsing): Quando um script PHP é solicitado pelo navegador ou por outro cliente, o servidor web recebe a solicitação. O servidor web passa o script PHP para o interpretador PHP, que é onde o Zend Engine entra em ação. O Zend Engine começa analisando o código-fonte do script, convertendo-o em uma forma interna conhecida como "Árvore Sintática Abstrata" (AST). https://pt.wikipedia.org/wiki/An%C3%A1lise_sint%C3%A1tica_%28computa%C3%A7%C3%A3o%29

Slide 16

Slide 16 text

Compilação Transformar esta árvore em algo que possa ser executado requer uma representação intermediária (Intermediate Representation, IR) que em PHP chamamos de Opcode. O processo de transformar a AST em Opcodes é chamada de compilação. A extensão php-ast é significativamente mais rápida que o PHP-Parser porque a construção AST é implementada em C A extensão php-ast só pode analisar código sintaticamente correto . https://codamos.com.br/php-8-jit/ https://kinsta.com/pt/blog/php-8/ https://pecl.php.net/package/ast

Slide 17

Slide 17 text

Execução do Código A Zend Virtual Machine (ZVM), que é parte do Zend Engine do PHP, interpreta e executa os opcodes gerados ou, se não houver otimização de opcodes, executa diretamente a AST. Durante a execução, as operações especificadas no código são realizadas, como cálculos, manipulação de dados, operações de banco de dados, saída de conteúdo HTML, etc. . https://codamos.com.br/php-8-jit/ https://kinsta.com/pt/blog/php-8/ https://pecl.php.net/package/ast

Slide 18

Slide 18 text

Gerenciamento de Variáveis e Memória A ZVM gerencia variáveis, memória e recursos durante a execução do código. Ela aloca e libera memória conforme necessário e mantém o controle das variáveis do programa. 1 - Alocação de memória 2 - Referência e contagem de referência 3 - Garbage Collector 4 - Memória Compartilhada 5 - Otimizações de memória 6 - Gerenciamento de recursos . https://codamos.com.br/php-8-jit/ https://kinsta.com/pt/blog/php-8/ https://pecl.php.net/package/ast

Slide 19

Slide 19 text

Gerenciamento de Variáveis e Memória https://codamos.com.br/php-8-jit/ https://kinsta.com/pt/blog/php-8/ https://pecl.php.net/package/ast o gerenciamento de variáveis e memória na ZVM do PHP está intrinsecamente ligado ao uso e à manipulação de variáveis PHP e estruturas de dados. Ele garante que a memória seja alocada eficientemente, que as variáveis sejam mantidas de acordo com seu escopo e referências, e que a memória seja liberada de forma adequada para evitar vazamentos de memória. Isso é fundamental para o funcionamento seguro e eficiente de scripts PHP, especialmente em aplicativos web e servidores onde muitas solicitações podem ser tratadas simultaneamente. .

Slide 20

Slide 20 text

Zend Engine (PHP), o V8 (JavaScript) e o CPython (Python) Zend Engine V 8 CPython Linguagem de implementação Linguagem C C++ Linguagem C Modelo de concorrência Síncrono, mas pode ser assíncrono com extensões Assíncrono, baseado em eventos Síncrono, mas pode ser assíncrono Gerenciamento de Memória Coletor de lixo de referência Coletor de lixo automático Coletor de lixo de referência Otimizações caching de opcode e JIT (Just-In-Time compilation) Compilação Just-In-Time, otimizações para funções frequentemente usadas Não tem JIT nativo, mas existem implementações alternativas como PyPy Extensibilidade Possui uma API de extensão robusta Pode ser estendido e incorporado usando a API nativa do V8 Possui uma API de extensão robusta

Slide 21

Slide 21 text

Tem algo mais parecido com o Zend Engine? CPython e o Zend foram escritos em C, usam contagem de referência para gerenciamento de memória e possuem um coletor de lixo para lidar com ciclos de referência. Ambas as linguagens (PHP e Python) são interpretadas Ambos também têm um modelo de execução principalmente síncrono, mas podem ser estendidos para suportar a execução assíncrona (com a extensão Swoole no caso do PHP, e com o módulo assíncrono no Python). Ambos os motores também possuem uma API de extensão para adicionar novas funcionalidades à linguagem. No caso do PHP, essas extensões são muitas vezes escritas em C e compiladas em módulos de extensão dinâmica. Da mesma forma, Python suporta extensões escritas em C ou C++. .

Slide 22

Slide 22 text

OBRIGADO!