Escrito por naruse em 25/12/2024
Traduzido por nbluis
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:
- Realiza a resolução de nomes IPv6 e IPv4 simultaneamente
- Tenta conexões com os endereços IP resolvidos, priorizando IPv6, com tentativas paralelas escalonadas em intervalos de 250ms
- 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 ambienteRUBY_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 emgc/gc_impl.h
. O garbage collector embutido agora também pode ser compilado como uma biblioteca usandomake modular-gc MODULAR_GC=default
e habilitado usando a variável de ambienteRUBY_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 ambienteRUBY_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 configurandoWarning[: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 quandoWarning[: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 deThread::Backtrace::Location
.Kernel#raise
,Thread#raise
eFiber#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. Quandofalse
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.[]
eRactor.[]=
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 levantaTypeError
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
- Adicionada a opção
- 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
- Adicionada uma configuração
-
JSON
- Melhorias de desempenho do
JSON.parse
cerca de 1,5 vezes mais rápido que json-2.7.x.
- Melhorias de desempenho do
-
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]
- O argumento de palavra-chave
-
win32/sspi.rb
- Esta biblioteca agora foi extraída do repositório Ruby para ruby/net-http-sspi. [Feature #20775]
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 deThread::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}'
- Chaves de símbolo são exibidas usando a sintaxe moderna de chave de símbolo:
-
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[]=
eDidYouMean::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.
- Removidas as seguintes constantes obsoletas:
-
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
erb_newobj_of
(e macros correspondentesRB_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
ouInteger#+
agora emite um aviso de classe de desempenho (-W:performance
ouWarning[: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.