İsimler ve Kapsam Tanım: Bir değişkenin kapsamı (scope) değişkenin görülebilir olduğu komutların alanıdır. Görülebilir olduğu alan, bir komut içinde belirlenen değerle kullanılabildiği alandır. Tanım: Lokal değişkenler, bir program biriminde kullanılan ve orada tanımlanmış değişkenlerdir. Tanım: Lokal olmayan değişkenler, bir program biriminde görülebilir olan ancak orada tanımlanmamış değişkenlerdir. Kapsam kuralları, isimlere yapılan referansların değişkenlerle nasıl bağlanacağının kurallarını belirler. Programlama Dilleri - Pamukkale Üniversitesi 1
Program metnine dayanır. Statik Kapsam (static scope) Bir isim referansını değişkene bağlayabilmek için isim tanımlanmış olmalıdır. Arama işlemi: lokalden başlayarak ve her seferinde kapsamı genişleterek, verilen ismin tanımını arama. Bu durumda kapsam en içteki alt programdan onu çevreleyen üst alt programlara doğrudur. Bazı diller iç içe alt programları desteklerken (Ada, JavaScript, PHP), bazı diller desteklemez (C tabanlı diller gibi). İç içe alt programları desteklemeyen dillerde bile blok içleri ayrı kapsama alanlarıdır. Statik kapsamı çevreleyen kapsam onun atasıdır. En yakın ataya, ebeveyn (parent) denir. Programlama Dilleri - Pamukkale Üniversitesi 2
Blok kapsamı Program birimleri içerisinde statik kapsam yaratma yöntemi - ALGOL 60 ile başlar Örnekler: C and C++: for (...) { int index;... } Ada: declare LCL : FLOAT; begin... end Programlama Dilleri - Pamukkale Üniversitesi 3
Kapsam Lokalde tanımlanmış aynı isimli değişken, dışarda ata tarafından tanımlı değişkene erişimi keser: void sub() { int count; while ( ) { int count=1; count ++; } } C++ ve Ada bu tip erişilmez verilere kapsamı belirterek erişim imkanı sağlar. In Ada: unit.name In C++: class_name::name Programlama Dilleri - Pamukkale Üniversitesi 4
Statik kapsam, örnekler C++ değişken tanımlarının fonksiyon içinde herhangi bir yerde yapılmasına izin verir. Fonksiyonun içinde ama bir blok içinde olmayan tanımlar, fonksiyon içinde tanımlandığı noktadan fonksiyonun sonuna kadar tanımlanmış sayılırlar. C de benzer tanımların fonksiyon başında yapılması zorunludur. C++, Java ve C# class ları içinde tanımlanan değişkenler farklılıklar gösterir: Eğer herhangi bir metodun içinde tanımlanmadıysa, bütün class içinde tanımlıdır. public se dışardan da erişilebilir. Bir metot içinde tanımlandıysa, tanımlandığı blokdaki değerini kullanır. C#, C++ tipi göstericileri destekler. Ancak bunlar güvenliği bozduklarından bunları kullanan metot ların unsafe olarak tanımlanması zorunludur. Programlama Dilleri - Pamukkale Üniversitesi 5
1. A,B :ornek; X: Sub1; 2. A,B :ornek; Y: Sub 2; X: Sub3; 3. A,B, :ornek; X,Y: Sub2; 4. A,B, :ornek; procedure ornek is A, B : Integer;... procedure Sub1 is X: Integer; begin -- Sub1... <============ 1 end; procedure Sub2 is X,Y : Integer;... procedure Sub3 is X : Integer; begin - Sub3... <============= 2 end; begin -- Sub2... <============= 3 end; begin -- Example... <============= 4 endl; Programlama Dilleri - Pamukkale Üniversitesi 6
Kapsam Statik kapsamın değerlendirilmesi Örnek: Bütün kapsamlar MAIN program ve alt programlarca belirlenir. MAIN A ve B yi çağırır C ve D yi A çağırır A ve E yi B çağırır Programlama Dilleri - Pamukkale Üniversitesi 7
Statik kapsam örneği Programın yapısı Programın ağaç yapısı MAIN A MAIN C D A B B C D E E Programlama Dilleri - Pamukkale Üniversitesi 8
Statik kapsam örneği Programın istenen altprogram çağırma yapısı Programın potansiyel altprogram çağırma yapısı MAIN MAIN A B A B C D E C D E Programlama Dilleri - Pamukkale Üniversitesi 9
Statik kapsam örneği Varsayalım D, B nin içindeki veriye ulaşmalı. Olası çözümler: D yi B nin altına koy (Fakat artık C, D yi çağıramaz, D, A nın değişkenlerine erişemez). B den D nin gereksinim duyduğu veriyi MAIN e koy (bütün alt programlar erişebilir) Sonuç: statik kapsam global değişkenlere neden olur. MAIN MAIN A B A B C D E C D E Programlama Dilleri - Pamukkale Üniversitesi 10
Dinamik kapsam Program birimlerinin çağırma sırasına dayanır; onların programdaki yerleşme şekillerine değil. Değişkenlere erişim altprogramların herhangi bir andaki çağrı zincirine bağlıdır. APL, SNOBOL4, Perl ve bazı Lisp versiyonları dinamik kapsam kullanır.perl ve Common Lisp her iki kapsamı da kullanabilirler. Programlama Dilleri - Pamukkale Üniversitesi 11
Dinamik kapsam örneği MAIN SUB1 i SUB1 SUB2 yi çağırır. SUB2 x i kullanır. MAIN -tanımlama x SUB1 - tanımlama x -... call SUB2... SUB2... - referans x -...... call SUB1 Statik kapsama MAIN içindeki x e referans Dynamic scoping SUB1 içindeki x e referans Dinamik kapsamanın değerlendirmesi: avantaj: kolaylık; dezavantaj: zor okunabilirlik. Perl ve Common Lisp de dinamik kapsam vardır. Programlama Dilleri - Pamukkale Üniversitesi 12
Dinamik kapsam değerlendirmesi Bir altprogramdaki içeride tanımlanmamış değişken programın sürecine göre farklı altprogramlardaki farklı tanımlara gönderme yapıyor olabilir. Altprogramlardaki değişkenleri başka altprogramların beklenmedik değiştirmelerinden korumak çok zor. Güvenilirlik çok düşüyor. Yerel olmayan değişkenlerin kullanım sırasında tip kontrolünü yapmak zor. Dinamik kapsamlı bir programı okumak pratikte çok zor. Her türlü dinamik kapsam öngörülemez. Yerel olmayan değişkenlere erişim çok fazla zaman aldığından, program yavaşlıyor. Programlama Dilleri - Pamukkale Üniversitesi 13
Kapsam ve yaşam süresi Kapsam ve yaşam süresi bir birleriyle ilgili ancak farklı kavramlardır. Bir Java metodunun içinde tanımlanmış değişken, metot içinde geçerlidir, yaşam süresi de metot çalıştığı sürecedir. C ve C++ da altprogram içinde static değişkenleri düşünün. Kapsamı sadece altprogramdır, fakat ana program çalıştığı sürece korunur; yaşam süresi programın yaşam süresi kadardır. Aşağıdaki örneğe bakarsak, sum değişkeninin kapsamı compute fonksiyonu ile sınırlıysa da, printheader çalışırken de yaşamaya devam eder. Programlama Dilleri - Pamukkale Üniversitesi 14
Referans Çevre Tanım:Bir komutun referans çevresi o komut tarafından erişilebilen bütün isimlerdir. Bir statik kapsamlı dilde bu, bütün lokal değişkenler ile çevreleyen kapsamlardan görünür değişkenlerdir. Bir alt programın yürütülmesi başlamış ve henüz sonuçlanmamışsa, o alt program aktif demektir. Bir dinamik kapsamlı dilde referans çevre,bütün lokal değişkenler ile aktif alt programlardaki bütün görünür değişkenlerdir. Programlama Dilleri - Pamukkale Üniversitesi 15
Referans Çevre örneği (Ada iskelet programı) Statik Örnek Nokta 1 2 3 4 Referans Çevre Sub1(X,Y), Example(A,B) Sub3(X), Example(A,B) Sub2(X), Example(A,B) Example(A,B) Programlama Dilleri - Pamukkale Üniversitesi 16
Referans Çevre örneği (C iskelet programı)dinamik Örnek Nokta 1 2 3 Referans Çevre Sub1(a,b), Sub2(c), main(d) Sub2(b,c), main(d) main(c,d) Programlama Dilleri - Pamukkale Üniversitesi 17
İsimli sabitler Tanım: Bir değişken sadece bir belleğe bağlıyken bir değere de sahipse buna isimli sabit (named constant) denir. Avantajı: okunabilirlik ve değiştirilebilirlik. Programları parametrize etmek için kullanılır. Değerlerin sabitlere bağlanması statik veya dinamik olabilir. Diller: Pascal: sadece kalıp değimler FORTRAN 90: sabit değerli ifadeler Ada, C++, and Java: her türlü ifade. Programlama Dilleri - Pamukkale Üniversitesi 18
Değişkenin başlangıç değeri Tanım: Bir değişkene bellekle bağlanırken verilen değere denir. Başlangıç değeri tanımlanırken verilir: örneğin Java int sum = 0; Programlama Dilleri - Pamukkale Üniversitesi 19