Pourquoi Swift séduit-il ?

Quelques heures après l’annonce surprise du langage Swift, suite aux premières démonstrations, et une fois réalisée la prise en main, les réactions des développeurs sont plutôt positives et enthousiastes. Et pourtant, proposer un nième langage de programmation en 2014 aurait dû produire une forte crispation :

  • On n’a pas attendu Apple pour définir le langage idéal.
  • Pourquoi ne pas simplement puiser dans le choix existant ?
  • Former les programmeurs, adapter les codes sources une nouvelle fois représente en fait une perte de temps et d’argent.

Puisque ce n’est pas le cas, nous allons essayer d’expliquer ce mystère…

Tout d’abord, en parcourant les évolutions d’Objective-C, durant presque 30 années d’existence, on peut réaliser qu’il y a une grande cohérence avec un objectif constant dans les ingrédients ajoutés. Aujourd’hui on soulève juste le couvercle et tout le monde peut goûter aux saveurs, mais, en fait, le Swift aux petits oignons mijote déjà depuis très longtemps !

Une analyse du code plus puissante

Un premier pas essentiel a été posé lorsque Apple a remplacé progressivement le compilateur gcc par llvm. Il était alors possible d’analyser finement le code source au point de :

  • déterminer le comportement d’un morceau de code et d’en souligner les éventuelles incohérences avant même l’exécution de ces instructions au sein d’une application,
  • proposer la correction automatique d’erreurs d’écriture telles que l’oubli d’un point-virgule ou un mauvais typage de variable.

La détermination du comportement se retrouve aujourd’hui dans le Playground. Face à chaque ligne, Swift indique le résultat obtenu, permettant ainsi de repérer instantanément les défauts de fonctionnement sans avoir besoin de créer une application complète.

Le résultat n’est pas simplement alphanumérique mais aussi graphique, comme l’était déjà la fonction Preview dans le débogueur Xcode.

playground

La correction automatique suggère que llvm sait comprendre la signification des instructions en dépit de quelques erreurs de syntaxe. Il est donc possible de simplifier cette syntaxe puisque l’information essentielle est exprimée sans la parenthèse ou le point virgule dont est si friand le C ! C’est exactement ce que propose Swift : assouplir l’écriture pour ne plus imposer au développeur débutant une rigueur qui peut être compensée par une analyse plus fine fournie par l’environnement de développement.

Cette souplesse d’écriture était aussi dans les gènes d’AppleScript, l’autre grand langage « inventé » par Apple. Ainsi, voici deux expressions possibles d’une même instruction avec AppleScript :

get first character of every paragraph of the text of the front document of application "TextEdit"

ou bien :

character 1 of every paragraph of text in document 1 of application "TextEdit"

C’est ce genre de facilité qui offre un cadre vraiment propice à un novice.

Si l’on souhaite exprimer ces instructions Objective-C

NString *oc = @"Hello";
oc = [oc stringByAppendingString:@" world"];

On pourra donc écrire en Swift calquant Objective-C :

var swiftObjC: NSString = "Hello"
swiftObjC = swiftObjC.stringByAppendingString(" world")

Ou bien en Swift plus léger :

var swift = "Hello"
swift += " world"

Le résultat est bien sûr identique, l’efficacité est strictement la même, cependant la dernière forme est beaucoup plus attrayante.

La révolution ARC

Le second pas a été accompli avec l’Automatic Reference Counting (ARC) : le compilateur est alors capable de déterminer les cycles de vie des objets et de générer automatiquement les instructions de libération de la mémoire. C’est une étape décisive : l’environnement de développement produit désormais un code plus rigoureux et plus efficace que celui d’un développeur expérimenté !

Swift généralise cette rigueur et cette efficacité à toutes les propriétés et remplace la méthode dealloc par deinit. Les variables d’instances qui implémentaient les propriétés avec Objective-C sont désormais masquées au profit de nouvelles méthodes willSet et didSet qui permettent d’encadrer le stockage effectif d’une nouvelle valeur dans une propriété. Ce schéma autorise par ailleurs une mise en œuvre beaucoup plus performante du Key Value Observing.

En complément de l’efficacité, ARC a introduit une compatibilité avec les environnements moins modernes : une application peut mélanger du code avec gestion automatique et avec gestion manuelle de la mémoire. Une application ARC est également capable de fonctionner sur iOS 4 qui était version précédant l’introduction de cette technologie. Swing reprend cette compatibilité avec du code Objective-C ou C et peut créer une application pour iOS 7.

Une réincarnation des plus belles réalisations

La filiation d’Objective-C avec C s’était faite au détriment de notions très appréciées en Pascal comme les déclarations de fonctions à l’intérieur des fonctions et leur passage en paramètre. Swift ré-introduit cette notion sans la lourdeur de déclaration des blocks dans les méthodes.

Aussi hérité d’Object-Pascal, le mot clé override permet de gérer plus efficacement l’écrasement d’une méthode par une autre.

Le plus déroutant pour un développeur de culture C sera sans doute la disparition de la notion d’interface et d’implémentation dans une déclaration unifiée, déjà bien connue en AppleScript, Java ou JavaScript.

Mais le retour le plus significatif est certainement la possibilité de jouer avec des morceaux de code dans playground à la manière des plus beaux environnements dynamiques tels que Lisp ou SmallTalk. Retrouver la souplesse des outils qui ont permis d’inventer la plupart des concepts actuels est sans doute le plus beau gage de créativité !

Un contexte favorable

Devant tant de qualité, on pourrait même se demander pourquoi Apple a tant tardé pour proposer des outils aussi modernes. Nous avons vu qu’il y avait déjà les avancés techniques de llvm mais il ne faut pas négliger non plus le poids de l’industrie du développement logiciel. Aujourd’hui Apple a atteint une masse critique suffisante dans cette industrie pour pouvoir se permettre une telle avancée. Introduire de front l’iPhone et un nouveau langage aurait été trop ambitieux, même pour Steve Jobs.

Enfin, n’oublions pas que la WWDC 2014 est également le théâtre d’annonces pour de nouveaux terrains de création logicielle : l’ambition d’HomeKit et de permettre à des acteurs spécialisés de la domotique d’assembler des solutions sans avoir le niveau d’un développeur C. Swift pourrait répondre à merveille à ce challenge.