Programmiersprache Swift 6 hat Nebenläufigkeit, Linux und Windows im Fokus

Neben sprachlichen Erweiterungen bringt die Programmiersprache Verbesserungen für die Anbindung von Plattformen jenseits von Apples Ökosystem.

In Pocket speichern vorlesen Druckansicht 5 Kommentare lesen

(Bild: Erstellt mit Dall-E von iX-Redaktion)

Lesezeit: 5 Min.
Inhaltsverzeichnis

Fünf Jahre nach Swift 5 ist Apples quelloffene Programmiersprache in Version 6.0 erschienen. Das Release schließt vor allem die Vorarbeit der letzten Punkt-Releases im Bereich der nebenläufigen Programmierung ab.

Außerdem gibt es Erweiterungen beim Ownership-Konzept, beim Exception Handling und beim Zusammenspiel mit C++. Einige Komfortfunktionen runden die sprachlichen Neuerungen ab.

Neben den sprachlichen Neuerungen gibt es Ergänzungen für Plattformen jenseits von macOS und iOS. Das Foundation-Framework mit grundlegenden Datentypen, Collections und Funktionen zur direkten Anbindung an das jeweilige Betriebssystem ist nun ebenso für Linux und Windows verfügbar wie für Apples Betriebssysteme.

Für Linux existieren zudem neue Installationspakete ohne externe Dependencies und vorgefertigte Builds für zusätzliche Distributionen. Unter Windows parallelisiert der Paketmanager Build-Vorgänge auf Mehrkernprozessoren, und es existiert eine Variante der Toolchain, die für Windows auf ARM-Systemen zugeschnitten ist.

Außerdem erscheint mit Swift 6 eine Preview von Embedded Swift. Dabei handelt es sich um ein Subset der Sprache, das speziell auf das Entwickeln von Anwendungen für Mikrocontroller zugeschnitten ist. Die Toolchain zielt zunächst auf ARM- und RISC-V-Systeme

Embedded Swift reduziert die Funktionsweise, um den Speicherbedarf für Mikrocontroller-Anwendungen zu minimieren.

(Bild: Swift.org auf GitHub)

Verbesserte Nebenläufigkeit gehört zu den wichtigsten Punkten von Swift 6.0. Die Umstellung auf ein neues Concurrency-Modell laufen seit der Anfang 2021 veröffentlichten Version 5.4. Structured Concurrency kam in Swift 5.5 hinzu.

Swift 6 soll Data Races verhindern, die auftreten können, wenn mehrere Threads gleichzeitig Schreib- und Lesezugriff auf dieselben Daten haben, was zu unerwarteten Fehlern führen kann. Der Swift-Compiler prüft, ob beim Austausch von Daten zwischen Threads diese Gefahr besteht. Bereits in Swift 5.10 gab es das Compiler-Flag -strict-concurrency=complete, das beim Kompilieren auf Data Races geprüft hat, aber viele False Positives erzeugte. In Swift 6 sind die Compiler-Checks deutlich zuverlässiger.

Grundlage für die Thread-sichere Datenverarbeitung in Swift 6 ist Sendable. Das Protokoll ist für den Austausch von Werten zwischen Threads ausgelegt. Bei Sendable-Werte muss dafür gesorgt sein, dass sie keine geteilten veränderbaren Inhalte haben, entweder durch unveränderbare Inhalte oder Locks, die dafür sorgen, dass zu jedem Zeitpunkt nur ein Actor Zugriff auf veränderbare Werte hat.

Im Leitfaden für die Migration auf Swift 6 findet sich ein Abschnitt dazu, wie Code Data Races mit Sendable-Typen und anderen Methoden verhindern kann.

Im Herbst 2023 hat Swift 5.9 ein Ownership-Konzept für die Programmiersprache eingeführt, das nicht so strikt ist wie das grundlegende Ownership-Modell in Rust. Das erklärte Ziel für Swift war vor allem die verbesserte Speicherverwaltung. Dazu gehört die Syntax ~Copyable für Objekte, die nicht kopierbar sind, also einen eindeutigen Besitzer haben.

Swift 6 führt nun als Gegenstück das Protokoll Copyable ein, das standardmäßig für alle Werte gilt, die nicht als ~Copyable gekennzeichnet sind.

Dabei erlaubt die Sprache nun Funktionen, bei denen sowohl kopierbare als auch nicht kopierbare Werte erlaubt sind, wie folgendes Beispiel aus dem Blogbeitrag zu Swift 6 zeigt:

protocol Drinkable: ~Copyable {
  consuming func use()
}

struct Coffee: Drinkable, ~Copyable { /* ... */ }
struct Water: Drinkable { /* ... */ }

func drink(item: consuming some Drinkable & ~Copyable) {
  item.use()
}

drink(item: Coffee())
drink(item: Water())

Durch die Auszeichnung ~Copyable sind in dem Protokoll Drinkable auch (aber nicht nur) Werte erlaubt, die nicht kopierbar sind. Daher ist der Aufruf der Funktion drink sowohl für das nicht kopierbare Struct Coffee als auch für das kopierbare Struct Water erlaubt.

Die nicht kopierbaren Typen haben laut dem Swift-Blog bereits Einzug in die Standard-Library von Swift gehalten, darunter im Atomic-Typ im Synchronization-Framework.

Eine weitere Neuerung in Swift 6 sind Typed Throws: Die Art der möglichen Fehlermeldung lässt sich nun über einen Parameter für throws angeben:

func parseRecord(from string: String) throws(ParseError) -> Record { 
  // ... 
}

do {
  let record = try parseRecord(from: myString)
} catch {
  // 'error' has type 'ParseError'
}

Aufgrund des in der Funktion angegebenen potenziell zu erwartenden Fehlertyps kann die aufrufende Funktion davon ausgehen, dass beim Erreichen des catch-Blocks exakt dieser Fehler aufgetreten ist. Die Änderung zielt vor allem darauf, Ressourcen zu sparen, beispielsweise für Embedded-Anwendungen.

Typed Throws sind auch in generischen Funktionen erlaubt:

extension Sequence {
  func map<T, E>(_ body: (Element) throws(E) -> T) throws(E) -> [T] { 
    // ... 
  }
}

Allerdings darf immer nur genau ein Fehlertyp angegeben sein, throws(FileError, ParseError) ist also nicht gestattet. Für Fälle mit mehr als einer potenziellen Art des Fehlerse gilt weiterhin das allgemeine throws für beliebige Fehlermeldungen.

Neben den größeren Neuerungen bringt Swift 6 zahlreiche kleinere Ergänzungen mit. Nennenswert ist die Methode count(where:), die eine Kombination aus filter() und einer Zählfunktion bietet und unnötiges Kopieren von Array-Elementen überflüssig macht:

let scores = [10, 7, 5, 9, 3, 8, 6]
let goodCount = scores.count { $0 >= 7 }

Die neue Pack Iteration führt eine Iteration über die in Swift 5.9 eingeführten Parameter Packs – einer flexiblen Zahl von Parametern – mit einer for-in-Syntax ein.

Außerdem kennt die aktuelle Version der Programmiersprache 128-Bit-Integer-Typen mit und ohne Vorzeichen.

Swift 6 führt mit Swift Testing zudem eine neue Library ein, die eine API zum Schreiben und Verwalten von Tests bietet. Dazu existiert ein eigenes Projekt auf GitHub.

Weitere Details zu Swift 6 lassen sich dem Blogbeitrag mit der Ankündigung entnehmen. Installationsdateien für die Programmiersprache stehen auf der Downloadseite für macOS, Linux und Windows bereit.

(rme)