La versió 1.6.0 del llenguatge de programació Nim

Després d'un any de desenvolupament, es va publicar el llançament del llenguatge de programació del sistema Nim 1.6, que utilitza la mecanografia estàtica i es va crear amb la mirada posada en Pascal, C++, Python i Lisp. El codi font de Nim es compila en una representació C, C++ o JavaScript. Posteriorment, el codi C/C++ resultant es compila en un fitxer executable mitjançant qualsevol compilador disponible (clang, gcc, icc, Visual C++), que us permet aconseguir un rendiment proper al C, si no teniu en compte els costos d'execució. el recol·lector d'escombraries. De manera similar a Python, Nim utilitza el sagnat com a delimitadors de blocs. S'admeten eines de metaprogramació i capacitats per crear llenguatges específics de domini (DSL). El codi del projecte es proporciona sota la llicència MIT.

Els canvis notables en la nova versió inclouen:

  • S'ha afegit la classe iterable[T] amb una implementació de tipus per a iteradors. plantilla suma[T](a: iterable[T]): T = var resultat: T per ai en a: resultat += ai resultat assert sum(iota(3)) == 0 + 1 + 2 # o 'iota( 3).sum'
  • S'ha afegit suport experimental per a les anotacions ".effectsOf" per aplicar efectes de manera selectiva. quan es defineix (nimHasEffectsOf): {.experimental: "strictEffects".} else: {.pragma: effectsOf.} proc mysort(s: seq; cmp: proc(a, b: T): int) {.effectsOf: cmp. }
  • S'ha proposat una nova sintaxi d'importació "import foo {.all.}", que us permet importar no només símbols públics, sinó també privats. Per accedir als camps privats dels objectes, s'han afegit el mòdul std/importutils i l'API privateAccess. des del sistema {.all.} com a system2 importació nil echo system2.ThisIsSystem importació os {.all.} echo weirdTarget
  • S'ha afegit suport experimental per a operadors de punts, que es pot utilitzar per implementar camps dinàmics. import std/json template '.?'(a: JsonNode, b: untyped{ident}): JsonNode = a[astToStr(b)] let j = %*{“a1”: {“a2”: 10}} assert j.?a1.?a2.getInt == 10
  • Es poden especificar paràmetres addicionals als arguments de bloc. plantilla fn(a = 1, b = 2, cos1, cos2) = descartar fn(a = 1): barra1 fer: barra2
  • S'ha implementat el suport per a literals definits per l'usuari (per exemple, "-128'bignum'"). func `'big`*(num: cstring): JsBigInt {.importjs: "BigInt(#)".} assert 0xffffffffffffff'big == (1'big shl 64'big) - 1'big
  • El compilador implementa l'ordre “—eval:cmd” per executar directament ordres Nim des de la línia d'ordres, per exemple, “nim —eval:”echo 1″‘.
  • S'ha proporcionat suport per crear les seves pròpies extensions per al backend nimscript.
  • Els missatges d'error s'han ampliat molt per mostrar el context associat a l'error. S'han implementat avisos de compilador personalitzats.
  • Rendiment millorat significativament dels col·lectors d'escombraries "--gc:arc" i "--gc:orc".
  • Tots els backends han millorat la precisió i el rendiment del codi per analitzar nombres enters i nombres de coma flotant.
  • Compatibilitat millorada dels backends JS, VM i nimscript amb mòduls que abans només funcionaven amb el backend C (per exemple, el mòdul std/prelude). S'han establert proves de mòduls stdlib amb backends C, JS i VM.
  • S'ha afegit suport per a xip Apple Silicon/M1, sistemes RISC-V de 32 bits, armv8l i CROSSOS.
  • S'han afegit mòduls std/jsbigints, std/tempfiles i std/sysrand. S'han fet millores significatives als mòduls de sistema, math, random, json, jsonutils, os, typetraits, wrapnils, llistes i hash.

Font: opennet.ru

Afegeix comentari