Skip to main content

Конференции

Просмотр конференции fido7.pushkin.local:

Предыдущее Следующее

Дата: 15 May 2019, 08:56:14
От: Anatoliy Sablin @ 2:5020/2140.704
Кому: Andrew Lobanov
Тема: win via usd


Hello, Andrew Lobanov.
On 15.05.2019 8:42 you wrote:

 AM>>>> Hужно. Hо в Паскале компилятор сам этим занимается. Беда Си в 
 AM>>>> том, что программист может забыть освободить память или может 
 AM>>>> сделать это некорректно. Паскаль лишен этого недостатка.
 AL>>> А при чём тут компилятор, если память занимается и освобождается 
 AL>>> в рантайме. Конечно, если ты пишешь прожки на уровне 
 AL>>> лабораторных из школьного курса информатики, то тебе не нужно 
 AL>>> управлению памяти. Ты просто сразу занимаешь сколько нужно и 
 AL>>> никуда в сторону не отходишь. Hо есть широкий спектр задач, где 
 AL>>> такой подход не прокатывает.
 AS>> В ЯП Rust есть такая штука как borrow checker, и там компилятор 
 AS>> отслеживает владение памятью.
 AL> Хм. Как это работает? Hапример, при JIT-компиляции я могу себе 
 AL> такое представить, а вот при простой компиляции уже нет. Хотя, я 
 AL> не настоящий сварщик.

На уровне языка введены правила владения объектом, которые проверяются на этапе компиляции. Например, по-умолчанию все переменные иммутабельные, чтобы изменить переменную нужно явно об этом сказать.
И изменить переменную может только owner объекта. Owner может передать владение другой переменной, но тогда через него уже не получится добраться до объекта.

Например, такой код:

let v = vec![...] // создали массив

for i in v {
 ...
}

for j in v {
 ...
}

завершится ошибкой компиляции, у тебя владелец массива переменная v передала владение массивом в первом цикле, поэтому после массива нельзя обратиться к массиву через v. Чтобы такой скомпилировать,
надо явно указать, что в первом цикле v не передала владение, тогда внутри первого цикла будет read-only доступ к элементам массива (конструкция i = ... приведён к ошибке компиляции), и второй цикл
сможет обойти переменную.

Для многопоточности свои правила (обычную переменную компилятор не позволит передать в другой thread), потому что там уже так не отследить владение переменной и надо объект заворачивать в специальную
обёртку.

В итоге, на этапе компиляции можно сказать, когда используется тот или иной объект и когда он уже не доступен, чтобы освободить память. Это позволяет исключить gc, и избежать огромного количества
ошибок работы с памятью. Ну и надо поломать себе "мозг", чтобы понять как с этим програмировать. Но надо признать, даже в такой системе бывают утечки ;)

--
Best regards!
Posted using Hotdoged on Android

--- Hotdoged/2.13.5/Android
Origin: Android device, Milky Way (2:5020/2140.704)

Предыдущее Следующее

К списку сообщений
К списку конференций