- La gestion mémoire ORC devient la valeur par défaut
- Le backend JavaScript utilise désormais BigInt par défaut pour
int64etuint64; les codes interagissant avec le backend JS et utilisant ces types peuvent nécessiter une mise à jour --experimental:strictEffectsest toujours activé, et les paramètres de callback nécessitent l’annotationeffectsOf- Le langage de balisage par défaut des commentaires de documentation passe de l’ancien mode
RstMarkdownà Markdown, avec l’ajout du pragma{.doctype: Markdown | RST | RstMarkdown.}et des commandesmd2htmletrst2html - Certaines fonctionnalités liées à
osde la bibliothèque standard sont séparées dans de nouvelles interfaces utilisant l’abstractionPath, fournies via les modulesstd/oserrors,std/envvars,std/paths,std/dirs,std/files,std/symlinks,std/appdirsetstd/cmdline - Plusieurs modules de la bibliothèque standard ont été déplacés vers des paquets Nimble ; l’utilisation de
std/punycode,std/asyncftpclient,std/smtp,std/db_*,std/md5,std/sha1oustd/sumsnécessite l’installation vianimbleouatlas - L’utilisation d’un
breaksans nom dans unblocksans nom est dépréciée et deviendra une erreur dans une prochaine version - La définition de
"strictFuncs"change afin d’interdire les affectations via déréférencement derefouptr - Le dépaquetage de tuples dans les variables est traité comme du sucre syntaxique développé en plusieurs affectations, et le dépaquetage de tuples imbriqués devient possible
- L’inférence top-down a été implémentée dans plusieurs cas courants, ce qui permet de compiler le code d’initialisation
seq[(float, byte, cstring)]de l’exemple - Des valeurs par défaut peuvent être définies pour les champs d’objets ; elles sont utilisées pour les champs qui ne sont pas initialisés explicitement
- Le commutateur expérimental
strictDefsest ajouté afin de vérifier qu’une valeur a été explicitement affectée à une variable avant son utilisation, et qu’une variableletest affectée exactement une fois - L’interopérabilité C++ ajoute le pragma
virtualet un pragmaconstructorétendu, permettant de définir des constructeurs et des proc virtuelles correspondant aux constructeurs et méthodes virtuelles C++ - Nimble 0.14 est inclus, avec prise en charge des lock-files, et l’emplacement de stockage des bibliothèques passe de
$nimbleDir/pkgsà$nimbleDir/pkgs2
1 commentaires
Avis sur Hacker News
J’utilise Nim en production avec satisfaction. Je crée surtout des outils d’analyse de données et de génération de rapports, compilés en exécutables CLI appelés par des scripts serveur.
Nim produit des exécutables rapides et petits, et ses structures de données JSON hétérogènes ainsi que ses bibliothèques de dataframes sont bonnes. Il privilégie fortement la pile : même les structures de données dynamiques comme les séquences et les tables ont un pointeur sur la pile qui pointe vers les données sur le tas, et leur durée de vie est gérée par la frame de pile.
Il y a très peu de références dynamiques dans le programme, et je n’ai pas à me soucier du GC. Le système de types est simple et raisonnable, et guide facilement vers du code correct. Les valeurs par défaut sont aussi proches de la transparence référentielle : sauf à s’en écarter explicitement, tout est immuable et passé par valeur.
Les génériques sont puissants et se comportent comme prévu, et la syntaxe d’appel de fonction universelle est incroyablement utile. Il suffit de créer des procédures et fonctions qui prennent un type donné en premier argument pour écrire l’équivalent de méthodes ou d’interfaces, ce qui rend ces abstractions inutiles et garde une structure de code simple et plate.
C’est aussi agréable que lorsque j’avais découvert D, voire mieux. Si vous imaginez un Python compilé en natif, annoté avec des types, dont presque 100 % est de la logique métier et sans superflu, vous serez proche de l’expérience Nim.
J’ai hâte d’essayer cette version. Avec 25 ans de programmation professionnelle derrière moi, je considère que Nim réunit très bien le meilleur de plusieurs mondes.
Il est aussi facile à utiliser que Python, fortement typé mais avec une excellente inférence de types, et ses valeurs par défaut sont rapides et sûres. Il convient aussi bien à l’embarqué qu’au calcul haute performance.
Grâce à l’UFCS, aux génériques et aux concepts, on obtient les avantages de la POO tout en ayant moins besoin d’écrire du code d’échafaudage qui empile sans fin des relations de données fragiles pour organiser les choses. Contrairement à Python, les ambiguïtés deviennent des erreurs de compilation.
J’ai l’impression qu’un même programme est beaucoup plus petit, lisible et facile à comprendre que dans la plupart des autres langages. Il n’y a pas non plus beaucoup de magie en arrière-plan, parce que les valeurs par défaut ont du sens.
La métaprogrammation à la compilation est d’un autre niveau. Elle est au cœur de la conception du langage, sans dialecte séparé ni bricolages de substitution, et elle est intuitive à utiliser. Par exemple, il est facile de générer du code de parsing personnalisé à partir de fichiers, ce qui supprime du boilerplate répétitif, et la compilation reste rapide.
Grâce à son excellent système de types, il est plus facile d’écrire correctement qu’en Python, tout en offrant des performances comparables à C/C++, et il est très simple à déployer sous forme de petits exécutables autonomes.
Il dispose d’ABI natives pour C, C++, ObjC et JS, d’un excellent FFI, ainsi que d’une bonne interopérabilité avec Python. On peut utiliser directement les écosystèmes existants sans les réécrire.
Imaginez écrire du pseudo-code de style Python pour un ESP32, très efficace avec très peu d’effort, tout en pouvant descendre au contrôle bare metal quand vous le souhaitez. Ou écrire une application web avec le backend et le frontend dans le même langage efficace, créer un jeu de bullet hell rapide, tout en n’ayant pas à vous soucier du GC parce que, sauf indication contraire, l’allocation se fait sur la pile.
D’un point de vue business aussi, le fait de prototyper aussi vite qu’en Python mais d’obtenir déjà quelque chose d’assez rapide et léger pour la production a beaucoup de valeur. Cela peut devenir l’arme secrète d’une entreprise.
Ce que j’aime vraiment, c’est pouvoir gérer moi-même l’environnement C sous-jacent, tout en utilisant par-dessus un langage moderne de haut niveau qui prend très bien en charge des choses comme JSON en tant que citoyens de première classe. Même en aimant Python, je trouve que Nim est meilleur, un meilleur Python.
En particulier, j’aimerais savoir à quel point l’interopérabilité JS est confortable pendant le développement, et si cela va au-delà de la compilation de Nim en JS comme bibliothèque autonome. Peut-on appeler directement les API du navigateur depuis Nim, ou via des wrappers assez simples ?
Malgré tout, en environ 4 ans, il n’y a pas eu de grosse régression de performance ni de changements nécessaires.
Félicitations à toutes les personnes impliquées et à toute la communauté Nim. J’utilise Nim comme langage principal depuis 10 ans, et j’aime beaucoup les nouveautés de Nim 2.0.
Certaines changent vraiment la donne pour mes projets. Par exemple, les valeurs par défaut des objets pourraient en théorie permettre à Norm[1] de fonctionner non seulement avec des instances d’objets, mais aussi avec des types d’objets. Sans les nouvelles énumérations surchargeables, Karkas[2] aurait été tout simplement impossible. C’est encore en cours de travail.
[1] https://norm.nim.town
[2] https://karkas.nim.town
Nim est un très bon langage pour écrire du logiciel. On peut livrer rapidement et développer avec plaisir tout en produisant des logiciels très performants.
Cela dit, d’après mon expérience, il reste encore quelques aspérités. Il faut aligner le compilateur C/C++ et ses options, les messages d’erreur sont très pauvres, et certaines bibliothèques ne fonctionnent que sur des configurations et systèmes précis. Mais compte tenu de la petite taille de la communauté, il est difficile de trop lui en vouloir. L’intégration VS Code fonctionnait bien et plantait très rarement.
Si Manning Publications tombe là-dessus, j’aimerais qu’un livre à jour sur la dernière version de Nim voie le jour, et qu’ils envisagent une autre mise en page avec une police plus lisible
J’ai acheté l’excellent livre de Dominik Picheta, mais l’édition papier était trop difficile à lire à cause de la finesse de la police, même avec des lunettes adaptées, et j’ai dû utiliser le PDF. Les composants de la police, comme les traits et les fûts, sont trop fins
Je me suis demandé si c’était mon problème parce que je vieillissais, alors j’ai comparé avec l’édition originale de K&R 2e édition, et ce livre reste parfaitement lisible
Reddit a écrit un billet sur la façon dont ils utilisent Nim : https://www.reddit.com/r/RedditEng/comments/yvbt4h/why_i_enj...
De plus en plus de grandes entreprises et de startups adoptent Nim. Nim 2.0 me rend très enthousiaste, et un grand merci à toutes les personnes qui y ont contribué
Même si c’est anecdotique, peut-on avoir quelques noms d’entreprises ?
Nim est mon langage préféré depuis un moment, et je suis très enthousiaste de voir enfin la 2.0 sortir. Beaucoup des fonctionnalités de cette version étaient attendues depuis longtemps
Le seul inconvénient, comme mentionné tout en bas, est que certains modules inclus ont été déplacés vers des dépôts tiers. Ce n’est pas un gros problème, mais j’aimais bien que la prise en charge de SQLite soit intégrée à la bibliothèque. Dès qu’on commence à prendre en charge quelques bases de données, on subit forcément une pression pour en prendre en charge davantage. En revanche, je suis un peu surpris que même la prise en charge de MD5 et SHA1 ait été retirée
C’est bien que la gestion des chemins ou du logging soit dans le standard, mais certaines choses doivent rester tierces pour pouvoir mieux évoluer
Félicitations à toutes les personnes concernées. Nim me semble vraiment être un langage passionnant
J’essaie de trouver une raison de l’utiliser au travail. Mon activité touche au mobile, donc le fait de pouvoir compiler vers JS et ObjC est séduisant, mais pour l’instant je n’ai pas dépassé le stade des expérimentations. Comparé à Rust, il est beaucoup plus simple de s’y mettre
Cela fonctionne en créant des add-ons Node. C’est pratique pour réutiliser du code Nim dans des apps web ou pour du code critique en performance
J’ai regardé Nim il y a quelques mois, et côté fonctionnalités il y avait beaucoup de choses que j’aimerais voir dans Python. Par exemple l’interopérabilité facile avec C/C++, le typage statique, la compilation, ou encore la compilation croisée et l’exécution sur Android/iOS
Mais même si le langage n’est pas nouveau, l’écosystème reste petit. Il n’y a pas beaucoup de bibliothèques de haute qualité comme numpy, scipy, pandas ou opencv en Python. C’est dommage que de grands acteurs ne l’adoptent pas, et j’aurais aimé qu’Unreal Engine essaie d’adopter Nim plutôt que de créer son propre nouveau langage de scripting, Verse
Un autre point regrettable est l’absence d’interopérabilité immédiate avec les bibliothèques C/C++ sans devoir créer soi-même des adaptateurs. Ce serait bien de pouvoir simplement importer les headers et que ce soit terminé
J’aimerais aussi une interopérabilité aussi simple avec Rust. Cela pourrait favoriser l’adoption, et il est plus facile de trouver en Rust des crates multiplateformes de qualité qui fonctionnent sans trop de problèmes, même sur les appareils mobiles
Je crains que, d’ici quelques années, Python ne rattrape son retard avec un Python plus rapide, la suppression du GIL, nuitka et briefcase pour mobile, ou que Mojo ne prenne la place de Nim
Cela dit, Nim dispose de la bibliothèque nimpy, qui permet une interopérabilité presque transparente avec Python. Autrement dit, on peut simplement importer PyTorch, scipy ou opencv et les utiliser depuis Nim
Je me demande si certains ont une expérience concrète avec Nim et Zig. J’aimerais savoir en quoi ils se ressemblent et en quoi ils diffèrent. J’aimerais aussi voir des benchmarks de serveurs web idiomatiques pour les deux langages, sur la base de Nim v2.
Zig est bien aussi, et j’aime sa prise en charge des valeurs optionnelles ainsi que son approche de la gestion des erreurs. Mais la syntaxe bruyante pour exprimer une union d’erreur d’un pointeur optionnel vers un multi-pointeur de uint8, comme
!?[]u8, m’a rebutéDans la plupart du code qui nécessite de l’allocation dynamique, devoir préparer et passer un allocateur gêne aussi la logique principale. Même de petites opérations comme la concaténation ou le formatage de chaînes deviennent du travail
Zig n’a pas non plus de dispatch dynamique, ce qui rend difficile l’écriture de code polymorphe, et il faut contourner cela avec une forme de duck typing. Au final, j’ai conclu que Zig ne me convenait pas
[1] https://github.com/khaledh/axiom
[2] https://github.com/khaledh/axiom-zig
En regardant les exemples, on voit surtout le même code écrit dans plusieurs langages, ce qui donne une vue d’ensemble, mais côté fonctionnalités de langage cela ne fait qu’effleurer la surface. Par exemple, les exemples Zig n’utilisent pas les fonctionnalités
comptimeZig : https://github.com/floooh/sokol-zig/tree/master/src/examples
Nim : https://github.com/floooh/sokol-nim/tree/master/examples
Odin : https://github.com/floooh/sokol-odin/tree/main/examples
Rust : https://github.com/floooh/sokol-rust/tree/main/examples
Zig est plus ennuyeux, mais pour de bonnes raisons. Personnellement, je n’écrirais pas un OS en Nim, alors que Zig, une fois arrivé à maturité, semble excellent pour cet usage. J’ai commencé à l’utiliser pour du logiciel embarqué
Nim, je l’utiliserais pour des outils CLI, des applications serveur, et peut-être aussi des applications GUI et des jeux
L’équipe Zig semble investir beaucoup plus d’efforts dans toute l’infrastructure du compilateur, et d’après mon expérience c’est vraiment impressionnant. Il y a d’excellentes innovations
Zig est un langage beaucoup plus focalisé, qui vise un créneau précis : être un successeur et un remplaçant de C, et il atteint très bien cet objectif
Je pense que les préférences de langage dépendent des besoins et envies personnels que le langage qu’on utilise actuellement ne satisfait pas. Je me suis installé du côté de Zig parce que son approche de successeur de C m’intéresse, mais je comprends aussi pourquoi d’autres choisissent Nim