GC : ORC
Un nouvel algorithme de comptage de référence appelé ARC a d'abord été livré avec Nim 1.2. Selon l’équipe Nim, ARC fonctionne avec la totalité de la bibliothèque standard, à l'exception de l'implémentation actuelle de la fonction async, car elle introduit des cycles que ARC ne gère pas. Il y a toutefois d'autres implémentations d'async en cours de développement qui n'introduisent pas de cycles. Pour résoudre ce problème, l’équipe a introduit ORC. Il s’agit de l'algorithme ARC existant plus un collecteur de cycles. Selon l’équipe, --gc:orc constitue la principale nouveauté de cette version.
Les fonctions strictes
Une fonction f est dite stricte si, lorsqu'elle est appliquée à une expression non terminale, elle ne se termine pas non plus. Une fonction stricte dans la sémantique de dénotation des langages de programmation est une fonction f, où f(v)=v . L'entité v, appelée bottom, désigne une expression qui ne renvoie pas une valeur normale, soit parce qu'elle bouge sans fin, soit parce qu'elle s'interrompt en raison d'une erreur telle que la division par zéro. Une fonction qui n'est pas stricte est appelée non stricte. Intuitivement, les fonctions non strictes correspondent à des structures de contrôle.
Sur le plan opérationnel, une fonction stricte est une fonction qui évalue toujours son argument ; une fonction non stricte est une fonction qui pourrait ne pas évaluer certains de ses arguments. Les fonctions ayant plus d'un paramètre peuvent être strictes ou non strictes dans chaque paramètre indépendamment, ainsi que conjointement strictes dans plusieurs paramètres simultanément. Un langage de programmation strict est un langage dans lequel les fonctions définies par l'utilisateur sont toujours strictes.
Selon l’équipe, il ne s’agit ici que d’une fonctionnalité expérimentale. Elle est disponible via le commutateur {.experimental: "strictFuncs".}--experimental:strictFuncs ou via pragma dans votre code. Elle introduit une définition plus stricte d'un “effet secondaire" : si un objet est accessible via un paramètre qui n'est pas déclaré comme paramètre var, toute mutation de cet objet compte comme un effet secondaire.
Ajouts et modifications de la bibliothèque standard
- ajout de quelques améliorations au module std/jsonutils ;
- ajout d'une possibilité de désérialiser les tableaux JSON directement en types HashSet et OrderedSet et respectivement de sérialiser ces types en tableaux JSON via les procédures jsonutils.fromJson et jsonutils.toJson ;
- ajout d'une possibilité de désérialiser les objets nuls JSON en objets d'option Nim et respectivement de sérialiser l'objet d'option Nim en objet JSON “if isSome” ou en objet JSON null “if isNone” via les procédures jsonutils.fromJson et jsonutils.toJson ;
- ajout d'un paramètre Joptions à jsonutils.fromJson contenant actuellement deux options booléennes allowExtraKeys et allowMissingKeys ;
- si allowExtraKeys est True, alors l'objet de Nim vers lequel JSON est analysé n'a pas besoin d'avoir un champ pour chaque clé JSON ;
- si allowMissingKeys est True, alors l'objet de Nim sur lequel le JSON est analysé est autorisé à avoir des champs sans clés JSON correspondantes ;
- ajout de bindParams, bindParam à db_sqlite pour lier les paramètres dans une instruction SqlPrepared ;
- ajout de tryInsert,insert procs à db_*libs qui accepte le nom de la colonne de la clé primaire ;
- ajout du support xmltree.newVerbatimText pour créer des styles et du texte de script ;
- ajout de “DOM Parser” au module “dom” pour la cible JavaScript ;
- le hachage par défaut pour Ordinal a changé pour quelque chose de plus brouillé. import hashes ; proc hash(x: myInt) : Hash = hashIdentity(x) récupère l'ancien dans un contexte d'instanciation tandis que -d:nimIntHash1 le récupère globalement ;
- les descripteurs de fichiers créés à partir d'abstractions de haut niveau dans la stdlib ne seront plus hérités par les processus enfants. En particulier, ces modules sont affectés : asyncdispatch, asyncnet, system, nativesockets, net et selectors ;
- les descripteurs de fichiers créés pour la comptabilité interne par ioselector_kqueue et ioselector_epoll ne seront plus divulgués aux processus enfants ;
- etc.
Changements au niveau du compilateur
- les avertissements spécifiques peuvent désormais être transformés en erreurs via --warningAsError[X]:on|off ;
- les pragmatismes define et undef ont été dévalorisés ;
- ajout d’une nouvelle commande : “nim r main.nim [args...]” qui compile et exécute main.nim, et implique --usenimcache de sorte que la sortie est enregistrée dans $nimcache/main$exeExt, en utilisant la même logique que nim c -r pour éviter les recompilations lorsque les sources ne changent pas ;
- ajout du nouveau hint --hint:msgOrigin qui montre où un message de compilation (hint|warning|error) a été généré ; cela aide en particulier lorsqu'il n'est pas évident de savoir d'où il vient, soit parce que plusieurs endroits génèrent le même message, soit parce que le message implique un formatage d'exécution ;
- ajout du nouveau drapeau --backend:js|c|cpp|objc (ou -b:js etc), pour modifier le backend ; peut être utilisé avec n'importe quelle commande (par exemple nim r, doc, check etc.) ;
- ajout du nouveau drapeau --doccmd:cmd pour passer des drapeaux supplémentaires pour les RunnableExamples, par exemple : --doccmd:-d:foo --threads use --doccmd:skip pour passer les RunnableExamples et les premiers snippets de test ;
- etc.
Source : Note de version Nim 1.4.0
Et vous ?
Qu'en pensez-vous ?
Voir aussi
La première version finale de Nim, le langage doté d'un transcompilateur vers C, C++, JavaScript est disponible, avec des ajouts
Nim 1.2 est disponible, le langage de programmation introduit plusieurs nouvelles macros pour gérer certaines tâches courantes
Nim 0.12 : un langage multiparadigme rapide qui s'approche de sa première version finale avec l'inclusion d'une machine virtuelle