Релиз языка программирования Nim 1.5.0
После года разработки опубликован релиз языка системного программирования Nim 1.5, который использует статическую типизацию и создан с оглядкой на 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.} as 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.
Источник: http://www.opennet.ru/opennews/art.shtml? num=56029
© OpenNet