NIM 1.4

2020-10-16 20:59:23

经过六个月的持续开发,我们非常自豪地宣布NIM 1.4版!除了1.0版之外,这可能是迄今为止最大的NIM版本,我们非常兴奋能发布它!

它正好包含900个新的提交,这些新的提交还没有被移植到我们以前的版本中。与1.2相比,它有几个新的特性和标准库添加。我们试图将破坏更改保持在最低限度,但是如果不进行那些必要的更改,一些错误修复是不可能的,我们认为我们的用户将从中受益。

检查您的操作系统的包管理器是否已经发布了1.4版,或者按照这里的说明进行安装。

如果您使用Choosenim安装了以前版本的NIM,则获取NIM 1.4与以下操作一样简单:

如果您没有Choosenim,您可以按照上述相同的安装链接进行操作。

我们的贡献者太多了,太多了,无法在这里列出。非常感谢你们所有人,没有你们,我们不可能完成这次发布!

如果您还没有看过NimConf 220提供的这段视频,我们推荐NimConf 220提供的这段视频,其中Araq解释了ARC背后的详细信息,并展示了一些基准来说明它的优点,这是一种新的引用计数算法,称为ARC。如果您还没有看过它,我们推荐使用NimConf 220提供的这段视频。

据我们所知,ARC使用完整的标准库,除了当前的异步实现之外,因为这会引入ARC不处理的周期。还有其他开发中的异步实现不会引入周期。

ORC是现有的ARC算法加上一个周期收集器,并且--GC:ORC是我们这个版本的主要新特性!我们推荐阅读这篇介绍性的ARC/ORC帖子来了解ARC/ORC的优势。

如果您尚未在NIM 1.2中使用ARC,则只需在命令行中传递--gc:arcon:

如果您的代码使用循环数据结构,或者如果您不确定代码是否生成循环,则需要使用--gc:orc和not--gc:arc.。

如果您有一个看起来是循环的对象,但您知道它不是循环的,您可以通过将其标记为{.acycyclical来帮助ORC。}使用以下方式:

如果您在代码中使用system.deepCopy,则需要通过命令行上的--deepCopy:on启用它。这是一个创可贴,将来会有更好的解决方案。

这种选择加入切换的原因是ARC和ORC不使用系统的旧运行类型信息(RTTI)。Deep Copy是在此基础上构建的。我们在构建ARC和ORC时考虑到了嵌入式设备,据报道,旧RTTI的开销是不可接受的。

人们可能会遇到的第二个问题是自定义析构函数的严格排序要求;这也会影响旧代码,因为终结器映射到析构函数。例如:

Type CustomObject=ref object p:ptr int proc tricky()=#将使用默认析构函数变量x:CustomObject proc finalizer(x:CustomObject)=if x。P!=nil:dealloc(x.。P)proc newCustomObject():CustomObject=new(result,finalizer)

Temp.nim(15,6)错误:无法将另一个';=销毁';绑定到:CustomObject:ObjectType;以前的声明是在此处隐式构造的:temp.nim(8,7)。

原因是只有在调用new(result,finalizer)之后,编译器才知道它需要为CustomObject类型生成一个自定义析构函数,但是当它编译时很棘手,会使用默认析构函数。

Type CustomObject=ref object p:ptr int proc finalizer(x:CustomObject)=if x。P!=nil:dealloc(x.。P)proc newCustomObject():CustomObject=new(result,finalizer)proc Tricky()=#使用自定义析构函数var x:CustomObject。

这是当前的限制,将在编译器的未来版本中进行改进。

这是一个试验性功能,可以通过代码中的{.Experial:";strictFuncs";.}杂注或通过--Experial:strictFuncs开关获得。

它为“副作用”引入了更严格的定义:如果可以通过未声明为var参数的参数访问对象,则对该对象的任何突变都将算作副作用。

{。实验:";strictFuncs";.}type Node=ref object le,ri:node data:string func len(n:node):int=#Valid:LEN在it!=nil:incresult it=it时没有副作用var it=n。Ri func mut(n:node)=let m=n#是将突变连接到参数m的语句。数据=#34;耶&34;#突变在此#错误:#{#39;mut#39;可能有副作用#从##39;n#39;可访问的对象可能会发生突变。

为std/jsonutils模块添加了一些增强功能。添加了将JSON数组直接反序列化为HashSet和OrderedSet类型,并分别通过jsonutils.fromJson和jsonutils.toJson过程将这些类型序列化为JSON数组的可能性。

添加了通过jsonutils.fromJson和jsonutils.toJson过程将JSON空对象反序列化为NIM选项对象和分别将NIM选项对象序列化为JSON对象(如果是Somee)或序列化为JSON空对象(如果通过jsonutils.fromJson和jsonutils.toJson过程为None)的可能性。

向jsonutils.fromJson添加了一个Joptions参数,该参数当前包含两个布尔选项allowExtraKeys和allowMissingKeys。如果allowExtraKeys为true,则不要求解析JSON的NIM对象的每个JSON键都有一个字段。

如果allowMissingKeys为true,则允许解析JSON的NIM对象具有没有对应JSON键的字段。

Ordinal的默认散列已更改为更多的比特加扰。导入散列;proc散列(x:myint):hash=hashIdentity(X)在实例化上下文中恢复oldo,而-d:nimIntHash1全局恢复它。

子进程将不再继承从stdlib中的高级抽象创建的文件句柄。特别是,这些模块会受到影响:异步调度、异步网络、系统、本地套接字、网络和选择器。

对于异步调度、异步网络、网络和本机套接字,所有创建套接字的进程都添加了可继承标志,允许用户控制结果套接字是否可继承。提供此标志是为了简化需要套接字继承的多进程服务器的编写。

对于过渡周期,定义nimInheritHandles以默认启用文件句柄继承。由于操作系统之间的语义不同,此标志不会影响选择器模块。

为了设置文件句柄或套接字继承,还引入了asyncdisch.setInherable、system.setInherable和nativesockets.setInherable。并非所有平台都定义了这些PROC。

由ioselector_kqueue和ioselector_EPOLL为内部记账创建的文件描述符将不再泄露给子进程。

精度=0的structils.format Float已经恢复到版本1的行为,该行为会生成拖尾点,例如,FormatFloat(3.14159,Precision=0)现在是3,而不是3。

RelativePath(rel,abs)和relativePath(abs,rel)过去常常默默地给出错误的结果(参见#13222);相反,它们现在使用getCurrentDir来解决这些情况,这现在可以在getCurrentDir抛出的边缘情况下抛出。RelativePath现在也可以通过-d:NodeJS用于js。

JavaScript和NimScript标准库更改:Streams.StringStream现在在JavaScript中受支持,但限制是使用的任何缓冲区指针必须可强制转换为PTR字符串,任何不兼容的指针类型都将不起作用。词库和STREAMS模块过去由于错误而无法编译onNimScript,但此问题已修复。

以下模块现在可以在JS和NimScript上编译:parsecsv、parsecfg、parsesql、xmlparser、htmlparser和ropes。另外,JS还支持cstructils.startsWith和cstructils.endsWith,for NimScript:json、parsejson、strtabs和unidecode。

添加了Streams.readStr和Streams.peekStr重载以接受要修改的现有字符串,这避免了内存分配,类似于Streams.readLine(#13857)。

对位操作模块的改进,包括位片、原始掩码函数的非变异版本、掩码/掩码以及对位与、位或和位异或的可变参数支持。

糖度=>;和糖度。->;更改:以前将(x,y:int)转换为(x:auto,y:int),现在改为(x:int,y:int)以与常规proc定义保持一致(尽管您不能使用分号)。

现在,=>;的左侧允许使用语法和名称。以下是这些更改的一个示例:

进口糖foo(x,y:int){。NoSideEffect}=>;x+y#转换为proc foo(x:int,y:int):auto{。NoSideEffect}=x+y。

Time.DateTime的字段现在是私有的,可以使用getter和过时的setter进行访问。

TIMES模块现在可以更一致地处理DATETIME的默认值。给定未初始化的DATETIME时,大多数pros会引发断言错误,例外是==和$(返回";Uninitialized DateTime";)。添加了proc times.isInitialized,可用于检查DateTime是否已初始化。

修复在osproc.startProcess中对io流调用Close是noop的错误,如果进程同时从stdin读取和写入(例如到stdout),则会导致挂起。

根据Mozilla的建议,net.newContext现在默认为以“中间兼容性”为目标的密码列表,而不是全部。这一改变应该会保护用户不被使用弱的和不安全的密码,同时仍然提供与大多数互联网的充分兼容性。

添加了一个新的模块std/jsonutils,该模块带有可挂钩的jsonTo、toJson、from Json操作,用于自定义类型的json序列化/反序列化。

添加了一个新的proc heapqueue e.find[T](heap:HeapQueue[T],x:t):int来获取元素x的索引。

添加了随机性.Gauss,它使用从高斯分布采样的制服比率方法。

类型。$Changes:$(int,)现在是";(int,)";而不是";(Int)";;$tuple[]";而不是";tuple[]";;$((int,Float),int)现在是";((int,Float),int)";而不是";((int,Float),int的元组)";

使logging.newRollingFileLogger中的maxLines参数为正,因为负值将导致为每个记录行创建一个没有意义的新文件。

更改了日志记录中的日志,以便对JavaScript使用适当的日志级别,例如,debug使用console.debug,info使用console.info,warn使用console.warn,等等。

表、哈希集、共享表和DQUE不再要求传递的初始大小必须是2的幂-这是在内部完成的。表和哈希集的Proc RightSize已弃用,因为不再需要它。CountTable.inc再次接受val:int,而不是val:正;也就是说,它可以再次“倒计时”。

Std/with,sugar.dup现在支持对象字段赋值表达式:import std/with foo=object x,y:int var foo=foo()with foo:x=10 y=20 echo foo。

Proc math.round不再被弃用。使用strformat的建议并不适用于所有用例。ROUND的局限性和(缺乏)可靠性是有据可查的。

将getProtobyname添加到winlean。将getProtoByname添加到本机套接字,该套接字从数据库返回与协议名称匹配的协议代码。

添加了以下集合的毒性检测流程。其用法类似于procs,如sets.toHashSet和tables.toTable。以前,需要手动创建所需的空集合并添加项。ToCritBitTree,它从项目的openArray或对的openArray创建CritBitTree。

=Destroy挂钩不再需要重置其目标,因为编译器现在会自动在需要的地方插入waMoved调用。

为清楚起见,=钩子现在称为=copy。旧名称=仍然可用,因此不需要更新您的代码。此更改也已向后移植到1.2版,因此您可以使用可读性更高的版本,而不会影响兼容性。

在新的运行时中,只要case对象没有自定义析构函数,现在就可以不受限制地将其赋给鉴别器字段。鉴别器值也不必是常量。如果您有一个案例对象的自定义析构函数,并且您确实想要自由分配鉴别器字段,建议您将该对象重构为2个对象,如下所示:

Type MyObj=对象案例种类:Bool of true:y:ptr UncheckkedArray[Float]of false:z:SEQ[int]proc`=delesty`(x:MyObj)=if x。Kind和x。Y!=nil:DeallocShared(x.。是)。

Type MySubObj=Object Val:PTR UncheckkedArray[Float]MyObj=Object案例种类:Bool of true:y:MySubObj of false:z:SEQ[int]proc`=delesty`(x:MySubObj)=if x。Val!=nil:Deal LocShared(x.。VAL)。

枚举类型符号上的getImpl现在返回字段syms而不是ident。这有助于编写类型化的宏。可以使用--useVersion:1.0恢复向后兼容的旧行为。

Proc标头的类型化AST现在的参数将是syms而不是id,这有助于编写类型化宏。可以使用--useVersion:1.0恢复向后兼容的旧行为。

不再使用.raise:[]异常跟踪机制跟踪从system.Defect继承的异常。这与内置操作更加一致。以下代码通常用于编译(现在仍然使用):proc mydiv(a,b):int{。提升:[].}=a div b#可以引发DivByZeroDefect。

Proc mydiv(a,b):int{.。引发:[].}=if b==0:引发newException(DivByZeroDefect,";除以零";)否则:result=a div b。

这样做的原因是DivByZeroDefect继承自Defect,并且With--Panics:On Defects变成了无法恢复的错误。

有一个名为“strictFuncs”的新实验功能,它使.noSideEffect的定义更加严格。有关更多信息,请参见此处。

“for-loop宏”(参见手册)不是Longeran的实验特性。换言之,如果您想要使用它们,您不必编写杂注{.experial:";for LoopMacros";.}。

添加了.noalias杂注。它被映射到C的RESTRICE关键字,以提高该关键字可以实现的性能。

项不再使用带有漏洞的枚举进行编译,因为其行为容易出错,请参见#14004。

添加了STD/Effects特征模块,用于自省推断的效果。我们希望这能够使异步宏精确地记录可能引发的异常。

杂注阻止{.gcsafe。}:...。和{.noSideEffect.。}:...。现在也可以改写为{.cast(Gcsafe)。}:...。和{.cast(NoSideEffect)。}:....。这是写这些的新首选方式,强调它们的不安全性质。

新命令:nim r main.nim[args...]。它编译并运行main.nim,并暗示--usenimcacheso使用与NIM c-r相同的逻辑将输出保存到$nimcache/main$exeExt,以避免在源代码不变时进行重新编译。例如:NIM r编译器/nim.nim--help#仅在第一次编译echo';import os;echo getCurrentCompilerExe()';|nim r-#这对onim r编译器/nim.nim--fullhelp#无重新编译nim r--nimcache:/tmp main#二进制保存到/tmp/main起作用。

--HINT:现在支持处理,表示--HINT:PROCESSING:ON(与其他提示和警告相同),与所有其他布尔标志一致。(从1.3.3开始)。

添加了新的提示--提示:msgOrigin将显示编译器消息(提示|警告|错误)是在哪里生成的;当它来自哪里并不明显时(因为多个位置生成相同的消息,或者因为消息涉及运行时格式),这尤其有用。

添加了新的标志--backend:js|c|cpp|objc(或-b:js等),用于更改后端;可以与任何命令(如nim r、doc、check等)配合使用;可以安全地重新分配。

添加了新标志--doccmd:cmd为RunnableExamples传递附加标志,例如:--doccmd:-d:foo--threadsuse--doccmd:跳过以跳过RunnableExamples和rst测试片段。

RunnableExamples";-b:cpp-r:off";:现在支持代码,允许覆盖示例的编译和运行方式,例如更改后端。

当--outdir未指定(带或不带--project)时,NIM doc现在会在$projectPath/htmldocs下输出;传递--project现在会自动生成索引并启用搜索。有关详细信息,请参阅docgen。

$getType(无类型)现在是“无类型的”而不是“expr”,$getType(有类型的)现在是“有类型的”而不是“stmt”。

接收器推理现在默认禁用,必须通过--sinkInference:ON显式启用。注意:对于标准库,接收器推理仍处于启用状态。此更改与--GC:ARC、--GC:ORC内存管理模式最相关。

Nimsuggest现在在def查询时返回转发声明和实现位置。以前,该行为只返回转发声明。

修复“关键:1个已完成的未来,多个等待:只有1个等待将被唤醒(最后一个)”(#13889)。

修复了使用{.borrow.}运算符时32位上的“”DISTINCT UINT64“”类型损坏“(#13902)。

修复了版本1.2.0上的“C编译错误-gc:arc1.2.0”未知类型名称‘TGenericSeq’“(#13863)。

修复“proc的var返回类型在c++后端不起作用”(#13848)。

修复了当openarray源是本地字符串并使用gc:arc时,简单的‘var openarray[char]’赋值崩溃问题(#14003)

修复了“对于我的枚举中的枚举,使用带孔的枚举得出不正确的结果”(#14001)。

修复“恼人的警告:继承自更精确的异常类型,如ValueError、ioError或OSError[固有异常]”(#14052)。

修复“RelativePath(”foo“,”/“)和”relativePath(“/”,“foo”)错误“(#13222)。

修复“stdlib中的异常类型应继承自CatchableError或Defect,而不是Exception”(#10288)。

修复“nim jsondoc-o:doc.json filename.nim使用无类型序列失败”(#14066)。

修复“NIM文档无法运行NIM 1.2.0(NIM 1.0.4可以)”(#13986)。

修复“导入os+在config.nims中使用existsDir/dirExists/existsFile/fileExists/findExe导致”调用不明确的错误“(#14142)。

修复“导入os+在config.nims中使用existsDir/dirExists/existsFile/fileExists/findExe导致”调用不明确的错误“(#14142)

修复“RunnableExamples文档生成编译器崩溃,异常为e语法”(#14177)。

修复了“[ARC]”内部错误:环境缺失:“在终结器中”(#14243)。

修复“windows中openprocess的返回值无效为NULL,而不是INVALID_HANDLE_VALUE(-1)”(#14289)。

修复“除非NIM目录在$PATH中,否则在OpenBSD上构建koch失败”(#13758)。

修复了“[GC:ARC]案例对象赋值信号:未为基元类型调用销毁”(#14312)。

修复了“正在获取”警告:无法证明“结果”已初始化“用于具有var T返回类型的导入cpp进程”(#14314)。

修复“在使用/-GC:ARC在循环中创建线程时遇到SIGSEV”(#13935)。

修复“nimvm:sysfaal:未处理的异常:无法使用类型为‘tnode’[字段错误]的判别式‘Kind’访问‘Sons’”(#14340)

修复了“RunnableExcept On Specified Error Failures With NIM doc”(#12746)。

修复“NIM文档--对于子模块的相对路径,项目显示‘@@/’而不是‘../’”(#14448)。

修复“runnableExamples应保留源代码文档注释、字符串和(可能)格式”(#8871)。

修正了“借出不安全:在#14447之后,您可以使用”Items“循环进行序列修改”(#14498)。

修正了“var op=fn()WRO”

.