Tema: rust
-
Escolher entre Go e Rust para um novo serviço: um procedimento de decisão sem benchmarks
Como decidir entre Go e Rust para um serviço com base nas propriedades documentadas das linguagens e nas restrições da equipe, e não em folclore de benchmarks: modelo de gerenciamento de memória, estilo de erros e concorrência, perfil da carga, bibliotecas com as quais o serviço precisa se comunicar e quem fará a manutenção daqui a dois anos.
-
Campos packed em Rust: evite criar uma referência desalinhada antes de converter para ponteiro bruto
Entenda por que uma referência temporária já pode violar os requisitos de alinhamento e prefira, sempre que possível, a decodificação explícita de bytes.
-
Pin em Rust: preservar o endereço do valor apontado sem congelar a variável do ponteiro
Diagnostique erros de pinning identificando o valor sensível ao endereço e a operação que poderia movê-lo.
-
Cargo, crates e editions: como um projeto Rust é compilado e versionado
O Cargo compila um crate a partir do Cargo.toml, resolve dependências com intervalos compatíveis com SemVer e grava o resultado no Cargo.lock, podendo incluir duas versões major incompatíveis de um mesmo crate em um único build. As editions são versões da linguagem definidas por crate, de adesão opcional e interoperáveis, de modo que atualizar a edition de um crate nunca obriga seus dependentes a fazer o mesmo.
-
CString em uma fronteira FFI: diferencie ponteiro emprestado de transferência de propriedade
Mantenha o dono do CString vivo durante chamadas com empréstimo e use a conversão para ponteiro bruto apenas sob um contrato explícito de devolução.
-
Ownership e borrowing em Rust: visão geral
Todo valor em Rust tem exatamente um dono e é descartado quando o dono sai de escopo; passar um valor o move, a menos que o tipo seja Copy, e as referências o emprestam sob a regra de uma referência mutável ou qualquer número de referências compartilhadas por vez. O borrow checker aplica isso em tempo de compilação, e é daí que vem a segurança de memória sem garbage collector.
-
Layout em FFI com Rust: repr(C) numa struct externa não corrige os campos aninhados
Revise todos os campos que atravessam uma fronteira de ABI C e verifique o layout em cada alvo suportado.
-
Propriedade de recursos em FFI com Rust: associe o construtor externo ao seu destrutor real
Torne explícitos a alocação, a liberação e o tempo de vida dos callbacks em um wrapper Rust enxuto em torno de recursos externos.
-
Quanto mais tempo um engenheiro vindo de uma linguagem dinâmica leva para ser produtivo em Rust do que em Go, e quais conceitos explicam a diferença?
Pergunta em aberto: Go costuma ser descrita como rápida de aprender e Rust como exigente, e a pesquisa State of Rust 2024 indica que cerca de 31% dos não usuários citam a dificuldade percebida. Poucas fontes, porém, medem o tempo até a primeira alteração integrada, até a revisão de código sem supervisão ou quais conceitos (ownership, lifetimes, async, traits) consomem esse tempo para quem vem de Python, Ruby ou JavaScript.
-
Erros de Send no Tokio: examine o estado mantido através do await
Corrija uma future criada com spawn examinando o que sobrevive à suspensão, em vez de adicionar implementações unsafe de traits.
-
Traits do Rust e interfaces do Go: impl explícito versus satisfação implícita
As duas linguagens abstraem comportamento sem hierarquias de classes, mas em Go um tipo satisfaz uma interface apenas por ter os métodos, enquanto em Rust um tipo implementa um trait somente por meio de um bloco impl explícito, sujeito à orphan rule. Rust ainda separa generics em tempo de compilação (monomorfizados) de trait objects `dyn` (despacho dinâmico), uma escolha que em Go é feita pela própria linguagem.
-
Result, Option e o operador ?: tratamento de erros em Rust
Rust não tem exceções nem null: operações que podem falhar retornam Result<T, E>, valores ausentes são Option<T>, e ambos são enums que o compilador obriga a tratar com match. O operador ? retorna Err ou None antecipadamente e converte tipos de erro via From; ignorar um Result gera um aviso do compilador, pois o tipo é marcado com #[must_use].
-
Unwinding em FFI no Rust: defina explicitamente a fronteira para panics e exceções
Separe retornos de erro comuns, panics do Rust e exceções estrangeiras antes de escolher a ABI da fronteira.
-
Para engenheiros novos em Rust, o tempo de espera do build supera os erros do borrow checker como principal atrito registrado nos dois primeiros meses
Hipótese: os erros do borrow checker dominam o atrito que engenheiros novos em Rust registram nas primeiras semanas, mas sua participação cai rápido, enquanto as anotações sobre espera por builds (apesar do cargo check, que a documentação do Cargo descreve como um comando que pula a geração de código e, por isso, é mais rápido que o cargo build) crescem e se tornam a maior categoria em até dois meses; propõe-se um teste com diário de atrito, sem alegar resultado.
Legível por máquina: JSON