- Ruby 4.0.0 foi lançado, introduzindo o novo Ruby Box e o ZJIT, além de incluir diversas melhorias de desempenho e da linguagem
- Ruby Box é um recurso experimental que permite execução isolada de classes, módulos, variáveis globais e definições de bibliotecas nativas/Ruby
- ZJIT é um compilador JIT de próxima geração baseado em Rust, estruturalmente mais expansível que o YJIT e que facilita contribuições externas
- O modelo de execução paralela Ractor foi aprimorado em estabilidade e desempenho, com previsão de sair do estado experimental no futuro
- Atualizações amplas em classes centrais, biblioteca padrão, API C, GC e JIT reforçam o desempenho e a escalabilidade do ecossistema Ruby
Visão geral do Ruby 4.0
- Ruby 4.0.0 é uma grande atualização centrada em Ruby Box e ZJIT
- Inclui melhorias em várias áreas, como execução paralela, sintaxe da linguagem, biblioteca padrão, GC e JIT
- O download é oferecido nos formatos
.tar.gz, .tar.xz e .zip
Ruby Box
- Ruby Box é um recurso experimental que fornece isolamento de definições
- É ativado ao definir a variável de ambiente
RUBY_BOX=1, e sua classe é Ruby::Box
- As definições carregadas dentro de uma box ficam isoladas do exterior, de modo que monkey patch, variáveis globais/de classe, definições de classes/módulos e alterações em bibliotecas não afetam outras boxes
- Principais exemplos de uso
- Execução isolada entre casos de teste
- Execução paralela de aplicações web para deploy blue-green
- Execução paralela para validar atualizações de dependências
- No futuro, deverá servir como API base para implementar uma “package API” de alto nível
ZJIT
- ZJIT é um novo compilador JIT desenvolvido como a próxima geração do YJIT
- Requer Rust 1.85.0 ou superior e é ativado com a opção
--zjit
- Suporta unidades de compilação maiores com base em SSA IR e tem uma estrutura que incentiva contribuições externas
- No momento, é mais rápido que o interpretador, mas mais lento que o YJIT
- O uso em produção não é recomendado, e melhorias de desempenho estão previstas para o Ruby 4.1
Melhorias no Ractor
- Adição da classe Ractor::Port para resolver problemas de envio e recebimento de mensagens
Ractor.shareable_proc facilita o compartilhamento de objetos Proc entre Ractors
- Melhorias nas estruturas internas de dados reduzem a contenção do lock global e aumentam o paralelismo
- O status experimental do Ractor deve ser removido no próximo ano
Mudanças na linguagem
*nil não chama mais nil.to_a (mesmo comportamento de **nil)
- Operadores lógicos (
||, &&, and, or) passam a oferecer suporte à sintaxe de continuação de linha (dot chaining)
- Melhorias na legibilidade e consistência do código
Atualizações nas classes centrais
- Array:
Array#rfind e Array#find foram adicionados para oferecer busca eficiente
- Binding: exclusão de parâmetros numerados e adição de métodos relacionados a
implicit_parameters
- Enumerator: adição do argumento nomeado
size: em produce
- ErrorHighlight: ao ocorrer
ArgumentError, exibe snippets de código do chamador e da definição
- Fiber/Fiber::Scheduler: adição de
raise(cause:), fiber_interrupt, yield etc.
- File: suporte a
File::Stat#birthtime no Linux
- IO: timeout com
Float::INFINITY permitido e remoção da criação de processos baseada em pipe
- Kernel: possibilidade de customizar
#inspect e remoção da criação de pipe em Kernel#open
- Math: adição de
log1p e expm1
- Pathname: promovido de gem padrão para classe core
- Proc: formato de saída de parâmetros anônimos foi unificado
- Ractor: estrutura de comunicação alterada para
Ractor::Port, com remoção de Ractor.yield etc.
- Set: promovido a classe core, com simplificação do formato de
inspect
- Socket: adição do argumento
open_timeout e padronização das exceções de timeout
- String: suporte a Unicode 17.0.0, Emoji 17.0 e expansão dos métodos da família
strip
- Thread: suporte ao argumento
raise(cause:)
Atualizações da biblioteca padrão (Stdlib)
- Promovidos a gems padrão:
ostruct, pstore, benchmark, logger, rdoc, win32ole, irb, reline, fiddle etc.
- Nova gem padrão:
win32-registry 0.1.2
- Atualizações de gems padrão:
RubyGems 4.0.3, bundler 4.0.3, openssl 4.0.0, json 2.18.0 etc.
- Atualizações de gems empacotadas:
minitest 6.0.0, rake 13.3.1, rbs 3.10.0, debug 1.11.1 etc.
- Inclui RubyGems/Bundler 4
Suporte de plataforma
- Windows: suporte encerrado para versões anteriores ao MSVC 14.0 (é necessário Visual Studio 2015 ou superior)
Mudanças de compatibilidade
- Remoção de
Ractor.yield, Ractor#take, Ractor#close_incoming, Ractor#close_outgoing
ObjectSpace._id2ref foi descontinuado
- Remoção de
Process::Status#& e #>>
- Simplificação da saída de frames internos no backtrace
- O backtrace de
ArgumentError passa a mostrar o nome da classe/módulo receptor
Compatibilidade da biblioteca padrão
- Biblioteca CGI removida, mantendo apenas
cgi/escape
- Com a promoção de
Set a classe core, SortedSet passa a exigir instalação de gem separada
- Remoção da configuração automática do cabeçalho
Content-Type em Net::HTTP
Atualizações da API C
rb_thread_fd_close desativado e uso de rb_io_close recomendado
rb_thread_call_with_gvl passa a funcionar independentemente da presença de GVL
- Adição de API C para Set (
rb_set_new, rb_set_add, rb_set_delete etc.)
Implementação e melhorias de desempenho
- Maior velocidade nas chamadas de
Class#new, especialmente ao usar argumentos nomeados
- Menor uso de memória com crescimento independente dos pools do heap do GC
- Melhoria na velocidade de sweeping de objetos grandes
- Otimizações no cálculo de
object_id, hash e no acesso a variáveis de instância
- Melhorias de desempenho no Ractor
- Estrutura de hash sem lock, menor contenção de cache e otimização na alocação de objetos
- Correções de bugs relacionados a deadlock, encoding e GC
Sobre o JIT
- ZJIT: JIT baseado em métodos, requer Rust 1.85.0 ou superior, ativado com
--zjit ou RubyVM::ZJIT.enable
- YJIT: mudanças nas opções de estatísticas, com adição de
mem_size: e call_threshold:
- RJIT:
--rjit removido e migração para um repositório separado
Escala das mudanças
- Em comparação com Ruby 3.4.0, houve 3.889 arquivos alterados, 230.769 linhas adicionadas e 297.003 linhas removidas
- Ruby 4.0 é uma major release que fortalece fortemente desempenho, paralelismo e consistência da linguagem
Download
- Disponível nos formatos
ruby-4.0.0.tar.gz, ruby-4.0.0.tar.xz e ruby-4.0.0.zip
- Os hashes SHA1, SHA256 e SHA512 de cada arquivo são informados
Sobre o Ruby
- Ruby é uma linguagem open source criada em 1993 por Yukihiro Matsumoto (Matz)
- Roda em múltiplas plataformas e é usada mundialmente, especialmente na área de desenvolvimento web
1 comentários
Comentários do Hacker News
Feliz aniversário, Ruby!
As pessoas costumam dizer que “abandonaram Ruby porque ela não tem tipagem”, mas agora o RBS está se consolidando como padrão. O Sorbet também dá suporte a isso, e surgiu até uma notação inline para escrever tipos diretamente ao lado do código.
E aquela história de que “Ruby tem um LSP fraco” também já ficou no passado. O ruby-lsp virou o padrão e já suporta “go to definition”. Graças à arquitetura de plugins, várias ferramentas podem reutilizar a mesma AST.
O paralelismo também melhorou bastante graças ao Ractor, e agora, se só refinarem mais um pouco o GC, parece que finalmente vai sair da fase totalmente experimental.
Há também recursos novos como ZJIT e Box, mas ainda não são recomendados em produção. Mesmo assim, está melhorando aos poucos.
Também acho positivo o fato de a sintaxe não mudar de forma brusca
No Natal sempre precisa sair uma nova versão do Ruby.
Desta vez, o ruby::box me pareceu interessante. Ele permite rodar rollout de funcionalidades em duas versões ao mesmo tempo.
E também achei bem legal que agora dá para escrever
if condition1 && condition2em várias linhasif condition1 && condition2em várias linhas desde muito tempo atrás, e sempre funcionou. Não entendi o que mudou nessa nova sintaxeFico feliz com o lançamento do Ruby 4.0, mas em 2025 eu migrei completamente para Python.
O Claude Code converteu automaticamente meus projetos Ruby para Python 100%, e depois disso deixou de haver motivo para eu continuar usando Ruby.
Amei Ruby por mais de 10 anos e até escrevi livros, mas agora o Python venceu por causa do ecossistema com fastapi, pytorch, langchain e streamlit. Ainda assim, continuo achando a sintaxe do Ruby a mais bonita de todas
No Natal, realmente não pode faltar uma nova versão do Ruby. Obrigado ao Matz e à equipe
Há algum material recente que vocês recomendariam para quem quer aprender Ruby em 2025~26? Além da documentação oficial, queria saber se existe algum livro bom
Curso de Ruby on Rails do Pragmatic Studio
Ruby é realmente uma linguagem incrível. Recentemente criei uma camada em cima do Rails que gera uma API a partir de um único arquivo Markdown, e fazer a mesma coisa em Python teria sido muito mais complicado. Em JavaScript teria sido ainda pior. A capacidade de metaprogramação do Ruby é realmente única
Fico feliz que o stack trace interno tenha sido organizado. Tomara que um dia também haja suporte a caminhos relativos. E também é bom ver que o Set finalmente está recebendo o devido tratamento
Hoje trabalho numa empresa que não usa Ruby, mas ainda amo Ruby profundamente. Obrigado por este lançamento, e espero ter a chance de voltar a usá-lo
Ouvi dizer no passado que o recurso Ruby::Box (namespace) causava uma queda séria de desempenho. Queria saber se isso melhorou desta vez
Quero saber se o tooling melhorou. Ainda nunca consegui fazer o LSP funcionar direito no Windows