Programlama dilleri, belleği nasıl işledikleri ve bellek yönetimi kurallarını nasıl uyguladıkları bakımından farklılık gösterir. Go ve Python, çöp toplayıcıları kullanır, böylece geliştiriciler kod yazmaya odaklanabilir. C ve C++, programcılara belleği daha düşük bir düzeyde yönetme sorumluluğu verir.
Rust, sahiplik ve ödünç alma olarak adlandırdığı kavramları kullanarak bellek yönetimine farklı davranır. Bellek güvenliğini verimli bir şekilde uygulamak için bir "ödünç alma denetleyicisi" kullanır.
Mülkiyet Nedir?
Sahiplik, çöp toplayıcı olmadan programların bellek güvenliğini sağlamaya yardımcı olan bir Rust özelliği ve kuralıdır. Bu, başa çıkmanın başka bir yolu bellek sızıntısı sorunu kodunuzda.
Rust derleyicisi, bir programın derleme zamanında sahiplik kurallarına uyup uymadığını kontrol eder. Program bu kurallara uyarsa çalışabilir. Olmazsa, derleyici yürütülebilir bir dosya oluşturmayı reddeder.
Rust, aşağıdakileri kullanarak sahiplik kurallarını doğrular: ödünç denetleyicisi. Ödünç alma denetleyicisi sahiplik modelini doğrular ve bellekte bir değer olup olmadığına karar verir (
yığın veya yığın) kapsam dışında olup olmadığı. Bir değer kapsam dışındaysa, ödünç alınmadıkça programın diğer bölümlerine erişilemez.Mülkiyet Kuralları
Rust'ta her değişken, başlatıldığı değere sahiptir ve yalnızca bir sahip olabilir. Sahip kapsam dışına çıktığında değer düşer. Sahiplik kurallarının ayrıntılarını anlamak önemlidir.
İlk sahiplik kuralı, her değişkenin kendi başlangıç değerine sahip olmasıdır.
İzin Vermek sahip = Sicim::birinden");
bu sahip yukarıdaki değişken dizgenin sahibidir bir ve Python ve Go gibi dillerden farklı olarak, bu değer, değişken yeniden atamasında düşürülecektir.
İkinci sahiplik kuralı, iki değişkenin aynı bellek konumuna işaret edememesidir; her değerin yalnızca bir sahibi olabilir.
İzin Vermek yeni_sahip = sahip;
bu yeni sahibi değişken artık, değişkenin bellek konumunda depolanan değere sahiptir. sahip değişken. kullanmaya çalışırsanız sahip değişken, derleyici panikleyecek ve bir yürütülebilir dosya oluşturmayı reddedecektir.
Çöp toplayıcıları kullanan çoğu dilde, iki değişken aynı bellek konumuna işaret edebilir. İşte eşdeğer bir JavaScript kodu örneği:
İzin Vermek sahip = "sahip";
İzin Vermek yeni_sahip = sahip;
konsol.log (yeni_sahip);
Yukarıdaki JavaScript kodunu çalıştırmak hatasız çalışır ve aynısını Go veya Python'da yaparsanız, programınız da hatasız çalışacaktır.
Üçüncü sahiplik kuralı, bir değişken beyan edilen kapsamın dışına çıktığında değerin düşmesi ve belleğin yeniden tahsis edilmesidir.
// ayrı kapsamdaki bir değişken
{
İzin Vermek örnek = Sicim::from("İşte yeni bir kapsam");
}
Yazdır!("{}", örnek)
erişemezsiniz örnek kapsamı dışında değişken; bunu yapmaya çalışmak derleyicinin paniğe kapılmasına neden olur.
İşlevlerde Sahiplik
Bir fonksiyona argüman olarak bir değer ilettiğinizde, fonksiyon kapsamında bildirilmemiş olsa bile fonksiyon o değişkene erişebilir:
fnyazıcı(değer: Sicim) -> Sicim {
dönüş değer
}fnana() {
İzin Vermek x = Sicim::from("Bir değer yazdırır"); // x, dize değerine sahip
// sahiplik burada yazıcı işlevine taşınır
Yazdır!("{} Sonuç X'i Yazdırmak -:", yazıcı (x));
}
İşlev, bu değişkene erişebilir çünkü Rust, derleme zamanında bunun sahipliğini işleve taşır.
Değişkeni daha sonra orijinal kapsamında kullanmanın hala mümkün olduğunu düşünebilirsiniz:
fnyazıcı(değer: Sicim) -> Sicim {
dönüş değer
}fnana() {
İzin Vermek x = Sicim::from("Bir değer yazdırır");
Yazdır!("{} Sonuç x'i Yazdırmak -:", yazıcı (x));
// Değerinin sahipliği aktarıldıktan sonra değişkeni kullanmaya çalışmak
yazdır!("{} erişilebilir olmamalı", x)
}
Ancak bunu denerseniz, derleyici paniğe kapılır ve yürütülebilir bir dosya oluşturmayı reddeder:
Rust, Kodun Yeniden Kullanılabilirliğine Öncelik Veriyor
Kodun yeniden kullanılabilirliği önemli bir uygulamadır, ancak kodun yeniden kullanılabilirliğini uygulamak için Rust'ın sahiplik kurallarını anlamanız gerekir.
Rust çok esnek bir programlama dilidir. Değişken yeniden kullanılabilirlik için ödünç alma, taşıma, kopyalama ve klonlama sahipliği gibi kavramlar sağlar.