Yanıtlar:
Yığın çerçevesi, yığının üzerine itilen bir veri çerçevesidir. Çağrı yığını durumunda, yığın çerçevesi bir işlev çağrısını ve bağımsız değişken verilerini temsil eder.
Doğru hatırlarsam, işlev dönüş adresi önce yığına, ardından yerel değişkenler için bağımsız değişkenlere ve alana itilir. Birlikte, muhtemelen mimariye bağlı olsa da, "çerçeve" yaparlar. İşlemci, her karede kaç bayt olduğunu bilir ve kareler itilir ve yığından çıkarılırken yığın işaretçisini buna göre hareket ettirir.
Üst düzey çağrı yığınları ile işlemcinin çağrı yığını arasında büyük bir fark vardır.
Bir işlemcinin çağrı yığını hakkında konuştuğumuzda , montaj veya makine kodunda bayt / kelime düzeyinde adresler ve değerlerle çalışmaktan bahsediyoruz . Üst düzey diller hakkında konuşurken "çağrı yığınları" vardır, ancak bunlar programınızla (yüksek düzeyde) neyin yanlış gittiğini kaydedebilmeniz için çalışma ortamı tarafından yönetilen bir hata ayıklama / çalışma zamanı aracıdır. Bu düzeyde, satır numaraları, yöntem ve sınıf adları gibi şeyler genellikle bilinir. İşlemci kodu aldığında, kesinlikle bu şeyler hakkında hiçbir fikri yoktur.
Yığını çok iyi anlarsanız, belleğin programda nasıl çalıştığını anlarsınız ve belleğin programda nasıl çalıştığını anlarsanız, programda fonksiyon deposunun nasıl çalıştığını anlarsınız ve programdaki fonksiyon deposunun nasıl olduğunu anlarsanız, özyinelemeli fonksiyonun nasıl çalıştığını ve özyinelemeli işlevin nasıl çalıştığını anlarsınız, derleyicinin nasıl çalıştığını anlarsınız ve derleyicinin nasıl çalıştığını anlarsanız zihniniz derleyici olarak çalışır ve herhangi bir programı çok kolay hata ayıklarsınız
Yığın nasıl çalıştığını açıklayayım:
İlk önce fonksiyonların yığın halinde nasıl temsil edildiğini bilmelisiniz:
Yığın dinamik olarak ayrılan değerleri saklar.
Yığın, otomatik ayırma ve silme değerlerini saklar.
Örnekle anlayalım:
def hello(x):
if x==1:
return "op"
else:
u=1
e=12
s=hello(x-1)
e+=1
print(s)
print(x)
u+=1
return e
hello(4)
Şimdi bu programın bölümlerini anlayın:
Şimdi yığının ne olduğunu ve yığın parçalarının neler olduğunu görelim:
Yığın tahsisi:
Bir şeyi hatırlayın: herhangi bir işlevin dönüş koşulu yerine getirilirse, yerel değişkenleri yüklese de yüklemeseniz de, yığın çerçevesiyle derhal yığından dönecektir. Bu, herhangi bir özyinelemeli işlev temel koşulu tatmin ettiğinde ve temel koşuldan sonra bir getiri koyduğumuzda, temel koşulun, programın "başka" bölümünde bulunan yerel değişkenleri yüklemek için beklemeyeceği anlamına gelir. Geçerli kareyi hemen bir sonraki karenin etkinleştirme kaydında olduğu yığından geri döndürür.
Uygulamaya bakın:
Bloğun yeniden yerleştirilmesi:
Şimdi bir işlev dönüş ifadesiyle karşılaştığında, geçerli kareyi yığından siler.
Yığından dönerken, değerler yığına ayrıldıkları orijinal sıralamanın tersine döndürülür.
hello()
yinelenen olarak çağrılır hello()
, o zaman (tekrar) özyinelemeli olarak çağrılır hello()
ve küresel çerçeve ilk olarak adlandırılan orijinal işlevdir hello()
?
Hızlı bir sargı. Belki birinin daha iyi bir açıklaması vardır.
Bir çağrı yığını, 1 veya daha fazla sayıda yığın çerçevesinden oluşur. Her yığın çerçevesi, henüz bir dönüşle sonlandırılmamış bir işleve veya prosedüre yapılan çağrıya karşılık gelir.
Bir yığın çerçevesi kullanmak için, bir iş parçacığı iki işaretçi tutar, bunlardan biri Yığın İşaretçisi (SP), diğeri de Çerçeve İşaretçisi (FP) olarak adlandırılır. SP her zaman yığının "üst" ini gösterir ve FP her zaman çerçevenin "üst" ini gösterir. Ek olarak, iş parçacığı ayrıca yürütülecek bir sonraki yönerge gösteren bir program sayacı (PC) tutar.
Yığın üzerinde aşağıdakiler saklanır: yerel değişkenler ve geçici aralıklar, geçerli komutun gerçek parametreleri (prosedür, işlev vb.)
Yığının temizlenmesi ile ilgili farklı çağrı kuralları vardır.
"Bir çağrı yığını yığın çerçevelerinden oluşur ..." - Vikipedi
Yığın çerçevesi, yığına koyduğunuz bir şeydir. Bunlar, çağrılacak altyordamlar hakkında bilgi içeren veri yapılarıdır.
Programcılar, geniş çerçevede olmayan yığın kareleri hakkında (yalnızca bir işlev çağrısına hizmet eden ve dönüş adresini, bağımsız değişkenleri ve yerel değişkenleri saklayan tek bir varlık olduğu) ancak dar anlamda - terimden stack frames
bahsedildiğinde derleyici seçeneklerinin bağlamı.
Sorunun yazarının bunu ifade edip etmediği, ancak derleyici seçenekleri açısından bir yığın çerçeve kavramı, burada diğer yanıtlar tarafından kapsanmayan çok önemli bir konudur.
Örneğin, Microsoft Visual Studio 2015 C / C ++ derleyicisi aşağıdakilerle ilgili şu seçeneğe sahiptir stack frames
:
GCC aşağıdakilere sahiptir:
Intel C ++ Derleyici aşağıdakilere sahiptir:
Aşağıdaki takma adı olan:
Delphi aşağıdaki komut satırı seçeneğine sahiptir:
Bu özel anlamda, derleyicinin bakış açısından, bir yığın çerçevesi, rutin için yalnızca girişe ve çıkış kodudur; bu , yığını çapa iter - hata ayıklama ve özel durum işleme için de kullanılabilir. Hata ayıklama araçları, yığın verilerini tarayabilir ve bu çapaları call sites
yığın içinde konumlandırırken , yani işlevlerin adlarını hiyerarşik olarak adlandırıldıkları sırayla görüntülemek için geri çekmek için kullanabilir. Intel mimarisi için öyle push ebp; mov ebp, esp
ya enter
giriş için ve mov esp, ebp; pop ebp
ya leave
çıkış için.
Bu nedenle, bir programcı için derleyici seçenekleri söz konusu olduğunda yığın çerçevesinin ne olduğunu anlamak çok önemlidir - çünkü derleyici bu kodu üretip üretmeyeceğini kontrol edebilir.
Bazı durumlarda, yığın çerçevesi (rutin için giriş ve çıkış kodu) derleyici tarafından çıkarılabilir ve değişkenlere uygun temel işaretçi (BP / ESP / RSP). Yığın çerçevesinin atlanması için koşullar, örneğin:
Yığın çerçevelerini (rutin için giriş ve çıkış kodu) atlamak kodu daha küçük ve daha hızlı yapabilir, ancak hata ayıklayıcıların yığındaki verileri geri izleme ve programcıya görüntüleme yeteneğini de olumsuz etkileyebilir. Bunlar, bir fonksiyonun hangi koşullar altında giriş ve çıkış koduna sahip olması gerektiğini belirleyen derleyici seçenekleridir, örneğin: (a) her zaman, (b) asla, (c) gerektiğinde (koşulları belirterek).
Yığın çerçevesi, işlev çağrısıyla ilgili paketlenmiş bilgidir. Bu bilgiler genellikle işleve iletilen bağımsız değişkenleri, yerel değişkenleri ve sonlandırıldıktan sonra nereye dönüleceğini içerir. Aktivasyon kaydı, yığın çerçevesi için başka bir isimdir. Yığın çerçevesinin yerleşimi ABI'de üretici tarafından belirlenir ve ISA'yı destekleyen her derleyici bu standarda uygun olmalıdır, ancak yerleşim şeması derleyiciye bağlı olabilir. Genellikle yığın çerçeve boyutu sınırlı değildir ancak sistem çağrılarının ... vb. Yığın çerçevesine müdahale etmeden yürütülmesine izin vermek için "kırmızı / korumalı bölge" adı verilen bir kavram vardır.
Her zaman bir SP vardır, ancak bazı ABI'lerde (örneğin ARM'ler ve PowerPC'ler) FP isteğe bağlıdır. Yığına yerleştirilmesi gereken bağımsız değişkenler yalnızca SP kullanılarak dengelenebilir. Bir işlev çağrısı için yığın çerçevesinin oluşturulup oluşturulmayacağı, bağımsız değişkenlerin türüne ve sayısına, yerel değişkenlere ve yerel değişkenlere genel olarak nasıl erişildiğine bağlıdır. Çoğu ISA'da ilk olarak kayıtlar kullanılır ve argümanları iletmek için ayrılmış kayıtlardan daha fazla argüman varsa bunlar yığına yerleştirilir (Örneğin x86 ABI'de tamsayı argümanlarını iletmek için 6 kaydı vardır). Bu nedenle, bazen, bazı işlevlerin yığına yerleştirilmesi için bir yığın çerçevesine gerek yoktur, yalnızca dönüş adresi yığının üzerine itilir.