Sortie du langage de programmation Nim 1.6.0

Après un an de développement, la version du langage de programmation système Nim 1.6 a été publiée, qui utilise le typage statique et a été créé en tenant compte de Pascal, C++, Python et Lisp. Le code source de Nim est compilé dans une représentation C, C++ ou JavaScript. Par la suite, le code C/C++ résultant est compilé dans un fichier exécutable à l'aide de n'importe quel compilateur disponible (clang, gcc, icc, Visual C++), ce qui permet d'atteindre des performances proches du C, si l'on ne prend pas en compte les coûts d'exécution. le éboueur. Semblable à Python, Nim utilise l'indentation comme délimiteurs de blocs. Les outils de métaprogrammation et les capacités de création de langages spécifiques à un domaine (DSL) sont pris en charge. Le code du projet est fourni sous licence MIT.

Les changements notables dans la nouvelle version incluent :

  • Ajout de la classe iterable[T] avec une implémentation de type pour les itérateurs. modèle sum[T](a: itérable[T]) : T = var résultat : T pour ai dans a : résultat += ai résultat assert sum(iota(3)) == 0 + 1 + 2 # ou 'iota( 3).somme'
  • Ajout d'un support expérimental pour les annotations ".effectsOf" pour appliquer sélectivement des effets. une fois défini (nimHasEffectsOf) : {.experimental : "strictEffects".} else : {.pragma : effetsOf.} proc mysort(s : seq ; cmp : proc(a, b : T) : int) {.effectsOf : cmp. }
  • Une nouvelle syntaxe d'importation « import foo {.all.} » a été proposée, vous permettant d'importer non seulement des symboles publics, mais également privés. Pour accéder aux champs privés des objets, le module std/importutils et l'API privateAccess ont été ajoutés. du système {.all.} en tant que system2 import nil echo system2.ThisIsSystem import os {.all.} echo bizarreTarget
  • Ajout d'un support expérimental pour les opérateurs de points, qui peuvent être utilisés pour implémenter des champs dynamiques. importer le modèle std/json '.?'(a : JsonNode, b : untyped{ident}) : JsonNode = a[astToStr(b)] let j = %*{« a1 » : {« a2 » : 10}} assert j.?a1.?a2.getInt == 10
  • Des paramètres supplémentaires peuvent être spécifiés dans les arguments de bloc. modèle fn(a = 1, b = 2, body1, body2) = rejeter fn(a = 1) : bar1 faire : bar2
  • La prise en charge des littéraux définis par l'utilisateur a été implémentée (par exemple, "-128'bignum'"). func `'big`*(num : cstring) : JsBigInt {.importjs : "BigInt(#)".} assert 0xffffffffffffff'big == (1'big shl 64'big) - 1'big
  • Le compilateur implémente la commande "--eval:cmd" pour exécuter directement les commandes Nim depuis la ligne de commande, par exemple 'nim -eval:"echo 1"'.
  • Prise en charge de la création de vos propres extensions pour le backend nimscript.
  • Les messages d'erreur ont été considérablement développés pour montrer le contexte associé à l'erreur. Implémentation d'avertissements personnalisés du compilateur.
  • Performances considérablement améliorées des récupérateurs de place "--gc:arc" et "--gc:orc".
  • Tous les backends ont amélioré la précision et les performances du code pour analyser les nombres entiers et les nombres à virgule flottante.
  • Compatibilité améliorée des backends JS, VM et nimscript avec des modules qui ne fonctionnaient auparavant qu'avec le backend C (par exemple, le module std/prelude). Les tests des modules stdlib avec les backends C, JS et VM ont été établis.
  • Ajout de la prise en charge de la puce Apple Silicon/M1, des systèmes RISC-V 32 bits, armv8l et CROSSOS.
  • Ajout des modules std/jsbigints, std/tempfiles et std/sysrand. Des améliorations significatives ont été apportées aux modules système, mathématiques, aléatoires, json, jsonutils, os, typetraits, wrapnils, listes et hachages.

Source: opennet.ru

Ajouter un commentaire