Comparando os Ecossistemas do Chromium e do Cargo

A comunidade Rust normalmente usa cargo e bibliotecas de crates.io. O Chromium é compilado usando gn e ninja e um conjunto de dependências selecionadas.

Ao escrever código em Rust, suas escolhas são:

Daqui em diante, estaremos focando em gn e ninja, porque é assim que o código Rust pode ser compilado no navegador Chromium. Ao mesmo tempo, o Cargo é uma parte importante do ecossistema Rust e você deve mantê-lo em sua caixa de ferramentas.

Mini exercício

Dividam-se em pequenos grupos e:

  • Faça um brainstorm de cenários em que o cargo pode oferecer uma vantagem e avalie o perfil de risco desses cenários.
  • Discuta quais ferramentas, bibliotecas e grupos de pessoas precisam ser confiáveis ao usar gn e ninja, cargo offline, etc.

Peça aos alunos que evitem olhar as notas do apresentador antes de completar o exercício. Supondo que as pessoas que fazem o curso estejam fisicamente juntas, peça-lhes que discutam em pequenos grupos de 3-4 pessoas.

Notas/dicas relacionadas à primeira parte do exercício (“cenários em que o Cargo pode oferecer uma vantagem”):

  • É fantástico que, ao escrever uma ferramenta ou prototipar uma parte do Chromium, tenha-se acesso ao rico ecossistema de bibliotecas do crates.io. Há um crate para quase tudo e eles geralmente são bastante agradáveis de usar. (clap para análise de linha de comando, serde para serialização/desserialização para/de vários formatos, itertools para trabalhar com iteradores, etc.).

    • O cargo torna fácil experimentar uma biblioteca (basta adicionar uma única linha ao Cargo.toml e começar a escrever o código)
    • Pode valer a pena comparar como o CPAN ajudou a tornar o perl uma escolha popular. Ou comparar com python + pip.
  • A experiência de desenvolvimento é tornada realmente agradável não apenas pelas ferramentas principais do Rust (por exemplo, usando rustup para alternar para uma versão diferente do rustc ao testar um crate que precisa funcionar no nightly, estável atual e estável antigo), mas também por um ecossistema de ferramentas de terceiros (por exemplo, a Mozilla fornece cargo vet para agilizar e compartilhar auditorias de segurança; o crate criterion fornece uma maneira simplificada de executar benchmarks).

    • O cargo torna fácil adicionar uma ferramenta via cargo install --locked cargo-vet.
    • Pode valer a pena comparar com as extensões do Chrome ou as extensões do VScode.
  • Exemplos amplos e genéricos de projetos em que o cargo pode ser a escolha certa:

    • Talvez surpreendentemente, o Rust está se tornando cada vez mais popular na indústria para escrever ferramentas de linha de comando. A amplitude e a ergonomia das bibliotecas são comparáveis ao Python, enquanto são mais robustas (graças ao rico sistema de tipos) e executam mais rápido (como uma linguagem compilada, em vez de interpretada).
    • Participar do ecossistema Rust requer o uso de ferramentas padrão do Rust, como o Cargo. Bibliotecas que desejam obter contribuições externas e desejam ser usadas fora do Chromium (por exemplo, em ambientes de compilação Bazel ou Android/Soong) devem usar o Cargo.
  • Exemplos de projetos relacionados ao Chromium que são baseados no cargo:

    • serde_json_lenient (experimentado em outras partes do Google, o que resultou em PRs com melhorias de desempenho)
    • Bibliotecas Fontations como font-types
    • Ferramenta gnrt (vamos conhecê-la mais adiante no curso) que depende do clap para análise de linha de comando e do toml para arquivos de configuração.
      • Aviso: um motivo único para usar o cargo foi a indisponibilidade do gn ao compilar e inicializar a biblioteca padrão do Rust ao compilar o conjunto de ferramentas Rust.)
      • run_gnrt.py usa a cópia do cargo e do rustc do Chromium. gnrt depende de bibliotecas de terceiros baixadas da internet, mas run_gnrt.py pede ao cargo que apenas o conteúdo --locked seja permitido via Cargo.lock.)

Os alunos podem identificar os seguintes itens como sendo implicitamente ou explicitamente confiáveis:

  • rustc (o compilador Rust), que por sua vez depende das bibliotecas LLVM, do compilador Clang, das fontes rustc (buscadas no GitHub, revisadas pela equipe do compilador Rust), compilador Rust binário baixado para inicialização
  • rustup (pode valer a pena observar que o rustup é desenvolvido sob a supervisão da organização https://github.com/rust-lang/ - o mesmo que o rustc)
  • cargo, rustfmt, etc.
  • Diversas infraestruturas internas (robôs que compilam rustc, sistema para distribuir o conjunto de ferramentas pré-compilado para engenheiros do Chromium, etc.)
  • Ferramentas do Cargo como cargo audit, cargo vet, etc.
  • Bibliotecas Rust hospedadas em //third_party/rust (auditadas por security@chromium.org)
  • Outras bibliotecas Rust (algumas de nicho, algumas bastante populares e comumente usadas)