Uscita del linguaggio di programmazione Nim 2.2.10

È stato presentato il rilascio del linguaggio di programmazione di sistema Nim 2.2.10. Nim è un linguaggio di programmazione compilato e staticamente tipizzato, con una sintassi ispirata a Python e capacità di metaprogrammazione a livello Lisp. Il linguaggio viene compilato in C, C++ e JavaScript, offrendo prestazioni pari a quelle di C, mantenendo l'espressività di linguaggi di alto livello. Il codice del progetto è fornito sotto licenza MIT.

Le funzionalità di Nim includono un sistema di macro che lavora sull'AST durante la compilazione, supporto per la programmazione generica con concetti, dispatch multiplo, gestione della memoria deterministica con supporto per diverse strategie (ARC/ORC, refc, marcatura e raccolta), supporto integrato per async/await per la programmazione asincrona e FFI per una semplice integrazione con C/C++/JavaScript. Nim si posiziona come un linguaggio sistematico adatto allo sviluppo di sistemi embedded fino al web,server, con un focus su efficienza, sicurezza della memoria e facilità di sviluppo.

Modifiche nel linguaggio e nel compilatore:

  • È stato aggiunto il flag sperimentale "—experimental:typeBoundOps", che implementa l'RFC #380 e aumenta l'affidabilità delle interfacce "hash", "$", "==" per i tipi nominati durante le importazioni indirette. Esempio: import std/hashes type Obj* = object x*, y*: int z*: string proc `==`*(a, b: Obj): bool = a.x == b.x and a.y == b.y proc hash*(a: Obj): Hash = $!(hash(a.x) &! hash(a.y)) # main.nim {.experimental: «typeBoundOps».} from objs import Obj import std/tables var t: Table[Obj, int] t[Obj(x: 3, y: 4, z: «debug»)] = 34 echo t[Obj(x: 3, y: 4, z: «ignored»)] # 34
  • È stato corretto un errore per cui "sizeof(T)" all'interno di un template "typedesc", chiamato da un'espressione when di un generico, causava un errore di compilazione.

Principali cambiamenti che influenzano la retrocompatibilità:

  • Per impostazione predefinita è attivato il flag «-d:nimPreviewFloatRoundtrip». Le funzioni «system.addFloat» e l'operatore «$» utilizzano ora l'algoritmo Dragonbox per generare le rappresentazioni stringa minime dei numeri in virgola mobile, garantendo un arrotondamento corretto e la reversibilità della trasformazione. Per tornare al comportamento precedente è disponibile il flag «-d:nimLegacySprintf».
  • Il parametro «default» della funzione «tables.getOrDefault» è stato rinominato in «def» per evitare conflitti con «system.default». Il codice che utilizza argomenti nominati «getOrDefault(…, default = …)» necessita di aggiornamenti.
  • Con il flag «-d:nimPreviewCheckedClose» attivato, la funzione «close» nel modulo «std/syncio» genera ora un'eccezione in caso di errori di input/output.
  • I messaggi di avviso e i suggerimenti non identificati del compilatore ora generano un avviso «warnUnknownNotes» invece di errori.
  • Con il flag «-d:nimPreviewAsmSemSymbol», negli operatori asm/emit è stata aggiunta una verifica dei tipi per i simboli racchiusi tra virgolette invertite.
  • Il blocco «except:» senza specificare il tipo ora causa un panico durante la cattura di «Defect». Si raccomanda di utilizzare «except Exception:» o «except Defect:». Per la migrazione è previsto il flag «—legacy:noPanicOnExcept».
  • Con il flag «-d:nimPreviewCStringComparisons», gli operatori di confronto ({, >, {=, >=) per «cstring» passano dalla semantica dei riferimenti a quella dei valori, analogamente a «==» e «!=».
  • Il modulo std/parsesql è stato estratto in un pacchetto nimble separato; per installarlo è richiesto «nimble install parsesql» o l'uso del gestore atlas.
  • Con il flag «-d:nimPreviewDuplicateModuleError», l'importazione di due moduli con lo stesso nome diventa un errore di compilazione. Per risolvere le collisioni, si raccomanda di usare alias: «import foo as foo1».
  • È stata aggiunta l'opzione «—mangle:nim|cpp» per scegliere lo stile di mangling dei nomi con le informazioni di debug attive (per impostazione predefinita — cpp).
  • Il secondo parametro delle funzioni succ, pred, inc, dec nel modulo system ora accetta il tipo «SomeInteger» invece di «Ordinal».
  • Gli operatori di shift bit (shl, shr, ashr) applicano una maschera bit al secondo operando nei backend C/C++/VM/JS.
  • È stato aggiunto un avviso «—warning:ImplicitRangeConversion» che rileva potenziali conversioni implicite pericolose a intervalli più piccoli (ad esempio, int -> range[0..255]) che possono causare panico a tempo di esecuzione.

Novità nella libreria standard:

  • Nel modulo «setutils» sono state aggiunte le funzioni «symmetricDifference», l'operatore «-+-» e la versione inline «toggle» per un calcolo efficiente della differenza simmetrica degli insiemi di bit.
  • È stata aggiunta un'overload a «strutils.multiReplace» per sostituire i caratteri da un insieme in un solo passaggio - utile per la sanitizzazione delle stringhe.
  • Nel modulo std/files sono state aggiunte procedure con supporto per il tipo Path: getFilePermissions, setFilePermissions, tryRemoveFile, copyFile (con buffer personalizzabile e gestione dei collegamenti), copyFileWithPermissions, copyFileToDir. Sono stati esportati i tipi CopyFlag e FilePermission per un controllo fine delle operazioni sui file.
  • Il modulo std/dirs ha ricevuto nuove procedure: copyDir e copyDirWithPermissions per la copia ricorsiva delle directory mantenendo gli attributi.
  • Nei backend refc, JS e VM è stata implementata la supporto per la funzione «system.setLenUninit» per il tipo «string», consentendo di modificare la lunghezza della stringa senza inizializzare nuova memoria durante l'estensione.
  • Nel modulo std/parseopt è stato aggiunto il supporto per più modalità di analisi degli argomenti della linea di comando tramite l'enumerazione CliMode: Nim (predefinito), e le sperimentali Lax e Gnu.
  • Nel modulo std/math, l'operatore «^» supporta ora numeri reali come esponenti.
  • Le funzioni min, max e i loro analoghi da sequtils per openArray ora accettano una funzione di confronto personalizzata.
  • Ottimizzata l'implementazione di system.substr: quando disponibile, viene utilizzato copymem (un wrapper su C memcpy).
  • La funzione system.newStringUninit è contrassegnata come priva di effetti collaterali, consentendone l'uso con il flag «—experimental:strictFuncs».

Strumenti e documentazione:

  • Nel generatore di documentazione è stato aggiunto il flag «—raw» per disabilitare il rendering del markup nell'output JSON.
  • Aggiunto il flag «—stdinfile» per specificare il nome del file durante l'esecuzione del codice da stdin (predefinito: stdinfile.nim).
  • Il flag «—styleCheck:warning» consente di interpretare le violazioni dei controlli stilistici come avvertimenti anziché errori.
  • Documentazione sulla pragma completeStruct è stata aggiunta al manuale.

Corretti oltre 30 errori, inclusi:

  • Errori di funzionamento di new con ref object e generazione di codice per tuple negli array;
  • Problemi con l'elaborazione dei parametri statici e typedesc;
  • Regressioni nei gestori di memoria ORC/refc, inclusi l'allineamento degli oggetti e chiamate eccessive a nimZeroMem;
  • Errori di parsing in parseopt, parsecfg e generazione di codice per il backend JavaScript;
  • Perdite di memoria e crash durante l'uso di chiusure, iteratori e oggetti di grandi dimensioni.

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