Реліз мови програмування Nim 1.6.0

Після року розробки опубліковано реліз мови системного програмування Nim 1.6, який використовує статичну типізацію та створений з огляду на Pascal, C++, Python та Lisp. Вихідний код на мові Nim компілюється на представлення на C, C++ або JavaScript. Надалі отриманий C/C++ код компілюється виконуваний файл за допомогою будь-якого доступного компілятора (clang, gcc, icc, Visual 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» для вибіркового застосування ефектів. when defined(nimHasEffectsOf): {.experimental: «strictEffects».} else: {.pragma: effectsOf.} proc mysort(s: seq; cmp: proc(a, b: T): int) {.effectsOf: cmp. }
  • Запропоновано новий синтаксис імпорту «import foo {.all.}», що дозволяє імпортувати як публічні, а й приватні символи. Для доступу до приватних полів об'єктів додані модуль std/importutils та API privateAccess. from system {.all.} як system2 import nil echo system2.ThisIsSystem import os {.all.} echo weirdTarget
  • Додано експериментальну підтримку операторів, що починаються з точки, які можна використовувати для реалізації динамічних полів. import std/json template '.?'(a: JsonNode, b: untyped{ident}): JsonNode = a[astToStr(b)] let j = %*{«a1»: {«a2»: 10}} assert j.?a1.?a2.getInt == 10
  • У аргументах блоку можна вказати додаткові параметри. template fn(a = 1, b = 2, body1, body2) = discard fn(a = 1): bar1 do: bar2
  • Реалізовано підтримку літералів, визначених користувачем (наприклад «-128'bignum'»). func ``big`*(num: cstring): JsBigInt {.importjs: "BigInt(#)".} assert 0xffffffffffffffff'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). Налагоджено тестування модулів stdlib з бекендами C, JS та VM.
  • Додано підтримку чіпа 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

Додати коментар або відгук