6 pontos por GN⁺ 2025-12-26 | 1 comentários | Compartilhar no WhatsApp
  • 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

 
GN⁺ 2025-12-26
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

    • Eu sou um rubysta hardcore, e o ruby-lsp é realmente excelente. Mas acho difícil dizer que o RBS está virando padrão. Na prática, a adoção ainda é muito baixa. O rbs-inline é nível projeto pessoal e tem pouca atividade. Ainda assim, fico feliz em ver a tentativa daquele desenvolvedor de integrar isso diretamente ao RBS. Pessoalmente, não acho que um sistema de tipos baseado em comentários vá se disseminar amplamente
    • Ruby é simplesmente inferior ao Python. Já existe um sistema quase igual que é mais rápido e tem uma comunidade maior, então não há muito motivo para usar Ruby
  • 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 && condition2 em várias linhas

    • Seria ótimo se um dia cada Ractor rodasse dentro do seu próprio ruby::box, e cada box pudesse executar seu próprio GC de forma independente. Aí daria para ter paralelismo de verdade, como no BEAM. A latência p99 também cairia. Claro que haveria custo de cópia ao compartilhar objetos, mas na maioria dos apps isso provavelmente seria irrelevante
    • Eu já escrevia if condition1 && condition2 em várias linhas desde muito tempo atrás, e sempre funcionou. Não entendi o que mudou nessa nova sintaxe
  • Fico 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

    • Tudo o que você mencionou são bibliotecas do ecossistema Python, não vantagens da linguagem em si. Muitos desenvolvedores estão migrando para Python mais pelas bibliotecas do que pela linguagem. Como resultado, o Python está sendo puxado em várias direções e acaba enfrentando o problema de ter sua filosofia de linguagem cada vez mais difusa. Já o Ruby reúne pessoas que gostam da linguagem em si, então preserva melhor sua essência
    • Eu também troquei Ruby por Kotlin este ano. A insegurança de não ter tipagem estática era grande demais. Kotlin tem bom desempenho, e gastar um pouco mais de memória hoje já não é um problema tão sério. Ainda gosto de Ruby, mas só uso para scripts simples
    • O suporte de IDE no Python é muito melhor, e só isso já fez valer a mudança para mim. A dinamicidade excessiva do Ruby não combina muito com o meu gosto
    • Tentei usar Langchain, mas muda rápido demais e a documentação não acompanha nada. Quando você pesquisa, só encontra vários textos do tipo “por que a documentação do Langchain é tão ruim?”. Então migrei para o Haystack e fiquei bem mais satisfeito
    • Eu também adoro pandas, numpy e pytorch, mas ainda gosto muito de criar apps web full stack com Rails. Por isso eu realmente adoro o pyCall
  • 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

  • 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

    • Interessante, será que você poderia mostrar um exemplo?
  • 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

    • Seria muito bom mesmo ter caminhos relativos no stack trace
  • 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

    • Na minha opinião, programar no Windows é pedir para sofrer. Se não for uma linguagem da Microsoft, Linux ou macOS são muito melhores
    • A experiência do desenvolvedor (DX) em Ruby fica abaixo do esperado, e no Windows é ainda pior. Felizmente houve apresentações reconhecendo esse problema e tentando melhorá-lo
    • Você já tentou usar WSL2?