查看原文
其他

@程序员,这门编程语言不输 C/C++!

Steve Kellock CSDN 2018-11-24

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

译者:弯月,责编:郭芮

推荐阅读:


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存