Rust'ın ününün yarısı hıza, yarısı da o meşhur derleyici hatalarına aittir. Oysa iki ünün de kaynağı tek şeydir: sahiplik modeli. Çöp toplayıcısı olmadan bellek güvenliğini derleme anında kanıtlamak istiyorsanız, kurallarınızın kesin ve sade olması gerekir. Rust bu kesinliği seçti; dilin geri kalanı, bu seçimin üzerine kurulmuş bir sonuçtur.

Her Değerin Bir Sahibi Var

Kural üç cümlede özetlenebilir: her değer tek bir sahipe sahiptir; sahibi kapsamdan çıktığında değer yok edilir; değeri bir değişkene atadığınızda ya da onu bir fonksiyona geçirdiğinizde sahiplik devredilir. Çoğu dilde atama kopyalamaktır; Rust'ta isevarsayılan olarak taşımaktır. Bu, alışkanlıklarını başka dillerden getiren herkesin ilk duvarına çarptığı yerdir.

fn main() {
    let s1 = String::from("merhaba");
    let s2 = s1;             // sahiplik s2'ye devredildi
    // println!("{}", s1);   // hata: s1 artık geçersiz
    println!("{}", s2);
}

Yorum satırındaki kod derlenmez ve bu iyi bir şeydir. Kullanılmış bir kaynağı tekrar kullanmak, C ve C++ dünyasının en eski hata sınıfıdır; Rust aynı hatayı derleme hatasına çevirir. Taşıma işleminin kendisi de ucuzdur: kopyalanan şey verinin kendisi değil, veriye işaret eden küçük bir kayıt yapısıdır.

Ödünç Alma: Emaneti Kullan, Sahipliği Verme

Her seferinde sahipliği devretmek pratik değildir. Rust bu yüzden referansları sunar: bir değere çarpı işaretiyle ödünç erişirsiniz, sahibi değişmez, emaneti kullanırsınız. Ama burada da bir disiplin vardır. Aynı anda ya birden çok salt-okunur ödünç alabilirsiniz ya da tam bir değiştirilebilir ödünç — ikisini birden asla. Bu tek kural, veri yarışlarının büyük kısmını derleme anına taşır.

fn uzunluk(metin: &String) -> usize {
    metin.len()
}

fn main() {
    let isim = String::from("Gazete");
    println!("{}", uzunluk(&isim));
    println!("{}", isim); // sahibi hâlâ geçerli
}

Bir veriye erişimle onu değiştirmenin aynı anda yapılamaması, çok çekirdekli sistemlerde en pahalı hataların önüne geçer. Rust'ta bir veri yarışı, çalışma anında çöken bir hata değil, derleyicinin reddettiği bir cümledir.

Ömürler ve Sert Uyarıların Sebebi

Derleyicinin en çok konuşulan uyarıları, referansların ömrünü sorduğu yerde çıkar. Ödünç aldığınız bir değer, ödünç bitmeden yok olamaz; yoksa işaret ettiği bellek ortada kalır. Rust'ta ömür açıklamaları bu bağı yazılı hâle getirir. Modern derleyici çoğu ömürü kendisi çıkarır; belirtmeniz gerektiğinde ise size neyi neden yapamadığınızı, çoğu zaman çözümüyle birlikte anlatır.

Sahiplik modelinin maliyeti de yadsınamaz: grafik arayüzlerinde döngüsel referanslar, bazı veri yapıları ve olay abonelikleri için ekstra tasarım gerekir. Bu yüzden Rust ekosistemi, paylaşılan sahiplik için sayaçlı referanslar ve içsel değiştirilebilirlik araçlarını dikkatle sınırlı dozda sunar. Kavramsal yükün kendisi de bir tasarım kararıdır: sahiplik kurallarını öğrenen geliştirici, büyük ekiplerde bellek hatalarının ayıklanmasına harcanan saatlerin çoğundan kurtulur. Yazdığınız her fonksiyon imzası, bellek davranışını da beyan eder; okuyan kişi için bu, ek bir belge yükü değil, kolaylıktır.

Sonuç olarak Rust'ın bellek modeli, bir disiplin seti değil, bütünlüklü bir anlatıdır: sahiplik kimin sorumlu olduğunu, ödünç alma geçici erişimin nasıl verilir olduğunu, ömürler ise bu sözleşmenin ne kadar sürdüğünü söyler. Üçü birlikte, çöp toplayıcının rahatlığı ile sistem programlamasının denetimini aynı cümlede birleştirir. Anlatının yarısı derleyicinindir; siz yalnızca sözleşmeyi imzalarsınız.