Pas pas një viti zhvillimi, është publikuar versioni 1.6 i gjuhës së programimit sistemik Nim, e cila përdor tipizimin statik dhe është krijuar me shikim ndaj Pascal, C++, Python dhe Lisp. Kodi burimor në gjuhën Nim kompilohet në një përfaqësim në C, C++ ose JavaScript. Më pas, kodi i marra C/C++ kompilohet në një skedar ekzekutiv me çdo kompilator të disponueshëm (clang, gcc, icc, Visual C++), çka lejon arritjen e performancës afër C, pa marrë parasysh shpenzimet për ekzekutimin e mbledhësit të plehrave. Ashtu si në Python, në Nim përdoren hapësirat për ndarjen e blloqeve. Mbështeten mjete metaprogramimi dhe mundësi për krijimin e gjuhëve të orientuara ndaj subjekteve (DSL). Kodi i projektit ofrohet nën licencën MIT.
Ndër ndryshimet e dukshme në versionin e ri:
- Shtuar klasa iterable[T] me implementimin e tipit pĂ«r iteraotrat. template sum[T](a: iterable[T]): T = var rezultat: T pĂ«r ai nĂ« a: rezultat += ai rezultat assert sum(iota(3)) == 0 + 1 + 2 # ose âiota(3).sumâ
- Shtuar mbështetje eksperimentale për anotimet «.effectsOf» për aplikimin selektiv të efekteve. when defined(nimHasEffectsOf): {.experimental: «strictEffects».} else: {.pragma: effectsOf.} proc mysort(s: seq; cmp: proc(a, b: T): int) {.effectsOf: cmp.}
- Propozuar një sintaksë të re importi «import foo {.all.}», e cila lejon importimin jo vetëm të simboleve publike, por edhe atyre private. Për qasje në fushat private të objekteve janë të shtuar moduli std/importutils dhe API privateAccess. from system {.all.} as system2 import nil echo system2.ThisIsSystem import os {.all.} echo weirdTarget
- Shtuar mbĂ«shtetje eksperimentale pĂ«r operatorĂ«t qĂ« fillojnĂ« me pikĂ«, tĂ« cilĂ«t mund tĂ« pĂ«rdoren pĂ«r implementimin e fushave dinamike. import std/json template â.?'(a: JsonNode, b: untyped{ident}): JsonNode = a[astToStr(b)] let j = %*{«a1»: {«a2»: 10}} assert j.?a1.?a2.getInt == 10
- Në argumentet e bllokut është lejuar specifikimi i parametrave të tjerë. template fn(a = 1, b = 2, body1, body2) = discard fn(a = 1): bar1 bëj: bar2
- Implementuar mbĂ«shtetje pĂ«r literalet e definzuara nga pĂ«rdoruesi (p.sh. «-128âbignum'»). func `âbig`*(num: cstring): JsBigInt {.importjs: «BigInt(#)».} assert 0xffffffffffffffffâbig == (1âbig shl 64âbig) - 1âbig
- NĂ« kompilator Ă«shtĂ« implementuar komanda «âeval:cmd» pĂ«r ekzekutimin e drejtpĂ«rdrejtĂ« tĂ« komandave nĂ« gjuhĂ«n Nim nga komanda e linjĂ«s, pĂ«r shembull ânim âeval:»echo 1âłâ.
- Siguruar mbështetje për krijimin e zgjerimeve të veta për backend-in nimscript.
- Mesazhet e gabimeve janë zgjeruar ndjeshëm, duke siguruar një kontekst të lidhur me gabimin. Implementuar paralajmërime të personalizueshme të kompilatorit.
- PĂ«rmirĂ«suar ndjeshĂ«m punĂ«n e mbledhĂ«sve tĂ« plehrave «âgc:arc» dhe «âgc:orc».
- Në të gjithë backend-et është përmirësuar saktësia dhe performanca e kodit për analizimin e numrave të plotë dhe atyre me pikë lëvizëse.
- Përmirësuar kompatibilitetin e backend-eve JS, VM dhe nimscript me modulët, të cilët më parë kishin funksionuar vetëm me backend-in C (për shembull, moduli std/prelude). Testimi i modulëve stdlib është vendosur për backend-et C, JS dhe VM.
- Shtuar mbështetje për çipin Apple Silicon/M1, sistemet 32-bitale RISC-V, armv8l dhe CROSSOS.
- Shtuar modulët std/jsbigints, std/tempfiles dhe std/sysrand. Janë bërë përmirësime të rëndësishme në modulët system, math, random, json, jsonutils, os, typetraits, wrapnils, lists dhe hashes.
Burimi: opennet.ru
