写点什么

Nim:比 Python 更优雅,速度堪比 C 语言

2019 年 7 月 30 日

Nim:比Python更优雅,速度堪比C语言

本文要点

  • Nim 是一门开源的编程语言,即将发布 1.0 版本;

  • Nim 的独到之处在于它可以编译成其他编程语言代码(主要是 C 语言和 JavaScript);

  • 将 Nim 与 C 语言或 JavaScript 代码集成在一起可以获得最大的价值;

  • Nim 可以生成高质量的 C 语言代码,避免出现 C 语言的典型错误(如内存泄露和数组指针错误);

  • Nim 值得一学,因为在学习 Nim 的同时也学会了如何写出更好的 C 语言或 JavaScript 代码,同时也可以了解低级语言和高级语言(Nim)之间的关系。


如果我告诉你有这么一门编程语言,它比 Python 更优雅,跟 C 语言一样高效,可以很容易地被编译成 JavaScript,并且可以使用回溯,你会作何感想?


Nim 可能就是这么一门被低估的编程语言,而它可能正好适合你。


Nim 是什么?

Nim(最初叫 Nimrod)是一门命令式静态类型编程语言,可以被编译成 C 或 JavaScript。它是开源的,维护很活跃,GitHub 代码库地址是https://github.com/nim-lang/Nim


Andreas Rumpf 最初在 2008 年设计并开发了 Nim。该项目的另一名主要开发者 Dominik Picheta 为 Nim 开发了包管理器,叫作Nimble,并出版了《Nim in Action》一书。


Nim 的设计目标是“高效、有表现力和优雅”,可以编译成 C 语言,并从 Python、Lisp 和 Pascal 借鉴了一些语法方面的设计。


Nim 的核心特性在脚本语言中算是很独特的

Nim 也是动态的,但与其他脚本语言不一样。如果你曾经被二进制依赖关系所困扰,或者不喜欢弱类型,那么 Nim 为你提供了另一种解决方案。



以上是 Nim 官方网站提供的一个代码示例


Nim 的类型系统

Nim 的类型系统很好理解,任何具备基础编程知识的人都可以理解 Nim 的类型系统。与其他大多数编程语言一样,Nim 也提供了一些常用的类型,比如字符串、数字、标识符、关键字、注释、操作符和其他标点符号。Nim 还允许用户创建自己的类型。


与众不同的是,Nim 使用“引用”来实现指针类型。引用分为两种,一种是跟踪的,一种是非跟踪的。跟踪引用指向堆内的对象,这些对象会被垃圾回收器回收,Java 程序员对这个可能比较熟悉。非跟踪引用即指针,指向手动分配的内存或者位于内存其他地方的对象。


Nim 和 C 语言一样快

因为与 C 语言紧密关联,Nim 的一些特性会让 Python 用户大吃一惊,包括性能在内。因为 Nim 可以直接编译成 C 语言,所以 Nim 脚本的速度有望超过 Java,而且可以用 C 语言来实现。


Nim 在保持速度的同时还提供了可配的垃圾回收机制,用户可以通过配置来最大化性能。最快的选项是延迟引用计数,支持内存安全、无暂停的代码执行。


内存安全

因为与 C 语言关联紧密,Nim 的外部函数接口与 C 语言、C++和 Objective-C 是兼容的。这意味着通过代码优化可以让 Nim 脚本达到 C 语言那样的速度。


因为 Nim 具备了元编程特点,所以它的外部函数接口简单而优雅。用户可以给函数起别名,或者自定义关键字,让他们的代码具备非常好的可读性。


Nim 的代码优化是内存安全的,因为它是一门带有垃圾回收机制的编程语言。这意味着可以在获得脚本语言的内存安全性的同时不牺牲性能。



垃圾回收性能,与其他语言的对比


带有预处理宏的元编程

Nim 通过模板和宏提供了预编译代码替换功能,用户可以扩展 Nim 的核心语法(不过不能改变已有的语法)。Nim 的标准库和社区提供的库都包含了这些功能,用户可以尽情地使用各种编程范式,还能省掉很多模板代码。



在 Nim 中使用宏


一等 JavaScript 支持

Nim 还可以编译成 JavaScript,这样用户就可以在 JavaScript 中使用 Nim 的特性。Nim 标准库中包含了一个叫作“dom”的模块,该模块为 Nim 提供了 Web 脚本编程能力,还能将 Nim 代码编译成 JavaScript,并集成到 JavaScript 项目中。


这款贪吃蛇游戏就是用 Nim 开发的,然后编译成 JavaScript。这里是源码地址。



回溯

如果说 Python 的回溯给你带来了很大的方便,那你也一定会喜欢 Nim 的回溯。Nim 直接借鉴了 Python 的回溯,在日志末尾包含有用的错误消息,在调试时可以非常方便地浏览信息,帮你节省时间。



Nim 的回溯示例


Nim 的不足

Picheta 说 Nim 是“改进版的 Python”,并指出了它的一些独有特性,比如无依赖二进制包、强类型和泛型,这些特性 Python 都不提供原生支持。事实上,从缩进语法这方面来看,Nim 看起来和 Python 很像。


但是,Nim 并没有像 Python 那么流行,只被用在少数的生产环境中。


软件咨询公司 TIOBE 每个月都会基于编程语言的流行程度发布月度编程语言排行榜。根据排名,Python 在 2018 年 7 月排名第 4,并分别于 2007 年和 2010 年获得 TIOBE 的“年度编程语言”大奖。


但是 Nim 从来都没有进入到 TIOBE 编程语言排行榜前 100。


从语法风格和优雅方面来看,Nim 仍然缺乏被广泛采用的要素。


Nim 似乎停留在了测试阶段

一门语言或一款软件从测试阶段进入正式发布阶段似乎并没有什么官方规定的时间线,而且也并没有证据表明 Nim 的开发速度很慢。


不过,将一门编程语言带到正式发布阶段也是一种让这门语言满足市场预期的一种承诺,需要在后期维护、文档等方面提供支持。


Nim 最早是从 2008 年开始开发的,但 10 年过去了,仍然还没有发布 1.0 版。所幸的是,这个漫长的测试周期似乎要接近尾声了。Nim 0.20已于 2019 年 6 月发布,并被选为 1.0 的候选版本。一旦 1.0 版本发布,开发者就有了一个可靠的稳定版本,更容易将其用在更大的项目中。



Minecraft 是另一款长期处于测试阶段的软件,在发布了一个官方版本之后就被微软收购了。


小型的标准库

Nim 官网宣称 Nim 是一个“具有丰富可扩展性的小型核心”,用 Picheta 的话说就是“要丰富 Nim 的标准库,还需要做很多工作”。


不过,为 Nim 的语言核心提供贡献访问能力可能会是 Nim 一个关键特性。


主流编程语言通常具有稳定的代码库,它们通常只接受来自经验丰富的语言开发者或官方团队成员的贡献,但 Nim 是公开的,会邀请社区开发者一起参与贡献。问题跟踪和代码 PR 都可以由中级程序员来处理,只要他们热衷于实现这些特性。


第三方库很少

尽管 Nim 是开源的,而且提供了健壮的包管理器(Nimble),但 Nim 的第三方库却屈指可数。


Picheta 表示,Nim 的第三方库远不如他所期望的那么多。


从好的方面看,这为初级或中级程序员提供了开发第三方库的好机会,他们不用担心自己开发的库会出现重复。健壮的开发社区通常会以第三方库的形式提供更多完整的语言特性。这对于语言用户来说是一件好事,因为他们获得了更加丰富的资源。


对于有志为社区贡献第三方库的程序员来说,丰富的第三方库会让他们错失为社区做出贡献的机会。不过,那些未能成为标准库的特性至少可以作为外部库的形式提交给社区去审批。


因为缺少社区提供的第三方库,Nim 为程序员提供了为这门发展中的语言做出贡献的机会。



Nim 包管理器的图标。从 2014 年开始,皇冠就被作为 Nim 的官方图标。


Nim 的目标受众

虽然 Nim 很少被用在生产环境中,但它还是很适合被用在一些场景中。


例如,Nim 很适合那些对编程语言的发展过程感兴趣的程序员。不管你是想了解编程语言范式如何影响编程语言的可用性、可读性和应用,还是想让自己的名字出现在编程语言“贡献者”清单中,加入 Nim 贡献者队伍都是一个很好的选择。不要低估了加入一个开源项目(比如 Nim)的贡献者队伍能够给你带来的好处。


另外,对于 C++或 JavaScript 程序员来说,Nim 也非常有用,特别是如果他们想要利用 Nim 的第三方库或 Nim 的其他语言特性。这要得益于 Nim 强大的兼容性和通用性。


不过,Nim 的受众还不是很多。正如之前提到的那样,Nim 的黄金时期还没有到来,对于大部分用户来说,还不是时候把它用在生产环境中。


不过,对于那些认为 Python 不能完全满足其需求的用户来说,Nim 可能会是个不错的选择。它为那些偏爱简洁语法的人提供了很多语法糖,也因为它与 C 语言有着紧密的联系,成为最快的脚本语言之一。


Nim 的发展驱动力

任何一门编程语言都会其发展的驱动力。对于 Ruby 来说,这个驱动力就是 Ruby on Rails。对于 Python 来说,这个驱动力就是它的易用易学和大型的开发者社区。


那么问题来了:Nim 的增长催化剂是什么呢?从大的方面来看,有三个关键驱动力驱动着 Nim 的增长:1.0 版本的发布、更多可用的模块和“双语言”解决方案。


如果 Nim 想要被广泛采用,结束测试周期是一条必经之路。最近发布的 Nim 0.2 对于 Nim 社区来说就是一个很明显的征兆。Nim 1.0 版本发布得越早,Nim 就会越早成为大型项目的候选语言。


Nim 的未来

我们已经讨论了 Nim 在可用模块方面的欠缺,但是,如果 Nim 继续增长,这种情况就会有所改变。目前,Nim 有970多个可用模块,而且在过去两年中增长速度非常快。随着更多的模块被开发出来,Nim 将变得更加可扩展和实用,可以被用在更广泛的项目中。这又将导致更多的开发者使用 Nim,从而开发出更多模块。简而言之,更多的模块将使 Nim 在更广泛的项目中变得更加实用,并将激励开发者使用它。最后,除了一个风靡全球的应用程序(就像 Ruby on Rails 为 Ruby 所带来的效果)之外,Nim 还需要建立起一种声誉,成为能够解决实际问题的有效解决方案。“双语言问题”即需要使用更快的静态编程语言(如 C++)来优化使用高级语言(如 Python)编写的代码。Nim 的简单性和性能相结合,使其成为解决双语言问题的有力竞争者(竞争者包括 Julia)。


不管你认为 Nim 是否适合你,它都值得你关注。它是一门通用的语言,速度快,得到了社区的大力支持。它当然也有它的缺点,甚至比其他语言更严重,但它的潜力也是不可忽视的。


关于作者

Carter Pape 是 DO Supply 公司的一名程序员,拥有 6 年软件开发经验和近 10 年的编程经验。他是一名专业的 Web 开发人员,已经建立了两个属于自己的网站,并在维护另外三个网站,其中包括北卡罗来纳州立大学的一个致力于开源软件工程研究的项目。Pape 拥有丰富的脚本语言经验,包括 Python、Swift 和 JavaScript。他还参与了使用 C 和 C++开发的项目。


原文链接


Got NIM?


2019 年 7 月 30 日 09:407967
用户头像

发布了 731 篇内容, 共 368.6 次阅读, 收获喜欢 1860 次。

关注

评论 2 条评论

发布
用户头像
为什么现在的语言越来越喜欢使用特殊符号(*),关键是需要按两个键,才能打出来,是为了让程序员写代码慢下来嘛? 我觉得应该改成需要按住 左Ctrl + F7 + 数字键盘. + * 才能完成这件事,是最好的了,这样,一个人,就没有办法写代码了。
2019 年 07 月 31 日 09:23
回复
哈哈哈哈,这样,拿C语言举例,!是取反,%是取余,^是取反(有点忘了),&是并,()左右括号,也不用说加号+,大括号{}和或|,或者字符串符号",大于小于和问号,都需要按两个键。

要不然这样:
wellsign include little iostream bigger

int main leftbracket rightbracket leftbigbracket
print leftbracket "Hello World";
rightbigbracket

真是好棒,不再需要按很多键了,减轻了好多负担。(逃
展开
2020 年 04 月 09 日 23:30
回复
没有更多了
发现更多内容

五分钟快速掌握Maven的核心概念

Java架构师迁哥

案例研究之聊聊 QLExpress 源码 (六)

小诚信驿站

28天写作 QLExpress源码 聊聊源码

持续集成对IT团队和企业分别有哪些好处?

禅道项目管理

DevOps 运维 开发 CI/CD

K线成交量管理系统开发、成交量管理系统开发

W13902449729

K线成交量管理系统开发 成交量管理系统开发

盘点2020|征文大赛获奖名单公布

InfoQ写作平台官方

活动专区 盘点2020

四面字节跳动,虽一路坎坷但拿到offer,我的面试经验分享(Java研发)

Java成神之路

Java 程序员 架构 面试 编程语言

工作11年,从阿里P8出来,头发也没了,人也虚了,就剩下这份笔记了!

Java架构之路

Java 程序员 架构 面试 编程语言

细节!3部分讲明白HotSpot:运行时+编译器+垃圾回收器

996小迁

Java 架构 虚拟机 hotspot

nodejs事件和事件循环详解

程序那些事

nodejs 异步编程 程序那些事 事件和事件循环 nodejs event

为什么建议没事不要随便用工厂模式创建对象?

码农架构

Java 学习 设计模式

“区块链+数字身份”,道路坎坷前途光明

CECBC区块链专委会

数字技术

并发阻塞队列(BlockingQueue)— 生产者消费者模式核心部件

码农架构

Java 架构 jdk 设计模式

Hadoop的MapReduce到底有什么问题?

hanke

大数据 hadoop spark mapreduce 开源

WiFi6 与 5G 的异同分析

石君

5G wifi 28天写作

区块链大趋势

CECBC区块链专委会

数字经济

阿里2021年首次公开五份Java并发编程全彩小册:模型+原理+应用+模式+面试题五管齐下

Java架构追梦

Java 学习 架构 面试 并发编程

字节内部MySQL宝典意外流出!极致经典,堪称数据库的天花板

比伯

Java 编程 架构 面试 程序人生

2021年编排将成为DevSecOps关键推动者

啸天

DevSecOps 应用安全 开发安全

企业如何预防短信验证码被别人盗用

香芋味的猫丶

短信防刷 短信轰炸机 短信验证码 短信防轰炸 短信防火墙

Linux I/O 原理和 Zero-copy 技术全面揭秘

赖猫

c++ Linux linux编程 服务器开发 I/O

现货合约量化交易系统开发搭建

薇電13242772558

数字货币 策略模式

恕我直言!有了这份MySQL学习文档,你收藏夹里的其他MySQL学习资料都可以扔了

Java成神之路

Java 程序员 架构 面试 编程语言

阿里面试官纯手打:金九银十跳槽必会Java核心知识点笔记整理

Java架构之路

Java 程序员 架构 面试 编程语言

Java 程序经验小结:类层次优于标签类

后台技术汇

28天写作

中美上市软件公司对比中的投资启示

ToB行业头条

阿里资深架构师整理出来的一份Java核心知识点分享给大家.pdf

Crud的程序员

Java 架构 java程序员

厉害了!来看看这份超全面的《Android面试题及解析》,一线互联网公司面经总结

欢喜学安卓

android 程序员 面试 移动开发

牛批!腾讯大佬整理出的这份“spring boot”核心笔记,从入门到实战,差距不止一点点!

Java成神之路

Java 程序员 架构 面试 编程语言

区块链发展应以密码应用创新为根基

CECBC区块链专委会

区块链 密码学

DeFi流动性挖矿管理系统开发|去中心化金融借贷系统开发

W13902449729

去中心化金融借贷系统开发 DeFi流动性管理系统开发

超强Android进阶路线知识图谱:Kotlin可能带来的一个深坑,持续更新中

欢喜学安卓

android 程序员 面试 移动开发

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

Nim:比Python更优雅,速度堪比C语言-InfoQ