<!-- 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
- Identificare chi possiede l'allocazione, l'handle, l'attività o la risorsa esterna.
- Trasforma i parametri presi in prestito in
str,[]T, omut []Tsolo quando il il proprietario di supporto è probabilmente vivo per la chiamata. - Trasforma ogni copia implicita di un valore posseduto in una mossa o in un
esplicito
.clone(). - Trasforma i codici di errore e i rami di pulizia in
Resultpiù uscite strutturate. - Mantieni il layout straniero nei record
@repr("c")e mantieni le chiamate straniere all'internounsafeinvolucri conINSTALL.mdrequisiti. - Esegui
seed check --deep, quindiseed buildeseed test; la diagnostica lo è prova che l'invariante tradotto è incompleto, non un motivo per disabilitare la proprietà.
Mancate traduzioni comuni
box fnnon è un puntatore a funzioni C: possiede un ambiente Seed e non può attraversare unextern "c"confine.- Uno spostamento dinamico da
values[index]non viene convertito automaticamente in un runtime set di pulizia. Utilizzare un indice noto, un'operazione di rimozione esplicita della raccolta o borrow/clone l'elemento. - Una regione non è un’arena globale. La restituzione di un proprietario o di una vista legati alla regione è rifiutato perché il soggetto aggiudicatore è già stato liberato.
- Un puntatore grezzo non è una prova di validità o di durata. Conserva la prova in adattatore non sicuro ed esporre ai chiamanti un'operazione sicura verificata.