Programmiersprache: Swift legt Fahrplan zur Concurrency vor

Apples Sprache soll das nebenläufige Programmieren ausbauen – das Swift-Team plant, Standardtechniken in der Syntax unterzubringen und Data Races zu reduzieren.

In Pocket speichern vorlesen Druckansicht 31 Kommentare lesen
Lesezeit: 6 Min.
Von
  • Silke Hahn
Inhaltsverzeichnis

Die Entwickler von Apples Programmiersprache Swift haben im Swift-Blog einen Fahrplan zur Concurrency vorgelegt. Die Roadmap fasst alle Entwicklungsprojekte mit Concurrency-Bezug zusammen – die einzelnen Features sollen sukzessive in die Sprache Eingang finden und sich über mehrere Releases hinweg für Entwickler manifestieren.

Die im Dokument beschriebenen künftigen Implementierungen und Erweiterungen der Sprache laufen zwar als Einzelprojekte, verfolgen aber in Summe das Ziel, nebenläufiges Programmieren in Swift weiter zu etablieren. Dabei handelt es sich laut Ben Cohen, dem Autor der Blogankündigung, um einen Plan, der kein Manifest mit mehreren losen Strängen ist, sondern einzig auf Concurrency in Swift abzielt.

Das Implementieren der Features soll in zwei großen Schüben geschehen: In der ersten Phase führt das Swift-Team die async-Syntax und Actor-Typen ein. Durch die Aktoren soll es Entwicklern möglich sein, ihren Code so neu zu organisieren, dass Data Races seltener werden. Für die zweite Phase plant das Team vollständige Actor-Isolation, wodurch man Data Races dann praktisch ausschließen könne.

Weitere Features, die flankierend herauskommen werden, sollen für eine ergonomische Zusammenarbeit der Aktoren sorgen und den Vorgang der Isolierung durchführbar machen. Die Roadmap geht nicht in die gleiche Tiefe wie die einzelnen Feature-Proposals, insbesondere Features für Phase 2 dürften sich zum jetzigen Zeitpunkt nur grob umreißen lassen. Einige Themen wie das ebenfalls geplante asynchrone Streamen, verteilte Aktoren und parallele for-Loops sind in der Roadmap ausgespart, da hierfür die Features der Phase 2 zunächst tiefere Ausarbeitung benötigen.

Die aktuelle Version von Swift (5.3) bietet laut Swift-Blog bereits ordentliche Grundlagen zur Concurrency: So empfiehlt das Swift-Team Entwicklern, ihre Daten mit Queues anstelle von Locks zu schützen und sich die Ergebnisse langsamer Operationen mit asynchronen Callbacks ausgeben zu lassen, statt einen Thread zu blockieren. Allerdings weisen diese Wege wohl einige Fallstricke auf, da derzeit alles noch von Hand einzurichten ist. Bugs können sich dabei leicht einschleichen, und der Code gilt als weniger effizient, als er sein könnte. Um gute Ergebnisse zu erzielen und sauber zu programmieren, ist derzeit laut Swift-Team einiges an zusätzlichem Aufwand nötig und kommt im Code als Ballast zum Vorschein.

Einige Patterns, die in Swift manuell bereits funktionieren, sollen daher nun sukzessive offiziell Einzug in die Syntax der Sprache halten. Künftig soll es möglich sein, Klassen zum Actor zu erklären. Die so definierte Klasse verhält sich dann so, als hätten Entwickler eine private Queue zugewiesen und den Zugang zu ihrem privaten Zustand durch diese Queue kanalisiert. Durch die statische Anbindung zwischen einem Actor und seinen Funktionen sollen sich Daten leichter isolieren lassen, Data Races können Entwickler laut Swift-Team dann "wegdefinieren".

Der Compiler soll künftig das Synchronisieren übernehmen, sodass Entwickler nicht mehr vergessen können, eine Queue zu verwenden, um einen Zustand zu schützen: Statt manueller Konfiguration garantiert der Compiler, dass das Programm auf der Queue und mit den Methoden der Klasse läuft. In diesem Zusammenhang soll der Compiler dann auch in der Lage sein, zum Beispiel eine async-Funktion auf anderen Aktoren aufzurufen, wenn dies im Rahmen des Synchronisierungsvorgangs sinnvoll erscheint.

Fünf Proposals sollen in den kommenden Wochen (Phase 1) abgearbeitet werden und Einzug in die Sprache halten, darunter ein Coroutinen-basiertes async/await-Modell für Swift und die Zustandsisolierung nebenläufiger Programme mittels eines Actor-Modells. Wie erwähnt soll Phase 1 eine teilweise Isolierung durch Aktoren einführen. Das Konzept der Task soll neu in die Standard-Library einziehen mit einer Task-API für strukturierte Concurrency. APIs sollen künftig in die Lage versetzt werden, dynamisch Child-Tasks zu erstellen, Tasks automatisch abbrechen und priorisieren können. Swifts Concurrency-Features wie die async-Funktionen sollen kompatibel sein mit Ausdrücken asynchroner Funktionen in Objective-C. Dadurch sollen Entwickler vorhandene APIs aus Objective-C nahtlos in Swift einsetzen können.

Geplant ist, dass Swift automatisierte Übersetzungen dieser APIs in async-Funktionen vornimmt. In diesem Zusammenhang steht auch die künftige Fähigkeit von Swift, synchrone Actor-Funktionen als asynchrone Handler zu definieren. Nach außen sollen sie sich wie eine synchrone Funktion verhalten, während sie nach innen wie eine asynchrone Funktion behandelt werden. Durch diesen Trick sollen konventionelle Methoden zur Benachrichtigung asynchrone Vorgänge ohne zusätzliches Setup ausführen können.

In der zweiten Phase steht die vollständige Actor-Isolation im Zentrum. Das Prinzip entspricht laut Swift-Team dem beim exklusiven Speicherzugang. Ziel ist es, die jeweils letzten beiden vorgenommenen Kategorisierungen automatisiert zu schützen. Führt man die Entwicklungsziele der einzelnen Projekte zusammen, sollte am Ende laut Swift-Team asynchrones Programmieren auf sicheren Füßen stehen und die Sprache einen Standardsatz an Tools und Techniken erhalten, die Swift-Entwicklern als Referenz dienen. Die Performance des asynchronen Codes zur Compilerzeit soll sich verbessern, außerdem sollen die geplanten Änderungen Data Races und Deadlocks verhindern.

Einen ausführlichen Einblick in die geplanten Neuerungen bietet die Roadmap im Swift-Blog. Dort finden sich auch Verlinkungen zu den jeweils besprochenen Proposals, die den Entwicklungsstand der einzelnen Features genauer aufschlüsseln. Anfang 2020 hatte sich der Chefentwickler für Swift, Ted Kremenek, bereits allgemeiner zu Apples Plänen für die Programmiersprache geäußert. Manche nun konkreter werdende Änderungen klangen in dieser Zukunftsmusik bereits an: Während Swift den 5.x-Zweig weiter pflegt, laufen im Hintergrund schon seit geraumer Zeit die Arbeiten an Swift 6. Swift liegt derzeit in Version 5.3 vor, die im September erschienen ist – damaliges Highlight waren die erweiterte Syntax und Änderungen am Paketmanager.

(sih)