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

Traduzione di C, Rust, e costruzioni Zig a seed

Questa è una guida alla costruzione, non una scorecard linguistica. Traduci prima l'invariante di proprietà, quindi scegli il tipo Seme più piccolo che lo esprime. Il compilatore LLVM è l'autorità per la sintassi e la diagnostica.

Traduzioni fondamentali

Intento C Rust Zig seed costruzione e invariante
testo posseduto char * + manuale free String fetta assegnata string; spostalo, clonalo esplicitamente e restituisci alloc_error in caso di errore di allocazione
testo preso in prestito const char * &str []const u8 str; la provenienza è controllata e non è richiesta alcuna gratuità
byte posseduti malloc/free tampone Vec<u8> ArrayList(u8) bytes; inizializzare tramite API sicure ed eseguire il commit solo dei byte inizializzati
byte condivisi puntatore conteggiato per convenzione Arc<[u8]> proprietario condiviso per convenzione shared_bytes; clonare l'handle in modo esplicito e non modificare mai il payload
registro fisso struct struct struct struct; aggiungere @repr("c") solo quando C ABI è il contratto
puntatore opzionale puntatore nullable Option<NonNull<T>> puntatore opzionale ?*mut T in codice non sicuro o Option per un valore digitato
risultato fallibile codice di ritorno + parametro out Result<T,E> !T errore di unione Result<T,E>; utilizzare ?, matcho un'operazione al contorno esplicita
guardia di pulizia goto cleanup Drop protezione defer distruttore più pulizia strutturata; le uscite normali sono esatte una volta
graffio mirato stack/manual arena arena o proprietario temporaneo distributore dell'arena region(capacity) { ... }; valori e punti di vista non possono sfuggire
indice controllato controllo dei limiti lato chiamante slice[index] slice[index] values[index]; il compilatore abbassa un accesso controllato
scissione disgiunta aritmetica del puntatore + dimostrazione split_at_mut due fette per convenzione split_at_mut(index); il compilatore registra esclusivamente visualizzazioni disgiunte
trasferimento del filo mutex/channel convenzione Send/Sync convenzione API thread-safe spawn; È richiesto send e anche i dati condivisi richiedono sync
risultato dell'unione delle attività slot di risultati condivisi JoinHandle<Result<...>> maniglia del thread + risultato risultato dell'attività digitato o fallibile spawn; iscriviti prima della pulizia
Richiamata C puntatore funzione + void * extern "C" fn callconv(.C) fn denominato sottile fn(...) -> ...; lo stato viaggia in un handle opaco esplicito
richiamata mantenuta puntatore a funzione + contesto + distruggi Box<dyn FnOnce>/FnMut di proprietà closure/context box fn o chiusura in scatola solo all'interno delle API Seed; non passarlo mai come puntatore C
campo atomico _Atomic T Atomic* std.atomic built-in atomici grezzi all'interno di unsafe, avvolti da una stretta cassaforte API
MMIO volatile volatile accesso al puntatore volatile non sicuro API @volatile accesso al puntatore operazioni volatili non elaborate in un adattatore driver unsafe esplicito
cast non controllato Cast C unsafe transmute @ptrCast operazione esplicita address-space/pointer non sicura con un invariante documentato

Procedura di traduzione

  1. Identificare chi possiede l'allocazione, l'handle, l'attività o la risorsa esterna.
  2. Trasforma i parametri presi in prestito in str, []T, o mut []T solo quando il il proprietario di supporto è probabilmente vivo per la chiamata.
  3. Trasforma ogni copia implicita di un valore posseduto in una mossa o in un esplicito .clone().
  4. Trasforma i codici di errore e i rami di pulizia in Result più uscite strutturate.
  5. Mantieni il layout straniero nei record @repr("c") e mantieni le chiamate straniere all'interno unsafe involucri con INSTALL.md requisiti.
  6. Esegui seed check --deep, quindi seed build e seed test; la diagnostica lo è prova che l'invariante tradotto è incompleto, non un motivo per disabilitare la proprietà.

Mancate traduzioni comuni