رویکردهای مدیریت حافظه

به طور سنتی، زبان‌ها به دو دسته گسترده تقسیم شده‌اند:

  • کنترل کامل از طریق مدیریت دستی حافظه: C++، C، پاسکال، ...
    • برنامه‌نویس تصمیم می‌گیرد که چه زمانی حافظه heap را تخصیص یا آزاد کند.
    • برنامه‌نویس باید تعیین کند که آیا یک اشاره‌گر هنوز به حافظه معتبر اشاره می‌کند یا نه.
    • مطالعات نشان می‌دهد که برنامه‌نویسان اشتباهاتی مرتکب می‌شوند.
  • ایمنی کامل از طریق مدیریت خودکار حافظه در زمان اجرا: جاوا، پایتون، گو، هسکل، ...
    • یک سیستم زمان اجرا اطمینان می‌یابد که حافظه تا زمانی که دیگر نتواند به آن ارجاع داده شود، آزاد نمی‌شود.
    • Typically implemented with reference counting or garbage collection.

Rust یک ترکیب جدید ارائه می‌دهد:

کنترل کامل و ایمنی از طریق اجرای صحیح مدیریت حافظه در زمان کامپایل.

این کار را با استفاده از مفهوم مالکیت صریح انجام می‌دهد.

This slide should take about 10 minutes.

این اسلاید به منظور کمک به دانش‌آموزانی است که از زبان‌های دیگر می‌آیند تا Rust را در زمینه مناسب قرار دهند.

  • C باید حافظه heap را به‌طور دستی با استفاده از malloc و free مدیریت کند. خطاهای رایج شامل فراموش کردن فراخوانی free، فراخوانی آن چندین بار برای یک اشاره‌گر، یا dereference کردن یک اشاره‌گر پس از آزاد شدن حافظه‌ای است که به آن اشاره می‌کند.

  • ++C ابزارهایی مانند اشاره‌گرهای هوشمند (unique_ptr, shared_ptr) دارد که از تضمین‌های زبانی درباره فراخوانی ویرایشگرها (destructor) برای اطمینان از آزاد شدن حافظه هنگام بازگشت از تابع استفاده می‌کنند. با این حال، هنوز هم بسیار آسان است که از این ابزارها به اشتباه استفاده کرده و باگ‌هایی مشابه به C ایجاد کرد.

  • جاوا، گو و پایتون به جمع‌آوری‌کننده زباله (garbage collector) برای شناسایی حافظه‌ای که دیگر در دسترس نیست و دور ریختن آن متکی هستند. این امر تضمین می‌کند که هر اشاره‌گری می‌تواند dereference شود و از بروز خطاهای استفاده پس از آزادسازی (use-after-free) و سایر دسته‌های باگ جلوگیری می‌کند. اما، GC هزینه‌ای در زمان اجرا دارد و تنظیم مناسب آن دشوار است.

مدل مالکیت و قرض‌گیری Rust (ownership and borrowing) می‌تواند در بسیاری از موارد عملکرد C را با عملیات‌های تخصیص و آزادسازی دقیقاً در مکان‌های مورد نیاز -- با هزینه صفر -- به دست آورد. همچنین ابزارهایی مشابه به اشاره‌گرهای هوشمند ++C را فراهم می‌کند. در صورت نیاز، گزینه‌های دیگری مانند شمارش ارجاع نیز در دسترس هستند و حتی crates شخص ثالثی برای پشتیبانی از جمع‌آوری زباله در زمان اجرا موجود است (که در این کلاس پوشش داده نمی‌شود).