<!-- verified-against: seed-llvm; examples: docs-examples-test -->

Traduzindo C, Rust e construções Zig para seed

Este é um guia de construção, não um scorecard de linguagem. Traduza primeiro a invariante de propriedade e, em seguida, escolha o menor tipo de semente que a expressa. O compilador LLVM é a autoridade em sintaxe e diagnóstico.

Traduções principais

Intenção C Rust Ziguezague seed construção e invariante
texto de propriedade char * + manual free String fatia alocada string; mova-o, clone explicitamente e retorne alloc_error em caso de falha de alocação
texto emprestado const char * &str []const u8 str; a procedência é verificada e não é necessário nenhum frete grátis
bytes de propriedade malloc/free buffer Vec<u8> ArrayList(u8) bytes; inicialize através de APIs seguras e confirme apenas bytes inicializados
bytes compartilhados ponteiro contado por convenção Arc<[u8]> proprietário compartilhado por convenção shared_bytes; clonar o identificador explicitamente e nunca alterar a carga útil
registro fixo struct struct struct struct; adicione @repr("c") somente quando C ABI for o contrato
ponteiro opcional ponteiro anulável Option<NonNull<T>> ponteiro opcional ?*mut T em código inseguro ou Option para um valor digitado
resultado falível código de retorno + parâmetro de saída Result<T,E> !T união de erro Result<T,E>; usar ?, match, ou uma operação de limite explícita
guarda de limpeza goto cleanup Drop guarda defer destruidor mais limpeza estruturada; saídas normais são exatas uma vez
arranhão com escopo stack/manual arena arena ou proprietário temporário alocador de arena region(capacity) { ... }; valores e pontos de vista não podem escapar
índice verificado verificação de limites do lado do chamador slice[index] slice[index] values[index]; o compilador reduz um acesso verificado
divisão disjunta aritmética de ponteiro + prova split_at_mut duas fatias por convenção split_at_mut(index); o compilador registra visualizações disjuntas exclusivas
transferência de thread mutex/channel convenção Send/Sync convenção API thread-safe spawn; send é obrigatório e os dados compartilhados também requerem sync
resultado da junção da tarefa slot de resultado compartilhado JoinHandle<Result<...>> identificador de thread + resultado resultado da tarefa digitada ou falível spawn; junte-se antes da limpeza
Retorno de chamada C ponteiro de função + void * extern "C" fn callconv(.C) fn denominado fino fn(...) -> ...; o estado viaja em um identificador opaco explícito
retorno de chamada retido ponteiro de função + contexto + destruir Box<dyn FnOnce>/FnMut propriedade closure/context box fn ou fechamento em caixa somente dentro de APIs Seed; nunca passe isso como um ponteiro C
campo atômico _Atomic T Atomic* std.atomic embutidos atômicos brutos dentro de unsafe, envoltos por um cofre estreito API
MMIO volátil volatile acesso ao ponteiro volátil inseguro API @volatile acesso ao ponteiro operações voláteis brutas em um adaptador de driver unsafe explícito
elenco desmarcado Elenco C unsafe transmute @ptrCast operação address-space/pointer insegura explícita com uma invariante documentada

Procedimento de tradução

  1. Identifique quem é o proprietário da alocação, do controle, da tarefa ou do recurso externo.
  2. Transforme parâmetros emprestados em str, []T, ou mut []T somente quando o o proprietário de apoio provavelmente está ativo para a chamada.
  3. Transforme cada cópia implícita de um valor próprio em um movimento ou em um explícito .clone().
  4. Transforme códigos de erro e ramificações de limpeza em Result além de saídas estruturadas.
  5. Mantenha o layout estrangeiro nos registros @repr("c") e mantenha as chamadas estrangeiras dentro unsafe invólucros com INSTALL.md requisitos.
  6. Execute seed check --deep, depois seed build e seed test; diagnósticos são evidência de que o invariante traduzido está incompleto, não sendo uma razão para desativar a propriedade.

Não traduções comuns