Yönetici Özeti ve Mimari Önem
Rust 1.99.0, dilin sürekli evriminde önemli bir dönüm noktasını temsil ediyor; düşük seviyeli sistem programlama ile C tabanlı ekosistemlerle kusursuz birlikte çalışabilirlik arasındaki boşluğu kapatıyor. Modern yazılım mimarisi giderek sıfır maliyetli soyutlamaları katı bellek güvenliği garantileriyle birleştirmeyi talep ettiğinden, Rust çekirdek ekibi güvenli sistem entegrasyonunu kolaylaştıran özellikleri geliştirmeye devam ediyor. Bu sürüm, geliştiricilerin doğrudan Rust içinde yerel C-ABI değişken argümanlı (variadic) fonksiyonlar yazmasını sağlayan güçlü yeni yetenekler sunuyor; bu özellik daha önce yalnızca libc::printf gibi harici çağrılarla kısıtlanmıştı. Bu işlevselliği yerel Rust kod tabanlarına getirerek dil, diller arası fonksiyon tanımları ve derleyici düzeyinde ABI uyumluluğu ile geleneksel olarak ilişkili sürtünmeyi azaltır.
FFI iyileştirmelerinin ötesinde, Rust 1.99.0 büyük ölçüde düşük seviyeli bellek düzeni iç gözlemine (introspection) ve optimizasyon güvenliğine odaklanmaktadır. Ham işaretçi düzeni fonksiyonlarının (yani Layout::for_value_raw, mem::size_of_val_raw ve mem::align_of_val_raw) kararlaştırılması, geliştiricilere dinamik boyutlu türler (DST'ler) ve ham bellek segmentleri üzerinde hassas kontrol ve görünürlük sağlar. Bu eklemeler, Box::leak ile ilgili çok önemli bellek sızıntısı dokümantasyon güncellemeleriyle eşleştirilmiştir ve geliştiricileri, yakında gelecek olan özel tahsisçi (allocator) kararlılıklarıyla çelişen anti-örneklerden aktif olarak uzaklaştırmaktadır. Bu geliştirmeler birlikte, Rust'ın mimari konumunu, güvenliğinden ödün vermeden karmaşık bellek yönetimi kısıtlamalarını ele alabilen tahmin edilebilir, yüksek performanslı bir dil olarak güçlendirir.
Temel Geliştirmeler ve Geliştirici Ergonomisi
Rust 1.99.0'ın en büyük özelliği, "C" ve "C-unwind" ABI'lerini kullanarak C-ABI değişken argümanlı fonksiyonlar tanımlamanın kararlaştırılmasıdır. Geliştiriciler artık desteklenen hedeflerde C'nin va_list'i ile tamamen ABI uyumlu olan VaList türünden yararlanarak, doğrudan Rust içinde değişken bir argüman listesini (...) kabul eden fonksiyonlar uygulayabilirler. Argüman çıkarma, yalnızca güvenlik gereksinimlerini karşılayan türlerin değişken listeden okunabilmesini sağlayan, yeni kararlaştırılmış VaArgSafe özelliği (trait) tarafından katı bir şekilde korunur. Bu, eski C kütüphaneleriyle yoğun bir şekilde arayüz oluşturan sarmalayıcıların (wrapper), eklentilerin ve gömülü çalışma zamanlarının uygulanmasını büyük ölçüde basitleştirir.
Değişken argümanların yanı sıra Rust 1.99.0, standart koleksiyonlar ve vektör manipülasyonları genelinde ergonomiyi artırır. Vec::into_parts ve Vec::from_parts'ın kararlaştırılması; vektör tamponları, işaretçi kapasiteleri ve uzunlukları üzerinde düşük seviyeli kontrol vererek ham işaretçi yönetiminde bulunan benzer ilkelleri yansıtır. Ek olarak, VecDeque::retain_back'in dahil edilmesi, çift uçlu kuyruklar için arka uç filtreleme işlemlerini optimize eder. Standart kütüphane eklemeleri ayrıca, sabit boyuttaki yığın (heap) tahsisleri üzerindeki yaygın yineleme kalıplarını düzelterek, referanslar ve mutabık referanslar dahil olmak üzere kutulu diziler (Box<[T; N]>) için IntoIterator uygulamaları getirir.
Mimari Karşılaştırma Matrisi
| Özellik / Metrik | Önceki Kararlı Temel Çizgi | Rust 1.99.0 | Mimari Etki |
|---|---|---|---|
| C-ABI Değişken Argüman Tanımı | Yalnızca harici çağrı (extern "C") |
... aracılığıyla yerel tanım desteklenir |
Değişken argüman işleyicilerinin ve C uyumlu sarmalayıcıların yerel olarak yazılmasını sağlar. |
| Ham İşaretçi Düzeni Analizi | Sized türlerle sınırlı / kısmi DST desteği |
size_of_val_raw, align_of_val_raw, Layout::for_value_raw ile tamamen kararlaştırıldı |
Dinamik türlerin ve boyutlandırılmamış bellek düzenlerinin güvenli iç gözlemi. |
| Bellek Sızıntısı Rehberliği | Standart Box::leak kalıpları |
Kullanımdan kaldırılan gidiş-dönüş sızıntı kaldırma kalıpları | Yaklaşan özel tahsisçilerle optimizasyon çakışmalarını önler. |
| Vektör Bellek Manipülasyonu | Manuel özel güvenli olmayan (unsafe) soyutlamalar | Kararlaştırılmış Vec::into_parts ve Vec::from_parts |
Yığın vektörleri için standartlaştırılmış güvenli olmayandan güvenliye geçiş sınırı. |
Kritik Değişiklikler ve Geçiş Uyarıları
Rust 1.99.0, dil sözdizimi düzeyinde önceki kararlı sürümlerle tamamen geriye dönük uyumludur; mevcut kod tabanları sözdizimi değişikliği olmadan derlenecektir. Bununla birlikte, bu sürüm, özellikle sızıntılardan sonra bellekten kurtulma (deallocation) etrafında kritik semantik ve dokümantasyon kaymaları sunmaktadır. Daha önce gidiş-dönüş "sızıntı kaldırma" (previously leaked via Box::leak) gerçekleştiren kod tabanlarının bunu yapması artık kesinlikle önerilmemektedir. Çekirdek ekip, manuel işaretçi yeniden oluşturma gerektiren senaryolar için Box::from_raw veya Box::from_non_null ile eşleştirilmiş Box::into_raw veya Box::into_non_null önermek üzere dokümantasyonu güncellemiştir.
Bu kalıpların ayarlanmaması, gelecekteki derleyici yinelemelerine ve yaklaşan özel tahsisçi kararlılıklarına karşı derleme yaparken tanımlanmamış davranışlara veya optimizasyon gerilemelerine yol açabilir. Geliştiriciler, güncellenmiş yaşam döngüsü yönetimi önerilerine uygunluğu sağlamak için Box::leak veya ilgili standart kütüphane sızıntı fonksiyonlarını kullanan kod tabanlarını denetlemelidir.
Adım Adım Yükseltme Kılavuzu
Adım 1: Toolchain'inizi Rustup ile Güncelleyin
Geliştirme ortamınızı Rust 1.99.0'a yükseltmek için terminalinizde şu komutu çalıştırın:
$ rustup update stable
Adım 2: Proje Yapılandırmanızı Doğrulayın
Cargo.toml dosyanızın kararlı sürüm kanalını hedeflediğinden veya minimum gerekli sürümü belirttiğinden emin olun:
[package]
name = "my_project"
version = "0.1.0"
edition = "2021"
Adım 3: Sızıntı Anti-Örneklerini Yeniden Düzenleyin
Kod tabanınızdaki Box::leak örneklerini inceleyin. Mimariniz bir kutuyu ham bir işaretçiye ve tekrar sahip olunan bir yapıya dönüştürmeyi gerektiriyorsa, leak kullanımından uzaklaşıp açık ham işaretçi yönetimine geçin:
// Sızıntı/sızıntı kaldırma gidiş-dönüşleri yerine ham işaretçiler kullanan önerilen kalıp
let boxed = Box::new(42);
let raw_ptr: *mut i32 = Box::into_raw(boxed);
// Düşük seviyeli işlemleri gerçekleştir...
let recovered_box = unsafe { Box::from_raw(raw_ptr) };
