Rilascio del linguaggio di programmazione Nim 1.6.0

Dopo un anno di sviluppo, è stato rilasciato il linguaggio di programmazione sistemica Nim 1.6, il quale utilizza la tipizzazione statica ed è stato creato prendendo spunto da Pascal, C++, Python e Lisp. Il codice sorgente scritto in Nim viene compilato in una rappresentazione in C, C++ o JavaScript. Successivamente, il codice C/C++ risultante viene compilato in un file eseguibile utilizzando qualsiasi compilatore disponibile (clang, gcc, icc, Visual C++), il che consente di raggiungere prestazioni vicine a quelle del C, escludendo i costi associati all'esecuzione del garbage collector. Analogamente a Python, Nim utilizza l'indentazione come delimitatori di blocco. Sono supportati strumenti di metaprogrammazione e capacità di creare linguaggi specifici per domini (DSL). Il codice del progetto è distribuito con licenza MIT.

Tra le modifiche significative nella nuova versione:

  • È stata aggiunta la classe iterable[T] con l'implementazione del tipo per gli iteratori. template sum[T](a: iterable[T]): T = var result: T for ai in a: result += ai result assert sum(iota(3)) == 0 + 1 + 2 # oppure ‘iota(3).sum’
  • È stata aggiunta la supporto sperimentale per le annotazioni «.effectsOf» per applicare selettivamente effetti. quando definito(nimHasEffectsOf): {.experimental: «strictEffects».} altrimenti: {.pragma: effectsOf.} proc mysort(s: seq; cmp: proc(a, b: T): int) {.effectsOf: cmp.}
  • È stata proposta una nuova sintassi di importazione «import foo {.all.}» che consente di importare non solo simboli pubblici, ma anche privati. Per accedere ai campi privati degli oggetti sono stati aggiunti il modulo std/importutils e l'API privateAccess. from system {.all.} as system2 import nil echo system2.ThisIsSystem import os {.all.} echo weirdTarget
  • È stata aggiunta una supporto sperimentale per operatori che iniziano con un punto, che possono essere utilizzati per implementare campi dinamici. import std/json template ‘.?'(a: JsonNode, b: untyped{ident}): JsonNode = a[astToStr(b)] let j = %*{«a1»: {«a2»: 10}} assert j.?a1.?a2.getInt == 10
  • Negli argomenti del blocco è consentita l'indicazione di parametri aggiuntivi. template fn(a = 1, b = 2, body1, body2) = discard fn(a = 1): bar1 do: bar2
  • È stato implementato il supporto per i letterali definiti dall'utente (ad esempio «-128’bignum'»). func `’big`*(num: cstring): JsBigInt {.importjs: «BigInt(#)».} assert 0xffffffffffffffff’big == (1’big shl 64’big) — 1’big
  • Nel compilatore è implementato il comando «—eval:cmd» per eseguire direttamente comandi in linguaggio Nim dalla riga di comando, ad esempio ‘nim —eval:»echo 1″‘.
  • È stata aggiunta la supporto per la creazione di estensioni personalizzate per il backend nimscript.
  • I messaggi di errore sono stati notevolmente ampliati, con la fornitura di contesto relativo all'errore. Sono state implementate avvertenze personalizzabili del compilatore.
  • È stata notevolmente migliorata l'efficacia dei garbage collector «—gc:arc» e «—gc:orc».
  • In tutti i backend è stata migliorata la precisione e le prestazioni del codice per il parsing di numeri interi e numeri in virgola mobile.
  • È stata migliorata la compatibilità dei backend JS, VM e nimscript con i moduli che in precedenza funzionavano solo con il backend C (ad esempio, il modulo std/prelude). È stato attivato il testing dei moduli stdlib con i backend C, JS e VM.
  • È stata aggiunta la supporto per il chip Apple Silicon/M1, sistemi RISC-V a 32 bit, armv8l e CROSSOS.
  • Sono stati aggiunti i moduli std/jsbigints, std/tempfiles e std/sysrand. Sono stati apportati significativi miglioramenti ai moduli system, math, random, json, jsonutils, os, typetraits, wrapnils, lists e hashes.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster