Nim 编程语言版本 1.6.0

经过一年的开发,系统编程语言 Nim 1.6 发布了,它使用静态类型,并且是针对 Pascal、C++、Python 和 Lisp 创建的。 Nim 源代码被编译为 C、C++ 或 JavaScript 表示形式。 随后,使用任何可用的编译器(clang、gcc、icc、Visual C++)将生成的 C/C++ 代码编译为可执行文件,如果不考虑运行成本,这可以让您实现接近 C 的性能垃圾收集器。 与 Python 类似,Nim 使用缩进作为块分隔符。 支持用于创建特定领域语言(DSL)的元编程工具和功能。 项目代码是根据 MIT 许可证提供的。

新版本中的显着变化包括:

  • 添加了 iterable[T] 类以及迭代器的类型实现。 template sum[T](a: iterable[T]): T = var result: T for ai in a: result += ai result assert sum(iota(3)) == 0 + 1 + 2 # 或 'iota( 3).sum'
  • 添加了对“.effectsOf”注释的实验性支持,以选择性地应用效果。 定义时(nimHasEffectsOf): {.experimental: "strictEffects".} else: {.pragma:effectsOf.} proc mysort(s: seq; cmp: proc(a, b: T): int) {.effectsOf: cmp. }
  • 提出了一种新的导入语法“import foo {.all.}”,允许您不仅导入公共符号,还可以导入私有符号。 为了访问对象的私有字段,添加了 std/importutils 模块和 privateAccess API。 from system {.all.} as system2 import nil echo system2.ThisIsSystem import os {.all.} echo oddTarget
  • 添加了对点运算符的实验性支持,可用于实现动态字段。 导入 std/json 模板 '.?'(a: JsonNode, b: untyped{ident}): JsonNode = a[astToStr(b)] let j = %*{“a1”: {“a2”: 10}} 断言j.?a1.?a2.getInt == 10
  • 可以在块参数中指定其他参数。 模板 fn(a = 1, b = 2, body1, body2) = 丢弃 fn(a = 1): bar1 do: bar2
  • 已实现对用户定义文字的支持(例如,“-128'bignum'”)。 func `'big`*(num: cstring): JsBigInt {.importjs: "BigInt(#)".} 断言 0xffffffffffffff'big == (1'big shl 64'big) - 1'big
  • 编译器实现“--eval:cmd”命令来直接从命令行运行Nim命令,例如'nim -eval:"echo 1"'。
  • 为为 nimscript 后端创建您自己的扩展提供支持。
  • 错误消息已大大扩展以显示与错误相关的上下文。 实现了自定义编译器警告。
  • 显着提高了“--gc:arc”和“--gc:orc”垃圾收集器的性能。
  • 所有后端都提高了解析整数和浮点数的代码的准确性和性能。
  • 改进了 JS、VM 和 nimscript 后端与以前仅适用于 C 后端的模块(例如 std/prelude 模块)的兼容性。 使用 C、JS 和 VM 后端对 stdlib 模块进行测试已经建立。
  • 添加了对 Apple Silicon/M1 芯片、32 位 RISC-V、armv8l 和 CROSSOS 系统的支持。
  • 添加了模块 std/jsbigints、std/tempfiles 和 std/sysrand。 对 system、math、random、json、jsonutils、os、typetraits、wrapnils、lists 和 hashes 模块进行了重大改进。

来源: opennet.ru

添加评论