Altprogramların gerçeklenmesi Bölüm 10 Altprogramların gerçeklenmesi
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Ü
Ç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Ü
Çağırma ve 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Ü
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Ü
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Ü
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Ü
Örnek: C fonksiyonu void sub(float total, int part) { int list[5]; float sum; … } Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
Özyinelemesiz örnek main calls fun1 fun1 calls fun2 fun2 calls fun3 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Ü
Özyinelemesiz örnek Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
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Ü
Ö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Ü
Factorial için aktivayson kaydı Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
Factorial çağrılamsında yığıtın durumu Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
Factorial dönüşlerinde yığıtın durumu Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
İç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 Doğru aktivasyon kayır örneğini bul Bulunan kayıt içindeki döğru adresi belirle Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
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Ü
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Ü
Ö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Ü
MAIN_2 BIGSUB’ı çağırır BIGSUB SUB2’yi çağırır SUB2 SUB3’ü çağırır Ö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Ü
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. Pozisyondaki yığıt içeriği Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
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Ü
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Ü
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Ü
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Ü
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Ü
Blokların gerçeklenmesi İki yöntem: 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Ü
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Ü
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Ü
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Ü
Ö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Ü
Ö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Ü