Ruby 3.4.0 Lançado

Estamos felizes em anunciar o lançamento do Ruby 3.4.0. Ruby 3.4 adiciona a referência de parâmetro de bloco it, altera o Prism como parser padrão, adiciona suporte ao Happy Eyeballs Versão 2 na biblioteca de socket, melhora o YJIT, adiciona GC Modular, e muito mais.

it é introduzido

it foi adicionado para referenciar um parâmetro de bloco sem nome de variável. [Feature #18980]

ary = ["foo", "bar", "baz"]

p ary.map { it.upcase } #=> ["FOO", "BAR", "BAZ"]

it se comporta de maneira muito semelhante a _1. Quando a intenção é usar apenas _1 em um bloco, a possibilidade de outros parâmetros numerados como _2 aparecer impõe uma carga cognitiva extra aos leitores. Então it foi introduzido como um alias prático. Use it em casos simples onde it representa itself, como em blocos de uma linha.

Prism agora é o parser padrão

Alteração do parser padrão de parse.y para Prism. [Feature #20564]

Esta é uma melhoria interna e deve haver pouca mudança visível para o usuário. Se você notar algum problema de compatibilidade, por favor, reporte para nós.

Para usar o parser convencional, use o argumento de linha de comando --parser=parse.y.

A biblioteca de socket agora possui Happy Eyeballs Versão 2 (RFC 8305)

A biblioteca de socket agora possui Happy Eyeballs Version 2 (RFC 8305), a versão padronizada mais recente de uma abordagem amplamente adotada para melhor conectividade em muitas linguagens de programação, em TCPSocket.new (TCPSocket.open) e Socket.tcp. Esta melhoria permite que o Ruby forneça conexões de rede eficientes e confiáveis, adaptadas aos ambientes modernos da internet.

Até o Ruby 3.3, esses métodos realizavam a resolução de nomes e tentativas de conexão de forma serial. Com este algoritmo, eles agora operam da seguinte forma:

  1. Realiza a resolução de nomes IPv6 e IPv4 simultaneamente
  2. Tenta conexões com os endereços IP resolvidos, priorizando IPv6, com tentativas paralelas escalonadas em intervalos de 250ms
  3. Retorna a primeira conexão bem-sucedida enquanto cancela quaisquer outras

Isso garante atrasos mínimos de conexão, mesmo se um protocolo específico ou endereço IP estiver atrasado ou indisponível. Este recurso é habilitado por padrão, portanto, configuração adicional não é necessária para usá-lo. Para desativá-lo globalmente, defina a variável de ambiente RUBY_TCP_NO_FAST_FALLBACK=1 ou chame Socket.tcp_fast_fallback=false. Ou para desativá-lo em um método específico, use o argumento fast_fallback: false.

YJIT

TL;DR

  • Melhor desempenho na maioria dos benchmarks em plataformas x86-64 e arm64.
  • Uso reduzido de memória através de metadados comprimidos e um limite de memória unificado.
  • Várias correções de bugs: YJIT agora é mais robusto e testado exaustivamente.

Novos recursos

  • Opções de linha de comando
    • --yjit-mem-size introduz um limite de memória unificado (padrão 128MiB) para rastrear o uso total de memória do YJIT, fornecendo uma alternativa mais intuitiva à antiga opção --yjit-exec-mem-size.
    • --yjit-log habilita um log de compilação para rastrear o que é compilado.
  • API Ruby
    • RubyVM::YJIT.log fornece acesso ao final do log de compilação em tempo de execução.
  • Estatísticas do YJIT
    • RubyVM::YJIT.runtime_stats agora sempre fornece estatísticas adicionais sobre invalidação, inlining e codificação de metadados.

Novas otimizações

  • Contexto comprimido reduz a memória necessária para armazenar metadados do YJIT
  • Alocar registradores para variáveis locais e argumentos de métodos Ruby
  • Quando o YJIT está habilitado, usa 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
  • Suporte a constantes compartilháveis em modo multi-ractor
  • Várias outras otimizações incrementais

Modular GC

  • 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]

  • 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]

  • O nome de nível superior ::Ruby agora está reservado, e a definição será avisada quando Warning[:deprecated]. [Feature #20884]

Atualizações de 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]
  • GC

    • GC.config adicionado para permitir a configuração de variáveis no Garbage Collector. [Feature #20443]

    • Parâmetro de configuração do GC rgengc_allow_full_mark introduzido. Quando false o GC marcará apenas objetos jovens. O padrão é true. [Feature #20443]

  • Ractor

    • require em Ractor é permitido. O processo de requisição será executado no Ractor principal. Ractor._require(feature) é adicionado para executar o processo de requisição no Ractor principal. [Feature #20627]

    • Ractor.main? é adicionado. [Feature #20627]

    • Ractor.[] e Ractor.[]= são adicionados para acessar o armazenamento local do Ractor atual. [Feature #20715]

    • Ractor.store_if_absent(key){ init } é adicionado para inicializar variáveis locais do ractor de forma segura para threads. [Feature #20875]

  • Range

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

Atualizações da Biblioteca Padrão

Nota: Estamos listando apenas atualizações notáveis das bibliotecas padrão.

  • RubyGems
    • Adicionada a opção --attestation ao gem push. Ela permite armazenar a assinatura no sigstore.dev
  • Bundler
    • Adicionada uma configuração lockfile_checksums para incluir checksums em novos arquivos lockfile.
    • Adicionado bundle lock --add-checksums para adicionar checksums a um arquivo lockfile existente
  • JSON

    • Melhorias de desempenho do JSON.parse cerca de 1,5 vezes mais rápido que json-2.7.x.
  • Tempfile

    • O argumento de palavra-chave anonymous: true foi implementado para Tempfile.create. Tempfile.create(anonymous: true) remove o arquivo temporário criado imediatamente. Assim, as aplicações não precisam remover o arquivo. [Feature #20497]
  • win32/sspi.rb

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>'
    
  • A renderização de Hash#inspect foi alterada. [Bug #20433]

    • Chaves de símbolo são exibidas usando a sintaxe moderna de chave de símbolo: "{user: 1}"
    • Outras chaves agora têm espaços ao redor de =>: '{"user" => 1}', enquanto anteriormente não tinham: '{"user"=>1}'
  • Kernel#Float() agora aceita uma string decimal com a parte decimal omitida. [Feature #20705]

    Float("1.")    #=> 1.0 (anteriormente, um ArgumentError era levantado)
    Float("1.E-1") #=> 0.1 (anteriormente, um ArgumentError era levantado)
    
  • String#to_f agora aceita uma string decimal com a parte decimal omitida. Note que o resultado muda quando um expoente é especificado. [Feature #20705]

    "1.".to_f    #=> 1.0
    "1.E-1".to_f #=> 0.1 (anteriormente, 1.0 era retornado)
    
  • Refinement#refined_class foi removido. [Feature #19714]

Problemas de compatibilidade da biblioteca padrão

  • DidYouMean

    • DidYouMean::SPELL_CHECKERS[]= e DidYouMean::SPELL_CHECKERS.merge! foram removidos.
  • Net::HTTP

    • Removidas as seguintes constantes obsoletas:
      • Net::HTTP::ProxyMod
      • Net::NetPrivate::HTTPRequest
      • Net::HTTPInformationCode
      • Net::HTTPSuccessCode
      • Net::HTTPRedirectionCode
      • Net::HTTPRetriableCode
      • Net::HTTPClientErrorCode
      • Net::HTTPFatalErrorCode
      • Net::HTTPServerErrorCode
      • Net::HTTPResponseReceiver
      • Net::HTTPResponceReceiver

      Essas constantes foram obsoletas desde 2012.

  • Timeout

    • Rejeita valores negativos para Timeout.timeout. [Bug #20795]
  • URI

    • Alterado o parser padrão para compatível com RFC 3986 em vez de RFC 2396. [Bug #19266]

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 NEWS ou logs de commits para mais detalhes.

Com essas mudanças, 4942 arquivos alterados, 202244 inserções(+), 255528 deleções(-) desde Ruby 3.3.0!

Feliz Natal, Boas Festas e aproveite a programação com Ruby 3.4!

Download

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

    TAMANHO: 23153022
    SHA1: 8ccb561848a7c460ae08e1a120a47c4a88a79335
    SHA256: 068c8523442174bd3400e786f4a6952352c82b1b9f6210fd17fb4823086d3379
    SHA512: bc70ecba27d1cdea00879f03487cad137a7d9ab2ad376cfb7a65780ad14da637fa3944eeeede2c04ab31eeafb970c64ccfeeb854c99c1093937ecc1165731562
    
  • https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.tar.xz

    TAMANHO: 17215572
    SHA1: eb25447cc404e8d2e177c62550d0224ebd410e68
    SHA256: 0081930db22121eb997207f56c0e22720d4f5d21264b5907693f516c32f233ca
    SHA512: 776a2cf3e9ccc77c27500240f168aa3e996b0c7c1ee1ef5a7afc291a06c118444016fde38b5b139c0b800496b8eb1b5456562d833f0edc0658917164763b1af7
    
  • https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.zip

    TAMANHO: 28310193
    SHA1: 26254ca5d3decc28a4e5faec255995265e5270b5
    SHA256: c120228038af04554f6363e716b0a32cbf53cf63c6adf9f2c22a24f43dc8b555
    SHA512: 4d535ed10db76a6aa74f8a025df319deb28483a7a781c24045906ee7663f1cff9d9f9e71dbc993c9e050113a34b37c7fa2143c355a0a6e1e1029bf2c92213ecc
    

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.