程序员们注意了,这款编程语言不逊于C/C++!

发表时间: 2018-11-06 10:22

2018 年,开发者们有很多优秀的编程语言可供选择,光是主流语言就有十几种。本文介绍一个小众但十分强大的语言Nim。

以下为译文:

2018年后半年,开发者们有很多种编程语言可供选择。光是主流语言就有十几种,它们都非常优秀。但如果再探索一番,就会发现另外一些语言,如Elm、Elixir、PureScript和Reason——之后你就会发现Nim。

有一次我在UI开发库中看到介绍说,“我们支持Go、Rust、Nim等多种语言。”真酷……等等,Nim是啥?出于好奇,我尝试了一下。

通过几个一次性例子、旧项目重写等尝试,我认真探索了这个语言究竟能干什么。结果,五个月之后,这门语言仍然在吸引着我。

1.快速介绍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),而且没有依赖。

2.灵巧且强大的编译器

我们给编译器提供了入口点(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的。

3.Nim可编译成C、C++和Obj-C

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,也能够使用相应语言生态系统中的工具了(如代码覆盖和调试器等)。

4.所以Nim是个不错的胶水语言?

当然,这是Nim的强项之一。

它能使用imgui、SDL、Redis等库,能使用静态库,也能链接OpenSSL等动态库。它的语言特性能处理名字修饰、命名空间、链接等,甚至可以在Nim中以字符串的形式输入C代码,编译器也可以正确处理。还有个工具c2nim帮你实现自动转换,实现跨平台或跨语言!

最不可思议的是它还能编译成JavaScript:

$ nim js -d:release hello.nim$ node nimcache/hello.jsHello World 

这样就编译成JavaScript了。

5.为什么我没听说过Nim?

原因之一:

  • Rust:由Mozilla资助;
  • Swift:由苹果资助;
  • Go:由Google资助;
  • TypeScript:由微软资助;
  • Kotlin:由Jetbrains资助;
  • Nim:??

正确答案是,嗯,我也不知道。大公司和大型社区很有钱,虽然Nim没有那么大的资助,但也在受到越来越多的关注。我认为它的优秀之处在于,虽然是草根,但却拥有不逊于主流语言的功能。

6.了解更多

下面是一大堆可以看看的URL,也可以自己去Google。

官方

  • 网站:项目入口
  • https://nim-lang.org/
  • 源代码:GitHub项目地址
  • https://github.com/nim-lang/nim
  • nimble:Nim包管理器
  • https://github.com/nim-lang/nimble
  • choosenim:工具链安装
  • https://github.com/dom96/choosenim

社区

  • 论坛:异步的讨论组
  • https://forum.nim-lang.org/
  • Twitter:Nim的Twitter账号
  • https://twitter.com/nim_lang
  • Reddit:subreddit社区
  • https://www.reddit.com/r/nim/
  • IRC:irc.freenode.net上的#nim
  • https://irclogs.nim-lang.org/

学习

  • 文档:一大波文档和教程
  • https://nim-lang.org/documentation.html
  • Nim实战:Manning Press出版的一本书
  • https://www.manning.com/books/nim-in-action
  • 介绍视频:Dominik Picheta的介绍
  • https://www.youtube.com/watch?v=hzxr9_ZK9uY

发现

  • nimble directory:nimble的Web前端
  • https://nimble.directory/
  • Awesome Nim:精选项目
  • https://github.com/VPashkov/awesome-nim
  • Github项目:开源项目,按照最近更新时间排序
  • https://github.com/search?l=Nim&o=desc&q=nim&s=updated&type=Repositories

编辑器

  • Vim插件:使用Vim编写Nim
  • https://github.com/zah/nim.vim
  • VS Code插件:Visual Studio Code插件
  • https://github.com/pragmagic/vscode-nim

写一些应用

  • Jester:写Web访问
  • https://github.com/dom96/jester
  • Karax:写单页应用
  • https://github.com/pragmagic/karax
  • NiGui:写GTK+ 3 / Win32桌面应用
  • https://github.com/trustable-code/NiGui
  • Winim,wNim:写Windows应用
  • https://github.com/khchen/winim;https://github.com/khchen/winim
  • objc:写macOS应用(开发中)
  • https://github.com/mjendrusch/objc
  • android:写安卓应用
  • https://github.com/yglukhov/android
  • Arranmancer:写深度学习应用
  • https://github.com/mratsim/Arraymancer
  • serial.nim:写串口应用
  • https://github.com/euantorano/serial.nim
  • libusb:写USB应用
  • https://github.com/nimious/libusb
  • Ethereum 2.0:写以太坊……额……之类的(我只能猜到这里了)
  • https://github.com/status-im/nimbus

这门语言很有意思,但更有趣的还有待你自己去发掘。

原文:
https://totallywearingpants.com/posts/nim-underdog/

作者:Steve Kellock

译者:弯月,责编:郭芮