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
© Copyright 2024 Paperzz