Wersja języka programowania Nim 1.6.0

Po roku rozwoju opublikowano wydanie systemowego języka programowania Nim 1.6, który wykorzystuje pisanie statyczne i został stworzony z myślą o Pascalu, C++, Pythonie i Lisp. Kod źródłowy Nim jest kompilowany do postaci C, C++ lub JavaScript. Następnie powstały kod C/C++ jest kompilowany do pliku wykonywalnego przy użyciu dowolnego dostępnego kompilatora (clang, gcc, icc, Visual C++), co pozwala na osiągnięcie wydajności zbliżonej do C, jeśli nie uwzględnić kosztów uruchomienia śmieciarz. Podobnie jak Python, Nim używa wcięć jako ograniczników bloków. Obsługiwane są narzędzia i możliwości metaprogramowania do tworzenia języków specyficznych dla domeny (DSL). Kod projektu udostępniany jest na licencji MIT.

Godne uwagi zmiany w nowej wersji obejmują:

  • Dodano klasę iterable[T] z implementacją typu dla iteratorów. suma szablonu[T](a: iterowalna[T]): T = var wynik: T dla ai w a: wynik += ai wynik twierdzenie sum(iota(3)) == 0 + 1 + 2 # lub 'iota( 3).suma'
  • Dodano eksperymentalną obsługę adnotacji „.effectsOf” do selektywnego stosowania efektów. kiedy zdefiniowane(nimHasEffectsOf): {.experimental: "strictEffects".} else: {.pragma: EffectsOf.} proc mysort(s: seq; cmp: proc(a, b: T): int) {.effectsOf: cmp. }
  • Zaproponowano nową składnię importu „import foo {.all.}”, która pozwala na import nie tylko symboli publicznych, ale także prywatnych. Aby uzyskać dostęp do prywatnych pól obiektów, dodano moduł std/importutils i API privateAccess. z systemu {.all.} jako system2 import nil echo system2.ThisIsSystem import os {.all.} echo dziwacznyTarget
  • Dodano eksperymentalną obsługę operatorów kropek, których można używać do implementowania pól dynamicznych. importuj szablon std/json '.?'(a: JsonNode, b: untyped{ident}): JsonNode = a[astToStr(b)] let j = %*{„a1”: {„a2”: 10}} asercja j.?a1.?a2.getInt == 10
  • Dodatkowe parametry można określić w argumentach blokowych. szablon fn(a = 1, b = 2, ciało1, ciało2) = odrzuć fn(a = 1): takt1 do: takt2
  • Zaimplementowano obsługę literałów zdefiniowanych przez użytkownika (na przykład „-128'bignum”). func `'big`*(num: cstring): JsBigInt {.importjs: "BigInt(#)".}twierdzenie 0xffffffffffffff'big == (1'big shl 64'big) - 1'big
  • Kompilator implementuje polecenie „--eval:cmd”, aby bezpośrednio uruchamiać polecenia Nim z wiersza poleceń, na przykład „nim -eval:„echo 1””.
  • Zapewniono wsparcie dla tworzenia własnych rozszerzeń dla zaplecza nimscript.
  • Komunikaty o błędach zostały znacznie rozszerzone, aby pokazać kontekst związany z błędem. Zaimplementowano niestandardowe ostrzeżenia kompilatora.
  • Znacząco poprawiona wydajność modułów zbierających elementy bezużyteczne „--gc:arc” i „--gc:orc”.
  • Wszystkie backendy poprawiły dokładność i wydajność kodu do analizowania liczb całkowitych i zmiennoprzecinkowych.
  • Poprawiona kompatybilność backendów JS, VM i nimscript z modułami, które wcześniej działały tylko z backendem C (na przykład moduł std/prelude). Ustanowiono testowanie modułów stdlib z backendami C, JS i VM.
  • Dodano obsługę chipów Apple Silicon/M1, 32-bitowych systemów RISC-V, armv8l i CROSSOS.
  • Dodano moduły std/jsbigints, std/tempfiles i std/sysrand. Znaczące ulepszenia zostały wprowadzone w modułach systemowych, math, random, json, jsonutils, os, typetraits, wrapnils, list i hashs.

Źródło: opennet.ru

Dodaj komentarz