จำเป็นต้องมีการรวบรวมขยะในภาษาแบบกองซ้อนหรือไม่?


16

จำเป็นต้องมีการเก็บรวบรวมขยะ (GC) ในภาษาที่ใช้สแต็กคืออะไร? ในภาษาอย่างForthหรือRPL (บนเครื่องคิดเลขของ HP ) จำเป็นต้องมีการรวบรวมขยะหรือไม่?

ฉันคิดว่าเนื่องจากเอาต์พุตถูกสแต็กออกจากสแต็กดังนั้นจึงไม่มีความจำเป็นใด ๆ ฉันพลาดอะไรไปรึเปล่า?

คำตอบ:


14

โดยปกติ GC จะใช้กับหน่วยความจำที่จัดสรรในฮีป ฉันไม่คุ้นเคยกับ Forth หรือ RPL แต่ถ้าไม่มีกองและทุกอย่างถูกเก็บไว้ในกองซ้อนทั่วโลกแทนไม่มีอะไรที่ GC จะทำ


2
รูปแบบการใช้งานหน่วยความจำทั่วไปของโปรแกรม Forth ที่ฉันอ่านในวันแรก ๆ นั้นเป็นเหมือนโปรแกรมประกอบเนื่องจากพวกเขาใช้ที่อยู่ข้อมูลทั่วโลกแบบคงที่ที่จัดแจงไว้ล่วงหน้า สิ่งนี้ใช้ได้เนื่องจาก Forth มีความสามารถในการถ่ายโอนข้อมูลระหว่างสแต็กและที่อยู่เฉพาะ นอกจากนี้ยังมีความสามารถในการคำนวณที่อยู่ ดังนั้นจึงเป็นไปได้ที่จะสร้างไลบรารีตัวจัดสรรตามแนวคิดฮีปและไลบรารีตัวจัดสรรจะต้องใช้วิธีการจัดการกับขนาดที่ จำกัด ของฮีป หากผู้ใช้ออกมาเส้นทางนี้พวกเขาอาจต้องการและใช้งาน GC
คนพื้นที่ cardiff

13

ใช่คุณพูดถูก. แต่ความเป็นกองซ้อนเป็นเพียงส่วนหนึ่งของเรื่องราวทั้งหมด ตัวอย่างเช่นล่าม Java bytecode เป็นแบบกองซ้อนเช่นกัน (โค้ดที่คอมไพล์ทำงานได้ - ด้วยเหตุผลด้านประสิทธิภาพ - แตกต่างกัน) สิ่งนี้บอกเราว่าภาษาใดสามารถเปลี่ยนเป็นภาษาสแต็กได้

สิ่งที่สำคัญคือวัตถุที่อยู่ด้านนอกของสแต็กผู้ที่สามารถอยู่ได้นานกว่าการดำเนินการวิธีปัจจุบัน ตราบใดที่ภาษาไม่เหมือนmallocหรือnewไม่มีวัตถุดังกล่าวและคุณไม่จำเป็นต้องมีdeleteหรือ GC

ภาษาที่ขาดการจัดสรรหน่วยความจำแบบไดนามิกค่อนข้างมีข้อ จำกัด ในด้านประโยชน์


ไม่แน่ใจว่าฉันเห็นด้วยกับบรรทัดสุดท้ายคือ java bytecode ไม่มีประโยชน์หรือไม่
jk

@jk., java bytecode มีการจัดสรรหน่วยความจำแบบไดนามิก
Peter Taylor

1
ที่จริงแล้วมีภาษาที่ใช้งานทั่วไปหลายภาษา ลองดูfactorcode.org
Yam Marcovic

1
ปัจจัยที่แท้จริงคือการรวบรวมขยะ
Andrea

1

จำเป็นต้องมีการรวบรวมขยะหากภาษากำลังสนับสนุนโครงสร้างข้อมูลแบบไดนามิกโดยเนื้อแท้ ซึ่งเกือบจะเป็นสิ่งจำเป็นหากคุณต้องการทำอะไรเกินกว่าระดับ C หากปราศจากคุณติดอยู่กับโครงสร้างข้อมูลขนาดคงที่และการจัดการหน่วยความจำด้วยตัวเอง นั่นเป็นสิ่งที่ Forth ดั้งเดิมทำได้แน่นอน แต่อาจไม่ใช่สิ่งที่คุณต้องการทำในวันนี้เว้นแต่ว่าคุณจะทำการเข้ารหัสระบบระดับต่ำเท่านั้น


1

การรวบรวมขยะไม่จำเป็นถ้าภาษาใช้การจัดสรรแบบสแตติกแทนการจัดสรรแบบสแต็ก ตัวอย่างเช่น Fortran 77 ที่มีตัวเลือก-s (หน่วยเก็บข้อมูลแบบคงที่)จะจัดสรรหน่วยความจำทั้งหมดเมื่อโปรแกรมเริ่มต้นดังนั้นจึงไม่มีการจัดสรรหน่วยความจำเกิดขึ้นในขณะใช้งานจริงเพื่อให้มีอิสระ ในขณะที่ต้องใช้วินัยบางอย่างมันเป็นไปได้ที่จะเขียนโปรแกรม การจัดสรรแบบคงที่จะลบการรั่วไหลของหน่วยความจำใด ๆ และนำไปสู่ประสิทธิภาพแคชที่ยอดเยี่ยมเนื่องจากคอมไพเลอร์สามารถใช้การวิเคราะห์แบบคงที่เพื่อกำหนดสิ่งที่จะโหลดลงในแคช

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.