Ruby 3.3 lançado
(ruby-lang.org)- O YJIT melhora significativamente o desempenho e o uso de memória em relação ao Ruby 3.2, ficando mais de 3 vezes mais rápido que o interpretador no Optcarrot
- O Code GC do YJIT passa a vir desativado por padrão, e
--yjit-exec-mem-sizefunciona como um limite rígido que interrompe a compilação de novo código - A adição de
RubyVM::YJIT.enablepermite ativar o YJIT em tempo de execução sem alterar argumentos de linha de comando nem variáveis de ambiente - O parser Prism foi adicionado como gem padrão, com disponibilidade das APIs
Prism.parse(source),Prism.parse_comments(source)ePrism.parse_success?(source) - É possível testar o compilador Prism com
ruby --parser=prismouRUBYOPT="--parser=prism", mas essa flag é destinada apenas a depuração - O gerador de parser foi trocado de Bison para Lrama, e o parser interno do Lrama foi substituído por um parser LR gerado pelo Racc para facilitar a manutenção
- O compilador JIT pure-Ruby RJIT substitui o MJIT, mas oferece suporte apenas à arquitetura x86-64 no Unix e permanece restrito a fins experimentais
- Foi introduzido o escalonador de threads M:N, em que N threads nativas gerenciam M threads Ruby, mas ele vem desativado por padrão no Ractor principal porque pode quebrar a compatibilidade com extensões C
- O uso de
itchamado sem argumentos e em blocos sem parâmetros ordinários entra em descontinuação (deprecation) e, no Ruby 3.4, passará a se referir ao primeiro parâmetro do bloco Regexp::newagora aceita no máximo 2 argumentos, em vez da chamada com 3 argumentos que foi descontinuada no Ruby 3.2ext/readlinefoi aposentado e, daqui para frente, passará a depender dereline, uma implementação em Ruby puro compatível com a API deext/readline- Se
ext/readlinefor necessário, ele pode ser instalado a partir do rubygems.org comgem install readline-ext, sem exigir mais a instalação de bibliotecas comolibreadlineoulibedit - RubyGems e Bundler passam a emitir aviso ao usar
requirecom alguns gems sem adicioná-los ao Gemfile ou ao gemspec, e esses gems passarão a ser bundled gems em versões futuras do Ruby - Ao usar o gem bootsnap, esse aviso é suprimido e, por causa de uma limitação desta versão, recomenda-se executar a aplicação pelo menos uma vez com a variável de ambiente
DISABLE_BOOTSNAP=1 - O
prism 0.19.0foi adicionado como gem padrão, e oracc 1.7.3foi promovido de default gem para bundled gem
1 comentários
Opiniões no Hacker News
Vejo que, com o Ruby 3.3, Ruby voltou com força. Uma linguagem focada na felicidade do desenvolvedor, mas que era ridicularizada por ser lenta, agora já não é mais lenta
YJIT é uma tecnologia impressionante e, junto com object shapes e várias otimizações de garbage collection, o Ruby está ficando bem rápido. Grandes usuários de Ruby, como a Shopify, também ativaram o YJIT em produção com pré-releases do 3.3 e relataram melhorias de desempenho de dois dígitos percentuais
Pessoalmente, estou muito empolgado com o Ruby e seu futuro, e quero trabalhar com o Ruby 3.3 e aplicá-lo em sites de clientes em produção
https://railsatscale.com/2023-09-18-ruby-3-3-s-yjit-runs-sho...
Também o usei como código de integração entre um armazenamento de registros DNS baseado em Redis e o PowerDNS; a pilha inteira processava 500 milhões de consultas por mês em 14 VPS pequenas sem nem aparecer no htop. Não usei PowerDNS por desempenho, mas porque geralmente não é uma boa ideia implementar por conta própria coisas expostas à internet pública, como criptografia, HTTP e DNS
A ironia da web hoje é que webapps feitos com o “lento” Ruby e renderização no servidor carregam páginas mais rápido do que bancos de dados de consistência eventual realmente lentos e webapps de frontend inchados. Na web moderna, vemos spinners de carregamento com frequência demais até para fazer coisas triviais
Ao abrir o link, vi que era uma melhoria na casa dos 10%. Não acho que isso vá mudar muito a percepção de que Ruby é aproximadamente 50 a 200 vezes mais lento que linguagens “rápidas” como Rust, Java, Go e C++
Ruby 3.3 parece ser uma das versões mais importantes e ricas em recursos do Ruby na última década. Eu não esperava que ele lançasse um JIT pronto para produção antes do Python, e ainda há Prism, Lrama e IRB
Mas o que não está sendo tratado o suficiente são Ractor, o agendador de threads M:N, Fiber e Async. Especialmente no contexto do Rails, gostaria de ouvir opiniões sobre se alguém está usando esses recursos em produção
Ainda assim, Ractor merece mais destaque. É um recurso enorme
Provavelmente existem milhares de soluções privadas e customizadas dentro de empresas, baseadas em RabbitMQ ou Redis
Todo ano, no Natal, como um relógio, o Ruby Lang lança uma nova versão
Disponível no Heroku: https://devcenter.heroku.com/changelog-items/2772
Parece bom. O novo IRB é um interpretador Ruby interativo com autocompletar e depuração melhores. A maior parte das mudanças do Ruby 3.3 parece resultar em melhorias nas ferramentas de desenvolvedor
A API da linguagem se mantém, em geral, consistente com versões anteriores. Escrevi um guia de atualização para o Ruby 3.3 com observações para vários gerenciadores de versão: https://mac.install.guide/ruby/update.html
Tenho curiosidade, mas não sei qual gerenciador de versões recomendar. Antes, eu recomendava asdf, frum e chruby
Resolução de nomes, como
Socket.getaddrinfo, agora pode ser interrompida, e dizem que, sempre que a resolução de nomes é necessária, um worker pthread é criado e executagetaddrinfo(3)dentro deleFico curioso se runtimes de outras linguagens fazem algo parecido. Criar uma thread parece pesado demais, mas talvez na prática não seja um grande problema. Mesmo pelos benchmarks deles, o overhead é pequeno, mas não é zero
10000.times { Addrinfo.getaddrinfo("www.ruby-lang.org", 80) }levava 2,3 s antes do patch e 3,0 s depois;100.times { URI.open("https://www.ruby-lang.org").read }levava 3,36 s antes do patch e 3,40 s depoisTive a impressão de que, em vez de reimplementar as mesmas operações com a “cor” async, como no Python, tudo foi movido para assíncrono por padrão, mas não sei se isso está correto
Se você já conhece Python e NodeJS, pode se perguntar se vale a pena aprender Ruby. Ruby parece interessante, mas difícil
Se você é proficiente em Node e Python, deve ser bem fácil de aprender. A desvantagem é que, se você já conhece essas linguagens, ela não vai lhe trazer algo fundamentalmente novo. A vantagem é principalmente estética: Ruby oferece e incentiva formas realmente bonitas de expressar código, e é divertido experimentar isso
Trabalho principalmente em bases de código TypeScript, mas frequentemente recorro a Ruby quando lido com dados de log ou texto semiestruturado, ou quando faço reescritas baseadas em regex em vários arquivos. Ruby é muito divertida, provavelmente a linguagem mais divertida entre as que usei regularmente, então isso por si só já é uma recompensa
O maior exemplo é que Ruby realmente adora blocos. Eles estão por toda a biblioteca padrão, há muito açúcar sintático, e existem incontáveis DSLs centradas em blocos. Recursos funcionais padrão também estão há muito tempo na biblioteca padrão, permitindo escrever em estilo funcional de forma fluida e legível
Em Python, tecnicamente quase tudo isso também é possível, mas parece muito mais estranho de escrever e ler. Python tem lambdas, mas dá a impressão de não gostar muito delas para além de usos triviais; em vez disso, funções são usadas como valores de primeira classe em todos os lugares
Pessoas mais antenadas em tecnologia já estavam migrando para desenvolvimento orientado a APIs com node.js e AngularJS, muito mais rápido do que o que era feito com RoR. Em 2013, o modo padrão do RoR ainda era monolítico, e ele parecia envelhecido por não conseguir fazer bem a transição para o novo paradigma de separação entre frontend e backend
O motivo de eu falar tanto de um framework feito em Ruby, e não do Ruby em si, é que ainda hoje acredito que 95% do desenvolvimento em Ruby seja de aplicações Rails. Ruby ficou famoso principalmente por causa do Ruby on Rails e, se o RoR estiver em declínio, Ruby provavelmente seguirá o mesmo caminho, como Perl, até se reduzir a uma pequena comunidade entusiasta
Olhando apenas para a linguagem em si, não vejo motivo para escolher Ruby em vez de Python ou TypeScript. Nem como linguagem nem como plataforma, Ruby parece fazer algo melhor do que concorrentes que já estão mais bem estabelecidos
Prism é interessante. Fico curioso se há ferramentas de análise de código Ruby que o utilizem. Eu estava procurando uma forma de analisar o código da empresa
Dizem que a variável de ambiente
RUBY_MAX_CPU=ndefine no máximo N, ou seja, o número máximo de threads nativas, e que o valor padrão é 8Acho que o padrão deveria ser o número de núcleos lógicos, como no Tokio do Rust ou em muitos runtimes M:N
init()oumain()No Ruby 4.0, gostaria que fosse permitido um import explícito em vez da forma atual, implícita, de trazer gems para o namespace global
Também há uma discussão sobre o recurso ainda especulativo “namespace on read”: https://bugs.ruby-lang.org/issues/19744
O fato de o namespace global suportar exatamente uma versão de cada gem também incentiva uma cultura saudável que valoriza ABI estável e períodos de depreciação. Comparado a certos ecossistemas de linguagem, é um ambiente dos sonhos
Ou talvez eu esteja dizendo algo completamente errado
https://youtu.be/4MM5b2F9zrM?si=UT3aUbD6p_uBZehS&t=2347