CodeBlanks Logo Icon CodeBlanks

MIR

Mid-level IR (MIR) ve borrow check ile olan ilişkisini öğrenirsin.

MIR

MIR (Mid-level IR), fonksiyonu bir kontrol akış grafiğine çevirir: temel bloklar, aralarındaki atlamalar ve her bloktaki basit deyimler. Ödünç denetleyicisi, sabit değer hesaplama (const fn) ve bazı optimizasyonlar MIR üzerinde çalışır. Ömürlerin "sözcüksel kapsam" yerine gerçek kullanım noktalarına göre hesaplanması (NLL) da burada mümkün olur:

let mut v = vec![1];
let ilk = &v[0];
println!("{ilk}");   // ilk'in son kullanımı
v.push(2);           // NLL: ödünç burada çoktan bitmiş
println!("{:?}", v);

Playground'da "Show MIR" ya da rustc --emit=mir ile MIR görülebilir.

Temel bloklar

MIR'de her fonksiyon bb0, bb1... gibi temel bloklardan oluşur. Her blok düz deyimlerle başlar ve tek bir sonlandırıcı ile biter: goto, switchInt (dallanma), call, return, drop. Drop çağrıları da bu aşamada açıkça yerleştirilir; bu yüzden derleyici hangi değerin nerede bırakılacağını kesin bilir.

bb0: {
    _2 = Len(_1);
    _3 = Lt(const 0_usize, _2);
    assert(move _3, "index out of bounds") -> bb1;
}

Uygulama NLL örneği

Yukarıdaki NLL örneğini yaz: let mut v = vec![1];, ilk elemana referans al ve yazdır, ardından v.push(2) yap ve vektörü yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn main() {
    let mut v = vec![1];
    let ilk = &v[0];
    println!("{}", ilk);
    v.push(2);
    println!("{:?}", v);
}

Beklenen çıktı

1
[1, 2]

Soru ve cevaplar

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

1 NLL (non-lexical lifetimes) öncesi yukarıdaki kod neden derlenmezdi?

  • push yoktu
  • Vec yoktu
  • Derlenirdi
  • ilk'in ödüncü bulunduğu bloğun sonuna kadar sürdüğü kabul edilirdi Doğru cevap

Açıklama: 2018 sürümüyle gelen NLL, ödünçleri MIR'deki son kullanım noktasına göre bitirir.

2 MIR çıktısı

Soru
$ rustc --emit=____ main.rs
Cevap
$ rustc --emit=mir main.rs

Açıklama: --emit=mir derleyicinin MIR çıktısını dosyaya yazar.

3 MIR kavramı ve anlamı

Kavram Anlamı
bb0 Temel blok
switchInt Dallanma
drop(_1) Açık bırakma
NLL Kullanıma göre ömür

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