Swift: Die Rückkehr der Referenz-Zähler

von Hubert Schmid vom 2014-06-22

Swift ist mehr als nur eine neue Programmiersprache: Sie ist die designierte Nachfolgerin von Objective‑C als primäre Programmiersprache auf Apples beiden Plattformen. Daher sollte man den Kernkonzepten der Sprache eine gewisse Bedeutung beimessen – auch wenn man nicht direkt betroffen ist.

Einige Entscheidungen der Sprachentwickler verdienen durchaus das Prädikat überraschend. Aus meiner Sicht gehört dazu insbesondere die Entscheidung für automatische Referenzzähler – im Gegensatz zu Garbage Collection. Dabei ist Letztere keineswegs unumstritten. Vor allem die drei folgenden Punkte verursachen zunehmend Probleme:

  1. Effizienz: Schlechte Skalierung mit der Anzahl der Objekte.
  2. User-Experience: Unregelmäßiges Antwortverhalten durch nicht-deterministische Aufräumaktionen.
  3. Robustheit: Keine Berücksichtigung von Engpass-Ressourcen wie offenen Dateien, Netzwerkverbindungen und Datenbank-Transaktionen.

Demgegenüber gibt es bei der automatischen Referenz-Zählung das Problem zyklischer Referenzen, die nicht automatisch aufgeräumt werden können. Swift begegnet dem mit bewährten Konzepten. Dabei werden die drei folgenden Kategorien von Referenzen unterschieden, wobei unauflösbare Zyklen ausschließlich durch Erstere entstehen können:

C++‑Entwicklern sollten diese Kategorien bekannt vorkommen. Fast 1:1 entsprechen sie den Typen std::shared_ptr<T>, std::weak_ptr<T> und T* (raw pointer). Im Gegensatz zu C++ sind jedoch in Swift alle drei Kategorien fest in der Sprache verankert. Das vereinfacht die Nutzung und ermöglicht mehr Optimierungen.

Es steht außer Frage, dass Swift mit der automatischen Referenz-Zählung Erfolg haben wird. Schließlich geht auf Apples beiden Plattformen in Zukunft kein Weg mehr an dieser Sprache vorbei. Offen bleibt dagegen, ob automatische Referenz-Zählung in Summe tatsächlich besser als Garbage Collection ist. Darüber wird in den nächsten Jahren sicherlich trefflich gestritten. Doch die Karten sind jetzt neu verteilt.