Մեկ տարվա մշակումից հետո թողարկվել է 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] դաս՝ իտերատորների համար տիպի իրականացմամբ։ template sum[T](a: iterable[T]): T = var result: T for ai in a: result += ai result assert sum(iota(3)) == 0 + 1 + 2 # կամ 'iota(3).sum'
- Ավելացվել է «.effectsOf» նշումների փորձարարական աջակցություն՝ էֆեկտները ընտրողաբար կիրառելու համար։ when defined(nimHasEffectsOf): {.experimental: "strictEffects".} else: {.pragma: effectsOf.} proc mysort(s: seq; cmp: proc(a, b: T): int) {.effectsOf: cmp.}
- Առաջարկվել է ներմուծման նոր սինտաքս՝ «import foo {.all.}», որը թույլ է տալիս ներմուծել ոչ միայն հանրային, այլև մասնավոր սիմվոլներ: Ավելացվել են std/importutils մոդուլը և privateAccess API-ն՝ օբյեկտների մասնավոր դաշտերին մուտք գործելու համար: from system {.all.} as system2 import nil echo system2.ThisIsSystem import os {.all.} echo weirdTarget
- Ավելացվել է կետային օպերատորների փորձարարական աջակցություն, որը կարող է օգտագործվել դինամիկ դաշտեր իրականացնելու համար։ import std/json template '.?'(a: JsonNode, b: untyped{ident}): JsonNode = a[astToStr(b)] let j = %*{"a1": {"a2": 10}} assert j.?a1.?a2.getInt == 10
- Բլոկային արգումենտներում թույլատրվում են լրացուցիչ պարամետրեր։ template fn(a = 1, b = 2, body1, body2) = discard fn(a = 1): bar1 do: bar2
- Իրականացվել է օգտատիրոջ կողմից սահմանված լիտերալների աջակցություն (օրինակ՝ "-128'bignum'"): func `'big`*(num: cstring): JsBigInt {.importjs: "BigInt(#)".} assert 0xffffffffffffffffff'big == (1'big shl 64'big) — 1'big
- Կազմողն իրականացնում է «—eval:cmd» հրամանը՝ ուղղակիորեն գործարկելու Nim հրամանները հրամանի տողից, օրինակ՝ «nim —eval:»echo 1″»։
- Աջակցություն է տրամադրել nimscript-ի հետին պլանի համար ձեր սեփական ընդլայնումներ ստեղծելու համար:
- Սխալի հաղորդագրությունները մեծապես ընդլայնվել են՝ ցույց տալու սխալի հետ կապված համատեքստը: Իրականացված մաքսային կոմպիլյատորի նախազգուշացումներ:
- Զգալիորեն բարելավվել է «--gc:arc» և «--gc:orc» աղբահանների աշխատանքը:
- Բոլոր հետին մասերը բարելավել են կոդի ճշգրտությունն ու կատարումը ամբողջ թվերի և լողացող կետով թվերի վերլուծության համար:
- Բարելավվել է JS, VM և nimscript backend-ների համատեղելիությունը այն մոդուլների հետ, որոնք նախկինում աշխատում էին միայն C backend-ի հետ (օրինակ՝ std/prelude մոդուլը): Բարելավվել է stdlib մոդուլների փորձարկումը C, JS և VM backend-ների հետ:
- Ավելացվել է Apple Silicon/M1 չիպի, 32-բիթանոց RISC-V, armv8l և CROSSOS համակարգերի աջակցություն:
- Ավելացվել են std/jsbigints, std/tempfiles և std/sysrand մոդուլները: Նշանակալի բարելավումներ են կատարվել system, math, random, json, jsonutils, os, typetraits, wrapnils, lists և hashes մոդուլներում:
Source: opennet.ru
