Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Zend Engine- Entendendo o Motor que impulsiona o PHP

Jessilyneh
October 04, 2023

Zend Engine- Entendendo o Motor que impulsiona o PHP

Conheça mais sobre o Zend Engine, o motor de código aberto que dá vida ao PHP. Nesta palestra, você vai entender sobre a origem, evolução, funcionamento interno de sua arquitetura, ciclo de vida de um script PHP, gerenciamento de memória do Zend Engine e como isso se relaciona com variáveis PHP e estruturas de dados.

Jessilyneh

October 04, 2023
Tweet

More Decks by Jessilyneh

Other Decks in Programming

Transcript

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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.
  10. 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!
  11. 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/
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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. .
  17. 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
  18. 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++. .