การอ้างอิงการนับ GC กับการติดตาม GC เป็นคุณสมบัติภาษาหรือคุณสมบัติการใช้งานหรือไม่


9

บางครั้งเราได้ยินคำว่า "สวิฟท์ไม่ได้ทำคลาสสิก (ติดตาม) GC จะใช้ ARC."

แต่ฉันไม่แน่ใจว่ามีอะไรใน Swant semantics ที่ต้องใช้การนับการอ้างอิง ดูเหมือนว่าเราสามารถสร้างคอมไพเลอร์ Swift และรันไทม์ของตัวเองเพื่อใช้การติดตาม GC

ดังนั้น "อ้างอิงนับ" เกี่ยวกับ Swift คืออะไร? การใช้งานแอปเปิ้ลหรือภาษาตัวเองหรือไม่ มีบางส่วนของภาษาหรือไลบรารีที่สนับสนุน ARC อย่างยิ่งซึ่งเราสามารถใช้ป้ายกำกับนั้นสำหรับภาษานั้น ๆ ได้หรือไม่?

คำตอบ:


9

Swift รับประกันว่าเมื่อการอ้างอิงครั้งสุดท้ายไปยังวัตถุถูกทิ้งวัตถุจะถูกกำหนดค่าเริ่มต้นและdeinitรหัสจะถูกเรียกใช้ทันที

การได้รับการรับรองประเภทนี้ผ่าน GC เป็นไปไม่ได้ - อย่างน้อยไม่ได้โดยไม่ต้องเสียสละประสิทธิภาพ กลไก GC มาตรฐานเพียงให้แน่ใจว่าdeinitรหัสจะทำงานในที่สุดเช่นในรอบ GC ต่อไป สำหรับความหมายที่แม่นยำคุณจำเป็นต้องมีการอ้างอิงจำนวนหนึ่ง


3
พึงรู้เถิดว่าการปรากฏตัวของdeinitคำหลักและความหมายที่เกี่ยวข้องนั้นเป็นสิ่งที่ทำให้การอ้างอิงมีความสำคัญอย่างยิ่งในภาษามากกว่าการนำไปใช้จริง
Ray Toal

2
ไม่มีสิ่งใดที่จะป้องกันรันไทม์ GCed เพื่อตรวจสอบหาวัตถุที่ไม่สามารถเข้าถึงได้ มันไม่มีประสิทธิภาพอย่างน่ากลัว
Raphael

@ ราฟาเอลแก้ไขให้แม่นยำยิ่งขึ้นในตอนนั้น
Chi

3

ไคได้ตอบคำถามเฉพาะในร่างกายเกี่ยวกับรวดเร็ว, คำตอบนี้ตอบคำถามทั่วไปมากขึ้นในชื่อ

การอ้างอิงการนับ GC กับการติดตาม GC เป็นคุณสมบัติภาษาหรือคุณสมบัติการใช้งานหรือไม่

การนับการอ้างอิงอ้างอิง GC และการติดตาม GC จัดเตรียมโปรแกรมเมอร์ที่มีผู้รับประกันที่แตกต่างกัน

การนับการอ้างอิงให้การกำหนดในตำแหน่งในโฟลว์ของโปรแกรมที่วัตถุถูกทำลายซึ่งอาจมีความสำคัญหากวัตถุนั้นมีทรัพยากรที่ขาดแคลนซึ่งจะต้องถูกปลดปล่อยอย่างรวดเร็ว ในขณะที่มันไม่สามารถจัดการกับรอบของการอ้างอิง "แข็งแรง"

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


4
นอกจากนี้ยังเป็นไปได้ที่จะรวม refcount และ GC จากนั้นภาษาอาจจัดทำเอกสารว่าวัตถุมีตัวทำลายล้างดำเนินการทันทีที่พวกเขาไม่ได้อ้างถึง (อ้างถึง refcount ในรูปแบบใดรูปแบบหนึ่ง) และรอบการอ้างอิงนั้นจะถูกทำลายในที่สุด (นัยว่า GC บางรูปแบบ) อีกทางหนึ่งการใช้งานสามารถทำได้ในขณะที่ภาษาไม่รับประกันเมื่อมีการเรียกใช้ destructors (IIRC เป็นกรณีของ Python และการใช้งานอ้างอิง) ซึ่งในกรณีนี้มันจะเป็นคุณสมบัติการใช้งาน
Gilles 'หยุดความชั่วร้าย'

1

คุณสามารถนำภาษาที่รู้จักในชื่อ Swift และเปลี่ยนชื่อเป็น "Swift with ARC" จากนั้นคุณสามารถสร้างภาษาใหม่ที่ชื่อว่า "Swift with GC" ที่มีไวยากรณ์เดียวกันทั้งหมด แต่มีการรับประกันน้อยลงเมื่อวัตถุถูกจัดสรรคืน

ใน Swift with ARC เมื่อจำนวนการอ้างอิงคือ 0 วัตถุจะไป ด้วยการรวบรวมขยะตราบใดที่คุณมีการอ้างอิงที่อ่อนแอคุณสามารถกำหนดการอ้างอิงที่อ่อนแอไปยังการอ้างอิงที่แข็งแกร่งเพื่อ "กู้คืน" วัตถุ (ใน Swift เมื่อจำนวนการอ้างอิงคือ 0 การอ้างอิงแบบอ่อนจะไม่มี) นั่นคือความแตกต่างที่สำคัญ

และแน่นอนว่า Swift กับ ARC รับประกันได้ว่าการฆ่าจำนวนการอ้างอิงครั้งสุดท้ายจะเป็นการยกเลิกการจัดสรรวัตถุทันที ตัวอย่างเช่นคุณอาจมีคลาส FileWriter ซึ่งคุณไม่ได้รับอนุญาตให้มีสองอินสแตนซ์ที่เขียนไปยังไฟล์เดียวกันที่มีอยู่ในเวลาเดียวกัน ใน Swift with ARC คุณสามารถพูด oldWriter = nil; newWriter = FileWriter (... ) และคุณจะรู้ว่า FileWriter ใหม่จะถูกสร้างขึ้นหลังจากลบไฟล์เก่าเท่านั้น (เว้นแต่คุณจะเก็บการอ้างอิงอื่นไว้) ใน Swift with GC สิ่งนี้จะไม่ทำงาน

ความแตกต่างอีกอย่างหนึ่งก็คือใน "Swift with ARC" วัตถุที่ถูกอ้างอิงผ่านวัฏจักรการอ้างอิงที่แข็งแกร่ง แต่ไม่สามารถเข้าถึงได้จริงรับประกันว่าจะไม่ถูกจัดสรรคืน

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