ฉันกำลังมองหาเทคนิคการใช้งานสำหรับภาษาการเขียนโปรแกรมและเมื่อเร็ว ๆ นี้ได้พบกับสปาเก็ตตี้สแต็คซึ่งน่าจะเหมาะสำหรับรูปแบบการส่งต่อที่ต่อเนื่อง (ให้ใช้ใน Scheme และ SML / NJ ) เพื่อให้ง่ายขึ้นลองพิจารณากระบวนการแบบเธรดเดี่ยวสำหรับคำถามนี้เท่านั้น
อย่างไรก็ตามฉันรู้สึกสับสนเล็กน้อยกับ แผนภาพบน Wikipedia (และที่อื่น ๆ ) โดยเฉพาะฉันไม่เข้าใจว่าสถานการณ์ดังกล่าวสามารถเกิดขึ้นได้อย่างไร ฉันสามารถจินตนาการได้ว่ากิ่งที่เป็นสีเทานั้นไม่สามารถเข้าถึงได้และควรเก็บขยะ ในอีกทางหนึ่งด้วยความเข้าใจที่คลุมเครือของฉันเกี่ยวกับวิธีการใช้ CPS โดยใช้กองสปาเก็ตตี้ฉันไม่สามารถจินตนาการได้ว่าคุณจะได้รับการวนซ้ำในโครงสร้างนั้นได้อย่างไร ฉันต้องสรุปว่าแทนที่จะเป็น "แผนผังต้นกำเนิดของพ่อแม่" มันเป็นกราฟวงจรที่กำกับโดยมีแหล่งที่ไม่ใช่ขยะมากมายเช่นเดียวกับที่มีเธรดและมีจำนวนมากเท่าที่จะมี "จุดออก"
แต่ความเข้าใจของฉันเกี่ยวกับการใช้งานนี้ค่อนข้างคลุมเครือดังนั้นฉันคิดว่าฉันอาจจะพลาดอะไรบางอย่างไป ฉันหวังว่าใครบางคนสามารถสอนฉันที่นี่ใน "spaghetti call stacks" ซึ่งฉันหมายถึงโครงสร้างข้อมูลที่ใช้ใน Scheme และ / หรือ SML / NJ เพื่อนำกระบวนการ CPS ไปใช้
รับสายสปาเก็ตตี้ดังต่อไปนี้:
[exit point] <-- ... <-- [frame A] <-- [frame B (active)] ^ `---- [frame C]
เท่าที่ฉันเข้าใจการควบคุมการไหลใด ๆ จาก B จะคลายสแต็กโดยการกระโดดไปที่ผู้ปกครอง (A กลายเป็นใช้งานไม่สามารถเข้าถึง B ได้ในขณะนี้ขยะ) หรือแทนที่เฟรมที่ใช้งานอยู่โดย subgraph เชื่อมต่อโดยใช้การอ้างอิงเท่านั้น ไปที่เฟรมใหม่ การดำเนินการไม่สามารถไหลไปที่เฟรม C ซึ่งต้องหมายความว่าเฟรม C เป็นขยะ
แทนที่จะเป็นสถานการณ์ก่อนหน้านี้ฉันคิดว่าสถานการณ์ไร้ขยะต่อไปนี้อาจเกิดขึ้น:
[exit point] <-- ... <-- [frame W] <-- [frame X] <-- [frame Z (active)] ^ | `---- [frame Y] <---´
ตัวอย่างเช่นฉันสามารถจินตนาการว่าเฟรม Z เป็นฟังก์ชันการตัดสินใจบางอย่างซึ่งดำเนินการต่อด้วยเฟรม X หรือเฟรม Y (ซึ่งจะกลับไปเป็น W) ซึ่งหมายความว่าการโทรแบบสปาเก็ตตี้ไม่ได้เป็น " ต้นไม้พอยน์เตอร์หลัก "
อย่างไรก็ตามฉันไม่สามารถจินตนาการถึงสถานการณ์ใด ๆ ที่สามารถสร้างลูปได้ ใช้สถานการณ์ต่อไปนี้ตัวอย่างเช่น:
[exit point] <-- ... <-- [frame P] --> [frame Q (active)] ^ | | v `---- [frame R]
ฉันรู้ว่าการผูกแบบเรียกซ้ำเป็นสิ่ง แต่ฉันสงสัยอย่างมากว่าสิ่งนี้เหมาะสม ถ้า Q ต้องกลับไปที่ R เฟรม Q คือ "ใช้แล้ว" ถ้า R ต้องกลับไปที่ P และ P ไม่สามารถกลับไปที่ Q ได้อย่างง่ายดายเนื่องจากจะต้องเริ่มต้นใหม่ก่อน ด้วยเหตุนี้ลูปจะทำให้เกิดสถานะไม่สอดคล้องกัน (แน่นอนว่าฉันเข้าใจผิดวัตถุประสงค์ของโครงสร้างข้อมูลนี้และคุณจะใช้โหนดในเทมเพลตสำหรับเฟรมปัจจุบันของคุณเท่านั้น)
จากการสังเกตเหล่านี้ฉันต้องสรุปว่าสายสปาเก็ตตี้ (ไม่มีขยะ) เป็น DAG ถูกต้องหรือไม่ หรือฉันเข้าใจผิดวัตถุประสงค์ของโครงสร้างข้อมูลนี้
ปรับปรุง:
ฉันอ่านสำเนาของเอกสารต่อไปนี้ผ่านทาง:
EA Hauck และ BA Dent พ.ศ. 2511 กลไกสแต็ค B6500 / B7500 ของ Burroughs ในการดำเนินการของวันที่ 30 เมษายน - 2 พฤษภาคม 1968 การประชุมคอมพิวเตอร์ร่วมฤดูใบไม้ผลิ (AFIPS '68 (ฤดูใบไม้ผลิ)) พลอากาศเอกนิวยอร์กนิวยอร์กสหรัฐอเมริกา 245-251 DOI = http://dx.doi.org/10.1145/1468075.1468111
บทความนี้ดูเหมือนจะกำหนดระบบ Suguaro Stack เมื่อปรากฎว่าระบบ Suguaro Stack นี้เป็น call stack แบบดั้งเดิมที่อนุญาตให้ "งาน" หลายรายการสามารถเดินผ่านเฟรมของสแต็กที่แบ่งใช้บางส่วนได้ มันไม่เกี่ยวข้องกับการต่อเนื่องอย่างแน่นอน
บทความต่อไปนี้ (และเอกสารฉบับเต็ม 1996) อธิบายว่าเกิดอะไรขึ้นในคอมไพเลอร์ SML / NJ:
Zhong Shao และ Andrew W. Appel 2000. การแปลงปิดอย่างมีประสิทธิภาพและปลอดภัยสำหรับพื้นที่ ACM Trans โปรแกรม. หรั่ง Syst 22, 1 (มกราคม 2000), 129-161 DOI = http://dx.doi.org/10.1145/345099.345125
ฉันคิดว่าฉันควรอ่านบทความนี้ ( คัดลอกบนเว็บไซต์ของผู้เขียน ) ก่อนที่จะทำสิ่งใดกับคำถามนี้ แนวคิด "Safely Linked Closures" นั้นคล้ายกับระบบ Suguaro Stack มากซึ่งมันตื้นมากและมีจุดประสงค์เพื่อแบ่งปันตัวแปรอิสระเท่านั้น:
ใหม่ปิดการแปลงใช้อัลกอริทึมของเราเชื่อมโยงได้อย่างปลอดภัยปิด (คอลัมน์ที่ 3 ในรูปที่ 1) ที่มีตัวแปรเฉพาะที่จำเป็นจริงในการทำงาน แต่ปิดหลีกเลี่ยงการคัดลอกโดยการจัดกลุ่มตัวแปรด้วยเหมือนกันอายุการใช้งานเป็นบันทึกร่วมกันได้ [... ] ซึ่งแตกต่างจากการปิดที่เชื่อมโยงระดับการซ้อนของการเชื่อมโยงอย่างปลอดภัยไม่เกินสอง (ชั้นหนึ่งสำหรับการปิดตัวเองอีกชั้นหนึ่งสำหรับการบันทึกเวลาชีวิตที่แตกต่างกัน) ดังนั้นพวกเขาจึงยังสนุกกับเวลาเข้าถึงตัวแปรที่รวดเร็วมาก
บทความนี้ยังกล่าวอย่างชัดเจนว่ามันไม่ได้ใช้ "runtime stack ใด ๆ ":
แต่เราจะปฏิบัติกับเร็กคอร์ดการเปิดใช้งานทั้งหมดเพื่อปิดฟังก์ชั่นความต่อเนื่องและจัดสรรให้ในการลงทะเบียนในฮีป
ฉันคิดว่าฉันเข้าใจผิดและ / หรืออ่านบทความ Wikipedia ผิดเนื่องจากสแต็กสปาเก็ตตี้ไม่ได้ใช้สำหรับการควบคุมการไหล อย่างไรก็ตามหลังจากการอ่านเอกสารอย่างพิถีพิถันโดย Appel และ Shao ฉันอาจจะถามคำถามซ้ำอีกครั้งโดยอ้างอิงจากกราฟการปิดของการอ้างอิงมากกว่า "สปาเก็ตตี้คอล" (ซึ่งเห็นได้ชัดว่าไม่ใช่เรื่อง)