Lëshimi i gjuhës së programimit Nim 2.2.6

Ë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;
  • 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

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster