Wir hören manchmal "Swift macht keine klassische (Tracing-) GC, es verwendet ARC."
Ich bin mir jedoch nicht sicher, ob die Swift-Semantik irgendetwas enthält, das eine Referenzzählung erfordert. Es scheint, dass man seinen eigenen Swift-Compiler und seine eigene Laufzeit erstellen könnte, um Tracing-GC zu verwenden.
Was genau ist an Swift "referenzgezählt"? Apples Implementierung oder die Sprache selbst? Gibt es Teile der Sprache oder der Bibliothek, die ARC so stark unterstützen, dass wir dieses Label für die Sprache selbst verwenden können?
quelle
deinit
eines Schlüsselworts und die damit verbundene Semantik sind in der Tat die Dinge, die die Referenzzählung genau in den Sprach- und nicht in den Implementierungsbereich stellen.Chi hat die spezifische Frage im Körper über schnell beantwortet, diese Antwort beantwortet die allgemeinere Frage im Titel.
Referenzzähl-GC und Tracing-GC bieten dem Programmierer verschiedene Garantien.
Die Referenzzählung sorgt für Determinismus an der Stelle im Programmablauf, an der ein Objekt zerstört wird. Dies kann wichtig sein, wenn das Objekt knappe Ressourcen besitzt, die schnell freigegeben werden müssen. Andererseits kann es nicht mit Zyklen "starker" Referenzen umgehen.
Es liegt an der Spezifikation einer einzelnen Sprache, welche Merkmale garantiert werden und welche Auswahlmöglichkeiten für eine konforme Implementierung zur Verfügung stehen.
quelle
Sie können die als Swift bekannte Sprache in "Swift with ARC" umbenennen. Sie können dann eine neue Sprache mit dem Namen "Swift with GC" mit genau derselben Syntax erstellen, jedoch mit weniger Garantien, wann Objekte freigegeben werden.
In Swift mit ARC wird das Objekt gelöscht, sobald der Referenzzähler 0 ist. Bei der Speicherbereinigung können Sie, solange Sie eine schwache Referenz haben, diese schwache Referenz einer starken Referenz zuweisen, um das Objekt "wiederherzustellen". (In Swift sind schwache Referenzen gleich Null, sobald der Referenzzähler 0 ist.) Das ist ein großer Unterschied.
Und natürlich garantiert Swift with ARC, dass durch das Beenden des letzten Referenzzählers das Objekt sofort freigegeben wird. Beispielsweise haben Sie möglicherweise eine FileWriter-Klasse, in der nicht zwei Instanzen gleichzeitig in dieselbe Datei schreiben dürfen. In Swift mit ARC könnte man oldWriter = nil sagen; newWriter = FileWriter (...) und Sie würden wissen, dass der neue FileWriter erst erstellt wird, nachdem der alte gelöscht wurde (es sei denn, Sie haben eine andere Referenz beibehalten); In Swift mit GC würde dies nicht funktionieren.
Ein weiterer Unterschied besteht darin, dass in "Swift with ARC" Objekte, auf die nur durch starke Referenzzyklen verwiesen wird, die jedoch nicht tatsächlich erreichbar sind, garantiert nicht freigegeben werden.
quelle