Là tham chiếu đếm GC so với truy tìm GC là thuộc tính ngôn ngữ hoặc thuộc tính triển khai?


9

Đôi khi chúng ta nghe thấy "Swift không làm cổ điển (theo dõi) GC, nó sử dụng ARC."

Nhưng tôi không chắc có bất cứ điều gì trong ngữ nghĩa Swift yêu cầu đếm tham chiếu hay không. Dường như người ta có thể xây dựng trình biên dịch Swift và thời gian chạy của riêng mình để sử dụng theo dõi GC.

Vậy chính xác thì "tính tham chiếu" về Swift là gì? Apple thực hiện hay chính ngôn ngữ? Có phần nào của ngôn ngữ hoặc thư viện hỗ trợ mạnh mẽ ARC mà chúng ta có thể sử dụng nhãn đó cho chính ngôn ngữ đó không?

Câu trả lời:


9

Swift đảm bảo rằng một khi tham chiếu cuối cùng đến một đối tượng bị hủy bỏ thì đối tượng được khử cấp và deinitmã được chạy ngay lập tức.

Có được loại bảo lãnh này thông qua GC là không thể - ít nhất, không phải không làm giảm hiệu suất. Các cơ chế GC tiêu chuẩn chỉ đảm bảo deinitmã cuối cùng được chạy, ví dụ như ở chu trình GC tiếp theo. Đối với ngữ nghĩa chính xác, bạn cần một số tham chiếu ở đâu đó.


3
Ah, vì vậy, sự hiện diện của deinitmột từ khóa và ngữ nghĩa liên quan của nó thực sự là những điều đặt tham chiếu đếm thẳng trong ngôn ngữ, chứ không phải là lĩnh vực thực hiện.
Ray Toal

2
Không có gì ngăn cản thời gian chạy của GC để kiểm tra các đối tượng không thể truy cập bất cứ khi nào một cái gì đó được giải quyết. Nó chỉ là không hiệu quả khủng khiếp.
Raphael

@Raphael Chỉnh sửa để chính xác hơn về điểm đó.
chi

3

chi đã trả lời câu hỏi cụ thể trong cơ thể về swift, câu trả lời này trả lời câu hỏi chung hơn trong tiêu đề.

Là tham chiếu đếm GC so với truy tìm GC là thuộc tính ngôn ngữ hoặc thuộc tính triển khai?

tham chiếu đếm GC và truy tìm GC cung cấp cho lập trình viên những người bảo vệ khác nhau.

Đếm tham chiếu cung cấp tính xác định trong vị trí trong luồng chương trình nơi một đối tượng bị phá hủy, điều đó có thể quan trọng nếu đối tượng sở hữu tài nguyên khan hiếm phải được giải phóng nhanh chóng. Mặt khác, nó không thể đối phó với các chu kỳ tham chiếu "mạnh".

Tùy thuộc vào đặc điểm kỹ thuật của một ngôn ngữ riêng lẻ nếu có bất kỳ đặc điểm nào được đảm bảo và do đó lựa chọn nào có sẵn để thực hiện tuân thủ.


4
Cũng có thể kết hợp refcount và GC. Sau đó, ngôn ngữ có thể ghi lại rằng các đối tượng có hàm hủy của chúng được thực thi ngay khi chúng không được ước tính (ngụ ý phản hồi dưới dạng này hay dạng khác) và cuối cùng các chu trình tham chiếu sẽ bị phá hủy (ngụ ý một số dạng của GC). Ngoài ra, việc triển khai có thể thực hiện điều này trong khi ngôn ngữ không đảm bảo khi các hàm hủy được chạy (IIRC đó là trường hợp của Python và triển khai tham chiếu của nó), trong trường hợp đó, nó sẽ là một thuộc tính triển khai.
Gilles 'SO- ngừng trở nên xấu xa'

1

Bạn có thể lấy ngôn ngữ được gọi là Swift và đổi tên nó thành "Swift with ARC". Sau đó, bạn có thể tạo một ngôn ngữ mới có tên "Swift with GC" với cùng một cú pháp, nhưng với ít sự đảm bảo hơn về thời điểm các đối tượng được giải phóng.

Trong Swift với ARC, khi số tham chiếu bằng 0, đối tượng sẽ đi. Với bộ sưu tập rác, miễn là bạn có một tham chiếu yếu, bạn có thể gán tham chiếu yếu đó cho một tham chiếu mạnh để "phục hồi" đối tượng. (Trong Swift, một khi số tham chiếu là 0, tham chiếu yếu là không); đó là một sự khác biệt lớn

Và tất nhiên Swift với ARC đảm bảo rằng việc giết số tham chiếu cuối cùng sẽ giải phóng đối tượng ngay lập tức. Ví dụ: bạn có thể có một lớp FileWriter, nơi bạn không được phép có hai trường hợp ghi vào cùng một tệp cùng một lúc. Trong Swift với ARC, bạn có thể nói oldWriter = nil; newWriter = FileWriter (...) và bạn sẽ biết rằng FileWriter mới chỉ được tạo sau khi cái cũ bị xóa (trừ khi bạn giữ một tham chiếu khác xung quanh); trong Swift với GC điều này sẽ không hoạt động.

Một điểm khác biệt nữa là trong "Swift with ARC", các đối tượng chỉ được tham chiếu qua các chu kỳ tham chiếu mạnh, nhưng không thực sự có thể truy cập được, được đảm bảo không bị hủy bỏ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.