Rust 1.99 Yenilikleri: C ABI ile Variadic Fonksiyon Tanımlama, size_of_val_raw ve 17 Yeni Kararlı API

Alesta WEB

Rust 1.99 Yenilikleri: C ABI ile Variadic Fonksiyon Tanımlama, size_of_val_raw ve 17 Yeni Kararlı API

Kısa cevap: Rust 1.99.0 1 Ekim 2026'da yayımlandı. En önemli yenilik, Rust'ta artık C ABI'si ile değişken sayıda argüman alan (variadic) fonksiyon tanımlanabilmesi: unsafe extern "C" fn sum(mut args: ...). Bunun yanında ham işaretçilerden boyut ve hizalama okuyan size_of_val_raw, align_of_val_raw ve Layout::for_value_raw kararlı hale geldi; Vec::into_parts, Box::into_non_null, VecDeque::retain_back ve std::fs::set_times dahil 17 API eklendi. Güncellemek için rustup update stable yeterli (Rust 1.99 release notes, C variadic functions).

Rust 1.99'da neler var? (What's new in Rust 1.99)

Rust altı haftalık sürüm döngüsünü sürdürüyor ve 1.99, 20 Ağustos'ta çıkan 1.98'in ardından gelen sürüm. Büyük bir dil değişikliği yok; ama C ile birlikte çalışan kod yazanlar, kendi bellek ayırıcısını yazanlar ve düşük seviyeli kütüphane geliştiriciler için uzun süredir beklenen parçalar tamamlandı. Kısaca:

  • C ve C-unwind ABI'siyle variadic fonksiyon tanımlama kararlı.
  • Ham işaretçiler için boyut/hizalama sorgulama fonksiyonlarının güvenlik kuralları netleşti ve kararlı oldu.
  • Box::leak ve benzeri fonksiyonlar için belgelerde kullanım önerisi değişti.
  • 17 yeni kararlı API.

Bir sonraki sürüm Rust 1.100.0 olacak ve 12 Kasım 2026'da çıkması bekleniyor. Üç basamaklı sürüm numarasına geçiş, araçların sürüm karşılaştırmasını doğru yapıp yapmadığını test etmek için de iyi bir fırsat.

Ekranda görüntülenen program kodu (Computer code displayed on a screen)
Variadic fonksiyon desteği, C kütüphanelerini parça parça Rust'a taşımayı kolaylaştırıyor. Fotoğraf: Rob Wingate / Unsplash

C ABI ile variadic fonksiyon tanımlama (C variadic functions)

Rust uzun zamandır printf gibi değişken sayıda argüman alan C fonksiyonlarını çağırabiliyordu. Ama bu tür bir fonksiyonu Rust içinde tanımlamak kararlı sürümde mümkün değildi. Bu eksik, C kütüphanelerinin geri çağırma (callback) bekleyen arayüzlerini Rust ile yazmayı ya da mevcut bir C kütüphanesini parça parça Rust'a taşımayı zorlaştırıyordu.

1.99 ile bu kapandı. Sürüm duyurusundaki örnek:

PHP
/// GÜVENLİK: en az 2 adet i32 argümanla çağrılmalı.
unsafe extern "C" fn sum(mut args: ...) -> i32 {
    // GÜVENLİK: çağıran tarafından garanti ediliyor.
    let a = unsafe { args.next_arg::<i32>() };
    let b = unsafe { args.next_arg::<i32>() };
    a + b
}

fn foo() -> i32 {
    unsafe { sum(0i32, 2i32) }
}

Burada ... parametresinin tipi core::ffi::VaList ve C'deki va_list ile ABI uyumlu. Argümanlar next_arg::<T>() ile sırayla okunuyor; hangi tiplerin okunabileceğini VaArgSafe trait'i belirliyor. Okuma işlemi doğal olarak unsafe: kaç argüman geldiğini ve tiplerini derleyici bilemez, bu sözleşme çağırana ait.

Aynı sürümde C dışındaki ABI'lerle variadic naked fonksiyonlar da kararlı oldu. Bunlar gövdesini tamamen satır içi assembly ile yazmanız gereken, işletim sistemi çekirdeği veya gömülü sistem gibi alanlarda kullanılan fonksiyonlar.

Ham işaretçilerden boyut ve hizalama (size_of_val_raw)

mem::size_of_val bir referansın gösterdiği değerin boyutunu verir. Ama referans oluşturmak, değerin geçerli ve hizalı olduğunu varsayar. Henüz başlatılmamış bellekle ya da dilim ([T]) veya trait nesnesi (dyn Trait) gibi boyutu çalışma anında belli olan tiplerle çalışırken bu varsayım sorun çıkarıyordu.

1.99'da ham işaretçi alan sürümlerin güvenlik koşulları netleştirildi ve şu üç fonksiyon kararlı hale geldi:

  • core::mem::size_of_val_raw
  • core::mem::align_of_val_raw
  • core::alloc::Layout::for_value_raw

Bu fonksiyonlar özellikle özel bellek ayırıcıları, akıllı işaretçi kütüphaneleri ve Rc/Arc benzeri yapıları kendisi yazanlar için önemli. Önceden gece (nightly) derleyiciye ya da kırılgan geçici çözümlere ihtiyaç duyan kod artık kararlı Rust ile yazılabiliyor.

Box::leak için yeni yönlendirme

Box::leak bir kutuyu bilerek "sızdırır" ve 'static ömürlü bir referans döndürür. Bazı projeler bu referansı daha sonra geri çevirip belleği serbest bırakıyordu. 1.99'da dil anlamında bir değişiklik yok, ama belgeler artık bu kalıbı önermiyor: belleği sonradan geri alacaksanız Box::into_raw ya da yeni kararlı olan Box::into_non_null kullanılmalı. Aynı öneri standart kütüphanedeki diğer leak fonksiyonları için de geçerli. Kod tabanınızda leak sonrası from_raw çağrısı varsa gözden geçirmek iyi olur.

Kararlı hale gelen API'ler (Stabilized APIs)

APINe işe yarar?
Vec::into_parts / Vec::from_partsVektörü işaretçi, uzunluk ve kapasite olarak ayırır ve geri birleştirir; FFI ve özel ayırıcılar için
Box::into_non_null / Box::from_non_nullKutuyu NonNull<T> olarak alıp geri verir
VecDeque::retain_backKuyruğu sondan filtreler
String::from_utf8_lossy_ownedBayt vektörünü kopyalamadan, geçersiz baytları değiştirerek String'e çevirir
FromUtf8Error::into_utf8_lossyBaşarısız dönüşümden kayıplı ama kullanılabilir metin üretir
std::fs::set_times / set_times_nofollowDosyanın erişim/değiştirme zamanını yol üzerinden ayarlar (sembolik bağı izlemeden de)
IntoIterator for Box<[T; N]>Kutudaki diziyi doğrudan for ile gezme
FusedIterator for StepBy<I>step_by yineleyicisi bittikten sonra hep None döndürür
core::ffi::VaListVariadic argüman listesi tipi

Web tarafında en pratik olanı muhtemelen String::from_utf8_lossy_owned: dışarıdan gelen, kodlaması bozuk olabilecek veriyi (form girdisi, eski veritabanı kayıtları, dosya adları) ekstra kopya olmadan metne çevirmeyi kolaylaştırıyor.

Güncelleme ve dikkat edilecekler

Metin
rustup update stable
rustc --version   # rustc 1.99.0
  • Variadic tanımları unsafe olarak düşünün. C tarafından yanlış sayıda argümanla çağrılan bir fonksiyon tanımsız davranışa yol açar. Fonksiyonun belgesine sözleşmeyi yazın.
  • CI'da sürüm karşılaştırmasını test edin. 1.100 çıktığında "1.99 > 1.100" gibi metin karşılaştırması yapan betikler yanlış sonuç verir. rust-version alanı ve MSRV kontrolleri sayısal karşılaştırma yapmalı.
  • Clippy ve Cargo değişiklik günlüklerine bakın. Sürüm duyurusu ayrıntılı değişiklikleri ayrı sayfalara bırakıyor.

Alesta WEB olarak web projelerimizde Rust ile yazılmış araçları (paketleyiciler, biçimlendiriciler, Python paket yöneticisi uv) günlük olarak kullanıyoruz; dilin her sürümü bu araçların hızına ve güvenilirliğine doğrudan yansıyor. Diğer dil güncellemeleri için Zig 0.17 ve Go 1.27 yazılarımıza bakabilirsiniz.

Sık sorulan sorular

Rust 1.99 ne zaman çıktı?

1 Ekim 2026'da. Bir sonraki sürüm 1.100.0, 12 Kasım 2026'da bekleniyor.

Rust'ta printf gibi fonksiyon yazabilir miyim?

Evet. 1.99'dan itibaren unsafe extern "C" fn ad(mut args: ...) ile C ABI'sinde variadic fonksiyon tanımlayabilir, argümanları args.next_arg::<T>() ile okuyabilirsiniz.

Bu sürümde kırıcı değişiklik var mı?

Sürüm duyurusunda dil semantiğini bozan bir değişiklik yok. Box::leak için yalnızca belge önerisi değişti.

Rust nasıl güncellenir?

rustup update stable komutuyla. rustup kurulu değilse rust-lang.org üzerinden kurulum betiğini kullanın.

Kaç yeni API kararlı oldu?

17. Aralarında Vec::into_parts, Box::into_non_null, VecDeque::retain_back ve std::fs::set_times var.

İlgili yazılar: Rust 1.85 ve 2024 Edition · uv paket yöneticisi · Web yazılım hizmetlerimiz

Kapak fotoğrafı: Rob Wingate / Unsplash

Hazır mısınız?

Projenizi birlikte planlayalım

Haber sitesi, adisyon, QR menü ya da kurumsal web sitesi — ihtiyacınızı dinleyelim, demo hesabı açalım ve yazılı teklifimizi iletelim. Görüşme ücretsizdir.

WhatsApp