rust - ps4 - ¿Los tiempos de vida del óxido influyen en la semántica del programa compilado?
rust traduccion (1)
Intento asimilar vidas en Rust y me pregunto si son "solo" una medida de seguridad (y una forma de comunicar cómo se garantiza la seguridad, o no, en el caso de errores) o si hay casos en que las diferentes opciones de las vidas realmente cambian la forma en que se ejecuta el programa, es decir, si los tiempos de vida hacen una diferencia semántica con el programa compilado.
Y con "vidas" me refiero a todos los pequeños marcadores molestos ''a
, ''b
''static
que incluimos para hacer feliz al prestamista. Por supuesto, escribiendo
{
let foo = try!(File::open("foo.txt"));
}
foo.write_all(b"bar");
en lugar de
let foo = try!(File::open("foo.txt"));
foo.write_all(b"bar");
cerrará el descriptor de archivo antes de que se produzca la escritura, incluso si pudiéramos acceder a foo después, pero ese tipo de scoping y llamadas de destrucción también ocurren en C ++.
No, las vidas útiles no afectan el código de máquina generado de ninguna manera. Al final del día, todo son "solo punteros" para el código compilado.
Debido a que somos humanos hablando un idioma humano, tendemos a agrupar dos conceptos diferentes pero relacionados entre sí: tiempos de vida concretos y parámetros de vida genéricos .
Todos los lenguajes de programación tienen tiempos de vida concretos. Eso solo corresponde a cuando se lanzará un recurso. Eso es lo que muestra tu ejemplo y, de hecho, C ++ funciona igual que Rust lo hace allí. Esto a menudo se conoce como Inicialización de adquisición de recursos (RAII). Los lenguajes recogidos de basura también tienen vidas, pero pueden ser más difíciles de clavar exactamente cuando terminan.
Lo que hace que Rust sea ordenado en esta área son los parámetros de vida genéricos, las cosas que conocemos como ''a
''static
o ''static
. Estos permiten al compilador rastrear los punteros subyacentes para que el programador no tenga que preocuparse si el puntero permanecerá válido el tiempo suficiente. Esto funciona para almacenar referencias en estructuras y pasarlas a funciones y desde ellas.