Programlama Dilleri 1 Ders 12: Belirleyiciler ve Niteleyiciler
Genel Bakış Giriş Yer Belirleyicilerle Bildirim İşlemi auto Belirleyicisi register Belirleyicisi static Belirleyicisi Statik ve Global Değişkenlerin Karşılaştırılması Modül Kavramı ve Nesnelerin Bağlantı Özelliği Bağlantı Kavramı extern Belirleyicisi Tür Niteleyicileri const Niteleyicisi volatile Niteleyicisi Programlama Dilleri 1 2
Giriş Belirleyiciler (storage class specifiers), bildirimler yapılırken kullanılan ve nesnelerin özellikleri hakkında derleyicilere bilgi veren anahtar sözcüklerdir. C'de kullanılan belirleyiciler şunlardır: auto, register, static, extern ve typedef. Tür niteleyicileri ise nesnelerin içindeki değerlerin değiştirilip değiştirilmeyeceğine ilişkin bilgi verir. Tür belirleyicileri şunlardır: const, volatile. Programlama Dilleri 1 3
Yer Belirleyicilerle Bildirim İşlemi Yer belirleyici, tür belirleyici ya da tür ifade eden anahtar sözcüklerin dizilimi herhangi bir biçimde olabilir: auto const unsigned long int a; const auto unsigned long int a; unsigned long int auto const a; int const long auto unsigned a; Yukarıdaki bildirimlerin hepsi geçerlidir. Ancak okunabilirlik açısından yer belirleyici sözcüğün daha önce yazılması önerilir. Programlama Dilleri 1 4
auto Belirleyicisi auto yalnızca yerel değişkenler için kullanılabilecek bir yer belirleyicisidir. auto belirleyicisinin global değişkenlerin ya da işlevlerin parametre değişkenlerinin bildiriminde kullanılması geçersizdir. Bu anahtar sözcük, nesnenin bilinirlik alanı bittikten sonra kaybolacağını, bellekte kapladığı yerin geçerliliğinin kalmayacağını gösterir. Yerel değişkenler otomatik ömürlüdür. Yani bulundukları bloğa ilişkin kod çalışmaya başlandığında yaratılır, söz konusu bloğun yürütülmesi bittikten sonra yok olurlar. Programlama Dilleri 1 5
auto Belirleyicisi Zaten bir yerel değişken, başka bir yer belirleyici anahtar sözcük kullanılmadığı sürece (default olarak) auto biçiminde ele alınır. Bu durumda auto yer belirleyicisinin kullanımı gereksizdir: auto yer belirleyicisi global değişkenlerle yada parametre değişkenleriyle birlikte kullanılmaz. Örneğin : auto anahtar sözcüğü bazı mikroişlemcilerde uyumu korumak için düşünülmüştür. Modern sistemlerde anlamlı bir kullanımı yoktur. Programlama Dilleri 1 6
register Belirleyicisi register belirleyicisi, değişkenin "bellekte değil de CPU yazmaçlarının içinde" tutulması isteğini derleyiciye ileten bir anahtar sözcüktür. Değişkenlerin bellek yerine doğrudan yazmaçlarda tutulması programın çalışmasını hızlandırır. Yazmaçlar CPU içinde bulunan tampon bellek bölgeleridir. CPU içindeki aritmetik ve mantıksal işlemleri yapan birimin (ALU) yazmaçlar ve belleklerle ilişkisi vardır. Genel olarak CPU tarafından yapılan aritmetik ve mantıksal işlemlerin her iki terimi de belleğe ilişkin olamaz. Programlama Dilleri 1 7
register Belirleyicisi Örneğin bellekte bulunan sayi1 ve sayi2 isimli iki değişken toplanarak elde edilen değer sayi3 isimli başka bir bellek bölgesine yazılmak istensin. sayi3 = sayi1 + sayi2; işlemine karşılık gelir. CPU bu işlemi ancak 3 adımda gerçekleştirebilir: 1. adım : Önce sayi1 bellekten CPU yazmaçlarından birine çekilir. MOV reg, sayi1 2. adım : Yazmaç ile sayi2 toplanır. ADD reg, sayi2 3. adım: Toplam sayi3 ile belirtilen bellek alanına yazılır. MOV sayi3, reg Programlama Dilleri 1 8
register Belirleyicisi Belleğe yazma ve bellekten okuma işlemleri yazmaçlara yazma ve yazmaçlardan okuma işlemlerine göre daha yavaştır.çünkü belleğe erişim için bir makine zamanı gerekir. register belirleyicisi derleyiciye yalnızca bir isteği iletir. Yani register belirleyicisi ile bildirilen değişkenin yazmaçta tutulacağının bir güvencesi yoktur. Derleyiciler böyle bir isteği yerine getirmeyebilir. CPU yazmaçları hangi sistem söz konusu olursa olsun sınırlı sayıdadır. Bu nedenle birkaç değişkenden fazlası register belirleyicisi ile tanımlanmış olsa bile yazmaçlarda saklanmayabilir. C derleyicileri yazmaçlarda saklayamayacakları değişkenler için genel olarak hata veya uyarı iletileri vermez. Programlama Dilleri 1 9
register Belirleyicisi Derleyiciler, tutabilecekleri yazmaç sayısından fazla register belirleyicisine sahip değişkenlerle karşılaştıklarında bunlara ilişkin register belirleyicilerini dikkate almazlar. register belirleyicileri ancak yerel yada parametre değişkenleri ile kullanılabilir. Global değişkenler ile kullanılamazlar. Örnekler: Programlama Dilleri 1 10
static Belirleyicisi static belirleyicisi ancak yerel yada global değişkenlerin bildiriminde kullanılabilir. Bu belirleyici, parametre değişkenlerinin bildiriminde kullanılamaz. static anahtar sözcüğünün global ve yerel değişkenlerin bildiriminde kullanılması farklı anlamlara gelir. Statik yerel değişkenler, tıpkı global değişkenler gibi programın çalışmaya başlamasıyla yaratılır ve programın yürütülmesi bitene kadar da bellekte tutulur. Programlama Dilleri 1 11
static Belirleyicisi static yer belirleyicisi ile tanımlanmış yerel değişkenler yada yerel diziler programın çalışması boyunca bellekte kalır. Başka bir deyişle, static anahtar sözcüğü yerel değişkenlerin ömrünü otomatik ömürden statik ömre yükseltir. Statik yerel değişkenler programcı tarafından ilkdeğer verildikten sonra kullanılır. İlkdeğer verme işlemi programın çalışması sırasında değil, derleme zamanında derleyici tarafından yapılır. Programlama Dilleri 1 12
static Belirleyicisi Derleyici, bellekten yer ayrılmasına yol açacak makine kodunu oluşturur. Statik yerel değişken için bellekte yer ayrılması, programın yüklenmesi sırasında gerçekleşir. Derleme zamanında gerçekte bellekte yer ayrılmaz. Bellekte yer ayırma işini yapacak makine kodu üretilir. Statik yerel değişkenler ilk değerleriyle birlikte belleğe yüklenir. Programlama Dilleri 1 13
static Belirleyicisi Programlama Dilleri 1 14
Statik ve Global Değişkenlerin Karşılaştırılması Statik yerel değişkenler ömür açısından global değişkenler ile aynı özellikleri gösterirler. Yani programın çalışmaya başlaması ile oluşturulurlar ve programın çalışması bitince ömürleri sona erer. Bilinirlik alanı açısından farklılık gösterirler. Global değişkenler dosya bilinirlik alanına uyarken statik yerel değişkenler blok bilinirlik alanına uyar. Statik yerel değişkenlerin blok bilinirlik alanına sahip olması verilerin gizlenmesini (data hiding) kolaylaştırır ve kodun yeniden kullanılabilirliğini (reusability) artırır. Çünkü global değişkenlere bağlı olan işlevler bir projeden bir başka projeye kolayca taşınamazlar. Programlama Dilleri 1 15
Modül Kavramı ve Nesnelerin Bağlantı Özelliği Bir proje, birbirinden bağımsız olarak derlenebilen birden fazla kaynak dosyadan oluşabilir. Projelerin bağımsız olarak derlenebilen her bir kaynak dosyasına "modül" denir. Bir projeyi oluşturan farklı kaynak dosyalar birbirinden bağımsız olarak derlendikten sonra, hepsi birlikte bağlayıcı (linker) ile birleştirilerek tek bir çalıştırılabilir dosyayı oluştururlar. Programlama Dilleri 1 16
Bağlantı Kavramı Projeyi oluşturan kaynak dosyaların birinde tanımlanan bir isme, projeyi oluşturan başka bir kaynak dosya içinde ulaşılabilir mi? Bu kaynak dosyalar en sonunda tek bir çalışır dosyayı oluşturacaklarına göre, bazı durumlarda bir modülde tanımlanan bir nesneye başka bir modülde ulaşmak istenmesi son derece doğaldır. Bir modülde tanımlanmış bir değişkenin başka bir modülde kullanılıp kullanılmayacağını gösteren özelliğe o nesnenin bağlantı özelliği (linkage) denir. Programlama Dilleri 1 17
Bağlantı Kavramı Bağlantı özelliği bilinirlik alanından farklıdır. Bilinirlik alanı derleyiciyi ilgilendiren yani derleme zamanına ilişkin bir kavramdır. Bir nesne bilinirlik alanı dışında kullanılırsa derleme zamanında hata oluşur. Ancak bağlantı, bağlayıcı programı ilgilendiren yani bağlama zamanına ilişkin bir kavramdır. Bir nesne, bağlantısının olmadığı bir modülde kullanılırsa bağlama zamanında hata oluşur. Programlama Dilleri 1 18
Bağlantı Kavramı C standartlarına göre nesneler bağlantı özellikleri açısından 3 ana gruba ayrılır. 1. Dış bağlantıya sahip nesneler (external linkage) Eğer bir nesne tanımlandıktan sonra, bu nesneye hem kendi modülünün içinde her yerde hem de diğer modüllerden ulaşım mümkünse "nesnenin dış bağlantısı vardır" denir. 2. İç bağlantıya sahip nesneler (internal linkage) Eğer bir nesne tanımlandıktan sonra bu nesneye kendi modülünün içinde, her yerden ulaşılabiliyorsa, ancak projeyi oluşturan diğer modüllerde bu nesneye ulaşılamıyorsa, "nesnenin iç bağlantısı vardır" denir. 3. Bağlantısız Nesneler (no linkage) Kendi modülünde ancak belirli bir blok içinde bilinen nesnelerdir. Programlama Dilleri 1 19
extern Belirleyicisi extern belirleyicisi ile bir bildirim yapılır. Bir değişkenin extern belirleyicisi ile bildirilmesi derleyiciye nesnenin başka bir modülde tanımlandığını anlatır. Bir proje mod1.c ve mod2.c isimli iki kaynak dosyadan oluşmuş olsun : Programlama Dilleri 1 20
extern Belirleyicisi mod1.c dosyasında tanımlanmış olan a değişkeni global bir değişkendir ve dış bağlantıya sahip olduğu için normal olarak proje içindeki diğer kaynak dosyalarda da kullanılabilir. mod2.c dosyasında da bu değişkene ulaşılabilir. Fakat iki modülün ayrı ayrı derlendiği örnekte problemli bir durum söz konusudur. Çünkü mod2.c dosyasının derlenmesi sırasında derleyici a değişkeninin mod1.c kaynak dosyası içinde global olarak tanımlandığını bilemez. mod2.c kaynak dosyasını derlerken a değişkeni hakkında bilgi bulamayan derleyici bu durumu hata olarak belirler. extern belirleyicisi derleyiciye, ilgili global değişkeninin kendi modülü içinde değil de bir başka modül içinde tanımlı olduğunu bildirmek amacıyla kullanılır. Programlama Dilleri 1 21
Tür Niteleyicileri C de const ve volatile olmak üzere iki tür niteleyicisi vardır. const Niteleyicisi const niteleyicisi, ilkdeğer atandıktan sonra nesnenin içeriğinin değiştirilemeyeceğini anlatır. const niteleyicisi yerel, global değişkenlerle ve işlevlerin parametre değişkenleriyle birlikte kullanılabilir. const anahtar sözcüğü ile tanımlanan bir nesneye atama işleci ile atama yapılması geçersizdir: Programlama Dilleri 1 22
const Niteleyicisi const niteleyicisinin kullanım amacı nedir? Kullanıldığı yere göre const niteleyicisi aşağıdaki faydaları sağlayabilir: 1. Programın okunabilirliğini artırır. Bu yönüyle kodu okuyana yardımcı olur. 2. Yanlışlıkla nesnenin değerinin değiştirilmesi engellenir. const bir nesnenin değer atama yoluyla değiştirilmesi durumunda, derleme zamanında hata oluşur. 3. const anahtar sözcüğü ile tanımlanan nesneler, derleyici tarafından salt okunan bellekte saklanabilirler. Derleyici const nesnenin değerinin değiştirilmeyeceğini bilmediğinden, bu nesnelerin kullanıldığı ifadeler için ek eniyileme (optimizasyon) işlemleri uygulayabilir. Programlama Dilleri 1 23
volatile Niteleyicisi Derleyiciler eniyileme amacıyla nesneleri geçici olarak yazmaçlarda tutabilir. Yazmaçlardaki bu çeşit geçici barınmalar, yazmaç belirleyicisi kullanılmasa da derleyiciler tarafından yapılabilir. Örneğin: Yukarıdaki işlevde b geçici bir değişkendir, dolayısıyla derleyici b değişkenini bellekte bir yerde saklayacağına, geçici olarak yazmaçlarından birinde saklasa da işlevsel bir farklılık ortaya çıkmaz. Programlama Dilleri 1 24
volatile Niteleyicisi volatile Değişkenleri eniyileme amacıyla yazmaçlarda bekletme, onları bellekteki gerçek yerlerinde kullan!" anlamına gelen bir tür niteleyicisidir. Bu anlamıyla volatile niteleyicisini register belirleyicisi ile zıt anlamlı olarak düşünebiliriz. Yukarıdaki örnekte b değişkenini volatile olarak bildirerek anlatılan problemin çıkması engellenebilir. int a; volatile int b; volatile çok özel uygulamalarda kullanılabilen bir niteleyicidir. Programlama Dilleri 1 25
Belirleyici ve Niteleyiciler Belirleyici Global Değişken auto static Yerel Değişken register extern volatile const Parametre Değişkeni Programlama Dilleri 1 26