Ruby 4.0.0
(ruby-lang.org)- 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.xze.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
- É ativado ao definir a variável de ambiente
- 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
- Requer Rust 1.85.0 ou superior e é ativado com a opção
- 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_procfacilita 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
*nilnão chama maisnil.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#rfindeArray#findforam 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:emproduce - 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,yieldetc. - File: suporte a
File::Stat#birthtimeno Linux - IO: timeout com
Float::INFINITYpermitido e remoção da criação de processos baseada em pipe - Kernel: possibilidade de customizar
#inspecte remoção da criação de pipe emKernel#open - Math: adição de
log1peexpm1 - 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 deRactor.yieldetc. - Set: promovido a classe core, com simplificação do formato de
inspect - Socket: adição do argumento
open_timeoute 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,fiddleetc. - 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.0etc. - Atualizações de gems empacotadas:
minitest 6.0.0,rake 13.3.1,rbs 3.10.0,debug 1.11.1etc. - 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._id2reffoi descontinuado- Remoção de
Process::Status#&e#>> - Simplificação da saída de frames internos no backtrace
- O backtrace de
ArgumentErrorpassa 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
Seta classe core,SortedSetpassa a exigir instalação de gem separada - Remoção da configuração automática do cabeçalho
Content-TypeemNet::HTTP
Atualizações da API C
rb_thread_fd_closedesativado e uso derb_io_closerecomendadorb_thread_call_with_gvlpassa a funcionar independentemente da presença de GVL- Adição de API C para Set (
rb_set_new,rb_set_add,rb_set_deleteetc.)
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,hashe 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
--zjitouRubyVM::ZJIT.enable - YJIT: mudanças nas opções de estatísticas, com adição de
mem_size:ecall_threshold: - RJIT:
--rjitremovido 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.xzeruby-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