Κυκλοφορία της γλώσσας προγραμματισμού Nim 1.6.0

Μετά από ένα χρόνο ανάπτυξης, δημοσιεύτηκε η κυκλοφορία της γλώσσας προγραμματισμού συστήματος Nim 1.6, η οποία χρησιμοποιεί στατική πληκτρολόγηση και δημιουργήθηκε με προσοχή στους Pascal, C++, Python και Lisp. Ο πηγαίος κώδικας Nim μεταγλωττίζεται σε αναπαράσταση C, C++ ή JavaScript. Στη συνέχεια, ο κώδικας C/C++ που προκύπτει μεταγλωττίζεται σε ένα εκτελέσιμο αρχείο χρησιμοποιώντας οποιονδήποτε διαθέσιμο μεταγλωττιστή (clang, gcc, icc, Visual C++), ο οποίος σας επιτρέπει να επιτύχετε απόδοση κοντά στο C, εάν δεν λάβετε υπόψη το κόστος εκτέλεσης ο συλλέκτης σκουπιδιών. Παρόμοια με την Python, το Nim χρησιμοποιεί εσοχή ως οριοθέτες μπλοκ. Υποστηρίζονται εργαλεία και δυνατότητες μεταπρογραμματισμού για τη δημιουργία γλωσσών για συγκεκριμένο τομέα (DSL). Ο κωδικός του έργου παρέχεται με την άδεια MIT.

Οι αξιοσημείωτες αλλαγές στη νέα έκδοση περιλαμβάνουν:

  • Προστέθηκε η κλάση iterable[T] με υλοποίηση τύπου για επαναλήπτες. άθροισμα προτύπου[T](a: επαναλαμβανόμενο[T]): T = var αποτέλεσμα: T για ai σε α: αποτέλεσμα += ai αποτέλεσμα βεβαιώσω άθροισμα(iota(3)) == 0 + 1 + 2 # ή 'iota( 3) άθροισμα
  • Προστέθηκε πειραματική υποστήριξη για σχολιασμούς ".effectsOf" για επιλεκτική εφαρμογή εφέ. όταν ορίζεται(nimHasEffectsOf): {.experimental: "strictEffects".} other: {.pragma: effectOf.} proc mysort(s: seq; cmp: proc(a, b: T): int) {.effectsOf: cmp. }
  • Έχει προταθεί μια νέα σύνταξη εισαγωγής "import foo {.all.}", η οποία σας επιτρέπει να εισάγετε όχι μόνο δημόσια, αλλά και ιδιωτικά σύμβολα. Για πρόσβαση σε ιδιωτικά πεδία αντικειμένων, έχει προστεθεί η λειτουργική μονάδα std/importutils και το privateAccess API. από το σύστημα {.all.} ως system2 εισαγωγή μηδενική echo system2.ThisIsSystem εισαγωγή os {.all.} echo weirdTarget
  • Προστέθηκε πειραματική υποστήριξη για τελεστές κουκκίδων, που μπορεί να χρησιμοποιηθεί για την υλοποίηση δυναμικών πεδίων. εισαγωγή προτύπου std/json '.?'(a: JsonNode, b: untyped{ident}): JsonNode = a[astToStr(b)] έστω j = %*{“a1”: {“a2”: 10}} ισχυρίζεται j.?a1.?a2.getInt == 10
  • Πρόσθετες παράμετροι μπορούν να καθοριστούν σε ορίσματα μπλοκ. πρότυπο fn(a = 1, b = 2, body1, body2) = απόρριψη fn(a = 1): bar1 do: bar2
  • Έχει υλοποιηθεί υποστήριξη για γράμματα που ορίζονται από τον χρήστη (για παράδειγμα, "-128'bignum"). func `'big'*(αριθμός: cstring): JsBigInt {.importjs: "BigInt(#)".} assert 0xffffffffffffff'big == (1'big shl 64'big) - 1'big
  • Ο μεταγλωττιστής εφαρμόζει την εντολή «—eval:cmd» για να εκτελέσει απευθείας εντολές Nim από τη γραμμή εντολών, για παράδειγμα «nim —eval:»echo 1″».
  • Παρέχεται υποστήριξη για τη δημιουργία των δικών σας επεκτάσεων για το backend nimscript.
  • Τα μηνύματα σφάλματος έχουν επεκταθεί σε μεγάλο βαθμό για να εμφανίσουν το πλαίσιο που σχετίζεται με το σφάλμα. Εφαρμοσμένες προειδοποιήσεις προσαρμοσμένου μεταγλωττιστή.
  • Σημαντικά βελτιωμένη απόδοση των συλλεκτών απορριμμάτων "--gc:arc" και "--gc:orc".
  • Όλα τα backends έχουν βελτιώσει την ακρίβεια και την απόδοση του κώδικα για την ανάλυση ακεραίων και αριθμών κινητής υποδιαστολής.
  • Βελτιωμένη συμβατότητα JS, VM και backends nimscript με λειτουργικές μονάδες που προηγουμένως λειτουργούσαν μόνο με το backend C (για παράδειγμα, το module std/prelude). Έχει καθιερωθεί η δοκιμή λειτουργικών μονάδων stdlib με backend C, JS και VM.
  • Προστέθηκε υποστήριξη για τσιπ Apple Silicon/M1, συστήματα RISC-V 32 bit, armv8l και CROSSOS.
  • Προστέθηκαν ενότητες std/jsbigints, std/tempfiles και std/sysrand. Έχουν γίνει σημαντικές βελτιώσεις στις ενότητες συστήματος, μαθηματικών, τυχαίων, json, jsonutils, os, typetraits, wrapnils, λιστών και κατακερματισμών.

Πηγή: opennet.ru

Προσθέστε ένα σχόλιο