Publicado em: 20/4/2016
O Ruby 2.5 foi lançado em dezembro de 2017 e pudemos ver algumas das features novas nesse post. Mesmo sendo uma versão muito recente, já temos testes para a futura versão do Ruby, a 2.6, que está no modo preview.
O Ruby 2.6 já tem algumas features novas e pontos de melhoria com relação a versões anteriores, mas neste post vou focar em um único ponto de melhoria que, em minha opinião, além de ser uma grande feature, revolucionará a performance de suas APPs.
A versão traz uma nova forma de rodar o Ruby, utilizando JIT (Just-in-time) compiler.
O JIT do Ruby é diferente de outros compiladores. Ele funcionará de maneira unidirecional e, desse modo, o compilador irá transcrever código C. Esse código será transformado em um código nativo através do processo de compilação comum do compilador C.
Para entendermos melhor o que é o JIT, precisamos falar um pouco sobre linguagens compiladas e interpretadas. Normalmente quando temos nosso primeiro contato com programação (que, na maioria das vezes, acontece no meio acadêmico) é com linguagens que trabalham com compiladores. Podemos tomar como exemplo o C e C++.
Nessas linguagens você escreve o código e, antes de rodar o programa, precisa compilá-lo, transformando-o em linguagem de máquina. Os programas escritos nessas linguagens tendem a performar melhor do que em linguagens que não usam compilador.
Já nos casos do Ruby, Python e PHP o código é interpretado. Em geral, linguagens interpretadas carregam todo o seu interpretador na memória e, conforme vão executando, traduzem as instruções de sua linguagem para instruções em linguagem de máquina. Sendo assim, essas linguagens utilizam a forma menos eficiente de execução de um programa, pois os traduzem o tempo todo.
O Java e C# buscaram um meio termo entre as linguagens compiladas e interpretadas e pré-compilam os arquivos .class e os assemblies respectivamente. Nesses casos o arquivo é compilado para um bytecode intermediário e na hora da execução, esse bytecode é transformado em linguagem de máquina; tornando o tempo de resposta muito mais rápido do que as linguagens interpretadas.
O JIT se caixa no terceiro caso. Ele acontece em tempo de execução, mas ao invés de traduzir o código nativo da linguagem em todas as requisições, ele traduz as instruções do bytecode para linguagem de máquina e faz isso uma vez só.
Nesse primeiro momento, o principal propósito do JIT no Ruby é de ser testado e validar se realmente funcionará nas plataforma, além de medir os riscos de segurança que ele pode causar.
Ficou curioso? Quer testar esse cara? Então dê uma olhada nesse repositório do Github; fiz um Dockerfile com o Ruby 2.6 e o 2.5 para que você possa testar ambas versões e brincar um pouco.
Em outros posts falarei sobre outras novidades do Ruby 2.6 e você já vai ter como testes.
Fique ligado para a nova era da super performance do Ruby. Ficou com alguma dúvida? Deixe um comentário =)
Publicado originalmente em Blog Locaweb