[Primeiros Passos] Brincando de Rust + Ruby/FFI
O artigo usa um arquivo de atores do IMDb como teste para comparar uma versão em Ruby com uma versão em Rust. Primeiro apresenta o script Ruby, depois o código Rust equivalente, explica Cargo, o arquivo Cargo.toml e a diferença entre bibliotecas, binários e dependências no ecossistema do Rust. Também mostra como expor uma função Rust para consumo via FFI no Ruby.
O texto passa por tipos, generics, String e str, mutabilidade, ownership, borrowing, lifetime, Result, Option, unwrap e match. Na comparação de desempenho, a versão Ruby aparece mais rápida no teste inicial, mas a troca da crate regex por pcre faz a implementação em Rust ficar bem mais veloz. No fechamento, o autor destaca que Rust exige adaptação, é voltado a tarefas de sistema e tem um modelo de memória mais seguro, com Cargo ajudando bastante no fluxo de compilação.
Fichamento#
- Usa um arquivo de atores do IMDb como base para comparar um processamento em Ruby com outro em Rust.
- O exemplo Ruby percorre o arquivo, separa ator e filme, acumula os nomes e devolve a lista final.
- O projeto em Rust usa Cargo, com Cargo.toml para tarefas e dependências, e o autor compara isso ao par Rake/Bundler.
- O código Rust apresentado trabalha com File, BufReader, Regex e um vetor de Strings para chegar ao mesmo resultado.
- O texto explica que Rust tem tipos declarados, inferência de tipos, structs, Traits e Generics.
- Também descreve String e str, além de mutabilidade explícita com let mut.
- O modelo de ownership, borrowing e lifetime aparece como um dos pontos mais difíceis para quem vem de Ruby ou JavaScript.
- O artigo explica que Rust não usa garbage collector e busca desalocação determinística com base em stack e propriedade dos valores.
- unwrap é apresentado como atalho para lidar com Result quando o erro não será tratado.
- match, Result e Option são mostrados como a forma do Rust de lidar com falhas e ausência de valor sem exceptions nem null.
- A seção de FFI mostra uma função extern C com #[no_mangle] que recebe ponteiros, converte strings de C para String e devolve um ponteiro para uso no Ruby.
- Do lado do Ruby, o código usa a gem ffi para ligar na biblioteca compilada em target/release.
- No teste inicial, a versão Ruby aparece um pouco mais rápida que a versão Rust.
- Depois, com um arquivo maior, o Ruby ainda vence no tempo medido pelo autor.
- O texto atribui isso ao custo de I/O, à engine de regex e ao fato de a crate regex ainda ser imatura naquele momento.
- Quando a crate regex é trocada por pcre, a versão Rust passa a ser bem mais rápida que a Ruby.
- A conclusão defende que Rust já era uma linguagem de sistema promissora, mais segura para memória e adequada para bibliotecas nativas e ferramentas de linha de comando.
