Çağrı yığını olarak kullanıldığında, çöp içermeyen spagetti yığınları bir DAG oluşturur mu?


9

Programlama dilleri için uygulama tekniklerini araştırıyorum ve son zamanlarda, sözde bir devam geçen stil modeli (örneğin Scheme ve SML / NJ'de kullanımları göz önüne alındığında) için uygun olan spagetti yığınlarına rastladım . Basitçe söylemek gerekirse, bu soru için sadece tek iş parçacıklı süreçleri ele alalım.

Ancak, Wikipedia'daki diyagramda ( başka yerlerde de bulunur ) biraz kafam karıştı . Özellikle, böyle bir durumun nasıl ortaya çıkabileceğini anlamıyorum. Sadece gri renkli dalların erişilemez olduğunu ve çöp toplanması gerektiğini hayal edebiliyorum. Öte yandan, spagetti yığınları kullanarak CPS'nin nasıl uygulanacağı konusundaki belirsiz anlayışımla, bu yapıda nasıl bir döngü elde edebileceğinizi hayal edemiyorum. Sonuç olarak, bir "ebeveyn-işaretçi ağacı" yerine, aslında konuların olduğu kadar çok çöp olmayan kaynak ve (potansiyel) "çıkış noktaları" olduğu kadar çok sayıda lavabo ile yönlendirilmiş bir asiklik grafik olduğu sonucuna varmak zorundayım.

Ama bu uygulama hakkındaki anlayışım oldukça belirsiz, bu yüzden sanırım muhtemelen bir şey eksik. Umarım birisi beni burada "spagetti çağrı yığınları" üzerine aydınlatabilir, bu sayede CPS tabanlı süreçleri uygulamak için Şema ve / veya SML / NJ'de kullanılan veri yapısı anlamına gelir.

  1. Aşağıdaki spagetti çağrı yığını göz önüne alındığında:

    [exit point] <-- ... <-- [frame A] <-- [frame B (active)]
                                    ^
                                     `---- [frame C]
    

    Anladığım kadarıyla, B'den gelen herhangi bir akış kontrolü ya bir ebeveyne atlayarak yığını açar (A aktif hale gelir, ulaşılamaz B artık çöptür) veya aktif çerçeveyi sadece B tarafından referanslar veya referanslar kullanılarak bağlanmış bir alt çizgi ile değiştirir yeni karelere. Yürütme C karesine akamaz, bu da C karesinin çöp olduğu anlamına gelmelidir .

  2. Önceki durumdan ziyade, aşağıdaki çöpsüz durumun ortaya çıkabileceğini düşünürdüm:

    [exit point] <-- ... <-- [frame W] <-- [frame X] <-- [frame Z (active)]
                                    ^                     |
                                     `---- [frame Y] <---´
    

    Örneğin, Z çerçevesinin X veya X çerçevesiyle devam eden (her ikisi de W'ye dönecek) bir karar fonksiyonuna ait olduğunu hayal edebiliyorum. Bu, spagetti çağrı yığınlarının "ana işaretçi ağaçları " olmadığı anlamına gelir .

  3. Ancak, bir döngü inşa edilebilecek bir durum düşünemiyorum. Örneğin, aşağıdaki durumu ele alalım:

    [exit point] <-- ... <-- [frame P] --> [frame Q (active)]
                                    ^             |
                                    |             v
                                     `---- [frame R]
    

    Özyinelemeli bağların bir şey olduğunu biliyorum, ama bunun mantıklı olduğundan şüpheliyim. Q, R'ye dönecek olsaydı, Q çerçevesi "harcanır". R, P'ye dönecek olsaydı ve P, önce yeniden başlatılması gerektiğinden, Q'ya geri dönemez. Bu nedenle, döngüler tutarsız durumlara neden olur. (Tabii ki, bu veri yapısının amacını yanlış anlamadım ve içindeki düğümleri sadece mevcut çerçeveniz için bir şablon olarak kullanırsınız.)

Bu gözlemlerden, bir spagetti çağrı yığınının (çöpsüz) aslında bir DAG olduğu sonucuna varmalıyım. Bu doğru mu? Yoksa bu veri yapısının amacını yanlış mı anlıyorum?


Güncellemeler:

  • Aşağıdaki makalenin bir kopyasını gözden geçirdim :

    Hauck ve BA Dent Karşılaştırması. 1968. Burroughs'un B6500 / B7500 yığın mekanizması. In 30 Nisan Tutanakları - 2 Mayıs 1968, bahar eklem bilgisayar konferansı (AFIPS '68 (Bahar)). ACM, New York, NY, ABD, 245-251. DOI = http://dx.doi.org/10.1145/1468075.1468111

    Bu makale Suguaro Yığın Sistemini tanımlamaktadır. Anlaşıldığı üzere, bu Suguaro Yığın Sistemi, birden fazla "işin" kısmen paylaşılan bir yığının çerçevelerinde yürümesini sağlayan geleneksel bir çağrı yığınıdır; kesinlikle devamlarla ilgili değil.

  • Aşağıdaki makale (ve 1996 tamamlayıcı makalesi) görünüşe göre SML / NJ derleyicisinde neler olduğunu açıklamaktadır:

    Shao ve Andrew W. Appel Karşılaştırması. 2000. Verimli ve alan için güvenli kapatma dönüşümü. ACM Trans. Programı. Lang. Sist. 22, 1 (Ocak 2000), 129-161. DOI = http://dx.doi.org/10.1145/345099.345125

    Sanırım bu soruyla ilgili başka bir şey yapmadan önce bu yazıyı okumalıyım ( yazarın web sitesinde kopyala ). "Güvenle Bağlantılı Kapaklar" konsepti Suguaro Yığın Sistemine çok benzer, çünkü her zaman çok sığdır ve sadece serbest değişkenleri paylaşmayı amaçlamaktadır:

    Yeni kapatma dönüşüm algoritmamız, yalnızca işlevde gerçekten gerekli olan değişkenleri içeren ancak aynı yaşam süresine sahip değişkenleri paylaşılabilir bir kayıtta gruplayarak kapatma kopyalamasından kaçınan güvenli bir şekilde bağlı kapanışları (Şekil 1'deki 3. sütun) kullanır . [...] Bağlantılı kapaklardan farklı olarak, güvenli bir şekilde bağlı kapakların iç içe geçme seviyesi asla ikiden fazla değildir (kapağın kendisi için bir katman; farklı yaşam sürelerinin kayıtları için başka bir katman), bu yüzden hala çok hızlı değişken erişim süresinin tadını çıkarırlar.

    Makale ayrıca "herhangi bir çalışma zamanı yığını" kullanmadığını açıkça belirtmektedir:

    Bunun yerine, tüm etkinleştirme kayıtlarına devam işlevleri için kapaklar olarak davranır ve bunları yığıntaki kayıtlara ayırırız.

    Ben spagetti yığınları akış kontrolü için kullanılmadığı için Wikipedia makalesini yanlış anladığımı ve / veya yanlış okuduğumu düşünüyorum. Bununla birlikte, Appel ve Shao tarafından makalelerin dikkatle okunmasından sonra, soruyu belki de "spagetti çağrı yığını" (görünüşte bir şey değil) yerine kapanışların bağımlılık grafiğine göre yeniden ifade edebilirim.


Kendiniz için düşünme ve okuduklarınızdaki iddiaları sorgulamada iyi iş çıkardınız. Umarım iyi bir cevap alırsınız, ama umarım onsuz iyi yaparsınız. :) (Ve gelecekte yapabiliyorsanız kendi sorunuzu cevaplamayı da unutmayın!)
Wildcard

Yanıtlar:


2

Spagetti Yığınları Ebeveyn-İşaretçi Ağaçları mı?

Evet, spagetti yığınları ebeveyn-işaretçi ağaçlarıdır. Bir spagetti yığınını, yapıyı paylaşan tek bağlantılı listelerden oluşan bir koleksiyonla aynı yapıya sahip olarak düşünebilirsiniz. Bir bütün olarak bakıldığında, liste koleksiyonu bir ağaç oluşturur. Ancak tek tek görüntülendiğinde, her liste bir yığın oluşturur.

Sistemdeki her işlem, kontrol yığınını temsil eden bu listelerden birine sahip olacaktır. Listenin başı yığının üst kısmıdır (yani etkin çerçeve). Bu nextişaretçi üst çerçeve başvurur.

Diyagramda gördüğünüz, çoklu işlemlerin yapısıdır. "Etkin" işlem için yığın vurgulanır. Ağacın etkin yığının bir parçası olmayan kısımları grileşir. Bunlar diğer işlemler için yığınları temsil eder.

Spagetti Yığınları DAG Oluşturur mu?

Spagetti yığınları ebeveyn-işaretçi ağaçları olduğundan, aslında DAG'lardır. Ancak sadece ağaç olan DAG'lar Spagetti yığınları olabilir. Yani hayır, Spagetti yığınları ağaç olmayan DAG'lar oluşturmaz.

Bir karar işlevi örneği, bir kontrol yığınının yapısını yığında depolanan verilerle sınırlar . Elbette, verileri düşünmeye başlarsak herhangi bir yapı oluşturulabilir. Ancak bir veri yapısı olarak, bir spagetti yığınındaki her düğümün tam olarak bir ebeveyni olacaktır.

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.