就在今天,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 现在可以强转任意整数类型。