Categorias

Rust é o futuro da infraestrutura JavaScript

O Rust surgiu nos laboratórios das equipes de pesquisa da Fundação Mozilla para ser uma linguagem “segura, concorrente e prática”. Em um tempo de vida relativamente curto,  pouco mais de dez anos de estrada, conquistou espaços antes inimagináveis e se estabeleceu no coração dos desenvolvedores como uma solução bastante popular.

Por sua vez, o JavaScript é veterano com décadas de existência e múltiplas adaptações em seu caminho, que tornaram a linguagem inicialmente simples em uma solução bastante robusta e ainda mais popular. Aparentemente, JavaScript e Rust não poderiam ser mais distintas, mas isso está mudando.

Lee Robinson é um Engenheiro da Computação de formação que atua como desenvolvedor, escritor e palestrante em conferências e encontros sobre desenvolvimento de front-end, design e recrutamento. Em um artigo publicado na internet, ele explica como e por que o Rust está penetrando em cenários antes dominados pelo JavaScript.

Com sua autorização, traduzimos e reproduzimos o artigo na íntegra:

Rust é uma linguagem de programação rápida, confiável e com uso eficiente de memória. Foi eleita a linguagem de programação mais amada por seis anos consecutivos (pesquisa). Criado pela Mozilla, agora é usado no FacebookAppleAmazonMicrosoft e Google para infraestrutura de sistemas, criptografia, virtualização e mais programação de baixo nível.

Por que o Rust está sendo usado agora para substituir partes do ecossistema da web JavaScript, como minificação (Terser), transpilação (Babel), formatação (Prettier), agrupamento (webpack), linting (ESLint) e muito mais?

O que é Rust?

O Rust ajuda os desenvolvedores a escrever software rápido com uso eficiente de memória. É uma substituição moderna para linguagens como C ++ ou C com foco na segurança do código e sintaxe concisa.

Rust é bem diferente de JavaScript. JavaScript tenta encontrar variáveis ​​ou objetos que não estão em uso e os apaga automaticamente da memória. Isso é chamado de coleta de lixo. A linguagem evita que o desenvolvedor pense sobre o gerenciamento manual de memória.

Com o Rust, os desenvolvedores têm mais controle sobre a alocação de memória, sem ser tão doloroso quanto o C ++.

Rust usa uma abordagem de gerenciamento de memória relativamente única que incorpora a ideia de “propriedade” da memória. Basicamente, o Rust rastreia quem pode ler e escrever na memória. Ele sabe quando o programa está usando memória e imediatamente libera a memória quando ela não é mais necessária. Ele impõe regras de memória em tempo de compilação, tornando virtualmente impossível ter bugs de memória em tempo de execução. Você não precisa controlar manualmente a memória. O compilador cuida disso. – Discord

Adoção

Além das empresas mencionadas acima, o Rust também está sendo usado para bibliotecas de código aberto populares, como:

Rust tem sido um multiplicador de força para nossa equipe, e apostar nele foi uma das melhores decisões que tomamos. Mais do que desempenho, sua ergonomia e foco na correção nos ajudaram a domar a complexidade da sincronização. Podemos codificar invariantes complexos sobre nosso sistema no sistema de tipos e fazer com que o compilador os verifique para nós. – Dropbox

Do JavaScript para o Rust

JavaScript é a linguagem de programação mais amplamente usada, operando em todos os dispositivos com um navegador da web. Nos últimos dez anos, um enorme ecossistema foi construído em torno do JavaScript:

  • Webpack: os desenvolvedores queriam agrupar vários arquivos JavaScript em um.
  • Babel: os desenvolvedores queriam escrever JavaScript moderno e, ao mesmo tempo, dar suporte a navegadores mais antigos.
  • Terser: os desenvolvedores queriam gerar os menores tamanhos de arquivo possíveis.
  • Prettier: os desenvolvedores queriam um formatador de código opinativo que simplesmente funcionasse.
  • ESLint: os desenvolvedores queriam encontrar problemas com seu código antes da implantação.

Milhões de linhas de código foram escritas e ainda mais bugs foram corrigidos para criar a base para o envio de aplicativos da web de hoje. Todas essas ferramentas são escritas com JavaScript ou TypeScript. Isso funcionou bem, mas atingimos o pico de otimização com JS. Isso inspirou uma nova classe de ferramentas, projetadas para melhorar drasticamente o desempenho da construção para a web.

SWC

SWC, criado em 2017, é uma plataforma extensível baseada em Rust para a próxima geração de ferramentas de desenvolvimento rápido. É usado por ferramentas como Next.js, Parcel e Deno, bem como por empresas como Vercel, ByteDance, Tencent, Shopify e outras.

O SWC pode ser usado para compilação, minimização, agrupamento e muito mais – e foi projetado para ser estendido. É algo que você pode chamar para realizar transformações de código (internas ou personalizadas). A execução dessas transformações acontece por meio de ferramentas de nível superior, como Next.js.

Deno

Deno, criado em 2018, é um runtime simples, moderno e seguro para JavaScript e TypeScript que usa V8 e é construído com Rust. É uma tentativa de substituir o Node.js, escrito pelos criadores originais do Node.js. Embora tenha sido criado em 2018, ele não atingiu a v1.0 até maio de 2020.

O linter, formatador de código e gerador de documentos de Deno são construídos usando SWC.

esbuild

O esbuild, criado em janeiro de 2020, é um empacotador e minificador JavaScript 10-100x mais rápido do que as ferramentas existentes, escrito em Go.

Estou tentando criar uma ferramenta de construção que A) funcione bem para um determinado ponto ideal de casos de uso (agrupando JavaScript, TypeScript e talvez CSS) e B) redefina as expectativas da comunidade sobre o que significa para uma ferramenta de construção de JavaScript para ser rápido. Nossas ferramentas atuais são muito lentas na minha opinião. – Evan, criador do esbuild (fonte)

Construir ferramentas JavaScript com linguagens de programação de sistemas, como Go e Rust, era um nicho considerável até o lançamento do esbuild. Na minha opinião, o esbuild despertou um interesse maior em tentar tornar as ferramentas de desenvolvedor mais rápidas. Evan escolheu usar Go:

A versão Rust provavelmente poderia ser feita para funcionar a uma velocidade equivalente com bastante esforço. Mas em um nível alto, Go foi muito mais agradável de se trabalhar. Este é um projeto paralelo e deve ser divertido para mim trabalhar nele. – Evan, criador do esbuild (fonte)

Alguns argumentam que Rust poderia ter um desempenho melhor, mas ambos poderiam atingir o objetivo original de Evan de influenciar a comunidade:

Mesmo com a otimização básica, o Rust foi capaz de superar a versão super ajustada à mão do Go. Este é um grande testemunho de como é fácil escrever programas eficientes com Rust em comparação com o mergulho profundo que tivemos que fazer com Go. – Discord

Rome

Rome, criado em agosto de 2020, é um linter, compilador, bundler, executor de teste e muito mais para JavaScript, TypeScript, HTML, JSON, Markdown e CSS. Eles visam substituir e unificar todo o conjunto de ferramentas de desenvolvimento de front-end. É criado por Sebastian, que também criou Babel.

Por que reescrever tudo, então?

Fazer as modificações necessárias no Babel para permitir que ele seja uma base confiável para outras ferramentas exigiria mudanças em absolutamente tudo. A arquitetura está ligada às escolhas de design iniciais que fiz em 2014, quando estava aprendendo sobre analisadores, ASTs e compiladores. – Sebastian (fonte)

Rome é atualmente escrito em TypeScript e roda em Node.js. Mas agora eles estão trabalhando na reescrita em Rust usando o analisador RSLint e seu próprio sistema de visitante para passagem de AST.

NAPI

A integração do Rust com Node.js é melhor do que outras linguagens de baixo nível.

napi-rs permite que você crie complementos Node.js pré-compilados com o Rust. Ele fornece uma solução pronta para uso para compilação cruzada e publicação de binários nativos para o NPM, sem a necessidade de scripts node-gyp” ou “postinstall”.

Você pode construir um módulo Rust que pode ser chamado diretamente do Node.js, sem a necessidade de criar um processo filho como esbuild.

Rust + Web Assembly

WebAssembly (WASM) é uma linguagem portátil de baixo nível para a qual o Rust pode compilar. Ele é executado no navegador, é interoperável com JavaScript e é compatível com todos os principais navegadores modernos.

WASM é definitivamente muito mais rápido do que JS, mas não exatamente a velocidade nativa. Em nossos testes, o Parcel é executado de 10 a 20 vezes mais lento quando compilado para WASM do que com binários nativos. – Devon Govett

Embora o WASM ainda não seja a solução perfeita, ele pode ajudar os desenvolvedores a criar experiências na web extremamente rápidas. A equipe da Rust está comprometida com uma implementação de WASM de alta qualidade e de ponta. Para desenvolvedores, isso significa que você pode ter as vantagens de desempenho do Rust (vs. Go) enquanto ainda compila para a web (usando WASM).

Algumas bibliotecas e estruturas iniciais neste espaço:

Essas estruturas da web baseadas em Rust que compilam para WASM não estão tentando substituir o JavaScript, mas trabalham junto com ele. Embora ainda não tenhamos chegado lá, é interessante ver o Rust vindo atrás da web em ambos os lados: tornando as ferramentas JavaScript existentes mais rápidas e ideias pensando adiante para compilar para WASM.

É Rust daqui pra frente até o fim.

Por que não Rust?

Rust tem uma curva de aprendizado íngreme. É um nível de abstração mais baixo do que a maioria dos desenvolvedores da web está acostumada.

Uma vez que você está no código nativo (por meio de Rust, Go, Zig ou outras linguagens de baixo nível), os algoritmos e estruturas de dados são mais importantes do que a escolha da linguagem. Não é uma bala de prata.

Rust faz você pensar sobre as dimensões do seu código que são tremendamente importantes para a programação de sistemas. Faz você pensar sobre como a memória é compartilhada ou copiada. Faz você pensar em casos reais, mas improváveis, e garantir que eles sejam resolvidos. Isso ajuda você a escrever um código que é incrivelmente eficiente em todas as maneiras possíveis. – Tom MacWright (fonte)

Além disso, o uso de Rust na comunidade da web ainda é um nicho. Não atingiu uma adoção crítica. Mesmo que aprender o Rust para ferramentas JavaScript seja uma barreira à entrada, é interessante que os desenvolvedores prefiram uma ferramenta mais rápida e com a qual seja mais difícil contribuir. O software rápido vence.

Atualmente, é difícil encontrar uma biblioteca ou estrutura Rust para seus serviços favoritos (coisas como trabalhar com autenticação, bancos de dados, pagamentos e muito mais). Eu realmente acho que assim que Rust e WASM alcançarem uma adoção crítica, isso se resolverá por si mesmo. Mas ainda não. Precisamos de ferramentas JavaScript existentes para nos ajudar a preencher a lacuna e adotar melhorias de desempenho de forma incremental.

O futuro das ferramentas JavaScript

Acredito que Rust é o futuro das ferramentas JavaScript. Next.js 12 iniciou nossa transição para substituir totalmente Babel (transpilação) e Terser (minificação) por SWC e Rust. Por quê?

  • Extensibilidade: o SWC pode ser usado como uma caixa dentro do Next.js, sem a necessidade de dar um fork na biblioteca ou contornar as restrições de design.
  • Desempenho: Conseguimos alcançar um Fast Refresh ~ 3x mais rápido e compilações ~ 5x mais rápido em Next.js mudando para SWC, com mais espaço para otimização ainda em andamento.
  • WebAssembly: O suporte de Rust para WASM é essencial para suportar todas as plataformas possíveis e levar o desenvolvimento Next.js para todos os lugares.
  • Comunidade: A comunidade e o ecossistema de Rust são incríveis e só estão crescendo.

Não é apenas o Next.js adotando o SWC:

  • No Deno, o linter, formatador de código e gerador de documentos são construídos usando SWC.
  • dprint, construído em SWC, é uma substituição de formatação de código 30x mais rápida para o Prettier.
  • Parcel melhorou o desempenho geral de construção em até 10x com SWC.

O Parcel usa o SWC como uma biblioteca. Antes, usamos o analisador de Babel e as transformações personalizadas escritas em JS. Agora, usamos o analisador SWC e as transformações personalizadas no Rust. Isso inclui uma implementação de içamento de escopo completo, coleção de dependências e muito mais. É semelhante em escopo a como o Deno foi construído com base no SWC. – Devon Govett

É o começo da Rust – algumas peças importantes ainda estão sendo descobertas:

  • Plug-ins: escrever plug-ins em Rust não é tão acessível para muitos desenvolvedores de JavaScript. Ao mesmo tempo, expor um sistema de plug-in em JavaScript pode anular os ganhos de desempenho. Uma solução definitiva ainda não surgiu. Idealmente, o futuro combina JavaScript e Rust. Se você deseja escrever um plug-in com JavaScript, é possível compensar pela velocidade. Precisa de mais desempenho? Use a API do plugin Rust.
  • Empacotamento: uma área interessante de desenvolvimento é o swcpack, que é o substituto do SWC para o Webpack. Ainda está em desenvolvimento, mas pode ser muito promissor.
  • WebAssembly: Como mencionado acima, a perspectiva de escrever Rust e compilar para WASM é atraente, mas ainda há trabalho a ser feito.

Independentemente disso, estou confiante de que o Rust continuará a ter um grande impacto no ecossistema JavaScript nos próximos 1 a 2 anos e no futuro. Imagine um mundo onde todas as ferramentas de construção usadas em Next.js são escritas em Rust, oferecendo a você um desempenho ideal. Então, Next.js poderia ser distribuído como um binário estático que você baixaria do NPM.

Esse é o mundo em que quero viver (e me desenvolver).”

Publicado originalmente como “Rust Is The Future of JavaScript Infrastructure” em 11 de novembro de 2021. Traduzido e republicado com autorização do autor.