<!-- 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
- Identifique quem é o proprietário da alocação, do controle, da tarefa ou do recurso externo.
- Transforme parâmetros emprestados em
str,[]T, oumut []Tsomente quando o o proprietário de apoio provavelmente está ativo para a chamada. - Transforme cada cópia implícita de um valor próprio em um movimento ou em um
explícito
.clone(). - Transforme códigos de erro e ramificações de limpeza em
Resultalém de saídas estruturadas. - Mantenha o layout estrangeiro nos registros
@repr("c")e mantenha as chamadas estrangeiras dentrounsafeinvólucros comINSTALL.mdrequisitos. - Execute
seed check --deep, depoisseed buildeseed 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
box fnnão é um ponteiro de função C: ele possui um ambiente Seed e não pode atravessar umextern "c"limite.- Uma movimentação dinâmica de
values[index]não é convertida silenciosamente em um tempo de execução conjunto de limpeza. Use um índice conhecido, uma operação explícita de remoção de coleção ou borrow/clone o elemento. - Uma região não é uma arena global. Retornar um proprietário ou visualização vinculado à região é rejeitado porque o alocador já foi liberado.
- Um ponteiro bruto não é uma prova de validade ou vida útil. Guarde a prova no adaptador inseguro e expõe uma operação segura verificada aos chamadores.