Kafayı yiyecektim. Yıllardır C ile yazdığım, bellek adresleriyle oynadığım, pointer'ları dans ettirdiğim o düşük seviyeli sistem rutinlerini, "artık modern ve güvenli olacak" diyerek Rust'a taşımaya karar verdim. Amacım basitti: unsafe bloğuna hiç bulaşmadan, C'deki gibi rahat rahat bellek yönetebilecektim. Meğer ne hayalmiş!
İlk engel, tabii ki Ownership ve Borrow Checker. C'de bir pointer'ı istediğin yere paslar, istediğin gibi kopyalar, değiştirirsin. Rust'ta ise derleyici, her adımda "Bu verinin sahibi şu an kim?", "Bunu birden fazla kişi değiştirmeye çalışıyor mu?" diye sorguluyor. Basit bir çift yönlü bağlı liste (doubly linked list) yazmaya kalktığımda, derleyicinin bana söylediği hata mesajları adeta bir felsefe kitabı gibiydi.
Kod:
struct Node {
value: i32,
next: Option<Box<Node>>,
prev: Option<mut Node>, // İşte burada başladı sıkıntı...
}
prev için raw pointer (mut Node) kullanmak zorunda kaldım çünkü Box veya Rc ile döngüsel referansı güvenli bir şekilde kurmak imkansız hale geliyordu. Ve raw pointer dediğin şey, seni hemen unsafe bloğunun kucağına atıyor! "Ama ben unsafe kullanmayacaktım!" diye isyan ettim kendi kendime.
C'de yapardın şunu: malloc, işini yap, sonra umursamaz bir şekilde free et (ya da bazen unuturdun). Rust'ta ise her şey scope'un sonunda otomatik temizleniyor (drop) evet, bu harika. Ama bu rahatlığın bedeli, veri yapılarını tasarlarken bu otomatik temizlemeyi ve mülkiyet kurallarını her an düşünmek. C'deki gibi "şu struct'ın içindeki şu alana şu adresi ata, gitsin" özgürlüğü yok. Her şey, derleyicinin onayladığı "güvenli koridorlar"dan geçmek zorunda.
Çünkü o segmentation fault'ların, use-after-free'lerin, data race'lerin artık derleme zamanında yakalanıyor olması büyük bir huzur. Evet, C'deki gibi "rahat" değil, daha disiplinli, daha düşünerek yazıyorsun. Ama yazdığın kod, bir kere derlendikten sonra, bellek güvenliği konusunda çok daha sağlam oluyor.
Sonuçta, Rust, C'nin rahatlığını ve doğrudan kontrol hissini unsafe olmadan sunmuyor. Onun yerine, farklı bir paradigma sunuyor: güvenlik ve performansı bir arada, ama katı kurallarla. Alışması zor, bazen sinir bozucu, ama bir kere alışınca, C'ye döndüğünde "burada potansiyel bir bug var aslında" diye düşünmeden edemiyorsun.
Siz de Rusta geçerken benzer bir "kültür şoku" yaşadınız mı? Özellikle sistem seviyesinde unsafe kullanmadan kompleks veri yapıları kurmanın daha temiz yolları var mı? Fikirlerinizi bekliyorum!