8.7. Çevirme Ve Yürütme Ortamları
Bir C programı uygulaması,
- C kaynak dosyalarının makine diline çevrilmesi ve
- 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 yazma | 127 |
#if , #ifdef ve #ifndef ,
içiçe yazma | 63 |
Bir bildirimdeki aritmetik, struct , union
veya void türünü değiştiren
(herhangi bir kombinasyondaki) gösterge, dizi ve fonksiyon bildiricileri | 12 |
Tam bir bildirici içindeki parantezli bildiriciler | 63 |
Tam bir ifade içindeki içiçe (parantezli) yazılmış ifadeler | 63 |
Bir içsel tanıtıcı sözcük veya makro tanıtıcı sözcük içindeki anlamlı karakterler | 63 |
Bir dışsal tanıtıcı sözcük içindeki anlamlı karakterler | 31 |
Bir çevirme birimi içindeki dışsal tanıtıcı sözcükler | 4095 |
Bir blok içindeki, etki alanı blok olan, tanıtıcı sözcükler | 511 |
Bir çevirme birimi içinde aynı anda tanımlanmış makro tanıtıcı sözcükleri | 4095 |
Bir fonksiyon tanımındaki parametreler | 127 |
Bir fonksiyon çağrısındaki argümanlar | 127 |
Bir makro tanımındaki parametreler | 127 |
Bir makro etkinleştirmesi sırasında verilen argümanlar | 127 |
Mantıksal bir kaynak kod satırındaki karakterler | 4095 |
Bir karakter dizisi değişmezindeki karakterler (diziler birleştirildikten sonra) | 4095 |
Bir nesnedeki baytlar | 65535 |
Başlık dosyaları, içiçe #include etme | 15 |
Bir switch deyimindeki (o switch deyimine ait olan)
case etiketleri | 1023 |
Bir struct veya union içindeki üyeler | 1023 |
Bir enum ’daki değişmezler | 1023 |
struct veya union tanımlarında içiçe yazma | 63 |
Ç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:
- 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.
- 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. - 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.
- Ö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. - Değişmez karakter ve karakter dizilerindeki kaçış sıraları (örneğin,
\b
) denk gelen tek karaktere dönüştürülür. - Yan yana bulunan karakter dizileri birleştirilir.
- 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.
- 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.