2018 年,开发者们有很多优秀的编程语言可供选择,光是主流语言就有十几种。本文介绍一个小众但十分强大的语言Nim。
以下为译文:
2018年后半年,开发者们有很多种编程语言可供选择。光是主流语言就有十几种,它们都非常优秀。但如果再探索一番,就会发现另外一些语言,如Elm、Elixir、PureScript和Reason——之后你就会发现Nim。
有一次我在UI开发库中看到介绍说,“我们支持Go、Rust、Nim等多种语言。”真酷……等等,Nim是啥?出于好奇,我尝试了一下。
通过几个一次性例子、旧项目重写等尝试,我认真探索了这个语言究竟能干什么。结果,五个月之后,这门语言仍然在吸引着我。
我们来做个简单的命令行应用,作为本文后面的讨论对象。首先要安装Nim(
https://nim-lang.org/install.html)获得工具链。接下来先mkdir fun,然后cd fun,再创建一个文本文件wave.nim。
内容如下:
# this is wave.nimconst hand* = ""
创建另一个文件hello.com然后粘贴下面的代码:
# this is hello.nimimport waveecho "Hello World " & hand
然后开始编译!
$ nim c hello.nim
在我的笔记本的Ubuntu上大约花了175ms。接下来运行:
$ ./helloHello World
这个二进制文件很快(2ms)、很小(107 kB),而且没有依赖。
我们给编译器提供了入口点(hello.nim),它就自己通过源代码找到了依赖(wave.nim)。如果同一个目录下还有第三个文件,这个文件不会被包含进来,除非我们用import语句导入。
我们没有写main()函数,但也生成了可执行文件!
但Nim的强大不止于此。运行nim c --app:lib wave.nim可以生成动态链接库,运行nim c --app:staticLib wave.nim还可以生成静态库。
Nim支持Windows、macOS和Linux,还支持一些其他平台,如树莓派和任天堂Switch。设置好之后,交叉编译也能做到,但与Go相比还差得多。说实话,目前我还没见到在构建方面能超过Go的。
Nim在可执行文件里塞了一堆函数和常量,包括文件输入输出、可配置的垃圾回收器,这些都带来了额外开销。
但这并不是老掉牙的垃圾回收器。其算法有六种选择,每次激活的时间预算也有供选择。而且它并不像其他语言的垃圾回收器那样“只要有需要”就运行,对于只用一次的脚本,你甚至可以关闭垃圾回收。
而且,我们编译成了调试模式。调试模式包含强大的栈跟踪和其他帮你调试的东西。试试用这个命令编译:nim c -d:release hello.nim,尺寸变成89kB了。好点了吧?加上另一个编译开关后还可以进一步用速度换尺寸。nim c -d:release --opt:size hello.nim,现在只有44kB了。是不是效果好多了?
但C编译器更快!没错,因为Nim其实是编译成C的!然后再用gcc或clang将C代码编译成二进制文件。还记得我们编译时的命令是nim c hello.nim吗?这里的C代表的是编译成C,而C是默认的后端语言。
此外,它还能编译成C++和Obj-C,也能够使用相应语言生态系统中的工具了(如代码覆盖和调试器等)。
当然,这是Nim的强项之一。
它能使用imgui、SDL、Redis等库,能使用静态库,也能链接OpenSSL等动态库。它的语言特性能处理名字修饰、命名空间、链接等,甚至可以在Nim中以字符串的形式输入C代码,编译器也可以正确处理。还有个工具c2nim帮你实现自动转换,实现跨平台或跨语言!
最不可思议的是它还能编译成JavaScript:
$ nim js -d:release hello.nim$ node nimcache/hello.jsHello World
这样就编译成JavaScript了。
原因之一:
正确答案是,嗯,我也不知道。大公司和大型社区很有钱,虽然Nim没有那么大的资助,但也在受到越来越多的关注。我认为它的优秀之处在于,虽然是草根,但却拥有不逊于主流语言的功能。
下面是一大堆可以看看的URL,也可以自己去Google。
官方
社区
学习
发现
编辑器
写一些应用
这门语言很有意思,但更有趣的还有待你自己去发掘。
原文:
https://totallywearingpants.com/posts/nim-underdog/作者:Steve Kellock
译者:弯月,责编:郭芮