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.
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 .
Ö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 .
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.