Nach einem Jahr Entwicklung wurde die Version 1.6 der Systemprogrammiersprache Nim veröffentlicht. Diese verwendet statische Typisierung und orientiert sich an Pascal, C++, Python und Lisp. Der Quellcode in Nim wird in C-, C++- oder JavaScript-Code kompiliert. Der resultierende C/C++-Code kann anschlieĂend mit jedem verfĂŒgbaren Compiler (clang, gcc, icc, Visual C++) in eine ausfĂŒhrbare Datei kompiliert werden, was eine Leistung nahe C ermöglicht, abgesehen von den Kosten fĂŒr die Garbage Collection. Ăhnlich wie in Python verwendet Nim EinrĂŒckungen als Blocktrennzeichen. Es sind Metaprogrammierungstools und Funktionen zur Erstellung von domĂ€nenspezifischen Sprachen (DSL) UnterstĂŒtzung vorhanden. Der Projektcode wird unter der MIT-Lizenz bereitgestellt.
Zu den bemerkenswerten Neuerungen in dieser Version gehören:
- Die Klasse iterable[T] mit Implementierung fĂŒr Iteratoren wurde hinzugefĂŒgt. template sum[T](a: iterable[T]): T = var result: T for ai in a: result += ai result assert sum(iota(3)) == 0 + 1 + 2 # oder âiota(3).sumâ
- Experimentelle UnterstĂŒtzung fĂŒr die Annotationen â.effectsOfâ wurde hinzugefĂŒgt, um Effekte selektiv anzuwenden. when defined(nimHasEffectsOf): {.experimental: «strictEffects».} else: {.pragma: effectsOf.} proc mysort(s: seq; cmp: proc(a, b: T): int) {.effectsOf: cmp.}
- Ein neuer Import-Syntax âimport foo {.all.}â wurde vorgeschlagen, der es ermöglicht, nicht nur öffentliche, sondern auch private Symbole zu importieren. Zum Zugriff auf die privaten Felder von Objekten wurden das Modul std/importutils und die API privateAccess hinzugefĂŒgt. from system {.all.} as system2 import nil echo system2.ThisIsSystem import os {.all.} echo weirdTarget
- Experimentelle UnterstĂŒtzung fĂŒr Operatoren, die mit einem Punkt beginnen, wurde hinzugefĂŒgt, um dynamische Felder zu implementieren. import std/json template â.?'(a: JsonNode, b: untyped{ident}): JsonNode = a[astToStr(b)] let j = %*{«a1»: {«a2»: 10}} assert j.?a1.?a2.getInt == 10
- ZusÀtzliche Parameter sind nun in den Blockargumenten erlaubt. template fn(a = 1, b = 2, body1, body2) = discard fn(a = 1): bar1 do: bar2
- Die UnterstĂŒtzung fĂŒr benutzerdefinierte Literale (z. B. â-128âbignum'â) wurde implementiert. func `âbig`*(num: cstring): JsBigInt {.importjs: «BigInt(#)».} assert 0xffffffffffffffffâbig == (1âbig shl 64âbig) â 1âbig
- Der Compiler implementiert den Befehl ââeval:cmdâ, um Nim-Kommandos direkt aus der Kommandozeile auszufĂŒhren, zum Beispiel ânim âeval:âecho 1ââ.
- Es wurde UnterstĂŒtzung fĂŒr die Erstellung eigener Erweiterungen fĂŒr das Nimscript-Backend bereitgestellt.
- Die Fehlermeldungen wurden erheblich erweitert, um den Kontext, der mit dem Fehler verbunden ist, anzuzeigen. Anpassbare Compiler-Warnungen wurden implementiert.
- Die Leistung der Garbage Collector ââgc:arcâ und ââgc:orcâ wurde erheblich verbessert.
- In allen Backends wurde die Genauigkeit und Leistung des Codes fĂŒr die Verarbeitung von Ganzzahlen und Gleitkommazahlen verbessert.
- Die KompatibilitĂ€t der Backends JS, VM und Nimscript mit Modulen, die zuvor nur mit dem C-Backend funktionierten (z. B. das Modul std/prelude), wurde verbessert. Die Tests fĂŒr stdlib-Module mit den Backends C, JS und VM wurden eingerichtet.
- UnterstĂŒtzung fĂŒr den Apple Silicon/M1-Chip, 32-Bit RISC-V-Systeme, armv8l und CROSSOS wurde hinzugefĂŒgt.
- Module std/jsbigints, std/tempfiles und std/sysrand wurden hinzugefĂŒgt. Es wurden erhebliche Verbesserungen in den Modulen system, math, random, json, jsonutils, os, typetraits, wrapnils, lists und hashes vorgenommen.
Quelle: opennet.ru
