就在今天,Nim团队非常荣幸地宣布万众期待的1.0语言版本。
Nim一直专注于提供高效、可读和灵活的静态编译类语言。
1.0版本标志可以在接下来的几年使用Nim的未来版本不会破坏当前版本的代码,开始有稳定的基础。
Nim构建了一个温暖和热情的社区,准备好了迎接新手们的到来。
如果你是一名新手,看看我们的学习资源,在我们的试练场试用Nim。
稳定保证
1.0版本是长期支持的稳定发布版,只接受bug修复和未来新特性,前提是它们不破坏向后兼容性。
1.0.x分支将按需接收bug修复。不影响向后兼容的新特性将继续稳步进入1.x分支。
我们的目标是保证Nim1.0编译的代码在未来任何稳定的Nim1.x版本上可持续的编译。
稳定性保证包含哪些?
向后兼容只覆盖语言的稳定部分,这些部分定义在手册上。
编译器将实现实验性的特性记载在实验手册。这些特性可能存在向后不兼容;包括concepts,do记号和一些其它特性。也有标准库模块仍然不稳定——这些已经在文档中标记为“不稳定API”。
你可以使用实验特性,即便是产品中,但注意这些不像我们期待的那样饱满。
标准库也被覆盖,只要相关问题在文档中模块清晰的标记了v1.0标签。
例外情况
我们当然也必须承认存在例外。在一些严重的情况下,例如标准库的安全漏洞,我们保留使用它的向后不兼容性权利。
安装Nim1.0
新手
看看你的操作系统包管理器是不是已经构建了1.0版本或通过这里安装。
存量用户
如果有使用choosenim安装了之前Nim版本的用户,简单如下:
$choosenim update stable
奉献者们
经年累月,有超过500人向Nim的代码贡献过,实现新特性,修复bug和问题,写文档等等。Nim团队感谢所有帮助过我们构建Nim成为今天这样的贡献者们。
我们也将感谢所有构建Nimble包,扩展Nim生态的贡献者们。Nimble包增长稳定,2019年8月我们突破了1000个包的历史大关。我们对于发布1.0将促进生态更长远的发展表示乐观。
Nim语言之父对于1.0版本的个人感言
功夫不负有心人,我们终于做到了!万众瞩目的1.0版本来了。
当我开始Nim开发时,我想的是一个编译成C的不超过2万行代码的简单语言。核心指导方针是Nim是具有宏系统用以扩展微核心缺少的所有特性的轻量语言。
当前的编译器加部分它使用的标准库有大概14万行代码,运行在充足的操作系统和CPU架构上,可以编译成C++和JavaScript,并且Nim的元编程能力是数一数二的。当语言不再轻量,证明了元编程无法取代所有现代语言需要的构建环节。
例如,当Nim用宏系统实现async时,宏系统需要能够将代码编译成状态机。这些状态机需要goto和获取环境的方式。所以Nim的内核需要增加”闭包迭代器”来实现。
此外,我们还没有真正了解如何利用宏系统提供在类型系统层面的可扩展性,所以Nim的内核需要泛型和泛型约束。
关于开发进展
之前说过,我对语言开发进展表示满意,版本1.0意味着我们现在有不同的开发进展:之前的Nim被太多”最少的惊喜原则”推动导致每个人可以说”额,我认为这本来应该工作…“,然后实现随之而来还添加了特殊情况。特殊情况可能走火并让系统更难理解,最终产生了惊喜。从1.0版本开始我们采用”规范先行“的开发:先写RFC,讨论,再写规范,再实现,在实现过程中获得对规范的洞察。
是的,我知道规范/手册有一些疏漏和bug,这正在改善,新的”析构器“语言特性就是用”规范先行”的方式开发的,在即使有瑕疵的规范下,结果也好很多。
Nim的未来
我们想专注于Nim的工具,包括Nimsuggest(多种编辑器的Nim代码补全引擎),Nimble(Nim的包管理器)和Nimpretty(Nim的源代码格式化工具)。个人认为”增量编译”(IC)是Nim编译器的下个里程碑。IC将进一步加快已经很快的Nim编译,缓存宏展开结果和其它构造。
关于concepts和owned: 人们告诉我这两个特性必须和1.0版本一起发布因为它们改变了Nim代码的实际编写。我不认同,没有concept语言工作的很好,已经有的concepts也可用,尽管它们的语法和语义亟待改善。现在还不确定是否会在语言中使用owned,我也有改善Nim内存管理的其它思考。
1.0版本的宗旨是交付我们有的,不是我们想要的。前途是光明的,1.0版本只是一个开始。就像一场婚姻,只是婚礼的开始。
v1.0 – 2019-09-23
影响向后兼容性的改变
– -d:nimBinaryStdFiles开关没有了。stdin/stdout/stderr再次成为二进制文件。仅影响Windows。
– 在Windows控制台应用,code-page在程序开始时设置为UTF-8。使用-d:nimDontSetUtf8CodePage开关来关闭。
– 语言定义和编译器关于gensym的符号在卫生模板中更加严格。见手册。更多细节,使用编译器开关–oldgensym:on作为过度期。
标准库中的破坏性改变
– 我们移除了unicde.Rune16,因为名字是错的,也没有发现使用它的地方。如果你需要,添加如下代码到项目:
type
Rune16* = distinct int16
– exportc在nim cpp现在使用C命名粉碎而不是C++命名粉碎,匹配importc。nim cpp时使用新的exportcpp C++粉碎。
编译器的破坏性改变
– 允许int隐式转换成小尺寸的范围类型(rang[0’i8..10’i8])的bug已经修复。
库添加
– encoding.getCurrentEncoding现在区分控制台编码和操作系统编码。仅在Windows有意义。
– 添加system.getOsFileHandle 通常比system.getFileHandle更常用。仅在Windows有意义。
– 添加json.parseJsonFragments迭代器加快JSON处理,当JSON片段使用空白符分隔。
库改变
– 添加os.delEnv和nimscript.delEnv.
– 开启Oid在hashtables中的用法。
– 添加unsafeColumnAt过程,从InstantRow返回不安全的cstring。
– 开放sha1模块中的Sha1Digest,Sha1State类型和newSha1State,update和finalize过程。
– 添加std/monotimes模块实现单调时间戳。
– 两个重载exec的一致性错误处理。
– 下列模块现在有官方的不稳定API:
- std/varints
- core/allocators
- core/hotcodereloading
- asyncstreams
- base64
- browsers
- collections/rtarrays
- collections/sharedlist
- collections/sharedtable
- concurrency/atomics
- concurrency/cpuload
- concurrency/threadpool
- coro
- endians
- httpcore
- parsesql
- pathnorm
- reservedmem
- typetraits
其它标准库模块是1.0版本稳定的API。
语言添加
– 内联迭代器现在支持返回lent T类型,类似于返回var T的迭代器:
iterator myitems[T](x: openarray[T]): lent T
iterator mypairs[T](x: openarray[T]): tuple[idx: int, val: lent T]
– 添加importjs编译指示可以用于替换importcpp和importc来导入JavaScript符号。importjs例程类型采用最大灵活性模式。
语言改变
– unit64现在是常规的序数类型。这意味关high(uint64)可以编译并产生正确的值。
工具改变
– Nim编译器现在不能通过nim c -r 重新编译Nim项目如果依赖文件没有改变。可以通过–forceBuild命令行选项覆盖。
– Nim编译器现在会警告未使用的导入模块,可以在你想导入的模块最上层使用{.used.}编译指示不产生警告。
– testament测试工具名字从tester改为testament,可以作为自动运行Nim测试的工具。
编译器改变
– VM现在可以强转任意整数类型。
转自 https://www.oschina.net/news/110079/nim-1-0-released