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.
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.
Breitere Anbindung an "fremde" Betriebssysteme
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
Verhinderte Data Races
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.
Eindeutige Besitzer
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.
Exakte Fehlermeldung
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.
Mehr Komfort und Testing-Library
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)