Escrito por naruse em 12/12/2024
Traduzido por nbluis
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 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] -
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
- Final do log também disponível em tempo de execução via
- 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 deThread::Backtrace::Location
.Kernel#raise
,Thread#raise
eFiber#raise
também aceitam este novo formato. [Feature #13557]
-
Range
Range#size
agora levantaTypeError
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 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>'
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 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.