CodeBlanks Logo Icon CodeBlanks

LLVM IR

LLVM backend'ini ve kod üretim sürecini öğrenirsin.

LLVM IR

MIR, LLVM ara gösterimine çevrilir ve LLVM optimizasyonları (satır içi alma, sabit katlama, döngü açma, vektörleştirme) burada uygulanır; ardından hedef işlemci için makine kodu üretilir. Optimizasyon düzeyi opt-level ile seçilir: debug derlemede 0, release'te 3.

fn kare_toplam(n: u64) -> u64 {
    (1..=n).map(|i| i * i).sum()
}
// release'te LLVM bu döngüyü n(n+1)(2n+1)/6 formülüne çevirebilir

Çıktıyı görmek için: cargo rustc --release -- --emit=llvm-ir ya da Compiler Explorer (godbolt.org).

Debug ve release farkı

Debug derlemede taşma denetimleri ve hata ayıklama bilgisi açıktır, optimizasyon yoktur; release'te tersi. Performans her zaman release derlemede ölçülmelidir: aynı kod debug'da 10–100 kat yavaş olabilir. Ara seçenekler Cargo.toml'da ayarlanır:

[profile.dev]
opt-level = 1          # debug'da biraz optimizasyon

[profile.release]
debug = true           # profilleme için sembol bilgisi
codegen-units = 1      # daha iyi optimizasyon, daha yavaş derleme

Uygulama Kareler toplamı

Yukarıdaki kare_toplam fonksiyonunu yaz. Girdiyi std::hint::black_box(10u64) ile vererek sonucu yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
fn kare_toplam(n: u64) -> u64 {
    (1..=n).map(|i| i * i).sum()
}

fn main() {
    let n = std::hint::black_box(10u64);
    println!("{}", kare_toplam(n));
}

Beklenen çıktı

385

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Benchmark yazarken neden <code>std::hint::black_box</code> kullanılır?

  • Bellek ayırmak için
  • Hata ayıklamak için
  • Derleyicinin değeri bilinen sabit sayıp hesabı tamamen silmesini engellemek için Doğru cevap
  • Programı hızlandırmak için

Açıklama: Sabit girdiyle çağrılan saf bir fonksiyon derleme anında hesaplanabilir; ölçülen süre gerçeği yansıtmaz.

2 Optimizasyonu engelle

Soru
let n = std::hint::____(10u64);
println!("{}", kare_toplam(n));
Cevap
let n = std::hint::black_box(10u64);
println!("{}", kare_toplam(n));

Açıklama: black_box değeri derleyiciye bilinmeyen gösterir.

3 Ayar ve etkisi

Kavram Anlamı
opt-level = 0 Optimizasyon yok
opt-level = 3 Tam optimizasyon
--emit=llvm-ir LLVM IR çıktısı
black_box Katlamayı engeller

Uzman bölümündeki tüm dersler