Version 1.6.0 der Programmiersprache Nim

Nach einem Jahr Entwicklungszeit wurde die Veröffentlichung der Systemprogrammiersprache Nim 1.6 veröffentlicht, die statische Typisierung verwendet und mit Blick auf Pascal, C++, Python und Lisp erstellt wurde. Nim-Quellcode wird in eine C-, C++- oder JavaScript-Darstellung kompiliert. Anschließend wird der resultierende C/C++-Code mit einem beliebigen verfügbaren Compiler (Clang, GCC, ICC, Visual C++) in eine ausführbare Datei kompiliert, wodurch Sie eine Leistung erreichen können, die der von C nahe kommt, wenn Sie die Betriebskosten nicht berücksichtigen der Müllsammler. Ähnlich wie Python verwendet Nim Einrückungen als Blocktrennzeichen. Metaprogrammierungstools und Funktionen zum Erstellen domänenspezifischer Sprachen (DSLs) werden unterstützt. Der Projektcode wird unter der MIT-Lizenz bereitgestellt.

Zu den bemerkenswerten Änderungen in der neuen Version gehören:

  • Klasse iterable[T] mit Typimplementierung für Iteratoren hinzugefügt. template sum[T](a: iterable[T]): T = var result: T for ai in a: result += ai result affirm sum(iota(3)) == 0 + 1 + 2 # or 'iota( 3).sum'
  • Experimentelle Unterstützung für „.effectsOf“-Anmerkungen zur selektiven Anwendung von Effekten hinzugefügt. wenn definiert(nimHasEffectsOf): {.experimental: "strictEffects".} else: {.pragma: effectsOf.} proc mysort(s: seq; cmp: proc(a, b: T): int) {.effectsOf: cmp. }
  • Es wurde eine neue Importsyntax „import foo {.all.}“ vorgeschlagen, mit der Sie nicht nur öffentliche, sondern auch private Symbole importieren können. Um auf private Felder von Objekten zuzugreifen, wurden das Modul std/importutils und die privateAccess-API hinzugefügt. from system {.all.} as system2 import nil echo system2.ThisIsSystem import os {.all.} echo oddTarget
  • Experimentelle Unterstützung für Operatoren hinzugefügt, die mit einem Punkt beginnen und zur Implementierung dynamischer Felder verwendet werden können. import std/json template '.?'(a: JsonNode, b: untyped{ident}): JsonNode = a[astToStr(b)] let j = %*{"a1": {"a2": 10}} Assert j.?a1.?a2.getInt == 10
  • Es ist erlaubt, zusätzliche Parameter in Blockargumenten anzugeben. Vorlage fn(a = 1, b = 2, body1, body2) = verwerfen fn(a = 1): bar1 do: bar2
  • Unterstützung für benutzerdefinierte Literale implementiert (z. B. „-128'bignum'“). func `'big`*(num: cstring): JsBigInt {.importjs: "BigInt(#)".} Assert 0xffffffffffffff'big == (1'big shl 64'big) - 1'big
  • Der Compiler implementiert den Befehl „-eval:cmd“, um Nim-Befehle direkt über die Befehlszeile auszuführen, zum Beispiel „nim --eval:“echo 1“‘.
  • Unterstützung für die Erstellung benutzerdefinierter Erweiterungen für das Nimscript-Backend bereitgestellt.
  • Fehlermeldungen wurden erheblich erweitert, um den mit dem Fehler verbundenen Kontext anzuzeigen. Benutzerdefinierte Compiler-Warnungen implementiert.
  • Deutlich verbesserte Leistung der Garbage Collectors „--gc:arc“ und „--gc:orc“.
  • In allen Backends wurde die Genauigkeit und Leistung des Codes zum Parsen von Ganzzahlen und Gleitkommazahlen verbessert.
  • Verbesserte Kompatibilität von JS-, VM- und Nimscript-Backends mit Modulen, die bisher nur mit dem C-Backend funktionierten (z. B. das std/prelude-Modul). Etabliertes Testen von stdlib-Modulen mit C-, JS- und VM-Backends.
  • Unterstützung für Apple Silicon/M1-Chip, 32-Bit-RISC-V, armv8l und CROSSOS-Systeme hinzugefügt.
  • Module std/jsbigints, std/tempfiles und std/sysrand hinzugefügt. Es wurden erhebliche Verbesserungen an den Modulen „System“, „Mathe“, „Random“, „JSON“, „Jsonutils“, „OS“, „Typetraits“, „Wrapnils“, „Listen“ und „Hashes“ vorgenommen.

Source: opennet.ru

Kommentar hinzufügen