หลังจากการเรียกดูคำตอบหลายกองมากเกินก็เป็นที่ชัดเจนว่าบางภาษาเรียบเรียงโดยกำเนิดมีการเก็บขยะ แต่มันก็ไม่ชัดเจนสำหรับฉันว่ามันจะทำงานอย่างไร
ฉันเข้าใจว่าการรวบรวมขยะสามารถทำงานกับภาษาที่ตีความได้อย่างไร ตัวรวบรวมขยะจะทำงานพร้อมกับล่ามและลบวัตถุที่ไม่ได้ใช้และไม่สามารถเข้าถึงได้ออกจากหน่วยความจำของโปรแกรม พวกเขาทั้งสองทำงานร่วมกัน
สิ่งนี้จะทำงานกับภาษาที่คอมไพล์ได้อย่างไร? ความเข้าใจของฉันคือเมื่อคอมไพเลอร์ได้รวบรวมซอร์สโค้ดไปยังรหัสเป้าหมาย - โดยเฉพาะรหัสเครื่องดั้งเดิม - ก็เสร็จแล้ว งานเสร็จสิ้นแล้ว ดังนั้นโปรแกรมที่คอมไพล์แล้วจะเก็บขยะได้อย่างไร?
คอมไพเลอร์ทำงานร่วมกับ CPU ในบางวิธีในขณะที่โปรแกรมทำงานเพื่อลบวัตถุ "ขยะ" หรือไม่ หรือคอมไพเลอร์มีตัวรวบรวมขยะน้อยที่สุดในการปฏิบัติการของโปรแกรมที่คอมไพล์แล้วหรือไม่
ฉันเชื่อว่าคำสั่งหลังของฉันจะมีความถูกต้องมากกว่าเดิมเนื่องจากข้อความที่ตัดตอนมาจากคำตอบนี้ใน Stack Overflow :
ภาษาโปรแกรมหนึ่งนั้นคือไอเฟล คอมไพเลอร์ไอเฟลส่วนใหญ่สร้างรหัส C สำหรับเหตุผลในการพกพา รหัส C นี้ใช้เพื่อสร้างรหัสเครื่องโดยคอมไพเลอร์ C มาตรฐาน Eiffel implementations ให้ GC (และบางครั้งก็แม่นยำ GC) สำหรับโค้ดที่คอมไพล์นี้และไม่จำเป็นสำหรับ VM โดยเฉพาะอย่างยิ่ง VisualEiffel คอมไพเลอร์สร้างรหัสเครื่อง x86 พื้นเมืองโดยตรงกับการสนับสนุน
คำสั่งสุดท้ายดูเหมือนจะบ่งบอกว่าคอมไพเลอร์มีบางโปรแกรมในปฏิบัติการสุดท้ายซึ่งทำหน้าที่เป็นตัวเก็บรวบรวมขยะในขณะที่โปรแกรมกำลังทำงาน
หน้าบนเว็บไซต์D ภาษาเกี่ยวกับการรวบรวมขยะ - ซึ่งถูกรวบรวมไว้อย่างเป็นธรรมชาติและมีที่เก็บขยะทางเลือก - ดูเหมือนจะบอกใบ้ว่าโปรแกรมแบ็คกราวน์บางโปรแกรมทำงานควบคู่ไปกับโปรแกรมปฏิบัติการแบบดั้งเดิมเพื่อนำไปใช้กับการรวบรวมขยะ
D เป็นภาษาโปรแกรมระบบที่รองรับการรวบรวมขยะ โดยปกติแล้วไม่จำเป็นต้องเพิ่มหน่วยความจำอย่างชัดเจน เพียงจัดสรรตามความจำเป็นและตัวรวบรวมขยะจะส่งคืนหน่วยความจำที่ไม่ได้ใช้ทั้งหมดไปยังพูลของหน่วยความจำที่มีอยู่เป็นระยะ ๆ
หากวิธีการดังกล่าวข้างต้นจะใช้วิธีการว่ามันจะทำงานอย่างไร คอมไพเลอร์เก็บสำเนาของโปรแกรมรวบรวมขยะบางส่วนและวางลงในแต่ละไฟล์ที่สร้างขึ้นได้หรือไม่?
หรือฉันมีข้อบกพร่องในความคิดของฉัน? ถ้าเป็นเช่นนั้นวิธีการใดบ้างที่ใช้ในการใช้การรวบรวมขยะสำหรับภาษาที่คอมไพล์และพวกมันจะทำงานอย่างไร
malloc()
ได้