🚀 Dil ve Derleyici İyileştirmeleri​

  • Lint ve Uyumluluk: unused_visibilities artık varsayılan olarak uyarı veriyor. impl öğeleri, bağlı oldukları trait'lerin dead_code lint seviyesini devralıyor.
  • Unicode 17: Dil standartları en son Unicode 17 sürümüne güncellendi.
  • Kapanışlar (Closures):** Kapanışların değişkenleri yakalama (capturing) mekanizması daha tutarlı ve doğru hale getirildi; hatalı yaşam süresi (lifetime) çakışmaları engellendi.


🌐 Platform ve Mimari Desteği​

  • RISC-V:** riscv64im-unknown-none-elf hedefi (tier 3) eklendi. Ayrıca RVA22U64 ve RVA23U64 profilleri için 29 yeni hedef özellik stabilize edildi.


📦 Stabilize Edilen API'ler​

  • Koleksiyon ve Bellek: array_windows, element_offset ve LazyCell/LazyLock (get/get_mut/force_mut) artık kararlı.
  • Matematiksel Sabitler:** EULER_GAMMA ve GOLDEN_RATIO (f32/f64) eklendi.
    [*] Const Desteği:** f32::mul_add ve f64::mul_add artık const bağlamlarında kullanılabilir.
    [*] Donanım Intrinsics:** x86 AVX512fp16 ve AArch64 NEON fp16 komut setleri (f16 tipi hariç) stabilize edildi.


🛠️ Cargo Güncellemeleri​

  • Yapılandırma:** include anahtarı stabilize edildi; artık projeler arası konfigürasyon paylaşımı çok daha kolay.
    [*] Kayıt:** pubtime alanı eklendi (paketlerin yayınlanma zamanını tutar).
    [*] TOML v1.1:** Cargo artık TOML v1.1 formatını tam destekliyor.


⚠️ Uyumluluk ve Dikkat Edilmesi Gerekenler​

  • Makro İçe Aktarma:** Standart kütüphane makroları artık #[macro_use] yerine doğrudan prelude üzerinden içe aktarılıyor. Benzer isimli makrolar için çakışma uyarısı alabilirsiniz.
    [*] Path/Yol İşleme:** Derleyicinin ürettiği yollar artık mutlak (absolute) değil, --remap-path-prefix ile uyumlu ve göreceli (relative) formatta sunuluyor.
    [*] Windows Zamanı:** SystemTime::checked_sub_duration, Windows epoch öncesi (1601 öncesi) tarihler için None döndürecek şekilde güncellendi.
Sürüm: 1.93.1
Sürüm: 1.93.0
Sürüm: 1.92.0
Giderilen Hatalar
  • Illumos Dosya Kilitleme: Illumos işletim sisteminde dosya kilitleme (file locking) desteği etkinleştirildi. Bu, Cargo'nun derleme dizinini kilitleyememesi sorununu giderir ve derleme kararlılığını sağlar.
  • WASM Bağlayıcı Hatası: wasm_import_module niteliğinin çapraz sandıkta (cross-crate) düzgün çalışmaması düzeltildi. Bu, WASM hedeflerinde bağlayıcı (linker) hatalarını çözüyor.
Dil (Language)
  • Örüntü Bağlama ve Atma Sırası: Örüntü bağlamaları (pattern bindings), yazılma sırasına göre çözümlenir ve atma (drop) sırası, birincil bağlamaların sırasına göre belirlenir.
  • C-stili Variadic Fonksiyonlar: sysv64, win64, efiapi ve aapcs ABI'ları için C-stili variadic fonksiyonların (C-style variadic functions) kararlılığı sağlandı. Bu, bu ABI'ları, variadic fonksiyonların extern bloklarda beyan edilmesine (tanımlanmamasına) izin veren C ABI'ı ile uyumlu hale getirir.
  • Yeni Lint'ler (Kod Kalitesi Kontrolü):
    • dangling_pointers_from_locals: Yerel değişkenlerden sarkan işaretçilere (dangling pointers) karşı uyarı verir.
    • integer_to_ptr_transmutes: Integer'dan işaretçiye transmute işlemlerine karşı varsayılan olarak uyarı verir.
  • Önemli Lint Yükseltmesi: semicolon_in_expressions_from_macros linti, warn (uyarı) seviyesinden deny (reddet) seviyesine yükseltildi. Gelecekte bu bir hata olacaktır.
  • Hedef Özellik Kararlılığı: LoongArch32 satır içi assembly, sse4a ve tbm hedef özellikleri kararlı hale getirildi.
  • Yeni Yapılandırma Bayrakları: target_env = "macabi" ve target_env = "sim" cfg'leri, aynı değerlere sahip olan target_abi cfg'lerinin yerine eklendi.

Derleyici (Compiler)
  • Uyarı Engelleme: Erişilemez (unreachable) olarak değerlendirilen never tipinden any tipine yapılan as dönüşümlerinde artık uyarı verilmeyecek.

Platform Desteği
  • Tier 1 Yükseltmesi: aarch64-pc-windows-msvc hedefi Tier 1 seviyesine yükseltildi.
  • Tier 2 Yükseltmeleri: aarch64-pc-windows-gnullvm ve x86_64-pc-windows-gnullvm hedefleri, ana bilgisayar araçlarıyla birlikte Tier 2 seviyesine yükseltildi. (LLVM araçları ve MSI yükleyicileri gelecekte eklenecektir.)

Kütüphaneler (Libraries)
  • Panic Mesajları: panic mesajlarına iş parçacığı ID'sinin (thread ID) yazdırılması sağlandı.
  • Hata Yönetimi: std:🧵:Builder::stack_size ayarlama hatası başarısız olursa artık paniklemek yerine bir hata (error) döndürülür.
  • min/max Sırası Garantisi: std::cmp içindeki min, max ve minmax'ın _by() varyantları için parametre sırası garantilendi.
  • Trait Desteği: Clone ve Eq trait'leri hakkındaki varsayımlar belgelendi.

Kararlı Hale Getirilen API'ler
Bu sürümde çok sayıda yeni API ve const bağlamlarda kararlı hale getirilen API'ler bulunmaktadır. Önemli yeni API'lar arasında:
  • Atomik İşaretçi İşlemleri: AtomicPtr için fetch_ptr_add, fetch_ptr_sub, fetch_byte_add, fetch_byte_sub, fetch_or, fetch_and, ve fetch_xor.
  • Sıkı Aritmetik İşlemler: Tamsayılar ({integer}) için strict_add, strict_sub, strict_mul, strict_div gibi strict_ ön ekine sahip aritmetik metotlar.
  • Yol (Path) İşlemleri: Path::file_prefix, PathBuf::add_extension, PathBuf::with_added_extension.
  • Koleksiyonlar: BTreeMap::extract_if ve BTreeSet::extract_if.
  • Path Eşitliği: PathBuf ve Path için str ve String ile PartialEq uygulamaları.
  • Tupıllanmış Adresler: Ipv4Addr::from_octets, Ipv6Addr::from_octets, Ipv6Addr::from_segments.

Cargo
  • build.build-dir Kararlılığı: Geçici derleme artefaktlarının saklanacağı dizini belirleyen build.build-dir konfigürasyonu kararlı hale getirildi.
  • Hedef Takma Adı: --target bayrağı ve build.target konfigürasyonu, artık dahili olarak ana bilgisayarın hedef üçlüsüyle değiştirilecek olan "host-tuple" dize değişmezini kabul edebilir.

Uyumluluk Notları
  • Gereklilikler: Coroutine yakalamalarının drop-live olması artık her zaman gereklidir.
  • Apple Linkleme: cc ile linkleme yapılırken her zaman SDK kökü geçirilir. Bu, Xcode içinde çalışırken linkleme sorunlarını çözmelidir. /usr/local/lib içindeki kütüphaneler artık otomatik olarak linklenmeyebilir.
  • Hata Denetimi: let-else ile bildirilen bağlamalar için atma denetleyicisinin daha hoşgörülü olması düzeltildi. Nitelikleri ayrıştırırken daha katı olunacak ve geçersiz niteliklerde hata verilecektir.
  • Kullanımdan Kaldırma: semicolon_in_expressions_from_macros linti artık varsayılan olarak reddedilir.
  • Geçici Kapsam Kısıtlaması: pin!, format_args!, write!, ve writeln! makroları tarafından oluşturulan geçici değişkenlerin kapsamı, Rust Edition 2024'teki if let geçici kapsam kurallarına uyacak şekilde kısıtlandı.
Sürüm: 1.90.0
Dil (Language):
  • Sabit Bağımsız Değişkenler: Açıkça çıkarılan sabit bağımsız değişkenlerin kararlılığı sağlandı.
  • Yaşam Süresi Kontrolü: Fonksiyon bağımsız değişkenleri ve dönüş değerleri arasında aynı yaşam süresinin farklı sözdizimi kategorileriyle kullanılmasına yönelik yeni bir lint (kod analizi) uyarısı eklendi.
  • Derleme ve Bellek: i128 ve u128 tipleri improper_ctypes_definitions kapsamından çıkarıldı ve repr128 özelliği kararlı hale getirildi.
  • AVX512 ve Diğer Hedef Özellikleri:
    • AVX512 hedef özellikleri kararlı hale getirildi.
    • x86 için kl ve widekl hedef özellikleri kararlı hale getirildi.
    • x86 için sha512, sm3 ve sm4 hedef özellikleri kararlı hale getirildi.
    • LoongArch için f, d, frecipe, lasx, lbt, lsx ve lvz hedef özellikleri kararlı hale getirildi.
  • Geçici Yaşam Süresi: Geçici yaşam süresi uzantısı artık tuple struct ve tuple variant oluşturucuları üzerinden de genişletiliyor.
  • WebAssembly (Wasm): wasm32-unknown-unknown hedefindeki extern "C" fonksiyonları artık standartlara uyumlu bir ABI'ye (Application Binary Interface) sahiptir.

Derleyici (Compiler):
  • Çerçeve İşaretçileri:
    • aarch64-linux üzerinde varsayılan olarak non-leaf frame işaretçileri kullanılması sağlandı.
    • Arm64EC Windows için non-leaf frame işaretçileri etkinleştirildi.
    • Apple çerçeve işaretçileri mimariye göre ayarlandı.

Platform Desteği:
  • LoongArch: loongarch32-unknown-none ve loongarch32-unknown-none-softfloat olmak üzere iki yeni Tier-3 hedefi eklendi.
  • x86_64-apple-darwin hedefi, ana bilgisayar araçlarıyla birlikte Tier 2'ye düşürülme sürecindedir.

Kütüphaneler (Libraries):
  • Geliştirilmiş API'lar: File için lock, unlock, try_lock gibi dosya kilitleme metotları eklendi. NonNull için from_ref, from_mut gibi yeni metotlar eklendi.
  • Fonksiyonellik: format_args!() makrosunun bir değişkende saklanmasına izin verildi.
  • Genel: NonZero<char>, çeşitli x86, AVX512, SHA512, SM3 ve SM4 intrinsics'leri kararlı hale getirildi.

Cargo:
  • Düzeltme Komutları: cargo fix ve cargo clippy --fix komutları, artık varsayılan olarak diğer derleme komutlarıyla aynı Cargo hedef seçimini kullanacak. Bu, daha tutarlı bir davranış sağlar.
  • Çapraz Derleme: doctest-xcompile özelliği kararlı hale getirildi. Artık çapraz derleme sırasında doctest'ler de test ediliyor.

Rustdoc:
  • Mobil Uyum: Mobil cihazlarda kenar çubuğu tam genişlikte olacak şekilde ve metinler satır sonu yapacak şekilde ayarlandı. Bu, uzun bölüm ve öğe adlarının mobil cihazlarda daha kolay okunmasını sağlar.
Dil İyileştirmeleri:
  • let_chains Özelliği Kararlı Hale Getirildi: Artık if ve while ifadeleri içinde && ile zincirleme let ifadeleri kullanılabiliyor. Bu, boolean ifadelerle karışık kullanım imkanı sunuyor ve let alt ifadelerindeki desenler ister çürütülemez ister çürütülebilir olsun fark etmiyor.
  • naked_functions Kararlı Hale Getirildi: Derleyici tarafından oluşturulan önsöz ve sonsöz içermeyen fonksiyonlar yazmaya olanak tanıyor. Bu sayede belirli bir fonksiyon için üretilen assembly kodu üzerinde tam kontrol sağlanıyor.
  • cfg_boolean_literals Kararlı Hale Getirildi: #[cfg(true)] ve #[cfg(false)] gibi boolean değişmezlerinin cfg koşul ifadesi olarak kullanılmasına izin veriliyor.
  • #[bench] Niteliği Tamamen Kararsızlaştırıldı: Rust 1.77'den beri #![feature(custom_test_frameworks)] olmadan #[bench] kullanımı varsayılan olarak reddedilen gelecekteki uyumsuzluk uyarısını tetiklese de, artık doğrudan bir hata olacak.
  • dangerous_implicit_autorefs Lint Eklendi: Ham işaretçi referanslarının dolaylı olarak otomatik referanslanmasına karşı varsayılan olarak uyarı veren bir lint eklendi. Bu lint, Rust'ın bir sonraki sürümünde varsayılan olarak reddedilen bir uyarıya dönüşecek.
  • invalid_null_arguments Lint Eklendi: Null işaretçilerin geçersiz kullanımını önlemek için clippy::invalid_null_ptr_usage'dan yükseltilen invalid_null_arguments lint'i eklendi.
  • Yerleşik uygulamalar ve önemsiz where koşulları için trait uygulama adayı tercihi değiştirildi.
  • Jenerik const parametre varsayılanlarının tipleri kontrol edilecek.
Derleyici:
  • Üretilecek DWARF hata ayıklama bilgisinin sürümünü seçmek için -Cdwarf-version kararlı hale getirildi.
Platform Desteği:
  • i686-pc-windows-gnu Tier 2'ye düşürüldü. Rust'ın kademeli platform desteği hakkında daha fazla bilgi için Rust'ın platform destek sayfasına bakabilirsiniz.
Kütüphaneler:
  • #[should_panic] test başarısızlık mesajından ters tırnak işaretleri kaldırıldı.
  • Durum bilgisi olan bir closure iletilmesi durumunda, [T; N]::from_fn'in artan indeks sırasına göre üretilmesi garanti edildi.
  • libtest bayrağı --nocapture yerine daha tutarlı olan --no-capture bayrağı lehine kullanımdan kaldırıldı.
  • {float}::NAN'ın sessiz bir NaN olması garanti edildi.
Kararlı Hale Getirilen API'ler:
  • Cell::update
  • impl Default for *const T
  • impl Default for *mut T
  • HashMap::extract_if
  • HashSet::extract_if
  • proc_macro::Span::line
  • proc_macro::Span::column
  • proc_macro::Span::start
  • proc_macro::Span::end
  • proc_macro::Span::file
  • proc_macro::Span::local_file
Daha Önce Kararlı Olan ve Artık:
  • NonNull<T>::replace
  • <*mut T>::replace
  • std::ptr::swap_nonoverlapping
  • Cell::{replace, get, get_mut, from_mut, as_slice_of_cells}
Cargo:
  • Otomatik çöp toplama kararlı hale getirildi.
  • Rust kodunda gzip sıkıştırması için zlib-rs kullanılacak.
Rustdoc:
  • Doküman testleri, ignore-* nitelikleri kullanılarak hedef adlarına göre yoksayılabilir.
  • Bir doküman testini çalıştırmak için bir program (qemu gibi) ve argümanlarını belirtmek üzere --test-runtool ve --test-runtool-arg CLI seçenekleri kararlı hale getirildi.
Uyumluluk Notları:
  • Yapıştırılan tokenlerin dahili temsilinin değiştirilmesi tamamlandı. Daha önce belirsiz durumlarda kabul edilen belirli geçersiz bildirimsel makrolar, derleyici tarafından artık doğru şekilde reddediliyor. Bir tt fragment belirleyicisi kullanmak genellikle bu makroları düzeltebilir.
  • #[bench] niteliği tamamen kararsızlaştırıldı. Rust 1.77'den beri #![feature(custom_test_frameworks)] olmadan #[bench] kullanımı zaten varsayılan olarak reddedilen gelecekteki uyumsuzluk uyarısını tetiklese de, artık doğrudan bir hata olacak.
  • Bazı her zaman doğru desenlerin ödünç alma kontrolü düzeltildi. Ödünç alma denetleyicisi bazı durumlarda aşırı hoşgörülü davranarak derlenmemesi gereken programlara izin veriyordu.
  • Minimum harici LLVM sürümü 19'a güncellendi.
  • Gerekli hedef özelliği etkinleştirmeden Rust dışı bir ABI ile vektör türü kullanmak artık kesin bir hata olarak kabul edilecek.
Anonymous Pipes:
1.87 sürümü, standart kütüphaneye anonim borulara erişim ekler. Bu, std::process::Command'ın giriş/çıkış metotlarıyla entegrasyonu içerir. Örneğin, standart çıktı (stdout) ve standart hata (stderr) akışlarını tek bir akışta birleştirmek, daha önce ek iş parçacıkları (threads) veya platforma özgü fonksiyonlar gerektirirken, aşağıda gösterildiği gibi artık nispeten basittir.

Kod:
use std::process::Command;
use std::io::Read;

let (mut recv, send) = std::io::pipe()?;

let mut command = Command::new("path/to/bin")
    // Both stdout and stderr will write to the same pipe, combining the two.
    .stdout(send.try_clone()?)
    .stderr(send)
    .spawn()?;

let mut output = Vec::new();
recv.read_to_end(&mut output)?;

// It's important that we read from the pipe before the process exits, to avoid
// filling the OS buffers if the program emits too much output.
assert!(command.wait()?.success());

Daha fazlası...