Programmiersprache Swift 5.6 erweitert Zeiger für das Zusammenspiel mit C

Neben Anpassungen für unsafe Pointers vor allem für den Aufruf von C-Funktionen bringt Apples Programmiersprache Ergänzungen beim Typsystem mit.

In Pocket speichern vorlesen Druckansicht

(Bild: Paweł Kuźniar (unter der GFDL))

Lesezeit: 4 Min.
Inhaltsverzeichnis

Apples Open-Source-Programmiersprache Swift ist in Version 5.6 erschienen. Die Neuerungen beziehen sich vor allem auf den Einsatz von als unsicher gekennzeichneten Zeigern zum direkten Speicherzugriff und das Typsystem. Daneben gibt es einen Ausbau beim Build-Prozess, um individuelle Aktionen über Plug-ins umzusetzen.

In Swift dienen Instanzen von UnsafePointer zum direkten Zugriff auf den Speicher. Da die Entwicklerinnen und Entwickler selbst für die Speicherverwaltung verantwortlich sind, sind die unsicheren Zeiger naturgemäß mit dem Risiko von Speicherzugriffsfehlern und undefiniertem Verhalten verbunden. Ein UnsafePointer kann wahlweise einem bestimmten Typ zugeordnet oder nicht typisiert (untyped) sein.

Die unsicheren Zeiger dienen vor allem dem Zusammenspiel mit C-APIs. Swift 5.6 führt unter dem Proposal SE-0322 "Temproray Uninitialized Buffers" eine Funktion in der Standard Library ein, die einen temporären Speicherbereich initialisiert, der möglichst auf dem Stack liegen soll. Diesen Buffer kann ein Swift-Programm an eine C-Funktion übergeben, die einen Speicherbereich benötigt, um ihre Ergebnisse für die Rückgabe abzulegen.

Daneben erlaubt SE-0324 "Relax Diagnostics for Pointer Arguments to C Functions" einen freieren Umgang bei der Typumwandlung von Zeigern bei der Übergabe an C-Funktionen. So lassen sich nun veränderliche (mutable) Varianten von unsicheren Zeigern wie UnsafeMutablePointer an APIs übergeben, die eigentlich eine unveränderliche (immutable) Variante wie UnsafePointer erwarten.

An einer anderen Stelle geht Swift einen Schritt zurück. Das Proposal für die Implementierung des Sendable-Protokolls SE 0302 hat ursprünglich festgelegt, dass die unsicheren Zeigertypen bedingungslos konform zu dem Einsatz in nebenläufigem Code mit dem Protokoll sind. SE-0331 "Remove Sendable Conformance from Unsafe Pointer Types" entzieht UnsafePointer und den anderen Varianten diese Konformität, weil die Verantwortung für die Speicherverwaltung auf Developer-Seite liegt und damit die Memory-Safety in Swift untergräbt.

Zwei Neuerungen in Swift 5.6 ergänzen das Typsystem der Programmiersprache. SE-0315 "Type Placeholders" lief ursprünglich unter dem Swift Evolution Proposal "Placeholder Types", aber in Anlehnung an andere Sprachen wie Rust hat das Team den Namen angepasst. Swift nutzt Typinferenz, um nicht deklarierte Typen zu erschließen. Für Ausdrücke, in denen der Compiler den Typ nicht selbsttätig erkennen kann, lässt sich der konkrete Typ unter anderem über Typannotationen oder das Schlüsselwort as festlegen.

Der nun eingefügte Placeholder Type ist als Unterstrich geschrieben, und _ legt fest, dass der konkrete Typ sich später anhand anderer Parameter oder Rückgabewerte erschließen lässt. Der Platzhaltertyp lässt sich unter anderem in Arrays, Dictionaries, Tupel oder Funktionstypen verwenden, wie das Proposal aufzeigt:

Array<_>    // array with placeholder element type
[Int: _]    // dictionary with placeholder value type
(_) -> Int  // function type accepting a single type 
            // placeholder argument and returning 'Int'
(_, Double) // tuple type of placeholder and 'Double'
_?          // optional wrapping a type placeholder

Eine kleine Ergänzung soll den Umgang mit existential Types übersichtlicher gestalten. Existentials legen keinen konkreten Typ fest, sondern ein Protokoll mit einem Wert und zugehörigen Operationen. Der zugrundeliegende Typ ist dynamisch. SE-0335 "Introduce existential any" führt zunächst optional die Annotation mit dem Schlüsselwort any zum Kennzeichnen der existential Types ein. Für die nächste Hauptversion der Sprache soll das Keyword verpflichtend sein.

Bei den sprachlichen Neuerungen gibt es zudem kleinere Ergänzungen für die nebenläufige Programmierung, die in der Vorversion maßgebliche Änderung erfahren hat. Daneben bringt Swift 5.6 Ergänzungen beim Tooling: SE-0303 "Package Manager Extensible Build Tools" erlaubt das Einbinden spezifischer Aktionen über Plug-ins in den Build-Prozess, und SE-0332 "Package Manager Command Plugins" ergänzt das Proposal um Plug-ins, die sich direkt von der Kommandozeile aus nutzen lassen.

Weitere Neuerungen in Swift 5.6 lassen sich dem Swift-Blog entnehmen. Binaries der Open-Source-Programmiersprache finden sich auf der Download-Seite. Eine weitere Seite verweist auf die einzelnen GitHub-Repositories mit dem Sourcecode.

Ende Februar hat sich Chris Lattner vom Swift-Team verabschiedet, und das Swift-Kernteam hat sich neu aufgestellt.

(rme)