ไม่สามารถใช้ความหมายของการเรียกใช้ฟังก์ชันได้โดยไม่ต้องใช้ stack บางประเภท เป็นไปได้ที่จะเล่นเกมคำศัพท์ (เช่นใช้ชื่ออื่นเช่น "FILO return buffer")
เป็นไปได้ที่จะใช้บางสิ่งที่ไม่ใช้ความหมายของการเรียกใช้ฟังก์ชัน (เช่นรูปแบบการส่งต่อความต่อเนื่องของตัวแสดง) จากนั้นสร้างความหมายของการเรียกใช้ฟังก์ชันที่ด้านบนของมัน แต่นี่หมายถึงการเพิ่มโครงสร้างข้อมูลบางอย่างเพื่อติดตามการควบคุมที่ส่งผ่านเมื่อฟังก์ชันส่งคืนและโครงสร้างข้อมูลนั้นจะเป็นประเภทของสแต็ก (หรือสแต็กที่มีชื่อ / คำอธิบายต่างกัน)
ลองนึกภาพคุณมีฟังก์ชั่นมากมายที่ทุกคนสามารถโทรหากันได้ ณ รันไทม์แต่ละฟังก์ชันต้องทราบตำแหน่งที่จะกลับไปเมื่อออกจากฟังก์ชัน หากมีการfirst
โทรsecond
คุณจะได้:
second returns to somewhere in first
จากนั้นถ้ามีการsecond
โทรthird
คุณ:
third returns to somewhere in second
second returns to somewhere in first
จากนั้นถ้ามีการthird
โทรfourth
คุณ:
fourth returns to somewhere in third
third returns to somewhere in second
second returns to somewhere in first
เนื่องจากแต่ละฟังก์ชั่นถูกเรียกใช้จะต้องเก็บข้อมูล "ที่จะส่งคืน" ให้มากขึ้น
หากฟังก์ชันส่งคืนข้อมูลจะใช้ "ตำแหน่งที่จะส่งคืน" และไม่จำเป็นต้องใช้อีกต่อไป ตัวอย่างเช่นหากfourth
กลับไปที่ใดที่หนึ่งthird
จำนวนข้อมูล "ที่จะกลับไปที่" จะกลายเป็น:
third returns to somewhere in second
second returns to somewhere in first
โดยทั่วไป; "อรรถศาสตร์การเรียกใช้ฟังก์ชัน" หมายความว่า:
- คุณต้องมีข้อมูล "ที่จะส่งคืน"
- ปริมาณข้อมูลที่เพิ่มขึ้นเมื่อฟังก์ชันถูกเรียกใช้และลดลงเมื่อฟังก์ชันส่งคืน
- ข้อมูล "ที่จะส่งคืน" ชิ้นแรกที่เก็บไว้จะเป็นข้อมูลชิ้นสุดท้ายของ "ตำแหน่งที่จะส่งคืน" ข้อมูลที่ถูกทิ้ง
สิ่งนี้อธิบายถึงบัฟเฟอร์ FILO / LIFO หรือสแต็ก
หากคุณพยายามที่จะใช้ประเภทของต้นไม้ทุก ๆ โหนดในต้นไม้จะไม่มีลูกมากกว่าหนึ่งคน หมายเหตุ: โหนดที่มีหลายลูกสามารถเกิดขึ้นได้หากฟังก์ชันเรียกใช้ฟังก์ชัน 2 ฟังก์ชันขึ้นไปในเวลาเดียวกันซึ่งต้องการการทำงานพร้อมกัน (เช่นเธรด, ทางแยก (), ฯลฯ ) และจะไม่เป็น "ความหมายของการเรียกใช้ฟังก์ชัน" หากทุกโหนดในต้นไม้จะไม่มีลูกมากกว่าหนึ่งคน ดังนั้น "tree" จะถูกใช้เป็นบัฟเฟอร์ FILO / LIFO หรือสแต็กเท่านั้น และเนื่องจากมันถูกใช้เป็นบัฟเฟอร์ FILO / LIFO หรือสแต็กเท่านั้นจึงมีความยุติธรรมที่จะอ้างว่า "ต้นไม้" เป็นสแต็ก (และความแตกต่างเพียงอย่างเดียวคือเกมคำศัพท์และ / หรือรายละเอียดการนำไปใช้)
เช่นเดียวกับโครงสร้างข้อมูลอื่นใดที่สามารถใช้เพื่อนำไปใช้ "ความหมายการเรียกใช้ฟังก์ชัน" - มันจะถูกใช้เป็นสแต็ก (และความแตกต่างเพียงอย่างเดียวคือเกมคำศัพท์และ / หรือรายละเอียดการนำไปใช้); นอกเสียจากว่ามันจะทำลาย "ความหมายฟังก์ชั่นการโทร" หมายเหตุ: ฉันจะให้ตัวอย่างสำหรับโครงสร้างข้อมูลอื่น ๆ ถ้าทำได้ แต่ฉันไม่สามารถนึกถึงโครงสร้างอื่นใดที่น่าเชื่อถือเล็กน้อย
แน่นอนว่าการใช้งานสแต็กเป็นรายละเอียดการนำไปปฏิบัติ อาจเป็นพื้นที่ของหน่วยความจำ (ที่คุณติดตาม "สแต็กท็อปปัจจุบัน") อาจเป็นรายการเชื่อมโยงบางประเภท (ที่คุณติดตาม "รายการปัจจุบันในรายการ") หรืออาจนำไปใช้ในบางรายการ วิธีอื่น มันไม่สำคัญว่าฮาร์ดแวร์มีการสนับสนุนในตัวหรือไม่
หมายเหตุ: หากมีเพียงการร้องขอเพียงหนึ่งกระบวนการเท่านั้นที่สามารถใช้งานได้ทุกเวลา จากนั้นคุณสามารถจัดสรรพื้นที่สำหรับข้อมูล "ที่จะกลับไปที่" แบบคงที่ นี่ยังคงเป็นสแต็ก (เช่นรายการที่เชื่อมโยงของรายการที่ได้รับการจัดสรรแบบคงที่ที่ใช้ในวิธี FILO / LIFO)
นอกจากนี้โปรดทราบว่ามีบางสิ่งที่ไม่ปฏิบัติตาม "ความหมายการเรียกใช้ฟังก์ชัน" สิ่งเหล่านี้รวมถึง "ความหมายที่แตกต่างกันอย่างมาก" (เช่นการส่งผ่านต่อเนื่องโมเดลของนักแสดง) และยังรวมถึงส่วนขยายทั่วไปของ "semantics call function" เช่นการทำงานพร้อมกัน (เธรด, เส้นใย, อะไรก็ตาม), setjmp
/ longjmp
, การจัดการข้อยกเว้น ฯลฯ