การรวบรวมขยะในภาษาบริสุทธิ์แตกต่างกันอย่างไร


26

ในภาษาบริสุทธิ์เช่น Haskell ข้อมูลทั้งหมดจะไม่เปลี่ยนรูปและไม่มีโครงสร้างข้อมูลที่มีอยู่สามารถเปลี่ยนแปลงได้ แต่อย่างใด นอกจากนี้อัลกอริทึมมากมายเกี่ยวกับข้อมูลที่ไม่เปลี่ยนรูปแบบและรูปแบบการเขียนโปรแกรมการทำงานสร้างขยะจำนวนมากตามธรรมชาติ (กลุ่มของmapการสร้างรายการระดับกลางเช่น)

นักสะสมขยะใช้กลยุทธ์และเทคนิคใดในการเผชิญกับความบริสุทธิ์ที่ไม่เป็นเช่นนั้น ทำงานได้ดีมากใน GC ของภาษาที่ไม่บริสุทธิ์ซึ่งไม่ได้อยู่ในบริบทที่บริสุทธิ์อะไร ภาษาบริสุทธิ์อื่น ๆ ที่สร้างขึ้นสำหรับ GCs มีปัญหาอะไรบ้าง


1
คุณอาจต้องการอ่านwiki.haskell.org/GHC/Memory_Management
Mateusz K.

คำตอบ:


13

การใช้งานปัจจุบันของ ghc ใช้กลยุทธ์ที่ใช้งานได้เพียงเพราะภาษานั้นบริสุทธิ์การทำงานและข้อมูลไม่เปลี่ยนรูป: เนื่องจากไม่มีตัวแปรใดที่สามารถเปลี่ยนแปลงได้เพื่ออ้างถึงสิ่งที่ใหม่กว่าวัตถุเพียงเก็บการอ้างอิงไปยังวัตถุที่เก่ากว่า ; เนื่องจากวัตถุที่อ้างถึงโดยรุ่นที่สูงกว่าไม่สามารถลบได้จนกว่ารุ่นนั้นจะเป็น GCd จึงส่งเสริมวัตถุให้กับคนรุ่นใหม่อย่างกระตือรือร้น และเนื่องจากไม่มีสิ่งใดที่จะเปลี่ยนแปลงการอ้างอิงในขณะที่ GC กำลังกวาดพวกมันมันจึงสามารถทำงานแบบขนาน

นี่คือกระดาษที่มีรายละเอียดมากขึ้น


4
การโปรโมตที่กระตือรือร้นนั้นอาศัยความเกียจคร้านการอัปเดต thunk ในคนรุ่นเก่าสามารถสร้างตัวชี้ไปสู่คนรุ่นใหม่ แต่ thunks จะกลายพันธุ์เพียงครั้งเดียวดังนั้นมันจึงพอเพียงที่จะส่งเสริมวัตถุที่เด็ก การอ้างอิงแบบเก่าถึงรุ่นอื่น ๆ (เช่นจากอาร์เรย์ที่ไม่แน่นอน) ถูกติดตามโดยใช้“ ชุดที่จดจำ” ซึ่งใช้ในกรณีที่การเลื่อนระดับความกระตือรือร้นล้มเหลว
Jon Purdy

1

ในภาษาบริสุทธิ์เช่น Haskell ข้อมูลทั้งหมดจะไม่เปลี่ยนรูปและไม่มีโครงสร้างข้อมูลที่มีอยู่สามารถเปลี่ยนแปลงได้ แต่อย่างใด

จริงๆแล้วไม่เป็นความจริง ภาษาที่บริสุทธิ์ใช้การประเมินที่ไม่เข้มงวด (ขี้เกียจ) ดังนั้นการประเมินผลของนิพจน์ย่อยทั้งหมดอาจถูกเลื่อนออกไป นิพจน์ที่ไม่ได้ประเมินค่าโดยทั่วไปจะมีฮีปที่จัดสรรเป็น "thunk" เมื่อต้องการนิพจน์จะถูกประเมินค่าและ thunk จะกลายเป็นค่าผลลัพธ์

นักสะสมขยะใช้กลยุทธ์และเทคนิคใดในการเผชิญกับความบริสุทธิ์ที่ไม่เป็นเช่นนั้น

สิ่งเดียวที่ฉันสามารถคิดเป็นหลุมดำ ฉันจำไม่ได้ว่าได้เห็นสิ่งใหม่ ๆ ทางด้าน GC ในเอกสารการวิจัยของ Haskell

ทำงานได้ดีมากใน GC ของภาษาที่ไม่บริสุทธิ์ซึ่งไม่ได้อยู่ในบริบทที่บริสุทธิ์อะไร

อุปสรรคในการเขียน GC ภาษาที่ไม่บริสุทธิ์มีแนวโน้มที่จะเขียนพอยน์เตอร์ลงในกองมากขึ้นดังนั้นพวกเขาจึงมีแนวโน้มที่จะมีอุปสรรคในการเขียนที่ดีที่สุด

อัลกอริธึม GC อื่น ๆ เช่น mark-region นั้นมีความเป็นไปได้มากกว่าในบริบทของภาษาที่ไม่บริสุทธิ์เนื่องจากสามารถมีอัตราการจัดสรรที่ต่ำกว่าภาษาบริสุทธิ์

ภาษาบริสุทธิ์อื่น ๆ ที่สร้างขึ้นสำหรับ GCs มีปัญหาอะไรบ้าง

ภาษาที่บริสุทธิ์นั้นหายากมากดังนั้นจึงมีข้อมูลน้อยลงมากเกี่ยวกับวิธีที่โปรแกรมบริสุทธิ์ใช้หน่วยความจำและดังนั้นคุณจึงเริ่มต้นในตำแหน่งที่แย่ลงเมื่อพยายามเขียน GC สำหรับภาษาบริสุทธิ์


"เมื่อต้องการนิพจน์จะถูกประเมินค่าและ thunk จะกลายเป็นค่าผลลัพธ์" นั่นคือรายละเอียดการใช้งานภายในเท่าที่ผู้ใช้ Haskell เป็นห่วง ไม่มีวิธีสังเกตการกลายพันธุ์ดังนั้นจึงไม่ใช่การกลายพันธุ์จากมุมมองของผู้ใช้
แจ็ค

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