Підходи до управління пам'яттю

Традиційно мови поділяються на дві великі категорії:

  • Повний контроль через ручне управління пам'яттю: C, C++, Pascal, ...
    • Програміст вирішує, коли виділяти або звільняти пам'ять купи.
    • Програміст повинен визначити, чи вказівник все ще вказує на дійсну пам'ять.
    • Дослідження показують, що програмісти роблять помилки.
  • Повна безпека завдяки автоматичному управлінню пам’яттю під час виконання: Java, Python, Go, Haskell, ...
    • Система виконання гарантує, що пам'ять не звільняється доти, доки до неї не можна буде звертатися.
    • Зазвичай реалізується за допомогою підрахунку посилань, збору сміття або RAII.

Rust пропонує нову суміш:

Повний контроль та безпека завдяки забезпеченню правильного керування пам'яттю під час компіляції.

Це робиться за допомогою чіткої концепції володіння.

This slide should take about 10 minutes.

Цей слайд має на меті допомогти студентам, які вивчають інші мови, помістити Rust у контекст.

  • C має керувати купою вручну за допомогою malloc та free. Типові помилки включають забування виклику free, виклик free декілька разів для одного і того ж вказівника або розіменування вказівника після того, як пам'ять, на яку він вказує, було звільнено.

  • C++ has tools like smart pointers (unique_ptr, shared_ptr) that take advantage of language guarantees about calling destructors to ensure memory is freed when a function returns. It is still quite easy to mis-use these tools and create similar bugs to C.

  • У C++ є такі інструменти, як розумні вказівники (unique_ptr, shared_ptr), які використовують гарантії мови щодо виклику деструкторів для забезпечення звільнення пам'яті при завершенні функції. Але все одно досить легко неправильно використовувати ці інструменти і створювати помилки, подібні до помилок у мові C.

Модель володіння та запозичення Rust у багатьох випадках дозволяє отримати продуктивність C, з операціями alloc та free саме там, де вони потрібні - з нульовими витратами. Він також надає інструменти, подібні до розумних вказівників C++. За необхідності, доступні інші опції, такі як підрахунок посилань, і навіть є сторонні крейти для підтримки збирання сміття під час виконання (не розглядаються у цьому класі).