2015-09-02 13 views
12

Sto cercando di abbeverare vite in Rust e mi sono chiesto se sono "solo" una misura di sicurezza (e un modo per comunicare come la sicurezza è garantita, o meno, in caso di errori) o se ci sono casi in cui diversi le scelte di vita cambiano effettivamente come funziona il programma, cioè se le vite fanno una differenza semantica al programma compilato.Le durate di Rust influenzano la semantica del programma compilato?

E con "vite" mi riferisco a tutti i fastidiosi piccoli 'a, 'b, 'static marcatori includiamo per fare il correttore prestito felice. Naturalmente, la scrittura

{ 
    let foo = try!(File::open("foo.txt")); 
} 
foo.write_all(b"bar"); 

invece di

let foo = try!(File::open("foo.txt")); 
foo.write_all(b"bar"); 

chiuderà il descrittore di file prima che avvenga la scrittura, anche se abbiamo potuto accedere foo dopo, ma quel tipo di scoping e distruttore insulti accade anche in C++.

risposta

17

No, le durate non influiscono in alcun modo sul codice macchina generato. Alla fine della giornata, sono tutti "solo puntatori" al codice compilato.

Perché siamo esseri umani che parlano una lingua umana, si tende a raggruppare due concetti diversi ma correlati: insieme vite concreti e parametri generici a vita.

Tutti i linguaggi di programmazione hanno durate concrete. Questo corrisponde al momento in cui una risorsa verrà rilasciata. Questo è ciò che il tuo esempio mostra e in effetti, C++ funziona allo stesso modo di Rust. Questo è spesso noto come Resource Acquisition Is Initialization (RAII). Anche le lingue raccolte dai rifiuti hanno una vita, ma possono essere più difficili da inchiodare esattamente quando finiscono.

Ciò che rende Rust ordinata in quest'area sono i parametri generici di durata, le cose che conosciamo come 'a o 'static. Questi permettono al compilatore di tracciare i puntatori sottostanti in modo che il programmatore non debba preoccuparsi se il puntatore rimane valido abbastanza a lungo. Questo funziona per la memorizzazione dei riferimenti nelle strutture e il loro passaggio da e verso le funzioni.

+0

La distinzione tra tempi di vita concreti e parametri generici di durata è davvero utile. Usando le stesse parole per entrambi, le spiegazioni che ho letto finora mescolano insieme entrambi i * concetti *. – Perseids

+0

@Persidi parlando onestamente, non sono sicuro che questi siano i termini accettati, ma sto facendo del mio meglio per renderli tali.^_^Sto anche cercando di essere migliore nel dire l'uno o l'altro quando sono ambigui, ma è così dannatamente conveniente dire semplicemente "vita". – Shepmaster

+4

Qui potremmo entrare nelle erbacce, ma potrebbe essere utile chiarire la dichiarazione secondo cui tutti i linguaggi di programmazione hanno vite concrete. Quando si utilizza la garbage collection, le durate possono essere effettivamente * dinamicamente * estese, il che non è il caso delle durate come descritto dai parametri di vita di Rust, che sono solo costrutti in fase di compilazione (dovresti usare qualcosa come il puntatore 'Rc' per estensione dinamica della vita come se fossi in un linguaggio spazzato). –

Problemi correlati