Standart C Programlama Dili


8.7. Çevirme Ve Yürütme Ortamları

Bir C programı uygulaması,

  1. C kaynak dosyalarının makine diline çevrilmesi ve
  2. Bunların yürütülmesi

şeklinde iki aşamalıdır. Bu aşamalar, iki farklı veri işleme sistemi ortamında gerçekleşir: çeviri ortamı ve yürütme ortamı. Bu bölümde bu iki ortam ve aşama hakkında bazı bilgiler verilmiştir.

Çevirme Sınırları

C Standardı, uyumlu her derleyici tarafından karşılanması gereken birtakım sınırlar tanımlamıştır. Örneğin, tanımlanan bir nesne için izin verilen en büyük boy 65.535 bayttır; ancak belli bir derleyici, 80.000 karakterlik bir dizi gibi daha büyük bir nesneye izin verebilir. Her durumda, taşınabilirliği garantilemek için programınızın aşağıda belirtilmiş en küçük büyük sınırlar içinde kalmasını sağlayın:

Bileşik deyimler, içiçe yazma127
#if, #ifdef ve #ifndef, içiçe yazma63
Bir bildirimdeki aritmetik, struct, union veya void türünü değiştiren (herhangi bir kombinasyondaki) gösterge, dizi ve fonksiyon bildiricileri12
Tam bir bildirici içindeki parantezli bildiriciler63
Tam bir ifade içindeki içiçe (parantezli) yazılmış ifadeler63
Bir içsel tanıtıcı sözcük veya makro tanıtıcı sözcük içindeki anlamlı karakterler63
Bir dışsal tanıtıcı sözcük içindeki anlamlı karakterler31
Bir çevirme birimi içindeki dışsal tanıtıcı sözcükler4095
Bir blok içindeki, etki alanı blok olan, tanıtıcı sözcükler511
Bir çevirme birimi içinde aynı anda tanımlanmış makro tanıtıcı sözcükleri4095
Bir fonksiyon tanımındaki parametreler127
Bir fonksiyon çağrısındaki argümanlar127
Bir makro tanımındaki parametreler127
Bir makro etkinleştirmesi sırasında verilen argümanlar127
Mantıksal bir kaynak kod satırındaki karakterler4095
Bir karakter dizisi değişmezindeki karakterler (diziler birleştirildikten sonra)4095
Bir nesnedeki baytlar65535
Başlık dosyaları, içiçe #include etme15
Bir switch deyimindeki (o switch deyimine ait olan) case etiketleri1023
Bir struct veya union içindeki üyeler1023
Bir enum’daki değişmezler1023
struct veya union tanımlarında içiçe yazma63

Çevirme Aşamaları

C dilindeki bir kaynak program derlenirken çeşitli aşamalardan geçer. Standart sekiz farklı çevirme aşaması tanımlamıştır. Tabii ki, belli bir gerçekleştirmenin kod üzerinde sekiz ayrı safhada bu aşamaları geçmesi beklenmez. Uygulamada, bu aşamalar çoğu zaman üst üste gelebilir. Ancak, kavramsal olarak, sonucun sanki bu sekiz ayrı aşama varmış gibi olması gerekir. Bu aşamalar şöyledir:

  1. Fiziksel kaynak dosya çokbaytlı karakterler, gerçekleştirmenin tanımladığı şekilde, kaynak karakter kümesine dönüştürülür. Örneğin, üçlü karakterler, denk gelen tek karakterlere ve Windows ortamındaki satırbaşı ve satır ilerletme karakterleri yeni satır karakterlerine dönüştürülür.
  2. Ters bölü (\) karakteri ile biten satırlar bir sonraki satır ile birleştirilir ve ilgili ters bölü karakteri ile hemen peşindeki yeni satır karakteri silinir. Bu şekilde fiziksel kaynak kod satırları mantıksal kaynak kod satırlarına dönüştürülürler.
  3. Kaynak dosya, önişleme simgelerine ve beyaz boşluk karakterlerine ayrılır. Kaynak koddaki her bir açıklama tek bir boşluk karakterine dönüştürülür. Yeni satır karakterleri korunur. Herhangi bir beyaz boşluk karakteri sırasının tek bir boşluk karakterine dönüştürülüp dönüştürülmeyeceği gerçeklemeye göre değişebilir.
  4. Önişleme emirleri yerine getirilir, makrolar genişletilir ve _Pragma tekli işleç ifadeleri yerine getirilir. Her #include edilen dosya için 1 ile 4 arasındaki bu aşamalar tekrarlanır. Bu şekilde tüm önişleme emirleri kaynak koddan kaldırılmış olur.
  5. Değişmez karakter ve karakter dizilerindeki kaçış sıraları (örneğin, \b) denk gelen tek karaktere dönüştürülür.
  6. Yan yana bulunan karakter dizileri birleştirilir.
  7. Geleneksel derleme işlemi yapılır. Önişleme simgelerini ayıran beyaz boşluk karakterleri artık gereksizdir ve dikkate alınmaz. Simgeler sözdizimsel ve anlambilimsel açıdan çözümlenir ve (birleştirici dile veya makine diline) çevirime tabi tutulur.
  8. Tüm dışsal nesne ve fonksiyon kullanımları çözümlenir. Mevcut çevirmede tanımlanmamış olan dışsal fonksiyon ve nesne kullanımları kütüphane bileşenleri ile bağlanarak karşılanır. Bu şekilde, tüm çevirici çıktısı bir program imgesi haline getirilir. Program artık yürütme ortamında çalıştırılmaya hazırdır.

Yürütme Ortamları

Standartta iki farklı yürütme ortamı tanımlanmıştır: bağımsız ve barındırılan. Her iki durumda da, programın başlangıcı, belirlenmiş bir C fonksiyonunun yürütme ortamı tarafından çağrılmasıyla oluşur. Kalıcı depolama süresi olan tüm nesneler, program başlatılmadan önce ilklenir. Bu ilkleme işleminin zamanlaması ve gerçekleşme tarzı C Standardında belirtilmemiştir. Kontrolün yürütme ortamına geri verilmesi ile program sonlandırılmış olur.

Bağımsız yürütme ortamında (C programının yürütülmesinin herhangi bir işletim sisteminin desteği ile yapılmadığı ortamda) programın başlangıcında çağrılan fonksiyonun adı ve tipi tamamen o ortama bağlıdır. Minimum bir küme dışında, bağımsız bir programın kullanabileceği kütüphane olanakları da ortamın koşullarına göre sınırlı olabilir. Bağımsız bir yürütme ortamında programın sonlandırmasının nasıl olacağı ortama göre değişkenlik gösterebilir.

Barındırılan yürütme ortamı (eğer sağlanıyorsa) Standartta belirtilen bazı koşullara uymalıdır. Programın başlaması, Altkısım 4.2.3’te anlatıldığı gibi, uygun bir şekilde tanımlanmış olan bir main fonksiyonunun çağrılması ile olur. Barındırılan yürütme ortamında bir program, bu kitapta anlatılan tüm standart fonksiyonları, makroları, tip tanımlarını ve nesneleri kullanabilir. main fonksiyonunun dönüş tipi int’e uyumlu olmalıdır. programın sonlanması ya main fonksiyonunun sonundaki }’e gelinmekle (return 0’a eşdeğerdir) veya main içinde iken return deyiminin işletilmesi ile olur. return deyimi ile döndürülen değer, programda bu değer argüman olarak verilip exit fonksiyonunun çağrılması gibi bir etki yapar.

Bu kitaptaki örneklerde barındırılan yürütme ortamı baz alınmıştır.