Canlı değişken analizi - Live variable analysis

İçinde derleyiciler, canlı değişken analizi (ya da sadece canlılık analizi) bir klasik veri akışı analizi hesaplamak için değişkenler bunlar canlı programın her noktasında. Bir değişken canlı bir noktada, gelecekte ihtiyaç duyulabilecek bir değeri tutuyorsa veya değeri değişkenin bir sonraki yazılmasından önce okunabiliyorsa eşdeğerdir.

Misal

Aşağıdaki programı düşünün:

b = 3c = 5a = f (b * c)

2. ve 3. satırlar arasındaki canlı değişkenler kümesi {b, c} çünkü her ikisi de 3. satırdaki çarpmada kullanılır. Ancak 1. satırdan sonraki canlı değişkenler kümesi yalnızca {b}, değişken olduğundan c 2. satırda daha sonra güncellenir. Değişkenin değeri a bu kodda kullanılmaz.

Atamanın a olarak elenebilir a daha sonra kullanılmaz, ancak 3. satırın tümünün çıkarıldığını doğrulamak için yeterli bilgi yoktur. f yan etkileri olabilir (baskı M.Ö, belki).

Veri akışı denklemleri cinsinden ifade

Canlılık analizi, "geriye dönük olabilir" analizidir. Analiz bir geriye doğru sipariş ve veri akışı izdiham operatörü dır-dir birlik kurmak. Başka bir deyişle, içinde belirli sayıda mantıksal dal bulunan bir işleve canlılık analizi uygulanıyorsa, analiz, başlangıca doğru (dolayısıyla "geriye doğru") çalışan işlevin sonundan başlayarak gerçekleştirilir ve eğer bir değişken canlı olarak kabul edilir. İşlev içinde ilerleyen dallardan herhangi biri potansiyel olarak (dolayısıyla "olabilir") değişkenin mevcut değerine ihtiyaç duyabilir. Bu, "geriye dönük zorunluluk" analizinin tersidir ve bunun yerine bu koşulu ilerleyen tüm şubelerde uygulayabilir.

Belirli bir temel blok için kullanılan veri akışı denklemleri s ve çıkış bloğu f canlı değişken analizinde şunlar yer almaktadır:

: Herhangi bir atamadan önce 's'de kullanılan değişkenler kümesi.
: S'de bir değer atanan değişkenler kümesi (birçok kitapta[açıklama gerekli ], KILL (s) ayrıca s 'de bir değer atanan değişkenler kümesi olarak tanımlanır. herhangi bir kullanımdan önce, ancak bu veri akışı denkleminin çözümünü değiştirmez):


Bir bloğun durumu, bloğun başlangıcında canlı olan değişkenler kümesidir. Durum dışı, sonunda canlı olan değişkenler kümesidir. Devlet dışı, bloğun haleflerinin eyaletler içindeki birliğidir. Bir ifadenin transfer işlevi, yazılan değişkenleri ölü yaparak, ardından okunan değişkenleri canlı hale getirerek uygulanır.

İkinci örnek

// in: {} b1: a = 3; b = 5; d = 4; x = 100; // x daha sonra hiç kullanılmıyor, bu nedenle çıkış kümesinde değil {a, b, d} eğer a> b ise // dışarı: {a, b, d} // b1'in (in) ardıllarının tümünün birliği => b2: {a, b} ve b3: {b, d} // in: {a, b} b2: c = a + b; d = 2; // çıkış: {b, d} // giriş: {b, d} b3: endif c = 4; dönüş b * d + c; // çıkış: {}

B3 durumu yalnızca şunu içerir: b ve d, dan beri c yazıldı. B1'in dış durumu, b2 ve b3 eyaletleri arasındaki birleşimdir. Tanımı c b2'de kaldırılabilir, çünkü c ifadeden hemen sonra canlı değil.

Veri akışı denklemlerinin çözümü, tüm durumları ve çıkış durumlarını boş küme olarak başlatmakla başlar. Çalışma listesi, çalışma listesine çıkış noktası (b3) eklenerek başlatılır (geriye doğru akış için tipik). Hesaplanmış durumdayken öncekinden farklıdır, bu nedenle selefleri b1 ve b2 eklenir ve işlem devam eder. İlerleme aşağıdaki tabloda özetlenmiştir.

işlemeeyalet dışıeski eyalet içiyeni eyalet içiiş listesi
b3{}{}{b, d}(b1, b2)
b1{b, d}{}{}(b2)
b2{b, d}{}{a, b}(b1)
b1{a, b, d}{}{}()

B1'in listeye b2'den önce girildiğine dikkat edin, bu da b1'i iki kez işlemeye zorladı (b1, b2'nin öncülü olarak yeniden girildi). B2'yi b1'den önce eklemek, daha erken tamamlanmaya izin verirdi.

Boş küme ile başlatma iyimser bir ilklendirmedir: tüm değişkenler ölü olarak başlar. Out-state, durum içi durumdan daha küçük olabilse de, out-state'lerin bir yinelemeden diğerine küçülemeyeceğini unutmayın. Bu, ilk yinelemeden sonra, durum dışı durumunun ancak durumdaki değişiklik ile değişebileceği gerçeğinden anlaşılabilir. Durum içi boş küme olarak başladığından, yalnızca sonraki yinelemelerde büyüyebilir.

Referanslar