Çağrı yığını alttan mı üstten mi başlıyor?


11

Bir yığın, aşağıdan yukarıya kazık yapan bir şeydir.

Bu nedenle, her çağrı sona erene kadar işlevler çağrıldığında işlevler çağrıldığında çağrı yığını yığına yeni öğeler ekler.

Yukarıdakiler doğruysa, insanlar neden çağrı yığınını "yukarı" hareket ettirmeyi deniyor? Şüphesiz kontrol , çağrı yığınını alta gelene kadar aşağı taşır .


Bir işlev çağrıldığında, yığının üstüne bir öğe eklenir ve kontrol bu işleve geçirilir. Bu nedenle, kontrol yığındaki temel öğeden üst öğeye doğru hareket eder.
treecoder

1
@greengit: "çağrı yığınının yukarısına" ifadesi, kontrolün gerçekte ters yönde hareket ettiği istisnalar dışında kullanılır.
Michael Borgwardt

@MichaelBorgwardt: Haklısın.
treecoder

1
@MichaelBorgwardt: "Hatalar çağrı yığınını yukarı taşıyor" ifadesini gördüm . Elbette bu yanlış.
CJ7

Yanıtlar:


9

Bu kullanımın iki olası nedeni vardır:

  • İstisnalar bağlamında, kontrol çağıran fonksiyona / yönteme geçer ve bu çağrı hiyerarşisi tipik olarak üstteki ana yöntemle görselleştirilir ve yöntem çağrıları, azalan bir soyutlama seviyesiyle aşağıya doğru bir hiyerarşi oluşturur. Bu hiyerarşide bir istisna yukarı doğru hareket eder.

  • Normal bir x86 uygulamasındaki gerçek program yığını ters çevrilir, yani aşağı doğru büyür. PUSH / PUSHW / PUSHD makine kodu talimatları yığın işaretçisini azaltır . Diğer mimariler bu modeli paylaşabilir.


Yukarıdan aşağıya fikir, "yığın" ın alttan başlayan bir yığın ürün olduğu günlük konseptine aykırı değil mi?
CJ7

@CraigJ: yığının içeriğinin her bir baytının bitlerinin fiziksel olarak ayrı yongalarda saklanması gerçeğidir. Kimin umrunda?
Michael Borgwardt

1

Her şey kelimelerin tanımına bağlıdır; bu bağlamda "üst" ve "alt" sözcükleriyle ve ayrıca işletim sisteminin veya bilgisayar mimarisinin uygulanmasında tam olarak ne demek istiyorsun.

Uzun zaman önce Commodore 64 üzerinde programlama yaparken aşağıdakileri hatırlıyorum. Adres 0800 (2048) ile 9FFF (40959) arasındaki bellek BASIC programları için ayrıldı. BASIC programınızın kodu en düşük adresten (oradan yukarı doğru büyüyen 0800 $) başlayarak saklandı. Alt rutinlerin değişkenlerini ve dönüş adreslerini depolamak için yığın, bu aralığın en üstünde (9FFF $) başladı ve daha düşük adreslere doğru büyüdü. Bu bağlamda, yığının aşağı doğru büyüdüğünü görmek mantıklıydı ve bir altyordamdan döndüğünüzde, altyordamın yığın çerçevesi, yığın işaretçisini arttırarak atıldı, böylece "yığını yukarı taşıdığınızı" söyleyebilirsiniz. bir altyordamdan dönen.

Windows veya Intel x86 işlemcilerin modern sürümlerinde nasıl çalıştığını bilmiyorum. Belki de yığın, ters yönde çalışır, yani düşük adreslerden yüksek adreslere doğru büyür. Bu durumda, büyük olasılıkla "üst", "alt" ve "yukarı", "aşağı" kelimelerini tam tersi şekilde kullanırsınız.


0

Foo (6, x + 1) gibi bir işlevi çağırmak için ...

  1. X + 1 gibi gerçek parametre ifadelerini arayanın bağlamında değerlendirin.
  2. Bu amaç için ayrılmış bir çalışma zamanı "çağrı yığını" na uygun bir "yerel blok" bellek iterek foo () yerlileri için bellek ayırın. Yerel değişkenler değil parametreler için, adım (1) 'deki değerleri foo () yerel bloğundaki uygun yuvaya depolayın.
  3. Arayanın geçerli yürütme adresini ("dönüş adresi") saklayın ve yürütmeyi foo () olarak değiştirin.
  4. foo (), çağrı yığınının sonunda uygun şekilde bulunan yerel bloğu ile çalışır.
  5. Foo () bittiğinde, yerel ayarlarını yığının dışına atmaktan çıkar ve önceden kaydedilmiş dönüş adresini kullanarak arayana "geri döner". Şimdi arayanın yerel ayarları yığının sonundadır ve yürütmeye devam edebilir.

Referans:

http://cslibrary.stanford.edu/102/PointersAndMemory.pdf (s15)


Bunun çağrı kuralına oldukça özel olduğunu unutmayın. Arayanın temizlenmesine izin veren arama kuralları vardır, çoğu en azından bazı kayıtları kullanır, vb.

0

Bir yığını, normal yerçekimi gerçekliği altında tenis topları olan bir silindir gibi, aşağıdan yukarıya bir şey olarak kavramsallaştırırsanız, kontrol işlevler olarak adlandırılır. İşlevler tamamlandığında, kontrol yığının aşağısına doğru hareket eder.

Bir yığını, aynı tenis topları silindiri gibi, ancak ters yerçekimi ile yukarıdan aşağıya bir şey olarak kavramsallaştırırsanız, kontrol işlevler olarak adlandırılırken yığını tamamlar ve işlevler tamamlandığında yığını yukarı taşır.

Bunların her ikisi de sadece kafanızdaki modellerdir ve aslında tamamen keyfidir. İsterseniz yan yana bir şey olarak kavramsallaştırabilirsiniz, ancak insanlarla iletişimde sorun yaşayabilirsiniz. Şahsen A'nın B ve B'yi çağırması durumunda C'nin yığının alt kısmı olduğunu (ters yerçekimi gerçekliği) ve C'de bir istisna meydana gelirse, bu istisnayı A'ya "kadar" yükseltmek istediğinizi düşünüyorum. daha yaygın bir dil kullanımıdır çünkü duygu C'nin derin ve A'nın en üstte olmasıdır. İlk fonksiyon daha sezgisel olarak benim için en üstte ve fonksiyonlar her çağrıda daha derinleşiyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.