Back-End

21 out, 2014

Desenvolvedor PHP que trabalha para o Google lança compilador PHP

Publicidade

Recentemente foi lançado um novo compilador PHP chamado Recki-CT, que gera código nativo que supera o mesmo código PHP rodando no Zend Engine ou no Facebook HHVM. Leia este artigo para saber mais sobre esse novo compilador PHP, como ele funciona e os planos para o futuro.

O que é o Recki-CT?

Recki-CT (Recki Compiler Toolkit) é um projeto de Anthony Ferrara, desenvolvedor PHP das antigas que há algum tempo se tornou Developer Advocate no Google.

Apesar de ele trabalhar no Google, o Recki-CT não é realmente uma parte do seu trabalho como developer advocate. É algo que ele faz em 20% do seu tempo no Google – a empresa permite que seus funcionários trabalhem em projetos de sua escolha. Então, o compilador não é um projeto do Google, apesar das menções à empresa no copyright e de ser necessário que os contribuidores assinem uma CLA (Contributor License Agreement – Acordo de Licença de Contribuição).

Recki-CT é um projeto totalmente escrito em PHP. Ele faz o parse do código PHP e gera um código de máquina como resultado da compilação do código PHP.

Como o Recki-CT funciona?

Conversei com o Anthony e ele foi muito gentil em esclarecer como o Recki-CT funciona e como ele pode compilar código PHP com resultados de performance tão bons.

Basicamente, Recki é uma biblioteca PHP que pega um pouco de código, faz o parse para fazer uma Árvore Sintática Abstrata usando o parser PHP de Nikita Popov. Então, ele analisa a árvore sintática para realizar algumas otimizações. O resultado é um código compilado em uma representação intermediária em formato texto. Esse código é passado para a extensão JIT-FU de Jow Watkins, que emite código nativo usando a biblioteca libjit.

O código de máquina resultante pode ser executado ao chamá-lo da mesma forma que você chama uma função closure em PHP.

Quão rápido é o Recki-CT?

Em termos de velocidade, nós precisamos observar dois pontos de vista. O primeiro é o passo da compilação. Esta não é uma etapa rápida, não apenas porque é implementada com código PHP, mas também porque as tarefas de parseamento, análise e otimização costumam ser lentas devido à sua complexidade. Por essa razão, o Recki-CT faz cache do código compilado para evitar que leve muito tempo para recompilar o mesmo código várias vezes.

Para o código compilado, de acordo com parâmetros publicados em um artigo no blog do Anthony, em alguns casos o código resultante tem performance melhor que na versão do Zend Engine, incluído no PHP 5.5, assim como no HHVM 3.2.

Aqui estão alguns dos resultados retirados desse artigo. Veja que em alguns casos os testes falham porque rodam código que ainda não é suportado pelo Recki-CT.

php 5.5 Recki-CT hhvm 3.2 hippy-c qb
simple() 139.63357 1.00000 8.30447 7.65693 8.35018
simplecall() 38.99476 FAIL 1.32552 1.00000 FAIL
simpleucall() 54.02041 1.00000 3.52439 1.51072 47.91090
simpleudcall() 52.14534 1.00000 3.75936 1.41614 47.55259
mandel() 21.26249 1.00000 2.03372 2.11208 FAIL
mandel_typed() 23.16553 1.00000 2.11128 2.09212 3.00061
mandel2() 24.43275 1.00000 2.57704 1.87802 FAIL
mandel2_typed() 23.79989 1.00000 2.90105 1.57193 7.11054
ackermann(7) 35.04870 1.00000 2.27557 103.45436 621.72526
ary(50000) 1.39338 FAIL 1.00000 4.47888 FAIL
ary2(50000) 1.26952 FAIL 1.00000 2.28231 FAIL
ary3(2000) 5.96015 FAIL 1.70997 1.00000 FAIL
fibo(30) 39.48440 1.00000 1.60647 16.40883 FAIL
hash1(50000) 1.70014 FAIL 1.00000 3.27314 FAIL
hash2(500) 2.23648 FAIL 1.00000 1.30044 FAIL
heapsort(20000) 3.67800 FAIL 1.00000 4.96699 FAIL
matrix(20) 4.38364 FAIL 1.00000 37.72782 FAIL
nestedloop(12) 29.24924 1.00000 2.91459 3.07568 FAIL
sieve(30) 10.95413 FAIL 1.00000 4.95152 FAIL
strcat(200000) 1.48186 FAIL 2.06003 1.00000 FAIL
jumpapaluza(50, 50) 11.67746 1.09240 1.48192 1.00000 FAIL
bitapaluza1(21) 63.33357 1.00000 21.39655 1.46851 FAIL
bitapaluza2(18) 21.83346 1.00000 6.19715 2.59416 FAIL

Futuros desenvolvimentos

Atualmente o Recki-CT não oferece suporte para todos os métodos construtores de PHP. Isso vai ser melhorado com o tempo.

Neste momento, o último passo para compilar para o código da máquina é feito no runtime. Então, Anthony planeja levar esse passo para o passo de compilação em si, e ter o código de máquina resultante também em cache.

Outra possibilidade interessante é aproveitar o suporte embutido para a Árvore Sintática Abstrata que está sendo incluído no PHP 7, graças à contribuição de Nikita Popov ao desenvolvimento dessa versão da linguagem. Isso faria o passo de compilação em si mais rápido, já que o suporte para a Árvore Sintática Abstrata no Recki-CT está sendo implementada no código PHP.

Conclusão

2014 tem sido um ano fantástico para o PHP em termos de desenvolvimentos importantes que trazem uma performance melhor para a linguagem.

Primeiramente, o Facebook HHVM e a linguagem Hack trouxeram características incríveis e melhorias na velocidade. Depois, tivemos a reação da Zend para trazer mais melhorias de velocidade no PHP 7.

Mais recentemente, o Recki-CT, assim como o Hippy-VM, que é outra implementação super rápida da linguagem PHP usando a tecnologia PyPy.

Recki-CT vem trazer aspectos adicionais interessantes quando comparado a outras soluções. Um deles é que você pode usá-lo para compilar apenas partes do seu código PHP. Isso significa que você não precisa compilar toda a sua aplicação PHP para se aproveitar das suas capacidades de melhorar a velocidade de partes da sua aplicação PHP que estiverem lentas.

Outro aspecto é que, como a maioria disso é feito em PHP, ele pode rodar com a Zend Engine baseada em PHP, ou mesmo com HHVM ou Hippy-VM, contanto que a extensão JIT-FU esteja disponível. Então, não é realmente uma alternativa para outras engines PHP, mas algo que pode melhorar ainda mais a performance do seu código PHP.

Um aspecto que não está relacionado à performance do PHP é o fato de que compilando o código para o código de máquina a solução pode ser utilizada eventualmente para enviar código compilado sem abrir mão do código-fonte.

Apesar de essa não ter sido a intenção original do projeto, esse aspecto pode interessar a desenvolvedores que querem vender o seu trabalho em PHP sem abrir mão do código-fonte.

Todos esses aspectos fazem o futuro do PHP ainda mais promissor e animador do que já é. Parabéns ao Anthony Ferrara e a todos os outros que têm feito melhorias tão grandiosas no PHP.

O que você acha? Você acredita que algo mais é importante para tornar o PHP ainda mais bacana? Deixe um comentário com suas ideias!

***

Artigo traduzido pela Redação iMasters com autorização do autor. Publicado originalmente em http://www.phpclasses.org/blog/post/247-PHP-Developer-working-for-Google-Launches-New-PHP-Compiler.html