MIR
- Rust kursu
- Uzman
- Ders 2/46
- 4 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
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ı
$ rustc --emit=____ main.rs
$ 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 |