Bellek Yönetimine Yaklaşımlar
Geleneksel olarak, diller iki geniş kategoriye ayrılmıştır:
- Manuel bellek yönetimi ile tam kontrol: C, C++, Pascal, …
- Programcı, dinamik bellek (heap) tahsis etme (allocate) veya serbest bırakma (free) zamanına karar verir.
- Programcı, bir göstericinin (pointer) hala geçerli belleği gösterip göstermediğini belirlemelidir.
- Araştırmalar, programcıların hata yaptığını gösteriyor.
- Çalışma zamanında (runtime) otomatik bellek yönetimi ile tam emniyet (safety): Java, Python, Go, Haskell, …
- Bir çalışma zamanı sistemi (runtime system), belleğin artık referans alınamayana kadar serbest bırakılmamasını sağlar.
- Genellikle referans sayımı (reference counting) veya çöp toplama (garbage collection) ile gerçekleştirilir.
Rust yeni bir karışım sunar:
Derleme zamanında (compile time) doğru bellek yönetiminin zorunlu kılınması yoluyla tam kontrol ve emniyet (safety).
Bunu, açık sahiplik (explicit ownership) kavramıyla yapar.
Bu slaytın amacı, farklı programlama dillerinden gelen öğrencilerin Rust’ın nerede durduğunu kavramalarına yardımcı olmaktır.
-
C, dinamik belleği (heap) manuel olarak
mallocvefreeile yönetir. Yaygın hatalar arasındafreeçağırmayı unutmak, aynı gösterici için birden çok kezfreefonksiyonunu çağırmak veya gösterdiği bellek serbest bırakıldıktan (free) sonra bir göstericinin içeriğine erişmek (dereferencing) yer alır. -
C++, bir fonksiyon geri döndüğünde tahsis edilen belleğin serbest bırakılmasını sağlamak için yıkıcı özel üye fonksiyonlarını (destructors) çağırma konusundaki dil garantilerinden yararlanan akıllı göstericiler (
unique_ptr,shared_ptr) gibi araçlara sahiptir. Bu araçları yanlış kullanmak ve C’ye benzer hatalar oluşturmak hala oldukça kolaydır. -
Java, Go ve Python, artık erişilemeyen belleği belirlemek ve atmak için çöp toplayıcıya (garbage collector) güvenir. Bu, herhangi bir göstericinin içeriğine erişilebileceğini (dereferenced) garanti eder, serbest bırakma sonrası kullanım (use-after-free) ve diğer hata sınıflarını ortadan kaldırır. Ancak, ÇT’nin (GC) bir çalışma zamanı (runtime cost) maliyeti vardır ve doğru bir şekilde ayarlamak zordur.
Rust’ın sahiplik (ownership) ve ödünç alma (borrowing) modeli, birçok durumda, C’nin performansını, tam olarak gerekli oldukları yerde -sıfır maliyetle (zero cost)- tahsis (alloc) ve serbest bırakma (free) işlemleriyle elde edebilir. Ayrıca C++’nın akıllı göstericilerine (smart pointers) benzer araçlar da sağlar. Gerektiğinde, referans sayımı (reference counting) gibi diğer seçenekler de mevcuttur ve hatta çalışma zamanı çöp toplamayı (runtime garbage collection) desteklemek için mevcut olan kasalar (crates) bile vardır (bu derste ele alınmamaktadır).