Влияют ли времена жизни ржавчины на семантику скомпилированной программы?

Я пытаюсь убедить жизнь в Rust и спросил себя, являются ли они "просто" мерой безопасности (и способом сообщить, как безопасность обеспечивается или нет, в случае ошибок) или если есть случаи, когда различные варианты времени жизни фактически изменяют ход выполнения программы, т.е. изменяют ли время жизни семантическую разницу с скомпилированной программой.

И с "временами жизни" я ссылаюсь на все надоедливые маленькие 'a, 'b, 'static маркеры, которые мы включаем, чтобы сделать проверку заем счастливой. Конечно, писать

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

вместо

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

закроет дескриптор файла до того, как произойдет запись, даже если бы мы могли получить доступ к foo впоследствии, но этот вид определения области и деструктора также происходит в С++.

Ответ 1

Нет, сроки жизни никак не влияют на сгенерированный машинный код. В конце концов, все это "просто указывает" на скомпилированный код.

Поскольку мы - люди, говорящие на человеческом языке, мы склонны объединять два разных, но взаимосвязанных понятия: конкретные времена жизни и общие параметры жизни.

Все языки программирования имеют конкретные сроки жизни. Это просто соответствует тому, когда будет выпущен ресурс. Что показывает ваш пример и действительно, С++ работает так же, как и Rust. Это часто называют инициализацией сбора ресурсов (RAII). У собранных мусором языков также есть время жизни, но им может быть сложнее прибить их, когда они заканчиваются.

То, что делает Rust опрятным в этой области, это общие параметры времени жизни, вещи, которые мы знаем как 'a или 'static. Это позволяет компилятору отслеживать базовые указатели, чтобы программисту не нужно было беспокоиться, если указатель останется действительным достаточно долго. Это работает для хранения ссылок в структурах и передачи их в и из функций.