· kaynak Hacker News – Front Page (native)
Rust 1.100, never type'ı, özel allocator'ları ve Cargo'nun kullanılmayan bağımlılık uyarılarını stabil hale getirdi
Rust 1.100.0, on yıllık başarısız denemelerin ardından never type'ı, Vec ve Box için çekirdek düzeyde özel allocator desteğini, DropGuard yardımcısını ve kullanılmayan bağımlılıklara yönelik yeni Cargo uyarılarını getiriyor.

Rust ekibi, dilin 1.100.0 sürümünü yayımladı; sürümün başrolünde, yaklaşık on yıllık çalışmanın ardından never type'ın stabilize edilmesi var. 12 Kasım'da Rust Blog'da yayımlanan duyuruya göre stable araç zincirindeki kullanıcılar sürümü rustup ile alabilir ve gönderi, geliştiricilerin gelecek sürümlerin test edilmesine yardım etmek istemeleri halinde beta veya nightly kanallarını denemeleri için teşvik ediyor.
Never type nihayet stabil
Kaynak kodda ! olarak yazılan never type, dilin tanımlı olmayan (uninhabited) türüdür: return, break veya std::process::exit gibi hiçbir zaman bir değere çözümlenmeyen ifadeleri tanımlar. Rust Blog'a göre bunun landing'i on yıl ve beş başarısız stabilizasyon denemesi aldı.
Bu türden hiçbir değer var olamayacağı için derleyici !'yi herhangi başka bir türe zorlayabilir (coerce); bir match kolunun değer üretirken diğerlerinin dallanmasına izin veren de budur. Bu davranış uzun zamandır gözlemlenebiliyordu ve fonksiyonlar zaten -> ! bildirebiliyordu. Yeni olan, türün artık her yerde adlandırılabilmesi — örneğin başarısız olamayan bir işlemi belirtmek için Result<T, !> gibi bir imzada. Bunun üzerine Infallible artık !'nin bir alias'ı haline geliyor; bu da Infallible etrafında kurulmuş eski API'leri never type ile uyumlu hale getiriyor.
Bu alias kırıcı bir değişiklik gerektirdi: never type fallback'i, 2024 edition'ın zaten yaptığı gibi, 2015, 2018 ve 2021 edition'larda () yerine ! oluyor. Ekip etkinin neredeyse fark edilmeyeceğini düşünüyor, ancak uç durumlar mevcut — örneğin generic parametre döndüren bir fonksiyonun sonucunu yok sayan kod — ve derleyici artık daha fazla kodu erişilemez (unreachable) olarak işaretleyebilir. Uyumluluk uyarıları çok önceden yapıldı ve etkilenen public crate'ler için düzeltmeler yayımlandı; bu yüzden öneri, derlenemeyen bağımlılıkları sabitlemek yerine güncellemek.
Vec ve Box için özel allocator'lar
allocator_api özelliğinin çekirdek parçaları artık stabil; kütüphane yazarlarına, yeni stabilize edilen Allocator trait'i üzerinden özel allocator tanımlama ve bunları Vec ve Box ile kullanma imkanı veriyor. Rust Blog bunu, daha kapsamlı Allocators 1.0 çabasının temeli olarak sunuyor: API yüzeyi genişledikçe daha fazla koleksiyonun ve işaretçi türünün özel allocator'ları desteklemesi bekleniyor.
Her çıkış yolunda temizlik için DropGuard
Yeni bir yardımcı olan core::mem::DropGuard, kapsam dışına çıktığında bir closure çalıştırıyor — erken dönüşlerde, ? ile hata yayılımında ve panic'lerde dahil her çıkış yolunda. Guard bir değeri sarar, ona dereference yaparak değerin normal şekilde kullanılabilmesini sağlar ve closure çalıştığında değeri tüketir. Bir dismiss metodu, closure'ı çağırmadan değeri geri veriyor; duyuru bunu, ya tamamen uygulanır ya geri alınan işlem (transaction) tarzı mantık için bir yapı taşı olarak öne çıkarıyor; örneği, ayrıştırma yarı yolda başarısız olursa bir vektördeki değişiklikleri geri alıyor.
Zero-sized değerler oluşturmanın standart bir yolu
std::mem::conjure_zst, unsafe kodda zero-sized türde bir değer oluşturmanın belgelenmiş tek yolunu sunuyor ve geliştiricilerin önceden bel bağladığı çeşitli hilelerin yerini alıyor. Fonksiyon unsafe, çünkü bazı API'ler zero-sized token'ların oluşturulmasının imkansız olmasına dayanıyor: duyuru, Python'un global interpreter lock'unu tutmayı temsil eden PyO3'ün Python<'py> işaretçisini örnek veriyor; onu yoktan var etmek başka türlü güvenli çağrıların bu ön koşulu ihlal etmesine izin verirdi.
Cargo kullanılmayan bağımlılıkları işaretliyor
Cargo artık kullanılmayan bağımlılıklar konusunda uyarıyor; cargo::unused_dependencies lint'i ile varsayılan olarak etkin ve Cargo.toml'daki ilgili satırı, girdiyi kaldırma önerisiyle birlikte gösteriyor. Uyarının sınırları var: yalnızca bir bağımlılık girdisini kullanma ihtimali olan her build target'in derlendiği durumlarda görünüyor ve dev-dependency'ler hariç tutuluyor, çünkü tüm geliştirme target'lerinin derlendiğini garanti etmenin bir yolu yok. Bu özellik, Cargo.toml'daki [lints.cargo] tablosuyla denetlenen Cargo için yeni bir lint sisteminin parçası; gönderi bunun bir proje hedefini tamamladığını söylüyor.
Sürüm notları ayrıca azaltılmış Cargo cache çakışmalarını, bir min-publish-age seçeneğini ve her zamanki yeni stabilize edilmiş API grubunu kapsıyor.
Neden önemli
Bu sürüm, uzun süredir devam eden birkaç çabayı aynı anda stable Rust'a taşıyor. Never type on yıllık bir tasarım sorusunu kapatıyor, başarısız olamaz API'lerin nasıl ifade edilebileceğini değiştiriyor ve sürümün tek kasıtlı kırıcı değişikliğini getiriyor — yani büyük bağımlılık ağaçlarının bakımcıları yine de build kırılmalarıyla karşılaşabilir ve etkilenen crate'leri güncellemelidir. Allocator çalışması gömülü sistemler, çekirdek ve performansa duyarlı kod için yönü belirlerken, DropGuard ve conjure_zst günlük kullanım kolaylığına değiniyor. Gelecek açısından belki en belirgin olanıysa, Cargo lint sisteminin build aracının kendisi için yeni bir genişletilebilirlik yüzeyi açması.
- #rust
- #programming-languages
- #cargo
- #systems-programming
- #release