ĂshtĂ« prezantuar versioni i gjuhĂ«s sĂ« programimit sistemor Nim 2.2.6. Ky pĂ«rditĂ«sim erdhi gjashtĂ« muaj pas lĂ«shimit tĂ« versionit 2.2.4 dhe pĂ«rmban 141 komite pĂ«r rregullime tĂ« gabimeve dhe pĂ«rmirĂ«sime nĂ« performancĂ«. Nim Ă«shtĂ« njĂ« gjuhĂ« programimi e tipizuar statikisht dhe e kompilueshme me njĂ« sintaksĂ« tĂ« frymĂ«zuar nga Python, si dhe mundĂ«si metaprogramimi nĂ« nivelin Lisp. Gjuha kompilon nĂ« C, C++ dhe JavaScript, duke ofruar performancĂ« nĂ« nivelin e C-sĂ« me shprehshmĂ«ri tĂ« gjuhĂ«ve tĂ« nivelit tĂ« lartĂ«. Kodi i projektit ofrohet nĂ«n licencĂ«n MIT.
Karakteristikat kryesore të Nim përfshijnë një sistem të fuqishëm makroesh që funksionon mbi AST gjatë kompilimit, një sistem të zhvilluar të programimit të përgjithshëm me koncepte, dispatch multiple (shpërndarje multiple), menaxhim të determinueshëm të memories me mbështetje për disa strategji (ARC/ORC, refc, etiketim-dhe-pastrim), 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ë sistemore, e përshtatshme për zhvillimin nga sistemet e integruara deri te uebi.serverëve, me theks në efikasitet, sigurinë e memories dhe lehtësinë e zhvillimit.
Ndryshimet kryesore:
- Optimizimi i semantikës move për fushat e objekteve. Kompilatori mësoi të njohë mundësinë e aplikimit të operacioneve move gjatë kthimit të fushave të objekteve. Më parë, konstrukcionet si «return obj.field» shkaktonin kopjimin e të dhënave, tani kompilatori aplikon saktësisht zhvendosjen: proc getField(obj: MyObject): string = return obj.field # Tani move në vend të copy
Kjo është veçanërisht e rëndësishme për tipet e dhënave të rënda (strinjë, sekuenca, objekte me burime), ku eliminimi i kopjimeve të tepërta sjell një rritje të dukshme të performancës pa ndryshuar kodin.
- Rishikimi i plotë i iteratoreve closure me trajtimin e përjashtimeve. Mekanizmi i transformimit të iteratoreve closure është rishkruar plotësisht, gjë që përmirësoi në mënyrë drastike stabilitetin e kodit async me trajtimin e përjashtimeve. Probleme kritike janë korrigjuar, duke përfshirë SIGSEGV gjatë përdorimit të try/except jo në nivelin e lartë: iterator problematicIterator(): int {.closure.} = for i in 0..10: try: if i == 5: raise newException(ValueError, «test») yield i except ValueError: discard # Më parë shkaktonte SIGSEGV
Poashtu është zgjidhur problemi me kalimin e papërshtatshëm të përjashtimeve në blloqet finally brenda iteratoreve closure.
- Korrigjimet e lidhura me menaxhimin e memories
- Zgjidhur një problem themelor në mbledhësin e mbetjeve kur trajton struktura të dhënash ciclike, i cili mund të shkaktonte daljen e gabimit 'Qasje e paligjshme në ruajtje'. Problemi ekzistonte që nga krijimi i gjuhës dhe shfaqej në grafet komplekse të objekteve me lidhje të ndërsjella.
- Korrigjuar rendin e pahijshëm të shkatërrimit të objekteve, i cili mund të shkaktonte qasje në memorie të çliruar tashmë: tip Burimi = objekt të dhënat: ptr Të Dhënat Konteineri = objekt burimi: Burimi tjetër: BurimiTjetër # Tani, dezinstaluesit thirren në rendin e duhur: # fillimisht tjetër, pastaj burimi
- Mbledhësi ORC gabimisht shënonte mjediset e disa mbylljeve si ciklike, të cilat çojnë në vonesa në çlirimin e memories ose rrjedhje. Tani analiza e cikleve punon në mënyrë korrekte.
- Korrigjuar një rrjedhje soketesh në asyncnet kur ndodhin gabime në pajtimin e lidhjes TLS: proc trajtoKlientin() {.async.} = var soketi = prit për serverin.prano() provo: prit për të konfiguruarSSL(soketin) # Në rast gabimi, këtu soketi tani mbyllet siç duhet përjashto SSLError: hodh poshtë # Soketi nuk rrjedh më
- Korrigjime kritike në kompiler.
- Korrigjimi i një regresioni, ku variablat globalë, të shpallura brenda procedurave me parametra static, riperëkuptoheshin me çdo thirrje: proc test[N: static int]() = var global {.global.}: array[N, int] global[0] += 1 echo global[0] test[5]() # Tregon: 1 test[5]() # Duhej: 2, por tregonte: 1 (ishte riparëkuptuar)
- Rregulluar gjenerimi i kodit për variablat globalë në funksione rekursive, i cili shkaktonte sjellje të paqartë.
- Zgjidhur një problem të vjetër me gjenerimin e kodit C të pavlefshëm kur përdoren konstruktoret për variablat globalë brenda konvertuesve: converter toInt(x: MyType): int = let global {.global.} = MyType() # Gjeneronte kod C të pavlefshëm result = global.value
- Korrigjuar rënia e kompilatorit gjatë gjenerimit të përjashtimeve të tipit Defect dhe përdorimit të doAssert në kontekste të caktuara.
- Përmirësime në sistemin e tipeve
- Korrigjuar pamundësia për të kthyer vlera lent nga shprehjet case/if: proc getBest(a, b: string): lent string = if a.len > b.len: return a # Më herët: gabim kompilimi else: return b
- Problemi me ruajtjen e gabuar të vlerave lent-fusha në llojet e përmbledhura është zgjidhur: type Wrapper[T] = object data: lent T proc process[T](w: Wrapper[T]) = echo w.data # Vlera tani ruhet siç duhet
- Kontrolli i inicimit të variablit result për llojet me requiresInit, i cili ishte prishur në versionin 2.2, është rikthyer: type MustInit {.requiresInit.} = object value: int proc test(): MustInit = discard # Tani japin saktësisht një gabim për result-in e pa inicuar
- Korrigjim i injorimit të nocionit të papërkthyeshmërisë («.noCopy») të llojit bazë: type Base {.noCopy.} = object Derived = object of Base var a: Derived var b = a # Tani është ndaluar siç duhet
- Optimizime të performancës
- Përshpejtimi i operatorit «@» për lloje triviale: u eliminua degradimi kritik i performancës gjatë krijimit të sekuencave nga matrixet e llojeve të thjeshta: let arr = [1, 2, 3, 4, 5] let s = @arr # Ishte shumë i ngadaltë, tani është optimal
- Optimizimi vmgen.sameConstant: kompilimi është përshpejtuar ndjeshëm përmes optimizimit të krahasimit të konstantave në makinën virtuale kompilues dhe zvogëlimit të operacioneve të alokimit të memories.
- Dereferenca e rezultatit të cast në një shprehje të vetme nuk shkakton më kopje të panevojshme: let data = cast[ptr MyType](address)[] # Tani pa kopjimin
- Korreksione specifike për backend
- JavaScript
- =destroy për llojet jo-var: u korrigjua gjenerimi i destruktoreve, i cili më parë shkaktonte gabime kompilimi.
- cast[char] për vlerat > 255: tani kryhet saktë truncimi, si në C-backend.
- Konceptet në varargs: u eliminua dalja e gabimit 'internal error' kur kaloheshin konceptet në varargs.
- C++: U rikthye L-valueness për llojet e përputhshme që ishte prishur në regresionin midis versioneve 2.2.2 dhe 2.2.4: # nim cpp var x: CppCompatibleType takeRef(x) # Përsëri funksionon si lvalue
- C (refc)
- pthread në disa platforma: u korrigjua gjenerimi i kodit për pthread_mutex_t duke përdorur .abi;
- Tipet e përgjithshëm me memorie GC: u eliminua gjenerimi i kodit C të gabuar për tipet e përgjithshëm që përmbanin memorie të menaxhuar;
- JavaScript
- Makinë virtuale
- Variablat globale dhe caktimet: korrigjime të shumta për punën me variablat globale në fazën e kompilimit.
- Objektet Case nga proc compileTime: u korrigjua kalimi i objekteve variant si parametra static.
- repr për vargje të gjata nën refc: u eliminua RangeDefect kur përdorej repr.
- Korrigjime në bibliotekën standarde
- Në strutils.formatSize është rregulluar puna me vlera të mëdha, të afërta me int64.high: echo formatSize(9223372036854775807) # Tani është rezultati i saktë
- Në deques është rindihmuar kompatibiliteti i sjelljes së iteratorit items midis versioneve 2.0.16 dhe 2.2.0.
- Në lists.SinglyLinkedList.remove është eliminuar AssertionDefect gjatë heqjes së elementeve nga lista e lidhur njëherësh.
- Në tables.withValue është rregulluar kushti i verifikimit në makron withValue për tabelat e pandryshueshme.
- Pragmat dhe fushat e dukshmërisë
- Në «{.push raises: [].}» është rregulluar injorimi i gabuar i fushave leksikore për pragmat push me raises.
- ĂshtĂ« eliminuar efekti i «rrjedhjes» sĂ« çaktivizimit tĂ« paralajmĂ«rimeve pĂ«rtej pragmave: {.push warning[UnusedImport]: off.} import module1 {.pop.} import module2 # ParalajmĂ«rimet tani rikthehen saktĂ«
- Korrigjime të tjera të rëndësishme
- Krahasimi i cstring: janë shtuar operatorët e munguar «<» dhe «cmp» për cstring.
- Kontrolli i intervaleve float: është përfshirë kontrolli i saktë i intervaleve për numrat me pikë floating.
- filterIt dhe rvalue: është rregulluar kthimi i gabuar të rvalue në vend të lvalue.
- ĂshtĂ« eliminuar FieldDefect gjatĂ« krahasimit tĂ« treguesve nĂ« fazĂ«n e kompilimit.
- hasCustomPragma pas kopjimit typedesc: rikuperuar funksionaliteti pas kopjimit të deskriptorëve të tipeve.
- nim doc dhe fushat private: rregulluar përdorimi i komenteve nga fushat private për publik.
Burimi: opennet.ru
