Linguaxe de programación Nim versión 1.6.0

Despois dun ano de desenvolvemento, publicouse o lanzamento da linguaxe de programación do sistema Nim 1.6, que utiliza dixitación estática e foi creada con ollo en Pascal, C++, Python e Lisp. O código fonte de Nim compílase nunha representación C, C++ ou JavaScript. Posteriormente, o código C/C++ resultante compílase nun ficheiro executable mediante calquera compilador dispoñible (clang, gcc, icc, Visual C++), o que lle permite acadar un rendemento próximo ao C, se non se ten en conta os custos de execución. o colector de lixo. Similar a Python, Nim usa sangría como delimitadores de bloque. Admítense ferramentas e capacidades de metaprogramación para crear linguaxes específicas de dominio (DSL). O código do proxecto ofrécese baixo a licenza MIT.

Os cambios notables na nova versión inclúen:

  • Engadida a clase iterable[T] cunha implementación de tipo para iteradores. template sum[T](a: iterable[T]): T = var result: T for ai in a: result += ai result assert sum(iota(3)) == 0 + 1 + 2 # or 'iota( 3).suma'
  • Engadido soporte experimental para anotacións ".effectsOf" para aplicar efectos selectivamente. cando se define(nimHasEffectsOf): {.experimental: "strictEffects".} else: {.pragma: effectsOf.} proc mysort(s: seq; cmp: proc(a, b: T): int) {.effectsOf: cmp. }
  • Propúxose unha nova sintaxe de importación "import foo {.all.}", que lle permite importar non só símbolos públicos, senón tamén privados. Para acceder aos campos privados dos obxectos, engadíronse o módulo std/importutils e a API privateAccess. do sistema {.all.} como system2 import nil echo system2.ThisIsSystem import os {.all.} echo weirdTarget
  • Engadiuse soporte experimental para operadores de puntos, que se poden usar para implementar campos dinámicos. import std/json template '.?'(a: JsonNode, b: untyped{ident}): JsonNode = a[astToStr(b)] let j = %*{“a1”: {“a2”: 10}} assert j.?a1.?a2.getInt == 10
  • Pódense especificar parámetros adicionais en argumentos de bloque. modelo fn(a = 1, b = 2, corpo1, corpo2) = descartar fn(a = 1): barra1 facer: barra2
  • Implementouse o soporte para literais definidos polo usuario (por exemplo, "-128'bignum'"). func `'big`*(num: cstring): JsBigInt {.importjs: "BigInt(#)".} afirma 0xffffffffffffff'big == (1'big shl 64'big) - 1'big
  • O compilador implementa o comando "—eval:cmd" para executar directamente comandos de Nim desde a liña de comandos, por exemplo, "nim —eval:"echo 1"'.
  • Proporcionou soporte para crear as súas propias extensións para o backend nimscript.
  • As mensaxes de erro ampliáronse moito para mostrar o contexto asociado co erro. Implementáronse avisos do compilador personalizado.
  • Mellorouse significativamente o rendemento dos colectores de lixo "--gc:arc" e "--gc:orc".
  • Todos os backends melloraron a precisión e o rendemento do código para analizar números enteiros e números de coma flotante.
  • Compatibilidade mellorada dos backends JS, VM e nimscript con módulos que anteriormente só funcionaban co backend C (por exemplo, o módulo std/prelude). Establecéronse probas de módulos stdlib con backends C, JS e VM.
  • Engadido soporte para chip Apple Silicon/M1, RISC-V de 32 bits, armv8l e sistemas CROSSOS.
  • Engadidos módulos std/jsbigints, std/tempfiles e std/sysrand. Realizáronse melloras significativas nos módulos sistema, math, random, json, jsonutils, os, typetraits, wrapnils, lists e hash.

Fonte: opennet.ru

Engadir un comentario