Interessante. Eu tive contato com C e C++ na faculdade, mas nunca tive contato com Rust, apesar de ter curiosidade sobre a linguagem.
C/C++ ou Rust com Node.js?
Uma das aplicações do C/C++ que, apesar de eu nunca ter usado, sei que existe, é no Node.js. O Node.js usa o motor V8 para executar código JavaScript, e o V8 é escrito em C++. Encontrei uma publicação no LinkedIn do Erick Wendel e lá ele diz algumas coisas interessantes sobre isso:
Ele usa o motor V8 do chrome para executar código JavaScript, a libuv para trabalhar com funções assíncronas, o event loop e mais.
Só que, o V8 é escrito em C++, a libuv, em C.
Então naturalmente, o Node.js pode ler C/C++ DLLs no runtime e chamar os métodos escritos em C++ direto do JavaScript.
Tá mas e como o Rust entra no Jogo?
Não só para o Rust, mas se quisermos interoperar qualquer outra linguagem, basta nós usarmos as "Foreign Function Interfaces" entre linguagens.
AS FFIs são um mecanismo em que um programa escrito em uma linguagem pode chamar rotinas e funções escritas em outras.
No Rust, podemos usar a biblioteca libc (biblioteca padrão do C), que permite que usamos e retornamos os tipos de dados da linguagem C direto do código Rust.
E nessa publicação, o Erick Wendel mencionou um artigo sobre o desenvolvimento de módulos nativos do Node.js com Rust, onde logo no início, em resumo, está escrito "Use Rust ao invés de C++ para escrever módulos nativos do Node.js".
Como eu já disse, nunca escrevi um módulo nativo, mas acredito que em breve precisarei, então continuei a leitura. O motivo pelo qual o Peter Czibik, autor do artigo, resolveu usar Rust ao invés de C++ foi:
- Atualizações: ele precisava usar alguma biblioteca para tratar URLs, e copiar e colocar código C/C++ da Internet não é uma boa opção porque não há uma maneira fácil de atualizar um enorme bloco de código que está no repositório.
- Facilidade de manutenção / segurança: uma pessoa com pouca experiência em C++ não pode validar se o código está correto, mas eventualmente esse código será executado nos servidores. C++ tem uma alta curva de aprendizado e leva muito tempo para dominar a linguagem.
- Segurança: existe código C++ com falhas, e o Peter prefere evitar isso porque não tem como auditá-lo sozinho. Usar módulos de código aberto bem mantidos dá confiança o suficiente para não precisar se preocupar com segurança.
Ponderações finais
Lendo o artigo, eu entendi que uma integração entre o Rust e o Node.js funciona, mas fiquei em dúvida se os pontos 1 e 3 são realmente bons motivos para não usar C/C++: não existe mesmo uma opção de usar um código C/C++ de terceiros com um gerenciador de pacotes e carregar em tempo de execução?
Encontrei alguns outros artigos que abordam esse assunto:
- Por quê usar WebAssembly e Rust juntos melhora o desempenho do Node.js
- Rust e Node.js: uma combinação perfeita
Essa foi uma leve leitura crítica sobre o que eu descobri porque não tenho conhecimento no assunto, mas foi legal descobrir que dá para usar Rust sem perder muito em desempenho em comparação ao C/C++, e talvez até ganhar em produtividade e segurança. Eu adoraria ler sobre a experiência de alguém com esse assunto, aqui no TabNews.