Derleyici Tasarımı - Çalışma Zamanı Ortamı

Kaynak kodu olarak bir program yalnızca bir metin koleksiyonudur (kod, ifadeler vb.) Ve onu canlı kılmak için hedef makinede gerçekleştirilecek eylemleri gerektirir. Bir program, talimatları yürütmek için bellek kaynaklarına ihtiyaç duyar. Bir program, çalışma zamanında gerçek bellek konumu ile eşleştirme gerektiren prosedürler, tanımlayıcılar vb. İçin adlar içerir.

Çalışma zamanı ile, yürütülmekte olan bir programı kastediyoruz. Çalışma zamanı ortamı, sistemde çalışan işlemlere hizmet sağlamak için yazılım kitaplıkları, ortam değişkenleri vb. İçerebilen hedef makinenin bir durumudur.

Runtime destek sistemi, çoğunlukla çalıştırılabilir programın kendisiyle oluşturulan bir pakettir ve süreç ile çalışma zamanı ortamı arasındaki süreç iletişimini kolaylaştırır. Program yürütülürken bellek tahsisi ve tahsisinin kaldırılmasıyla ilgilenir.

Aktivasyon Ağaçları

Bir program, bir dizi prosedürle birleştirilen bir talimatlar dizisidir. Bir prosedürdeki talimatlar sırayla yürütülür. Bir prosedürün bir başlangıç ​​ve bir bitiş sınırlayıcısı vardır ve içindeki her şeye prosedürün gövdesi denir. Prosedür tanımlayıcısı ve içindeki sonlu talimatlar dizisi prosedürün gövdesini oluşturur.

Bir prosedürün yürütülmesine aktivasyonu denir. Bir aktivasyon kaydı, bir prosedürü çağırmak için gereken tüm gerekli bilgileri içerir. Bir aktivasyon kaydı aşağıdaki birimleri içerebilir (kullanılan kaynak dile bağlı olarak).

Geçiciler Bir ifadenin geçici ve ara değerlerini depolar.
Yerel Veriler Çağrılan prosedürün yerel verilerini depolar.
Makine Durumu Prosedür çağrılmadan önce Kayıtlar, Program Sayacı vb. Gibi makine durumlarını saklar.
Kontrol Bağlantısı Arayan prosedürünün aktivasyon kaydının adresini saklar.
Erişim Bağlantısı Yerel kapsamın dışındaki verilerin bilgilerini depolar.
Gerçek Parametreler Gerçek parametreleri, yani çağrılan prosedüre girdi göndermek için kullanılan parametreleri saklar.
Geri dönüş değeri Dönüş değerlerini depolar.

Bir prosedür yürütüldüğünde, aktivasyon kaydı, kontrol yığını olarak da bilinen yığında saklanır. Bir prosedür başka bir prosedürü çağırdığında, çağrılan prosedür yürütmeyi bitirene kadar arayanın yürütmesi askıya alınır. Şu anda, çağrılan prosedürün aktivasyon kaydı yığında saklanır.

Program kontrolünün sıralı bir şekilde aktığını ve bir prosedür çağrıldığında, kontrolünün çağrılan prosedüre aktarıldığını varsayıyoruz. Çağrılan bir prosedür yürütüldüğünde, kontrolü arayana geri döndürür. Bu tür bir kontrol akışı, bir ağaç şeklinde bir dizi aktivasyonu temsil etmeyi kolaylaştırır.activation tree.

Bu kavramı anlamak için örnek olarak bir kod parçası alıyoruz:

. . .
printf(“Enter Your Name: “);
scanf(“%s”, username);
show_data(username);
printf(“Press any key to continue…”);
. . .
int show_data(char *user)
   {
   printf(“Your name is %s”, username);
   return 0;
   }
. . .

Aşağıda verilen kodun aktivasyon ağacı görülmektedir.

Artık prosedürlerin derinlemesine uygulandığını anlıyoruz, bu nedenle yığın tahsisi prosedür etkinleştirmeleri için en uygun depolama şeklidir.

Depolama Tahsisi

Çalışma zamanı ortamı, aşağıdaki varlıklar için çalışma zamanı bellek gereksinimlerini yönetir:

  • Code: Bir programın çalışma zamanında değişmeyen metin kısmı olarak bilinir. Bellek gereksinimleri, derleme zamanında bilinir.

  • Procedures: Metin bölümleri sabittir ancak rastgele çağrılırlar. Bu nedenle, prosedür çağrılarını ve etkinleştirmeleri yönetmek için yığın depolama kullanılır.

  • Variables: Değişkenler, global veya sabit olmadıkları sürece yalnızca çalışma zamanında bilinir. Yığın bellek ayırma şeması, çalışma zamanındaki değişkenler için belleğin tahsisini ve ayrılmasını yönetmek için kullanılır.

Statik Tahsis

Bu tahsis şemasında, derleme verileri bellekte sabit bir konuma bağlıdır ve program çalıştırıldığında değişmez. Bellek gereksinimi ve depolama konumları önceden bilindiğinden, bellek ayırma ve ayırma için çalışma zamanı destek paketi gerekli değildir.

Yığın Tahsisi

Prosedür çağrıları ve bunların aktivasyonları yığın bellek tahsisi ile yönetilir. Son giren ilk çıkar (LIFO) yönteminde çalışır ve bu tahsis stratejisi özyinelemeli prosedür çağrıları için çok kullanışlıdır.

Yığın Tahsisi

Bir prosedür için yerel değişkenler, yalnızca çalışma zamanında tahsis edilir ve tahsisleri kaldırılır. Yığın tahsisi, belleği değişkenlere dinamik olarak ayırmak ve değişkenler artık gerekli olmadığında geri talep etmek için kullanılır.

Statik olarak ayrılmış bellek alanı dışında, hem yığın hem de yığın belleği dinamik ve beklenmedik bir şekilde büyüyebilir ve küçülebilir. Bu nedenle, sistemde sabit miktarda bellek sağlanamaz.

Yukarıdaki resimde gösterildiği gibi, kodun metin kısmına sabit miktarda bellek tahsis edilmiştir. Yığın ve yığın belleği, programa ayrılan toplam belleğin uç noktalarında düzenlenir. Her ikisi de küçülür ve birbirine karşı büyür.

Parametre Geçişi

Prosedürler arasındaki iletişim ortamı, parametre geçişi olarak bilinir. Bir çağırma prosedüründeki değişkenlerin değerleri, bir mekanizma tarafından çağrılan prosedüre aktarılır. Devam etmeden önce, önce bir programdaki değerlerle ilgili bazı temel terminolojilere göz atın.

r değeri

Bir ifadenin değerine r-değeri denir. Tek bir değişkende bulunan değer, atama operatörünün sağ tarafında görünüyorsa bir r değeri haline gelir. r değerleri her zaman başka bir değişkene atanabilir.

l-değeri

Bir ifadenin depolandığı belleğin (adres) konumu, bu ifadenin l değeri olarak bilinir. Her zaman bir atama operatörünün sol tarafında görünür.

Örneğin:

day = 1;
week = day * 7;
month = 1;
year = month * 12;

Bu örnekten, 1, 7, 12 gibi sabit değerlerin ve gün, hafta, ay ve yıl gibi değişkenlerin hepsinin r değerlerine sahip olduğunu anlıyoruz. Yalnızca değişkenler, kendilerine atanan bellek konumunu da temsil ettikleri için l değerlerine sahiptir.

Örneğin:

7 = x + y;

sabit 7 herhangi bir bellek konumunu temsil etmediği için bir l değeri hatasıdır.

Biçimsel Parametreler

Çağıran prosedürü tarafından iletilen bilgileri alan değişkenlere biçimsel parametreler denir. Bu değişkenler, çağrılan işlevin tanımında bildirilir.

Gerçek Parametreler

Değerleri veya adresleri çağrılan prosedüre iletilen değişkenlere gerçek parametreler denir. Bu değişkenler işlev çağrısında bağımsız değişken olarak belirtilir.

Example:

fun_one()
{
   int actual_parameter = 10;
   call fun_two(int actual_parameter);
}
   fun_two(int formal_parameter)
{
   print formal_parameter;
}

Biçimsel parametreler, kullanılan parametre geçirme tekniğine bağlı olarak gerçek parametrenin bilgilerini tutar. Bir değer veya adres olabilir.

Değere Göre Geçiş

Değer mekanizmasında geçişte, çağırma prosedürü gerçek parametrelerin r değerini geçirir ve derleyici bunu çağrılan prosedürün aktivasyon kaydına koyar. Biçimsel parametreler daha sonra çağırma prosedüründen geçen değerleri tutar. Biçimsel parametreler tarafından tutulan değerler değiştirilirse, gerçek parametreler üzerinde hiçbir etkisi olmamalıdır.

Referansla Geç

Referans mekanizmasına göre geçişte, gerçek parametrenin l değeri, çağrılan prosedürün aktivasyon kaydına kopyalanır. Bu şekilde, çağrılan prosedür artık gerçek parametrenin adresine (bellek konumu) sahiptir ve biçimsel parametre aynı bellek konumuna başvurur. Bu nedenle, resmi parametrenin işaret ettiği değer değiştirilirse, etki aynı değere işaret etmeleri gerektiğinden gerçek parametre üzerinde görülmelidir.

Kopyalama-geri yükleme ile geçme

Bu parametre geçirme mekanizması, çağrılan prosedür sona erdiğinde gerçek parametrelerdeki değişikliklerin yapılması dışında 'referansla geçiş'e benzer şekilde çalışır. İşlev çağrısı üzerine, gerçek parametrelerin değerleri çağrılan prosedürün aktivasyon kaydına kopyalanır. Biçimlendirilmiş parametreler, gerçek parametreler üzerinde gerçek zamanlı bir etkiye sahip değildir (l-değerleri geçerken), ancak çağrılan prosedür sona erdiğinde, biçimsel parametrelerin l-değerleri, gerçek parametrelerin l-değerlerine kopyalanır.

Example:

int y; 
calling_procedure() 
{
   y = 10;     
   copy_restore(y); //l-value of y is passed
   printf y; //prints 99 
}
copy_restore(int x) 
{     
   x = 99; // y still has value 10 (unaffected)
   y = 0; // y is now 0 
}

Bu fonksiyon sona erdiğinde, x biçimsel parametresinin l değeri, gerçek parametre y'ye kopyalanır. Prosedür bitmeden y'nin değeri değiştirilse bile, x'in l-değeri y'nin l-değerine kopyalanır ve bu da referansla çağrı gibi davranmasını sağlar.

İsimle Geç

Algol gibi diller, C dilinde önişlemci gibi çalışan yeni bir tür parametre geçirme mekanizması sağlar. Ad geçirme mekanizmasında, çağrılan prosedürün adı gerçek gövdesi ile değiştirilir. İsme göre geçirme, bir yordam çağrısındaki bağımsız değişken ifadelerini, yordamın gövdesindeki karşılık gelen parametreler için metin olarak değiştirir, böylece artık başvuruya göre geçirme gibi gerçek parametreler üzerinde çalışabilir.