Bölüm 10
Altprogramların
gerçeklenmesi
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-2
10. Bölüm konuları
• Çağırma / geri dönme semantiği
• Yığıt-dinamik yerel değişkeni olan altprogramların gerçeklenmesi
• İçiçe altprogramlar
• Statik etki alanı gerçeklenmesi
• Bloklar
• Dinamik etki alanı gerçeklenmesi
Çağırma ve geri dönmenin semantiği
• Bir dilin altprogram çağırma ve geri dönme oparasyonlarının tümüne altprogram
bağlantısı denir.
• Altprogram çağırmanın semantiği
– Parametreleri geç
– Yerel değişkenler için yığıt üzerinde yer ayır – Çağıran programın çalışma statüsünü sakla
(registerler, program sayacı)
– Yerel olmayan değişkenlere erişim sağla – Kontrolü, çağrılana devret
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-4
Çağırma ve geri dönmenin semantiği…
• Geri dönmenin semantiği
– Çık ve girçık kipindeki parametrelerin değerlerini ver (gerekiyorsa)
– Yığıt üzerinde yerel değişkenler için alınan yeri geri ver
– Çalışma statüsünü eski haline getir – Kontrolü çağırana geri ver
Alt program gerçeklenmesi:
tanımlar
• Aktivasyon kaydı (activation record)
çalışmakta olan bir altprogramın ihtiyaç duyduğu bilgilerin saklandığı yerin
formatıdır
• Aktivayson kaydı örneği (AKÖ) ( activation
record instance) çalışmakta olan spesifik bir
altprogram için tutulan bilgidir.
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-6
Yığıt-dinamik yerel değişkenleri olan bir
dil için tipik aktivasyon kaydı
Yığıt-dinamik değişkeni olan alprogramların gerçeklensmesi: aktivasyon kaydı
• Aktivasyon kaydı formatı sabit, ama boyutu değişken
•
Dinamik bağ (dynamic link)
çağıranın aktivasyon kayıt örneğinin tabanını gösterir• Aktivasyon kayıt örneği altprogram çağrıldığında dinamik olarak sistem yığıtı üzerinde yaratılır
•
Ortam işaretçisi (Oİ) (environment pointer (EP)
) her zaman çalışmakta olan altprogramın aktivasyonkayıt örneğinin tabanını gösterir
• Dinamik bağ = çağıranın ortam işaretçisi
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-8
Örnek: C fonksiyonu
void sub(float total, int part) {
int list[5];
float sum;
… }
Özyinelemesiz örnek
void fun1(float r) { int s, t;
...
fun2(s);
...
}
void fun2(int x) { int y;
...
fun3(y);
...
}
void fun3(int q) { ...
}
void main() { float p;
...
fun1(p);
...
main calls fun1
fun1 calls fun2
fun2 calls fun3
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-10
Özyinelemesiz örnek
Dinamik zincir ve göreceli adres (local offset)
• Yığıt üzerindeki dinamik bağların tümüne birden
dinamik zincir
veyaçağırma zinciri
denir.• Yerel değişkenler aktivasyon kaydının başından itibaren belirtilmiş göreceli adresleri aracılığı ile erişilirler.
• Bir yerel değişkenin göreceli adresi derleyici tarafından derleme anında belirlenebilir.
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-12
Özyinelemeli bir örnek
int factorial (int n) {
<---1 if (n <= 1) return 1;
else return (n * factorial(n - 1));
<---2 }
void main() { int value;
value = factorial(3);
<---3 }
Factorial için aktivayson kaydı
Factorial çağrılamsında yığıtın durumu
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-14
Factorial dönüşlerinde yığıtın durumu
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-16
İçiçe altprogramlar
• Bazı ‘C’ tabanlı olamayan statik etki alanlı dillede (ör: Pascal, Fortran 95, Ada,
Python) yığıt dinamik yerel değişkenler kullanılır ve altprogramlar içiçe olabilir.
• Yerel olarak erişilemeyen tüm değişkenler yığıt üzerinde olan bir aktivasyon kayıt
örneğinde bulunurlar.
• Yerel olmayan referans bulma süreci
1. Doğru aktivasyon kayır örneğini bul
2. Bulunan kayıt içindeki döğru adresi belirle
Statik etki alanı
• Statik zincir , aktivasyon kayıt örneklerini bağlayan statik linklerden oluşur
•
• Bir altprograma ait aktivasyon kayıt
örneğindeki statik link, altprogramın statik babasına ait en yeni aktivasyon kayıt
örneğine işaret eder.
• Bir aktivasyon kayıt örneğinin statik zinciri,
onu tüm statik atalarınına bağlar
Statik etki alanı...
•
Statik derinlik
bir etki alanının kaç tane etki alanıın içinde olduğunu gösteren bir sayıdır.• Bir yerel olmayan referansın
zincir farkı
(chain_offset)
veyaiçiçelik derinliği (nesting_depth)
referansa konu olan değişkenin kullanıldığı etkielanı ile tanımlandığı etki alanlarının arasındakı derinlik farkıdır.
• Bir değişkene referans (zincir farkı, lokal adres) olarak temsil edilebilir ( (chain_offset,
local_offset) ). (lokal adres = aktivasyon kaydının başından itibaren olan göreceli adres)
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-18
Örnek Ada Programı
procedure Main_2 is X : Integer;
procedure Bigsub is A, B, C : Integer;
procedure Sub1 is A, D : Integer;
begin -- of Sub1
A := B + C; <---1 end; -- of Sub1
procedure Sub2(X : Integer) is B, E : Integer;
procedure Sub3 is C, E : Integer;
begin -- of Sub3 Sub1;
E := B + A: <---2 end; -- of Sub3
begin -- of Sub2 Sub3;
A := D + E; <---3 end; -- of Sub2 }
begin -- of Bigsub Sub2(7);
end; -- of Bigsub
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-20
Örnek ADA Programı...
• MAIN_2 çağırma sırası
MAIN_2 BIGSUB’ı çağırır BIGSUB SUB2’yi çağırır SUB2 SUB3’ü çağırır
SUB3 SUB1’i çağırır
UYARI!!!!
• Bir sonraki slaytda dinamik bağlar
YANLIŞTIR. Doğrusu, çağıran altprogramın
aktivasyon kayıt örneğinin başına işaret
etmeleridir, sonuna değil.
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-22
1. Pozisyondaki
yığıt içeriği
Statik zincir “bakımı”
• Çağırma anında yeni bir aktivasyon kaydı örneği yaratılır
• Dinamik link eski ortam işaretçisidir (eski yığıt üst işaretçisi değil!)
• Statik bağ, statik babanın en yeni aktivasyon kayıt örneğine işaret ettirilir (statik bağın değeri,
çağıranın statik zinciri takip edilerek bulunabilir)
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-24
Statik zincir değerlendirmesi
Sorun:
•Bir değişkenin tanımlandığı yer ile
kullanıldığı yerin derinlik farkları fazla ise,
değişkene erişim çok zaman alır.
Göstergeler (Displays)
• Statik linklere alternatif
• Gösterge denen bir dizi, her statik derinlikteki en yeni aktivasyon kayıt örneğinin başlangıç adresini saklar
• Gösterge[i] = yığıt üzerindeki en yeni (en
yukarıda ) i statik derinlikteki aktisvasyon
kayıt örneğinin adresi
Göstergeler…
• Statik derinliği j olan bir altprogramın yeni bir aktivasyon kayıt örneği (AKÖ) yaratıldığında, bu AKÖ’nün adresi k ise, Gösterge[j]’nin içindeki
değer AKÖ içinde saklanır ve Gösterge[j]’nin değeri k’ya eşitlenir
• Statik derinliği j olan bir altprogram geri
döndüğünde ve AKÖ’sü yığıttan atıldığında,
Gösterge[j]’nin değeri AKÖ içinde saklanan değere eşitlenir.
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-26
Bloklar
• Kullanıcı tanımlı yerel etki alanı
• C örneği
{int temp;
temp = list [upper];
list [upper] = list [lower];
list [lower] = temp }
• temp değişkeninin ömrü, kontrol blok içine girdiğinde başlar
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-28
Blokların gerçeklenmesi
• İki yöntem:
1. Parametresiz altprogram gibi değerlendir
– Her bloğun kendi AKÖ’sü olur. Blok her çalıştırıldığında AKÖ tekrar yaratılır
2. İçinde bulunduğu altprogramın AKÖ’sünde blok değişkenleri için yer ayır
Dinamik etki alanı gerçeklenmesi
Derin erişim :
•dinamik zinciri kullanarak değişken ara
- Zincirin uzunluğu statik olarak belirlenemez.
– Her AKÖ içinde değişken isimlerinin de olması gerekir
Dinamik etki alanı gerçeklenmesi…
Sığ erişim :
– Her değişken için bir yığıt
– Altprogram çağrıldığında, altprogramdaki her x değişkeni için x yığıtı üzerine bir hücre itilir
– Değişken erişimleri her zaman yığıt üzerindeki en üst hücreye olur
– Altprogram geri döndüğünde, altprogramdaki her x değişkeni için x yığıtı üzerinden bir hücre atılır
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-30
Dinamik etki alanı için sığ erişim örneği
void sub3() { int x, z;
x = u + v;
… }
void sub2() { int w, x;
… }
void sub1() { int v, w;
… }
void main() { int v, u;
… }
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-32
Özet
• Altprogram çağrılma semantiği birçok aktiviteyi gerektirir
• Yığıt-dinamik yerel değişkeni olan altprogramların iki parçası var
– program kodu – aktivasyon kaydı
Özet...
• Aktivasyon kayıt örneklerinde, başka şeylerin
yanısıra formel parametreler ve yerel değişkenler bulunur
• İçiçe tanımların olduğu statik etki alanlı dillerde, statik zincirler ve göstergeler yerel olmayan
değişkenlere erişimin iki ana yöntemidir.
• Dinamik etki alanlı dillerde, lokal olmayan
değişkenlere erişimin iki yöntemi: dinamik zincir ve her değiken için ayrı yığıt.