Bölüm 9: Alt Programları Uygulamak

Slides:



Advertisements
Benzer bir sunumlar
Fonksiyonlar.
Advertisements

Bölüm 12 ÜST DÜZEY KONULAR Dinamik Bellek Ayırma Önişlemci
Nesnelerin Özellikleri. - Üye nesneler - friend belirtesi - Nesnelerin operatörlere yüklenmesi - this yerel (lokal) değişkeni - inline tanımlı üye fonksiyonlar.
Göstericiler (Pointers)
Zeynep Çelik Sunar….
Yığın ve Kuyruk.
Programlama-II (Java ile Bilgisayar Programlama)
Bölüm 7 Fonksiyonlar GÖSTERGELER Gösterge Tanımı
Bölüm 2 C Dilinin Temelleri
Altprogramların Uygulanması
Değişken Bildirimleri
String Kütüphanesindeki Arama Fonksiyonları
Fonksiyonlar ve Alt Programlar
KOPYA YAPICI FONKSİYON, STATİK ELEMANLAR, ARKADAŞ SINIF VE FONKSİYONLAR, NESNE DİZİLERİ Yılmaz Kılıçaslan.
NESNEYE YÖNELİK PROGRAMLAMA
DELEGATE OOP-UYG.
Fonksiyonlar.
Değişkenler veri tipleri operatörler
While Döngüsü Tekrarlama deyimidir. Bir küme ya da deyim while kullanılarak bir çok kez yinelenebilir. Yinelenmesi için koşul sınaması döngüye girilmeden.
NESNE TABANLI PROGRAMLAMA -METOTLAR-
Chapter 7: Using Methods. Metotları ve Kodlamayı Gizlemeyi Anlama Metot – Kapsüllenmiş ifadeler serisini gerçekleştiren bir görev – Kullanılan metodun.
Nesneye Yönelik Programlama
BPR152 ALGORİTMA VE PROGRAMLAMA - II Öğr. Gör. Bayram AKGÜL
Metotlar.
FONKSİYONLAR.
METOTLAR.
Özyineleme(Recursion)
Chapter 8: Advanced Method Concepts
Diziler Adres Kavramı Nesnelerin Adresleri sizeof Operatörü
Bilgisayar Programlama
Altprogramlar(Subprograms)
Fonksiyonlar Fonksiyon Tanımı Değer Döndürmeyen Fonksiyonlar
Fonksiyonlar Fonksiyon Tanımı
BPR152 ALGORİTMA VE PROGRAMLAMA - II Öğr. Gör. Bayram AKGÜL
Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi
C PROGRAMLAMA FONKSİYONLAR Adres ile Fonksiyon Çağırma Pointer (İşaretçiler) ile Fonksiyon Çağırma Rekürsif Fonksiyonlar.
Bölüm 6 Fonksiyonlar Fonksiyon Tanımı Değer Döndürmeyen Fonksiyonlar
Bilgisayar programlarının en büyük avantajı, kullanıcının işini kolaylaştırmalarıdır. Her bilgisayar programı bunu değişik metotlar kullanarak sağlar.
Procedure ve Function PASCAL’da
Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi
SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz
Algoritmalar ve Programlama I Ders 10: ALTPROGRAM KAVRAMI ve FONKSİYON
İsimler ve Bağlanma Names and Bindings
Bölüm 8: Altprogramlar.
4. Hafta1 4. HAFTA. 4. Hafta2 Fonksiyonlar  Büyük problemler, küçük parçalara bölünerek kolay çözülür  Yazılımlar benzer modüller içerirler  Hata ayıklama.
Fonksiyonlar.
1 Değişken alanları Geçici değişkenler Birleşik ifadeler(bloklar) ve değişkenler Değişken Depolama Süresi ve Alanı –Local ve global değişkenler –Static.
Programlama Dillerinin Prensipleri
VERİ ve BELLEK & DEĞİŞKENLERİN SAKLANMASI Asst.Prof.Dr.Misket YEKTAY Gizem AYIK.
Bağlama ve Kapsam Kavramları
İbrahim Olgaç PROGRAMLAMA DİLLERİ SUNUMU C#
Fonksiyonlar ve Diziler
Bölüm 6 Fonksiyonlar Fonksiyon Tanımı Değer Döndürmeyen Fonksiyonlar
C Programlama Dili Bilgisayar Mühendisliği.
C’de Fonsiyonlar Aslı Ergün.
8086 Programlama – Kısım IV Stack’ler, Makro’lar
8086 Programlama – Kısım III Prosedürler
Programlama Dillerinin Temel Elemanları
C Programlama Yrd.Doç.Dr. Ziynet PAMUK BMM211-H11
Excel’de VBA Programlama (Visual Basic Application)
Bölüm 9 Altprogramlar.
İsimler, Bağlamalar, Tip Kontrolü, Etki Alanları
C++ Programming:. Program Design Including
Bilgisayar Bilimi Problem Çözme Süreci-2.
YAPISAL PROGRAMLAMA Hafta-7
Bölüm 6: Kullanıcı Tanımlı Fonksiyonlar I
Altprogramların gerçeklenmesi
NİŞANTAŞI ÜNİVERSİTESİ
Bilgisayar Bilimi Fonksiyonlar-2.
C ile Programlamaya Giriş
Sunum transkripti:

Bölüm 9: Alt Programları Uygulamak

Bölüm’ün Başlıkları Arama ve geri dönüşlerin genel anlamı ‘’Basit’’ alt programların uygulaması Alt programların yığın dinamiği bölgesel değişkenleri ile uygulanması İçiçe alt programlar Bloklar Dinamik kapsam uygulaması

Çağrıların ve döndükleri değerlerin genel anlam analizi Bir dilde altprogramların çağrılması ve dönmesi işlemlerine altprogram bağlanması (subprogram linkage) denir. Parametrelerin nasıl alt programa geçileceği belirlenmelidir. Çağıranın değerleri korunmalıdır. Alt program yerel değişkenleri statik değilse yerel olarak saklanmalıdır. Dönüşte çağıranın doğru noktasına, doğru değerlerle dönülmesi temin edilmelidir. İç içe altprogramlar varsa, yerel olmayan değişkenlere erişim sağlanmalıdır.

Genel Tasarım program Program durumunu kaydet çağır Aktivasyon Kayıt örneği parametreler yerel veri dönüş adresi altprogram Program durumunu eski haline getir Dönüş değerini ayarlayabilir Program devam eder

Genel Tasarım Aktivasyon kaydı Program çağırma Altprogram call sub Geri dönüş adresi Parametreler Yerel değişkenler ... call sub Kontrol akışı

"Basit" altprogramların gerçekleştirilmesi Basit altprogramdan kastımız, bütün yerel değişkenleri statik olan ve iç içe çağrılamayan altprogramlar (örn. Fortran I). Çağrı anlam analizi: 1. Çağıran programın çalışma durumunu sakla (Save the execution status of the caller). 2. Parametre geçme işlemlerini yap (Carry out the parameter- passing process). 3. Dönüş adresini çağrılana geç (Pass the return address to the callee) 4. Kontrolü çağrılana ver (Transfer control to the callee).

Fortran aktivasyon bilgisi Tüm hafızaya statik olarak yerleştirebilir main ... f (...) proc f (...) g (...) proc g( ) g (...) -- !!! yereller param. dön.adr. } Ortak Main f g }

"Basit" altprogramların gerçekleştirilmesi Dönüş analizi (Return Semantics): 1. Eğer sonucu değeri ile geç (pass-by-value-result) parametreler kullanılmışsa değerlerinin gerçek parametrelere geçir. 2. Eğer dönen fonksiyonsa, döneceği değeri çağıranın bulması gereken yere yerleştir. 3. Çağıranın çalışma ortamını yeniden yapılandır. 4. Kontrolü çağırana geri ver.

"Basit" altprogramların gerçekleştirilmesi Gerekli depolama: Çağıran durum bilgileri, parametreleri, dönüş adresi ve döneceği değer (eğer fonksiyonsa). Altprogramın çalışan kod olmayan, altprogram verilerinin tutulduğu kısmının biçimi veya yerleşim planına etkinleştirme kaydı (activation record) denir. Bu kaydın sonraki sayfalarda göreceğimiz gibi belli bir formatı olur. Altprogram çağırıldığı zaman belli değerlerle doldurulmuş haline somutlaşan gerçekleşme kaydı denir (instance of activation record).

"Basit" altprogramların etkinleştirme kaydı Fonksiyon geri dönüş adresi Yerel değişkenler Parametreler Geri dönüş adresi

"Basit“ altprogramların etkinleştirme kaydı ve kodu Etkinleştirme kaydı verileri statik bellekte statik olarak saklanıyor. Bu nedenle somutlaşmış tek etkinleştirme kaydı olabilir. Bu nedenle kullanım olarak kolay, erişim daha hızlı, ancak özyinelemeyi desteklemez. İlk Fortran derleyicileri bu tip etkinleştirme kaydı tutuyordu.

(Yerel değişkenler ve veri) void sub (float total, int part) { int list[4]; float sum; … } Aktivasyon Kaydı Yerel Değişkenler (list, sum) Parametreler (total, part) Dinamik Linkler Dönüş Adresi Kod Olmayan Bölüm (Yerel değişkenler ve veri) Kod Bölümü (Yürütme kodu) Çağıran kodda bir yer Aktivasyon kayıt örneğinin başı

Aktivasyon Kayıtları (Basit Programlar) Ortak bellek Yerel değişkenler Parametreler Geri dönüş adresi Main Aktivasyon Kayıtları (Basit Programlar) A Veri B c Main A Kod B Yürütme Zamanı Stack C

Altprogramları yığıt dinamik (Stack-Dynamic) yerel değişkenlerle gerçekleştirmek Daha karmaşık çünkü: Derleyici altprogram yerel değişkenlerine yığıt bellekte örtülü bellek tahsis ve geri alma işlemleri için kod hazırlamalıdır. Özyineleme desteklenebildiğinden altprogramın aynı anda birden çok peş peşe çağırılabilmesini destekler, bu da birden çok etkinleştirme kodu somutlaşmasına neden olur. Bazı dillerde yerel dizilimlerin (local arrays) boyu çağrı sırasında belirlendiğinden, etkinleştirme kodunun içinde yer alan bu tip değişkenler etkinleştirme kodunun boyunun dinamik olmasını gerektirir.

Tipik Altprogramları yığıt dinamik yerel değişkenlerle gerçekleştirme etkinleştirme kaydı Yürütme zamanı Stack Yığıt bellek başı Yerel değişkenler Parametreler Dinamik link Geri dönüş adresi Aktivasyon kaydı örneği

Tipik Altprogramları yığıt dinamik yerel değişkenlerle gerçekleştirme void sub(float total, int part) { int list[4]; float sum; … } Yerel değişken sum Yerel değişken list[3] Yerel değişken list[2] Yerel değişken list[1] Yerel değişken list[0] Parametre part Parametre total Dinamik link Geri dönüş adresi

Altprogramları yığıt dinamik yerel değişkenlerle gerçekleştirmek Etkinleştirme kaydı formatı statik fakat boyutları dinamiktir. “Dinamik link" çağıran programın etkinleştirme kaydının başını gösterir. Etkinleştirme kaydı dinamik olarak altprogram çağırıldığında üretilir. Yerel değişkenler Parametreler Dinamik link Geri dönüş adresi

C fonksiyonu örneği statik link: void sub (float total, int part) { int list[5]; float sum; … } Yerel Parametre Dinamik link Statik link Geri dönüş adresi sum list 4 list 3 list 2 list 1 list part statik link: yerel olmayan değişkenler referansı için kullanılır total dinamik link: çağıranın AR’si nin başını gösterir sub prosedürü için aktivasyon kaydı

Özyinelemesiz C programı örneği – Program için yığıt bellek içeriği void A(int x) { int y; ... C(y); } void B(float r) { int s, t; A(s); void C(int q) { void main() { float p; B(p);

MAIN, B’yi çağırdıktan sonra Stack calls Yerel Parametre Dinamik link Statik link (MAIN)’e dönüş En üst B için ARI MAIN için ARI r s t p void main() { float p; ... B(p);... } void B(float r) { int s, t; ... A(s); ... } ARI = Etkinleştirme kaydı (activation record instance)

B, A’yı çağırdıktan sonra Stack main calls B A calls Yerel Parametre Dinamik link Statik link B’ye dönüş En üst y x A için ARI Yerel Parametre Dinamik link Statik link (MAIN)’e dönüş Yerel Parametre Dinamik link Statik link (MAIN)’e dönüş En üst B için ARI MAIN için ARI r s t p B için ARI MAIN için ARI r s t p void main() { float p; ... B(p);... } void B(float r) { int s, t; ... A(s); ... } void A(int x) { int y; ... C(y); ... }

A, C’yi çağırdıktan sonra Stack q C için ARI Parametre Dinamik link Statik link A’ya dönüş main calls B calls A C calls En üst Yerel Parametre Dinamik link Statik link B’ye dönüş Yerel Parametre Dinamik link Statik link B’ye dönüş En üst y x A için ARI y x A için ARI Yerel Parametre Dinamik link Statik link (MAIN)’e dönüş Yerel Parametre Dinamik link Statik link (MAIN)’e dönüş Yerel Parametre Dinamik link Statik link (MAIN)’e dönüş En üst B için ARI MAIN için ARI r s t p B için ARI MAIN için ARI r s t p B için ARI MAIN için ARI r s t p void main() { float p; ... B(p);... } void B(float r) { int s, t; ... A(s); ... } void A(int x) { int y; ... C(y); ... } void C(int q) { ... }

Altprogramların gerçekleştirimi Herhangi bir anda yığıttaki dinamik linklerin toplamına çağrı zinciri (call chain) denir. Yerel değişkenlere etkinleştirme kaydının (activation record) başlangıcına göre bağıl konumlarından (offset) erişilir. Buna yerel bağıl konum denir (local_offset). Yerel değişkenlerin yerel bağıl konumları derleyici tarafından belirlenir.

Özyinelemede Aktivasyon Kayıtları Bir önceki örnekte kullanılan etkinleştirme kaydı (activation record) özyinelemeli fonksiyonlarda da kullanılabilir int factorial(int n) { if (n <= 1) return 1 else return (n * factorial(n-1)); } void main() { int value; value = factorial(3); Fonksiyon değeri Parametreler Dinamik link Geri dönüş adresi 3 Main

Factorial için Aktivasyon Kayıtları Geri dönüş değeri Parametreler Dinamik link Geri dönüş adresi int factorial(int n) { if (n <= 1) return 1; else return (n * factorial(n-1)); } void main() { int value; value = factorial(3); 2 Geri dönüş değeri Parametreler Dinamik link Geri dönüş adresi 3 Main

Factorial için Aktivasyon Kayıtları Return 1 Geri dönüş değeri Parametreler Dinamik link Geri dönüş adresi 1 int factorial(int n) { if (n <= 1) return 1; else return (n * factorial(n-1)); } void main() { int value; value=factorial(3); Return 1 2*1=2 Geri dönüş değeri Parametreler Dinamik link Geri dönüş adresi 2 Return 1 3*2=6 Geri dönüş değeri Parametreler Dinamik link Geri dönüş adresi 3 Main 3

Faktoriyel Programı program p; var v : int; function fac(n: int): int; begin if n <= 1 then fac := 1 else fac := n * fac(n - 1); end; v := fac(3); print(v); end. Dönüş değeri=1 n = 1 Dinamik link Dönüş adresi Dönüş değeri=? n = 2 Dinamik link Dönüş adresi Dönüş değeri=? n = 3 Dinamik link Dönüş adresi fac için AR v = ? Dinamik link Geri dönüş adresi p

Yerel başvuru örneği Parametre Q Dinamik link Statik link Program MAIN_1; var P : real; procedure A (X : integer); var Y : boolean; procedure C (Q : boolean); begin {C} … end; {C} begin {A} C(Y); end; {A} procedure B (R : real); var S, T :integer; begin {B} A(S); end; {B} begin {MAIN_1} B(P); end. {MAIN_1} ( A)’ya dönüş Statik link Dinamik link Parametre Q (B)’ye dönüş Statik link Dinamik link Parametre X Yerel Y (MAIN)’e dönüş Statik link Dinamik link Parametre R Yerel S Yerel T Yerel P

Özyineleme örneği int factorial (int n){ If (n <=1) return 1; Fonksiyon değeri 1 ? Parametre n 1 Dinamik link Statik link int factorial (int n){ If (n <=1) return 1; else return (n* factorial (n-1)); } void main(){ int value; value = factorial (3); (factorial)’e dönüş If (n <=1) Fonksiyon değeri 2 ? return 1; Parametre n 2 Dinamik link Statik link (factorial)’e dönüş Fonksiyon değeri ? 6 6 Parametre n 3 Dinamik link Statik link (main)’e dönüş Yerel value ?

İçiçe altprogramlar(Nested subprograms) Bazı programlama dilleri (Fortran 95, Ada, JavaScript) yığıt dinamik yerel değişkenler kullanır (use stack- dynamic local variables) ve içiçe altprogramlara izin verirler. Kural: yerel olarak erişilmeyen tüm değişkenler yığıt bellekte aktif bir etkinleştirme kaydı içinde bulunurlar. Yerel olmayan değişken referansı bulma işlemi: 1. Doğru etkinleştirme kaydını bul. 2. Etkinleştirme kaydında değişkenin bağıl konumunu bul.

Yerel olmayan değişken referansını bulma işlemi Etkinleştirme kaydı içinde bağıl konumu bulmak kolay. Doğru etkinleştirme kaydını bulmak: Statik anlam kuralları gereği yerel olarak erişilmeyen tüm değişkenler yığıt bellekte aktif bir etkinleştirme kaydı içinde bulunurlar.

Yerel olmayan değişken referansını bulma işlemi 1. Teknik – Statik zincir (Static Chains) Belli etkinleştirme kayıtlarını birleştiren statik link zincirine statik zincir (static chain) denir. Bir altprogramın etkinleştirme kaydını ebeveyninin etkinleştirme kaydına bağlayan linke statik link (static link) denir. Statik zincir bir etkinleştirme kaydını yığıt bellekte çağıran altprogramların etkinleştirme kayıtlarına bağlar. Yerel olmayan değişkenin tanımlandığı yeri bulmak için: Statik zincir üzerinden etkinleştirme kayıtlarında değişkenin adı aranır. Etkinleştirme kaydının statik zincirdeki derinliğine statik_derinlik (static_depth) denir.

1. Teknik – Statik zincir (Static Chains) Yerel olmayan değişkenin tanımlandığı yeri bulmak için: Statik zincir üzerinden etkinleştirme kayıtlarında değişkenin adı aranır. Etkinleştirme kaydının statik zincirdeki derinliğine statik_derinlik (static_depth) denir.

1. Teknik – Statik zincir (Static Chains) main ----- static_derinlik = 0 A ----- static_derinlik = 1 B ----- static_derinlik = 2 C ----- static_derinlik = 1

1. Teknik – Statik zincir (Static Chains) Tanım: zincir_bağılkonum (chain_offset) veya içiçe_bağılkonum (nesting_depth ): Bir değişkenin referans verildiği altprogramın statik derinliği ile tanımlandığı altprogramın statik derinliği arasındaki fark. Bir referans aşağıdaki çift ile gösterilebilir: (zincir_bağılkonum, yerel_bağılkonum) burada yerel_bağılkonum (local_offset), değişkenin bulunduğu etkinleştirme kaydındaki bağıl konumudur.

Statik zincir ile lokal olmayan referanslar (statik derinlik – iç içe derinlik) program main var x,y,w procedure sub1 var z,y procedure sub11 var z,w begin z = x + y * w end sub11() sub1() Statik derinlik 1 2 İç içe derinlik, offset: z: 0, 3 x: 2, 3 y: 1, 4 w: 0, 4

Örnek Pascal Programı program MAIN_2; var X : integer; procedure BIGSUB; var A, B, C : integer; procedure SUB1; var A, D : integer; begin { SUB1 } A := B + C; <-----------------------1 end; { SUB1 } procedure SUB2(X : integer); var B, E : integer; procedure SUB3; var C, E : integer; begin { SUB3 } SUB1; E := B + A: <--------------------2 end; { SUB3 } begin { SUB2 } SUB3; A := D + E; <-----------------------3 end; { SUB2 } begin { BIGSUB } SUB2(7); end; { BIGSUB } begin BIGSUB; end. { MAIN_2 }

MAIN_2 calls BIGSUB BIGSUB calls SUB2(7) SUB2 calls SUB3; program MAIN_2; var X : integer; procedure BIGSUB; var A, B, C : integer; procedure SUB1; var A, D : integer; begin { SUB1 } A := B + C; <-----------------------1 end; { SUB1 } procedure SUB2(X : integer); var B, E : integer; procedure SUB3; var C, E : integer; begin { SUB3 } SUB1; E := B + A: end; { SUB3 } begin { SUB2 } SUB3; A := D + E; end; { SUB2 } begin { BIGSUB } SUB2(7); end; { BIGSUB } begin BIGSUB; end. { MAIN_2 } Sub2 Sub3 MAIN_2 calls BIGSUB BIGSUB calls SUB2(7) SUB2 calls SUB3; SUB3 calls SUB1 A - (0, 3) B - (1, 4) C - (1, 5) (zincir_bağılkonum, yerel_bağılkonum)

Pozisyon 1’de Stack (SUB1 içinde) Yerel Dinamic link Statik link SUB3’e geri dönüş A Top E C X B D MAIN { tanımlar: X SUB0 { tanımlar: A B C SUB1 { tanımlar: A D; kullanır: A B C } SUB2 {tanımlar: X B E; kullanır: A D E SUB3 {tanımlar : C E; kullanır: A B E } } MAIN MAIN calls SUB0 SUB0 calls SUB2 SUB2 calls SUB3 SUB3 calls SUB1 Sub1 için ARI Yerel Dinamik link Statik link SUB2’e geri dönüş SUB3 için ARI Yerel Parameter Dinamik link Statik link SUB0’ ’e geri dönüş SUB2 için ARI Yerel Dinamik link Statik link MAIN’e geri dönüş SUB0 için ARI MAIN için ARI

Örnek Pascal Programı in SUB3: E - (0, 4) B - (1, 4) A - (2, 3) program MAIN_2; var X : integer; procedure BIGSUB; var A, B, C : integer; procedure SUB1; var A, D : integer; begin { SUB1 } A := B + C; end; { SUB1 } procedure SUB2(X : integer); var B, E : integer; procedure SUB3; var C, E : integer; begin { SUB3 } SUB1; E := B + A: <--------------------2 end; { SUB3 } begin { SUB2 } SUB3; A := D + E; end; { SUB2 } begin { BIGSUB } SUB2(7); end; { BIGSUB } begin BIGSUB; end. { MAIN_2 } in SUB3: E - (0, 4) B - (1, 4) A - (2, 3)

In SUB2: A - (1, 3) D - an error E - (0, 5) program MAIN_2; var X : integer; procedure BIGSUB; var A, B, C : integer; procedure SUB1; var A, D : integer; begin { SUB1 } A := B + C; end; { SUB1 } procedure SUB2(X : integer); var B, E : integer; procedure SUB3; var C, E : integer; begin { SUB3 } SUB1; E := B + A: end; { SUB3 } begin { SUB2 } SUB3; A := D + E; <-----------------------3 end; { SUB2 } begin { BIGSUB } SUB2(7); end; { BIGSUB } begin BIGSUB; end. { MAIN_2 } In SUB2: A - (1, 3) D - an error E - (0, 5)

D - an error (sub1 içinde tanımlı) E - (0, 5) program MAIN; var X : integer; procedure SUB0; var A, B, C : integer; procedure SUB1; var A, D : integer; begin { SUB1 } A := B + C; <-------------1 end; { SUB1 } procedure SUB2(X : integer); var B, E : integer; procedure SUB3; var C, E : integer; begin { SUB3 } SUB1; E := B + A; <--------2 end; { SUB3 } begin { SUB2 } SUB3; A := D + E; <-----------3 end; { SUB2 } begin { SUB0 } SUB2(7); end; { SUB0 } begin SUB0; end. { MAIN } Pozisyon 1 SUB1: A - (0, 3) B - (1, 4) C - (1, 5) Pozisyon 2 SUB3: E - (0, 4) B - (1, 4) A - (2, 3) Pozisyon 3 SUB2: A - (1, 3) D - an error (sub1 içinde tanımlı) E - (0, 5) (zincir_bağılkonum, yerel_bağılkonum)

Yerel olmayan referans örneği (SUB2)’ye dönüş Statik link Dinamik link Yerel D A MAIN_2 var x proc BIGSUB BIGSUB; (SUB2)’ye dönüş Statik link Dinamik link Yerel E C var A, B, C proc SUB1 proc SUB2(X) SUB2(7); var A, D A := B + C; (BIGSUB)’a dönüş Statik link Dinamik link Parametre 7 Yerel E B X SUB3; A := X + E; var C, E proc SUB3 var C, E SUB1; E := B + A; (MAIN_2)’ye dönüş Statik link Dinamik link Yerel A C B Main_2 çağırır Bigsub Bigsub çağırır sub2 Sub2 çağırır sub3 Sub3 çağırır sub1 Yerel X

1. Teknik – Statik zincir Statik zincir uygulaması Altprogram çağrıldığı zaman (altprogram parametre ve isimle geçilen parametre olmadığını varsayarak) : Gerçekleştirme kaydı somutlaşan örneğini (instance) hazırla. Eski yığıt bellek tepesine bir dinamik link. Statik link, statik ebeveynin en son yaratılmış etkinleştirme kaydını gösterir. İki metot: 1. Statik ebeveynin ilk etkinleştirme kaydını bulmak için dinamik zincirde ara. Kolay fakat yavaş. 2. Derleyici, derleme esnasında çağıranla, çağrılan arasındaki derinliği (zincir bağıl konum) hesaplar ve daha sonra program yürütülürken kullanılmak üzere saklar. Örneğin MAIN_2 nin yığıt içeriğine bakarsak: SUB1, SUB3'ün içinden çağırılırken derleyici SUB3'ün SUB1'in tanımlandığı altprograma (Bigsub) göre derinliğinin iki olduğu bilgisini programa yerleştirir. Program çalışırken bu noktada yerleştirilen bilgi kullanılarak etkinleştirme kaydına olan statik link kurulur.

1. Teknik – Statik zincir Statik zincir metodunun değerlendirilmesi Sorunlar: 1. Yerel olmayan referanslar, özellikle derinlik fazlaysa, yavaş çalışır. Programın performansı düşer. 2. Yerel olmayan referansların kullandığı zaman eşit olmadığından, zamana hassas program yazmak zorlaştığı gibi bunların güncellenmesi de bu zamanlamayı değiştirir.

İç içe altprogramlar: 2. Teknik - ekranlar Fikir: Statik linkleri "ekran" (display) denilen ayrı bir yığıta (stack) yerleştir. Ekrandaki veriler etkinleştirme kodlarına (activation record) göstericilerdir. Referansları: (ekran_bağılkonum, yerel_bağılkonum) (display_offset, local_offset) olarak gösterebiliriz. Burada ekran_bağılkonum değeri zincir_bağılkonumla aynıdır. Referansların işleyişi: ekran_bağılkonum'u kullanarak, aranılan değişkenin doğru etkinleştirme kaydının göstericisini bul. yerel_bağılkonum değerini kullanarak, etkinleştirme kaydı içinde aranılan değişkeni bul.

Ekranlar (Displays) Ekran uygulaması (altprogram parametre ve isimle geçilen parametre olmadığını varsayarak) : Not: ekran_bağılkonum'u sadece etkinleştirme kaydı türetilmekte olan altprogramın statik derinliğine bağlıdır. Bu altprogramın statik derinliğidir. Belli bir anda çalışan altprogramın statik derinliği k ise, ekranda k+1 gösterici olur (k=0 ana program).

- Psd P’nin static_depth’i ve Qsd Q’nun static_depth’i olsun - Q, P’yi çağırsın - Üç olası durum söz konusu: 1. Qsd = Psd 2. Qsd < Psd 3. Qsd > Psd Örnek iskelet program: program MAIN_3; procedure BIGSUB; procedure SUB1; end; { SUB1 } procedure SUB2; procedure SUB3; end; { SUB3 } end; { SUB2 } end; { BIGSUB } end. { MAIN_3 } MAIN_3 tüm üç durumu örnekler

Durum 1: SUB2 , SUB1 ‘ i çağırır Çağırmadan önce: SUB2 için ARI BIGSUB için ARI 2 1 MAIN_3 için ARI 0 Stack Ekran Çağırmadan sonra: SUB1 için ARI BIGSUB için ARI 2 P’nin ARI’sı Q’nun ARI’sı

Durum 2: SUB2, SUB3 ‘ i çağırır Çağırmadan önce: SUB2 için ARI BIGSUB için ARI 2 1 MAIN_3 için ARI 0 Stack Ekran Çağırmadan sonra : SUB3 için ARI 3 BIGSUB için ARI 2 MAIN_3 için ARI 0 P’nin ARI’sı Q’nun ARI’sı

Çağırmadan önce: SUB3 için ARI SUB2 için ARI 3 BIGSUB için ARI 2 1 MAIN_3 için ARI 0 Stack Ekran Çağırmadan sonra : SUB1 için ARI BIGSUB için ARI 2 Case 3: SUB3, SUB1’ i çağırır

… … S P R n 2’de olsun Q P’nin ARI’sı Q’nun ARI’sı R’nin ARI’sı S’nin ARI’sı

Bloklar Bloklar, değişkenler için kullanıcı odaklı yerel ölçeklerdir. C deki bir örnek {int temp; temp = list [upper]; list [upper] = list [lower]; list [lower] = temp } Temp in yukarıdaki örnekteki ömrü kontrolün bloku girmesi ile beraber başlar. Temp gibi bir yerel değişkeni kullanmanın bir avantajı şudur: aynı isimli başka bir değişkenle çakışmaz

Blokların Uygulanması İKİ YÖNTEM Bloklara daima aynı bölgeden çağrılan alt programlardan ziyade bir parametre olarak davranın - her blokun bir aktivasyon kaydı vardır: blok her çalıştığında bunun bir örneğini oluşturur. Bir blok için gereken maksimum depo statik olarak tespit edilebildiği için, bu gereken alan aktivasyon kaydındaki yerel değişkenlerden sonra ayrılır.

MAIN_5 için Aktivasyon Kayıt örneği Bloklar e MAIN_5() { int x, y, z; while ( … ) { int a, b, c; … int d, e; } int f, g; d Blok Değişkenler c b ve g a ve f z Yereller y x MAIN_5 için Aktivasyon Kayıt örneği

Dinamik Kapsamın Uygulanması * Derin Erişim: yerel olmayan referanslar dinamik zincirdeki aktivasyon kayıt örneklerinin araştırılmasıyla bulunur. - zincirin uzunluğu statik olarak belirlenemez. - her aktivasyon kayıt örneği değişken isimlere sahip olmalıdır. *Sığ Erişim: yerelleri merkezi bir yere koy - her bir değişken için bir yığın - her bir değişken isim için içinde girdi bulunan merkezi bir çizelge

Kapsam Örneği Proc A referans çevresi Statik kapsam: A  main Dinamik kapsam: A  B  main proc main var X1, X2; proc A end proc B call A; call B;

Derin Erişim Procedure C; integer x, z; begin x := u + v; … end; (A)’ya dönüş Dinamik link Yerel z x C için ARI Procedure C; integer x, z; begin x := u + v; … end; Procedure B; integer w, x; Procedure A; integer v, w; Program MAIN_6 integer v, u; (A)’ya dönüş Dinamik link Yerel x w B için ARI MAIN_6 calls A A calls A A calls B B calls C (A)’ya dönüş Dinamik link Yerel w v A için ARI (MAIN_6)’ya dönüş Dinamik link Yerel w v A için ARI Yerel u v MAIN_6 için ARI

Sığ Erişim Procedure C; integer x, z; begin MAIN_6 calls A x := u + v; … end; Procedure B; integer w, x; Procedure A; integer v, w; Program MAIN_6 integer v, u; MAIN_6 calls A A calls A A calls B B calls C A B A C A MAIN_6 B C u v x z w

Değişken Stack’larla Sığ Erişim proc A var x=2, y=3, z=4 begin call B end proc B var x=22, w=55, t=66 call C proc C var x=222, y=333, w=555 main var r=0,t=0 call A C’de while: r t w x y z 66 555 55 222 22 2 333 3 4

Arabellek aşımı saldırısı Bir bilgisayarda işlem yaptığınızda bilgisayar söz konusu işlemi kimi zaman direkt olarak Sabit Disk’e (HDD) ya da ilgili depolama birimine yazmaz. Bunun yerine Bellek (RAM) üzerinde geçici olarak konumlandığı ve ileride topluca yazılacağı bir alanda tutar. Burası ara bir bellektir. İşte bu alana “buffer” ya da tampon yahut arabellek diyoruz. Arabellek belirli bir alana yani boyuta sahiptir. Ancak bu alan bazen programsal hata (bug) sonucunda haddinden fazla bilgi ile yüklenir. Bazen de kötü niyetli bir saldırgan söz konusu yol ile bu alana haddinden fazla büyüklükte bilgi yükleyebilir. Bu haddinden fazla yükleme söz konusu alanda taşkına sebep olur. İşleyişi; Bir saldırgan bu sorunu kendi çıkarına kullanarak söz konusu alana alabileceğinden fazla uzunlukta bir değer yükler bunun sonucunda artan kısım yani taşan kısım direk olarak çalıştırılabilinir hale gelir. Bu taşan kısıma saldırgan çalıştırabilinir bir kod yüklediğinde amacına erişmiş ve Arabellek Aşımını kullanıp içeride (uzaktaki bir PC’de ya da sunucuda) kötü niyetli bir kod çalıştırmış olur.

Arabellek aşımı saldırısı Arabellek aşımı saldırısı exploits a common çoğu programdaki genel bir problemi kötüye kullanır. C gibi çoğu yüksek seviye programlama dilinde, “sınır testi”, yani kopyaladığınız değişkenin uzunluğunun beklediğiniz gibi olduğunu görmeyi test etme, yapılmaz. void myFunction(char *str) { char bufferB[16]; strcpy(bufferB, str); } void main(){ char bufferA[256]; myFunction(bufferA); }

Arabellek aşımı saldırısı void main(){ char bufferA[256]; myFunction(bufferA); } void myFunction(char *str) { char bufferB[16]; strcpy(bufferB, str); } main(), 256 baytlık bir diziyi myFunction()’a parametre olarak gönderir, ve myFunction() fonksiyonu içinde ise dizilerin sınırlarını kontrol etmeden, strcpy() ile uzun dizinin tamamını 16 baytlık dizi olup tasana kadar kopyalar! bufferB’nin yeterince büyük olup olmadığı ile ilgili bir test olmadığından, ekstra veri bellekte diğer bilinmeyen diğer yerlerin üstüne yazar. Bu savunmasızlık arabellek aşımı saldırısının temelidir Sistem stack’ı değiştirilir

Arabellek aşımı saldırısı Stack içeriği void main(){ char bufferA[256]; myFunction(bufferA); } bufferA

Arabellek aşımı saldırısı Stack içeriği void main(){ char bufferA[256]; myFunction(bufferA); } bufferB İşletim sistemi verisi Str void myFunction(char *str) { char bufferB[16]; strcpy(bufferB, str); } Dinamik link Main’e geri dönüş adresi bufferA

Arabellek aşımı saldırısı Stack içeriği void main(){ char bufferA[256]; myFunction(bufferA); } bufferB İşletim sistemi verisi Bu bölge str’den veriyle bozuldu Str void myFunction(char *str) { char bufferB[16]; strcpy(bufferB, str); } Dinamik link Main’e geri dönüş adresi bufferA Geri dönüş adresi üzerine yazabilir!!

Arabellek aşımı saldırısı Stack içeriği str içeriği dikkatlice seçilirse, yazmış olduğumuz kodun bir kısmına dönüş adresini gösterebiliriz Sistem fonksiyon çağrısından döndüğünde zararlı kodu çalıştırarak başlayacaktır Kötü niyetli Kod Yeni Adres bufferA

Muhtemel bir çözüm void main(){ char bufferA[256]; myFunction(bufferA, 256); } void myFunction(char *str, int len) { char bufferB[16]; if (len <= 16) strcpy(bufferB, str); }

Kaynaklar Roberto Sebesta, Concepts Of Programming Languages, International 10th Edition 2013 David Watt, Programming Language Design Concepts, 2004 Michael Scott, Programming Languages Pragmatics, Third Edition, 2009 Zeynep Orhan, Programlama Dilleri Ders Notları Mustafa Şahin, Programlama Dilleri Ders Notları Ahmet Yesevi Üniversitesi, Uzaktan Eğitim Notları Erkan Tanyıldızı, Programlama Dilleri Ders Notları David Evans, Programming Languages Lecture Notes O. Nierstrasz, Programming Languages Lecture Notes Giuseppe Attardi, Programming Languages Lecture Notes John Mitchell, Programming Languages Lecture Notes