Nim 技术专题简介-编程知识网

简介

  此条目介绍的是一种编程语言。关于同名的游戏,请见“尼姆游戏”。NimThe Nim crown logo编程范型多范式: 编译, 并发, 过程式, 指令式, 函数式, 面向对象设计者Andreas Rumpf发行时间2008年,​14年前​(2008)当前版本1.6.12 (2023年3月10日) 类型系统静态, 强类型, 类型推论, 结构化系统平台IA-32, x86-64操作系统跨平台许可证MIT文件扩展名.nim网站nim-lang.org启发语言Ada, Modula-3, Lisp, C++, Object Pascal, Python, OberonNim是一个指令式、通用、多范式、静态类型、编译型的编程语言,由Andreas Rumpf设计和开发,设计目标是高效、富有表现力以及优雅。Nim支持元编程、函数式、消息传递、过程式以及面向对象编程。

语言设计

Nim的设计目标是像C一样快速,像Python一样有表达力,并像Lisp一样有扩展性。具体地说,它受以下语言的影响:

Modula-3:有跟踪的和无跟踪的指针

Delphi:类型安全的字符集

Ada:子范围类型、distinct类型、安全变体/case对象

C++:运算符重载、泛型

Python:越位规则

Lisp:宏系统、包罗AST、同像性

Oberon:成员导出标记

C#:async/await、lambda宏

Go:延迟执行

另外,Nim支持统一函数调用语法(英语:Uniform Function Call Syntax),即并未区分函数、方法的调用语法。亦支持等价标识符,即不同的变量名称可能被视为相同,其忽略非首字母的大小写以及下划线。

编译器

Nim编译器可生成优化过的C代码并将编译推迟给外部的编译器(包括 Clang 及 GCC 在内的众多编译器都受支持)。编译器还可生成 C++、Objective-C 以及JavaScript的代码来便捷地与其他语言的应用程序接口(API)交互。这使得Nim可用以编写iOS和Android的应用程序。

Nim编译器自身是自举(英语:Self-hosting (compilers))的,也就是使用Nim语言自身编写的。

Nim程序可使用众多来自C语言和C++的库。语言绑定可用于许多库,例如GTK+2、OpenGL、WinAPI、zlib、libzip(英语:libzip)、OpenSSL 以及 cURL。 Nim 可与 PostgreSQL、MySQL 以及 SQLite 数据库共同工作,可与 Lua 和 Python 语言的解释器交互。

例子

Hello world

Hello, World!用Nim写为:

echo("Hello, world!")# Procedures can be called with no parenthesesecho "Hello, World!"

另一输出”Hello World”的版本:

stdout.write("Hello, world!\n")

阶乘

使用指令式方式计算正数的阶乘:

import strutilsvar n = 0try:  stdout.write "Input positive integer number: "  n = stdin.readline.parseIntexcept ValueError:  raise newException(ValueError, "You must enter a positive number")var fact = 1for i in 2..n:  fact = fact * iecho fact

使用来自Nim标准库的math模块:

import mathecho fac(x)

反转字符串

简单的一个例子展示了Nim的很多特征:

func reverse(s: string): string =  for i in countdown(s.high, 0):    result.add slet str1 = "Reverse This!"echo "Reversed: ", reverse(str1)

很独特的特征之一是隐式result变量。在Nim中具有非空返回类型的所有过程都有一个隐式的结果变量表示被返回的值。在for循环中调用了countdown,它是迭代器。如果省略了迭代器,编译器将尝试使用items迭代器,如果为指定类型定义了一个的话。

图形用户界面

通过gintro模块使用具有gobject内省的GTK3:

import gintro/proc appActivate(app: Application) =  let window = newApplicationWindow(app)  window.title = "GTK3 application with gobject introspection"  window.defaultSize = (400, 400)  showAll(window)proc main =  let app = newApplication("org.gtk.example")  connect(app, "activate", appActivate)  discard run(app)main()

这个代码要求gintro模块,它不是标准库的一部分。要安装模块gintro和很多其他模块可以使用工具nimble,它是nim的一部分。要用nimble安装gintro模块可以如下这样:

nimble install gintro