Вийшов реліз мови програмування Nim 1.6.0: що вдосконалили
Опубліковано реліз мови системного програмування Nim 1.6.0, який готували приблизно рік. Ця мова використовує статичну типізацію і створена з огляду на Pascal, C++, Python і Lisp.
Особливості мови Nim
Відомо, що вихідний код на мові 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.
Раніше на DOU вийшла стаття про цю мову програмування — «Nim: идеальный язык программирования».
Також велося її активне обговорення на Форумі.
Крім того, нещодавно ми розповідали про особливості новоствореної мови програмування Ć.
3 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів