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

添加評論