Foi lançado Ruby 3.2.0, uma linguagem de programação dinâmica orientada a objetos que é altamente eficiente no desenvolvimento de programas e incorpora os melhores recursos de Perl, Java, Python, Smalltalk, Eiffel, Ada e Lisp. O código do projeto é distribuído sob as licenças BSD ("BSDL de 2 cláusulas") e "Ruby", que se refere à versão mais recente da licença GPL e é totalmente compatível com GPLv3.
Principais melhorias:
- Adicionada uma porta inicial de um interpretador CRuby que compila para código intermediário WebAssembly para execução em um navegador da web ou em tempos de execução independentes, como wasmtime. Para interação direta com o sistema operacional quando executado separadamente, a API WASI (WebAssembly System Interface) é usada. Entre outras coisas, é fornecida uma ligação VFS sobre WASI, que permite empacotar todo o aplicativo na linguagem Ruby em uma visualização na forma de um único arquivo wasm. A execução em um navegador pode ser usada para criar tutoriais e serviços da web de demonstração, como TryRuby. No estágio atual de desenvolvimento, a porta passa com êxito nos conjuntos de testes básicos e de inicialização, que não usam a API Thread. A porta também não oferece suporte a fibra, exceções ou coleta de lixo.
- O compilador JIT em processo YJIT, criado pelos desenvolvedores da plataforma de e-commerce Shopify como parte de uma iniciativa para melhorar o desempenho de programas Ruby que utilizam o framework Rails e chamam muitos métodos, foi anunciado como estável e pronto para uso em produção. A principal diferença em relação ao compilador JIT MJIT, usado anteriormente, que processa métodos inteiros e utiliza um compilador C externo, é que o YJIT utiliza o Lazy Basic Block Versioning (LBBV) e contém um compilador JIT integrado. Graças ao LBBV, o JIT compila inicialmente apenas o início de um método e compila o restante posteriormente, após os tipos das variáveis e argumentos utilizados serem determinados durante a execução. O YJIT está disponível para as arquiteturas x86-64 e arm64/aarch64. Linux, MacOS, BSD e outras plataformas UNIX.
Ao contrário do CRuby, o código YJIT é escrito em Rust e requer o compilador Rustc 1.58.0+ para compilar, portanto, a compilação YJIT está desabilitada por padrão e é opcional. Ao usar o YJIT, foi registrado um aumento de 41% no desempenho ao executar o teste yjit-bench em comparação com o uso da interpretação.

- Adicionada proteção adicional contra ataques que causam negação de serviço ao processar dados externos em expressões regulares (ReDoS) ineficientes e de longa duração. Algoritmo de correspondência significativamente melhorado, que utiliza a técnica de memorização. Por exemplo, o tempo de execução da expressão '/^a*b?a*$/ =~ "a" * 50000 + "x"' foi reduzido de 10 para 0.003 segundos. O preço da otimização é um aumento no consumo de memória, cujo consumo é cerca de 10 vezes maior que o tamanho dos dados de entrada. A segunda medida de segurança é a capacidade de definir um tempo limite (por exemplo, “Regexp.timeout = 1.0”), para o qual a expressão regular deve ter tempo para ser processada.
- O modo sintaxe_suggest está incluído para ajudar a diagnosticar as causas de erros associados a uma instrução de fechamento "final" ausente ou redundante. `End' incomparável, palavra-chave ausente (`do', `def`, `if`, etc.)? 1 classe Cachorro> 2 defbark> 3 final 4 final
- Adicionada a capacidade de marcar argumentos em caso de erros relacionados a tipos e argumentos ao modo de localização de erros, por exemplo: test.rb:2:in `+': nil não pode ser coagido para Integer (TypeError) sum = ary[ 0] + ary [1] ^^^^^^
- Adicionada nova sintaxe para redirecionar para outros métodos de conjunto de argumentos: def foo(*) bar(*) end def baz(**) quux(**) end
- Ruby_vm/mjit/compiler proposto - uma variante do antigo compilador MJIT JIT, reescrito na linguagem Ruby. Garantiu a execução do MJIT em um processo separado, em vez da execução no thread de trabalho do MJIT.
- No Bundler 2.4, o tratamento de dependências usa o localizador de versão PubGrub, também usado pelo gerenciador de pacotes pub para Dart. O algoritmo Molinillo usado anteriormente continua a ser usado no RubyGems, mas também será substituído pelo PubGrub no futuro.
- Versões atualizadas de módulos gem de biblioteca padrão e integrados.
Fonte: opennet.ru
