Lëshimi i gjuhës së programimit Nim 1.6.0

Pas një viti zhvillimi, u publikua lëshimi i gjuhës programuese të sistemit Nim 1.6, e cila përdor shtypjen statike dhe u krijua me një sy në Pascal, C++, Python dhe Lisp. Kodi burimor Nim përpilohet në një përfaqësim C, C++ ose JavaScript. Më pas, kodi C/C++ që rezulton përpilohet në një skedar të ekzekutueshëm duke përdorur çdo përpilues të disponueshëm (clang, gcc, icc, Visual C++), i cili ju lejon të arrini performancë afër C, nëse nuk merrni parasysh kostot e ekzekutimit grumbulluesi i plehrave. Ngjashëm me Python, Nim përdor dhëmbëzimin si ndarës të blloqeve. Mbështeten mjetet dhe aftësitë e metaprogramimit për krijimin e gjuhëve specifike të domenit (DSL). Kodi i projektit jepet nën licencën MIT.

Ndryshimet e dukshme në versionin e ri përfshijnë:

  • U shtua klasa iterable[T] me një zbatim të tipit për përsëritësit. shuma e shabllonit[T](a: përsëritëse[T]): T = var rezultat: T për ai në a: rezultat += ai rezultat pohoni shumën(iota(3)) == 0 + 1 + 2 # ose 'iota( 3). Shuma'
  • U shtua mbështetje eksperimentale për shënimet ".effectsOf" për aplikimin selektiv të efekteve. kur definohet(nimHasEffectsOf): {.eksperimentale: "strictEffects".} other: {.pragma: effectOf.} proc mysort(s: seq; cmp: proc(a, b: T): int) {.effectsOf: cmp. }
  • Është propozuar një sintaksë e re e importit "import foo {.all.}", e cila ju lejon të importoni jo vetëm simbole publike, por edhe private. Për të hyrë në fushat private të objekteve, moduli std/importutils dhe API privateAccess janë shtuar. nga sistemi {.all.} si system2 import nil echo system2.ThisIsSystem import os {.all.} echo weirdTarget
  • U shtua mbështetje eksperimentale për operatorët me pika, të cilat mund të përdoren për të zbatuar fusha dinamike. importoni shabllonin std/json '.?'(a: JsonNode, b: i pashtypshëm{ident}): JsonNode = a[astToStr(b)] le të pohohet j = %*{“a1”: {“a2”: 10}} j.?a1.?a2.getInt == 10
  • Parametrat shtesë mund të specifikohen në argumentet e bllokut. shablloni fn(a = 1, b = 2, body1, body2) = hidhni fn(a = 1): bar1 bëj: bar2
  • Mbështetja për literale të përcaktuara nga përdoruesi është zbatuar (për shembull, "-128'bignum'"). func `'big'*(num: cstring): JsBigInt {.importjs: "BigInt(#)".} pohoj 0xffffffffffffff'big == (1'shl i madh 64'i madh) - 1'i madh
  • Përpiluesi zbaton komandën "—eval:cmd" për të ekzekutuar drejtpërdrejt komandat Nim nga linja e komandës, për shembull 'nim —eval:"echo 1″".
  • Ofroi mbështetje për krijimin e shtesave tuaja për backend-in e nimscript.
  • Mesazhet e gabimit janë zgjeruar shumë për të treguar kontekstin e lidhur me gabimin. Paralajmërimet e zbatuara të përpiluesit me porosi.
  • Performanca e përmirësuar ndjeshëm e grumbulluesve të mbeturinave "--gc:arc" dhe "--gc:orc".
  • Të gjitha backend-et kanë përmirësuar saktësinë dhe performancën e kodit për analizimin e numrave të plotë dhe numrave me pikë lundruese.
  • Përputhshmëri e përmirësuar e mbështetësve JS, VM dhe nimscript me module që më parë punonin vetëm me backend-in C (për shembull, moduli std/prelude). Është vendosur testimi i moduleve stdlib me backends C, JS dhe VM.
  • Mbështetje e shtuar për çipin Apple Silicon/M1, sistemet RISC-V 32-bit, armv8l dhe CROSSOS.
  • Modulet e shtuara std/jsbigints, std/tempfiles dhe std/sysrand. Përmirësime të konsiderueshme janë bërë në modulet e sistemit, matematikës, rastit, json, jsonutils, OS, tipare të tipit, wrapnils, listave dhe hashes.

Burimi: opennet.ru

Shto një koment