จำเป็นต้องมีการเก็บรวบรวมขยะ (GC) ในภาษาที่ใช้สแต็กคืออะไร? ในภาษาอย่างForthหรือRPL (บนเครื่องคิดเลขของ HP ) จำเป็นต้องมีการรวบรวมขยะหรือไม่?
ฉันคิดว่าเนื่องจากเอาต์พุตถูกสแต็กออกจากสแต็กดังนั้นจึงไม่มีความจำเป็นใด ๆ ฉันพลาดอะไรไปรึเปล่า?
จำเป็นต้องมีการเก็บรวบรวมขยะ (GC) ในภาษาที่ใช้สแต็กคืออะไร? ในภาษาอย่างForthหรือRPL (บนเครื่องคิดเลขของ HP ) จำเป็นต้องมีการรวบรวมขยะหรือไม่?
ฉันคิดว่าเนื่องจากเอาต์พุตถูกสแต็กออกจากสแต็กดังนั้นจึงไม่มีความจำเป็นใด ๆ ฉันพลาดอะไรไปรึเปล่า?
คำตอบ:
โดยปกติ GC จะใช้กับหน่วยความจำที่จัดสรรในฮีป ฉันไม่คุ้นเคยกับ Forth หรือ RPL แต่ถ้าไม่มีกองและทุกอย่างถูกเก็บไว้ในกองซ้อนทั่วโลกแทนไม่มีอะไรที่ GC จะทำ
ใช่คุณพูดถูก. แต่ความเป็นกองซ้อนเป็นเพียงส่วนหนึ่งของเรื่องราวทั้งหมด ตัวอย่างเช่นล่าม Java bytecode เป็นแบบกองซ้อนเช่นกัน (โค้ดที่คอมไพล์ทำงานได้ - ด้วยเหตุผลด้านประสิทธิภาพ - แตกต่างกัน) สิ่งนี้บอกเราว่าภาษาใดสามารถเปลี่ยนเป็นภาษาสแต็กได้
สิ่งที่สำคัญคือวัตถุที่อยู่ด้านนอกของสแต็กผู้ที่สามารถอยู่ได้นานกว่าการดำเนินการวิธีปัจจุบัน ตราบใดที่ภาษาไม่เหมือนmalloc
หรือnew
ไม่มีวัตถุดังกล่าวและคุณไม่จำเป็นต้องมีdelete
หรือ GC
ภาษาที่ขาดการจัดสรรหน่วยความจำแบบไดนามิกค่อนข้างมีข้อ จำกัด ในด้านประโยชน์
จำเป็นต้องมีการรวบรวมขยะหากภาษากำลังสนับสนุนโครงสร้างข้อมูลแบบไดนามิกโดยเนื้อแท้ ซึ่งเกือบจะเป็นสิ่งจำเป็นหากคุณต้องการทำอะไรเกินกว่าระดับ C หากปราศจากคุณติดอยู่กับโครงสร้างข้อมูลขนาดคงที่และการจัดการหน่วยความจำด้วยตัวเอง นั่นเป็นสิ่งที่ Forth ดั้งเดิมทำได้แน่นอน แต่อาจไม่ใช่สิ่งที่คุณต้องการทำในวันนี้เว้นแต่ว่าคุณจะทำการเข้ารหัสระบบระดับต่ำเท่านั้น
การรวบรวมขยะไม่จำเป็นถ้าภาษาใช้การจัดสรรแบบสแตติกแทนการจัดสรรแบบสแต็ก ตัวอย่างเช่น Fortran 77 ที่มีตัวเลือก-s (หน่วยเก็บข้อมูลแบบคงที่)จะจัดสรรหน่วยความจำทั้งหมดเมื่อโปรแกรมเริ่มต้นดังนั้นจึงไม่มีการจัดสรรหน่วยความจำเกิดขึ้นในขณะใช้งานจริงเพื่อให้มีอิสระ ในขณะที่ต้องใช้วินัยบางอย่างมันเป็นไปได้ที่จะเขียนโปรแกรม การจัดสรรแบบคงที่จะลบการรั่วไหลของหน่วยความจำใด ๆ และนำไปสู่ประสิทธิภาพแคชที่ยอดเยี่ยมเนื่องจากคอมไพเลอร์สามารถใช้การวิเคราะห์แบบคงที่เพื่อกำหนดสิ่งที่จะโหลดลงในแคช