Die Programmiersprache Nim 2.2.10 wurde veröffentlicht.

Die Version 2.2.10 der Programmiersprache Nim wurde veröffentlicht. Nim ist eine statisch typisierte, kompilierte Programmiersprache mit einer Syntax, die von Python inspiriert ist, und bietet Möglichkeiten zur Metaprogrammierung auf Lisp-Niveau. Der Code wird in C, C++ und JavaScript kompiliert, wodurch eine Leistung auf C-Niveau bei der Ausdruckskraft von Hochsprachen gewährleistet wird. Das Projekt wird unter der MIT-Lizenz bereitgestellt.

Die Möglichkeiten von Nim umfassen ein auf dem AST basierendes Makrosystem während der Kompilierung, Unterstützung für generische Programmierung mit Konzepten, Mehrfachdispatch, deterministische Speicherverwaltung mit Unterstützung für verschiedene Strategien (ARC/ORC, refc, Markieren-und-Sichten), integrierte Unterstützung für async/await für asynchrones Programmieren und FFI für einfache Integration mit C/C++/JavaScript. Nim wird als Systemsprache positioniert, die für die Entwicklung von eingebetteten Systemen bis hin zu Webanwendungen geeignet ist,Server, mit einem Fokus auf Effizienz, Speichersicherheit und Benutzerfreundlichkeit.

Änderungen in der Sprache und dem Compiler:

  • Ein experimentelles Flag «—experimental:typeBoundOps» wurde hinzugefügt, das RFC #380 implementiert und die Zuverlässigkeit von den Schnittstellen «hash», «$», «==» für benannte Typen bei indirekten Imports erhöht. Beispiel: import std/hashes type Obj* = object x*, y*: int z*: string proc `==`*(a, b: Obj): bool = a.x == b.x und 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
  • Ein Fehler wurde behoben, bei dem «sizeof(T)» innerhalb einer Vorlage «typedesc», die aus einem when-Ausdruck eines Generics aufgerufen wird, zu einem Kompilierungsfehler führte.

Wesentliche Änderungen, die die Abwärtskompatibilität betreffen:

  • Standardmäßig ist das Flag „-d:nimPreviewFloatRoundtrip“ aktiviert. Die Funktionen „system.addFloat“ und der Operator „$“ verwenden jetzt den Dragonbox-Algorithmus zur Generierung minimaler stringbasierter Darstellungen von Fließkommazahlen, wobei korrekte Rundung und Umkehrbarkeit des Wandels garantiert sind. Um das alte Verhalten wiederherzustellen, steht das Flag „-d:nimLegacySprintf“ zur Verfügung.
  • Der Parameter „default“ in der Funktion „tables.getOrDefault“ wurde in „def“ umbenannt, um Konflikte mit „system.default“ zu vermeiden. Code, der benannte Argumente wie „getOrDefault(…, default = …)“ verwendet, muss aktualisiert werden.
  • Wenn das Flag „-d:nimPreviewCheckedClose“ aktiviert ist, erzeugt die Funktion „close“ im Modul „std/syncio“ jetzt eine Ausnahme bei Ein-/Ausgabefehlerschlüssen.
  • Unbekannte Compiler-Warnungen und Hinweise erzeugen nun eine Warnung „warnUnknownNotes“ anstelle von Fehlern.
  • Mit dem Flag „-d:nimPreviewAsmSemSymbol“ wurde in den Befehlen asm/emit eine Typüberprüfung für Symbole in umgekehrten Anführungszeichen hinzugefügt.
  • Ein Block „except:“ ohne Typangabe löst jetzt eine Panik bei der Auffangung von „Defect“ aus. Für die Verarbeitung wird empfohlen, „except Exception:“ oder „except Defect:“ zu verwenden. Zum Migrieren ist das Flag „—legacy:noPanicOnExcept“ vorgesehen.
  • Mit dem Flag "-d:nimPreviewCStringComparisons" wurden die Vergleichsoperatoren ({, >, {=, >=) für „cstring“ von der Semantik der Referenzen auf die Semantik der Werte umgeschaltet, ähnlich wie bei „==“ und „!=“.
  • Das Modul std/parsesql wurde in ein separates Nimble-Paket ausgelagert; zur Installation sind "nimble install parsesql" oder die Verwendung des Atlas-Managers erforderlich.
  • Mit dem Flag "-d:nimPreviewDuplicateModuleError" wird der Import von zwei Modulen mit demselben Namen zu einem Kompilierungsfehler. Um Kollisionen zu vermeiden, wird empfohlen, Aliase zu verwenden: "import foo as foo1".
  • Eine Option "—mangle:nim|cpp" wurde hinzugefügt, um den Stil der Namensmanglung bei aktivierter Debug-Information auszuwählen (standardmäßig cpp).
  • Der zweite Parameter der Funktionen succ, pred, inc, dec im Modul system akzeptiert jetzt den Typ „SomeInteger“ anstelle von „Ordinal“.
  • Bitverschiebeoperatoren (shl, shr, ashr) wenden eine Bitmaske auf den rechten Operanden in den Backends C/C++/VM/JS an.
  • Eine Warnung "—warning:ImplicitRangeConversion" wurde hinzugefügt, die potenziell gefährliche implizite Konversionen zu kleineren Bereichen erkennt (z.B. int -> range[0..255]), die zu einer Laufzeit-Panik führen können.

Neuerungen in der Standardbibliothek:

  • Im Modul «setutils» wurden die Funktionen «symmetricDifference», der Operator «-+-» und die Inline-Version «toggle» hinzugefügt, um die effektive Berechnung der symmetrischen Differenz von Bitmengen zu ermöglichen.
  • In «strutils.multiReplace» wurde eine Überladung hinzugefügt, um Zeichen aus einer Menge in einem Durchgang zu ersetzen – nützlich zur Sanitärung von Zeichenfolgen.
  • Im Modul std/files wurden Prozeduren mit Unterstützung für den Typ Path hinzugefügt: getFilePermissions, setFilePermissions, tryRemoveFile, copyFile (mit anpassbarem Puffer und Linkverarbeitung), copyFileWithPermissions, copyFileToDir. Die Typen CopyFlag und FilePermission wurden exportiert, um eine feine Kontrolle über Dateioperationen zu ermöglichen.
  • Das Modul std/dirs hat neue Prozeduren erhalten: copyDir und copyDirWithPermissions für das rekursive Kopieren von Verzeichnissen unter Beibehaltung der Attribute.
  • In den Backends refc, JS und VM wurde die Unterstützung für die Funktion «system.setLenUninit» für den Typ «string» implementiert, die es ermöglicht, die Länge einer Zeichenfolge ohne Initialisierung neuer Speicher beim Vergrößern zu ändern.
  • In std/parseopt wurde die Unterstützung für mehrere Modus zum Parsen von Befehlszeilenargumenten über die Enumeration CliMode hinzugefügt: Nim (Standardmäßig) sowie experimentelle Lax und Gnu.
  • Im Modul std/math unterstützt der Operator «^» jetzt reelle Zahlen als Exponenten.
  • Die Funktionen min, max und ihre Analogien aus sequtils für openArray akzeptieren jetzt eine benutzerdefinierte Vergleichsfunktion.
  • Die Implementierung von system.substr wurde optimiert: Wenn verfügbar, wird copymem (Wrap um C memcpy) verwendet.
  • Die Funktion system.newStringUninit ist als nebenwirkungsfrei gekennzeichnet, was ihre Verwendung mit dem Flag „—experimental:strictFuncs“ ermöglicht.

Werkzeuge und Dokumentation:

  • Dem Dokumentationsgenerator wurde das Flag „—raw“ hinzugefügt, um das Rendern von Markup in der JSON-Ausgabe zu deaktivieren.
  • Das Flag „—stdinfile“ wurde hinzugefügt, um bei der Ausführung von Code aus stdin den Dateinamen festzulegen (standardmäßig stdinfile.nim).
  • Das Flag „—styleCheck:warning“ ermöglicht es, Verstöße gegen Stilprüfungen als Warnungen und nicht als Fehler zu interpretieren.
  • Die Dokumentation zur pragma completeStruct wurde in das Handbuch aufgenommen.

Über 30 Fehler wurden behoben, darunter:

  • Fehler beim Arbeiten mit new bei ref objects und der Codegenerierung für Tupel in Arrays;
  • Probleme mit der Verarbeitung von static-Parametern und typedesc;
  • Regressionen im Speichermanagement ORC/refc, einschließlich der Ausrichtung von Objekten und überflüssigen Aufrufen von nimZeroMem;
  • Fehler beim Parsen in parseopt, parsecfg und der Codegenerierung für das JavaScript-Backend;
  • Speicherlecks und Abstürze beim Einsatz von Closures, Iteratoren und großen Objekten.

Quelle: opennet.ru

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster