Nim 1.0 发布,命令式编程语言

by admin on 2020年2月6日

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

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

概述

在本教程中,我们将学习如何在Ubuntu
16.04上安装Nim。 我们将从Ubuntu存储库安装Nim,并从源代码安装nim。

Nim是:

  • 一个系统和应用程序编程语言。
    静态类型和编译,它提供了一个优雅的包装无与伦比的性能。

Nim提供:

  • 高性能垃圾收集的语言
  • 编译为C,C ++或JavaScript
  • 生成无依赖关系的二进制文件
  • 在Windows,MacOS,Linux等上运行

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

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

从存储库安装nim

Nim在Ubuntu
16.04存储库上可用。
要安装Nim,我们可以运行下面的命令

$ sudo apt-get update
$ sudo apt-get install -y nim

现在我们可以检查安装了以下内容的Nim版本:

$ nim -v
Nim Compiler Version 0.12.0 (2015-11-02) [Linux: amd64]
Copyright (c) 2006-2015 by Andreas Rumpf

active boot switches: -d:release

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

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

Hello Nim

我们来为Nim创建一个Hello World应用程序。
创建一个名为hello.nim的新文件,内容如下:

echo "Hello Nim! - howtodojo.com"

使用下面的命令编译源代码

$ nim c hello.nim 
Hint: system [Processing]
Hint: hello [Processing]
CC: hello
CC: system
Error: execution of an external compiler program 'gcc -c  -w  -I/usr/lib/nim -o /home/ubuntu/nimcache/hello.o /home/ubuntu/nimcache/hello.c' failed with exit code: 32512

/bin/sh: 1: gcc: not found

由于我们没有安装gcc,所以仍然出现错误。 是的,nim依靠c/c
++编译器来编译。

使用下面的命令安装gcc

$ sudo apt-get install gcc

现在让我们重新编译我们的hello.nim源代码。

$ nim c hello.nim
Hint: system [Processing]
Hint: hello [Processing]
CC: hello
CC: system
Hint:  [Link]
Hint: operation successful (9852 lines compiled; 0.910 sec total; 14.148MB; Debug Build) [SuccessX]

源代码编译成功。 二进制文件名是hello。
我们可以使用file命令检查文件类型。

$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=fe9a2d66209c2adb082ae63e15fc35e8f991a322, not stripped

我们可以在上面看到,hello是一个ELF / Linux二进制文件。

现在让我们执行hello应用程序。

$ ./hello 
Hello Nim! - howtodojo.com

应用程序成功运行。

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

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

从源代码安装nim

如上所见,Ubuntu 16.04附带的Nim版本是0.12.0。

在撰写本文时,Nim的最新稳定版本是0.17.2。
在本节中,我们将学习如何从源代码安装nim。

我们可以从Nim instal
Unix页面下载最新版本的Nim。

使用wget下载nim源代码。

$ wget -c https://nim-lang.org/download/nim-0.17.2.tar.xz

下载包含nim源代码文件哈希的sha256文件。
我们将使用这个文件来确保nim源代码的完整性。

$ wget -c https://nim-lang.org/download/nim-0.17.2.tar.xz.sha256  

现在让我们使用sha256sum命令来检查nim源代码的完整性

$ sha256sum -c nim-0.17.2.tar.xz.sha256
nim-0.17.2.tar.xz: OK

如果要输出OK,如下图所示。 如果没有,那么你将需要重新下载nim源代码。

使用下面的命令提取nim源代码。

$ tar xJf nim-0.17.2.tar.xz

转到提取的目录

$ cd nim-0.17.2    

运行下面的命令来构建nim和工具。 我们假设你在编译Nim之前已经安装了gcc。

$ ./build.sh
$ bin/nim c koch
$ ./koch tools        

安装nim到 /opt目录

$ sudo ./install.sh /opt

选择Nim版本

$ /opt/nim/bin/nim -v
Nim Compiler Version 0.17.2 (2017-09-07) [Linux: amd64]
Copyright (c) 2006-2017 by Andreas Rumpf

git hash: 811fbdafd958443ddac98ad58c77245860b38620
active boot switches: -d:release

安装 1.0.4

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

$ choosenim update stable

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

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

小结

在本教程中,我们学习了如何从Ubuntu存储库安装Nim。
我们学习了如何编译Hello Nim! 源代码来测试我们的安装。

我们还学习了如何从源代码安装Nim。 祝你与Nim玩得开心!

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-12/149213.htm

图片 1

更新日志

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


附《更新日志》

稳定保证

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

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

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

语言层面的变更

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

稳定性保证包含哪些?

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

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

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

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

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)

例外情况

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

文档更新

  • 给 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)

(文/开源中国)    

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

(文/开源中国)    

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图