ĂshtĂ« publikuar versioni i gjuhĂ«s sĂ« programimit sistemor Nim 2.2.10. Nim Ă«shtĂ« njĂ« gjuhĂ« programimi e tipizuar statikisht e kompilueshme me njĂ« sintaksĂ« tĂ« frymĂ«zuar nga Python dhe mundĂ«si metaprogramimi nĂ« nivelin e Lisp. Gjuha kompilohet nĂ« C, C++ dhe JavaScript, duke ofruar performancĂ« nĂ« nivelin e C me shprehshmĂ«rinĂ« e gjuhĂ«ve mĂ« tĂ« larta. Kodi i projektit ofrohet nĂ«n licencĂ«n MIT.
Mundësitë e Nim përfshijnë një sistem makrosh që funksionon mbi AST gjatë kompilimit, mbështetje për programimin e përgjithshëm me koncepte, shpërndarje të shumëfishtë (multiple dispatch), menaxhim të determinueshëm të memories me mbështetje për disa strategji (ARC/ORC, refc, etiketim dhe pastrimin), mbështetje të integruar për async/await për programimin asinkron dhe FFI për integrim të thjeshtë me C/C++/JavaScript. Nim pozicionohet si një gjuhë sistemet, e përshtatshme për zhvillimin nga sisteme të integruara deri te uebi,serverëve, me theks në efikasitet, sigurinë e memories dhe lehtësinë e zhvillimit.
Ndryshimet në gjuhë dhe kompilator:
- Shtuar flakĂ«n eksperimentale "âexperimental:typeBoundOps", e cila realizon RFC #380 dhe rrit besueshmĂ«rinĂ« e funksionimit tĂ« interface-ve "hash", "$", "==" pĂ«r llojet e emĂ«ruar gjatĂ« importeve tĂ« drejtpĂ«rdrejta. Shembull: import std/hashes type Obj* = object x*, y*: int z*: string proc `==`*(a, b: Obj): bool = a.x == b.x and 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
- Korrigjuar një gabim, ku "sizeof(T)" brenda një shablloni "typedesc", i thirrur nga një shprehje when të gjenerikut, shkaktonte një gabim kompilimi.
Ndryshimet kryesore që ndikojnë në mbështetje për të kaluarën:
- Në mënyrë të parazgjedhur, është aktivizuar FLAGS "-d:nimPreviewFloatRoundtrip". Funksionet "system.addFloat" dhe operatori "$" tani përdorin algoritmin Dragonbox për të gjeneruar përfaqësime minimale të vargjeve të numrave me pikë flotante me garanci të saktë për rrumbullakim dhe kthim të transformimit. Për t'u kthyer në sjelljen e vjetër, është në dispozicion flagu "-d:nimLegacySprintf".
- Parametri "default" nĂ« funksionin "tables.getOrDefault" Ă«shtĂ« rinovuar nĂ« "def" pĂ«r tĂ« shmangur konfliktet me "system.default". Kodi qĂ« pĂ«rdor argumente tĂ« emĂ«ruara "getOrDefault(âŠ, default = âŠ)" kĂ«rkon pĂ«rditĂ«sim.
- Kur është aktivizuar flagu "-d:nimPreviewCheckedClose", funksioni "close" në modulit "std/syncio" tani gjeneron një përjashtim në rast gabimesh të input-it/output-it.
- Paralajmërimet dhe sugjerimet e panjohura të kompilatorit tani gjenerojnë një paralajmërim "warnUnknownNotes" në vend të gabimeve.
- Me flagun "-d:nimPreviewAsmSemSymbol", në operatorët asm/emit është shtuar një kontroll i tipave për simbolet në thonjëza të prera.
- Blloku "except:" pa pĂ«rcaktimin e tipit tani shkakton njĂ« panic nĂ« kapjen e "Defect". Rekomandohet qĂ« pĂ«r pĂ«rpunim tĂ« pĂ«rdoret "except Exception:" ose "except Defect:". PĂ«r migrim, Ă«shtĂ« parashikuar flagu "âlegacy:noPanicOnExcept".
- Me flagun «-d:nimPreviewCStringComparisons» operatorët e krahasimit ({, >, {=, >=) për «cstring» janë kaluara nga semantika e referencave në semantikën e vlerave, njësoj si «==» dhe «!=».
- Moduli std/parsesql është nxjerrë në një paketë të veçantë nimble; për ta instaluar kërkohet «nimble install parsesql» ose përdorimi i menaxherit atlas.
- Me flagun «-d:nimPreviewDuplicateModuleError» importimi i dy moduleve me emra të njëjtë bëhet një gabim kompilimi. Për të zgjidhur kolizionet rekomandohet përdorimi i aliasëve: «import foo si foo1».
- Shtuar opsioni «âmangle:nim|cpp» pĂ«r tĂ« zgjedhur stilin e mangllimit tĂ« emrave kur informacioni pĂ«r debuggim Ă«shtĂ« i pĂ«rfshirĂ« (mĂ«nyra parazgjedhje Ă«shtĂ« cpp).
- Parametri i dytë i funksioneve succ, pred, inc, dec në modulën system tani pranon tipin «SomeInteger» në vend të «Ordinal».
- Operatorët e zhvendosjes së bitëve (shl, shr, ashr) aplikojnë maskën e bitëve në operandin e djathtë në backend-et C/C++/VM/JS.
- Shtuar paralajmĂ«rimin «âwarning:ImplicitRangeConversion», i cili zbuloj konvertimet e rrezikshme tĂ« paqarta nĂ« intervale mĂ« tĂ« vogla (p.sh., int -> range[0..255]), tĂ« cilat mund tĂ« shkaktojnĂ« panik gjatĂ« ekzekutimit.
Risi në bibliotekën standarde:
- Moduli «setutils» ka marrë funksionet «symmetricDifference», operatorin «-+-» dhe versionin inline «toggle» për të llogaritur në mënyrë efektive diferencën simetrike të grupeve të bitëve.
- NĂ« «strutils.multiReplace» Ă«shtĂ« shtuar mbingarkesa pĂ«r tĂ« zĂ«vendĂ«suar karakteret nga njĂ« grup nĂ« njĂ« kalim â e dobishme pĂ«r sanitizimin e vargjeve.
- Në modulin std/files janë shtuar procedurat me mbështetje për tipin Path: getFilePermissions, setFilePermissions, tryRemoveFile, copyFile (me bufer të konfigurueshëm dhe trajtim të lidhjeve), copyFileWithPermissions, copyFileToDir. Janë eksportuar tipet CopyFlag dhe FilePermission për kontrollin e hollë të operacioneve me skedarë.
- Moduli std/dirs mori procedura të reja: copyDir dhe copyDirWithPermissions për kopjimin rekurziv të direktorive duke ruajtur atributet.
- Në backend-et refc, JS dhe VM është implementuar mbështetje për funksionin «system.setLenUninit» për tipin «string», e cila lejon ndryshimin e gjatë të vargut pa inicializimin e memories së re gjatë zgjerimit.
- Në std/parseopt është shtuar mbështetje për disa metoda të analizës së argumenteve të linjës së komandës përmes enumeratës CliMode: Nim (për default), si dhe eksperimentale Lax dhe Gnu.
- Në std/math operatori «^» tani mbështet numrat realë si tregues të fuqisë.
- Funksionet min, max dhe analogët e tyre nga sequtils për openArray tani pranojnë një funksion krahasimi të përdoruesit.
- Implementimi i system.substr është optimizuar: përdoret copymem (një mbështjellje mbi C memcpy) nëse është e pranishme.
- Funksioni system.newStringUninit Ă«shtĂ« shĂ«nuar si pa efekte anĂ«sore, duke lejuar pĂ«rdorimin e tij me flag-un «âexperimental:strictFuncs».
Instrumente dhe dokumentacion:
- NĂ« gjeneratorin e dokumentacionit Ă«shtĂ« shtuar flag-u «âraw» pĂ«r tĂ« çaktivizuar shfaqjen e markup nĂ« dalje JSON.
- Shtuar flag-u «âstdinfile» pĂ«r tĂ« caktuar emrin e skedarit kur ekzekutohet kodi nga stdin (nĂ« mĂ«nyrĂ« default â stdinfile.nim).
- Flag-u «âstyleCheck:warning» lejon trajtimin e shkeljeve tĂ« verifikimeve tĂ« stilit si paralajmĂ«rime, jo si gabime.
- Në manual është shtuar dokumentacioni për pragmën completeStruct.
Rregulluar më shumë se 30 gabime, përfshirë:
- Gabimet në përdorimin e new me ref object dhe gjenerimin e kodit për tuple në array;
- Problemet me përpunimin e parametrave static dhe typedesc;
- Regresionet në sistemet e menaxhimit të memories ORC/refc, duke përfshirë alignimin e objekteve dhe thirrjet e tepërta nimZeroMem;
- Gabimet në analizimin në parseopt, parsecfg dhe gjenerimin e kodit për backend-in JavaScript;
- Lëvizjet dhe rëniet gjatë përdorimit të closure-ve, iteratorëve dhe objekteve të mëdha.
Burimi: opennet.ru
