@程序员,这门编程语言不输 C/C++!
2018 年,开发者们有很多优秀的编程语言可供选择,光是主流语言就有十几种。本文介绍一个小众但十分强大的语言Nim。
以下为译文:
2018年后半年,开发者们有很多种编程语言可供选择。光是主流语言就有十几种,它们都非常优秀。但如果再探索一番,就会发现另外一些语言,如Elm、Elixir、PureScript和Reason——之后你就会发现Nim。
有一次我在UI开发库中看到介绍说,“我们支持Go、Rust、Nim等多种语言。”真酷……等等,Nim是啥?出于好奇,我尝试了一下。
通过几个一次性例子、旧项目重写等尝试,我认真探索了这个语言究竟能干什么。结果,五个月之后,这门语言仍然在吸引着我。
快速介绍Nim
我们来做个简单的命令行应用,作为本文后面的讨论对象。首先要安装Nim(https://nim-lang.org/install.html)获得工具链。接下来先mkdir fun,然后cd fun,再创建一个文本文件wave.nim。
内容如下:
# this is wave.nim
const hand* = "👋"
创建另一个文件hello.com然后粘贴下面的代码:
# this is hello.nim
import wave
echo "Hello World " & hand
然后开始编译!
$ nim c hello.nim
在我的笔记本的Ubuntu上大约花了175ms。接下来运行:
$ ./hello
Hello 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可编译成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,也能够使用相应语言生态系统中的工具了(如代码覆盖和调试器等)。
所以Nim是个不错的胶水语言?
当然,这是Nim的强项之一。
它能使用imgui、SDL、Redis等库,能使用静态库,也能链接OpenSSL等动态库。它的语言特性能处理名字修饰、命名空间、链接等,甚至可以在Nim中以字符串的形式输入C代码,编译器也可以正确处理。还有个工具c2nim帮你实现自动转换,实现跨平台或跨语言!
最不可思议的是它还能编译成JavaScript:
$ nim js -d:release hello.nim
$ node nimcache/hello.js
Hello World 👋
这样就编译成JavaScript了。
为什么我没听说过Nim?
原因之一:
Rust:由Mozilla资助;
Swift:由苹果资助;
Go:由Google资助;
TypeScript:由微软资助;
Kotlin:由Jetbrains资助;
Nim:??
正确答案是,嗯,我也不知道。大公司和大型社区很有钱,虽然Nim没有那么大的资助,但也在受到越来越多的关注。我认为它的优秀之处在于,虽然是草根,但却拥有不逊于主流语言的功能。
了解更多
下面是一大堆可以看看的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
译者:弯月,责编:郭芮
推荐阅读: