就在今天,Nim团队非常荣幸地宣布万众期待的1.0语言版本。

以下由中文社区翻译,能力有限,如有翻译错误,欢迎加入
QQ 群指正!

1、前言

Nim一直专注于提供高效、可读和灵活的静态编译类语言。

Nim 团队很高兴为大家带来 1.0.4 版本发布的消息, 这是我们在 Nim 1.0.0
之后发布的第二个补丁版本。

nim是什么?

nim是一门静态编译型语言,语法类似python,nim的代码被翻译成C代码再被C编译器编译成可执行文件。因此nim的可执行文件比较小,性能应该也不错。

最简单的nim程序就这样:

echo "消灭人类暴政!"

编译后EXE一百多K到两百K左右。

下载nim编译环境请到官方网站:

1.0版本标志可以在接下来的几年使用Nim的未来版本不会破坏当前版本的代码,开始有稳定的基础。

想要了解更多关于 1.0.0 版本的细节,可以查看我们两个月前
版本发布说明。

tcc是什么?

tcc是一个体积只有数百K的C语言编译器。
tcc 官方网站

Nim构建了一个温暖和热情的社区,准备好了迎接新手们的到来。

距离前一个版本的发布尽管只是过去了一个月的时间,
但这次的版本已经包含了超过 70
次新的提交,
新修复了 20 个问题, 让我们的 1.0 版本变成了更好的样子。

2、配置nim使用tcc编译nim程序

我的环境:

  • windows 2012 x64
  • nim nim-0.15.0_x64
  • tcc-0.9.26-win64

如果你是一名新手,看看我们的学习资源,在我们的试练场试用Nim。

安装 1.0.4

如果你已经用 choosenim 安装了之前版本的 Nim , 升级到 Nim 的 1.0.4
版本会非常简单:

$ choosenim update stable

如果你还没有安装 choosenim , 你可以通过
这些说明 来下载和安装
choosenim, 当然你也可以按照我们的
安装 页面直接安装。

3、安装nim 和tcc :

  • 为了不和我电脑上已有的nim环境冲突,所以安装的时候,所有的可选项都不选,特别是不要勾选设置环境变量。其它选项都要联网下载文件。浪费时间。
    因为没有添加到path变量,所以每次要用nim和tcc编译,只能启动start.bat的这个窗口来行执行编译。
  • 把tcc 解压后,把tcc的整个目录复制到nim的目录下。

稳定保证

1.0版本是长期支持的稳定发布版,只接受bug修复和未来新特性,前提是它们不破坏向后兼容性。

1.0.x分支将按需接收bug修复。不影响向后兼容的新特性将继续稳步进入1.x分支。

我们的目标是保证Nim1.0编译的代码在未来任何稳定的Nim1.x版本上可持续的编译。

更新日志

你可以 在我们的 GitHub
仓库中
查阅此版本的变更日志以及 Nim 的其余源码。


附《更新日志》

4、修改配置文件:

  • 修改nim目录下confignim.cfg , 把cc = gcc 改为 cc = tcc
  • 你没看错。就是这么简单.
  • 修改nim目录下的start.bat,加上tcc的路径。

start.bat内容我改为如下:

@echo offREM COLOR 0ASET NIMPATH=%~dp0SET PATH=%NIMPATH%bin;%NIMPATH%tcc;%PATH%cmd

完成。

扩展阅读:

Nim的编译方法 :
2016年10月13日 06:58:14 codegay

稳定性保证包含哪些?

向后兼容只覆盖语言的稳定部分,这些部分定义在手册上。

编译器将实现实验性的特性记载在实验手册。这些特性可能存在向后不兼容;包括concepts,do记号和一些其它特性。也有标准库模块仍然不稳定——这些已经在文档中标记为“不稳定API”。

你可以使用实验特性,即便是产品中,但注意这些不像我们期待的那样饱满。

标准库也被覆盖,只要相关问题在文档中模块清晰的标记了v1.0标签。

语言层面的变更

  • 模仿早期版本的 Nim ,在运行时取消了对无符号整数转换的检查。
    文档中已针对这一改进做出了说明。查看
    https://github.com/nim-lang/RFCs/issues/175
    了解更多细节 (#12688)
  • 添加了 or detectOs(Manjaro),这样当检测到系统为 Manjaro
    时,调用原生的包管理器会使用 pacman 进行包管理
    (#12587)
  • --os:ios 编译指令现在也代表了 macosx
    (#12585)
  • 导出了 nim.cfg 解析器,现在其他工具也可以调用 readConfigFile
    (#12602)

例外情况

我们当然也必须承认存在例外。在一些严重的情况下,例如标准库的安全漏洞,我们保留使用它的向后不兼容性权利。

BUG 修复

  • 修复了 “在 OSX 上多次调用后,gorgeEx() 失败”的问题
    (#12337)
  • 优化和加强了 posix 模块
    (#10723)
  • 修复了 “Nim 的语法检查 允许使用 gorgeEx(),但不允许 writeFile()
    的问题,现在这两个都被提示 don’t run staticExec for ‘nim suggest
    了 (#12491)
  • 修复了 “一个算数的低级错误: -3 mod 7 == 3”
    (#12514)
  • 修复了 “后端集成文档中 c2nim 链接失效”
    的问题(#12537)
  • 修复了 “‎具有默认值的泛型参数会导致不正确的泛型类型解析‎” 的问题
    (#12528)
  • 修复了 “再次出现的问题: compiler/vmgen.nim(354, 20) false leaking
    temporary 10 slotTempInt [AssertionError]
    (#12547)
  • 修复了 “Windows 上的 64 位(只有在 64 位上有问题) nim 编译/链接断开”
    (#12536)
  • 修复了 “除了最新的 devel 版本No =destroy for elements of closure
    environments other than for latest devel –gc:destructors”
    (#12577)
  • 修复了 “[1.0.0] 无法使用 –cpu:avr 进行编译”
    (#12395)
  • 修复了 “使用无效的对象变体会导致编译器崩溃”
    (#12379)
  • 修复了 “import 之前写的编译指示会被静默忽略”
    (#5050)
  • 修复了 “ strformat + asyncdispatch + const 同时使用会报错” 的问题
    (#12612)
  • 修复了 “--nimblePath 是附加的,需要一个无痛的解决方案”
    (#12601)
  • 修复了 “nim.cfg 中 –define:FOO:VAL 的语法没有文档或者缺失”
    (#12367)
  • 修复了 “使用宏生成的 vm 字符串无法正常使用”
    (#12670)
  • 修复了 “staticRead() 引入的静态文件变更时,会强制触发重新编译。”
    (#12663)
  • 修复了终止处理程序中调用 throw 引发的崩溃
    (#12572)
  • 修复了用于 具有字符串字段的对象 的 newLit
    (#12542)

安装Nim1.0

新手

看看你的操作系统包管理器是不是已经构建了1.0版本或通过这里安装。

存量用户

如果有使用choosenim安装了之前Nim版本的用户,简单如下:

$choosenim update stable

奉献者们

经年累月,有超过500人向Nim的代码贡献过,实现新特性,修复bug和问题,写文档等等。Nim团队感谢所有帮助过我们构建Nim成为今天这样的贡献者们。

我们也将感谢所有构建Nimble包,扩展Nim生态的贡献者们。Nimble包增长稳定,2019年8月我们突破了1000个包的历史大关。我们对于发布1.0将促进生态更长远的发展表示乐观。

文档更新

  • 给 Math 模块添加了文档
    (#12460)
  • 修复了许多无效的链接,尽量将链接替换为了链接到文档内部
    (#12463)
  • sequtils:在示例中替换掉了已经遗弃的 ‘random’ 用法
    (#12515)
  • 给整型添加了文档
    (#12513)
  • 修复了代码风格的错误
    (#12545)
  • 修正文档和注释中的几个错误
    (#12553)
  • 添加文档以更好地区分 getProjectPath, getCurrentDir
    currentSourcePath (#12565)
  • doc/tut3.rst: 修复了介绍中的错别字
    (#12607)
  • 添加了指向 packagingdistro 页面的链接
    (#12603)
  • 修复了 $*(dt: DateTime) 的说明
    (#12660)
  • 在 manual.rst 中对 experimental / parallel 加入了示例以明确区别
    (#12472)
  • 修复手册中错误的章节层级关系
    (#12724)

(文/开源中国)    

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

(文/开源中国)