A linguagem de programação Ruby continua sua tradição de entregar grandes atualizações no dia de Natal, anunciando o lançamento do Ruby 4.0.0, que introduz dois novos recursos experimentais enormes: o mecanismo de isolamento conhecido como Ruby Box e o compilador just-in-time de próxima geração, ZJIT.
A maior mudança arquitetônica que chega com a versão 4.0 é definitivamente o Ruby Box. Este novo recurso experimental possui separação estrita para definições carregadas na caixa. Se você já enfrentou problemas complexos de dependência ou teve um patch de macaco desonesto que atrapalhou seu ambiente global, você sabe como o isolamento pode ser crucial. As definições carregadas dentro de uma Ruby Box são isoladas de outras caixas, o que significa que podem separar alterações globais ou de variáveis de classe, definições de classe e até mesmo bibliotecas nativas carregadas.
A equipe Ruby sugere o uso de caixas para executar casos de teste onde você pode precisar de patches sem se preocupar com o vazamento dessas alterações e afetar outros testes. Você também pode usar esse recurso como base para implementar estratégias de implantação azul-verde em um servidor de aplicativos, executando caixas de aplicativos da web paralelas em um único processo Ruby. Esta é uma API poderosa de baixo nível, e espero ver ferramentas de gerenciamento de pacotes de alto nível usá-la fortemente no futuro.
No que diz respeito ao desempenho, os desenvolvedores já estão olhando além do YJIT com a introdução do ZJIT, um novo compilador just-in-time. ZJIT foi projetado para ser o próximo passo no desempenho de Ruby, visando um teto de desempenho muito mais alto usando coisas como SSA IR e unidades de compilação maiores. A equipe também está tentando tornar o ZJIT um compilador de métodos mais tradicional, o que deve encorajar mais contribuições externas de especialistas em otimização.
No momento, o ZJIT ainda é altamente experimental. Embora seja mensuravelmente mais rápido que o interpretador Ruby padrão, ele ainda não alcançou o YJIT. Eu diria que o maior problema é que você ainda não deve confiar nele para cargas de trabalho de produção, mas certamente pode experimentá-lo agora se tiver o Rust 1.85.0 ou mais recente instalado para construí-lo. Teremos que esperar até o Ruby 4.1 para ver se o ZJIT realmente se tornará o campeão de desempenho que a equipe almeja.
Além dos novos recursos experimentais, estamos vendo melhorias significativas na estabilidade e no desempenho do Ractor, o mecanismo do Ruby para execução paralela. O Ractor foi introduzido como experimental no Ruby 3.0, e a equipe está trabalhando para remover essa tag no próximo ano. A atualização inclui importantes otimizações internas projetadas para melhorar o paralelismo. Os Ractors agora compartilham menos dados internos, o que reduz a contenção do cache da CPU ao executar vários threads simultaneamente.
O mecanismo de sincronização do Ractor também foi atualizado com a introdução de uma nova classe chamada Ractor::Port. Esta classe fornece métodos explícitos como receive e send para comunicação entre Ractors. Esta adição resulta na remoção de métodos mais antigos e menos intuitivos, como Ractor.yield e Ractor#take. Os desenvolvedores também obtêm novos métodos como Ractor#join e Ractor#valueque refletem o comportamento familiar dos threads ao aguardar o término de um Ractor. O novo Ractor.shareable_proc também facilita muito a passagem de lógica entre unidades de execução paralelas.
Ruby 4.0 também traz diversas atualizações de qualidade de vida para a linguagem principal e classes integradas. Por exemplo, a linguagem agora permitirá operadores binários lógicos como && ou || para continuar a linha anterior se aparecerem no início de uma nova linha, semelhante ao funcionamento do operador ponto fluente.
Um recurso que eu realmente gosto é a melhoria ErrorHighlight. Quando um ArgumentError é gerado, o depurador agora exibe trechos de código para a chamada e a definição do método. Esse recurso é excelente para depuração, permitindo que você veja instantaneamente onde o número errado de argumentos foi passado e onde o método foi definido, tudo em um trecho claro.
As classes principais também receberam uma atualização com foco na privacidade. O Kernel#inspect método agora verifica um método privado chamado instance_variables_to_inspect. Além disso, dois componentes comumente usados, Pathname e Setestão sendo promovidas de gemas padrão para classes principais.
Esta é uma grande atualização, mas é o que se espera do 4.0; você pode obter o tarball ou zip mais recente no site oficial hoje mesmo.
Fonte: Rubi


