Ruby 3.4.0 rc1 Lançado

Estamos felizes em anunciar o lançamento do Ruby 3.4.0-rc1.

Prism

Alterado o parser padrão de parse.y para Prism. [Feature #20564]

GC Modular

  • Implementações alternativas de garbage collector (GC) podem ser carregadas dinamicamente através do recurso de garbage collector modular. Para habilitar este recurso, configure o Ruby com --with-modular-gc no momento da compilação. Bibliotecas de GC podem ser carregadas em tempo de execução usando a variável de ambiente RUBY_GC_LIBRARY. [Feature #20351]

  • O garbage collector embutido do Ruby foi dividido em um arquivo separado em gc/default/default.c e interage com o Ruby usando uma API definida em gc/gc_impl.h. O garbage collector embutido agora também pode ser compilado como uma biblioteca usando make modular-gc MODULAR_GC=default e habilitado usando a variável de ambiente RUBY_GC_LIBRARY=default. [Feature #20470]

  • Uma biblioteca experimental de GC é fornecida com base no MMTk. Esta biblioteca de GC pode ser compilada usando make modular-gc MODULAR_GC=mmtk e habilitada usando a variável de ambiente RUBY_GC_LIBRARY=mmtk. Isso requer a ferramenta Rust na máquina de compilação. [Feature #20860]

Mudanças na linguagem

  • Literais de string em arquivos sem um comentário frozen_string_literal agora emitem um aviso de descontinuação quando são mutados. Esses avisos podem ser habilitados com -W:deprecated ou configurando Warning[:deprecated] = true. Para desativar essa mudança, você pode executar o Ruby com o argumento de linha de comando --disable-frozen-string-literal. [Feature #20205]

  • it foi adicionado para referenciar um parâmetro de bloco. [Feature #18980]

  • O splatting de palavra-chave nil ao chamar métodos agora é suportado. **nil é tratado de maneira semelhante a **{}, não passando palavras-chave, e não chamando nenhum método de conversão. [Bug #20064]

  • Passagem de bloco não é mais permitida em índice. [Bug #19918]

  • Argumentos de palavra-chave não são mais permitidos em índice. [Bug #20218]

YJIT

TL;DR:

  • Melhor desempenho na maioria dos benchmarks em plataformas x86-64 e arm64.
  • Uso reduzido de memória de metadados de compilação
  • Várias correções de bugs. YJIT agora é ainda mais robusto e melhor testado.

Novos recursos:

  • Adiciona limite de memória unificado via opção de linha de comando --yjit-mem-size (padrão 128MiB) que rastreia o uso total de memória do YJIT e é mais intuitivo do que o antigo --yjit-exec-mem-size.
  • Mais estatísticas agora sempre disponíveis via RubyVM::YJIT.runtime_stats
  • Adiciona log de compilação para rastrear o que é compilado via --yjit-log
    • Final do log também disponível em tempo de execução via RubyVM::YJIT.log
  • Adiciona suporte para constantes compartilháveis em modo multi-ractor
  • Agora pode rastrear saídas contadas com --yjit-trace-exits=COUNTER

Novas otimizações:

  • Contexto comprimido reduz a memória necessária para armazenar metadados do YJIT
  • Alocador aprimorado com capacidade de alocar registradores para variáveis locais
  • Quando o YJIT está habilitado, use mais primitivas Core escritas em Ruby:
    • Array#each, Array#select, Array#map reescritos em Ruby para melhor desempenho [Feature #20182].
  • Capacidade de inline de métodos pequenos/triviais, como:
    • Métodos vazios
    • Métodos que retornam uma constante
    • Métodos que retornam self
    • Métodos que retornam diretamente um argumento
  • Geração de código especializada para muitos mais métodos em tempo de execução
  • Otimiza String#getbyte, String#setbyte e outros métodos de string
  • Otimiza operações bitwise para acelerar a manipulação de bits/bytes de baixo nível
  • Várias outras otimizações incrementais

Atualizações das classes principais

Nota: Estamos listando apenas atualizações notáveis das classes principais.

  • Exception

    • Exception#set_backtrace agora aceita um array de Thread::Backtrace::Location. Kernel#raise, Thread#raise e Fiber#raise também aceitam este novo formato. [Feature #13557]
  • Range

    • Range#size agora levanta TypeError se o intervalo não for iterável. [Misc #18984]

Problemas de compatibilidade

Nota: Excluindo correções de bugs.

  • As mensagens de erro e exibições de backtrace foram alteradas.
    • Usa uma aspa simples em vez de um acento grave como uma aspa de abertura. [Feature #16495]
    • Exibe o nome de classe antes de um nome de método (somente quando a classe tiver um nome permanente). [Feature #19117]
    • Kernel#caller, métodos de Thread::Backtrace::Location, etc. também foram alterados de acordo.
    Antes:
    test.rb:1:in `foo': undefined method `time' for an instance of Integer
            from test.rb:2:in `<main>'
    
    Agora:
    test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer
            from test.rb:2:in '<main>'
    

Atualizações da C API

  • rb_newobj e rb_newobj_of (e macros correspondentes RB_NEWOBJ, RB_NEWOBJ_OF, NEWOBJ, NEWOBJ_OF) foram removidos. [Feature #20265]
  • Removida a função obsoleta rb_gc_force_recycle. [Feature #18290]

Mudanças diversas

  • Passar um bloco para um método que não usa o bloco passado mostrará um aviso no modo verbose (-w). [Feature #15554]

  • Redefinir alguns métodos principais que são especialmente otimizados pelo interpretador e JIT como String.freeze ou Integer#+ agora emite um aviso de classe de desempenho (-W:performance ou Warning[:performance] = true). [Feature #20429]

Veja lançamentos no GitHub como Logger ou changelog para detalhes das gems padrão ou gems incluídas.

Veja NEWS ou logs de commits para mais detalhes.

Com essas mudanças, 4820 arquivos alterados, 196907 inserções(+), 253488 deleções(-) desde Ruby 3.3.0!

Download

  • https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0-rc1.tar.gz

    TAMANHO: 23055998
    SHA1: 216e3085ab8b886b9f74943ee5b62bd2e3d86671
    SHA256: 1f3187d3366e90af6d760994f8bfe1fe8999a8ba3553ea4dcfae63e548236e2a
    SHA512: 0b0420a39c0bf3b38600d4e28805a581c4b5a6cf2abe41be8c8164276a8044a19e676de74eea5dd5b4d7d667d821a6144119795fea510fd4ba6e34865a2ae172
    
  • https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0-rc1.tar.xz

    TAMANHO: 17116016
    SHA1: 1424671cdc9c4bfe3778ac159d917c8bfe6107bd
    SHA256: 9c54225747f7a786727aa6213503083d5d8ff7097505d4b7456ff60880ee4a17
    SHA512: 5b92a2b5829ab23735617945839e45df984b319b8932e790a8e0c6f681b9bd74249511a76345516cc216c002ed7887bdd27151501491d5ecedc20acd3fb57cc5
    
  • https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0-rc1.zip

    TAMANHO: 28323595
    SHA1: 4ae8ce4b15ccc3f0c6f42e408c44aa287a1ccc14
    SHA256: 653162a2db627e8e5feee22a00b20acf215509d88b06ffb281bc8788ed12c74c
    SHA512: c6c6b9a0e61308e3f3303cd148613feabb2ee12d8e2fefc1f4aa1403237310f7c9be5e2031248ea89ff01cdc0bca1a66ff60f9f1f19ed9c9fccef3d7a3bbebb8
    

O que é Ruby

Ruby foi desenvolvido pela primeira vez por Matz (Yukihiro Matsumoto) em 1993, e agora é desenvolvido como Open Source. Ele roda em várias plataformas e é usado em todo o mundo, especialmente para desenvolvimento web.