Nim
Nim是一个指令式、通用、多范式、静态类型、编译型的编程语言,由Andreas Rumpf设计和开发,设计目标是高效、富有表现力以及优雅。Nim支持元编程、函数式、消息传递、过程式以及面向对象编程。
The Nim crown logo | |
多范式: 编译, 并发, 过程式, 指令式, 函数式, 面向对象 | |
設計者 | Andreas Rumpf |
2008年 | |
当前版本 |
|
型態系統 | 静态[2], 强类型[3], 类型推论, 结构化 |
系统平台 | IA-32, x86-64 |
操作系统 | 跨平台[4] |
許可證 | MIT[5][6] |
文件扩展名 | .nim |
網站 | nim-lang |
啟發語言 | |
Ada, Modula-3, Lisp, C++, Object Pascal, Python, Oberon |
语言设计
Nim的设计目标是像C一样快速,像Python一样有表达力,并像Lisp一样有扩展性。具体地说,它受以下语言的影响:
- Modula-3:有跟踪的和无跟踪的指针
- Delphi:类型安全的字符集
- Ada:子范围类型、distinct类型、安全变体/case对象
- C++:运算符重载、泛型
- Python:越位规则
- Lisp:宏系统、包罗AST、同像性
- Oberon:成员导出标记
- C#:async/await、lambda宏
- Go:延迟执行
另外,Nim支持统一函数调用语法[7],即並未區分函數、方法的調用語法。亦支持等价标识符,即不同的變數名稱可能被視為相同,其忽略非首字母的大小寫以及底線。[8]
编译器
Nim编译器可生成优化过的C代码并将编译推迟给外部的编译器[9](包括 Clang 及 GCC 在内的众多编译器都受支持)。编译器还可生成 C++、Objective-C 以及JavaScript的代码来便捷地与其他语言的应用程序接口(API)交互。这使得Nim可用以编写iOS和Android的应用程序。
Nim编译器自身是自举的,也就是使用Nim语言自身编写的。[10]
库
Nim程序可使用众多来自C语言和C++的函式庫。语言绑定可用于许多函式庫,例如GTK+2、OpenGL、WinAPI、zlib、libzip、OpenSSL 以及 cURL。[11] Nim 可与 PostgreSQL、MySQL 以及 SQLite 数据库共同工作,可与 Lua 和 Python 语言的解释器交互。
例子
Hello world
Hello, World!用Nim写为:
echo("Hello, world!")
# Procedures can be called with no parentheses
echo "Hello, World!"
另一输出"Hello World"的版本:
stdout.write("Hello, world!\n")
阶乘
使用指令式方式计算正数的阶乘:
import strutils
var n = 0
try:
stdout.write "Input positive integer number: "
n = stdin.readline.parseInt
except ValueError:
raise newException(ValueError, "You must enter a positive number")
var fact = 1
for i in 2..n:
fact = fact * i
echo fact
使用来自Nim标准库的math模块:
import math
echo fac(x)
反转字符串
简单的一个例子展示了Nim的很多特征:
func reverse(s: string): string =
for i in countdown(s.high, 0):
result.add s[i]
let str1 = "Reverse This!"
echo "Reversed: ", reverse(str1)
很独特的特征之一是隐式result
变量。在Nim中具有非空返回类型的所有过程都有一个隐式的结果变量表示被返回的值。在for循环中调用了countdown
,它是迭代器。如果省略了迭代器,编译器将尝试使用items
迭代器,如果为指定类型定义了一个的话。
图形用户界面
通过gintro[12]模块使用具有gobject内省的GTK3:
import gintro/[gtk, glib, gobject, gio]
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
参考文献
- . 2023年12月19日 [2024年1月5日].
- . GitHub. [2014-07-20]. (原始内容存档于2014-12-29).
- Караджов, Захари; Станимиров, Борислав. . VarnaConf. 2014 [2014-07-27]. (原始内容存档于2015-02-17) (保加利亚语).
- . [2018-10-12]. (原始内容存档于2018-10-10).
- . Nim-lang.org. [2015-03-27]. (原始内容存档于2017-07-11).
- . GitHub. [2015-03-27]. (原始内容存档于2018-09-26).
- . [2017-10-01]. (原始内容存档于2017-09-24).
- . [2017-10-01]. (原始内容存档于2017-09-24).
- Rumpf, Andreas. . InfoQ. 2014-01-15. 事件发生在 2:23 [2014-07-20]. (原始内容存档于2014-10-10).
- . [2017-05-05]. (原始内容存档于2015-04-24).
- . Nim documentation. [2015-04-04]. (原始内容存档于2015-04-06).
- gintro (页面存档备份,存于)