Proprietà e sicurezza della memoria

seed utilizza proprietà, risorse di solo spostamento, lessicale loans/provenance, capacità strutturali, pulizia deterministica, linear te regioni. Non ha GC, sintassi di durata del controllo del prestito o risoluzione delle eccezioni. Sono presenti le regole semantiche autorevoli seed/compiler/llvm/SEMANTIC_RULES.md; i limiti correnti sono tracciati in Stato corrente.

Copia, sposta, prendi in prestito, clona

Operazione Significato
copia sorgente e destinazione rimangono disponibili; solo per valori copiabili
muoversi trasferimenti di proprietà e il luogo di origine diventa non disponibile
prendere in prestito una visualizzazione a copia zero è legata allo storage di backup comprovato
clone esplicito indipendente value/handle secondo la capacità strutturale

Scalari e aggregati contenenti solo campi di copia copia. string, bytes, shared_bytes, proprietari dei distruttori di utenti, aggregati di risorse e linear t obbedire al loro move/clone/cleanup capacità.

shared_bytes non è copiabile bit a bit: .clone() conserva esplicitamente un altro handle senza copiare il payload. La clonazione di proprietà string/bytes o gli aggregati che li contengono possono essere allocati. Gli effetti e le funzionalità di allocazione dei cloni sopravvivono alla compilazione .sdi elisa alla fonte.

Luoghi e proprietà parziale

Il compilatore tiene traccia delle variabili locali, dei campi e dei campi nidificati, degli indici di array fissi noti, dei payload ADT attivi, dei campi raw-union, tuple/array/nominal aggregati, istanze generiche, option/result, valori di funzione, channels/tasks, alias, blocchi, chiamate, ritorni e join del flusso di controllo.

Uno spostamento parziale rende indisponibile il luogo spostato e ne impedisce l'utilizzo da parte dell'intero proprietario quando è richiesta la completezza. I campi rimanenti indipendenti rimangono utilizzabili quando un distruttore utente non richiede un proprietario completo. Gli spostamenti dell'indice dinamico degli elementi di risorsa rimangono rifiutati perché il set di pulizia dipenderebbe dal runtime.

Pulizia

La pulizia è pianificata in base ai fatti di proprietà HIR digitati, verificati separatamente e ridotti alle normali uscite strutturate. I proprietari live puliscono esattamente una volta nell'ordine inverso di inizializzazione riuscita. La riassegnazione pulisce il precedente proprietario attivo prima di archiviare il sostituto. I cicli utilizzano punti fissi del flusso di dati tra ingresso, bordi posteriori, interruzione, continuazione e ritorno.

Panico, trappola e interruzione terminano senza rilassarsi. Non eseguono la pulizia lessicale o i distruttori degli utenti.

Distruttori

fn type_name.drop() riceve il consumo implicito self. Deve essere univoco e restituire void. La chiamata a value.drop() consuma manualmente il proprietario, impedendo una seconda chiamata automatica. I proprietari restituiti trasferiscono il loro obbligo di pulizia al chiamante. I valori globali Cleanup/resource vengono rifiutati perché lo smontaggio globale non è un servizio linguistico implicito.

La pulizia ADT viene inviata solo sulla variante attiva. I sindacati grezzi richiedono una disciplina attiva sul campo non sicura; le alternative con tag sicuri dovrebbero utilizzare ADT o un wrapper controllato.

Proprietà di chiusura

Una semplice chiusura |...| possiede l'archiviazione di acquisizione dello stack generata dal compilatore. L'inizializzazione della cattura segue il primo ordine di uso lessicale: i valori che possono essere copiati vengono copiati e gli altri valori posseduti si spostano. Le acquisizioni sono immutabili; un'acquisizione di risorse spostata rende la chiusura stessa di solo spostamento. Il proprietario elimina le acquisizioni live esattamente una volta nell'ordine di inizializzazione inverso.

Le chiusure semplici sono riutilizzabili e senza fuga. Non possono acquisire valori che non possono rimanere archiviati in modo sicuro dopo una chiamata, incluse visualizzazioni, acquisizioni modificabili, valori legati alla regione, raw/reference valori, format_argso luoghi già spostati. Non possono essere restituiti, conservati in un ambito esterno, inviati a un'attività o passati attraverso il limite di un puntatore a funzione della piattaforma.

box |...| alloca esplicitamente l'archiviazione di acquisizione e restituisce result<box fn(...) -> t, alloc_error>. Il proprietario in scatola può essere restituito o archiviato ma rimane di solo spostamento, non clonabile e non inviabile. L'errore di allocazione elimina le acquisizioni trasferite una volta; il rilascio riuscito esegue il thunk di rilascio di acquisizione e libera l'ambiente una volta. Una chiusura scatolata assegnata sotto region(...) non può uscire da quella regione.

Valori lineari

linear t conserve te aggiunge un obbligo esattamente una volta. Rimuove copy/clone/shared funzionalità pur mantenendo informazioni valide su spostamento, prestito, invio, sincronizzazione e pulizia. L'implementazione propaga l'obbligo attraverso alias, blocchi, aggregati, option/result, ADT, generici, canali, valori di funzione e chiamate indirette, acquisizione di attività, parameters/returns e schema-16 .sdi.

Lasciare un valore lineare attivo all'uscita dall'ambito, consumarlo due volte, clonarlo, scartarlo, sovrascriverlo o archiviarlo in un archivio non lineare preesistente viene rifiutato.

Testo, buffer e visualizzazioni

Non esiste una sintassi a vita. @borrow i metodi riceventi creano prestiti lessicali condivisi; le visualizzazioni restituite rimangono legate al destinatario .sdi riassunti. @mut i metodi del ricevitore creano un prestito esclusivo nell'ambito della chiamata e modificano direttamente la posizione del chiamante. I ricevitori immutabili e le visualizzazioni live sovrapposte vengono rifiutati; nessuno spostamento o clone viene nascosto dalla chiamata.

Regioni

fn work() -> result<i64, alloc_error> {
    region(4096) {
        // allocating operations use the active checked bump allocator
        result.ok(42)
    }
}

La capacità viene valutata una volta, l'allocazione allineata viene controllata in overflow e l'esaurimento viene restituito come alloc_error dalle API fallibili. Le regioni nidificate sono LIFO. Le risorse del corpo vengono pulite prima che venga rilasciata la memoria di backup. I proprietari, le visualizzazioni e i puntatori sicuri legati a un'area non possono sfuggire tramite il risultato, la restituzione o l'assegnazione a un'associazione esterna.

Il lavoro generato cattura il contesto dell'allocatore. Le attività legate alla regione rimangono strutturate e si uniscono prima della pulizia della regione.

Trasferimento di attività

spawn record copy/move modalità di cattura. Mantenere il valore originale e quello di un'attività richiede un clone esplicito. È necessario attraversare il confine di un'attività send; richiede anche l'accesso condiviso sync. Lo stato globale mutevole non può essere catturato. Ogni gruppo di attività si esaurisce prima che il proprietario lessicale pulisca le risorse.

Confine non sicuro

L'allocazione non elaborata, l'accesso al puntatore, FFI, le chiamate di sistema, gli atomi, l'accesso volatile, i cast dello spazio degli indirizzi, l'accesso all'unione non elaborata e l'assemblaggio non elaborato richiedono unsafe. Il codice non sicuro non disabilita la proprietà dei valori sicuri circostanti; presuppone obblighi specifici che dovrebbero essere nascosti dietro ristretti involucri sicuri controllati.

unsafe struct parametri: un unsafe struct con un campo puntatore grezzo e @repr("null_niche") è un tipo di risorsa che non può essere passato per valore come parametro di funzione. Passarlo per valore sposta il proprietario sottostante, rendendolo non disponibile per un utilizzo successivo. Metodi con @mut il ricevitore richiede un posto mutevole e non può essere chiamato su un valore spostato. Per utilizzare un tipo di questo tipo oltre i limiti della funzione, incorporare la logica o restituire il proprietario insieme al risultato.

Quale versione cambia

--release e --release-small ottimizzano la stessa semantica sicura. I controlli relativi a limiti, discriminanti, provenienza, proprietà e pulizia rimangono a meno che non risultino ridondanti. Non viene implementato alcun profilo di rilascio non controllato.