Alt programların gerçeklenmesi

Bölüm 10
Altprogramların
gerçeklenmesi
ISBN 0- 0-321-49362-1
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
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-2
Ç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-3
Ç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
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-4
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-5
Yığıt-dinamik yerel değişkenleri olan bir
dil için tipik aktivasyon kaydı
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-6
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 aktivasyon
kayı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-7
Örnek: C fonksiyonu
void sub(float total, int part)
{
int list[5];
float sum;
…
}
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-8
Ö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);
...
}
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
main calls fun1
fun1 calls fun2
fun2 calls fun3
1-9
Özyinelemesiz örnek
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-10
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-11
Ö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
}
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-12
Factorial için aktivayson kaydı
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-13
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-15
İç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
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-16
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
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-17
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) veya içiçelik derinliği (nesting_depth)
referansa konu olan değişkenin kullanıldığı etki
elanı 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
begin
Bigsub;
end; of Main_2 }
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-19
Ö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
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-20
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-21
1. Pozisyondaki
yığıt içeriği
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-22
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-23
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.
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-24
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
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-25
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-27
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
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-28
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
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-29
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-31
Ö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ı
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-32
Ö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.
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-33