Interoperabilidade com C++

A comunidade Rust oferece vårias opçÔes para interoperabilidade C++/Rust, com novas ferramentas sendo desenvolvidas o tempo todo. No momento, o Chromium usa uma ferramenta chamada CXX.

VocĂȘ descreve toda a fronteira da linguagem em uma linguagem de definição de interface (que se parece muito com Rust) e, em seguida, as ferramentas CXX geram declaraçÔes para funçÔes e tipos em Rust e C++.

Overview diagram of cxx, showing that the same interface definition is used to create both C++ and Rust side code which then communicate via a lowest common denominator C API

Veja o tutorial CXX para um exemplo completo de como usĂĄ-lo.

Fale com o auxĂ­lio do diagrama. Explique que, nos bastidores, isso estĂĄ fazendo exatamente o mesmo que vocĂȘ fez anteriormente. Aponte que automatizar o processo tem os seguintes benefĂ­cios:

  • A ferramenta garante que os lados C++ e Rust correspondam (por exemplo, vocĂȘ obterĂĄ erros de compilação se o #[cxx::bridge] nĂŁo corresponder Ă s definiçÔes C++ ou Rust reais, mas com bindings manuais fora de sincronia, vocĂȘ obteria Comportamento Indefinido)
  • A ferramenta automatiza a geração de thunks FFI (pequenas funçÔes livres compatĂ­veis com C-ABI) para recursos nĂŁo-C (por exemplo, permitindo chamadas FFI para mĂ©todos Rust ou C++; bindings manuais exigiriam a autoria de tais funçÔes livres de alto nĂ­vel manualmente)
  • A ferramenta e a biblioteca podem lidar com um conjunto de tipos principais - por exemplo:
    • &[T] pode ser passado pela fronteira FFI, embora nĂŁo garanta nenhum layout de memĂłria ou ABI especĂ­fico. Com bindings manuais, std::span<T> / &[T] devem ser manualmente destruturados e reconstruĂ­dos a partir de um ponteiro e comprimento - isso Ă© propenso a erros, dado que cada linguagem representa fatias vazias de maneira ligeiramente diferente)
    • Ponteiros inteligentes como std::unique_ptr<T>, std::shared_ptr<T> e/ou Box sĂŁo suportados nativamente. Com bindings manuais, seria necessĂĄrio passar ponteiros brutos (raw pointers) compatĂ­veis com C-ABI, o que aumentaria os riscos de tempo de vida e segurança de memĂłria.
    • Os tipos rust::String e CxxString entendem e mantĂȘm as diferenças na representação de strings entre as linguagens (por exemplo, rust::String::lossy pode construir uma string Rust a partir de uma entrada nĂŁo UTF8 e rust::String::c_str pode terminar uma string com NUL).