Esitatud on süsteemse programmeerimise keelest Nim 2.2.10. Nim on staatiliselt tüpiseeritud, kompileeritud programmeerimiskeel, mille süntaks on inspireeritud Pythonist ja mis pakub Lisp'i tasemel metaprogrammeerimisvõimalusi. Keel kompileeritakse C, C++ ja JavaScripti, tagades C-tasemel jõudluse, säilitades samas kõrgema taseme keeltele iseloomuliku väljendusvõime. Projekti kood on jaotatud MIT litsentsi alusel.
Nimi võimalused hõlmavad makrosüsteemi, mis töötab AST-lt kompileerimise ajal, üldprogrammeerimise toetust kontseptsioonide kaudu, mitme suunamise (multiple dispatch), määratletud mäluhalduse toetust mitmete strateegiate (ARC/ORC, refc, markeerimine ja koristamine) abil, sisseehitatud async/await toe asünkroonilisele programmeerimisele ja FFI, mis lihtsustab C/C++/JavaScript'iga integreerimist. Nim positsioneerib end süsteemikeelena, mis sobib alates sisseehitatud süsteemidest kuni veebirakenduste arendamiseks,serverite, rõhutades tõhusust, mälu ohutust ja arendamise mugavust.
Muutused keeles ja kompilaatoris:
- Lisatud on eksperimentaalne lipp «—experimental:typeBoundOps», mis realiseerib RFC #380 ja suurendab «hash», «$», «==» liideste töö usaldusväärsust nimeliste tüüpide puhul kaudsete impordite korral. Näide: 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
- Parandatud on viga, kus «sizeof(T)» šablonis «typedesc», mida kutsub esile dženereerika when-lause, põhjustas kompileerimisvea.
Peamised muutused, mis mõjutavad tagasipööratavat ühilduvust:
- Vaikimisi on aktiivne lipukene „-d:nimPreviewFloatRoundtrip“. Funktsioonid „system.addFloat“ ja operaator „$“ kasutavad nüüd Dragonbox algoritmi, et genereerida ujuvate punktide numbrite minimaalne string esitus garantii korraliku ümardamise ja tagasipöördumise kohta. Vanema käitumise taastamiseks on saadaval lipukene „-d:nimLegacySprintf“.
- Funktsiooni „tables.getOrDefault“ parameeter „default“ on ümber nimetatud „def“ konfliktide vältimiseks „system.default“-ga. Kood, mis kasutab nimetatud argumente „getOrDefault(…, default = …)“, nõuab värskendamist.
- Lipukese „-d:nimPreviewCheckedClose“ sisselülitamisel genereerib funktsioon „close“ moodulis „std/syncio“ nüüd erandi sisend-/väljundvigade korral.
- Tundmatud kompilatsioonihäired ja vihjed genereerivad nüüd hoiatus „warnUnknownNotes“ asemel vigu.
- Lipukesega „-d:nimPreviewAsmSemSymbol“ on asm/emit operaatorites lisatud tüüpide kontroll tagasiütlevates tsitaatides.
- Blokk „except:“ ilma tüübita põhjustab „Defect“ püüdmise korral paanika. Soovitav on kasutada „except Exception:“ või „except Defect:“ töötlemiseks. Migratsiooniks on ette nähtud lipukene „—legacy:noPanicOnExcept“.
- Lipukes «-d:nimPreviewCStringComparisons» puhul on võrdlusoperatsioonid ({, >, {=, >=) «cstring» jaoks muutunud viidete semantikal põhinevast väärtuste semantikale, just nagu «==» ja «!=».
- Moodul std/parsesql on viidud eraldi nimble-paketti; selle installimiseks on vajalik «nimble install parsesql» või atlas'e haldur.
- Lipukes «-d:nimPreviewDuplicateModuleError» tõttu muutub kahe sama nimega mooduli import kompileerimisveaks. Nimekokkulangevuste lahendamiseks soovitatakse kasutada alias'e: «import foo as foo1».
- Lisatud on valik «—mangle:nim|cpp», et valida nimede mungeldamise stiil, kui on lubatud silumisinfo (vaikimisi — cpp).
- Funktsioonide succ, pred, inc, dec teine parameeter süsteemimoodulis aktsepteerib nüüd tüüpi «SomeInteger» asemel «Ordinal».
- Bitist tõstukite (shl, shr, ashr) operaatorid rakendavad paremale operandile bitimaski C/C++/VM/JS tagapindadel.
- Lisatud on hoiatus «—warning:ImplicitRangeConversion», mis tuvastab potentsiaalselt ohtlikud vaikimisi muutused väiksema suurusega vahemikele (nt int -> range[0..255]), mis võivad põhjustada käitusaja paanikat.
Uuendused loodud standardraamatukogus:
- Moodulisse «setutils» on lisatud funktsioonid «symmetricDifference», operaator «-+-» ja inline-versioon «toggle», et tõhusalt arvutada bitikogude sümmeetrilist erinevust.
- «strutils.multiReplace» funktsioon sai ülekloaded, et asendada sümbolid komplektist ühe läbimisega — kasulik stringide sanitiseerimiseks.
- Moodulisse std/files on lisatud protseduurid, mis toetavad tüüpi Path: getFilePermissions, setFilePermissions, tryRemoveFile, copyFile (kohandatava puhvri ja linkide töötlemisega), copyFileWithPermissions, copyFileToDir. Eksportitud on tüübid CopyFlag ja FilePermission, et pakkuda täiendavat kontrolli failide operatsioonide üle.
- Moodulisse std/dirs on lisatud uusi protseduure: copyDir ja copyDirWithPermissions, et rekursiivselt kopeerida katalooge, säilitades atribuute.
- Backendides refc, JS ja VM on rakendatud funktsiooni «system.setLenUninit» tuge tüübi «string» jaoks, mis võimaldab muuta stringi pikkust ilma uue mälu initsialiseerimiseta, kui see laiendatakse.
- std/parseopt-sse on lisatud toetus mitmele argumentide parsimise režiimile läbi loendi CliMode: Nim (vaikimisi), samuti katsetavad Lax ja Gnu.
- std/math operaator «^» toetab nüüd reaal(arvude)t, kui eksponentsiaalset näitajat.
- Min, max funktsioonid ja nende analoogid sequtils'ist openArray'ile võtavad nüüd kasutaja poolt defineeritud võrdlemise funktsiooni.
- System.substr ellujäämine on optimeeritud: kui võimalik, kasutatakse copymem'i (C memcpy ümbritsev funktsioon).
- Funktsioon system.newStringUninit on märgitud kõrvaltoimeteta, mistõttu saab seda kasutada lipu "—experimental:strictFuncs" all.
Tööriistad ja dokumentatsioon:
- Dokumentatsiooni generaatorisse on lisatud lipp "—raw" markeeringu renderdamise keelamiseks JSON-väljundis.
- Lipp "—stdinfile" on lisatud faili nime määramiseks koodi käivitamisel stdin'ist (vaikimisi stdinfile.nim).
- Lipp "—styleCheck:warning" võimaldab käsitleda stiilipärimishäireid hoiatustena, mitte vigadena.
- Juhendisse on lisatud dokumentatsioon pragma completeStruct kohta.
Rohkem kui 30 tõrke on parandatud, sealhulgas:
- new'i tõrked ref object'iga ja koodigeneratsioon tuplide jaoks massiivides;
- Probleemid static-parameetrite ja typedesc'i töötlemisel;
- Tagasitõmbed ORC/refc mäluhalduse süsteemides, sealhulgas objektide joondamine ja üleliigsed nimZeroMem'i kutsed;
- Parseopt, parsecfg ja JavaScripti tagumi koodigeneratsiooni vigade parsimine;
- Mälu lekkimine ja kukkumine sulgude, iteratorite ja suurte objektide kasutamisel.
Allikas: opennet.ru
