Lanzamiento del lenguaje de programación Nim 1.6.0

Después de un año de desarrollo, se publicó el lanzamiento del lenguaje de programación de sistemas Nim 1.6, que utiliza tipificación estática y fue creado teniendo en cuenta Pascal, C++, Python y Lisp. El código fuente de Nim se compila en una representación C, C++ o JavaScript. Posteriormente, el código C/C++ resultante se compila en un archivo ejecutable utilizando cualquier compilador disponible (clang, gcc, icc, Visual C++), lo que permite alcanzar un rendimiento cercano al de C, si no se tienen en cuenta los costes de ejecución. el recolector de basura. Al igual que Python, Nim usa sangría como delimitador de bloques. Se admiten herramientas de metaprogramación y capacidades para crear lenguajes específicos de dominio (DSL). El código del proyecto se proporciona bajo la licencia MIT.

Los cambios notables en la nueva versión incluyen:

  • Se agregó la clase iterable[T] con una implementación de tipo para iteradores. plantilla suma[T](a: iterable[T]): T = var resultado: T para ai en a: resultado += resultado ai afirmar suma(iota(3)) == 0 + 1 + 2 # o 'iota( 3).suma'
  • Se agregó soporte experimental para anotaciones ".effectsOf" para aplicar efectos de forma selectiva. cuando se define (nimHasEffectsOf): {.experimental: "strictEffects".} else: {.pragma: EffectsOf.} proc mysort(s: seq; cmp: proc(a, b: T): int) {.effectsOf: cmp. }
  • Se ha propuesto una nueva sintaxis de importación "import foo {.all.}", que le permite importar no solo símbolos públicos sino también privados. Para acceder a campos privados de objetos, se han agregado el módulo std/importutils y la API privateAccess. desde el sistema {.all.} como sistema2 importar nil echo system2.ThisIsSystem importar os {.all.} echo rareTarget
  • Se agregó soporte experimental para operadores de puntos, que se pueden usar para implementar campos dinámicos. importar plantilla std/json '.?'(a: JsonNode, b: untyped{ident}): JsonNode = a[astToStr(b)] let j = %*{“a1”: {“a2”: 10}} afirmar j.?a1.?a2.getInt == 10
  • Se pueden especificar parámetros adicionales en los argumentos del bloque. plantilla fn(a = 1, b = 2, cuerpo1, cuerpo2) = descartar fn(a = 1): barra1 hacer: barra2
  • Se ha implementado soporte para literales definidos por el usuario (por ejemplo, "-128'bignum'"). func `'big`*(num: cstring): JsBigInt {.importjs: "BigInt(#)".} afirmar 0xffffffffffffff'big == (1'big shl 64'big) - 1'big
  • El compilador implementa el comando "--eval:cmd" para ejecutar comandos de Nim directamente desde la línea de comandos, por ejemplo 'nim -eval:"echo 1"'.
  • Se brindó soporte para crear sus propias extensiones para el backend de nimscript.
  • Los mensajes de error se han ampliado enormemente para mostrar el contexto asociado con el error. Se implementaron advertencias del compilador personalizado.
  • Rendimiento significativamente mejorado de los recolectores de basura "--gc:arc" y "--gc:orc".
  • Todos los backends han mejorado la precisión y el rendimiento del código para analizar números enteros y de punto flotante.
  • Compatibilidad mejorada de los backends JS, VM y nimscript con módulos que anteriormente solo funcionaban con el backend C (por ejemplo, el módulo std/prelude). Se han establecido pruebas de módulos stdlib con backends C, JS y VM.
  • Se agregó soporte para el chip Apple Silicon/M1, sistemas RISC-V de 32 bits, armv8l y CROSSOS.
  • Se agregaron módulos std/jsbigints, std/tempfiles y std/sysrand. Se han realizado mejoras significativas en los módulos del sistema, matemáticas, aleatorio, json, jsonutils, os, typetraits, wrapnils, listas y hashes.

Fuente: opennet.ru

Añadir un comentario