Özet - Derleyici içleri
- Rust kursu
- Uzman
- Ders 6/46
- 5 dk
HIR, MIR ve LLVM IR'ı birleştirerek bir derleme akışı şeması çıkarırsın.
Derleyici içleri özeti
Derleme hattı: belirteçler → AST (makrolar, ad çözümleme) → HIR (şekerler çözülür, tür denetimi, trait çözümü) → MIR (kontrol akış grafiği, ödünç denetimi, NLL, sabit hesaplama) → LLVM IR (optimizasyon) → makine kodu. Tür çıkarımı fonksiyon içinde kısıt birleştirme ile çalışır. Debug ve release derlemeleri farklı denetimler ve optimizasyonlar uygular; örneğin tamsayı taşma denetimi yalnızca debug'da varsayılan olarak açıktır.
Niyeti açık taşma
Tamsayı yöntemleri, taşma durumunda ne olacağını her derlemede aynı kılar:
let x: u8 = 255;
println!("{:?}", x.checked_add(1)); // None
println!("{}", x.wrapping_add(1)); // 0
println!("{}", x.saturating_add(1)); // 255
println!("{:?}", x.overflowing_add(1)); // (0, true)Sayaçlar ve hash'ler için wrapping_*, sınırlı değerler için saturating_*, doğrulama için checked_* doğal seçimlerdir.
Uygulama Taşma yöntemleri
let x: u8 = 255; için checked_add(1) ({:?}), wrapping_add(1) ve saturating_add(1) sonuçlarını boşlukla tek satırda yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn main() {
let x: u8 = 255;
println!("{:?} {} {}", x.checked_add(1), x.wrapping_add(1), x.saturating_add(1));
}Beklenen çıktı
None 0 255
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>255u8 + 1</code> release derlemesinde (varsayılan ayarlarla) ne olur?
- Her zaman panic
- 256 olur
- Derleme hatası her zaman
- Sarar ve 0 olur; debug'da ise panic verir Doğru cevap
Açıklama: Davranışın derlemeye göre değişmemesi için niyeti açıkça yaz: checked_add, wrapping_add, saturating_add. (Sabit ifadeyi derleyici zaten hata olarak yakalar.)
2 Sınırda kal
let x: u8 = 255;
let y = x.____(1); // 255
let x: u8 = 255;
let y = x.saturating_add(1); // 255
Açıklama: saturating_add taşmada türün sınırında kalır.
3 Yöntem ve 255u8 + 1 sonucu
| Kavram | Anlamı |
|---|---|
checked_add |
None |
wrapping_add |
0 |
saturating_add |
255 |
overflowing_add |
(0, true) |