Programları yapılandırmanın tek makul yolu yığınlar mı?


74

Gördüğüm mimarların çoğu, işlev çağrıları öncesi bağlamı kaydetmek / geri yüklemek için bir çağrı yığına güveniyor. Push ve pop işlemlerinin çoğu işlemciye yerleşik olması çok yaygın bir paradigmadır. Yığın olmadan çalışan sistemler var mı? Eğer öyleyse, nasıl çalışırlar ve ne için kullanılırlar?


5
Fonksiyonlar C benzeri dillerde davranmaları beklenmektedir nasıl Verilen (yani yuva istediğiniz kadar derin aramalar edebilir ve geri dışarı ters sırada dönebilirsiniz), bu bir başka nasıl bana net değil olabilir işlevi uygulamak inanılmaz olmadan çağırır yetersiz. Örneğin, programcıyı sürekli geçen stili veya başka bir tuhaf programlama biçimini kullanmaya zorlayabilirsiniz, ancak hiç kimse bir nedenden ötürü CPS ile düşük seviyede çalışacak gibi görünmüyor.
Kevin

5
GLSL bir yığın olmadan çalışır (bu belirli ayraçtaki diğer dillerde olduğu gibi). Bu sadece özyinelemeli aramalara izin vermez.
Leushenko

3
Bazı RISC mimarileri tarafından kullanılan Register pencerelerine de bakmak isteyebilirsiniz .
Mark Booth,

2
@Kevin: "Erken FORTRAN derleyicileri alt yordamlarda özyinelemeyi desteklemedi. İlk bilgisayar mimarileri yığın kavramını desteklemiyordu ve alt yordam çağrıları doğrudan desteklendiğinde, geri dönüş konumu genellikle alt yordam koduna bitişik sabit bir yerde saklanıyordu. Bir alt rutinin alt rutinin önceki bir çağrısı geri dönmeden önce tekrar çağrılmasına izin verilmez. Fortran 77'de belirtilmemiş olmasına rağmen, birçok F77 derleyicisi bir seçenek olarak özyinelemeyi desteklerken Fortran 90'da standart olmuştur. " en.wikipedia.org/wiki/Fortran#FORTRAN_II
Mooing Duck

3
P8X32A ("Pervane") mikrodenetleyicisinin standart montaj dilinde (PASM) bir yığın kavramı yoktur. Zıplamadan sorumlu olan talimatlar RAM'e geri dönüş talimatını kendiliğinden değiştirerek nereye geri döneceğini belirlemek - ki bunlar keyfi olarak seçilebilir. İlginçtir ki, "Spin" dili (aynı çipte çalışan, yorumlanmış bir üst seviye dil) geleneksel yığın semantiğine sahiptir.
Woss name

Yanıtlar:


50

Bir çağrı yığına popüler bir alternatif (biraz), sürekliliktir .

Parrot VM, örneğin devam temellidir. Tamamen yığınsızdır: veriler kayıtlarda tutulur (Dalvik veya LuaVM gibi, Papağan kayıt tabanlıdır) ve kontrol akışı sürekliliklerle temsil edilir (Dalvik veya bir çağrı yığını olan LuaVM'in aksine).

Tipik olarak Smalltalk ve Lisp VM'ler tarafından kullanılan bir başka popüler veri yapısı da, bir yığın yığın ağına benzeyen spagetti yığınıdır.

@ Rwong'un belirttiği gibi , devam eden stil bir çağrı yığınına bir alternatiftir. Devamlı geçiş tarzında yazılmış (veya dönüştürülmüş) programlar asla geri dönmez, bu nedenle yığına gerek kalmaz.

Sorunuzu farklı bir perspektiften cevaplama: Yığın karelerini öbek üzerine atayarak, ayrı bir yığına sahip olmadan bir çağrı yığınının olması mümkündür. Bazı Lisp ve Scheme uygulamaları bunu yapar.


4
Bir yığın tanımınıza bağlıdır. Yığın çerçevelere bağlı bir listeye (ya da işaretçiler dizisine ya da ...) sahip olmanın, "bir yığının farklı bir gösterimi" kadar "bir yığın" olmadığından emin değilim; ve CPS dilindeki programlar (pratikte), etkili bir şekilde birbirine bağlanmış olan süreklilik listelerini, yığınlara çok benzeyen süreklilik listeleri oluşturma eğilimindedir (eğer yapmadıysanız, GHC'yi kontrol edebilirsiniz. verimlilik için).
Jonathan Cast,

6
" Devam eden bir tarzda yazılmış (ya da dönüştürülmüş) yazılmış programlar asla geri dönmez " ... kulağa hoş geliyor.
Rob Penridge,

5
@RobPenridge: biraz şifreli, katılıyorum. CPS, işlevlerin yerine işlev yerine getirildiğinde işlevlerin başka bir işlevi çağırmak için fazladan bir argüman olarak kabul ettiği anlamına gelir. Bu nedenle, bir işlevi çağırdığınızda ve işlevi çağırdıktan sonra yapmanız gereken başka bir işiniz varsa, işlevin geri dönmesini beklemek ve sonra işinize devam etmek için bekletmek yerine, kalan işi ("devam") sararsınız. ) bir işleve dönüştürülür ve bu işlevi ek bir argüman olarak iletir. Ardından çağırdığınız işlev, geri dönmek yerine bu işlevi çağırır, vb. Hiçbir fonksiyon geri
Jörg W Mittag

3
… Bir sonraki işlevi çağırır. Bu nedenle, bir çağrı yığınına ihtiyaç duymazsınız, çünkü daha önce geri dönüp, daha önce çağrılan bir işlevin bağlanma durumunu geri yüklemeniz gerekmez. Geçmiş devleti taşımak yerine, geri dönebilmek için gelecekteki devleti taşıyacaksınız.
Jörg W Mittag

1
@jcast: Bir yığının tanımlayıcı özelliği, yalnızca en üstteki öğeye erişebileceğiniz IMO'dur. Bir süreklilik listesi, OTOH, yalnızca en üstteki yığınlama çerçevesine değil, tüm sürekliliklere erişmenizi sağlar. Örneğin Smalltalk tarzı yeniden başlatılabilir özel durumlarınız varsa, yığını yığmadan geçebilmeniz gerekir. Ve hala bir çağrı yığını hakkında bilinen bir fikre sahip olmak isterken dilde sürekliliği sağlamak, temelde sürekliliği "istifle" istifleyen bir yığın ağacı olan spagetti yığınlarına yol açar.
Jörg W Mittag

36

Eski günlerde, işlemcilerde yığın yönergeleri yoktu ve programlama dilleri özyinelemeyi desteklemedi. Zaman geçtikçe, daha fazla dil özyinelemeyi desteklemeyi ve donanımın ardından yığın çerçeve tahsisi özelliklerine sahip bir paketi seçti. Bu destek farklı işlemcilerle yıllar içinde büyük ölçüde değişmiştir. Bazı işlemciler yığın çerçevesini ve / veya yığın işaretçi kayıtlarını kabul etti; Bazıları, yığın çerçevelerin tek bir komutta tahsis edilmesini sağlayacak talimatları kabul etti.

İşlemciler tek seviyeli, sonra çok seviyeli önbelleklerle ilerlerken, yığının önemli bir avantajı önbellek konumudur. Yığının üstü neredeyse her zaman önbellekte. Ne zaman büyük bir önbellek isabet oranına sahip bir şey yapabilirseniz, modern işlemcilerle doğru yoldasınız. Yığına uygulanan önbellek, yerel değişkenlerin, parametrelerin, vb. Hemen hemen her zaman önbellekte olduğu ve en yüksek performans düzeyinin keyfini çıkardığı anlamına gelir.

Kısacası, yığının kullanımı hem donanımda hem de yazılımda gelişti. Başka modeller de var (örneğin, veri akışı hesaplama uzun bir süredir deneniyordu), ancak yığının konumu gerçekten iyi çalışmasını sağlıyor. Dahası, prosedürel kod, işlemciler için tam da istediği şeydir: performans için: bir talimat diğerine ne yapılması gerektiğini söyleyen bir talimat. Talimatlar doğrusal sıralamanın dışında kaldığında, işlemci sırayla erişim kadar hızlı nasıl rasgele erişim yapabileceğimizi çözemediğimizden, en azından henüz, çok yavaşlar. (BT, her bellek düzeyinde, önbellekten ana belleğe, diske kadar ... benzer sorunlar vardır.)

Sıralı erişim talimatlarının gösterilen performansı ve çağrı yığınının yararlı önbellek davranışı arasında, en azından şu anda kazanan bir performans modeline sahibiz.

(Veri yapılarının değişkenliğini eserlere de dahil edebiliriz ...)

Bu, diğer programlama modellerinin çalışamayacağı anlamına gelmez, özellikle sıralı talimatlara çevrilebildiklerinde ve bugünün donanımının yığın modelini arayabildiklerinde. Ancak, donanımın nerede olduğunu destekleyen modeller için belirgin bir avantaj var. Ancak, işler her zaman aynı kalmaz; bu nedenle, gelecekteki değişiklikleri farklı bellek ve transistör teknolojilerinin daha fazla paralelliğe izin verdiği gibi görebiliriz. Programlama dilleri ve donanım yetenekleri arasında her zaman şaka yapar, bu yüzden göreceğiz!


9
Aslında, GPU'larda hala hiç yığın yok. GLSL / SPIR-V / OpenCL’e tekrar girmeniz yasaktır (HLSL’den emin değilsiniz ama muhtemelen neden farklı olacağına dair hiçbir neden göremiyorum). Aslında işlev yığınını "yığınlar" olarak ele almanın yolu saçma bir şekilde çok sayıda kayıt kullanmaktır.
LinearZoetrope

@Jsor: Bu, SPARC mimarisinden görülebileceği gibi, büyük ölçüde bir uygulama detayıdır. GPU'nuzda olduğu gibi, SPARC'nin de çok büyük bir kayıt defteri seti vardır, ancak, sarmalayıcı üzerinde çok eski kayıtları RAM'deki bir yığına aktaran kayar bir pencereye sahip olması benzersizdir. Yani bu iki model arasında gerçekten bir melez. Ve SPARC tam olarak ne kadar fiziksel kayıt olduğunu, kayıt penceresinin ne kadar büyük olduğunu belirtmedi, bu nedenle farklı uygulamalar her bir fonksiyon çağrısı için bir pencereye yetecek kadar "büyük miktarda kayıt" ila "ölçeğinde herhangi bir yerde olabilirdi. doğrudan yığınına dökmek "
MSalters

Çağrı yığını modelinin bir aşağı tarafı, dizinin ve / veya adres taşmasının çok dikkatli bir şekilde izlenmesi gerektiğidir, çünkü yığının keyfi bitleri çalıştırılabilir olduğunda, bir istismar olarak kendi kendini değiştiren programlar mümkündür.
BenPen

14

TL; DR

  • Bir fonksiyon çağırma mekanizması olarak çağrı yığını:
    1. Tipik olarak donanım tarafından simüle edilir, ancak donanım yapımında temel değildir
    2. Zorunlu programlama için temeldir
    3. İşlevsel programlama için temel değil
  • "Son giren ilk çıkar" (LIFO) soyutlaması olarak yığın, bilgisayar bilimleri, algoritmalar ve hatta bazı teknik olmayan alanlar için temeldir.
  • Çağrı yığınlarını kullanmayan bazı program organizasyonu örnekleri:
    • Devam eden stil (CPS)
    • Durum makinesi - her şey belirtildiği gibi dev bir döngü. (Saab Gripen donanım yazılımı mimarisinden ilham alması ve Henry Spencer tarafından bir iletişime atfedilmesi ve John Carmack tarafından çoğaltılması iddia edilmiştir.) (Not # 1)
    • Veri akışı mimarisi - sıralarla birbirine bağlanmış bir aktörler ağı (FIFO). Kuyruklara bazen kanal denir.

Bu cevabın geri kalanı, düşüncelerin ve anekdotların rastgele bir koleksiyonudur ve bu nedenle biraz dağınıktır.


Tanımladığınız yığın (işlev çağrısı mekanizması olarak) zorunlu programlamaya özgüdür.

Zorunlu programlama altında, makine kodunu bulacaksınız. Makine kodu, küçük bir talimat dizisi uygulayarak çağrı yığınını taklit edebilir.

Makine kodunun altında, yazılımı çalıştırmaktan sorumlu donanımı bulacaksınız. Modern mikroişlemci burada tarif edilemeyecek kadar karmaşık olsa da, yavaş ve aynı makine kodunu uygulayabilecek kadar basit bir tasarımın var olduğu düşünülebilir. Böyle basit bir tasarım dijital mantığın temel unsurlarından faydalanacaktır:

  1. Kombinasyonel mantık, yani mantık kapılarının bağlantısı (ve, veya, değil ...) "Birleşimsel mantığın" geri bildirimleri dışladığına dikkat edin.
  2. Bellek, yani parmak arası terlikler, mandallar, yazmaçlar, SRAM, DRAM, vb.
  3. Donanımın geri kalanını yöneten bir "denetleyici" uygulayabilmesi için bir miktar birleşik mantık ve biraz bellekten oluşan bir durum makinesi.

Aşağıdaki tartışmalar, zorunlu programları yapılandırmada birçok alternatif yöntem örneği içeriyordu.

Programın yapısı şöyle görünecektir:

void main(void)
{
    do
    {
        // validate inputs for task 1
        // execute task 1, inlined, 
        // must complete in a deterministically short amount of time
        // and limited to a statically allocated amount of memory
        // ...
        // validate inputs for task 2
        // execute task 2, inlined
        // ...
        // validate inputs for task N
        // execute task N, inlined
    }
    while (true);
    // if this line is reached, tell the programmers to prepare
    // themselves to appear before an accident investigation board.
    return 0; 
}

Bu stil, mikrodenetleyiciler için, yani yazılımı, donanımın işlevlerine eşlik eden kişiler için uygun olacaktır.



@Peteris: Yığınlar LIFO veri yapılarıdır.
Christopher Creutzig

1
İlginç. Bunu tam tersi düşünürdüm. Örneğin, FORTRAN zorunlu bir programlama dilidir ve eski sürümler bir çağrı yığını kullanmamıştır. Bununla birlikte, özyineleme işlevsel programlama için temeldir ve genel durumda yığın kullanmadan uygulanmasının mümkün olduğunu sanmıyorum.
TED

@TED ​​- İşlevsel bir dil uygulamasında, bekleyen hesaplamaları temsil eden bir yığın (veya tipik olarak bir ağaç) veri yapısı vardır, ancak makinenin yığın yönelimli adresleme modlarını veya hatta çağrı / iade komutlarını kullanarak talimatlarla yürütmeniz gerekmez. (iç içe / özyinelemeli bir şekilde - belki bir devlet makine döngüsünün bir parçası olarak).
davidbak

@davidbak - IIRC, özyinelemeli bir algoritma, yığından kurtulmak için kuyruk özyinelemeli olmalıdır. Muhtemelen onu optimize edebileceğiniz başka durumlar da vardır, ancak genel durumda, bir yığına sahip olmanız gerekir . Aslında, bunun bir yerlerde yüzdüğünün matematiksel bir kanıtı olduğu söylendi. Bu cevabın Kilise-Turing teoremi olduğunu iddia ediyor (Sanırım Turing makinelerinin bir yığın kullandığı gerçeğine dayanıyor mu?)
TED

1
@TED ​​- Sana katılıyorum. Buradaki yanlış anlaşılmanın, OP'nin, makine mimarisi anlamına gelen sistem mimarisi hakkında konuşmakta olan görevini okuduğuma inanıyorum . Bence burada cevap verenler de aynı anlayışa sahipler. Bu yüzden , bağlam olduğunu anlamış olanlarımız , makine talimatı / adresleme modu seviyesinde bir yığına ihtiyacınız olmadığına cevap vererek cevap verdiler. Ancak, sorunun yalnızca yorumlanabileceğini, sadece bir dil sisteminin genel olarak bir çağrı yığınına ihtiyaç duyduğu anlamına geldiğini de görebiliyorum . Bu cevap da hayır, ancak farklı nedenlerden dolayı.
davidbak

11

Hayır, mutlaka değil.

Appel'in eski makalesi olan Çöp Toplama Yığın Tahsisinden daha hızlı olabilir . Devamlı geçiş stilini kullanır ve yığınsız bir uygulama gösterir.

Ayrıca eski bilgisayar mimarilerinin (örn. IBM / 360 ) herhangi bir donanım yığını kaydına sahip olmadığına dikkat edin. Ama işletim sistemi ve derleyici yığın işaretçi için bir kayıt ayrılmış Kongre (ilgili kuralları çağıran bir yazılım var, öyle ki) çağrı yığını .

Prensip olarak, bütün bir program C derleyicisi ve optimize edici, çağrı grafiğinin statik olarak bilindiği ve herhangi bir özyineleme (veya fonksiyon işaretçisi olmadan) olduğu durumu (gömülü sistemler için biraz yaygın) tespit edebilir. Böyle bir sistemde, her bir işlev, dönüş adresini sabit bir statik konumda tutabilir (ve Fortran77'nin 1970 çağındaki bilgisayarlarda bu şekilde çalışmasıydı).

Bu günlerde, işlemciler aynı zamanda CPU önbelleklerinden haberdar olan çağrı yığınlarına (ve çağrı ve iade makinesi talimatlarını) sahiptir .


1
FORTRAN-66 çıktı ve destek gerektiğinde Oldukça emin FORTRAN statik dönüş yerleri kullanarak durdurdu SUBROUTINEve FUNCTION. Yine de önceki sürümler için haklısın (FORTRAN-IV ve muhtemelen WATFIV).
TMN

Ve tabii ki COBOL. Ve IBM / 360 hakkında mükemmel nokta - donanım yığını adresleme modları eksik olsa bile oldukça fazla kullanım aldı. (R14, öyle olduğuna inanıyorum?) Ve yığın tabanlı diller için derleyiciler vardı, örneğin, PL / I, Ada, Algol, C.
davidbak

Gerçekten de, üniversitede 360 ​​okudum ve ilk başta şaşırtıcıydı.
JDługosz

1
@ JDługosz 360 düşünmeye bilgisayar mimarisinin çağdaş öğrenciler için en iyi yolu birden fazla talimat formatında ... ve benzeri birkaç anomalilerle de olsa ... çok basit bir RISC makine gibidir TRve TRT.
davidbak

Bir kaydı taşımak için "sıfır ve paketlenmiş" ifadesine ne dersiniz? Ancak dönüş adresi için yığın yerine "şube ve link" geri dönüş yaptı.
JDługosz

10

Şimdiye kadar iyi cevapların var; Size, yığınlar veya “kontrol akışı” nosyonu olmadan bir dili nasıl tasarlayabileceğinize dair pratik olmayan ancak eğitici bir örnek vereyim. İşte faktörleri belirleyen bir program:

function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = f(3)

Bu programı bir dizgeye koyduk ve programı metin değişikliği ile değerlendiriyoruz. Bu yüzden, değerlendirirken f(3), bir arama yaparız ve i için 3 ile değiştiririz:

function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = if 3 == 0 then 1 else 3 * f(3 - 1)

Harika. Şimdi bir başka metin değiştirme işlemi gerçekleştiriyoruz: "if" nin koşulunun yanlış olduğunu ve programı üreten başka bir dize yaptığını görüyoruz:

function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = 3 * f(3 - 1)

Şimdi, sabitleri içeren tüm alt ifadelerde başka bir dize değiştirelim:

function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = 3 * f(2)

Ve bunun nasıl gittiğini görüyorsunuz; Daha fazla emek vermeyeceğim. Aşağı inene let x = 6ve bitinceye kadar bir dizi ip yerine geçmeye devam edebiliriz .

Yığını geleneksel olarak yerel değişkenler ve devam bilgisi için kullanırız; unutmayın, bir yığın size nereden geldiğinizi söylemez, o da elinizde bu dönüş değerinin yanında nereye gideceğinizi gösterir.

Dizge programlama modelinde, yığında "yerel değişkenler" yoktur; biçimsel parametreler, işlev yığındaki bir arama tablosuna yerleştirilmek yerine, bağımsız değişkenine uygulandığında değerleri ile değiştirilir. Ve “sonraki bir yere gitme” yoktur, çünkü program değerlendirme, farklı ancak eşdeğer bir program üretmek için string yerine basit kurallar uygulamaktadır.

Şimdi, elbette, aslında sicim yerine geçmek muhtemelen gitmenin yolu değil. Ancak “eşitlikçi akıl yürütmeyi” (Haskell gibi) destekleyen programlama dilleri mantıklı bir şekilde bu tekniği kullanıyor.


3
Retina , hesaplama için string işlemleri kullanan Regex tabanlı bir programlama dilinin bir örneğidir.
Andrew Piliser,

2
@AndrewPiliser Bu havalı adam tarafından tasarlandı ve uygulandı .
kedi,

3

1972'de Parnas tarafından sistemlerin modüllere ayrıştırılmasında kullanılacak kriterler üzerine yayınlanması , yazılımda saklanan bilgilerin iyi bir şey olduğu kabul edildi. Bu, 60'lı yıllarda yapısal ayrışma ve modüler programlama konusundaki uzun tartışmaları takip ediyor.

Modülarite

Herhangi bir çok parçacıklı sistemde farklı gruplar tarafından uygulanan modüller arasındaki kara kutu ilişkilerinin gerekli bir sonucu, tekrar girmeye izin verecek bir mekanizma ve sistemin dinamik çağrı grafiğini izlemenin bir yolunu gerektirir. Kontrollü yürütme akışı, birden fazla modülün içine ve dışına geçmelidir.

Dinamik kapsam belirleme

Dinamik davranışı izlemek için sözcüksel kapsam belirleme yetersiz kaldığında, farkı izlemek için bazı çalışma zamanı defter tutma işlemi gerekir.

Herhangi bir iş parçacığı (tanımı gereği) yalnızca tek bir geçerli komut göstergesine sahip olduğu için, her başlatmayı izlemek için bir LIFO yığını uygundur.

İstisnalar

Bu yüzden, devam modeli yığın için açıkça bir veri yapısını korumazken, bir yerlerde tutulması gereken hala iç içe geçmiş modüller çağrısı var!

Beyannameli diller bile değerlendirme geçmişini korur ya da performans nedenleriyle yürütme planını tersine çevirir ve ilerlemeyi bir şekilde sürdürür.

Rwong tarafından tanımlanan sonsuz döngü yapısı , birçok genel programlama yapısına izin vermeyen statik zamanlamaya sahip yüksek güvenilirlikli uygulamalarda yaygındır, ancak tüm uygulamanın, önemli bir bilgi gizlemesi olmayan beyaz bir kutu olarak görülmesini gerektirir.

Birden fazla eşzamanlı sonsuz döngü, işlev çağırmadığı için geri dönüş adreslerini tutmak için herhangi bir yapı gerektirmez, bu da soruyu tartışılır hale getirir. Paylaşılan değişkenleri kullanarak iletişim kurarlarsa, bunlar kolayca eski Fortran tarzı dönüş adresi analoglarına dönüşebilir.


1
Herhangi bir çok parçalı sistem varsayarak kendinizi bir köşede boya . Birleştirilmiş sonlu durumlu makineler, uygulamalarında birden fazla ipliğe sahip olabilir, ancak bir LIFO yığını gerektirmez. FSM'lerde, LIFO siparişinde tek başına önceki durumuna geri dönmeniz konusunda herhangi bir sınırlama yoktur. Yani bu, tutmadığı gerçek bir çok parçacıklı sistem. Kendinizi çoklu iş parçacıklı bir tanımla "paralel bağımsız işlev çağrısı yığınları" olarak sınırlarsanız, döngüsel bir tanım elde edersiniz.
MSalters

Soruyu bu şekilde okumam. OP, işlev çağrıları hakkında bilgi sahibidir, ancak diğer sistemler hakkında soru sorar .
MSalters

@ MSalters Eşzamanlı sonsuz döngüler içerecek şekilde güncellendi. Model geçerlidir, ancak ölçeklenebilirliği sınırlar. Ilımlı durumdaki makinelerin bile kodun yeniden kullanılmasına izin vermek için işlev çağrıları eklemesini öneririm.
Pekka

2

Eski anabilgisayarların (IBM System / 360) hiç bir yığın fikri yok. 260'ta, örneğin, parametreler bellekte sabit bir yerde inşa edildi ve bir alt rutin çağrıldığında, R1parametre bloğuna işaret edilerek ve R14dönüş adresini içeren çağrıldı . Çağrılan rutin, başka bir alt rutini çağırmak istiyorsa, R14bu çağrıyı yapmadan önce bilinen bir konumda saklanması gerekir .

Bu, bir yığından çok daha güvenilirdir, çünkü her şey derleme zamanında oluşturulan sabit bellek konumlarında saklanabilir ve işlemlerin hiçbir zaman yığında bitmemesi% 100 garanti edilebilir. Bugünlerde yapmak zorunda olduğumuz "1MB tahsis et ve parmaklarınızı çarpı" diye bir şey yok.

Tekrarlayan alt rutin çağrılara, anahtar kelime belirtilerek PL / I de izin verildi RECURSIVE. Alt yordam tarafından kullanılan belleğin, statik olarak tahsis edilmek yerine, dinamik olarak kullanılması anlamına geliyordu. Ancak özyinelemeli çağrılar şimdi olduğu kadar nadirdi.

Yığınsız çalıştırma aynı zamanda çok parçacıklı işlemi çok daha kolay hale getirir, bu nedenle modern dilleri sık sık yapma girişimleri yapılır. Hiç bir neden yoktur, örneğin, bir C ++ derleyicisinin yığınlardan ziyade dinamik olarak ayrılmış belleği kullanmak için değiştirilemedi.

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.