IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Apple publie la version 5.5 de Swift avec le mot-clé async pour corriger la "pyramide condamnée",
Ainsi que d'autres changements dans une "version massive"

Le , par Bill Fassinou

161PARTAGES

6  0 
Apple a publié ce lundi Swift 5.5, la dernière version de son langage de programmation open source pour la création d'applications sur iOS, macOS, watchOS et tvOS. Décrite comme une "version massive", la version 5.5 de Swift comprend les mots-clés async/await, des collections de paquets et une interopérabilité Objective-C améliorée. Swift 5.5 comporte de nouvelles fonctionnalités particulièrement intéressantes pour les développeurs qui cherchent à utiliser la concurrence pour accélérer leurs applications.

Swift 5.5 introduit les fonctions async/await

Les fonctions asynchrones constituent l'un des principaux ajouts de Swift 5.5. L'un des problèmes de l'approche antérieure de Swift en matière de concurrence était que lorsqu'un développeur écrivait plusieurs opérations asynchrones, il en résultait une "pyramide condamnée" (pyramid of doom) - des appels imbriqués difficiles à suivre, qui rendaient le contrôle du flux et la gestion des erreurs problématiques "parce que le mécanisme naturel de gestion des erreurs de Swift ne peut pas être utilisé. La solution a été d'adopter le modèle async/await tel qu'il est vu dans le C# de Microsoft (inspiré par les flux de travail asynchrones de F#).

Marquées par le mot-clé async et appelées par await, les fonctions asynchrones fonctionnent de manière similaire aux fonctions asynchrones de Python et de JavaScript. Swift prend désormais en charge du code comme celui-ci :

Code Swift : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
  
func loadWebResource(_ path: String) async throws -> Resource 
func decodeImage(_ r1: Resource, _ r2: Resource) async throws -> Image 
func dewarpAndCleanupImage(_ i : Image) async throws -> Image 
  
func processImageData() async throws -> Image { 
  let dataResource  = try await loadWebResource("dataprofile.txt") 
  let imageResource = try await loadWebResource("imagedata.dat") 
  let imageTmp      = try await decodeImage(dataResource, imageResource) 
  let imageResult   = try await dewarpAndCleanupImage(imageTmp) 
  return imageResult 
}

Avant leur introduction, les programmeurs devaient utiliser des fermetures de complétion pour s'assurer que les fonctions ne se bloquaient pas mutuellement, ce qui rendait le code quelque peu difficile à lire et sujet aux erreurs. Les fonctions asynchrones sont censées remédier à ce problème, ainsi qu'une longue liste de fonctions de concurrence qui ont également été intégrées dans la dernière version du langage. Par exemple, Swift 5.5 ajoute un protocole AsyncSequence, qui vise à rendre l'itération sur des séquences de valeurs asynchrones aussi facile que le bouclage de son équivalent synchrone.

L'utilisation est donc très proche de celle d'une séquence ordinaire, bien que la méthode next() soit ici asynchrone. Pour faciliter la combinaison de code synchrone et de tâches asynchrones, il existe également ce que l'on appelle des continuations qui permettent aux tâches de se suspendre, mais qui transmettent également une valeur que le code synchrone peut utiliser pour relancer la tâche.

https://youtu.be/6C0SFPEy_0Y

Comme l'asynchronisme ne suffit pas à faire un programme concurrent, l'équipe a mis en œuvre une proposition de concurrence structurée, qui stipule que "toutes les fonctions asynchrones s'exécutent dans le cadre d'une tâche asynchrone". Toutes les tâches peuvent créer des tâches enfant qui s'exécutent simultanément, de sorte qu'il y a une hiérarchie dans le système et, avec elle, une façon de partager l'information qui est censée rendre la construction "pratique à gérer".

L'interopérabilité avec Objective-C et les "acteurs"

Selon l'équipe, les fermetures anonymes sont implicitement asynchrones si elles contiennent une expression [C=Swift]await[/B]. Ce nouveau modèle de concurrence améliorera également l'interopérabilité avec Objective-C, l'ancien langage d'Apple. Objective-C dispose de méthodes de gestion de l'achèvement (completion-handler methods) qui seront traduites en méthodes asynchrones dans Swift, et les méthodes asynchrones de Swift peuvent également être exportées en tant que méthodes de gestion de l'achèvement. En outre, un deuxième élément clé du modèle de concurrence de Swift est les acteurs.

Décrits comme un type de référence qui protège l'accès à son état mutable, les acteurs sont introduits avec le mot-clé actor. Selon l'équipe, les acteurs sont similaires aux classes, mais s'assurent que les états mutables ne sont accessibles que par un seul thread à la fois. « Parce qu'ils sont incarnés par une abstraction de file d'attente (interne), vous communiquez avec les acteurs de manière asynchrone, et ils garantissent que les données qu'ils protègent ne sont touchées que par le code s'exécutant sur cette file d'attente. On obtient ainsi un îlot de sérialisation dans une mer de concurrence », a déclaré l'inventeur de Swift, Chris Lattner.

Pour illustrer le problème que les acteurs résolvent, considérons ce code Swift qui crée une classe RiskyCollector capable d'échanger des cartes de son jeu avec un autre collecteur :...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !