Rust'a Neden Geçtim?

C++ ile uzun süre çalıştıktan sonra Rust ekosistemini keşfetmek benim için gerçek bir dönüm noktası oldu. Başlangıçta Rust'ın ödünç alma (borrow checker) sistemi beni yıldırdı; ancak bu mekanizmanın arkasındaki felsefeyi anladığımda, bellek hatalarını derleme zamanında tespit eden bir dilin ne kadar güçlü bir güvence sunduğunu kavradım. Bu yazıda bu yolculuğu ve Rust'ı neden benimsediğimi anlatıyorum.

C++ ile Gelen Zorluklar

C++'da yazan herkes bellek yönetiminin ne denli kırılgan olabileceğini bilir. Dangling pointer'lar, use-after-free hataları ve veri yarışları (data race) gibi sorunlar yalnızca çalışma zamanında — bazen üretim ortamında — ortaya çıkabilir. Kişisel projelerimde birkaç kez bu tür hataları saatler harcayarak ayıkladım. Valgrind ve AddressSanitizer gibi araçlar yardımcı olsa da bunlar reaktif çözümlerdir; hatayı önceden engellemez.

Rust'ın Borrow Checker'ı

Rust'ın borrow checker'ı ilk başta aşırı kısıtlayıcı görünür. Derleyici sizi sürekli uyarır, kodunuz derlenmez ve kendinizi "neden bu kadar zor?" diye sorarken bulursunuz. Ama bu kısıtlamalar bir amaç için vardır: derleyici, olası bellek hatalarını sizin yerinize önceden yakalar. Bir kez borrow checker ile barışık olmayı öğrendiğinizde, yazdığınız kodun bellek güvenli olduğuna dair güçlü bir güvence hissedersiniz.

Modern Araç Zinciri: Cargo

Rust'ı benimsememin diğer büyük nedeni Cargo'dur. C++'da bağımlılık yönetimi hâlâ bir acıdır: CMake, vcpkg, Conan her biri kendi öğrenme eğrisiyle gelir. Rust'ta ise cargo add ile bir kütüphane eklemek, cargo test ile testleri çalıştırmak ve cargo fmt ile kodu biçimlendirmek son derece doğaldır. Tüm ekosistem tek bir araç etrafında toplanmıştır.

Performans

Bazı geliştiriciler Rust'ın C++'a kıyasla daha yavaş olduğunu düşünür; bu büyük ölçüde yanlış bir kanıdır. Rust, C++ ile karşılaştırılabilir performans sunar. Sıfır maliyetli soyutlamalar (zero-cost abstractions) ilkesi sayesinde yüksek seviyeli dil özelliklerini kullanırken düşük seviyeli performanstan taviz vermezsiniz.

fn main() {
    let mut v: Vec<i32> = Vec::new();
    for i in 0..10 {
        v.push(i * i);
    }
    // Borrow checker, v'nin omrunu garantiler
    println!("{:?}", v);
}

Sonuç

Rust, her proje için doğru araç değil; ancak bellek güvenliğinin kritik olduğu sistem programlama, CLI araçları ve yüksek performanslı uygulamalar için mükemmel bir seçimdir. C++ bilgisi Rust'a geçişi kolaylaştırır; borrow checker ile çatışmak yerine onunla çalışmayı öğrenmek gerekir. Bu zihinsel dönüşümü yaşadıktan sonra Rust, hem eğlenceli hem de güvenilir bir araç haline geldi.

Rust sizi daha yavaş yazmaya zorlar, ama bu yavaşlık ileride kazanacağınız zamana yapılan bir yatırımdır.