Limbajul de programare Nim versiunea 1.6.0

După un an de dezvoltare, a fost publicată lansarea limbajului de programare a sistemului Nim 1.6, care folosește tastarea statică și a fost creat cu ochii pe Pascal, C++, Python și Lisp. Codul sursă Nim este compilat într-o reprezentare C, C++ sau JavaScript. Ulterior, codul C/C++ rezultat este compilat într-un fișier executabil folosind orice compilator disponibil (clang, gcc, icc, Visual C++), ceea ce vă permite să obțineți performanțe apropiate de C, dacă nu țineți cont de costurile de rulare. gunoiul. Similar cu Python, Nim folosește indentarea ca delimitatori de bloc. Sunt acceptate instrumentele și capabilitățile de metaprogramare pentru crearea de limbaje specifice domeniului (DSL). Codul proiectului este furnizat sub licența MIT.

Modificările notabile din noua versiune includ:

  • S-a adăugat clasa iterable[T] cu o implementare de tip pentru iteratoare. template sum[T](a: iterable[T]): T = var rezultat: T for ai in a: result += ai result assert sum(iota(3)) == 0 + 1 + 2 # sau 'iota( 3).sum'
  • S-a adăugat suport experimental pentru adnotările „.effectsOf” pentru aplicarea selectivă a efectelor. când este definit(nimHasEffectsOf): {.experimental: "strictEffects".} else: {.pragma: effectsOf.} proc mysort(s: seq; cmp: proc(a, b: T): int) {.effectsOf: cmp. }
  • A fost propusă o nouă sintaxă de import „import foo {.all.}”, permițându-vă să importați nu numai simboluri publice, ci și private. Pentru a accesa câmpurile private ale obiectelor, au fost adăugate modulul std/importutils și API-ul privateAccess. din sistem {.all.} ca system2 import nil echo system2.ThisIsSystem import os {.all.} echo weirdTarget
  • S-a adăugat suport experimental pentru operatorii punct, care poate fi folosit pentru a implementa câmpuri dinamice. import std/json template '.?'(a: JsonNode, b: untyped{ident}): JsonNode = a[astToStr(b)] let j = %*{“a1”: {“a2”: 10}} assert j.?a1.?a2.getInt == 10
  • Parametrii suplimentari pot fi specificați în argumentele blocului. șablon fn(a = 1, b = 2, body1, body2) = aruncați fn(a = 1): bar1 do: bar2
  • A fost implementat suport pentru literalele definite de utilizator (de exemplu, „-128’bignum’”). func `'big`*(num: cstring): JsBigInt {.importjs: "BigInt(#)".} assert 0xffffffffffffff'big == (1'big shl 64'big) - 1'big
  • Compilatorul implementează comanda „--eval:cmd” pentru a rula direct comenzi Nim din linia de comandă, de exemplu „nim -eval:”echo 1”’.
  • A oferit suport pentru crearea propriilor extensii pentru backend-ul nimscript.
  • Mesajele de eroare au fost mult extinse pentru a arăta contextul asociat cu eroarea. Implementarea avertismentelor personalizate ale compilatorului.
  • Performanța îmbunătățită semnificativ a colectoarelor de gunoi „--gc:arc” și „--gc:orc”.
  • Toate backend-urile au îmbunătățit acuratețea și performanța codului pentru analizarea numerelor întregi și a numerelor în virgulă mobilă.
  • Compatibilitate îmbunătățită a backend-urilor JS, VM și nimscript cu module care anterior funcționau doar cu backend-ul C (de exemplu, modulul std/prelude). A fost stabilită testarea modulelor stdlib cu backend-uri C, JS și VM.
  • S-a adăugat suport pentru cip Apple Silicon/M1, sistemele RISC-V pe 32 de biți, armv8l și CROSSOS.
  • S-au adăugat module std/jsbigints, std/tempfiles și std/sysrand. Au fost aduse îmbunătățiri semnificative la modulele de sistem, matematică, aleatoare, json, jsonutils, os, typetraits, wrapnils, liste și hash.

Sursa: opennet.ru

Adauga un comentariu