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++.
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/ouBox
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
eCxxString
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 erust::String::c_str
pode terminar uma string com NUL).