Linguaggio di programmazione Nim versione 1.6.0

Dopo un anno di sviluppo è stato pubblicato il rilascio del linguaggio di programmazione di sistema Nim 1.6, che utilizza la digitazione statica ed è stato realizzato con un occhio di riguardo a Pascal, C++, Python e Lisp. Il codice sorgente Nim è compilato in una rappresentazione 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++), che consente di raggiungere prestazioni vicine al C, se non si tengono conto dei costi di esecuzione il netturbino. Similmente a Python, Nim utilizza il rientro come delimitatore di blocco. Sono supportati strumenti e funzionalità di metaprogrammazione per la creazione di linguaggi specifici del dominio (DSL). Il codice del progetto è fornito sotto la licenza MIT.

Le modifiche notevoli nella nuova versione includono:

  • Aggiunta la classe iterable[T] con un'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 # or 'iota( 3).somma'
  • Aggiunto supporto sperimentale per le annotazioni ".effectsOf" per l'applicazione selettiva degli effetti. quando definito(nimHasEffectsOf): {.experimental: "strictEffects".} else: {.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 strangeTarget
  • Aggiunto supporto sperimentale per gli operatori punto, che possono essere utilizzati per implementare campi dinamici. importa modello std/json '.?'(a: JsonNode, b: untyped{ident}): JsonNode = a[astToStr(b)] let j = %*{“a1”: {“a2”: 10}} assert j.?a1.?a2.getInt == 10
  • È possibile specificare parametri aggiuntivi negli argomenti del blocco. template fn(a = 1, b = 2, body1, body2) = scarta fn(a = 1): bar1 do: bar2
  • È stato implementato il supporto per i valori letterali definiti dall'utente (ad esempio, "-128'bignum'"). func `'big`*(num: cstring): JsBigInt {.importjs: "BigInt(#)".} assert 0xffffffffffffff'big == (1'big shl 64'big) - 1'big
  • Il compilatore implementa il comando “—eval:cmd” per eseguire direttamente i comandi Nim dalla riga di comando, ad esempio ‘nim —eval:”echo 1″‘.
  • Fornito supporto per la creazione delle proprie estensioni per il backend nimscript.
  • I messaggi di errore sono stati notevolmente espansi per mostrare il contesto associato all'errore. Implementati avvisi personalizzati del compilatore.
  • Prestazioni significativamente migliorate dei garbage collector "--gc:arc" e "--gc:orc".
  • Tutti i backend hanno migliorato la precisione e le prestazioni del codice per l'analisi di numeri interi e in virgola mobile.
  • Compatibilità migliorata 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 stabilito il test dei moduli stdlib con backend C, JS e VM.
  • Aggiunto supporto per chip Apple Silicon/M1, sistemi RISC-V a 32 bit, armv8l e CROSSOS.
  • Aggiunti i moduli std/jsbigints, std/tempfiles e std/sysrand. Sono stati apportati miglioramenti significativi ai moduli di sistema, math, random, json, jsonutils, os, typetraits, wrapnils, list e hash.

Fonte: opennet.ru

Aggiungi un commento